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