· 9 years ago · Jan 28, 2017, 05:30 PM
1#include <amxmodx>
2#include <amxmisc>
3#include <cstrike>
4#include <hamsandwich>
5#include <zombieplague>
6#include <nvault_util>
7#include <nvault>
8#include <sqlx>
9
10#define TAG "Premium-ZM" // Change the tag from here ... MUST BE BETWEEN ""
11#define MAXPLAYERS 32
12#define MAXLEVEL 60
13#define DUARATION 1
14#define HOLD 3
15#define FFADE_IN 0x0000
16#define FFADE_OUT 0x0001
17#define DENSITY 150
18
19new const level_up [] = "premium_zombie/level_up.wav" // EDIT SOUND
20new bool:g_bKilledZombie[MAXPLAYERS+1][33]
21new Level[33], XP[33]
22new savexp, g_Vault, save_type, mysqlx_host, mysqlx_user, mysqlx_db, mysqlx_pass
23new Handle:g_hTuple
24new const szTables[][] =
25{
26 "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;"
27}
28
29new const LEVELS[MAXLEVEL] = {
3090, // Needed on level 1
31180, // Needed on level 2
32300, // Needed on level 3
33450, // Needed on level 4
34700, // Needed on level 5
351200, // Needed on level 6
361800, // Needed on level 7
372800, // Needed on level 8
384100, // Needed on level 9
395200, // Needed on level 10
406000, // Needed on level 11
416800, // Needed on level 12
428200, // Needed on level 13
4310200, // Needed on level 14
4412000, // Needed on level 15
4515000, // Needed on level 16
4617500, // Needed on level 17
4720500, // Needed on level 18
4825500, // Needed on level 19
4929000, // Needed on level 20
5035000, // Needed on level 21
5146000, // Needed on level 22
5258000, // Needed on level 23
53150000, // Needed on level 24
54180000, // Needed on level 25
55200000, // Needed on level 26
56225000, // Needed on level 27
57250000, // Needed on level 28
58270000, // Needed on level 29
59300000, // Needed on level 30
60325000, // Needed on level 31
61350000, // Needed on level 32
62370000, // Needed on level 33
63400000, // Needed on level 34
64425000, // Needed on level 35
65450000, // Needed on level 36
66470000, // Needed on level 37
67500000, // Needed on level 38
68525000, // Needed on level 39
69550000, // Needed on level 40
70575000, // Needed on level 41
71600000, // Needed on level 42
72625000, // Needed on level 43
73650000, // Needed on level 44
74670000, // Needed on level 45
75700000, // Needed on level 46
76725000, // Needed on level 47
77750000, // Needed on level 48
78770000, // Needed on level 49
79800000, // Needed on level 50
80825000, // Needed on level 51
81850000, // Needed on level 52
82875000, // Needed on level 53
83900000, // Needed on level 54
84925000, // Needed on level 55
85950000, // Needed on level 56
86975000, // Needed on level 57
871000000, // Needed on level 58
881500000, // Needed on level 59
892000000, // Needed on level 60
90}; // Needed Xp on each Levels
91
92public plugin_natives()
93{
94 register_native("zp_get_user_level", "GET_LEVEL", 1)
95 register_native("zp_set_user_level", "SET_LEVEL", 1)
96 register_native("zp_get_user_xp", "GET_XP", 1)
97 register_native("zp_set_user_xp", "SET_XP", 1)
98}
99
100public GET_LEVEL(id)
101{
102 return Level[id];
103}
104
105public SET_XP(id, amount)
106{
107 XP[id] = amount
108}
109
110public GET_XP(id)
111{
112 return XP[id];
113}
114
115public SET_LEVEL(id, amount)
116{
117 Level[id] = amount
118}
119
120public fw_PlayerPreThink(id)
121{
122 if(Level[id] < MAXLEVEL-1)
123 {
124 while(XP[id] >= LEVELS[Level[id]])
125 {
126 XP[id] = 0
127 Level[id]++
128 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenFade" ), {0,0,0}, id)
129 write_short(DUARATION * 4096) // Duration
130 write_short(HOLD * 4096) // Hold time
131 write_short(FFADE_OUT) // Fade type
132 write_byte (random(256)) // Red
133 write_byte (random(256)) // Green
134 write_byte (random(256)) // Blue
135 write_byte (DENSITY) // Alpha
136 message_end()
137 }
138 }
139}
140public plugin_init()
141{
142 register_plugin("[ZP] Addons: Level & XP System", "5.0", "JaCk")
143 register_event("DeathMsg", "event_DeathMsg", "a")
144 save_type = register_cvar("levels_savetype","0") // 0= Nvault .. 1= MySql
145 savexp = register_cvar("levels_save", "1") // 0= IP..1= Steamid..2= Name
146 mysqlx_host = register_cvar ("levels_host", ""); // The host from the db
147 mysqlx_user = register_cvar ("levels_user", ""); // The username from the db login
148 mysqlx_pass = register_cvar ("levels_pass", ""); // The password from the db login
149 mysqlx_db = register_cvar ("levels_dbname", ""); // The database name
150}
151
152public plugin_cfg()
153{
154 g_Vault = nvault_open( "ZR_levels" ); // Nvault file name
155
156 if ( g_Vault == INVALID_HANDLE )
157 set_fail_state( "Error opening levels nVault, file does not exist!" );
158}
159
160public plugin_precache()
161{
162 precache_sound(level_up)
163}
164
165public plugin_end()
166{
167 nvault_close( g_Vault );
168}
169
170public client_connect(id)
171{
172 LoadLevel(id)
173}
174
175public client_disconnect(id)
176{
177 SaveLevel(id)
178
179 XP[id] = 0
180 Level[id] = 0
181}
182
183public on_damage(id)
184{
185 static attacker,damage;
186
187 if ((damage >= 1400) && is_user_connected(attacker) && (!(zp_get_user_zombie(attacker))) && (attacker != id))
188 {
189 XP[attacker] += 2
190 set_hudmessage(random_num(0, 255), random_num(0, 255), random_num(0, 255), -1.0, 0.7, 0, 3.0, 8.0, 0.5, 0.5)
191 show_hudmessage(attacker, "+2 XP")
192 fw_PlayerPreThink(id)
193 }
194}
195
196public zp_user_infected_post(id, infector)
197{
198 if(is_user_alive(infector) && infector != id)
199 {
200 XP[infector] += 2
201 fw_PlayerPreThink(infector)
202 }
203}
204
205public zp_round_ended(iTeam)
206{
207 new iPlayers[MAXPLAYERS], iPlayerCount, i, player
208 get_players(iPlayers, iPlayerCount, "ac")
209 player = iPlayers[i]
210 switch(iTeam)
211 {
212 case WIN_ZOMBIES:
213 {
214 for(i = 0; i < iPlayerCount; i++)
215 {
216 if(zp_get_user_zombie(player))
217 {
218 XP[player] += 4
219 fw_PlayerPreThink(player)
220 }
221 }
222 }
223 case WIN_HUMANS:
224 {
225 for(i = 0; i < iPlayerCount; i++)
226 {
227 if(!zp_get_user_zombie(player))
228 {
229 XP[player] += 4
230 fw_PlayerPreThink(player)
231 }
232 }
233 }
234 case WIN_NO_ONE:
235 {
236 for(i = 0; i < iPlayerCount; i++)
237 {
238 if((zp_get_user_zombie(player)) || (!(zp_get_user_zombie(player))))
239 {
240 XP[player] += 2
241 fw_PlayerPreThink(player)
242 }
243 }
244 }
245 }
246}
247
248public event_DeathMsg()
249{
250 new iKiller; iKiller = read_data(1)
251 new iVictim; iVictim = read_data(2)
252 new iIsHeadshot; iIsHeadshot = read_data(3)
253
254 if(iVictim == iKiller || !is_user_alive(iKiller))
255 return
256
257 if(!zp_get_user_zombie(iKiller) || zp_get_user_survivor(iKiller))
258 {
259 if(zp_get_user_nemesis(iVictim))
260 {
261 XP[iKiller] += 30
262 fw_PlayerPreThink(iKiller)
263 fw_PlayerPreThink(iVictim)
264 }
265 else
266 {
267 if(iIsHeadshot)
268 {
269 g_bKilledZombie[iKiller][iVictim] = true
270 XP[iKiller] += 5
271 fw_PlayerPreThink(iKiller)
272 }
273 else
274 {
275 g_bKilledZombie[iKiller][iVictim] = true
276 XP[iKiller] += 2
277 fw_PlayerPreThink(iKiller)
278 }
279 }
280 }
281
282 else if(zp_get_user_zombie(iKiller) || zp_get_user_nemesis(iKiller))
283 {
284 if(zp_get_user_survivor(iVictim))
285 {
286 XP[iKiller] += 30
287 fw_PlayerPreThink(iKiller)
288 }
289 else
290 {
291 XP[iKiller] += 2
292 fw_PlayerPreThink(iKiller)
293 }
294 }
295}
296
297SaveLevel(id)
298{
299 new szAuth[33];
300 new szKey[64];
301
302 if ( get_pcvar_num(savexp) == 0 )
303 {
304 get_user_ip( id, szAuth , charsmax(szAuth), 1);
305 formatex( szKey , 63 , "%s-IP" , szAuth);
306 }
307 else if ( get_pcvar_num(savexp) == 1 )
308 {
309 get_user_authid( id , szAuth , charsmax(szAuth) );
310 formatex( szKey , 63 , "%s-ID" , szAuth);
311 }
312 else if ( get_pcvar_num(savexp) == 2 )
313 {
314 get_user_name( id, szAuth , charsmax(szAuth) );
315 formatex( szKey , 63 , "%s-NAME" , szAuth);
316 }
317
318 if ( !get_pcvar_num(save_type) )
319 {
320 new szData[256];
321
322 formatex( szData , 255 , "%i#%i#" , Level[id], XP[id] );
323
324 nvault_set( g_Vault , szKey , szData );
325 }
326 else
327 {
328 static szQuery[ 128 ];
329
330 formatex( szQuery, 127, "REPLACE INTO `mytable` (`player_id`, `player_level`, `player_xp`) VALUES ('%s', '%d', '%d');", szAuth , Level[id], XP[id] );
331
332 SQL_ThreadQuery( g_hTuple, "QuerySetData", szQuery);
333 }
334}
335
336LoadLevel(id)
337{
338 new szAuth[33];
339 new szKey[40];
340
341 if ( get_pcvar_num(savexp) == 0 )
342 {
343 get_user_ip( id, szAuth , charsmax(szAuth), 1);
344 formatex( szKey , 63 , "%s-IP" , szAuth);
345 }
346 else if ( get_pcvar_num(savexp) == 1 )
347 {
348 get_user_authid( id , szAuth , charsmax(szAuth) );
349 formatex( szKey , 63 , "%s-ID" , szAuth);
350 }
351 else if ( get_pcvar_num(savexp) == 2 )
352 {
353 get_user_name( id, szAuth , charsmax(szAuth) );
354 formatex( szKey , 63 , "%s-NAME" , szAuth);
355 }
356
357 if ( !get_pcvar_num(save_type) )
358 {
359 new szData[256];
360
361 formatex(szData , 255, "%i#%i#", Level[id], XP[id])
362
363 nvault_get(g_Vault, szKey, szData, 255)
364
365 replace_all(szData , 255, "#", " ")
366 new xp[32], level[32]
367 parse(szData, level, 31, xp, 31)
368 Level[id] = str_to_num(level)
369 XP[id] = str_to_num(xp)
370 }
371 else
372 {
373 static szQuery[ 128 ], iData[ 1 ];
374 formatex( szQuery, 127, "SELECT `player_level`, `player_xp` FROM `mytable` WHERE ( `player_id` = '%s' );", szAuth );
375
376 iData[ 0 ] = id;
377 SQL_ThreadQuery( g_hTuple, "QuerySelectData", szQuery, iData, 1 );
378 }
379}
380
381public QuerySelectData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
382{
383 if( iFailState == TQUERY_CONNECT_FAILED
384 || iFailState == TQUERY_QUERY_FAILED )
385 {
386 log_amx( "%s", szError );
387
388 return;
389 }
390 else
391 {
392 new id = iData[ 0 ];
393
394 new ColLevel = SQL_FieldNameToNum(hQuery, "player_level")
395 new ColXp = SQL_FieldNameToNum(hQuery, "player_xp")
396
397 while (SQL_MoreResults(hQuery))
398 {
399 Level[id] = SQL_ReadResult(hQuery, ColLevel);
400 XP[id] = SQL_ReadResult(hQuery, ColXp);
401
402 SQL_NextRow(hQuery)
403 }
404 }
405}
406
407public QuerySetData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
408{
409 if( iFailState == TQUERY_CONNECT_FAILED
410 || iFailState == TQUERY_QUERY_FAILED )
411 {
412 log_amx( "%s", szError );
413
414 return;
415 }
416}
417
418public MySQLx_Init()
419{
420 if (!get_pcvar_num(save_type))
421 return;
422
423 new szHost[64], szUser[32], szPass[32], szDB[128];
424
425 get_pcvar_string( mysqlx_host, szHost, charsmax( szHost ) );
426 get_pcvar_string( mysqlx_user, szUser, charsmax( szUser ) );
427 get_pcvar_string( mysqlx_pass, szPass, charsmax( szPass ) );
428 get_pcvar_string( mysqlx_db, szDB, charsmax( szDB ) );
429
430 g_hTuple = SQL_MakeDbTuple( szHost, szUser, szPass, szDB );
431
432 for ( new i = 0; i < sizeof szTables; i++ )
433 {
434 SQL_ThreadQuery( g_hTuple, "QueryCreateTable", szTables[i])
435 }
436}
437
438public QueryCreateTable( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
439{
440 if( iFailState == TQUERY_CONNECT_FAILED
441 || iFailState == TQUERY_QUERY_FAILED )
442 {
443 log_amx( "%s", szError );
444
445 return;
446 }
447}
448
449stock client_print_color(const id, const input[], any:...)
450{
451 new count = 1, players[32];
452 static msg[191];
453 vformat(msg, 190, input, 3);
454
455 replace_all(msg, 190, "!g", "^x04"); // Green Color
456 replace_all(msg, 190, "!y", "^x01"); // Default Color
457 replace_all(msg, 190, "!t", "^x03"); // Team Color
458
459 if (id) players[0] = id; else get_players(players, count, "ch");
460 {
461 for (new i = 0; i < count; i++)
462 {
463 if (is_user_connected(players[i]))
464 {
465 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
466 write_byte(players[i]);
467 write_string(msg);
468 message_end();
469 }
470 }
471 }
472}