aboutsummaryrefslogtreecommitdiff
path: root/pkg/classes/dataTables.go
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-09-21 19:26:40 +0300
committerGitHub <noreply@github.com>2023-09-21 19:26:40 +0300
commit44eefefe67a4a5f514faa4594370346fd1b54996 (patch)
treea8853a8ecd49ddbb87c6cc19904ec6bb5419ee83 /pkg/classes/dataTables.go
parentadd strings builder, customize ALL outputs (#6) (diff)
downloadsdp.go-1.1.1.tar.gz
sdp.go-1.1.1.tar.bz2
sdp.go-1.1.1.zip
organize packets and classes (#9)v1.1.1
Diffstat (limited to '')
-rw-r--r--pkg/classes/dataTables.go (renamed from pkg/classes/sendTable.go)151
1 files changed, 101 insertions, 50 deletions
diff --git a/pkg/classes/sendTable.go b/pkg/classes/dataTables.go
index 927d967..27ab9e4 100644
--- a/pkg/classes/sendTable.go
+++ b/pkg/classes/dataTables.go
@@ -7,6 +7,12 @@ import (
7 "github.com/pektezol/demoparser/pkg/writer" 7 "github.com/pektezol/demoparser/pkg/writer"
8) 8)
9 9
10type DataTables struct {
11 Size int32
12 SendTable []SendTable
13 ServerClassInfo []ServerClassInfo
14}
15
10type SendTable struct { 16type SendTable struct {
11 NeedsDecoder bool 17 NeedsDecoder bool
12 NetTableName string 18 NetTableName string
@@ -14,6 +20,12 @@ type SendTable struct {
14 Props []prop 20 Props []prop
15} 21}
16 22
23type ServerClassInfo struct {
24 ClassId uint16
25 ClassName string
26 DataTableName string
27}
28
17type prop struct { 29type prop struct {
18 SendPropType sendPropType 30 SendPropType sendPropType
19 SendPropName string 31 SendPropName string
@@ -26,6 +38,95 @@ type prop struct {
26 NumElements int32 38 NumElements int32
27} 39}
28 40
41func (dataTables *DataTables) ParseDataTables(reader *bitreader.Reader) {
42 dataTables.Size = int32(reader.TryReadSInt32())
43 dataTableReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(uint64(dataTables.Size)), true)
44 count := 0
45 for dataTableReader.TryReadBool() {
46 count++
47 dataTables.SendTable = append(dataTables.SendTable, ParseSendTable(dataTableReader))
48 }
49 writer.AppendLine("\t%d Send Tables:", count)
50 writer.AppendOutputFromTemp()
51 numOfClasses := dataTableReader.TryReadBits(16)
52 for count = 0; count < int(numOfClasses); count++ {
53 dataTables.ServerClassInfo = append(dataTables.ServerClassInfo, ParseServerClassInfo(dataTableReader, count, int(numOfClasses)))
54 }
55 writer.AppendLine("\t%d Classes:", count)
56 writer.AppendOutputFromTemp()
57}
58
59func ParseSendTable(reader *bitreader.Reader) SendTable {
60 sendTable := SendTable{
61 NeedsDecoder: reader.TryReadBool(),
62 NetTableName: reader.TryReadString(),
63 NumOfProps: int16(reader.TryReadBits(10)),
64 }
65 if sendTable.NumOfProps < 0 {
66 return sendTable
67 }
68 writer.TempAppendLine("\t\t%s (%d Props):", sendTable.NetTableName, sendTable.NumOfProps)
69 for count := 0; count < int(sendTable.NumOfProps); count++ {
70 propType := int8(reader.TryReadBits(5))
71 if propType >= int8(7) {
72 return sendTable
73 }
74 prop := prop{
75 SendPropType: sendPropType(propType),
76 SendPropName: reader.TryReadString(),
77 SendPropFlags: uint32(reader.TryReadBits(19)),
78 Priority: reader.TryReadUInt8(),
79 }
80 writer.TempAppend("\t\t\t%s\t", prop.SendPropType)
81 if propType == int8(ESendPropTypeDataTable) || checkBit(prop.SendPropFlags, 6) {
82 prop.ExcludeDtName = reader.TryReadString()
83 writer.TempAppend(":\t%s\t", prop.ExcludeDtName)
84 } else {
85 switch propType {
86 case int8(ESendPropTypeString), int8(ESendPropTypeInt), int8(ESendPropTypeFloat), int8(ESendPropTypeVector3), int8(ESendPropTypeVector2):
87 prop.LowValue = reader.TryReadFloat32()
88 prop.HighValue = reader.TryReadFloat32()
89 prop.NumBits = int32(reader.TryReadBits(7))
90 writer.TempAppend("Low: %f\tHigh: %f\t%d bits\t", prop.LowValue, prop.HighValue, prop.NumBits)
91 case int8(ESendPropTypeArray):
92 prop.NumElements = int32(reader.TryReadBits(10))
93 writer.TempAppend("Elements: %d\t", prop.NumElements)
94 default:
95 writer.TempAppend("Unknown Prop Type: %v\t", propType)
96 return sendTable
97 }
98 }
99 writer.TempAppend("Flags: %v\tPriority: %d\n", prop.GetFlags(), prop.Priority)
100 sendTable.Props = append(sendTable.Props, prop)
101 }
102 return sendTable
103}
104
105func ParseServerClassInfo(reader *bitreader.Reader, count int, numOfClasses int) ServerClassInfo {
106 serverClassInfo := ServerClassInfo{
107 ClassId: reader.TryReadUInt16(),
108 ClassName: reader.TryReadString(),
109 DataTableName: reader.TryReadString(),
110 }
111 writer.TempAppendLine("\t\t\t[%d] %s (%s)", serverClassInfo.ClassId, serverClassInfo.ClassName, serverClassInfo.DataTableName)
112 return serverClassInfo
113}
114
115// func serverClassBits(numOfClasses int) int {
116// return highestBitIndex(uint(numOfClasses)) + 1
117// }
118
119// func highestBitIndex(i uint) int {
120// var j int
121// for j = 31; j >= 0 && (i&(1<<j)) == 0; j-- {
122// }
123// return j
124// }
125
126func checkBit(val uint32, bit int) bool {
127 return (val & (uint32(1) << bit)) != 0
128}
129
29type sendPropType int 130type sendPropType int
30 131
31const ( 132const (
@@ -142,53 +243,3 @@ func (sendPropType sendPropType) String() string {
142 return fmt.Sprintf("%d", int(sendPropType)) 243 return fmt.Sprintf("%d", int(sendPropType))
143 } 244 }
144} 245}
145
146func ParseSendTable(reader *bitreader.Reader) SendTable {
147 sendTable := SendTable{
148 NeedsDecoder: reader.TryReadBool(),
149 NetTableName: reader.TryReadString(),
150 NumOfProps: int16(reader.TryReadBits(10)),
151 }
152 if sendTable.NumOfProps < 0 {
153 return sendTable
154 }
155 writer.TempAppendLine("\t\t%s (%d Props):", sendTable.NetTableName, sendTable.NumOfProps)
156 for count := 0; count < int(sendTable.NumOfProps); count++ {
157 propType := int8(reader.TryReadBits(5))
158 if propType >= int8(7) {
159 return sendTable
160 }
161 prop := prop{
162 SendPropType: sendPropType(propType),
163 SendPropName: reader.TryReadString(),
164 SendPropFlags: uint32(reader.TryReadBits(19)),
165 Priority: reader.TryReadUInt8(),
166 }
167 writer.TempAppend("\t\t\t%s\t", prop.SendPropType)
168 if propType == int8(ESendPropTypeDataTable) || checkBit(prop.SendPropFlags, 6) {
169 prop.ExcludeDtName = reader.TryReadString()
170 writer.TempAppend(":\t%s\t", prop.ExcludeDtName)
171 } else {
172 switch propType {
173 case int8(ESendPropTypeString), int8(ESendPropTypeInt), int8(ESendPropTypeFloat), int8(ESendPropTypeVector3), int8(ESendPropTypeVector2):
174 prop.LowValue = reader.TryReadFloat32()
175 prop.HighValue = reader.TryReadFloat32()
176 prop.NumBits = int32(reader.TryReadBits(7))
177 writer.TempAppend("Low: %f\tHigh: %f\t%d bits\t", prop.LowValue, prop.HighValue, prop.NumBits)
178 case int8(ESendPropTypeArray):
179 prop.NumElements = int32(reader.TryReadBits(10))
180 writer.TempAppend("Elements: %d\t", prop.NumElements)
181 default:
182 writer.TempAppend("Unknown Prop Type: %v\t", propType)
183 return sendTable
184 }
185 }
186 writer.TempAppend("Flags: %v\tPriority: %d\n", prop.GetFlags(), prop.Priority)
187 sendTable.Props = append(sendTable.Props, prop)
188 }
189 return sendTable
190}
191
192func checkBit(val uint32, bit int) bool {
193 return (val & (uint32(1) << bit)) != 0
194}