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 | |
10 | CNetObjHandler::CNetObjHandler() |
11 | { |
12 | m_pMsgFailedOn = "" ; |
13 | m_pObjFailedOn = "" ; |
14 | m_pObjCorrectedOn = "" ; |
15 | m_NumObjCorrections = 0; |
16 | } |
17 | |
18 | int CNetObjHandler::NumObjCorrections() const { return m_NumObjCorrections; } |
19 | const char *CNetObjHandler::CorrectedObjOn() const { return m_pObjCorrectedOn; } |
20 | const char *CNetObjHandler::FailedObjOn() const { return m_pObjFailedOn; } |
21 | const char *CNetObjHandler::FailedMsgOn() const { return m_pMsgFailedOn; } |
22 | |
23 | static const int max_int = 0x7fffffff; |
24 | static const int min_int = 0x80000000; |
25 | |
26 | int 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 | |
33 | const 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 | |
58 | const 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 | |
75 | int 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 | |
100 | int 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 | |
124 | int 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 | |
140 | const 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 | |
176 | const 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 | |
197 | const 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 | |
210 | int CNetObjHandler::GetObjSize(int Type) const |
211 | { |
212 | if(Type < 0 || Type >= NUM_NETOBJTYPES) return 0; |
213 | return ms_aObjSizes[Type]; |
214 | } |
215 | |
216 | int 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 | |
229 | const 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 | |
242 | void *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 | |
670 | void *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 | |
1059 | bool 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 | |
1073 | void 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 | |