· 9 years ago · Feb 21, 2017, 11:18 PM
1#include <amxmodx>
2#include <cstrike>
3#include <hamsandwich>
4#include <levels>
5#include <nvault>
6#include <sqlx>
7
8#define TASK_SHOW_LEVEL 10113
9#define MAXLEVEL 24
10
11new const LEVELS[MAXLEVEL] = {
1290, // Needed on level 1
13180, // Needed on level 2
14300, // Needed on level 3
15450, // Needed on level 4
16700, // Needed on level 5
171200, // Needed on level 6
181800, // Needed on level 7
192800, // Needed on level 8
204100, // Needed on level 9
215200, // Needed on level 10
226000, // Needed on level 11
236800, // Needed on level 12
248200, // Needed on level 13
2510200, // Needed on level 14
2612000, // Needed on level 15
2715000, // Needed on level 16
2817500, // Needed on level 17
2920500, // Needed on level 18
3025500, // Needed on level 19
3129000, // Needed on level 20
3235000, // Needed on level 21
3346000, // Needed on level 22
3458000, // Needed on level 23
35150000 // Needed on level 24
36}; // Needed Xp on each Levels
37
38new const szTables[][] =
39{
40 "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;"
41}
42
43new PlayerXp[33]
44new PlayerLevel[33]
45new Handle:g_hTuple;
46
47new g_Vault
48new g_kills[33]
49new g_maxplayers, g_msgHudSync1
50new savexp, save_type, xp_kill, xp_triple, enable_triple, triple_kills, xp_ultra, ultra_kills, enable_ultra, escape_xp, damage_hp, damage_xp
51
52new mysqlx_host, mysqlx_user, mysqlx_db, mysqlx_pass
53
54public plugin_init()
55{
56 register_plugin("[ZE] Levels XP", "1.0", "Raheem");
57
58 save_type = register_cvar("levels_savetype","0"); // Save Xp to : 1 = MySQL, 0 = NVault.
59 savexp = register_cvar("levels_save","2"); // Save Xp by : 2 = Name, 1 = SteamID, 0 = IP.
60 xp_kill = register_cvar("levels_xp","10"); // How much xp gain if you killed someone?
61
62 enable_triple = register_cvar("levels_triple","1"); // Enable Triple Kill bonus xp? 1 = Yes, 0 = No.
63 xp_triple = register_cvar("levels_triple_xp","3"); // How much bonus xp give for Triple Kill?
64 triple_kills = register_cvar("levels_triple_kills","3"); // How much kills needed to give bonus xp?
65 enable_ultra = register_cvar("levels_ultra","1"); // Enable Ultra Kill bonus xp? 1 = Yes, 0 = No.
66 xp_ultra = register_cvar("levels_ultra_xp","5"); // How much bonus xp give for Ultra Kill?
67 ultra_kills = register_cvar("levels_ultra_kills","6"); // How much kills needed to give bonus xp?
68 escape_xp = register_cvar("escape_xp_amount", "20") // How much XP given to Humans when escape success?
69 damage_hp = register_cvar("required_damage_hp", "60") // The damage if the player made more than it he will awarded.
70 damage_xp = register_cvar("damage_xp_amount", "2") //How much XP given to human who make damage more than damage_hp?
71
72
73 // SQLx cvars
74 mysqlx_host = register_cvar ("levels_host", ""); // The host from the db
75 mysqlx_user = register_cvar ("levels_user", ""); // The username from the db login
76 mysqlx_pass = register_cvar ("levels_pass", ""); // The password from the db login
77 mysqlx_db = register_cvar ("levels_dbname", ""); // The database name
78
79 // Events
80 register_event("DeathMsg", "event_deathmsg", "a");
81 register_event("StatusValue", "Event_StatusValue", "bd", "1=2")
82 register_event("Damage", "on_damage", "b", "2!0", "3=0", "4!0")
83
84
85 // Forwards //
86 RegisterHam(Ham_Spawn, "player", "fwd_PlayerSpawn", 1);
87
88 MySQLx_Init()
89
90 g_msgHudSync1 = CreateHudSyncObj()
91 g_maxplayers = get_maxplayers();
92}
93
94public plugin_cfg()
95{
96 //Open our vault and have g_Vault store the handle.
97 g_Vault = nvault_open( "levels" );
98
99 //Make the plugin error if vault did not successfully open
100 if ( g_Vault == INVALID_HANDLE )
101 set_fail_state( "Error opening levels nVault, file does not exist!" );
102}
103
104public plugin_precache()
105{
106 precache_sound( "levelup_ZE/ze_levelup.wav" );
107}
108
109public plugin_natives()
110{
111 register_native("get_user_xp", "native_get_user_xp", 1);
112 register_native("set_user_xp", "native_set_user_xp", 1);
113 register_native("get_user_level", "native_get_user_level", 1);
114 register_native("set_user_level", "native_set_user_level", 1);
115 register_native("get_user_max_level", "native_get_user_max_level", 1);
116}
117
118public plugin_end()
119{
120 //Close the vault when the plugin ends (map change\server shutdown\restart)
121 nvault_close( g_Vault );
122}
123
124public client_connect(id)
125{
126 LoadLevel(id)
127}
128
129public client_disconnect(id)
130{
131 SaveLevel(id)
132
133 PlayerXp[id] = 0;
134 PlayerLevel[id] = 0;
135
136 remove_task( TASK_SHOW_LEVEL + id );
137}
138
139public fwd_PlayerSpawn(id)
140{
141
142 if(!is_user_alive(id))
143 return;
144
145 g_kills[id] = 0
146
147 remove_task( TASK_SHOW_LEVEL + id );
148
149 set_task(0.1, "task_show_level", TASK_SHOW_LEVEL + id)
150}
151
152public event_deathmsg()
153{
154 new g_attacker = read_data(1);
155 new g_victim = read_data(2);
156
157 new counted_triple = get_pcvar_num(xp_kill) + get_pcvar_num(xp_triple)
158 new counted_ultra = get_pcvar_num(xp_kill) + get_pcvar_num(xp_ultra)
159
160 if((1 <= g_attacker <= g_maxplayers))
161 {
162 if(g_victim != g_attacker)
163 {
164 g_kills[g_attacker]++;
165 if(PlayerLevel[g_attacker] < MAXLEVEL-1)
166 {
167
168 if ( g_kills[g_attacker] == get_pcvar_num(triple_kills) && get_pcvar_num(enable_triple) )
169 {
170 PlayerXp[g_attacker] += counted_triple
171
172 set_hudmessage(0, 40, 255, 0.50, 0.33, 1, 2.0, 8.0)
173 show_hudmessage(g_attacker, "+%i Triple Kill XP!", counted_triple)
174 }
175 else if ( g_kills[g_attacker] == get_pcvar_num(ultra_kills) && get_pcvar_num(enable_ultra) )
176 {
177 PlayerXp[g_attacker] += counted_ultra
178
179 set_hudmessage(255, 30, 0, 0.50, 0.33, 1, 2.0, 8.0)
180 show_hudmessage(g_attacker, "+%i Ultra Kill XP!", counted_ultra)
181 }
182 else
183 {
184 PlayerXp[g_attacker] += get_pcvar_num(xp_kill)
185
186 set_hudmessage(0, 255, 50, 0.50, 0.33, 1, 2.0, 8.0)
187 show_hudmessage(g_attacker, "+%i XP", get_pcvar_num(xp_kill))
188 }
189
190 check_level(g_attacker)
191 }
192 }
193 }
194}
195
196public ze_roundend()
197{
198 new Alive_Terrorists_Number = GetPlayersNum(CsTeams:CS_TEAM_T)
199 new Alive_CT_Numbers = GetPlayersNum(CsTeams:CS_TEAM_CT)
200
201 new iPlayers[32], iNum
202 get_players(iPlayers, iNum, "ace", "CT")
203
204 for (new i = 0; i < iNum; i++)
205 {
206 if(PlayerLevel[iPlayers[i]] < MAXLEVEL-1)
207 {
208 if((Alive_CT_Numbers > Alive_Terrorists_Number) && (Alive_Terrorists_Number == 0))
209 {
210 set_user_xp(iPlayers[i], get_user_xp(iPlayers[i]) + get_pcvar_num(escape_xp))
211 client_print_color(iPlayers[i], "!y[!gLevel!y-!gSystem!y] !t+%i XP!y.", get_pcvar_num(escape_xp))
212 }
213 check_level(iPlayers[i])
214 }
215 }
216}
217
218public on_damage(id)
219{
220 static attacker,damage;
221
222 attacker = get_user_attacker(id)
223 damage = read_data(2)
224 if(PlayerLevel[attacker] < MAXLEVEL-1)
225 {
226 if ((damage >= get_pcvar_num(damage_hp)) && is_user_connected(attacker) && (cs_get_user_team(attacker) == CS_TEAM_CT) && (attacker != id))
227 {
228 set_user_xp(attacker, get_user_xp(attacker) + get_pcvar_num(damage_xp))
229 set_hudmessage(random(256), random(256), random(256), -1.0, 0.7, 1, 3.0, 8.0, 0.5, 0.5)
230 show_hudmessage(attacker, "+%i XP", get_pcvar_num(damage_xp))
231 }
232
233 check_level(attacker)
234 }
235}
236
237public Event_StatusValue(id)
238{
239 new target = read_data(2)
240 if(target != id && target != 0)
241 {
242 static sName[32];
243 get_user_name(target, sName, 31)
244
245 set_hudmessage(0, 255, 255, -1.0, 0.3, 0, 0.0, 6.0, 0.0, 0.0, 2)
246 ShowSyncHudMsg(id, g_msgHudSync1, "[Name: %s || Level: %d]", sName, PlayerLevel[target])
247 }
248}
249
250public task_show_level(task)
251{
252 new id = task - TASK_SHOW_LEVEL
253
254 if(!is_user_alive(id))
255 return;
256
257 set_hudmessage(0, 255, 255, 0.02, 0.05, 0, 0.0, 0.3, 0.0, 0.0)
258 ShowSyncHudMsg(id, g_msgHudSync1 , "[Level : %i || XP : %i / %i]", PlayerLevel[id], PlayerXp[id], LEVELS[PlayerLevel[id]])
259
260 set_task(0.1, "task_show_level", TASK_SHOW_LEVEL + id)
261}
262
263public check_level(id)
264{
265 if(PlayerLevel[id] < MAXLEVEL-1)
266 {
267 while(PlayerXp[id] >= LEVELS[PlayerLevel[id]])
268 {
269 PlayerLevel[id]++;
270
271 static name[32] ; get_user_name(id, name, charsmax(name));
272 client_cmd(id,"spk levelup_ZE/ze_levelup.wav")
273 client_print_color(0, "!y[!gLevel!y-!gSystem!y] !t%s !yReaches Level !t%i!y.", name, PlayerLevel[id]);
274 }
275 }
276}
277
278public MySQLx_Init()
279{
280 if (!get_pcvar_num(save_type))
281 return;
282
283 new szHost[64], szUser[32], szPass[32], szDB[128];
284
285 get_pcvar_string( mysqlx_host, szHost, charsmax( szHost ) );
286 get_pcvar_string( mysqlx_user, szUser, charsmax( szUser ) );
287 get_pcvar_string( mysqlx_pass, szPass, charsmax( szPass ) );
288 get_pcvar_string( mysqlx_db, szDB, charsmax( szDB ) );
289
290 g_hTuple = SQL_MakeDbTuple( szHost, szUser, szPass, szDB );
291
292 for ( new i = 0; i < sizeof szTables; i++ )
293 {
294 SQL_ThreadQuery( g_hTuple, "QueryCreateTable", szTables[i])
295 }
296}
297
298public QueryCreateTable( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
299{
300 if( iFailState == TQUERY_CONNECT_FAILED
301 || iFailState == TQUERY_QUERY_FAILED )
302 {
303 log_amx( "%s", szError );
304
305 return;
306 }
307}
308
309SaveLevel(id)
310{
311 new szAuth[33];
312 new szKey[64];
313
314 if ( get_pcvar_num(savexp) == 0 )
315 {
316 get_user_ip( id, szAuth , charsmax(szAuth), 1);
317 formatex( szKey , 63 , "%s-IP" , szAuth);
318 }
319 else if ( get_pcvar_num(savexp) == 1 )
320 {
321 get_user_authid( id , szAuth , charsmax(szAuth) );
322 formatex( szKey , 63 , "%s-ID" , szAuth);
323 }
324 else if ( get_pcvar_num(savexp) == 2 )
325 {
326 get_user_name( id, szAuth , charsmax(szAuth) );
327 formatex( szKey , 63 , "%s-NAME" , szAuth);
328 }
329
330 if ( !get_pcvar_num(save_type) )
331 {
332 new szData[256];
333
334 formatex( szData , 255 , "%i#%i#" , PlayerLevel[id], PlayerXp[id] );
335
336 nvault_set( g_Vault , szKey , szData );
337 }
338 else
339 {
340 static szQuery[ 128 ];
341
342 formatex( szQuery, 127, "REPLACE INTO `mytable` (`player_id`, `player_level`, `player_xp`) VALUES ('%s', '%d', '%d');", szAuth , PlayerLevel[id], PlayerXp[id] );
343
344 SQL_ThreadQuery( g_hTuple, "QuerySetData", szQuery);
345 }
346}
347
348LoadLevel(id)
349{
350 new szAuth[33];
351 new szKey[40];
352
353 if ( get_pcvar_num(savexp) == 0 )
354 {
355 get_user_ip( id, szAuth , charsmax(szAuth), 1);
356 formatex( szKey , 63 , "%s-IP" , szAuth);
357 }
358 else if ( get_pcvar_num(savexp) == 1 )
359 {
360 get_user_authid( id , szAuth , charsmax(szAuth) );
361 formatex( szKey , 63 , "%s-ID" , szAuth);
362 }
363 else if ( get_pcvar_num(savexp) == 2 )
364 {
365 get_user_name( id, szAuth , charsmax(szAuth) );
366 formatex( szKey , 63 , "%s-NAME" , szAuth);
367 }
368
369 if ( !get_pcvar_num(save_type) )
370 {
371 new szData[256];
372
373 formatex(szData , 255, "%i#%i#", PlayerLevel[id], PlayerXp[id])
374
375 nvault_get(g_Vault, szKey, szData, 255)
376
377 replace_all(szData , 255, "#", " ")
378 new xp[32], level[32]
379 parse(szData, level, 31, xp, 31)
380 PlayerLevel[id] = str_to_num(level)
381 PlayerXp[id] = str_to_num(xp)
382 }
383 else
384 {
385 static szQuery[ 128 ], iData[ 1 ];
386 formatex( szQuery, 127, "SELECT `player_level`, `player_xp` FROM `mytable` WHERE ( `player_id` = '%s' );", szAuth );
387
388 iData[ 0 ] = id;
389 SQL_ThreadQuery( g_hTuple, "QuerySelectData", szQuery, iData, 1 );
390 }
391}
392
393public QuerySelectData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
394{
395 if( iFailState == TQUERY_CONNECT_FAILED
396 || iFailState == TQUERY_QUERY_FAILED )
397 {
398 log_amx( "%s", szError );
399
400 return;
401 }
402 else
403 {
404 new id = iData[ 0 ];
405
406 new ColLevel = SQL_FieldNameToNum(hQuery, "player_level")
407 new ColXp = SQL_FieldNameToNum(hQuery, "player_xp")
408
409 while (SQL_MoreResults(hQuery))
410 {
411 PlayerLevel[id] = SQL_ReadResult(hQuery, ColLevel);
412 PlayerXp[id] = SQL_ReadResult(hQuery, ColXp);
413
414 SQL_NextRow(hQuery)
415 }
416 }
417}
418
419public QuerySetData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
420{
421 if( iFailState == TQUERY_CONNECT_FAILED
422 || iFailState == TQUERY_QUERY_FAILED )
423 {
424 log_amx( "%s", szError );
425
426 return;
427 }
428}
429
430//======================Natives======================//
431
432// Native: get_user_xp
433public native_get_user_xp(id)
434{
435 return PlayerXp[id];
436}
437// Native: set_user_xp
438public native_set_user_xp(id, amount)
439{
440 PlayerXp[id] = amount;
441}
442// Native: get_user_level
443public native_get_user_level(id)
444{
445 return PlayerLevel[id];
446}
447// Native: set_user_xp
448public native_set_user_level(id, amount)
449{
450 PlayerLevel[id] = amount;
451}
452// Native: Gets user level by Xp
453public native_get_user_max_level(id)
454{
455 return LEVELS[PlayerLevel[id]];
456}
457
458//==================================================//
459
460//======================STOCKS======================//
461
462stock GetPlayersNum(CsTeams:iTeam) {
463 new iNum;
464 for( new i = 1; i <= get_maxplayers(); i++ ) {
465 if(is_user_connected(i) && is_user_alive(i) && cs_get_user_team(i) == iTeam)
466 iNum++;
467 }
468 return iNum;
469}
470
471stock client_print_color(const id, const input[], any:...)
472{
473 new count = 1, players[32];
474 static msg[191];
475 vformat(msg, 190, input, 3);
476
477 replace_all(msg, 190, "!g", "^x04"); // Green Color
478 replace_all(msg, 190, "!y", "^x01"); // Default Color
479 replace_all(msg, 190, "!t", "^x03"); // Team Color
480
481 if (id) players[0] = id; else get_players(players, count, "ch");
482 {
483 for (new i = 0; i < count; i++)
484 {
485 if (is_user_connected(players[i]))
486 {
487 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
488 write_byte(players[i]);
489 write_string(msg);
490 message_end();
491 }
492 }
493 }
494}