· 7 years ago · Feb 15, 2019, 12:58 AM
1#include "gunxpmod.cfg"
2
3#if defined ZOMBIE_BIOHAZARD
4 #include <biohazard>
5#endif
6#if defined ZOMBIE_PLAGUE
7 #include <zombieplague>
8#endif
9
10#include <amxmodx>
11#include <amxmisc>
12#include <fakemeta>
13#include <fun>
14#include <cstrike>
15#include <nvault>
16#include <sqlx>
17#include <hamsandwich>
18
19#define PLUGIN "Gun Xp Mod"
20#define AUTHOR "xbatista"
21#define VERSION "2.0"
22
23
24#define OFFSET_PRIMARYWEAPON 116
25#define TASK_SHOW_LEVEL 10113
26#define fm_cs_set_user_nobuy(%1) set_pdata_int(%1, 235, get_pdata_int(%1, 235) & ~(1<<0) ) //no weapon buy
27
28new PlayerXp[33];
29new PlayerLevel[33];
30
31new g_Vault;
32new g_remember_selection[33], g_kills[33], g_remember_selection_pistol[33];
33new g_maxplayers, g_msgHudSync1, SayTxT, enable_grenades;
34new levelspr, levelspr2, show_level_text, show_rank;
35new savexp, save_type, xp_kill, xp_triple, enable_triple, triple_kills, xp_ultra, ultra_kills, enable_ultra, p_Enabled, level_style;
36new enable_admin_xp, admin_xp;
37
38/*================================================================================
39 [MySQLx Vars, other]
40=================================================================================*/
41new Handle:g_hTuple;
42new g_szAuthID[33][35];
43new g_szAuthIP[33][35];
44new mysqlx_host, mysqlx_user, mysqlx_db, mysqlx_pass;
45
46new const szTables[][] =
47{
48 "CREATE TABLE IF NOT EXISTS `mytable` ( `player_id` varchar(32) NOT NULL,`player_level` int(8) default NULL,`player_xp` int(16) default NULL,PRIMARY KEY (`player_id`) ) TYPE=MyISAM;"
49}
50
51new const WEAPONCONST[MAXLEVEL][] = { "weapon_glock18", "weapon_usp", "weapon_p228", "weapon_fiveseven", "weapon_deagle", "weapon_elite", "weapon_tmp",
52"weapon_mac10", "weapon_ump45", "weapon_mp5navy", "weapon_p90", "weapon_scout", "weapon_awp", "weapon_famas", "weapon_galil", "weapon_m3", "weapon_xm1014",
53"weapon_ak47", "weapon_m4a1", "weapon_aug", "weapon_sg552", "weapon_sg550", "weapon_g3sg1", "weapon_m249"
54}; // Give Weapons
55
56new const WEAPONMDL[MAXLEVEL][] = { "models/w_glock18.mdl", "models/w_usp.mdl", "models/w_p228.mdl", "models/w_fiveseven.mdl", "models/w_deagle.mdl", "models/w_elite.mdl", "models/w_tmp.mdl",
57"models/w_mac10.mdl", "models/w_ump45.mdl", "models/w_mp5.mdl", "models/w_p90.mdl", "models/w_scout.mdl", "models/w_awp.mdl", "models/w_famas.mdl", "models/w_galil.mdl", "models/w_m3.mdl", "models/w_xm1014.mdl",
58"models/w_ak47.mdl", "models/w_m4a1.mdl", "models/w_aug.mdl", "models/w_sg552.mdl", "models/w_sg550.mdl", "models/w_g3sg1.mdl", "models/w_m249.mdl"
59}; // Blocks pick up weapon, don't change!
60
61new const AMMOCONST[MAXLEVEL] = { 17, 16, 1, 11, 26, 10, 23, 7, 12, 19, 30, 3, 18,
6215, 14, 21, 5, 28, 22, 8, 27, 13, 24, 20
63}; // Weapons ID(CSW) don't change!
64
65/*================================================================================
66 [Plugin natives,precache,init]
67=================================================================================*/
68public plugin_init()
69{
70 register_plugin(PLUGIN, VERSION, AUTHOR);
71 register_cvar("gxm_version", VERSION, FCVAR_SPONLY|FCVAR_SERVER)
72 set_cvar_string("gxm_version", VERSION)
73
74 register_concmd("set_level", "cmd_give_level", ADMIN_RCON, "set_level <name> <amount>" );
75 register_clcmd("say level", "showlevel");
76 register_clcmd("say /level", "showlevel");
77 register_clcmd("say /top20","showtop20");
78 register_clcmd("say /menu","show_main_menu_info");
79 register_clcmd("say menu","show_main_menu_info");
80
81 p_Enabled = register_cvar( "gxm_enable", "1" ); // Plugin enabled? 1 = Yes, 0 = No.
82 save_type = register_cvar("gxm_savetype","1"); // Save Xp to : 1 = MySQL, 0 = NVault.
83 savexp = register_cvar("gxm_save","0"); // Save Xp by : 1 = SteamID, 0 = IP.
84 xp_kill = register_cvar("gxm_xp","10"); // How much xp gain if you killed someone?
85 show_level_text = register_cvar("gxm_level_text","0"); // Show your level by : 1 = HUD message, 0 = Simple colored text message.
86 show_rank = register_cvar("gxm_show_rank","1"); // Show rank in /top20? 1 = Yes, 0 = No.
87 level_style = register_cvar("gxm_level_style","0"); // You will gain each level new gun : 1 = Yes, 0 = No,select your gun by menu.
88 enable_grenades = register_cvar("gxm_grenades","1"); // Give to player grenades? 1 = Yes, 0 = No.
89
90 enable_triple = register_cvar("gxm_triple","1"); // Enable Triple Kill bonus xp? 1 = Yes, 0 = No.
91 xp_triple = register_cvar("gxm_triple_xp","3"); // How much bonus xp give for Triple Kill?
92 triple_kills = register_cvar("gxm_triple_kills","3"); // How much kills needed to give bonus xp?
93 enable_ultra = register_cvar("gxm_ultra","1"); // Enable Ultra Kill bonus xp? 1 = Yes, 0 = No.
94 xp_ultra = register_cvar("gxm_ultra_xp","5"); // How much bonus xp give for Ultra Kill?
95 ultra_kills = register_cvar("gxm_ultra_kills","6"); // How much kills needed to give bonus xp?
96
97 enable_admin_xp = register_cvar("gxm_admin_xp","1"); // Enable Extra xp for killing? 1 = Yes, 0 = No.
98 admin_xp = register_cvar("gxm_extra_xp","10"); // How much extra xp give to admins?
99
100 // SQLx cvars
101 mysqlx_host = register_cvar ("gxm_host", ""); // The host from the db
102 mysqlx_user = register_cvar ("gxm_user", ""); // The username from the db login
103 mysqlx_pass = register_cvar ("gxm_pass", ""); // The password from the db login
104 mysqlx_db = register_cvar ("gxm_dbname", ""); // The database name
105
106 // Events //
107 register_event("DeathMsg", "event_deathmsg", "a");
108 register_event("StatusValue", "Event_StatusValue", "bd", "1=2")
109
110 // Forwards //
111 RegisterHam(Ham_Spawn, "player", "fwd_PlayerSpawn", 1);
112
113 register_forward(FM_Touch, "fwd_Touch");
114
115 // Messages //
116 #if defined NORMAL_MOD || defined ZOMBIE_SWARM
117 register_message(get_user_msgid("StatusIcon"), "Message_StatusIcon")
118 #endif
119
120 // Other //
121 register_menucmd(register_menuid("Main Menu"), 1023, "main_menu_info")
122
123 register_dictionary("gunxpmod.txt");
124 MySQLx_Init()
125
126 SayTxT = get_user_msgid("SayText");
127
128 g_msgHudSync1 = CreateHudSyncObj()
129 g_maxplayers = get_maxplayers();
130}
131public plugin_natives()
132{
133 // Player natives //
134 register_native("get_user_xp", "native_get_user_xp", 1);
135 register_native("set_user_xp", "native_set_user_xp", 1);
136 register_native("get_user_level", "native_get_user_level", 1);
137 register_native("set_user_level", "native_set_user_level", 1);
138 register_native("get_user_max_level", "native_get_user_max_level", 1);
139}
140public plugin_precache()
141{
142 levelspr = engfunc(EngFunc_PrecacheModel, "sprites/xfire.spr");
143 levelspr2 = engfunc(EngFunc_PrecacheModel, "sprites/xfire2.spr");
144
145 engfunc(EngFunc_PrecacheSound, LevelUp);
146}
147public plugin_cfg()
148{
149 new ConfDir[32], File[192];
150
151 get_configsdir( ConfDir, charsmax( ConfDir ) );
152 formatex( File, charsmax( File ), "%s/gunxpmod.cfg", ConfDir );
153
154 if( !file_exists( File ) )
155 {
156 server_print( "File %s doesn't exist!", File );
157 write_file( File, " ", -1 );
158 }
159 else
160 {
161 server_print( "%s successfully loaded.", File );
162 server_cmd( "exec %s", File );
163 }
164
165 //Open our vault and have g_Vault store the handle.
166 g_Vault = nvault_open( "gunxpmod" );
167
168 //Make the plugin error if vault did not successfully open
169 if ( g_Vault == INVALID_HANDLE )
170 set_fail_state( "Error opening GunXpMod nVault, file does not exist!" );
171}
172public plugin_end()
173{
174 //Close the vault when the plugin ends (map change\server shutdown\restart)
175 nvault_close( g_Vault );
176}
177public client_connect(id)
178{
179 g_remember_selection[id] = MAX_PISTOLS_MENU;
180 g_remember_selection_pistol[id] = 0;
181
182 get_user_authid( id , g_szAuthID[id] , 34 );
183 get_user_ip(id, g_szAuthIP[id] , 34, 1);
184
185 LoadLevel(id)
186}
187public client_disconnect(id)
188{
189 SaveLevel(id)
190}
191public Message_StatusIcon(iMsgId, MSG_DEST, id)
192{
193 if( !get_pcvar_num(p_Enabled) )
194 return PLUGIN_HANDLED;
195
196 static szIcon[5]
197 get_msg_arg_string(2, szIcon, 4)
198 if( szIcon[0] == 'b' && szIcon[2] == 'y' && szIcon[3] == 'z' )
199 {
200 if( get_msg_arg_int(1))
201 {
202 fm_cs_set_user_nobuy(id)
203 return PLUGIN_HANDLED;
204 }
205 }
206
207 return PLUGIN_CONTINUE;
208}
209public fwd_Touch(ent, id)
210{
211 if (!is_user_alive(id) || !pev_valid( ent ) )
212 return FMRES_IGNORED;
213
214 static szEntModel[32];
215 pev( ent , pev_model , szEntModel , 31 );
216
217 for (new level_equip_id = PlayerLevel[id] + 1; level_equip_id < MAXLEVEL; level_equip_id++)
218 {
219 if ( equali( szEntModel , WEAPONMDL[level_equip_id] ) )
220 {
221 return FMRES_SUPERCEDE;
222 }
223 }
224
225 return FMRES_IGNORED;
226}
227public fwd_PlayerSpawn(id)
228{
229 if( !get_pcvar_num(p_Enabled) || !is_user_alive(id) )
230 return;
231
232 g_kills[id] = 0
233
234 #if defined ZOMBIE_SWARM
235 if ( !get_pcvar_num(level_style) && cs_get_user_team(id) == CS_TEAM_CT )
236 {
237 StripPlayerWeapons(id);
238
239 set_task(2.0, "show_main_menu_level", id)
240 }
241 #endif
242
243 #if defined NORMAL_MOD || defined ZOMBIE_INFECTION
244 if ( !get_pcvar_num(level_style))
245 {
246 StripPlayerWeapons(id);
247
248 set_task(2.0, "show_main_menu_level", id)
249 }
250 #endif
251
252 if(!task_exists(TASK_SHOW_LEVEL + id) && get_pcvar_num(show_level_text))
253 {
254 set_task(0.1, "task_show_level", TASK_SHOW_LEVEL + id)
255 }
256
257 #if defined ZOMBIE_SWARM
258 if ( get_pcvar_num(level_style) && cs_get_user_team(id) == CS_TEAM_CT )
259 {
260 set_task(0.3, "give_weapon", id);
261 }
262 #endif
263
264 #if defined NORMAL_MOD || defined ZOMBIE_INFECTION
265 if ( get_pcvar_num(level_style) )
266 {
267 set_task(0.3, "give_weapon", id);
268 }
269 #endif
270
271}
272
273#if defined ZOMBIE_BIOHAZARD
274public event_infect(g_victim, g_attacker)
275{
276 if( !get_pcvar_num(p_Enabled) )
277 return;
278
279 new counted_triple = get_pcvar_num(xp_kill) + get_pcvar_num(xp_triple) + get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0
280 new counted_ultra = get_pcvar_num(xp_kill) + get_pcvar_num(xp_ultra) + get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0
281
282 if((1 <= g_attacker <= g_maxplayers))
283 {
284 if(g_victim != g_attacker)
285 {
286 g_kills[g_attacker]++;
287 if(PlayerLevel[g_attacker] < MAXLEVEL-1)
288 {
289 if ( get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA)
290 {
291 PlayerXp[g_attacker] += get_pcvar_num(admin_xp)
292 }
293
294 if ( g_kills[g_attacker] == get_pcvar_num(triple_kills) && get_pcvar_num(enable_triple) )
295 {
296 PlayerXp[g_attacker] += counted_triple
297
298 set_hudmessage(0, 255, 50, 0.50, 0.33, 1, 2.0, 2.0)
299 show_hudmessage(g_attacker, "%L", LANG_SERVER, "TRIPLE_XP", counted_triple + (get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0))
300 }
301 else if ( g_kills[g_attacker] == get_pcvar_num(ultra_kills) && get_pcvar_num(enable_ultra) )
302 {
303 PlayerXp[g_attacker] += counted_ultra
304
305 set_hudmessage(0, 255, 50, 0.50, 0.33, 1, 2.0, 2.0)
306 show_hudmessage(g_attacker, "%L", LANG_SERVER, "ULTRA_XP", counted_ultra + (get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0))
307 }
308 else
309 {
310 PlayerXp[g_attacker] += get_pcvar_num(xp_kill)
311
312 set_hudmessage(0, 255, 50, 0.50, 0.33, 1, 2.0, 2.0)
313 show_hudmessage(g_attacker, "+%i", (get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0) + get_pcvar_num(xp_kill) )
314 }
315
316 check_level(g_attacker)
317 }
318 }
319 }
320}
321#endif
322
323#if defined ZOMBIE_PLAGUE
324public zp_user_infected_post(g_victim, g_attacker)
325{
326 if( !get_pcvar_num(p_Enabled) )
327 return;
328
329 new counted_triple = get_pcvar_num(xp_kill) + get_pcvar_num(xp_triple)
330 new counted_ultra = get_pcvar_num(xp_kill) + get_pcvar_num(xp_ultra)
331
332 if((1 <= g_attacker <= g_maxplayers))
333 {
334 if(g_victim != g_attacker)
335 {
336 g_kills[g_attacker]++;
337 if(PlayerLevel[g_attacker] < MAXLEVEL-1)
338 {
339 if ( get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA)
340 {
341 PlayerXp[g_attacker] += get_pcvar_num(admin_xp)
342 }
343
344 if ( g_kills[g_attacker] == get_pcvar_num(triple_kills) && get_pcvar_num(enable_triple) )
345 {
346 PlayerXp[g_attacker] += counted_triple
347
348 set_hudmessage(0, 255, 50, 0.50, 0.33, 1, 2.0, 2.0)
349 show_hudmessage(g_attacker, "%L", LANG_SERVER, "TRIPLE_XP", counted_triple + (get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0))
350 }
351 else if ( g_kills[g_attacker] == get_pcvar_num(ultra_kills) && get_pcvar_num(enable_ultra) )
352 {
353 PlayerXp[g_attacker] += counted_ultra
354
355 set_hudmessage(0, 255, 50, 0.50, 0.33, 1, 2.0, 2.0)
356 show_hudmessage(g_attacker, "%L", LANG_SERVER, "ULTRA_XP", counted_ultra + (get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0))
357 }
358 else
359 {
360 PlayerXp[g_attacker] += get_pcvar_num(xp_kill)
361
362 set_hudmessage(0, 255, 50, 0.50, 0.33, 1, 2.0, 2.0)
363 show_hudmessage(g_attacker, "+%i", (get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0) + get_pcvar_num(xp_kill) )
364 }
365
366 check_level(g_attacker)
367 }
368 }
369 }
370}
371#endif
372
373public event_deathmsg()
374{
375 if( !get_pcvar_num(p_Enabled) )
376 return;
377
378 new g_attacker = read_data(1);
379 new g_victim = read_data(2);
380
381 new counted_triple = get_pcvar_num(xp_kill) + get_pcvar_num(xp_triple)
382 new counted_ultra = get_pcvar_num(xp_kill) + get_pcvar_num(xp_ultra)
383
384 if((1 <= g_attacker <= g_maxplayers))
385 {
386 if(g_victim != g_attacker)
387 {
388 g_kills[g_attacker]++;
389 if(PlayerLevel[g_attacker] < MAXLEVEL-1)
390 {
391 if ( get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA)
392 {
393 PlayerXp[g_attacker] += get_pcvar_num(admin_xp)
394 }
395
396 if ( g_kills[g_attacker] == get_pcvar_num(triple_kills) && get_pcvar_num(enable_triple) )
397 {
398 PlayerXp[g_attacker] += counted_triple
399
400 set_hudmessage(0, 40, 255, 0.50, 0.33, 1, 2.0, 2.0)
401 show_hudmessage(g_attacker, "%L", LANG_SERVER, "TRIPLE_XP", counted_triple + (get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0))
402 }
403 else if ( g_kills[g_attacker] == get_pcvar_num(ultra_kills) && get_pcvar_num(enable_ultra) )
404 {
405 PlayerXp[g_attacker] += counted_ultra
406
407 set_hudmessage(255, 30, 0, 0.50, 0.33, 1, 2.0, 2.0)
408 show_hudmessage(g_attacker, "%L", LANG_SERVER, "ULTRA_XP", counted_ultra + (get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0))
409 }
410 else
411 {
412 PlayerXp[g_attacker] += get_pcvar_num(xp_kill)
413
414 set_hudmessage(0, 255, 50, 0.50, 0.33, 1, 2.0, 2.0)
415 show_hudmessage(g_attacker, "+%i", (get_pcvar_num(enable_admin_xp) && get_user_flags(g_attacker) & ADMIN_EXTRA ? get_pcvar_num(admin_xp) : 0) + get_pcvar_num(xp_kill) )
416 }
417
418 check_level(g_attacker)
419 }
420 }
421 }
422}
423public Event_StatusValue(id)
424{
425 new target = read_data(2)
426 if(target != id && target != 0 && get_pcvar_num(p_Enabled))
427 {
428 static sName[32];
429 get_user_name(target, sName, 31)
430
431 set_hudmessage(255, 255, 255, 0.6, -1.0, 0, 0.0, 6.0, 0.0, 0.0, 2)
432 ShowSyncHudMsg(id, g_msgHudSync1, "%L", LANG_SERVER, "LEVEL_TEXT", sName, PlayerLevel[target], RANKLEVELS[PlayerLevel[target]])
433 }
434}
435public task_show_level(task)
436{
437 new id = task - TASK_SHOW_LEVEL
438
439 if(!is_user_alive(id) || !get_pcvar_num(show_level_text) || !get_pcvar_num(p_Enabled) )
440 return;
441
442 set_hudmessage(255, 0, 0, 0.02, 0.33, 0, 0.0, 0.3, 0.0, 0.0)
443 ShowSyncHudMsg(id, g_msgHudSync1 , "%L", LANG_SERVER, "LEVEL_HUD_TEXT", PlayerLevel[id], PlayerXp[id], LEVELS[PlayerLevel[id]], RANK[PlayerLevel[id]], RANKLEVELS[PlayerLevel[id]])
444
445 set_task(0.1, "task_show_level", TASK_SHOW_LEVEL + id)
446}
447public showlevel(id)
448{
449 if ( !get_pcvar_num(p_Enabled) || get_pcvar_num(show_level_text) )
450 return PLUGIN_HANDLED;
451
452 client_printcolor(id, "%L", LANG_SERVER, "LEVEL_TEXT2", PlayerLevel[id] , PlayerXp[id], LEVELS[PlayerLevel[id]]);
453 client_printcolor(id, "%L", LANG_SERVER, "LEVEL_TEXT3", RANK[PlayerLevel[id]], RANKLEVELS[PlayerLevel[id]]);
454
455 return PLUGIN_HANDLED;
456}
457public descriptionx(id)
458{
459 new szMotd[2048], szTitle[64], iPos = 0
460 format(szTitle, 63, "Info")
461 iPos += format(szMotd[iPos], 2047-iPos, "<html><head><style type=^"text/css^">pre{color:#FFB000;}body{background:#000000;margin-left:8px;margin-top:0px;}</style></head><pre><body>")
462 iPos += format(szMotd[iPos], 2047-iPos, "^n^n<b>%s</b>^n^n", szTitle)
463 iPos += format(szMotd[iPos], 2047-iPos, "%L^n", LANG_SERVER, "DESCRIPTION")
464
465 iPos += format(szMotd[iPos], 2047-iPos, "%L", LANG_SERVER, "DESCRIPTION2")
466
467 show_motd(id, szMotd, szTitle)
468 return PLUGIN_HANDLED;
469}
470public check_level(id)
471{
472 if(PlayerLevel[id] < MAXLEVEL-1 && get_pcvar_num(p_Enabled))
473 {
474 while(PlayerXp[id] >= LEVELS[PlayerLevel[id]])
475 {
476 PlayerLevel[id]++;
477
478 if(is_user_alive(id))
479 {
480 if ( get_pcvar_num(level_style) )
481 {
482 give_weapon(id);
483 }
484
485 new p_origin[3];
486 get_user_origin(id, p_origin, 0);
487
488 set_sprite(p_origin, levelspr, 30)
489 set_sprite(p_origin, levelspr2, 30)
490 }
491 emit_sound(id, CHAN_ITEM, LevelUp, 1.0, ATTN_NORM, 0, PITCH_NORM);
492
493 static name[32] ; get_user_name(id, name, charsmax(name));
494 client_printcolor(0, "%L", LANG_SERVER, "LEVEL_UP", name, PlayerLevel[id]);
495 }
496 }
497}
498// Main Menu Info
499public show_main_menu_info(id)
500{
501 if ( !get_pcvar_num(p_Enabled) )
502 return;
503
504 static menu[510], len;
505 len = 0;
506
507 new xKeys3 = MENU_KEY_0|MENU_KEY_1;
508
509 // Title
510 len += formatex(menu[len], sizeof menu - 1 - len, "%L", LANG_SERVER, "TITLE_MENU_INFO")
511
512 len += formatex(menu[len], sizeof menu - 1 - len, "\r1. \w%L", id, "INFO")
513 if ( get_pcvar_num(show_rank) )
514 {
515 xKeys3 |= (MENU_KEY_2)
516
517 len += formatex(menu[len], sizeof menu - 1 - len, "^n\r2. \wTop 20^n")
518 }
519 else
520 {
521 len += formatex(menu[len], sizeof menu - 1 - len, "^n\d2. Top 20^n")
522 }
523
524 if(find_plugin_byfile("gunxpmod_shop.amxx") != INVALID_PLUGIN_ID)
525 {
526 xKeys3 |= (MENU_KEY_3)
527
528 len += formatex(menu[len], sizeof menu - 1 - len, "\r3. \w%L^n", id, "ITEM_LIST")
529 if ( is_user_alive(id) )
530 {
531 xKeys3 |= (MENU_KEY_4)
532
533 len += formatex(menu[len], sizeof menu - 1 - len, "\r4. \w%L^n", id, "UNLOCKS_SHOP_TEXT")
534 }
535 }
536
537 len += formatex(menu[len], sizeof menu - 1 - len, "^n^n\r0.\w %L", id, "EXIT_MENU")
538
539 show_menu(id, xKeys3, menu, -1, "Main Menu")
540}
541public main_menu_info(id, key)
542{
543 switch (key)
544 {
545 case 0:
546 {
547 show_main_menu_info(id)
548
549 descriptionx(id)
550 }
551 case 1:
552 {
553 showtop20(id)
554
555 show_main_menu_info(id)
556 }
557 case 2:
558 {
559 show_main_menu_info(id)
560
561 if(callfunc_begin( "display_items","gunxpmod_shop.amxx") == 1)
562 {
563 callfunc_push_int( id );
564 callfunc_end();
565 }
566 }
567 case 3:
568 {
569 if(callfunc_begin("item_upgrades","gunxpmod_shop.amxx") == 1)
570 {
571 callfunc_push_int( id );
572 callfunc_end();
573 }
574 }
575 case 9:
576 {
577 return PLUGIN_HANDLED;
578 }
579 }
580
581 return PLUGIN_HANDLED;
582}
583// Main Menu Level Style
584public show_main_menu_level(id)
585{
586 if ( !is_user_alive(id) )
587 return;
588
589 new szInfo[60], szChooseT[40], szLastG[40];
590 formatex(szInfo, charsmax(szInfo), "%L", LANG_SERVER, "TITLE_MENU", PlayerLevel[id], PlayerXp[id], LEVELS[PlayerLevel[id]] );
591
592 new menu = menu_create(szInfo , "main_menu_level");
593
594 formatex(szChooseT, charsmax(szChooseT), "%L", LANG_SERVER, "CHOOSE_TEXT");
595 menu_additem(menu, szChooseT, "1", 0);
596
597 formatex(szLastG, charsmax(szLastG), "%L", LANG_SERVER, "LAST_GUNS");
598 menu_additem(menu, szLastG, "2", 0);
599
600 new szExit[15];
601 formatex(szExit, charsmax(szExit), "%L", LANG_SERVER, "EXIT_MENU");
602
603 menu_setprop(menu, MPROP_EXITNAME, szExit);
604
605 menu_display(id , menu , 0);
606}
607public main_menu_level(id , menu , item)
608{
609 if ( !is_user_alive(id) )
610 {
611 return PLUGIN_HANDLED;
612 }
613
614 #if defined ZOMBIE_PLAGUE
615 if ( zp_has_round_started() && cs_get_user_team(id) == CS_TEAM_T )
616 return PLUGIN_HANDLED;
617 #endif
618
619 if(item == MENU_EXIT)
620 {
621 menu_destroy(menu);
622 return PLUGIN_HANDLED;
623 }
624 new data[6], iName[64];
625 new access, callback;
626 menu_item_getinfo(menu, item, access, data,5, iName, 63, callback);
627
628 new item_id = str_to_num(data);
629
630 switch (item_id)
631 {
632 case 1: // show pistols
633 {
634 show_menu_level_pistol(id);
635 }
636 case 2: // last weapons
637 {
638 if ( PlayerLevel[id] > MAX_PISTOLS_MENU - 1 )
639 {
640 give_weapon_menu(id, g_remember_selection[id], 1, 1);
641 give_weapon_menu(id, g_remember_selection_pistol[id], 0, 0);
642 }
643 else if ( PlayerLevel[id] < MAX_PISTOLS_MENU )
644 {
645 give_weapon_menu(id, g_remember_selection_pistol[id], 1, 1);
646 }
647 }
648 }
649
650 menu_destroy(menu);
651 return PLUGIN_HANDLED;
652}
653// Menu Level Style Pistols
654public show_menu_level_pistol(id)
655{
656 if ( !is_user_alive(id) )
657 return;
658
659 new szInfo[60];
660 formatex(szInfo, charsmax(szInfo), "%L", LANG_SERVER, "TITLE_MENU", PlayerLevel[id], PlayerXp[id], LEVELS[PlayerLevel[id]] );
661
662 new menu = menu_create(szInfo , "pistol_menu");
663
664 for (new item_id = 0; item_id < MAX_PISTOLS_MENU; item_id++)
665 {
666 new szItems[60], szTempid[32];
667
668 if ( PlayerLevel[id] >= GUN_LEVELS[item_id] )
669 {
670 formatex(szItems, charsmax(szItems), "%L", LANG_SERVER, "ACTIVE_MENU", RANK[item_id], GUN_LEVELS[item_id] )
671
672 num_to_str(item_id, szTempid, charsmax(szTempid) );
673
674 menu_additem(menu, szItems, szTempid, 0);
675 }
676
677 else
678 {
679 formatex(szItems, charsmax(szItems), "%L", LANG_SERVER, "INACTIVE_MENU", RANK[item_id], GUN_LEVELS[item_id] )
680 menu_additem(menu, szItems, "999", 0, menu_makecallback("CallbackMenu"));
681 }
682 }
683
684 new szNext[15], szBack[15], szExit[15];
685 formatex(szBack, charsmax(szBack), "%L", LANG_SERVER, "BACK_MENU");
686 formatex(szNext, charsmax(szNext), "%L", LANG_SERVER, "NEXT_MENU");
687 formatex(szExit, charsmax(szExit), "%L", LANG_SERVER, "EXIT_MENU");
688
689 menu_setprop(menu, MPROP_BACKNAME, szBack)
690 menu_setprop(menu, MPROP_NEXTNAME, szNext)
691 menu_setprop(menu, MPROP_EXITNAME, szExit)
692
693 menu_display(id , menu , 0);
694}
695public pistol_menu(id , menu , item)
696{
697 if ( !is_user_alive(id) )
698 {
699 return PLUGIN_HANDLED;
700 }
701
702 #if defined ZOMBIE_PLAGUE
703 if ( zp_has_round_started() && cs_get_user_team(id) == CS_TEAM_T )
704 return PLUGIN_HANDLED;
705 #endif
706
707 if(item == MENU_EXIT)
708 {
709 menu_destroy(menu);
710 return PLUGIN_HANDLED;
711 }
712 new data[6], iName[64];
713 new access, callback;
714 menu_item_getinfo(menu, item, access, data,5, iName, 63, callback);
715
716 new item_id = str_to_num(data);
717
718 g_remember_selection_pistol[id] = item_id;
719
720 give_weapon_menu(id, item_id, 1, 1);
721
722 if ( PlayerLevel[id] > MAX_PISTOLS_MENU - 1 )
723 {
724 show_menu_level(id);
725 }
726
727 menu_destroy(menu);
728 return PLUGIN_HANDLED;
729}
730// Menu Level Style Primary
731public show_menu_level(id)
732{
733 if ( !is_user_alive(id) || PlayerLevel[id] < MAX_PISTOLS_MENU )
734 return;
735
736 new szInfo[100];
737 formatex(szInfo, charsmax(szInfo), "%L", LANG_SERVER, "TITLE_MENU", PlayerLevel[id], PlayerXp[id], LEVELS[PlayerLevel[id]] );
738
739 new menu = menu_create(szInfo , "level_menu");
740
741 for (new item_id = MAX_PISTOLS_MENU; item_id < MAXLEVEL; item_id++)
742 {
743 new szItems[512], szTempid[32];
744
745 if ( PlayerLevel[id] >= GUN_LEVELS[item_id] )
746 {
747 formatex(szItems, charsmax(szItems), "%L", LANG_SERVER, "ACTIVE_MENU", RANK[item_id], GUN_LEVELS[item_id] )
748
749 num_to_str(item_id, szTempid, charsmax(szTempid) );
750
751 menu_additem(menu, szItems, szTempid, 0);
752 }
753 else
754 {
755 formatex(szItems, charsmax(szItems), "%L", LANG_SERVER, "INACTIVE_MENU", RANK[item_id], GUN_LEVELS[item_id] )
756 menu_additem(menu, szItems, "999", 0, menu_makecallback("CallbackMenu"));
757 }
758 }
759
760 new szNext[15], szBack[15], szExit[15];
761 formatex(szBack, charsmax(szBack), "%L", LANG_SERVER, "BACK_MENU");
762 formatex(szNext, charsmax(szNext), "%L", LANG_SERVER, "NEXT_MENU");
763 formatex(szExit, charsmax(szExit), "%L", LANG_SERVER, "EXIT_MENU");
764
765 menu_setprop(menu, MPROP_BACKNAME, szBack)
766 menu_setprop(menu, MPROP_NEXTNAME, szNext)
767 menu_setprop(menu, MPROP_EXITNAME, szExit)
768
769 menu_display(id , menu , 0);
770}
771public level_menu(id , menu , item)
772{
773 if ( !is_user_alive(id) || PlayerLevel[id] < MAX_PISTOLS_MENU )
774 {
775 return PLUGIN_HANDLED;
776 }
777
778 #if defined ZOMBIE_PLAGUE
779 if ( zp_has_round_started() && cs_get_user_team(id) == CS_TEAM_T )
780 return PLUGIN_HANDLED;
781 #endif
782
783 if(item == MENU_EXIT)
784 {
785 menu_destroy(menu);
786 return PLUGIN_HANDLED;
787 }
788 new data[6], iName[64];
789 new access, callback;
790 menu_item_getinfo(menu, item, access, data,5, iName, 63, callback);
791
792 new item_id = str_to_num(data);
793
794 g_remember_selection[id] = item_id;
795
796 give_weapon_menu(id, item_id, 0, 0);
797
798 menu_destroy(menu);
799 return PLUGIN_HANDLED;
800}
801public CallbackMenu(id, menu, item)
802{
803 return ITEM_DISABLED;
804}
805
806// Selected by menu or remember selection and give item
807public give_weapon_menu(id, selection, strip, givegren)
808{
809 #if defined ZOMBIE_SWARM
810 if( is_user_alive(id) && cs_get_user_team(id) == CS_TEAM_CT && get_pcvar_num(p_Enabled) )
811 {
812 if ( strip )
813 {
814 StripPlayerWeapons(id);
815 }
816
817 if ( get_pcvar_num(enable_grenades) && givegren )
818 {
819 give_item(id, FLASHBANG_LEVEL[PlayerLevel[id]]);
820 give_item(id, FLASHBANG_LEVEL[PlayerLevel[id]]);
821 give_item(id, HEGRENADE_LEVEL[PlayerLevel[id]]);
822 give_item(id, SMOKEGRENADE_LEVEL[PlayerLevel[id]]);
823 }
824
825 give_item(id, WEAPONCONST[selection]);
826
827 cs_set_user_bpammo(id, AMMOCONST[selection], AMMO2CONST[selection])
828 }
829 #endif
830
831 #if defined ZOMBIE_INFECTION || defined NORMAL_MOD
832 if(is_user_alive(id) && get_pcvar_num(p_Enabled))
833 {
834 if ( strip )
835 {
836 StripPlayerWeapons(id);
837 }
838
839 if ( get_pcvar_num(enable_grenades) && givegren )
840 {
841 give_item(id, FLASHBANG_LEVEL[PlayerLevel[id]]);
842 give_item(id, FLASHBANG_LEVEL[PlayerLevel[id]]);
843 give_item(id, HEGRENADE_LEVEL[PlayerLevel[id]]);
844 give_item(id, SMOKEGRENADE_LEVEL[PlayerLevel[id]]);
845 }
846
847 give_item(id, WEAPONCONST[selection]);
848
849 cs_set_user_bpammo(id, AMMOCONST[selection], AMMO2CONST[selection])
850 }
851 #endif
852}
853public give_weapon(id)
854{
855 #if defined ZOMBIE_SWARM
856 if( is_user_alive(id) && cs_get_user_team(id) == CS_TEAM_CT && get_pcvar_num(p_Enabled))
857 {
858 StripPlayerWeapons(id);
859
860 if ( get_pcvar_num(enable_grenades) && get_pcvar_num(level_style) )
861 {
862 give_item(id, FLASHBANG_LEVEL[PlayerLevel[id]]);
863 give_item(id, FLASHBANG_LEVEL[PlayerLevel[id]]);
864 give_item(id, HEGRENADE_LEVEL[PlayerLevel[id]]);
865 give_item(id, SMOKEGRENADE_LEVEL[PlayerLevel[id]]);
866 }
867
868 give_item(id, WEAPONCONST[PlayerLevel[id]]);
869
870 cs_set_user_bpammo(id, AMMOCONST[PlayerLevel[id]], AMMO2CONST[PlayerLevel[id]])
871 }
872 #endif
873
874 #if defined ZOMBIE_INFECTION || defined NORMAL_MOD
875 if(is_user_alive(id) && get_pcvar_num(p_Enabled))
876 {
877 StripPlayerWeapons(id);
878
879 if ( get_pcvar_num(enable_grenades) && get_pcvar_num(level_style) )
880 {
881 give_item(id, FLASHBANG_LEVEL[PlayerLevel[id]]);
882 give_item(id, FLASHBANG_LEVEL[PlayerLevel[id]]);
883 give_item(id, HEGRENADE_LEVEL[PlayerLevel[id]]);
884 give_item(id, SMOKEGRENADE_LEVEL[PlayerLevel[id]]);
885 }
886
887 give_item(id, WEAPONCONST[PlayerLevel[id]]);
888
889 cs_set_user_bpammo(id, AMMOCONST[PlayerLevel[id]], AMMO2CONST[PlayerLevel[id]])
890 }
891 #endif
892}
893public set_sprite(p_origin[3], sprite, radius)
894{
895 // Explosion
896 message_begin(MSG_BROADCAST, SVC_TEMPENTITY, p_origin)
897 write_byte(TE_EXPLOSION)
898 write_coord(p_origin[0])
899 write_coord(p_origin[1])
900 write_coord(p_origin[2])
901 write_short(sprite)
902 write_byte(radius)
903 write_byte(15)
904 write_byte(4)
905 message_end()
906}
907//Shows Top 20
908public showtop20(id)
909{
910 if( !get_pcvar_num(p_Enabled) && !get_pcvar_num(show_rank) )
911 return;
912
913 static Sort[33][2];
914 new players[32],num,count,index;
915 get_players(players,num);
916
917 for(new i = 0; i < num; i++)
918 {
919 index = players[i];
920 Sort[count][0] = index;
921 Sort[count][1] = PlayerXp[index];
922 count++;
923 }
924
925 SortCustom2D(Sort,count,"CompareXp");
926 new motd[1501],iLen;
927 iLen = formatex(motd, sizeof motd - 1,"<body bgcolor=#000000><font color=#98f5ff><pre>");
928 iLen += formatex(motd[iLen], (sizeof motd - 1) - iLen,"%s %-22.22s %3s^n", "#", "Name", "# Experience");
929
930 new y = clamp(count,0,20);
931 new name[32],kindex;
932
933 for(new x = 0; x < y; x++)
934 {
935 kindex = Sort[x][0];
936 get_user_name(kindex,name,sizeof name - 1);
937 iLen += formatex(motd[iLen], (sizeof motd - 1) - iLen,"%d %-22.22s %d^n", x + 1, name, Sort[x][1]);
938 }
939 iLen += formatex(motd[iLen], (sizeof motd - 1) - iLen,"</body></font></pre>");
940 show_motd(id,motd, "GunXpMod Top 20");
941}
942public CompareXp(elem1[], elem2[])
943{
944 if(elem1[1] > elem2[1])
945 return -1;
946 else if(elem1[1] < elem2[1])
947 return 1;
948
949 return 0;
950}
951// Command to set player Level
952public cmd_give_level(id, level, cid)
953{
954 if( !cmd_access(id, level, cid, 3) || !get_pcvar_num(p_Enabled) )
955 {
956 return PLUGIN_HANDLED;
957 }
958
959 new Arg1[64], Target
960 read_argv(1, Arg1, 63)
961 Target = cmd_target(id, Arg1, 0)
962
963 new iLevel[32], Value
964 read_argv(2, iLevel, 31)
965 Value = str_to_num(iLevel)
966
967 if(iLevel[0] == '-')
968 {
969 console_print(id, "You can't have a '-' in the value!")
970 return PLUGIN_HANDLED;
971 }
972
973 if(!Target)
974 {
975 console_print(id, "Target not found!")
976 return PLUGIN_HANDLED;
977 }
978
979 if(Value > MAXLEVEL-1)
980 {
981 console_print(id, "You can't set a more than %d!", MAXLEVEL-1)
982 return PLUGIN_HANDLED;
983 }
984
985 if(Value < 1)
986 {
987 console_print(id, "You can't set less than 1!")
988 return PLUGIN_HANDLED;
989 }
990
991 new AdminName[32]
992 get_user_name(id, AdminName, 31)
993
994 new TargetName[32]
995 get_user_name(Target, TargetName, 31)
996
997 PlayerLevel[Target] = Value - 1
998 PlayerXp[Target] = LEVELS[PlayerLevel[Target]]
999 check_level(Target)
1000
1001 client_printcolor(Target, "/gADMIN: /ctr%s /yhas set your level to /g%d", AdminName, Value)
1002
1003 return PLUGIN_HANDLED;
1004}
1005
1006// ============================================================//
1007// [~ Saving datas ~] //
1008// ============================================================//
1009public MySQLx_Init()
1010{
1011 if ( !get_pcvar_num(p_Enabled) || !get_pcvar_num(save_type) )
1012 return;
1013
1014 new szHost[64], szUser[32], szPass[32], szDB[128];
1015
1016 get_pcvar_string( mysqlx_host, szHost, charsmax( szHost ) );
1017 get_pcvar_string( mysqlx_user, szUser, charsmax( szUser ) );
1018 get_pcvar_string( mysqlx_pass, szPass, charsmax( szPass ) );
1019 get_pcvar_string( mysqlx_db, szDB, charsmax( szDB ) );
1020
1021 g_hTuple = SQL_MakeDbTuple( szHost, szUser, szPass, szDB );
1022
1023 for ( new i = 0; i < sizeof szTables; i++ )
1024 {
1025 SQL_ThreadQuery( g_hTuple, "QueryCreateTable", szTables[i])
1026 }
1027}
1028public QueryCreateTable( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
1029{
1030 if( iFailState == TQUERY_CONNECT_FAILED
1031 || iFailState == TQUERY_QUERY_FAILED )
1032 {
1033 log_amx( "%s", szError );
1034
1035 return;
1036 }
1037}
1038
1039SaveLevel(id)
1040{
1041 if ( get_pcvar_num(savexp) )
1042 {
1043 if ( !get_pcvar_num(save_type) )
1044 {
1045 new szData[256];
1046 new szKey[64];
1047
1048 formatex( szKey , 63 , "%s-ID" , g_szAuthID[id]);
1049 formatex( szData , 255 , "%i#%i#" , PlayerLevel[id], PlayerXp[id] );
1050
1051 nvault_set( g_Vault , szKey , szData );
1052 }
1053 else
1054 {
1055 static szQuery[ 128 ];
1056
1057 formatex( szQuery, 127, "REPLACE INTO `mytable` (`player_id`, `player_level`, `player_xp`) VALUES ('%s', '%d', '%d');", g_szAuthID[id] , PlayerLevel[id], PlayerXp[id] );
1058
1059 SQL_ThreadQuery( g_hTuple, "QuerySetData", szQuery);
1060 }
1061 }
1062 else
1063 {
1064 if ( !get_pcvar_num(save_type) )
1065 {
1066 new szData[256];
1067 new szKey[64];
1068
1069 formatex( szKey , 63 , "%s-IP" , g_szAuthIP[id] );
1070 formatex( szData , 255 , "%i#%i#" , PlayerLevel[id], PlayerXp[id] );
1071
1072 nvault_set( g_Vault , szKey , szData );
1073 }
1074 else
1075 {
1076 static szQuery[ 128 ];
1077
1078 formatex( szQuery, 127, "REPLACE INTO `mytable` (`player_id`, `player_level`, `player_xp`) VALUES ('%s', '%d', '%d');", g_szAuthIP[id] , PlayerLevel[id], PlayerXp[id] );
1079
1080 SQL_ThreadQuery( g_hTuple, "QuerySetData", szQuery);
1081 }
1082 }
1083}
1084
1085LoadLevel(id)
1086{
1087 if ( get_pcvar_num(savexp) )
1088 {
1089 if ( !get_pcvar_num(save_type) )
1090 {
1091 new szData[256];
1092 new szKey[40];
1093
1094 formatex( szKey , 39 , "%s-ID" , g_szAuthID[id] );
1095
1096 formatex(szData , 255, "%i#%i#", PlayerLevel[id], PlayerXp[id])
1097
1098 nvault_get(g_Vault, szKey, szData, 255)
1099
1100 replace_all(szData , 255, "#", " ")
1101 new xp[32], level[32]
1102 parse(szData, level, 31, xp, 31)
1103 PlayerLevel[id] = str_to_num(level)
1104 PlayerXp[id] = str_to_num(xp)
1105 }
1106 else
1107 {
1108 static szQuery[ 128 ], iData[ 1 ];
1109 formatex( szQuery, 127, "SELECT `player_level`, `player_xp` FROM `mytable` WHERE ( `player_id` = '%s' );", g_szAuthID[id] );
1110
1111 iData[ 0 ] = id;
1112 SQL_ThreadQuery( g_hTuple, "QuerySelectData", szQuery, iData, 1 );
1113 }
1114 }
1115 else
1116 {
1117 if ( !get_pcvar_num(save_type) )
1118 {
1119 new szData[256];
1120 new szKey[40];
1121
1122 formatex( szKey , 39 , "%s-IP" , g_szAuthIP[id] );
1123
1124 formatex(szData , 255, "%i#%i#", PlayerLevel[id], PlayerXp[id])
1125
1126 nvault_get(g_Vault, szKey, szData, 255)
1127
1128 replace_all(szData , 255, "#", " ")
1129 new xp[32], level[32]
1130 parse(szData, level, 31, xp, 31)
1131 PlayerLevel[id] = str_to_num(level)
1132 PlayerXp[id] = str_to_num(xp)
1133 }
1134 else
1135 {
1136 static szQuery[ 128 ], iData[ 1 ];
1137 formatex( szQuery, 127, "SELECT `player_level`, `player_xp` FROM `mytable` WHERE ( `player_id` = '%s' );", g_szAuthIP[id] );
1138
1139 iData[ 0 ] = id;
1140 SQL_ThreadQuery( g_hTuple, "QuerySelectData", szQuery, iData, 1 );
1141 }
1142 }
1143}
1144public QuerySelectData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
1145{
1146 if( iFailState == TQUERY_CONNECT_FAILED
1147 || iFailState == TQUERY_QUERY_FAILED )
1148 {
1149 log_amx( "%s", szError );
1150
1151 return;
1152 }
1153 else
1154 {
1155 new id = iData[ 0 ];
1156
1157 new ColLevel = SQL_FieldNameToNum(hQuery, "player_level")
1158 new ColXp = SQL_FieldNameToNum(hQuery, "player_xp")
1159
1160 while (SQL_MoreResults(hQuery))
1161 {
1162 PlayerLevel[id] = SQL_ReadResult(hQuery, ColLevel);
1163 PlayerXp[id] = SQL_ReadResult(hQuery, ColXp);
1164
1165 SQL_NextRow(hQuery)
1166 }
1167 }
1168}
1169public QuerySetData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
1170{
1171 if( iFailState == TQUERY_CONNECT_FAILED
1172 || iFailState == TQUERY_QUERY_FAILED )
1173 {
1174 log_amx( "%s", szError );
1175
1176 return;
1177 }
1178}
1179// ============================================================//
1180// [~ Natives ~] //
1181// ============================================================//
1182// Native: get_user_xp
1183public native_get_user_xp(id)
1184{
1185 return PlayerXp[id];
1186}
1187// Native: set_user_xp
1188public native_set_user_xp(id, amount)
1189{
1190 PlayerXp[id] = amount;
1191}
1192// Native: get_user_level
1193public native_get_user_level(id)
1194{
1195 return PlayerLevel[id];
1196}
1197// Native: set_user_xp
1198public native_set_user_level(id, amount)
1199{
1200 PlayerLevel[id] = amount;
1201}
1202// Native: Gets user level by Xp
1203public native_get_user_max_level(id)
1204{
1205 return LEVELS[PlayerLevel[id]];
1206}
1207// ============================================================//
1208// [~ Stocks ~] //
1209// ============================================================//
1210stock client_printcolor(const id, const input[], any:...)
1211{
1212 new count = 1, players[32];
1213 static msg[191];
1214 vformat(msg,190,input,3);
1215 replace_all(msg,190,"/g","^4");// green txt
1216 replace_all(msg,190,"/y","^1");// orange txt
1217 replace_all(msg,190,"/ctr","^3");// team txt
1218 replace_all(msg,190,"/w","^0");// team txt
1219 if (id) players[0] = id; else get_players(players,count,"ch");
1220 for (new i = 0; i < count; i++)
1221 if (is_user_connected(players[i]))
1222 {
1223 message_begin(MSG_ONE_UNRELIABLE, SayTxT, _, players[i]);
1224 write_byte(players[i]);
1225 write_string(msg);
1226 message_end();
1227 }
1228}
1229public StripPlayerWeapons(id)
1230{
1231 strip_user_weapons(id)
1232 set_pdata_int(id, OFFSET_PRIMARYWEAPON, 0)
1233 give_item(id, "weapon_knife");
1234}