· 5 years ago · May 24, 2020, 12:22 PM
1// Should the plugin save player data in SQL database?
2// To save player data in a vault, change "#define USING_SQL" to "//#define USING_SQL"
3// To save player data in SQL, change "//#define USING_SQL" to "#define USING_SQL"
4// If you comment //#define USING_REGEX its a little bit more non-steam friendly
5
6//#define USING_SQL
7//#define USING_REGEX
8
9#include <amxmodx>
10#include <amxmisc>
11#include <cstrike>
12#include <engine>
13#include <fakemeta>
14#include <hamsandwich>
15#include <nvault>
16#include <csx>
17#include <fun>
18#include <xs>
19
20//#if defined USING_REGEX
21#include <regex>
22//#endif
23
24#if defined USING_SQL
25#include <sqlx>
26
27new Handle:g_sql_tuple
28#else
29#include <nvault>
30
31new g_iVault
32#endif
33
34#if defined USING_SQL
35new g_loaded_data[ 33 ]
36#endif
37
38#define VERSION "2.3"
39
40#define XO_WEAPON 4
41#define XO_PLAYER 5
42#define m_pPlayer 41
43#define m_flTimeWeaponIdle 48
44#define m_iClientClip 52
45#define m_fInReload 54
46#define m_fInSpecialReload 55
47#define ALPHA_FULLBLINDED 255
48#define m_pActiveItem 373
49#define m_flFlashedUntil 514
50#define m_flFlashedAt 515
51#define m_flFlashHoldTime 516
52#define m_flFlashDuration 517
53#define m_iFlashAlpha 518
54
55
56#define INTERVAL 60
57
58new g_iMaxPlayers
59#define FIRST_PLAYER_ID 1
60#define IsPlayer(%1) ( FIRST_PLAYER_ID <= %1 <= g_iMaxPlayers )
61
62#define NADES_BITSUM (1 << CSW_HEGRENADE) | (1 << CSW_FLASHBANG) | (1 << CSW_SMOKEGRENADE)
63#define NORELOAD_BITSUM NADES_BITSUM | (1 << CSW_KNIFE) | (1 << CSW_C4) | (1 << CSW_M3) | (1 << CSW_XM1014)
64#define fm_get_c4() engfunc( EngFunc_FindEntityByString, -1, "classname", "weapon_c4" )
65
66new g_C4Ent
67new Float:g_fC4Origin[ 3 ]
68
69#define GetBit(%1,%2) ( %1 & 1 << ( %2 & 31 ) )
70#define SetBit(%1,%2) ( %1 |= ( 1 << ( %2 & 31 ) ) )
71#define DelBit(%1,%2) ( %1 &= ~( 1 << ( %2 & 31 ) ) )
72
73const MAX_PLAYERSS = 32
74const MAX_WEAPONS = CSW_P90
75const RIFFLES_BITSUM = ((1 << CSW_AUG) | (1 << CSW_GALIL) | (1 << CSW_FAMAS) | (1 << CSW_M249) | (1 << CSW_M4A1) | (1 << CSW_SG552) | (1 << CSW_AK47))
76const SNIPERS_BITSUM = ((1 << CSW_SCOUT) | (1 << CSW_SG550) | (1 << CSW_AWP) | (1 << CSW_G3SG1))
77const THROUGH_WALL_WEAPONS = ((1 << CSW_DEAGLE) | RIFFLES_BITSUM | SNIPERS_BITSUM)
78
79new g_iBombTime, g_iPlanter,
80 g_iGetBombPlanted, g_iRounds,
81 g_fwid
82
83new const g_szAchievementSound[] = "achieve.wav"
84new const g_szAchievementTag[] = "[Achievement]"
85new g_iMsgSayText
86
87new const Float:vecNullOrigin[ 3 ]
88
89new Float:flDistance[ MAX_PLAYERS + 1 ],
90 Float:vecOldOrigin[ MAX_PLAYERS + 1 ][ 3 ],
91 Float:g_iFeet = 35.0
92
93new g_iRoundSparys[ MAX_PLAYERS + 1 ], g_iKills[ MAX_PLAYERS + 1 ],
94 g_iShotKills[ MAX_PLAYERS + 1 ], g_iGrenadeKills[ MAX_PLAYERS + 1 ],
95 g_iGetTempid[ MAX_PLAYERS + 1 ]
96
97new StandAlone, OneHpHero,
98 is_VictimInAir, iKillerHasNotMoved,
99 iKillerShot, is_Alive,
100 g_iDeathMessages, is_Connected,
101 is_NotValidPlayer
102
103new bool:is_DefusingWithKit, bool:g_iGetBombDown,
104 bool:g_iBombPlant
105
106//#if defined USING_REGEX
107new Regex:g_SteamID_pattern
108new g_regex_return
109//#endif
110
111enum _:g_iAchCount
112{
113 CONNECTIONS,
114 HEAD_SHOTS,
115 DISTANCE_KILLED,
116 DISTANCE_WALKED,
117 BOMB,
118 PLANT_BOMB,
119 PLANT_BOMB_COUNT,
120 DEFUSED_BOMB,
121 TOTAL_KILLS,
122 RIFLE_MASTER,
123 SPRAY_N_PRAY,
124 MASTER_AT_ARMS,
125 PLAY_AROUND,
126 STAND_ALONE,
127 ONE_HP_HERO,
128 BAD_FRIEND,
129 URBAN_DESIGNER,
130 GRAFFITI,
131 AMMO_CONSERVATION,
132 FLY_AWAY,
133 FLY_KILLER,
134 RELOADER,
135 CAMP_FIRE,
136 HAT_TRICK,
137 TOTAL_DAMAGE,
138 WALL_HACKER,
139
140 COMPLETED_ACHIEVEMENTS
141}
142
143new const g_iAchsMotd[g_iAchCount][] =
144{
145 "A szerver szeretője",
146 "HS király",
147 "Velem van az erő",
148 "Hosszú futás",
149 "Bombaszakértő",
150 "Rövid élesítés",
151 "BUMM-BUMM",
152 "C4-mester",
153 "A szerver királya",
154 "Fegyverszakértő",
155 "Bevakítva",
156 "Fegyver-mester",
157 "Egy órácska",
158 "Egyedül",
159 "1HP hős",
160 "Rossz csapattárs",
161 "A festő",
162 "Graffiti a második nevem",
163 "Ammo-szakértő",
164 "Repülve",
165 "A levegő ura",
166 "Újratöltő",
167 "Kempelve",
168 "Édes hármas",
169 "Sebzésből is jeles",
170 "WALLHACKER",
171 "Elért teljesítmények százaléka"
172}
173
174new const g_iAchsSecondary[][] =
175{
176 "Visszajövök",
177 "Szeretem a szervert",
178 "Félúton",
179 "Az első lépések",
180 "Félúton vagyok",
181 "C4-szakértő",
182 "Nagyon könnyű",
183 "Gyerekjáték",
184 "C4-mester",
185 "Rövidtávú ölés",
186 "Szép AIM",
187 "Hosszútávú ölés",
188 "AIMBOT Idő",
189 "Gyilkos mester"
190}
191
192new const g_iAchsDesciption[g_iAchCount][] =
193{
194 "Csatlakozz a szerverre^3 500.^1alkalommal!",
195 "Érj el^3 300 ^1fejlövést!",
196 "Ölj meg egy ellenséget távolról!",
197 "Fuss végig a pályán!",
198 "Hatástalanítsd a bombát, mielőtt felrobban!",
199 "Élesítsd a bombát a körindulást követő^3 25.másodpercen^1 belül!",
200 "Élesítsd a bombát^3100. ^1alkalommal!",
201 "Hatástlaníts^3 400.^1bombát!",
202 "Érj el^3 1000^1 ölést!",
203 "Érd el az összes fegyver teljesítményt!",
204 "Ölj meg egy ^3ellenséget^1, teljesen bevakítva!",
205 "Érd el az összes fegyver teljesítményt!",
206 "Tölts el ^3egy órát^1a szerveren!",
207 "Halj meg a csapat utolsó embereként^3 15.^1alkalommal!",
208 "Ölj meg egy ellenséget^3 1HP^1-val!",
209 "Ölj meg^35 ^1csapattársad!",
210 "Használd a ^3sprayt^1 50. alkalommal!",
211 "Fess háromszor ^3ugyanarra^1 a helyre!",
212 "Ölj meg ^3két ellenséget^1 egyetlen tárból!",
213 "Ölj meg egy ^3ellenséget^1, miközben a ^3levegőben^1 van!",
214 "Ölj meg egy ^3ellenséget^1, miközben Te vagy a ^3levegőben^1!",
215 "Töltsd újra a fegyvered^3 1000.^1alkalommal!",
216 "Ölj meg ^3 három ellenséget^1, ugyanazon a területen!",
217 "Ölj meg^3 három ellenséget^1 egyetlen gránáttal!",
218 "Okozz^3 50000^1. sebzést!",
219 "Ölj meg ellenségeket a falon keresztül^3 10.^1alkalommal!",
220 "Teljesített százalék"
221}
222
223const MAX_CONNECTION = 500 // Connections
224const MAX_HEAD_SHOTS = 300 // Headshots
225const MAX_DISTANCE_KILLED = 4 // distance killed
226const MAX_DISTANCE_WALKED = 3 // distance walk
227const MAX_BOMB = 1 // bomb
228const MAX_PLANT_BOMB = 1 // Plant bomb
229const MAX_PLANT_BOMB_COUNT = 100 // plant bomb count
230const MAX_DEFUSED_BOMB = 40 // Defused Bomb
231const MAX_TOTAL_KILLS = 1000 // total kills
232const MAX_PISTOL_MASTER = 6 // Pistol master
233const MAX_RIFLE_MASTER = 10 // rifle Master
234const MAX_SHOTGUN_MASTER = 2 // shotgun master
235const MAX_SPRAY_N_PRAY = 1 // spray and pray
236const MAX_MASTER_AT_ARMS = 25 // Master of Arms
237const MAX_PLAY_AROUND = 60 // Play Around
238const MAX_STAND_ALONE = 15 // Stand Alone
239const MAX_ONE_HP_HERO = 1 // 1 Hp Hero
240const MAX_BAD_FRIEND = 5 // Bad Friend
241const MAX_URBAN_DESIGNER = 50 // Urban Designer
242const MAX_GRAFFITI = 1 // Graffiti Is My Second Name
243const MAX_AMMO_CONSERVATION = 1 // Ammo Conservation
244const MAX_FLY_AWAY = 1 // Fly Away
245const MAX_FLY_KILLER = 1 // Fly Killer
246const MAX_RELOADER = 1000 // Reloader
247const MAX_CAMP_FIRE = 1 // Camp Fire
248const MAX_HAT_TRICK = 1 // HatTrick
249const MAX_COWBOY_DIPLOMACY = 50 // Cowboy Diplomacy
250const MAX_TOTAL_DAMAGE = 50000 // Total Damage 50000 Damage points
251const MAX_WALL_HACKER = 10 // Wall hacker
252const MAX_COMPLETEDPERCENTAGE = 69 // Completed Percentage
253
254new const g_iAchsMaxPoints[g_iAchCount] =
255{
256 500, // Connections
257 300, // Headshots
258 4, // distance killed
259 3, // distance walk
260 1, // bomb
261 1, // Plant bomb
262 100, // plant bomb count
263 40, // Defused Bomb
264 1000, // total kills
265 10, // rifle Master
266 1, // spray and pray
267 25, // Master of Arms
268 60, // Play Around
269 15, // Stand Alone
270 1, // 1 Hp Hero
271 5, // Bad Friend
272 50, // Urban Designer
273 1, // Graffiti Is My Second Name
274 1, // Ammo Conservation
275 1, // Fly way
276 1, // Fly Killer
277 1000, // Reloader
278 1, // Camp Fire
279 1, // HatTrick
280 50000, // Total Damage 50000 Damage points
281 10, // Wall hacker
282 69 // Completed Percentage
283}
284
285enum _:MAX_TYPES
286{
287 TYPE_NONE,
288 TYPE_RELATION,
289 TYPE_PLAYER,
290 TYPE_HEALTH,
291}
292
293enum
294{
295 LOOK_FRIEND = 1,
296 LOOK_ENEMY,
297 LOOK_HOSTAGE,
298}
299
300enum _:MAX_REPLACES
301{
302 RE_ACHIEVEMENT,
303 RE_HP,
304 RE_NAME,
305}
306
307new const Replaces[ MAX_REPLACES ][] =
308{
309 "%Achivement%",
310 "%hp%",
311 "%name%"
312}
313
314new g_iAuthID[ MAX_PLAYERS + 1 ][ 35 ]
315
316//Cvars
317new g_pCvar_Enabled, g_pCvarC4Timer,
318 g_pCvar_ShowInfo, g_pCvar_DeathMessage,
319 g_pCvar_FlashMessage, g_pCvar_BombMessage,
320 g_pCvar_DeadPlayerNames, g_pCvar_DeadPlayerMessage,
321 g_pCvar_StatustextMessageFriend, g_pCvar_StatustextMessageEnemy,
322 g_pCvar_PlaySound, g_pCvar_Reward, g_pCvar_Message
323
324new status_value[ MAX_TYPES ]
325new gStatusText
326
327new const g_szWeaponNames[][] =
328{
329 "p228",
330 "scout",
331 "hegrenade",
332 "xm1014",
333 "c4",
334 "mac10",
335 "aug",
336 "smokegrenade",
337 "elite",
338 "fiveseven",
339 "ump45",
340 "sg550",
341 "galil",
342 "famas",
343 "usp",
344 "glock18",
345 "awp",
346 "mp5navy",
347 "m249",
348 "m3",
349 "m4a1",
350 "tmp",
351 "g3sg1",
352 "flashbang",
353 "deagle",
354 "sg552",
355 "ak47",
356 "knife",
357 "p90"
358}
359
360#define WEAPON_SIZE sizeof(g_szWeaponNames)
361
362new const g_iWeaponIDs[WEAPON_SIZE] =
363{
364 CSW_P228,
365 CSW_SCOUT,
366 CSW_HEGRENADE,
367 CSW_XM1014,
368 CSW_C4,
369 CSW_MAC10,
370 CSW_AUG,
371 CSW_SMOKEGRENADE,
372 CSW_ELITE,
373 CSW_FIVESEVEN,
374 CSW_UMP45,
375 CSW_SG550,
376 CSW_GALIL,
377 CSW_FAMAS,
378 CSW_USP,
379 CSW_GLOCK18,
380 CSW_AWP,
381 CSW_MP5NAVY,
382 CSW_M249,
383 CSW_M3,
384 CSW_M4A1,
385 CSW_TMP,
386 CSW_G3SG1,
387 CSW_FLASHBANG,
388 CSW_DEAGLE,
389 CSW_SG552,
390 CSW_AK47,
391 CSW_KNIFE,
392 CSW_P90
393}
394
395enum
396{
397 P228,
398 SCOUT,
399 HEGRENADE,
400 XM1014,
401 C4,
402 MAC10,
403 AUG,
404 SMOKEGRENADE,
405 ELITE,
406 FIVESEVEN,
407 UMP45,
408 SG550,
409 GALIL,
410 FAMAS,
411 USP,
412 GLOCK18,
413 AWP,
414 MP5NAVY,
415 M249,
416 M3,
417 M4A1,
418 TMP,
419 G3SG1,
420 FLASHBANG,
421 DEAGLE,
422 SG552,
423 AK47,
424 KNIFE,
425 P90
426}
427
428new const g_iAchsWeaponMaxKills[] =
429{
430 100, //"p228",
431 100, //"scout",
432 5, //"hegrenade",
433 20, //"xm1014",
434 5, //"c4",
435 25, //"mac10",
436 30, //"aug",
437 40, //"smokegrenade",
438 50, //"elite",
439 50, //"fiveseven",
440 75, //"ump45",
441 75, //"sg550",
442 250, //"galil",
443 250, //"famas",
444 80, //"usp",
445 80, //"glock18",
446 275, //"awp",
447 100, //"mp5navy",
448 50, //"m249",
449 50, //"m3",
450 275, //"m4a1",
451 100, //"tmp",
452 75, //"g3sg1",
453 75, //"flashbang",
454 125, //"deagle",
455 100, //"sg552",
456 275, //"ak47",
457 20, //"knife",
458 30 //"p90"
459}
460
461const MAX_P228 = 100 //"p228",
462const MAX_SCOUT = 100 //"scout",
463const MAX_HEGRENADE = 5 //"hegrenade",
464const MAX_XM1014 = 20 //"xm1014",
465const MAX_C4 = 5 //"c4",
466const MAX_MAC10 = 25 //"mac10",
467const MAX_AUG = 30 //"aug",
468const MAX_SMOKEGRENADE = 40 //"smokegrenade",
469const MAX_ELITE = 50 //"elite",
470const MAX_FIVESEVEN = 50 //"fiveseven",
471const MAX_UMP45 = 75 //"ump45",
472const MAX_SG550 = 75 //"sg550",
473const MAX_GALIL = 250 //"galil",
474const MAX_FAMAS = 250 //"famas",
475const MAX_USP = 80 //"usp",
476const MAX_GLOCK18 = 80 //"glock18",
477const MAX_AWP = 275 //"awp",
478const MAX_MP5NAVY = 100 //"mp5navy",
479const MAX_M249 = 50 //"m249",
480const MAX_M3 = 50 //"m3",
481const MAX_M4A1 = 275 //"m4a1",
482const MAX_TMP = 100 //"tmp",
483const MAX_G3SG1 = 75 //"g3sg1",
484const MAX_FLASHBANG = 75 //"flashbang",
485const MAX_DEAGLE = 125 //"deagle",
486const MAX_SG552 = 100 //"sg552",
487const MAX_AK47 = 275 //"ak47",
488const MAX_KNIFE = 20 //"knife",
489const MAX_P90 = 30 //"p90"
490
491new const g_szWeaponNames2[WEAPON_SIZE][] =
492{
493 "P228",
494 "Scout",
495 "He-Grenade",
496 "XM1014",
497 "C4",
498 "Mac10",
499 "Aug",
500 "Smoke-Grenade",
501 "Elite",
502 "Fiveseven",
503 "Ump45",
504 "SG550",
505 "Galil",
506 "Famas",
507 "USP",
508 "Glock",
509 "AWP",
510 "MP5",
511 "M249",
512 "M3",
513 "M4A1",
514 "TMP",
515 "G3SG1",
516 "FlashBang",
517 "Deagle",
518 "SG552",
519 "AK47",
520 "Knife",
521 "P90"
522}
523
524new const g_iAchsWeap[WEAPON_SIZE][] =
525{
526 "228 Compact Expert",
527 "Schmidt Scout Expert",
528 "HE Grenade Expert",
529 "Leone YG1265 Auto Shotgun Expert",
530 "C4 Killer",
531 "Ingram Mac-10 Expert",
532 "Bullpup Expert",
533 "It's A Bit Smokey In Here!",
534 ".40 Dual Elites Expert",
535 "ES Five-Seven Expert",
536 "KM UMP45 Expert",
537 "D3/AU-1 Expert",
538 "IDF Defender Expert",
539 "Clarion 5.56 Expert",
540 "KM Tactical .45 Expert",
541 ".9×19 Sidearm Expert",
542 "Magnum Sniper Rifle Expert",
543 "KM Sub-Machine Gun Expert",
544 "M249 Expert",
545 "Leone 12 Gauge Super Expert",
546 "Maverick M4A1 Carbine Expert",
547 "Schmidt Machine Pistol Expert",
548 "Krieg 550 Commando Expert",
549 "Can You See?",
550 "Night Hawk .50c Expert",
551 "Krieg 552 Expert",
552 "CV-47 Expert",
553 "Knife Expert",
554 "ES C90 Expert"
555}
556
557new const g_iGunEvents[][] = {
558 "events/awp.sc",
559 "events/g3sg1.sc",
560 "events/ak47.sc",
561 "events/scout.sc",
562 "events/m249.sc",
563 "events/m4a1.sc",
564 "events/sg552.sc",
565 "events/aug.sc",
566 "events/sg550.sc",
567 "events/m3.sc",
568 "events/xm1014.sc",
569 "events/usp.sc",
570 "events/mac10.sc",
571 "events/ump45.sc",
572 "events/fiveseven.sc",
573 "events/p90.sc",
574 "events/deagle.sc",
575 "events/p228.sc",
576 "events/glock18.sc",
577 "events/mp5n.sc",
578 "events/tmp.sc",
579 "events/elite_left.sc",
580 "events/elite_right.sc",
581 "events/galil.sc",
582 "events/famas.sc"
583}
584
585new g_iPlayersKills[ MAX_PLAYERS+1 ][ MAX_WEAPONS+1 ]
586new g_iAchLevel[ MAX_PLAYERS+1 ][ g_iAchCount ]
587new g_iTimerEntity, g_iJoinTime[ MAX_PLAYERS+1 ]
588
589new Trie:g_tWeaponNameToID
590new iWeaponID, g_iGunEvent_IDsBitsum
591
592public plugin_init() {
593
594 #if defined USING_SQL
595 register_plugin( "Achievements (SQL)", VERSION, "Pastout!" )
596 #else
597 register_plugin( "Achievements", VERSION, "Pastout!" )
598 #endif
599
600 g_pCvar_Enabled = register_cvar("ach_enable", "1")// 1 = on || 0 = off
601 if ( !get_pcvar_num( g_pCvar_Enabled ) )
602 return;
603
604 g_pCvarC4Timer = get_cvar_pointer( "mp_c4timer" )
605 g_pCvar_ShowInfo = register_cvar( "ach_showinfo", "0" )
606 g_pCvar_DeathMessage = register_cvar( "ach_deathmessage", "0" )
607 g_pCvar_FlashMessage = register_cvar( "ach_flashmessage", "1" )
608 g_pCvar_BombMessage = register_cvar( "ach_bombmessage", "0" )
609 g_pCvar_PlaySound = register_cvar( "ach_playsound", "1" )
610 g_pCvar_Reward = register_cvar( "ach_reward", "300" )
611 g_pCvar_Message = register_cvar( "ach_message", "2" )
612 g_pCvar_DeadPlayerNames = register_cvar( "dead_player_names", "1" )
613 g_pCvar_DeadPlayerMessage = register_cvar( "dead_player_message", "%name% (%hp%) %steamid%" )
614 g_pCvar_StatustextMessageFriend = register_cvar( "statustext_message_friend", "Csapattárs : %name% HP : %hp%%% Teljesítmények állapota : %Achivement%%%" )
615 g_pCvar_StatustextMessageEnemy = register_cvar( "statustext_message_enemy", "Ellenség : %name% Teljesítmények állapota : %Achivement%%%" )
616
617 new command[] = "CmdMainMenu"
618 register_clcmd( "say /teljesitmenyek", command )
619 register_clcmd( "say /teljesitmeny", command )
620 register_clcmd( "say /ach", command )
621 register_clcmd( "say /help", "Ach_HelpMenu" )
622 register_clcmd( "say /deathmessage", "CmdDeathMessage" )
623
624 register_clcmd( "Enter_Value", "CmdEnterValue" )
625
626 register_event( "DeathMsg", "Event_PlayerKilled", "a" )
627 register_event( "HLTV", "Event_NewRound", "a", "1=0", "2=0" )
628 register_event( "StatusIcon", "Event_GotBomb", "be", "1=1", "1=2", "2=c4" )
629 register_event( "23", "Event_Spray", "a", "1=112" )
630 register_event( "CurWeapon", "Event_CurWeapon", "be", "1=1", "3>0" )
631 register_event( "StatusValue", "Event_StatusValue", "b" )
632
633 register_logevent( "Event_PlayerAction", 3, "1=triggered" )
634
635 new entity[] = "hud_entity"
636 g_iTimerEntity = create_entity( "info_target" )
637 entity_set_string( g_iTimerEntity, EV_SZ_classname, entity )
638 register_think( entity, "FwdHUDThink" )
639 entity_set_float( g_iTimerEntity, EV_FL_nextthink, get_gametime() + 1.0 )
640
641 g_iMaxPlayers = get_maxplayers( )
642 g_tWeaponNameToID = TrieCreate( )
643 g_iMsgSayText = get_user_msgid( "SayText" )
644 gStatusText = get_user_msgid( "StatusText" )
645
646 for( new i = 0; i < WEAPON_SIZE; i++ )
647 {
648 TrieSetCell( g_tWeaponNameToID, g_szWeaponNames[i], g_iWeaponIDs[i] )
649 }
650
651 new g_szHamShotgunReload[] = "FwdHamShotgunReload"
652 new g_szPlayer[] = "player"
653 RegisterHam( Ham_Weapon_Reload, "weapon_m3", g_szHamShotgunReload, .Post = true )
654 RegisterHam( Ham_Weapon_Reload, "weapon_xm1014", g_szHamShotgunReload, .Post = true )
655 RegisterHam( Ham_TraceAttack, g_szPlayer, "Ham_CBasePlayer_TraceAttack", .Post = false )
656 RegisterHam( Ham_Spawn, g_szPlayer, "Ham_CBasePlayer_Spawn", .Post = true )
657 RegisterHam( Ham_Killed, g_szPlayer, "Ham_CBasePlayer_Killed", .Post = false )
658 RegisterHam( Ham_TakeDamage, g_szPlayer, "Ham_CBasePlayer_TakeDamage", .Post = true )
659
660 unregister_forward( FM_PrecacheEvent, g_fwid, 1 )
661 register_forward( FM_PlaybackEvent, "FwdPlaybackEvent" )
662 register_forward( FM_CmdStart, "FwdCmdStart" )
663
664 #if !defined USING_SQL
665 g_iVault = nvault_open( "Achievements" )
666
667 if(g_iVault == INVALID_HANDLE)
668 set_fail_state( "Error opening nVault" )
669
670 #endif
671
672 //#if defined USING_REGEX
673 new err[ 2 ]
674 g_SteamID_pattern = regex_compile( "^^STEAM_0:(0|1):\d+$", g_regex_return, err, sizeof( err ) - 1 )
675 //#endif
676
677}
678
679public plugin_unpause()
680{
681 is_Connected = 0;
682 is_Alive = 0;
683 static iPlayers[ 32 ], iNum, iPlayer
684 get_players( iPlayers, iNum, "ch" )
685
686 for( new i = 0; i < iNum; i++ )
687 {
688 iPlayer = iPlayers[ i ]
689 SetBit( is_Connected, iPlayer )
690 if( is_user_alive( iPlayer ) )
691 {
692 SetBit( is_Alive, iPlayer )
693 }
694 }
695}
696
697public Event_StatusValue( id )
698{
699 new num = read_data( 1 )
700
701 if( num <= 0 || num >= MAX_TYPES )
702 return
703
704 new update = status_value[ num ] = read_data( 2 )
705
706 switch( num )
707 {
708 case TYPE_RELATION:
709 {
710 if( !update && GetBit( is_Alive, id ) )
711 {
712 message_begin( MSG_ONE_UNRELIABLE, gStatusText, _, id )
713 write_byte( 0 )
714 write_string( "" )
715 message_end()
716 }
717 }
718 case TYPE_PLAYER:
719 {
720 if( GetBit( is_Alive, id ) )
721 {
722 new message[ 192 ]
723
724 switch( status_value[ TYPE_RELATION ] )
725 {
726 case LOOK_FRIEND:
727 {
728 get_pcvar_string( g_pCvar_StatustextMessageFriend, message, charsmax( message ) )
729 }
730 case LOOK_ENEMY:
731 {
732 get_pcvar_string( g_pCvar_StatustextMessageEnemy, message, charsmax( message ) )
733 }
734 case LOOK_HOSTAGE:
735 {
736 return
737 }
738 }
739
740 EditMessage( message, update, true, get_user_health( update ) )
741
742 message_begin( MSG_ONE_UNRELIABLE, gStatusText, _, id )
743 write_byte( 0 )
744 write_string( message )
745 message_end()
746 }
747 }
748 case TYPE_HEALTH:
749 {
750 if( !status_value[ TYPE_RELATION ] )
751 return;
752
753 if( !FreeLook( id ) )
754 return;
755
756 switch( status_value[ TYPE_RELATION ] )
757 {
758 case LOOK_FRIEND, LOOK_ENEMY:
759 {
760 new message[ 192 ]
761 get_pcvar_string( g_pCvar_DeadPlayerMessage, message, charsmax( message ) )
762
763 EditMessage( message, status_value[ TYPE_PLAYER ], false, update )
764 }
765 case LOOK_HOSTAGE:
766 {
767 new message[ 192 ]
768 get_pcvar_string( g_pCvar_DeadPlayerMessage, message, charsmax(message) )
769
770 EditMessage( message, 0, false, update )
771 }
772 }
773 }
774 }
775}
776
777FreeLook( id )
778{
779 if( GetBit( is_Connected, id ) && !GetBit( is_Alive, id ) )
780 return false;
781
782 if( pev(id, pev_iuser2) && get_pcvar_num( g_pCvar_DeadPlayerNames ) <= 1 )
783 return false;
784
785 return true;
786}
787
788EditMessage( message[ 192 ], player, bool:status_text, hp )
789{
790 new temp[ 35 ]
791
792 if( GetBit( is_Alive, player ) )
793 {
794 for( new i; i < MAX_REPLACES; i++ )
795 {
796 switch( i )
797 {
798 case RE_ACHIEVEMENT:
799 {
800 new Float:g_Number = ( g_iAchLevel[ player ][ COMPLETED_ACHIEVEMENTS ]*1.0 )
801 new Float:g_Number2 = ( g_iAchsMaxPoints[ COMPLETED_ACHIEVEMENTS ]*1.0 )
802 new Float:g_Number3 = g_Number/g_Number2*100
803 formatex( temp, charsmax( temp ), "%.f", g_Number3 )
804 }
805
806 case RE_HP:
807 {
808 num_to_str( hp, temp, charsmax( temp ) )
809 }
810
811 case RE_NAME:
812 {
813 if( status_text )
814 copy( temp, charsmax( temp ), "%p2" )
815 else
816 get_user_name( player, temp, charsmax( temp ) )
817 }
818
819 default:
820 {
821 copy( temp, charsmax(temp), "" )
822 }
823 }
824
825 replace( message, charsmax( message ), Replaces[ i ], temp )
826 }
827 }
828 else
829 {
830 for( new i; i < MAX_REPLACES; i++ )
831 {
832 switch( i )
833 {
834 case RE_HP:
835 {
836 num_to_str( hp, temp, charsmax( temp ) )
837 replace( message, charsmax( message ), Replaces[ i ], temp )
838 }
839
840 case RE_NAME:
841 {
842 replace( message, charsmax( message ), Replaces[ i ], "Tusz" )
843 }
844
845 default:
846 {
847 replace( message, charsmax( message ), Replaces[ i ], "" )
848 }
849 }
850 }
851 }
852
853 trim( message )
854}
855
856public Ham_CBasePlayer_Killed( iVictim, iAttacker )
857{
858 if( IsPlayer( iAttacker )
859 && IsPlayer( iVictim )
860 && GetBit( is_Connected, iVictim )
861 && GetBit( is_Connected, iAttacker )
862 && GetBit( is_Alive, iAttacker ) )
863 {
864 #if defined USING_REGEX
865 if( !IsUserAuthorized( iAttacker ) || !IsUserAuthorized( iVictim ) )
866 {
867 return HAM_HANDLED
868 }
869 #endif
870
871 new Float:origin[ 3 ]
872 entity_get_vector( iVictim, EV_VEC_origin, origin )
873
874 if( ( 1 << get_user_weapon( iAttacker ) ) & THROUGH_WALL_WEAPONS )
875 {
876 if( !fm_is_ent_visible_maxdistance( iAttacker, iVictim,.maxdistance = 3500.0) && is_in_viewcone( iAttacker, origin ) )
877 {
878 g_iAchLevel[ iAttacker ][ WALL_HACKER ]++
879 switch( g_iAchLevel[ iAttacker ][ WALL_HACKER ] )
880 {
881 case MAX_WALL_HACKER:
882 {
883 Achievement( iAttacker, WALL_HACKER, -1 )
884 }
885 }
886 //Print( 0, "You have been walled!" )
887 }
888 }
889 }
890
891 return HAM_HANDLED
892}
893
894bool:fm_is_ent_visible_maxdistance( const index, const entity, ignoremonsters = 0, Float:maxdistance )
895{
896 new Float:start[ 3 ], Float:dest[ 3 ]
897 pev( index, pev_origin, start )
898 pev( index, pev_view_ofs, dest )
899 xs_vec_add( start, dest, start )
900 pev( entity, pev_origin, dest )
901
902 if( vector_distance( start,dest ) <= maxdistance )
903 {
904 engfunc( EngFunc_TraceLine, start, dest, ignoremonsters, index, 0 )
905 new Float:fraction;
906 get_tr2( 0, TR_flFraction, fraction )
907
908 if ( fraction == 1.0 || get_tr2( 0, TR_pHit ) == entity )
909 return true
910 }
911 return false
912}
913
914public client_damage( iAttacker, iVictim, gDamage, iWeapon, iHitplace, TA )
915{
916 #if defined USING_REGEX
917 if( !IsUserAuthorized( iAttacker ) || !IsUserAuthorized( iVictim ) )
918 {
919 return PLUGIN_HANDLED
920 }
921 #endif
922 if( IsPlayer( iAttacker ) && IsPlayer( iVictim ) )
923 {
924 new iPreviousLevel = g_iAchLevel[ iAttacker ][ TOTAL_DAMAGE ] / g_iAchsMaxPoints[ TOTAL_DAMAGE ]
925 new iNewLevel = ( g_iAchLevel[ iAttacker ][ TOTAL_DAMAGE ] += gDamage ) / g_iAchsMaxPoints[ TOTAL_DAMAGE ]
926 if( iNewLevel > iPreviousLevel )
927 {
928 Achievement( iAttacker, TOTAL_DAMAGE, -1 )
929 }
930 }
931
932 #if defined USING_REGEX
933 return PLUGIN_HANDLED
934 #endif
935}
936
937public Ham_CBasePlayer_TakeDamage(iVictim, inflictor, iAttacker, Float:fDamage, bitDamage)
938{
939 if ( !inflictor )
940 return HAM_IGNORED
941
942 new Float:fOrigin[ 3 ]
943 new iC4 = fm_get_c4()
944 new szClass[ 14 ]
945
946 pev( iVictim , pev_origin , fOrigin )
947 pev( inflictor , pev_classname , szClass , 13 )
948
949 if ( ( bitDamage & DMG_BLAST )
950 && ( get_distance_f( fOrigin , g_fC4Origin ) <= 1700.0 )
951 && ( !iC4 && g_C4Ent
952 && ( equal( szClass, "env_explosion" ) || equal( szClass, "grenade" ) ) ) )
953 {
954 if( GetBit( is_Connected, g_iPlanter )
955 && GetBit( is_Connected, iVictim )
956 && get_user_health( iVictim ) <= 0 )
957 {
958 message_begin( MSG_BROADCAST, 83, { 0,0,0 }, 0 )
959 write_byte( g_iPlanter )
960 write_byte( iVictim )
961 write_byte( 0 )
962 write_string( "world" )
963 message_end()
964
965 g_iPlayersKills[ g_iPlanter ][ CSW_C4 ]++
966
967 if( g_iPlayersKills[ g_iPlanter ][ CSW_C4 ] == 30 )
968 {
969 Achievement( g_iPlanter, -1, C4 )
970 }
971
972 if( g_iAchLevel[ g_iPlanter ][ BAD_FRIEND ] > MAX_BAD_FRIEND && cs_get_user_team( g_iPlanter ) == cs_get_user_team( iVictim ) )
973 {
974 g_iAchLevel[ g_iPlanter ][ BAD_FRIEND ]++
975 }
976 }
977 }
978
979 return HAM_IGNORED;
980}
981
982public Event_PlayerAction( )
983{
984 new szArg[ 64 ], szAction[ 64 ], szName[ 64 ]
985 new iUserId, id
986
987 read_logargv( 0, szArg, 64 )
988 read_logargv( 2, szAction, 64 )
989 parse_loguser( szArg, szName, 64, iUserId )
990 id = find_player( "k", iUserId )
991
992 if( id == 0 )
993 {
994 return
995 }
996 #if defined USING_REGEX
997 if( !IsUserAuthorized( id ) )
998 {
999 return
1000 }
1001 #endif
1002 if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
1003 {
1004 if( equal( szAction, "Begin_Bomb_Defuse_With_Kit" ) )
1005 {
1006 is_DefusingWithKit = true
1007 }
1008 }
1009 #if defined USING_REGEX
1010 return
1011 #endif
1012}
1013
1014public Event_CurWeapon( iPlayer )
1015{
1016 #if defined USING_REGEX
1017 if( !IsUserAuthorized( iPlayer ) )
1018 {
1019 return
1020 }
1021 #endif
1022
1023 new iId = read_data( 2 )
1024 if( ~NORELOAD_BITSUM & 1 << iId )
1025 {
1026 new iWeapon = get_pdata_cbase( iPlayer, m_pActiveItem, XO_PLAYER )
1027 new iClientClip = get_pdata_int( iWeapon, m_iClientClip, XO_WEAPON )
1028 new iClip = read_data( 3 )
1029 if( iClip > iClientClip )
1030 {
1031 // Player <iPlayer> has reloaded weapon <m_pActiveItem>, weapontype iId
1032 //new iPlayer = get_pdata_cbase( iWeapon, m_pPlayer, 4 )
1033
1034 //if( get_pdata_int( iWeapon, m_fInReload, 4 ) ) {
1035 g_iAchLevel[ iPlayer ][ RELOADER ]++
1036 switch( g_iAchLevel[ iPlayer ][ RELOADER ] )
1037 {
1038 case MAX_RELOADER:
1039 {
1040 Achievement( iPlayer, RELOADER, -1 )
1041 }
1042 }
1043 // }
1044 }
1045 }
1046
1047 #if defined USING_REGEX
1048 return
1049 #endif
1050}
1051
1052public FwdHamShotgunReload( const iWeapon )
1053{
1054 if( get_pdata_int( iWeapon, m_fInSpecialReload, 4 ) != 1 )
1055 return
1056 new Float:flTimeWeaponIdle = get_pdata_float( iWeapon, m_flTimeWeaponIdle, 4 )
1057
1058 if( flTimeWeaponIdle != 0.55 )
1059 return
1060
1061 new iPlayer = get_pdata_cbase( iWeapon, m_pPlayer, 4 )
1062
1063 #if defined USING_REGEX
1064 if( !IsUserAuthorized( iPlayer ) )
1065 {
1066 return
1067 }
1068 #endif
1069
1070 g_iAchLevel[ iPlayer ][ RELOADER ]++
1071 switch( g_iAchLevel[ iPlayer ][ RELOADER ] )
1072 {
1073 case MAX_RELOADER:
1074 {
1075 Achievement( iPlayer, RELOADER, -1 )
1076 }
1077 }
1078 #if defined USING_REGEX
1079 return
1080 #endif
1081}
1082
1083public FwdHUDThink( iEntity )
1084{
1085 if ( iEntity != g_iTimerEntity )
1086 return
1087
1088 static iPlayers[ 32 ], iNum, iPlayer
1089 get_players( iPlayers, iNum, "ch" )
1090
1091 for( new i = 0; i < iNum; i++ )
1092 {
1093 iPlayer = iPlayers[ i ]
1094 if(g_iAchLevel[ iPlayer ][ PLAY_AROUND ] < MAX_PLAY_AROUND )
1095 {
1096 if ( ( get_systime() - g_iJoinTime[ iPlayer ] ) >= INTERVAL )
1097 {
1098 #if defined USING_REGEX
1099 if( !IsUserAuthorized( iPlayer ) )
1100 {
1101 return
1102 }
1103 #endif
1104
1105 g_iJoinTime[ iPlayer ] = get_systime()
1106 g_iAchLevel[ iPlayer ][ PLAY_AROUND ]++
1107 switch( g_iAchLevel[ iPlayer ][ PLAY_AROUND ] )
1108 {
1109 case MAX_PLAY_AROUND:
1110 {
1111 Achievement( iPlayer, PLAY_AROUND, -1 )
1112 }
1113 }
1114 #if defined USING_REGEX
1115 return
1116 #endif
1117 }
1118 }
1119 }
1120
1121 entity_set_float( g_iTimerEntity, EV_FL_nextthink, get_gametime() + 1.0 )
1122}
1123
1124public CmdDeathMessage( id )
1125{
1126 if( get_pcvar_num( g_pCvar_DeathMessage ) != 1 )
1127 {
1128
1129 Print( id, "^4[AMXX]^1 Sorry the^4 death message^1 has been^4 disable^1 for^3 everyone." )
1130 return PLUGIN_HANDLED
1131 }
1132 if( GetBit( g_iDeathMessages, id ) )
1133 {
1134 SetBit( g_iDeathMessages, id )
1135 Print( id, "^4[AMXX]^1 You have^4 Enable^3 death messages^1." )
1136 }
1137 else
1138 {
1139 if( GetBit( g_iDeathMessages, id ) )
1140 {
1141 DelBit( g_iDeathMessages, id )
1142 Print( id, "^4[AMXX]^1 You have^4 Disable^3 death messages^1." )
1143 }
1144 }
1145 return PLUGIN_HANDLED
1146}
1147
1148public plugin_precache()
1149{
1150 g_fwid = register_forward( FM_PrecacheEvent, "FwdPrecacheEvent", 1 )
1151 precache_sound( g_szAchievementSound )
1152
1153 #if defined USING_SQL
1154 g_sql_tuple = SQL_MakeStdTuple()
1155
1156 SQL_ThreadQuery(g_sql_tuple, "QueryCreateTable", "CREATE TABLE IF NOT EXISTS `Achievement` ( `name` VARCHAR(32) NOT NULL, `authid` VARCHAR(35) NOT NULL, `data` VARCHAR(256) NOT NULL );" )
1157 #endif
1158}
1159
1160public FwdPrecacheEvent( type, const name[] )
1161{
1162 for( new i = 0; i < sizeof g_iGunEvents; ++i ) {
1163 if( equal( g_iGunEvents[ i ], name ) ) {
1164 g_iGunEvent_IDsBitsum |= ( 1 << get_orig_retval() )
1165 return FMRES_HANDLED
1166 }
1167 }
1168 return FMRES_IGNORED
1169}
1170
1171public FwdPlaybackEvent( flags, id, eventid )
1172{
1173 if( !( g_iGunEvent_IDsBitsum & ( 1 << eventid ) ) || !IsPlayer( id )/*(1 <= id <= g_iMaxPlayers )*/ )
1174 return FMRES_IGNORED;
1175
1176 DelBit( iKillerShot, id );
1177 g_iShotKills[ id ] = 0;
1178
1179 return FMRES_HANDLED;
1180}
1181
1182public Ham_CBasePlayer_TraceAttack( this, iAttacker, Float:damage, Float:direction[ 3 ], traceresult, damagebits )
1183{
1184 if( GetBit( is_Connected, iAttacker ) && GetBit( is_Alive, iAttacker ) )
1185 {
1186 static g_iWeapon; g_iWeapon = get_user_weapon( iAttacker )
1187 if( g_iWeapon == CSW_KNIFE || g_iWeapon == CSW_HEGRENADE )
1188 {
1189 return HAM_HANDLED
1190 }
1191
1192 SetBit( iKillerShot, iAttacker )
1193
1194 }
1195 return HAM_HANDLED
1196
1197}
1198
1199#if defined USING_SQL
1200public QueryCreateTable( failstate, Handle:query, error[], errnum, data[], size, Float:queuetime )
1201{
1202 if( failstate == TQUERY_CONNECT_FAILED
1203 || failstate == TQUERY_QUERY_FAILED )
1204 {
1205 set_fail_state( error )
1206 }
1207}
1208#endif
1209new iPage
1210public Ach_HelpMenu( id, iPage )
1211{
1212 //Menu Title
1213 new title[ 64 ]; formatex( title, sizeof( title ) - 1, "\rTeljesítmények^n" )
1214 //Create the menu
1215 new menu = menu_create( title, "DescriptionMenu_Handle" )
1216
1217 new iNumber[ 5 ], szOption[ 75 ], i
1218 for( i = 0; i < g_iAchCount; i++ ) {
1219 num_to_str( i+1, iNumber, 4 )
1220 formatex( szOption, sizeof( szOption ), "%s \w| \ySTATOD: \R \w)\r %d\d /\r %d\w (", g_iAchsMotd[ i ], g_iAchsMaxPoints[ i ], g_iAchLevel[ id ][ i ] )
1221 menu_additem( menu, szOption, iNumber )
1222 }
1223 for( new iWeap = 0; iWeap < WEAPON_SIZE; iWeap++ ) {
1224 i++
1225 num_to_str( i+1, iNumber, 4 )
1226 formatex( szOption, sizeof( szOption ), "%s \w| \ySTATOD:\R \w)\r %d\d /\r %d\w (", g_szWeaponNames2[ iWeap ], g_iAchsWeaponMaxKills[ iWeap ], g_iPlayersKills[ id ][ g_iWeaponIDs[ iWeap ] ] )
1227 menu_additem( menu, szOption, iNumber )
1228 }
1229
1230
1231 menu_setprop( menu, MPROP_EXIT , MEXIT_NORMAL )
1232 menu_display( id, menu, iPage )
1233}
1234
1235public DescriptionMenu_Handle( id, menu, item )
1236{
1237 if( item == MENU_EXIT )
1238 {
1239 menu_destroy( menu )
1240 return PLUGIN_HANDLED
1241 }
1242
1243 new data[ 6 ], iName[ 64 ]
1244 new access, callback
1245
1246 menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
1247 player_menu_info( id, menu, menu, iPage )
1248
1249 new key = str_to_num( data )
1250 new key_2 = ( key-g_iAchCount-2 )
1251 switch ( key )
1252 {
1253 case 1..30: Print( id, "^4%s^1 %s", g_szAchievementTag, g_iAchsDesciption[ key-1 ] )
1254 case 31..38: Print( id, "^4%s^1 Get a total of^3 %d^1 kills with a^4 %s^1!", g_szAchievementTag, g_iAchsWeaponMaxKills[ key_2 ], g_szWeaponNames2[ key_2 ] )
1255 case 39: Print( id, "^4%s^1 Throw a total of^3 %d^4 %s^1!", g_szAchievementTag, g_iAchsWeaponMaxKills[ key_2 ], g_szWeaponNames2[ key_2 ] )
1256 case 40..54: Print( id, "^4%s^1 Get a total of^3 %d^1 kills with a^4 %s^1!", g_szAchievementTag, g_iAchsWeaponMaxKills[ key_2 ], g_szWeaponNames2[ key_2 ] )
1257 case 55: Print( id, "^4%s^1 Throw a total of^3 %d^4 %s^1!", g_szAchievementTag, g_iAchsWeaponMaxKills[ key_2 ], g_szWeaponNames2[ key_2 ] )
1258 case 56..60: Print( id, "^4%s^1 Get a total of^3 %d^1 kills with a^4 %s^1!", g_szAchievementTag, g_iAchsWeaponMaxKills[ key_2 ], g_szWeaponNames2[ key_2 ] )
1259 }
1260
1261 Ach_HelpMenu( id, iPage )
1262
1263 return PLUGIN_HANDLED
1264}
1265
1266public CmdMainMenu( id )
1267{
1268 Ach_StartMenu( id )
1269}
1270
1271public Ach_StartMenu( id )
1272{
1273 new Float:g_Number = ( g_iAchLevel[ id ][ COMPLETED_ACHIEVEMENTS ]*1.0 )
1274 new Float:g_Number2 = ( g_iAchsMaxPoints[ COMPLETED_ACHIEVEMENTS ]*1.0 )
1275 new Float:g_Number3 = g_Number/g_Number2*100
1276 //Menu Title
1277 new title[ 64 ]; formatex( title, sizeof( title ) - 1, "\yTeljesítmények^n\wEddig\r %.f teljesítményt\w értél el!^n", g_Number3 )
1278 //Create the menu
1279 new menu = menu_create( title, "StartMenu_Handle" )
1280 //menu_additem( menu, "\wInfo", "1", 0 )
1281 menu_additem( menu, "\r[\dKüldetések\r]", "2", 0 )
1282 menu_additem( menu, "\r[\dSegítség\r]", "3", 0 )
1283 menu_additem( menu, "\r[\dAdmin beállítások\r]", "4", ADMIN_CVAR )
1284 menu_display( id, menu )
1285}
1286
1287public StartMenu_Handle( id, menu, item )
1288{
1289 if( item == MENU_EXIT )
1290 {
1291 menu_destroy( menu )
1292 return PLUGIN_HANDLED
1293 }
1294
1295 new data[ 6 ], iName[ 64 ]
1296 new access, callback
1297
1298 menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
1299
1300 new key = str_to_num( data )
1301 switch( key )
1302 {
1303 case 1:
1304 {
1305 Print( id, "^4[AMXX]^1 This server is using^3 Achievements^4 v%s^1, by^3 Pastout!", VERSION )
1306 Ach_StartMenu( id )
1307 }
1308 case 2:
1309 {
1310 Ach_PlayerInfoMenu( id )
1311 }
1312 case 3:
1313 {
1314 Ach_HelpMenu( id, iPage )
1315 }
1316 case 4:
1317 {
1318 Ach_AdminCvarMenu( id )
1319 }
1320 }
1321 return PLUGIN_HANDLED
1322}
1323
1324new const g_szGetCvar_String[][] =
1325{
1326 "\rOff",
1327 "\yDisplay Only to Player",
1328 "\wDisplay to Everyone"
1329}
1330
1331public Ach_AdminCvarMenu( id )
1332{
1333 //Menu Title
1334 new title[ 64 ]; formatex( title, sizeof( title ) - 1, "\rAdmin\w beállítások^n" )
1335 //Create the menu
1336 new menu = menu_create( title, "AdminCvarMenu_Handle" )
1337 new szOption[ 75 ]
1338 formatex( szOption, sizeof( szOption ), "Show Author Info %s", get_pcvar_num( g_pCvar_ShowInfo ) == 0 ? "\rOff" : "\yOn" )
1339 menu_additem( menu, szOption, "1", ADMIN_CVAR )
1340 formatex( szOption, sizeof( szOption ), "Death Message %s", get_pcvar_num( g_pCvar_DeathMessage ) == 0 ? "\rOff" : "\yOn" )
1341 menu_additem( menu, szOption, "2", ADMIN_CVAR )
1342 formatex( szOption, sizeof( szOption ), "Flash Message %s", get_pcvar_num( g_pCvar_FlashMessage ) == 0 ? "\rOff" : "\yOn" )
1343 menu_additem( menu, szOption, "3", ADMIN_CVAR )
1344 formatex( szOption, sizeof( szOption ), "Bomb Message %s", get_pcvar_num( g_pCvar_BombMessage ) == 0 ? "\rOff" : "\yOn" )
1345 menu_additem( menu, szOption, "4", ADMIN_CVAR )
1346 formatex( szOption, sizeof( szOption ), "Play Sound %s", get_pcvar_num( g_pCvar_PlaySound ) == 0 ? "\rOff" : "\yOn" )
1347 menu_additem( menu, szOption, "5", ADMIN_CVAR )
1348 if( get_pcvar_num( g_pCvar_Reward ) == 0 )
1349 {
1350 menu_additem( menu, "Reward Cash \rOff", "6", ADMIN_CVAR )
1351 }
1352 else
1353 {
1354 formatex( szOption, sizeof( szOption ), "Pénzjutalom \y%d", get_pcvar_num( g_pCvar_Reward ) )
1355 menu_additem( menu, szOption, "6", ADMIN_CVAR )
1356 }
1357 formatex( szOption, sizeof( szOption ), "Achievement Message %s", g_szGetCvar_String[ get_pcvar_num( g_pCvar_Message ) ] )
1358 menu_additem( menu, szOption, "7", ADMIN_CVAR )
1359 menu_display( id, menu )
1360}
1361
1362public AdminCvarMenu_Handle( id, menu, item )
1363{
1364 if( item == MENU_EXIT )
1365 {
1366 menu_destroy( menu )
1367 return PLUGIN_HANDLED
1368 }
1369
1370 new data[ 6 ], iName[ 64 ]
1371 new access, callback
1372
1373 menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
1374
1375 new key = str_to_num( data )
1376 switch( key )
1377 {
1378 case 1: ToggleCvar( g_pCvar_ShowInfo )
1379 case 2: ToggleCvar( g_pCvar_DeathMessage )
1380 case 3: ToggleCvar( g_pCvar_FlashMessage )
1381 case 4: ToggleCvar( g_pCvar_BombMessage )
1382 case 5: ToggleCvar( g_pCvar_PlaySound )
1383 case 6: DoEnterValue( id )
1384 case 7: ToggleCvar( g_pCvar_Message )
1385 }
1386
1387 Ach_AdminCvarMenu( id )
1388 return PLUGIN_HANDLED
1389}
1390
1391ToggleCvar( Cvar )
1392{
1393 if( g_pCvar_Message == Cvar )
1394 {
1395 switch ( get_pcvar_num( Cvar ) )
1396 {
1397 case 2: set_pcvar_num( Cvar, 0 )
1398 case 1: set_pcvar_num( Cvar, 2 )
1399 case 0: set_pcvar_num( Cvar, 1 )
1400 default: set_pcvar_num( Cvar, 2 )
1401 }
1402 }
1403 else
1404 {
1405 switch ( get_pcvar_num( Cvar ) )
1406 {
1407 case 1: set_pcvar_num( Cvar, 0 )
1408 case 0: set_pcvar_num( Cvar, 1 )
1409 default: set_pcvar_num( Cvar, 1 )
1410 }
1411 }
1412}
1413
1414DoEnterValue( id )
1415{
1416 client_cmd(id, "messagemode Enter_Value")
1417}
1418
1419public CmdEnterValue( id )
1420{
1421 new arg[ 5 ]
1422 read_argv( 1, arg, charsmax( arg ) )
1423
1424 if ( !strlen( arg ) )
1425 {
1426 Print( id, "Please type a new value." )
1427 client_cmd( id, "messagemode Enter_Value" )
1428 return PLUGIN_HANDLED
1429 }
1430 else if ( !IsStrFloat( arg ) )
1431 {
1432 Print( id, "You cannot use letters for this cvar! Please type a new value." )
1433 client_cmd( id, "messagemode Enter_Value" )
1434 return PLUGIN_HANDLED
1435 }
1436 new iCvar = str_to_num( arg )
1437 set_pcvar_num( g_pCvar_Reward, iCvar )
1438 Ach_AdminCvarMenu( id )
1439 return PLUGIN_HANDLED
1440}
1441
1442bool:IsStrFloat( string[] )
1443{
1444 new len = strlen( string )
1445 for( new i = 0; i < len; i++ )
1446 {
1447 switch ( string[ i ] )
1448 {
1449 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '-', '*':continue;
1450 default: return false;
1451 }
1452 }
1453 return true
1454}
1455
1456public Ach_PlayerInfoMenu( id )
1457{
1458 new title[ 64 ]; formatex( title, sizeof( title ) - 1, "\rJátékosok teljesítményei^n\w - \yVálassz játékost")
1459 new menu = menu_create( title, "Ach_PlayerInfoMenu_Handle" )
1460
1461 new players[ 32 ], pnum, tempid
1462 new szName[ 32 ], szTempid[ 10 ]
1463
1464 get_players( players, pnum, "h" )
1465
1466 for( new i; i < pnum; i++ )
1467 {
1468 tempid = players[ i ]
1469
1470 get_user_name( tempid, szName, charsmax( szName ) )
1471 num_to_str( tempid, szTempid, 9 )
1472
1473 if( id == tempid )
1474 menu_additem( menu, "\dA SAJÁT STATISZTIKÁD", szTempid, 0 )
1475 else
1476 menu_additem( menu, szName, szTempid, 0 )
1477 }
1478
1479 menu_display( id, menu )
1480}
1481
1482public Ach_PlayerInfoMenu_Handle( id, menu, item )
1483{
1484 if( item == MENU_EXIT )
1485 {
1486 menu_destroy( menu )
1487 if( GetBit( is_Connected, id ) )
1488 Ach_StartMenu( id )
1489 return PLUGIN_HANDLED
1490 }
1491
1492 new data[ 6 ], iName[ 64 ]
1493 new access, callback
1494 menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
1495
1496 g_iGetTempid[ id ] = str_to_num( data )
1497
1498 Ach_PlayerInfoDisplayMenu( id )
1499
1500 return PLUGIN_HANDLED
1501}
1502
1503public Ach_PlayerInfoDisplayMenu( id )
1504{
1505 new Float:g_Number = ( g_iAchLevel[ id ][ COMPLETED_ACHIEVEMENTS ]*1.0 )
1506 new Float:g_Number2 = ( g_iAchsMaxPoints[ COMPLETED_ACHIEVEMENTS ]*1.0 )
1507 new Float:g_Number3 = g_Number/g_Number2*100
1508 new szName[ 32 ]; get_user_name( g_iGetTempid[ id ], szName, charsmax( szName ) )
1509 //Menu Title
1510 new title[ 128 ]; formatex( title, sizeof( title ) - 1, "\rTeljesítmények^n\w -\y %s\d is\r %.f teljesítmény\w elérve!^n", szName, g_Number3 )
1511 //Create the menu
1512 new menu = menu_create( title, "DescriptionMenu_PlayerHandle" )
1513
1514 new iNumber[ 5 ], szOption[ 75 ], i
1515 for( i = 0; i < g_iAchCount; i++ ) {
1516 num_to_str( i+1, iNumber, 4 )
1517 formatex( szOption, sizeof( szOption ), "%s \w| \ySTAT: \R \w)\r %d\d /\r %d\w (", g_iAchsMotd[ i ], g_iAchsMaxPoints[ i ], g_iAchLevel[ g_iGetTempid[ id ] ][ i ] )
1518 menu_additem( menu, szOption, iNumber )
1519 }
1520 for( new iWeap = 0; iWeap < WEAPON_SIZE; iWeap++ ) {
1521 i++
1522 num_to_str( i+1, iNumber, 4 )
1523 formatex( szOption, sizeof( szOption ), "%s \w| \ySTAT: \R \w)\r %d\d /\r %d\w (", g_szWeaponNames2[ iWeap ], g_iAchsWeaponMaxKills[ iWeap ], g_iPlayersKills[ g_iGetTempid[ id ] ][ g_iWeaponIDs[ iWeap ] ] )
1524 menu_additem( menu, szOption, iNumber )
1525 }
1526
1527
1528 menu_setprop( menu, MPROP_EXIT , MEXIT_NORMAL )
1529 menu_display( id, menu, iPage )
1530
1531 return PLUGIN_HANDLED
1532}
1533
1534public DescriptionMenu_PlayerHandle( id, menu, item )
1535{
1536 if( item == MENU_EXIT )
1537 {
1538 menu_destroy( menu )
1539 if( GetBit( is_Connected, id ) )
1540 Ach_PlayerInfoMenu( id )
1541 return PLUGIN_HANDLED
1542 }
1543
1544 new data[ 6 ], iName[ 64 ]
1545 new access, callback
1546
1547 menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
1548 player_menu_info( id, menu, menu, iPage )
1549
1550 Ach_PlayerInfoDisplayMenu( id )
1551
1552 return PLUGIN_HANDLED
1553}
1554
1555public plugin_end()
1556{
1557 TrieDestroy( g_tWeaponNameToID )
1558 #if !defined USING_SQL
1559 nvault_close( g_iVault )
1560 #endif
1561}
1562
1563public Ham_CBasePlayer_Spawn( id )
1564{
1565 if( !is_user_alive( id ) )
1566 {
1567 return HAM_IGNORED
1568 }
1569
1570 SetBit( is_Alive, id )
1571
1572 return HAM_IGNORED;
1573}
1574
1575public client_connect( id )
1576{
1577 ResetStats( id )
1578}
1579
1580public client_authorized( id )
1581{
1582 if(/* is_user_bot( id ) ||*/ is_user_hltv( id ) )
1583 {
1584 SetBit( is_NotValidPlayer, id )
1585 }
1586
1587 if( !GetBit( is_NotValidPlayer, id ) )
1588 {
1589 #if defined USING_REGEX
1590 get_user_authid( id, g_iAuthID[ id ], charsmax( g_iAuthID[] ) )
1591
1592 if( !IsValidAuthid( g_iAuthID[ id ] ) )
1593 {
1594 g_iAuthID[ id ][ 0 ] = 0
1595 }
1596 else
1597 {
1598 g_iLoadStats( id )
1599 }
1600 #else
1601 if( is_user_bot( id ) )
1602 {
1603 get_user_name( id, g_iAuthID[ id ], charsmax( g_iAuthID[] ) )
1604 }
1605 else if( !IsValidAuthid( g_iAuthID[ id ] ) )
1606 {
1607 get_user_ip( id, g_iAuthID[ id ], charsmax( g_iAuthID[] ) )
1608 }
1609 else
1610 {
1611 get_user_authid( id, g_iAuthID[ id ], charsmax( g_iAuthID[] ) )
1612 }
1613
1614 g_iLoadStats( id )
1615 #endif
1616 }
1617}
1618
1619public client_putinserver( id )
1620{
1621 SetBit( is_Connected, id )
1622 if( GetBit( is_Connected, id ) )
1623 {
1624 #if defined USING_REGEX
1625 if( !IsUserAuthorized( id ) )
1626 {
1627 return
1628 }
1629 #endif
1630 g_iJoinTime[ id ] = get_systime();
1631
1632 DelBit( is_Alive, id );
1633
1634 SetBit( g_iDeathMessages, id )
1635 g_iAchLevel[ id ][ CONNECTIONS ]++
1636
1637 new szName[ 32 ]
1638 get_user_name( id, szName, charsmax( szName ) )
1639
1640 switch( g_iAchLevel[ id ][ CONNECTIONS ] )
1641 {
1642 case 50: AchievementSecondary( id, 0 )
1643
1644 case 100: AchievementSecondary( id, 1 )
1645
1646 case 250: AchievementSecondary( id, 2 )
1647
1648 case MAX_CONNECTION:
1649 {
1650 Achievement( id, CONNECTIONS, -1 )
1651 }
1652 }
1653 }
1654}
1655
1656public client_disconnect( id )
1657{
1658 #if defined USING_REGEX
1659 if( !IsUserAuthorized( id ) )
1660 {
1661 return
1662 }
1663 #endif
1664 if( !GetBit( is_NotValidPlayer, id ) )
1665 {
1666 g_iSaveStats( id )
1667 }
1668
1669 g_iJoinTime[ id ] = 0;
1670 DelBit( is_Connected, id );
1671 DelBit( is_Alive, id )
1672
1673 #if defined USING_SQL
1674 g_loaded_data[ id ] = 0
1675 #endif
1676}
1677
1678public FwdCmdStart( id, handle )
1679{
1680 if ( !GetBit( is_Connected, id ) && !GetBit( is_Alive, id ) )
1681 {
1682 return FMRES_IGNORED
1683 }
1684 #if defined USING_REGEX
1685 if( !IsUserAuthorized( id ) )
1686 {
1687 return FMRES_IGNORED
1688 }
1689 #endif
1690
1691 if( g_iAchLevel[ id ][ CAMP_FIRE ] < MAX_CAMP_FIRE )
1692 {
1693 if( entity_get_int( id, EV_INT_button ) & ( IN_MOVELEFT | IN_MOVERIGHT | IN_BACK | IN_FORWARD ) )
1694 {
1695 DelBit( iKillerHasNotMoved, id )
1696 g_iKills[ id ] = 0
1697 }
1698 else
1699 {
1700 SetBit( iKillerHasNotMoved, id )
1701 }
1702 }
1703
1704 if( g_iAchLevel[ id ][ FLY_AWAY ] < MAX_FLY_AWAY || g_iAchLevel[ id ][ FLY_KILLER ] < MAX_FLY_KILLER)
1705 {
1706 if( entity_get_int( id, EV_INT_flags ) & FL_ONGROUND )
1707 {
1708 DelBit( is_VictimInAir, id )
1709 }
1710 else
1711 {
1712 SetBit( is_VictimInAir, id )
1713 }
1714 }
1715
1716 if( g_iAchLevel[ id ][ DISTANCE_WALKED ] < MAX_DISTANCE_WALKED && !GetBit( iKillerHasNotMoved, id ) )
1717 {
1718 new Float:vecOrigin[ 3 ]
1719 entity_get_vector( id, EV_VEC_origin, vecOrigin )
1720
1721 if( !xs_vec_equal( vecOldOrigin[ id ], vecNullOrigin ) )
1722 {
1723 flDistance[ id ] += get_distance_f( vecOrigin, vecOldOrigin[ id ] )
1724 }
1725
1726 xs_vec_copy( vecOrigin, vecOldOrigin[ id ] )
1727
1728 new szName[ 32 ]
1729 get_user_name( id, szName, charsmax( szName ) )
1730
1731 switch( g_iAchLevel[ id ][ DISTANCE_WALKED ] )
1732 {
1733 case 0:
1734 {
1735 if( flDistance[ id ]/g_iFeet >= 1 )//baby steps
1736 {
1737 g_iAchLevel[ id ][ DISTANCE_WALKED ]++
1738 AchievementSecondary( id, 3 )
1739 }
1740 }
1741 case 1:
1742 {
1743 if( flDistance[ id ]/g_iFeet >= 5280 )//1 mile hey?
1744 {
1745 g_iAchLevel[ id ][ DISTANCE_WALKED ]++
1746 AchievementSecondary( id, 4 )
1747 }
1748 }
1749 case MAX_DISTANCE_WALKED:
1750 {
1751 if( flDistance[ id ]/g_iFeet >= 26400 )//Five miles hey? Is this possible IDK lol
1752 {
1753 Achievement( id, DISTANCE_WALKED, -1 )
1754 }
1755 }
1756 }
1757 }
1758
1759 return FMRES_IGNORED
1760}
1761
1762ResetStats( id )
1763{
1764 flDistance[ id ] = 0.0
1765 xs_vec_copy( vecNullOrigin, vecOldOrigin[ id ] )
1766}
1767
1768public Event_NewRound()
1769{
1770 if ( task_exists( 2345 ) )
1771 remove_task( 2345 )
1772 if ( task_exists( 2346 ) )
1773 remove_task( 2346 )
1774
1775 if( get_pcvar_num( g_pCvar_ShowInfo ) == 1 )
1776 {
1777 if( g_iRounds >= 10 ) {
1778 Print( 0, "^4[AMXX]^1 This server is using^3 Achievements^4 v%s^1, by^3 Pastout!", VERSION )
1779 Print( 0, "^4[AMXX]^1 Type^3 /help^1 for information about^4 achievements")
1780 g_iRounds = 0
1781 }
1782
1783 g_iRounds++
1784 }
1785
1786 new iPlayers[ 32 ], iNum, iPlayer
1787 get_players( iPlayers, iNum, "ch" )
1788
1789 for( new i = 0; i < iNum; i++ )
1790 {
1791 iPlayer = iPlayers[ i ]
1792
1793 g_iRoundSparys[ iPlayer ] = 0;
1794 DelBit( StandAlone, iPlayer )
1795 }
1796
1797 g_iBombPlant = false
1798 g_iGetBombPlanted = 26
1799
1800 set_task( 1.0, "CheckBombPlantedTimer", 2345, _, _, "a", g_iGetBombPlanted )
1801}
1802
1803public CheckBombPlantedTimer( )
1804{
1805 g_iGetBombPlanted--
1806
1807 if( g_iGetBombPlanted >= 1 )
1808 g_iGetBombDown = true
1809 else
1810 {
1811 g_iGetBombDown = false
1812 remove_task( 2345 )
1813 }
1814
1815}
1816
1817public bomb_defused( iDefuser )
1818{
1819 #if defined USING_REGEX
1820 if( !IsUserAuthorized( iDefuser ) )
1821 {
1822 return PLUGIN_HANDLED
1823 }
1824 #endif
1825 new szName[ 32 ]
1826 get_user_name( iDefuser, szName, charsmax( szName ) )
1827
1828 if( g_iBombPlant && g_iAchLevel[ iDefuser ][ BOMB ] < MAX_BOMB )
1829 {
1830 g_iAchLevel[ iDefuser ][ BOMB ]++
1831 Achievement( iDefuser, BOMB, -1 )
1832 }
1833
1834 g_iAchLevel[ iDefuser ][ DEFUSED_BOMB ]++
1835 switch( g_iAchLevel[ iDefuser ][ DEFUSED_BOMB ] )
1836 {
1837 case 5: AchievementSecondary( iDefuser, 5 )
1838
1839 case 10: AchievementSecondary( iDefuser, 6 )
1840
1841 case 15: AchievementSecondary( iDefuser, 7 )
1842
1843 case 20: AchievementSecondary( iDefuser, 8 )
1844
1845 case MAX_DEFUSED_BOMB:
1846 {
1847 Achievement( iDefuser, DEFUSED_BOMB, -1 )
1848 }
1849 }
1850 if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
1851 {
1852 Print( 0, "^4[AMXX]^3 %s^1 has defused the^4 bomb.", szName )
1853 }
1854 #if defined USING_REGEX
1855 return PLUGIN_HANDLED
1856 #endif
1857}
1858
1859public bomb_defusing( id )
1860{
1861 if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
1862 {
1863 new szName[ 32 ]; get_user_name( id, szName, charsmax( szName ) )
1864 Print( 0, "^4[AMXX]^3 %s^1 is defusing the^4 bomb^1 with%s a^3 kit^1.", szName, is_DefusingWithKit ? "" : "out" )
1865 }
1866}
1867
1868public bomb_planting( id )
1869{
1870 if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
1871 {
1872 new szName[ 32 ]; get_user_name( id, szName, charsmax( szName ) )
1873 Print( 0, "^4[AMXX]^3 %s^1 is planting the^4 bomb.", szName )
1874 }
1875}
1876
1877public bomb_planted( iPlanter )
1878{
1879 #if defined USING_REGEX
1880 if( !IsUserAuthorized( iPlanter ) )
1881 {
1882 return PLUGIN_HANDLED
1883 }
1884 #endif
1885
1886 g_iBombTime = get_pcvar_num( g_pCvarC4Timer )
1887 set_task( 1.0, "CheckC4Timer", 2346, _, _, "a", g_iBombTime )
1888
1889 g_iAchLevel[ iPlanter ][ PLANT_BOMB_COUNT ]++
1890
1891 if( GetBit(is_Connected, iPlanter ) && GetBit( is_Alive, iPlanter ) )
1892 {
1893
1894 if( g_iGetBombDown && g_iAchLevel[ iPlanter ][ PLANT_BOMB ] < MAX_PLANT_BOMB )
1895 {
1896 g_iAchLevel[ iPlanter ][ PLANT_BOMB ]++
1897 Achievement( iPlanter, PLANT_BOMB, -1 )
1898 }
1899
1900 switch( g_iAchLevel[ iPlanter ][ PLANT_BOMB_COUNT ] )
1901 {
1902 case MAX_PLANT_BOMB_COUNT:
1903 {
1904 Achievement( iPlanter, PLANT_BOMB_COUNT, -1 )
1905 }
1906 }
1907 }
1908 if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
1909 {
1910 new szName[ 32 ]; get_user_name( iPlanter, szName, charsmax( szName ) )
1911 Print( 0, "^4[AMXX]^3 %s^1 has planted the^4 bomb.", szName )
1912 }
1913
1914 g_C4Ent = fm_get_c4()
1915 pev( g_C4Ent , pev_origin , g_fC4Origin )
1916
1917 #if defined USING_REGEX
1918 return PLUGIN_HANDLED
1919 #endif
1920}
1921
1922public CheckC4Timer()
1923{
1924 g_iBombTime --
1925 if( g_iBombTime <= 1 )
1926 {
1927 g_iBombPlant = true
1928 remove_task( 2346 )
1929 }
1930}
1931
1932public Event_GotBomb( id )
1933{
1934 g_iPlanter = id
1935}
1936
1937public bomb_explode( g_iPlayer )
1938{
1939 if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
1940 {
1941 Print( 0, "^4[AMXX]^1 The^3 bomb^1 has^4 exploded." )
1942 }
1943}
1944
1945public client_death( iKiller, iVictim, iWeapon, iHitplace, TK )
1946{
1947 #if defined USING_REGEX
1948 if( !IsUserAuthorized( iKiller ) || !IsUserAuthorized( iVictim ) )
1949 {
1950 return PLUGIN_HANDLED
1951 }
1952 #endif
1953
1954 if( ( iWeapon == CSW_HEGRENADE ) && !TK && GetBit( is_Alive, iKiller ) )
1955 {
1956 g_iPlayersKills[ iKiller ][ CSW_HEGRENADE ]++
1957 if( g_iPlayersKills[ iKiller ][ CSW_HEGRENADE ] == 25 )
1958 {
1959 Achievement( iKiller, -1, HEGRENADE )
1960 }
1961
1962 g_iGrenadeKills[ iKiller ]++
1963 if( g_iGrenadeKills[ iKiller ] >= 3 )
1964 {
1965 g_iAchLevel[ iKiller ][ HAT_TRICK ]++
1966 switch( g_iAchLevel[ iKiller ][ HAT_TRICK ] )
1967 {
1968 case MAX_HAT_TRICK:
1969 {
1970 Achievement( iKiller, HAT_TRICK, -1 )
1971 }
1972 }
1973 g_iGrenadeKills[ iKiller ] = 0
1974 }
1975 set_task( 0.3, "ResetGrenadeKills", iKiller )
1976 }
1977
1978 #if defined USING_REGEX
1979 return PLUGIN_HANDLED
1980 #endif
1981}
1982
1983public ResetGrenadeKills( iKiller )
1984 if( GetBit( is_Connected, iKiller ) )
1985 g_iGrenadeKills[ iKiller ] = 0;
1986
1987public grenade_throw( id, grenadeIndex, weaponId )
1988{
1989 #if defined USING_REGEX
1990 if( !IsUserAuthorized( id ) )
1991 {
1992 return PLUGIN_HANDLED
1993 }
1994 #endif
1995
1996 switch( weaponId )
1997 {
1998 case CSW_FLASHBANG:
1999 {
2000 g_iPlayersKills[ id ][ CSW_FLASHBANG ]++
2001
2002 if( g_iPlayersKills[ id ][ CSW_FLASHBANG ] == MAX_FLASHBANG )
2003 {
2004 Achievement( id, -1, FLASHBANG )
2005 }
2006 }
2007 case CSW_SMOKEGRENADE:
2008 {
2009 g_iPlayersKills[ id ][ CSW_SMOKEGRENADE ]++
2010
2011 if( g_iPlayersKills[ id ][ CSW_SMOKEGRENADE ] == MAX_SMOKEGRENADE )
2012 {
2013 Achievement( id, -1, SMOKEGRENADE )
2014 }
2015 }
2016 }
2017 #if defined USING_REGEX
2018 return PLUGIN_HANDLED
2019 #endif
2020}
2021
2022get_user_flashed( id, &iPercent=0 )
2023{
2024 new Float:flFlashedAt = get_pdata_float( id, m_flFlashedAt, XO_PLAYER )
2025
2026 if( !flFlashedAt )
2027 {
2028 return 0
2029 }
2030
2031 new Float:flGameTime = get_gametime()
2032 new Float:flTimeLeft = flGameTime - flFlashedAt
2033 new Float:flFlashDuration = get_pdata_float( id, m_flFlashDuration, XO_PLAYER )
2034 new Float:flFlashHoldTime = get_pdata_float( id, m_flFlashHoldTime, XO_PLAYER )
2035 new Float:flTotalTime = flFlashHoldTime + flFlashDuration
2036
2037 if( flTimeLeft > flTotalTime )
2038 {
2039 return 0
2040 }
2041
2042 new iFlashAlpha = get_pdata_int( id, m_iFlashAlpha, XO_PLAYER )
2043
2044 if( iFlashAlpha == ALPHA_FULLBLINDED )
2045 {
2046 if( get_pdata_float( id, m_flFlashedUntil, XO_PLAYER) - flGameTime > 0.0 )
2047 {
2048 iPercent = 100
2049 }
2050 else
2051 {
2052 iPercent = 100-floatround( ( ( flGameTime - ( flFlashedAt + flFlashHoldTime ) ) * 100.0 )/flFlashDuration )
2053 }
2054 }
2055 else
2056 {
2057 iPercent = 100-floatround( ( ( flGameTime - flFlashedAt ) * 100.0 ) / flTotalTime )
2058 }
2059
2060 return iFlashAlpha
2061}
2062
2063public Event_PlayerKilled()
2064{
2065 new iKiller = read_data( 1 )
2066 new iVictim = read_data( 2 )
2067
2068 if( is_user_alive( iKiller ) )
2069 SetBit( is_Alive, iKiller )
2070 else
2071 DelBit( is_Alive, iKiller )
2072
2073 if( !IsPlayer( iKiller ) || iKiller == iVictim )
2074 {
2075 return PLUGIN_HANDLED
2076 }
2077
2078 #if defined USING_REGEX
2079 if( !IsUserAuthorized( iKiller ) || !IsUserAuthorized( iVictim ) )
2080 {
2081 return PLUGIN_HANDLED
2082 }
2083 #endif
2084
2085 new headshot = read_data( 3 )
2086 new g_iKiller[ 32 ], g_iVictim[ 32 ], g_iWeapon[ 16 ], g_iOrigin[ 3 ], g_iOrigin2[ 3 ]
2087 read_data(4, g_iWeapon, 15)
2088
2089 get_user_origin( iKiller, g_iOrigin )
2090 get_user_origin( iVictim, g_iOrigin2 )
2091 new flDistance = get_distance( g_iOrigin, g_iOrigin2 )
2092
2093 get_user_name( iKiller, g_iKiller, charsmax( g_iKiller ) )
2094 get_user_name( iVictim, g_iVictim, charsmax( g_iVictim ) )
2095
2096 if( GetBit( iKillerShot, iKiller ) )
2097 {
2098 g_iShotKills[ iKiller ]++
2099 if( g_iShotKills[ iKiller ] >= 2 )
2100 {
2101 g_iAchLevel[ iKiller ][ AMMO_CONSERVATION ]++
2102 switch( g_iAchLevel[ iKiller ][ AMMO_CONSERVATION ] )
2103 {
2104 case MAX_AMMO_CONSERVATION:
2105 {
2106 Achievement( iKiller, AMMO_CONSERVATION, -1 )
2107 }
2108 }
2109 g_iShotKills[ iKiller ] = 0
2110 }
2111 }
2112
2113 if( headshot )
2114 {
2115
2116 g_iAchLevel[ iKiller ][ HEAD_SHOTS ]++
2117
2118 switch( g_iAchLevel[ iKiller ][ HEAD_SHOTS ] )
2119 {
2120 case MAX_HEAD_SHOTS:
2121 {
2122 Achievement( iKiller, HEAD_SHOTS, -1 )
2123 }
2124 }
2125 }
2126
2127 if( TrieGetCell( g_tWeaponNameToID, g_iWeapon, iWeaponID ) )
2128 {
2129 g_iPlayersKills[ iKiller ][ iWeaponID ]++
2130
2131 switch( iWeaponID )
2132 {
2133 case CSW_SCOUT:
2134 {
2135 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2136 {
2137 case MAX_SCOUT:
2138 {
2139 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2140 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2141 Achievement( iKiller, -1, SCOUT )
2142 }
2143 }
2144 }
2145 case CSW_MAC10:
2146 {
2147 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2148 {
2149 case MAX_MAC10:
2150 {
2151 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2152 Achievement( iKiller, -1, MAC10 )
2153 }
2154 }
2155 }
2156 case CSW_AUG:
2157 {
2158 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2159 {
2160 case MAX_AUG:
2161 {
2162 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2163 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2164 Achievement( iKiller, -1, AUG )
2165 }
2166 }
2167
2168 }
2169 /*
2170 case CSW_SMOKEGRENADE:
2171 {
2172 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2173 {
2174
2175 }
2176 }*/
2177 case CSW_UMP45:
2178 {
2179 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2180 {
2181 case MAX_UMP45:
2182 {
2183 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2184 Achievement( iKiller, -1, UMP45 )
2185 }
2186 }
2187 }
2188 case CSW_SG550:
2189 {
2190 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2191 {
2192 case MAX_SG550:
2193 {
2194 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2195 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2196 Achievement( iKiller, -1, SG550 )
2197 }
2198 }
2199 }
2200 case CSW_GALIL:
2201 {
2202 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2203 {
2204 case MAX_GALIL:
2205 {
2206 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2207 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2208 Achievement( iKiller, -1, GALIL )
2209 }
2210 }
2211 }
2212 case CSW_FAMAS:
2213 {
2214 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2215 {
2216 case MAX_FAMAS:
2217 {
2218 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2219 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2220 Achievement( iKiller, -1, FAMAS )
2221 }
2222 }
2223 }
2224 case CSW_AWP:
2225 {
2226 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2227 {
2228 case MAX_AWP:
2229 {
2230 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2231 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2232 Achievement( iKiller, -1, AWP )
2233 }
2234 }
2235 }
2236 case CSW_MP5NAVY:
2237 {
2238 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2239 {
2240 case MAX_MP5NAVY:
2241 {
2242 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2243 Achievement( iKiller, -1, MP5NAVY )
2244 }
2245 }
2246 }
2247 case CSW_M249:
2248 {
2249 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2250 {
2251 case MAX_M249:
2252 {
2253 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2254 Achievement( iKiller, -1, M249 )
2255 }
2256 }
2257 }
2258 case CSW_M4A1:
2259 {
2260 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2261 {
2262 case MAX_M4A1:
2263 {
2264 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2265 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2266 Achievement( iKiller, -1, M4A1 )
2267 }
2268 }
2269 }
2270 case CSW_TMP:
2271 {
2272 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2273 {
2274 case MAX_TMP:
2275 {
2276 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2277 Achievement( iKiller, -1, TMP )
2278 }
2279 }
2280 }
2281 case CSW_G3SG1:
2282 {
2283 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2284 {
2285 case MAX_G3SG1:
2286 {
2287 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2288 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2289 Achievement( iKiller, -1, G3SG1 )
2290 }
2291 }
2292 }
2293 /*
2294 case CSW_FLASHBANG:
2295 {
2296 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2297 {
2298
2299 }
2300 }*/
2301 case CSW_SG552:
2302 {
2303 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2304 {
2305 case MAX_SG552:
2306 {
2307 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2308 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2309 Achievement( iKiller, -1, SG552 )
2310 }
2311 }
2312 }
2313 case CSW_AK47:
2314 {
2315 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2316 {
2317 case MAX_AK47:
2318 {
2319 g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
2320 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2321 Achievement( iKiller, -1, AK47 )
2322 }
2323 }
2324 }
2325 case CSW_KNIFE:
2326 {
2327 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2328 {
2329 case MAX_KNIFE:
2330 {
2331 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2332 Achievement( iKiller, -1, KNIFE )
2333 }
2334 }
2335 }
2336 case CSW_P90:
2337 {
2338 switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
2339 {
2340 case MAX_P90:
2341 {
2342 g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
2343 Achievement( iKiller, -1, P90 )
2344 }
2345 }
2346 }
2347 }
2348 }
2349 new g_RoundDistance = floatround( flDistance/g_iFeet )
2350
2351 switch( g_iAchLevel[ iKiller ][ DISTANCE_KILLED ] )
2352 {
2353 case 0:
2354 {
2355 if( g_RoundDistance <= 5 )
2356 {
2357 g_iAchLevel[ iKiller ][ DISTANCE_KILLED ]++
2358 AchievementSecondary( iKiller, 9 )
2359 }
2360 }
2361
2362 case 1:
2363 {
2364 if( 6 <= g_RoundDistance <= 50 )
2365 {
2366 g_iAchLevel[ iKiller ][ DISTANCE_KILLED ]++
2367 AchievementSecondary( iKiller, 10 )
2368 }
2369 }
2370
2371 case 2:
2372 {
2373 if( 51 <= g_RoundDistance <= 99 )
2374 {
2375 g_iAchLevel[ iKiller ][ DISTANCE_KILLED ]++
2376 AchievementSecondary( iKiller, 11 )
2377 }
2378 }
2379
2380 case 3:
2381 {
2382 if( 100 <= g_RoundDistance <= 150 )
2383 {
2384 g_iAchLevel[ iKiller ][ DISTANCE_KILLED ]++
2385 AchievementSecondary( iKiller, 12 )
2386 }
2387 }
2388 case MAX_DISTANCE_KILLED:
2389 {
2390 if( 151 <= g_RoundDistance <= 300 )
2391 {
2392 Achievement( iKiller, DISTANCE_KILLED, -1 )
2393 }
2394 }
2395 }
2396
2397 g_iAchLevel[ iKiller ][ TOTAL_KILLS ]++
2398 switch( g_iAchLevel[ iKiller ][ TOTAL_KILLS ] )
2399 {
2400 case 250:
2401 {
2402 AchievementSecondary( iKiller, 13 )
2403 }
2404 case MAX_TOTAL_KILLS:
2405 {
2406 Achievement( iKiller, TOTAL_KILLS, -1 )
2407 }
2408 }
2409 switch( g_iAchLevel[ iKiller ][ RIFLE_MASTER ] )
2410 {
2411 case MAX_RIFLE_MASTER:
2412 {
2413 Achievement( iKiller, RIFLE_MASTER, -1 )
2414 }
2415 }
2416 switch( g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ] )
2417 {
2418 case MAX_MASTER_AT_ARMS:
2419 {
2420 Achievement( iKiller, MASTER_AT_ARMS, -1 )
2421 }
2422 }
2423
2424 if( GetBit( is_VictimInAir, iVictim ) )
2425 {
2426 g_iAchLevel[ iKiller ][ FLY_AWAY ]++
2427 switch( g_iAchLevel[ iKiller ][ FLY_AWAY ] )
2428 {
2429 case MAX_FLY_AWAY:
2430 {
2431 Achievement( iKiller, FLY_AWAY, -1 )
2432 }
2433 }
2434 }
2435 if( GetBit( is_VictimInAir, iKiller ) )
2436 {
2437 g_iAchLevel[ iKiller ][ FLY_KILLER ]++
2438 switch( g_iAchLevel[ iKiller ][ FLY_KILLER ] )
2439 {
2440 case MAX_FLY_KILLER:
2441 {
2442 Achievement( iKiller, FLY_KILLER, -1 )
2443 }
2444 }
2445 }
2446 new iPercent
2447 if( get_user_flashed( iKiller, iPercent ) )
2448 {
2449 if( get_pcvar_num( g_pCvar_FlashMessage ) == 1 )
2450 {
2451 Print( 0, "^4[AMXX]^3 %s^4 was Flashed (^1%s^4) ^1%d%% and killed^4 %s", g_iKiller, iPercent == 100 ? "Full" : "Semi", iPercent, g_iVictim )
2452 }
2453 if( iPercent == 100 )
2454 {
2455 g_iAchLevel[ iKiller ][ SPRAY_N_PRAY ]++
2456
2457 switch( g_iAchLevel[ iKiller ][ SPRAY_N_PRAY ] )
2458 {
2459 case MAX_SPRAY_N_PRAY:
2460 {
2461 Achievement( iKiller, SPRAY_N_PRAY, -1 )
2462 }
2463 }
2464 }
2465
2466 }
2467 else
2468 {
2469 if( get_pcvar_num( g_pCvar_DeathMessage ) == 1 && GetBit( g_iDeathMessages, iKiller ) )
2470 {
2471 Print( 0, "^1%s^4 %s^3 [^1 %s^3 ]^1 with a^4 %s^1 with a distance of^4 %d F%st^1 away.", g_iKiller, headshot ? "Headshot" : "Killed", g_iVictim, g_iWeapon, g_RoundDistance, g_RoundDistance == 1 ? "ee" : "oo" )
2472 }
2473 }
2474 new iPlayers[ 32 ], iNum, iPlayer, ctCount = 0, tCount = 0
2475 get_players( iPlayers, iNum, "ach" )
2476
2477 for( new i = 0; i < iNum; i++ )
2478 {
2479 iPlayer = iPlayers[ i ]
2480
2481 static CsTeams:iTeam
2482 iTeam = cs_get_user_team( iPlayer )
2483
2484 switch( iTeam )
2485 {
2486 case CS_TEAM_CT:
2487 {
2488 ctCount++
2489 }
2490
2491 case CS_TEAM_T:
2492 {
2493 tCount++
2494 }
2495 }
2496 }
2497 static CsTeams:iTeam
2498 iTeam = cs_get_user_team( iVictim )
2499
2500
2501 if( iTeam == CS_TEAM_CT && ctCount == 1 && tCount >= 3 )
2502 {
2503 SetBit( StandAlone, iVictim )
2504 }
2505 if( iTeam == CS_TEAM_T && ctCount >= 3 && tCount == 1 )
2506 {
2507 SetBit( StandAlone, iVictim )
2508 }
2509
2510 if( GetBit( StandAlone, iVictim ) )
2511 {
2512 g_iAchLevel[ iVictim ][ STAND_ALONE ]++
2513 switch( g_iAchLevel[ iVictim ][ STAND_ALONE ] )
2514 {
2515 case MAX_STAND_ALONE:
2516 {
2517 Achievement( iVictim, STAND_ALONE, -1 )
2518 }
2519 }
2520 DelBit( StandAlone, iVictim )
2521 }
2522
2523
2524
2525 if( get_user_health( iKiller ) == 1 )
2526 {
2527 SetBit( OneHpHero, iKiller )
2528 }
2529
2530 if( GetBit( OneHpHero, iKiller ) )
2531 {
2532 g_iAchLevel[ iKiller ][ ONE_HP_HERO ]++
2533 switch( g_iAchLevel[ iKiller ][ ONE_HP_HERO ] )
2534 {
2535 case MAX_ONE_HP_HERO:
2536 {
2537 Achievement( iKiller, ONE_HP_HERO, -1 )
2538 }
2539 }
2540 }
2541
2542 if( cs_get_user_team( iKiller ) == iTeam )
2543 {
2544 g_iAchLevel[ iKiller ][ BAD_FRIEND ]++
2545 switch( g_iAchLevel[ iKiller ][ BAD_FRIEND ] )
2546 {
2547 case MAX_BAD_FRIEND:
2548 {
2549 Achievement( iKiller, BAD_FRIEND, -1 )
2550 }
2551 }
2552 }
2553
2554 if( GetBit( iKillerHasNotMoved, iKiller ) )
2555 {
2556 g_iKills[ iKiller ]++
2557 if( g_iKills[ iKiller ] >= 3 )
2558 {
2559
2560 g_iAchLevel[ iKiller ][ CAMP_FIRE ]++
2561 switch( g_iAchLevel[ iKiller ][ CAMP_FIRE ] )
2562 {
2563 case MAX_CAMP_FIRE:
2564 {
2565 Achievement( iKiller, CAMP_FIRE, -1 )
2566 }
2567 }
2568 }
2569 }
2570
2571 return PLUGIN_HANDLED
2572}
2573
2574public Event_Spray( )
2575{
2576 new iPlayer = read_data( 2 );
2577
2578 #if defined USING_REGEX
2579 if( !IsUserAuthorized( iPlayer ) )
2580 {
2581 return PLUGIN_HANDLED
2582 }
2583 #endif
2584
2585 g_iAchLevel[ iPlayer ][ URBAN_DESIGNER ]++
2586 switch( g_iAchLevel[ iPlayer ][ URBAN_DESIGNER ] )
2587 {
2588 case MAX_URBAN_DESIGNER:
2589 {
2590 Achievement( iPlayer, URBAN_DESIGNER, -1 )
2591 }
2592 }
2593
2594 g_iRoundSparys[ iPlayer ]++
2595
2596 if( g_iRoundSparys[ iPlayer ] == 3 )
2597 {
2598 g_iAchLevel[ iPlayer ][ GRAFFITI ]++
2599 switch( g_iAchLevel[ iPlayer ][ GRAFFITI ] )
2600 {
2601 case MAX_GRAFFITI:
2602 {
2603 Achievement( iPlayer, GRAFFITI, -1 )
2604 }
2605 }
2606 }
2607 #if defined USING_REGEX
2608 return PLUGIN_HANDLED
2609 #endif
2610}
2611
2612public Achievement( id, ACH_ITEM, ACH_WEAPON )
2613{
2614 new szName[ 32 ]; get_user_name( id, szName, charsmax( szName ) )
2615 new g_pCvarGet_Message = get_pcvar_num( g_pCvar_Message )
2616 if( g_pCvarGet_Message == 2 )
2617 {
2618 new g_iPlayers[ 32 ], iPlayer, iNum
2619 get_players( g_iPlayers, iNum )
2620 for ( new i=0; i<iNum; i++ )
2621 {
2622 iPlayer = g_iPlayers[ i ]
2623 if( id == iPlayer )
2624 continue
2625 Print( iPlayer, "^4%s^3 %s^1 has earned ^3'^1%s^3'^4 achievement!", g_szAchievementTag, szName, ACH_ITEM >= 0 ? g_iAchsMotd[ ACH_ITEM ] : g_iAchsWeap[ ACH_WEAPON ] )
2626 }
2627 }
2628 if( g_pCvarGet_Message == 1 || g_pCvarGet_Message == 2 )
2629 Print( id, "^4%s^3 You^1 have earned ^3'^1%s^3'^4 achievement!", g_szAchievementTag, ACH_ITEM >= 0 ? g_iAchsMotd[ ACH_ITEM ] : g_iAchsWeap[ ACH_WEAPON ] )
2630
2631 if( get_pcvar_num( g_pCvar_PlaySound ) == 1 )
2632 client_cmd( id, "spk ^"sound/achieve.wav^"" )
2633
2634 new g_pCvarGet_Reward = get_pcvar_num( g_pCvar_Reward )
2635 if( g_pCvarGet_Reward > 0 )
2636 cs_set_user_money( id, cs_get_user_money( id ) + g_pCvarGet_Reward, 1 )
2637
2638 g_iAchLevel[ id ][ COMPLETED_ACHIEVEMENTS ]++
2639}
2640
2641public AchievementSecondary( id, ACH_ITEM )
2642{
2643 new szName[ 32 ]; get_user_name( id, szName, charsmax( szName ) )
2644 new g_pCvarGet_Message = get_pcvar_num( g_pCvar_Message )
2645 if( g_pCvarGet_Message == 2 )
2646 {
2647 new g_iPlayers[ 32 ], iPlayer, iNum
2648 get_players( g_iPlayers, iNum )
2649 for ( new i=0; i<iNum; i++ )
2650 {
2651 iPlayer = g_iPlayers[ i ]
2652 if( id == iPlayer )
2653 continue
2654 Print( iPlayer, "^4%s^3 %s^1 has earned ^3'^1%s^3'^4 achievement!", g_szAchievementTag, szName, g_iAchsSecondary[ ACH_ITEM ] )
2655 }
2656 }
2657 if( g_pCvarGet_Message == 1 || g_pCvarGet_Message == 2 )
2658 Print( id, "^4%s^3 You^1 have earned ^3'^1%s^3'^4 achievement!", g_szAchievementTag, g_iAchsSecondary[ ACH_ITEM ] )
2659
2660 if( get_pcvar_num( g_pCvar_PlaySound ) == 1 )
2661 client_cmd( id, "spk ^"sound/achieve.wav^"" )
2662
2663 new g_pCvarGet_Reward = get_pcvar_num( g_pCvar_Reward )
2664 if( g_pCvarGet_Reward > 0 )
2665 cs_set_user_money( id, cs_get_user_money( id ) + g_pCvarGet_Reward, 1 )
2666
2667 g_iAchLevel[ id ][ COMPLETED_ACHIEVEMENTS ]++
2668}
2669
2670Print( index, const Msg[ ], { Float, Sql, Result, _ }:... ) {
2671 new Buffer[ 190 ], Buffer2[ 192 ]
2672 formatex( Buffer2, charsmax( Buffer2 ), "%s", Msg )
2673 vformat( Buffer, charsmax( Buffer ), Buffer2, 3 )
2674
2675 if ( !index ) {
2676
2677 new g_iPlayers[ 32 ]
2678 new iPlayer
2679 new iNum
2680 get_players( g_iPlayers, iNum )
2681 for ( new i=0; i<iNum; i++ )
2682 {
2683 iPlayer = g_iPlayers[ i ]
2684
2685 message_begin( MSG_ONE_UNRELIABLE, g_iMsgSayText,_, iPlayer )
2686 write_byte( iPlayer )
2687 write_string( Buffer )
2688 message_end( )
2689 }
2690 }
2691 else {
2692 if ( !GetBit( is_Connected, index ) )
2693 return;
2694
2695 message_begin( MSG_ONE, g_iMsgSayText,_, index )
2696 write_byte( index )
2697 write_string( Buffer )
2698 message_end( )
2699 }
2700}
2701
2702//#if defined USING_REGEX
2703IsValidAuthid( authid[] )
2704{
2705 return ( regex_match_c( authid, g_SteamID_pattern, g_regex_return ) > 0 )
2706}
2707#if defined USING_REGEX
2708IsUserAuthorized( id )
2709{
2710 return g_iAuthID[ id ][ 0 ] != 0
2711}
2712#endif
2713
2714public g_iLoadStats( id )
2715{
2716 #if defined USING_SQL
2717 static query[ 128 ]
2718 formatex( query, sizeof( query ) - 1, "SELECT data FROM Achievement WHERE authid = ^"%s^";", g_iAuthID[ id ] )
2719
2720 static data[ 2 ]
2721 data[ 0 ] = id
2722
2723 SQL_ThreadQuery( g_sql_tuple, "QueryLoadData", query, data, sizeof( data ) )
2724
2725 #else
2726 static data[ 256 ], timestamp
2727 if( nvault_lookup( g_iVault, g_iAuthID[ id ], data, sizeof( data ) - 1, timestamp ) )
2728 {
2729 ParseLoadData( id, data )
2730 return//
2731 }
2732 else
2733 {
2734 NewUser( id )
2735 }
2736 #endif
2737}
2738
2739public NewUser( id )
2740{
2741
2742 for( new iLevel = 0; iLevel < g_iAchCount; iLevel++ )
2743 {
2744 g_iAchLevel[ id ][ iLevel ] = 0
2745 }
2746
2747 for( new i = 0; i < WEAPON_SIZE; i++ )
2748 {
2749 g_iPlayersKills[ id ][ g_iWeaponIDs[ i ] ] = 0
2750 }
2751
2752}
2753
2754#if defined USING_SQL
2755public QueryLoadData( failstate, Handle:query, error[], errnum, data[], size, Float:queuetime )
2756{
2757 if( failstate == TQUERY_CONNECT_FAILED
2758 || failstate == TQUERY_QUERY_FAILED )
2759 {
2760 set_fail_state( error )
2761 }
2762 else
2763 {
2764 if( SQL_NumResults( query ) )
2765 {
2766 static sqldata[ 256 ]
2767 SQL_ReadResult( query, 0, sqldata, sizeof( sqldata ) - 1 )
2768 ParseLoadData( data[0], sqldata )
2769 }
2770 else
2771 {
2772 NewUser( data[ 0 ] )
2773 }
2774 }
2775}
2776#endif
2777
2778ParseLoadData( id, data[ 256 ] )
2779{
2780 new num[ 6 ]
2781
2782 for( new i = 0; i < WEAPON_SIZE; i++ )
2783 {
2784 argbreak( data, num, sizeof( num ) - 1, data, sizeof( data ) - 1 )
2785 //strbreak( data, num, sizeof( num ) - 1, data, sizeof( data ) - 1 )
2786 g_iPlayersKills[ id ][ g_iWeaponIDs[ i ] ] = clamp( str_to_num( num ), 0, g_iAchsWeaponMaxKills[ i ] )
2787 }
2788
2789 for( new iLevel = 0; iLevel < g_iAchCount; iLevel++ )
2790 {
2791 argbreak( data, num, sizeof( num ) - 1, data, sizeof( data ) - 1 )
2792 //strbreak( data, num, sizeof( num ) - 1, data, sizeof( data ) - 1 )
2793 g_iAchLevel[ id ][ iLevel ] = clamp( str_to_num( num ), 0, g_iAchsMaxPoints[ iLevel ] )
2794 }
2795
2796 #if defined USING_SQL
2797 g_loaded_data[ id ] = 1
2798 #endif
2799}
2800
2801public g_iSaveStats( id )
2802{
2803 #if defined USING_REGEX
2804 if( !IsUserAuthorized( id ) ) return
2805 #endif
2806
2807 static data[ 256 ]
2808 new len
2809
2810 for( new i = 0; i < WEAPON_SIZE; i++ )
2811 {
2812 len += formatex( data[ len ], sizeof( data ) - len - 1, " %i", g_iPlayersKills[ id ][ g_iWeaponIDs[ i ] ] )
2813 }
2814
2815 for( new iLevel = 0; iLevel < g_iAchCount; iLevel++ )
2816 {
2817 len += formatex( data[ len ], sizeof( data ) - len - 1, " %i", g_iAchLevel[ id ][ iLevel ] )
2818 }
2819
2820 #if defined USING_SQL
2821 static name[ 32 ]; get_user_name( id, name, charsmax( name ) )
2822
2823 static query[ 256 ]
2824 if( g_loaded_data[ id ] )
2825 {
2826 formatex( query, sizeof( query ) - 1, "UPDATE Achievement SET name = ^"%s^", data = ^"%s^" WHERE authid = ^"%s^";", name, data, g_iAuthID[ id ] )
2827 }
2828 else
2829 {
2830 formatex( query, sizeof( query ) - 1, "INSERT INTO Achievement ( name, authid, data ) VALUES ( ^"%s^", ^"%s^", ^"%s^" );", name, g_iAuthID[ id ], data )
2831 }
2832
2833 SQL_ThreadQuery( g_sql_tuple, "QuerySaveData", query )
2834 #else
2835 nvault_set( g_iVault, g_iAuthID[ id ], data )
2836 #endif
2837}
2838
2839#if defined USING_SQL
2840public QuerySaveData( failstate, Handle:query, error[], errnum, data[], size, Float:queuetime )
2841{
2842 if( failstate == TQUERY_CONNECT_FAILED
2843 || failstate == TQUERY_QUERY_FAILED )
2844 {
2845 set_fail_state( error )
2846 }
2847}
2848#endif