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