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 --- cmd/parser.go | 50 ++++++++++ go.mod | 4 +- go.sum | 4 +- main.go | 49 ---------- packets/classes/cmdinfo.go | 61 ------------ packets/classes/datatable.go | 66 ------------- packets/classes/stringtable.go | 51 ---------- packets/classes/usercmd.go | 80 ---------------- packets/header.go | 33 ------- packets/messages/message.go | 94 ------------------- packets/messages/types/NetDisconnect.go | 11 --- packets/messages/types/NetFile.go | 17 ---- packets/messages/types/NetNop.go | 3 - packets/messages/types/NetSetConVar.go | 26 ----- packets/messages/types/NetSignOnState.go | 27 ------ packets/messages/types/NetSplitScreenUser.go | 13 --- packets/messages/types/NetStringCmd.go | 13 --- packets/messages/types/NetTick.go | 17 ---- packets/messages/types/SvcClassInfo.go | 47 ---------- packets/messages/types/SvcCmdKeyValues.go | 14 --- packets/messages/types/SvcCreateStringTable.go | 34 ------- packets/messages/types/SvcCrosshairAngle.go | 17 ---- packets/messages/types/SvcEntityMessage.go | 20 ---- packets/messages/types/SvcFixAngle.go | 21 ----- packets/messages/types/SvcGameEvent.go | 15 --- packets/messages/types/SvcGameEventList.go | 17 ---- packets/messages/types/SvcGetCvarValue.go | 15 --- packets/messages/types/SvcMenu.go | 17 ---- packets/messages/types/SvcPacketEntities.go | 39 -------- packets/messages/types/SvcPaintmapData.go | 14 --- packets/messages/types/SvcPrefetch.go | 13 --- packets/messages/types/SvcPrint.go | 13 --- packets/messages/types/SvcSendTable.go | 17 ---- packets/messages/types/SvcServerInfo.go | 43 --------- packets/messages/types/SvcSetPause.go | 13 --- packets/messages/types/SvcSetView.go | 13 --- packets/messages/types/SvcSounds.go | 30 ------ packets/messages/types/SvcSplitScreen.go | 17 ---- packets/messages/types/SvcTempEntities.go | 20 ---- packets/messages/types/SvcUpdateStringTable.go | 21 ----- packets/messages/types/SvcUserMessage.go | 19 ---- packets/messages/types/SvcVoiceData.go | 19 ---- packets/messages/types/SvcVoiceInit.go | 20 ---- packets/packet.go | 87 ----------------- packets/types.go | 62 ------------ 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 +++++++++++ 88 files changed, 1392 insertions(+), 1242 deletions(-) create mode 100644 cmd/parser.go delete mode 100644 main.go delete mode 100644 packets/classes/cmdinfo.go delete mode 100644 packets/classes/datatable.go delete mode 100644 packets/classes/stringtable.go delete mode 100644 packets/classes/usercmd.go delete mode 100644 packets/header.go delete mode 100644 packets/messages/message.go delete mode 100644 packets/messages/types/NetDisconnect.go delete mode 100644 packets/messages/types/NetFile.go delete mode 100644 packets/messages/types/NetNop.go delete mode 100644 packets/messages/types/NetSetConVar.go delete mode 100644 packets/messages/types/NetSignOnState.go delete mode 100644 packets/messages/types/NetSplitScreenUser.go delete mode 100644 packets/messages/types/NetStringCmd.go delete mode 100644 packets/messages/types/NetTick.go delete mode 100644 packets/messages/types/SvcClassInfo.go delete mode 100644 packets/messages/types/SvcCmdKeyValues.go delete mode 100644 packets/messages/types/SvcCreateStringTable.go delete mode 100644 packets/messages/types/SvcCrosshairAngle.go delete mode 100644 packets/messages/types/SvcEntityMessage.go delete mode 100644 packets/messages/types/SvcFixAngle.go delete mode 100644 packets/messages/types/SvcGameEvent.go delete mode 100644 packets/messages/types/SvcGameEventList.go delete mode 100644 packets/messages/types/SvcGetCvarValue.go delete mode 100644 packets/messages/types/SvcMenu.go delete mode 100644 packets/messages/types/SvcPacketEntities.go delete mode 100644 packets/messages/types/SvcPaintmapData.go delete mode 100644 packets/messages/types/SvcPrefetch.go delete mode 100644 packets/messages/types/SvcPrint.go delete mode 100644 packets/messages/types/SvcSendTable.go delete mode 100644 packets/messages/types/SvcServerInfo.go delete mode 100644 packets/messages/types/SvcSetPause.go delete mode 100644 packets/messages/types/SvcSetView.go delete mode 100644 packets/messages/types/SvcSounds.go delete mode 100644 packets/messages/types/SvcSplitScreen.go delete mode 100644 packets/messages/types/SvcTempEntities.go delete mode 100644 packets/messages/types/SvcUpdateStringTable.go delete mode 100644 packets/messages/types/SvcUserMessage.go delete mode 100644 packets/messages/types/SvcVoiceData.go delete mode 100644 packets/messages/types/SvcVoiceInit.go delete mode 100644 packets/packet.go delete mode 100644 packets/types.go 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 diff --git a/cmd/parser.go b/cmd/parser.go new file mode 100644 index 0000000..d03fa9c --- /dev/null +++ b/cmd/parser.go @@ -0,0 +1,50 @@ +package main + +import ( + "fmt" + "os" + "reflect" + + "github.com/pektezol/bitreader" + "github.com/pektezol/demoparser/pkg/packets" +) + +func main() { + if len(os.Args) != 2 { + panic("specify file in command line arguments") + } + files, err := os.ReadDir(os.Args[1]) + if err != nil { // If it's not a directory + file, err := os.Open(os.Args[1]) + if err != nil { + panic(err) + } + reader := bitreader.Reader(file, true) + demoParserHandler(reader) + defer file.Close() + } + for _, fileinfo := range files { // If it is a directory + file, err := os.Open(os.Args[1] + fileinfo.Name()) + if err != nil { + panic(err) + } + reader := bitreader.Reader(file, true) + demoParserHandler(reader) + defer file.Close() + } + // fmt.Scanln() +} + +func demoParserHandler(reader *bitreader.ReaderType) { + packets.ParseHeaders(reader) + for { + packet := packets.ParsePackets(reader) + if packet.PacketType == 7 { + break + } + // if packet.PacketType != 5 { + // continue + // } + fmt.Printf("[%d] %s (%d):\n\t%+v\n", packet.TickNumber, reflect.ValueOf(packet.Data).Type(), packet.PacketType, packet.Data) + } +} diff --git a/go.mod b/go.mod index d1b68cc..408c7e3 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,5 @@ module github.com/pektezol/demoparser -go 1.19 +go 1.21.0 -require github.com/pektezol/bitreader v1.2.9 +require github.com/pektezol/bitreader v1.3.0 diff --git a/go.sum b/go.sum index 4cccb6e..190a8a8 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,2 @@ -github.com/pektezol/bitreader v1.2.9 h1:DnCe5vDt6vC9zRVaeX47XjlcgK1i0jDPhYd8cimyPvo= -github.com/pektezol/bitreader v1.2.9/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= +github.com/pektezol/bitreader v1.3.0 h1:VOj1M+vw0+xuBUlD4HPHdkjnVdUrHw2nwa5Ccxxm2ek= +github.com/pektezol/bitreader v1.3.0/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= diff --git a/main.go b/main.go deleted file mode 100644 index 8f05c2b..0000000 --- a/main.go +++ /dev/null @@ -1,49 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "log" - "os" - - "github.com/pektezol/bitreader" - "github.com/pektezol/demoparser/packets" -) - -func main() { - if len(os.Args) != 2 { - log.Fatal("Specify file in command line arguments.") - } - files, err := ioutil.ReadDir(os.Args[1]) - if err != nil { // If it's not a directory - file, err := os.Open(os.Args[1]) - if err != nil { - panic(err) - } - reader := bitreader.Reader(file, true) - packets.ParseHeader(reader) - for { - code := packets.ParsePacket(reader) - if code == 7 { - break - } - } - defer file.Close() - } - for _, fileinfo := range files { // If it is a directory - file, err := os.Open(os.Args[1] + fileinfo.Name()) - if err != nil { - panic(err) - } - /*messages.ParseHeader(file) - for { - code := messages.ParseMessage(file) - if code == 7 { - messages.ParseMessage(file) - break - } - }*/ - defer file.Close() - } - fmt.Scanln() -} diff --git a/packets/classes/cmdinfo.go b/packets/classes/cmdinfo.go deleted file mode 100644 index d11bebc..0000000 --- a/packets/classes/cmdinfo.go +++ /dev/null @@ -1,61 +0,0 @@ -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, MSSC int) []CmdInfo { - var out []CmdInfo - for i := 0; i < MSSC; i++ { - flags := int32(reader.TryReadInt32()) - 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(), - } - cmdInfo := CmdInfo{ - Flags: flags, - ViewOrigin: viewOrigin, - ViewAngles: viewAngles, - LocalViewAngles: localViewAngles, - ViewOrigin2: viewOrigin2, - ViewAngles2: viewAngles2, - LocalViewAngles2: localViewAngles2, - } - out = append(out, cmdInfo) - } - return out -} diff --git a/packets/classes/datatable.go b/packets/classes/datatable.go deleted file mode 100644 index 405dae6..0000000 --- a/packets/classes/datatable.go +++ /dev/null @@ -1,66 +0,0 @@ -package classes - -import ( - "bytes" - "fmt" - - "github.com/pektezol/bitreader" -) - -type DataTable struct { - SendTable []SendTable - ServerClassInfo []ServerClassInfo -} - -type SendTable struct { - NeedsDecoder bool - NetTableName string - NumOfProps uint16 - SendPropType int8 - SendPropName string - SendPropFlags int16 -} - -type ServerClassInfo struct { - ClassId int16 - ClassName string - DataTableName string -} - -func ParseDataTable(data []byte) DataTable { - reader := bitreader.Reader(bytes.NewReader(data), true) - sendtable := parseSendTable(reader) - serverclassinfo := parseServerClassInfo(reader) - return DataTable{ - SendTable: sendtable, - ServerClassInfo: serverclassinfo, - } -} - -func parseSendTable(reader *bitreader.ReaderType) []SendTable { - var sendtables []SendTable - for reader.TryReadBool() { - sendtables = append(sendtables, SendTable{ - NeedsDecoder: reader.TryReadBool(), - NetTableName: reader.TryReadString(), - NumOfProps: uint16(reader.TryReadBits(10)), - SendPropType: int8(reader.TryReadBits(5)), - SendPropName: reader.TryReadString(), - SendPropFlags: int16(reader.TryReadInt16()), - }) - } - return sendtables -} -func parseServerClassInfo(reader *bitreader.ReaderType) []ServerClassInfo { - var serverclassinfo []ServerClassInfo - numofclasses := reader.TryReadInt16() - fmt.Println(numofclasses) - for i := 0; i < int(numofclasses); i++ { - serverclassinfo = append(serverclassinfo, ServerClassInfo{ - ClassId: int16(reader.TryReadInt16()), - ClassName: reader.TryReadString(), - DataTableName: reader.TryReadString(), - }) - } - return serverclassinfo -} diff --git a/packets/classes/stringtable.go b/packets/classes/stringtable.go deleted file mode 100644 index a1432f9..0000000 --- a/packets/classes/stringtable.go +++ /dev/null @@ -1,51 +0,0 @@ -package classes - -import ( - "bytes" - - "github.com/pektezol/bitreader" -) - -type StringTable struct { - TableName string - NumOfEntries int16 - EntryName string - EntrySize int16 - EntryData []byte - NumOfClientEntries int16 - ClientEntryName string - ClientEntrySize int16 - ClientEntryData []byte -} - -func ParseStringTable(data []byte) []StringTable { - reader := bitreader.Reader(bytes.NewReader(data), true) - var stringTables []StringTable - numOfTables := reader.TryReadInt8() - for i := 0; i < int(numOfTables); i++ { - var stringTable StringTable - stringTable.TableName = reader.TryReadString() - stringTable.NumOfEntries = int16(reader.TryReadInt16()) - stringTable.EntryName = reader.TryReadString() - if reader.TryReadBool() { - stringTable.EntrySize = int16(reader.TryReadInt16()) - } - if reader.TryReadBool() { - stringTable.EntryData = reader.TryReadBytesToSlice(int(stringTable.EntrySize)) - } - if reader.TryReadBool() { - stringTable.NumOfClientEntries = int16(reader.TryReadInt16()) - } - if reader.TryReadBool() { - stringTable.ClientEntryName = reader.TryReadString() - } - if reader.TryReadBool() { - stringTable.ClientEntrySize = int16(reader.TryReadInt16()) - } - if reader.TryReadBool() { - stringTable.ClientEntryData = reader.TryReadBytesToSlice(int(stringTable.ClientEntrySize)) - } - stringTables = append(stringTables, stringTable) - } - return stringTables -} diff --git a/packets/classes/usercmd.go b/packets/classes/usercmd.go deleted file mode 100644 index d3328fd..0000000 --- a/packets/classes/usercmd.go +++ /dev/null @@ -1,80 +0,0 @@ -package classes - -import ( - "bytes" - - "github.com/pektezol/bitreader" -) - -type UserCmdInfo struct { - CommandNumber int32 - TickCount int32 - ViewAnglesX float32 - ViewAnglesY float32 - ViewAnglesZ float32 - ForwardMove float32 - SideMove float32 - UpMove float32 - Buttons int32 - Impulse byte - WeaponSelect int - WeaponSubtype int - MouseDx int16 - MouseDy int16 -} - -func ParseUserCmdInfo(data []byte) UserCmdInfo { - reader := bitreader.Reader(bytes.NewReader(data), true) - var userCmdInfo UserCmdInfo - if reader.TryReadBool() { - userCmdInfo.CommandNumber = int32(reader.TryReadInt32()) - } - if reader.TryReadBool() { - userCmdInfo.TickCount = int32(reader.TryReadInt32()) - } - if reader.TryReadBool() { - userCmdInfo.ViewAnglesX = reader.TryReadFloat32() - } - if reader.TryReadBool() { - userCmdInfo.ViewAnglesY = reader.TryReadFloat32() - } - if reader.TryReadBool() { - userCmdInfo.ViewAnglesZ = reader.TryReadFloat32() - } - if reader.TryReadBool() { - userCmdInfo.ForwardMove = reader.TryReadFloat32() - } - if reader.TryReadBool() { - userCmdInfo.SideMove = reader.TryReadFloat32() - } - if reader.TryReadBool() { - userCmdInfo.UpMove = reader.TryReadFloat32() - } - if reader.TryReadBool() { - userCmdInfo.Buttons = int32(reader.TryReadInt32()) - } - if reader.TryReadBool() { - userCmdInfo.Impulse = reader.TryReadInt8() - } - if reader.TryReadBool() { - value, err := reader.ReadBits(11) - if err != nil { - panic(err) - } - userCmdInfo.WeaponSelect = int(value) - if reader.TryReadBool() { - value, err := reader.ReadBits(6) - if err != nil { - panic(err) - } - userCmdInfo.WeaponSubtype = int(value) - } - } - if reader.TryReadBool() { - userCmdInfo.MouseDx = int16(reader.TryReadInt16()) - } - if reader.TryReadBool() { - userCmdInfo.MouseDy = int16(reader.TryReadInt16()) - } - return userCmdInfo -} diff --git a/packets/header.go b/packets/header.go deleted file mode 100644 index c4172d9..0000000 --- a/packets/header.go +++ /dev/null @@ -1,33 +0,0 @@ -package packets - -import ( - "fmt" - - "github.com/pektezol/bitreader" -) - -func ParseHeader(reader *bitreader.ReaderType) { - header := Header{ - DemoFileStamp: reader.TryReadStringLen(8), - DemoProtocol: uint32(reader.TryReadInt32()), - NetworkProtocol: uint32(reader.TryReadInt32()), - ServerName: reader.TryReadStringLen(260), - ClientName: reader.TryReadStringLen(260), - MapName: reader.TryReadStringLen(260), - GameDirectory: reader.TryReadStringLen(260), - PlaybackTime: reader.TryReadFloat32(), - PlaybackTicks: int32(reader.TryReadInt32()), - PlaybackFrames: int32(reader.TryReadInt32()), - SignOnLength: uint32(reader.TryReadInt32()), - } - if header.DemoFileStamp != "HL2DEMO" { - panic("Invalid demo file stamp. Make sure a valid demo file is given.") - } - if header.DemoProtocol != 4 { - panic("Given demo is from old engine. This parser is only supported for new engine.") - } - if header.NetworkProtocol != 2001 { - panic("Given demo is not from Portal2. This parser currently only supports Portal 2.") - } - fmt.Println(header) -} diff --git a/packets/messages/message.go b/packets/messages/message.go deleted file mode 100644 index 4a00212..0000000 --- a/packets/messages/message.go +++ /dev/null @@ -1,94 +0,0 @@ -package messages - -import ( - "bytes" - - "github.com/pektezol/bitreader" - "github.com/pektezol/demoparser/packets/messages/types" -) - -func ParseMessage(data []byte) []Message { - reader := bitreader.Reader(bytes.NewReader(data), true) - var messages []Message - for { - messageType, err := reader.ReadBits(6) - if err != nil { - break - } - switch messageType { - case 0: - messages = append(messages, Message{Data: types.NetNop{}}) - case 1: - messages = append(messages, Message{Data: types.ParseNetDisconnect(reader)}) - case 2: - messages = append(messages, Message{Data: types.ParseNetFile(reader)}) - case 3: - messages = append(messages, Message{Data: types.ParseNetSplitScreenUser(reader)}) - case 4: - messages = append(messages, Message{Data: types.ParseNetTick(reader)}) - case 5: - messages = append(messages, Message{Data: types.ParseNetStringCmd(reader)}) - case 6: - messages = append(messages, Message{Data: types.ParseNetSetConVar(reader)}) - case 7: - messages = append(messages, Message{Data: types.ParseNetSignOnState(reader)}) - case 8: - messages = append(messages, Message{Data: types.ParseSvcServerInfo(reader)}) - case 9: - messages = append(messages, Message{Data: types.ParseSvcSendTable(reader)}) - case 10: - messages = append(messages, Message{Data: types.ParseSvcClassInfo(reader)}) - case 11: - messages = append(messages, Message{Data: types.ParseSvcSetPause(reader)}) - case 12: - messages = append(messages, Message{Data: types.ParseSvcCreateStringTable(reader)}) - case 13: - messages = append(messages, Message{Data: types.ParseSvcUpdateStringTable(reader)}) - case 14: - messages = append(messages, Message{Data: types.ParseSvcVoiceInit(reader)}) - case 15: - messages = append(messages, Message{Data: types.ParseSvcVoiceData(reader)}) - case 16: - messages = append(messages, Message{Data: types.ParseSvcPrint(reader)}) - case 17: - messages = append(messages, Message{Data: types.ParseSvcSounds(reader)}) - case 18: - messages = append(messages, Message{Data: types.ParseSvcSetView(reader)}) - case 19: - messages = append(messages, Message{Data: types.ParseSvcFixAngle(reader)}) - case 20: - messages = append(messages, Message{Data: types.ParseSvcCrosshairAngle(reader)}) - case 21: - // TODO: SvcBspDecal - case 22: - messages = append(messages, Message{Data: types.ParseSvcSplitScreen(reader)}) - case 23: - messages = append(messages, Message{Data: types.ParseSvcUserMessage(reader)}) - case 24: - messages = append(messages, Message{Data: types.ParseSvcEntityMessage(reader)}) - case 25: - messages = append(messages, Message{Data: types.ParseSvcGameEvent(reader)}) - case 26: - messages = append(messages, Message{Data: types.ParseSvcPacketEntities(reader)}) - case 27: - messages = append(messages, Message{Data: types.ParseSvcTempEntities(reader)}) - case 28: - messages = append(messages, Message{Data: types.ParseSvcPrefetch(reader)}) - case 29: - messages = append(messages, Message{Data: types.ParseSvcMenu(reader)}) - case 30: - messages = append(messages, Message{Data: types.ParseSvcGameEventList(reader)}) - case 31: - messages = append(messages, Message{Data: types.ParseSvcGetCvarValue(reader)}) - case 32: - messages = append(messages, Message{Data: types.ParseSvcCmdKeyValues(reader)}) - case 33: - messages = append(messages, Message{Data: types.ParseSvcPaintmapData(reader)}) - } - } - return messages -} - -type Message struct { - Data any -} diff --git a/packets/messages/types/NetDisconnect.go b/packets/messages/types/NetDisconnect.go deleted file mode 100644 index 8b65568..0000000 --- a/packets/messages/types/NetDisconnect.go +++ /dev/null @@ -1,11 +0,0 @@ -package types - -import "github.com/pektezol/bitreader" - -type NetDisconnect struct { - Text string -} - -func ParseNetDisconnect(reader *bitreader.ReaderType) NetDisconnect { - return NetDisconnect{Text: reader.TryReadString()} -} diff --git a/packets/messages/types/NetFile.go b/packets/messages/types/NetFile.go deleted file mode 100644 index c65873d..0000000 --- a/packets/messages/types/NetFile.go +++ /dev/null @@ -1,17 +0,0 @@ -package types - -import "github.com/pektezol/bitreader" - -type NetFile struct { - TransferId uint32 - FileName string - FileRequested bool -} - -func ParseNetFile(reader *bitreader.ReaderType) NetFile { - return NetFile{ - TransferId: reader.TryReadInt32(), - FileName: reader.TryReadString(), - FileRequested: reader.TryReadBool(), - } -} diff --git a/packets/messages/types/NetNop.go b/packets/messages/types/NetNop.go deleted file mode 100644 index d0a1f7a..0000000 --- a/packets/messages/types/NetNop.go +++ /dev/null @@ -1,3 +0,0 @@ -package types - -type NetNop struct{} diff --git a/packets/messages/types/NetSetConVar.go b/packets/messages/types/NetSetConVar.go deleted file mode 100644 index eca05e0..0000000 --- a/packets/messages/types/NetSetConVar.go +++ /dev/null @@ -1,26 +0,0 @@ -package types - -import "github.com/pektezol/bitreader" - -type NetSetConVar struct { - ConVars []ConVar -} - -type ConVar struct { - Name string - Value string -} - -func ParseNetSetConVar(reader *bitreader.ReaderType) NetSetConVar { - length := reader.TryReadInt8() - convars := make([]ConVar, length) - for i := 0; i < int(length); i++ { - convars[i] = ConVar{ - Name: reader.TryReadString(), - Value: reader.TryReadString(), - } - } - return NetSetConVar{ - ConVars: convars, - } -} diff --git a/packets/messages/types/NetSignOnState.go b/packets/messages/types/NetSignOnState.go deleted file mode 100644 index a8f3add..0000000 --- a/packets/messages/types/NetSignOnState.go +++ /dev/null @@ -1,27 +0,0 @@ -package types - -import ( - "github.com/pektezol/bitreader" -) - -type NetSignOnState struct { - SignonState int8 - SpawnCount uint32 - NumServerPlayers uint32 - PlayersNetworkIds []byte - MapNameLength uint32 - MapName string -} - -func ParseNetSignOnState(reader *bitreader.ReaderType) NetSignOnState { - netsignonstate := NetSignOnState{ - SignonState: int8(reader.TryReadInt8()), - SpawnCount: reader.TryReadInt32(), - NumServerPlayers: reader.TryReadInt32(), - } - length := reader.TryReadInt32() - netsignonstate.PlayersNetworkIds = reader.TryReadBytesToSlice(int(length)) - netsignonstate.MapNameLength = reader.TryReadInt32() - netsignonstate.MapName = reader.TryReadStringLen(int(netsignonstate.MapNameLength)) - return netsignonstate -} diff --git a/packets/messages/types/NetSplitScreenUser.go b/packets/messages/types/NetSplitScreenUser.go deleted file mode 100644 index d4d04b5..0000000 --- a/packets/messages/types/NetSplitScreenUser.go +++ /dev/null @@ -1,13 +0,0 @@ -package types - -import "github.com/pektezol/bitreader" - -type NetSplitScreenUser struct { - PlayerSlot bool -} - -func ParseNetSplitScreenUser(reader *bitreader.ReaderType) NetSplitScreenUser { - return NetSplitScreenUser{ - PlayerSlot: reader.TryReadBool(), - } -} diff --git a/packets/messages/types/NetStringCmd.go b/packets/messages/types/NetStringCmd.go deleted file mode 100644 index 1ee9f67..0000000 --- a/packets/messages/types/NetStringCmd.go +++ /dev/null @@ -1,13 +0,0 @@ -package types - -import "github.com/pektezol/bitreader" - -type NetStringCmd struct { - Command string -} - -func ParseNetStringCmd(reader *bitreader.ReaderType) NetStringCmd { - return NetStringCmd{ - Command: reader.TryReadString(), - } -} diff --git a/packets/messages/types/NetTick.go b/packets/messages/types/NetTick.go deleted file mode 100644 index 9dae14b..0000000 --- a/packets/messages/types/NetTick.go +++ /dev/null @@ -1,17 +0,0 @@ -package types - -import "github.com/pektezol/bitreader" - -type NetTick struct { - Tick uint32 - HostFrameTime float32 - HostFrameTimeStdDeviation float32 -} - -func ParseNetTick(reader *bitreader.ReaderType) NetTick { - return NetTick{ - Tick: reader.TryReadInt32(), - HostFrameTime: float32(reader.TryReadInt16()) / 1e5, - HostFrameTimeStdDeviation: float32(reader.TryReadInt16()) / 1e5, - } -} diff --git a/packets/messages/types/SvcClassInfo.go b/packets/messages/types/SvcClassInfo.go deleted file mode 100644 index df17bfc..0000000 --- a/packets/messages/types/SvcClassInfo.go +++ /dev/null @@ -1,47 +0,0 @@ -package types - -import ( - "github.com/pektezol/bitreader" -) - -type SvcClassInfo struct { - CreateOnClient bool - ServerClasses []ServerClass -} - -type ServerClass struct { - ClassId int32 - ClassName string - DataTableName string -} - -func ParseSvcClassInfo(reader *bitreader.ReaderType) SvcClassInfo { - length := reader.TryReadInt16() - createonclient := reader.TryReadBool() - var serverclasses []ServerClass - if !createonclient { - serverclasses := make([]ServerClass, length) - for i := 0; i < int(length); i++ { - id, err := reader.ReadBits(HighestBitIndex(uint(length)) + 1) - if err != nil { - panic(err) - } - serverclasses[i] = ServerClass{ - ClassId: int32(id), - ClassName: reader.TryReadString(), - DataTableName: reader.TryReadString(), - } - } - } - return SvcClassInfo{ - CreateOnClient: createonclient, - ServerClasses: serverclasses, - } -} - -func HighestBitIndex(i uint) int { - var j int - for j = 31; j >= 0 && (i&(1<= 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<