blob: 1bf3f57df95e924b967c1699d22fda1a27d69532 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
package packets
import (
"github.com/pektezol/bitreader"
"github.com/pektezol/sdp.go/pkg/classes"
"github.com/pektezol/sdp.go/pkg/writer"
)
type MessageType uint8
const (
SignOn MessageType = iota + 1
Packet
SyncTick
ConsoleCmd
UserCmd
DataTables
Stop
CustomData
StringTables
)
type Message struct {
PacketType MessageType
TickNumber int32
SlotNumber uint8
Data any
}
func ParseMessage(reader *bitreader.Reader) Message {
message := Message{
PacketType: MessageType(reader.TryReadUInt8()),
TickNumber: reader.TryReadSInt32(),
SlotNumber: reader.TryReadUInt8(),
}
writer.AppendLine("[%d] %s (%d):", message.TickNumber, message.PacketType.String(), message.PacketType)
switch message.PacketType {
case SignOn:
signOn := classes.SignOn{}
signOn.ParseSignOn(reader)
message.Data = signOn
case Packet:
packet := classes.Packet{}
packet.ParsePacket(reader)
message.Data = packet
case SyncTick:
syncTick := classes.SyncTick{}
syncTick.ParseSyncTick()
message.Data = syncTick
case ConsoleCmd:
consoleCmd := classes.ConsoleCmd{}
consoleCmd.ParseConsoleCmd(reader)
message.Data = consoleCmd
case UserCmd:
userCmd := classes.UserCmd{}
userCmd.ParseUserCmd(reader)
message.Data = userCmd
case DataTables:
dataTables := classes.DataTables{}
dataTables.ParseDataTables(reader)
message.Data = dataTables
case Stop:
stop := classes.Stop{}
stop.ParseStop(reader)
message.Data = stop
case CustomData: // TODO: not sar data
customData := classes.CustomData{}
customData.ParseCustomData(reader, message.TickNumber, uint8(message.PacketType))
message.Data = customData
case StringTables: // TODO: parsing string table data
stringTables := classes.StringTables{}
stringTables.ParseStringTables(reader)
message.Data = stringTables
default:
panic("invalid packet type")
}
return message
}
func (t MessageType) String() string {
switch t {
case SignOn:
return "SIGNON"
case Packet:
return "PACKET"
case SyncTick:
return "SYNCTICK"
case ConsoleCmd:
return "CONSOLECMD"
case UserCmd:
return "USERCMD"
case DataTables:
return "DATATABLES"
case Stop:
return "STOP"
case CustomData:
return "CUSTOMDATA"
case StringTables:
return "STRINGTABLES"
}
return "INVALID"
}
|