mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-19 01:02:20 +00:00
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 ```
This commit is contained in:
parent
51c0b4dafc
commit
732798444c
|
@ -115,6 +115,8 @@ public:
|
|||
const char *FailedObjOn() const;
|
||||
|
||||
const char *GetMsgName(int Type) const;
|
||||
void DebugDumpSnapshot(const class CSnapshot *pSnap) const;
|
||||
int DumpObj(int Type, const void *pData, int Size) const;
|
||||
void *SecureUnpackMsg(int Type, CUnpacker *pUnpacker);
|
||||
bool TeeHistorianRecordMsg(int Type);
|
||||
const char *FailedMsgOn() const;
|
||||
|
@ -133,7 +135,9 @@ def gen_network_source():
|
|||
#include <engine/shared/packer.h>
|
||||
#include <engine/shared/protocol.h>
|
||||
#include <engine/shared/uuid_manager.h>
|
||||
#include <engine/shared/snapshot.h>
|
||||
|
||||
#include <game/gamecore.h>
|
||||
#include <game/mapitems_ex.h>
|
||||
|
||||
CNetObjHandler::CNetObjHandler()
|
||||
|
@ -245,8 +249,47 @@ const char *CNetObjHandler::GetMsgName(int Type) const
|
|||
}
|
||||
return "(out of range)";
|
||||
}
|
||||
|
||||
void CNetObjHandler::DebugDumpSnapshot(const CSnapshot *pSnap) const
|
||||
{
|
||||
dbg_msg("snapshot", "data_size=%d num_items=%d", pSnap->DataSize(), pSnap->NumItems());
|
||||
for(int i = 0; i < pSnap->NumItems(); i++)
|
||||
{
|
||||
const CSnapshotItem *pItem = pSnap->GetItem(i);
|
||||
int Size = pSnap->GetItemSize(i);
|
||||
int Type = pSnap->GetItemType(i);
|
||||
const char *pName = GetObjName(pItem->Type());
|
||||
if(Type > OFFSET_UUID && Type < g_UuidManager.NumUuids() + OFFSET_UUID)
|
||||
pName = g_UuidManager.GetName(Type);
|
||||
dbg_msg("snapshot", "\\t%s type=%d id=%d size=%d", pName, pItem->Type(), pItem->Id(), Size);
|
||||
if(!DumpObj(Type, pItem->Data(), Size))
|
||||
continue;
|
||||
|
||||
for(size_t b = 0; b < Size / sizeof(int32_t); b++)
|
||||
dbg_msg("snapshot", "\\t\\t%3d %12d\\t%08x", (int)b, pItem->Data()[b], pItem->Data()[b]);
|
||||
}
|
||||
}
|
||||
|
||||
""")
|
||||
|
||||
lines = []
|
||||
lines += ['int CNetObjHandler::DumpObj(int Type, const void *pData, int Size) const']
|
||||
lines += ['{']
|
||||
lines += ["\tchar aRawData[512];"]
|
||||
lines += ['\tswitch(Type)']
|
||||
lines += ['\t{']
|
||||
|
||||
for item in network.Objects:
|
||||
for line in item.emit_dump(network.Objects):
|
||||
lines += ["\t" + line]
|
||||
lines += ['\t']
|
||||
lines += ['\t}']
|
||||
lines += ['\treturn -1;']
|
||||
lines += ['};']
|
||||
lines += ['']
|
||||
for line in lines:
|
||||
print(line)
|
||||
|
||||
lines = []
|
||||
lines += ["""\
|
||||
void *CNetObjHandler::SecureUnpackObj(int Type, CUnpacker *pUnpacker)
|
||||
|
|
|
@ -233,6 +233,15 @@ class NetObject:
|
|||
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}:"]
|
||||
|
@ -240,12 +249,7 @@ class NetObject:
|
|||
lines += [f"\t{self.struct_name} *pData = ({self.struct_name} *)m_aUnpackedData;"]
|
||||
unpack_lines = []
|
||||
|
||||
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
|
||||
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.")
|
||||
|
@ -260,6 +264,26 @@ class NetObject:
|
|||
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)
|
||||
|
@ -340,6 +364,8 @@ class NetVariable:
|
|||
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):
|
||||
|
@ -384,6 +410,16 @@ class NetIntAny(NetVariable):
|
|||
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):
|
||||
|
@ -394,6 +430,23 @@ class NetIntRange(NetIntAny):
|
|||
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):
|
||||
|
@ -403,6 +456,9 @@ class NetBool(NetIntRange):
|
|||
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):
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
# pylint: skip-file
|
||||
# See https://github.com/ddnet/ddnet/issues/3507
|
||||
|
||||
from datatypes import Enum, Flags, NetArray, NetBool, NetEvent, NetEventEx, NetIntAny, NetIntRange, NetMessage, NetMessageEx, NetObject, NetObjectEx, NetString, NetStringHalfStrict, NetStringStrict, NetTick
|
||||
from datatypes import Enum, Flags, NetArray, NetBool, NetEvent, NetEventEx, NetIntAny, NetTwIntString, NetIntRange
|
||||
from datatypes import NetMessage, NetMessageEx, NetObject, NetObjectEx, NetString, NetStringHalfStrict, NetStringStrict, NetTick
|
||||
|
||||
Emotes = ["NORMAL", "PAIN", "HAPPY", "SURPRISE", "ANGRY", "BLINK"]
|
||||
PlayerFlags = ["PLAYING", "IN_MENU", "CHATTING", "SCOREBOARD", "AIM"]
|
||||
|
@ -215,17 +216,17 @@ Objects = [
|
|||
|
||||
NetObject("ClientInfo", [
|
||||
# 4*4 = 16 characters
|
||||
NetIntAny("m_Name0"), NetIntAny("m_Name1"), NetIntAny("m_Name2"),
|
||||
NetIntAny("m_Name3"),
|
||||
NetTwIntString("m_Name0"), NetTwIntString("m_Name1"), NetTwIntString("m_Name2"),
|
||||
NetTwIntString("m_Name3"),
|
||||
|
||||
# 4*3 = 12 characters
|
||||
NetIntAny("m_Clan0"), NetIntAny("m_Clan1"), NetIntAny("m_Clan2"),
|
||||
NetTwIntString("m_Clan0"), NetTwIntString("m_Clan1"), NetTwIntString("m_Clan2"),
|
||||
|
||||
NetIntAny("m_Country"),
|
||||
|
||||
# 4*6 = 24 characters
|
||||
NetIntAny("m_Skin0"), NetIntAny("m_Skin1"), NetIntAny("m_Skin2"),
|
||||
NetIntAny("m_Skin3"), NetIntAny("m_Skin4"), NetIntAny("m_Skin5"),
|
||||
NetTwIntString("m_Skin0"), NetTwIntString("m_Skin1"), NetTwIntString("m_Skin2"),
|
||||
NetTwIntString("m_Skin3"), NetTwIntString("m_Skin4"), NetTwIntString("m_Skin5"),
|
||||
|
||||
NetIntRange("m_UseCustomColor", 0, 1),
|
||||
|
||||
|
|
|
@ -87,6 +87,7 @@ def main():
|
|||
print("#ifndef GAME_GENERATED_PROTOCOL7_H")
|
||||
print("#define GAME_GENERATED_PROTOCOL7_H")
|
||||
print("class CUnpacker;")
|
||||
print("class CSnapshot;")
|
||||
print("#include <engine/message.h>")
|
||||
print("namespace protocol7 {")
|
||||
print(network.RawHeader)
|
||||
|
@ -150,6 +151,8 @@ def main():
|
|||
CNetObjHandler();
|
||||
|
||||
int ValidateObj(int Type, const void *pData, int Size);
|
||||
void DebugDumpSnapshot(const CSnapshot *pSnap) const;
|
||||
int DumpObj(int Type, const void *pData, int Size) const;
|
||||
const char *GetObjName(int Type) const;
|
||||
int GetObjSize(int Type) const;
|
||||
const char *FailedObjOn() const;
|
||||
|
@ -174,6 +177,7 @@ def main():
|
|||
lines += ['#include <base/system.h>']
|
||||
lines += ['#include <engine/shared/packer.h>']
|
||||
lines += ['#include <engine/shared/protocol.h>']
|
||||
lines += ['#include <engine/shared/snapshot.h>']
|
||||
|
||||
lines += ['namespace protocol7 {']
|
||||
|
||||
|
@ -269,6 +273,46 @@ def main():
|
|||
lines += ['};']
|
||||
lines += ['']
|
||||
|
||||
for l in lines:
|
||||
print(l)
|
||||
|
||||
print("""\
|
||||
void CNetObjHandler::DebugDumpSnapshot(const ::CSnapshot *pSnap) const
|
||||
{
|
||||
dbg_msg("snapshot", "data_size=%d num_items=%d", pSnap->DataSize(), pSnap->NumItems());
|
||||
for(int i = 0; i < pSnap->NumItems(); i++)
|
||||
{
|
||||
const CSnapshotItem *pItem = pSnap->GetItem(i);
|
||||
int Size = pSnap->GetItemSize(i);
|
||||
int Type = pSnap->GetItemType(i);
|
||||
const char *pName = GetObjName(pItem->Type());
|
||||
if(Type > OFFSET_UUID && Type < g_UuidManager.NumUuids() + OFFSET_UUID)
|
||||
pName = g_UuidManager.GetName(Type);
|
||||
dbg_msg("snapshot", "\\t%s type=%d id=%d size=%d", pName, pItem->Type(), pItem->Id(), Size);
|
||||
if(!DumpObj(Type, pItem->Data(), Size))
|
||||
continue;
|
||||
|
||||
for(size_t b = 0; b < Size / sizeof(int32_t); b++)
|
||||
dbg_msg("snapshot", "\\t\\t%3d %12d\\t%08x", (int)b, pItem->Data()[b], pItem->Data()[b]);
|
||||
}
|
||||
}\n""")
|
||||
|
||||
lines = []
|
||||
lines += ['int CNetObjHandler::DumpObj(int Type, const void *pData, int Size) const']
|
||||
lines += ['{']
|
||||
lines += ["\tchar aRawData[512];"]
|
||||
lines += ['\tswitch(Type)']
|
||||
lines += ['\t{']
|
||||
|
||||
for item in network.Objects:
|
||||
for line in item.emit_dump(network.Objects):
|
||||
lines += ["\t" + line]
|
||||
lines += ['\t']
|
||||
lines += ['\t}']
|
||||
lines += ['\treturn -1;']
|
||||
lines += ['};']
|
||||
lines += ['']
|
||||
|
||||
lines += ['void *CNetObjHandler::SecureUnpackMsg(int Type, CUnpacker *pUnpacker)']
|
||||
lines += ['{']
|
||||
lines += ['\tm_pMsgFailedOn = 0;']
|
||||
|
|
|
@ -234,24 +234,38 @@ class NetObject:
|
|||
lines += ["\t"+line for line in v.emit_declaration()]
|
||||
lines += ["};"]
|
||||
return lines
|
||||
def emit_validate(self, objects):
|
||||
lines = [f"case {self.enum_name}:"]
|
||||
lines += ["{"]
|
||||
lines += [f"\t{self.struct_name} *pObj = ({self.struct_name} *)pData;"]
|
||||
lines += ["\tif(sizeof(*pObj) != Size) return -1;"]
|
||||
|
||||
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_validate(self, objects):
|
||||
lines = [f"case {self.enum_name}:"]
|
||||
lines += ["{"]
|
||||
lines += [f"\t{self.struct_name} *pObj = ({self.struct_name} *)pData;"]
|
||||
lines += ["\tif(sizeof(*pObj) != Size) return -1;"]
|
||||
variables = self.members_from_this_and_parents(objects)
|
||||
for v in variables:
|
||||
lines += ["\t"+line for line in v.emit_validate()]
|
||||
lines += ["\treturn 0;"]
|
||||
lines += ["}"]
|
||||
return lines
|
||||
def emit_dump(self, objects):
|
||||
lines = [f"case {self.enum_name}:"]
|
||||
lines += ["{"]
|
||||
lines += [f"\t{self.struct_name} *pObj = ({self.struct_name} *)pData;"]
|
||||
lines += ["\tif(sizeof(*pObj) != Size) return -1;"]
|
||||
variables = self.members_from_this_and_parents(objects)
|
||||
offset = 0
|
||||
for v in variables:
|
||||
lines += ["\t"+line for line in v.emit_dump(offset)]
|
||||
offset += 1
|
||||
lines += ["\treturn 0;"]
|
||||
lines += ["}"]
|
||||
return lines
|
||||
|
||||
|
||||
class NetEvent(NetObject):
|
||||
|
@ -312,6 +326,8 @@ class NetVariable:
|
|||
return []
|
||||
def emit_unpack_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):
|
||||
|
@ -338,6 +354,9 @@ class NetIntAny(NetVariable):
|
|||
return [f"pMsg->{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 NetIntRange(NetIntAny):
|
||||
def __init__(self, name, min_val, max_val, default=None):
|
||||
|
@ -348,6 +367,23 @@ class NetIntRange(NetIntAny):
|
|||
return [f"if(!CheckInt(\"{self.name}\", pObj->{self.name}, {self.min}, {self.max})) return -1;"]
|
||||
def emit_unpack_check(self):
|
||||
return [f"if(!CheckInt(\"{self.name}\", pMsg->{self.name}, {self.min}, {self.max})) 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 NetEnum(NetIntRange):
|
||||
def __init__(self, name, enum):
|
||||
|
@ -366,6 +402,9 @@ class NetFlag(NetIntAny):
|
|||
return [f"if(!CheckFlag(\"{self.name}\", pObj->{self.name}, {self.mask})) return -1;"]
|
||||
def emit_unpack_check(self):
|
||||
return [f"if(!CheckFlag(\"{self.name}\", pMsg->{self.name}, {self.mask})) break;"]
|
||||
def emit_dump(self, offset):
|
||||
return NetVariable(self.name).emit_dump(offset) + \
|
||||
[f"dbg_msg(\"snapshot\", \"%s\\t{self.name}=%d (mask=%d)\", aRawData, pObj->{self.name}, {self.mask});"]
|
||||
|
||||
class NetBool(NetIntRange):
|
||||
def __init__(self, name, default=None):
|
||||
|
|
|
@ -347,6 +347,9 @@ public:
|
|||
virtual const char *Version() const = 0;
|
||||
virtual const char *NetVersion() const = 0;
|
||||
|
||||
virtual CNetObjHandler *GetNetObjHandler() = 0;
|
||||
virtual protocol7::CNetObjHandler *GetNetObjHandler7() = 0;
|
||||
|
||||
// DDRace
|
||||
|
||||
virtual void OnPreTickTeehistorian() = 0;
|
||||
|
|
|
@ -53,6 +53,7 @@ public:
|
|||
};
|
||||
|
||||
int NumItems() const { return m_NumItems; }
|
||||
int DataSize() const { return m_DataSize; }
|
||||
const CSnapshotItem *GetItem(int Index) const;
|
||||
int GetItemSize(int Index) const;
|
||||
int GetItemIndex(int Key) const;
|
||||
|
@ -62,6 +63,9 @@ public:
|
|||
const void *FindItem(int Type, int Id) const;
|
||||
|
||||
unsigned Crc() const;
|
||||
// Prints the raw snapshot data showing item and int boundaries.
|
||||
// See also `CNetObjHandler::DebugDumpSnapshot(const CSnapshot *pSnap)`
|
||||
// For more detailed annotations of the data.
|
||||
void DebugDump() const;
|
||||
bool IsValid(size_t ActualSize) const;
|
||||
|
||||
|
|
|
@ -169,6 +169,8 @@ public:
|
|||
IAntibot *Antibot() { return m_pAntibot; }
|
||||
CTeeHistorian *TeeHistorian() { return &m_TeeHistorian; }
|
||||
bool TeeHistorianActive() const { return m_TeeHistorianActive; }
|
||||
CNetObjHandler *GetNetObjHandler() override { return &m_NetObjHandler; }
|
||||
protocol7::CNetObjHandler *GetNetObjHandler7() override { return &m_NetObjHandler7; }
|
||||
|
||||
CGameContext();
|
||||
CGameContext(int Reset);
|
||||
|
|
Loading…
Reference in a new issue