· 10 years ago · Aug 21, 2016, 11:02 AM
1#include <amxmodx>
2#include <cstrike>
3#include <fun>
4#include <hamsandwich>
5#include <levels>
6#include <nvault_util>
7#include <nvault>
8#include <sqlx>
9#include <zombie_escape>
10
11#define MAXLEVEL 30
12#define MAXPLAYERS 32
13#define TOPLEVEL 15
14
15native ze_set_user_points(index, amount)
16native ze_get_user_points(index)
17native get_antidote(id)
18native get_recoil(id)
19native get_unlimited(id)
20
21new const LEVELS[MAXLEVEL] = {
2250, // Needed on level 1
23150, // Needed on level 2
24300, // Needed on level 3
25470, // Needed on level 4
26700, // Needed on level 5
271200, // Needed on level 6
281800, // Needed on level 7
292800, // Needed on level 8
304100, // Needed on level 9
315200, // Needed on level 10
326000, // Needed on level 11
336800, // Needed on level 12
348200, // Needed on level 13
3510500, // Needed on level 14
3612000, // Needed on level 15
3715000, // Needed on level 16
3817500, // Needed on level 17
3920500, // Needed on level 18
4025500, // Needed on level 19
4129000, // Needed on level 20
4235000, // Needed on level 21
4346000, // Needed on level 22
4460000, // Needed on level 23
4575000, // Needed on level 24
46100000, // Needed on level 25
47200000, // Needed on level 26
48300000, // Needed on level 27
49400000, // Needed on level 28
50500000, // Needed on level 29
51600000, // Needed on level 30
52}; // Needed Xp on each Levels
53
54new SUPERNOOB
55new const NAMES[MAXLEVEL] =
56 {
57SUPERNOOB, // Needed on level 1
58NOOB, // Needed on level 2
59SILVER I, // Needed on level 3
60SILVER II, // Needed on level 4
61SILVER II, // Needed on level 5
62SILVER IV, // Needed on level 6
63SILVER ELITE, // Needed on level 7
64SILVER MASTER, // Needed on level 8
65GOLD NOVA I, // Needed on level 9
66GOLD NOVA II, // Needed on level 10
67GOLD NOVA III, // Needed on level 11
68GOLD NOVA MASTER, // Needed on level 12
69GOLD NOVA ELITE, // Needed on level 13
70MASTER GUARDIN I, // Needed on level 14
71MASTER GUARDIN II, // Needed on level 15
72MASTER GUARDIN III, // Needed on level 16
73ASSASSIN, // Needed on level 17
74SNIPER, // Needed on level 18
75SURVIVOR, // Needed on level 19
76GUARDIN ELITE, // Needed on level 20
77LEGENDARY EAGLE, // Needed on level 21
78LEGENDARY MASTER, // Needed on level 22
79THE GLOBAL ELITE, // Needed on level 23
80ELITE PLAYER, // Needed on level 24
81UNSTOPPABLE, // Needed on level 25
82LEGENDOFWARIOR, // Needed on level 26
83PROFFISIONAL, // Needed on level 27
84THE GLOBAL MASTER, // Needed on level 28
85THE BOSS, // Needed on level 29
86ULTIMATE MONSTER // Needed on Level 30
87}
88
89new g_MaxPlayers
90
91new const VAULTNAME[] = "levels"
92new const szTables[][] =
93{
94 "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;"
95}
96
97new PlayerXp[33]
98new PlayerLevel[33]
99new PlayerName[33]
100new g_szMotd[1536]
101new Handle:g_hTuple;
102new g_Vault
103new g_kills[33]
104new g_maxplayers
105new savexp, save_type, xp_kill, xp_triple, enable_triple, triple_kills, xp_ultra, ultra_kills, enable_ultra, escape_xp, damage_hp, damage_xp
106new SMALL, AVERAGE, LARGE
107new mysqlx_host, mysqlx_user, mysqlx_db, mysqlx_pass
108new bool:Prize[33]
109new g_msgSayText
110
111public plugin_init()
112{
113 register_plugin("[ZE] Levels XP", "1.0", "Raheem");
114
115 SMALL = register_cvar("small", "10")
116 AVERAGE = register_cvar("average", "25")
117 LARGE = register_cvar("large", "50")
118
119 new time[3]
120 get_time("%H", time, 2)
121
122 if((12 > str_to_num(time) >= 00))
123 {
124 xp_kill = register_cvar("levels_xp","2*2"); // How much xp gain if you killed someone?
125 enable_triple = register_cvar("levels_triple","1"); // Enable Triple Kill bonus xp? 1 = Yes, 0 = No.
126 xp_triple = register_cvar("levels_triple_xp","3*2"); // How much bonus xp give for Triple Kill?
127 triple_kills = register_cvar("levels_triple_kills","3"); // How much kills needed to give bonus xp?
128 enable_ultra = register_cvar("levels_ultra","1"); // Enable Ultra Kill bonus xp? 1 = Yes, 0 = No.
129 xp_ultra = register_cvar("levels_ultra_xp","5*2"); // How much bonus xp give for Ultra Kill?
130 ultra_kills = register_cvar("levels_ultra_kills","6"); // How much kills needed to give bonus xp?
131 escape_xp = register_cvar("escape_xp_amount", "5*2") // How much XP given to Humans when escape success?
132 damage_hp = register_cvar("required_damage_hp", "80") // The damage if the player made more than it he will awarded.
133 damage_xp = register_cvar("damage_xp_amount", "2*2") //How much XP given to human who make damage more than damage_hp?
134 }
135 else
136 {
137 xp_kill = register_cvar("levels_xp","2"); // How much xp gain if you killed someone?
138 enable_triple = register_cvar("levels_triple","1"); // Enable Triple Kill bonus xp? 1 = Yes, 0 = No.
139 xp_triple = register_cvar("levels_triple_xp","3"); // How much bonus xp give for Triple Kill?
140 triple_kills = register_cvar("levels_triple_kills","3"); // How much kills needed to give bonus xp?
141 enable_ultra = register_cvar("levels_ultra","1"); // Enable Ultra Kill bonus xp? 1 = Yes, 0 = No.
142 xp_ultra = register_cvar("levels_ultra_xp","5"); // How much bonus xp give for Ultra Kill?
143 ultra_kills = register_cvar("levels_ultra_kills","6"); // How much kills needed to give bonus xp?
144 escape_xp = register_cvar("escape_xp_amount", "5") // How much XP given to Humans when escape success?
145 damage_hp = register_cvar("required_damage_hp", "80") // The damage if the player made more than it he will awarded.
146 damage_xp = register_cvar("damage_xp_amount", "2") //How much XP given to human who make damage more than damage_hp?
147 }
148
149 save_type = register_cvar("levels_savetype","0"); // Save Xp to : 1 = MySQL, 0 = NVault.
150 savexp = register_cvar("levels_save","2"); // Save Xp by : 2 = Name, 1 = SteamID, 0 = IP.
151
152 register_clcmd("say /free", "random_prizes")
153 register_clcmd("say /top", "show_global_top")
154 // SQLx cvars
155 mysqlx_host = register_cvar ("levels_host", ""); // The host from the db
156 mysqlx_user = register_cvar ("levels_user", ""); // The username from the db login
157 mysqlx_pass = register_cvar ("levels_pass", ""); // The password from the db login
158 mysqlx_db = register_cvar ("levels_dbname", ""); // The database name
159 // Events
160 register_event("DeathMsg", "event_deathmsg", "a");
161 register_event("Damage", "on_damage", "b", "2!0", "3=0", "4!0")
162 // Forwards //
163 RegisterHam(Ham_Spawn, "player", "fwd_PlayerSpawn", 1);
164
165 MySQLx_Init()
166
167 g_maxplayers = get_maxplayers();
168
169 register_clcmd("say", "custom_say")
170 register_clcmd("say_team", "custom_say_team")
171
172 g_msgSayText = get_user_msgid("SayText")
173 register_message(g_msgSayText, "message_SayText")
174}
175
176public plugin_cfg()
177{
178 //Open our vault and have g_Vault store the handle.
179 g_Vault = nvault_open( "levels" );
180 //Make the plugin error if vault did not successfully open
181 if ( g_Vault == INVALID_HANDLE )
182 set_fail_state( "Error opening levels nVault, file does not exist!" );
183
184 FormatTop(TOPLEVEL)
185}
186
187public plugin_precache()
188{
189 precache_sound( "levelup_ZE/ze_levelup.wav" );
190}
191
192public plugin_natives()
193{
194 register_native("get_user_xp", "native_get_user_xp", 1);
195 register_native("set_user_xp", "native_set_user_xp", 1);
196 register_native("get_user_level", "native_get_user_level", 1);
197 register_native("set_user_level", "native_set_user_level", 1);
198 register_native("get_user_max_level", "native_get_user_max_level", 1);
199 register_native("get_user_name", "native_get_user_name", 1);
200}
201
202public plugin_end()
203{
204 //Close the vault when the plugin ends (map change\server shutdown\restart)
205 nvault_close( g_Vault );
206}
207
208public client_connect(id)
209{
210 LoadLevel(id)
211
212 set_task(300.0, "small_present", id)
213 set_task(600.0, "average_present", id)
214 set_task(1200.0, "large_present", id)
215}
216
217public client_disconnect(id)
218{
219 SaveLevel(id)
220
221 PlayerXp[id] = 0;
222 PlayerLevel[id] = 0;
223
224 if(task_exists(id))
225 remove_task(id)
226}
227
228public small_present(id)
229{
230 set_user_xp(id, get_user_xp(id) + get_pcvar_num(SMALL))
231 check_level(id)
232 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tYou got !g%d !tXP!y, !tfor playing on the server for !g5 !tminutes!y.", get_pcvar_num(SMALL))
233}
234
235public average_present(id)
236{
237 set_user_xp(id, get_user_xp(id) + get_pcvar_num(AVERAGE))
238 check_level(id)
239 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tYou got !g%d !tXP!y, !tfor playing on the server for !g10 !tminutes!y.", get_pcvar_num(AVERAGE))
240}
241
242public large_present(id)
243{
244 set_user_xp(id, get_user_xp(id) + get_pcvar_num(LARGE))
245 check_level(id)
246 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tYou got !g%d !tXP!y, !tfor playing on the server for !g20 !gminutes!y.", get_pcvar_num(LARGE))
247}
248
249public fwd_PlayerSpawn(id)
250{
251 if(!is_user_alive(id))
252 return;
253
254 g_kills[id] = 0
255}
256
257public event_deathmsg()
258{
259 new g_attacker = read_data(1);
260 new g_victim = read_data(2);
261
262 new counted_triple = get_pcvar_num(xp_kill) + get_pcvar_num(xp_triple)
263 new counted_ultra = get_pcvar_num(xp_kill) + get_pcvar_num(xp_ultra)
264
265 if((1 <= g_attacker <= g_maxplayers))
266 {
267 if(g_victim != g_attacker)
268 {
269 g_kills[g_attacker]++;
270 if(PlayerLevel[g_attacker] < MAXLEVEL-1)
271 {
272
273 if ( g_kills[g_attacker] == get_pcvar_num(triple_kills) && get_pcvar_num(enable_triple) )
274 {
275 PlayerXp[g_attacker] += counted_triple
276
277 set_hudmessage(random_num(0, 255), random_num(0, 255), random_num(0, 255), 0.50, 0.33, 1, 2.0, 8.0)
278 show_hudmessage(g_attacker, "+%i Triple Kill XP!", counted_triple)
279 }
280 else if ( g_kills[g_attacker] == get_pcvar_num(ultra_kills) && get_pcvar_num(enable_ultra) )
281 {
282 PlayerXp[g_attacker] += counted_ultra
283
284 set_hudmessage(random_num(0, 255), random_num(0, 255), random_num(0, 255), 0.50, 0.33, 1, 2.0, 8.0)
285 show_hudmessage(g_attacker, "+%i Ultra Kill XP!", counted_ultra)
286 }
287 else
288 {
289 PlayerXp[g_attacker] += get_pcvar_num(xp_kill)
290
291 set_hudmessage(random_num(0, 255), random_num(0, 255), random_num(0, 255), 0.50, 0.33, 1, 2.0, 8.0)
292 show_hudmessage(g_attacker, "+%i XP", get_pcvar_num(xp_kill))
293 }
294
295 check_level(g_attacker)
296 }
297 }
298 }
299}
300
301public ze_roundend()
302{
303 new Alive_Terrorists_Number = GetPlayersNum(CsTeams:CS_TEAM_T)
304 new Alive_CT_Numbers = GetPlayersNum(CsTeams:CS_TEAM_CT)
305
306 new iPlayers[32], iNum
307 get_players(iPlayers, iNum, "ace", "CT")
308
309 for (new i = 0; i < iNum; i++)
310 {
311 if(PlayerLevel[iPlayers[i]] < MAXLEVEL-1)
312 {
313 if((Alive_CT_Numbers > Alive_Terrorists_Number) && (Alive_Terrorists_Number == 0))
314 {
315 set_user_xp(iPlayers[i], get_user_xp(iPlayers[i]) + get_pcvar_num(escape_xp))
316 client_print_color(iPlayers[i], "!y[!gEscape!y-!gPark!y] !y+!t%i !gXP!y.", get_pcvar_num(escape_xp))
317 }
318 check_level(iPlayers[i])
319 }
320 }
321}
322
323public on_damage(id)
324{
325 static attacker,damage;
326
327 attacker = get_user_attacker(id)
328 damage = read_data(2)
329 if(PlayerLevel[attacker] < MAXLEVEL+1)
330 {
331 if ((damage >= get_pcvar_num(damage_hp)) && is_user_connected(attacker) && (cs_get_user_team(attacker) == CS_TEAM_CT) && (attacker != id))
332 {
333 set_user_xp(attacker, get_user_xp(attacker) + get_pcvar_num(damage_xp))
334 set_hudmessage(random_num(0, 255), random_num(0, 255), random_num(0, 255), -1.0, 0.7, 1, 3.0, 8.0, 0.5, 0.5)
335 show_hudmessage(attacker, "+%i XP", get_pcvar_num(damage_xp))
336 }
337
338 check_level(attacker)
339 }
340}
341
342public check_level(id)
343{
344 if(PlayerLevel[id] < MAXLEVEL-1)
345 {
346 while(PlayerXp[id] >= LEVELS[PlayerLevel[id]])
347 {
348 PlayerLevel[id]++;
349
350 static name[32] ; get_user_name(id, name, charsmax(name));
351 client_cmd(id,"spk levelup_ZE/ze_levelup.wav")
352 client_print_color(0, "!y[!gEscape!y-!gPark!y] !tCongratulation!y..!g%s!y, !tReached Level !g%i !tWith Rank !g%s!y.", name, PlayerLevel[id], PlayerName[id]);
353 }
354 }
355}
356
357public random_prizes(id)
358{
359 new xp = get_user_xp(id)
360
361 if(Prize[id])
362 {
363 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tYou Have Used Your Chance!y. !tTry Again !gNext Map!y.")
364 }
365 else
366 {
367 new iRand = random_num(0, 100)
368 new szName[32]
369 get_user_name(id, szName, charsmax(szName))
370
371 switch(iRand)
372 {
373 case 0 .. 10:
374 {
375 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tBad Luck!y. !tYou Didn't Win !g:P!y. !tTry !gNext Map!y.")
376 }
377 case 11 .. 20:
378 {
379 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tWorst Luck !g:P!y! !tYou Lost !n-!g25 !tXP!y.")
380 set_user_xp(id, xp - 25)
381 }
382 case 21 .. 30:
383 {
384 if ((cs_get_user_team(id) == CS_TEAM_CT) && is_user_alive(id))
385 {
386 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tGood Luck!y! !tYou Won !gGrenades Pack !tXP!y.")
387 give_item(id, "weapon_hegrenade")
388 give_item(id, "weapon_smokegrenade")
389 give_item(id, "weapon_flashbang")
390 }
391 }
392 case 31 .. 40:
393 {
394 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tGood Luck!y! !tYou Won !n+!g25 !tXP!y.")
395 set_user_xp(id, xp + 25)
396 }
397 case 41 .. 50:
398 {
399 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tWell Luck!y! !tYou Won !n+!g500 !tHP!y.")
400 set_user_health(id, get_user_health(id) + 500)
401 }
402 case 51 .. 60:
403 {
404 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tGreat Luck!y! !tYou Won !gSpeed!y.")
405 set_user_maxspeed(id, get_user_maxspeed(id) + 20.0)
406 }
407 case 61 .. 70:
408 {
409 if ((cs_get_user_team(id) == CS_TEAM_T) && is_user_alive(id))
410 {
411 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tLucky!y! !tYou Won !!gAntidote!y.")
412 get_antidote(id)
413 }
414 }
415 case 71 .. 80:
416 {
417 if ((cs_get_user_team(id) == CS_TEAM_CT) && is_user_alive(id))
418 {
419 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tNice Luck!y! !tYou Won !!gUnlimited Clip!y.")
420 get_unlimited(id)
421 }
422 }
423 case 81 .. 90:
424 {
425 if ((cs_get_user_team(id) == CS_TEAM_CT) && is_user_alive(id))
426 {
427 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tUnstoppablE Luck!y! !tYou Won !gNo Recoil!y.")
428 get_recoil(id)
429 }
430 }
431 case 91 .. 100:
432 {
433 client_print_color(id, "!y[!gEscape!y-!gPark!y] !tWTF An Awesome Luck!y! !tYou Won !y+!g50 !tPoints!y.")
434 ze_set_user_points(id, ze_get_user_points(id) + 50)
435 }
436 }
437 Prize[id] = true
438 check_level(id)
439 }
440}
441
442public MySQLx_Init()
443{
444 if (!get_pcvar_num(save_type))
445 return;
446
447 new szHost[64], szUser[32], szPass[32], szDB[128];
448
449 get_pcvar_string( mysqlx_host, szHost, charsmax( szHost ) );
450 get_pcvar_string( mysqlx_user, szUser, charsmax( szUser ) );
451 get_pcvar_string( mysqlx_pass, szPass, charsmax( szPass ) );
452 get_pcvar_string( mysqlx_db, szDB, charsmax( szDB ) );
453
454 g_hTuple = SQL_MakeDbTuple( szHost, szUser, szPass, szDB );
455
456 for ( new i = 0; i < sizeof szTables; i++ )
457 {
458 SQL_ThreadQuery( g_hTuple, "QueryCreateTable", szTables[i])
459 }
460}
461
462public QueryCreateTable( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
463{
464 if( iFailState == TQUERY_CONNECT_FAILED
465 || iFailState == TQUERY_QUERY_FAILED )
466 {
467 log_amx( "%s", szError );
468
469 return;
470 }
471}
472
473SaveLevel(id)
474{
475 new szAuth[33];
476 new szKey[64];
477
478 if ( get_pcvar_num(savexp) == 0 )
479 {
480 get_user_ip( id, szAuth , charsmax(szAuth), 1);
481 formatex( szKey , 63 , "%s-IP" , szAuth);
482 }
483 else if ( get_pcvar_num(savexp) == 1 )
484 {
485 get_user_authid( id , szAuth , charsmax(szAuth) );
486 formatex( szKey , 63 , "%s-ID" , szAuth);
487 }
488 else if ( get_pcvar_num(savexp) == 2 )
489 {
490 get_user_name( id, szAuth , charsmax(szAuth) );
491 formatex( szKey , 63 , "%s-NAME" , szAuth);
492 }
493
494 if ( !get_pcvar_num(save_type) )
495 {
496 new szData[256];
497
498 formatex( szData , 255 , "%i#%i#" , PlayerLevel[id], PlayerXp[id] );
499
500 nvault_set( g_Vault , szKey , szData );
501 }
502 else
503 {
504 static szQuery[ 128 ];
505
506 formatex( szQuery, 127, "REPLACE INTO `mytable` (`player_id`, `player_level`, `player_xp`) VALUES ('%s', '%d', '%d');", szAuth , PlayerLevel[id], PlayerXp[id] );
507
508 SQL_ThreadQuery( g_hTuple, "QuerySetData", szQuery);
509 }
510}
511
512LoadLevel(id)
513{
514 new szAuth[33];
515 new szKey[40];
516
517 if ( get_pcvar_num(savexp) == 0 )
518 {
519 get_user_ip( id, szAuth , charsmax(szAuth), 1);
520 formatex( szKey , 63 , "%s-IP" , szAuth);
521 }
522 else if ( get_pcvar_num(savexp) == 1 )
523 {
524 get_user_authid( id , szAuth , charsmax(szAuth) );
525 formatex( szKey , 63 , "%s-ID" , szAuth);
526 }
527 else if ( get_pcvar_num(savexp) == 2 )
528 {
529 get_user_name( id, szAuth , charsmax(szAuth) );
530 formatex( szKey , 63 , "%s-NAME" , szAuth);
531 }
532
533 if ( !get_pcvar_num(save_type) )
534 {
535 new szData[256];
536
537 formatex(szData , 255, "%i#%i#", PlayerLevel[id], PlayerXp[id])
538
539 nvault_get(g_Vault, szKey, szData, 255)
540
541 replace_all(szData , 255, "#", " ")
542 new xp[32], level[32]
543 parse(szData, level, 31, xp, 31)
544 PlayerLevel[id] = str_to_num(level)
545 PlayerXp[id] = str_to_num(xp)
546 }
547 else
548 {
549 static szQuery[ 128 ], iData[ 1 ];
550 formatex( szQuery, 127, "SELECT `player_level`, `player_xp` FROM `mytable` WHERE ( `player_id` = '%s' );", szAuth );
551
552 iData[ 0 ] = id;
553 SQL_ThreadQuery( g_hTuple, "QuerySelectData", szQuery, iData, 1 );
554 }
555}
556
557public QuerySelectData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
558{
559 if( iFailState == TQUERY_CONNECT_FAILED
560 || iFailState == TQUERY_QUERY_FAILED )
561 {
562 log_amx( "%s", szError );
563
564 return;
565 }
566 else
567 {
568 new id = iData[ 0 ];
569
570 new ColLevel = SQL_FieldNameToNum(hQuery, "player_level")
571 new ColXp = SQL_FieldNameToNum(hQuery, "player_xp")
572
573 while (SQL_MoreResults(hQuery))
574 {
575 PlayerLevel[id] = SQL_ReadResult(hQuery, ColLevel);
576 PlayerXp[id] = SQL_ReadResult(hQuery, ColXp);
577
578 SQL_NextRow(hQuery)
579 }
580 }
581}
582
583public QuerySetData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
584{
585 if( iFailState == TQUERY_CONNECT_FAILED
586 || iFailState == TQUERY_QUERY_FAILED )
587 {
588 log_amx( "%s", szError );
589
590 return;
591 }
592}
593
594public show_global_top(id)
595{
596 show_motd(id, g_szMotd, "GLOBAL PLAYERS")
597}
598
599FormatTop(iNum)
600{
601 enum _:sVaultData
602 {
603 VD_Key[64],
604 VD_Value
605 }
606
607 new sVault = nvault_util_open(VAULTNAME)
608 new Array:entries = ArrayCreate(sVaultData)
609
610 new sizeEntries;
611 new numEntries = nvault_util_count(sVault)
612 new data[sVaultData], value[128], data2[sVaultData]
613
614 for(new i = 0, pos, timestamp; i < numEntries; i++)
615 {
616 pos = nvault_util_read(sVault, pos, data[VD_Key], charsmax(data[VD_Key]), value, charsmax(value), timestamp);
617 data[VD_Value] = str_to_num(value)
618
619 if(sizeEntries == 0)
620 {
621 ArrayPushArray(entries, data)
622 sizeEntries++
623 }
624 else
625 {
626 for(timestamp = 0; timestamp <= sizeEntries; timestamp++)
627 {
628 if(timestamp == sizeEntries)
629 {
630 if(sizeEntries < iNum)
631 {
632 ArrayPushArray(entries, data)
633 sizeEntries++
634 }
635
636 break
637 }
638
639 ArrayGetArray(entries, timestamp, data2)
640 if(data[VD_Value] >= data2[VD_Value])
641 {
642 ArrayInsertArrayBefore(entries, timestamp, data)
643 if(sizeEntries < iNum)
644 {
645 sizeEntries++
646 }
647 else
648 {
649 ArrayDeleteItem(entries, sizeEntries);
650 }
651
652 break
653 }
654 }
655 }
656 }
657
658 nvault_util_close(sVault)
659
660 new iLen
661 new len = charsmax(g_szMotd)
662
663 iLen = formatex(g_szMotd, len, "<STYLE>body{background:#212121;color:#d1d1d1;font-family:Arial}table{width:100%%;font-size:19px}</STYLE><table cellpadding=1 cellspacing=1 border=0>")
664 iLen += formatex(g_szMotd[iLen], len - iLen, "<tr bgcolor=#333333><th width=1%%><align=left font color=white> %s <th width=5%%> %-22.22s <th width=5%%> %s", "#", "NAME", "LEVEL")
665
666 new i
667 for(i = 0; i < sizeEntries; i++)
668 {
669 ArrayGetArray(entries, i, data);
670 data[VD_Key][20] = 0;
671
672 replace_all(data[VD_Key], charsmax(data[VD_Key]), "<", "<")
673 replace_all(data[VD_Key], charsmax(data[VD_Key]), ">", ">")
674
675 iLen += formatex(g_szMotd[iLen], len - iLen, "<tr align=left%s><td align=left><font color=white> %d. <td> %-22.22s <td> %d", " bgcolor=#2b5b95",(i+1), data[VD_Key], data[VD_Value])
676 }
677
678 ArrayDestroy(entries);
679 iLen += formatex(g_szMotd[iLen], len - iLen, "</table></body>")
680}
681
682public custom_say(id)
683{
684 new szMessage[192], szName[32]
685
686 read_args(szMessage, charsmax(szMessage))
687 remove_quotes(szMessage)
688 get_user_name(id, szName, charsmax(szName))
689
690 if(equali(szMessage[0], " ") || equali(szMessage[0], "") || !is_valid_msg(szMessage))
691 return PLUGIN_HANDLED_MAIN
692
693 if(is_user_alive(id))
694 {
695 format(szMessage, charsmax(szMessage), "^4[%s] ^3%s : ^1%s", PlayerName[id], szName, szMessage)
696 }
697 else
698 {
699 format(szMessage, charsmax(szMessage), "^1*DEAD* ^4[%s] ^3%s : ^1%s", PlayerName[id], szName, szMessage)
700 }
701
702 new iPlayers[MAXPLAYERS], iPlayerCount, i, player
703 get_players(iPlayers, iPlayerCount, "ch")
704 for(i = 0; i < iPlayerCount; i++)
705 {
706 player = iPlayers[i]
707 if(is_user_alive(id) && is_user_alive(player) || !is_user_alive(id) && !is_user_alive(player))
708 {
709 message_begin(MSG_ONE, g_msgSayText, {0, 0, 0}, player)
710 write_byte(id)
711 write_string(szMessage)
712 message_end()
713 }
714 }
715
716 return PLUGIN_CONTINUE
717}
718
719public custom_say_team(id)
720{
721 new szMessage[192], szName[32]
722
723 read_args(szMessage, charsmax(szMessage))
724 remove_quotes(szMessage)
725 get_user_name(id, szName, charsmax(szName))
726
727 if(equali(szMessage[0], " ") || equali(szMessage[0], "") || !is_valid_msg(szMessage))
728 return PLUGIN_HANDLED_MAIN
729
730 if(is_user_alive(id))
731 {
732 format(szMessage, charsmax(szMessage), "^4[%s] ^3%s : ^1%s", PlayerName[id], szName, szMessage)
733 }
734 else
735 {
736 format(szMessage, charsmax(szMessage), "^1*DEAD* ^4[$s] ^3%s : ^1%s", PlayerName[id], szName, szMessage)
737 }
738
739 new iPlayers[MAXPLAYERS], iPlayerCount, i, player
740 get_players(iPlayers, iPlayerCount, "ch")
741 for(i = 0; i < iPlayerCount; i++)
742 {
743 player = iPlayers[i]
744 if(is_user_alive(id) && is_user_alive(player) && get_user_team(id) == get_user_team(player) || !is_user_alive(id) && !is_user_alive(player) && get_user_team(id) == get_user_team(player))
745 {
746 message_begin(MSG_ONE, g_msgSayText, {0, 0, 0}, player)
747 write_byte(id)
748 write_string(szMessage)
749 message_end()
750 }
751 }
752
753 return PLUGIN_CONTINUE
754}
755
756public message_SayText(id)
757{
758 return PLUGIN_HANDLED
759}
760
761bool:is_valid_msg(const szMessage[])
762{
763 if(szMessage[0] == '@' || szMessage[0] == '/' || szMessage[0] == '!' || !strlen(szMessage))
764 return false
765
766 return true
767}
768
769//======================Natives======================//
770
771// Native: get user xp
772public native_get_user_xp(id)
773{
774 return PlayerXp[id];
775}
776// Native: set user xp
777public native_set_user_xp(id, amount)
778{
779 PlayerXp[id] = amount;
780}
781// Native: get_user_level
782public native_get_user_level(id)
783{
784 return PlayerLevel[id];
785}
786// Native: set user level
787public native_set_user_level(id, amount)
788{
789 PlayerLevel[id] = amount;
790}
791// Native: Gets user level by XP
792public native_get_user_max_level(id)
793{
794 return LEVELS[PlayerLevel[id]];
795}
796// Native: Gets user level name
797public native_get_user_name(id)
798{
799 return NAMES[PlayerName[id]];
800}
801stock client_print_color(index, const text[], any:...)
802{
803new szMsg[128];
804vformat(szMsg, sizeof(szMsg) - 1, text, 3);
805
806replace_all(szMsg, sizeof(szMsg) - 1, "!g", "^x04");
807replace_all(szMsg, sizeof(szMsg) - 1, "!n", "^x01");
808replace_all(szMsg, sizeof(szMsg) - 1, "!t", "^x03");
809
810if(index == 0)
811{
812for(new i = 0; i < g_MaxPlayers; i++)
813{
814 if(is_user_alive(i) && is_user_connected(i))
815 {
816 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, i);
817 write_byte(i);
818 write_string(szMsg);
819 message_end();
820 }
821}
822} else {
823message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, index);
824write_byte(index);
825write_string(szMsg);
826message_end();
827}
828}