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/classes/cmdInfo.go | 27 +++++++ pkg/classes/sendTable.go | 106 ++++++++++++++++++++++++ pkg/classes/serverClassInfo.go | 30 +++++++ pkg/classes/stringTable.go | 82 +++++++++++++++++++ pkg/classes/userCmdInfo.go | 72 +++++++++++++++++ pkg/messages/messages.go | 87 ++++++++++++++++++++ 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 +++++ pkg/packets/headers.go | 48 +++++++++++ pkg/packets/packets.go | 125 +++++++++++++++++++++++++++++ pkg/packets/types.go | 53 ++++++++++++ 43 files changed, 1338 insertions(+) create mode 100644 pkg/classes/cmdInfo.go create mode 100644 pkg/classes/sendTable.go create mode 100644 pkg/classes/serverClassInfo.go create mode 100644 pkg/classes/stringTable.go create mode 100644 pkg/classes/userCmdInfo.go create mode 100644 pkg/messages/messages.go 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 create mode 100644 pkg/packets/headers.go create mode 100644 pkg/packets/packets.go create mode 100644 pkg/packets/types.go (limited to 'pkg') diff --git a/pkg/classes/cmdInfo.go b/pkg/classes/cmdInfo.go new file mode 100644 index 0000000..6e56c41 --- /dev/null +++ b/pkg/classes/cmdInfo.go @@ -0,0 +1,27 @@ +package classes + +import ( + "github.com/pektezol/bitreader" +) + +type CmdInfo struct { + Flags int32 + ViewOrigin []float32 + ViewAngles []float32 + LocalViewAngles []float32 + ViewOrigin2 []float32 + ViewAngles2 []float32 + LocalViewAngles2 []float32 +} + +func ParseCmdInfo(reader *bitreader.ReaderType) CmdInfo { + return CmdInfo{ + Flags: int32(reader.TryReadBits(32)), + ViewOrigin: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, + ViewAngles: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, + LocalViewAngles: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, + ViewOrigin2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, + ViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, + LocalViewAngles2: []float32{reader.TryReadFloat32(), reader.TryReadFloat32(), reader.TryReadFloat32()}, + } +} diff --git a/pkg/classes/sendTable.go b/pkg/classes/sendTable.go new file mode 100644 index 0000000..4521464 --- /dev/null +++ b/pkg/classes/sendTable.go @@ -0,0 +1,106 @@ +package classes + +import ( + "github.com/pektezol/bitreader" +) + +type SendTable struct { + NeedsDecoder bool + NetTableName string + NumOfProps int16 + Props []prop +} + +type prop struct { + SendPropType int8 + SendPropName string + SendPropFlags int32 + Priority int8 + ExcludeDtName string + LowValue float32 + HighValue float32 + NumBits int32 + NumElements int32 +} + +type sendPropFlag int + +const ( + Unsigned sendPropFlag = iota + Coord + NoScale + RoundDown + RoundUp + Normal + Exclude + Xyze + InsideArray + ProxyAlwaysYes + IsVectorElem + Collapsible + CoordMp + CoordMpLp // low precision + CoordMpInt + CellCoord + CellCoordLp + CellCoordInt + ChangesOften +) + +type sendPropType int + +const ( + Int sendPropType = iota + Float + Vector3 + Vector2 + String + Array + DataTable +) + +func ParseSendTable(reader *bitreader.ReaderType) SendTable { + sendTable := SendTable{ + NeedsDecoder: reader.TryReadBool(), + NetTableName: reader.TryReadString(), + NumOfProps: int16(reader.TryReadBits(10)), + // SendPropType: int8(reader.TryReadBits(5)), + // SendPropName: reader.TryReadString(), + // SendPropFlags: int16(reader.TryReadBits(16)), + } + if sendTable.NumOfProps < 0 { + return sendTable + } + for count := 0; count < int(sendTable.NumOfProps); count++ { + propType := int8(reader.TryReadBits(5)) + if propType >= int8(7) { + return sendTable + } + prop := prop{ + SendPropType: propType, + SendPropName: reader.TryReadString(), + SendPropFlags: int32(reader.TryReadBits(19)), + Priority: int8(reader.TryReadBits(8)), + } + if propType == int8(DataTable) || CheckBit(int64(prop.SendPropFlags), int(Exclude)) { + prop.ExcludeDtName = reader.TryReadString() + } else { + switch propType { + case int8(String), int8(Int), int8(Float), int8(Vector3), int8(Vector2): + prop.LowValue = reader.TryReadFloat32() + prop.HighValue = reader.TryReadFloat32() + prop.NumBits = int32(reader.TryReadBits(7)) + case int8(Array): + prop.NumElements = int32(reader.TryReadBits(10)) + default: + return sendTable + } + } + sendTable.Props = append(sendTable.Props, prop) + } + return sendTable +} + +func CheckBit(val int64, bit int) bool { + return (val & (int64(1) << bit)) != 0 +} diff --git a/pkg/classes/serverClassInfo.go b/pkg/classes/serverClassInfo.go new file mode 100644 index 0000000..c60dad1 --- /dev/null +++ b/pkg/classes/serverClassInfo.go @@ -0,0 +1,30 @@ +package classes + +import ( + "github.com/pektezol/bitreader" +) + +type ServerClassInfo struct { + ClassId int16 + ClassName string + DataTableName string +} + +func ParseServerClassInfo(reader *bitreader.ReaderType, count int, numOfClasses int) ServerClassInfo { + return ServerClassInfo{ + ClassId: int16(reader.TryReadBits(16)), + ClassName: reader.TryReadString(), + DataTableName: reader.TryReadString(), + } +} + +// func serverClassBits(numOfClasses int) int { +// return highestBitIndex(uint(numOfClasses)) + 1 +// } + +// func highestBitIndex(i uint) int { +// var j int +// for j = 31; j >= 0 && (i&(1<