· 9 years ago · Oct 03, 2016, 03:24 PM
1#include <amxmodx>
2#include <amxmisc>
3#include <cstrike>
4#include <zombieplague>
5
6#include <nvault_util>
7#include <nvault>
8#include <sqlx>
9
10#define TAG "ZP" // Change the tag from here ... MUST BE BETWEEN ""
11#define MAXPLAYERS 32
12#define MAXLEVELS 30 // EDIT MAX LEVELS
13#define DUARATION 1
14#define HOLD 3
15#define FFADE_IN 0x0000
16#define FFADE_OUT 0x0001
17#define DENSITY 150
18new const level_up [] = "zombie_plague/zp_LEVEL_UP.mp3" // EDIT SOUND
19new Level[33], XP[33]
20new savexp, g_Vault
21new g_msgSayText, g_MsgScreenFade
22new Handle:g_hTuple;
23new mysqlx_host, mysqlx_user, mysqlx_db, mysqlx_pass
24new save_type
25new const szTables[][] =
26{
27 "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;"
28}
29
30public plugin_natives()
31{
32 register_native("zp_get_user_level", "GET_LEVEL", 1)
33 register_native("zp_set_user_level", "SET_LEVEL", 1)
34 register_native("zp_get_user_xp", "GET_XP", 1)
35 register_native("zp_set_user_xp", "SET_XP", 1)
36}
37public GET_LEVEL(id)
38{
39 return Level[id];
40}
41public SET_XP(id, amount)
42{
43 return XP[id] = amount
44}
45public GET_XP(id)
46{
47 return XP[id];
48}
49public SET_LEVEL(id, amount)
50{
51 return Level[id] = amount
52}
53public fw_PlayerPreThink(id)
54{
55 if(XP[id] >= 100)
56 {
57 XP[id] = 0
58 Level[id] += 1
59 }
60}
61public client_death(killer,victim,weapon,hitplace,TK)
62{
63 XP[killer] += 1
64}
65public plugin_init()
66{
67 register_plugin("[ZP] Best Level & XP System Ever", "1.0", "JaCk")
68
69 register_clcmd("say /info", "show_xp")
70
71 register_event("DeathMsg", "event_DeathMsg", "a")
72 register_event("Damage", "on_damage", "b", "2!0", "3=0", "4!0")
73
74 save_type = register_cvar("levels_savetype","0") // 0= Nvault .. 1= MySql
75 savexp = register_cvar("levels_save", "1") // 0= IP..1= Steamid..2= Name
76
77 g_msgSayText = get_user_msgid("SayText")
78 g_MsgScreenFade = get_user_msgid( "ScreenFade" )
79
80 register_clcmd("say", "custom_say")
81 register_clcmd("say_team", "custom_say_team")
82 g_msgSayText = get_user_msgid("SayText")
83 register_message(g_msgSayText, "message_SayText")
84
85 mysqlx_host = register_cvar ("levels_host", ""); // The host from the db
86 mysqlx_user = register_cvar ("levels_user", ""); // The username from the db login
87 mysqlx_pass = register_cvar ("levels_pass", ""); // The password from the db login
88 mysqlx_db = register_cvar ("levels_dbname", ""); // The database name
89}
90
91public plugin_cfg()
92{
93 g_Vault = nvault_open( "levels" ); // Ncault file name
94
95 if ( g_Vault == INVALID_HANDLE )
96 set_fail_state( "Error opening levels nVault, file does not exist!" );
97}
98
99public plugin_precache()
100{
101 precache_sound(level_up)
102}
103
104public plugin_end()
105{
106 nvault_close( g_Vault );
107}
108
109public client_connect(id)
110{
111 LoadLevel(id)
112
113 new szName[32]
114 get_user_name(id, szName, charsmax(szName))
115
116 client_print_color(0, "!y[!g%s!y] !t%s !gwhose level !t%i !gconnected!y.", TAG, szName, Level[id]) // EDIT CONNECT MESSAGE
117}
118
119public client_disconnect(id)
120{
121 SaveLevel(id)
122
123 XP[id] = 0
124 Level[id] = 0
125}
126/*=========SCREEN FADE EFFECT=========*/
127public Screen_Fade(id)
128{
129 message_begin(MSG_ONE_UNRELIABLE, g_MsgScreenFade, {0,0,0}, id)
130 write_short(DUARATION * 4096) // Duration
131 write_short(HOLD * 4096) // Hold time
132 write_short(FFADE_OUT) // Fade type
133 write_byte (random(256)) // Red
134 write_byte (random(256)) // Green
135 write_byte (random(256)) // Blue
136 write_byte (DENSITY) // Alpha
137 message_end()
138}
139/*==========LEVEL TAG !!!!!!!!!=================*/
140public custom_say(id)
141{
142 new szMessage[192], szName[32]
143
144 read_args(szMessage, charsmax(szMessage))
145 remove_quotes(szMessage)
146 get_user_name(id, szName, charsmax(szName))
147
148 if(equali(szMessage[0], " ") || equali(szMessage[0], "") || !is_valid_msg(szMessage))
149 return PLUGIN_HANDLED_MAIN
150
151 if(is_user_alive(id))
152 {
153 format(szMessage, charsmax(szMessage), "^1[^4LEVEL ^3%i^1] ^3%s ^1: %s", Level[id], szName, szMessage)
154 }
155 else
156 {
157 format(szMessage, charsmax(szMessage), "^1*DEAD* [^4LEVEL ^3%i^1] ^3%s ^1: %s", Level[id], szName, szMessage)
158 }
159
160 new iPlayers[MAXPLAYERS], iPlayerCount, i, player
161 get_players(iPlayers, iPlayerCount, "ch")
162 for(i = 0; i < iPlayerCount; i++)
163 {
164 player = iPlayers[i]
165 if(is_user_alive(id) && is_user_alive(player) || !is_user_alive(id) && !is_user_alive(player))
166 {
167 message_begin(MSG_ONE, g_msgSayText, {0, 0, 0}, player)
168 write_byte(id)
169 write_string(szMessage)
170 message_end()
171 }
172 }
173
174 return PLUGIN_CONTINUE
175}
176
177public custom_say_team(id)
178{
179 new szMessage[192], szName[32]
180
181 read_args(szMessage, charsmax(szMessage))
182 remove_quotes(szMessage)
183 get_user_name(id, szName, charsmax(szName))
184
185 if(equali(szMessage[0], " ") || equali(szMessage[0], "") || !is_valid_msg(szMessage))
186 return PLUGIN_HANDLED_MAIN
187
188 if(is_user_alive(id))
189 {
190 format(szMessage, charsmax(szMessage), "^1[^4LEVEL ^3%i^1] ^3%s ^1: %s", Level[id], szName, szMessage)
191 }
192 else
193 {
194 format(szMessage, charsmax(szMessage), "^1*DEAD* [^4LEVEL ^3%i^1] ^3%s ^1: %s", Level[id], szName, szMessage)
195 }
196
197 new iPlayers[MAXPLAYERS], iPlayerCount, i, player
198 get_players(iPlayers, iPlayerCount, "ch")
199 for(i = 0; i < iPlayerCount; i++)
200 {
201 player = iPlayers[i]
202 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))
203 {
204 message_begin(MSG_ONE, g_msgSayText, {0, 0, 0}, player)
205 write_byte(id)
206 write_string(szMessage)
207 message_end()
208 }
209 }
210
211 return PLUGIN_CONTINUE
212}
213
214public message_SayText(id)
215{
216 return PLUGIN_HANDLED
217}
218
219bool:is_valid_msg(const szMessage[])
220{
221 if(szMessage[0] == '@' || szMessage[0] == '/' || szMessage[0] == '!' || !strlen(szMessage))
222 return false
223
224 return true
225}
226/*===============STOCKS !!!===========*/
227/*=========SAVES THE LEVEL OF THE PLAYER=========*/
228SaveLevel(id)
229{
230 new szAuth[33];
231 new szKey[64];
232
233 if ( get_pcvar_num(savexp) == 0 )
234 {
235 get_user_ip( id, szAuth , charsmax(szAuth), 1);
236 formatex( szKey , 63 , "%s-IP" , szAuth);
237 }
238 else if ( get_pcvar_num(savexp) == 1 )
239 {
240 get_user_authid( id , szAuth , charsmax(szAuth) );
241 formatex( szKey , 63 , "%s-ID" , szAuth);
242 }
243 else if ( get_pcvar_num(savexp) == 2 )
244 {
245 get_user_name( id, szAuth , charsmax(szAuth) );
246 formatex( szKey , 63 , "%s-NAME" , szAuth);
247 }
248
249 if ( !get_pcvar_num(save_type) )
250 {
251 new szData[256];
252
253 formatex( szData , 255 , "%i#%i#" , Level[id], XP[id] );
254
255 nvault_set( g_Vault , szKey , szData );
256 }
257 else
258 {
259 static szQuery[ 128 ];
260
261 formatex( szQuery, 127, "REPLACE INTO `mytable` (`player_id`, `player_level`, `player_xp`) VALUES ('%s', '%d', '%d');", szAuth , Level[id], XP[id] );
262
263 SQL_ThreadQuery( g_hTuple, "QuerySetData", szQuery);
264 }
265}
266/*======LOAD LEVEL OF THE PLAYERS========*/
267LoadLevel(id)
268{
269 new szAuth[33];
270 new szKey[40];
271
272 if ( get_pcvar_num(savexp) == 0 )
273 {
274 get_user_ip( id, szAuth , charsmax(szAuth), 1);
275 formatex( szKey , 63 , "%s-IP" , szAuth);
276 }
277 else if ( get_pcvar_num(savexp) == 1 )
278 {
279 get_user_authid( id , szAuth , charsmax(szAuth) );
280 formatex( szKey , 63 , "%s-ID" , szAuth);
281 }
282 else if ( get_pcvar_num(savexp) == 2 )
283 {
284 get_user_name( id, szAuth , charsmax(szAuth) );
285 formatex( szKey , 63 , "%s-NAME" , szAuth);
286 }
287
288 if ( !get_pcvar_num(save_type) )
289 {
290 new szData[256];
291
292 formatex(szData , 255, "%i#%i#", Level[id], XP[id])
293
294 nvault_get(g_Vault, szKey, szData, 255)
295
296 replace_all(szData , 255, "#", " ")
297 new xp[32], level[32]
298 parse(szData, level, 31, xp, 31)
299 Level[id] = str_to_num(level)
300 XP[id] = str_to_num(xp)
301 }
302 else
303 {
304 static szQuery[ 128 ], iData[ 1 ];
305 formatex( szQuery, 127, "SELECT `player_level`, `player_xp` FROM `mytable` WHERE ( `player_id` = '%s' );", szAuth );
306
307 iData[ 0 ] = id;
308 SQL_ThreadQuery( g_hTuple, "QuerySelectData", szQuery, iData, 1 );
309 }
310}
311
312public QuerySelectData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
313{
314 if( iFailState == TQUERY_CONNECT_FAILED
315 || iFailState == TQUERY_QUERY_FAILED )
316 {
317 log_amx( "%s", szError );
318
319 return;
320 }
321 else
322 {
323 new id = iData[ 0 ];
324
325 new ColLevel = SQL_FieldNameToNum(hQuery, "player_level")
326 new ColXp = SQL_FieldNameToNum(hQuery, "player_xp")
327
328 while (SQL_MoreResults(hQuery))
329 {
330 Level[id] = SQL_ReadResult(hQuery, ColLevel);
331 XP[id] = SQL_ReadResult(hQuery, ColXp);
332
333 SQL_NextRow(hQuery)
334 }
335 }
336}
337
338public QuerySetData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
339{
340 if( iFailState == TQUERY_CONNECT_FAILED
341 || iFailState == TQUERY_QUERY_FAILED )
342 {
343 log_amx( "%s", szError );
344
345 return;
346 }
347}
348
349public MySQLx_Init()
350{
351 if (!get_pcvar_num(save_type))
352 return;
353
354 new szHost[64], szUser[32], szPass[32], szDB[128];
355
356 get_pcvar_string( mysqlx_host, szHost, charsmax( szHost ) );
357 get_pcvar_string( mysqlx_user, szUser, charsmax( szUser ) );
358 get_pcvar_string( mysqlx_pass, szPass, charsmax( szPass ) );
359 get_pcvar_string( mysqlx_db, szDB, charsmax( szDB ) );
360
361 g_hTuple = SQL_MakeDbTuple( szHost, szUser, szPass, szDB );
362
363 for ( new i = 0; i < sizeof szTables; i++ )
364 {
365 SQL_ThreadQuery( g_hTuple, "QueryCreateTable", szTables[i])
366 }
367}
368
369public QueryCreateTable( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
370{
371 if( iFailState == TQUERY_CONNECT_FAILED
372 || iFailState == TQUERY_QUERY_FAILED )
373 {
374 log_amx( "%s", szError );
375
376 return;
377 }
378}
379
380stock client_print_color(const id, const input[], any:...)
381{
382 new count = 1, players[32];
383 static msg[191];
384 vformat(msg, 190, input, 3);
385
386 replace_all(msg, 190, "!g", "^x04"); // Green Color
387 replace_all(msg, 190, "!y", "^x01"); // Default Color
388 replace_all(msg, 190, "!t", "^x03"); // Team Color
389
390 if (id) players[0] = id; else get_players(players, count, "ch");
391 {
392 for (new i = 0; i < count; i++)
393 {
394 if (is_user_connected(players[i]))
395 {
396 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
397 write_byte(players[i]);
398 write_string(msg);
399 message_end();
400 }
401 }
402 }
403}