diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2022-11-08 22:48:20 +0300 |
|---|---|---|
| committer | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-09-16 21:39:39 +0300 |
| commit | 833a46544df2ed2a7afdba08ebfe02ed7741d86a (patch) | |
| tree | 2432f14b449761086d773fb8cd072797d23006f1 /packets | |
| parent | put class type into individual files (diff) | |
| download | sdp.go-833a46544df2ed2a7afdba08ebfe02ed7741d86a.tar.gz sdp.go-833a46544df2ed2a7afdba08ebfe02ed7741d86a.tar.bz2 sdp.go-833a46544df2ed2a7afdba08ebfe02ed7741d86a.zip | |
net/svc messages
Diffstat (limited to 'packets')
| -rw-r--r-- | packets/messages/message.go | 50 | ||||
| -rw-r--r-- | packets/messages/types/NetDisconnect.go | 11 | ||||
| -rw-r--r-- | packets/messages/types/NetFile.go | 17 | ||||
| -rw-r--r-- | packets/messages/types/NetNop.go | 3 | ||||
| -rw-r--r-- | packets/messages/types/NetSetConVar.go | 28 | ||||
| -rw-r--r-- | packets/messages/types/NetSignOnState.go | 31 | ||||
| -rw-r--r-- | packets/messages/types/NetSplitScreenUser.go | 13 | ||||
| -rw-r--r-- | packets/messages/types/NetStringCmd.go | 13 | ||||
| -rw-r--r-- | packets/messages/types/NetTick.go | 17 | ||||
| -rw-r--r-- | packets/messages/types/SvcClassInfo.go | 42 | ||||
| -rw-r--r-- | packets/messages/types/SvcSendTable.go | 17 | ||||
| -rw-r--r-- | packets/messages/types/SvcServerInfo.go | 43 | ||||
| -rw-r--r-- | packets/messages/types/SvcSetPause.go | 11 | ||||
| -rw-r--r-- | packets/packet.go (renamed from packets/message.go) | 7 | ||||
| -rw-r--r-- | packets/types.go | 9 |
15 files changed, 306 insertions, 6 deletions
diff --git a/packets/messages/message.go b/packets/messages/message.go new file mode 100644 index 0000000..c508bfa --- /dev/null +++ b/packets/messages/message.go | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | package messages | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "bytes" | ||
| 5 | |||
| 6 | "github.com/pektezol/bitreader" | ||
| 7 | "github.com/pektezol/demoparser/packets/messages/types" | ||
| 8 | ) | ||
| 9 | |||
| 10 | func ParseMessage(data []byte) []Message { | ||
| 11 | reader := bitreader.Reader(bytes.NewReader(data), true) | ||
| 12 | var messages []Message | ||
| 13 | for { | ||
| 14 | messageType, err := reader.ReadBits(6) | ||
| 15 | if err != nil { | ||
| 16 | break | ||
| 17 | } | ||
| 18 | switch messageType { | ||
| 19 | case 0x00: | ||
| 20 | messages = append(messages, Message{Data: types.NetNop{}}) | ||
| 21 | case 0x01: | ||
| 22 | messages = append(messages, Message{Data: types.ParseNetDisconnect(reader)}) | ||
| 23 | case 0x02: | ||
| 24 | messages = append(messages, Message{Data: types.ParseNetFile(reader)}) | ||
| 25 | case 0x03: | ||
| 26 | messages = append(messages, Message{Data: types.ParseNetSplitScreenUser(reader)}) | ||
| 27 | case 0x04: | ||
| 28 | messages = append(messages, Message{Data: types.ParseNetTick(reader)}) | ||
| 29 | case 0x05: | ||
| 30 | messages = append(messages, Message{Data: types.ParseNetStringCmd(reader)}) | ||
| 31 | case 0x06: | ||
| 32 | messages = append(messages, Message{Data: types.ParseNetSetConVar(reader)}) | ||
| 33 | case 0x07: | ||
| 34 | messages = append(messages, Message{Data: types.ParseNetSignOnState(reader)}) | ||
| 35 | case 0x08: | ||
| 36 | messages = append(messages, Message{Data: types.ParseSvcServerInfo(reader)}) | ||
| 37 | case 0x09: | ||
| 38 | messages = append(messages, Message{Data: types.ParseSvcSendTable(reader)}) | ||
| 39 | case 0x10: | ||
| 40 | messages = append(messages, Message{Data: types.ParseSvcClassInfo(reader)}) | ||
| 41 | case 0x11: | ||
| 42 | messages = append(messages, Message{Data: types.ParseSvcSetPause(reader)}) | ||
| 43 | } | ||
| 44 | } | ||
| 45 | return messages | ||
| 46 | } | ||
| 47 | |||
| 48 | type Message struct { | ||
| 49 | Data any | ||
| 50 | } | ||
diff --git a/packets/messages/types/NetDisconnect.go b/packets/messages/types/NetDisconnect.go new file mode 100644 index 0000000..8b65568 --- /dev/null +++ b/packets/messages/types/NetDisconnect.go | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import "github.com/pektezol/bitreader" | ||
| 4 | |||
| 5 | type NetDisconnect struct { | ||
| 6 | Text string | ||
| 7 | } | ||
| 8 | |||
| 9 | func ParseNetDisconnect(reader *bitreader.ReaderType) NetDisconnect { | ||
| 10 | return NetDisconnect{Text: reader.TryReadString()} | ||
| 11 | } | ||
diff --git a/packets/messages/types/NetFile.go b/packets/messages/types/NetFile.go new file mode 100644 index 0000000..c65873d --- /dev/null +++ b/packets/messages/types/NetFile.go | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import "github.com/pektezol/bitreader" | ||
| 4 | |||
| 5 | type NetFile struct { | ||
| 6 | TransferId uint32 | ||
| 7 | FileName string | ||
| 8 | FileRequested bool | ||
| 9 | } | ||
| 10 | |||
| 11 | func ParseNetFile(reader *bitreader.ReaderType) NetFile { | ||
| 12 | return NetFile{ | ||
| 13 | TransferId: reader.TryReadInt32(), | ||
| 14 | FileName: reader.TryReadString(), | ||
| 15 | FileRequested: reader.TryReadBool(), | ||
| 16 | } | ||
| 17 | } | ||
diff --git a/packets/messages/types/NetNop.go b/packets/messages/types/NetNop.go new file mode 100644 index 0000000..d0a1f7a --- /dev/null +++ b/packets/messages/types/NetNop.go | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | type NetNop struct{} | ||
diff --git a/packets/messages/types/NetSetConVar.go b/packets/messages/types/NetSetConVar.go new file mode 100644 index 0000000..b502953 --- /dev/null +++ b/packets/messages/types/NetSetConVar.go | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import "github.com/pektezol/bitreader" | ||
| 4 | |||
| 5 | type NetSetConVar struct { | ||
| 6 | Length uint8 | ||
| 7 | ConVars []ConVar | ||
| 8 | } | ||
| 9 | |||
| 10 | type ConVar struct { | ||
| 11 | Name string | ||
| 12 | Value string | ||
| 13 | } | ||
| 14 | |||
| 15 | func ParseNetSetConVar(reader *bitreader.ReaderType) NetSetConVar { | ||
| 16 | var convars []ConVar | ||
| 17 | netsetconvar := NetSetConVar{ | ||
| 18 | Length: reader.TryReadInt8(), | ||
| 19 | } | ||
| 20 | for i := 0; i < int(netsetconvar.Length); i++ { | ||
| 21 | convars = append(convars, ConVar{ | ||
| 22 | Name: reader.TryReadString(), | ||
| 23 | Value: reader.TryReadString(), | ||
| 24 | }) | ||
| 25 | } | ||
| 26 | netsetconvar.ConVars = convars | ||
| 27 | return netsetconvar | ||
| 28 | } | ||
diff --git a/packets/messages/types/NetSignOnState.go b/packets/messages/types/NetSignOnState.go new file mode 100644 index 0000000..3d02e91 --- /dev/null +++ b/packets/messages/types/NetSignOnState.go | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "fmt" | ||
| 5 | |||
| 6 | "github.com/pektezol/bitreader" | ||
| 7 | ) | ||
| 8 | |||
| 9 | type NetSignOnState struct { | ||
| 10 | SignonState int8 | ||
| 11 | SpawnCount uint32 | ||
| 12 | NumServerPlayers uint32 | ||
| 13 | IdsLength uint32 | ||
| 14 | PlayersNetworkIds []byte | ||
| 15 | MapNameLength uint32 | ||
| 16 | MapName string | ||
| 17 | } | ||
| 18 | |||
| 19 | func ParseNetSignOnState(reader *bitreader.ReaderType) NetSignOnState { | ||
| 20 | netsignonstate := NetSignOnState{ | ||
| 21 | SignonState: int8(reader.TryReadInt8()), | ||
| 22 | SpawnCount: reader.TryReadInt32(), | ||
| 23 | NumServerPlayers: reader.TryReadInt32(), | ||
| 24 | IdsLength: reader.TryReadInt32(), | ||
| 25 | } | ||
| 26 | fmt.Println(netsignonstate.IdsLength) | ||
| 27 | netsignonstate.PlayersNetworkIds = reader.TryReadBytesToSlice(int(netsignonstate.IdsLength)) | ||
| 28 | netsignonstate.MapNameLength = reader.TryReadInt32() | ||
| 29 | netsignonstate.MapName = reader.TryReadStringLen(int(netsignonstate.MapNameLength)) | ||
| 30 | return netsignonstate | ||
| 31 | } | ||
diff --git a/packets/messages/types/NetSplitScreenUser.go b/packets/messages/types/NetSplitScreenUser.go new file mode 100644 index 0000000..66a7c85 --- /dev/null +++ b/packets/messages/types/NetSplitScreenUser.go | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import "github.com/pektezol/bitreader" | ||
| 4 | |||
| 5 | type NetSplitScreenUser struct { | ||
| 6 | Unknown bool | ||
| 7 | } | ||
| 8 | |||
| 9 | func ParseNetSplitScreenUser(reader *bitreader.ReaderType) NetSplitScreenUser { | ||
| 10 | return NetSplitScreenUser{ | ||
| 11 | Unknown: reader.TryReadBool(), | ||
| 12 | } | ||
| 13 | } | ||
diff --git a/packets/messages/types/NetStringCmd.go b/packets/messages/types/NetStringCmd.go new file mode 100644 index 0000000..1ee9f67 --- /dev/null +++ b/packets/messages/types/NetStringCmd.go | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import "github.com/pektezol/bitreader" | ||
| 4 | |||
| 5 | type NetStringCmd struct { | ||
| 6 | Command string | ||
| 7 | } | ||
| 8 | |||
| 9 | func ParseNetStringCmd(reader *bitreader.ReaderType) NetStringCmd { | ||
| 10 | return NetStringCmd{ | ||
| 11 | Command: reader.TryReadString(), | ||
| 12 | } | ||
| 13 | } | ||
diff --git a/packets/messages/types/NetTick.go b/packets/messages/types/NetTick.go new file mode 100644 index 0000000..9dae14b --- /dev/null +++ b/packets/messages/types/NetTick.go | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import "github.com/pektezol/bitreader" | ||
| 4 | |||
| 5 | type NetTick struct { | ||
| 6 | Tick uint32 | ||
| 7 | HostFrameTime float32 | ||
| 8 | HostFrameTimeStdDeviation float32 | ||
| 9 | } | ||
| 10 | |||
| 11 | func ParseNetTick(reader *bitreader.ReaderType) NetTick { | ||
| 12 | return NetTick{ | ||
| 13 | Tick: reader.TryReadInt32(), | ||
| 14 | HostFrameTime: float32(reader.TryReadInt16()) / 1e5, | ||
| 15 | HostFrameTimeStdDeviation: float32(reader.TryReadInt16()) / 1e5, | ||
| 16 | } | ||
| 17 | } | ||
diff --git a/packets/messages/types/SvcClassInfo.go b/packets/messages/types/SvcClassInfo.go new file mode 100644 index 0000000..58e43b7 --- /dev/null +++ b/packets/messages/types/SvcClassInfo.go | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "math" | ||
| 5 | |||
| 6 | "github.com/pektezol/bitreader" | ||
| 7 | ) | ||
| 8 | |||
| 9 | type SvcClassInfo struct { | ||
| 10 | Length uint16 | ||
| 11 | CreateOnClient bool | ||
| 12 | ServerClasses []ServerClass | ||
| 13 | } | ||
| 14 | |||
| 15 | type ServerClass struct { | ||
| 16 | ClassId int32 | ||
| 17 | ClassName string | ||
| 18 | DataTableName string | ||
| 19 | } | ||
| 20 | |||
| 21 | func ParseSvcClassInfo(reader *bitreader.ReaderType) SvcClassInfo { | ||
| 22 | var serverclasses []ServerClass | ||
| 23 | svcclassinfo := SvcClassInfo{ | ||
| 24 | Length: reader.TryReadInt16(), | ||
| 25 | CreateOnClient: reader.TryReadBool(), | ||
| 26 | } | ||
| 27 | if svcclassinfo.CreateOnClient { | ||
| 28 | for i := 0; i < int(svcclassinfo.Length); i++ { | ||
| 29 | id, err := reader.ReadBits(int(math.Log2(float64(svcclassinfo.Length))) + 1) | ||
| 30 | if err != nil { | ||
| 31 | panic(err) | ||
| 32 | } | ||
| 33 | serverclasses = append(serverclasses, ServerClass{ | ||
| 34 | ClassId: int32(id), | ||
| 35 | ClassName: reader.TryReadString(), | ||
| 36 | DataTableName: reader.TryReadString(), | ||
| 37 | }) | ||
| 38 | } | ||
| 39 | } | ||
| 40 | svcclassinfo.ServerClasses = serverclasses | ||
| 41 | return svcclassinfo | ||
| 42 | } | ||
diff --git a/packets/messages/types/SvcSendTable.go b/packets/messages/types/SvcSendTable.go new file mode 100644 index 0000000..f76aadb --- /dev/null +++ b/packets/messages/types/SvcSendTable.go | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import "github.com/pektezol/bitreader" | ||
| 4 | |||
| 5 | type SvcSendTable struct { | ||
| 6 | NeedsDecoder bool | ||
| 7 | Length uint8 | ||
| 8 | Props int32 | ||
| 9 | } | ||
| 10 | |||
| 11 | func ParseSvcSendTable(reader *bitreader.ReaderType) SvcSendTable { | ||
| 12 | return SvcSendTable{ | ||
| 13 | NeedsDecoder: reader.TryReadBool(), | ||
| 14 | Length: reader.TryReadInt8(), | ||
| 15 | } | ||
| 16 | // No one cares about SvcSendTable | ||
| 17 | } | ||
diff --git a/packets/messages/types/SvcServerInfo.go b/packets/messages/types/SvcServerInfo.go new file mode 100644 index 0000000..9d2648b --- /dev/null +++ b/packets/messages/types/SvcServerInfo.go | |||
| @@ -0,0 +1,43 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import "github.com/pektezol/bitreader" | ||
| 4 | |||
| 5 | type SvcServerInfo struct { | ||
| 6 | Protocol uint16 | ||
| 7 | ServerCount uint32 | ||
| 8 | IsHltv bool | ||
| 9 | IsDedicated bool | ||
| 10 | ClientCrc int32 | ||
| 11 | MaxClasses uint16 | ||
| 12 | MapCrc uint32 | ||
| 13 | PlayerSlot uint8 | ||
| 14 | MaxClients uint8 | ||
| 15 | Unk uint32 | ||
| 16 | TickInterval float32 | ||
| 17 | COs byte | ||
| 18 | GameDir string | ||
| 19 | MapName string | ||
| 20 | SkyName string | ||
| 21 | HostName string | ||
| 22 | } | ||
| 23 | |||
| 24 | func ParseSvcServerInfo(reader *bitreader.ReaderType) SvcServerInfo { | ||
| 25 | return SvcServerInfo{ | ||
| 26 | Protocol: reader.TryReadInt16(), | ||
| 27 | ServerCount: reader.TryReadInt32(), | ||
| 28 | IsHltv: reader.TryReadBool(), | ||
| 29 | IsDedicated: reader.TryReadBool(), | ||
| 30 | ClientCrc: int32(reader.TryReadInt32()), | ||
| 31 | MaxClasses: reader.TryReadInt16(), | ||
| 32 | MapCrc: reader.TryReadInt32(), | ||
| 33 | PlayerSlot: reader.TryReadInt8(), | ||
| 34 | MaxClients: reader.TryReadInt8(), | ||
| 35 | Unk: reader.TryReadInt32(), | ||
| 36 | TickInterval: reader.TryReadFloat32(), | ||
| 37 | COs: reader.TryReadInt8(), | ||
| 38 | GameDir: reader.TryReadString(), | ||
| 39 | MapName: reader.TryReadString(), | ||
| 40 | SkyName: reader.TryReadString(), | ||
| 41 | HostName: reader.TryReadString(), | ||
| 42 | } | ||
| 43 | } | ||
diff --git a/packets/messages/types/SvcSetPause.go b/packets/messages/types/SvcSetPause.go new file mode 100644 index 0000000..040fb6a --- /dev/null +++ b/packets/messages/types/SvcSetPause.go | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | package types | ||
| 2 | |||
| 3 | import "github.com/pektezol/bitreader" | ||
| 4 | |||
| 5 | type SvcSetPause struct { | ||
| 6 | Paused bool | ||
| 7 | } | ||
| 8 | |||
| 9 | func ParseSvcSetPause(reader *bitreader.ReaderType) SvcSetPause { | ||
| 10 | return SvcSetPause{Paused: reader.TryReadBool()} | ||
| 11 | } | ||
diff --git a/packets/message.go b/packets/packet.go index 922f918..23a21e6 100644 --- a/packets/message.go +++ b/packets/packet.go | |||
| @@ -5,11 +5,12 @@ import ( | |||
| 5 | 5 | ||
| 6 | "github.com/pektezol/bitreader" | 6 | "github.com/pektezol/bitreader" |
| 7 | "github.com/pektezol/demoparser/packets/classes" | 7 | "github.com/pektezol/demoparser/packets/classes" |
| 8 | "github.com/pektezol/demoparser/packets/messages" | ||
| 8 | ) | 9 | ) |
| 9 | 10 | ||
| 10 | const MSSC = 2 | 11 | const MSSC = 2 |
| 11 | 12 | ||
| 12 | func ParseMessage(reader *bitreader.ReaderType) (status int) { | 13 | func ParsePacket(reader *bitreader.ReaderType) (status int) { |
| 13 | messageType := reader.TryReadInt8() | 14 | messageType := reader.TryReadInt8() |
| 14 | messageTick := reader.TryReadInt32() | 15 | messageTick := reader.TryReadInt32() |
| 15 | messageSlot := reader.TryReadInt8() | 16 | messageSlot := reader.TryReadInt8() |
| @@ -31,8 +32,8 @@ func ParseMessage(reader *bitreader.ReaderType) (status int) { | |||
| 31 | OutSequence: int32(reader.TryReadInt32()), | 32 | OutSequence: int32(reader.TryReadInt32()), |
| 32 | Size: int32(reader.TryReadInt32()), | 33 | Size: int32(reader.TryReadInt32()), |
| 33 | } | 34 | } |
| 34 | reader.SkipBytes(int(packet.Size)) | 35 | packet.Data = messages.ParseMessage(reader.TryReadBytesToSlice(int(packet.Size))) |
| 35 | //fmt.Printf("[%d] (%d) Packet: %v\n", messageTick, messageType, packet) | 36 | fmt.Printf("[%d] (%d) Packet: %v\n", messageTick, messageType, packet) |
| 36 | return 2 | 37 | return 2 |
| 37 | case 0x03: | 38 | case 0x03: |
| 38 | syncTick := SyncTick{} | 39 | syncTick := SyncTick{} |
diff --git a/packets/types.go b/packets/types.go index 2a4cf4b..9a1f667 100644 --- a/packets/types.go +++ b/packets/types.go | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | package packets | 1 | package packets |
| 2 | 2 | ||
| 3 | import "github.com/pektezol/demoparser/packets/classes" | 3 | import ( |
| 4 | "github.com/pektezol/demoparser/packets/classes" | ||
| 5 | "github.com/pektezol/demoparser/packets/messages" | ||
| 6 | ) | ||
| 4 | 7 | ||
| 5 | type Header struct { | 8 | type Header struct { |
| 6 | DemoFileStamp string | 9 | DemoFileStamp string |
| @@ -21,7 +24,7 @@ type SignOn struct { | |||
| 21 | InSequence int32 | 24 | InSequence int32 |
| 22 | OutSequence int32 | 25 | OutSequence int32 |
| 23 | Size int32 | 26 | Size int32 |
| 24 | Data []byte | 27 | Data []messages.Message |
| 25 | } | 28 | } |
| 26 | 29 | ||
| 27 | type Packet struct { | 30 | type Packet struct { |
| @@ -29,7 +32,7 @@ type Packet struct { | |||
| 29 | InSequence int32 | 32 | InSequence int32 |
| 30 | OutSequence int32 | 33 | OutSequence int32 |
| 31 | Size int32 | 34 | Size int32 |
| 32 | Data []byte | 35 | Data []messages.Message |
| 33 | } | 36 | } |
| 34 | 37 | ||
| 35 | type SyncTick struct{} | 38 | type SyncTick struct{} |