· 8 years ago · Apr 23, 2018, 01:52 PM
1// =================================================
2// BEGIN EDITING HERE
3// =================================================
4
5// Should the plugin save player data in SQL database?
6// To save player data in a vault, change "#define USING_SQL" to "//#define USING_SQL"
7// To save player data in SQL, change "//#define USING_SQL" to "#define USING_SQL"
8
9//#define USING_SQL
10
11// The prefix in all of the plugin's messages
12
13new const MESSAGE_TAG[] = "^x04[XJUMPERS.XP]^x01";
14
15// If the player hasn't ever been to your server, they will get this much xp to start with
16
17#define ENTRY_XP 100
18
19// These determine if these abilities should be enabled or disabled
20// 1 = enabled
21// 0 = disabled
22
23#define ENABLE_GRENADE 1
24#define ENABLE_FLASHBANG_1 1
25#define ENABLE_FLASHBANG_2 1
26#define ENABLE_SMOKEGRENADE 1
27#define ENABLE_TERR_HEALTH 1
28#define ENABLE_CT_HEALTH 1
29#define ENABLE_TERR_ARMOR 1
30#define ENABLE_CT_ARMOR 1
31#define ENABLE_TERR_RESPAWN 1
32#define ENABLE_CT_RESPAWN 1
33#define ENABLE_TERR_NOFALL 1
34#define ENABLE_CT_NOFALL 1
35
36// The maximum level for each ability
37
38#define MAXLEVEL_GRENADE 8
39#define MAXLEVEL_FLASHBANG_1 4
40#define MAXLEVEL_FLASHBANG_2 4
41#define MAXLEVEL_SMOKEGRENADE 4
42#define MAXLEVEL_TERR_HEALTH 10
43#define MAXLEVEL_CT_HEALTH 5
44#define MAXLEVEL_TERR_ARMOR 8
45#define MAXLEVEL_CT_ARMOR 6
46#define MAXLEVEL_TERR_RESPAWN 2
47#define MAXLEVEL_CT_RESPAWN 2
48#define MAXLEVEL_TERR_NOFALL 8
49#define MAXLEVEL_CT_NOFALL 8
50
51// The xp amount required to buy the first level
52
53#define FIRST_XP_GRENADE 100
54#define FIRST_XP_FLASHBANG_1 100
55#define FIRST_XP_FLASHBANG_2 100
56#define FIRST_XP_SMOKEGRENADE 100
57#define FIRST_XP_TERR_HEALTH 100
58#define FIRST_XP_CT_HEALTH 100
59#define FIRST_XP_TERR_ARMOR 100
60#define FIRST_XP_CT_ARMOR 100
61#define FIRST_XP_TERR_RESPAWN 1000
62#define FIRST_XP_CT_RESPAWN 2000
63#define FIRST_XP_TERR_NOFALL 100
64#define FIRST_XP_CT_NOFALL 100
65
66// The maximum chance possible for this ability (happens when player has maximum level)
67
68#define CHANCE_MAX_GRENADE 100
69#define CHANCE_MAX_FLASHBANG_1 100
70#define CHANCE_MAX_FLASHBANG_2 100
71#define CHANCE_MAX_SMOKEGRENADE 100
72#define CHANCE_MAX_TERR_RESPAWN 50
73#define CHANCE_MAX_CT_RESPAWN 50
74#define CHANCE_MAX_TERR_NOFALL 80
75#define CHANCE_MAX_CT_NOFALL 80
76
77// =================================================
78// STOP EDITING HERE
79// =================================================
80
81
82#include <amxmodx>
83#include <amxmisc>
84#include <cstrike>
85#include <hamsandwich>
86#include <fun>
87#include <regex>
88#include <hlsdk_const>
89
90#if defined USING_SQL
91#include <sqlx>
92
93new Handle:g_sql_tuple;
94#else
95#include <nvault>
96
97new g_vault;
98#endif
99
100
101new const VERSION[] = "1.0";
102
103
104#pragma semicolon 1
105
106enum _:Grenades
107{
108 NADE_HE,
109 NADE_FL1,
110 NADE_FL2,
111 NADE_SM
112};
113
114new const g_nade_enabled[Grenades] =
115{
116 ENABLE_GRENADE,
117 ENABLE_FLASHBANG_1,
118 ENABLE_FLASHBANG_2,
119 ENABLE_SMOKEGRENADE
120};
121
122new const g_any_nade_enabled = ENABLE_GRENADE + ENABLE_FLASHBANG_1 + ENABLE_FLASHBANG_2 + ENABLE_SMOKEGRENADE;
123
124new const g_nade_names[Grenades][] =
125{
126 "HE",
127 "Flash #1",
128 "Flash #2",
129 "Frost"
130};
131
132new const g_nade_classnames[Grenades][] =
133{
134 "weapon_hegrenade",
135 "weapon_flashbang",
136 "weapon_flashbang",
137 "weapon_smokegrenade"
138};
139
140new const g_nade_maxlevels[Grenades] =
141{
142 MAXLEVEL_GRENADE,
143 MAXLEVEL_FLASHBANG_1,
144 MAXLEVEL_FLASHBANG_2,
145 MAXLEVEL_SMOKEGRENADE
146};
147
148new const g_nade_first_xp[Grenades] =
149{
150 FIRST_XP_GRENADE,
151 FIRST_XP_FLASHBANG_1,
152 FIRST_XP_FLASHBANG_2,
153 FIRST_XP_SMOKEGRENADE
154};
155
156new const g_nade_max_chance[Grenades] =
157{
158 CHANCE_MAX_GRENADE,
159 CHANCE_MAX_FLASHBANG_1,
160 CHANCE_MAX_FLASHBANG_2,
161 CHANCE_MAX_SMOKEGRENADE
162};
163
164new const g_team_names[CsTeams][] =
165{
166 "Spectator",
167 "Terrorist",
168 "Counter-Terrorist",
169 "Spectator"
170};
171
172new const g_health_enabled[CsTeams] =
173{
174 0,
175 ENABLE_TERR_HEALTH,
176 ENABLE_CT_HEALTH,
177 0
178};
179
180new const g_any_health_enabled = ENABLE_TERR_HEALTH + ENABLE_CT_HEALTH;
181
182new const g_health_names[CsTeams][] =
183{
184 "",
185 "[H] HP Extra",
186 "[S] HP Extra",
187 ""
188};
189
190new const g_health_maxamount[CsTeams] =
191{
192 0,
193 100,
194 50,
195 0
196};
197
198new const g_health_maxlevels[CsTeams] =
199{
200 0,
201 MAXLEVEL_TERR_HEALTH,
202 MAXLEVEL_CT_HEALTH,
203 0
204};
205
206new const g_health_first_xp[CsTeams] =
207{
208 0,
209 FIRST_XP_TERR_HEALTH,
210 FIRST_XP_CT_HEALTH,
211 0
212};
213
214new const g_armor_enabled[CsTeams] =
215{
216 0,
217 ENABLE_TERR_ARMOR,
218 ENABLE_CT_ARMOR,
219 0
220};
221
222new const g_any_armor_enabled = ENABLE_TERR_ARMOR + ENABLE_CT_ARMOR;
223
224new const g_armor_names[CsTeams][] =
225{
226 "",
227 "[H] AP Extra",
228 "[S] AP Extra",
229 ""
230};
231
232new const g_armor_maxamount[CsTeams] =
233{
234 0,
235 200,
236 150,
237 0
238};
239
240new const g_armor_maxlevels[CsTeams] =
241{
242 0,
243 MAXLEVEL_TERR_ARMOR,
244 MAXLEVEL_CT_ARMOR,
245 0
246};
247
248new const g_armor_first_xp[CsTeams] =
249{
250 0,
251 FIRST_XP_TERR_ARMOR,
252 FIRST_XP_CT_ARMOR,
253 0
254};
255
256new const g_respawn_enabled[CsTeams] =
257{
258 0,
259 ENABLE_TERR_RESPAWN,
260 ENABLE_CT_RESPAWN,
261 0
262};
263
264new const g_any_respawn_enabled = ENABLE_TERR_RESPAWN + ENABLE_CT_RESPAWN;
265
266new const g_respawn_names[CsTeams][] =
267{
268 "",
269 "[H] Revive",
270 "[S] Revive",
271 ""
272};
273
274new const g_respawn_maxlevels[CsTeams] =
275{
276 0,
277 MAXLEVEL_TERR_RESPAWN,
278 MAXLEVEL_CT_RESPAWN,
279 0
280};
281
282new const g_respawn_first_xp[CsTeams] =
283{
284 0,
285 FIRST_XP_TERR_RESPAWN,
286 FIRST_XP_CT_RESPAWN,
287 0
288};
289
290new const g_respawn_max_chance[CsTeams] =
291{
292 0,
293 CHANCE_MAX_TERR_RESPAWN,
294 CHANCE_MAX_CT_RESPAWN,
295 0
296};
297
298new const g_nofall_enabled[CsTeams] =
299{
300 0,
301 ENABLE_TERR_NOFALL,
302 ENABLE_CT_NOFALL,
303 0
304};
305
306new const g_any_nofall_enabled = ENABLE_TERR_NOFALL + ENABLE_CT_NOFALL;
307
308new const g_nofall_names[CsTeams][] =
309{
310 "",
311 "[H] Fall Damage",
312 "[S] Fall Damage",
313 ""
314};
315
316new const g_nofall_maxlevels[CsTeams] =
317{
318 0,
319 MAXLEVEL_TERR_NOFALL,
320 MAXLEVEL_CT_NOFALL,
321 0
322};
323
324new const g_nofall_first_xp[CsTeams] =
325{
326 0,
327 FIRST_XP_TERR_NOFALL,
328 FIRST_XP_CT_NOFALL,
329 0
330};
331
332new const g_nofall_max_chance[CsTeams] =
333{
334 0,
335 CHANCE_MAX_TERR_NOFALL,
336 CHANCE_MAX_CT_NOFALL,
337 0
338};
339
340#define ANY_ABILITY_ENABLED (g_any_nade_enabled || g_any_health_enabled || g_any_armor_enabled || g_any_respawn_enabled || g_any_nofall_enabled)
341
342new g_authid[33][35];
343
344new g_xp[33];
345
346new g_first_time[33];
347#if defined USING_SQL
348new g_loaded_data[33];
349#endif
350
351new g_used_revive[33];
352
353new g_nade_level[33][Grenades];
354new g_armor_level[33][CsTeams];
355new g_respawn_level[33][CsTeams];
356new g_health_level[33][CsTeams];
357new g_nofall_level[33][CsTeams];
358
359new cvar_xp_suicide;
360new cvar_xp_kill;
361new cvar_xp_headshot;
362new cvar_xp_grenade;
363new cvar_xp_survive;
364new cvar_xp_win;
365new cvar_spawn_nade_delay;
366
367new Float:g_nade_give_time;
368
369new Regex:g_SteamID_pattern;
370new g_regex_return;
371
372new g_first_client;
373new g_max_clients;
374
375new g_msgid_SayText;
376
377#if defined USING_SQL
378public plugin_precache()
379{
380 g_sql_tuple = SQL_MakeStdTuple();
381
382 SQL_ThreadQuery(g_sql_tuple, "QueryCreateTable", "CREATE TABLE IF NOT EXISTS `hns_xp` ( `name` VARCHAR(32) NOT NULL, `authid` VARCHAR(35) NOT NULL, `data` VARCHAR(256) NOT NULL );" );
383}
384
385public QueryCreateTable(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
386{
387 if( failstate == TQUERY_CONNECT_FAILED
388 || failstate == TQUERY_QUERY_FAILED )
389 {
390 set_fail_state(error);
391 }
392}
393#endif
394
395public plugin_init()
396{
397 register_plugin("HNS XP", VERSION, "fsck");
398 register_cvar("hnsxp_author", "fsck", FCVAR_SPONLY);
399 register_cvar("hnsxp_version", VERSION, FCVAR_SPONLY);
400
401 register_clcmd("say /xp", "CmdMainMenu");
402 register_clcmd("say /exp", "CmdMainMenu");
403
404 register_concmd("hnsxp_give_xp", "CmdGiveXP", ADMIN_RCON, "<nick, #userid, authid> <xp>");
405 register_concmd("hnsxp_remove_xp", "CmdRemoveXP", ADMIN_RCON, "<nick, #userid, authid> <xp>");
406
407 register_event("HLTV", "EventNewRound", "a", "1=0", "2=0");
408 register_event("DeathMsg", "EventDeathMsg", "a");
409 register_logevent("EventRoundStart", 2, "1=Round_Start");
410 register_logevent("EventRoundEnd", 2, "1=Round_End");
411 register_event("TextMsg", "EventRoundRestart", "a", "2&#Game_C", "2&#Game_w");
412
413 RegisterHam(Ham_Spawn, "player", "FwdPlayerSpawn", 1);
414 RegisterHam(Ham_Killed, "player", "FwdPlayerDeath", 1);
415 RegisterHam(Ham_TakeDamage, "player", "FwdPlayerDamage");
416
417 cvar_xp_suicide = register_cvar("hnsxp_xp_suicide", "5");
418 cvar_xp_kill = register_cvar("hnsxp_xp_kill", "500");
419 cvar_xp_headshot = register_cvar("hnsxp_xp_headshot", "450");
420 cvar_xp_grenade = register_cvar("hnsxp_xp_grenade", "450");
421 cvar_xp_survive = register_cvar("hnsxp_xp_survive", "200");
422 cvar_xp_win = register_cvar("hnsxp_xp_win", "1000");
423 cvar_spawn_nade_delay = register_cvar("hnsxp_spawn_nade_delay", "10");
424
425 #if !defined USING_SQL
426 g_vault = nvault_open("hnsxp");
427 #endif
428
429 new err[2];
430 g_SteamID_pattern = regex_compile("^^STEAM_0:(0|1):\d+$", g_regex_return, err, sizeof(err) - 1);
431
432 g_first_client = 1;
433 g_max_clients = get_maxplayers();
434
435 g_msgid_SayText = get_user_msgid("SayText");
436}
437
438#if !defined USING_SQL
439public plugin_end()
440{
441 nvault_close(g_vault);
442}
443#endif
444
445public plugin_natives()
446{
447 register_library("hns_xp");
448 register_native("hnsxp_get_user_xp", "_get_xp");
449 register_native("hnsxp_set_user_xp", "_set_xp");
450}
451
452public _get_xp(plugin, params)
453{
454 return g_xp[get_param(1)];
455}
456
457public _set_xp(plugin, params)
458{
459 new client = get_param(1);
460 g_xp[client] = max(0, get_param(2));
461 Save(client);
462 return g_xp[client];
463}
464
465public client_authorized(client)
466{
467 if( !is_user_bot(client) && !is_user_hltv(client) )
468 {
469 /* is this still called in LAN, non-steam, etc? */
470 get_user_authid(client, g_authid[client], sizeof(g_authid[]) - 1);
471
472 if( !IsValidAuthid(g_authid[client]) )
473 {
474 g_authid[client][0] = 0;
475 }
476 else
477 {
478 Load(client);
479 }
480 }
481}
482
483public client_disconnect(client)
484{
485 Save(client);
486
487 g_authid[client][0] = 0;
488 g_first_time[client] = 0;
489 #if defined USING_SQL
490 g_loaded_data[client] = 0;
491 #endif
492 g_used_revive[client] = 0;
493}
494
495public CmdMainMenu(client)
496{
497 ShowMainMenu(client);
498}
499
500public CmdGiveXP(client, level, cid)
501{
502 if( !cmd_access(client, level, cid, 3) ) return PLUGIN_HANDLED;
503
504 static arg[35];
505 read_argv(1, arg, sizeof(arg) - 1);
506
507 new target = cmd_target(client, arg, CMDTARGET_OBEY_IMMUNITY|CMDTARGET_NO_BOTS);
508 if( !target ) return PLUGIN_HANDLED;
509
510 if( !IsUserAuthorized(target) )
511 {
512 console_print(client, "Target has not authorized with the server.");
513 return PLUGIN_HANDLED;
514 }
515
516 read_argv(2, arg, sizeof(arg) - 1);
517 new xp = str_to_num(arg);
518
519 if( xp <= 0 )
520 {
521 console_print(client, "XP deve ser um valor maior que 0!");
522 if( xp < 0 )
523 {
524 console_print(client, "Use hnsxp_remove_xp instead.");
525 }
526 return PLUGIN_HANDLED;
527 }
528
529 g_xp[target] += xp;
530
531 Save(target);
532
533 static name[2][32];
534 get_user_name(client, name[0], sizeof(name[]) - 1);
535 get_user_name(target, name[1], sizeof(name[]) - 1);
536
537 Print(0, "%s gave %i XP to %s.", name[0], xp, name[1]);
538
539 static steamid[2][35];
540 get_user_authid(client, steamid[0], sizeof(steamid[]) - 1);
541 get_user_authid(target, steamid[1], sizeof(steamid[]) - 1);
542
543 log_amx("%s (%s) gave %i XP to %s (%s)", name[0], steamid[0], xp, name[1], steamid[1]);
544
545 return PLUGIN_HANDLED;
546}
547
548public CmdRemoveXP(client, level, cid)
549{
550 if( !cmd_access(client, level, cid, 3) ) return PLUGIN_HANDLED;
551
552 static arg[35];
553 read_argv(1, arg, sizeof(arg) - 1);
554
555 new target = cmd_target(client, arg, CMDTARGET_OBEY_IMMUNITY|CMDTARGET_NO_BOTS);
556 if( !target ) return PLUGIN_HANDLED;
557
558 if( !IsUserAuthorized(target) )
559 {
560 console_print(client, "Target has not authorized with the server.");
561 return PLUGIN_HANDLED;
562 }
563
564 read_argv(2, arg, sizeof(arg) - 1);
565 new xp = str_to_num(arg);
566
567 if( xp <= 0 )
568 {
569 console_print(client, "XP deve ser um valor maior que 0!");
570 if( xp < 0 )
571 {
572 console_print(client, "Use hnsxp_give_xp instead.");
573 }
574 return PLUGIN_HANDLED;
575 }
576
577 g_xp[target] -= xp;
578
579 Save(target);
580
581 static name[2][32];
582 get_user_name(client, name[0], sizeof(name[]) - 1);
583 get_user_name(target, name[1], sizeof(name[]) - 1);
584
585 Print(0, "%s removed %i XP from %s.", name[0], xp, name[1]);
586
587 static steamid[2][35];
588 get_user_authid(client, steamid[0], sizeof(steamid[]) - 1);
589 get_user_authid(target, steamid[1], sizeof(steamid[]) - 1);
590
591 log_amx("%s (%s) removed %i XP from %s (%s)", name[0], steamid[0], xp, name[1], steamid[1]);
592
593 return PLUGIN_HANDLED;
594}
595
596public EventNewRound()
597{
598 arrayset(g_used_revive, 0, sizeof(g_used_revive));
599
600 g_nade_give_time = 9999999.9;
601}
602
603public EventDeathMsg()
604{
605 new killer = read_data(1);
606 new victim = read_data(2);
607
608 if( (g_first_client <= killer <= g_max_clients) && victim != killer )
609 {
610 if( IsUserAuthorized(killer) )
611 {
612 // regular kill
613 new xp = get_pcvar_num(cvar_xp_kill);
614
615 if( read_data(3) )
616 {
617 // headshot kill
618 xp += get_pcvar_num(cvar_xp_headshot);
619 }
620 else
621 {
622 static weapon[20];
623 read_data(4, weapon, sizeof(weapon) - 1);
624
625 if( contain(weapon, "grenade") >= 0 )
626 {
627 // grenade kill (or frostnade)
628 xp += get_pcvar_num(cvar_xp_grenade);
629 }
630 }
631
632 g_xp[killer] += xp;
633
634 set_hudmessage(0, 255, 0, 0.0, 0.89, 2, 6.0, 12.0)
635 show_hudmessage(killer, "[CPO] Ganhastes %i de XP ",xp)
636
637
638 Save(killer);
639 }
640 }
641 else if( IsUserAuthorized(victim) )
642 {
643 // victim died of map causes or killed self
644 new xp = get_pcvar_num(cvar_xp_suicide);
645
646 g_xp[victim] -= xp;
647
648 set_hudmessage(0, 255, 0, 0.0, 0.89, 2, 6.0, 12.0)
649 show_hudmessage(victim, "Perdeste %i XP!", xp)
650
651 Save(victim);
652 }
653}
654
655public EventRoundStart()
656{
657 g_nade_give_time = get_pcvar_float(cvar_spawn_nade_delay);
658
659 set_task(g_nade_give_time, "TaskGiveNades", 1234);
660
661 g_nade_give_time += get_gametime();
662}
663
664public EventRoundEnd()
665{
666 EventRoundRestart();
667
668 new hider, seeker, hider_alive;
669
670 for( new i = g_first_client; i <= g_max_clients; i++ )
671 {
672 if( is_user_connected(i) )
673 {
674 switch( cs_get_user_team(i) )
675 {
676 case CS_TEAM_CT:
677 {
678 if( !seeker )
679 {
680 seeker = i;
681 }
682 }
683 case CS_TEAM_T:
684 {
685 if( !hider )
686 {
687 hider = i;
688
689 if( !hider_alive && is_user_alive(i) )
690 {
691 hider_alive = i;
692 }
693 }
694 }
695 }
696
697 if( seeker && hider && hider_alive )
698 {
699 break;
700 }
701 }
702 }
703
704 if( !hider || !seeker )
705 {
706 return;
707 }
708
709 new CsTeams:winner = CS_TEAM_CT;
710
711 if( hider_alive )
712 {
713 winner = CS_TEAM_T;
714
715 new survive = get_pcvar_num(cvar_xp_survive);
716 for( new client = g_first_client; client <= g_max_clients; client++ )
717 {
718 if( IsUserAuthorized(client) && is_user_alive(client) && cs_get_user_team(client) == CS_TEAM_T )
719 {
720 g_xp[client] += survive;
721 Save(client);
722
723 set_hudmessage(0,255,255,-1.0,0.25,2,1.0,3.0);
724 show_hudmessage(client, "Ganhaste %i XP por sobreviveres!", survive);
725 }
726 }
727 }
728
729 new win = get_pcvar_num(cvar_xp_win);
730 for( new client = g_first_client; client <= g_max_clients; client++ )
731 {
732 if( IsUserAuthorized(client) && is_user_alive(client) && cs_get_user_team(client) == winner )
733 {
734 g_xp[client] += win;
735 Save(client);
736
737 Print(client, "Ganhaste %i XP por ganhares o round!", win);
738 }
739 }
740}
741
742public EventRoundRestart()
743{
744 remove_task(1234);
745
746 g_nade_give_time = 9999999.9;
747}
748
749public FwdPlayerSpawn(client)
750{
751 if( is_user_alive(client) )
752 {
753 new CsTeams:team = cs_get_user_team(client);
754 if( team == CS_TEAM_T || team == CS_TEAM_CT )
755 {
756 if( g_first_time[client] )
757 {
758 Print(client, "Recebeste um montante de %i XP para comecares.", ENTRY_XP);
759 Print(client, "Escreve ^x03/xp ^x01para ver o que podes melhorar.");
760
761 g_first_time[client] = 0;
762 }
763 else
764 {
765 if( g_health_enabled[team] )
766 {
767 new health = g_health_maxamount[team] * g_health_level[client][team] / g_health_maxlevels[team];
768 if( health > 0 )
769 {
770 set_user_health(client, get_user_health(client) + health);
771 }
772 }
773
774 if( g_armor_enabled[team] )
775 {
776 new armorvalue = g_armor_maxamount[team] * g_armor_level[client][team] / g_armor_maxlevels[team];
777 if( armorvalue == 0 )
778 {
779 cs_set_user_armor(client, armorvalue, CS_ARMOR_NONE);
780 }
781 else if( armorvalue < 100 )
782 {
783 cs_set_user_armor(client, armorvalue, CS_ARMOR_KEVLAR);
784 }
785 else
786 {
787 cs_set_user_armor(client, armorvalue, CS_ARMOR_VESTHELM);
788 }
789 }
790 }
791
792 if( get_gametime() >= g_nade_give_time )
793 {
794 GiveNades(client);
795 }
796 }
797 }
798}
799
800public FwdPlayerDeath(client, killer, shouldgib)
801{
802 if( !g_used_revive[client] )
803 {
804 new CsTeams:team = cs_get_user_team(client);
805 if( team == CS_TEAM_T || team == CS_TEAM_CT )
806 {
807 if( g_respawn_enabled[team] )
808 {
809 new percent = g_respawn_max_chance[team] * g_respawn_level[client][team] / g_respawn_maxlevels[team];
810 if( random_num(1, 100) <= percent )
811 {
812 if( HasTeammateAlive(client, team) )
813 {
814 set_task(0.5, "TaskRespawn", client);
815
816 Print(client, "Tiveste Revive! (%i%%)", percent);
817
818 g_used_revive[client] = 1;
819 }
820 }
821 }
822 }
823 }
824}
825
826public FwdPlayerDamage(client, inflictor, attacker, Float:damage, damagebits)
827{
828 if( is_user_alive(client) && (damagebits & DMG_FALL) )
829 {
830 new CsTeams:team = cs_get_user_team(client);
831 if( team == CS_TEAM_T || team == CS_TEAM_CT )
832 {
833 if( g_nofall_enabled[team] )
834 {
835 new percent = g_nofall_max_chance[team] * g_nofall_level[client][team] / g_nofall_maxlevels[team];
836 SetHamParamFloat(4, damage * (1.0 - (float(percent) / 100.0)));
837 }
838 }
839 }
840}
841
842public TaskRespawn(client)
843{
844 ExecuteHamB(Ham_CS_RoundRespawn, client);
845}
846
847public TaskGiveNades()
848{
849 for( new client = g_first_client; client <= g_max_clients; client++ )
850 {
851 if( is_user_alive(client) )
852 {
853 GiveNades(client);
854 }
855 }
856}
857
858HasTeammateAlive(client, CsTeams:team)
859{
860 for( new i = g_first_client; i <= g_max_clients; i++ )
861 {
862 if( i == client ) continue;
863
864 if( is_user_alive(i) && cs_get_user_team(i) == team )
865 {
866 return 1;
867 }
868 }
869
870 return 0;
871}
872
873GiveNades(client)
874{
875 new CsTeams:team = cs_get_user_team(client);
876
877 if( team == CS_TEAM_T )
878 {
879 static percent;
880 for( new i = 0; i < Grenades; i++ )
881 {
882 if( g_nade_enabled[i] )
883 {
884 percent = g_nade_max_chance[i] * g_nade_level[client][i] / g_nade_maxlevels[i];
885 if( percent > 0 && (percent == 100 || random_num(1, 100) <= percent) )
886 {
887 give_item(client, g_nade_classnames[i]);
888
889 if( percent < 100 )
890 {
891 Print(client, "Recebeste %s! (%i%%)", g_nade_names[i], percent);
892 }
893 }
894 }
895 }
896 }
897}
898
899ShowMainMenu(client)
900{
901 static title[128];
902 formatex(title, sizeof(title) - 1, "\y[\rXTREME-JUMPERS\y] \rMenu^n^n\rXP: \w%i", g_xp[client]);
903 new menu = menu_create(title, "MenuMain");
904
905 menu_additem(menu, "\yAjuda", "*");
906 if( g_any_nade_enabled )
907 {
908 menu_additem(menu, "\yMenu Nades", "1");
909 }
910 if( g_any_health_enabled )
911 {
912 menu_additem(menu, "\yMenu HP", "2");
913 }
914 if( g_any_armor_enabled )
915 {
916 menu_additem(menu, "\yMenu AP", "3");
917 }
918 if( g_any_respawn_enabled )
919 {
920 menu_additem(menu, "\yMenu Revive", "4");
921 }
922 if( g_any_nofall_enabled )
923 {
924 menu_additem(menu, "\yMenu Fall Damage^n", "5");
925 }
926 if( ANY_ABILITY_ENABLED )
927 {
928 menu_additem(menu, "\yMais Info.", "6");
929 }
930
931 menu_display(client, menu);
932}
933
934public MenuMain(client, menu, item)
935{
936 if( item == MENU_EXIT )
937 {
938 menu_destroy(menu);
939 return;
940 }
941
942 static _access, info[4], callback;
943 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
944 menu_destroy(menu);
945
946 switch( info[0] )
947 {
948 case '*':
949 {
950 static motd[2500];
951 new len = formatex(motd, sizeof(motd) - 1, "<body style=^"background-color:#030303; color:#FF8F00^">");
952 len += format(motd[len], sizeof(motd) - len - 1, "<p align=^"center^">");
953 len += format(motd[len], sizeof(motd) - len - 1, "Hide'n'Seek XP Mod é um addon experiente base para Hide'n'Seek.<br>");
954 len += format(motd[len], sizeof(motd) - len - 1, "Os jogadores ganham pontos de experiência pela maneira como eles jogam o jogo.<br>");
955 len += format(motd[len], sizeof(motd) - len - 1, "<br>");
956 len += format(motd[len], sizeof(motd) - len - 1, "<table border=0>");
957 len += format(motd[len], sizeof(motd) - len - 1, "<tr><th>Accao</th><th>XP</th></tr>");
958 len += format(motd[len], sizeof(motd) - len - 1, "<tr><td>Matar</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_kill));
959 len += format(motd[len], sizeof(motd) - len - 1, "<tr><td>Granadas</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_grenade));
960 len += format(motd[len], sizeof(motd) - len - 1, "<tr><td>Facada na Cabeca</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_headshot));
961 len += format(motd[len], sizeof(motd) - len - 1, "<tr><td>Suicidio</td><td>-%i</td></tr>", get_pcvar_num(cvar_xp_suicide));
962 len += format(motd[len], sizeof(motd) - len - 1, "<tr><td>Sobreviver em Terrorista</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_survive));
963 len += format(motd[len], sizeof(motd) - len - 1, "<tr><td>Ganhar Round</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_win));
964 len += format(motd[len], sizeof(motd) - len - 1, "</table>");
965 len += format(motd[len], sizeof(motd) - len - 1, "Com esses pontos de XP, você pode comprar upgrades.<br>");
966 len += format(motd[len], sizeof(motd) - len - 1, "Para obter uma lista destas actualizações, Digite /xp novamente e ver os outros menus.");
967 len += format(motd[len], sizeof(motd) - len - 1, "</p>");
968 len += format(motd[len], sizeof(motd) - len - 1, "</body>");
969
970 show_motd(client, motd, "HideNSeek XP Info");
971 }
972 case '1':
973 {
974 ShowGrenadesMenu(client);
975 }
976 case '2':
977 {
978 ShowHealthMenu(client);
979 }
980 case '3':
981 {
982 ShowArmorMenu(client);
983 }
984 case '4':
985 {
986 ShowRespawnMenu(client);
987 }
988 case '5':
989 {
990 ShowNoFallMenu(client);
991 }
992 case '6':
993 {
994 ShowPlayerMenu(client);
995 }
996 }
997}
998
999ShowGrenadesMenu(client)
1000{
1001 static title[128];
1002 formatex(title, sizeof(title) - 1, "Menu Nades^n^nNota: \wNades abilitadas apenas para os \rT's!\y^n^nXP: \w%i", g_xp[client]);
1003 new menu = menu_create(title, "MenuGrenades");
1004 new callback = menu_makecallback("CallbackGrenades");
1005
1006 menu_additem(menu, "\yAjuda", "*", _, callback);
1007
1008 static level, xp, percent, item[128], info[4];
1009 for( new i = 0; i < Grenades; i++ )
1010 {
1011 if( g_nade_enabled[i] )
1012 {
1013 level = g_nade_level[client][i] + 1;
1014 percent = g_nade_max_chance[i] * level / g_nade_maxlevels[i];
1015
1016 if( g_nade_level[client][i] < g_nade_maxlevels[i] )
1017 {
1018 xp = g_nade_first_xp[i] * (1 << (level - 1));
1019 formatex(item, sizeof(item) - 1, "%s: \yNivel %i (%i%%) \r[\w%i XP\r]", g_nade_names[i], level, percent, xp);
1020 }
1021 else
1022 {
1023 formatex(item, sizeof(item) - 1, "%s: \yNivel %i (%i%%) \r[\wMaximo!\r]", g_nade_names[i], level, percent);
1024 }
1025
1026 num_to_str(i, info, sizeof(info) - 1);
1027
1028 menu_additem(menu, item, info, _, callback);
1029 }
1030 }
1031
1032 menu_display(client, menu);
1033}
1034
1035public MenuGrenades(client, menu, item)
1036{
1037 if( item == MENU_EXIT )
1038 {
1039 menu_destroy(menu);
1040 ShowMainMenu(client);
1041 return;
1042 }
1043
1044 static _access, info[4], callback;
1045 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1046 menu_destroy(menu);
1047
1048 if( info[0] == '*' )
1049 {
1050 static motd[2500];
1051 new len = formatex(motd, sizeof(motd) - 1, "<body style=^"background-color:#030303; color:#FF8F00^">");
1052 len += format(motd[len], sizeof(motd) - len - 1, "<p align=^"center^">");
1053 len += format(motd[len], sizeof(motd) - len - 1, "A capacidade Granadas para o Mod XP é apenas para os terroristas.<br>");
1054 len += format(motd[len], sizeof(motd) - len - 1, "A capacidade Granadas contém a granada HE Explosiva, 2 Flash, e Frost Nade.<br>");
1055 len += format(motd[len], sizeof(motd) - len - 1, "Estas são as granadas que são dadas quando você recebe os itens a se esconder depois que o temporizador termina.<br>");
1056 len += format(motd[len], sizeof(motd) - len - 1, "<br>");
1057 len += format(motd[len], sizeof(motd) - len - 1, "<table>");
1058 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1059 len += format(motd[len], sizeof(motd) - len - 1, "<th></th>");
1060 for( new i = 0; i < Grenades; i++ )
1061 {
1062 if( g_nade_enabled[i] )
1063 {
1064 len += format(motd[len], sizeof(motd) - len - 1, "<th>%s</th>", g_nade_names[i]);
1065 }
1066 }
1067 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1068 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1069 len += format(motd[len], sizeof(motd) - len - 1, "<th>Chance Intervals</th>");
1070 for( new i = 0; i < Grenades; i++ )
1071 {
1072 if( g_nade_enabled[i] )
1073 {
1074 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i%%</td>", (g_nade_max_chance[i] / g_nade_maxlevels[i]));
1075 }
1076 }
1077 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1078 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1079 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Level</th>");
1080 for( new i = 0; i < Grenades; i++ )
1081 {
1082 if( g_nade_enabled[i] )
1083 {
1084 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i</td>", g_nade_maxlevels[i]);
1085 }
1086 }
1087 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1088 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Chance</th>");
1089 for( new i = 0; i < Grenades; i++ )
1090 {
1091 if( g_nade_enabled[i] )
1092 {
1093 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i%%</td>", g_nade_max_chance[i]);
1094 }
1095 }
1096 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1097 len += format(motd[len], sizeof(motd) - len - 1, "</table>");
1098 len += format(motd[len], sizeof(motd) - len - 1, "</p>");
1099 len += format(motd[len], sizeof(motd) - len - 1, "</body>");
1100
1101 show_motd(client, motd, "XP Grenades Info");
1102 }
1103 else
1104 {
1105 new upgrade = str_to_num(info);
1106
1107 new level = g_nade_level[client][upgrade] + 1;
1108 new xp = g_nade_first_xp[upgrade] * (1 << (level - 1));
1109 new percent = g_nade_max_chance[upgrade] * level / g_nade_maxlevels[upgrade];
1110
1111 g_xp[client] -= xp;
1112 g_nade_level[client][upgrade] = level;
1113
1114 Save(client);
1115
1116 Print(client, "Compraste %s Nivel %i (%i%%) por %i XP!", g_nade_names[upgrade], level, percent, xp);
1117 }
1118
1119 ShowGrenadesMenu(client);
1120}
1121
1122public CallbackGrenades(client, menu, item)
1123{
1124 static _access, info[4], callback;
1125 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1126
1127 if( info[0] == '*' ) return ITEM_ENABLED;
1128
1129 new upgrade = str_to_num(info);
1130 if( g_nade_level[client][upgrade] == g_nade_maxlevels[upgrade] )
1131 {
1132 return ITEM_DISABLED;
1133 }
1134
1135 new xp = g_nade_first_xp[upgrade] * (1 << g_nade_level[client][upgrade]);
1136 if( g_xp[client] < xp )
1137 {
1138 return ITEM_DISABLED;
1139 }
1140
1141 return ITEM_ENABLED;
1142}
1143
1144ShowHealthMenu(client)
1145{
1146 static title[128];
1147 formatex(title, sizeof(title) - 1, "Menu HP^n^nXP: \w%i", g_xp[client]);
1148 new menu = menu_create(title, "MenuHealth");
1149 new callback = menu_makecallback("CallbackHealth");
1150
1151 menu_additem(menu, "\yAjuda", "*", _, callback);
1152
1153 static level, xp, amount, item[128], info[4];
1154 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1155 {
1156 if( g_health_enabled[i] )
1157 {
1158 level = g_health_level[client][i] + 1;
1159 amount = g_health_maxamount[i] * level / g_health_maxlevels[i];
1160
1161 if( g_health_level[client][i] < g_health_maxlevels[i] )
1162 {
1163 xp = g_health_first_xp[i] * (1 << (level - 1));
1164 formatex(item, sizeof(item) - 1, "%s: \yNivel %i (%i HP) \r[\w%i XP\r]", g_health_names[i], level, amount, xp);
1165 }
1166 else
1167 {
1168 formatex(item, sizeof(item) - 1, "\w%s: \yNivel %i (%i HP) \r[\wMaximo!\r]", g_health_names[i], level, amount);
1169 }
1170
1171 num_to_str(_:i, info, sizeof(info) - 1);
1172
1173 menu_additem(menu, item, info, _, callback);
1174 }
1175 }
1176
1177 menu_display(client, menu);
1178}
1179
1180public MenuHealth(client, menu, item)
1181{
1182 if( item == MENU_EXIT )
1183 {
1184 menu_destroy(menu);
1185 ShowMainMenu(client);
1186 return;
1187 }
1188
1189 static _access, info[4], callback;
1190 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1191 menu_destroy(menu);
1192
1193 if( info[0] == '*' )
1194 {
1195 static motd[2500];
1196 new len = formatex(motd, sizeof(motd) - 1, "<body style=^"background-color:#030303; color:#FF8F00^">");
1197 len += format(motd[len], sizeof(motd) - len - 1, "<p align=^"center^">");
1198 len += format(motd[len], sizeof(motd) - len - 1, "A capacidade de HP é a quantidade do mesmo, que é adicionado à sua Personagem.<br>");
1199 len += format(motd[len], sizeof(motd) - len - 1, "<br>");
1200 len += format(motd[len], sizeof(motd) - len - 1, "<table>");
1201 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1202 len += format(motd[len], sizeof(motd) - len - 1, "<th></th>");
1203 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1204 {
1205 if( g_health_enabled[i] )
1206 {
1207 len += format(motd[len], sizeof(motd) - len - 1, "<th>%s</th>",g_team_names[i]);
1208 }
1209 }
1210 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1211 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1212 len += format(motd[len], sizeof(motd) - len - 1, "<th>Health Intervals</th>");
1213 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1214 {
1215 if( g_health_enabled[i] )
1216 {
1217 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i</td>", (g_health_maxamount[i] / g_health_maxlevels[i]));
1218 }
1219 }
1220 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1221 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1222 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Level</th>");
1223 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1224 {
1225 if( g_health_enabled[i] )
1226 {
1227 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i</td>", g_health_maxlevels[i]);
1228 }
1229 }
1230 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1231 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Health</th>");
1232 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1233 {
1234 if( g_health_enabled[i] )
1235 {
1236 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i</td>", g_health_maxamount[i]);
1237 }
1238 }
1239 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1240 len += format(motd[len], sizeof(motd) - len - 1, "</table>");
1241 len += format(motd[len], sizeof(motd) - len - 1, "</p>");
1242 len += format(motd[len], sizeof(motd) - len - 1, "</body>");
1243
1244 show_motd(client, motd, "XP Health Info");
1245 }
1246 else
1247 {
1248 new CsTeams:upgrade = CsTeams:str_to_num(info);
1249
1250 new level = g_health_level[client][upgrade] + 1;
1251 new xp = g_health_first_xp[upgrade] * (1 << (level - 1));
1252 new amount = g_health_maxamount[upgrade] * level / g_health_maxlevels[upgrade];
1253
1254 g_xp[client] -= xp;
1255 g_health_level[client][upgrade] = level;
1256
1257 Save(client);
1258
1259 Print(client, "Compraste %s Nivel %i (%i HP) por %i XP!", g_health_names[upgrade], level, amount, xp);
1260 }
1261
1262 ShowHealthMenu(client);
1263}
1264
1265public CallbackHealth(client, menu, item)
1266{
1267 static _access, info[4], callback;
1268 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1269
1270 if( info[0] == '*' ) return ITEM_ENABLED;
1271
1272 new CsTeams:upgrade = CsTeams:str_to_num(info);
1273 if( g_health_level[client][upgrade] == g_health_maxlevels[upgrade] )
1274 {
1275 return ITEM_DISABLED;
1276 }
1277
1278 new xp = g_health_first_xp[upgrade] * (1 << g_health_level[client][upgrade]);
1279 if( g_xp[client] < xp )
1280 {
1281 return ITEM_DISABLED;
1282 }
1283
1284 return ITEM_ENABLED;
1285}
1286
1287ShowArmorMenu(client)
1288{
1289 static title[128];
1290 formatex(title, sizeof(title) - 1, "Menu AP^n^nXP: \w%i", g_xp[client]);
1291 new menu = menu_create(title, "MenuArmor");
1292 new callback = menu_makecallback("CallbackArmor");
1293
1294 menu_additem(menu, "\yAjuda", "*", _, callback);
1295
1296 static level, xp, amount, item[128], info[4];
1297 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1298 {
1299 if( g_armor_enabled[i] )
1300 {
1301 level = g_armor_level[client][i] + 1;
1302 amount = g_armor_maxamount[i] * level / g_armor_maxlevels[i];
1303
1304 if( g_armor_level[client][i] < g_armor_maxlevels[i] )
1305 {
1306 xp = g_armor_first_xp[i] * (1 << (level - 1));
1307 formatex(item, sizeof(item) - 1, "%s: \yNivel %i (%i AP) \r[\w%i XP\r]", g_armor_names[i], level, amount, xp);
1308 }
1309 else
1310 {
1311 formatex(item, sizeof(item) - 1, "\w%s: \yNivel %i (%i AP) \r[\wMaximo!\r]", g_armor_names[i], level, amount);
1312 }
1313
1314 num_to_str(_:i, info, sizeof(info) - 1);
1315
1316 menu_additem(menu, item, info, _, callback);
1317 }
1318 }
1319
1320 menu_display(client, menu);
1321}
1322
1323public MenuArmor(client, menu, item)
1324{
1325 if( item == MENU_EXIT )
1326 {
1327 menu_destroy(menu);
1328 ShowMainMenu(client);
1329 return;
1330 }
1331
1332 static _access, info[4], callback;
1333 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1334 menu_destroy(menu);
1335
1336 if( info[0] == '*' )
1337 {
1338 static motd[2500];
1339 new len = formatex(motd, sizeof(motd) - 1, "<body style=^"background-color:#030303; color:#FF8F00^">");
1340 len += format(motd[len], sizeof(motd) - len - 1, "<p align=^"center^">");
1341 len += format(motd[len], sizeof(motd) - len - 1, "A capacidade de AP é a quantidade do mesmo, que é adicionado à sua Personagem.<br>");
1342 len += format(motd[len], sizeof(motd) - len - 1, "<br>");
1343 len += format(motd[len], sizeof(motd) - len - 1, "<table>");
1344 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1345 len += format(motd[len], sizeof(motd) - len - 1, "<th></th>");
1346 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1347 {
1348 if( g_armor_enabled[i] )
1349 {
1350 len += format(motd[len], sizeof(motd) - len - 1, "<th>%s</th>",g_team_names[i]);
1351 }
1352 }
1353 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1354 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1355 len += format(motd[len], sizeof(motd) - len - 1, "<th>Armor Intervals</th>");
1356 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1357 {
1358 if( g_armor_enabled[i] )
1359 {
1360 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i</td>", (g_armor_maxamount[i] / g_armor_maxlevels[i]));
1361 }
1362 }
1363 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1364 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1365 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Level</th>");
1366 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1367 {
1368 if( g_armor_enabled[i] )
1369 {
1370 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i</td>", g_armor_maxlevels[i]);
1371 }
1372 }
1373 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1374 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Armor</th>");
1375 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1376 {
1377 if( g_armor_enabled[i] )
1378 {
1379 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i</td>", g_armor_maxamount[i]);
1380 }
1381 }
1382 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1383 len += format(motd[len], sizeof(motd) - len - 1, "</table>");
1384 len += format(motd[len], sizeof(motd) - len - 1, "</p>");
1385 len += format(motd[len], sizeof(motd) - len - 1, "</body>");
1386
1387 show_motd(client, motd, "XP Armor Info");
1388 }
1389 else
1390 {
1391 new CsTeams:upgrade = CsTeams:str_to_num(info);
1392
1393 new level = g_armor_level[client][upgrade] + 1;
1394 new xp = g_armor_first_xp[upgrade] * (1 << (level - 1));
1395 new amount = g_armor_maxamount[upgrade] * level / g_armor_maxlevels[upgrade];
1396
1397 g_xp[client] -= xp;
1398 g_armor_level[client][upgrade] = level;
1399
1400 Save(client);
1401
1402 Print(client, "Compraste %s Nivel %i (%i AP) por %i XP!", g_armor_names[upgrade], level, amount, xp);
1403 }
1404
1405 ShowArmorMenu(client);
1406}
1407
1408public CallbackArmor(client, menu, item)
1409{
1410 static _access, info[4], callback;
1411 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1412
1413 if( info[0] == '*' ) return ITEM_ENABLED;
1414
1415 new CsTeams:upgrade = CsTeams:str_to_num(info);
1416 if( g_armor_level[client][upgrade] == g_armor_maxlevels[upgrade] )
1417 {
1418 return ITEM_DISABLED;
1419 }
1420
1421 new xp = g_armor_first_xp[upgrade] * (1 << g_armor_level[client][upgrade]);
1422 if( g_xp[client] < xp )
1423 {
1424 return ITEM_DISABLED;
1425 }
1426
1427 return ITEM_ENABLED;
1428}
1429
1430ShowRespawnMenu(client)
1431{
1432 static title[128];
1433 formatex(title, sizeof(title) - 1, "Menu Revive^n^nXP: \w%i", g_xp[client]);
1434 new menu = menu_create(title, "MenuRespawn");
1435 new callback = menu_makecallback("CallbackRespawn");
1436
1437 menu_additem(menu, "\yAjuda", "*", _, callback);
1438
1439 static level, xp, percent, item[128], info[4];
1440 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1441 {
1442 if( g_respawn_enabled[i] )
1443 {
1444 level = g_respawn_level[client][i] + 1;
1445 percent = g_respawn_max_chance[i] * level / g_respawn_maxlevels[i];
1446
1447 if( g_respawn_level[client][i] < g_respawn_maxlevels[i] )
1448 {
1449 xp = g_respawn_first_xp[i] * (1 << (level - 1));
1450 formatex(item, sizeof(item) - 1, "%s: \yNivel %i (%i%%) \r[\w%i XP\r]", g_respawn_names[i], level, percent, xp);
1451 }
1452 else
1453 {
1454 formatex(item, sizeof(item) - 1, "%s: \yNivel %i (%i%%) \r[\wMaximo!\r]", g_respawn_names[i], level, percent);
1455 }
1456
1457 num_to_str(_:i, info, sizeof(info) - 1);
1458
1459 menu_additem(menu, item, info, _, callback);
1460 }
1461 }
1462
1463 menu_display(client, menu);
1464}
1465
1466public MenuRespawn(client, menu, item)
1467{
1468 if( item == MENU_EXIT )
1469 {
1470 menu_destroy(menu);
1471 ShowMainMenu(client);
1472 return;
1473 }
1474
1475 static _access, info[4], callback;
1476 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1477 menu_destroy(menu);
1478
1479 if( info[0] == '*' )
1480 {
1481 static motd[2500];
1482 new len = formatex(motd, sizeof(motd) - 1, "<body style=^"background-color:#030303; color:#FF8F00^">");
1483 len += format(motd[len], sizeof(motd) - len - 1, "<p align=^"center^">");
1484 len += format(motd[len], sizeof(motd) - len - 1, "A capacidade Revive é a chance para renascer quando você morre.<br>");
1485 len += format(motd[len], sizeof(motd) - len - 1, "<br>");
1486 len += format(motd[len], sizeof(motd) - len - 1, "<table>");
1487 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1488 len += format(motd[len], sizeof(motd) - len - 1, "<th></th>");
1489 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1490 {
1491 if( g_respawn_enabled[i] )
1492 {
1493 len += format(motd[len], sizeof(motd) - len - 1, "<th>%s</th>",g_team_names[i]);
1494 }
1495 }
1496 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1497 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1498 len += format(motd[len], sizeof(motd) - len - 1, "<th>Chance Intervals</th>");
1499 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1500 {
1501 if( g_respawn_enabled[i] )
1502 {
1503 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i%%</td>", (g_respawn_max_chance[i] / g_respawn_maxlevels[i]));
1504 }
1505 }
1506 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1507 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1508 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Level</th>");
1509 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1510 {
1511 if( g_respawn_enabled[i] )
1512 {
1513 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i</td>", g_respawn_maxlevels[i]);
1514 }
1515 }
1516 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1517 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Chance</th>");
1518 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1519 {
1520 if( g_respawn_enabled[i] )
1521 {
1522 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i%%</td>", g_respawn_max_chance[i]);
1523 }
1524 }
1525 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1526 len += format(motd[len], sizeof(motd) - len - 1, "</table>");
1527 len += format(motd[len], sizeof(motd) - len - 1, "</p>");
1528 len += format(motd[len], sizeof(motd) - len - 1, "</body>");
1529
1530 show_motd(client, motd, "XP Respawn Info");
1531 }
1532 else
1533 {
1534 new CsTeams:upgrade = CsTeams:str_to_num(info);
1535
1536 new level = g_respawn_level[client][upgrade] + 1;
1537 new xp = g_respawn_first_xp[upgrade] * (1 << (level - 1));
1538 new percent = g_respawn_max_chance[upgrade] * level / g_respawn_maxlevels[upgrade];
1539
1540 g_xp[client] -= xp;
1541 g_respawn_level[client][upgrade] = level;
1542
1543 Save(client);
1544
1545 Print(client, "Compraste %s Nivel %i (%i%%) por %i XP!", g_respawn_names[upgrade], level, percent, xp);
1546 }
1547
1548 ShowRespawnMenu(client);
1549}
1550
1551public CallbackRespawn(client, menu, item)
1552{
1553 static _access, info[4], callback;
1554 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1555
1556 if( info[0] == '*' ) return ITEM_ENABLED;
1557
1558 new CsTeams:upgrade = CsTeams:str_to_num(info);
1559 if( g_respawn_level[client][upgrade] == g_respawn_maxlevels[upgrade] )
1560 {
1561 return ITEM_DISABLED;
1562 }
1563
1564 new xp = g_respawn_first_xp[upgrade] * (1 << g_respawn_level[client][upgrade]);
1565 if( g_xp[client] < xp || g_respawn_level[client][upgrade] == g_respawn_maxlevels[upgrade] )
1566 {
1567 return ITEM_DISABLED;
1568 }
1569
1570 return ITEM_ENABLED;
1571}
1572
1573ShowNoFallMenu(client)
1574{
1575 static title[128];
1576 formatex(title, sizeof(title) - 1, "Menu Fall Damage^n^nXP: \w%i", g_xp[client]);
1577 new menu = menu_create(title, "MenuNoFall");
1578 new callback = menu_makecallback("CallbackNoFall");
1579
1580 menu_additem(menu, "\yAjuda", "*", _, callback);
1581
1582 static level, xp, percent, item[128], info[4];
1583 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1584 {
1585 if( g_nofall_enabled[i] )
1586 {
1587 level = g_nofall_level[client][i] + 1;
1588 percent = g_nofall_max_chance[i] * level / g_nofall_maxlevels[i];
1589
1590 if( g_nofall_level[client][i] < g_nofall_maxlevels[i] )
1591 {
1592 xp = g_nofall_first_xp[i] * (1 << (level - 1));
1593 formatex(item, sizeof(item) - 1, "%s: \yNivel %i (%i%%) \r[\w%i XP\r]", g_nofall_names[i], level, percent, xp);
1594 }
1595 else
1596 {
1597 formatex(item, sizeof(item) - 1, "%s: \yNivel %i (%i%%) \r[\wMaximo!\r]", g_nofall_names[i], level, percent);
1598 }
1599
1600 num_to_str(_:i, info, sizeof(info) - 1);
1601
1602 menu_additem(menu, item, info, _, callback);
1603 }
1604 }
1605
1606 menu_display(client, menu);
1607}
1608
1609public MenuNoFall(client, menu, item)
1610{
1611 if( item == MENU_EXIT )
1612 {
1613 menu_destroy(menu);
1614 ShowMainMenu(client);
1615 return;
1616 }
1617
1618 static _access, info[4], callback;
1619 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1620 menu_destroy(menu);
1621
1622 if( info[0] == '*' )
1623 {
1624 static motd[2500];
1625 new len = formatex(motd, sizeof(motd) - 1, "<body style=^"background-color:#030303; color:#FF8F00^">");
1626 len += format(motd[len], sizeof(motd) - len - 1, "<p align=^"center^">");
1627 len += format(motd[len], sizeof(motd) - len - 1, "A capacidade de danos da queda reduz a quantidade de dano causado a queda.<br>");
1628 len += format(motd[len], sizeof(motd) - len - 1, "<br>");
1629 len += format(motd[len], sizeof(motd) - len - 1, "<table>");
1630 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1631 len += format(motd[len], sizeof(motd) - len - 1, "<th></th>");
1632 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1633 {
1634 if( g_nofall_enabled[i] )
1635 {
1636 len += format(motd[len], sizeof(motd) - len - 1, "<th>%s</th>",g_team_names[i]);
1637 }
1638 }
1639 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1640 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1641 len += format(motd[len], sizeof(motd) - len - 1, "<th>Reduction Intervals</th>");
1642 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1643 {
1644 if( g_nofall_enabled[i] )
1645 {
1646 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i%%</td>", (g_nofall_max_chance[i] / g_nofall_maxlevels[i]));
1647 }
1648 }
1649 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1650 len += format(motd[len], sizeof(motd) - len - 1, "<tr>");
1651 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Level</th>");
1652 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1653 {
1654 if( g_nofall_enabled[i] )
1655 {
1656 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i</td>", g_nofall_maxlevels[i]);
1657 }
1658 }
1659 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1660 len += format(motd[len], sizeof(motd) - len - 1, "<th>Max Chance</th>");
1661 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1662 {
1663 if( g_nofall_enabled[i] )
1664 {
1665 len += format(motd[len], sizeof(motd) - len - 1, "<td>%i%%</td>", g_nofall_max_chance[i]);
1666 }
1667 }
1668 len += format(motd[len], sizeof(motd) - len - 1, "</tr>");
1669 len += format(motd[len], sizeof(motd) - len - 1, "</table>");
1670 len += format(motd[len], sizeof(motd) - len - 1, "</p>");
1671 len += format(motd[len], sizeof(motd) - len - 1, "</body>");
1672
1673 show_motd(client, motd, "XP Fall Damage Info");
1674 }
1675 else
1676 {
1677 new CsTeams:upgrade = CsTeams:str_to_num(info);
1678
1679 new level = g_nofall_level[client][upgrade] + 1;
1680 new xp = g_nofall_first_xp[upgrade] * (1 << (level - 1));
1681 new percent = g_nofall_max_chance[upgrade] * level / g_nofall_maxlevels[upgrade];
1682
1683 g_xp[client] -= xp;
1684 g_nofall_level[client][upgrade] = level;
1685
1686 Save(client);
1687
1688 Print(client, "Compraste %s Nivel %i (%i%%) por %i XP!", g_nofall_names[upgrade], level, percent, xp);
1689 }
1690
1691 ShowNoFallMenu(client);
1692}
1693
1694public CallbackNoFall(client, menu, item)
1695{
1696 static _access, info[4], callback;
1697 menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
1698
1699 if( info[0] == '*' ) return ITEM_ENABLED;
1700
1701 new CsTeams:upgrade = CsTeams:str_to_num(info);
1702 if( g_nofall_level[client][upgrade] == g_nofall_maxlevels[upgrade] )
1703 {
1704 return ITEM_DISABLED;
1705 }
1706
1707 new xp = g_nofall_first_xp[upgrade] * (1 << g_nofall_level[client][upgrade]);
1708 if( g_xp[client] < xp || g_nofall_level[client][upgrade] == g_nofall_maxlevels[upgrade] )
1709 {
1710 return ITEM_DISABLED;
1711 }
1712
1713 return ITEM_ENABLED;
1714}
1715
1716ShowPlayerMenu(client)
1717{
1718 new menu = menu_create("Player Info Menu", "MenuPlayer");
1719
1720 new name[32], authid[35];
1721 for( new i = 1; i <= g_max_clients; i++ )
1722 {
1723 if( !is_user_connected(i) ) continue;
1724
1725 get_user_name(i, name, sizeof(name) - 1);
1726 get_user_authid(i, authid, sizeof(authid) - 1);
1727
1728 menu_additem(menu, name, authid);
1729 }
1730
1731 menu_display(client, menu);
1732}
1733
1734public MenuPlayer(client, menu, item)
1735{
1736 if( item == MENU_EXIT )
1737 {
1738 menu_destroy(menu);
1739 ShowMainMenu(client);
1740 return;
1741 }
1742
1743 static _access, authid[35], callback;
1744 menu_item_getinfo(menu, item, _access, authid, sizeof(authid) - 1, _, _, callback);
1745 menu_destroy(menu);
1746
1747 new player = find_player("c", authid);
1748 if( !is_user_connected(player) )
1749 {
1750 ShowMainMenu(client);
1751 return;
1752 }
1753
1754 new name[32];
1755 get_user_name(player, name, sizeof(name) - 1);
1756
1757 static motd[2500];
1758 new len = copy(motd, sizeof(motd) - 1, "<html>");
1759 len += format(motd[len], sizeof(motd) - len - 1, "<b><font size=^"4^">Name:</font></b> %s<br><br>", name);
1760 len += format(motd[len], sizeof(motd) - len - 1, "<b><font size=^"4^">XP:</font></b> %i<br><br>", g_xp[player]);
1761 if( g_any_nade_enabled )
1762 {
1763 len += format(motd[len], sizeof(motd) - len - 1, "<b><font size=^"4^">Grenades Levels:</font></b><br>");
1764 for( new i = 0; i < Grenades; i++ )
1765 {
1766 if( g_nade_enabled[i] )
1767 {
1768 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i<br>", g_nade_names[i], g_nade_level[player][i], g_nade_maxlevels[i]);
1769 }
1770 }
1771 }
1772 if( g_any_health_enabled )
1773 {
1774 len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Health Levels:</font></b><br>");
1775 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1776 {
1777 if( g_health_enabled[i] )
1778 {
1779 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i HP)<br>",\
1780 g_health_names[i], g_health_level[player][i], g_health_maxlevels[i],\
1781 (g_health_maxamount[i] * g_health_level[player][i] / g_health_maxlevels[i]), g_health_maxamount[i]);
1782 }
1783 }
1784 }
1785 if( g_any_armor_enabled )
1786 {
1787 len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Armor Levels:</font></b><br>");
1788 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1789 {
1790 if( g_armor_enabled[i] )
1791 {
1792 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i AP)<br>",\
1793 g_armor_names[i], g_armor_level[player][i], g_armor_maxlevels[i],\
1794 (g_armor_maxamount[i] * g_armor_level[player][i] / g_armor_maxlevels[i]), g_armor_maxamount[i]);
1795 }
1796 }
1797 }
1798 if( g_any_respawn_enabled )
1799 {
1800 len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Respawn Levels:</font></b><br>");
1801 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1802 {
1803 if( g_respawn_enabled[i] )
1804 {
1805 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i %%)<br>",\
1806 g_respawn_names[i], g_respawn_level[player][i], g_respawn_maxlevels[i],\
1807 (g_respawn_max_chance[i] * g_respawn_level[player][i] / g_respawn_maxlevels[i]), g_respawn_max_chance[i]);
1808 }
1809 }
1810 }
1811 if( g_any_nofall_enabled )
1812 {
1813 len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Fall Damage Levels:</font></b><br>");
1814 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1815 {
1816 if( g_nofall_enabled[i] )
1817 {
1818 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i %%)<br>",\
1819 g_nofall_names[i], g_nofall_level[player][i], g_nofall_maxlevels[i],\
1820 (g_nofall_max_chance[i] * g_nofall_level[player][i] / g_nofall_maxlevels[i]), g_nofall_max_chance[i]);
1821 }
1822 }
1823 }
1824 len += format(motd[len], sizeof(motd) - len - 1, "</html>");
1825
1826 show_motd(client, motd, "HNS XP Mod Info");
1827
1828 ShowPlayerMenu(client);
1829}
1830
1831IsValidAuthid(authid[])
1832{
1833 return (regex_match_c(authid, g_SteamID_pattern, g_regex_return) > 0);
1834}
1835
1836IsUserAuthorized(client)
1837{
1838 return g_authid[client][0] != 0;
1839}
1840
1841Print(client, const msg_fmt[], any:...)
1842{
1843 static message[192];
1844 new len = formatex(message, sizeof(message) - 1, "%s^x03 ", MESSAGE_TAG);
1845 vformat(message[len], sizeof(message) - len - 1, msg_fmt, 3);
1846
1847 if( client )
1848 {
1849 message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
1850 write_byte(client);
1851 write_string(message);
1852 message_end();
1853 }
1854 else
1855 {
1856 for( new i = g_first_client; i <= g_max_clients; i++ )
1857 {
1858 if( is_user_connected(i) )
1859 {
1860 message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, i);
1861 write_byte(i);
1862 write_string(message);
1863 message_end();
1864 }
1865 }
1866 }
1867}
1868
1869Load(client)
1870{
1871 #if defined USING_SQL
1872 static query[128];
1873 formatex(query, sizeof(query) - 1, "SELECT `data` FROM `hns_xp` WHERE `authid` = '%s';", g_authid[client]);
1874
1875 static data[2];
1876 data[0] = client;
1877
1878 SQL_ThreadQuery(g_sql_tuple, "QueryLoadData", query, data, sizeof(data));
1879 #else
1880 static data[256], timestamp;
1881 if( nvault_lookup(g_vault, g_authid[client], data, sizeof(data) - 1, timestamp) )
1882 {
1883 ParseLoadData(client, data);
1884 return;
1885 }
1886 else
1887 {
1888 NewUser(client);
1889 }
1890 #endif
1891}
1892
1893#if defined USING_SQL
1894public QueryLoadData(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
1895{
1896 if( failstate == TQUERY_CONNECT_FAILED
1897 || failstate == TQUERY_QUERY_FAILED )
1898 {
1899 set_fail_state(error);
1900 }
1901 else
1902 {
1903 if( SQL_NumResults(query) )
1904 {
1905 static sqldata[256];
1906 SQL_ReadResult(query, 0, sqldata, sizeof(sqldata) - 1);
1907 ParseLoadData(data[0], sqldata);
1908 }
1909 else
1910 {
1911 NewUser(data[0]);
1912 }
1913 }
1914}
1915#endif
1916
1917ParseLoadData(client, data[256])
1918{
1919 static num[6];
1920 strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
1921
1922 g_xp[client] = str_to_num(num);
1923
1924 for( new i = 0; i < Grenades; i++ )
1925 {
1926 strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
1927 g_nade_level[client][i] = clamp(str_to_num(num), 0, g_nade_maxlevels[i]);
1928 }
1929
1930 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1931 {
1932 strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
1933 g_armor_level[client][i] = clamp(str_to_num(num), 0, g_armor_maxlevels[i]);
1934 }
1935
1936 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1937 {
1938 strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
1939 g_respawn_level[client][i] = clamp(str_to_num(num), 0, g_respawn_maxlevels[i]);
1940 }
1941
1942 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1943 {
1944 strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
1945 g_health_level[client][i] = clamp(str_to_num(num), 0, g_health_maxlevels[i]);
1946 }
1947
1948 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1949 {
1950 strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
1951 g_nofall_level[client][i] = clamp(str_to_num(num), 0, g_nofall_maxlevels[i]);
1952 }
1953
1954 #if defined USING_SQL
1955 g_loaded_data[client] = 1;
1956 #endif
1957}
1958
1959NewUser(client)
1960{
1961 g_first_time[client] = 1;
1962
1963 g_xp[client] = ENTRY_XP;
1964 arrayset(g_nade_level[client], 0, sizeof(g_nade_level[]));
1965 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1966 {
1967 g_armor_level[client][i] = 0;
1968 g_respawn_level[client][i] = 0;
1969 g_health_level[client][i] = 0;
1970 g_nofall_level[client][i] = 0;
1971 }
1972}
1973
1974Save(client)
1975{
1976 if( !IsUserAuthorized(client) ) return;
1977
1978 static data[256];
1979 new len = formatex(data, sizeof(data) - 1, "%i", g_xp[client]);
1980
1981 for( new i = 0; i < Grenades; i++ )
1982 {
1983 len += formatex(data[len], sizeof(data) - len - 1, " %i", g_nade_level[client][i]);
1984 }
1985
1986 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1987 {
1988 len += formatex(data[len], sizeof(data) - len - 1, " %i", g_armor_level[client][i]);
1989 }
1990
1991 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1992 {
1993 len += formatex(data[len], sizeof(data) - len - 1, " %i", g_respawn_level[client][i]);
1994 }
1995
1996 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
1997 {
1998 len += formatex(data[len], sizeof(data) - len - 1, " %i", g_health_level[client][i]);
1999 }
2000
2001 for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
2002 {
2003 len += formatex(data[len], sizeof(data) - len - 1, " %i", g_nofall_level[client][i]);
2004 }
2005
2006 #if defined USING_SQL
2007 static name[32];
2008 get_user_name(client, name, sizeof(name) - 1);
2009
2010 static query[512];
2011 if( g_loaded_data[client] )
2012 {
2013 formatex(query, sizeof(query) - 1, "UPDATE `hns_xp` SET `name` = '%s', `data` = '%s' WHERE `authid` = '%s';", name, data, g_authid[client]);
2014 }
2015 else
2016 {
2017 formatex(query, sizeof(query) - 1, "INSERT INTO `hns_xp` ( `name`, `authid`, `data` ) VALUES ( '%s', '%s', '%s' );", name, g_authid[client], data);
2018 }
2019
2020 SQL_ThreadQuery(g_sql_tuple, "QuerySaveData", query);
2021 #else
2022 nvault_set(g_vault, g_authid[client], data);
2023 #endif
2024}
2025
2026#if defined USING_SQL
2027public QuerySaveData(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
2028{
2029 if( failstate == TQUERY_CONNECT_FAILED
2030 || failstate == TQUERY_QUERY_FAILED )
2031 {
2032 set_fail_state(error);
2033 }
2034}
2035#endif