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