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