#include < amxmodx >
#include < engine >
#include < cstrike >
#include < fun >
#include < fakemeta >
#include < hamsandwich >
 
#define MAX_BUTTONS 100
#define m_flWait 44
 
// Comment this line if you do not want to have fake player !
#define FAKE_PLAYER
 
// Bot name
#if defined FAKE_PLAYER
        new const g_szBotName[ ] = "www.facebook.com/smclan";
#endif
 
// Messages prefix
new const g_szPrefix[ ] = "[S][M] DR]";
 
// Global Variables
new bool:g_bHauntedHouse, bool:g_bGamerFun, bool:g_bRandromized, bool:g_bStarting, bool:g_bFirstRound;
new bool:g_bEnabled, bool:g_bRestart, bool:g_bConnected[ 33 ];
 
new g_pRemoveBuyZone, g_pHideHuds, g_pBlockMoney, g_pLifeSystem, g_pSvRestart, g_pAutoBalance, g_pLimitTeams;
new g_pNoFallDmg, g_pGameName, g_pToggle, g_pBlockSpray, g_pBlockRadio, g_pSemiclip, g_pGiveUsp, g_pBlockKill;
 
new g_iMsgHideWeapon, g_iMsgCrosshair, g_iMsgMoney, g_iMsgTeamInfo, g_iMsgSayText;
new g_iMaxplayers, g_iHudSync, g_iHudSync2, g_iLastTerr, g_iThinker;
new g_iSemiClip[ 33 ], g_Lifes[ 33 ];
 
#if defined FAKE_PLAYER
        new g_iFakeplayer;
#endif
 
// Macros
#if cellbits == 32
        #define OFFSET_BZ 235
#else
        #define OFFSET_BZ 268
#endif
 
// Colorchat
enum Color {
        NORMAL = 1,
        GREEN,
        RED,
        BLUE
};
 
new TeamName[ ][ ] = {
        "",
        "TERRORIST",
        "CT",
        "SPECTATOR"
};
 
new giPointer=0;
 
new gEnt[MAX_BUTTONS];
new gUsed[MAX_BUTTONS];
new gOnStart[MAX_BUTTONS];
 
new Float:gDelay[MAX_BUTTONS];
new Float:gDefaultDelay[MAX_BUTTONS];
 
new bool:gbFreeRun=false;
 
//Retry
#define MAX_PLAYERS 32
new madmin // Menu
new mcbadmin // Menu Callback
 
new pID[MAX_PLAYERS][22];
 
// =======================================================================================
 
public plugin_init( ) {
        set_task(300.0, "hirdetes");
        new const VERSION[ ] = "3.0.3";
        
        register_plugin( "Deathrun Manager", VERSION, "xPaw" );
        
        g_pToggle        = register_cvar( "deathrun_toggle",     "1" );
        g_pBlockSpray    = register_cvar( "deathrun_spray",      "1" );
        g_pBlockRadio    = register_cvar( "deathrun_radio",      "1" );
        g_pBlockKill     = register_cvar( "deathrun_blockkill",  "1" );
        g_pBlockMoney    = register_cvar( "deathrun_blockmoney", "1" );
        g_pSemiclip      = register_cvar( "deathrun_semiclip",   "1" );
        g_pGiveUsp       = register_cvar( "deathrun_giveusp",    "1" );
        g_pHideHuds      = register_cvar( "deathrun_hidehud",    "1" );
        g_pLifeSystem    = register_cvar( "deathrun_lifesystem", "1" );
        g_pGameName      = register_cvar( "deathrun_gamename",   "0" );
        g_pNoFallDmg     = register_cvar( "deathrun_terrnfd",    "1" );
        g_pRemoveBuyZone = register_cvar( "deathrun_removebz",   "1" );
        
        // Lets get map name...
        new szMapName[ 64 ];
        get_mapname( szMapName, 63 );
        
        if( contain( szMapName, "deathrun_" ) != -1 || contain( szMapName, "dr_" ) != -1) {
                set_pcvar_num( g_pToggle, 1 );
                
                if( contain( szMapName, "hauntedhouse" ) != -1 )
                        g_bHauntedHouse = true;
                else {
                        g_bHauntedHouse = false;
                        
                        if( equal( szMapName, "deathrun_gamerfun" ) )
                                g_bGamerFun = true;
                        else
                                g_bGamerFun = false;
                }
        } else
                set_pcvar_num( g_pToggle, 0 );
        
        g_pSvRestart   = get_cvar_pointer( "sv_restart" );
        g_pAutoBalance = get_cvar_pointer( "mp_autoteambalance" );
        g_pLimitTeams  = get_cvar_pointer( "mp_limitteams" );
        
        register_cvar( "deathrun_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY );
        set_cvar_string( "deathrun_version", VERSION );
        
        // Registering Language file
        register_dictionary( "deathrun.txt" );
        
        // Logging Events
        register_logevent( "EventRoundStart", 2, "1=Round_Start" );
        register_logevent( "EventRandromize", 2, "1=Round_End" );
        register_event( "SendAudio", "EventTerrsWin",   "a", "2&%!MRAD_terwin" );
        register_event( "TextMsg",       "EventRandromize", "a", "2&#Game_w" );
        register_event( "DeathMsg",      "EventDeath",      "a");
        register_event( "Money",         "EventMoney",      "b" );
        register_event( "ResetHUD",      "EventResetHud",   "be" );
        
        //Free
        register_clcmd("say /free", "free");
        register_logevent("end",2,"1=Round_End");
        if( engfunc(EngFunc_FindEntityByString,-1 ,"classname", "func_button"))
                RegisterHam(Ham_Use, "func_button", "fwButtonUsed");
        
        if(engfunc(EngFunc_FindEntityByString,-1 ,"classname","func_rot_button"))
                RegisterHam(Ham_Use, "func_rot_button", "fwButtonUsed");
                
        if(engfunc(EngFunc_FindEntityByString,-1 ,"classname", "button_target"))
                RegisterHam(Ham_Use, "button_target", "fwButtonUsed");
                
        register_logevent( "ResetButtons", 2, "0=World triggered", "1=Round_Start");
            
        fillButtons("func_button");
        fillButtons("func_rot_button");
        fillButtons("button_target");
        register_event( "CurWeapon", "fegyvervaltas", "be", "1=1", "2!29" );
        
        //Retry
        register_cvar("amx_retrytime","10");
        register_cvar("amx_retrykick","0");
        register_cvar("amx_retryshow","1");
        register_cvar("amx_retrychat","1");
        
        // %s is the player name, %t is amx_retrytime
        register_cvar("amx_retrymsg","[S][M] DR] Nincs reconnect a szerveren, %s");
        register_cvar("amx_retrykickmsg","[S][M] DR] A gyors reconnect nem megengedett");
        register_cvar("amx_retrychatmsg","[S][M] DR] | %s kickelve, mivel ujracsatlakozott %t masodpercen belul");
        
        //menu
        register_clcmd("chooseteam", "menu_megnyit")
        register_clcmd("jointeam", "menu_megnyit")
        
        g_bFirstRound    = true;
        g_iMaxplayers    = get_maxplayers( );
        g_iMsgHideWeapon = get_user_msgid( "HideWeapon" );
        g_iMsgCrosshair  = get_user_msgid( "Crosshair" );
        g_iMsgMoney      = get_user_msgid( "Money" );
        g_iMsgSayText    = get_user_msgid( "SayText" );
        g_iMsgTeamInfo   = get_user_msgid( "TeamInfo" );
        
        g_iHudSync       = CreateHudSyncObj( );
        g_iHudSync2      = CreateHudSyncObj( );
        
        if( get_pcvar_num( g_pToggle ) ) {
                RegisterHam( Ham_TakeDamage, "player", "FwdHamPlayerDamage" );
                RegisterHam( Ham_Spawn,      "player", "FwdHamPlayerSpawn", 1 );
                register_forward( FM_ClientKill,       "FwdClientKill" );
                register_impulse( 201, "FwdImpulse_201" );
                
                if( get_pcvar_num( g_pGameName ) )
                        register_forward( FM_GetGameDescription, "FwdGameDesc" );
                
                register_clcmd( "say /lifes", "CmdShowlifes" );
                register_clcmd( "say /lives", "CmdShowlifes" );
                
                register_clcmd( "radio1", "CmdRadio" );
                register_clcmd( "radio2", "CmdRadio" );
                /* Menu admin */
                /* Use menu_display(id, madmin, 0) to show the menu to an user. */
                madmin = menu_create("admin", "mh_admin")
                mcbadmin = menu_makecallback("mcb_admin")
                menu_additem(madmin, "deathrunmanager", "ma_admin", ADMIN_ALL, mcbadmin)
                /* Menu End */
 
                register_clcmd( "radio3", "CmdRadio" );
                
                // Terrorist Check
                g_iThinker= create_entity( "info_target" );
                
                if( is_valid_ent( g_iThinker ) ) {
                        entity_set_string( g_iThinker, EV_SZ_classname, "DeathrunThinker" );
                        entity_set_float( g_iThinker, EV_FL_nextthink, get_gametime( ) + 20.0 );
                        
                        g_bRestart = true;
                        
                        // First think will happen in 20.0, Restart will be done there.
                        
                        register_think( "DeathrunThinker", "FwdThinker" );
                } else {
                        set_task( 15.0, "CheckTerrorists", _, _, _, "b" );
                        
                        // Lets make restart after 20 seconds from map start.
                        set_task( 20.0, "RestartRound" );
                }
                
                if( get_pcvar_num( g_pRemoveBuyZone ) ) {
                        register_message( get_user_msgid( "StatusIcon" ), "MsgStatusIcon" ); // BuyZone Icon
                        
                        // Remove buyzone on map
                        remove_entity_name( "info_map_parameters" );
                        remove_entity_name( "func_buyzone" );
                        
                        // Create own entity to block buying
                        new iEntity = create_entity( "info_map_parameters" );
                        
                        DispatchKeyValue( iEntity, "buying", "3" );
                        DispatchSpawn( iEntity );
                }
                
                if( get_pcvar_num( g_pSemiclip ) ) {
                        register_forward( FM_StartFrame,        "FwdStartFrame", 0 );
                        register_forward( FM_AddToFullPack,     "FwdFullPack",   1 );
                }
                
                g_bEnabled = true;
                
        #if defined FAKE_PLAYER
                new iEntity, iCount;
                
                while( ( iEntity = find_ent_by_class( iEntity, "info_player_deathmatch" ) ) > 0 )
                        if( iCount++ > 1 )
                                break;
                
                if( iCount <= 1 )
                        g_iFakeplayer = -1;
                
                set_task( 5.0, "UpdateBot" );
                
                register_message( get_user_msgid( "DeathMsg" ), "MsgDeathMsg" );
        #endif
        } else
                g_bEnabled = false;
}
 
// FAKEPLAYER
///////////////////////////////////////////
#if defined FAKE_PLAYER
        public UpdateBot( ) {
                if( g_iFakeplayer == -1 )
                        return;
                
                new id = find_player( "i" );
                
                if( !id ) {
                        id = engfunc( EngFunc_CreateFakeClient, g_szBotName );
                        if( pev_valid( id ) ) {
                                engfunc( EngFunc_FreeEntPrivateData, id );
                                dllfunc( MetaFunc_CallGameEntity, "player", id );
                                set_user_info( id, "rate", "3500" );
                                set_user_info( id, "cl_updaterate", "25" );
                                set_user_info( id, "cl_lw", "1" );
                                set_user_info( id, "cl_lc", "1" );
                                set_user_info( id, "cl_dlmax", "128" );
                                set_user_info( id, "cl_righthand", "1" );
                                set_user_info( id, "_vgui_menus", "0" );
                                set_user_info( id, "_ah", "0" );
                                set_user_info( id, "dm", "0" );
                                set_user_info( id, "tracker", "0" );
                                set_user_info( id, "friends", "0" );
                                set_user_info( id, "*bot", "1" );
                                set_pev( id, pev_flags, pev( id, pev_flags ) | FL_FAKECLIENT );
                                set_pev( id, pev_colormap, id );
                                
                                new szMsg[ 128 ];
                                dllfunc( DLLFunc_ClientConnect, id, g_szBotName, "127.0.0.1", szMsg );
                                dllfunc( DLLFunc_ClientPutInServer, id );
                                
                                cs_set_user_team( id, CS_TEAM_T );
                                ExecuteHamB( Ham_CS_RoundRespawn, id );
                                
                                set_pev( id, pev_effects, pev( id, pev_effects ) | EF_NODRAW );
                                set_pev( id, pev_solid, SOLID_NOT );
                                dllfunc( DLLFunc_Think, id );
                                
                                g_iFakeplayer = id;
                        }
                }
        }
        
        public MsgDeathMsg( const iMsgId, const iMsgDest, const id ) {
                if( get_msg_arg_int( 2 ) == g_iFakeplayer )
                        return PLUGIN_HANDLED;
                
                return PLUGIN_CONTINUE;
        }
#endif
//Menü
public menu_megnyit(id)
{
    new menu = menu_create("Melyik csapatba akarsz allni?", "menu_handler");
    menu_additem(menu, "Counter Terrorist", "1", 0);
    menu_additem(menu, "Spectator", "2", 0);
    menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
    menu_display(id, menu, 0);
}
public menu_handler(id, menu, item)
{
    if( item == MENU_EXIT )
    {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }
 
    new data[6], szName[64];
    new access, callback;
    menu_item_getinfo(menu, item, access, data,charsmax(data), szName,charsmax(szName), callback);
 
    new key = str_to_num(data);
    switch(key)
    {
        case 1:
        {
            user_silentkill(id)
            cs_set_user_team(id, CS_TEAM_CT)
            
        }
        case 2:
        {
            user_silentkill(id)
            cs_set_user_team(id, CS_TEAM_SPECTATOR)
        }
    }
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}
 
//Hirdetés
public hirdetes()
{
        ColorChat(0, GREEN, "^x03[S][M] DR] ^x01 A Szerveren [S][M] DR MOD 1.2.2 fut. keszitette: ^x04.Valaki");
}
 
//Free
public fegyvervaltas(id)
    if(gbFreeRun)
        freeweapon(id);
    
freeweapon(id)
    engclient_cmd( id, "weapon_knife" );
public free()
        nincsgomb();
        
public end() {
    alapgombok();
}
public plugin_cfg() {
    alapgombok();
}
public fwButtonUsed(this, idcaller, idactivator, use_type, Float:value){
    if(idcaller!=idactivator) return HAM_IGNORED;
    
    if(pev(this, pev_frame) > 0.0)
         return HAM_IGNORED;
    new index=get_ent_index(this);
    if(index==-1) 
        return HAM_IGNORED;
    if(get_user_team(idcaller)&1){
        
        if(gbFreeRun){
            ColorChat(idcaller,GREEN, "[S][M] DR]^x01 Freerun van - Nem nyomhatsz gombokat!");
            return HAM_SUPERCEDE;
        }
        else if(gUsed[index]<=0 && gOnStart[index]!=-1){
            set_hudmessage(0, 255, 255, 0.3, 0.2, 0, 6.0, 12.0);
            show_hudmessage(idcaller, "Egy gombot csak^negyszer hasznalhatsz!");
            return HAM_SUPERCEDE;
        }
        else{
            if(gUsed[index]>0)
                if(--gUsed[index]){
                    ColorChat(idcaller, GREEN, "[S][M] DR]^x01 Ezt a csapdat meg hasznalhatod!");
                }else
                    ColorChat(idcaller, GREEN, "[S][M] DR]^x01 Ezt a csapdat mar nem hasznalhatod tobbszor!");
        }
    }
    
    set_task(0.1,"setDelay",this);
    
    return HAM_IGNORED;
}
public setDelay(this){
    new index=get_ent_index(this);
    set_pev(this, pev_nextthink, pev(this, pev_ltime)+gDelay[index]+0.01);
}
 
public ResetButtons(){
    gbFreeRun=false;
    for(new i=0;i<MAX_BUTTONS;i++){
        gUsed[i]=gOnStart[i];
        restoreButton(gEnt[i]);
    }
}
 
alapgombok(){
    new iDef= 1;
    for(new i=0;i<giPointer;i++){
        gUsed[i]=iDef;
        gOnStart[i]=iDef;
        gDelay[i]=get_pdata_float(gEnt[i],m_flWait);
        gDefaultDelay[i]=gDelay[i];
    }
}
 
nincsgomb(bool:bFR=true){
    gbFreeRun=bFR;
 
 
    if(gbFreeRun){
        ColorChat(0, GREEN, "[S][M] DR] ^3FREE ^1VAN ! ^1FREE ^3VAN ! ^4FREE ^1VAN !");
        ColorChat(0, GREEN, "[S][M] DR] ^1FREE ^3VAN ! ^3FREE ^4VAN ! ^3FREE ^4VAN !");
        ColorChat(0, GREEN, "[S][M] DR] ^3FREE ^4VAN ! ^3FREE ^1VAN ! ^1FREE ^3VAN !");
    }
    
}
 
fillButtons(const szClass[]){
    new ent = -1;
    while((ent = engfunc(EngFunc_FindEntityByString,ent ,"classname", szClass)) != 0){
        gEnt[giPointer++]=ent;
        set_pev(ent, pev_iuser4, giPointer);
    }
}
 
restoreButton(ent){
    if(pev(ent, pev_frame) > 0.0){
        new Float:Life;
        pev(ent, pev_nextthink, Life);
        set_pev(ent, pev_ltime, Life-0.01);
    }
}
 
get_ent_index(ent){
    return pev(ent, pev_iuser4)-1;
}  
// NEW TERRORIST
///////////////////////////////////////////
public EventRandromize( ) {
        if( !g_bEnabled || g_bFirstRound || g_bRandromized )
                return PLUGIN_CONTINUE;
        
        g_bRandromized = true;
        
        new i, iPlayers[ 32 ], iNum, iPlayer;
        get_players( iPlayers, iNum, "c" );
        
        if( iNum <= 1 )
                return PLUGIN_CONTINUE;
        
        for( i = 0; i < iNum; i++ ) {
                iPlayer = iPlayers[ i ];
                
                if( cs_get_user_team( iPlayer ) == CS_TEAM_T )
                        cs_set_user_team( iPlayer, CS_TEAM_CT );
        }
        
        new iRandomPlayer, CsTeams:iTeam;
        
        while( ( iRandomPlayer = iPlayers[ random_num( 0, iNum - 1 ) ] ) == g_iLastTerr ) { }
        
        g_iLastTerr = iRandomPlayer;
        
        iTeam = cs_get_user_team( iRandomPlayer );
        
        if( iTeam == CS_TEAM_T || iTeam == CS_TEAM_CT ) {
                cs_set_user_team(iRandomPlayer, CS_TEAM_T);
                
                new szName[ 32 ];
                get_user_name( iRandomPlayer, szName, 31 );
                
                for( i = 0; i < iNum; i++ )
                        ColorChat(iPlayers[ i ], RED, "%s^4 %L", g_szPrefix, iPlayers[ i ], "DR_NOW_TERR", szName);
                
                if( !g_bRestart && is_valid_ent( g_iThinker ) )
                        entity_set_float( g_iThinker, EV_FL_nextthink, get_gametime( ) + 15.0 );
        } else {
                g_bRandromized = false;
                EventRandromize( );
        }
        
        return PLUGIN_CONTINUE;
}
 
// NEW ROUND
///////////////////////////////////////////
public EventRoundStart( ) {
        if( !g_bEnabled )
                return PLUGIN_CONTINUE;
        
        g_bRandromized  = false;
        g_bStarting     = false;
        
        new i, iPlayers[ 32 ], iNum, iRealPlayers, CsTeams:iTeam;
        get_players( iPlayers, iNum, "c" );
        
        if( iNum <= 1 )
                return PLUGIN_CONTINUE;
        
        for( i = 0; i < iNum; i++ ) {
                iTeam = cs_get_user_team( iPlayers[ i ] );
                
                if( iTeam == CS_TEAM_T || iTeam == CS_TEAM_CT )
                        iRealPlayers++;
        }
        
        if( iRealPlayers <= 1 ) {
                set_hudmessage( 0, 255, 255, -1.0, 0.1, 0, 4.0, 4.0, 0.5, 0.5, 4 );
                
                for( i = 0; i < iNum; i++ )
                        ShowSyncHudMsg( iPlayers[ i ], g_iHudSync, "%L", iPlayers[ i ], "DR_NOT_ENOUGH" );
                
                return PLUGIN_CONTINUE;
        }
        
        set_pcvar_num( g_pAutoBalance, 0 );
        set_pcvar_num( g_pLimitTeams, 0 );
        
        if( g_bFirstRound ) {
                set_hudmessage( 0, 255, 255, -1.0, 0.1, 0, 4.0, 4.0, 0.5, 0.5, 4 );
                
                for( i = 0; i < iNum; i++ ) {
                        ShowSyncHudMsg( iPlayers[ i ], g_iHudSync, "%L", iPlayers[ i ], "DR_STARTING" );
                        set_hudmessage(0, 255, 255, 0.3, 0.2, 0, 6.0, 12.0);
                        show_hudmessage(iPlayers[ i ], "")
                        ColorChat( iPlayers[ i ], RED, "%s^1 %L", g_szPrefix, iPlayers[ i ], "DR_STARTING_CC" );
                }
                
                if( is_valid_ent( g_iThinker ) ) {
                        g_bRestart = true;
                        
                        entity_set_float( g_iThinker, EV_FL_nextthink, get_gametime( ) + 19.0 );
                } else
                        set_task( 19.0, "RestartRound" );
                
                g_bStarting = true;
                g_bFirstRound = false;
        }
        
        return PLUGIN_CONTINUE;
}
 
// CHECK TERRORIST
///////////////////////////////////////////
public FwdThinker( iEntity ) {
        if( g_bRestart ) {
                g_bRestart = false;
                
                RestartRound( );
        } else
                CheckTerrorists( );
        
        entity_set_float( iEntity, EV_FL_nextthink, get_gametime( ) + 15.0 );
}
 
public CheckTerrorists( ) {
        if( !g_bEnabled || g_bFirstRound || g_bStarting )
                return PLUGIN_CONTINUE;
        
        new i, iPlayers[ 32 ], iTerrors, iNum, iRealPlayers, CsTeams:iTeam;
        get_players( iPlayers, iNum, "c" );
        
        if( iNum <= 1 )
                return PLUGIN_CONTINUE;
        
        for( i = 0; i < iNum; i++ ) {
                iTeam = cs_get_user_team( iPlayers[ i ] );
                
                if( iTeam == CS_TEAM_T )
                        iTerrors++;
                
                if( iTeam == CS_TEAM_T || iTeam == CS_TEAM_CT )
                        iRealPlayers++;
        }
        
        if( iRealPlayers <= 1 ) {
                set_hudmessage( 0, 255, 255, -1.0, 0.1, 0, 4.0, 4.0, 0.5, 0.5, 4 );
                
                for( i = 0; i < iNum; i++ )
                        ShowSyncHudMsg( iPlayers[ i ], g_iHudSync, "%L", iPlayers[ i ], "DR_NOT_ENOUGH" );
                
                return PLUGIN_CONTINUE;
        }
        
        if( iTerrors == 0 ) {
                for( i = 0; i < iNum; i++ ) {
                        ColorChat(iPlayers[ i ], RED, "%s^1 %L", g_szPrefix, iPlayers[ i ], "DR_NO_DETECT");
                        
                        if( is_user_alive( iPlayers[ i ] ) && cs_get_user_team( iPlayers[ i ] ) == CS_TEAM_CT )
                                user_silentkill( iPlayers[ i ] );
                }
                
                set_task( 0.5, "EventRandromize" );
        }
        
        return PLUGIN_CONTINUE;
}
 
// LIFE SYSTEM
///////////////////////////////////////////
public EventTerrsWin( ) {
        if( !g_bEnabled || g_bFirstRound )
                return PLUGIN_CONTINUE;
        
        new iPlayers[ 32 ], iNum, iPlayer;
        get_players( iPlayers, iNum, "c" );
        
        if( iNum <= 1 )
                return PLUGIN_CONTINUE;
        
        new iLifeCvar = get_pcvar_num( g_pLifeSystem );
        
        for( new i = 0; i < iNum; i++ ) {
                iPlayer = iPlayers[ i ];
                
                if( cs_get_user_team( iPlayer ) == CS_TEAM_T ) {
                        set_user_frags( iPlayer, get_user_frags( iPlayer ) + 3 );
                        
                        if( iLifeCvar == 2 )
                                g_Lifes[ iPlayer ]++;
                }
        }
        
        return PLUGIN_CONTINUE;
}
 
public EventDeath( ) {
        if( !g_bEnabled )
                return PLUGIN_CONTINUE;
        
#if defined FAKE_PLAYER
        new iVictim = read_data( 2 );
        new iTeam = get_user_team( iVictim );
        
        if( iTeam == 1 && is_user_alive( g_iFakeplayer ) )
                fakedamage( g_iFakeplayer, "worldspawn", 100.0, DMG_GENERIC );
        
        if( !get_pcvar_num( g_pLifeSystem ) )
                return PLUGIN_CONTINUE;
#else
        if( !get_pcvar_num( g_pLifeSystem ) )
                return PLUGIN_CONTINUE;
        
        new iVictim = read_data( 2 );
        new iTeam = get_user_team( iVictim );
#endif
        
        new iKiller = read_data( 1 );
        
        if( iKiller != iVictim && get_user_team(iKiller) != iTeam )
                g_Lifes[iKiller]++;
        
        if( cs_get_user_team( iVictim ) == CS_TEAM_CT && g_Lifes[ iVictim ] > 0 ) {
                new iCTcount;
                for( new i = 1; i <= g_iMaxplayers; i++ ) {
                        if( is_user_alive( i ) && cs_get_user_team( i ) == CS_TEAM_CT )
                                iCTcount++;
                }
                
                if( iCTcount > 1 ) {
                        set_task(3.2, "fnRevivePlayer", iVictim);
                        
                        ColorChat( iVictim, RED, "%s^1 %L", g_szPrefix, iVictim, "DR_LIFE_RESPAWN" );
                }
                /*else
                        ColorChat( iVictim, RED, "%s^1 %L", g_szPrefix, iVictim, "DR_LIFE_CANT" );*/
        }
        
        return PLUGIN_CONTINUE;
}
 
public fnRevivePlayer( id ) {
        if( g_bConnected[ id ] ) {
                if( cs_get_user_team( id ) == CS_TEAM_CT ) {
                        new iCTcount;
                        for( new i = 1; i <= g_iMaxplayers; i++ )
                                if( is_user_alive( i ) && cs_get_user_team( i ) == CS_TEAM_CT )
                                        iCTcount++;
                        
                        if( iCTcount > 1 ) {
                                ExecuteHamB( Ham_CS_RoundRespawn, id );
                                
                                g_Lifes[ id ]--;
                        }
                }
        }
}
 
public CmdShowlifes( id ) {
        if( get_pcvar_num( g_pLifeSystem ) == 0 ) {
                ColorChat( id, RED, "%s^1 %L", g_szPrefix, id, "DR_LIFE_DISABLE" );
                return PLUGIN_HANDLED;
        }
        
        if( g_Lifes[ id ] > 0 )
                ColorChat( id, RED, "%s^1 %L", g_szPrefix, id, "DR_LIFE_CC_COUNT", g_Lifes[ id ] );
        else
                ColorChat( id, RED, "%s^1 %L", g_szPrefix, id, "DR_LIFE_CC_NO" );
        
        return PLUGIN_HANDLED;
}
 
public Showlifes( id ) {
        set_hudmessage( 0, 255, 255, 0.04, 0.71, 0, 2.5, 2.5, 0.5, 0.5, 3 );
        
        if( g_Lifes[ id ] > 0 )
                ShowSyncHudMsg( id, g_iHudSync2, "%L", id, "DR_LIFE_COUNT", g_Lifes[ id ] );
        else
                ShowSyncHudMsg( id, g_iHudSync2, "%L", id, "DR_LIFE_NO" );
}
 
// EVENTS
///////////////////////////////////////////
public EventResetHud( id ) {
        if( g_bEnabled && get_pcvar_num( g_pHideHuds ) && !is_user_bot( id ) ) {
                message_begin( MSG_ONE_UNRELIABLE, g_iMsgHideWeapon, _, id );
                write_byte( ( 1<<4 | 1<<5 ) );
                message_end( );
                
                message_begin( MSG_ONE_UNRELIABLE, g_iMsgCrosshair, _, id );
                write_byte( 0 );
                message_end( );
        }
}
 
public EventMoney( id ) {
        if( g_bEnabled && get_pcvar_num( g_pBlockMoney ) ) {
                set_pdata_int( id, 115, 0 );
                
                message_begin( MSG_ONE_UNRELIABLE, g_iMsgMoney, _, id );
                write_long ( 0 );
                write_byte ( 1 );
                message_end( );
        }
}
 
public client_putinserver( id )
{
        g_bConnected[ id ] = true;
        if ((is_user_bot(id)) || (get_user_flags(id)&ADMIN_IMMUNITY)) {
                return PLUGIN_HANDLED;
        }
        cs_set_user_team(id, CS_TEAM_CT)
        
        // gather info
        new ip[22];
        get_user_ip(id,ip,21);
        
        for(new i = 1; i < MAX_PLAYERS; i++) {
                if (equal(ip, pID[i], 21)) {
                        
                        new name[34];
                        get_user_name(id, name, 33);
                        
                        if (get_cvar_num("amx_retryshow")) {
                                new uID[1];
                                uID[0] = id;
                                set_task(2.0,"showMsg", id, uID, 1);
                        }
                        
                        if (get_cvar_num("amx_retrychat")) {
                                new txt[128]
                                get_cvar_string("amx_retrychatmsg", txt, 127)
                                new sec[6]
                                num_to_str(get_cvar_num("amx_retrytime"),sec, 5)
                                
                                replace(txt, 127, "%s", name)
                                replace(txt, 127, "%t", sec)
                                
                                client_print( 0, print_chat, "[AMXX] %s", txt)
                        }
                                                
                        if (get_cvar_num("amx_retrykick")) {
                                new uID[1]
                                uID[0] = get_user_userid(id)
                                                                
                                // delayed kick
                                set_task(7.0,"kick",77,uID,1)
                                
                        }
                        
                        break
                }
        }
        
        return PLUGIN_HANDLED;
}
 
public client_disconnect( id ) {
        g_bConnected[ id ] = false;
        CheckTerrorists( );
        
        if( !g_bRestart && is_valid_ent( g_iThinker ) )
                entity_set_float( g_iThinker, EV_FL_nextthink, get_gametime( ) + 15.0 );
        
#if defined FAKE_PLAYER
        if( g_iFakeplayer == id ) {
                set_task( 1.5, "UpdateBot" );
                
                g_iFakeplayer = 0;
        }
#endif
        if ((is_user_bot(id)) || (get_user_flags(id)&ADMIN_IMMUNITY)) {
        return PLUGIN_HANDLED; }
 
        // gather info
        new ip[22]
        get_user_ip(id,ip,21)
        new found = 0;
        
        for(new i = 1; i < MAX_PLAYERS; i++) {
                if (equal(ip, pID[i], 21)) {
                        // this user has been already kicked
                        found = 1
                        break
                }
        }
        
        if (found == 0) {
                for(new i = 1; i < MAX_PLAYERS; i++) {
                        if (pID[i][0] == 0) {   // found empty slot
                                get_user_ip(id, pID[i], 21)
                                new aID[1]
                                aID[0] = i
                                set_task( get_cvar_float("amx_retrytime"), "cleanID", (id + MAX_PLAYERS),aID,1)
                                                
                                break
                        }
                }
        }
        return PLUGIN_HANDLED;
}
public cleanID(i[]) {
        pID[i[0]][0] = 0
}
 
public showMsg(pID[]) {
        new txt[128]
        get_cvar_string("amx_retrymsg", txt, 127)
        
        new playername[34]
        get_user_name(pID[0], playername, 33)
        
        new sec[6]
        num_to_str(get_cvar_num("amx_retrytime"),sec, 5)
        
        replace(txt, 127, "%s", playername)
        replace(txt, 127, "%t", sec)
        
        set_hudmessage(255, 255, 255, 0.05, 0.72, 0, 5.0, 10.0, 2.0, 0.15, 3)
        show_hudmessage(pID[0],txt)
}
 
public kick(id[]) {
        new txt[128]
        get_cvar_string("amx_retrykickmsg", txt, 127)
        server_cmd("kick #%d ^"%s^"", id[0], txt)
}
 
 
// SEMICLIP
///////////////////////////////////////////
public FwdFullPack( es, e, ent, host, flags, player, pSet ) {
        if( !g_bEnabled )
                return FMRES_IGNORED;
        
        if( player && g_iSemiClip[ ent ] && g_iSemiClip[ host ] ) {
                set_es( es, ES_Solid, SOLID_NOT );
                set_es( es, ES_RenderMode, kRenderTransAlpha );
                set_es( es, ES_RenderAmt, 85 );
        }
        
        return FMRES_IGNORED;
}
 
public FwdStartFrame( ) {
        if( !g_bEnabled )
                return FMRES_IGNORED;
        
        static iPlayers[ 32 ], iNum, iPlayer, iPlayer2, i, j;
        get_players( iPlayers, iNum, "ache", "CT" );
        
        arrayset( g_iSemiClip, 0, 32 );
        
        if( iNum <= 1 )
                return FMRES_IGNORED;
        
        for( i = 0; i < iNum; i++ ) {
                iPlayer = iPlayers[ i ];
                
                for( j = 0; j < iNum; j++ ) {
                        iPlayer2 = iPlayers[ j ];
                        
                        if( iPlayer == iPlayer2 )
                                continue;
                        
                        if( g_iSemiClip[ iPlayer ] && g_iSemiClip[ iPlayer2 ] )
                                continue;
                        
                        if( entity_range( iPlayer, iPlayer2 ) < 128 ) {
                                g_iSemiClip[ iPlayer ]  = true;
                                g_iSemiClip[ iPlayer2 ] = true;
                        }
                }
        }
        
        for( i = 0; i < iNum; i++ ) {
                iPlayer = iPlayers[ i ];
                
                set_pev( iPlayer, pev_solid, g_iSemiClip[ iPlayer ] ? SOLID_NOT : SOLID_SLIDEBOX );
        }
        
        return FMRES_IGNORED;
}
 
// FORWARDS
///////////////////////////////////////////
public FwdHamPlayerSpawn( id ) {
        if( !g_bEnabled || !is_user_alive( id ) )
                return HAM_IGNORED;
        
        if( get_pcvar_num( g_pBlockRadio ) ) // thanks to ConnorMcLeod for this good way :)
                set_pdata_int( id, 192, 0 );
        
#if defined FAKE_PLAYER
        if( g_iFakeplayer == id ) {
                set_pev( id, pev_frags, -1000.0 );
                cs_set_user_deaths( id, -1000 );
                
                set_pev( id, pev_effects, pev( id, pev_effects ) | EF_NODRAW );
                set_pev( id, pev_solid, SOLID_NOT );
                entity_set_origin( id, Float:{ 999999.0, 999999.0, 999999.0 } );
                dllfunc( DLLFunc_Think, id );
        } else {
#endif
                new CsTeams:iTeam = cs_get_user_team( id );
                
                // An small delay for message
                if( get_pcvar_num( g_pLifeSystem ) != 0 && iTeam == CS_TEAM_CT )
                        set_task( 0.8, "Showlifes", id );
                
                strip_user_weapons( id );
                give_item( id, "weapon_knife" );
                
                set_pdata_int( id, 116, 0 ); // Pickup fix by ConnorMcLeod
                
                if( g_bGamerFun && iTeam == CS_TEAM_CT )
                        give_item( id, "weapon_smokegrenade" );
                
                if( get_pcvar_num( g_pGiveUsp ) && iTeam == CS_TEAM_CT && !g_bHauntedHouse )
                        set_task( 1.0, "GiveUsp", id );
 
#if defined FAKE_PLAYER
        }
#endif
        
        return HAM_IGNORED;
}
 
public GiveUsp( const id ) {
        if( is_user_alive( id ) ) {
                give_item( id, "weapon_usp" );
                cs_set_user_bpammo( id, CSW_USP, 100 );
        }
}
 
public FwdGameDesc( ) {
        static const GameName[ ] = "[S][M] EASY DR";
        
        forward_return( FMV_STRING, GameName );
        
        return FMRES_SUPERCEDE;
}
 
public FwdClientKill( const id ) {
        if( !g_bEnabled || !is_user_alive(id) )
                return FMRES_IGNORED;
        
        if( get_pcvar_num( g_pBlockKill ) || cs_get_user_team( id ) == CS_TEAM_T ) {
                client_print( id, print_center, "%L", id, "DR_BLOCK_KILL" );
                client_print( id, print_console, "%L", id, "DR_BLOCK_KILL" );
                
                return FMRES_SUPERCEDE;
        }
        
        return FMRES_IGNORED;
}
 
public FwdImpulse_201( const id ) {
        if( g_bEnabled && get_pcvar_num( g_pBlockSpray ) ) {
                if( is_user_alive( id ) )
                        client_print( id, print_center, "%L", id, "DR_BLOCK_SPRAY" );
                
                return PLUGIN_HANDLED_MAIN;
        }
        
        return PLUGIN_CONTINUE;
}
 
public FwdHamPlayerDamage( id, idInflictor, idAttacker, Float:flDamage, iDamageBits ) {
        if( get_pcvar_num( g_pNoFallDmg ) )
                if( iDamageBits & DMG_FALL )
                        if( get_user_team( id ) == 1 )
                                return HAM_SUPERCEDE;
        
        return HAM_IGNORED;
}
 
public MsgStatusIcon( msg_id, msg_dest, id ) {
        new szIcon[ 8 ];
        get_msg_arg_string( 2, szIcon, 7 );
        
        static const BuyZone[ ] = "buyzone";
        
        if( equal( szIcon, BuyZone ) ) {
                set_pdata_int( id, OFFSET_BZ, get_pdata_int( id, OFFSET_BZ, 5 ) & ~( 1 << 0 ), 5 );
                
                return PLUGIN_HANDLED;
        }
        
        return PLUGIN_CONTINUE;
}
 
public CmdRadio( id ) {
        if( get_pcvar_num( g_pBlockRadio ) )
                return PLUGIN_HANDLED_MAIN;
        
        return PLUGIN_CONTINUE;
}
 
public RestartRound( )
        set_pcvar_num( g_pSvRestart, 1 );
 
// COLORCHAT
/////////////////////////////////////////////
ColorChat( id, Color:type, const szMessage[], {Float,Sql,Result,_}:... ) {
        if( !get_playersnum( ) ) return;
        
        new message[ 256 ];
        
        switch( type ) {
                case NORMAL: message[0] = 0x01;
                case GREEN: message[0] = 0x04;
                default: message[0] = 0x03;
        }
        
        vformat( message[ 1 ], 251, szMessage, 4 );
        
        message[ 192 ] = '^0';
        
        replace_all( message, 191, "YEL", "^1" );
        replace_all( message, 191, "GRN", "^4" );
        replace_all( message, 191, "TEM", "^3" );
        
        new iTeam, ColorChange, index, MSG_Type;
        
        if( id ) {
                MSG_Type = MSG_ONE_UNRELIABLE;
                index = id;
        } else {
                index = CC_FindPlayer();
                MSG_Type = MSG_BROADCAST;
        }
        
        iTeam = get_user_team( index );
        ColorChange = CC_ColorSelection(index, MSG_Type, type);
 
        CC_ShowColorMessage(index, MSG_Type, message);
        
        if( ColorChange )
                CC_Team_Info(index, MSG_Type, TeamName[iTeam]);
}
 
CC_ShowColorMessage( id, type, message[] ) {
        message_begin( type, g_iMsgSayText, _, id );
        write_byte( id );       
        write_string( message );
        message_end( ); 
}
 
CC_Team_Info( id, type, team[] ) {
        message_begin( type, g_iMsgTeamInfo, _, id );
        write_byte( id );
        write_string( team );
        message_end( );
        
        return 1;
}
 
CC_ColorSelection( index, type, Color:Type ) {
        switch( Type ) {
                case RED: return CC_Team_Info( index, type, TeamName[ 1 ] );
                case BLUE: return CC_Team_Info( index, type, TeamName[ 2 ] );
        }
        
        return 0;
}
 
CC_FindPlayer( ) {
        for( new i = 1; i <= g_iMaxplayers; i++ )
                if( g_bConnected[ i ] )
                        return i;
        
        return -1;
}