1#include "protocol.h"
2
3#include <base/system.h>
4#include <engine/shared/packer.h>
5#include <engine/shared/protocol.h>
6#include <engine/shared/uuid_manager.h>
7
8#include <game/mapitems_ex.h>
9
10CNetObjHandler::CNetObjHandler()
11{
12 m_pMsgFailedOn = "";
13 m_pObjFailedOn = "";
14 m_pObjCorrectedOn = "";
15 m_NumObjCorrections = 0;
16}
17
18int CNetObjHandler::NumObjCorrections() const { return m_NumObjCorrections; }
19const char *CNetObjHandler::CorrectedObjOn() const { return m_pObjCorrectedOn; }
20const char *CNetObjHandler::FailedObjOn() const { return m_pObjFailedOn; }
21const char *CNetObjHandler::FailedMsgOn() const { return m_pMsgFailedOn; }
22
23static const int max_int = 0x7fffffff;
24static const int min_int = 0x80000000;
25
26int CNetObjHandler::ClampInt(const char *pErrorMsg, int Value, int Min, int Max)
27{
28 if(Value < Min) { m_pObjCorrectedOn = pErrorMsg; m_NumObjCorrections++; return Min; }
29 if(Value > Max) { m_pObjCorrectedOn = pErrorMsg; m_NumObjCorrections++; return Max; }
30 return Value;
31}
32
33const char *CNetObjHandler::ms_apObjNames[] = {
34 "EX/UUID",
35 "PlayerInput",
36 "Projectile",
37 "Laser",
38 "Pickup",
39 "Flag",
40 "GameInfo",
41 "GameData",
42 "CharacterCore",
43 "Character",
44 "PlayerInfo",
45 "ClientInfo",
46 "SpectatorInfo",
47 "Common",
48 "Explosion",
49 "Spawn",
50 "HammerHit",
51 "Death",
52 "SoundGlobal",
53 "SoundWorld",
54 "DamageInd",
55 ""
56};
57
58const char *CNetObjHandler::ms_apExObjNames[] = {
59 "invalid",
60 "MyOwnObject",
61 "DDNetCharacter",
62 "DDNetPlayer",
63 "GameInfoEx",
64 "DDRaceProjectile",
65 "DDNetLaser",
66 "DDNetProjectile",
67 "DDNetPickup",
68 "MyOwnEvent",
69 "SpecChar",
70 "SwitchState",
71 "EntityEx",
72 ""
73};
74
75int CNetObjHandler::ms_aObjSizes[] = {
76 0,
77 sizeof(CNetObj_PlayerInput),
78 sizeof(CNetObj_Projectile),
79 sizeof(CNetObj_Laser),
80 sizeof(CNetObj_Pickup),
81 sizeof(CNetObj_Flag),
82 sizeof(CNetObj_GameInfo),
83 sizeof(CNetObj_GameData),
84 sizeof(CNetObj_CharacterCore),
85 sizeof(CNetObj_Character),
86 sizeof(CNetObj_PlayerInfo),
87 sizeof(CNetObj_ClientInfo),
88 sizeof(CNetObj_SpectatorInfo),
89 sizeof(CNetEvent_Common),
90 sizeof(CNetEvent_Explosion),
91 sizeof(CNetEvent_Spawn),
92 sizeof(CNetEvent_HammerHit),
93 sizeof(CNetEvent_Death),
94 sizeof(CNetEvent_SoundGlobal),
95 sizeof(CNetEvent_SoundWorld),
96 sizeof(CNetEvent_DamageInd),
97 0
98};
99
100int CNetObjHandler::ms_aUnpackedObjSizes[] = {
101 16,
102 sizeof(CNetObj_PlayerInput),
103 sizeof(CNetObj_Projectile),
104 sizeof(CNetObj_Laser),
105 sizeof(CNetObj_Pickup),
106 sizeof(CNetObj_Flag),
107 sizeof(CNetObj_GameInfo),
108 sizeof(CNetObj_GameData),
109 sizeof(CNetObj_CharacterCore),
110 sizeof(CNetObj_Character),
111 sizeof(CNetObj_PlayerInfo),
112 sizeof(CNetObj_ClientInfo),
113 sizeof(CNetObj_SpectatorInfo),
114 sizeof(CNetEvent_Common),
115 sizeof(CNetEvent_Explosion),
116 sizeof(CNetEvent_Spawn),
117 sizeof(CNetEvent_HammerHit),
118 sizeof(CNetEvent_Death),
119 sizeof(CNetEvent_SoundGlobal),
120 sizeof(CNetEvent_SoundWorld),
121 sizeof(CNetEvent_DamageInd),
122};
123
124int CNetObjHandler::ms_aUnpackedExObjSizes[] = {
125 0,
126 sizeof(CNetObj_MyOwnObject),
127 sizeof(CNetObj_DDNetCharacter),
128 sizeof(CNetObj_DDNetPlayer),
129 sizeof(CNetObj_GameInfoEx),
130 sizeof(CNetObj_DDRaceProjectile),
131 sizeof(CNetObj_DDNetLaser),
132 sizeof(CNetObj_DDNetProjectile),
133 sizeof(CNetObj_DDNetPickup),
134 sizeof(CNetObj_MyOwnEvent),
135 sizeof(CNetObj_SpecChar),
136 sizeof(CNetObj_SwitchState),
137 sizeof(CNetObj_EntityEx),
138};
139
140const char *CNetObjHandler::ms_apMsgNames[] = {
141 "invalid",
142 "Sv_Motd",
143 "Sv_Broadcast",
144 "Sv_Chat",
145 "Sv_KillMsg",
146 "Sv_SoundGlobal",
147 "Sv_TuneParams",
148 "Unused",
149 "Sv_ReadyToEnter",
150 "Sv_WeaponPickup",
151 "Sv_Emoticon",
152 "Sv_VoteClearOptions",
153 "Sv_VoteOptionListAdd",
154 "Sv_VoteOptionAdd",
155 "Sv_VoteOptionRemove",
156 "Sv_VoteSet",
157 "Sv_VoteStatus",
158 "Cl_Say",
159 "Cl_SetTeam",
160 "Cl_SetSpectatorMode",
161 "Cl_StartInfo",
162 "Cl_ChangeInfo",
163 "Cl_Kill",
164 "Cl_Emoticon",
165 "Cl_Vote",
166 "Cl_CallVote",
167 "Cl_IsDDNetLegacy",
168 "Sv_DDRaceTimeLegacy",
169 "Sv_RecordLegacy",
170 "Unused2",
171 "Sv_TeamsStateLegacy",
172 "Cl_ShowOthersLegacy",
173 ""
174};
175
176const char *CNetObjHandler::ms_apExMsgNames[] = {
177 "invalid",
178 "Sv_MyOwnMessage",
179 "Cl_ShowDistance",
180 "Cl_ShowOthers",
181 "Sv_TeamsState",
182 "Sv_DDRaceTime",
183 "Sv_Record",
184 "Sv_KillMsgTeam",
185 "Sv_YourVote",
186 "Sv_RaceFinish",
187 "Sv_CommandInfo",
188 "Sv_CommandInfoRemove",
189 "Sv_VoteOptionGroupStart",
190 "Sv_VoteOptionGroupEnd",
191 "Sv_CommandInfoGroupStart",
192 "Sv_CommandInfoGroupEnd",
193 "Sv_ChangeInfoCooldown",
194 ""
195};
196
197const char *CNetObjHandler::GetObjName(int Type) const
198{
199 if(Type >= 0 && Type < NUM_NETOBJTYPES)
200 {
201 return ms_apObjNames[Type];
202 }
203 else if(Type > __NETOBJTYPE_UUID_HELPER && Type < OFFSET_NETMSGTYPE_UUID)
204 {
205 return ms_apExObjNames[Type - __NETOBJTYPE_UUID_HELPER];
206 }
207 return "(out of range)";
208}
209
210int CNetObjHandler::GetObjSize(int Type) const
211{
212 if(Type < 0 || Type >= NUM_NETOBJTYPES) return 0;
213 return ms_aObjSizes[Type];
214}
215
216int CNetObjHandler::GetUnpackedObjSize(int Type) const
217{
218 if(Type >= 0 && Type < NUM_NETOBJTYPES)
219 {
220 return ms_aUnpackedObjSizes[Type];
221 }
222 else if(Type > __NETOBJTYPE_UUID_HELPER && Type < OFFSET_NETMSGTYPE_UUID)
223 {
224 return ms_aUnpackedExObjSizes[Type - __NETOBJTYPE_UUID_HELPER];
225 }
226 return 0;
227}
228
229const char *CNetObjHandler::GetMsgName(int Type) const
230{
231 if(Type >= 0 && Type < NUM_NETMSGTYPES)
232 {
233 return ms_apMsgNames[Type];
234 }
235 else if(Type > __NETMSGTYPE_UUID_HELPER && Type < OFFSET_MAPITEMTYPE_UUID)
236 {
237 return ms_apExMsgNames[Type - __NETMSGTYPE_UUID_HELPER];
238 }
239 return "(out of range)";
240}
241
242void *CNetObjHandler::SecureUnpackObj(int Type, CUnpacker *pUnpacker)
243{
244 m_pObjFailedOn = 0;
245 switch(Type)
246 {
247 case NETOBJTYPE_EX:
248 {
249 const unsigned char *pPtr = pUnpacker->GetRaw(Size: sizeof(CUuid));
250 if(pPtr != 0)
251 {
252 mem_copy(dest: m_aUnpackedData, source: pPtr, size: sizeof(CUuid));
253 }
254 break;
255 }
256
257 case NETOBJTYPE_PLAYERINPUT:
258 {
259 CNetObj_PlayerInput *pData = (CNetObj_PlayerInput *)m_aUnpackedData;
260 pData->m_Direction = pUnpacker->GetUncompressedInt();
261 pData->m_TargetX = pUnpacker->GetUncompressedInt();
262 pData->m_TargetY = pUnpacker->GetUncompressedInt();
263 pData->m_Jump = pUnpacker->GetUncompressedInt();
264 pData->m_Fire = pUnpacker->GetUncompressedInt();
265 pData->m_Hook = pUnpacker->GetUncompressedInt();
266 pData->m_PlayerFlags = pUnpacker->GetUncompressedInt();
267 pData->m_WantedWeapon = pUnpacker->GetUncompressedInt();
268 pData->m_NextWeapon = pUnpacker->GetUncompressedInt();
269 pData->m_PrevWeapon = pUnpacker->GetUncompressedInt();
270 pData->m_PlayerFlags = ClampInt(pErrorMsg: "m_PlayerFlags", Value: pData->m_PlayerFlags, Min: 0, Max: 256);
271 } break;
272
273 case NETOBJTYPE_PROJECTILE:
274 {
275 CNetObj_Projectile *pData = (CNetObj_Projectile *)m_aUnpackedData;
276 pData->m_X = pUnpacker->GetUncompressedInt();
277 pData->m_Y = pUnpacker->GetUncompressedInt();
278 pData->m_VelX = pUnpacker->GetUncompressedInt();
279 pData->m_VelY = pUnpacker->GetUncompressedInt();
280 pData->m_Type = pUnpacker->GetUncompressedInt();
281 pData->m_StartTick = pUnpacker->GetUncompressedInt();
282 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: NUM_WEAPONS-1);
283 } break;
284
285 case NETOBJTYPE_LASER:
286 {
287 CNetObj_Laser *pData = (CNetObj_Laser *)m_aUnpackedData;
288 pData->m_X = pUnpacker->GetUncompressedInt();
289 pData->m_Y = pUnpacker->GetUncompressedInt();
290 pData->m_FromX = pUnpacker->GetUncompressedInt();
291 pData->m_FromY = pUnpacker->GetUncompressedInt();
292 pData->m_StartTick = pUnpacker->GetUncompressedInt();
293 } break;
294
295 case NETOBJTYPE_PICKUP:
296 {
297 CNetObj_Pickup *pData = (CNetObj_Pickup *)m_aUnpackedData;
298 pData->m_X = pUnpacker->GetUncompressedInt();
299 pData->m_Y = pUnpacker->GetUncompressedInt();
300 pData->m_Type = pUnpacker->GetUncompressedInt();
301 pData->m_Subtype = pUnpacker->GetUncompressedInt();
302 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: max_int);
303 pData->m_Subtype = ClampInt(pErrorMsg: "m_Subtype", Value: pData->m_Subtype, Min: 0, Max: max_int);
304 } break;
305
306 case NETOBJTYPE_FLAG:
307 {
308 CNetObj_Flag *pData = (CNetObj_Flag *)m_aUnpackedData;
309 pData->m_X = pUnpacker->GetUncompressedInt();
310 pData->m_Y = pUnpacker->GetUncompressedInt();
311 pData->m_Team = pUnpacker->GetUncompressedInt();
312 pData->m_Team = ClampInt(pErrorMsg: "m_Team", Value: pData->m_Team, Min: TEAM_RED, Max: TEAM_BLUE);
313 } break;
314
315 case NETOBJTYPE_GAMEINFO:
316 {
317 CNetObj_GameInfo *pData = (CNetObj_GameInfo *)m_aUnpackedData;
318 pData->m_GameFlags = pUnpacker->GetUncompressedInt();
319 pData->m_GameStateFlags = pUnpacker->GetUncompressedInt();
320 pData->m_RoundStartTick = pUnpacker->GetUncompressedInt();
321 pData->m_WarmupTimer = pUnpacker->GetUncompressedInt();
322 pData->m_ScoreLimit = pUnpacker->GetUncompressedInt();
323 pData->m_TimeLimit = pUnpacker->GetUncompressedInt();
324 pData->m_RoundNum = pUnpacker->GetUncompressedInt();
325 pData->m_RoundCurrent = pUnpacker->GetUncompressedInt();
326 pData->m_GameFlags = ClampInt(pErrorMsg: "m_GameFlags", Value: pData->m_GameFlags, Min: 0, Max: 256);
327 pData->m_GameStateFlags = ClampInt(pErrorMsg: "m_GameStateFlags", Value: pData->m_GameStateFlags, Min: 0, Max: 256);
328 pData->m_WarmupTimer = ClampInt(pErrorMsg: "m_WarmupTimer", Value: pData->m_WarmupTimer, Min: min_int, Max: max_int);
329 pData->m_ScoreLimit = ClampInt(pErrorMsg: "m_ScoreLimit", Value: pData->m_ScoreLimit, Min: 0, Max: max_int);
330 pData->m_TimeLimit = ClampInt(pErrorMsg: "m_TimeLimit", Value: pData->m_TimeLimit, Min: 0, Max: max_int);
331 pData->m_RoundNum = ClampInt(pErrorMsg: "m_RoundNum", Value: pData->m_RoundNum, Min: 0, Max: max_int);
332 pData->m_RoundCurrent = ClampInt(pErrorMsg: "m_RoundCurrent", Value: pData->m_RoundCurrent, Min: 0, Max: max_int);
333 } break;
334
335 case NETOBJTYPE_GAMEDATA:
336 {
337 CNetObj_GameData *pData = (CNetObj_GameData *)m_aUnpackedData;
338 pData->m_TeamscoreRed = pUnpacker->GetUncompressedInt();
339 pData->m_TeamscoreBlue = pUnpacker->GetUncompressedInt();
340 pData->m_FlagCarrierRed = pUnpacker->GetUncompressedInt();
341 pData->m_FlagCarrierBlue = pUnpacker->GetUncompressedInt();
342 pData->m_FlagCarrierRed = ClampInt(pErrorMsg: "m_FlagCarrierRed", Value: pData->m_FlagCarrierRed, Min: FLAG_MISSING, Max: MAX_CLIENTS-1);
343 pData->m_FlagCarrierBlue = ClampInt(pErrorMsg: "m_FlagCarrierBlue", Value: pData->m_FlagCarrierBlue, Min: FLAG_MISSING, Max: MAX_CLIENTS-1);
344 } break;
345
346 case NETOBJTYPE_CHARACTERCORE:
347 {
348 CNetObj_CharacterCore *pData = (CNetObj_CharacterCore *)m_aUnpackedData;
349 pData->m_Tick = pUnpacker->GetUncompressedInt();
350 pData->m_X = pUnpacker->GetUncompressedInt();
351 pData->m_Y = pUnpacker->GetUncompressedInt();
352 pData->m_VelX = pUnpacker->GetUncompressedInt();
353 pData->m_VelY = pUnpacker->GetUncompressedInt();
354 pData->m_Angle = pUnpacker->GetUncompressedInt();
355 pData->m_Direction = pUnpacker->GetUncompressedInt();
356 pData->m_Jumped = pUnpacker->GetUncompressedInt();
357 pData->m_HookedPlayer = pUnpacker->GetUncompressedInt();
358 pData->m_HookState = pUnpacker->GetUncompressedInt();
359 pData->m_HookTick = pUnpacker->GetUncompressedInt();
360 pData->m_HookX = pUnpacker->GetUncompressedInt();
361 pData->m_HookY = pUnpacker->GetUncompressedInt();
362 pData->m_HookDx = pUnpacker->GetUncompressedInt();
363 pData->m_HookDy = pUnpacker->GetUncompressedInt();
364 pData->m_Direction = ClampInt(pErrorMsg: "m_Direction", Value: pData->m_Direction, Min: -1, Max: 1);
365 pData->m_Jumped = ClampInt(pErrorMsg: "m_Jumped", Value: pData->m_Jumped, Min: 0, Max: 3);
366 pData->m_HookedPlayer = ClampInt(pErrorMsg: "m_HookedPlayer", Value: pData->m_HookedPlayer, Min: -1, Max: MAX_CLIENTS-1);
367 pData->m_HookState = ClampInt(pErrorMsg: "m_HookState", Value: pData->m_HookState, Min: -1, Max: 5);
368 } break;
369
370 case NETOBJTYPE_CHARACTER:
371 {
372 CNetObj_Character *pData = (CNetObj_Character *)m_aUnpackedData;
373 pData->m_Tick = pUnpacker->GetUncompressedInt();
374 pData->m_X = pUnpacker->GetUncompressedInt();
375 pData->m_Y = pUnpacker->GetUncompressedInt();
376 pData->m_VelX = pUnpacker->GetUncompressedInt();
377 pData->m_VelY = pUnpacker->GetUncompressedInt();
378 pData->m_Angle = pUnpacker->GetUncompressedInt();
379 pData->m_Direction = pUnpacker->GetUncompressedInt();
380 pData->m_Jumped = pUnpacker->GetUncompressedInt();
381 pData->m_HookedPlayer = pUnpacker->GetUncompressedInt();
382 pData->m_HookState = pUnpacker->GetUncompressedInt();
383 pData->m_HookTick = pUnpacker->GetUncompressedInt();
384 pData->m_HookX = pUnpacker->GetUncompressedInt();
385 pData->m_HookY = pUnpacker->GetUncompressedInt();
386 pData->m_HookDx = pUnpacker->GetUncompressedInt();
387 pData->m_HookDy = pUnpacker->GetUncompressedInt();
388 pData->m_PlayerFlags = pUnpacker->GetUncompressedInt();
389 pData->m_Health = pUnpacker->GetUncompressedInt();
390 pData->m_Armor = pUnpacker->GetUncompressedInt();
391 pData->m_AmmoCount = pUnpacker->GetUncompressedInt();
392 pData->m_Weapon = pUnpacker->GetUncompressedInt();
393 pData->m_Emote = pUnpacker->GetUncompressedInt();
394 pData->m_AttackTick = pUnpacker->GetUncompressedInt();
395 pData->m_Direction = ClampInt(pErrorMsg: "m_Direction", Value: pData->m_Direction, Min: -1, Max: 1);
396 pData->m_Jumped = ClampInt(pErrorMsg: "m_Jumped", Value: pData->m_Jumped, Min: 0, Max: 3);
397 pData->m_HookedPlayer = ClampInt(pErrorMsg: "m_HookedPlayer", Value: pData->m_HookedPlayer, Min: -1, Max: MAX_CLIENTS-1);
398 pData->m_HookState = ClampInt(pErrorMsg: "m_HookState", Value: pData->m_HookState, Min: -1, Max: 5);
399 pData->m_PlayerFlags = ClampInt(pErrorMsg: "m_PlayerFlags", Value: pData->m_PlayerFlags, Min: 0, Max: 256);
400 pData->m_Health = ClampInt(pErrorMsg: "m_Health", Value: pData->m_Health, Min: 0, Max: 10);
401 pData->m_Armor = ClampInt(pErrorMsg: "m_Armor", Value: pData->m_Armor, Min: 0, Max: 10);
402 pData->m_AmmoCount = ClampInt(pErrorMsg: "m_AmmoCount", Value: pData->m_AmmoCount, Min: 0, Max: 10);
403 pData->m_Weapon = ClampInt(pErrorMsg: "m_Weapon", Value: pData->m_Weapon, Min: 0, Max: NUM_WEAPONS-1);
404 pData->m_Emote = ClampInt(pErrorMsg: "m_Emote", Value: pData->m_Emote, Min: 0, Max: 6);
405 pData->m_AttackTick = ClampInt(pErrorMsg: "m_AttackTick", Value: pData->m_AttackTick, Min: 0, Max: max_int);
406 } break;
407
408 case NETOBJTYPE_PLAYERINFO:
409 {
410 CNetObj_PlayerInfo *pData = (CNetObj_PlayerInfo *)m_aUnpackedData;
411 pData->m_Local = pUnpacker->GetUncompressedInt();
412 pData->m_ClientId = pUnpacker->GetUncompressedInt();
413 pData->m_Team = pUnpacker->GetUncompressedInt();
414 pData->m_Score = pUnpacker->GetUncompressedInt();
415 pData->m_Latency = pUnpacker->GetUncompressedInt();
416 pData->m_Local = ClampInt(pErrorMsg: "m_Local", Value: pData->m_Local, Min: 0, Max: 1);
417 pData->m_ClientId = ClampInt(pErrorMsg: "m_ClientId", Value: pData->m_ClientId, Min: 0, Max: MAX_CLIENTS-1);
418 pData->m_Team = ClampInt(pErrorMsg: "m_Team", Value: pData->m_Team, Min: TEAM_SPECTATORS, Max: TEAM_BLUE);
419 } break;
420
421 case NETOBJTYPE_CLIENTINFO:
422 {
423 CNetObj_ClientInfo *pData = (CNetObj_ClientInfo *)m_aUnpackedData;
424 pData->m_Name0 = pUnpacker->GetUncompressedInt();
425 pData->m_Name1 = pUnpacker->GetUncompressedInt();
426 pData->m_Name2 = pUnpacker->GetUncompressedInt();
427 pData->m_Name3 = pUnpacker->GetUncompressedInt();
428 pData->m_Clan0 = pUnpacker->GetUncompressedInt();
429 pData->m_Clan1 = pUnpacker->GetUncompressedInt();
430 pData->m_Clan2 = pUnpacker->GetUncompressedInt();
431 pData->m_Country = pUnpacker->GetUncompressedInt();
432 pData->m_Skin0 = pUnpacker->GetUncompressedInt();
433 pData->m_Skin1 = pUnpacker->GetUncompressedInt();
434 pData->m_Skin2 = pUnpacker->GetUncompressedInt();
435 pData->m_Skin3 = pUnpacker->GetUncompressedInt();
436 pData->m_Skin4 = pUnpacker->GetUncompressedInt();
437 pData->m_Skin5 = pUnpacker->GetUncompressedInt();
438 pData->m_UseCustomColor = pUnpacker->GetUncompressedInt();
439 pData->m_ColorBody = pUnpacker->GetUncompressedInt();
440 pData->m_ColorFeet = pUnpacker->GetUncompressedInt();
441 pData->m_UseCustomColor = ClampInt(pErrorMsg: "m_UseCustomColor", Value: pData->m_UseCustomColor, Min: 0, Max: 1);
442 } break;
443
444 case NETOBJTYPE_SPECTATORINFO:
445 {
446 CNetObj_SpectatorInfo *pData = (CNetObj_SpectatorInfo *)m_aUnpackedData;
447 pData->m_SpectatorId = pUnpacker->GetUncompressedInt();
448 pData->m_X = pUnpacker->GetUncompressedInt();
449 pData->m_Y = pUnpacker->GetUncompressedInt();
450 pData->m_SpectatorId = ClampInt(pErrorMsg: "m_SpectatorId", Value: pData->m_SpectatorId, Min: SPEC_FREEVIEW, Max: MAX_CLIENTS-1);
451 } break;
452
453 case NETOBJTYPE_MYOWNOBJECT:
454 {
455 CNetObj_MyOwnObject *pData = (CNetObj_MyOwnObject *)m_aUnpackedData;
456 pData->m_Test = pUnpacker->GetUncompressedInt();
457 } break;
458
459 case NETOBJTYPE_DDNETCHARACTER:
460 {
461 CNetObj_DDNetCharacter *pData = (CNetObj_DDNetCharacter *)m_aUnpackedData;
462 pData->m_Flags = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
463 pData->m_FreezeEnd = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
464 pData->m_Jumps = pUnpacker->GetUncompressedIntOrDefault(Default: 2);
465 pData->m_TeleCheckpoint = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
466 pData->m_StrongWeakId = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
467 pData->m_JumpedTotal = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
468 pData->m_NinjaActivationTick = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
469 pData->m_FreezeStart = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
470 pData->m_TargetX = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
471 pData->m_TargetY = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
472 pData->m_Jumps = ClampInt(pErrorMsg: "m_Jumps", Value: pData->m_Jumps, Min: -1, Max: 255);
473 pData->m_StrongWeakId = ClampInt(pErrorMsg: "m_StrongWeakId", Value: pData->m_StrongWeakId, Min: 0, Max: MAX_CLIENTS-1);
474 pData->m_JumpedTotal = ClampInt(pErrorMsg: "m_JumpedTotal", Value: pData->m_JumpedTotal, Min: -1, Max: 255);
475 } break;
476
477 case NETOBJTYPE_DDNETPLAYER:
478 {
479 CNetObj_DDNetPlayer *pData = (CNetObj_DDNetPlayer *)m_aUnpackedData;
480 pData->m_Flags = pUnpacker->GetUncompressedInt();
481 pData->m_AuthLevel = pUnpacker->GetUncompressedInt();
482 pData->m_AuthLevel = ClampInt(pErrorMsg: "m_AuthLevel", Value: pData->m_AuthLevel, Min: AUTHED_NO, Max: AUTHED_ADMIN);
483 } break;
484
485 case NETOBJTYPE_GAMEINFOEX:
486 {
487 CNetObj_GameInfoEx *pData = (CNetObj_GameInfoEx *)m_aUnpackedData;
488 pData->m_Flags = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
489 pData->m_Version = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
490 pData->m_Flags2 = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
491 } break;
492
493 case NETOBJTYPE_DDRACEPROJECTILE:
494 {
495 CNetObj_DDRaceProjectile *pData = (CNetObj_DDRaceProjectile *)m_aUnpackedData;
496 pData->m_X = pUnpacker->GetUncompressedInt();
497 pData->m_Y = pUnpacker->GetUncompressedInt();
498 pData->m_Angle = pUnpacker->GetUncompressedInt();
499 pData->m_Data = pUnpacker->GetUncompressedInt();
500 pData->m_Type = pUnpacker->GetUncompressedInt();
501 pData->m_StartTick = pUnpacker->GetUncompressedInt();
502 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: NUM_WEAPONS-1);
503 } break;
504
505 case NETOBJTYPE_DDNETLASER:
506 {
507 CNetObj_DDNetLaser *pData = (CNetObj_DDNetLaser *)m_aUnpackedData;
508 pData->m_ToX = pUnpacker->GetUncompressedInt();
509 pData->m_ToY = pUnpacker->GetUncompressedInt();
510 pData->m_FromX = pUnpacker->GetUncompressedInt();
511 pData->m_FromY = pUnpacker->GetUncompressedInt();
512 pData->m_StartTick = pUnpacker->GetUncompressedInt();
513 pData->m_Owner = pUnpacker->GetUncompressedInt();
514 pData->m_Type = pUnpacker->GetUncompressedInt();
515 pData->m_SwitchNumber = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
516 pData->m_Subtype = pUnpacker->GetUncompressedIntOrDefault(Default: -1);
517 pData->m_Flags = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
518 pData->m_Owner = ClampInt(pErrorMsg: "m_Owner", Value: pData->m_Owner, Min: -1, Max: MAX_CLIENTS-1);
519 } break;
520
521 case NETOBJTYPE_DDNETPROJECTILE:
522 {
523 CNetObj_DDNetProjectile *pData = (CNetObj_DDNetProjectile *)m_aUnpackedData;
524 pData->m_X = pUnpacker->GetUncompressedInt();
525 pData->m_Y = pUnpacker->GetUncompressedInt();
526 pData->m_VelX = pUnpacker->GetUncompressedInt();
527 pData->m_VelY = pUnpacker->GetUncompressedInt();
528 pData->m_Type = pUnpacker->GetUncompressedInt();
529 pData->m_StartTick = pUnpacker->GetUncompressedInt();
530 pData->m_Owner = pUnpacker->GetUncompressedInt();
531 pData->m_SwitchNumber = pUnpacker->GetUncompressedInt();
532 pData->m_TuneZone = pUnpacker->GetUncompressedInt();
533 pData->m_Flags = pUnpacker->GetUncompressedInt();
534 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: NUM_WEAPONS-1);
535 pData->m_Owner = ClampInt(pErrorMsg: "m_Owner", Value: pData->m_Owner, Min: -1, Max: MAX_CLIENTS-1);
536 } break;
537
538 case NETOBJTYPE_DDNETPICKUP:
539 {
540 CNetObj_DDNetPickup *pData = (CNetObj_DDNetPickup *)m_aUnpackedData;
541 pData->m_X = pUnpacker->GetUncompressedInt();
542 pData->m_Y = pUnpacker->GetUncompressedInt();
543 pData->m_Type = pUnpacker->GetUncompressedInt();
544 pData->m_Subtype = pUnpacker->GetUncompressedInt();
545 pData->m_SwitchNumber = pUnpacker->GetUncompressedInt();
546 pData->m_Type = ClampInt(pErrorMsg: "m_Type", Value: pData->m_Type, Min: 0, Max: max_int);
547 pData->m_Subtype = ClampInt(pErrorMsg: "m_Subtype", Value: pData->m_Subtype, Min: 0, Max: max_int);
548 } break;
549
550 case NETEVENTTYPE_COMMON:
551 {
552 CNetEvent_Common *pData = (CNetEvent_Common *)m_aUnpackedData;
553 pData->m_X = pUnpacker->GetUncompressedInt();
554 pData->m_Y = pUnpacker->GetUncompressedInt();
555 } break;
556
557 case NETEVENTTYPE_EXPLOSION:
558 {
559 CNetEvent_Explosion *pData = (CNetEvent_Explosion *)m_aUnpackedData;
560 pData->m_X = pUnpacker->GetUncompressedInt();
561 pData->m_Y = pUnpacker->GetUncompressedInt();
562 } break;
563
564 case NETEVENTTYPE_SPAWN:
565 {
566 CNetEvent_Spawn *pData = (CNetEvent_Spawn *)m_aUnpackedData;
567 pData->m_X = pUnpacker->GetUncompressedInt();
568 pData->m_Y = pUnpacker->GetUncompressedInt();
569 } break;
570
571 case NETEVENTTYPE_HAMMERHIT:
572 {
573 CNetEvent_HammerHit *pData = (CNetEvent_HammerHit *)m_aUnpackedData;
574 pData->m_X = pUnpacker->GetUncompressedInt();
575 pData->m_Y = pUnpacker->GetUncompressedInt();
576 } break;
577
578 case NETEVENTTYPE_DEATH:
579 {
580 CNetEvent_Death *pData = (CNetEvent_Death *)m_aUnpackedData;
581 pData->m_X = pUnpacker->GetUncompressedInt();
582 pData->m_Y = pUnpacker->GetUncompressedInt();
583 pData->m_ClientId = pUnpacker->GetUncompressedInt();
584 pData->m_ClientId = ClampInt(pErrorMsg: "m_ClientId", Value: pData->m_ClientId, Min: 0, Max: MAX_CLIENTS-1);
585 } break;
586
587 case NETEVENTTYPE_SOUNDGLOBAL:
588 {
589 CNetEvent_SoundGlobal *pData = (CNetEvent_SoundGlobal *)m_aUnpackedData;
590 pData->m_X = pUnpacker->GetUncompressedInt();
591 pData->m_Y = pUnpacker->GetUncompressedInt();
592 pData->m_SoundId = pUnpacker->GetUncompressedInt();
593 pData->m_SoundId = ClampInt(pErrorMsg: "m_SoundId", Value: pData->m_SoundId, Min: 0, Max: NUM_SOUNDS-1);
594 } break;
595
596 case NETEVENTTYPE_SOUNDWORLD:
597 {
598 CNetEvent_SoundWorld *pData = (CNetEvent_SoundWorld *)m_aUnpackedData;
599 pData->m_X = pUnpacker->GetUncompressedInt();
600 pData->m_Y = pUnpacker->GetUncompressedInt();
601 pData->m_SoundId = pUnpacker->GetUncompressedInt();
602 pData->m_SoundId = ClampInt(pErrorMsg: "m_SoundId", Value: pData->m_SoundId, Min: 0, Max: NUM_SOUNDS-1);
603 } break;
604
605 case NETEVENTTYPE_DAMAGEIND:
606 {
607 CNetEvent_DamageInd *pData = (CNetEvent_DamageInd *)m_aUnpackedData;
608 pData->m_X = pUnpacker->GetUncompressedInt();
609 pData->m_Y = pUnpacker->GetUncompressedInt();
610 pData->m_Angle = pUnpacker->GetUncompressedInt();
611 } break;
612
613 case NETOBJTYPE_MYOWNEVENT:
614 {
615 CNetObj_MyOwnEvent *pData = (CNetObj_MyOwnEvent *)m_aUnpackedData;
616 pData->m_Test = pUnpacker->GetUncompressedInt();
617 } break;
618
619 case NETOBJTYPE_SPECCHAR:
620 {
621 CNetObj_SpecChar *pData = (CNetObj_SpecChar *)m_aUnpackedData;
622 pData->m_X = pUnpacker->GetUncompressedInt();
623 pData->m_Y = pUnpacker->GetUncompressedInt();
624 } break;
625
626 case NETOBJTYPE_SWITCHSTATE:
627 {
628 CNetObj_SwitchState *pData = (CNetObj_SwitchState *)m_aUnpackedData;
629 pData->m_HighestSwitchNumber = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
630 pData->m_aStatus[0] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
631 pData->m_aStatus[1] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
632 pData->m_aStatus[2] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
633 pData->m_aStatus[3] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
634 pData->m_aStatus[4] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
635 pData->m_aStatus[5] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
636 pData->m_aStatus[6] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
637 pData->m_aStatus[7] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
638 pData->m_aSwitchNumbers[0] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
639 pData->m_aSwitchNumbers[1] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
640 pData->m_aSwitchNumbers[2] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
641 pData->m_aSwitchNumbers[3] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
642 pData->m_aEndTicks[0] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
643 pData->m_aEndTicks[1] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
644 pData->m_aEndTicks[2] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
645 pData->m_aEndTicks[3] = pUnpacker->GetUncompressedIntOrDefault(Default: 0);
646 } break;
647
648 case NETOBJTYPE_ENTITYEX:
649 {
650 CNetObj_EntityEx *pData = (CNetObj_EntityEx *)m_aUnpackedData;
651 pData->m_SwitchNumber = pUnpacker->GetUncompressedInt();
652 pData->m_Layer = pUnpacker->GetUncompressedInt();
653 pData->m_EntityClass = pUnpacker->GetUncompressedInt();
654 } break;
655
656 default:
657 m_pObjFailedOn = "(type out of range)";
658 break;
659 }
660
661 if(pUnpacker->Error())
662 m_pObjFailedOn = "(unpack error)";
663
664 if(m_pObjFailedOn)
665 return 0;
666 m_pObjFailedOn = "";
667 return m_aUnpackedData;
668}
669
670void *CNetObjHandler::SecureUnpackMsg(int Type, CUnpacker *pUnpacker)
671{
672 m_pMsgFailedOn = 0;
673 switch(Type)
674 {
675
676 case NETMSGTYPE_SV_MOTD:
677 {
678 CNetMsg_Sv_Motd *pData = (CNetMsg_Sv_Motd *)m_aUnpackedData;
679 pData->m_pMessage = pUnpacker->GetString();
680 } break;
681
682 case NETMSGTYPE_SV_BROADCAST:
683 {
684 CNetMsg_Sv_Broadcast *pData = (CNetMsg_Sv_Broadcast *)m_aUnpackedData;
685 pData->m_pMessage = pUnpacker->GetString();
686 } break;
687
688 case NETMSGTYPE_SV_CHAT:
689 {
690 CNetMsg_Sv_Chat *pData = (CNetMsg_Sv_Chat *)m_aUnpackedData;
691 pData->m_Team = pUnpacker->GetInt();
692 pData->m_ClientId = pUnpacker->GetInt();
693 pData->m_pMessage = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC);
694 if(pData->m_Team < -2 || pData->m_Team > 3) { m_pMsgFailedOn = "m_Team"; break; }
695 if(pData->m_ClientId < -1 || pData->m_ClientId > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_ClientId"; break; }
696 } break;
697
698 case NETMSGTYPE_SV_KILLMSG:
699 {
700 CNetMsg_Sv_KillMsg *pData = (CNetMsg_Sv_KillMsg *)m_aUnpackedData;
701 pData->m_Killer = pUnpacker->GetInt();
702 pData->m_Victim = pUnpacker->GetInt();
703 pData->m_Weapon = pUnpacker->GetInt();
704 pData->m_ModeSpecial = pUnpacker->GetInt();
705 if(pData->m_Killer < 0 || pData->m_Killer > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_Killer"; break; }
706 if(pData->m_Victim < 0 || pData->m_Victim > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_Victim"; break; }
707 if(pData->m_Weapon < -3 || pData->m_Weapon > NUM_WEAPONS-1) { m_pMsgFailedOn = "m_Weapon"; break; }
708 } break;
709
710 case NETMSGTYPE_SV_SOUNDGLOBAL:
711 {
712 CNetMsg_Sv_SoundGlobal *pData = (CNetMsg_Sv_SoundGlobal *)m_aUnpackedData;
713 pData->m_SoundId = pUnpacker->GetInt();
714 if(pData->m_SoundId < 0 || pData->m_SoundId > NUM_SOUNDS-1) { m_pMsgFailedOn = "m_SoundId"; break; }
715 } break;
716
717 case NETMSGTYPE_SV_TUNEPARAMS:
718 {
719 CNetMsg_Sv_TuneParams *pData = (CNetMsg_Sv_TuneParams *)m_aUnpackedData;
720 (void)pData;
721 } break;
722
723 case NETMSGTYPE_UNUSED:
724 {
725 CNetMsg_Unused *pData = (CNetMsg_Unused *)m_aUnpackedData;
726 (void)pData;
727 } break;
728
729 case NETMSGTYPE_SV_READYTOENTER:
730 {
731 CNetMsg_Sv_ReadyToEnter *pData = (CNetMsg_Sv_ReadyToEnter *)m_aUnpackedData;
732 (void)pData;
733 } break;
734
735 case NETMSGTYPE_SV_WEAPONPICKUP:
736 {
737 CNetMsg_Sv_WeaponPickup *pData = (CNetMsg_Sv_WeaponPickup *)m_aUnpackedData;
738 pData->m_Weapon = pUnpacker->GetInt();
739 if(pData->m_Weapon < 0 || pData->m_Weapon > NUM_WEAPONS-1) { m_pMsgFailedOn = "m_Weapon"; break; }
740 } break;
741
742 case NETMSGTYPE_SV_EMOTICON:
743 {
744 CNetMsg_Sv_Emoticon *pData = (CNetMsg_Sv_Emoticon *)m_aUnpackedData;
745 pData->m_ClientId = pUnpacker->GetInt();
746 pData->m_Emoticon = pUnpacker->GetInt();
747 if(pData->m_ClientId < 0 || pData->m_ClientId > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_ClientId"; break; }
748 if(pData->m_Emoticon < 0 || pData->m_Emoticon > NUM_EMOTICONS-1) { m_pMsgFailedOn = "m_Emoticon"; break; }
749 } break;
750
751 case NETMSGTYPE_SV_VOTECLEAROPTIONS:
752 {
753 CNetMsg_Sv_VoteClearOptions *pData = (CNetMsg_Sv_VoteClearOptions *)m_aUnpackedData;
754 (void)pData;
755 } break;
756
757 case NETMSGTYPE_SV_VOTEOPTIONLISTADD:
758 {
759 CNetMsg_Sv_VoteOptionListAdd *pData = (CNetMsg_Sv_VoteOptionListAdd *)m_aUnpackedData;
760 pData->m_NumOptions = pUnpacker->GetInt();
761 pData->m_pDescription0 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
762 pData->m_pDescription1 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
763 pData->m_pDescription2 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
764 pData->m_pDescription3 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
765 pData->m_pDescription4 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
766 pData->m_pDescription5 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
767 pData->m_pDescription6 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
768 pData->m_pDescription7 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
769 pData->m_pDescription8 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
770 pData->m_pDescription9 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
771 pData->m_pDescription10 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
772 pData->m_pDescription11 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
773 pData->m_pDescription12 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
774 pData->m_pDescription13 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
775 pData->m_pDescription14 = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
776 if(pData->m_NumOptions < 1 || pData->m_NumOptions > 15) { m_pMsgFailedOn = "m_NumOptions"; break; }
777 } break;
778
779 case NETMSGTYPE_SV_VOTEOPTIONADD:
780 {
781 CNetMsg_Sv_VoteOptionAdd *pData = (CNetMsg_Sv_VoteOptionAdd *)m_aUnpackedData;
782 pData->m_pDescription = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
783 } break;
784
785 case NETMSGTYPE_SV_VOTEOPTIONREMOVE:
786 {
787 CNetMsg_Sv_VoteOptionRemove *pData = (CNetMsg_Sv_VoteOptionRemove *)m_aUnpackedData;
788 pData->m_pDescription = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
789 } break;
790
791 case NETMSGTYPE_SV_VOTESET:
792 {
793 CNetMsg_Sv_VoteSet *pData = (CNetMsg_Sv_VoteSet *)m_aUnpackedData;
794 pData->m_Timeout = pUnpacker->GetInt();
795 pData->m_pDescription = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
796 pData->m_pReason = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
797 if(pData->m_Timeout < 0 || pData->m_Timeout > max_int) { m_pMsgFailedOn = "m_Timeout"; break; }
798 } break;
799
800 case NETMSGTYPE_SV_VOTESTATUS:
801 {
802 CNetMsg_Sv_VoteStatus *pData = (CNetMsg_Sv_VoteStatus *)m_aUnpackedData;
803 pData->m_Yes = pUnpacker->GetInt();
804 pData->m_No = pUnpacker->GetInt();
805 pData->m_Pass = pUnpacker->GetInt();
806 pData->m_Total = pUnpacker->GetInt();
807 if(pData->m_Yes < 0 || pData->m_Yes > MAX_CLIENTS) { m_pMsgFailedOn = "m_Yes"; break; }
808 if(pData->m_No < 0 || pData->m_No > MAX_CLIENTS) { m_pMsgFailedOn = "m_No"; break; }
809 if(pData->m_Pass < 0 || pData->m_Pass > MAX_CLIENTS) { m_pMsgFailedOn = "m_Pass"; break; }
810 if(pData->m_Total < 0 || pData->m_Total > MAX_CLIENTS) { m_pMsgFailedOn = "m_Total"; break; }
811 } break;
812
813 case NETMSGTYPE_CL_SAY:
814 {
815 CNetMsg_Cl_Say *pData = (CNetMsg_Cl_Say *)m_aUnpackedData;
816 pData->m_Team = pUnpacker->GetInt();
817 pData->m_pMessage = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC);
818 if(pData->m_Team < 0 || pData->m_Team > 1) { m_pMsgFailedOn = "m_Team"; break; }
819 } break;
820
821 case NETMSGTYPE_CL_SETTEAM:
822 {
823 CNetMsg_Cl_SetTeam *pData = (CNetMsg_Cl_SetTeam *)m_aUnpackedData;
824 pData->m_Team = pUnpacker->GetInt();
825 if(pData->m_Team < TEAM_SPECTATORS || pData->m_Team > TEAM_BLUE) { m_pMsgFailedOn = "m_Team"; break; }
826 } break;
827
828 case NETMSGTYPE_CL_SETSPECTATORMODE:
829 {
830 CNetMsg_Cl_SetSpectatorMode *pData = (CNetMsg_Cl_SetSpectatorMode *)m_aUnpackedData;
831 pData->m_SpectatorId = pUnpacker->GetInt();
832 if(pData->m_SpectatorId < SPEC_FREEVIEW || pData->m_SpectatorId > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_SpectatorId"; break; }
833 } break;
834
835 case NETMSGTYPE_CL_STARTINFO:
836 {
837 CNetMsg_Cl_StartInfo *pData = (CNetMsg_Cl_StartInfo *)m_aUnpackedData;
838 pData->m_pName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
839 pData->m_pClan = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
840 pData->m_Country = pUnpacker->GetInt();
841 pData->m_pSkin = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
842 pData->m_UseCustomColor = pUnpacker->GetInt();
843 pData->m_ColorBody = pUnpacker->GetInt();
844 pData->m_ColorFeet = pUnpacker->GetInt();
845 if(pData->m_UseCustomColor < 0 || pData->m_UseCustomColor > 1) { m_pMsgFailedOn = "m_UseCustomColor"; break; }
846 } break;
847
848 case NETMSGTYPE_CL_CHANGEINFO:
849 {
850 CNetMsg_Cl_ChangeInfo *pData = (CNetMsg_Cl_ChangeInfo *)m_aUnpackedData;
851 pData->m_pName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
852 pData->m_pClan = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
853 pData->m_Country = pUnpacker->GetInt();
854 pData->m_pSkin = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
855 pData->m_UseCustomColor = pUnpacker->GetInt();
856 pData->m_ColorBody = pUnpacker->GetInt();
857 pData->m_ColorFeet = pUnpacker->GetInt();
858 if(pData->m_UseCustomColor < 0 || pData->m_UseCustomColor > 1) { m_pMsgFailedOn = "m_UseCustomColor"; break; }
859 } break;
860
861 case NETMSGTYPE_CL_KILL:
862 {
863 CNetMsg_Cl_Kill *pData = (CNetMsg_Cl_Kill *)m_aUnpackedData;
864 (void)pData;
865 } break;
866
867 case NETMSGTYPE_CL_EMOTICON:
868 {
869 CNetMsg_Cl_Emoticon *pData = (CNetMsg_Cl_Emoticon *)m_aUnpackedData;
870 pData->m_Emoticon = pUnpacker->GetInt();
871 if(pData->m_Emoticon < 0 || pData->m_Emoticon > NUM_EMOTICONS-1) { m_pMsgFailedOn = "m_Emoticon"; break; }
872 } break;
873
874 case NETMSGTYPE_CL_VOTE:
875 {
876 CNetMsg_Cl_Vote *pData = (CNetMsg_Cl_Vote *)m_aUnpackedData;
877 pData->m_Vote = pUnpacker->GetInt();
878 if(pData->m_Vote < -1 || pData->m_Vote > 1) { m_pMsgFailedOn = "m_Vote"; break; }
879 } break;
880
881 case NETMSGTYPE_CL_CALLVOTE:
882 {
883 CNetMsg_Cl_CallVote *pData = (CNetMsg_Cl_CallVote *)m_aUnpackedData;
884 pData->m_pType = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
885 pData->m_pValue = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
886 pData->m_pReason = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
887 } break;
888
889 case NETMSGTYPE_CL_ISDDNETLEGACY:
890 {
891 CNetMsg_Cl_IsDDNetLegacy *pData = (CNetMsg_Cl_IsDDNetLegacy *)m_aUnpackedData;
892 (void)pData;
893 } break;
894
895 case NETMSGTYPE_SV_DDRACETIMELEGACY:
896 {
897 CNetMsg_Sv_DDRaceTimeLegacy *pData = (CNetMsg_Sv_DDRaceTimeLegacy *)m_aUnpackedData;
898 pData->m_Time = pUnpacker->GetInt();
899 pData->m_Check = pUnpacker->GetInt();
900 pData->m_Finish = pUnpacker->GetInt();
901 if(pData->m_Finish < 0 || pData->m_Finish > 1) { m_pMsgFailedOn = "m_Finish"; break; }
902 } break;
903
904 case NETMSGTYPE_SV_RECORDLEGACY:
905 {
906 CNetMsg_Sv_RecordLegacy *pData = (CNetMsg_Sv_RecordLegacy *)m_aUnpackedData;
907 pData->m_ServerTimeBest = pUnpacker->GetInt();
908 pData->m_PlayerTimeBest = pUnpacker->GetInt();
909 } break;
910
911 case NETMSGTYPE_UNUSED2:
912 {
913 CNetMsg_Unused2 *pData = (CNetMsg_Unused2 *)m_aUnpackedData;
914 (void)pData;
915 } break;
916
917 case NETMSGTYPE_SV_TEAMSSTATELEGACY:
918 {
919 CNetMsg_Sv_TeamsStateLegacy *pData = (CNetMsg_Sv_TeamsStateLegacy *)m_aUnpackedData;
920 (void)pData;
921 } break;
922
923 case NETMSGTYPE_CL_SHOWOTHERSLEGACY:
924 {
925 CNetMsg_Cl_ShowOthersLegacy *pData = (CNetMsg_Cl_ShowOthersLegacy *)m_aUnpackedData;
926 pData->m_Show = pUnpacker->GetInt();
927 if(pData->m_Show < 0 || pData->m_Show > 1) { m_pMsgFailedOn = "m_Show"; break; }
928 } break;
929
930 case NETMSGTYPE_SV_MYOWNMESSAGE:
931 {
932 CNetMsg_Sv_MyOwnMessage *pData = (CNetMsg_Sv_MyOwnMessage *)m_aUnpackedData;
933 pData->m_Test = pUnpacker->GetInt();
934 } break;
935
936 case NETMSGTYPE_CL_SHOWDISTANCE:
937 {
938 CNetMsg_Cl_ShowDistance *pData = (CNetMsg_Cl_ShowDistance *)m_aUnpackedData;
939 pData->m_X = pUnpacker->GetInt();
940 pData->m_Y = pUnpacker->GetInt();
941 } break;
942
943 case NETMSGTYPE_CL_SHOWOTHERS:
944 {
945 CNetMsg_Cl_ShowOthers *pData = (CNetMsg_Cl_ShowOthers *)m_aUnpackedData;
946 pData->m_Show = pUnpacker->GetInt();
947 if(pData->m_Show < 0 || pData->m_Show > 2) { m_pMsgFailedOn = "m_Show"; break; }
948 } break;
949
950 case NETMSGTYPE_SV_TEAMSSTATE:
951 {
952 CNetMsg_Sv_TeamsState *pData = (CNetMsg_Sv_TeamsState *)m_aUnpackedData;
953 (void)pData;
954 } break;
955
956 case NETMSGTYPE_SV_DDRACETIME:
957 {
958 CNetMsg_Sv_DDRaceTime *pData = (CNetMsg_Sv_DDRaceTime *)m_aUnpackedData;
959 pData->m_Time = pUnpacker->GetInt();
960 pData->m_Check = pUnpacker->GetInt();
961 pData->m_Finish = pUnpacker->GetInt();
962 if(pData->m_Finish < 0 || pData->m_Finish > 1) { m_pMsgFailedOn = "m_Finish"; break; }
963 } break;
964
965 case NETMSGTYPE_SV_RECORD:
966 {
967 CNetMsg_Sv_Record *pData = (CNetMsg_Sv_Record *)m_aUnpackedData;
968 pData->m_ServerTimeBest = pUnpacker->GetInt();
969 pData->m_PlayerTimeBest = pUnpacker->GetInt();
970 } break;
971
972 case NETMSGTYPE_SV_KILLMSGTEAM:
973 {
974 CNetMsg_Sv_KillMsgTeam *pData = (CNetMsg_Sv_KillMsgTeam *)m_aUnpackedData;
975 pData->m_Team = pUnpacker->GetInt();
976 pData->m_First = pUnpacker->GetInt();
977 if(pData->m_Team < 0 || pData->m_Team > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_Team"; break; }
978 if(pData->m_First < -1 || pData->m_First > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_First"; break; }
979 } break;
980
981 case NETMSGTYPE_SV_YOURVOTE:
982 {
983 CNetMsg_Sv_YourVote *pData = (CNetMsg_Sv_YourVote *)m_aUnpackedData;
984 pData->m_Voted = pUnpacker->GetInt();
985 if(pData->m_Voted < -1 || pData->m_Voted > 1) { m_pMsgFailedOn = "m_Voted"; break; }
986 } break;
987
988 case NETMSGTYPE_SV_RACEFINISH:
989 {
990 CNetMsg_Sv_RaceFinish *pData = (CNetMsg_Sv_RaceFinish *)m_aUnpackedData;
991 pData->m_ClientId = pUnpacker->GetInt();
992 pData->m_Time = pUnpacker->GetInt();
993 pData->m_Diff = pUnpacker->GetInt();
994 pData->m_RecordPersonal = pUnpacker->GetInt();
995 pData->m_RecordServer = pUnpacker->GetIntOrDefault(Default: 0);
996 if(pData->m_ClientId < 0 || pData->m_ClientId > MAX_CLIENTS-1) { m_pMsgFailedOn = "m_ClientId"; break; }
997 if(pData->m_RecordPersonal < 0 || pData->m_RecordPersonal > 1) { m_pMsgFailedOn = "m_RecordPersonal"; break; }
998 if(pData->m_RecordServer < 0 || pData->m_RecordServer > 1) { m_pMsgFailedOn = "m_RecordServer"; break; }
999 } break;
1000
1001 case NETMSGTYPE_SV_COMMANDINFO:
1002 {
1003 CNetMsg_Sv_CommandInfo *pData = (CNetMsg_Sv_CommandInfo *)m_aUnpackedData;
1004 pData->m_pName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1005 pData->m_pArgsFormat = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1006 pData->m_pHelpText = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1007 } break;
1008
1009 case NETMSGTYPE_SV_COMMANDINFOREMOVE:
1010 {
1011 CNetMsg_Sv_CommandInfoRemove *pData = (CNetMsg_Sv_CommandInfoRemove *)m_aUnpackedData;
1012 pData->m_pName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC|CUnpacker::SKIP_START_WHITESPACES);
1013 } break;
1014
1015 case NETMSGTYPE_SV_VOTEOPTIONGROUPSTART:
1016 {
1017 CNetMsg_Sv_VoteOptionGroupStart *pData = (CNetMsg_Sv_VoteOptionGroupStart *)m_aUnpackedData;
1018 (void)pData;
1019 } break;
1020
1021 case NETMSGTYPE_SV_VOTEOPTIONGROUPEND:
1022 {
1023 CNetMsg_Sv_VoteOptionGroupEnd *pData = (CNetMsg_Sv_VoteOptionGroupEnd *)m_aUnpackedData;
1024 (void)pData;
1025 } break;
1026
1027 case NETMSGTYPE_SV_COMMANDINFOGROUPSTART:
1028 {
1029 CNetMsg_Sv_CommandInfoGroupStart *pData = (CNetMsg_Sv_CommandInfoGroupStart *)m_aUnpackedData;
1030 (void)pData;
1031 } break;
1032
1033 case NETMSGTYPE_SV_COMMANDINFOGROUPEND:
1034 {
1035 CNetMsg_Sv_CommandInfoGroupEnd *pData = (CNetMsg_Sv_CommandInfoGroupEnd *)m_aUnpackedData;
1036 (void)pData;
1037 } break;
1038
1039 case NETMSGTYPE_SV_CHANGEINFOCOOLDOWN:
1040 {
1041 CNetMsg_Sv_ChangeInfoCooldown *pData = (CNetMsg_Sv_ChangeInfoCooldown *)m_aUnpackedData;
1042 pData->m_WaitUntil = pUnpacker->GetInt();
1043 } break;
1044
1045 default:
1046 m_pMsgFailedOn = "(type out of range)";
1047 break;
1048 }
1049
1050 if(pUnpacker->Error())
1051 m_pMsgFailedOn = "(unpack error)";
1052
1053 if(m_pMsgFailedOn)
1054 return 0;
1055 m_pMsgFailedOn = "";
1056 return m_aUnpackedData;
1057}
1058
1059bool CNetObjHandler::TeeHistorianRecordMsg(int Type)
1060{
1061 switch(Type)
1062 {
1063
1064 case NETMSGTYPE_CL_SAY:
1065 case NETMSGTYPE_CL_VOTE:
1066 case NETMSGTYPE_CL_CALLVOTE:
1067 return false;
1068 default:
1069 return true;
1070 }
1071}
1072
1073void RegisterGameUuids(CUuidManager *pManager)
1074{
1075
1076 pManager->RegisterName(Id: NETOBJTYPE_MYOWNOBJECT, pName: "my-own-object@heinrich5991.de");
1077 pManager->RegisterName(Id: NETOBJTYPE_DDNETCHARACTER, pName: "character@netobj.ddnet.tw");
1078 pManager->RegisterName(Id: NETOBJTYPE_DDNETPLAYER, pName: "player@netobj.ddnet.tw");
1079 pManager->RegisterName(Id: NETOBJTYPE_GAMEINFOEX, pName: "gameinfo@netobj.ddnet.tw");
1080 pManager->RegisterName(Id: NETOBJTYPE_DDRACEPROJECTILE, pName: "projectile@netobj.ddnet.tw");
1081 pManager->RegisterName(Id: NETOBJTYPE_DDNETLASER, pName: "laser@netobj.ddnet.tw");
1082 pManager->RegisterName(Id: NETOBJTYPE_DDNETPROJECTILE, pName: "ddnet-projectile@netobj.ddnet.tw");
1083 pManager->RegisterName(Id: NETOBJTYPE_DDNETPICKUP, pName: "pickup@netobj.ddnet.tw");
1084 pManager->RegisterName(Id: NETOBJTYPE_MYOWNEVENT, pName: "my-own-event@heinrich5991.de");
1085 pManager->RegisterName(Id: NETOBJTYPE_SPECCHAR, pName: "spec-char@netobj.ddnet.tw");
1086 pManager->RegisterName(Id: NETOBJTYPE_SWITCHSTATE, pName: "switch-state@netobj.ddnet.tw");
1087 pManager->RegisterName(Id: NETOBJTYPE_ENTITYEX, pName: "entity-ex@netobj.ddnet.tw");
1088 pManager->RegisterName(Id: NETMSGTYPE_SV_MYOWNMESSAGE, pName: "my-own-message@heinrich5991.de");
1089 pManager->RegisterName(Id: NETMSGTYPE_CL_SHOWDISTANCE, pName: "show-distance@netmsg.ddnet.tw");
1090 pManager->RegisterName(Id: NETMSGTYPE_CL_SHOWOTHERS, pName: "showothers@netmsg.ddnet.tw");
1091 pManager->RegisterName(Id: NETMSGTYPE_SV_TEAMSSTATE, pName: "teamsstate@netmsg.ddnet.tw");
1092 pManager->RegisterName(Id: NETMSGTYPE_SV_DDRACETIME, pName: "ddrace-time@netmsg.ddnet.tw");
1093 pManager->RegisterName(Id: NETMSGTYPE_SV_RECORD, pName: "record@netmsg.ddnet.tw");
1094 pManager->RegisterName(Id: NETMSGTYPE_SV_KILLMSGTEAM, pName: "killmsgteam@netmsg.ddnet.tw");
1095 pManager->RegisterName(Id: NETMSGTYPE_SV_YOURVOTE, pName: "yourvote@netmsg.ddnet.org");
1096 pManager->RegisterName(Id: NETMSGTYPE_SV_RACEFINISH, pName: "racefinish@netmsg.ddnet.org");
1097 pManager->RegisterName(Id: NETMSGTYPE_SV_COMMANDINFO, pName: "commandinfo@netmsg.ddnet.org");
1098 pManager->RegisterName(Id: NETMSGTYPE_SV_COMMANDINFOREMOVE, pName: "commandinfo-remove@netmsg.ddnet.org");
1099 pManager->RegisterName(Id: NETMSGTYPE_SV_VOTEOPTIONGROUPSTART, pName: "sv-vote-option-group-start@netmsg.ddnet.org");
1100 pManager->RegisterName(Id: NETMSGTYPE_SV_VOTEOPTIONGROUPEND, pName: "sv-vote-option-group-end@netmsg.ddnet.org");
1101 pManager->RegisterName(Id: NETMSGTYPE_SV_COMMANDINFOGROUPSTART, pName: "sv-commandinfo-group-start@netmsg.ddnet.org");
1102 pManager->RegisterName(Id: NETMSGTYPE_SV_COMMANDINFOGROUPEND, pName: "sv-commandinfo-group-end@netmsg.ddnet.org");
1103 pManager->RegisterName(Id: NETMSGTYPE_SV_CHANGEINFOCOOLDOWN, pName: "change-info-cooldown@netmsg.ddnet.org");
1104
1105 RegisterMapItemTypeUuids(pManager);
1106}
1107
1108