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