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 --- 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 ----------------- 41 files changed, 1189 deletions(-) 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 (limited to 'packets') 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<