diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-09-21 19:26:40 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-21 19:26:40 +0300 |
| commit | 44eefefe67a4a5f514faa4594370346fd1b54996 (patch) | |
| tree | a8853a8ecd49ddbb87c6cc19904ec6bb5419ee83 /pkg/classes/sendTable.go | |
| parent | add strings builder, customize ALL outputs (#6) (diff) | |
| download | sdp.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 | ||
| 10 | type DataTables struct { | ||
| 11 | Size int32 | ||
| 12 | SendTable []SendTable | ||
| 13 | ServerClassInfo []ServerClassInfo | ||
| 14 | } | ||
| 15 | |||
| 10 | type SendTable struct { | 16 | type 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 | ||
| 23 | type ServerClassInfo struct { | ||
| 24 | ClassId uint16 | ||
| 25 | ClassName string | ||
| 26 | DataTableName string | ||
| 27 | } | ||
| 28 | |||
| 17 | type prop struct { | 29 | type 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 | ||
| 41 | func (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 | |||
| 59 | func 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 | |||
| 105 | func 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 | |||
| 126 | func checkBit(val uint32, bit int) bool { | ||
| 127 | return (val & (uint32(1) << bit)) != 0 | ||
| 128 | } | ||
| 129 | |||
| 29 | type sendPropType int | 130 | type sendPropType int |
| 30 | 131 | ||
| 31 | const ( | 132 | const ( |
| @@ -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 | |||
| 146 | func 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 | |||
| 192 | func checkBit(val uint32, bit int) bool { | ||
| 193 | return (val & (uint32(1) << bit)) != 0 | ||
| 194 | } | ||