From 82871ba1bac1d62f69e1933b66659e62d2e5e063 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Tue, 12 Sep 2023 20:53:09 +0300 Subject: another rewrite, v1.0.0 --- pkg/messages/types/netDisconnect.go | 13 +++++++ pkg/messages/types/netFile.go | 17 +++++++++ pkg/messages/types/netNop.go | 9 +++++ pkg/messages/types/netSetConVar.go | 29 ++++++++++++++ pkg/messages/types/netSignOnState.go | 26 +++++++++++++ pkg/messages/types/netSplitScreenUser.go | 13 +++++++ pkg/messages/types/netStringCmd.go | 13 +++++++ pkg/messages/types/netTick.go | 17 +++++++++ pkg/messages/types/svcBspDecal.go | 61 ++++++++++++++++++++++++++++++ pkg/messages/types/svcClassInfo.go | 40 ++++++++++++++++++++ pkg/messages/types/svcCmdKeyValues.go | 16 ++++++++ pkg/messages/types/svcCreateStringTable.go | 36 ++++++++++++++++++ pkg/messages/types/svcCrosshairAngle.go | 13 +++++++ pkg/messages/types/svcEntityMessage.go | 20 ++++++++++ pkg/messages/types/svcFixAngle.go | 15 ++++++++ pkg/messages/types/svcGameEvent.go | 16 ++++++++ pkg/messages/types/svcGameEventList.go | 21 ++++++++++ pkg/messages/types/svcGetCvarValue.go | 16 ++++++++ pkg/messages/types/svcMenu.go | 18 +++++++++ pkg/messages/types/svcPacketEntities.go | 30 +++++++++++++++ pkg/messages/types/svcPaintmapData.go | 16 ++++++++ pkg/messages/types/svcPrefetch.go | 13 +++++++ pkg/messages/types/svcPrint.go | 13 +++++++ pkg/messages/types/svcSendTable.go | 17 +++++++++ pkg/messages/types/svcServerInfo.go | 43 +++++++++++++++++++++ pkg/messages/types/svcSetPause.go | 13 +++++++ pkg/messages/types/svcSetView.go | 13 +++++++ pkg/messages/types/svcSounds.go | 25 ++++++++++++ pkg/messages/types/svcSplitScreen.go | 18 +++++++++ pkg/messages/types/svcTempEntities.go | 18 +++++++++ pkg/messages/types/svcUpdateStringTable.go | 22 +++++++++++ pkg/messages/types/svcUserMessage.go | 18 +++++++++ pkg/messages/types/svcVoiceData.go | 20 ++++++++++ pkg/messages/types/svcVoiceInit.go | 20 ++++++++++ 34 files changed, 708 insertions(+) create mode 100644 pkg/messages/types/netDisconnect.go create mode 100644 pkg/messages/types/netFile.go create mode 100644 pkg/messages/types/netNop.go create mode 100644 pkg/messages/types/netSetConVar.go create mode 100644 pkg/messages/types/netSignOnState.go create mode 100644 pkg/messages/types/netSplitScreenUser.go create mode 100644 pkg/messages/types/netStringCmd.go create mode 100644 pkg/messages/types/netTick.go create mode 100644 pkg/messages/types/svcBspDecal.go create mode 100644 pkg/messages/types/svcClassInfo.go create mode 100644 pkg/messages/types/svcCmdKeyValues.go create mode 100644 pkg/messages/types/svcCreateStringTable.go create mode 100644 pkg/messages/types/svcCrosshairAngle.go create mode 100644 pkg/messages/types/svcEntityMessage.go create mode 100644 pkg/messages/types/svcFixAngle.go create mode 100644 pkg/messages/types/svcGameEvent.go create mode 100644 pkg/messages/types/svcGameEventList.go create mode 100644 pkg/messages/types/svcGetCvarValue.go create mode 100644 pkg/messages/types/svcMenu.go create mode 100644 pkg/messages/types/svcPacketEntities.go create mode 100644 pkg/messages/types/svcPaintmapData.go create mode 100644 pkg/messages/types/svcPrefetch.go create mode 100644 pkg/messages/types/svcPrint.go create mode 100644 pkg/messages/types/svcSendTable.go create mode 100644 pkg/messages/types/svcServerInfo.go create mode 100644 pkg/messages/types/svcSetPause.go create mode 100644 pkg/messages/types/svcSetView.go create mode 100644 pkg/messages/types/svcSounds.go create mode 100644 pkg/messages/types/svcSplitScreen.go create mode 100644 pkg/messages/types/svcTempEntities.go create mode 100644 pkg/messages/types/svcUpdateStringTable.go create mode 100644 pkg/messages/types/svcUserMessage.go create mode 100644 pkg/messages/types/svcVoiceData.go create mode 100644 pkg/messages/types/svcVoiceInit.go (limited to 'pkg/messages/types') diff --git a/pkg/messages/types/netDisconnect.go b/pkg/messages/types/netDisconnect.go new file mode 100644 index 0000000..69d4a67 --- /dev/null +++ b/pkg/messages/types/netDisconnect.go @@ -0,0 +1,13 @@ +package messages + +import "github.com/pektezol/bitreader" + +type NetDisconnect struct { + Text string +} + +func ParseNetDisconnect(reader *bitreader.ReaderType) NetDisconnect { + return NetDisconnect{ + Text: reader.TryReadString(), + } +} diff --git a/pkg/messages/types/netFile.go b/pkg/messages/types/netFile.go new file mode 100644 index 0000000..a41a0cf --- /dev/null +++ b/pkg/messages/types/netFile.go @@ -0,0 +1,17 @@ +package messages + +import "github.com/pektezol/bitreader" + +type NetFile struct { + TransferId int32 + FileName string + FileRequested bool +} + +func ParseNetFile(reader *bitreader.ReaderType) NetFile { + return NetFile{ + TransferId: int32(reader.TryReadBits(32)), + FileName: reader.TryReadString(), + FileRequested: reader.TryReadBool(), + } +} diff --git a/pkg/messages/types/netNop.go b/pkg/messages/types/netNop.go new file mode 100644 index 0000000..33f8e25 --- /dev/null +++ b/pkg/messages/types/netNop.go @@ -0,0 +1,9 @@ +package messages + +import "github.com/pektezol/bitreader" + +type NetNop struct{} + +func ParseNetNop(reader *bitreader.ReaderType) NetNop { + return NetNop{} +} diff --git a/pkg/messages/types/netSetConVar.go b/pkg/messages/types/netSetConVar.go new file mode 100644 index 0000000..08042ae --- /dev/null +++ b/pkg/messages/types/netSetConVar.go @@ -0,0 +1,29 @@ +package messages + +import "github.com/pektezol/bitreader" + +type NetSetConVar struct { + Length int8 + ConVars []conVar +} + +type conVar struct { + Name string + Value string +} + +func ParseNetSetConVar(reader *bitreader.ReaderType) NetSetConVar { + length := reader.TryReadBits(8) + convars := []conVar{} + for count := 0; count < int(length); count++ { + convar := conVar{ + Name: reader.TryReadString(), + Value: reader.TryReadString(), + } + convars = append(convars, convar) + } + return NetSetConVar{ + Length: int8(length), + ConVars: convars, + } +} diff --git a/pkg/messages/types/netSignOnState.go b/pkg/messages/types/netSignOnState.go new file mode 100644 index 0000000..4609ff2 --- /dev/null +++ b/pkg/messages/types/netSignOnState.go @@ -0,0 +1,26 @@ +package messages + +import "github.com/pektezol/bitreader" + +type NetSignOnState struct { + SignOnState int8 + SpawnCount int32 + NumServerPlayers int32 + IdsLength int32 + PlayersNetworksIds []byte + MapNameLength int32 + MapName string +} + +func ParseNetSignOnState(reader *bitreader.ReaderType) NetSignOnState { + netSignOnState := NetSignOnState{ + SignOnState: int8(reader.TryReadBits(8)), + SpawnCount: int32(reader.TryReadBits(32)), + NumServerPlayers: int32(reader.TryReadBits(32)), + IdsLength: int32(reader.TryReadBits(32)), + } + netSignOnState.PlayersNetworksIds = reader.TryReadBytesToSlice(int(netSignOnState.IdsLength)) + netSignOnState.MapNameLength = int32(reader.TryReadBits(32)) + netSignOnState.MapName = reader.TryReadStringLen(int(netSignOnState.MapNameLength)) + return netSignOnState +} diff --git a/pkg/messages/types/netSplitScreenUser.go b/pkg/messages/types/netSplitScreenUser.go new file mode 100644 index 0000000..65e85f3 --- /dev/null +++ b/pkg/messages/types/netSplitScreenUser.go @@ -0,0 +1,13 @@ +package messages + +import "github.com/pektezol/bitreader" + +type NetSplitScreenUser struct { + Unknown bool +} + +func ParseNetSplitScreenUser(reader *bitreader.ReaderType) NetSplitScreenUser { + return NetSplitScreenUser{ + Unknown: reader.TryReadBool(), + } +} diff --git a/pkg/messages/types/netStringCmd.go b/pkg/messages/types/netStringCmd.go new file mode 100644 index 0000000..158658e --- /dev/null +++ b/pkg/messages/types/netStringCmd.go @@ -0,0 +1,13 @@ +package messages + +import "github.com/pektezol/bitreader" + +type NetStringCmd struct { + Command string +} + +func ParseNetStringCmd(reader *bitreader.ReaderType) NetStringCmd { + return NetStringCmd{ + Command: reader.TryReadString(), + } +} diff --git a/pkg/messages/types/netTick.go b/pkg/messages/types/netTick.go new file mode 100644 index 0000000..e14f259 --- /dev/null +++ b/pkg/messages/types/netTick.go @@ -0,0 +1,17 @@ +package messages + +import "github.com/pektezol/bitreader" + +type NetTick struct { + Tick int32 + HostFrameTime int16 + HostFrameTimeStdDeviation int16 +} + +func ParseNetTick(reader *bitreader.ReaderType) NetTick { + return NetTick{ + Tick: int32(reader.TryReadBits(32)), + HostFrameTime: int16(reader.TryReadBits(16) / 10e5), + HostFrameTimeStdDeviation: int16(reader.TryReadBits(16) / 10e5), + } +} diff --git a/pkg/messages/types/svcBspDecal.go b/pkg/messages/types/svcBspDecal.go new file mode 100644 index 0000000..484497f --- /dev/null +++ b/pkg/messages/types/svcBspDecal.go @@ -0,0 +1,61 @@ +package messages + +import ( + "github.com/pektezol/bitreader" +) + +type SvcBspDecal struct { + Pos []vectorCoord + DecalTextureIndex int16 + EntityIndex int16 + ModelIndex int16 + LowPriority int8 +} + +type vectorCoord struct { + Value float32 + Valid bool +} + +func ParseSvcBspDecal(reader *bitreader.ReaderType) SvcBspDecal { + svcBspDecal := SvcBspDecal{ + Pos: readVectorCoords(reader), + DecalTextureIndex: int16(reader.TryReadBits(9)), + } + if reader.TryReadBool() { + svcBspDecal.EntityIndex = int16(reader.TryReadBits(11)) + svcBspDecal.ModelIndex = int16(reader.TryReadBits(11)) + } + svcBspDecal.LowPriority = int8(reader.TryReadBits(1)) + return svcBspDecal +} + +func readVectorCoords(reader *bitreader.ReaderType) []vectorCoord { + const COORD_INTEGER_BITS uint8 = 14 + const COORD_FRACTIONAL_BITS uint8 = 5 + const COORD_DENOMINATOR uint8 = 1 << COORD_FRACTIONAL_BITS + const COORD_RESOLUTION float32 = 1.0 / float32(COORD_DENOMINATOR) + readVectorCoord := func() float32 { + value := float32(0) + integer := reader.TryReadBits(1) + fraction := reader.TryReadBits(1) + if integer != 0 || fraction != 0 { + sign := reader.TryReadBits(1) + if integer != 0 { + integer = reader.TryReadBits(int(COORD_INTEGER_BITS)) + 1 + } + if fraction != 0 { + fraction = reader.TryReadBits(int(COORD_FRACTIONAL_BITS)) + } + value = float32(integer) + float32(fraction)*COORD_RESOLUTION + if sign != 0 { + value = -value + } + } + return value + } + x := reader.TryReadBits(1) + y := reader.TryReadBits(1) + z := reader.TryReadBits(1) + return []vectorCoord{{Value: readVectorCoord(), Valid: x != 0}, {Value: readVectorCoord(), Valid: y != 0}, {Value: readVectorCoord(), Valid: z != 0}} +} diff --git a/pkg/messages/types/svcClassInfo.go b/pkg/messages/types/svcClassInfo.go new file mode 100644 index 0000000..9f367d3 --- /dev/null +++ b/pkg/messages/types/svcClassInfo.go @@ -0,0 +1,40 @@ +package messages + +import ( + "fmt" + "math" + + "github.com/pektezol/bitreader" +) + +type SvcClassInfo struct { + Length int16 + CreateOnClient bool + ServerClasses []serverClass +} + +type serverClass struct { + ClassId int16 + ClassName string + DataTableName string +} + +func ParseSvcClassInfo(reader *bitreader.ReaderType) SvcClassInfo { + svcClassInfo := SvcClassInfo{ + Length: int16(reader.TryReadBits(16)), + CreateOnClient: reader.TryReadBool(), + } + classes := []serverClass{} + if !svcClassInfo.CreateOnClient { + for count := 0; count < int(svcClassInfo.Length); count++ { + fmt.Println(classes) + classes = append(classes, serverClass{ + ClassId: int16(reader.TryReadBits(int(math.Log2(float64(svcClassInfo.Length)) + 1))), + ClassName: reader.TryReadString(), + DataTableName: reader.TryReadString(), + }) + } + } + svcClassInfo.ServerClasses = classes + return svcClassInfo +} diff --git a/pkg/messages/types/svcCmdKeyValues.go b/pkg/messages/types/svcCmdKeyValues.go new file mode 100644 index 0000000..1c4d819 --- /dev/null +++ b/pkg/messages/types/svcCmdKeyValues.go @@ -0,0 +1,16 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcCmdKeyValues struct { + Length int32 + Data []byte +} + +func ParseSvcCmdKeyValues(reader *bitreader.ReaderType) SvcCmdKeyValues { + svcCmdKeyValues := SvcCmdKeyValues{ + Length: int32(reader.TryReadBits(32)), + } + svcCmdKeyValues.Data = reader.TryReadBytesToSlice(int(svcCmdKeyValues.Length)) + return svcCmdKeyValues +} diff --git a/pkg/messages/types/svcCreateStringTable.go b/pkg/messages/types/svcCreateStringTable.go new file mode 100644 index 0000000..ed9e477 --- /dev/null +++ b/pkg/messages/types/svcCreateStringTable.go @@ -0,0 +1,36 @@ +package messages + +import ( + "math" + + "github.com/pektezol/bitreader" +) + +type SvcCreateStringTable struct { + Name string + MaxEntries int16 + NumEntries int8 + Length int32 + UserDataFixedSize bool + UserDataSize int16 + UserDataSizeBits int8 + Flags int8 + StringData int +} + +func ParseSvcCreateStringTable(reader *bitreader.ReaderType) SvcCreateStringTable { + svcCreateStringTable := SvcCreateStringTable{ + Name: reader.TryReadString(), + MaxEntries: int16(reader.TryReadBits(16)), + } + svcCreateStringTable.NumEntries = int8(reader.TryReadBits(int(math.Log2(float64(svcCreateStringTable.MaxEntries))) + 1)) + svcCreateStringTable.Length = int32(reader.TryReadBits(20)) + svcCreateStringTable.UserDataFixedSize = reader.TryReadBool() + if svcCreateStringTable.UserDataFixedSize { + svcCreateStringTable.UserDataSize = int16(reader.TryReadBits(12)) + svcCreateStringTable.UserDataSizeBits = int8(reader.TryReadBits(4)) + } + svcCreateStringTable.Flags = int8(reader.TryReadBits(2)) + reader.SkipBits(int(svcCreateStringTable.Length)) // TODO: StringTable parsing + return svcCreateStringTable +} diff --git a/pkg/messages/types/svcCrosshairAngle.go b/pkg/messages/types/svcCrosshairAngle.go new file mode 100644 index 0000000..cf18212 --- /dev/null +++ b/pkg/messages/types/svcCrosshairAngle.go @@ -0,0 +1,13 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcCrosshairAngle struct { + Angle []int16 +} + +func ParseSvcCrosshairAngle(reader *bitreader.ReaderType) SvcCrosshairAngle { + return SvcCrosshairAngle{ + Angle: []int16{int16(reader.TryReadBits(16)), int16(reader.TryReadBits(16)), int16(reader.TryReadBits(16))}, + } +} diff --git a/pkg/messages/types/svcEntityMessage.go b/pkg/messages/types/svcEntityMessage.go new file mode 100644 index 0000000..9726ced --- /dev/null +++ b/pkg/messages/types/svcEntityMessage.go @@ -0,0 +1,20 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcEntityMessage struct { + EntityIndex int16 + ClassId int16 + Length int16 + Data []byte +} + +func ParseSvcEntityMessage(reader *bitreader.ReaderType) SvcEntityMessage { + svcEntityMessage := SvcEntityMessage{ + EntityIndex: int16(reader.TryReadBits(11)), + ClassId: int16(reader.TryReadBits(9)), + Length: int16(reader.TryReadBits(11)), + } + svcEntityMessage.Data = reader.TryReadBitsToSlice(int(svcEntityMessage.Length)) + return svcEntityMessage +} diff --git a/pkg/messages/types/svcFixAngle.go b/pkg/messages/types/svcFixAngle.go new file mode 100644 index 0000000..56acf04 --- /dev/null +++ b/pkg/messages/types/svcFixAngle.go @@ -0,0 +1,15 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcFixAngle struct { + Relative bool + Angle []int16 +} + +func ParseSvcFixAngle(reader *bitreader.ReaderType) SvcFixAngle { + return SvcFixAngle{ + Relative: reader.TryReadBool(), + Angle: []int16{int16(reader.TryReadBits(16)), int16(reader.TryReadBits(16)), int16(reader.TryReadBits(16))}, + } +} diff --git a/pkg/messages/types/svcGameEvent.go b/pkg/messages/types/svcGameEvent.go new file mode 100644 index 0000000..6ee4d01 --- /dev/null +++ b/pkg/messages/types/svcGameEvent.go @@ -0,0 +1,16 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcGameEvent struct { + Length int16 + Data []byte // TODO: GameEvent[] +} + +func ParseSvcGameEvent(reader *bitreader.ReaderType) SvcGameEvent { + svcGameEvent := SvcGameEvent{ + Length: int16(reader.TryReadBits(11)), + } + svcGameEvent.Data = reader.TryReadBitsToSlice(int(svcGameEvent.Length)) + return svcGameEvent +} diff --git a/pkg/messages/types/svcGameEventList.go b/pkg/messages/types/svcGameEventList.go new file mode 100644 index 0000000..b99ce28 --- /dev/null +++ b/pkg/messages/types/svcGameEventList.go @@ -0,0 +1,21 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcGameEventList struct { + Events int16 + Length int32 + GameEventDescriptor []gameEventDescriptor +} + +type gameEventDescriptor struct { +} + +func ParseSvcGameEventList(reader *bitreader.ReaderType) SvcGameEventList { + svcGameEventList := SvcGameEventList{ + Events: int16(reader.TryReadBits(9)), + Length: int32(reader.TryReadBits(20)), + } + reader.TryReadBitsToSlice(int(svcGameEventList.Length)) + return svcGameEventList +} diff --git a/pkg/messages/types/svcGetCvarValue.go b/pkg/messages/types/svcGetCvarValue.go new file mode 100644 index 0000000..aef5c8e --- /dev/null +++ b/pkg/messages/types/svcGetCvarValue.go @@ -0,0 +1,16 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcGetCvarValue struct { + Cookie string + CvarName string +} + +func ParseSvcGetCvarValue(reader *bitreader.ReaderType) SvcGetCvarValue { + svcGetCvarValue := SvcGetCvarValue{ + Cookie: reader.TryReadStringLen(4), + CvarName: reader.TryReadString(), + } + return svcGetCvarValue +} diff --git a/pkg/messages/types/svcMenu.go b/pkg/messages/types/svcMenu.go new file mode 100644 index 0000000..d89f52c --- /dev/null +++ b/pkg/messages/types/svcMenu.go @@ -0,0 +1,18 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcMenu struct { + MenuType int16 + Length int32 + Data []byte +} + +func ParseSvcMenu(reader *bitreader.ReaderType) SvcMenu { + svcMenu := SvcMenu{ + MenuType: int16(reader.TryReadBits(16)), + Length: int32(reader.TryReadBits(32)), + } + svcMenu.Data = reader.TryReadBitsToSlice(int(svcMenu.Length)) + return svcMenu +} diff --git a/pkg/messages/types/svcPacketEntities.go b/pkg/messages/types/svcPacketEntities.go new file mode 100644 index 0000000..b1c23e5 --- /dev/null +++ b/pkg/messages/types/svcPacketEntities.go @@ -0,0 +1,30 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcPacketEntities struct { + MaxEntries int16 + IsDelta bool + DeltaFrom int32 + BaseLine bool + UpdatedEntries int16 + Length int32 + UpdatedBaseline bool + Data []byte +} + +func ParseSvcPacketEntities(reader *bitreader.ReaderType) SvcPacketEntities { + svcPacketEntities := SvcPacketEntities{ + MaxEntries: int16(reader.TryReadBits(11)), + IsDelta: reader.TryReadBool(), + } + if svcPacketEntities.IsDelta { + svcPacketEntities.DeltaFrom = int32(reader.TryReadBits(32)) + } + svcPacketEntities.BaseLine = reader.TryReadBool() + svcPacketEntities.UpdatedEntries = int16(reader.TryReadBits(11)) + svcPacketEntities.Length = int32(reader.TryReadBits(20)) + svcPacketEntities.UpdatedBaseline = reader.TryReadBool() + svcPacketEntities.Data = reader.TryReadBitsToSlice(int(svcPacketEntities.Length)) + return svcPacketEntities +} diff --git a/pkg/messages/types/svcPaintmapData.go b/pkg/messages/types/svcPaintmapData.go new file mode 100644 index 0000000..6b041da --- /dev/null +++ b/pkg/messages/types/svcPaintmapData.go @@ -0,0 +1,16 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcPaintmapData struct { + Length int32 + Data []byte +} + +func ParseSvcPaintmapData(reader *bitreader.ReaderType) SvcPaintmapData { + svcPaintmapData := SvcPaintmapData{ + Length: int32(reader.TryReadBits(32)), + } + svcPaintmapData.Data = reader.TryReadBitsToSlice(int(svcPaintmapData.Length)) + return svcPaintmapData +} diff --git a/pkg/messages/types/svcPrefetch.go b/pkg/messages/types/svcPrefetch.go new file mode 100644 index 0000000..549f926 --- /dev/null +++ b/pkg/messages/types/svcPrefetch.go @@ -0,0 +1,13 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcPrefetch struct { + SoundIndex int16 +} + +func ParseSvcPrefetch(reader *bitreader.ReaderType) SvcPrefetch { + return SvcPrefetch{ + SoundIndex: int16(reader.TryReadBits(13)), + } +} diff --git a/pkg/messages/types/svcPrint.go b/pkg/messages/types/svcPrint.go new file mode 100644 index 0000000..8aff927 --- /dev/null +++ b/pkg/messages/types/svcPrint.go @@ -0,0 +1,13 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcPrint struct { + Message string +} + +func ParseSvcPrint(reader *bitreader.ReaderType) SvcPrint { + return SvcPrint{ + Message: reader.TryReadString(), + } +} diff --git a/pkg/messages/types/svcSendTable.go b/pkg/messages/types/svcSendTable.go new file mode 100644 index 0000000..ae8960b --- /dev/null +++ b/pkg/messages/types/svcSendTable.go @@ -0,0 +1,17 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcSendTable struct { + NeedsDecoder int8 + Length int8 + Props int32 +} + +func ParseSvcSendTable(reader *bitreader.ReaderType) SvcSendTable { + return SvcSendTable{ + NeedsDecoder: int8(reader.TryReadBits(8)), + Length: int8(reader.TryReadBits(8)), + Props: int32(reader.TryReadBits(32)), + } +} diff --git a/pkg/messages/types/svcServerInfo.go b/pkg/messages/types/svcServerInfo.go new file mode 100644 index 0000000..b8bb308 --- /dev/null +++ b/pkg/messages/types/svcServerInfo.go @@ -0,0 +1,43 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcServerInfo struct { + Protocol int16 + ServerCount int32 + IsHltv bool + IsDedicated bool + ClientCrc int32 + MaxClasses int16 + MapCrc int32 + PlayerSlot int8 + MaxClients int8 + Unk int32 + TickInterval int32 + COs int8 + GameDir string + MapName string + SkyName string + HostName string +} + +func ParseSvcServerInfo(reader *bitreader.ReaderType) SvcServerInfo { + return SvcServerInfo{ + Protocol: int16(reader.TryReadBits(16)), + ServerCount: int32(reader.TryReadBits(32)), + IsHltv: reader.TryReadBool(), + IsDedicated: reader.TryReadBool(), + ClientCrc: int32(reader.TryReadBits(32)), + MaxClasses: int16(reader.TryReadBits(16)), + MapCrc: int32(reader.TryReadBits(32)), + PlayerSlot: int8(reader.TryReadBits(8)), + MaxClients: int8(reader.TryReadBits(8)), + Unk: int32(reader.TryReadBits(32)), + TickInterval: int32(reader.TryReadBits(32)), + COs: int8(reader.TryReadBits(8)), + GameDir: reader.TryReadString(), + MapName: reader.TryReadString(), + SkyName: reader.TryReadString(), + HostName: reader.TryReadString(), + } +} diff --git a/pkg/messages/types/svcSetPause.go b/pkg/messages/types/svcSetPause.go new file mode 100644 index 0000000..94303b7 --- /dev/null +++ b/pkg/messages/types/svcSetPause.go @@ -0,0 +1,13 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcSetPause struct { + Paused bool +} + +func ParseSvcSetPause(reader *bitreader.ReaderType) SvcSetPause { + return SvcSetPause{ + Paused: reader.TryReadBool(), + } +} diff --git a/pkg/messages/types/svcSetView.go b/pkg/messages/types/svcSetView.go new file mode 100644 index 0000000..70d1e2b --- /dev/null +++ b/pkg/messages/types/svcSetView.go @@ -0,0 +1,13 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcSetView struct { + EntityIndex int16 +} + +func ParseSvcSetView(reader *bitreader.ReaderType) SvcSetView { + return SvcSetView{ + EntityIndex: int16(reader.TryReadBits(11)), + } +} diff --git a/pkg/messages/types/svcSounds.go b/pkg/messages/types/svcSounds.go new file mode 100644 index 0000000..e87d584 --- /dev/null +++ b/pkg/messages/types/svcSounds.go @@ -0,0 +1,25 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcSounds struct { + ReliableSound bool + Size int8 + Length int16 + Data []byte +} + +func ParseSvcSounds(reader *bitreader.ReaderType) SvcSounds { + svcSounds := SvcSounds{ + ReliableSound: reader.TryReadBool(), + } + if svcSounds.ReliableSound { + svcSounds.Size = 1 + svcSounds.Length = int16(reader.TryReadBits(8)) + } else { + svcSounds.Size = int8(reader.TryReadBits(8)) + svcSounds.Length = int16(reader.TryReadBits(16)) + } + svcSounds.Data = reader.TryReadBitsToSlice(int(svcSounds.Length)) + return svcSounds +} diff --git a/pkg/messages/types/svcSplitScreen.go b/pkg/messages/types/svcSplitScreen.go new file mode 100644 index 0000000..9c808bc --- /dev/null +++ b/pkg/messages/types/svcSplitScreen.go @@ -0,0 +1,18 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcSplitScreen struct { + Unk bool + Length int16 + Data []byte +} + +func ParseSvcSplitScreen(reader *bitreader.ReaderType) SvcSplitScreen { + svcSplitScreen := SvcSplitScreen{ + Unk: reader.TryReadBool(), + Length: int16(reader.TryReadBits(11)), + } + svcSplitScreen.Data = reader.TryReadBitsToSlice(int(svcSplitScreen.Length)) + return svcSplitScreen +} diff --git a/pkg/messages/types/svcTempEntities.go b/pkg/messages/types/svcTempEntities.go new file mode 100644 index 0000000..d22423d --- /dev/null +++ b/pkg/messages/types/svcTempEntities.go @@ -0,0 +1,18 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcTempEntities struct { + NumEntries int8 + Length int32 + Data []byte +} + +func ParseSvcTempEntities(reader *bitreader.ReaderType) SvcTempEntities { + svcTempEntities := SvcTempEntities{ + NumEntries: int8(reader.TryReadBits(8)), + Length: int32(reader.TryReadBits(17)), + } + svcTempEntities.Data = reader.TryReadBitsToSlice(int(svcTempEntities.Length)) + return svcTempEntities +} diff --git a/pkg/messages/types/svcUpdateStringTable.go b/pkg/messages/types/svcUpdateStringTable.go new file mode 100644 index 0000000..2840482 --- /dev/null +++ b/pkg/messages/types/svcUpdateStringTable.go @@ -0,0 +1,22 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcUpdateStringTable struct { + TableId int8 + NumChangedEntries int16 + Length int32 + Data []byte +} + +func ParseSvcUpdateStringTable(reader *bitreader.ReaderType) SvcUpdateStringTable { + svcUpdateStringTable := SvcUpdateStringTable{ + TableId: int8(reader.TryReadBits(5)), + } + if reader.TryReadBool() { + svcUpdateStringTable.NumChangedEntries = int16(reader.TryReadBits(16)) + } + svcUpdateStringTable.Length = int32(reader.TryReadBits(20)) + svcUpdateStringTable.Data = reader.TryReadBitsToSlice(int(svcUpdateStringTable.Length)) + return svcUpdateStringTable +} diff --git a/pkg/messages/types/svcUserMessage.go b/pkg/messages/types/svcUserMessage.go new file mode 100644 index 0000000..b53c7c0 --- /dev/null +++ b/pkg/messages/types/svcUserMessage.go @@ -0,0 +1,18 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcUserMessage struct { + MsgType int8 + Length int16 + Data []byte +} + +func ParseSvcUserMessage(reader *bitreader.ReaderType) SvcUserMessage { + svcUserMessage := SvcUserMessage{ + MsgType: int8(reader.TryReadBits(8)), + Length: int16(reader.TryReadBits(12)), + } + svcUserMessage.Data = reader.TryReadBitsToSlice(int(svcUserMessage.Length)) + return svcUserMessage +} diff --git a/pkg/messages/types/svcVoiceData.go b/pkg/messages/types/svcVoiceData.go new file mode 100644 index 0000000..b6c81d4 --- /dev/null +++ b/pkg/messages/types/svcVoiceData.go @@ -0,0 +1,20 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcVoiceData struct { + Client int8 + Proximity int8 + Length int16 + Data []byte +} + +func ParseSvcVoiceData(reader *bitreader.ReaderType) SvcVoiceData { + svcVoiceData := SvcVoiceData{ + Client: int8(reader.TryReadBits(8)), + Proximity: int8(reader.TryReadBits(8)), + Length: int16(reader.TryReadBits(16)), + } + svcVoiceData.Data = reader.TryReadBitsToSlice(int(svcVoiceData.Length)) + return svcVoiceData +} diff --git a/pkg/messages/types/svcVoiceInit.go b/pkg/messages/types/svcVoiceInit.go new file mode 100644 index 0000000..4c95aab --- /dev/null +++ b/pkg/messages/types/svcVoiceInit.go @@ -0,0 +1,20 @@ +package messages + +import "github.com/pektezol/bitreader" + +type SvcVoiceInit struct { + Codec string + Quality uint8 + Unk float32 +} + +func ParseSvcVoiceInit(reader *bitreader.ReaderType) SvcVoiceInit { + svcVoiceInit := SvcVoiceInit{ + Codec: reader.TryReadString(), + Quality: uint8(reader.TryReadBits(8)), + } + if svcVoiceInit.Quality == 0b11111111 { + svcVoiceInit.Unk = reader.TryReadFloat32() + } + return svcVoiceInit +} -- cgit v1.2.3