1#include "protocol.h"
2
3#include <base/system.h>
4#include <engine/uuid.h>
5#include <engine/shared/packer.h>
6#include <engine/shared/protocol.h>
7#include <engine/shared/uuid_manager.h>
8#include <engine/shared/snapshot.h>
9
10#include <game/gamecore.h>
11#include <game/mapitems_ex.h>
12
13CNetObjHandler::CNetObjHandler()
14{
15 m_pMsgFailedOn = "";
16 m_pObjFailedOn = "";
17 m_pObjCorrectedOn = "";
18 m_NumObjCorrections = 0;
19}
20
21int CNetObjHandler::NumObjCorrections() const { return m_NumObjCorrections; }
22const char *CNetObjHandler::CorrectedObjOn() const { return m_pObjCorrectedOn; }
23const char *CNetObjHandler::FailedObjOn() const { return m_pObjFailedOn; }
24const char *CNetObjHandler::FailedMsgOn() const { return m_pMsgFailedOn; }
25
26static const int max_int = 0x7fffffff;
27static const int min_int = 0x80000000;
28
29int CNetObjHandler::ClampInt(const char *pErrorMsg, int Value, int Min, int Max)
30{
31 if(Value < Min) { m_pObjCorrectedOn = pErrorMsg; m_NumObjCorrections++; return Min; }
32 if(Value > Max) { m_pObjCorrectedOn = pErrorMsg; m_NumObjCorrections++; return Max; }
33 return Value;
34}
35
36const char *CNetObjHandler::ms_apObjNames[] = {
37 "EX/UUID",
38 "PlayerInput",
39 "Projectile",
40 "Laser",
41 "Pickup",
42 "Flag",
43 "GameInfo",
44 "GameData",
45 "CharacterCore",
46 "Character",
47 "PlayerInfo",
48 "ClientInfo",
49 "SpectatorInfo",
50 "Common",
51 "Explosion",
52 "Spawn",
53 "HammerHit",
54 "Death",
55 "SoundGlobal",
56 "SoundWorld",
57 "DamageInd",
58 ""
59};
60
61const char *CNetObjHandler::ms_apExObjNames[] = {
62 "invalid",
63 "MyOwnObject",
64 "DDNetCharacter",
65 "DDNetPlayer",
66 "GameInfoEx",
67 "DDRaceProjectile",
68 "DDNetLaser",
69 "DDNetProjectile",
70 "DDNetPickup",
71 "DDNetSpectatorInfo",
72 "SpectatorCount",
73 "Birthday",
74 "Finish",
75 "MyOwnEvent",
76 "SpecChar",
77 "SwitchState",
78 "EntityEx",
79 "MapBestTime",
80 "MapSoundWorld",
81 ""
82};
83
84int CNetObjHandler::ms_aObjSizes[] = {
85 0,
86 sizeof(CNetObj_PlayerInput),
87 sizeof(CNetObj_Projectile),
88 sizeof(CNetObj_Laser),
89 sizeof(CNetObj_Pickup),
90 sizeof(CNetObj_Flag),
91 sizeof(CNetObj_GameInfo),
92 sizeof(CNetObj_GameData),
93 sizeof(CNetObj_CharacterCore),
94 sizeof(CNetObj_Character),
95 sizeof(CNetObj_PlayerInfo),
96 sizeof(CNetObj_ClientInfo),
97 sizeof(CNetObj_SpectatorInfo),
98 sizeof(CNetEvent_Common),
99 sizeof(CNetEvent_Explosion),
100 sizeof(CNetEvent_Spawn),
101 sizeof(CNetEvent_HammerHit),
102 sizeof(CNetEvent_Death),
103 sizeof(CNetEvent_SoundGlobal),
104 sizeof(CNetEvent_SoundWorld),
105 sizeof(CNetEvent_DamageInd),
106 0
107};
108
109int CNetObjHandler::ms_aUnpackedObjSizes[] = {
110 16,
111 sizeof(CNetObj_PlayerInput),
112 sizeof(CNetObj_Projectile),
113 sizeof(CNetObj_Laser),
114 sizeof(CNetObj_Pickup),
115 sizeof(CNetObj_Flag),
116 sizeof(CNetObj_GameInfo),
117 sizeof(CNetObj_GameData),
118 sizeof(CNetObj_CharacterCore),
119 sizeof(CNetObj_Character),
120 sizeof(CNetObj_PlayerInfo),
121 sizeof(CNetObj_ClientInfo),
122 sizeof(CNetObj_SpectatorInfo),
123 sizeof(CNetEvent_Common),
124 sizeof(CNetEvent_Explosion),
125 sizeof(CNetEvent_Spawn),
126 sizeof(CNetEvent_HammerHit),
127 sizeof(CNetEvent_Death),
128 sizeof(CNetEvent_SoundGlobal),
129 sizeof(CNetEvent_SoundWorld),
130 sizeof(CNetEvent_DamageInd),
131};
132
133int CNetObjHandler::ms_aUnpackedExObjSizes[] = {
134 0,
135 sizeof(CNetObj_MyOwnObject),
136 sizeof(CNetObj_DDNetCharacter),
137 sizeof(CNetObj_DDNetPlayer),
138 sizeof(CNetObj_GameInfoEx),
139 sizeof(CNetObj_DDRaceProjectile),
140 sizeof(CNetObj_DDNetLaser),
141 sizeof(CNetObj_DDNetProjectile),
142 sizeof(CNetObj_DDNetPickup),
143 sizeof(CNetObj_DDNetSpectatorInfo),
144 sizeof(CNetObj_SpectatorCount),
145 sizeof(CNetEvent_Birthday),
146 sizeof(CNetEvent_Finish),
147 sizeof(CNetObj_MyOwnEvent),
148 sizeof(CNetObj_SpecChar),
149 sizeof(CNetObj_SwitchState),
150 sizeof(CNetObj_EntityEx),
151 sizeof(CNetObj_MapBestTime),
152 sizeof(CNetEvent_MapSoundWorld),
153};
154
155const char *CNetObjHandler::ms_apMsgNames[] = {
156 "invalid",
157 "Sv_Motd",
158 "Sv_Broadcast",
159 "Sv_Chat",
160 "Sv_KillMsg",
161 "Sv_SoundGlobal",
162 "Sv_TuneParams",
163 "Unused",
164 "Sv_ReadyToEnter",
165 "Sv_WeaponPickup",
166 "Sv_Emoticon",
167 "Sv_VoteClearOptions",
168 "Sv_VoteOptionListAdd",
169 "Sv_VoteOptionAdd",
170 "Sv_VoteOptionRemove",
171 "Sv_VoteSet",
172 "Sv_VoteStatus",
173 "Cl_Say",
174 "Cl_SetTeam",
175 "Cl_SetSpectatorMode",
176 "Cl_StartInfo",
177 "Cl_ChangeInfo",
178 "Cl_Kill",
179 "Cl_Emoticon",
180 "Cl_Vote",
181 "Cl_CallVote",
182 "Cl_IsDDNetLegacy",
183 "Sv_DDRaceTimeLegacy",
184 "Sv_RecordLegacy",
185 "Unused2",
186 "Sv_TeamsStateLegacy",
187 "Cl_ShowOthersLegacy",
188 ""
189};
190
191const char *CNetObjHandler::ms_apExMsgNames[] = {
192 "invalid",
193 "Sv_MyOwnMessage",
194 "Cl_ShowDistance",
195 "Cl_ShowOthers",
196 "Cl_CameraInfo",
197 "Sv_TeamsState",
198 "Sv_DDRaceTime",
199 "Sv_Record",
200 "Sv_KillMsgTeam",
201 "Sv_YourVote",
202 "Sv_RaceFinish",
203 "Sv_CommandInfo",
204 "Sv_CommandInfoRemove",
205 "Sv_VoteOptionGroupStart",
206 "Sv_VoteOptionGroupEnd",
207 "Sv_CommandInfoGroupStart",
208 "Sv_CommandInfoGroupEnd",
209 "Sv_ChangeInfoCooldown",
210 "Sv_MapSoundGlobal",
211 "Sv_PreInput",
212 "Sv_SaveCode",
213 "Sv_ServerAlert",
214 "Sv_ModeratorAlert",
215 "Cl_EnableSpectatorCount",
216 "Sv_MapInfo",
217 ""
218};
219
220const char *CNetObjHandler::GetObjName(int Type) const
221{
222 if(Type >= 0 && Type < NUM_NETOBJTYPES)
223 {
224 return ms_apObjNames[Type];
225 }
226 else if(Type > __NETOBJTYPE_UUID_HELPER && Type < OFFSET_NETMSGTYPE_UUID)
227 {
228 return ms_apExObjNames[Type - __NETOBJTYPE_UUID_HELPER];
229 }
230 return "(out of range)";
231}
232
233int CNetObjHandler::GetObjSize(int Type) const
234{
235 if(Type < 0 || Type >= NUM_NETOBJTYPES) return 0;
236 return ms_aObjSizes[Type];
237}
238
239int CNetObjHandler::GetUnpackedObjSize(int Type) const
240{
241 if(Type >= 0 && Type < NUM_NETOBJTYPES)
242 {
243 return ms_aUnpackedObjSizes[Type];
244 }
245 else if(Type > __NETOBJTYPE_UUID_HELPER && Type < OFFSET_NETMSGTYPE_UUID)
246 {
247 return ms_aUnpackedExObjSizes[Type - __NETOBJTYPE_UUID_HELPER];
248 }
249 return 0;
250}
251
252const char *CNetObjHandler::GetMsgName(int Type) const
253{
254 if(Type >= 0 && Type < NUM_NETMSGTYPES)
255 {
256 return ms_apMsgNames[Type];
257 }
258 else if(Type > __NETMSGTYPE_UUID_HELPER && Type < OFFSET_MAPITEMTYPE_UUID)
259 {
260 return ms_apExMsgNames[Type - __NETMSGTYPE_UUID_HELPER];
261 }
262 return "(out of range)";
263}
264
265void CNetObjHandler::DebugDumpSnapshot(const CSnapshot *pSnap) const
266{
267 dbg_msg(sys: "snapshot", fmt: "data_size=%d num_items=%d", pSnap->DataSize(), pSnap->NumItems());
268 for(int i = 0; i < pSnap->NumItems(); i++)
269 {
270 const CSnapshotItem *pItem = pSnap->GetItem(Index: i);
271 int Size = pSnap->GetItemSize(Index: i);
272 int Type = pSnap->GetItemType(Index: i);
273 const char *pName = GetObjName(Type: pItem->Type());
274 if(Type > OFFSET_UUID && Type < g_UuidManager.NumUuids() + OFFSET_UUID)
275 pName = g_UuidManager.GetName(Id: Type);
276 dbg_msg(sys: "snapshot", fmt: "\t%s type=%d id=%d size=%d", pName, pItem->Type(), pItem->Id(), Size);
277 if(!DumpObj(Type, pData: pItem->Data(), Size))
278 continue;
279
280 for(size_t b = 0; b < Size / sizeof(int32_t); b++)
281 dbg_msg(sys: "snapshot", fmt: "\t\t%3d %12d\t%08x", (int)b, pItem->Data()[b], pItem->Data()[b]);
282 }
283}
284
285
286int CNetObjHandler::DumpObj(int Type, const void *pData, int Size) const
287{
288 char aRawData[512];
289 char aStr[128];
290 int aInts[2] = {0x0, (int)0x80808080};
291 switch(Type)
292 {
293 case NETOBJTYPE_PLAYERINPUT:
294 {
295 CNetObj_PlayerInput *pObj = (CNetObj_PlayerInput *)pData;
296 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
297 dbg_msg(sys: "snapshot", fmt: "%s\tm_Direction=%d", aRawData, pObj->m_Direction);
298 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
299 dbg_msg(sys: "snapshot", fmt: "%s\tm_TargetX=%d", aRawData, pObj->m_TargetX);
300 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
301 dbg_msg(sys: "snapshot", fmt: "%s\tm_TargetY=%d", aRawData, pObj->m_TargetY);
302 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
303 dbg_msg(sys: "snapshot", fmt: "%s\tm_Jump=%d", aRawData, pObj->m_Jump);
304 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
305 dbg_msg(sys: "snapshot", fmt: "%s\tm_Fire=%d", aRawData, pObj->m_Fire);
306 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
307 dbg_msg(sys: "snapshot", fmt: "%s\tm_Hook=%d", aRawData, pObj->m_Hook);
308 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 6, ((const int *)pData)[6], ((const int *)pData)[6]);
309 dbg_msg(sys: "snapshot", fmt: "%s\tm_PlayerFlags=%d (min=0 max=256)", aRawData, pObj->m_PlayerFlags);
310 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 7, ((const int *)pData)[7], ((const int *)pData)[7]);
311 dbg_msg(sys: "snapshot", fmt: "%s\tm_WantedWeapon=%d", aRawData, pObj->m_WantedWeapon);
312 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 8, ((const int *)pData)[8], ((const int *)pData)[8]);
313 dbg_msg(sys: "snapshot", fmt: "%s\tm_NextWeapon=%d", aRawData, pObj->m_NextWeapon);
314 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 9, ((const int *)pData)[9], ((const int *)pData)[9]);
315 dbg_msg(sys: "snapshot", fmt: "%s\tm_PrevWeapon=%d", aRawData, pObj->m_PrevWeapon);
316 return 0;
317 };
318
319 case NETOBJTYPE_PROJECTILE:
320 {
321 CNetObj_Projectile *pObj = (CNetObj_Projectile *)pData;
322 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
323 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
324 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
325 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
326 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
327 dbg_msg(sys: "snapshot", fmt: "%s\tm_VelX=%d", aRawData, pObj->m_VelX);
328 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
329 dbg_msg(sys: "snapshot", fmt: "%s\tm_VelY=%d", aRawData, pObj->m_VelY);
330 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
331 dbg_msg(sys: "snapshot", fmt: "%s\tm_Type=%d (min=0 max=NUM_WEAPONS-1(%d))", aRawData, pObj->m_Type, (int)NUM_WEAPONS-1);
332 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
333 dbg_msg(sys: "snapshot", fmt: "%s\tm_StartTick=%d (NetTick)", aRawData, pObj->m_StartTick);
334 return 0;
335 };
336
337 case NETOBJTYPE_LASER:
338 {
339 CNetObj_Laser *pObj = (CNetObj_Laser *)pData;
340 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
341 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
342 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
343 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
344 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
345 dbg_msg(sys: "snapshot", fmt: "%s\tm_FromX=%d", aRawData, pObj->m_FromX);
346 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
347 dbg_msg(sys: "snapshot", fmt: "%s\tm_FromY=%d", aRawData, pObj->m_FromY);
348 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
349 dbg_msg(sys: "snapshot", fmt: "%s\tm_StartTick=%d (NetTick)", aRawData, pObj->m_StartTick);
350 return 0;
351 };
352
353 case NETOBJTYPE_PICKUP:
354 {
355 CNetObj_Pickup *pObj = (CNetObj_Pickup *)pData;
356 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
357 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
358 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
359 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
360 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
361 dbg_msg(sys: "snapshot", fmt: "%s\tm_Type=%d (min=0 max=max_int(%d))", aRawData, pObj->m_Type, (int)max_int);
362 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
363 dbg_msg(sys: "snapshot", fmt: "%s\tm_Subtype=%d (min=0 max=max_int(%d))", aRawData, pObj->m_Subtype, (int)max_int);
364 return 0;
365 };
366
367 case NETOBJTYPE_FLAG:
368 {
369 CNetObj_Flag *pObj = (CNetObj_Flag *)pData;
370 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
371 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
372 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
373 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
374 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
375 dbg_msg(sys: "snapshot", fmt: "%s\tm_Team=%d (min=TEAM_RED(%d) max=TEAM_BLUE(%d))", aRawData, pObj->m_Team, (int)TEAM_RED, (int)TEAM_BLUE);
376 return 0;
377 };
378
379 case NETOBJTYPE_GAMEINFO:
380 {
381 CNetObj_GameInfo *pObj = (CNetObj_GameInfo *)pData;
382 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
383 dbg_msg(sys: "snapshot", fmt: "%s\tm_GameFlags=%d (min=0 max=256)", aRawData, pObj->m_GameFlags);
384 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
385 dbg_msg(sys: "snapshot", fmt: "%s\tm_GameStateFlags=%d (min=0 max=256)", aRawData, pObj->m_GameStateFlags);
386 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
387 dbg_msg(sys: "snapshot", fmt: "%s\tm_RoundStartTick=%d (NetTick)", aRawData, pObj->m_RoundStartTick);
388 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
389 dbg_msg(sys: "snapshot", fmt: "%s\tm_WarmupTimer=%d (min=min_int(%d) max=max_int(%d))", aRawData, pObj->m_WarmupTimer, (int)min_int, (int)max_int);
390 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
391 dbg_msg(sys: "snapshot", fmt: "%s\tm_ScoreLimit=%d (min=0 max=max_int(%d))", aRawData, pObj->m_ScoreLimit, (int)max_int);
392 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
393 dbg_msg(sys: "snapshot", fmt: "%s\tm_TimeLimit=%d (min=0 max=max_int(%d))", aRawData, pObj->m_TimeLimit, (int)max_int);
394 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 6, ((const int *)pData)[6], ((const int *)pData)[6]);
395 dbg_msg(sys: "snapshot", fmt: "%s\tm_RoundNum=%d (min=0 max=max_int(%d))", aRawData, pObj->m_RoundNum, (int)max_int);
396 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 7, ((const int *)pData)[7], ((const int *)pData)[7]);
397 dbg_msg(sys: "snapshot", fmt: "%s\tm_RoundCurrent=%d (min=0 max=max_int(%d))", aRawData, pObj->m_RoundCurrent, (int)max_int);
398 return 0;
399 };
400
401 case NETOBJTYPE_GAMEDATA:
402 {
403 CNetObj_GameData *pObj = (CNetObj_GameData *)pData;
404 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
405 dbg_msg(sys: "snapshot", fmt: "%s\tm_TeamscoreRed=%d", aRawData, pObj->m_TeamscoreRed);
406 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
407 dbg_msg(sys: "snapshot", fmt: "%s\tm_TeamscoreBlue=%d", aRawData, pObj->m_TeamscoreBlue);
408 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
409 dbg_msg(sys: "snapshot", fmt: "%s\tm_FlagCarrierRed=%d (min=FLAG_MISSING(%d) max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_FlagCarrierRed, (int)FLAG_MISSING, (int)MAX_CLIENTS-1);
410 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
411 dbg_msg(sys: "snapshot", fmt: "%s\tm_FlagCarrierBlue=%d (min=FLAG_MISSING(%d) max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_FlagCarrierBlue, (int)FLAG_MISSING, (int)MAX_CLIENTS-1);
412 return 0;
413 };
414
415 case NETOBJTYPE_CHARACTERCORE:
416 {
417 CNetObj_CharacterCore *pObj = (CNetObj_CharacterCore *)pData;
418 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
419 dbg_msg(sys: "snapshot", fmt: "%s\tm_Tick=%d", aRawData, pObj->m_Tick);
420 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
421 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
422 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
423 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
424 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
425 dbg_msg(sys: "snapshot", fmt: "%s\tm_VelX=%d", aRawData, pObj->m_VelX);
426 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
427 dbg_msg(sys: "snapshot", fmt: "%s\tm_VelY=%d", aRawData, pObj->m_VelY);
428 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
429 dbg_msg(sys: "snapshot", fmt: "%s\tm_Angle=%d", aRawData, pObj->m_Angle);
430 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 6, ((const int *)pData)[6], ((const int *)pData)[6]);
431 dbg_msg(sys: "snapshot", fmt: "%s\tm_Direction=%d (min=-1 max=1)", aRawData, pObj->m_Direction);
432 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 7, ((const int *)pData)[7], ((const int *)pData)[7]);
433 dbg_msg(sys: "snapshot", fmt: "%s\tm_Jumped=%d (min=0 max=3)", aRawData, pObj->m_Jumped);
434 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 8, ((const int *)pData)[8], ((const int *)pData)[8]);
435 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookedPlayer=%d (min=-1 max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_HookedPlayer, (int)MAX_CLIENTS-1);
436 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 9, ((const int *)pData)[9], ((const int *)pData)[9]);
437 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookState=%d (min=-1 max=5)", aRawData, pObj->m_HookState);
438 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 10, ((const int *)pData)[10], ((const int *)pData)[10]);
439 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookTick=%d", aRawData, pObj->m_HookTick);
440 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 11, ((const int *)pData)[11], ((const int *)pData)[11]);
441 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookX=%d", aRawData, pObj->m_HookX);
442 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 12, ((const int *)pData)[12], ((const int *)pData)[12]);
443 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookY=%d", aRawData, pObj->m_HookY);
444 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 13, ((const int *)pData)[13], ((const int *)pData)[13]);
445 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookDx=%d", aRawData, pObj->m_HookDx);
446 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 14, ((const int *)pData)[14], ((const int *)pData)[14]);
447 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookDy=%d", aRawData, pObj->m_HookDy);
448 return 0;
449 };
450
451 case NETOBJTYPE_CHARACTER:
452 {
453 CNetObj_Character *pObj = (CNetObj_Character *)pData;
454 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
455 dbg_msg(sys: "snapshot", fmt: "%s\tm_Tick=%d", aRawData, pObj->m_Tick);
456 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
457 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
458 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
459 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
460 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
461 dbg_msg(sys: "snapshot", fmt: "%s\tm_VelX=%d", aRawData, pObj->m_VelX);
462 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
463 dbg_msg(sys: "snapshot", fmt: "%s\tm_VelY=%d", aRawData, pObj->m_VelY);
464 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
465 dbg_msg(sys: "snapshot", fmt: "%s\tm_Angle=%d", aRawData, pObj->m_Angle);
466 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 6, ((const int *)pData)[6], ((const int *)pData)[6]);
467 dbg_msg(sys: "snapshot", fmt: "%s\tm_Direction=%d (min=-1 max=1)", aRawData, pObj->m_Direction);
468 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 7, ((const int *)pData)[7], ((const int *)pData)[7]);
469 dbg_msg(sys: "snapshot", fmt: "%s\tm_Jumped=%d (min=0 max=3)", aRawData, pObj->m_Jumped);
470 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 8, ((const int *)pData)[8], ((const int *)pData)[8]);
471 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookedPlayer=%d (min=-1 max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_HookedPlayer, (int)MAX_CLIENTS-1);
472 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 9, ((const int *)pData)[9], ((const int *)pData)[9]);
473 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookState=%d (min=-1 max=5)", aRawData, pObj->m_HookState);
474 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 10, ((const int *)pData)[10], ((const int *)pData)[10]);
475 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookTick=%d", aRawData, pObj->m_HookTick);
476 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 11, ((const int *)pData)[11], ((const int *)pData)[11]);
477 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookX=%d", aRawData, pObj->m_HookX);
478 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 12, ((const int *)pData)[12], ((const int *)pData)[12]);
479 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookY=%d", aRawData, pObj->m_HookY);
480 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 13, ((const int *)pData)[13], ((const int *)pData)[13]);
481 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookDx=%d", aRawData, pObj->m_HookDx);
482 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 14, ((const int *)pData)[14], ((const int *)pData)[14]);
483 dbg_msg(sys: "snapshot", fmt: "%s\tm_HookDy=%d", aRawData, pObj->m_HookDy);
484 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 15, ((const int *)pData)[15], ((const int *)pData)[15]);
485 dbg_msg(sys: "snapshot", fmt: "%s\tm_PlayerFlags=%d (min=0 max=256)", aRawData, pObj->m_PlayerFlags);
486 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 16, ((const int *)pData)[16], ((const int *)pData)[16]);
487 dbg_msg(sys: "snapshot", fmt: "%s\tm_Health=%d (min=0 max=10)", aRawData, pObj->m_Health);
488 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 17, ((const int *)pData)[17], ((const int *)pData)[17]);
489 dbg_msg(sys: "snapshot", fmt: "%s\tm_Armor=%d (min=0 max=10)", aRawData, pObj->m_Armor);
490 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 18, ((const int *)pData)[18], ((const int *)pData)[18]);
491 dbg_msg(sys: "snapshot", fmt: "%s\tm_AmmoCount=%d (min=-1 max=10)", aRawData, pObj->m_AmmoCount);
492 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 19, ((const int *)pData)[19], ((const int *)pData)[19]);
493 dbg_msg(sys: "snapshot", fmt: "%s\tm_Weapon=%d (min=-1 max=NUM_WEAPONS-1(%d))", aRawData, pObj->m_Weapon, (int)NUM_WEAPONS-1);
494 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 20, ((const int *)pData)[20], ((const int *)pData)[20]);
495 dbg_msg(sys: "snapshot", fmt: "%s\tm_Emote=%d (min=0 max=6)", aRawData, pObj->m_Emote);
496 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 21, ((const int *)pData)[21], ((const int *)pData)[21]);
497 dbg_msg(sys: "snapshot", fmt: "%s\tm_AttackTick=%d (min=0 max=max_int(%d))", aRawData, pObj->m_AttackTick, (int)max_int);
498 return 0;
499 };
500
501 case NETOBJTYPE_PLAYERINFO:
502 {
503 CNetObj_PlayerInfo *pObj = (CNetObj_PlayerInfo *)pData;
504 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
505 dbg_msg(sys: "snapshot", fmt: "%s\tm_Local=%d (min=0 max=1)", aRawData, pObj->m_Local);
506 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
507 dbg_msg(sys: "snapshot", fmt: "%s\tm_ClientId=%d (min=0 max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_ClientId, (int)MAX_CLIENTS-1);
508 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
509 dbg_msg(sys: "snapshot", fmt: "%s\tm_Team=%d (min=TEAM_SPECTATORS(%d) max=TEAM_BLUE(%d))", aRawData, pObj->m_Team, (int)TEAM_SPECTATORS, (int)TEAM_BLUE);
510 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
511 dbg_msg(sys: "snapshot", fmt: "%s\tm_Score=%d", aRawData, pObj->m_Score);
512 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
513 dbg_msg(sys: "snapshot", fmt: "%s\tm_Latency=%d", aRawData, pObj->m_Latency);
514 return 0;
515 };
516
517 case NETOBJTYPE_CLIENTINFO:
518 {
519 CNetObj_ClientInfo *pObj = (CNetObj_ClientInfo *)pData;
520 aInts[0] = pObj->m_aName[0];
521 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
522 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
523 dbg_msg(sys: "snapshot", fmt: "%s\tm_aName[0]=%d\tIntToStr: %s", aRawData, pObj->m_aName[0], aStr);
524 aInts[0] = pObj->m_aName[1];
525 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
526 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
527 dbg_msg(sys: "snapshot", fmt: "%s\tm_aName[1]=%d\tIntToStr: %s", aRawData, pObj->m_aName[1], aStr);
528 aInts[0] = pObj->m_aName[2];
529 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
530 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
531 dbg_msg(sys: "snapshot", fmt: "%s\tm_aName[2]=%d\tIntToStr: %s", aRawData, pObj->m_aName[2], aStr);
532 aInts[0] = pObj->m_aName[3];
533 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
534 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
535 dbg_msg(sys: "snapshot", fmt: "%s\tm_aName[3]=%d\tIntToStr: %s", aRawData, pObj->m_aName[3], aStr);
536 aInts[0] = pObj->m_aClan[0];
537 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
538 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
539 dbg_msg(sys: "snapshot", fmt: "%s\tm_aClan[0]=%d\tIntToStr: %s", aRawData, pObj->m_aClan[0], aStr);
540 aInts[0] = pObj->m_aClan[1];
541 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
542 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
543 dbg_msg(sys: "snapshot", fmt: "%s\tm_aClan[1]=%d\tIntToStr: %s", aRawData, pObj->m_aClan[1], aStr);
544 aInts[0] = pObj->m_aClan[2];
545 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
546 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 6, ((const int *)pData)[6], ((const int *)pData)[6]);
547 dbg_msg(sys: "snapshot", fmt: "%s\tm_aClan[2]=%d\tIntToStr: %s", aRawData, pObj->m_aClan[2], aStr);
548 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 7, ((const int *)pData)[7], ((const int *)pData)[7]);
549 dbg_msg(sys: "snapshot", fmt: "%s\tm_Country=%d", aRawData, pObj->m_Country);
550 aInts[0] = pObj->m_aSkin[0];
551 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
552 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 8, ((const int *)pData)[8], ((const int *)pData)[8]);
553 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSkin[0]=%d\tIntToStr: %s", aRawData, pObj->m_aSkin[0], aStr);
554 aInts[0] = pObj->m_aSkin[1];
555 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
556 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 9, ((const int *)pData)[9], ((const int *)pData)[9]);
557 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSkin[1]=%d\tIntToStr: %s", aRawData, pObj->m_aSkin[1], aStr);
558 aInts[0] = pObj->m_aSkin[2];
559 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
560 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 10, ((const int *)pData)[10], ((const int *)pData)[10]);
561 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSkin[2]=%d\tIntToStr: %s", aRawData, pObj->m_aSkin[2], aStr);
562 aInts[0] = pObj->m_aSkin[3];
563 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
564 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 11, ((const int *)pData)[11], ((const int *)pData)[11]);
565 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSkin[3]=%d\tIntToStr: %s", aRawData, pObj->m_aSkin[3], aStr);
566 aInts[0] = pObj->m_aSkin[4];
567 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
568 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 12, ((const int *)pData)[12], ((const int *)pData)[12]);
569 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSkin[4]=%d\tIntToStr: %s", aRawData, pObj->m_aSkin[4], aStr);
570 aInts[0] = pObj->m_aSkin[5];
571 IntsToStr(pInts: aInts, NumInts: std::size(aInts), pStr: aStr, StrSize: std::size(aStr));
572 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 13, ((const int *)pData)[13], ((const int *)pData)[13]);
573 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSkin[5]=%d\tIntToStr: %s", aRawData, pObj->m_aSkin[5], aStr);
574 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 14, ((const int *)pData)[14], ((const int *)pData)[14]);
575 dbg_msg(sys: "snapshot", fmt: "%s\tm_UseCustomColor=%d (min=0 max=1)", aRawData, pObj->m_UseCustomColor);
576 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 15, ((const int *)pData)[15], ((const int *)pData)[15]);
577 dbg_msg(sys: "snapshot", fmt: "%s\tm_ColorBody=%d", aRawData, pObj->m_ColorBody);
578 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 16, ((const int *)pData)[16], ((const int *)pData)[16]);
579 dbg_msg(sys: "snapshot", fmt: "%s\tm_ColorFeet=%d", aRawData, pObj->m_ColorFeet);
580 return 0;
581 };
582
583 case NETOBJTYPE_SPECTATORINFO:
584 {
585 CNetObj_SpectatorInfo *pObj = (CNetObj_SpectatorInfo *)pData;
586 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
587 dbg_msg(sys: "snapshot", fmt: "%s\tm_SpectatorId=%d (min=SPEC_FREEVIEW(%d) max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_SpectatorId, (int)SPEC_FREEVIEW, (int)MAX_CLIENTS-1);
588 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
589 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
590 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
591 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
592 return 0;
593 };
594
595 case NETOBJTYPE_MYOWNOBJECT:
596 {
597 CNetObj_MyOwnObject *pObj = (CNetObj_MyOwnObject *)pData;
598 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
599 dbg_msg(sys: "snapshot", fmt: "%s\tm_Test=%d", aRawData, pObj->m_Test);
600 return 0;
601 };
602
603 case NETOBJTYPE_DDNETCHARACTER:
604 {
605 CNetObj_DDNetCharacter *pObj = (CNetObj_DDNetCharacter *)pData;
606 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
607 dbg_msg(sys: "snapshot", fmt: "%s\tm_Flags=%d", aRawData, pObj->m_Flags);
608 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
609 dbg_msg(sys: "snapshot", fmt: "%s\tm_FreezeEnd=%d (NetTick)", aRawData, pObj->m_FreezeEnd);
610 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
611 dbg_msg(sys: "snapshot", fmt: "%s\tm_Jumps=%d (min=-1 max=255)", aRawData, pObj->m_Jumps);
612 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
613 dbg_msg(sys: "snapshot", fmt: "%s\tm_TeleCheckpoint=%d", aRawData, pObj->m_TeleCheckpoint);
614 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
615 dbg_msg(sys: "snapshot", fmt: "%s\tm_StrongWeakId=%d (min=0 max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_StrongWeakId, (int)MAX_CLIENTS-1);
616 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
617 dbg_msg(sys: "snapshot", fmt: "%s\tm_JumpedTotal=%d (min=-1 max=255)", aRawData, pObj->m_JumpedTotal);
618 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 6, ((const int *)pData)[6], ((const int *)pData)[6]);
619 dbg_msg(sys: "snapshot", fmt: "%s\tm_NinjaActivationTick=%d (NetTick)", aRawData, pObj->m_NinjaActivationTick);
620 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 7, ((const int *)pData)[7], ((const int *)pData)[7]);
621 dbg_msg(sys: "snapshot", fmt: "%s\tm_FreezeStart=%d (NetTick)", aRawData, pObj->m_FreezeStart);
622 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 8, ((const int *)pData)[8], ((const int *)pData)[8]);
623 dbg_msg(sys: "snapshot", fmt: "%s\tm_TargetX=%d", aRawData, pObj->m_TargetX);
624 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 9, ((const int *)pData)[9], ((const int *)pData)[9]);
625 dbg_msg(sys: "snapshot", fmt: "%s\tm_TargetY=%d", aRawData, pObj->m_TargetY);
626 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 10, ((const int *)pData)[10], ((const int *)pData)[10]);
627 dbg_msg(sys: "snapshot", fmt: "%s\tm_TuneZoneOverride=%d (min=TuneZone::OVERRIDE_NONE(%d) max=TuneZone::NUM-1(%d))", aRawData, pObj->m_TuneZoneOverride, (int)TuneZone::OVERRIDE_NONE, (int)TuneZone::NUM-1);
628 return 0;
629 };
630
631 case NETOBJTYPE_DDNETPLAYER:
632 {
633 CNetObj_DDNetPlayer *pObj = (CNetObj_DDNetPlayer *)pData;
634 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
635 dbg_msg(sys: "snapshot", fmt: "%s\tm_Flags=%d", aRawData, pObj->m_Flags);
636 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
637 dbg_msg(sys: "snapshot", fmt: "%s\tm_AuthLevel=%d (min=AUTHED_NO(%d) max=AUTHED_ADMIN(%d))", aRawData, pObj->m_AuthLevel, (int)AUTHED_NO, (int)AUTHED_ADMIN);
638 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
639 dbg_msg(sys: "snapshot", fmt: "%s\tm_FinishTimeSeconds=%d (min=FinishTime::UNSET(%d) max=max_int(%d))", aRawData, pObj->m_FinishTimeSeconds, (int)FinishTime::UNSET, (int)max_int);
640 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
641 dbg_msg(sys: "snapshot", fmt: "%s\tm_FinishTimeMillis=%d (min=0 max=999)", aRawData, pObj->m_FinishTimeMillis);
642 return 0;
643 };
644
645 case NETOBJTYPE_GAMEINFOEX:
646 {
647 CNetObj_GameInfoEx *pObj = (CNetObj_GameInfoEx *)pData;
648 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
649 dbg_msg(sys: "snapshot", fmt: "%s\tm_Flags=%d", aRawData, pObj->m_Flags);
650 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
651 dbg_msg(sys: "snapshot", fmt: "%s\tm_Version=%d", aRawData, pObj->m_Version);
652 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
653 dbg_msg(sys: "snapshot", fmt: "%s\tm_Flags2=%d", aRawData, pObj->m_Flags2);
654 return 0;
655 };
656
657 case NETOBJTYPE_DDRACEPROJECTILE:
658 {
659 CNetObj_DDRaceProjectile *pObj = (CNetObj_DDRaceProjectile *)pData;
660 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
661 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
662 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
663 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
664 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
665 dbg_msg(sys: "snapshot", fmt: "%s\tm_Angle=%d", aRawData, pObj->m_Angle);
666 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
667 dbg_msg(sys: "snapshot", fmt: "%s\tm_Data=%d", aRawData, pObj->m_Data);
668 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
669 dbg_msg(sys: "snapshot", fmt: "%s\tm_Type=%d (min=0 max=NUM_WEAPONS-1(%d))", aRawData, pObj->m_Type, (int)NUM_WEAPONS-1);
670 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
671 dbg_msg(sys: "snapshot", fmt: "%s\tm_StartTick=%d (NetTick)", aRawData, pObj->m_StartTick);
672 return 0;
673 };
674
675 case NETOBJTYPE_DDNETLASER:
676 {
677 CNetObj_DDNetLaser *pObj = (CNetObj_DDNetLaser *)pData;
678 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
679 dbg_msg(sys: "snapshot", fmt: "%s\tm_ToX=%d", aRawData, pObj->m_ToX);
680 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
681 dbg_msg(sys: "snapshot", fmt: "%s\tm_ToY=%d", aRawData, pObj->m_ToY);
682 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
683 dbg_msg(sys: "snapshot", fmt: "%s\tm_FromX=%d", aRawData, pObj->m_FromX);
684 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
685 dbg_msg(sys: "snapshot", fmt: "%s\tm_FromY=%d", aRawData, pObj->m_FromY);
686 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
687 dbg_msg(sys: "snapshot", fmt: "%s\tm_StartTick=%d (NetTick)", aRawData, pObj->m_StartTick);
688 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
689 dbg_msg(sys: "snapshot", fmt: "%s\tm_Owner=%d (min=-1 max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_Owner, (int)MAX_CLIENTS-1);
690 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 6, ((const int *)pData)[6], ((const int *)pData)[6]);
691 dbg_msg(sys: "snapshot", fmt: "%s\tm_Type=%d", aRawData, pObj->m_Type);
692 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 7, ((const int *)pData)[7], ((const int *)pData)[7]);
693 dbg_msg(sys: "snapshot", fmt: "%s\tm_SwitchNumber=%d", aRawData, pObj->m_SwitchNumber);
694 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 8, ((const int *)pData)[8], ((const int *)pData)[8]);
695 dbg_msg(sys: "snapshot", fmt: "%s\tm_Subtype=%d", aRawData, pObj->m_Subtype);
696 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 9, ((const int *)pData)[9], ((const int *)pData)[9]);
697 dbg_msg(sys: "snapshot", fmt: "%s\tm_Flags=%d", aRawData, pObj->m_Flags);
698 return 0;
699 };
700
701 case NETOBJTYPE_DDNETPROJECTILE:
702 {
703 CNetObj_DDNetProjectile *pObj = (CNetObj_DDNetProjectile *)pData;
704 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
705 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
706 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
707 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
708 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
709 dbg_msg(sys: "snapshot", fmt: "%s\tm_VelX=%d", aRawData, pObj->m_VelX);
710 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
711 dbg_msg(sys: "snapshot", fmt: "%s\tm_VelY=%d", aRawData, pObj->m_VelY);
712 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
713 dbg_msg(sys: "snapshot", fmt: "%s\tm_Type=%d (min=0 max=NUM_WEAPONS-1(%d))", aRawData, pObj->m_Type, (int)NUM_WEAPONS-1);
714 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
715 dbg_msg(sys: "snapshot", fmt: "%s\tm_StartTick=%d (NetTick)", aRawData, pObj->m_StartTick);
716 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 6, ((const int *)pData)[6], ((const int *)pData)[6]);
717 dbg_msg(sys: "snapshot", fmt: "%s\tm_Owner=%d (min=-1 max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_Owner, (int)MAX_CLIENTS-1);
718 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 7, ((const int *)pData)[7], ((const int *)pData)[7]);
719 dbg_msg(sys: "snapshot", fmt: "%s\tm_SwitchNumber=%d", aRawData, pObj->m_SwitchNumber);
720 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 8, ((const int *)pData)[8], ((const int *)pData)[8]);
721 dbg_msg(sys: "snapshot", fmt: "%s\tm_TuneZone=%d", aRawData, pObj->m_TuneZone);
722 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 9, ((const int *)pData)[9], ((const int *)pData)[9]);
723 dbg_msg(sys: "snapshot", fmt: "%s\tm_Flags=%d", aRawData, pObj->m_Flags);
724 return 0;
725 };
726
727 case NETOBJTYPE_DDNETPICKUP:
728 {
729 CNetObj_DDNetPickup *pObj = (CNetObj_DDNetPickup *)pData;
730 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
731 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
732 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
733 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
734 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
735 dbg_msg(sys: "snapshot", fmt: "%s\tm_Type=%d (min=0 max=max_int(%d))", aRawData, pObj->m_Type, (int)max_int);
736 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
737 dbg_msg(sys: "snapshot", fmt: "%s\tm_Subtype=%d (min=0 max=max_int(%d))", aRawData, pObj->m_Subtype, (int)max_int);
738 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
739 dbg_msg(sys: "snapshot", fmt: "%s\tm_SwitchNumber=%d", aRawData, pObj->m_SwitchNumber);
740 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
741 dbg_msg(sys: "snapshot", fmt: "%s\tm_Flags=%d", aRawData, pObj->m_Flags);
742 return 0;
743 };
744
745 case NETOBJTYPE_DDNETSPECTATORINFO:
746 {
747 CNetObj_DDNetSpectatorInfo *pObj = (CNetObj_DDNetSpectatorInfo *)pData;
748 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
749 dbg_msg(sys: "snapshot", fmt: "%s\tm_HasCameraInfo=%d (min=0 max=1)", aRawData, pObj->m_HasCameraInfo);
750 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
751 dbg_msg(sys: "snapshot", fmt: "%s\tm_Zoom=%d (min=0 max=max_int(%d))", aRawData, pObj->m_Zoom, (int)max_int);
752 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
753 dbg_msg(sys: "snapshot", fmt: "%s\tm_Deadzone=%d (min=0 max=max_int(%d))", aRawData, pObj->m_Deadzone, (int)max_int);
754 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
755 dbg_msg(sys: "snapshot", fmt: "%s\tm_FollowFactor=%d (min=0 max=max_int(%d))", aRawData, pObj->m_FollowFactor, (int)max_int);
756 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
757 dbg_msg(sys: "snapshot", fmt: "%s\tm_SpectatorCount=%d (min=0 max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_SpectatorCount, (int)MAX_CLIENTS-1);
758 return 0;
759 };
760
761 case NETOBJTYPE_SPECTATORCOUNT:
762 {
763 CNetObj_SpectatorCount *pObj = (CNetObj_SpectatorCount *)pData;
764 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
765 dbg_msg(sys: "snapshot", fmt: "%s\tm_NumSpectators=%d (min=0 max=max_int(%d))", aRawData, pObj->m_NumSpectators, (int)max_int);
766 return 0;
767 };
768
769 case NETEVENTTYPE_COMMON:
770 {
771 CNetEvent_Common *pObj = (CNetEvent_Common *)pData;
772 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
773 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
774 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
775 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
776 return 0;
777 };
778
779 case NETEVENTTYPE_EXPLOSION:
780 {
781 CNetEvent_Explosion *pObj = (CNetEvent_Explosion *)pData;
782 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
783 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
784 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
785 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
786 return 0;
787 };
788
789 case NETEVENTTYPE_SPAWN:
790 {
791 CNetEvent_Spawn *pObj = (CNetEvent_Spawn *)pData;
792 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
793 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
794 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
795 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
796 return 0;
797 };
798
799 case NETEVENTTYPE_HAMMERHIT:
800 {
801 CNetEvent_HammerHit *pObj = (CNetEvent_HammerHit *)pData;
802 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
803 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
804 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
805 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
806 return 0;
807 };
808
809 case NETEVENTTYPE_DEATH:
810 {
811 CNetEvent_Death *pObj = (CNetEvent_Death *)pData;
812 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
813 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
814 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
815 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
816 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
817 dbg_msg(sys: "snapshot", fmt: "%s\tm_ClientId=%d (min=0 max=MAX_CLIENTS-1(%d))", aRawData, pObj->m_ClientId, (int)MAX_CLIENTS-1);
818 return 0;
819 };
820
821 case NETEVENTTYPE_SOUNDGLOBAL:
822 {
823 CNetEvent_SoundGlobal *pObj = (CNetEvent_SoundGlobal *)pData;
824 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
825 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
826 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
827 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
828 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
829 dbg_msg(sys: "snapshot", fmt: "%s\tm_SoundId=%d (min=0 max=NUM_SOUNDS-1(%d))", aRawData, pObj->m_SoundId, (int)NUM_SOUNDS-1);
830 return 0;
831 };
832
833 case NETEVENTTYPE_SOUNDWORLD:
834 {
835 CNetEvent_SoundWorld *pObj = (CNetEvent_SoundWorld *)pData;
836 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
837 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
838 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
839 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
840 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
841 dbg_msg(sys: "snapshot", fmt: "%s\tm_SoundId=%d (min=0 max=NUM_SOUNDS-1(%d))", aRawData, pObj->m_SoundId, (int)NUM_SOUNDS-1);
842 return 0;
843 };
844
845 case NETEVENTTYPE_DAMAGEIND:
846 {
847 CNetEvent_DamageInd *pObj = (CNetEvent_DamageInd *)pData;
848 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
849 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
850 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
851 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
852 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
853 dbg_msg(sys: "snapshot", fmt: "%s\tm_Angle=%d", aRawData, pObj->m_Angle);
854 return 0;
855 };
856
857 case NETEVENTTYPE_BIRTHDAY:
858 {
859 CNetEvent_Birthday *pObj = (CNetEvent_Birthday *)pData;
860 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
861 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
862 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
863 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
864 return 0;
865 };
866
867 case NETEVENTTYPE_FINISH:
868 {
869 CNetEvent_Finish *pObj = (CNetEvent_Finish *)pData;
870 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
871 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
872 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
873 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
874 return 0;
875 };
876
877 case NETOBJTYPE_MYOWNEVENT:
878 {
879 CNetObj_MyOwnEvent *pObj = (CNetObj_MyOwnEvent *)pData;
880 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
881 dbg_msg(sys: "snapshot", fmt: "%s\tm_Test=%d", aRawData, pObj->m_Test);
882 return 0;
883 };
884
885 case NETOBJTYPE_SPECCHAR:
886 {
887 CNetObj_SpecChar *pObj = (CNetObj_SpecChar *)pData;
888 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
889 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
890 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
891 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
892 return 0;
893 };
894
895 case NETOBJTYPE_SWITCHSTATE:
896 {
897 CNetObj_SwitchState *pObj = (CNetObj_SwitchState *)pData;
898 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
899 dbg_msg(sys: "snapshot", fmt: "%s\tm_HighestSwitchNumber=%d", aRawData, pObj->m_HighestSwitchNumber);
900 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
901 dbg_msg(sys: "snapshot", fmt: "%s\tm_aStatus[0]=%d", aRawData, pObj->m_aStatus[0]);
902 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
903 dbg_msg(sys: "snapshot", fmt: "%s\tm_aStatus[1]=%d", aRawData, pObj->m_aStatus[1]);
904 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 3, ((const int *)pData)[3], ((const int *)pData)[3]);
905 dbg_msg(sys: "snapshot", fmt: "%s\tm_aStatus[2]=%d", aRawData, pObj->m_aStatus[2]);
906 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 4, ((const int *)pData)[4], ((const int *)pData)[4]);
907 dbg_msg(sys: "snapshot", fmt: "%s\tm_aStatus[3]=%d", aRawData, pObj->m_aStatus[3]);
908 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 5, ((const int *)pData)[5], ((const int *)pData)[5]);
909 dbg_msg(sys: "snapshot", fmt: "%s\tm_aStatus[4]=%d", aRawData, pObj->m_aStatus[4]);
910 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 6, ((const int *)pData)[6], ((const int *)pData)[6]);
911 dbg_msg(sys: "snapshot", fmt: "%s\tm_aStatus[5]=%d", aRawData, pObj->m_aStatus[5]);
912 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 7, ((const int *)pData)[7], ((const int *)pData)[7]);
913 dbg_msg(sys: "snapshot", fmt: "%s\tm_aStatus[6]=%d", aRawData, pObj->m_aStatus[6]);
914 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 8, ((const int *)pData)[8], ((const int *)pData)[8]);
915 dbg_msg(sys: "snapshot", fmt: "%s\tm_aStatus[7]=%d", aRawData, pObj->m_aStatus[7]);
916 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 9, ((const int *)pData)[9], ((const int *)pData)[9]);
917 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSwitchNumbers[0]=%d", aRawData, pObj->m_aSwitchNumbers[0]);
918 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 10, ((const int *)pData)[10], ((const int *)pData)[10]);
919 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSwitchNumbers[1]=%d", aRawData, pObj->m_aSwitchNumbers[1]);
920 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 11, ((const int *)pData)[11], ((const int *)pData)[11]);
921 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSwitchNumbers[2]=%d", aRawData, pObj->m_aSwitchNumbers[2]);
922 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 12, ((const int *)pData)[12], ((const int *)pData)[12]);
923 dbg_msg(sys: "snapshot", fmt: "%s\tm_aSwitchNumbers[3]=%d", aRawData, pObj->m_aSwitchNumbers[3]);
924 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 13, ((const int *)pData)[13], ((const int *)pData)[13]);
925 dbg_msg(sys: "snapshot", fmt: "%s\tm_aEndTicks[0]=%d", aRawData, pObj->m_aEndTicks[0]);
926 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 14, ((const int *)pData)[14], ((const int *)pData)[14]);
927 dbg_msg(sys: "snapshot", fmt: "%s\tm_aEndTicks[1]=%d", aRawData, pObj->m_aEndTicks[1]);
928 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 15, ((const int *)pData)[15], ((const int *)pData)[15]);
929 dbg_msg(sys: "snapshot", fmt: "%s\tm_aEndTicks[2]=%d", aRawData, pObj->m_aEndTicks[2]);
930 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 16, ((const int *)pData)[16], ((const int *)pData)[16]);
931 dbg_msg(sys: "snapshot", fmt: "%s\tm_aEndTicks[3]=%d", aRawData, pObj->m_aEndTicks[3]);
932 return 0;
933 };
934
935 case NETOBJTYPE_ENTITYEX:
936 {
937 CNetObj_EntityEx *pObj = (CNetObj_EntityEx *)pData;
938 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
939 dbg_msg(sys: "snapshot", fmt: "%s\tm_SwitchNumber=%d", aRawData, pObj->m_SwitchNumber);
940 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
941 dbg_msg(sys: "snapshot", fmt: "%s\tm_Layer=%d", aRawData, pObj->m_Layer);
942 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
943 dbg_msg(sys: "snapshot", fmt: "%s\tm_EntityClass=%d", aRawData, pObj->m_EntityClass);
944 return 0;
945 };
946
947 case NETOBJTYPE_MAPBESTTIME:
948 {
949 CNetObj_MapBestTime *pObj = (CNetObj_MapBestTime *)pData;
950 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
951 dbg_msg(sys: "snapshot", fmt: "%s\tm_MapBestTimeSeconds=%d (min=FinishTime::NOT_FINISHED_MILLIS(%d) max=max_int(%d))", aRawData, pObj->m_MapBestTimeSeconds, (int)FinishTime::NOT_FINISHED_MILLIS, (int)max_int);
952 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
953 dbg_msg(sys: "snapshot", fmt: "%s\tm_MapBestTimeMillis=%d (min=0 max=999)", aRawData, pObj->m_MapBestTimeMillis);
954 return 0;
955 };
956
957 case NETEVENTTYPE_MAPSOUNDWORLD:
958 {
959 CNetEvent_MapSoundWorld *pObj = (CNetEvent_MapSoundWorld *)pData;
960 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 0, ((const int *)pData)[0], ((const int *)pData)[0]);
961 dbg_msg(sys: "snapshot", fmt: "%s\tm_X=%d", aRawData, pObj->m_X);
962 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 1, ((const int *)pData)[1], ((const int *)pData)[1]);
963 dbg_msg(sys: "snapshot", fmt: "%s\tm_Y=%d", aRawData, pObj->m_Y);
964 str_format(buffer: aRawData, buffer_size: sizeof(aRawData), format: "\t\t%3d %12d\t%08x", 2, ((const int *)pData)[2], ((const int *)pData)[2]);
965 dbg_msg(sys: "snapshot", fmt: "%s\tm_SoundId=%d", aRawData, pObj->m_SoundId);
966 return 0;
967 };
968
969 }
970 return -1;
971};
972
973void *CNetObjHandler::SecureUnpackObj(int Type, CUnpacker *pUnpacker)
974{
975 m_pObjFailedOn = 0;
976 switch(Type)
977 {
978 case NETOBJTYPE_EX:
979 {
980 const unsigned char *pPtr = pUnpacker->GetRaw(Size: sizeof(CUuid));
981 if(pPtr != 0)
982 {
983 mem_copy(dest: m_aUnpackedData, source: pPtr, size: sizeof(CUuid));
984 }
985 break;
986 }
987
988 case NETOBJTYPE_PLAYERINPUT:
989 {
990 CNetObj_PlayerInput *pData = (CNetObj_PlayerInput *)m_aUnpackedData;
991 pData->m_Direction = pUnpacker->GetUncompressedInt();
992 pData->m_TargetX = pUnpacker->GetUncompressedInt();
993 pData->m_TargetY = pUnpacker->GetUncompressedInt();
994 pData->m_Jump = pUnpacker->GetUncompressedInt();
995 pData->m_Fire = pUnpacker->GetUncompressedInt();
996 pData->m_Hook = pUnpacker->GetUncompressedInt();
997 pData->m_PlayerFlags = pUnpacker->GetUncompressedInt();
998 pData->m_WantedWeapon = pUnpacker->GetUncompressedInt();
999 pData->m_NextWeapon = pUnpacker->GetUncompressedInt();
1000 pData->m_PrevWeapon = pUnpacker->GetUncompressedInt();
1001 pData->m_PlayerFlags = ClampInt(pErrorMsg: "m_PlayerFlags", Value: pData->m_PlayerFlags, Min: 0, Max: 256);
1002 } break;
1003
1004 case NETOBJTYPE_PROJECTILE:
1005 {
1006 CNetObj_Projectile *pData = (CNetObj_Projectile *)m_aUnpackedData;
1007 pData->m_X = pUnpacker->GetUncompressedInt();
1008 pData->m_Y = pUnpacker->GetUncompressedInt();
1009 pData->m_VelX = pUnpacker->GetUncompressedInt();
1010 pData->m_VelY = pUnpacker->GetUncompressedInt();
1011 pData->m_Type = pUnpacker->GetUncompressedInt();
1012 pData->m_StartTick = pUnpacker->GetUncompressedInt();
1013 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: NUM_WEAPONS-1);
1014 } break;
1015
1016 case NETOBJTYPE_LASER:
1017 {
1018 CNetObj_Laser *pData = (CNetObj_Laser *)m_aUnpackedData;
1019 pData->m_X = pUnpacker->GetUncompressedInt();
1020 pData->m_Y = pUnpacker->GetUncompressedInt();
1021 pData->m_FromX = pUnpacker->GetUncompressedInt();
1022 pData->m_FromY = pUnpacker->GetUncompressedInt();
1023 pData->m_StartTick = pUnpacker->GetUncompressedInt();
1024 } break;
1025
1026 case NETOBJTYPE_PICKUP:
1027 {
1028 CNetObj_Pickup *pData = (CNetObj_Pickup *)m_aUnpackedData;
1029 pData->m_X = pUnpacker->GetUncompressedInt();
1030 pData->m_Y = pUnpacker->GetUncompressedInt();
1031 pData->m_Type = pUnpacker->GetUncompressedInt();
1032 pData->m_Subtype = pUnpacker->GetUncompressedInt();
1033 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: max_int);
1034 pData->m_Subtype = ClampInt(pErrorMsg: "m_Subtype", Value: pData->m_Subtype, Min: 0, Max: max_int);
1035 } break;
1036
1037 case NETOBJTYPE_FLAG:
1038 {
1039 CNetObj_Flag *pData = (CNetObj_Flag *)m_aUnpackedData;
1040 pData->m_X = pUnpacker->GetUncompressedInt();
1041 pData->m_Y = pUnpacker->GetUncompressedInt();
1042 pData->m_Team = pUnpacker->GetUncompressedInt();
1043 pData->m_Team = ClampInt(pErrorMsg: "m_Team", Value: pData->m_Team, Min: TEAM_RED, Max: TEAM_BLUE);
1044 } break;
1045
1046 case NETOBJTYPE_GAMEINFO:
1047 {
1048 CNetObj_GameInfo *pData = (CNetObj_GameInfo *)m_aUnpackedData;
1049 pData->m_GameFlags = pUnpacker->GetUncompressedInt();
1050 pData->m_GameStateFlags = pUnpacker->GetUncompressedInt();
1051 pData->m_RoundStartTick = pUnpacker->GetUncompressedInt();
1052 pData->m_WarmupTimer = pUnpacker->GetUncompressedInt();
1053 pData->m_ScoreLimit = pUnpacker->GetUncompressedInt();
1054 pData->m_TimeLimit = pUnpacker->GetUncompressedInt();
1055 pData->m_RoundNum = pUnpacker->GetUncompressedInt();
1056 pData->m_RoundCurrent = pUnpacker->GetUncompressedInt();
1057 pData->m_GameFlags = ClampInt(pErrorMsg: "m_GameFlags", Value: pData->m_GameFlags, Min: 0, Max: 256);
1058 pData->m_GameStateFlags = ClampInt(pErrorMsg: "m_GameStateFlags", Value: pData->m_GameStateFlags, Min: 0, Max: 256);
1059 pData->m_WarmupTimer = ClampInt(pErrorMsg: "m_WarmupTimer", Value: pData->m_WarmupTimer, Min: min_int, Max: max_int);
1060 pData->m_ScoreLimit = ClampInt(pErrorMsg: "m_ScoreLimit", Value: pData->m_ScoreLimit, Min: 0, Max: max_int);
1061 pData->m_TimeLimit = ClampInt(pErrorMsg: "m_TimeLimit", Value: pData->m_TimeLimit, Min: 0, Max: max_int);
1062 pData->m_RoundNum = ClampInt(pErrorMsg: "m_RoundNum", Value: pData->m_RoundNum, Min: 0, Max: max_int);
1063 pData->m_RoundCurrent = ClampInt(pErrorMsg: "m_RoundCurrent", Value: pData->m_RoundCurrent, Min: 0, Max: max_int);
1064 } break;
1065
1066 case NETOBJTYPE_GAMEDATA:
1067 {
1068 CNetObj_GameData *pData = (CNetObj_GameData *)m_aUnpackedData;
1069 pData->m_TeamscoreRed = pUnpacker->GetUncompressedInt();
1070 pData->m_TeamscoreBlue = pUnpacker->GetUncompressedInt();
1071 pData->m_FlagCarrierRed = pUnpacker->GetUncompressedInt();
1072 pData->m_FlagCarrierBlue = pUnpacker->GetUncompressedInt();
1073 pData->m_FlagCarrierRed = ClampInt(pErrorMsg: "m_FlagCarrierRed", Value: pData->m_FlagCarrierRed, Min: FLAG_MISSING, Max: MAX_CLIENTS-1);
1074 pData->m_FlagCarrierBlue = ClampInt(pErrorMsg: "m_FlagCarrierBlue", Value: pData->m_FlagCarrierBlue, Min: FLAG_MISSING, Max: MAX_CLIENTS-1);
1075 } break;
1076
1077 case NETOBJTYPE_CHARACTERCORE:
1078 {
1079 CNetObj_CharacterCore *pData = (CNetObj_CharacterCore *)m_aUnpackedData;
1080 pData->m_Tick = pUnpacker->GetUncompressedInt();
1081 pData->m_X = pUnpacker->GetUncompressedInt();
1082 pData->m_Y = pUnpacker->GetUncompressedInt();
1083 pData->m_VelX = pUnpacker->GetUncompressedInt();
1084 pData->m_VelY = pUnpacker->GetUncompressedInt();
1085 pData->m_Angle = pUnpacker->GetUncompressedInt();
1086 pData->m_Direction = pUnpacker->GetUncompressedInt();
1087 pData->m_Jumped = pUnpacker->GetUncompressedInt();
1088 pData->m_HookedPlayer = pUnpacker->GetUncompressedInt();
1089 pData->m_HookState = pUnpacker->GetUncompressedInt();
1090 pData->m_HookTick = pUnpacker->GetUncompressedInt();
1091 pData->m_HookX = pUnpacker->GetUncompressedInt();
1092 pData->m_HookY = pUnpacker->GetUncompressedInt();
1093 pData->m_HookDx = pUnpacker->GetUncompressedInt();
1094 pData->m_HookDy = pUnpacker->GetUncompressedInt();
1095 pData->m_Direction = ClampInt(pErrorMsg: "m_Direction", Value: pData->m_Direction, Min: -1, Max: 1);
1096 pData->m_Jumped = ClampInt(pErrorMsg: "m_Jumped", Value: pData->m_Jumped, Min: 0, Max: 3);
1097 pData->m_HookedPlayer = ClampInt(pErrorMsg: "m_HookedPlayer", Value: pData->m_HookedPlayer, Min: -1, Max: MAX_CLIENTS-1);
1098 pData->m_HookState = ClampInt(pErrorMsg: "m_HookState", Value: pData->m_HookState, Min: -1, Max: 5);
1099 } break;
1100
1101 case NETOBJTYPE_CHARACTER:
1102 {
1103 CNetObj_Character *pData = (CNetObj_Character *)m_aUnpackedData;
1104 pData->m_Tick = pUnpacker->GetUncompressedInt();
1105 pData->m_X = pUnpacker->GetUncompressedInt();
1106 pData->m_Y = pUnpacker->GetUncompressedInt();
1107 pData->m_VelX = pUnpacker->GetUncompressedInt();
1108 pData->m_VelY = pUnpacker->GetUncompressedInt();
1109 pData->m_Angle = pUnpacker->GetUncompressedInt();
1110 pData->m_Direction = pUnpacker->GetUncompressedInt();
1111 pData->m_Jumped = pUnpacker->GetUncompressedInt();
1112 pData->m_HookedPlayer = pUnpacker->GetUncompressedInt();
1113 pData->m_HookState = pUnpacker->GetUncompressedInt();
1114 pData->m_HookTick = pUnpacker->GetUncompressedInt();
1115 pData->m_HookX = pUnpacker->GetUncompressedInt();
1116 pData->m_HookY = pUnpacker->GetUncompressedInt();
1117 pData->m_HookDx = pUnpacker->GetUncompressedInt();
1118 pData->m_HookDy = pUnpacker->GetUncompressedInt();
1119 pData->m_PlayerFlags = pUnpacker->GetUncompressedInt();
1120 pData->m_Health = pUnpacker->GetUncompressedInt();
1121 pData->m_Armor = pUnpacker->GetUncompressedInt();
1122 pData->m_AmmoCount = pUnpacker->GetUncompressedInt();
1123 pData->m_Weapon = pUnpacker->GetUncompressedInt();
1124 pData->m_Emote = pUnpacker->GetUncompressedInt();
1125 pData->m_AttackTick = pUnpacker->GetUncompressedInt();
1126 pData->m_Direction = ClampInt(pErrorMsg: "m_Direction", Value: pData->m_Direction, Min: -1, Max: 1);
1127 pData->m_Jumped = ClampInt(pErrorMsg: "m_Jumped", Value: pData->m_Jumped, Min: 0, Max: 3);
1128 pData->m_HookedPlayer = ClampInt(pErrorMsg: "m_HookedPlayer", Value: pData->m_HookedPlayer, Min: -1, Max: MAX_CLIENTS-1);
1129 pData->m_HookState = ClampInt(pErrorMsg: "m_HookState", Value: pData->m_HookState, Min: -1, Max: 5);
1130 pData->m_PlayerFlags = ClampInt(pErrorMsg: "m_PlayerFlags", Value: pData->m_PlayerFlags, Min: 0, Max: 256);
1131 pData->m_Health = ClampInt(pErrorMsg: "m_Health", Value: pData->m_Health, Min: 0, Max: 10);
1132 pData->m_Armor = ClampInt(pErrorMsg: "m_Armor", Value: pData->m_Armor, Min: 0, Max: 10);
1133 pData->m_AmmoCount = ClampInt(pErrorMsg: "m_AmmoCount", Value: pData->m_AmmoCount, Min: -1, Max: 10);
1134 pData->m_Weapon = ClampInt(pErrorMsg: "m_Weapon", Value: pData->m_Weapon, Min: -1, Max: NUM_WEAPONS-1);
1135 pData->m_Emote = ClampInt(pErrorMsg: "m_Emote", Value: pData->m_Emote, Min: 0, Max: 6);
1136 pData->m_AttackTick = ClampInt(pErrorMsg: "m_AttackTick", Value: pData->m_AttackTick, Min: 0, Max: max_int);
1137 } break;
1138
1139 case NETOBJTYPE_PLAYERINFO:
1140 {
1141 CNetObj_PlayerInfo *pData = (CNetObj_PlayerInfo *)m_aUnpackedData;
1142 pData->m_Local = pUnpacker->GetUncompressedInt();
1143 pData->m_ClientId = pUnpacker->GetUncompressedInt();
1144 pData->m_Team = pUnpacker->GetUncompressedInt();
1145 pData->m_Score = pUnpacker->GetUncompressedInt();
1146 pData->m_Latency = pUnpacker->GetUncompressedInt();
1147 pData->m_Local = ClampInt(pErrorMsg: "m_Local", Value: pData->m_Local, Min: 0, Max: 1);
1148 pData->m_ClientId = ClampInt(pErrorMsg: "m_ClientId", Value: pData->m_ClientId, Min: 0, Max: MAX_CLIENTS-1);
1149 pData->m_Team = ClampInt(pErrorMsg: "m_Team", Value: pData->m_Team, Min: TEAM_SPECTATORS, Max: TEAM_BLUE);
1150 } break;
1151
1152 case NETOBJTYPE_CLIENTINFO:
1153 {
1154 CNetObj_ClientInfo *pData = (CNetObj_ClientInfo *)m_aUnpackedData;
1155 pData->m_aName[0] = pUnpacker->GetUncompressedInt();
1156 pData->m_aName[1] = pUnpacker->GetUncompressedInt();
1157 pData->m_aName[2] = pUnpacker->GetUncompressedInt();
1158 pData->m_aName[3] = pUnpacker->GetUncompressedInt();
1159 pData->m_aClan[0] = pUnpacker->GetUncompressedInt();
1160 pData->m_aClan[1] = pUnpacker->GetUncompressedInt();
1161 pData->m_aClan[2] = pUnpacker->GetUncompressedInt();
1162 pData->m_Country = pUnpacker->GetUncompressedInt();
1163 pData->m_aSkin[0] = pUnpacker->GetUncompressedInt();
1164 pData->m_aSkin[1] = pUnpacker->GetUncompressedInt();
1165 pData->m_aSkin[2] = pUnpacker->GetUncompressedInt();
1166 pData->m_aSkin[3] = pUnpacker->GetUncompressedInt();
1167 pData->m_aSkin[4] = pUnpacker->GetUncompressedInt();
1168 pData->m_aSkin[5] = pUnpacker->GetUncompressedInt();
1169 pData->m_UseCustomColor = pUnpacker->GetUncompressedInt();
1170 pData->m_ColorBody = pUnpacker->GetUncompressedInt();
1171 pData->m_ColorFeet = pUnpacker->GetUncompressedInt();
1172 pData->m_UseCustomColor = ClampInt(pErrorMsg: "m_UseCustomColor", Value: pData->m_UseCustomColor, Min: 0, Max: 1);
1173 } break;
1174
1175 case NETOBJTYPE_SPECTATORINFO:
1176 {
1177 CNetObj_SpectatorInfo *pData = (CNetObj_SpectatorInfo *)m_aUnpackedData;
1178 pData->m_SpectatorId = pUnpacker->GetUncompressedInt();
1179 pData->m_X = pUnpacker->GetUncompressedInt();
1180 pData->m_Y = pUnpacker->GetUncompressedInt();
1181 pData->m_SpectatorId = ClampInt(pErrorMsg: "m_SpectatorId", Value: pData->m_SpectatorId, Min: SPEC_FREEVIEW, Max: MAX_CLIENTS-1);
1182 } break;
1183
1184 case NETOBJTYPE_MYOWNOBJECT:
1185 {
1186 CNetObj_MyOwnObject *pData = (CNetObj_MyOwnObject *)m_aUnpackedData;
1187 pData->m_Test = pUnpacker->GetUncompressedInt();
1188 } break;
1189
1190 case NETOBJTYPE_DDNETCHARACTER:
1191 {
1192 CNetObj_DDNetCharacter *pData = (CNetObj_DDNetCharacter *)m_aUnpackedData;
1193 pData->m_Flags = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1194 pData->m_FreezeEnd = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1195 pData->m_Jumps = pUnpacker->GetUncompressedIntOrDefault(Default: 2);
1196 pData->m_TeleCheckpoint = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
1197 pData->m_StrongWeakId = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1198 pData->m_JumpedTotal = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
1199 pData->m_NinjaActivationTick = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
1200 pData->m_FreezeStart = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
1201 pData->m_TargetX = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1202 pData->m_TargetY = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1203 pData->m_TuneZoneOverride = pUnpacker->GetUncompressedIntOrDefault(Default: TuneZone::OVERRIDE_NONE);
1204 pData->m_Jumps = ClampInt(pErrorMsg: "m_Jumps", Value: pData->m_Jumps, Min: -1, Max: 255);
1205 pData->m_StrongWeakId = ClampInt(pErrorMsg: "m_StrongWeakId", Value: pData->m_StrongWeakId, Min: 0, Max: MAX_CLIENTS-1);
1206 pData->m_JumpedTotal = ClampInt(pErrorMsg: "m_JumpedTotal", Value: pData->m_JumpedTotal, Min: -1, Max: 255);
1207 pData->m_TuneZoneOverride = ClampInt(pErrorMsg: "m_TuneZoneOverride", Value: pData->m_TuneZoneOverride, Min: TuneZone::OVERRIDE_NONE, Max: TuneZone::NUM-1);
1208 } break;
1209
1210 case NETOBJTYPE_DDNETPLAYER:
1211 {
1212 CNetObj_DDNetPlayer *pData = (CNetObj_DDNetPlayer *)m_aUnpackedData;
1213 pData->m_Flags = pUnpacker->GetUncompressedInt();
1214 pData->m_AuthLevel = pUnpacker->GetUncompressedInt();
1215 pData->m_FinishTimeSeconds = pUnpacker->GetUncompressedIntOrDefault(Default: FinishTime::UNSET);
1216 pData->m_FinishTimeMillis = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1217 pData->m_AuthLevel = ClampInt(pErrorMsg: "m_AuthLevel", Value: pData->m_AuthLevel, Min: AUTHED_NO, Max: AUTHED_ADMIN);
1218 pData->m_FinishTimeSeconds = ClampInt(pErrorMsg: "m_FinishTimeSeconds", Value: pData->m_FinishTimeSeconds, Min: FinishTime::UNSET, Max: max_int);
1219 pData->m_FinishTimeMillis = ClampInt(pErrorMsg: "m_FinishTimeMillis", Value: pData->m_FinishTimeMillis, Min: 0, Max: 999);
1220 } break;
1221
1222 case NETOBJTYPE_GAMEINFOEX:
1223 {
1224 CNetObj_GameInfoEx *pData = (CNetObj_GameInfoEx *)m_aUnpackedData;
1225 pData->m_Flags = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1226 pData->m_Version = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1227 pData->m_Flags2 = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1228 } break;
1229
1230 case NETOBJTYPE_DDRACEPROJECTILE:
1231 {
1232 CNetObj_DDRaceProjectile *pData = (CNetObj_DDRaceProjectile *)m_aUnpackedData;
1233 pData->m_X = pUnpacker->GetUncompressedInt();
1234 pData->m_Y = pUnpacker->GetUncompressedInt();
1235 pData->m_Angle = pUnpacker->GetUncompressedInt();
1236 pData->m_Data = pUnpacker->GetUncompressedInt();
1237 pData->m_Type = pUnpacker->GetUncompressedInt();
1238 pData->m_StartTick = pUnpacker->GetUncompressedInt();
1239 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: NUM_WEAPONS-1);
1240 } break;
1241
1242 case NETOBJTYPE_DDNETLASER:
1243 {
1244 CNetObj_DDNetLaser *pData = (CNetObj_DDNetLaser *)m_aUnpackedData;
1245 pData->m_ToX = pUnpacker->GetUncompressedInt();
1246 pData->m_ToY = pUnpacker->GetUncompressedInt();
1247 pData->m_FromX = pUnpacker->GetUncompressedInt();
1248 pData->m_FromY = pUnpacker->GetUncompressedInt();
1249 pData->m_StartTick = pUnpacker->GetUncompressedInt();
1250 pData->m_Owner = pUnpacker->GetUncompressedInt();
1251 pData->m_Type = pUnpacker->GetUncompressedInt();
1252 pData->m_SwitchNumber = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
1253 pData->m_Subtype = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
1254 pData->m_Flags = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1255 pData->m_Owner = ClampInt(pErrorMsg: "m_Owner", Value: pData->m_Owner, Min: -1, Max: MAX_CLIENTS-1);
1256 } break;
1257
1258 case NETOBJTYPE_DDNETPROJECTILE:
1259 {
1260 CNetObj_DDNetProjectile *pData = (CNetObj_DDNetProjectile *)m_aUnpackedData;
1261 pData->m_X = pUnpacker->GetUncompressedInt();
1262 pData->m_Y = pUnpacker->GetUncompressedInt();
1263 pData->m_VelX = pUnpacker->GetUncompressedInt();
1264 pData->m_VelY = pUnpacker->GetUncompressedInt();
1265 pData->m_Type = pUnpacker->GetUncompressedInt();
1266 pData->m_StartTick = pUnpacker->GetUncompressedInt();
1267 pData->m_Owner = pUnpacker->GetUncompressedInt();
1268 pData->m_SwitchNumber = pUnpacker->GetUncompressedInt();
1269 pData->m_TuneZone = pUnpacker->GetUncompressedInt();
1270 pData->m_Flags = pUnpacker->GetUncompressedInt();
1271 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: NUM_WEAPONS-1);
1272 pData->m_Owner = ClampInt(pErrorMsg: "m_Owner", Value: pData->m_Owner, Min: -1, Max: MAX_CLIENTS-1);
1273 } break;
1274
1275 case NETOBJTYPE_DDNETPICKUP:
1276 {
1277 CNetObj_DDNetPickup *pData = (CNetObj_DDNetPickup *)m_aUnpackedData;
1278 pData->m_X = pUnpacker->GetUncompressedInt();
1279 pData->m_Y = pUnpacker->GetUncompressedInt();
1280 pData->m_Type = pUnpacker->GetUncompressedInt();
1281 pData->m_Subtype = pUnpacker->GetUncompressedInt();
1282 pData->m_SwitchNumber = pUnpacker->GetUncompressedInt();
1283 pData->m_Flags = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1284 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: max_int);
1285 pData->m_Subtype = ClampInt(pErrorMsg: "m_Subtype", Value: pData->m_Subtype, Min: 0, Max: max_int);
1286 } break;
1287
1288 case NETOBJTYPE_DDNETSPECTATORINFO:
1289 {
1290 CNetObj_DDNetSpectatorInfo *pData = (CNetObj_DDNetSpectatorInfo *)m_aUnpackedData;
1291 pData->m_HasCameraInfo = pUnpacker->GetUncompressedInt();
1292 pData->m_Zoom = pUnpacker->GetUncompressedInt();
1293 pData->m_Deadzone = pUnpacker->GetUncompressedInt();
1294 pData->m_FollowFactor = pUnpacker->GetUncompressedInt();
1295 pData->m_SpectatorCount = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1296 pData->m_HasCameraInfo = ClampInt(pErrorMsg: "m_HasCameraInfo", Value: pData->m_HasCameraInfo, Min: 0, Max: 1);
1297 pData->m_Zoom = ClampInt(pErrorMsg: "m_Zoom", Value: pData->m_Zoom, Min: 0, Max: max_int);
1298 pData->m_Deadzone = ClampInt(pErrorMsg: "m_Deadzone", Value: pData->m_Deadzone, Min: 0, Max: max_int);
1299 pData->m_FollowFactor = ClampInt(pErrorMsg: "m_FollowFactor", Value: pData->m_FollowFactor, Min: 0, Max: max_int);
1300 pData->m_SpectatorCount = ClampInt(pErrorMsg: "m_SpectatorCount", Value: pData->m_SpectatorCount, Min: 0, Max: MAX_CLIENTS-1);
1301 } break;
1302
1303 case NETOBJTYPE_SPECTATORCOUNT:
1304 {
1305 CNetObj_SpectatorCount *pData = (CNetObj_SpectatorCount *)m_aUnpackedData;
1306 pData->m_NumSpectators = pUnpacker->GetUncompressedInt();
1307 pData->m_NumSpectators = ClampInt(pErrorMsg: "m_NumSpectators", Value: pData->m_NumSpectators, Min: 0, Max: max_int);
1308 } break;
1309
1310 case NETEVENTTYPE_COMMON:
1311 {
1312 CNetEvent_Common *pData = (CNetEvent_Common *)m_aUnpackedData;
1313 pData->m_X = pUnpacker->GetUncompressedInt();
1314 pData->m_Y = pUnpacker->GetUncompressedInt();
1315 } break;
1316
1317 case NETEVENTTYPE_EXPLOSION:
1318 {
1319 CNetEvent_Explosion *pData = (CNetEvent_Explosion *)m_aUnpackedData;
1320 pData->m_X = pUnpacker->GetUncompressedInt();
1321 pData->m_Y = pUnpacker->GetUncompressedInt();
1322 } break;
1323
1324 case NETEVENTTYPE_SPAWN:
1325 {
1326 CNetEvent_Spawn *pData = (CNetEvent_Spawn *)m_aUnpackedData;
1327 pData->m_X = pUnpacker->GetUncompressedInt();
1328 pData->m_Y = pUnpacker->GetUncompressedInt();
1329 } break;
1330
1331 case NETEVENTTYPE_HAMMERHIT:
1332 {
1333 CNetEvent_HammerHit *pData = (CNetEvent_HammerHit *)m_aUnpackedData;
1334 pData->m_X = pUnpacker->GetUncompressedInt();
1335 pData->m_Y = pUnpacker->GetUncompressedInt();
1336 } break;
1337
1338 case NETEVENTTYPE_DEATH:
1339 {
1340 CNetEvent_Death *pData = (CNetEvent_Death *)m_aUnpackedData;
1341 pData->m_X = pUnpacker->GetUncompressedInt();
1342 pData->m_Y = pUnpacker->GetUncompressedInt();
1343 pData->m_ClientId = pUnpacker->GetUncompressedInt();
1344 pData->m_ClientId = ClampInt(pErrorMsg: "m_ClientId", Value: pData->m_ClientId, Min: 0, Max: MAX_CLIENTS-1);
1345 } break;
1346
1347 case NETEVENTTYPE_SOUNDGLOBAL:
1348 {
1349 CNetEvent_SoundGlobal *pData = (CNetEvent_SoundGlobal *)m_aUnpackedData;
1350 pData->m_X = pUnpacker->GetUncompressedInt();
1351 pData->m_Y = pUnpacker->GetUncompressedInt();
1352 pData->m_SoundId = pUnpacker->GetUncompressedInt();
1353 pData->m_SoundId = ClampInt(pErrorMsg: "m_SoundId", Value: pData->m_SoundId, Min: 0, Max: NUM_SOUNDS-1);
1354 } break;
1355
1356 case NETEVENTTYPE_SOUNDWORLD:
1357 {
1358 CNetEvent_SoundWorld *pData = (CNetEvent_SoundWorld *)m_aUnpackedData;
1359 pData->m_X = pUnpacker->GetUncompressedInt();
1360 pData->m_Y = pUnpacker->GetUncompressedInt();
1361 pData->m_SoundId = pUnpacker->GetUncompressedInt();
1362 pData->m_SoundId = ClampInt(pErrorMsg: "m_SoundId", Value: pData->m_SoundId, Min: 0, Max: NUM_SOUNDS-1);
1363 } break;
1364
1365 case NETEVENTTYPE_DAMAGEIND:
1366 {
1367 CNetEvent_DamageInd *pData = (CNetEvent_DamageInd *)m_aUnpackedData;
1368 pData->m_X = pUnpacker->GetUncompressedInt();
1369 pData->m_Y = pUnpacker->GetUncompressedInt();
1370 pData->m_Angle = pUnpacker->GetUncompressedInt();
1371 } break;
1372
1373 case NETEVENTTYPE_BIRTHDAY:
1374 {
1375 CNetEvent_Birthday *pData = (CNetEvent_Birthday *)m_aUnpackedData;
1376 pData->m_X = pUnpacker->GetUncompressedInt();
1377 pData->m_Y = pUnpacker->GetUncompressedInt();
1378 } break;
1379
1380 case NETEVENTTYPE_FINISH:
1381 {
1382 CNetEvent_Finish *pData = (CNetEvent_Finish *)m_aUnpackedData;
1383 pData->m_X = pUnpacker->GetUncompressedInt();
1384 pData->m_Y = pUnpacker->GetUncompressedInt();
1385 } break;
1386
1387 case NETOBJTYPE_MYOWNEVENT:
1388 {
1389 CNetObj_MyOwnEvent *pData = (CNetObj_MyOwnEvent *)m_aUnpackedData;
1390 pData->m_Test = pUnpacker->GetUncompressedInt();
1391 } break;
1392
1393 case NETOBJTYPE_SPECCHAR:
1394 {
1395 CNetObj_SpecChar *pData = (CNetObj_SpecChar *)m_aUnpackedData;
1396 pData->m_X = pUnpacker->GetUncompressedInt();
1397 pData->m_Y = pUnpacker->GetUncompressedInt();
1398 } break;
1399
1400 case NETOBJTYPE_SWITCHSTATE:
1401 {
1402 CNetObj_SwitchState *pData = (CNetObj_SwitchState *)m_aUnpackedData;
1403 pData->m_HighestSwitchNumber = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1404 pData->m_aStatus[0] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1405 pData->m_aStatus[1] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1406 pData->m_aStatus[2] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1407 pData->m_aStatus[3] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1408 pData->m_aStatus[4] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1409 pData->m_aStatus[5] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1410 pData->m_aStatus[6] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1411 pData->m_aStatus[7] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1412 pData->m_aSwitchNumbers[0] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1413 pData->m_aSwitchNumbers[1] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1414 pData->m_aSwitchNumbers[2] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1415 pData->m_aSwitchNumbers[3] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1416 pData->m_aEndTicks[0] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1417 pData->m_aEndTicks[1] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1418 pData->m_aEndTicks[2] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1419 pData->m_aEndTicks[3] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
1420 } break;
1421
1422 case NETOBJTYPE_ENTITYEX:
1423 {
1424 CNetObj_EntityEx *pData = (CNetObj_EntityEx *)m_aUnpackedData;
1425 pData->m_SwitchNumber = pUnpacker->GetUncompressedInt();
1426 pData->m_Layer = pUnpacker->GetUncompressedInt();
1427 pData->m_EntityClass = pUnpacker->GetUncompressedInt();
1428 } break;
1429
1430 case NETOBJTYPE_MAPBESTTIME:
1431 {
1432 CNetObj_MapBestTime *pData = (CNetObj_MapBestTime *)m_aUnpackedData;
1433 pData->m_MapBestTimeSeconds = pUnpacker->GetUncompressedInt();
1434 pData->m_MapBestTimeMillis = pUnpacker->GetUncompressedInt();
1435 pData->m_MapBestTimeSeconds = ClampInt(pErrorMsg: "m_MapBestTimeSeconds", Value: pData->m_MapBestTimeSeconds, Min: FinishTime::NOT_FINISHED_MILLIS, Max: max_int);
1436 pData->m_MapBestTimeMillis = ClampInt(pErrorMsg: "m_MapBestTimeMillis", Value: pData->m_MapBestTimeMillis, Min: 0, Max: 999);
1437 } break;
1438
1439 case NETEVENTTYPE_MAPSOUNDWORLD:
1440 {
1441 CNetEvent_MapSoundWorld *pData = (CNetEvent_MapSoundWorld *)m_aUnpackedData;
1442 pData->m_X = pUnpacker->GetUncompressedInt();
1443 pData->m_Y = pUnpacker->GetUncompressedInt();
1444 pData->m_SoundId = pUnpacker->GetUncompressedInt();
1445 } break;
1446
1447 default:
1448 m_pObjFailedOn = "(type out of range)";
1449 break;
1450 }
1451
1452 if(pUnpacker->Error())
1453 m_pObjFailedOn = "(unpack error)";
1454
1455 if(m_pObjFailedOn)
1456 return 0;
1457 m_pObjFailedOn = "";
1458 return m_aUnpackedData;
1459}
1460
1461void *CNetObjHandler::SecureUnpackMsg(int Type, CUnpacker *pUnpacker)
1462{
1463 m_pMsgFailedOn = 0;
1464 switch(Type)
1465 {
1466
1467 case NETMSGTYPE_SV_MOTD:
1468 {
1469 CNetMsg_Sv_Motd *pData = (CNetMsg_Sv_Motd *)m_aUnpackedData;
1470 pData->m_pMessage = pUnpacker->GetString();
1471 } break;
1472
1473 case NETMSGTYPE_SV_BROADCAST:
1474 {
1475 CNetMsg_Sv_Broadcast *pData = (CNetMsg_Sv_Broadcast *)m_aUnpackedData;
1476 pData->m_pMessage = pUnpacker->GetString();
1477 } break;
1478
1479 case NETMSGTYPE_SV_CHAT:
1480 {
1481 CNetMsg_Sv_Chat *pData = (CNetMsg_Sv_Chat *)m_aUnpackedData;
1482 pData->m_Team = pUnpacker->GetInt();
1483 pData->m_ClientId = pUnpacker->GetInt();
1484 pData->m_pMessage = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC);
1485 if(pData->m_Team < -2 || pData->m_Team > 3) { m_pMsgFailedOn = "m_Team"; break; }
1486 if(pData->m_ClientId < -1 || pData->m_ClientId > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_ClientId"; break; }
1487 } break;
1488
1489 case NETMSGTYPE_SV_KILLMSG:
1490 {
1491 CNetMsg_Sv_KillMsg *pData = (CNetMsg_Sv_KillMsg *)m_aUnpackedData;
1492 pData->m_Killer = pUnpacker->GetInt();
1493 pData->m_Victim = pUnpacker->GetInt();
1494 pData->m_Weapon = pUnpacker->GetInt();
1495 pData->m_ModeSpecial = pUnpacker->GetInt();
1496 if(pData->m_Killer < 0 || pData->m_Killer > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_Killer"; break; }
1497 if(pData->m_Victim < 0 || pData->m_Victim > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_Victim"; break; }
1498 if(pData->m_Weapon < WEAPON_GAME || pData->m_Weapon > NUM_WEAPONS-1) { m_pMsgFailedOn = "m_Weapon"; break; }
1499 } break;
1500
1501 case NETMSGTYPE_SV_SOUNDGLOBAL:
1502 {
1503 CNetMsg_Sv_SoundGlobal *pData = (CNetMsg_Sv_SoundGlobal *)m_aUnpackedData;
1504 pData->m_SoundId = pUnpacker->GetInt();
1505 if(pData->m_SoundId < 0 || pData->m_SoundId > NUM_SOUNDS-1) { m_pMsgFailedOn = "m_SoundId"; break; }
1506 } break;
1507
1508 case NETMSGTYPE_SV_TUNEPARAMS:
1509 {
1510 CNetMsg_Sv_TuneParams *pData = (CNetMsg_Sv_TuneParams *)m_aUnpackedData;
1511 (void)pData;
1512 } break;
1513
1514 case NETMSGTYPE_UNUSED:
1515 {
1516 CNetMsg_Unused *pData = (CNetMsg_Unused *)m_aUnpackedData;
1517 (void)pData;
1518 } break;
1519
1520 case NETMSGTYPE_SV_READYTOENTER:
1521 {
1522 CNetMsg_Sv_ReadyToEnter *pData = (CNetMsg_Sv_ReadyToEnter *)m_aUnpackedData;
1523 (void)pData;
1524 } break;
1525
1526 case NETMSGTYPE_SV_WEAPONPICKUP:
1527 {
1528 CNetMsg_Sv_WeaponPickup *pData = (CNetMsg_Sv_WeaponPickup *)m_aUnpackedData;
1529 pData->m_Weapon = pUnpacker->GetInt();
1530 if(pData->m_Weapon < 0 || pData->m_Weapon > NUM_WEAPONS-1) { m_pMsgFailedOn = "m_Weapon"; break; }
1531 } break;
1532
1533 case NETMSGTYPE_SV_EMOTICON:
1534 {
1535 CNetMsg_Sv_Emoticon *pData = (CNetMsg_Sv_Emoticon *)m_aUnpackedData;
1536 pData->m_ClientId = pUnpacker->GetInt();
1537 pData->m_Emoticon = pUnpacker->GetInt();
1538 if(pData->m_ClientId < 0 || pData->m_ClientId > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_ClientId"; break; }
1539 if(pData->m_Emoticon < 0 || pData->m_Emoticon > NUM_EMOTICONS-1) { m_pMsgFailedOn = "m_Emoticon"; break; }
1540 } break;
1541
1542 case NETMSGTYPE_SV_VOTECLEAROPTIONS:
1543 {
1544 CNetMsg_Sv_VoteClearOptions *pData = (CNetMsg_Sv_VoteClearOptions *)m_aUnpackedData;
1545 (void)pData;
1546 } break;
1547
1548 case NETMSGTYPE_SV_VOTEOPTIONLISTADD:
1549 {
1550 CNetMsg_Sv_VoteOptionListAdd *pData = (CNetMsg_Sv_VoteOptionListAdd *)m_aUnpackedData;
1551 pData->m_NumOptions = pUnpacker->GetInt();
1552 pData->m_pDescription0 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1553 pData->m_pDescription1 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1554 pData->m_pDescription2 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1555 pData->m_pDescription3 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1556 pData->m_pDescription4 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1557 pData->m_pDescription5 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1558 pData->m_pDescription6 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1559 pData->m_pDescription7 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1560 pData->m_pDescription8 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1561 pData->m_pDescription9 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1562 pData->m_pDescription10 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1563 pData->m_pDescription11 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1564 pData->m_pDescription12 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1565 pData->m_pDescription13 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1566 pData->m_pDescription14 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1567 if(pData->m_NumOptions < 1 || pData->m_NumOptions > 15) { m_pMsgFailedOn = "m_NumOptions"; break; }
1568 } break;
1569
1570 case NETMSGTYPE_SV_VOTEOPTIONADD:
1571 {
1572 CNetMsg_Sv_VoteOptionAdd *pData = (CNetMsg_Sv_VoteOptionAdd *)m_aUnpackedData;
1573 pData->m_pDescription = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1574 } break;
1575
1576 case NETMSGTYPE_SV_VOTEOPTIONREMOVE:
1577 {
1578 CNetMsg_Sv_VoteOptionRemove *pData = (CNetMsg_Sv_VoteOptionRemove *)m_aUnpackedData;
1579 pData->m_pDescription = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1580 } break;
1581
1582 case NETMSGTYPE_SV_VOTESET:
1583 {
1584 CNetMsg_Sv_VoteSet *pData = (CNetMsg_Sv_VoteSet *)m_aUnpackedData;
1585 pData->m_Timeout = pUnpacker->GetInt();
1586 pData->m_pDescription = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1587 pData->m_pReason = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1588 if(pData->m_Timeout < 0 || pData->m_Timeout > max_int) { m_pMsgFailedOn = "m_Timeout"; break; }
1589 } break;
1590
1591 case NETMSGTYPE_SV_VOTESTATUS:
1592 {
1593 CNetMsg_Sv_VoteStatus *pData = (CNetMsg_Sv_VoteStatus *)m_aUnpackedData;
1594 pData->m_Yes = pUnpacker->GetInt();
1595 pData->m_No = pUnpacker->GetInt();
1596 pData->m_Pass = pUnpacker->GetInt();
1597 pData->m_Total = pUnpacker->GetInt();
1598 if(pData->m_Yes < 0 || pData->m_Yes > MAX_CLIENTS) { m_pMsgFailedOn = "m_Yes"; break; }
1599 if(pData->m_No < 0 || pData->m_No > MAX_CLIENTS) { m_pMsgFailedOn = "m_No"; break; }
1600 if(pData->m_Pass < 0 || pData->m_Pass > MAX_CLIENTS) { m_pMsgFailedOn = "m_Pass"; break; }
1601 if(pData->m_Total < 0 || pData->m_Total > MAX_CLIENTS) { m_pMsgFailedOn = "m_Total"; break; }
1602 } break;
1603
1604 case NETMSGTYPE_CL_SAY:
1605 {
1606 CNetMsg_Cl_Say *pData = (CNetMsg_Cl_Say *)m_aUnpackedData;
1607 pData->m_Team = pUnpacker->GetInt();
1608 pData->m_pMessage = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC);
1609 if(pData->m_Team < 0 || pData->m_Team > 1) { m_pMsgFailedOn = "m_Team"; break; }
1610 } break;
1611
1612 case NETMSGTYPE_CL_SETTEAM:
1613 {
1614 CNetMsg_Cl_SetTeam *pData = (CNetMsg_Cl_SetTeam *)m_aUnpackedData;
1615 pData->m_Team = pUnpacker->GetInt();
1616 if(pData->m_Team < TEAM_SPECTATORS || pData->m_Team > TEAM_BLUE) { m_pMsgFailedOn = "m_Team"; break; }
1617 } break;
1618
1619 case NETMSGTYPE_CL_SETSPECTATORMODE:
1620 {
1621 CNetMsg_Cl_SetSpectatorMode *pData = (CNetMsg_Cl_SetSpectatorMode *)m_aUnpackedData;
1622 pData->m_SpectatorId = pUnpacker->GetInt();
1623 if(pData->m_SpectatorId < SPEC_FREEVIEW || pData->m_SpectatorId > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_SpectatorId"; break; }
1624 } break;
1625
1626 case NETMSGTYPE_CL_STARTINFO:
1627 {
1628 CNetMsg_Cl_StartInfo *pData = (CNetMsg_Cl_StartInfo *)m_aUnpackedData;
1629 pData->m_pName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1630 pData->m_pClan = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1631 pData->m_Country = pUnpacker->GetInt();
1632 pData->m_pSkin = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1633 pData->m_UseCustomColor = pUnpacker->GetInt();
1634 pData->m_ColorBody = pUnpacker->GetInt();
1635 pData->m_ColorFeet = pUnpacker->GetInt();
1636 if(pData->m_UseCustomColor < 0 || pData->m_UseCustomColor > 1) { m_pMsgFailedOn = "m_UseCustomColor"; break; }
1637 } break;
1638
1639 case NETMSGTYPE_CL_CHANGEINFO:
1640 {
1641 CNetMsg_Cl_ChangeInfo *pData = (CNetMsg_Cl_ChangeInfo *)m_aUnpackedData;
1642 pData->m_pName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1643 pData->m_pClan = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1644 pData->m_Country = pUnpacker->GetInt();
1645 pData->m_pSkin = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1646 pData->m_UseCustomColor = pUnpacker->GetInt();
1647 pData->m_ColorBody = pUnpacker->GetInt();
1648 pData->m_ColorFeet = pUnpacker->GetInt();
1649 if(pData->m_UseCustomColor < 0 || pData->m_UseCustomColor > 1) { m_pMsgFailedOn = "m_UseCustomColor"; break; }
1650 } break;
1651
1652 case NETMSGTYPE_CL_KILL:
1653 {
1654 CNetMsg_Cl_Kill *pData = (CNetMsg_Cl_Kill *)m_aUnpackedData;
1655 (void)pData;
1656 } break;
1657
1658 case NETMSGTYPE_CL_EMOTICON:
1659 {
1660 CNetMsg_Cl_Emoticon *pData = (CNetMsg_Cl_Emoticon *)m_aUnpackedData;
1661 pData->m_Emoticon = pUnpacker->GetInt();
1662 if(pData->m_Emoticon < 0 || pData->m_Emoticon > NUM_EMOTICONS-1) { m_pMsgFailedOn = "m_Emoticon"; break; }
1663 } break;
1664
1665 case NETMSGTYPE_CL_VOTE:
1666 {
1667 CNetMsg_Cl_Vote *pData = (CNetMsg_Cl_Vote *)m_aUnpackedData;
1668 pData->m_Vote = pUnpacker->GetInt();
1669 if(pData->m_Vote < -1 || pData->m_Vote > 1) { m_pMsgFailedOn = "m_Vote"; break; }
1670 } break;
1671
1672 case NETMSGTYPE_CL_CALLVOTE:
1673 {
1674 CNetMsg_Cl_CallVote *pData = (CNetMsg_Cl_CallVote *)m_aUnpackedData;
1675 pData->m_pType = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1676 pData->m_pValue = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1677 pData->m_pReason = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1678 } break;
1679
1680 case NETMSGTYPE_CL_ISDDNETLEGACY:
1681 {
1682 CNetMsg_Cl_IsDDNetLegacy *pData = (CNetMsg_Cl_IsDDNetLegacy *)m_aUnpackedData;
1683 (void)pData;
1684 } break;
1685
1686 case NETMSGTYPE_SV_DDRACETIMELEGACY:
1687 {
1688 CNetMsg_Sv_DDRaceTimeLegacy *pData = (CNetMsg_Sv_DDRaceTimeLegacy *)m_aUnpackedData;
1689 pData->m_Time = pUnpacker->GetInt();
1690 pData->m_Check = pUnpacker->GetInt();
1691 pData->m_Finish = pUnpacker->GetInt();
1692 if(pData->m_Finish < 0 || pData->m_Finish > 1) { m_pMsgFailedOn = "m_Finish"; break; }
1693 } break;
1694
1695 case NETMSGTYPE_SV_RECORDLEGACY:
1696 {
1697 CNetMsg_Sv_RecordLegacy *pData = (CNetMsg_Sv_RecordLegacy *)m_aUnpackedData;
1698 pData->m_ServerTimeBest = pUnpacker->GetInt();
1699 pData->m_PlayerTimeBest = pUnpacker->GetInt();
1700 } break;
1701
1702 case NETMSGTYPE_UNUSED2:
1703 {
1704 CNetMsg_Unused2 *pData = (CNetMsg_Unused2 *)m_aUnpackedData;
1705 (void)pData;
1706 } break;
1707
1708 case NETMSGTYPE_SV_TEAMSSTATELEGACY:
1709 {
1710 CNetMsg_Sv_TeamsStateLegacy *pData = (CNetMsg_Sv_TeamsStateLegacy *)m_aUnpackedData;
1711 (void)pData;
1712 } break;
1713
1714 case NETMSGTYPE_CL_SHOWOTHERSLEGACY:
1715 {
1716 CNetMsg_Cl_ShowOthersLegacy *pData = (CNetMsg_Cl_ShowOthersLegacy *)m_aUnpackedData;
1717 pData->m_Show = pUnpacker->GetInt();
1718 if(pData->m_Show < 0 || pData->m_Show > 1) { m_pMsgFailedOn = "m_Show"; break; }
1719 } break;
1720
1721 case NETMSGTYPE_SV_MYOWNMESSAGE:
1722 {
1723 CNetMsg_Sv_MyOwnMessage *pData = (CNetMsg_Sv_MyOwnMessage *)m_aUnpackedData;
1724 pData->m_Test = pUnpacker->GetInt();
1725 } break;
1726
1727 case NETMSGTYPE_CL_SHOWDISTANCE:
1728 {
1729 CNetMsg_Cl_ShowDistance *pData = (CNetMsg_Cl_ShowDistance *)m_aUnpackedData;
1730 pData->m_X = pUnpacker->GetInt();
1731 pData->m_Y = pUnpacker->GetInt();
1732 } break;
1733
1734 case NETMSGTYPE_CL_SHOWOTHERS:
1735 {
1736 CNetMsg_Cl_ShowOthers *pData = (CNetMsg_Cl_ShowOthers *)m_aUnpackedData;
1737 pData->m_Show = pUnpacker->GetInt();
1738 if(pData->m_Show < 0 || pData->m_Show > 2) { m_pMsgFailedOn = "m_Show"; break; }
1739 } break;
1740
1741 case NETMSGTYPE_CL_CAMERAINFO:
1742 {
1743 CNetMsg_Cl_CameraInfo *pData = (CNetMsg_Cl_CameraInfo *)m_aUnpackedData;
1744 pData->m_Zoom = pUnpacker->GetInt();
1745 pData->m_Deadzone = pUnpacker->GetInt();
1746 pData->m_FollowFactor = pUnpacker->GetInt();
1747 } break;
1748
1749 case NETMSGTYPE_SV_TEAMSSTATE:
1750 {
1751 CNetMsg_Sv_TeamsState *pData = (CNetMsg_Sv_TeamsState *)m_aUnpackedData;
1752 (void)pData;
1753 } break;
1754
1755 case NETMSGTYPE_SV_DDRACETIME:
1756 {
1757 CNetMsg_Sv_DDRaceTime *pData = (CNetMsg_Sv_DDRaceTime *)m_aUnpackedData;
1758 pData->m_Time = pUnpacker->GetInt();
1759 pData->m_Check = pUnpacker->GetInt();
1760 pData->m_Finish = pUnpacker->GetInt();
1761 if(pData->m_Finish < 0 || pData->m_Finish > 1) { m_pMsgFailedOn = "m_Finish"; break; }
1762 } break;
1763
1764 case NETMSGTYPE_SV_RECORD:
1765 {
1766 CNetMsg_Sv_Record *pData = (CNetMsg_Sv_Record *)m_aUnpackedData;
1767 pData->m_ServerTimeBest = pUnpacker->GetInt();
1768 pData->m_PlayerTimeBest = pUnpacker->GetInt();
1769 } break;
1770
1771 case NETMSGTYPE_SV_KILLMSGTEAM:
1772 {
1773 CNetMsg_Sv_KillMsgTeam *pData = (CNetMsg_Sv_KillMsgTeam *)m_aUnpackedData;
1774 pData->m_Team = pUnpacker->GetInt();
1775 pData->m_First = pUnpacker->GetInt();
1776 if(pData->m_Team < 0 || pData->m_Team > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_Team"; break; }
1777 if(pData->m_First < -1 || pData->m_First > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_First"; break; }
1778 } break;
1779
1780 case NETMSGTYPE_SV_YOURVOTE:
1781 {
1782 CNetMsg_Sv_YourVote *pData = (CNetMsg_Sv_YourVote *)m_aUnpackedData;
1783 pData->m_Voted = pUnpacker->GetInt();
1784 if(pData->m_Voted < -1 || pData->m_Voted > 1) { m_pMsgFailedOn = "m_Voted"; break; }
1785 } break;
1786
1787 case NETMSGTYPE_SV_RACEFINISH:
1788 {
1789 CNetMsg_Sv_RaceFinish *pData = (CNetMsg_Sv_RaceFinish *)m_aUnpackedData;
1790 pData->m_ClientId = pUnpacker->GetInt();
1791 pData->m_Time = pUnpacker->GetInt();
1792 pData->m_Diff = pUnpacker->GetInt();
1793 pData->m_RecordPersonal = pUnpacker->GetInt();
1794 pData->m_RecordServer = pUnpacker->GetIntOrDefault(Default: 0);
1795 if(pData->m_ClientId < 0 || pData->m_ClientId > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_ClientId"; break; }
1796 if(pData->m_RecordPersonal < 0 || pData->m_RecordPersonal > 1) { m_pMsgFailedOn = "m_RecordPersonal"; break; }
1797 if(pData->m_RecordServer < 0 || pData->m_RecordServer > 1) { m_pMsgFailedOn = "m_RecordServer"; break; }
1798 } break;
1799
1800 case NETMSGTYPE_SV_COMMANDINFO:
1801 {
1802 CNetMsg_Sv_CommandInfo *pData = (CNetMsg_Sv_CommandInfo *)m_aUnpackedData;
1803 pData->m_pName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1804 pData->m_pArgsFormat = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1805 pData->m_pHelpText = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1806 } break;
1807
1808 case NETMSGTYPE_SV_COMMANDINFOREMOVE:
1809 {
1810 CNetMsg_Sv_CommandInfoRemove *pData = (CNetMsg_Sv_CommandInfoRemove *)m_aUnpackedData;
1811 pData->m_pName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1812 } break;
1813
1814 case NETMSGTYPE_SV_VOTEOPTIONGROUPSTART:
1815 {
1816 CNetMsg_Sv_VoteOptionGroupStart *pData = (CNetMsg_Sv_VoteOptionGroupStart *)m_aUnpackedData;
1817 (void)pData;
1818 } break;
1819
1820 case NETMSGTYPE_SV_VOTEOPTIONGROUPEND:
1821 {
1822 CNetMsg_Sv_VoteOptionGroupEnd *pData = (CNetMsg_Sv_VoteOptionGroupEnd *)m_aUnpackedData;
1823 (void)pData;
1824 } break;
1825
1826 case NETMSGTYPE_SV_COMMANDINFOGROUPSTART:
1827 {
1828 CNetMsg_Sv_CommandInfoGroupStart *pData = (CNetMsg_Sv_CommandInfoGroupStart *)m_aUnpackedData;
1829 (void)pData;
1830 } break;
1831
1832 case NETMSGTYPE_SV_COMMANDINFOGROUPEND:
1833 {
1834 CNetMsg_Sv_CommandInfoGroupEnd *pData = (CNetMsg_Sv_CommandInfoGroupEnd *)m_aUnpackedData;
1835 (void)pData;
1836 } break;
1837
1838 case NETMSGTYPE_SV_CHANGEINFOCOOLDOWN:
1839 {
1840 CNetMsg_Sv_ChangeInfoCooldown *pData = (CNetMsg_Sv_ChangeInfoCooldown *)m_aUnpackedData;
1841 pData->m_WaitUntil = pUnpacker->GetInt();
1842 } break;
1843
1844 case NETMSGTYPE_SV_MAPSOUNDGLOBAL:
1845 {
1846 CNetMsg_Sv_MapSoundGlobal *pData = (CNetMsg_Sv_MapSoundGlobal *)m_aUnpackedData;
1847 pData->m_SoundId = pUnpacker->GetInt();
1848 } break;
1849
1850 case NETMSGTYPE_SV_PREINPUT:
1851 {
1852 CNetMsg_Sv_PreInput *pData = (CNetMsg_Sv_PreInput *)m_aUnpackedData;
1853 pData->m_Direction = pUnpacker->GetInt();
1854 pData->m_TargetX = pUnpacker->GetInt();
1855 pData->m_TargetY = pUnpacker->GetInt();
1856 pData->m_Jump = pUnpacker->GetInt();
1857 pData->m_Fire = pUnpacker->GetInt();
1858 pData->m_Hook = pUnpacker->GetInt();
1859 pData->m_WantedWeapon = pUnpacker->GetInt();
1860 pData->m_NextWeapon = pUnpacker->GetInt();
1861 pData->m_PrevWeapon = pUnpacker->GetInt();
1862 pData->m_Owner = pUnpacker->GetInt();
1863 pData->m_IntendedTick = pUnpacker->GetInt();
1864 if(pData->m_Owner < 0 || pData->m_Owner > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_Owner"; break; }
1865 } break;
1866
1867 case NETMSGTYPE_SV_SAVECODE:
1868 {
1869 CNetMsg_Sv_SaveCode *pData = (CNetMsg_Sv_SaveCode *)m_aUnpackedData;
1870 pData->m_State = pUnpacker->GetInt();
1871 pData->m_pError = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1872 pData->m_pSaveRequester = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1873 pData->m_pServerName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1874 pData->m_pGeneratedCode = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1875 pData->m_pCode = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1876 pData->m_pTeamMembers = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1877 if(pData->m_State < SAVESTATE_PENDING || pData->m_State > SAVESTATE_ERROR) { m_pMsgFailedOn = "m_State"; break; }
1878 } break;
1879
1880 case NETMSGTYPE_SV_SERVERALERT:
1881 {
1882 CNetMsg_Sv_ServerAlert *pData = (CNetMsg_Sv_ServerAlert *)m_aUnpackedData;
1883 pData->m_pMessage = pUnpacker->GetString();
1884 } break;
1885
1886 case NETMSGTYPE_SV_MODERATORALERT:
1887 {
1888 CNetMsg_Sv_ModeratorAlert *pData = (CNetMsg_Sv_ModeratorAlert *)m_aUnpackedData;
1889 pData->m_pMessage = pUnpacker->GetString();
1890 } break;
1891
1892 case NETMSGTYPE_CL_ENABLESPECTATORCOUNT:
1893 {
1894 CNetMsg_Cl_EnableSpectatorCount *pData = (CNetMsg_Cl_EnableSpectatorCount *)m_aUnpackedData;
1895 pData->m_Enable = pUnpacker->GetInt();
1896 if(pData->m_Enable < 0 || pData->m_Enable > 1) { m_pMsgFailedOn = "m_Enable"; break; }
1897 } break;
1898
1899 case NETMSGTYPE_SV_MAPINFO:
1900 {
1901 CNetMsg_Sv_MapInfo *pData = (CNetMsg_Sv_MapInfo *)m_aUnpackedData;
1902 pData->m_pDescription = pUnpacker->GetString();
1903 } break;
1904
1905 default:
1906 m_pMsgFailedOn = "(type out of range)";
1907 break;
1908 }
1909
1910 if(pUnpacker->Error())
1911 m_pMsgFailedOn = "(unpack error)";
1912
1913 if(m_pMsgFailedOn)
1914 return 0;
1915 m_pMsgFailedOn = "";
1916 return m_aUnpackedData;
1917}
1918
1919bool CNetObjHandler::TeeHistorianRecordMsg(int Type)
1920{
1921 switch(Type)
1922 {
1923
1924 case NETMSGTYPE_CL_SAY:
1925 case NETMSGTYPE_CL_VOTE:
1926 case NETMSGTYPE_CL_CALLVOTE:
1927 return false;
1928 default:
1929 return true;
1930 }
1931}
1932
1933void RegisterGameUuids(CUuidManager *pManager)
1934{
1935
1936 pManager->RegisterName(Id: NETOBJTYPE_MYOWNOBJECT, pName: "my-own-object@heinrich5991.de");
1937 pManager->RegisterName(Id: NETOBJTYPE_DDNETCHARACTER, pName: "character@netobj.ddnet.tw");
1938 pManager->RegisterName(Id: NETOBJTYPE_DDNETPLAYER, pName: "player@netobj.ddnet.tw");
1939 pManager->RegisterName(Id: NETOBJTYPE_GAMEINFOEX, pName: "gameinfo@netobj.ddnet.tw");
1940 pManager->RegisterName(Id: NETOBJTYPE_DDRACEPROJECTILE, pName: "projectile@netobj.ddnet.tw");
1941 pManager->RegisterName(Id: NETOBJTYPE_DDNETLASER, pName: "laser@netobj.ddnet.tw");
1942 pManager->RegisterName(Id: NETOBJTYPE_DDNETPROJECTILE, pName: "ddnet-projectile@netobj.ddnet.tw");
1943 pManager->RegisterName(Id: NETOBJTYPE_DDNETPICKUP, pName: "pickup@netobj.ddnet.tw");
1944 pManager->RegisterName(Id: NETOBJTYPE_DDNETSPECTATORINFO, pName: "spectator-info@netobj.ddnet.org");
1945 pManager->RegisterName(Id: NETOBJTYPE_SPECTATORCOUNT, pName: "spectator-count@netobj.ddnet.org");
1946 pManager->RegisterName(Id: NETEVENTTYPE_BIRTHDAY, pName: "birthday@netevent.ddnet.org");
1947 pManager->RegisterName(Id: NETEVENTTYPE_FINISH, pName: "finish@netevent.ddnet.org");
1948 pManager->RegisterName(Id: NETOBJTYPE_MYOWNEVENT, pName: "my-own-event@heinrich5991.de");
1949 pManager->RegisterName(Id: NETOBJTYPE_SPECCHAR, pName: "spec-char@netobj.ddnet.tw");
1950 pManager->RegisterName(Id: NETOBJTYPE_SWITCHSTATE, pName: "switch-state@netobj.ddnet.tw");
1951 pManager->RegisterName(Id: NETOBJTYPE_ENTITYEX, pName: "entity-ex@netobj.ddnet.tw");
1952 pManager->RegisterName(Id: NETOBJTYPE_MAPBESTTIME, pName: "map-best-time@netobj.ddnet.org");
1953 pManager->RegisterName(Id: NETEVENTTYPE_MAPSOUNDWORLD, pName: "map-sound-world@netevent.ddnet.org");
1954 pManager->RegisterName(Id: NETMSGTYPE_SV_MYOWNMESSAGE, pName: "my-own-message@heinrich5991.de");
1955 pManager->RegisterName(Id: NETMSGTYPE_CL_SHOWDISTANCE, pName: "show-distance@netmsg.ddnet.tw");
1956 pManager->RegisterName(Id: NETMSGTYPE_CL_SHOWOTHERS, pName: "showothers@netmsg.ddnet.tw");
1957 pManager->RegisterName(Id: NETMSGTYPE_CL_CAMERAINFO, pName: "camera-info@netmsg.ddnet.org");
1958 pManager->RegisterName(Id: NETMSGTYPE_SV_TEAMSSTATE, pName: "teamsstate@netmsg.ddnet.tw");
1959 pManager->RegisterName(Id: NETMSGTYPE_SV_DDRACETIME, pName: "ddrace-time@netmsg.ddnet.tw");
1960 pManager->RegisterName(Id: NETMSGTYPE_SV_RECORD, pName: "record@netmsg.ddnet.tw");
1961 pManager->RegisterName(Id: NETMSGTYPE_SV_KILLMSGTEAM, pName: "killmsgteam@netmsg.ddnet.tw");
1962 pManager->RegisterName(Id: NETMSGTYPE_SV_YOURVOTE, pName: "yourvote@netmsg.ddnet.org");
1963 pManager->RegisterName(Id: NETMSGTYPE_SV_RACEFINISH, pName: "racefinish@netmsg.ddnet.org");
1964 pManager->RegisterName(Id: NETMSGTYPE_SV_COMMANDINFO, pName: "commandinfo@netmsg.ddnet.org");
1965 pManager->RegisterName(Id: NETMSGTYPE_SV_COMMANDINFOREMOVE, pName: "commandinfo-remove@netmsg.ddnet.org");
1966 pManager->RegisterName(Id: NETMSGTYPE_SV_VOTEOPTIONGROUPSTART, pName: "sv-vote-option-group-start@netmsg.ddnet.org");
1967 pManager->RegisterName(Id: NETMSGTYPE_SV_VOTEOPTIONGROUPEND, pName: "sv-vote-option-group-end@netmsg.ddnet.org");
1968 pManager->RegisterName(Id: NETMSGTYPE_SV_COMMANDINFOGROUPSTART, pName: "sv-commandinfo-group-start@netmsg.ddnet.org");
1969 pManager->RegisterName(Id: NETMSGTYPE_SV_COMMANDINFOGROUPEND, pName: "sv-commandinfo-group-end@netmsg.ddnet.org");
1970 pManager->RegisterName(Id: NETMSGTYPE_SV_CHANGEINFOCOOLDOWN, pName: "change-info-cooldown@netmsg.ddnet.org");
1971 pManager->RegisterName(Id: NETMSGTYPE_SV_MAPSOUNDGLOBAL, pName: "map-sound-global@netmsg.ddnet.org");
1972 pManager->RegisterName(Id: NETMSGTYPE_SV_PREINPUT, pName: "preinput@netmsg.ddnet.org");
1973 pManager->RegisterName(Id: NETMSGTYPE_SV_SAVECODE, pName: "save-code@netmsg.ddnet.org");
1974 pManager->RegisterName(Id: NETMSGTYPE_SV_SERVERALERT, pName: "server-alert@netmsg.ddnet.org");
1975 pManager->RegisterName(Id: NETMSGTYPE_SV_MODERATORALERT, pName: "moderator-alert@netmsg.ddnet.org");
1976 pManager->RegisterName(Id: NETMSGTYPE_CL_ENABLESPECTATORCOUNT, pName: "enable-spectator-count@netmsg.ddnet.org");
1977 pManager->RegisterName(Id: NETMSGTYPE_SV_MAPINFO, pName: "map-info@netmsg.ddnet.org");
1978
1979 RegisterMapItemTypeUuids(pManager);
1980}
1981
1982