· 8 years ago · Mar 24, 2018, 04:24 PM
1#include <amxmodx>
2#include <amxmisc>
3#include <zombieplague>
4#include <sqlx>
5#include <hamsandwich>
6
7
8new c_SqlHost
9new c_SqlUser
10new c_SqlPass
11new c_SqlDB
12new c_SqlType
13
14enum _: UserStats {
15 g_zh_kill,
16 g_ms_round,
17 g_zt_infect,
18 g_nh_kill,
19 g_hh_kill,
20 g_total_dmg,
21 g_grenade,
22};
23new User [ 33 ] [ UserStats ];
24new g_Error[512]
25
26#define ZH_MAX_KILL 500
27#define MS_MAX_ROUND 500
28#define ZT_MAX_INFECT 500
29#define NH_MAX_KILL 100
30#define HH_MAX_KILL 100
31#define TOTAL_DAMAGE 9999999
32#define GRENADE 100
33
34new Handle:g_SqlTuple
35
36public plugin_init()
37{
38 register_plugin("ZP Ammo Saving", "1.0.5", "wbyokomo")
39
40 register_event("DeathMsg", "event_death", "a")
41 register_logevent("event_round_end", 2, "1=Round_End")
42 register_event("TextMsg","event_round_end","a","2=#Game_Commencing","2=#Game_will_restart_in")
43
44 register_clcmd("say /achievement", "show_medal")
45 register_clcmd("ach", "show_medal")
46 RegisterHam(Ham_TakeDamage, "player", "HAM_TakeDamage", 1);
47 c_SqlHost = register_cvar( "zp_ammo_bank_host", "linuxclub.ro" )
48 c_SqlUser = register_cvar( "zp_ammo_bank_user", "darkcs_zm" )
49 c_SqlPass = register_cvar( "zp_ammo_bank_pass", "s" )
50 c_SqlDB = register_cvar( "zp_ammo_bank_db", "darkcs_zm" )
51 c_SqlType = register_cvar( "zp_ammo_bank_type", "mysql" )
52
53 if( !_PrepareSQL() )
54 {
55 set_fail_state( "[ZP Ammo Bank] Fail to prepare SQL" )
56 return;
57 }
58}
59public show_medal(id)
60{
61 static menu
62 menu = menu_create("Achievement", "medal_menu_handle1")
63
64 add_zombie_hunter(id, menu)
65 add_master_survival(id, menu)
66 add_zombie_terminator(id, menu)
67 add_nemesis_hunter(id, menu)
68 add_hero_hunter(id, menu)
69 add_total_damage(id, menu)
70 add_grenade(id, menu)
71
72 menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
73 menu_display(id, menu, 0)
74}
75public zp_user_infected_post(victim, attacker)
76{
77 if(is_user_alive(attacker) && zp_get_user_zombie(attacker))
78 {
79 if(User [ attacker ] [ g_zt_infect ] < ZT_MAX_INFECT)
80 {
81 User [ attacker ] [ g_zt_infect ]++
82
83 if(User [ attacker ] [ g_zt_infect ] >= ZT_MAX_INFECT)
84 {
85 static Name[64]
86 get_user_name(attacker, Name, sizeof(Name))
87 client_printcolor(attacker, "!g[ZP Achievement]!n Felicitari ! !g%s!n ai deblocat realizarea !gZombie Terminator", Name)
88 }
89 }
90 }
91}
92public event_death()
93{
94 static attacker, victim
95 attacker = read_data(1)
96 victim = read_data(2)
97 static Name[64]
98 get_user_name(attacker, Name, sizeof(Name))
99 if(zp_get_user_zombie(victim) && !zp_get_user_zombie(attacker))
100 {
101 if(User [ attacker ] [ g_zh_kill ] < ZH_MAX_KILL)
102 {
103 User [ attacker ] [ g_zh_kill ]++
104
105 if(User [ attacker ] [ g_zh_kill ] >= ZH_MAX_KILL)
106 {
107 client_printcolor(attacker, "!g[ZP Achievement]!n Felicitari! !g%s!n ai deblocat realizarea !gZombie Hunter", Name)
108 }
109
110 }
111 } else if(zp_get_user_nemesis(victim) && !zp_get_user_zombie(attacker) && !zp_get_user_nemesis(attacker)) {
112 if(User [ attacker ] [ g_nh_kill ] < NH_MAX_KILL)
113 {
114 User [ attacker ] [ g_nh_kill ]++
115
116 if(User [ attacker ] [ g_nh_kill ] >= NH_MAX_KILL)
117 {
118 client_printcolor(attacker, "!g[ZP Achievement]!n Felicitari! !g%s!n ai deblocat realizarea !gNemesis Hunter", Name)
119 }
120
121 }
122 } else if(zp_get_user_survivor(victim) && zp_get_user_zombie(attacker) || zp_get_user_nemesis(attacker)) {
123 if(User [ attacker ] [ g_hh_kill ] < HH_MAX_KILL)
124 {
125 User [ attacker ] [ g_hh_kill ]++
126
127 if(User [ attacker ] [ g_hh_kill ] >= HH_MAX_KILL)
128 {
129 client_printcolor(attacker, "!g[ZP Achievement]!n Felicitari! !g%s!n ai deblocat realizarea !gHero Hunter", Name)
130 }
131 }
132 }
133 if( (get_user_weapon( attacker ) == CSW_HEGRENADE ) && !zp_get_user_zombie(victim))
134 {
135 if(User [ attacker ] [ g_grenade ] < GRENADE )
136 {
137 User [ attacker ] [ g_grenade ]++
138
139 if(User [ attacker ] [ g_grenade ] >= GRENADE)
140 {
141 client_printcolor(attacker, "!g[ZP Achievement]!n Felicitari! !g%s!n ai deblocat realizarea !gDeadly Grenade", Name)
142 }
143
144 }
145 }
146}
147public event_round_end(id)
148{
149 static attacker, victim
150 attacker = read_data(1)
151 victim = read_data(2)
152 if(is_user_alive(attacker) && !zp_get_user_zombie(attacker))
153 {
154 if(User [ attacker ][g_ms_round] < MS_MAX_ROUND)
155 {
156 User [ attacker ][g_ms_round]++
157
158 if(User [ attacker ][g_ms_round] >= MS_MAX_ROUND)
159 {
160 static Name[64]
161 get_user_name(id, Name, sizeof(Name))
162
163 client_printcolor(0, "[ZP Achievement] Felicitari! %s ai deblocat realizarea !gMaster Of Survival", Name)
164 }
165 }
166 }
167}
168public add_zombie_hunter(id, menu)
169{
170 static temp_string[128]
171
172 if(User [ id ] [ g_zh_kill ] < ZH_MAX_KILL)
173 formatex(temp_string, sizeof(temp_string), "\wZombie Hunter \r%i/%i", User [ id ] [ g_zh_kill ], ZH_MAX_KILL)
174 else
175 formatex(temp_string, sizeof(temp_string), "\wZombie Hunter \dComplete")
176 menu_additem(menu, temp_string, "\y0")
177}
178
179public add_master_survival(id, menu)
180{
181 static temp_string[128]
182
183 if(User [ id ] [ g_ms_round ] < MS_MAX_ROUND)
184 formatex(temp_string, sizeof(temp_string), "\wMaster Of Survival \r%i/%i", User [ id ] [ g_ms_round ] , MS_MAX_ROUND)
185 else
186 formatex(temp_string, sizeof(temp_string), "\wMaster Of Survival \dComplete")
187 menu_additem(menu, temp_string, "\y1")
188}
189
190public add_zombie_terminator(id, menu)
191{
192 static temp_string[128]
193
194 if(User [ id ] [ g_zt_infect] < ZT_MAX_INFECT)
195 formatex(temp_string, sizeof(temp_string), "\wZombie Terminator \r%i/%i", User [ id ] [ g_zt_infect], ZT_MAX_INFECT)
196 else
197 formatex(temp_string, sizeof(temp_string), "\wZombie Terminator \dComplete")
198 menu_additem(menu, temp_string, "\y2")
199}
200public add_nemesis_hunter(id, menu)
201{
202 static temp_string[128]
203
204 if(User [ id ] [ g_nh_kill] < NH_MAX_KILL)
205 formatex(temp_string, sizeof(temp_string), "\wNemesis Hunter \r%i/%i", User [ id ] [ g_nh_kill], NH_MAX_KILL)
206 else
207 formatex(temp_string, sizeof(temp_string), "\wNemesis Hunter \dComplete")
208 menu_additem(menu, temp_string, "\y3")
209}
210public add_hero_hunter(id, menu)
211{
212 static temp_string[128]
213
214 if(User [ id ] [ g_hh_kill] < HH_MAX_KILL)
215 formatex(temp_string, sizeof(temp_string), "\wHero Hunter \r%i/%i", User [ id ] [ g_hh_kill], HH_MAX_KILL)
216 else
217 formatex(temp_string, sizeof(temp_string), "\wHero Hunter \dComplete")
218 menu_additem(menu, temp_string, "\y4")
219}
220
221public add_total_damage(id, menu)
222{
223 static temp_string[128]
224
225 if(User [ id ] [ g_total_dmg] < TOTAL_DAMAGE)
226 formatex(temp_string, sizeof(temp_string), "\wAgresive Hunter \r%i/%i", User [ id ] [ g_total_dmg], TOTAL_DAMAGE)
227 else
228 formatex(temp_string, sizeof(temp_string), "\wAgresive Hunter \dComplete")
229 menu_additem(menu, temp_string, "\y5")
230}
231public add_grenade(id, menu)
232{
233 static temp_string[128]
234
235 if(User [ id ] [ g_grenade] < GRENADE )
236 formatex(temp_string, sizeof(temp_string), "\wDeadly Grenade \r%i/%i", User [ id ] [ g_grenade], GRENADE)
237 else
238 formatex(temp_string, sizeof(temp_string), "\wDeadly Grenade \dComplete")
239 menu_additem(menu, temp_string, "\y6")
240}
241public medal_menu_handle1(id, menu, item)
242{
243 if(item == MENU_EXIT)
244 {
245 menu_destroy(menu)
246 return PLUGIN_HANDLED
247 }
248
249 static data[6], szName[64], access1, callback
250
251 menu_item_getinfo(menu, item, access1, data,charsmax(data), szName,charsmax(szName), callback)
252
253 static key_number
254 key_number = str_to_num(data)
255
256 switch(key_number)
257 {
258 case 0:
259 {
260 if(User [ id ] [ g_zh_kill] < ZH_MAX_KILL)
261 client_printcolor(id, "!g[ZP Achievement!n Trebuie sa omori !g%i!n zombi pentru a debloca realizarea !gZombie Hunter!", ZH_MAX_KILL)
262 else
263 client_printcolor(id, "!g[ZP Achievement!n Ai deblocat realizarea !gZombie Hunter!")
264 }
265 case 1:
266 {
267 if(User [ id ] [ g_ms_round] < MS_MAX_ROUND)
268 client_printcolor(id, "!g[ZP Achievement!n Trebuie sa supravietuiesti !g%i!n runde pentru a debloca realizarea!gMaster Of Survival!", MS_MAX_ROUND)
269 else
270 client_printcolor(id, "!g[ZP Achievement!n Ai deblocat realizarea !gMaster Of Survival!")
271 }
272 case 2:
273 {
274 if(User [ id ] [ g_zt_infect] < ZT_MAX_INFECT)
275 client_printcolor(id, "!g[ZP Achievement!n Trebuie sa infectezi !g%i!n oameni pentru a debloca realizarea !gZombie Terminator!", ZT_MAX_INFECT)
276 else
277 client_printcolor(id, "!g[ZP Achievement!n Ai deblocat realizarea !gZombie Terminator!")
278 }
279 case 3:
280 {
281 if(User [ id ] [ g_nh_kill] < NH_MAX_KILL)
282 client_printcolor(id, "!g[ZP Achievement!n Trebuie sa omori !g%i!n nemesis pentru a debloca realizarea !gNemesis Hunter!", NH_MAX_KILL)
283 else
284 client_printcolor(id, "!g[ZP Achievement!n Ai deblocat realizarea !gNemesis Hunter!")
285 }
286 case 4:
287 {
288 if(User [ id ] [ g_hh_kill] < HH_MAX_KILL)
289 client_printcolor(id, "!g[ZP Achievement!n Trebuie sa omori !g%i!n eroi pentru a debloca realizarea !gHero Hunter!", HH_MAX_KILL)
290 else
291 client_printcolor(id, "!g[ZP Achievement!n Ai deblocat realizarea !gHero Hunter!")
292 }
293 case 5:
294 {
295 if(User [ id ] [ g_total_dmg] < TOTAL_DAMAGE)
296 client_printcolor(id, "!g[ZP Achievement!n Trebuie sa omori !g%i!n eroi pentru a debloca realizarea !gHero Hunter!", HH_MAX_KILL)
297 else
298 client_printcolor(id, "!g[ZP Achievement!n Ai deblocat realizarea !gAgresive Hunter!")
299 }
300 case 6:
301 {
302 if(User [ id ] [ g_grenade] < GRENADE)
303 client_printcolor(id, "!g[ZP Achievement!n Trebuie sa omori !g%i!n eroi pentru a debloca realizarea !gDeadly Grenade!", HH_MAX_KILL)
304 else
305 client_printcolor(id, "!g[ZP Achievement!n Ai deblocat realizarea !gDeadly Grenade!")
306 }
307 }
308
309 return PLUGIN_HANDLED
310}
311public client_putinserver(id)
312{
313 _LoadSQL(id)
314}
315
316public client_disconnect(id)
317{
318 _SaveSQL(id)
319}
320
321public HAM_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type) {
322 if (victim == attacker || !is_user_alive(attacker) || !is_user_connected(victim))
323 return HAM_IGNORED;
324
325 if ( User[ attacker ] [ g_total_dmg ] < TOTAL_DAMAGE ) User[ attacker ] [ g_total_dmg ] +=floatround(damage)
326
327 return HAM_HANDLED;
328}
329_PrepareSQL() {
330
331 new host[32], user[32], pass[32], db[32], type[12]
332 get_pcvar_string( c_SqlHost, host, charsmax(host) )
333 get_pcvar_string( c_SqlUser, user, charsmax(user) )
334 get_pcvar_string( c_SqlPass, pass, charsmax(pass) )
335 get_pcvar_string( c_SqlDB, db, charsmax(db) )
336 get_pcvar_string( c_SqlType, type, charsmax(type) )
337
338 new get_type[12]
339 SQL_GetAffinity( get_type, charsmax(get_type) )
340
341 log_amx( "[ZP Ammo Bank] SQL affinity type is %s", get_type )
342
343 if( !equali(get_type, type) )
344 {
345 if( !SQL_SetAffinity(type) )
346 {
347 log_amx( "[ZP Ammo Bank] Failed to set affinity from %s to %s", get_type, type )
348 }
349 }
350
351 g_SqlTuple = SQL_MakeDbTuple( host, user, pass, db )
352
353 if( g_SqlTuple == Empty_Handle )
354 {
355 log_amx( "[ZP Ammo Bank] Failed to create SQL tuple." )
356 return 0;
357 }
358
359 new const queryString[] = "CREATE TABLE IF NOT EXISTS `achievement` (\
360 `auth` VARCHAR(64) NOT NULL,\
361 `ZHunter` INT UNSIGNED NOT NULL,\
362 `MOSurvival` INT UNSIGNED NOT NULL,\
363 `ZTerminator` INT UNSIGNED NOT NULL,\
364 `NHunter` INT UNSIGNED NOT NULL,\
365 `HHunter` INT UNSIGNED NOT NULL,\
366 `TDamage` INT UNSIGNED NOT NULL,\
367 `Grenade` INT UNSIGNED NOT NULL,\
368 `last_save` INT UNSIGNED NOT NULL,\
369 PRIMARY KEY (`auth`) );"
370
371 new errcode, error[128];
372 new Handle:link = SQL_Connect( g_SqlTuple, errcode, error, charsmax(error) )
373
374 if( link == Empty_Handle )
375 {
376 log_amx( "[ZP Ammo Bank] Failed to connect to database (%d): %s", errcode, error )
377 return 0;
378 }
379
380 new Handle:query = SQL_PrepareQuery( link, "%s", queryString )
381
382 if( !SQL_Execute(query) )
383 {
384 SQL_QueryError( query, error, charsmax(error) )
385 log_amx( "[ZP Ammo Bank] Error creating table: %s", error )
386
387 return 0;
388 }
389 else
390 {
391 server_print( "[ZP Ammo Bank] SQL table successful create!" )
392 }
393
394 SQL_FreeHandle(query)
395 SQL_FreeHandle(link)
396
397 return 1;
398}
399
400_MakeStringSQLSafe( output[], len ) {
401
402 replace_all( output, len, "'", "*" )
403 replace_all( output, len, "^"", "*" ) //" - fix Sublime Text syntax highlight
404 replace_all( output, len, "`", "*" )
405}
406
407_LoadSQL(id) {
408 new Name[64]
409 get_user_name( id, Name, charsmax(Name) )
410
411 _MakeStringSQLSafe( Name, charsmax(Name) )
412
413 new queryString[512]
414
415 new data[2]
416 data[0] = id
417
418 new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,511)
419 if(SqlConnection == Empty_Handle)
420 set_fail_state(g_Error)
421
422 formatex( queryString, charsmax(queryString), "SELECT ZHunter, MOSurvival, ZTerminator, NHunter, HHunter, TDamage, Grenade FROM achievement WHERE auth = '%s'", Name )
423 new Handle:Query = SQL_PrepareQuery(SqlConnection,queryString)
424
425 if(!SQL_Execute(Query))
426 {
427 SQL_QueryError(Query,g_Error,511)
428 }
429
430 while(SQL_MoreResults(Query))
431 {
432
433 User [ id ] [ g_zh_kill ] = SQL_ReadResult(Query,0);
434 User [ id ] [ g_ms_round ] = SQL_ReadResult(Query,1);
435 User [ id ] [ g_zt_infect ] = SQL_ReadResult(Query,2);
436 User [ id ] [ g_nh_kill ] = SQL_ReadResult(Query,3);
437 User [ id ] [ g_hh_kill ] = SQL_ReadResult(Query,4);
438 User [ id ] [ g_total_dmg ] = SQL_ReadResult(Query,5);
439 User [ id ] [ g_grenade ] = SQL_ReadResult(Query,6);
440 SQL_NextRow(Query)
441 }
442
443 SQL_FreeHandle(Query)
444
445 SQL_FreeHandle(SqlConnection)
446}
447
448_SaveSQL(id) {
449 new data[2]
450 data[0] = id
451
452 new Name[64]
453 get_user_name( id, Name, charsmax(Name) )
454
455 _MakeStringSQLSafe( Name, charsmax(Name) )
456
457 new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,511)
458 if(SqlConnection == Empty_Handle)
459 set_fail_state(g_Error)
460
461 new queryString[ 1024 ];
462
463 formatex( queryString, charsmax(queryString),
464 "INSERT INTO achievement(auth, ZHunter, MOSurvival, ZTerminator, NHunter, HHunter, last_save, TDamage, Grenade) VALUES ('%s',%d,%d,%d,%d,%d,%d,%d,%d) ON DUPLICATE KEY UPDATE auth = VALUES(auth), ZHunter = VALUES(ZHunter), MOSurvival = VALUES(MOSurvival), ZTerminator = VALUES(ZTerminator), NHunter = VALUES(NHunter), HHunter = VALUES(HHunter), last_save = VALUES(last_save), TDamage = VALUES(TDamage), Grenade = VALUES(Grenade)",
465 Name, User [ id ] [ g_zh_kill ], User [ id ] [ g_ms_round ], User [ id ] [ g_zt_infect ], User [ id ] [ g_nh_kill ], User [ id ] [ g_hh_kill ], get_systime(), User [ id ] [ g_total_dmg ], User [ id ] [ g_grenade ]);
466
467 new Handle:Query = SQL_PrepareQuery(SqlConnection,queryString)
468 if(!SQL_Execute(Query))
469 {
470 SQL_QueryError(Query,g_Error,511)
471 set_fail_state(g_Error)
472 }
473 SQL_FreeHandle(Query)
474
475 SQL_FreeHandle(SqlConnection)
476}
477public QuerySaveData( failstate, Handle:query, error[], errcode, data[], size, Float:queueTime )
478{
479 if( failstate == TQUERY_CONNECT_FAILED )
480 {
481 log_amx( "[ZP Achievement] Failed connecting to save data (%d): %s", errcode, error )
482 }
483 else if( failstate == TQUERY_QUERY_FAILED )
484 {
485 log_amx( "[ZP Achievement] Failed query on save data (%d): %s", errcode, error )
486 }
487 else
488 {
489 }
490}
491stock client_printcolor(const id, const input[], any:...)
492{
493 new iCount = 1, iPlayers[32]
494 static szMsg[191]
495
496 vformat(szMsg, charsmax(szMsg), input, 3)
497 replace_all(szMsg, 190, "!g", "^4")
498 replace_all(szMsg, 190, "!y", "^1")
499 replace_all(szMsg, 190, "!t", "^3")
500
501 if(id) iPlayers[0] = id
502 else get_players(iPlayers, iCount, "ch")
503
504 for (new i = 0; i < iCount; i++)
505 {
506 if(is_user_connected(iPlayers[i]))
507 {
508 message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, iPlayers[i])
509 write_byte(iPlayers[i])
510 write_string(szMsg)
511 message_end()
512 }
513 }
514}