· 10 years ago · Jul 06, 2016, 05:24 PM
1#include <amxmodx>
2#include <amxmisc>
3#include <cstrike>
4#include <engine>
5#include <fakemeta>
6#include <hamsandwich>
7#include <fun>
8#include <nvault>
9#include <sqlx>
10#include <colorchat>
11#include <colorstatus>
12#include <roundcontrol>
13
14#pragma semicolon 1
15
16#define ADMIN_ACCESS ADMIN_BAN
17
18enum
19{
20 PRO_TOP = 0,
21 NUB_TOP = 1
22}
23
24const FL_ONGROUND2 = (FL_ONGROUND | FL_PARTIALGROUND | FL_INWATER | FL_CONVEYOR | FL_FLOAT);
25
26new const g_szVersion[] = "0.1";
27
28new const g_szPrefix[] = "KZ";
29
30new g_szDefaultMapLight[32];
31new g_szMapName[32];
32
33new Trie:g_tStarts;
34new Trie:g_tStops;
35
36new bool:g_bStarted[33];
37new bool:g_bPaused[33];
38new bool:g_bHook[33];
39new bool:g_bInvisiblePlayers[33];
40new bool:g_bInvisibleWater[33];
41new bool:g_bAllowTeleport[33];
42new bool:g_bCheckPointAngles[33];
43new bool:g_bCustomStart[33];
44
45new bool:g_bHealthBoosterFound;
46new bool:g_bWaterEntity[900+15*32];
47new bool:g_bWaterFound;
48new bool:g_bStartPosition;
49
50new Float:g_flStartTime[33];
51new Float:g_flPauseTime[33];
52new Float:g_flCmdDelay[33];
53new Float:g_vCheckPointOrigin[33][3];
54new Float:g_vCheckPointAngles[33][3];
55new Float:g_vStuckOrigin[33][3];
56new Float:g_vStuckAngles[33][3];
57new Float:g_vTempOrigin[33][3];
58new Float:g_vCustomStartOrigin[33][3];
59new Float:g_vStartOrigin[3];
60new Float:g_flStartDelay[33];//Hook guard
61
62new g_iHealth[33];
63new g_iCheckPoints[33];
64new g_iGoChecks[33];
65new g_iNightVision[33];
66new g_iSpectatedID[33];//Invis
67new g_iPlayersMenuPage[33];
68new g_iPlayerMenuPlayers[33][32];
69
70new g_iMsgScreenFade;
71new g_iMsgHideWeapon;
72new g_iMsgShowTimer;
73
74new g_iLightStyleForward;
75new g_iVault;
76new g_iHudSyncObj;
77new g_iHudSyncObj2;
78new g_iMaxPlayers;
79
80new Handle:g_hSqlTuple;
81new Handle:g_hSqlConnection;
82
83new g_pSqlHostName;
84new g_pSqlUserName;
85new g_pSqlPassword;
86new g_pSqlDataBase;
87
88//BuyZone
89#if cellbits == 32
90 #define OFFSET_BZ 235
91#else
92 #define OFFSET_BZ 268
93#endif
94
95new const g_szWeaponNames[][] =
96{
97 "",
98 "p228", "shield", "scout", "hegrenade", "xm1014", "c4",
99 "mac10", "aug", "smokegrenade", "elite", "fiveseven",
100 "ump45", "sg550", "galil", "famas", "usp", "glock18",
101 "awp", "mp5navy", "m249", "m3", "m4a1", "tmp", "g3sg1",
102 "flashbang", "deagle", "sg552", "ak47", "knife", "p90",
103 "glock", "elites", "fn57", "mp5", "vest", "vesthelm",
104 "flash", "hegren", "sgren", "defuser", "nvgs", "primammo",
105 "secammo", "km45", "9x19mm", "nighthawk", "228compact",
106 "12gauge", "autoshotgun", "mp", "c90", "cv47", "defender",
107 "clarion", "krieg552", "bullpup", "magnum", "d3au1",
108 "krieg550"
109};
110
111public plugin_precache()
112{
113 RegisterHam(Ham_Spawn, "func_door", "fwdSpawnFuncDoor", 1);
114
115 g_iLightStyleForward = register_forward(FM_LightStyle, "fwdLightStyle");
116}
117public plugin_init()
118{
119 unregister_forward(FM_LightStyle, g_iLightStyleForward);
120
121 initColorStatus();
122
123 register_plugin("Kreedz mod", g_szVersion, "deniS");
124
125 g_pSqlHostName = register_cvar("kz_sql_hostname", "127.0.0.1");
126 g_pSqlUserName = register_cvar("kz_sql_username", "root");
127 g_pSqlPassword = register_cvar("kz_sql_password", "vertrigo");
128 g_pSqlDataBase = register_cvar("kz_sql_database", "kreedz");
129
130 g_tStarts = TrieCreate();
131 g_tStops = TrieCreate();
132
133 get_mapname(g_szMapName, charsmax(g_szMapName));
134
135 if
136 (
137 equali(g_szMapName, "kz_a2_bhop_corruo_ez") ||
138 equali(g_szMapName, "kz_a2_bhop_corruo_h") ||
139 equali(g_szMapName, "kz_a2_godspeed")
140 )
141 RegisterHam(Ham_Touch, "func_button", "fwdButtonHandler");
142 else
143 RegisterHam(Ham_Use, "func_button", "fwdButtonHandler");
144
145 new i, iSize;
146
147 new const szStarts[][] =
148 {
149 "counter_start", "clockstartbutton", "firsttimerelay", "but_start", "counter_start_button",
150 "multi_start", "timer_startbutton", "start_timer_emi", "gogogo"
151 };
152 iSize = sizeof(szStarts);
153
154 for (i = 0; i < iSize; i++)
155 TrieSetCell(g_tStarts, szStarts[i], 1);
156
157 new const szStops[][] =
158 {
159 "counter_off", "clockstopbutton", "clockstop", "but_stop", "counter_stop_button",
160 "multi_stop", "stop_counter", "m_counter_end_emi"
161 };
162 iSize = sizeof(szStops);
163
164 for (i = 0; i < iSize; i++)
165 TrieSetCell(g_tStops, szStops[i], 1);
166
167 RegisterHam(Ham_Spawn, "player", "fwdSpawnPlayer_Post", 1);
168 RegisterHam(Ham_Killed, "player", "fwdKilledPlayer_Post", 1);
169 RegisterHam(Ham_TakeDamage, "player", "fwdTakeDmgPlayer");
170 RegisterHam(Ham_Touch, "weaponbox", "fwdTouchWeapon");
171 RegisterHam(Ham_Touch, "armoury_entity", "fwdTouchWeapon");
172 RegisterHam(Ham_Touch, "weapon_shield", "fwdTouchWeapon");
173
174 register_touch("weaponbox", "", "WeaponBoxTouch");
175
176 register_concmd("drop", "cmdDrop");
177
178 register_forward(FM_ClientKill, "fwdClinetKill");
179 register_forward(FM_AddToFullPack, "fwdAddToFullPack_Post", 1);
180
181 register_event("ResetHUD", "Event_ResetHUD", "b");
182 register_event("Health", "Event_Health", "b");
183 register_event("BombDrop", "Event_BombDropped", "a", "4=1");
184 register_event("SpecHealth2", "Event_SpecHealth2", "bd");
185
186 g_iMsgHideWeapon = get_user_msgid("HideWeapon");
187 g_iMsgShowTimer = get_user_msgid("ShowTimer");
188 g_iMsgScreenFade = get_user_msgid("ScreenFade");
189
190 register_message(g_iMsgHideWeapon, "MsgHideWeapon");
191 register_message(g_iMsgScreenFade, "MsgScreenFade");
192 register_message(get_user_msgid("NVGToggle"), "MsgNVGToggle");
193 register_message(get_user_msgid("StatusIcon"), "MsgStatusIcon");
194 register_message(get_user_msgid("RoundTime"),"MsgRoundTime");
195 register_message(get_user_msgid("ShowMenu"), "MsgShowMenu");
196 register_message(get_user_msgid("VGUIMenu"), "MsgVGUIMenu");
197
198 new iBuyZone = create_entity("info_map_parameters");
199
200 DispatchKeyValue(iBuyZone, "buying", "3");
201 DispatchSpawn(iBuyZone);
202
203 new iEntity = create_entity("info_target");
204
205 if (iEntity)
206 {
207 entity_set_float(iEntity, EV_FL_nextthink, get_gametime() + 0.01);
208 entity_set_string(iEntity, EV_SZ_classname, "KZ");
209 register_think("KZ", "KZ_Think");
210 }
211
212 new const iKeys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9);
213
214 register_menu("MainMenu", iKeys, "MainMenu_Handler", 0);
215 register_menu("ClimbMenu", iKeys, "ClimbMenu_Handler", 0);
216 register_menu("TimerMenu", iKeys, "TimerMenu_Handler", 0);
217// register_menu("DuelMenu", iKeys, "DuelMenu_Handler", 0); to do
218 register_menucmd(register_menuid("TeleportMenu"), 1023, "TeleportMenu_Handler");
219 register_menu("ConfigMenu", iKeys, "ConfigMenu_Handler", 0);
220
221 register_clcmd("chooseteam", "cmdMainMenu");
222
223 register_clcmd("say /menu", "cmdMainMenu");
224
225 register_clcmd("say /climbmenu", "cmdClimbMenu");
226
227 register_clcmd("say /timermenu", "cmdTimerMenu");
228
229 register_clcmd("say /teleport", "cmdTeleportMenu");
230 register_clcmd("say /teleportmenu", "cmdTeleportMenu");
231
232 register_clcmd("say /configmenu", "cmdConfigMenu");
233 register_clcmd("say /config", "cmdConfigMenu");
234 register_clcmd("say /invis", "cmdConfigMenu");
235
236 register_clcmd("say /pause", "cmdPause");
237 register_clcmd("say /unpause", "cmdPause");
238
239 register_clcmd("say /spec", "cmdSpec");
240 register_clcmd("say /ct", "cmdSpec");
241
242 register_clcmd("say /nc", "cmdNoClip");
243 register_clcmd("say /noclip", "cmdNoClip");
244
245 register_clcmd("say /cp", "cmdCheckPoint");
246 register_clcmd("say /checkpoint", "cmdCheckPoint");
247
248 register_clcmd("say /gc", "cmdGoCheck");
249 register_clcmd("say /gocheck", "cmdGoCheck");
250 register_clcmd("say /tp", "cmdGoCheck");
251 register_clcmd("say /teleport", "cmdGoCheck");
252
253 register_clcmd("say /stuck", "cmdStuck");
254
255 register_clcmd("say /reset", "cmdReset");
256
257 register_clcmd("say /weapons", "cmdWeapons");
258
259 register_clcmd("say /setstart", "cmdSetStart");
260 register_clcmd("say /delstart", "cmdDelStart");
261
262 register_clcmd("say /start", "cmdStart");
263
264 register_clcmd("+hook", "cmdHookON");
265 register_clcmd("-hook", "cmdHookOFF");
266
267 g_iHudSyncObj = CreateHudSyncObj();
268 g_iHudSyncObj2 = CreateHudSyncObj();
269 g_iMaxPlayers = get_maxplayers();
270
271 SetBlockControl(RC_CheckWinConditions);
272}
273public plugin_cfg()
274{
275 g_iVault = nvault_open("KZ_StartPositions");
276
277 LoadStartPosition();
278
279 new iEntity = -1;
280 while ((iEntity = find_ent_by_class(iEntity, "func_watter")) != 0)
281 {
282 if (!g_bWaterFound)
283 g_bWaterFound = !g_bWaterFound;
284
285 g_bWaterEntity[iEntity] = !g_bWaterEntity[iEntity];
286 }
287
288 iEntity = -1;
289 while ((iEntity = find_ent_by_class(iEntity, "func_illusionary")) != 0)
290 {
291 if (pev(iEntity, pev_skin) == CONTENTS_WATER)
292 {
293 if (!g_bWaterFound)
294 g_bWaterFound = !g_bWaterFound;
295
296 g_bWaterEntity[iEntity] = !g_bWaterEntity[iEntity];
297 }
298 }
299
300 iEntity = -1;
301 while ((iEntity = find_ent_by_class(iEntity, "func_illusionary")) != 0)
302 {
303 if (pev(iEntity, pev_spawnflags) == 3)
304 {
305 if (!g_bWaterFound)
306 g_bWaterFound = !g_bWaterFound;
307
308 g_bWaterEntity[iEntity] = !g_bWaterEntity[iEntity];
309 }
310 }
311
312 new szHostName[64], szUserName[64], szPassword[64], szDataBase[64];
313 get_pcvar_string(g_pSqlHostName, szHostName, charsmax(szHostName));
314 get_pcvar_string(g_pSqlUserName, szUserName, charsmax(szUserName));
315 get_pcvar_string(g_pSqlPassword, szPassword, charsmax(szPassword));
316 get_pcvar_string(g_pSqlDataBase, szDataBase, charsmax(szDataBase));
317
318 new szError[512], iError;
319 g_hSqlTuple = SQL_MakeDbTuple(szHostName, szUserName, szPassword, szDataBase);
320 g_hSqlConnection = SQL_Connect(g_hSqlTuple, iError, szError, charsmax(szError));
321
322 if (g_hSqlConnection == Empty_Handle)
323 log_amx("[KREEDZ] plugin_cfg(): SQL_Error #%d - %s", iError, szError);
324
325 new szQuery[512];
326
327 formatex
328 (
329 szQuery, charsmax(szQuery),
330 "CREATE TABLE IF NOT EXISTS `KZ_PRO_TOP` (`MAPNAME` VARCHAR(32) NOT NULL, `AUTHID` VARCHAR(32) NOT NULL, `TEMPNAME` VARCHAR(32) NOT NULL, `COUNTRY_FULL` VARCHAR(32) NOT NULL, `COUNTRY_SHORT` VARCHAR(3) NOT NULL, `TIME` DECIMAL(65, 2) NOT NULL, `WEAPON` VARCHAR(32) NOT NULL, `DATE` DATETIME NOT NULL)"
331 );
332 SQL_ThreadQuery(g_hSqlTuple, "SqlQueryHandler", szQuery);
333
334 formatex
335 (
336 szQuery, charsmax(szQuery),
337 "CREATE TABLE IF NOT EXISTS `KZ_NUB_TOP` (`MAPNAME` VARCHAR(32) NOT NULL, `AUTHID` VARCHAR(32) NOT NULL, `TEMPNAME` VARCHAR(32) NOT NULL, `COUNTRY_FULL` VARCHAR(32) NOT NULL, `COUNTRY_SHORT` VARCHAR(3) NOT NULL, `TIME` DECIMAL(65, 2) NOT NULL, `WEAPON` VARCHAR(32) NOT NULL, `CHECKPOINTS` REAL NOT NULL, `GOCHECKS` REAL NOT NULL, `DATE` DATETIME NOT NULL)"
338 );
339 SQL_ThreadQuery(g_hSqlTuple, "SqlQueryHandler", szQuery);
340
341 server_cmd("mp_playerid ^"2^"");
342 server_exec();
343}
344public client_connect(id)
345{
346 client_cmd(id, "hud_centerid ^"0^"");
347}
348public client_disconnect(id)
349{
350 g_bStarted[id] = false;
351 g_bPaused[id] = false;
352 g_bHook[id] = false;
353 g_bInvisiblePlayers[id] = false;
354 g_bInvisibleWater[id] = false;
355 g_bAllowTeleport[id] = false;
356 g_bCheckPointAngles[id] = false;
357 g_bCustomStart[id] = false;
358 g_flStartTime[id] = 0.0;
359 g_flPauseTime[id] = 0.0;
360 g_iCheckPoints[id] = 0;
361 g_iGoChecks[id] = 0;
362}
363public fwdSpawnFuncDoor(const iEntity)
364{
365 static const szNull[] = "common/null.wav";
366
367 new Float:flDamage;
368 pev(iEntity, pev_dmg, flDamage);
369
370 if (flDamage < -999.0)
371 {
372 set_pev(iEntity, pev_noise1, szNull);
373 set_pev(iEntity, pev_noise2, szNull);
374 set_pev(iEntity, pev_noise3, szNull);
375
376 if (!g_bHealthBoosterFound)
377 g_bHealthBoosterFound = !g_bHealthBoosterFound;
378 }
379}
380public fwdLightStyle(iStyle, const szValue[])
381{
382 if (!iStyle)
383 copy(g_szDefaultMapLight, charsmax(g_szDefaultMapLight), szValue);
384}
385public Event_ResetHUD(const id)
386{
387 new iHideFlags = (1<<3| 1<<5);
388
389 message_begin(MSG_ONE, g_iMsgHideWeapon, _, id);
390 write_byte(iHideFlags);
391 message_end();
392}
393public Event_Health(const id)
394{
395 if (!g_bHealthBoosterFound)
396 g_iHealth[id] = get_user_health(id);
397}
398public Event_BombDropped()
399{
400 message_begin(MSG_BROADCAST, g_iMsgShowTimer);
401 message_end();
402}
403public Event_SpecHealth2(const id)
404{
405 g_iSpectatedID[id] = read_data(2);
406}
407public MsgHideWeapon()
408{
409 new iHideFlags = (1<<3| 1<<5);
410
411 set_msg_arg_int(1, ARG_BYTE, get_msg_arg_int(1) | iHideFlags);
412}
413public MsgScreenFade(const iMsgID, const iMsgDest, const id)
414{
415 if (!g_iNightVision[id])
416 return PLUGIN_CONTINUE;
417
418 if (get_msg_arg_int(4) != 255 || get_msg_arg_int(5) != 255 || get_msg_arg_int(6) != 255 || get_msg_arg_int(7) < 200)
419 return PLUGIN_CONTINUE;
420
421 remove_task(id + 1337);
422
423 set_task(get_msg_arg_int(1) / 4096.0, "TaskRestoreScreenFade", id + 1337);
424
425 return PLUGIN_CONTINUE;
426}
427public MsgNVGToggle(const iMsgID, const iMsgDest, id)
428{
429 static iFlag;
430 iFlag = get_msg_arg_int(1);
431
432 message_begin(MSG_ONE_UNRELIABLE, SVC_LIGHTSTYLE, _, id);
433 write_byte(0);
434
435 if (iFlag)
436 write_string("#");
437 else
438 write_string(g_szDefaultMapLight);
439
440 message_end();
441
442 if (!task_exists(id + 1337))
443 {
444 message_begin(MSG_ONE, g_iMsgScreenFade, _, id);
445 write_short((1<<12));
446 write_short(0);
447 write_short(0x0004);
448 write_byte(0);
449 write_byte(0);
450 write_byte(0);
451 write_byte(0);
452 message_end();
453 }
454
455 g_iNightVision[id] = iFlag;
456
457 return PLUGIN_HANDLED;
458}
459
460public TaskRestoreScreenFade(id)
461{
462 id -= 1337;
463
464 if (!g_iNightVision[id])
465 return;
466
467 message_begin(MSG_ONE, g_iMsgScreenFade, _, id);
468 write_short((1<<12));
469 write_short(0);
470 write_short(0x0004);
471 write_byte(0);
472 write_byte(0);
473 write_byte(0);
474 write_byte(0);
475 message_end();
476}
477public MsgStatusIcon(const iMsgID, const iMsgDest, const id)
478{
479 new szIcon[8];
480 get_msg_arg_string(2, szIcon, 7);
481
482 static const szBuyZone[] = "buyzone";
483
484 if (equal(szIcon, szBuyZone))
485 {
486 set_pdata_int(id, OFFSET_BZ, get_pdata_int(id, OFFSET_BZ, 5) & ~(1 << 0), 5);
487 return PLUGIN_HANDLED;
488 }
489 return PLUGIN_CONTINUE;
490}
491public MsgRoundTime(const iMsgID, const iMsgDest, const iMsgEnt)
492{
493 set_msg_arg_int(1, ARG_SHORT, get_timeleft());
494}
495public MsgShowMenu(const iMsgID, const iMsgDest, id)
496{
497 static szMenuCode[32];
498 get_msg_arg_string(4, szMenuCode, charsmax(szMenuCode));
499
500 if (containi(szMenuCode, "Team_Select") != -1)
501 {
502 new cData[1]; cData[0] = iMsgID;
503
504 set_task(0.3, "TaskAutoJoin", id, cData, 1);
505
506 return PLUGIN_HANDLED;
507 }
508
509 return PLUGIN_CONTINUE;
510}
511
512public MsgVGUIMenu(const iMsgID, const iMsgDest, const id)
513{
514 if (get_msg_arg_int(1) == 2)
515 {
516 new cData[1]; cData[0] = iMsgID;
517
518 set_task(0.3, "TaskAutoJoin", id, cData, 1);
519
520 return PLUGIN_HANDLED;
521 }
522
523 return PLUGIN_CONTINUE;
524}
525
526public TaskAutoJoin(const cData[], const id)
527{
528 new iMsgID = cData[0];
529 new iMsgBlock = get_msg_block(iMsgID);
530
531 set_msg_block(iMsgID, BLOCK_SET);
532
533 engclient_cmd(id, "jointeam", "2");
534 engclient_cmd(id, "joinclass", "5");
535
536 set_msg_block(iMsgID, iMsgBlock);
537}
538public fwdButtonHandler(iEntity, const id)
539{
540 if (!is_user_alive(id))
541 return HAM_IGNORED;
542
543 new szTarget[32];
544 entity_get_string(iEntity, EV_SZ_target, szTarget, charsmax(szTarget));
545
546 if (TrieKeyExists(g_tStarts, szTarget))
547 TimerStart(id);
548 else if (TrieKeyExists(g_tStops, szTarget))
549 TimerStop(id);
550
551 return HAM_IGNORED;
552}
553public fwdSpawnPlayer_Post(const id)
554{
555 if (!is_user_alive(id))
556 return HAM_IGNORED;
557
558 if (g_bHealthBoosterFound)
559 set_user_godmode(id, 1);
560
561 cs_set_user_nvg(id, 1);
562
563 strip_user_weapons(id);
564
565 give_item(id, "weapon_knife");
566 give_item(id, "weapon_usp");
567 cs_set_user_bpammo(id, CSW_USP, 100);
568
569 g_iSpectatedID[id] = 0;
570
571 return HAM_IGNORED;
572}
573public fwdKilledPlayer_Post(const iVictim)
574{
575 set_task(0.1, "TaskRespawn", iVictim);
576}
577public TaskRespawn(const id)
578{
579 if (!is_user_connected(id) || get_user_team(id) != 2)
580 return PLUGIN_HANDLED;
581
582 if (!is_user_alive(id))
583 ExecuteHamB(Ham_CS_RoundRespawn, id);
584
585 if (g_bStarted[id])
586 {
587 if (g_iCheckPoints[id])
588 cmdGoCheck(id);
589 else
590 {
591 g_bStarted[id] = !g_bStarted[id];
592
593 g_flStartTime[id] = 0.0;
594 }
595 }
596
597 return PLUGIN_HANDLED;
598}
599public fwdTakeDmgPlayer(const iVictim, const iWeapon, const iAttacker, const Float:flDamage, const iDamageBits)
600{
601 if (flDamage < -999.0)
602 return HAM_SUPERCEDE;
603
604 return HAM_IGNORED;
605}
606public fwdTouchWeapon(const iEntity, const id)
607{
608 if (!is_user_alive(id))
609 return HAM_IGNORED;
610
611 return HAM_SUPERCEDE;
612}
613public WeaponBoxTouch(const iEntity)
614{
615 new szModelName[32];
616 entity_get_string(iEntity, EV_SZ_model, szModelName, charsmax(szModelName));
617
618 if (!equali(szModelName, "models/w_backpack.mdl"))
619 {
620 DestroyEntity(iEntity);
621 return PLUGIN_HANDLED;
622 }
623 return PLUGIN_HANDLED;
624}
625public DestroyEntity(const iEntity)
626{
627 if (is_valid_ent(iEntity))
628 remove_entity(iEntity);
629}
630public cmdDrop(const id)
631{
632 if (!is_user_alive(id))
633 return PLUGIN_CONTINUE;
634
635 new iWeapon = get_user_weapon(id);
636
637 if (iWeapon == CSW_KNIFE || iWeapon == CSW_HEGRENADE || iWeapon == CSW_FLASHBANG || iWeapon == CSW_SMOKEGRENADE)
638 return PLUGIN_CONTINUE;
639
640 client_print(id, print_center, "You are not allowed to drop weapons");
641
642 return PLUGIN_HANDLED;
643}
644public fwdClinetKill(const id)
645{
646 if (!is_user_alive(id))
647 return FMRES_IGNORED;
648
649 return FMRES_SUPERCEDE;
650}
651public fwdAddToFullPack_Post( es_handle, e, ent, host, iHostFlags, iPlayer, pSet )
652{
653 if (iPlayer && g_bInvisiblePlayers[host] && host != ent && ent != g_iSpectatedID[host] && get_user_team(host) == get_user_team(ent))
654 {
655 static const Float:vCorner[8][3] =
656 {
657 {-4096.0, -4096.0, -4096.0},
658 {-4096.0, -4096.0, 4096.0},
659 {-4096.0, 4096.0, -4096.0},
660 {-4096.0, 4096.0, 4096.0},
661 {4096.0, -4096.0, -4096.0},
662 {4096.0, -4096.0, 4096.0},
663 {4096.0, 4096.0, -4096.0},
664 {4096.0, 4096.0, 4096.0}
665 };
666
667 static const Float:flMapDistance = 7094.480108;
668
669 static Float:vOrigin[3];
670 get_es(es_handle, ES_Origin, vOrigin);
671
672 static i;
673 while (get_distance_f(vOrigin, vCorner[i]) > flMapDistance)
674 {
675 if (++i >= sizeof(vCorner))
676 i = 0;
677 }
678
679 set_es(es_handle, ES_Origin, vCorner[i]);
680 set_es(es_handle, ES_Effects, get_es(es_handle, ES_Effects) | EF_NODRAW);
681 }
682 else if (g_bInvisibleWater[host] && g_bWaterEntity[ent])
683 set_es(es_handle, ES_Effects, get_es(es_handle, ES_Effects) | EF_NODRAW);
684}
685public TimerStart(const id)
686{
687 if (get_user_noclip(id))
688 {
689 client_print_color(id, print_team_default, "^1[^3%s^1] You should disable no clip!", g_szPrefix);
690 return PLUGIN_HANDLED;
691 }
692 if (g_bHook[id])
693 return PLUGIN_HANDLED;
694
695 if (g_flStartDelay[id] > get_gametime())
696 {
697 set_hudmessage(127, 127, 127, -1.0, 0.75, 0, _, 3.0, _, _, 1);
698 ShowSyncHudMsg(id, g_iHudSyncObj, "You must wait %.1f seconds after hook!", g_flStartDelay[id] - get_gametime());
699
700 return PLUGIN_HANDLED;
701 }
702
703 if (!g_bStartPosition)
704 {
705 entity_get_vector(id, EV_VEC_origin, g_vStartOrigin);
706
707 SaveStartPosition();
708 }
709
710 if (!g_bCustomStart[id])
711 entity_get_vector(id, EV_VEC_origin, g_vCustomStartOrigin[id]);
712
713 if (!g_bHealthBoosterFound)
714 if (get_user_health(id) != 100)
715 set_user_health(id, 100);
716
717 if (g_bPaused[id])
718 g_bPaused[id] = !g_bPaused[id];
719
720 g_flPauseTime[id] = 0.0;
721
722 if (!g_bStarted[id])
723 g_bStarted[id] = !g_bStarted[id];
724
725 g_flStartTime[id] = get_gametime();
726
727 if (g_iCheckPoints[id] > 0)
728 g_iCheckPoints[id] = 0;
729 if (g_iGoChecks[id] > 0)
730 g_iGoChecks[id] = 0;
731
732 new iWeapon = get_user_weapon(id);
733
734 strip_user_weapons(id);
735
736 if (iWeapon == CSW_KNIFE || iWeapon == CSW_USP)
737 {
738 give_item(id, "weapon_knife");
739 give_item(id, "weapon_usp");
740 cs_set_user_bpammo(id, CSW_USP, 100);
741 }
742 else if (iWeapon == CSW_P90)
743 {
744 give_item(id, "weapon_p90");
745 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_p90", id), 0);
746 }
747 else if (iWeapon == CSW_FAMAS)
748 {
749 give_item(id, "weapon_famas");
750 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_famas", id), 0);
751 }
752 else if (iWeapon == CSW_SG552)
753 {
754 give_item(id, "weapon_sg552");
755 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_sg552", id), 0);
756 }
757 else if (iWeapon == CSW_M4A1)
758 {
759 give_item(id, "weapon_m4a1");
760 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_m4a1", id), 0);
761 }
762 else if (iWeapon == CSW_M249)
763 {
764 give_item(id, "weapon_m249");
765 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_m249", id), 0);
766 }
767 else if (iWeapon == CSW_AK47)
768 {
769 give_item(id, "weapon_ak47");
770 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_ak47", id), 0);
771 }
772 else if (iWeapon == CSW_AWP)
773 {
774 give_item(id, "weapon_awp");
775 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_awp", id), 0);
776 }
777
778 return PLUGIN_HANDLED;
779}
780public TimerStop(const id)
781{
782 if (g_bStarted[id])
783 {
784 new Float:flTime = get_gametime() - g_flStartTime[id];
785
786 g_bStarted[id] = !g_bStarted[id];
787
788 new szTime[15];
789 ClimbtimeToString(flTime, szTime, charsmax(szTime));
790
791 new iWeapon = get_user_weapon(id);
792
793 client_print_color(id, print_team_default, "^1[^3%s^1] You finished map in^3 %s^1!^4 (^1CPs:^3 %d^4 |^1 TPs:^3 %d^4 |^1 Weapon:^3 %s^4)", g_szPrefix, szTime, g_iCheckPoints[id], g_iGoChecks[id], g_szWeaponNames[iWeapon]);
794
795 new iPlayers[32], iNum;
796 get_players(iPlayers, iNum, "ch");
797
798 if (iNum > 1)
799 {
800 new szName[32];
801 get_user_name(id, szName, charsmax(szName));
802
803 new i, iPlayer;
804
805 for (i = 0; i < iNum; i++)
806 {
807 iPlayer = iPlayers[i];
808
809 if (iPlayer == id)
810 continue;
811
812 client_print_color(iPlayer, print_team_default, "^1[^3%s^1]^4 %s^1 finished map in^3 %s^1!^4 (^1CPs:^3 %d^4 |^1 TPs:^3 %d^4 |^1 Weapon:^3 %s^4)", g_szPrefix, szName, szTime, g_iCheckPoints[id], g_iGoChecks[id], g_szWeaponNames[iWeapon]);
813 }
814 }
815
816 client_cmd(0, "spk buttons/bell1");
817
818 if (!is_user_steam(id))
819 return PLUGIN_HANDLED;
820
821 new szAuthID[32];
822 get_user_authid(id, szAuthID, charsmax(szAuthID));
823
824 new szQuery[512], cData[192];
825
826 cData[0] = id;
827
828 if (g_iGoChecks[id])
829 {
830 cData[1] = PRO_TOP;
831
832 formatex(cData[2], charsmax(cData) - 2, "^"%f^" ^"%d^" ^"%d^" ^"%d^"", flTime, iWeapon, g_iCheckPoints[id], g_iGoChecks[id]);
833
834 formatex(szQuery, charsmax(szQuery), "SELECT TIME FROM `KZ_PRO_TOP` WHERE MAPNAME='%s' AND AUTHID='%s'", g_szMapName, szAuthID);
835 }
836 else
837 {
838 cData[1] = NUB_TOP;
839
840 formatex(cData[2], charsmax(cData) - 2, "^"%f^" ^"%d^"", flTime, iWeapon);
841
842 formatex(szQuery, charsmax(szQuery), "SELECT TIME FROM `KZ_NUB_TOP` WHERE MAPNAME='%s' AND AUTHID='%s'", g_szMapName, szAuthID);
843 }
844
845 SQL_ThreadQuery(g_hSqlTuple, "SqlQueryTopHandler", szQuery, cData, strlen(cData[2])+1);
846 }
847 return PLUGIN_HANDLED;
848}
849public SqlQueryTopHandler(iFailState, Handle:hQuery, szError[], iError, cData[], iSize)
850{
851 if (iFailState != TQUERY_SUCCESS)
852 {
853 log_amx("[KREEDZ] SqlQueryTopHandler(): SQL_Error #%d - %s", iError, szError);
854 return PLUGIN_HANDLED;
855 }
856
857 new id = cData[0];
858
859 new iTopStyle = cData[1];
860
861 new szTime[17], szWeapon[32];
862
863 if (iTopStyle == NUB_TOP)
864 {
865 new szCheckPoints[6], szGoChecks[6];
866
867 parse(cData[2], szTime, charsmax(szTime), szWeapon, charsmax(szWeapon), szCheckPoints, charsmax(szCheckPoints), szGoChecks, charsmax(szGoChecks));
868 }
869 else
870 parse(cData[2], szTime, charsmax(szTime), szWeapon, charsmax(szWeapon));
871
872 new szName[32], szAuthID[32], szIP[32], szFullCountry[32], szShortCountry[3]
873}
874public client_command(id)
875{
876 static const szJoinCommand[] = "jointeam";
877
878 static szCommand[10];
879 read_argv(0, szCommand, 9);
880
881 if (equal(szJoinCommand, szCommand))
882 return PLUGIN_HANDLED;
883
884 return PLUGIN_CONTINUE;
885}
886public cmdPause(const id)
887{
888 if (!g_bStarted[id])
889 {
890 client_print_color(id, print_team_default, "^1[^3%s^1] You haven't started the timer!", g_szPrefix);
891 return PLUGIN_HANDLED;
892 }
893 if (!is_user_alive(id))
894 {
895 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if you are dead!", g_szPrefix);
896 return PLUGIN_HANDLED;
897 }
898 if (get_user_noclip(id))
899 {
900 client_print_color(id, print_team_default, "^1[^3%s^1] You should disable noclip before unpause!", g_szPrefix);
901 return PLUGIN_HANDLED;
902 }
903 new iFlags = get_entity_flags(id);
904 if (!(iFlags & FL_ONGROUND2))
905 {
906 client_print_color(id, print_team_default, "^1[^3%s^1] You can't pause in air!", g_szPrefix);
907 return PLUGIN_HANDLED;
908 }
909
910 if (g_bPaused[id])
911 {
912 g_bPaused[id] = !g_bPaused[id];
913
914 g_flStartTime[id] = get_gametime() - g_flPauseTime[id];
915
916 set_entity_flags(id, FL_FROZEN, 0);
917
918 client_print_color(id, print_team_default, "^1[^3%s^1] You have been paused the timer!", g_szPrefix);
919 }
920 else
921 {
922 g_bPaused[id] = !g_bPaused[id];
923
924 g_flPauseTime[id] = get_gametime() - g_flStartTime[id];
925
926 g_flStartTime[id] = 0.0;
927
928 set_entity_flags(id, FL_FROZEN, 1);
929
930 client_print_color(id, print_team_default, "^1[^3%s^1] You have been unpaused the timer!", g_szPrefix);
931 }
932 return PLUGIN_HANDLED;
933}
934public cmdSpec(const id)
935{
936 if (g_flCmdDelay[id] > get_gametime())
937 return PLUGIN_HANDLED;
938
939 new CsTeams:iTeam = cs_get_user_team(id);
940
941 switch (iTeam)
942 {
943 case CS_TEAM_SPECTATOR:
944 {
945 cs_set_user_team(id, CS_TEAM_CT);
946
947 if (!is_user_alive(id))
948 ExecuteHamB(Ham_CS_RoundRespawn, id);
949
950 if (g_bPaused[id])
951 {
952 set_user_velocity(id, Float:{0.0, 0.0, 0.0});
953 set_entity_flags(id, FL_DUCKING, 1);
954 entity_set_size(id, Float:{-16.0, -16.0, -18.0}, Float:{16.0, 16.0, 32.0});
955 entity_set_origin(id, g_vTempOrigin[id]);
956
957 set_entity_flags(id, FL_FROZEN, 1);
958 }
959 }
960 case CS_TEAM_CT:
961 {
962 if (g_bStarted[id] && !g_bPaused[id])
963 {
964 new iFlags = get_entity_flags(id);
965 if (!(iFlags & FL_ONGROUND2))
966 {
967 client_print_color(id, print_team_default, "^1[^3%s^1] You should be on ground!", g_szPrefix);
968 return PLUGIN_HANDLED;
969 }
970
971 g_bPaused[id] = !g_bPaused[id];
972
973 g_flPauseTime[id] = get_gametime() - g_flStartTime[id];
974
975 g_flStartTime[id] = 0.0;
976
977 entity_get_vector(id, EV_VEC_origin, g_vTempOrigin[id]);
978 }
979 if (g_bStarted[id] && g_bPaused[id])
980 entity_get_vector(id, EV_VEC_origin, g_vTempOrigin[id]);
981
982 if (is_user_alive(id))
983 user_silentkill(id);
984
985 cs_set_user_team(id, CS_TEAM_SPECTATOR);
986 }
987 }
988
989 g_flCmdDelay[id] = get_gametime() + 1.0;
990
991 return PLUGIN_HANDLED;
992}
993public cmdNoClip(const id)
994{
995 if (!is_user_alive(id))
996 {
997 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if you dead!", g_szPrefix);
998 return PLUGIN_HANDLED;
999 }
1000 if (g_bStarted[id] && !g_bPaused[id])
1001 {
1002 new iFlags = get_entity_flags(id);
1003 if (!(iFlags & FL_ONGROUND2))
1004 {
1005 client_print_color(id, print_team_default, "^1[^3%s^1] You should be on ground!", g_szPrefix);
1006 return PLUGIN_HANDLED;
1007 }
1008
1009 g_bPaused[id] = !g_bPaused[id];
1010
1011 g_flPauseTime[id] = get_gametime() - g_flStartTime[id];
1012
1013 g_flStartTime[id] = 0.0;
1014
1015 entity_get_vector(id, EV_VEC_origin, g_vTempOrigin[id]);
1016
1017 set_user_noclip(id, 1);
1018
1019 return PLUGIN_HANDLED;
1020 }
1021 if (g_bStarted[id] && g_bPaused[id])
1022 {
1023 if (!get_user_noclip(id))
1024 {
1025 entity_get_vector(id, EV_VEC_origin, g_vTempOrigin[id]);
1026
1027 set_entity_flags(id, FL_FROZEN, 0);
1028
1029 set_user_noclip(id, 1);
1030 }
1031 else
1032 {
1033 set_user_noclip(id, 0);
1034
1035 set_user_velocity(id, Float:{0.0, 0.0, 0.0});
1036 set_entity_flags(id, FL_DUCKING, 1);
1037 entity_set_size(id, Float:{-16.0, -16.0, -18.0}, Float:{16.0, 16.0, 32.0});
1038 entity_set_origin(id, g_vTempOrigin[id]);
1039
1040 set_entity_flags(id, FL_FROZEN, 1);
1041 }
1042 return PLUGIN_HANDLED;
1043 }
1044 switch (get_user_noclip(id))
1045 {
1046 case 0: set_user_noclip(id, 1);
1047 case 1: set_user_noclip(id, 0);
1048 }
1049 return PLUGIN_HANDLED;
1050}
1051public KZ_Think(const iEntity)
1052{
1053 if (iEntity)
1054 entity_set_float(iEntity, EV_FL_nextthink, get_gametime() + 0.01);
1055
1056 static szMessage[192], iLen, szTime[15];
1057
1058 for (new iAlivePlayer = 1; iAlivePlayer <= g_iMaxPlayers; iAlivePlayer++)
1059 {
1060 if (!is_user_alive(iAlivePlayer))
1061 continue;
1062
1063 static iTarget, iBody;
1064 get_user_aiming(iAlivePlayer, iTarget, iBody, 9999);
1065
1066 if (0 < iTarget <= g_iMaxPlayers && is_user_alive(iTarget))
1067 {
1068 static szName[33];
1069 get_user_name(iTarget, szName, charsmax(szName));
1070
1071 iLen = formatex(szMessage, charsmax(szMessage), "%s^n", szName);
1072
1073 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, "[ ");
1074
1075 if (!g_bStarted[iTarget])
1076 iLen += formatex(szMessage[iLen], charsmax(szMessage), "OFF");
1077 else
1078 {
1079 if (g_bPaused[iTarget])
1080 ClimbtimeToString(g_flPauseTime[iTarget], szTime, charsmax(szTime));
1081 else
1082 ClimbtimeToString((get_gametime() - g_flStartTime[iTarget]), szTime, charsmax(szTime));
1083
1084 iLen += formatex(szMessage[iLen], charsmax(szMessage), "%s", szTime);
1085 }
1086
1087 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, " | ");
1088
1089 iLen += formatex(szMessage[iLen], charsmax(szMessage), "%d/%d", g_iCheckPoints[iTarget], g_iGoChecks[iTarget]);
1090
1091 if (g_bPaused[iTarget])
1092 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, " | *Paused*");
1093
1094 formatex(szMessage[iLen], charsmax(szMessage) - iLen, " ]");
1095
1096 set_hudmessage(127, 0, 0, -1.0, -1.0, 0, _, 0.01, _, _, 2);
1097 ShowSyncHudMsg(iAlivePlayer, g_iHudSyncObj2, "%s", szMessage);
1098
1099 iLen = 0;
1100 }
1101
1102 iLen = formatex(szMessage, charsmax(szMessage), "[ ");
1103
1104 if (!g_bStarted[iAlivePlayer])
1105 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, "OFF");
1106 else
1107 {
1108 if (g_bPaused[iAlivePlayer])
1109 ClimbtimeToString(g_flPauseTime[iAlivePlayer], szTime, charsmax(szTime));
1110 else
1111 ClimbtimeToString((get_gametime() - g_flStartTime[iAlivePlayer]), szTime, charsmax(szTime));
1112
1113 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, "%s", szTime);
1114 }
1115
1116 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, " | ");
1117
1118 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, "%d/%d", g_iCheckPoints[iAlivePlayer], g_iGoChecks[iAlivePlayer]);
1119
1120 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, " | ");
1121
1122 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, "HP: ");
1123
1124 if (g_bHealthBoosterFound)
1125 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, "Godmode");
1126 else
1127 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, "%d", g_iHealth[iAlivePlayer]);
1128
1129 if (g_bPaused[iAlivePlayer])
1130 {
1131 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, " | ");
1132
1133 iLen += formatex(szMessage[iLen], charsmax(szMessage) - iLen, "*Paused*");
1134 }
1135
1136 formatex(szMessage[iLen], charsmax(szMessage) - iLen, " ]");
1137
1138 makeStatusText(iAlivePlayer, YELLOW_STATUS, 0.1, "%s", szMessage);
1139
1140 for (new iDeadPlayer = 1; iDeadPlayer <= g_iMaxPlayers; iDeadPlayer++)
1141 {
1142 if (!is_user_connected(iDeadPlayer) || is_user_alive(iDeadPlayer))
1143 continue;
1144
1145 if (entity_get_int(iDeadPlayer, EV_INT_iuser2) == iAlivePlayer && entity_get_int(iDeadPlayer, EV_INT_iuser1) == 4 && g_bStarted[iAlivePlayer])
1146 {
1147 client_print(iDeadPlayer, print_center, "%s", szMessage);
1148 }
1149 }
1150 }
1151}
1152public cmdCheckPoint(const id)
1153{
1154 if (!is_user_alive(id))
1155 {
1156 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if you are dead!", g_szPrefix);
1157 return PLUGIN_HANDLED;
1158 }
1159 if (g_bPaused[id])
1160 {
1161 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if your timer is paused!", g_szPrefix);
1162 return PLUGIN_HANDLED;
1163 }
1164
1165 new iFlags = get_entity_flags(id);
1166 if (!(iFlags & FL_ONGROUND2))
1167 {
1168 client_print_color(id, print_team_default, "^1[^3%s^1] You can't create check point in air!", g_szPrefix);
1169 return PLUGIN_HANDLED;
1170 }
1171
1172 g_iCheckPoints[id] = g_iCheckPoints[id] + 1;
1173
1174 if (g_iCheckPoints[id] > 1)
1175 {
1176 g_vStuckOrigin[id][0] = g_vCheckPointOrigin[id][0];
1177 g_vStuckOrigin[id][1] = g_vCheckPointOrigin[id][1];
1178 g_vStuckOrigin[id][2] = g_vCheckPointOrigin[id][2];
1179
1180 g_vStuckAngles[id][0] = g_vCheckPointAngles[id][0];
1181 g_vStuckAngles[id][1] = g_vCheckPointAngles[id][1];
1182 g_vStuckAngles[id][2] = g_vCheckPointAngles[id][2];
1183 }
1184
1185 entity_get_vector(id, EV_VEC_origin, g_vCheckPointOrigin[id]);
1186 entity_get_vector(id, EV_VEC_v_angle, g_vCheckPointAngles[id]);
1187
1188 set_hudmessage(127, 127, 127, -1.0, 0.75, 2, _, 3.0, 0.03, 0.2, 1);
1189 ShowSyncHudMsg(id, g_iHudSyncObj, "Check Point: #%d", g_iCheckPoints[id]);
1190
1191 return PLUGIN_HANDLED;
1192}
1193public cmdGoCheck(const id)
1194{
1195 if (!is_user_alive(id))
1196 {
1197 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if you are dead!", g_szPrefix);
1198 return PLUGIN_HANDLED;
1199 }
1200 if (g_bPaused[id])
1201 {
1202 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if your timer is paused!", g_szPrefix);
1203 return PLUGIN_HANDLED;
1204 }
1205 if (!g_iCheckPoints[id])
1206 {
1207 client_print_color(id, print_team_default, "^1[^3%s^1] You don't have check points!", g_szPrefix);
1208 return PLUGIN_HANDLED;
1209 }
1210
1211 g_iGoChecks[id] = g_iGoChecks[id] + 1;
1212
1213 set_user_velocity(id, Float:{0.0, 0.0, 0.0});
1214 set_entity_flags(id, FL_DUCKING, 1);
1215 entity_set_size(id, Float:{-16.0, -16.0, -18.0}, Float:{16.0, 16.0, 32.0});
1216 entity_set_origin(id, g_vCheckPointOrigin[id]);
1217
1218 if (g_bCheckPointAngles[id])
1219 {
1220 entity_set_vector(id, EV_VEC_angles, g_vCheckPointAngles[id]);
1221 entity_set_int(id, EV_INT_fixangle, 1);
1222 }
1223
1224 set_hudmessage(127, 127, 127, -1.0, 0.75, 2, _, 3.0, 0.03, 0.2, 1);
1225 ShowSyncHudMsg(id, g_iHudSyncObj, "GoCheck: #%d", g_iGoChecks[id]);
1226
1227 return PLUGIN_HANDLED;
1228}
1229public cmdStuck(const id)
1230{
1231 if (!is_user_alive(id))
1232 {
1233 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if you are dead!", g_szPrefix);
1234 return PLUGIN_HANDLED;
1235 }
1236 if (g_bPaused[id])
1237 {
1238 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if your timer is paused!", g_szPrefix);
1239 return PLUGIN_HANDLED;
1240 }
1241 if (g_iCheckPoints[id] < 2)
1242 {
1243 client_print_color(id, print_team_default, "^1[^3%s^1] You don't have enought check points!", g_szPrefix);
1244 return PLUGIN_HANDLED;
1245 }
1246
1247 set_user_velocity(id, Float:{0.0, 0.0, 0.0});
1248 set_entity_flags(id, FL_DUCKING, 1);
1249 entity_set_size(id, Float:{-16.0, -16.0, -18.0}, Float:{16.0, 16.0, 32.0});
1250 entity_set_origin(id, g_vStuckOrigin[id]);
1251
1252 if (g_bCheckPointAngles[id])
1253 {
1254 entity_set_vector(id, EV_VEC_angles, g_vStuckAngles[id]);
1255 entity_set_int(id, EV_INT_fixangle, 1);
1256 }
1257
1258 set_hudmessage(127, 127, 127, -1.0, 0.75, 2, _, 3.0, 0.03, 0.2, 1);
1259 ShowSyncHudMsg(id, g_iHudSyncObj, "You have been unstucked!");
1260
1261 return PLUGIN_HANDLED;
1262}
1263public cmdReset(const id)
1264{
1265 if (g_bStarted[id])
1266 g_bStarted[id] = !g_bStarted[id];
1267
1268 g_flStartTime[id] = 0.0;
1269
1270 if (g_iCheckPoints[id])
1271 g_iCheckPoints[id] = 0;
1272 if (g_iGoChecks[id])
1273 g_iGoChecks[id] = 0;
1274
1275 if (g_bPaused[id])
1276 {
1277 g_bPaused[id] = !g_bPaused[id];
1278
1279 g_flPauseTime[id] = 0.0;
1280
1281 if (get_entity_flags(id) & FL_FROZEN)
1282 set_entity_flags(id, FL_FROZEN, 0);
1283 }
1284
1285 return PLUGIN_HANDLED;
1286}
1287public cmdWeapons(const id)
1288{
1289 if (!is_user_alive(id))
1290 {
1291 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if you dead!", g_szPrefix);
1292 return PLUGIN_HANDLED;
1293 }
1294 if (g_bStarted[id])
1295 {
1296 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command if your timer is started!", g_szPrefix);
1297 return PLUGIN_HANDLED;
1298 }
1299
1300 strip_user_weapons(id);
1301
1302 give_item(id, "weapon_knife");
1303 give_item(id, "weapon_usp");
1304 cs_set_user_bpammo(id, CSW_USP, 100);
1305
1306 give_item(id, "weapon_p90");
1307 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_p90", id), 0);
1308 give_item(id, "weapon_famas");
1309 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_famas", id), 0);
1310 give_item(id, "weapon_sg552");
1311 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_sg552", id), 0);
1312 give_item(id, "weapon_m4a1");
1313 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_m4a1", id), 0);
1314 give_item(id, "weapon_m249");
1315 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_m249", id), 0);
1316 give_item(id, "weapon_ak47");
1317 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_ak47", id), 0);
1318 give_item(id, "weapon_awp");
1319 cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_awp", id), 0);
1320
1321 return PLUGIN_HANDLED;
1322}
1323public cmdSetStart(const id)
1324{
1325 if (~get_user_flags(id) & ADMIN_ACCESS)
1326 return PLUGIN_HANDLED;
1327
1328 entity_get_vector(id, EV_VEC_origin, g_vStartOrigin);
1329
1330 SaveStartPosition();
1331
1332 client_print_color(id, print_team_default, "^1[^3%s^1] Start position saved!", g_szPrefix);
1333
1334 return PLUGIN_HANDLED;
1335}
1336public cmdDelStart(const id)
1337{
1338 if (~get_user_flags(id) & ADMIN_ACCESS)
1339 return PLUGIN_HANDLED;
1340
1341 if (g_bStartPosition)
1342 g_bStartPosition = !g_bStartPosition;
1343
1344 new szData[64], iTimestamp;
1345 if (nvault_lookup(g_iVault, g_szMapName, szData, charsmax(szData), iTimestamp))
1346 {
1347 nvault_remove(g_iVault, g_szMapName);
1348
1349 client_print_color(id, print_team_default, "^1[^3%s^1] Start position deleted!", g_szPrefix);
1350 }
1351
1352 return PLUGIN_HANDLED;
1353}
1354public cmdStart(const id)
1355{
1356 if (!is_user_alive(id))
1357 return PLUGIN_HANDLED;
1358
1359 if (g_bPaused[id])
1360 {
1361 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command while your timer is paused!", g_szPrefix);
1362 return PLUGIN_HANDLED;
1363 }
1364
1365 if (!g_bStartPosition)
1366 {
1367 set_hudmessage(127, 127, 127, -1.0, 0.75, 0, _, 3.0, _, _, 1);
1368 ShowSyncHudMsg(id, g_iHudSyncObj, "No start position, sorry :(");
1369 }
1370 else
1371 {
1372 set_user_velocity(id, Float:{0.0, 0.0, 0.0});
1373 set_entity_flags(id, FL_DUCKING, 1);
1374 entity_set_size(id, Float:{-16.0, -16.0, -18.0}, Float:{16.0, 16.0, 32.0});
1375
1376 if
1377 (
1378 g_vCustomStartOrigin[id][0] == 0.0 &&
1379 g_vCustomStartOrigin[id][1] == 0.0 &&
1380 g_vCustomStartOrigin[id][2] == 0.0
1381 )
1382 entity_set_origin(id, g_vStartOrigin);
1383 else
1384 entity_set_origin(id, g_vCustomStartOrigin[id]);
1385 }
1386
1387 return PLUGIN_HANDLED;
1388}
1389public cmdMainMenu(const id)
1390{
1391 new szMenu[512], iLen, iKeys;
1392
1393 new szCurrentTime[32];
1394 get_time("%d.%m.%Y - %H:%M:%S", szCurrentTime, charsmax(szCurrentTime));
1395
1396 new iTimeLeft = get_timeleft();
1397
1398 iLen = formatex(szMenu, charsmax(szMenu), "\dVisit to\r DoFrag.Ru\d^nCreated by\r deniS\d^n^nServer Time: %s^nMap:\y %s\d Timeleft:\y %d:%02d\w^n^n", szCurrentTime, g_szMapName, (iTimeLeft / 60), (iTimeLeft % 60));
1399
1400 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1.\w Climb Menu^n^n");
1401 iKeys += MENU_KEY_1;
1402
1403 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d2. Duel Menu (\rNot Ready\d)^n");
1404 iKeys &= ~MENU_KEY_2;
1405
1406 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3.\w Teleport Menu^n");
1407 iKeys |= MENU_KEY_3;
1408
1409 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r4.\w Config Menu^n^n");
1410 iKeys += MENU_KEY_4;
1411
1412 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r5.\w Move to [\r%s\w]^n^n", cs_get_user_team(id) == CS_TEAM_CT ? "Spectator" : "CT");
1413
1414 iKeys += MENU_KEY_5;
1415
1416 formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0.\w Exit");
1417 iKeys += MENU_KEY_0;
1418
1419 show_menu(id, iKeys, szMenu, -1, "MainMenu");
1420
1421 return PLUGIN_HANDLED;
1422}
1423public MainMenu_Handler(const id, const iKey)
1424{
1425 switch (iKey)
1426 {
1427 case 0: cmdClimbMenu(id);
1428 case 2: cmdTeleportMenu(id);
1429 case 3: cmdConfigMenu(id);
1430 case 4: cmdSpec(id);
1431 }
1432
1433 if (iKey == 4)
1434 cmdMainMenu(id);
1435
1436 return PLUGIN_HANDLED;
1437}
1438public cmdClimbMenu(const id)
1439{
1440 new szMenu[512], iLen, iKeys = (MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_0);
1441
1442 iLen = formatex(szMenu, charsmax(szMenu), "\yClimb Menu\w^n^n");
1443
1444 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1.\w Check Point [\r#%d\w]^n", g_iCheckPoints[id]);
1445 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r2.\w Go Check [\r#%d\w]^n", g_iGoChecks[id]);
1446 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3.\w Stuck^n^n");
1447
1448 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r4.\w Pause - [\r%s\w]^n^n", g_bPaused[id] ? "ON" : "OFF");
1449
1450 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r5.\w Start^n");
1451 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r6.\w Start Settings^n^n");
1452
1453 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r7.\w Reset^n^n");
1454
1455 formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0.\w Back");
1456
1457 show_menu(id, iKeys, szMenu, -1, "ClimbMenu");
1458
1459 return PLUGIN_HANDLED;
1460}
1461public ClimbMenu_Handler(const id, const iKey)
1462{
1463 switch (iKey)
1464 {
1465 case 0: cmdCheckPoint(id);
1466 case 1: cmdGoCheck(id);
1467 case 2: cmdStuck(id);
1468 case 3: cmdPause(id);
1469 case 4: cmdStart(id);
1470 case 5: cmdTimerMenu(id);
1471 case 6: cmdReset(id);
1472 }
1473
1474 if (iKey == 9)
1475 cmdMainMenu(id);
1476 else
1477 if (iKey != 5)
1478 cmdClimbMenu(id);
1479
1480 return PLUGIN_HANDLED;
1481}
1482public cmdTimerMenu(const id)
1483{
1484 new szMenu[512], iLen, iKeys;
1485
1486 iLen = formatex(szMenu, charsmax(szMenu), "\yTimer Menu\w^n^n");
1487
1488 if (g_bCustomStart[id])
1489 {
1490 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1.\w Set custom start^n");
1491 iKeys |= (1<<0);
1492 }
1493 else
1494 {
1495 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d1. Set custom start^n");
1496 iKeys &= ~(1<<0);
1497 }
1498
1499 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r2.\w Custom Start [\r%s\w]^n^n", g_bCustomStart[id] ? "ON" : "OFF");
1500 iKeys |= (1<<1);
1501
1502 formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0.\w Back");
1503
1504 iKeys |= (1<<9);
1505
1506 show_menu(id, iKeys, szMenu, -1, "TimerMenu");
1507
1508 return PLUGIN_HANDLED;
1509}
1510public TimerMenu_Handler(const id, const iKey)
1511{
1512 switch (iKey)
1513 {
1514 case 0:
1515 {
1516 if (!is_user_alive(id))
1517 cmdTimerMenu(id);
1518
1519 entity_get_vector(id, EV_VEC_origin, g_vCustomStartOrigin[id]);
1520 }
1521 case 1: g_bCustomStart[id] = !g_bCustomStart[id];
1522 }
1523
1524 if (iKey == 9)
1525 cmdClimbMenu(id);
1526 else
1527 cmdTimerMenu(id);
1528
1529 return PLUGIN_HANDLED;
1530}
1531/* To Do...
1532public cmdDuelMenu(const id)
1533{
1534
1535}
1536pubic DuelMenu_Handler(const id, const iKey)
1537{
1538
1539}
1540*/
1541public cmdTeleportMenu(const id)
1542{
1543 if (!is_user_alive(id))
1544 {
1545 client_print_color(id, print_team_default, "^1[^3%s^1] You should be alive!", g_szPrefix);
1546 return PLUGIN_HANDLED;
1547 }
1548
1549 ShowTeleportMenu(id, g_iPlayersMenuPage[id] = 0);
1550
1551 return PLUGIN_HANDLED;
1552}
1553public ShowTeleportMenu(const id, iPage)
1554{
1555 if (iPage < 0)
1556 return PLUGIN_HANDLED;
1557
1558 new iPlayers[32], iNum, szMenu[512], szName[32], iPlayer;
1559
1560 get_players(iPlayers, iNum, "ac");
1561
1562 new i = min(iPage * 8, iNum);
1563
1564 new iStart = i - (i % 8);
1565
1566 new iEnd = min(iStart + 8, iNum);
1567
1568 iPage = iStart / 8;
1569
1570 g_iPlayerMenuPlayers[id] = iPlayers;
1571 g_iPlayersMenuPage[id] = iPage;
1572
1573 new iLen = formatex(szMenu, charsmax(szMenu), "\yTeleport Menu\R%d\%d^n^n", iPage + 1, ((iNum - 1) / 8) + 1);
1574
1575 new iKeys = MENU_KEY_0;
1576
1577 new iItem;
1578
1579 for (i = iStart; i < iEnd; i++)
1580 {
1581 iPlayer = iPlayers[i];
1582
1583 get_user_name(iPlayer, szName, charsmax(szName));
1584
1585 if (iPlayer == id)
1586 {
1587 iKeys &= ~(1 << iItem);
1588
1589 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d%d. %s\r *^n", ++iItem, szName);
1590 }
1591 else
1592 {
1593 if (g_bAllowTeleport[iPlayer])
1594 {
1595 iKeys &= ~(1 << iItem);
1596
1597 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d%d. %s (\rDisabled\d)^n", ++iItem, szName);
1598 }
1599 else
1600 {
1601 iKeys |= (1 << iItem);
1602
1603 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d.\w %s^n", ++iItem, szName);
1604 }
1605 }
1606 }
1607 if (iEnd < iNum)
1608 {
1609 iKeys |= MENU_KEY_9;
1610
1611 formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r9.w Next\r^n0.\w %s", iPage ? "Back" : "Exit");
1612 }
1613 else
1614 formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r0.\w %s", iPage ? "Back" : "Exit");
1615
1616 show_menu(id, iKeys, szMenu, -1, "TeleportMenu");
1617
1618 return PLUGIN_HANDLED;
1619}
1620public TeleportMenu_Handler(const id, const iKey)
1621{
1622 if (!is_user_alive(id))
1623 {
1624 client_print_color(id, print_team_default, "^1[^3%s^1] You should be alive!", g_szPrefix);
1625 return PLUGIN_HANDLED;
1626 }
1627 if (g_bPaused[id])
1628 {
1629 client_print_color(id, print_team_default, "^1[^3%s^1] You can't use this command while your timer is paused!", g_szPrefix);
1630 return PLUGIN_HANDLED;
1631 }
1632 switch (iKey)
1633 {
1634 case 8: ShowTeleportMenu(id, ++g_iPlayersMenuPage[id]);
1635 case 9: ShowTeleportMenu(id, --g_iPlayersMenuPage[id]);
1636 default:
1637 {
1638 new iPlayer = g_iPlayerMenuPlayers[id][(g_iPlayersMenuPage[id] * 8) + iKey];
1639
1640 if (!is_user_connected(iPlayer))
1641 {
1642 client_print_color(id, print_team_default, "^1[^3%s^1] Player has left the game!", g_szPrefix);
1643 return PLUGIN_HANDLED;
1644 }
1645
1646 new szPlayerName[32];
1647 get_user_name(iPlayer, szPlayerName, charsmax(szPlayerName));
1648
1649 if (!is_user_alive(iPlayer))
1650 {
1651 client_print_color(id, print_team_default, "^1[^3%s^1]^4 %s^1 should be alive!", g_szPrefix, szPlayerName);
1652 return PLUGIN_HANDLED;
1653 }
1654
1655 new Float:vPlayerOrigin[3];
1656 entity_get_vector(iPlayer, EV_VEC_origin, vPlayerOrigin);
1657
1658 entity_set_origin(id, vPlayerOrigin);
1659
1660 if (g_bStarted[id])
1661 {
1662 g_bStarted[id] = !g_bStarted[id];
1663
1664 g_flStartTime[id] = 0.0;
1665 }
1666
1667 client_print_color(id, print_team_default, "^1[^3%s^1] You have been teleported to^4 %s^1!", g_szPrefix, szPlayerName);
1668 }
1669 }
1670 return PLUGIN_HANDLED;
1671}
1672public cmdConfigMenu(const id)
1673{
1674 new szMenu[512], iLen, iKeys = (MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_0);
1675
1676 iLen = formatex(szMenu, charsmax(szMenu), "\yConfig Menu\w^n^n");
1677
1678 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1.\w Invisible Players - [\r%s\w]^n", g_bInvisiblePlayers[id] ? "ON" : "OFF");
1679 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r2.\w Invisible Water - [\r%s\w]^n^n", g_bInvisibleWater[id] ? "ON" : "OFF");
1680
1681 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3.\w Allow Teleport - [\r%s\w]^n", g_bAllowTeleport[id] ? "OFF" : "ON");
1682 iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r4.\w Viewing angle record - [\r%s\w]^n^n", g_bCheckPointAngles[id] ? "ON" : "OFF");
1683
1684 formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0.\w Back");
1685
1686 show_menu(id, iKeys, szMenu, -1, "ConfigMenu");
1687
1688 return PLUGIN_HANDLED;
1689}
1690public ConfigMenu_Handler(const id, const iKey)
1691{
1692 switch (iKey)
1693 {
1694 case 0:
1695 {
1696 g_bInvisiblePlayers[id] = !g_bInvisiblePlayers[id];
1697
1698 if (g_bInvisiblePlayers[id])
1699 client_print_color(id, print_team_default, "^1[^3%s^1] Players are now: invisible!", g_szPrefix);
1700 else
1701 client_print_color(id, print_team_default, "^1[^3%s^1] Players are now: visible!", g_szPrefix);
1702 }
1703 case 1:
1704 {
1705 g_bInvisibleWater[id] = !g_bInvisibleWater[id];
1706
1707 if (g_bInvisibleWater[id])
1708 client_print_color(id, print_team_default, "^1[^3%s^1] Water is now: invisible!", g_szPrefix);
1709 else
1710 client_print_color(id, print_team_default, "^1[^3%s^1] Water is now: visible!", g_szPrefix);
1711 }
1712 case 2:
1713 {
1714 g_bAllowTeleport[id] = !g_bAllowTeleport[id];
1715
1716 if (g_bAllowTeleport[id])
1717 client_print_color(id, print_team_default, "^1[^3%s^1] Allow teleport: disabled!", g_szPrefix);
1718 else
1719 client_print_color(id, print_team_default, "^1[^3%s^1] Allow teleport: enabled!", g_szPrefix);
1720 }
1721 case 3:
1722 {
1723 g_bCheckPointAngles[id] = !g_bCheckPointAngles[id];
1724
1725 if (g_bCheckPointAngles[id])
1726 client_print_color(id, print_team_default, "^1[^3%s^1] Viewing angle record: enabled!", g_szPrefix);
1727 else
1728 client_print_color(id, print_team_default, "^1[^3%s^1] Viewing angle record: disabled!", g_szPrefix);
1729 }
1730 }
1731
1732 if (iKey == 9)
1733 cmdMainMenu(id);
1734 else
1735 cmdConfigMenu(id);
1736
1737 return PLUGIN_HANDLED;
1738}
1739public cmdHookON(const id)
1740{
1741 if (!is_user_alive(id) || g_bStarted[id])
1742 return PLUGIN_HANDLED;
1743
1744 g_bHook[id] = true;
1745
1746 return PLUGIN_CONTINUE;
1747}
1748public cmdHookOFF(const id)
1749{
1750 if (!is_user_alive(id) || g_bStarted[id])
1751 return PLUGIN_HANDLED;
1752
1753 g_bHook[id] = false;
1754
1755 g_flStartDelay[id] = get_gametime() + 3.0;
1756
1757 return PLUGIN_CONTINUE;
1758}
1759public SqlQueryHandler(iFailState, Handle:hQuery, szError[], iError, cData[], iSize)
1760{
1761 if (iFailState != TQUERY_SUCCESS)
1762 {
1763 log_amx("[KREEDZ] SqlQueryHandler(): SQL_Error #%d - %s", iError, szError);
1764 return PLUGIN_HANDLED;
1765 }
1766 return PLUGIN_HANDLED;
1767}
1768public plugin_end()
1769{
1770 TrieDestroy(g_tStarts);
1771 TrieDestroy(g_tStops);
1772
1773 nvault_close(g_iVault);
1774
1775 SQL_FreeHandle( g_hSqlConnection );
1776}
1777public SaveStartPosition()
1778{
1779 new szData[64], iTimestamp;
1780 if (nvault_lookup(g_iVault, g_szMapName, szData, charsmax(szData), iTimestamp))
1781 nvault_remove(g_iVault, g_szMapName);
1782
1783 formatex
1784 (
1785 szData, charsmax(szData),
1786 "^"%f^" ^"%f^" ^"%f^"",
1787 g_vStartOrigin[0],
1788 g_vStartOrigin[1],
1789 g_vStartOrigin[2]
1790 );
1791
1792 nvault_set(g_iVault, g_szMapName, szData);
1793
1794 if (!g_bStartPosition)
1795 g_bStartPosition = !g_bStartPosition;
1796}
1797public LoadStartPosition()
1798{
1799 new szData[64], iTimestamp;
1800 if (nvault_lookup(g_iVault, g_szMapName, szData, charsmax(szData), iTimestamp))
1801 {
1802 new szStartOrigin[3][15];
1803 parse
1804 (
1805 szData,
1806 szStartOrigin[0], charsmax(szStartOrigin),
1807 szStartOrigin[1], charsmax(szStartOrigin),
1808 szStartOrigin[2], charsmax(szStartOrigin)
1809 );
1810
1811 g_vStartOrigin[0] = str_to_float(szStartOrigin[0]);
1812 g_vStartOrigin[1] = str_to_float(szStartOrigin[1]);
1813 g_vStartOrigin[2] = str_to_float(szStartOrigin[2]);
1814
1815 if (!g_bStartPosition)
1816 g_bStartPosition = !g_bStartPosition;
1817 }
1818}
1819ClimbtimeToString(const Float:flClimbTime, szOutPut[], const iLen)
1820{
1821 new iMinutes = floatround(flClimbTime / 60.0, floatround_floor);
1822 new iSeconds = floatround(flClimbTime - iMinutes * 60, floatround_floor);
1823 new iMiliSeconds = floatround((flClimbTime - (iMinutes * 60 + iSeconds)) * 100, floatround_floor);
1824
1825 formatex(szOutPut, iLen, "%02i:%02i.%02i", iMinutes, iSeconds, iMiliSeconds);
1826}
1827stock bool:is_user_steam(const id)
1828{
1829 static pDproto;
1830
1831 if (pDproto || (pDproto = get_cvar_pointer("dp_r_id_provider")))
1832 {
1833 server_cmd("dp_clientinfo %d", id);
1834 server_exec();
1835
1836 return (get_pcvar_num(pDproto) == 2) ? true : false;
1837 }
1838 return false;
1839}