ddnet/datasrc/datatypes.py
ChillerDragon 732798444c More detailed snapshot debug dump
The method CSnapShot::DebugDump() used to print just the raw snap items.
Without item names or field names:

```
2024-04-07 09:10:01 I snapshot: data_size=356 num_items=10
2024-04-07 09:10:01 I snapshot:         type=0 id=32767
2024-04-07 09:10:01 I snapshot:                   0  -1824658838        933dea6a
2024-04-07 09:10:01 I snapshot:                   1   -629591830        da7930ea
2024-04-07 09:10:01 I snapshot:                   2  -1450210576        a98f8af0
2024-04-07 09:10:01 I snapshot:                   3    914991429        3689a945
2024-04-07 09:10:01 I snapshot:         type=0 id=32766
2024-04-07 09:10:01 I snapshot:                   0    583701389        22ca938d
2024-04-07 09:10:01 I snapshot:                   1    327171627        13803e2b
2024-04-07 09:10:01 I snapshot:                   2  -1636052395        9e7bd255
2024-04-07 09:10:01 I snapshot:                   3  -1901674991        8ea6be11
2024-04-07 09:10:01 I snapshot:         type=0 id=32765
2024-04-07 09:10:01 I snapshot:                   0   1993229659        76ce455b
2024-04-07 09:10:01 I snapshot:                   1   -102024632        f9eb3a48
2024-04-07 09:10:01 I snapshot:                   2  -1378361269        add7e04b
2024-04-07 09:10:01 I snapshot:                   3  -1810037668        941d045c
2024-04-07 09:10:01 I snapshot:         type=6 id=0
2024-04-07 09:10:01 I snapshot:                   0            0        00000000
2024-04-07 09:10:01 I snapshot:                   1            0        00000000
2024-04-07 09:10:01 I snapshot:                   2            0        00000000
2024-04-07 09:10:01 I snapshot:                   3            0        00000000
2024-04-07 09:10:01 I snapshot:                   4            0        00000000
2024-04-07 09:10:01 I snapshot:                   5            0        00000000
2024-04-07 09:10:01 I snapshot:                   6            0        00000000
2024-04-07 09:10:01 I snapshot:                   7            1        00000001
2024-04-07 09:10:01 I snapshot:         type=32767 id=0
2024-04-07 09:10:01 I snapshot:                   0    247983155        0ec7ec33
2024-04-07 09:10:01 I snapshot:                   1            9        00000009
2024-04-07 09:10:01 I snapshot:                   2           64        00000040
2024-04-07 09:10:01 I snapshot:         type=11 id=0
2024-04-07 09:10:01 I snapshot:                   0  -1008145940        c3e8e9ec
2024-04-07 09:10:01 I snapshot:                   1   -320474428        ece5f2c4
2024-04-07 09:10:01 I snapshot:                   2   -220076049        f2e1e7ef
2024-04-07 09:10:01 I snapshot:                   3   -293568512        ee808000
2024-04-07 09:10:01 I snapshot:                   4  -1330727040        b0aeb780
2024-04-07 09:10:01 I snapshot:                   5  -2139062144        80808080
2024-04-07 09:10:01 I snapshot:                   6  -2139062272        80808000
2024-04-07 09:10:01 I snapshot:                   7           64        00000040
2024-04-07 09:10:01 I snapshot:                   8   -403511835        e7f2e5e5
2024-04-07 09:10:01 I snapshot:                   9   -286001183        eef3f7e1
2024-04-07 09:10:01 I snapshot:                  10   -219905920        f2e48080
2024-04-07 09:10:01 I snapshot:                  11  -2139062144        80808080
2024-04-07 09:10:01 I snapshot:                  12  -2139062144        80808080
2024-04-07 09:10:01 I snapshot:                  13  -2139062272        80808000
2024-04-07 09:10:01 I snapshot:                  14            0        00000000
2024-04-07 09:10:01 I snapshot:                  15      7199301        006dda45
2024-04-07 09:10:01 I snapshot:                  16      2345678        0023cace
2024-04-07 09:10:01 I snapshot:         type=10 id=0
2024-04-07 09:10:01 I snapshot:                   0            1        00000001
2024-04-07 09:10:01 I snapshot:                   1            0        00000000
2024-04-07 09:10:01 I snapshot:                   2            0        00000000
2024-04-07 09:10:01 I snapshot:                   3        -9999        ffffd8f1
2024-04-07 09:10:01 I snapshot:                   4            0        00000000
2024-04-07 09:10:01 I snapshot:         type=32766 id=0
2024-04-07 09:10:01 I snapshot:                   0            1        00000001
2024-04-07 09:10:01 I snapshot:                   1            0        00000000
2024-04-07 09:10:01 I snapshot:         type=9 id=0
2024-04-07 09:10:01 I snapshot:                   0          438        000001b6
2024-04-07 09:10:01 I snapshot:                   1         1968        000007b0
2024-04-07 09:10:01 I snapshot:                   2          913        00000391
2024-04-07 09:10:01 I snapshot:                   3            0        00000000
2024-04-07 09:10:01 I snapshot:                   4            0        00000000
2024-04-07 09:10:01 I snapshot:                   5            0        00000000
2024-04-07 09:10:01 I snapshot:                   6            0        00000000
2024-04-07 09:10:01 I snapshot:                   7            0        00000000
2024-04-07 09:10:01 I snapshot:                   8           -1        ffffffff
2024-04-07 09:10:01 I snapshot:                   9            0        00000000
2024-04-07 09:10:01 I snapshot:                  10            0        00000000
2024-04-07 09:10:01 I snapshot:                  11         1968        000007b0
2024-04-07 09:10:01 I snapshot:                  12          913        00000391
2024-04-07 09:10:01 I snapshot:                  13            0        00000000
2024-04-07 09:10:01 I snapshot:                  14            0        00000000
2024-04-07 09:10:01 I snapshot:                  15            1        00000001
2024-04-07 09:10:01 I snapshot:                  16           10        0000000a
2024-04-07 09:10:01 I snapshot:                  17           10        0000000a
2024-04-07 09:10:01 I snapshot:                  18            0        00000000
2024-04-07 09:10:01 I snapshot:                  19            1        00000001
2024-04-07 09:10:01 I snapshot:                  20            5        00000005
2024-04-07 09:10:01 I snapshot:                  21            0        00000000
2024-04-07 09:10:01 I snapshot:         type=32765 id=0
2024-04-07 09:10:01 I snapshot:                   0        49152        0000c000
2024-04-07 09:10:01 I snapshot:                   1            0        00000000
2024-04-07 09:10:01 I snapshot:                   2            2        00000002
2024-04-07 09:10:01 I snapshot:                   3            0        00000000
2024-04-07 09:10:01 I snapshot:                   4            0        00000000
2024-04-07 09:10:01 I snapshot:                   5            0        00000000
2024-04-07 09:10:01 I snapshot:                   6            0        00000000
2024-04-07 09:10:01 I snapshot:                   7            0        00000000
2024-04-07 09:10:01 I snapshot:                   8            1        00000001
2024-04-07 09:10:01 I snapshot:                   9            0        00000000
```

Now there is also `CNetObjHandler::DebugDumpSnapshot(const CSnapshot *pSnap)`
which prints the name of the snap item and also the names of all fields:

```
2024-04-07 09:21:42 I snapshot: data_size=356 num_items=10
2024-04-07 09:21:42 I snapshot:         EX/UUID type=0 id=32767 size=16
2024-04-07 09:21:42 I snapshot:                   0  -1824658838        933dea6a
2024-04-07 09:21:42 I snapshot:                   1   -629591830        da7930ea
2024-04-07 09:21:42 I snapshot:                   2  -1450210576        a98f8af0
2024-04-07 09:21:42 I snapshot:                   3    914991429        3689a945
2024-04-07 09:21:42 I snapshot:         EX/UUID type=0 id=32766 size=16
2024-04-07 09:21:42 I snapshot:                   0    583701389        22ca938d
2024-04-07 09:21:42 I snapshot:                   1    327171627        13803e2b
2024-04-07 09:21:42 I snapshot:                   2  -1636052395        9e7bd255
2024-04-07 09:21:42 I snapshot:                   3  -1901674991        8ea6be11
2024-04-07 09:21:42 I snapshot:         EX/UUID type=0 id=32765 size=16
2024-04-07 09:21:42 I snapshot:                   0   1993229659        76ce455b
2024-04-07 09:21:42 I snapshot:                   1   -102024632        f9eb3a48
2024-04-07 09:21:42 I snapshot:                   2  -1378361269        add7e04b
2024-04-07 09:21:42 I snapshot:                   3  -1810037668        941d045c
2024-04-07 09:21:42 I snapshot:         GameInfo type=6 id=0 size=32
2024-04-07 09:21:42 I snapshot:                   0            0        00000000        m_GameFlags=0 (min=0 max=256)
2024-04-07 09:21:42 I snapshot:                   1            0        00000000        m_GameStateFlags=0 (min=0 max=256)
2024-04-07 09:21:42 I snapshot:                   2            0        00000000        m_RoundStartTick=0 (NetTick)
2024-04-07 09:21:42 I snapshot:                   3            0        00000000        m_WarmupTimer=0 (min=min_int(-2147483648) max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:                   4            0        00000000        m_ScoreLimit=0 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:                   5            0        00000000        m_TimeLimit=0 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:                   6            0        00000000        m_RoundNum=0 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:                   7            1        00000001        m_RoundCurrent=1 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:         (out of range) type=32767 id=0 size=12
2024-04-07 09:21:42 I snapshot:                   0    247983155        0ec7ec33
2024-04-07 09:21:42 I snapshot:                   1            9        00000009
2024-04-07 09:21:42 I snapshot:                   2           64        00000040
2024-04-07 09:21:42 I snapshot:         ClientInfo type=11 id=0 size=68
2024-04-07 09:21:42 I snapshot:                   0  -1008145940        c3e8e9ec        m_Name0=-1008145940     IntsToStr: Chil
2024-04-07 09:21:42 I snapshot:                   1   -320474428        ece5f2c4        m_Name1=-320474428      IntsToStr: lerD
2024-04-07 09:21:42 I snapshot:                   2   -220076049        f2e1e7ef        m_Name2=-220076049      IntsToStr: rago
2024-04-07 09:21:42 I snapshot:                   3   -293568512        ee808000        m_Name3=-293568512      IntsToStr: n
2024-04-07 09:21:42 I snapshot:                   4  -1330727040        b0aeb780        m_Clan0=-1330727040     IntsToStr: 0.7
2024-04-07 09:21:42 I snapshot:                   5  -2139062144        80808080        m_Clan1=-2139062144     IntsToStr:
2024-04-07 09:21:42 I snapshot:                   6  -2139062272        80808000        m_Clan2=-2139062272     IntsToStr:
2024-04-07 09:21:42 I snapshot:                   7           64        00000040        m_Country=64
2024-04-07 09:21:42 I snapshot:                   8   -403511835        e7f2e5e5        m_Skin0=-403511835      IntsToStr: gree
2024-04-07 09:21:42 I snapshot:                   9   -286001183        eef3f7e1        m_Skin1=-286001183      IntsToStr: nswa
2024-04-07 09:21:42 I snapshot:                  10   -219905920        f2e48080        m_Skin2=-219905920      IntsToStr: rd
2024-04-07 09:21:42 I snapshot:                  11  -2139062144        80808080        m_Skin3=-2139062144     IntsToStr:
2024-04-07 09:21:42 I snapshot:                  12  -2139062144        80808080        m_Skin4=-2139062144     IntsToStr:
2024-04-07 09:21:42 I snapshot:                  13  -2139062272        80808000        m_Skin5=-2139062272     IntsToStr:
2024-04-07 09:21:42 I snapshot:                  14            0        00000000        m_UseCustomColor=0 (min=0 max=1)
2024-04-07 09:21:42 I snapshot:                  15      7199301        006dda45        m_ColorBody=7199301
2024-04-07 09:21:42 I snapshot:                  16      2345678        0023cace        m_ColorFeet=2345678
2024-04-07 09:21:42 I snapshot:         PlayerInfo type=10 id=0 size=20
2024-04-07 09:21:42 I snapshot:                   0            1        00000001        m_Local=1 (min=0 max=1)
2024-04-07 09:21:42 I snapshot:                   1            0        00000000        m_ClientId=0 (min=0 max=MAX_CLIENTS-1(63))
2024-04-07 09:21:42 I snapshot:                   2            0        00000000        m_Team=0 (min=TEAM_SPECTATORS(-1) max=TEAM_BLUE(1))
2024-04-07 09:21:42 I snapshot:                   3        -9999        ffffd8f1        m_Score=-9999
2024-04-07 09:21:42 I snapshot:                   4            0        00000000        m_Latency=0
2024-04-07 09:21:42 I snapshot:         (out of range) type=32766 id=0 size=8
2024-04-07 09:21:42 I snapshot:                   0            1        00000001
2024-04-07 09:21:42 I snapshot:                   1            0        00000000
2024-04-07 09:21:42 I snapshot:         Character type=9 id=0 size=88
2024-04-07 09:21:42 I snapshot:                   0          176        000000b0        m_Tick=176
2024-04-07 09:21:42 I snapshot:                   1         1968        000007b0        m_X=1968
2024-04-07 09:21:42 I snapshot:                   2          913        00000391        m_Y=913
2024-04-07 09:21:42 I snapshot:                   3            0        00000000        m_VelX=0
2024-04-07 09:21:42 I snapshot:                   4            0        00000000        m_VelY=0
2024-04-07 09:21:42 I snapshot:                   5            0        00000000        m_Angle=0
2024-04-07 09:21:42 I snapshot:                   6            0        00000000        m_Direction=0 (min=-1 max=1)
2024-04-07 09:21:42 I snapshot:                   7            0        00000000        m_Jumped=0 (min=0 max=3)
2024-04-07 09:21:42 I snapshot:                   8           -1        ffffffff        m_HookedPlayer=-1 (min=-1 max=MAX_CLIENTS-1(63))
2024-04-07 09:21:42 I snapshot:                   9            0        00000000        m_HookState=0 (min=-1 max=5)
2024-04-07 09:21:42 I snapshot:                  10            0        00000000        m_HookTick=0 (NetTick)
2024-04-07 09:21:42 I snapshot:                  11         1968        000007b0        m_HookX=1968
2024-04-07 09:21:42 I snapshot:                  12          913        00000391        m_HookY=913
2024-04-07 09:21:42 I snapshot:                  13            0        00000000        m_HookDx=0
2024-04-07 09:21:42 I snapshot:                  14            0        00000000        m_HookDy=0
2024-04-07 09:21:42 I snapshot:                  15            1        00000001        m_PlayerFlags=1 (min=0 max=256)
2024-04-07 09:21:42 I snapshot:                  16           10        0000000a        m_Health=10 (min=0 max=10)
2024-04-07 09:21:42 I snapshot:                  17           10        0000000a        m_Armor=10 (min=0 max=10)
2024-04-07 09:21:42 I snapshot:                  18            0        00000000        m_AmmoCount=0 (min=0 max=10)
2024-04-07 09:21:42 I snapshot:                  19            1        00000001        m_Weapon=1 (min=0 max=NUM_WEAPONS-1(5))
2024-04-07 09:21:42 I snapshot:                  20            5        00000005        m_Emote=5 (min=0 max=6)
2024-04-07 09:21:42 I snapshot:                  21            0        00000000        m_AttackTick=0 (min=0 max=max_int(2147483647))
2024-04-07 09:21:42 I snapshot:         (out of range) type=32765 id=0 size=40
2024-04-07 09:21:42 I snapshot:                   0        49152        0000c000
2024-04-07 09:21:42 I snapshot:                   1            0        00000000
2024-04-07 09:21:42 I snapshot:                   2            2        00000002
2024-04-07 09:21:42 I snapshot:                   3            0        00000000
2024-04-07 09:21:42 I snapshot:                   4            0        00000000
2024-04-07 09:21:42 I snapshot:                   5            0        00000000
2024-04-07 09:21:42 I snapshot:                   6            0        00000000
2024-04-07 09:21:42 I snapshot:                   7            0        00000000
2024-04-07 09:21:42 I snapshot:                   8            1        00000001
2024-04-07 09:21:42 I snapshot:                   9            0        00000000
```
2024-09-07 15:28:25 +08:00

503 lines
15 KiB
Python

def only(x):
if len(x) != 1:
raise ValueError
return list(x)[0]
GlobalIdCounter = 0
def GetId():
global GlobalIdCounter
GlobalIdCounter += 1
return GlobalIdCounter
def GetUID():
return f"x{int(GetId())}"
def FixCasing(Str):
NewStr = ""
NextUpperCase = True
for c in Str:
if NextUpperCase:
NextUpperCase = False
NewStr += c.upper()
else:
if c == "_":
NextUpperCase = True
else:
NewStr += c.lower()
return NewStr
def FormatName(typ, name):
if "*" in typ:
return "m_p" + FixCasing(name)
if "[]" in typ:
return "m_a" + FixCasing(name)
return "m_" + FixCasing(name)
class BaseType:
def __init__(self, type_name):
self._type_name = type_name
self._target_name = "INVALID"
self._id = GetId() # this is used to remember what order the members have in structures etc
def Identifier(self):
return "x"+str(self._id)
def TargetName(self):
return self._target_name
def TypeName(self):
return self._type_name
def Id(self):
return self._id
def EmitDeclaration(self, name):
return [f"{self.TypeName()} {FormatName(self.TypeName(), name)};"]
def EmitPreDefinition(self, target_name):
self._target_name = target_name
return []
def EmitDefinition(self, _name):
return []
class MemberType:
def __init__(self, name, var):
self.name = name
self.var = var
class Struct(BaseType):
def __init__(self, type_name):
BaseType.__init__(self, type_name)
def Members(self):
def sorter(a):
return a.var.Id()
m = []
for name, value in self.__dict__.items():
if name[0] == "_":
continue
m += [MemberType(name, value)]
m.sort(key = sorter)
return m
def EmitTypeDeclaration(self, _name):
lines = []
lines += ["struct " + self.TypeName()]
lines += ["{"]
for member in self.Members():
lines += ["\t"+l for l in member.var.EmitDeclaration(member.name)]
lines += ["};"]
return lines
def EmitPreDefinition(self, target_name):
BaseType.EmitPreDefinition(self, target_name)
lines = []
for member in self.Members():
lines += member.var.EmitPreDefinition(target_name+"."+member.name)
return lines
def EmitDefinition(self, _name):
lines = [f"/* {self.TargetName()} */ {{"]
for member in self.Members():
lines += ["\t" + " ".join(member.var.EmitDefinition("")) + ","]
lines += ["}"]
return lines
class Array(BaseType):
def __init__(self, typ):
BaseType.__init__(self, typ.TypeName())
self.type = typ
self.items = []
def Add(self, instance):
if instance.TypeName() != self.type.TypeName():
raise ValueError("bah")
self.items += [instance]
def EmitDeclaration(self, name):
return [f"int m_Num{FixCasing(name)};",
f"{self.TypeName()} *{FormatName('[]', name)};"]
def EmitPreDefinition(self, target_name):
BaseType.EmitPreDefinition(self, target_name)
lines = []
i = 0
for item in self.items:
lines += item.EmitPreDefinition(f"{self.Identifier()}[{int(i)}]")
i += 1
if self.items:
lines += [f"static {self.TypeName()} {self.Identifier()}[] = {{"]
for item in self.items:
itemlines = item.EmitDefinition("")
lines += ["\t" + " ".join(itemlines).replace("\t", " ") + ","]
lines += ["};"]
else:
lines += [f"static {self.TypeName()} *{self.Identifier()} = 0;"]
return lines
def EmitDefinition(self, _name):
return [str(len(self.items))+","+self.Identifier()]
# Basic Types
class Int(BaseType):
def __init__(self, value):
BaseType.__init__(self, "int")
self.value = value
def Set(self, value):
self.value = value
def EmitDefinition(self, _name):
return [f"{int(self.value)}"]
#return ["%d /* %s */"%(self.value, self._target_name)]
class Float(BaseType):
def __init__(self, value):
BaseType.__init__(self, "float")
self.value = value
def Set(self, value):
self.value = value
def EmitDefinition(self, _name):
return [f"{self.value:f}f"]
#return ["%d /* %s */"%(self.value, self._target_name)]
class String(BaseType):
def __init__(self, value):
BaseType.__init__(self, "const char*")
self.value = value
def Set(self, value):
self.value = value
def EmitDefinition(self, _name):
return ['"'+self.value+'"']
class Pointer(BaseType):
def __init__(self, typ, target):
BaseType.__init__(self, f"{typ().TypeName()}*")
self.target = target
def Set(self, target):
self.target = target
def EmitDefinition(self, _name):
return ["&"+self.target.TargetName()]
class TextureHandle(BaseType):
def __init__(self):
BaseType.__init__(self, "IGraphics::CTextureHandle")
def EmitDefinition(self, _name):
return ["IGraphics::CTextureHandle()"]
# helper functions
def EmitTypeDeclaration(root):
for l in root().EmitTypeDeclaration(""):
print(l)
def EmitDefinition(root, name):
for l in root.EmitPreDefinition(name):
print(l)
print(f"{root.TypeName()} {name} = ")
for l in root.EmitDefinition(name):
print(l)
print(";")
# Network stuff after this
class Object:
pass
class Enum:
def __init__(self, name, values, start = 0):
self.name = name
self.values = values
self.start = start
class Flags:
def __init__(self, name, values):
self.name = name
self.values = values
class NetObject:
def __init__(self, name, variables, ex=None, validate_size=True):
l = name.split(":")
self.name = l[0]
self.base = None
self.base_struct_name = None
if len(l) > 1:
self.base = l[1]
self.base_struct_name = f"CNetObj_{self.base}"
self.struct_name = f"CNetObj_{self.name}"
self.enum_name = f"NETOBJTYPE_{self.name.upper()}"
self.variables = variables
self.ex = ex
self.validate_size = validate_size
def emit_declaration(self):
lines = []
if self.base is not None:
lines += [f"struct {self.struct_name} : public {self.base_struct_name}", "{"]
else:
lines += [f"struct {self.struct_name}", "{"]
lines += [f"\tstatic constexpr int ms_MsgId = {self.enum_name};"]
for v in self.variables:
lines += ["\t"+line for line in v.emit_declaration()]
lines += ["};"]
return lines
def members_from_this_and_parents(self, objects):
variables = self.variables
next_base_name = self.base
while next_base_name is not None:
base_item = only([i for i in objects if i.name == next_base_name])
variables = base_item.variables + variables
next_base_name = base_item.base
return variables
def emit_uncompressed_unpack_and_validate(self, objects):
lines = []
lines += [f"case {self.enum_name}:"]
lines += ["{"]
lines += [f"\t{self.struct_name} *pData = ({self.struct_name} *)m_aUnpackedData;"]
unpack_lines = []
variables = self.members_from_this_and_parents(objects)
for v in variables:
if not self.validate_size and v.default is None:
raise ValueError(f"{v.name} in {self.name} has no default value. Member variables that do not have a default value cannot be used in a structure whose size is not validated.")
unpack_lines += ["\t"+line for line in v.emit_uncompressed_unpack_obj()]
for v in variables:
unpack_lines += ["\t"+line for line in v.emit_validate_obj()]
if len(unpack_lines) > 0:
lines += unpack_lines
else:
lines += ["\t(void)pData;"]
lines += ["} break;"]
return lines
def emit_dump(self, objects):
lines = []
lines += [f"case {self.enum_name}:"]
lines += ["{"]
lines += [f"\t{self.struct_name} *pObj = ({self.struct_name} *)pData;"]
unpack_lines = []
variables = self.members_from_this_and_parents(objects)
offset = 0
for v in variables:
unpack_lines += ["\t"+line for line in v.emit_dump(offset)]
offset += 1
if len(unpack_lines) > 0:
lines += unpack_lines
else:
lines += ["\t(void)pData;"]
lines += ["return 0;"]
lines += ["};"]
return lines
class NetEvent(NetObject):
def __init__(self, name, variables, ex=None):
NetObject.__init__(self, name, variables, ex=ex)
if self.base is not None:
self.base_struct_name = f"CNetEvent_{self.base}"
self.struct_name = f"CNetEvent_{self.name}"
self.enum_name = f"NETEVENTTYPE_{self.name.upper()}"
class NetMessage(NetObject):
def __init__(self, name, variables, ex=None, teehistorian=True):
NetObject.__init__(self, name, variables, ex=ex)
if self.base is not None:
self.base_struct_name = f"CNetMsg_{self.base}"
self.struct_name = f"CNetMsg_{self.name}"
self.enum_name = f"NETMSGTYPE_{self.name.upper()}"
self.teehistorian = teehistorian
def emit_unpack_msg(self):
lines = []
lines += [f"case {self.enum_name}:"]
lines += ["{"]
lines += [f"\t{self.struct_name} *pData = ({self.struct_name} *)m_aUnpackedData;"]
unpack_lines = []
for v in self.variables:
unpack_lines += ["\t"+line for line in v.emit_unpack_msg()]
for v in self.variables:
unpack_lines += ["\t"+line for line in v.emit_unpack_msg_check()]
if len(unpack_lines) > 0:
lines += unpack_lines
else:
lines += ["\t(void)pData;"]
lines += ["} break;"]
return lines
def emit_declaration(self):
extra = []
extra += ["\t"]
extra += ["\tbool Pack(CMsgPacker *pPacker) const"]
extra += ["\t{"]
#extra += ["\t\tmsg_pack_start(%s, flags);"%self.enum_name]
for v in self.variables:
extra += ["\t\t"+line for line in v.emit_pack()]
extra += ["\t\treturn pPacker->Error() != 0;"]
extra += ["\t}"]
lines = NetObject.emit_declaration(self)
lines = lines[:-1] + extra + lines[-1:]
return lines
class NetObjectEx(NetObject):
def __init__(self, name, ex, variables, validate_size=True):
NetObject.__init__(self, name, variables, ex=ex, validate_size=validate_size)
class NetEventEx(NetEvent):
def __init__(self, name, ex, variables):
NetEvent.__init__(self, name, variables, ex=ex)
class NetMessageEx(NetMessage):
def __init__(self, name, ex, variables, teehistorian=True):
NetMessage.__init__(self, name, variables, ex=ex)
class NetVariable:
def __init__(self, name, default=None):
self.name = name
self.default = None if default is None else str(default)
def emit_declaration(self):
return []
def emit_validate_obj(self):
return []
def emit_uncompressed_unpack_obj(self):
return []
def emit_pack(self):
return []
def emit_unpack_msg(self):
return []
def emit_unpack_msg_check(self):
return []
def emit_dump(self, offset):
return [f"str_format(aRawData, sizeof(aRawData), \"\\t\\t%3d %12d\\t%08x\", {offset}, ((const int *)pData)[{offset}], ((const int *)pData)[{offset}]);"]
class NetString(NetVariable):
def emit_declaration(self):
return [f"const char *{self.name};"]
def emit_uncompressed_unpack_obj(self):
return self.emit_unpack_msg()
def emit_unpack_msg(self):
return [f"pData->{self.name} = pUnpacker->GetString();"]
def emit_pack(self):
return [f"pPacker->AddString({self.name}, -1);"]
class NetStringHalfStrict(NetVariable):
def emit_declaration(self):
return [f"const char *{self.name};"]
def emit_uncompressed_unpack_obj(self):
return self.emit_unpack_msg()
def emit_unpack_msg(self):
return [f"pData->{self.name} = pUnpacker->GetString(CUnpacker::SANITIZE_CC);"]
def emit_pack(self):
return [f"pPacker->AddString({self.name}, -1);"]
class NetStringStrict(NetVariable):
def emit_declaration(self):
return [f"const char *{self.name};"]
def emit_uncompressed_unpack_obj(self):
return self.emit_unpack_msg()
def emit_unpack_msg(self):
return [f"pData->{self.name} = pUnpacker->GetString(CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);"]
def emit_pack(self):
return [f"pPacker->AddString({self.name}, -1);"]
class NetIntAny(NetVariable):
def emit_declaration(self):
return [f"int {self.name};"]
def emit_uncompressed_unpack_obj(self):
if self.default is None:
return [f"pData->{self.name} = pUnpacker->GetUncompressedInt();"]
return [f"pData->{self.name} = pUnpacker->GetUncompressedIntOrDefault({self.default});"]
def emit_unpack_msg(self):
if self.default is None:
return [f"pData->{self.name} = pUnpacker->GetInt();"]
return [f"pData->{self.name} = pUnpacker->GetIntOrDefault({self.default});"]
def emit_pack(self):
return [f"pPacker->AddInt({self.name});"]
def emit_dump(self, offset):
return NetVariable(self.name).emit_dump(offset) + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d\", aRawData, pObj->{self.name});"]
class NetTwIntString(NetIntAny):
def emit_dump(self, offset):
return NetVariable(self.name).emit_dump(offset) + \
[f"aInts[0] = pObj->{self.name};"] + \
["IntsToStr(aInts, std::size(aInts), aStr, std::size(aStr));"] + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d\\tIntToStr: %s\", aRawData, pObj->{self.name}, aStr);"]
class NetIntRange(NetIntAny):
def __init__(self, name, min_val, max_val, default=None):
NetIntAny.__init__(self,name,default=default)
self.min = str(min_val)
self.max = str(max_val)
def emit_validate_obj(self):
return [f"pData->{self.name} = ClampInt(\"{self.name}\", pData->{self.name}, {self.min}, {self.max});"]
def emit_unpack_msg_check(self):
return [f"if(pData->{self.name} < {self.min} || pData->{self.name} > {self.max}) {{ m_pMsgFailedOn = \"{self.name}\"; break; }}"]
def emit_dump(self, offset):
min_fmt=f"min={self.min}"
min_arg = ''
try:
int(self.min)
except ValueError:
min_fmt = f"min={self.min}(%d)"
min_arg = f", (int){self.min}"
max_fmt=f"max={self.max}"
max_arg = ''
try:
int(self.max)
except ValueError:
max_fmt = f"max={self.max}(%d)"
max_arg = f", (int){self.max}"
return NetVariable(self.name).emit_dump(offset) + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d ({min_fmt} {max_fmt})\", aRawData, pObj->{self.name}{min_arg}{max_arg});"]
class NetBool(NetIntRange):
def __init__(self, name, default=None):
default = None if default is None else int(default)
NetIntRange.__init__(self,name,0,1,default=default)
class NetTick(NetIntAny):
def __init__(self, name, default=None):
NetIntAny.__init__(self,name,default=default)
def emit_dump(self, offset):
return NetVariable(self.name).emit_dump(offset) + \
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d (NetTick)\", aRawData, pObj->{self.name});"]
class NetArray(NetVariable):
def __init__(self, var, size):
NetVariable.__init__(self,var.name,var.default)
self.base_name = var.name
self.var = var
self.size = size
self.name = self.base_name + f"[{int(self.size)}]"
def emit_declaration(self):
self.var.name = self.name
return self.var.emit_declaration()
def emit_uncompressed_unpack_obj(self):
lines = []
for i in range(self.size):
self.var.name = self.base_name + f"[{int(i)}]"
lines += self.var.emit_uncompressed_unpack_obj()
return lines
def emit_validate_obj(self):
lines = []
for i in range(self.size):
self.var.name = self.base_name + f"[{int(i)}]"
lines += self.var.emit_validate_obj()
return lines
def emit_unpack_msg(self):
lines = []
for i in range(self.size):
self.var.name = self.base_name + f"[{int(i)}]"
lines += self.var.emit_unpack_msg()
return lines
def emit_pack(self):
lines = []
for i in range(self.size):
self.var.name = self.base_name + f"[{int(i)}]"
lines += self.var.emit_pack()
return lines
def emit_unpack_msg_check(self):
lines = []
for i in range(self.size):
self.var.name = self.base_name + f"[{int(i)}]"
lines += self.var.emit_unpack_msg_check()
return lines