Сompiler Плагин Достижений

elf01

Пользователь
Регистрация
24 Мар 2018
Сообщения
153
Симпатии
7
Пол
Мужской
Amx Mod X
AMXX 1.8.3
Ошибка
Код:

	
	
		
			
				C++:
			
		
		
		
			
			
			
			
			
		
	
	
	
		achievements.sma<73>:error 020: invalid symbol name""
	
	
	
		
	
Исходник
Код:

	

		Спойлер
	
	
		
			// Should the plugin save player data in SQL database?
// To save player data in a vault, change #define USING_SQL to //#define USING_SQL
// To save player data in SQL, change //#define USING_SQL" to #define USING_SQL
// If you comment //#define USING_REGEX its a little bit more non-steam friendly 

//#define USING_SQL
//#define USING_REGEX

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <nvault>
#include <csx>
#include <fun>
#include <xs>

//#if defined USING_REGEX
#include <regex>
//#endif

#if defined USING_SQL
#include <sqlx>

new Handle:g_sql_tuple
#else
#include <nvault>

new g_iVault
#endif

#if defined USING_SQL
new g_loaded_data[ 33 ]
#endif

#define VERSION "2.3"

#define XO_WEAPON         4
#define XO_PLAYER            5
#define m_pPlayer         41
#define m_flTimeWeaponIdle   48
#define m_iClientClip        52
#define m_fInReload          54
#define m_fInSpecialReload   55
#define ALPHA_FULLBLINDED    255
#define m_pActiveItem        373 
#define m_flFlashedUntil     514
#define m_flFlashedAt        515
#define m_flFlashHoldTime    516
#define m_flFlashDuration    517
#define m_iFlashAlpha        518


#define INTERVAL 60

new g_iMaxPlayers
#define FIRST_PLAYER_ID    1
#define IsPlayer(%1) ( FIRST_PLAYER_ID <= %1 <= g_iMaxPlayers )

#define NADES_BITSUM    (1 << CSW_HEGRENADE) | (1 << CSW_FLASHBANG) | (1 << CSW_SMOKEGRENADE)
#define NORELOAD_BITSUM NADES_BITSUM | (1 << CSW_KNIFE) | (1 << CSW_C4) | (1 << CSW_M3) | (1 << CSW_XM1014) 
#define fm_get_c4()    engfunc( EngFunc_FindEntityByString, -1, "classname", "weapon_c4" )

new g_C4Ent
new Float:g_fC4Origin[ 3 ]

#define GetBit(%1,%2)         ( %1 &   1 << ( %2 & 31 ) )
#define SetBit(%1,%2)         ( %1 |=  ( 1 << ( %2 & 31 ) ) )
#define DelBit(%1,%2)        ( %1 &= ~( 1 << ( %2 & 31 ) ) )

const MAX_PLAYERS = 32
const MAX_WEAPONS = CSW_P90
const RIFFLES_BITSUM  = ((1 << CSW_AUG) | (1 << CSW_GALIL) | (1 << CSW_FAMAS) | (1 << CSW_M249) | (1 << CSW_M4A1) | (1 << CSW_SG552) | (1 << CSW_AK47))
const SNIPERS_BITSUM  = ((1 << CSW_SCOUT) | (1 << CSW_SG550) | (1 << CSW_AWP) | (1 << CSW_G3SG1))
const THROUGH_WALL_WEAPONS = ((1 << CSW_DEAGLE) | RIFFLES_BITSUM | SNIPERS_BITSUM)

new g_iBombTime, g_iPlanter, 
    g_iGetBombPlanted, g_iRounds, 
    g_fwid
    
new const g_szAchievementSound[] = "achieve.wav"
new const g_szAchievementTag[] = "[Achievement]"
new g_iMsgSayText

new const Float:vecNullOrigin[ 3 ]

new Float:flDistance[ MAX_PLAYERS + 1 ],
    Float:vecOldOrigin[ MAX_PLAYERS + 1 ][ 3 ],
    Float:g_iFeet = 35.0
    
new g_iRoundSparys[ MAX_PLAYERS + 1 ], g_iKills[ MAX_PLAYERS + 1 ], 
    g_iShotKills[ MAX_PLAYERS + 1 ], g_iGrenadeKills[ MAX_PLAYERS + 1 ],
    g_iGetTempid[ MAX_PLAYERS + 1 ]
    
new StandAlone, OneHpHero,
    is_VictimInAir, iKillerHasNotMoved,
    iKillerShot, is_Alive, 
    g_iDeathMessages, is_Connected,
    is_NotValidPlayer
    
new bool:is_DefusingWithKit, bool:g_iGetBombDown,
    bool:g_iBombPlant

//#if defined USING_REGEX
new Regex:g_SteamID_pattern
new g_regex_return
//#endif
    
enum _:g_iAchCount
{
    CONNECTIONS,
    HEAD_SHOTS,
    DISTANCE_KILLED,
    DISTANCE_WALKED,
    BOMB,
    PLANT_BOMB,
    PLANT_BOMB_COUNT,
    DEFUSED_BOMB,
    TOTAL_KILLS,
    PISTOL_MASTER,
    RIFLE_MASTER,
    SHOTGUN_MASTER,
    SPRAY_N_PRAY,
    MASTER_AT_ARMS,
    PLAY_AROUND,
    STAND_ALONE,
    ONE_HP_HERO,
    BAD_FRIEND,
    URBAN_DESIGNER,
    GRAFFITI,
    AMMO_CONSERVATION,
    FLY_AWAY,
    FLY_KILLER,
    RELOADER,
    CAMP_FIRE,
    HAT_TRICK,
    COWBOY_DIPLOMACY,
    TOTAL_DAMAGE,
    WALL_HACKER,
    
    COMPLETED_ACHIEVEMENTS
}

new const g_iAchsMotd[g_iAchCount][] =
{
    "Ultimate Server Lover",
    "Boom Head-Shot",
    "I've Got The Power",
    "Long Run",
    "OMFG that was close",
    "Short Fuse",
    "Boomala Boomala",
    "Nothing Can Blow Up",
    "God of War",
    "Pistol Master",
    "Rifle Master",
    "Shotgun Master",
    "Spray and Pray",
    "Master At Arms",
    "Play Around",
    "Stand Alone",
    "1 Hp Hero",
    "Bad Friend",
    "Urban Designer",
    "Graffiti Is My Second Name",
    "Ammo Conservation",
    "Fly Away",
    "Fly Killer",
    "Reloader",
    "Camp Fire",
    "Hat Trick",
    "Cowboy Diplomacy",
    "You've Made Your Points",
    "Wall HACKER",
    "Completed Achievements Percentage"
}

new const g_iAchsSecondary[][] = 
{
    "I'll Be Back",
    "I Like This Server",
    "Half Way There",
    "Baby Foot Steps",
    "I'm Half Way There",
    "C4 Defuser",
    "That Was Easy",
    "Like a Game",
    "Master of C4",
    "Short Range Kill",
    "Nice Aim",
    "Long Range Kill",
    "Aim-Bot Time",
    "Killer Master"
}

new const g_iAchsDesciption[g_iAchCount][] =
{
    "Connect to the server 500 times!",
    "Get a total of 300 Headshots!",
    "Kill the player from a distance!",
    "Run around the map!",
    "Defuse the bomb right before it explodes!",
    "Plant the bomb within 25 seconds of round start!",
    "Plant the bomb of a total of 100 times!",
    "Get a total of 400 bomb defuses!",
    "Get a total of 1000 kills!",
    "Unlock all achievements for pistols!",
    "Unlock all achievements for rifles!",
    "Unlock all achievements for Shotguns!",
    "Get a kill while being 100% flashed!",
    "Unlock all achievements for weapons!",
    "Spend 1 hour playing in the server!",
    "Die 15 times as the last guy on the team!",
    "Kill a enemy while having 1 HP!",
    "Kill 5 teammates!",
    "Spray 50 decals!",
    "Spray 3 times in one round!",
    "Kill two players with a single bullet!",
    "Kill an enemy while he/she is in the air!",
    "Kill an enemy while You are in the air!",
    "Reload your weapon 1000 times!",
    "Kill 3 enemies in a row, all within the same area!",
    "Kill 3 enemies with one HeGrenade!",
    "Rescue 50 hostages!",
    "Inflect 50000 damage on your enemies!",
    "Kill an enemy though the wall 10 times!",
    "Completed Percentage"
}

const MAX_CONNECTION =        500     // Connections
const MAX_HEAD_SHOTS =        300    // Headshots
const MAX_DISTANCE_KILLED =    4    // distance killed
const MAX_DISTANCE_WALKED =    3    // distance walk
const MAX_BOMB =        1    // bomb
const MAX_PLANT_BOMB =        1    // Plant bomb
const MAX_PLANT_BOMB_COUNT =    100    // plant bomb count
const MAX_DEFUSED_BOMB =    40    // Defused Bomb
const MAX_TOTAL_KILLS =        1000    // total kills
const MAX_PISTOL_MASTER =    6    // Pistol master
const MAX_RIFLE_MASTER =    10    // rifle Master
const MAX_SHOTGUN_MASTER =    2    // shotgun master
const MAX_SPRAY_N_PRAY =    1    // spray and pray
const MAX_MASTER_AT_ARMS =    25    // Master of Arms
const MAX_PLAY_AROUND =        60     // Play Around
const MAX_STAND_ALONE =        15    // Stand Alone
const MAX_ONE_HP_HERO =        1    // 1 Hp Hero
const MAX_BAD_FRIEND =        5    // Bad Friend
const MAX_URBAN_DESIGNER =    50    // Urban Designer
const MAX_GRAFFITI =        1    // Graffiti Is My Second Name
const MAX_AMMO_CONSERVATION =    1    // Ammo Conservation
const MAX_FLY_AWAY =        1    // Fly Away
const MAX_FLY_KILLER =        1    // Fly Killer
const MAX_RELOADER =        1000    // Reloader
const MAX_CAMP_FIRE =        1    // Camp Fire
const MAX_HAT_TRICK =        1    // HatTrick
const MAX_COWBOY_DIPLOMACY =    50    // Cowboy Diplomacy
const MAX_TOTAL_DAMAGE =    50000    // Total Damage 50000 Damage points
const MAX_WALL_HACKER =        10    // Wall hacker
const MAX_COMPLETEDPERCENTAGE =    69    // Completed Percentage

new const g_iAchsMaxPoints[g_iAchCount] =
{
    500,     // Connections
    300,    // Headshots
    4,    // distance killed
    3,    // distance walk
    1,    // bomb
    1,    // Plant bomb
    100,    // plant bomb count
    40,    // Defused Bomb
    1000,    // total kills
    6,    // Pistol master
    10,    // rifle Master
    2,    // shotgun master
    1,    // spray and pray
    25,    // Master of Arms
    60,     // Play Around
    15,    // Stand Alone
    1,    // 1 Hp Hero
    5,    // Bad Friend
    50,    // Urban Designer
    1,    // Graffiti Is My Second Name
    1,    // Ammo Conservation
    1,    // Fly way
    1,    // Fly Killer
    1000,    // Reloader
    1,    // Camp Fire
    1,    // HatTrick
    50,    // Cowboy Diplomacy
    50000,    // Total Damage 50000 Damage points
    10,    // Wall hacker
    69    // Completed Percentage
}

enum _:MAX_TYPES
{
    TYPE_NONE,
    TYPE_RELATION,
    TYPE_PLAYER,
    TYPE_HEALTH,
}

enum
{
    LOOK_FRIEND = 1,
    LOOK_ENEMY,
    LOOK_HOSTAGE,
}

enum _:MAX_REPLACES
{
    RE_ACHIEVEMENT,
    RE_HP,
    RE_NAME,
}

new const Replaces[ MAX_REPLACES ][] =
{
    "%Achivement%",
    "%hp%",
    "%name%"
}

new g_iAuthID[ MAX_PLAYERS + 1 ][ 35 ]

//Cvars
new g_pCvar_Enabled, g_pCvarC4Timer,
    g_pCvar_ShowInfo, g_pCvar_DeathMessage,
    g_pCvar_FlashMessage, g_pCvar_BombMessage,
    g_pCvar_DeadPlayerNames, g_pCvar_DeadPlayerMessage, 
    g_pCvar_StatustextMessageFriend, g_pCvar_StatustextMessageEnemy,
    g_pCvar_PlaySound, g_pCvar_Reward, g_pCvar_Message
    
new status_value[ MAX_TYPES ]
new gStatusText
    
new const g_szWeaponNames[][] =
{
    "p228",
    "scout",              
    "hegrenade",              
    "xm1014",
    "c4",                    
    "mac10",             
    "aug", 
    "smokegrenade",            
    "elite",          
    "fiveseven",
    "ump45",               
    "sg550",
    "galil",  
    "famas",
    "usp",   
    "glock18",   
    "awp",  
    "mp5navy",     
    "m249",            
    "m3",  
    "m4a1",                
    "tmp",      
    "g3sg1",    
    "flashbang",            
    "deagle",
    "sg552", 
    "ak47",      
    "knife",                   
    "p90"
}

#define WEAPON_SIZE sizeof(g_szWeaponNames)

new const g_iWeaponIDs[WEAPON_SIZE] =
{
    CSW_P228,
    CSW_SCOUT,
    CSW_HEGRENADE,
    CSW_XM1014,
    CSW_C4,
    CSW_MAC10,
    CSW_AUG,
    CSW_SMOKEGRENADE,
    CSW_ELITE,
    CSW_FIVESEVEN,
    CSW_UMP45,
    CSW_SG550,
    CSW_GALIL,
    CSW_FAMAS,
    CSW_USP,
    CSW_GLOCK18,
    CSW_AWP,
    CSW_MP5NAVY,
    CSW_M249,
    CSW_M3,
    CSW_M4A1,
    CSW_TMP,
    CSW_G3SG1,
    CSW_FLASHBANG,
    CSW_DEAGLE,
    CSW_SG552,
    CSW_AK47,
    CSW_KNIFE,
    CSW_P90
}

enum
{
    P228,
    SCOUT,
    HEGRENADE,
    XM1014,
    C4,
    MAC10,
    AUG,
    SMOKEGRENADE,
    ELITE,
    FIVESEVEN,
    UMP45,
    SG550,
    GALIL,
    FAMAS,
    USP,
    GLOCK18,
    AWP,
    MP5NAVY,
    M249,
    M3,
    M4A1,
    TMP,
    G3SG1,
    FLASHBANG,
    DEAGLE,
    SG552,
    AK47,
    KNIFE,
    P90
}

new const g_iAchsWeaponMaxKills[] =
{
    100,     //"p228",           
    100,     //"scout",              
    5,      //"hegrenade",              
    20,    //"xm1014",
    5,    //"c4",                    
    25,    //"mac10",             
    30,     //"aug", 
    40,    //"smokegrenade",            
    50,     //"elite",          
    50,    //"fiveseven",
    75,    //"ump45",               
    75,    //"sg550",
    250,    //"galil",  
    250,    //"famas",
    80,    //"usp",   
    80,    //"glock18",   
    275,    //"awp",  
    100,    //"mp5navy",     
    50,    //"m249",            
    50,    //"m3",  
    275,    //"m4a1",                
    100,    //"tmp",      
    75,    //"g3sg1",    
    75,    //"flashbang",            
    125,    //"deagle",
    100,    //"sg552", 
    275,    //"ak47",      
    20,    //"knife",                   
    30    //"p90" 
}

const MAX_P228 =        100     //"p228",           
const MAX_SCOUT =        100     //"scout",              
const MAX_HEGRENADE =        5      //"hegrenade",              
const MAX_XM1014 =        20    //"xm1014",
const MAX_C4 =            5    //"c4",                    
const MAX_MAC10 =        25    //"mac10",             
const MAX_AUG =            30    //"aug", 
const MAX_SMOKEGRENADE =    40    //"smokegrenade",            
const MAX_ELITE =        50    //"elite",          
const MAX_FIVESEVEN =        50    //"fiveseven",
const MAX_UMP45 =        75    //"ump45",               
const MAX_SG550 =        75    //"sg550",
const MAX_GALIL =        250    //"galil",  
const MAX_FAMAS =        250    //"famas",
const MAX_USP =            80    //"usp",   
const MAX_GLOCK18 =        80    //"glock18",   
const MAX_AWP =            275    //"awp",  
const MAX_MP5NAVY =        100    //"mp5navy",     
const MAX_M249 =        50    //"m249",            
const MAX_M3 =            50    //"m3",  
const MAX_M4A1 =        275    //"m4a1",                
const MAX_TMP =            100    //"tmp",      
const MAX_G3SG1 =        75    //"g3sg1",    
const MAX_FLASHBANG =        75    //"flashbang",            
const MAX_DEAGLE =        125    //"deagle",
const MAX_SG552 =        100    //"sg552", 
const MAX_AK47 =        275    //"ak47",      
const MAX_KNIFE =        20    //"knife",                   
const MAX_P90 =            30    //"p90" 

new const g_szWeaponNames2[WEAPON_SIZE][] =
{
    "P228",
    "Scout",              
    "He-Grenade",              
    "XM1014",
    "C4",                    
    "Mac10",             
    "Aug", 
    "Smoke-Grenade",            
    "Elite",          
    "Fiveseven",
    "Ump45",               
    "SG550",
    "Galil",  
    "Famas",
    "USP",   
    "Glock",   
    "AWP",  
    "MP5",     
    "M249",            
    "M3",  
    "M4A1",                
    "TMP",      
    "G3SG1",    
    "FlashBang",            
    "Deagle",
    "SG552", 
    "AK47",      
    "Knife",                   
    "P90"
}

new const g_iAchsWeap[WEAPON_SIZE][] =
{
    "228 Compact Expert",
    "Schmidt Scout Expert",              
    "HE Grenade Expert", 
    "Leone YG1265 Auto Shotgun Expert",
    "C4 Killer",                    
    "Ingram Mac-10 Expert",             
    "Bullpup Expert", 
    "It's A Bit Smokey In Here!",            
    ".40 Dual Elites Expert",          
    "ES Five-Seven Expert",
    "KM UMP45 Expert",               
    "D3/AU-1 Expert",
    "IDF Defender Expert",  
    "Clarion 5.56 Expert",
    "KM Tactical .45 Expert",
    ".9Ч19 Sidearm Expert",   
    "Magnum Sniper Rifle Expert",  
    "KM Sub-Machine Gun Expert",     
    "M249 Expert",            
    "Leone 12 Gauge Super Expert",  
    "Maverick M4A1 Carbine Expert",                
    "Schmidt Machine Pistol Expert",      
    "Krieg 550 Commando Expert",    
    "Can You See?",            
    "Night Hawk .50c Expert",
    "Krieg 552 Expert", 
    "CV-47 Expert",      
    "Knife Expert",                   
    "ES C90 Expert"
}

new const g_iGunEvents[][] = {
    "events/awp.sc",
    "events/g3sg1.sc",
    "events/ak47.sc",
    "events/scout.sc",
    "events/m249.sc",
    "events/m4a1.sc",
    "events/sg552.sc",
    "events/aug.sc",
    "events/sg550.sc",
    "events/m3.sc",
    "events/xm1014.sc",
    "events/usp.sc",
    "events/mac10.sc",
    "events/ump45.sc",
    "events/fiveseven.sc",
    "events/p90.sc",
    "events/deagle.sc",
    "events/p228.sc",
    "events/glock18.sc",
    "events/mp5n.sc",
    "events/tmp.sc",
    "events/elite_left.sc",
    "events/elite_right.sc",
    "events/galil.sc",
    "events/famas.sc"
}

new g_iPlayersKills[ MAX_PLAYERS+1 ][ MAX_WEAPONS+1 ]
new g_iAchLevel[ MAX_PLAYERS+1 ][ g_iAchCount ]
new g_iTimerEntity, g_iJoinTime[ MAX_PLAYERS+1 ]

new Trie:g_tWeaponNameToID
new iWeaponID, g_iGunEvent_IDsBitsum

public plugin_init() {
    
    #if defined USING_SQL
    register_plugin( "Achievements (SQL)", VERSION, "Pastout!" )
    #else
    register_plugin( "Achievements", VERSION, "Pastout!" )
    #endif

    g_pCvar_Enabled = register_cvar("ach_enable", "1")// 1 = on || 0 = off
    if ( !get_pcvar_num( g_pCvar_Enabled ) )
        return;
    
    g_pCvarC4Timer = get_cvar_pointer( "mp_c4timer" )
    g_pCvar_ShowInfo = register_cvar( "ach_showinfo", "0" )
    g_pCvar_DeathMessage = register_cvar( "ach_deathmessage", "0" )
    g_pCvar_FlashMessage = register_cvar( "ach_flashmessage", "0" )
    g_pCvar_BombMessage = register_cvar( "ach_bombmessage", "0" )
    g_pCvar_PlaySound = register_cvar( "ach_playsound", "1" )
    g_pCvar_Reward = register_cvar( "ach_reward", "300" )
    g_pCvar_Message = register_cvar( "ach_message", "2" )
    g_pCvar_DeadPlayerNames = register_cvar( "dead_player_names", "1" )
    g_pCvar_DeadPlayerMessage = register_cvar( "dead_player_message", "%name% (%hp%) %steamid%" )
    g_pCvar_StatustextMessageFriend = register_cvar( "statustext_message_friend", "Friend : %name%  Health : %hp%%%  Achievement Completion : %Achivement%%%" )
    g_pCvar_StatustextMessageEnemy = register_cvar( "statustext_message_enemy", "Enemy : %name%  Achievement Completion : %Achivement%%%" )
    
    new command[] = "CmdMainMenu"
    register_clcmd( "say /achievement", command )
    register_clcmd( "say /achievements", command )
    register_clcmd( "say /ach", command )
    //register_clcmd( "say /help", "Ach_HelpMenu" )
    //register_clcmd( "say /deathmessage", "CmdDeathMessage" )
    
    register_clcmd( "Enter_Value", "CmdEnterValue" )
    
    register_event( "DeathMsg", "Event_PlayerKilled", "a" )
    register_event( "HLTV", "Event_NewRound", "a", "1=0", "2=0" )
    register_event( "StatusIcon", "Event_GotBomb", "be", "1=1", "1=2", "2=c4" )
    register_event( "23", "Event_Spray", "a", "1=112" )
    register_event( "CurWeapon", "Event_CurWeapon", "be", "1=1", "3>0" ) 
    register_event( "StatusValue", "Event_StatusValue", "b" )
    
    register_logevent( "Event_PlayerAction", 3, "1=triggered" )
    
    new entity[] = "hud_entity"
    g_iTimerEntity = create_entity( "info_target" )
    entity_set_string( g_iTimerEntity, EV_SZ_classname, entity )
    register_think( entity, "FwdHUDThink" )
    entity_set_float( g_iTimerEntity, EV_FL_nextthink, get_gametime() + 1.0 )
    
    g_iMaxPlayers = get_maxplayers( )
    g_tWeaponNameToID = TrieCreate( )
    g_iMsgSayText = get_user_msgid( "SayText" )
    gStatusText = get_user_msgid( "StatusText" )

    for( new i = 0; i < WEAPON_SIZE; i++ )
    {
        TrieSetCell( g_tWeaponNameToID, g_szWeaponNames, g_iWeaponIDs )
    }
    
    new g_szHamShotgunReload[] = "FwdHamShotgunReload"
    new g_szPlayer[] = "player"
    RegisterHam( Ham_Weapon_Reload, "weapon_m3", g_szHamShotgunReload, .Post = true )
    RegisterHam( Ham_Weapon_Reload, "weapon_xm1014", g_szHamShotgunReload, .Post = true )
    RegisterHam( Ham_TraceAttack, g_szPlayer, "Ham_CBasePlayer_TraceAttack", .Post = false )
    RegisterHam( Ham_Spawn, g_szPlayer, "Ham_CBasePlayer_Spawn", .Post = true )
    RegisterHam( Ham_Killed, g_szPlayer, "Ham_CBasePlayer_Killed", .Post = false )
    RegisterHam( Ham_TakeDamage, g_szPlayer, "Ham_CBasePlayer_TakeDamage", .Post = true )

    unregister_forward( FM_PrecacheEvent, g_fwid, 1 )
    register_forward( FM_PlaybackEvent, "FwdPlaybackEvent" )
    register_forward( FM_CmdStart, "FwdCmdStart" )
    
    #if !defined USING_SQL
    g_iVault = nvault_open( "Achievements" )
    
    if(g_iVault == INVALID_HANDLE)
        set_fail_state( "Error opening nVault" )
    
    #endif
    
    //#if defined USING_REGEX
    new err[ 2 ]
    g_SteamID_pattern = regex_compile( "^^STEAM_00|1):\d+$", g_regex_return, err, sizeof( err ) - 1 )
    //#endif

}

public plugin_unpause()
{
    is_Connected = 0;
    is_Alive = 0;
    static iPlayers[ 32 ], iNum, iPlayer
    get_players( iPlayers, iNum, "ch" )
    
    for( new i = 0; i < iNum; i++ ) 
    {
        iPlayer = iPlayers[ i ]
        SetBit( is_Connected, iPlayer ) 
        if( is_user_alive( iPlayer ) )
        {
            SetBit( is_Alive, iPlayer )
        }
    }
}

public Event_StatusValue( id )
{
    new num = read_data( 1 )

    if( num <= 0 || num >= MAX_TYPES )
        return

    new update = status_value[ num ] = read_data( 2 )

    switch( num )
    {
        case TYPE_RELATION:
        {
            if( !update && GetBit( is_Alive, id ) )
            {
                message_begin( MSG_ONE_UNRELIABLE, gStatusText, _, id )
                write_byte( 0 )
                write_string( "" )
                message_end()
            }
        }
        case TYPE_PLAYER:
        {
            //if( GetBit( is_Alive, id ) )
            if( GetBit( is_Alive, id ) && !GetBit( is_NotValidPlayer, id ))
            {
                new message[ 192 ]

                switch( status_value[ TYPE_RELATION ] )
                {
                    case LOOK_FRIEND:
                    {
                        get_pcvar_string( g_pCvar_StatustextMessageFriend, message, charsmax( message ) )
                    }
                    case LOOK_ENEMY:
                    {
                        get_pcvar_string( g_pCvar_StatustextMessageEnemy, message, charsmax( message ) )
                    }
                    case LOOK_HOSTAGE:
                    {
                        return
                    }
                }

                EditMessage( message, update, true, get_user_health( update ) )

                message_begin( MSG_ONE_UNRELIABLE, gStatusText, _, id )
                write_byte( 0 )
                write_string( message )
                message_end()
            }
        }
        case TYPE_HEALTH:
        {
            if( !status_value[ TYPE_RELATION ] )
                return;

            if( !FreeLook( id ) )
                return;

            switch( status_value[ TYPE_RELATION ] )
            {
                case LOOK_FRIEND, LOOK_ENEMY:
                {
                    new message[ 192 ]
                    get_pcvar_string( g_pCvar_DeadPlayerMessage, message, charsmax( message ) )

                    EditMessage( message, status_value[ TYPE_PLAYER ], false, update )
                }
                case LOOK_HOSTAGE:
                {
                    new message[ 192 ]
                    get_pcvar_string( g_pCvar_DeadPlayerMessage, message, charsmax(message) )

                    EditMessage( message, 0, false, update )
                }
            }
        }
    }
}

FreeLook( id )
{
    if( GetBit( is_Connected, id ) && !GetBit( is_Alive, id ) )
        return false;

    if( pev(id, pev_iuser2) && get_pcvar_num( g_pCvar_DeadPlayerNames ) <= 1 )
        return false;

    return true;
}

EditMessage( message[ 192 ], player, bool:status_text, hp )
{
    new temp[ 35 ]

    if( GetBit( is_Alive, player ) )
    {
        for( new i; i < MAX_REPLACES; i++ )
        {
            switch( i )
            {
                case RE_ACHIEVEMENT:
                {
                    new Float:g_Number = ( g_iAchLevel[ player ][ COMPLETED_ACHIEVEMENTS ]*1.0 )
                    new Float:g_Number2 = ( g_iAchsMaxPoints[ COMPLETED_ACHIEVEMENTS ]*1.0 )
                    new Float:g_Number3 = g_Number/g_Number2*100
                    formatex( temp, charsmax( temp ), "%.f", g_Number3 )
                }

                case RE_HP:
                {
                    num_to_str( hp, temp, charsmax( temp ) )
                }

                case RE_NAME:
                {
                    if( status_text )
                        copy( temp, charsmax( temp ), "%p2" )
                    else
                        get_user_name( player, temp, charsmax( temp ) )
                }

                default:
                {
                    copy( temp, charsmax(temp), "" )
                }
            }

            replace( message, charsmax( message ), Replaces[ i ], temp )
        }
    }
    else
    {
        for( new i; i < MAX_REPLACES; i++ )
        {
            switch( i )
            {
                case RE_HP:
                {
                    num_to_str( hp, temp, charsmax( temp ) )
                    replace( message, charsmax( message ), Replaces[ i ], temp )
                }

                case RE_NAME:
                {
                    replace( message, charsmax( message ), Replaces[ i ], "Hostage" )
                }

                default:
                {
                    replace( message, charsmax( message ), Replaces[ i ], "" )
                }
            }
        }
    }

    trim( message )
}

public Ham_CBasePlayer_Killed( iVictim, iAttacker )
{
    if( IsPlayer( iAttacker )
    && IsPlayer( iVictim )
    && GetBit( is_Connected, iVictim ) 
    && GetBit( is_Connected, iAttacker ) 
    && GetBit( is_Alive, iAttacker ) )
    {
        #if defined USING_REGEX
        if( !IsUserAuthorized( iAttacker ) || !IsUserAuthorized( iVictim ) )
        {
            return HAM_HANDLED
        }
        #endif
        
        new Floatrigin[ 3 ]
        entity_get_vector( iVictim, EV_VEC_origin, origin )
        
        if( ( 1 << get_user_weapon( iAttacker ) ) & THROUGH_WALL_WEAPONS )
        {
            if( !fm_is_ent_visible_maxdistance( iAttacker, iVictim,.maxdistance = 3500.0) && is_in_viewcone( iAttacker, origin ) )
            {
                g_iAchLevel[ iAttacker ][ WALL_HACKER ]++
                switch( g_iAchLevel[ iAttacker ][ WALL_HACKER ] )
                {
                    case MAX_WALL_HACKER:
                    {
                        Achievement( iAttacker, WALL_HACKER, -1 )
                    }
                }
                //Print( 0, "You have been walled!" ) 
            }
        }
    }
    
    return HAM_HANDLED
}  

bool:fm_is_ent_visible_maxdistance( const index, const entity, ignoremonsters = 0, Float:maxdistance ) 
{    
    new Float:start[ 3 ], Float:dest[ 3 ]
    pev( index, pev_origin, start )
    pev( index, pev_view_ofs, dest )
    xs_vec_add( start, dest, start )
    pev( entity, pev_origin, dest )
    
    if( vector_distance( start,dest ) <= maxdistance ) 
    {
        engfunc( EngFunc_TraceLine, start, dest, ignoremonsters, index, 0 )
        new Float:fraction;
        get_tr2( 0, TR_flFraction, fraction )
        
        if ( fraction == 1.0 || get_tr2( 0, TR_pHit ) == entity )
            return true
    }
    return false
}

public client_damage( iAttacker, iVictim, gDamage, iWeapon, iHitplace, TA )
{
    #if defined USING_REGEX
    if( !IsUserAuthorized( iAttacker ) || !IsUserAuthorized( iVictim ) )
    {
        return PLUGIN_HANDLED
    }
    #endif
    if( IsPlayer( iAttacker ) && IsPlayer( iVictim ) )
    {    
        new iPreviousLevel = g_iAchLevel[ iAttacker ][ TOTAL_DAMAGE ] / g_iAchsMaxPoints[ TOTAL_DAMAGE ]
        new iNewLevel = ( g_iAchLevel[ iAttacker ][ TOTAL_DAMAGE ] += gDamage ) / g_iAchsMaxPoints[ TOTAL_DAMAGE ]
        if( iNewLevel > iPreviousLevel )
        {
            Achievement( iAttacker, TOTAL_DAMAGE, -1 )
        }
    }
    
    #if defined USING_REGEX
    return PLUGIN_HANDLED
    #endif
}

public Ham_CBasePlayer_TakeDamage(iVictim, inflictor, iAttacker, Float:fDamage, bitDamage) 
{    
    if ( !inflictor )
        return HAM_IGNORED
    
    new Float:fOrigin[ 3 ]
    new iC4 = fm_get_c4()
    new szClass[ 14 ]
    
    pev( iVictim , pev_origin , fOrigin )
    pev( inflictor , pev_classname , szClass , 13 )
    
    if ( ( bitDamage & DMG_BLAST ) 
    && ( get_distance_f( fOrigin , g_fC4Origin ) <= 1700.0 ) 
    && ( !iC4 && g_C4Ent 
    && ( equal( szClass, "env_explosion" ) || equal( szClass, "grenade" ) ) ) )
    {
        if( GetBit( is_Connected, g_iPlanter ) 
        && GetBit( is_Connected, iVictim ) 
        && get_user_health( iVictim ) <= 0 )
        {
            message_begin( MSG_BROADCAST, 83, { 0,0,0 }, 0 )
            write_byte( g_iPlanter )
            write_byte( iVictim )
            write_byte( 0 )
            write_string( "world" )
            message_end()
            
            g_iPlayersKills[ g_iPlanter ][ CSW_C4 ]++
            
            if( g_iPlayersKills[ g_iPlanter ][ CSW_C4 ] == 30 )
            {
                Achievement( g_iPlanter, -1, C4 )
            }
            
            if( g_iAchLevel[ g_iPlanter ][ BAD_FRIEND ] > MAX_BAD_FRIEND && cs_get_user_team( g_iPlanter ) == cs_get_user_team( iVictim ) )
            {
                g_iAchLevel[ g_iPlanter ][ BAD_FRIEND ]++
            }
        }
    }
    
    return HAM_IGNORED;
}

public Event_PlayerAction( )
{
    new szArg[ 64 ], szAction[ 64 ], szName[ 64 ]
    new iUserId, id
    
    read_logargv( 0, szArg, 64 )
    read_logargv( 2, szAction, 64 )
    parse_loguser( szArg, szName, 64, iUserId )
    id = find_player( "k", iUserId )
    
    if( id == 0 )
    {
        return
    }
    #if defined USING_REGEX
    if( !IsUserAuthorized( id ) )
    {
        return
    }
    #endif
    if( equal( szAction, "Rescued_A_Hostage" ) )
    {
        g_iAchLevel[ id ][ COWBOY_DIPLOMACY ]++
        switch( g_iAchLevel[ id ][ COWBOY_DIPLOMACY ] )
        {
            case MAX_COWBOY_DIPLOMACY:
            {
                Achievement( id, COWBOY_DIPLOMACY, -1 )
            }
        }
        Print( 0, "^4[AMXX]^3 %s^1 has^4 rescued^1 a^3 Hostage^1.", szName )// Hostage rescued 
    }
    
    if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
    {
        if( equal( szAction, "Begin_Bomb_Defuse_With_Kit" ) )
        {
            is_DefusingWithKit = true
        }
    }
    #if defined USING_REGEX
    return
    #endif
}

public Event_CurWeapon( iPlayer )
{
    #if defined USING_REGEX
    if( !IsUserAuthorized( iPlayer ) )
    {
        return
    }
    #endif
    
    new iId = read_data( 2 )
    if( ~NORELOAD_BITSUM & 1 << iId )
    {
        new iWeapon = get_pdata_cbase( iPlayer, m_pActiveItem, XO_PLAYER )
        new iClientClip = get_pdata_int( iWeapon, m_iClientClip, XO_WEAPON )
        new iClip = read_data( 3 )
        if( iClip > iClientClip )
        {
            // Player <iPlayer> has reloaded weapon <m_pActiveItem>, weapontype iId
            //new iPlayer = get_pdata_cbase( iWeapon, m_pPlayer, 4 )
            
            //if( get_pdata_int( iWeapon, m_fInReload, 4 ) ) {
            g_iAchLevel[ iPlayer ][ RELOADER ]++
            switch( g_iAchLevel[ iPlayer ][ RELOADER ] )
            {
                case MAX_RELOADER:
                {
                    Achievement( iPlayer, RELOADER, -1 )
                }
            }
        //    }
        }
    }
    
    #if defined USING_REGEX
    return
    #endif
}  

public FwdHamShotgunReload( const iWeapon ) 
{
    if( get_pdata_int( iWeapon, m_fInSpecialReload, 4 ) != 1 )
        return
    new Float:flTimeWeaponIdle = get_pdata_float( iWeapon, m_flTimeWeaponIdle, 4 )
    
    if( flTimeWeaponIdle != 0.55 )
        return
    
    new iPlayer = get_pdata_cbase( iWeapon, m_pPlayer, 4 )
        
    #if defined USING_REGEX
    if( !IsUserAuthorized( iPlayer ) )
    {
        return
    }
    #endif
    
    g_iAchLevel[ iPlayer ][ RELOADER ]++
    switch( g_iAchLevel[ iPlayer ][ RELOADER ] )
    {
        case MAX_RELOADER:
        {
            Achievement( iPlayer, RELOADER, -1 )
        }
    }
    #if defined USING_REGEX
    return
    #endif
}

public FwdHUDThink( iEntity )
{
    if ( iEntity != g_iTimerEntity )
        return
        
    static iPlayers[ 32 ], iNum, iPlayer
    get_players( iPlayers, iNum, "ch" )
    
    for( new i = 0; i < iNum; i++ ) 
    {
        iPlayer = iPlayers[ i ]
        if(g_iAchLevel[ iPlayer ][ PLAY_AROUND ] < MAX_PLAY_AROUND )
        {
            if ( ( get_systime() - g_iJoinTime[ iPlayer ] ) >= INTERVAL ) 
            {
                #if defined USING_REGEX
                if( !IsUserAuthorized( iPlayer ) )
                {
                    return
                }
                #endif
                
                g_iJoinTime[ iPlayer ] = get_systime()
                g_iAchLevel[ iPlayer ][ PLAY_AROUND ]++
                switch( g_iAchLevel[ iPlayer ][ PLAY_AROUND ] )
                {
                    case MAX_PLAY_AROUND:
                    {
                        Achievement( iPlayer, PLAY_AROUND, -1 )
                    }
                }
                #if defined USING_REGEX
                return
                #endif
            }
        }
    }
    
    entity_set_float( g_iTimerEntity, EV_FL_nextthink, get_gametime() + 1.0 )
}  

public CmdDeathMessage( id )
{
    if( get_pcvar_num( g_pCvar_DeathMessage ) != 1 )
    {
        
        Print( id, "^4[AMXX]^1 Sorry the^4 death message^1 has been^4 disable^1 for^3 everyone." )
        return PLUGIN_HANDLED
    }
    if( GetBit( g_iDeathMessages, id ) )
    {
        SetBit( g_iDeathMessages, id )
        Print( id, "^4[AMXX]^1 You have^4 Enable^3 death messages^1." )
    } 
    else 
    {
        if( GetBit( g_iDeathMessages, id ) )
        {
            DelBit( g_iDeathMessages, id )
            Print( id, "^4[AMXX]^1 You have^4 Disable^3 death messages^1." )
        }
    }
    return PLUGIN_HANDLED
}

public plugin_precache()
{
    g_fwid = register_forward( FM_PrecacheEvent, "FwdPrecacheEvent", 1 )
    precache_sound( g_szAchievementSound )
    
    #if defined USING_SQL
    g_sql_tuple = SQL_MakeStdTuple()
    
    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 );" )
    #endif
}

public FwdPrecacheEvent( type, const name[] ) 
{
    for( new i = 0; i < sizeof g_iGunEvents; ++i ) {
        if( equal( g_iGunEvents[ i ], name ) ) {
            g_iGunEvent_IDsBitsum |= ( 1 << get_orig_retval() )
            return FMRES_HANDLED
        }
    }
    return FMRES_IGNORED
}

public FwdPlaybackEvent( flags, id, eventid )
{
    if( !( g_iGunEvent_IDsBitsum & ( 1 << eventid ) ) || !IsPlayer( id )/*(1 <= id <= g_iMaxPlayers )*/ )
        return FMRES_IGNORED;
        
    DelBit( iKillerShot, id );
    g_iShotKills[ id ] = 0;

    return FMRES_HANDLED;
}

public Ham_CBasePlayer_TraceAttack( this, iAttacker, Float:damage, Float:direction[ 3 ], traceresult, damagebits )
{
    if( GetBit( is_Connected, iAttacker ) && GetBit( is_Alive, iAttacker ) )
    {
        static g_iWeapon; g_iWeapon = get_user_weapon( iAttacker )
        if( g_iWeapon == CSW_KNIFE || g_iWeapon == CSW_HEGRENADE )
        {
            return HAM_HANDLED
        }
        
        SetBit( iKillerShot, iAttacker )
    
    }
    return HAM_HANDLED
    
}

#if defined USING_SQL
public QueryCreateTable( failstate, Handle:query, error[], errnum, data[], size, Float:queuetime )
{
    if( failstate == TQUERY_CONNECT_FAILED
    || failstate == TQUERY_QUERY_FAILED )
    {
        set_fail_state( error )
    }
}
#endif
new iPage
public Ach_HelpMenu( id, iPage )
{
    //Menu Title
    new title[ 64 ]; formatex( title, sizeof( title ) - 1, "\rAchievement\w Info Menu^n" )
    //Create the menu
    new menu = menu_create( title, "DescriptionMenu_Handle" )
    
    new iNumber[ 5 ], szOption[ 75 ], i
    for( i = 0; i < g_iAchCount; i++ ) {
        num_to_str( i+1, iNumber, 4 )
        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 ] )
        menu_additem( menu, szOption, iNumber )
    }
    for( new iWeap = 0; iWeap < WEAPON_SIZE; iWeap++ ) {
        i++
        num_to_str( i+1, iNumber, 4 )
        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 ] ] )
        menu_additem( menu, szOption, iNumber )
    }
    
    
    menu_setprop( menu, MPROP_EXIT , MEXIT_NORMAL )
    menu_display( id, menu, iPage )
}

public DescriptionMenu_Handle( id, menu, item )
{
    if( item == MENU_EXIT )
    {
        menu_destroy( menu )
        return PLUGIN_HANDLED
    }
    
    new data[ 6 ], iName[ 64 ]
    new access, callback
    
    menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
    player_menu_info( id, menu, menu, iPage )
    
    new key = str_to_num( data )
    new key_2 = ( key-g_iAchCount-2 )
    switch ( key )
    {
        case 1..30:    Print( id, "^4%s^1 %s", g_szAchievementTag, g_iAchsDesciption[ key-1 ] )
        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 ] )
        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 ] )
        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 ] )
        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 ] )
        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 ] )
    }
        
    Ach_HelpMenu( id, iPage )

    return PLUGIN_HANDLED
}

public CmdMainMenu( id )
{
    Ach_StartMenu( id )
}

public Ach_StartMenu( id ) 
{
    new Float:g_Number = ( g_iAchLevel[ id ][ COMPLETED_ACHIEVEMENTS ]*1.0 )
    new Float:g_Number2 = ( g_iAchsMaxPoints[ COMPLETED_ACHIEVEMENTS ]*1.0 )
    new Float:g_Number3 = g_Number/g_Number2*100
    //Menu Title
    new title[ 64 ]; formatex( title, sizeof( title ) - 1, "\yMain Menu^n\wYou are\r %.f percent\w completed!^n", g_Number3 )
    //Create the menu
    new menu = menu_create( title, "StartMenu_Handle" )
    menu_additem( menu, "\wInfo", "1", 0 )
    menu_additem( menu, "\wAchievements\r Player Info", "2", 0 )
    menu_additem( menu, "\wAchievement\y Help", "3", 0 )
    menu_additem( menu, "\wAdmin Cvar Settings\y Help", "4", ADMIN_CVAR )
    menu_display( id, menu )
}

public StartMenu_Handle( id, menu, item )
{
    if( item == MENU_EXIT )
    {
        menu_destroy( menu )
        return PLUGIN_HANDLED
    }
    
    new data[ 6 ], iName[ 64 ]
    new access, callback
    
    menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
    
    new key = str_to_num( data )
    switch( key )
    {
        case 1:
        {
            Print( id, "^4[AMXX]^1 This server is using^3 Achievements^4 v%s^1, by^3 Pastout!", VERSION )
            Ach_StartMenu( id )
        }
        case 2:
        {
            Ach_PlayerInfoMenu( id )
        }
        case 3:
        {
            Ach_HelpMenu( id, iPage )
        }
        case 4:
        {
            Ach_AdminCvarMenu( id )
        }
    }
    return PLUGIN_HANDLED
}

new const g_szGetCvar_String[][] = 
{
    "\rOff",
    "\yDisplay Only to Player",
    "\wDisplay to Everyone"
}

public Ach_AdminCvarMenu( id )
{
    //Menu Title
    new title[ 64 ]; formatex( title, sizeof( title ) - 1, "\rAdmin\w Cvar Settings Menu^n" )
    //Create the menu
    new menu = menu_create( title, "AdminCvarMenu_Handle" )
    new szOption[ 75 ]
    formatex( szOption, sizeof( szOption ), "Show Author Info %s", get_pcvar_num( g_pCvar_ShowInfo ) == 0 ? "\rOff" : "\yOn" )
    menu_additem( menu, szOption, "1", ADMIN_CVAR )
    formatex( szOption, sizeof( szOption ), "Death Message %s", get_pcvar_num( g_pCvar_DeathMessage ) == 0 ? "\rOff" : "\yOn" )
    menu_additem( menu, szOption, "2", ADMIN_CVAR )
    formatex( szOption, sizeof( szOption ), "Flash Message %s", get_pcvar_num( g_pCvar_FlashMessage ) == 0 ? "\rOff" : "\yOn" )
    menu_additem( menu, szOption, "3", ADMIN_CVAR )
    formatex( szOption, sizeof( szOption ), "Bomb Message %s", get_pcvar_num( g_pCvar_BombMessage ) == 0 ? "\rOff" : "\yOn" )
    menu_additem( menu, szOption, "4", ADMIN_CVAR )
    formatex( szOption, sizeof( szOption ), "Play Sound %s", get_pcvar_num( g_pCvar_PlaySound ) == 0 ? "\rOff" : "\yOn" )
    menu_additem( menu, szOption, "5", ADMIN_CVAR )
    if( get_pcvar_num( g_pCvar_Reward ) == 0 )
    {
        menu_additem( menu, "Reward Cash \rOff", "6", ADMIN_CVAR )
    }
    else
    {
        formatex( szOption, sizeof( szOption ), "Reward Cash \y%d", get_pcvar_num( g_pCvar_Reward ) )
        menu_additem( menu, szOption, "6", ADMIN_CVAR )
    }
    formatex( szOption, sizeof( szOption ), "Achievement Message %s", g_szGetCvar_String[ get_pcvar_num( g_pCvar_Message ) ] )
    menu_additem( menu, szOption, "7", ADMIN_CVAR )
    menu_display( id, menu )
}

public AdminCvarMenu_Handle( id, menu, item )
{
    if( item == MENU_EXIT )
    {
        menu_destroy( menu )
        return PLUGIN_HANDLED
    }
    
    new data[ 6 ], iName[ 64 ]
    new access, callback
    
    menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
    
    new key = str_to_num( data )
    switch( key )
    {
        case 1: ToggleCvar( g_pCvar_ShowInfo )
        case 2: ToggleCvar( g_pCvar_DeathMessage )
        case 3: ToggleCvar( g_pCvar_FlashMessage )
        case 4: ToggleCvar( g_pCvar_BombMessage )
        case 5: ToggleCvar( g_pCvar_PlaySound )
        case 6: DoEnterValue( id )
        case 7: ToggleCvar( g_pCvar_Message )
    }
    
    Ach_AdminCvarMenu( id )
    return PLUGIN_HANDLED
}

ToggleCvar( Cvar )
{
    if( g_pCvar_Message == Cvar )
    {
        switch ( get_pcvar_num( Cvar ) )
        {
            case 2: set_pcvar_num( Cvar, 0 )
            case 1: set_pcvar_num( Cvar, 2 )
            case 0: set_pcvar_num( Cvar, 1 )
            default: set_pcvar_num( Cvar, 2 )
        }    
    }
    else
    {
        switch ( get_pcvar_num( Cvar ) )
        {
            case 1: set_pcvar_num( Cvar, 0 )
            case 0: set_pcvar_num( Cvar, 1 )
            default: set_pcvar_num( Cvar, 1 )
        }
    }
}

DoEnterValue( id ) 
{
    client_cmd(id, "messagemode Enter_Value")
}

public CmdEnterValue( id )
{
    new arg[ 5 ]
    read_argv( 1, arg, charsmax( arg ) )
    
    if ( !strlen( arg ) )
    {
        Print( id, "Please type a new value." )
        client_cmd( id, "messagemode Enter_Value" )
        return PLUGIN_HANDLED
    }
    else if ( !IsStrFloat( arg ) )
    {
        Print( id, "You cannot use letters for this cvar! Please type a new value." )
        client_cmd( id, "messagemode Enter_Value" )
        return PLUGIN_HANDLED
    }
    new iCvar = str_to_num( arg )
    set_pcvar_num( g_pCvar_Reward, iCvar )
    Ach_AdminCvarMenu( id )
    return PLUGIN_HANDLED
}

bool:IsStrFloat( string[] )
{
    new len = strlen( string )
    for( new i = 0; i < len; i++ )
    {
        switch ( string[ i ] )
        {
            case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '-', '*':continue;
            default:                                                                                        return false;
        }
    }
    return true
}

public Ach_PlayerInfoMenu( id )
{
    new title[ 64 ]; formatex( title, sizeof( title ) - 1, "\rPlayer Info Achievements^n\w - \ySelect Player")
    new menu = menu_create( title, "Ach_PlayerInfoMenu_Handle" )
    
    new players[ 32 ], pnum, tempid
    new szName[ 32 ], szTempid[ 10 ]
    
    get_players( players, pnum, "h" )
    
    for( new i; i < pnum; i++ )
    {
        tempid = players[ i ]
        
        get_user_name( tempid, szName, charsmax( szName ) )
        num_to_str( tempid, szTempid, 9 )
        
        if( id == tempid )
            menu_additem( menu, "\dYour Stats", szTempid, 0 )
        else
            menu_additem( menu, szName, szTempid, 0 )
    }
    
    menu_display( id, menu )
}

public Ach_PlayerInfoMenu_Handle( id, menu, item )
{
    if( item == MENU_EXIT )
    {
        menu_destroy( menu )
        if( GetBit( is_Connected, id ) )
            Ach_StartMenu( id )
        return PLUGIN_HANDLED
    }
    
    new data[ 6 ], iName[ 64 ]
    new access, callback
    menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
    
    g_iGetTempid[ id ] = str_to_num( data )
    
    Ach_PlayerInfoDisplayMenu( id )
    
    return PLUGIN_HANDLED
}

public Ach_PlayerInfoDisplayMenu( id )
{
    new Float:g_Number = ( g_iAchLevel[ id ][ COMPLETED_ACHIEVEMENTS ]*1.0 )
    new Float:g_Number2 = ( g_iAchsMaxPoints[ COMPLETED_ACHIEVEMENTS ]*1.0 )
    new Float:g_Number3 = g_Number/g_Number2*100
    new szName[ 32 ]; get_user_name( g_iGetTempid[ id ], szName, charsmax( szName ) )
    //Menu Title
    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 )
    //Create the menu
    new menu = menu_create( title, "DescriptionMenu_PlayerHandle" )
    
    new iNumber[ 5 ], szOption[ 75 ], i
    for( i = 0; i < g_iAchCount; i++ ) {
        num_to_str( i+1, iNumber, 4 )
        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 ] )
        menu_additem( menu, szOption, iNumber )
    }
    for( new iWeap = 0; iWeap < WEAPON_SIZE; iWeap++ ) {
        i++
        num_to_str( i+1, iNumber, 4 )
        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 ] ] )
        menu_additem( menu, szOption, iNumber )
    }
    
    
    menu_setprop( menu, MPROP_EXIT , MEXIT_NORMAL )
    menu_display( id, menu, iPage )
    
    return PLUGIN_HANDLED
}

public DescriptionMenu_PlayerHandle( id, menu, item )
{
    if( item == MENU_EXIT )
    {
        menu_destroy( menu )
        if( GetBit( is_Connected, id ) )
            Ach_PlayerInfoMenu( id )
        return PLUGIN_HANDLED
    }
    
    new data[ 6 ], iName[ 64 ]
    new access, callback
    
    menu_item_getinfo( menu, item, access, data, 5, iName, 63, callback )
    player_menu_info( id, menu, menu, iPage )
    
    Ach_PlayerInfoDisplayMenu( id )
        
    return PLUGIN_HANDLED
}

public plugin_end()
{
    TrieDestroy( g_tWeaponNameToID )
    #if !defined USING_SQL
    nvault_close( g_iVault )
    #endif
}

public Ham_CBasePlayer_Spawn( id )
{
    if( !is_user_alive( id ) )
    {
        return HAM_IGNORED
    }
    
    SetBit( is_Alive, id )
    
    return HAM_IGNORED;
}

public client_connect( id )
{
    ResetStats( id )
}

public client_authorized( id )
{
    if(/* is_user_bot( id ) ||*/ is_user_hltv( id ) )
    {
        SetBit( is_NotValidPlayer, id )
    }
    
    if( !GetBit( is_NotValidPlayer, id ) )
    {
        #if defined USING_REGEX
        get_user_authid( id, g_iAuthID[ id ], charsmax( g_iAuthID[] ) )
        
        if( !IsValidAuthid( g_iAuthID[ id ] ) )
        {
            g_iAuthID[ id ][ 0 ] = 0
        }
        else
        {
            g_iLoadStats( id )
        }
        #else
        if( is_user_bot( id ) )
        {
            get_user_name( id, g_iAuthID[ id ], charsmax( g_iAuthID[] ) )
        }
        else if( !IsValidAuthid( g_iAuthID[ id ] ) )
        {
            get_user_ip( id, g_iAuthID[ id ], charsmax( g_iAuthID[] ) )
        }
        else
        {
            get_user_authid( id, g_iAuthID[ id ], charsmax( g_iAuthID[] ) )
        }

        g_iLoadStats( id )
        #endif
    }
}

public client_putinserver( id )
{
    SetBit( is_Connected, id )
    if( GetBit( is_Connected, id ) )
    {
        #if defined USING_REGEX
        if( !IsUserAuthorized( id ) )
        {
            return
        }
        #endif
        g_iJoinTime[ id ] = get_systime();
        
        DelBit( is_Alive, id );

        SetBit( g_iDeathMessages, id )
        g_iAchLevel[ id ][ CONNECTIONS ]++
            
        new szName[ 32 ]
        get_user_name( id, szName, charsmax( szName ) )

        switch( g_iAchLevel[ id ][ CONNECTIONS ] )
        {
            case 50: AchievementSecondary( id, 0 )
            
            case 100: AchievementSecondary( id, 1 )
            
            case 250: AchievementSecondary( id, 2 )
            
            case MAX_CONNECTION:
            {
                Achievement( id, CONNECTIONS, -1 )
            }
        }
    }
}

public client_disconnect( id )
{
    #if defined USING_REGEX
    if( !IsUserAuthorized( id ) )
    {
        return 
    }
    #endif
    if( !GetBit( is_NotValidPlayer, id ) )
    {
        g_iSaveStats( id )
    }

    g_iJoinTime[ id ] = 0;
    DelBit( is_Connected, id );
    DelBit( is_Alive, id )

    #if defined USING_SQL
    g_loaded_data[ id ] = 0
    #endif
}

public FwdCmdStart( id, handle )
{
    if ( !GetBit( is_Connected, id ) && !GetBit( is_Alive, id ) ) 
    {
        return FMRES_IGNORED
    }
    #if defined USING_REGEX
    if( !IsUserAuthorized( id ) )
    {
        return FMRES_IGNORED
    }
    #endif

    if( g_iAchLevel[ id ][ CAMP_FIRE ] < MAX_CAMP_FIRE )
    {
        if( entity_get_int( id, EV_INT_button ) & ( IN_MOVELEFT | IN_MOVERIGHT | IN_BACK | IN_FORWARD ) )
        {
            DelBit( iKillerHasNotMoved, id )
            g_iKills[ id ] = 0
        }
        else 
        {
            SetBit( iKillerHasNotMoved, id )
        }
    }
    
    if( g_iAchLevel[ id ][ FLY_AWAY ] < MAX_FLY_AWAY  || g_iAchLevel[ id ][ FLY_KILLER ] < MAX_FLY_KILLER)
    {
        if( entity_get_int( id, EV_INT_flags ) & FL_ONGROUND )
        {
            DelBit( is_VictimInAir, id )
        }
        else
        {
            SetBit( is_VictimInAir, id )
        }
    }
    
    if( g_iAchLevel[ id ][ DISTANCE_WALKED ] < MAX_DISTANCE_WALKED && !GetBit( iKillerHasNotMoved, id ) )
    {
        new Float:vecOrigin[ 3 ]
        entity_get_vector( id, EV_VEC_origin, vecOrigin )
    
        if( !xs_vec_equal( vecOldOrigin[ id ], vecNullOrigin ) )
        {
            flDistance[ id ] += get_distance_f( vecOrigin, vecOldOrigin[ id ] )
        }
        
        xs_vec_copy( vecOrigin, vecOldOrigin[ id ] )
        
        new szName[ 32 ]
        get_user_name( id, szName, charsmax( szName ) )
        
        switch( g_iAchLevel[ id ][ DISTANCE_WALKED ] )
        {
            case 0:
            {
                if( flDistance[ id ]/g_iFeet >= 1 )//baby steps
                {
                    g_iAchLevel[ id ][ DISTANCE_WALKED ]++
                    AchievementSecondary( id, 3 )
                }
            }
            case 1:
            {
                if( flDistance[ id ]/g_iFeet >= 5280 )//1 mile hey?
                {
                    g_iAchLevel[ id ][ DISTANCE_WALKED ]++
                    AchievementSecondary( id, 4 )
                }
            }
            case MAX_DISTANCE_WALKED:
            {
                if( flDistance[ id ]/g_iFeet >= 26400 )//Five miles hey? Is this possible IDK lol
                {
                    Achievement( id, DISTANCE_WALKED, -1 )
                }
            }
        }
    }
    
    return FMRES_IGNORED
}

ResetStats( id )
{
    flDistance[ id ] = 0.0
    xs_vec_copy( vecNullOrigin, vecOldOrigin[ id ] )
}

public Event_NewRound()
{
    if ( task_exists( 2345 ) )
        remove_task( 2345 )
    if ( task_exists( 2346 ) )
        remove_task( 2346 )
    
    if( get_pcvar_num( g_pCvar_ShowInfo ) == 1 )
    {
        if( g_iRounds >= 10 ) {
            Print( 0, "^4[AMXX]^1 This server is using^3 Achievements^4 v%s^1, by^3 Pastout!", VERSION )
            Print( 0, "^4[AMXX]^1 Type^3 /help^1 for information about^4 achievements")
            g_iRounds = 0
        }
        
        g_iRounds++
    }
    
    new iPlayers[ 32 ], iNum, iPlayer
    get_players( iPlayers, iNum, "ch" )
    
    for( new i = 0; i < iNum; i++ ) 
    {
        iPlayer = iPlayers[ i ]

        g_iRoundSparys[ iPlayer ] = 0;
        DelBit( StandAlone, iPlayer )
    }
    
    g_iBombPlant = false
    g_iGetBombPlanted = 26
    
    set_task( 1.0, "CheckBombPlantedTimer", 2345, _, _, "a", g_iGetBombPlanted )
}

public CheckBombPlantedTimer( )
{ 
    g_iGetBombPlanted--
    
    if( g_iGetBombPlanted >= 1 )
        g_iGetBombDown = true
     else     
    {
        g_iGetBombDown = false
        remove_task( 2345 )
    }

}

public bomb_defused( iDefuser )
{
    #if defined USING_REGEX
    if( !IsUserAuthorized( iDefuser ) )
    {
        return PLUGIN_HANDLED
    }
    #endif
    new szName[ 32 ]
    get_user_name( iDefuser, szName, charsmax( szName ) )

    if( g_iBombPlant && g_iAchLevel[ iDefuser ][ BOMB ] < MAX_BOMB )
    {
        g_iAchLevel[ iDefuser ][ BOMB ]++
        Achievement( iDefuser, BOMB, -1 )
    }
    
    g_iAchLevel[ iDefuser ][ DEFUSED_BOMB ]++
    switch( g_iAchLevel[ iDefuser ][ DEFUSED_BOMB ] )
    {
        case 5: AchievementSecondary( iDefuser, 5 )
        
        case 10: AchievementSecondary( iDefuser, 6 )

        case 15: AchievementSecondary( iDefuser, 7 )
    
        case 20: AchievementSecondary( iDefuser, 8 )

        case MAX_DEFUSED_BOMB: 
        {
            Achievement( iDefuser, DEFUSED_BOMB, -1 )
        }
    }
    if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
    {
        Print( 0, "^4[AMXX]^3 %s^1 has defused the^4 bomb.", szName ) 
    }
    #if defined USING_REGEX
    return PLUGIN_HANDLED
    #endif
}

public bomb_defusing( id )
{
    if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
    {
        new szName[ 32 ]; get_user_name( id, szName, charsmax( szName ) )
        Print( 0, "^4[AMXX]^3 %s^1 is defusing the^4 bomb^1 with%s a^3 kit^1.", szName, is_DefusingWithKit ? "" : "out" ) 
    }
}

public bomb_planting( id )
{
    if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
    {
        new szName[ 32 ]; get_user_name( id, szName, charsmax( szName ) )
        Print( 0, "^4[AMXX]^3 %s^1 is planting the^4 bomb.", szName ) 
    }
}

public bomb_planted( iPlanter )
{
    #if defined USING_REGEX
    if( !IsUserAuthorized( iPlanter ) )
    {
        return PLUGIN_HANDLED
    }
    #endif
    
    g_iBombTime = get_pcvar_num( g_pCvarC4Timer )
    set_task( 1.0, "CheckC4Timer", 2346, _, _, "a", g_iBombTime )
    
    g_iAchLevel[ iPlanter ][ PLANT_BOMB_COUNT ]++

    if( GetBit(is_Connected, iPlanter ) && GetBit( is_Alive, iPlanter ) )
    {

        if( g_iGetBombDown && g_iAchLevel[ iPlanter ][ PLANT_BOMB ] < MAX_PLANT_BOMB )
        {
            g_iAchLevel[ iPlanter ][ PLANT_BOMB ]++
            Achievement( iPlanter, PLANT_BOMB, -1 )
        }
    
        switch( g_iAchLevel[ iPlanter ][ PLANT_BOMB_COUNT ] )
        {
            case MAX_PLANT_BOMB_COUNT:
            {
                Achievement( iPlanter, PLANT_BOMB_COUNT, -1 )
            }
        }
    }
    if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
    {
        new szName[ 32 ]; get_user_name( iPlanter, szName, charsmax( szName ) )
        Print( 0, "^4[AMXX]^3 %s^1 has planted the^4 bomb.", szName ) 
    }
    
    g_C4Ent = fm_get_c4()
    pev( g_C4Ent , pev_origin , g_fC4Origin )
    
    #if defined USING_REGEX
    return PLUGIN_HANDLED
    #endif
}

public CheckC4Timer()
{ 
    g_iBombTime --
    if( g_iBombTime <= 1 )
    {
        g_iBombPlant = true
        remove_task( 2346 )
    }
}

public Event_GotBomb( id )
{
    g_iPlanter = id
}

public bomb_explode( g_iPlayer )
{
    if( get_pcvar_num( g_pCvar_BombMessage ) == 1 )
    {
        Print( 0, "^4[AMXX]^1 The^3 bomb^1 has^4 exploded." )  
    }
}

public client_death( iKiller, iVictim, iWeapon, iHitplace, TK )
{
    #if defined USING_REGEX
    if( !IsUserAuthorized( iKiller ) || !IsUserAuthorized( iVictim ) )
    {
        return PLUGIN_HANDLED
    }
    #endif
    
    if( ( iWeapon == CSW_HEGRENADE ) && !TK && GetBit( is_Alive, iKiller ) )
    {
        g_iPlayersKills[ iKiller ][ CSW_HEGRENADE ]++
        if( g_iPlayersKills[ iKiller ][ CSW_HEGRENADE ] == 25 )
        {
            Achievement( iKiller, -1, HEGRENADE )
        }
        
        g_iGrenadeKills[ iKiller ]++
        if( g_iGrenadeKills[ iKiller ] >= 3 )
        {
            g_iAchLevel[ iKiller ][ HAT_TRICK ]++
            switch( g_iAchLevel[ iKiller ][ HAT_TRICK ] )
            {
                case MAX_HAT_TRICK:
                {
                    Achievement( iKiller, HAT_TRICK, -1 )
                }
            }
            g_iGrenadeKills[ iKiller ] = 0
        }
        set_task( 0.3, "ResetGrenadeKills", iKiller )
    }
    
    #if defined USING_REGEX
    return PLUGIN_HANDLED
    #endif
}

public ResetGrenadeKills( iKiller )
    if( GetBit( is_Connected, iKiller ) )
        g_iGrenadeKills[ iKiller ] = 0;

public grenade_throw( id, grenadeIndex, weaponId )
{
    #if defined USING_REGEX
    if( !IsUserAuthorized( id ) )
    {
        return PLUGIN_HANDLED
    }
    #endif
    
    switch( weaponId )
    {
        case CSW_FLASHBANG:
        {
            g_iPlayersKills[ id ][ CSW_FLASHBANG ]++
            
            if( g_iPlayersKills[ id ][ CSW_FLASHBANG ] == MAX_FLASHBANG )
            {
                Achievement( id, -1, FLASHBANG )
            }
        }
        case CSW_SMOKEGRENADE:
        {
            g_iPlayersKills[ id ][ CSW_SMOKEGRENADE ]++
            
            if( g_iPlayersKills[ id ][ CSW_SMOKEGRENADE ] == MAX_SMOKEGRENADE )
            {
                Achievement( id, -1, SMOKEGRENADE )
            }
        }
    }
    #if defined USING_REGEX
    return PLUGIN_HANDLED
    #endif
}

get_user_flashed( id, &iPercent=0 )
{
    new Float:flFlashedAt = get_pdata_float( id, m_flFlashedAt, XO_PLAYER )
    
    if( !flFlashedAt )
    {
        return 0
    }
    
    new Float:flGameTime = get_gametime()
    new Float:flTimeLeft = flGameTime - flFlashedAt
    new Float:flFlashDuration = get_pdata_float( id, m_flFlashDuration, XO_PLAYER )
    new Float:flFlashHoldTime = get_pdata_float( id, m_flFlashHoldTime, XO_PLAYER )
    new Float:flTotalTime = flFlashHoldTime + flFlashDuration
    
    if( flTimeLeft > flTotalTime )
    {
        return 0
    }
    
    new iFlashAlpha = get_pdata_int( id, m_iFlashAlpha, XO_PLAYER )
    
    if( iFlashAlpha == ALPHA_FULLBLINDED )
    {
        if( get_pdata_float( id, m_flFlashedUntil, XO_PLAYER) - flGameTime > 0.0 )
        {
            iPercent = 100
        }
        else
        {
            iPercent = 100-floatround( ( ( flGameTime - ( flFlashedAt + flFlashHoldTime ) ) * 100.0 )/flFlashDuration )
        }
    }
    else
    {
        iPercent = 100-floatround( ( ( flGameTime - flFlashedAt ) * 100.0 ) / flTotalTime )
    }
    
    return iFlashAlpha
}

public Event_PlayerKilled()
{
    new iKiller = read_data( 1 )
    new iVictim = read_data( 2 )
    
    if( is_user_alive( iKiller ) )
        SetBit( is_Alive, iKiller )
    else 
        DelBit( is_Alive, iKiller )
    
    if( !IsPlayer( iKiller ) || iKiller == iVictim )
    {
        return PLUGIN_HANDLED
    }
    
    #if defined USING_REGEX
    if( !IsUserAuthorized( iKiller ) || !IsUserAuthorized( iVictim ) )
    {
        return PLUGIN_HANDLED
    }
    #endif
    
    new headshot = read_data( 3 )
    new g_iKiller[ 32 ], g_iVictim[ 32 ], g_iWeapon[ 16 ], g_iOrigin[ 3 ], g_iOrigin2[ 3 ]
    read_data(4, g_iWeapon, 15)

    get_user_origin( iKiller, g_iOrigin )
    get_user_origin( iVictim, g_iOrigin2 )
    new flDistance = get_distance( g_iOrigin, g_iOrigin2 )
    
    get_user_name( iKiller, g_iKiller, charsmax( g_iKiller ) )
    get_user_name( iVictim, g_iVictim, charsmax( g_iVictim ) )
    
    if( GetBit( iKillerShot, iKiller ) )
    {
        g_iShotKills[ iKiller ]++
        if( g_iShotKills[ iKiller ] >= 2 )
        {
            g_iAchLevel[ iKiller ][ AMMO_CONSERVATION ]++
            switch( g_iAchLevel[ iKiller ][ AMMO_CONSERVATION ] )
            {
                case MAX_AMMO_CONSERVATION:
                {
                    Achievement( iKiller, AMMO_CONSERVATION, -1 )
                }
            }
            g_iShotKills[ iKiller ] = 0 
        }
    }
    
    if( headshot )
    {
        
        g_iAchLevel[ iKiller ][ HEAD_SHOTS ]++
        
        switch( g_iAchLevel[ iKiller ][ HEAD_SHOTS ] )
        {
            case MAX_HEAD_SHOTS: 
            {
                Achievement( iKiller, HEAD_SHOTS, -1 )
            }
        }
    }

    if( TrieGetCell( g_tWeaponNameToID, g_iWeapon, iWeaponID ) )
    {
        g_iPlayersKills[ iKiller ][ iWeaponID ]++

        switch( iWeaponID )
        {
            case CSW_P228:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_P228: 
                    {
                        g_iAchLevel[ iKiller ][ PISTOL_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, P228 )
                    }
                }
            }
            case CSW_SCOUT:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_SCOUT: 
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, SCOUT )
                    }
                }
            }

            case CSW_XM1014:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_XM1014: 
                    {
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        g_iAchLevel[ iKiller ][ SHOTGUN_MASTER ]++
                        Achievement( iKiller, -1, XM1014 )
                    }
                }
            }

            case CSW_MAC10:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_MAC10: 
                    {
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, MAC10 )
                    }
                }
            }
            case CSW_AUG:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_AUG:
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++    
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, AUG )
                    }
                }
                
            }
            /*
            case CSW_SMOKEGRENADE:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {

                }
            }*/
            case CSW_ELITE:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_ELITE:
                    {
                        g_iAchLevel[ iKiller ][ PISTOL_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, ELITE )
                    }
                }
            }
            case CSW_FIVESEVEN:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_FIVESEVEN: 
                    {
                        g_iAchLevel[ iKiller ][ PISTOL_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, FIVESEVEN )
                    }
                }
            }
            case CSW_UMP45:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_UMP45: 
                    {
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, UMP45 )
                    }
                }
            }
            case CSW_SG550:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_SG550: 
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, SG550 )
                    }
                }
            }
            case CSW_GALIL:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_GALIL: 
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, GALIL )
                    }
                }
            }
            case CSW_FAMAS:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_FAMAS: 
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, FAMAS )
                    }
                }
            }
            case CSW_USP:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_USP:
                    {
                        g_iAchLevel[ iKiller ][ PISTOL_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, USP )
                    }
                }
            }
            case CSW_GLOCK18:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_GLOCK18:
                    {
                        g_iAchLevel[ iKiller ][ PISTOL_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, GLOCK18 )
                    }
                }
            }
            case CSW_AWP:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_AWP:
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, AWP )
                    }
                }
            }
            case CSW_MP5NAVY:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_MP5NAVY: 
                    {
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, MP5NAVY )
                    }
                }
            }
            case CSW_M249:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_M249:
                    {
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, M249 )
                    }
                }
            }
            case CSW_M3:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_M3: 
                    {
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        g_iAchLevel[ iKiller ][ SHOTGUN_MASTER ]++
                        Achievement( iKiller, -1, M3 )
                    }
                }
            }
            case CSW_M4A1:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_M4A1:
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, M4A1 )
                    }
                }
            }
            case CSW_TMP:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_TMP: 
                    {
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, TMP )
                    }
                }
            }
            case CSW_G3SG1:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_G3SG1:
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, G3SG1 )
                    }
                }
            }
            /*
            case CSW_FLASHBANG:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {

                }
            }*/
            case CSW_DEAGLE:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_DEAGLE: 
                    {
                        g_iAchLevel[ iKiller ][ PISTOL_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, DEAGLE )
                    }
                }
            }
            case CSW_SG552:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_SG552: 
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, SG552 )
                    }
                }
            }
            case CSW_AK47:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_AK47:
                    {
                        g_iAchLevel[ iKiller ][ RIFLE_MASTER ]++
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, AK47 )
                    }
                }
            }
            case CSW_KNIFE:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_KNIFE: 
                    {
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, KNIFE )
                    }
                }
            }
            case CSW_P90:
            {
                switch( g_iPlayersKills[ iKiller ][ iWeaponID ] )
                {
                    case MAX_P90: 
                    {
                        g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ]++
                        Achievement( iKiller, -1, P90 )
                    }
                }
            }
        }
    }
    new g_RoundDistance = floatround( flDistance/g_iFeet )
        
    switch( g_iAchLevel[ iKiller ][ DISTANCE_KILLED ] )
    {
        case 0:
        {
            if( g_RoundDistance <= 5 )
            {
                g_iAchLevel[ iKiller ][ DISTANCE_KILLED ]++
                AchievementSecondary( iKiller, 9 )
            }
        }
        
        case 1:
        {
            if( 6 <= g_RoundDistance <= 50 )
            {
                g_iAchLevel[ iKiller ][ DISTANCE_KILLED ]++
                AchievementSecondary( iKiller, 10 )
            }    
        }
        
        case 2:
        {
            if( 51 <= g_RoundDistance <= 99 )
            {
                g_iAchLevel[ iKiller ][ DISTANCE_KILLED ]++
                AchievementSecondary( iKiller, 11 )
            }
        }
        
        case 3:
        {
            if( 100 <= g_RoundDistance <= 150 )
            {
                g_iAchLevel[ iKiller ][ DISTANCE_KILLED ]++
                AchievementSecondary( iKiller, 12 )
            }
        }
        case MAX_DISTANCE_KILLED:
        {
            if( 151 <= g_RoundDistance <= 300 )
            {
                Achievement( iKiller, DISTANCE_KILLED, -1 )
            }
        }
    }
    
    g_iAchLevel[ iKiller ][ TOTAL_KILLS ]++
    switch( g_iAchLevel[ iKiller ][ TOTAL_KILLS ] )
    {
        case 250:
        {
            AchievementSecondary( iKiller, 13 )
        }
        case MAX_TOTAL_KILLS:
        {
            Achievement( iKiller, TOTAL_KILLS, -1 )
        }
    }
    
    switch( g_iAchLevel[ iKiller ][ PISTOL_MASTER ] )
    {
        case MAX_PISTOL_MASTER:
        {
            Achievement( iKiller, PISTOL_MASTER, -1 )
        }
    }

    switch( g_iAchLevel[ iKiller ][ RIFLE_MASTER ] )
    {
        case MAX_RIFLE_MASTER:
        {
            Achievement( iKiller, RIFLE_MASTER, -1 )
        }
    }
    
    switch( g_iAchLevel[ iKiller ][ SHOTGUN_MASTER ] )
    {
        case MAX_SHOTGUN_MASTER:
        {
            Achievement( iKiller, SHOTGUN_MASTER, -1 )
        }
    }
    
    switch( g_iAchLevel[ iKiller ][ MASTER_AT_ARMS ] )
    {
        case MAX_MASTER_AT_ARMS:
        {
            Achievement( iKiller, MASTER_AT_ARMS, -1 )
        }
    }
    
    if( GetBit( is_VictimInAir, iVictim ) )
    {
        g_iAchLevel[ iKiller ][ FLY_AWAY ]++
        switch( g_iAchLevel[ iKiller ][ FLY_AWAY ] )
        {
            case MAX_FLY_AWAY:
            {
                Achievement( iKiller, FLY_AWAY, -1 )
            }
        }
    }
    if( GetBit( is_VictimInAir, iKiller ) )
    {
        g_iAchLevel[ iKiller ][ FLY_KILLER ]++
        switch( g_iAchLevel[ iKiller ][ FLY_KILLER ] )
        {
            case MAX_FLY_KILLER:
            {
                Achievement( iKiller, FLY_KILLER, -1 )
            }
        }
    }
    new iPercent
    if( get_user_flashed( iKiller, iPercent ) )
    {
        if( get_pcvar_num( g_pCvar_FlashMessage ) == 1 )
        {
            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 )
        }
        if( iPercent == 100 )
        {
            g_iAchLevel[ iKiller ][ SPRAY_N_PRAY ]++
            
            switch( g_iAchLevel[ iKiller ][ SPRAY_N_PRAY ] )
            {
                case MAX_SPRAY_N_PRAY:
                {
                    Achievement( iKiller, SPRAY_N_PRAY, -1 )
                }
            }
        }

    }
    else
    {
        if( get_pcvar_num( g_pCvar_DeathMessage ) == 1 && GetBit( g_iDeathMessages, iKiller ) )
        {
            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" )
        }
    }
    new iPlayers[ 32 ], iNum, iPlayer, ctCount = 0, tCount = 0
    get_players( iPlayers, iNum, "ach" )
    
    for( new i = 0; i < iNum; i++ ) 
    {
        iPlayer = iPlayers[ i ]
        
        static CsTeams:iTeam
        iTeam = cs_get_user_team( iPlayer )
        
        switch( iTeam )
        {
            case CS_TEAM_CT:
            {
                ctCount++
            }
            
            case CS_TEAM_T:
            {
                tCount++
            }
        }
    }
    static CsTeams:iTeam
    iTeam = cs_get_user_team( iVictim )
    
    
    if( iTeam == CS_TEAM_CT && ctCount == 1 && tCount >= 3 )
    {
        SetBit( StandAlone, iVictim )
    }
    if( iTeam == CS_TEAM_T && ctCount >= 3 && tCount == 1 )
    {
        SetBit( StandAlone, iVictim )
    }

    if( GetBit( StandAlone, iVictim ) )
    {
        g_iAchLevel[ iVictim ][ STAND_ALONE ]++
        switch( g_iAchLevel[ iVictim ][ STAND_ALONE ] )
        {
            case MAX_STAND_ALONE:
            {
                Achievement( iVictim, STAND_ALONE, -1 )
            }
        }
        DelBit( StandAlone, iVictim )
    }
    

    
    if( get_user_health( iKiller ) == 1 )
    {
        SetBit( OneHpHero, iKiller )
    }
    
    if( GetBit( OneHpHero, iKiller ) )
    {
        g_iAchLevel[ iKiller ][ ONE_HP_HERO ]++
        switch( g_iAchLevel[ iKiller ][ ONE_HP_HERO ] )
        {
            case MAX_ONE_HP_HERO:
            {
                Achievement( iKiller, ONE_HP_HERO, -1 )
            }
        }
    }
    
    if( cs_get_user_team( iKiller ) == iTeam )
    {
        g_iAchLevel[ iKiller ][ BAD_FRIEND ]++
        switch( g_iAchLevel[ iKiller ][ BAD_FRIEND ] )
        {
            case MAX_BAD_FRIEND:
            {
                Achievement( iKiller, BAD_FRIEND, -1 )
            }
        }
    }
    
    if( GetBit( iKillerHasNotMoved, iKiller ) )
    {
        g_iKills[ iKiller ]++
        if( g_iKills[ iKiller ] >= 3 )
        {
            
            g_iAchLevel[ iKiller ][ CAMP_FIRE ]++
            switch( g_iAchLevel[ iKiller ][ CAMP_FIRE ] )
            {
                case MAX_CAMP_FIRE:
                {
                    Achievement( iKiller, CAMP_FIRE, -1 )
                }
            }
        }
    }
    
    return PLUGIN_HANDLED
}

public Event_Spray( ) 
{ 
    new iPlayer = read_data( 2 );
    
    #if defined USING_REGEX
    if( !IsUserAuthorized( iPlayer ) )
    {
        return PLUGIN_HANDLED
    }
    #endif
    
    g_iAchLevel[ iPlayer ][ URBAN_DESIGNER ]++
    switch( g_iAchLevel[ iPlayer ][ URBAN_DESIGNER ] )
    {
        case MAX_URBAN_DESIGNER:
        {
            Achievement( iPlayer, URBAN_DESIGNER, -1 )
        }
    }
    
    g_iRoundSparys[ iPlayer ]++
    
    if( g_iRoundSparys[ iPlayer ] == 3 )
    {
        g_iAchLevel[ iPlayer ][ GRAFFITI ]++
        switch( g_iAchLevel[ iPlayer ][ GRAFFITI ] )
        {
            case MAX_GRAFFITI:
            {
                Achievement( iPlayer, GRAFFITI, -1 )
            }
        }
    }
    #if defined USING_REGEX
    return PLUGIN_HANDLED
    #endif
}

public Achievement( id, ACH_ITEM, ACH_WEAPON )
{
    new szName[ 32 ]; get_user_name( id, szName, charsmax( szName ) )
    new g_pCvarGet_Message = get_pcvar_num( g_pCvar_Message )
    if( g_pCvarGet_Message == 2 )
    {
        new g_iPlayers[ 32 ], iPlayer, iNum
        get_players( g_iPlayers, iNum )
        for ( new i=0; i<iNum; i++ ) 
        {
            iPlayer = g_iPlayers[ i ]
            if( id == iPlayer )
                continue
            Print( iPlayer, "^4%s^3 %s^1 has earned ^3'^1%s^3'^4 achievement!", g_szAchievementTag, szName, ACH_ITEM >= 0 ? g_iAchsMotd[ ACH_ITEM ] : g_iAchsWeap[ ACH_WEAPON ] ) 
        }
    }
    if( g_pCvarGet_Message == 1 || g_pCvarGet_Message == 2 )
        Print( id, "^4%s^3 You^1 have earned ^3'^1%s^3'^4 achievement!", g_szAchievementTag, ACH_ITEM >= 0 ? g_iAchsMotd[ ACH_ITEM ] : g_iAchsWeap[ ACH_WEAPON ] ) 
    
    if( get_pcvar_num( g_pCvar_PlaySound ) == 1 )
        client_cmd( id, "spk ^"sound/achieve.wav^"" )
        
    new g_pCvarGet_Reward = get_pcvar_num( g_pCvar_Reward )
    if( g_pCvarGet_Reward > 0 )
        cs_set_user_money( id, cs_get_user_money( id ) + g_pCvarGet_Reward, 1 )
        
    g_iAchLevel[ id ][ COMPLETED_ACHIEVEMENTS ]++
}

public AchievementSecondary( id, ACH_ITEM )
{
    new szName[ 32 ]; get_user_name( id, szName, charsmax( szName ) )
    new g_pCvarGet_Message = get_pcvar_num( g_pCvar_Message )
    if( g_pCvarGet_Message == 2 )
    {
        new g_iPlayers[ 32 ], iPlayer, iNum
        get_players( g_iPlayers, iNum )
        for ( new i=0; i<iNum; i++ ) 
        {
            iPlayer = g_iPlayers[ i ]
            if( id == iPlayer )
                continue
            Print( iPlayer, "^4%s^3 %s^1 has earned ^3'^1%s^3'^4 achievement!", g_szAchievementTag, szName, g_iAchsSecondary[ ACH_ITEM ] ) 
        }
    }
    if( g_pCvarGet_Message == 1 || g_pCvarGet_Message == 2 )
        Print( id, "^4%s^3 You^1 have earned ^3'^1%s^3'^4 achievement!", g_szAchievementTag, g_iAchsSecondary[ ACH_ITEM ] ) 
    
    if( get_pcvar_num( g_pCvar_PlaySound ) == 1 )
        client_cmd( id, "spk ^"sound/achieve.wav^"" )
        
    new g_pCvarGet_Reward = get_pcvar_num( g_pCvar_Reward )
    if( g_pCvarGet_Reward > 0 )
        cs_set_user_money( id, cs_get_user_money( id ) + g_pCvarGet_Reward, 1 )
    
    g_iAchLevel[ id ][ COMPLETED_ACHIEVEMENTS ]++
}

Print( index, const Msg[ ], { Float, Sql, Result, _ }:... ) {
    new Buffer[ 190 ], Buffer2[ 192 ]
    formatex( Buffer2, charsmax( Buffer2 ), "%s", Msg )
    vformat( Buffer, charsmax( Buffer ), Buffer2, 3 )

    if ( !index ) {
        
        new g_iPlayers[ 32 ]
        new iPlayer
        new iNum
        get_players( g_iPlayers, iNum )
        for ( new i=0; i<iNum; i++ ) 
        {
            iPlayer = g_iPlayers[ i ]

            message_begin( MSG_ONE_UNRELIABLE, g_iMsgSayText,_, iPlayer )
            write_byte( iPlayer )
            write_string( Buffer )
            message_end( )
        }
    }
    else {
        if ( !GetBit( is_Connected, index ) )
            return;

        message_begin( MSG_ONE, g_iMsgSayText,_, index )
        write_byte( index )
        write_string( Buffer )
        message_end( )
    }
}

//#if defined USING_REGEX
IsValidAuthid( authid[] )
{
    return ( regex_match_c( authid, g_SteamID_pattern, g_regex_return ) > 0 )
}
#if defined USING_REGEX
IsUserAuthorized( id )
{
    return g_iAuthID[ id ][ 0 ] != 0
}
#endif

public g_iLoadStats( id )
{
    #if defined USING_SQL
    static query[ 128 ]
    formatex( query, sizeof( query ) - 1, "SELECT data FROM Achievement WHERE authid = ^"%s^";", g_iAuthID[ id ] )
    
    static data[ 2 ]
    data[ 0 ] = id
    
    SQL_ThreadQuery( g_sql_tuple, "QueryLoadData", query, data, sizeof( data ) )

    #else
    static data[ 256 ], timestamp
    if( nvault_lookup( g_iVault, g_iAuthID[ id ], data, sizeof( data ) - 1, timestamp ) )
    {
        ParseLoadData( id, data )
        return//
    }
    else
    {
        NewUser( id )
    }
    #endif
}

public NewUser( id )
{
    
    for( new iLevel = 0; iLevel < g_iAchCount; iLevel++ )
    {
        g_iAchLevel[ id ][ iLevel ] = 0
    }

    for( new i = 0; i < WEAPON_SIZE; i++ )
    {
        g_iPlayersKills[ id ][ g_iWeaponIDs[ i ] ] = 0
    }

}

#if defined USING_SQL
public QueryLoadData( failstate, Handle:query, error[], errnum, data[], size, Float:queuetime )
{
    if( failstate == TQUERY_CONNECT_FAILED
    || failstate == TQUERY_QUERY_FAILED )
    {
        set_fail_state( error )
    }
    else
    {
        if( SQL_NumResults( query ) )
        {
            static sqldata[ 256 ]
            SQL_ReadResult( query, 0, sqldata, sizeof( sqldata ) - 1 )
            ParseLoadData( data[0], sqldata )
        }
        else
        {
            NewUser( data[ 0 ] )
        }
    }
}
#endif

ParseLoadData( id, data[ 256 ] )
{
    new num[ 6 ]
    
    for( new i = 0; i < WEAPON_SIZE; i++ )
    {
        strbreak( data, num, sizeof( num ) - 1, data, sizeof( data ) - 1 )
        g_iPlayersKills[ id ][ g_iWeaponIDs[ i ] ] = clamp( str_to_num( num ), 0, g_iAchsWeaponMaxKills[ i ] )
    }
    
    for( new iLevel = 0; iLevel < g_iAchCount; iLevel++ )
    {
        strbreak( data, num, sizeof( num ) - 1, data, sizeof( data ) - 1 )
        g_iAchLevel[ id ][ iLevel ] = clamp( str_to_num( num ), 0, g_iAchsMaxPoints[ iLevel ] )
    }
    
    #if defined USING_SQL
    g_loaded_data[ id ] = 1
    #endif
}

public g_iSaveStats( id )
{
    #if defined USING_REGEX
    if( !IsUserAuthorized( id ) ) return
    #endif
    
    static data[ 256 ]
    new len
    
    for( new i = 0; i < WEAPON_SIZE; i++ )
    {
        len += formatex( data[ len ], sizeof( data ) - len - 1, " %i", g_iPlayersKills[ id ][ g_iWeaponIDs[ i ] ] )
    }
    
    for( new iLevel = 0; iLevel < g_iAchCount; iLevel++ )
    {
        len += formatex( data[ len ], sizeof( data ) - len - 1, " %i", g_iAchLevel[ id ][ iLevel ] )
    }
    
    #if defined USING_SQL
    static name[ 32 ]; get_user_name( id, name, charsmax( name ) ) 
    
    static query[ 256 ]
    if( g_loaded_data[ id ] )
    {
        formatex( query, sizeof( query ) - 1, "UPDATE Achievement SET name = ^"%s^", data = ^"%s^" WHERE authid = ^"%s^";", name, data, g_iAuthID[ id ] )
    }
    else
    {
        formatex( query, sizeof( query ) - 1, "INSERT INTO Achievement ( name, authid, data ) VALUES ( ^"%s^", ^"%s^", ^"%s^" );", name, g_iAuthID[ id ], data )
    }
    
    SQL_ThreadQuery( g_sql_tuple, "QuerySaveData", query )
    #else
    nvault_set( g_iVault, g_iAuthID[ id ], data )
    #endif
}

#if defined USING_SQL
public QuerySaveData( failstate, Handle:query, error[], errnum, data[], size, Float:queuetime )
{
    if( failstate == TQUERY_CONNECT_FAILED
    || failstate == TQUERY_QUERY_FAILED )
    {
        set_fail_state( error )
    }
}
#endif

		
	

CannibaL86

Пользователь
Регистрация
10 Июн 2017
Сообщения
157
Симпатии
58
Пол
Мужской
elf01,
Пробуй (ничего не менял - стандарт)
 

Вложения

elf01

Пользователь
Регистрация
24 Мар 2018
Сообщения
153
Симпатии
7
Пол
Мужской
elf01,
Пробуй (ничего не менял - стандарт)
А вы откомпилировали то, что я скинул? Или их с сайта. Я тут пару команд вызова, типо /help, закоментил. И кварам свои значения поставил.
Походу дело в компиляторе гадопакосном. Блин с офа качал же. Дома точ такой. На рабочем компе не компилет, а дома на ноуте нормально.
 

hooligan***

Пользователь
Регистрация
9 Июн 2017
Сообщения
377
Симпатии
105
Пол
Мужской
Расскажите пожалуйста поподробнее про плагин, какие у него возможности?
Неплохо было бы создать плагин достижений как в го, или этот оптимизировать в плане сократить библиотеки
 

elf01

Пользователь
Регистрация
24 Мар 2018
Сообщения
153
Симпатии
7
Пол
Мужской
elf01, убрать

Для компила на 1.8.3
Я вкурсе, но если убрать будут ошибки. По этому не трогал.[DOUBLEPOST=1528348265][/DOUBLEPOST]
Расскажите пожалуйста поподробнее про плагин, какие у него возможности?
Неплохо было бы создать плагин достижений как в го, или этот оптимизировать в плане сократить библиотеки
В посте есть ссылка, там прочтите
 
Сверху Снизу