Raised This Month: $ Target: $400
 0% 

[AYUDA] Base Builder


  
 
 
Thread Tools Display Modes
Author Message
lRodri.
Member
Join Date: Apr 2012
Location: Argentina
Old 12-28-2012 , 16:42   [AYUDA] Base Builder
#1

Bueno, en el basebuilder de Tirant quiero que el comando /lock (Para bloquear los bloques y que nadie mas los pueda usar exepto vos) lo usen los usuarios. Ya que por defecto, solo los adm lo pueden usar. Acá Tirant puso esto:

- Default Admin Powers -

To edit any of the following, open basebuilder65.sma and towards the very top, edit these definitions to ADMIN_ whatever you want. Once you are satisfied, simply recompile.

Code:
#define FLAGS_BUILD    ADMIN_KICK    //Build after build time
#define FLAGS_LOCK    ADMIN_LEVEL_A    //Lock/unlock blocks
#define FLAGS_BUILDBAN    ADMIN_KICK    //Ban players from building
#define FLAGS_SWAP    ADMIN_KICK    //Change a players team (correctly)
#define FLAGS_REVIVE    ADMIN_KICK    //Respawn a player (dead or alive)
#define FLAGS_GUNS    ADMIN_LEVEL_A    //Open guns menu for player
#define FLAGS_RELEASE    ADMIN_BAN    //Release zombies manually
#define FLAGS_OVERRIDE    ADMIN_BAN    //For admins of admins

This mod also features a custom log that logs all admin activities and object moves after the build phase to help track abuse.


Bueno, quiero saber como hacer para que el LOCK lo puedan usar los users. Que le tengo que modificar
lRodri. is offline
Send a message via MSN to lRodri.
StrikerV2
Senior Member
Join Date: Nov 2012
Location: Chile , O Yes!
Old 12-28-2012 , 16:44   Re: [AYUDA] Base Builder
#2

Quote:
Originally Posted by lRodri. View Post
Bueno, en el basebuilder de Tirant quiero que el comando /lock (Para bloquear los bloques y que nadie mas los pueda usar exepto vos) lo usen los usuarios. Ya que por defecto, solo los adm lo pueden usar. Acá Tirant puso esto:

- Default Admin Powers -

To edit any of the following, open basebuilder65.sma and towards the very top, edit these definitions to ADMIN_ whatever you want. Once you are satisfied, simply recompile.

Code:
#define FLAGS_BUILD    ADMIN_KICK    //Build after build time
#define FLAGS_LOCK    ADMIN_LEVEL_A    //Lock/unlock blocks
#define FLAGS_BUILDBAN    ADMIN_KICK    //Ban players from building
#define FLAGS_SWAP    ADMIN_KICK    //Change a players team (correctly)
#define FLAGS_REVIVE    ADMIN_KICK    //Respawn a player (dead or alive)
#define FLAGS_GUNS    ADMIN_LEVEL_A    //Open guns menu for player
#define FLAGS_RELEASE    ADMIN_BAN    //Release zombies manually
#define FLAGS_OVERRIDE    ADMIN_BAN    //For admins of admins

This mod also features a custom log that logs all admin activities and object moves after the build phase to help track abuse.


Bueno, quiero saber como hacer para que el LOCK lo puedan usar los users. Que le tengo que modificar

codigo completo?
__________________
Mi firma era tan sexy .-.
StrikerV2 is offline
Send a message via MSN to StrikerV2
lRodri.
Member
Join Date: Apr 2012
Location: Argentina
Old 12-28-2012 , 16:49   Re: [AYUDA] Base Builder
#3

Es el BB de Tirant. Acá te dejo:

PHP Code:
/*
Base Builder Zombie Mod
By: Tirant
*/

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

// Plugin Version
new VERSION[]="5.4"
new formatmodname[] = "^x01 [^x04 Base Builder^x01 ]"

//Models
new const g_ZombieModel[] = "classic2"

//Sounds
new g_RoundStart[] = "basebuilder/round_start.wav"

#define MAX_PLAYERS 32
#define AMMO_SLOT 376
#define MODELSET_TASK 100
#define MODELCHANGE_DELAY 0.5
#define MAXENTS 1365
#define TASK_ROUND 1023
#define AUTO_TEAM_JOIN_DELAY 0.1
#define TEAM_SELECT_VGUI_MENU_ID 2

#define AFTER_BUILD ADMIN_LEVEL_A
#define DEAD_BUILD ADMIN_LEVEL_B
#define REMOVE_BLOCK ADMIN_LEVEL_C
#define DEAD_REMOVE ADMIN_LEVEL_D
#define LOCK_BLOCKS ADMIN_KICK
#define PAIN_SHOCK_FREE ADMIN_KICK
#define BAD_SPAWN ADMIN_KICK
#define BUILD_BAN ADMIN_KICK
#define REVIVE ADMIN_KICK
#define SWAP ADMIN_KICK
#define START_ROUND ADMIN_BAN

#if cellbits == 32
    #define OFFSET_BUYZONE 235
#else
    #define OFFSET_BUYZONE 268
#endif

#define LockBlock(%1)     ( entity_set_int( %1, EV_INT_iuser1, 1 ) )
#define UnlockBlock(%1)   ( entity_set_int( %1, EV_INT_iuser1, 0 ) )
#define IsBlockLocked(%1) ( entity_get_int( %1, EV_INT_iuser1 ) == 1 )

// CS Weapon CBase Offsets (win32)
const OFFSET_WEAPONOWNER 41

// Linux diff's
const OFFSET_LINUX_WEAPONS 4

new gmsgStatusText
new gmsgSayText
new gHudSyncInfo
new g_MaxPlayers
const fPainShock 108

new bool:g_CanBuild
new bool:g_ZombiesReleased
new g_RoundNum
new g_iEntBarrier
new bool:g_BuildBan[MAX_PLAYERS+1]
new 
g_pEnt[MAX_PLAYERS+1], g_pDist[MAX_PLAYERS+1]
new 
bool:g_MovingEnt[MAXENTS]
new 
g_EntMover[MAXENTS]
new 
g_LastMover[MAXENTS]
new 
g_EntOwner[MAXENTS]
new 
g_OwnedEnts[33]

//Custom Model Stuff
new Float:g_ModelsTargetTimeFloat:g_RoundStartTime
new g_HasCustomModel[MAX_PLAYERS+1], g_PlayerModel[MAX_PLAYERS+1][32]

new 
g_ModName[32]
new 
g_CurrentWeapon[MAX_PLAYERS+1]
new 
g_PrimaryWeapon[MAX_PLAYERS+1]

// Allowed weapons for zombies
const ZOMBIE_ALLOWED_WEAPONS_BITSUM = (1<<CSW_KNIFE)

new 
g_pcvar_teamg_pcvar_classg_pcvar_buildtimeg_pcvar_zombiehpg_pcvar_maxroundsg_pcvar_basecalc,
    
g_pcvar_givenadesg_pcvar_allowedwepsg_pcvar_tournymodeg_pcvar_showmoversg_pcvar_healthtime,
    
g_pcvar_blockgravg_pcvar_knockbackg_pcvar_entmindistg_pcvar_entsetdistg_pcvar_entmaxdist,
    
g_pcvar_roundnumg_pcvar_roundtimeg_pcvar_resetentg_pcvar_zresptimeg_pcvar_maxclaimable,
    
g_pcvar_claimable
    
new g_friend[MAX_PLAYERS+1]

//Cached Stuff for Players
new g_isconnected[MAX_PLAYERS+1]
new 
g_isalive[MAX_PLAYERS+1
new 
g_ishuman[MAX_PLAYERS+1]
new 
g_iszombie[MAX_PLAYERS+1]

//CSDM-Style Weapons Menu
new bool:firsttime[MAX_PLAYERS+1],bool:ask[MAX_PLAYERS+1]
new 
weapon_picked[2][MAX_PLAYERS+1],cur_offset[MAX_PLAYERS+1],options_on_menu[8][MAX_PLAYERS+1]

new 
count_down

// Weapon entity names
new const WEAPONENTNAMES[][] = { """weapon_p228""""weapon_scout""weapon_hegrenade""weapon_xm1014""weapon_c4""weapon_mac10",
            
"weapon_aug""weapon_smokegrenade""weapon_elite""weapon_fiveseven""weapon_ump45""weapon_sg550",
            
"weapon_galil""weapon_famas""weapon_usp""weapon_glock18""weapon_awp""weapon_mp5navy""weapon_m249",
            
"weapon_m3""weapon_m4a1""weapon_tmp""weapon_g3sg1""weapon_flashbang""weapon_deagle""weapon_sg552",
            
"weapon_ak47""weapon_knife""weapon_p90" }
            
static const 
WEAPONNAMES[24][23] = { "Schmidt Scout""XM1014 M4""Ingram MAC-10""Steyr AUG A1""UMP 45""SG-550 Auto-Sniper",
            
"IMI Galil""Famas""AWP Magnum Sniper""MP5 Navy""M249 Para Machinegun""M3 Super 90""M4A1 Carbine",
            
"Schmidt TMP""G3SG1 Auto-Sniper""SG-552 Commando""AK-47 Kalashnikov""ES P90""P228 Compact",
            
"Dual Elite Berettas""Fiveseven""USP .45 ACP Tactical""Glock 18C""Desert Eagle .50 AE"
}

public 
plugin_init()
{
    
register_plugin("Base Builder Zombie Mod"VERSION"Tirant")
    
register_cvar("base_builder"VERSIONFCVAR_SPONLY|FCVAR_SERVER)
    
set_cvar_string("base_builder"VERSION)
    
    
g_pcvar_buildtime register_cvar("bb_build_time""150")
    
g_pcvar_zombiehp register_cvar("bb_zombie_health""2500")
    
g_pcvar_basecalc register_cvar("bb_calc_maxbase""0")
    
g_pcvar_tournymode register_cvar("bb_tournament_mode""0")
    
g_pcvar_showmovers register_cvar("bb_show_moving""1")
    
g_pcvar_blockgrav register_cvar("bb_block_gravity""0")
    
g_pcvar_knockback register_cvar("bb_pain_shock_free""0")
    
g_pcvar_entmaxdist register_cvar("bb_max_move_dist""960")
    
g_pcvar_entmindist register_cvar("bb_min_move_dist""25")
    
g_pcvar_entsetdist register_cvar("bb_min_dist_set""50")
    
g_pcvar_healthtime register_cvar("bb_health_time""12")
    
g_pcvar_resetent register_cvar("bb_reset_blocks""1")
    
g_pcvar_roundtime register_cvar("bb_roundtime""9")
    
g_pcvar_zresptime register_cvar("bb_zombie_respawn_time""5")
    
g_pcvar_roundnum register_cvar("bb_rounds""4")
    
g_pcvar_maxrounds get_cvar_num("mp_maxrounds")
    
g_pcvar_maxclaimable register_cvar("bb_claim_max""6")
    
g_pcvar_claimable register_cvar("bb_claim_mode""0")
        
    
//AJC for auto team (if needed)
    
g_pcvar_team register_cvar("bb_team""5")
    
g_pcvar_class register_cvar("bb_class""5")
        
    
//Guns Menu
    
g_pcvar_givenades register_cvar("bb_give_nades","h"//h f s, put multiple letters for multiple nades
    
g_pcvar_allowedweps register_cvar("bb_weapons","abcdeghijlmnqrstuvwx")
    
    
//Client Commands
    
register_clcmd("+grab","cmdMoveEnt",_," - Starts moving the selected object")         //command to move stuff around
    
register_clcmd("-grab","cmdStopEnt",_," - Stops moving the selected object")         //command to move stuff around
    
register_clcmd("say /respawn","Respawn_Zombie",_," - Respawn while dead (Zombie)")    //command to respawn (zombies only)
    
register_clcmd("say /fixspawn","cmdBadSpawn",_," - Respawn while dead (Survivor)")    //command to respawn (humans only before buildtime)
    
register_clcmd("say /help","cmdHelp",_," - Displays the help hud")             //command to see /help menu
    
register_clcmd("say /rules","cmdHelp",_," - Displays the help hud")             //command to see /help menu
    
register_clcmd("say /round","cmdCheckRound",_," - Displays the round number")        //command to see the current round number
    
register_clcmd("say round","cmdCheckRound",_," - Displays the round number")        //command to see the current round number
    
    //Guns Menu
    
register_clcmd("say guns","cmdGuns",_," - Opens the guns menu")                 //Guns Menu CMD
    
register_clcmd("say_team guns","cmdGuns",_," - Opens the guns menu")            //Guns Menu CMD
    
register_clcmd("say /guns","cmdGuns",_," - Opens the guns menu")            //Guns Menu CMD
    
register_clcmd("say_team /guns","cmdGuns",_," - Opens the guns menu")            //Guns Menu CMD
    
    //Admin Commands
    
register_concmd("removeaim","cmdRemoveEnt",_," - Deletes an object")             //Removes an object (C alive, D dead)
    
register_concmd("lockaim","cmdLockBlock",_," - Locks/Unlocks an object from moving")    //Once to lock, again to unlock
    
register_concmd("unclaimaim","cmdRemoveClaim",_," - Removes a claim on an object")    //Makes block claimable by everyone
    
register_concmd("say /fixspawns","cmdBadSpawn_Survivor",_," - Respawns all dead CTs")     //Global /fixspawn command (Kick)
    
register_concmd("say /respawns","cmdBadSpawn_Zombie",_," - Respawns all dead Ts")     //Global /respawn command (Kick)
    
register_concmd("bb_buildban","cmdBuildBan",_,"<player>")                 //Bans targeted player from building
    
register_concmd("bb_unbuildban","cmdBuildUnban",_,"<player>")                 //Unbans   "       "     "     "
    
register_concmd("bb_revive","cmdRevive",_,"<player>")                    //revives targetted player
    
register_concmd("bb_swap","cmdSwap",_,"<player>")                    //swaps the selected player to the opposite team
    
register_concmd("bb_startround","cmdStartRound",_," - Ends the build phase")        //do i really have to explain this?
    
    //Blocked Commands
    
register_clcmd("drop""clcmd_drop")
    
register_clcmd("buy""clcmd_buy")
    
    new 
tournymode get_pcvar_num(g_pcvar_tournymode)
    if (
tournymode != 1)
    {
        
register_clcmd("chooseteam""clcmd_changeteam")
        
register_clcmd("jointeam""clcmd_changeteam")
    }
    
    
register_forward(FM_GetGameDescription"fw_GetGameDescription")
    
register_forward(FM_SetClientKeyValue"fw_SetClientKeyValue")
    
register_forward(FM_ClientUserInfoChanged"fw_ClientUserInfoChanged")
    
register_forward(FM_PlayerPreThink"fw_Player_PreThink")
    
register_forward(FM_ClientKill"fw_Suicide")
    
//register_forward(FM_CmdStart, "fw_CmdStart")
    
if (get_pcvar_num(g_pcvar_showmovers) == 1)
        
register_forward(FM_TraceLine"fw_Traceline")
    
    
RegisterHam(Ham_Touch"weapon_shield""ham_WeaponCleaner_Post"1)
    
RegisterHam(Ham_Touch"weaponbox""ham_WeaponCleaner_Post"1)
    
RegisterHam(Ham_Spawn"player""ham_PlayerSpawn_Post"1)
    for (new 
1sizeof WEAPONENTNAMESi++)
        if (
WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_DeployWEAPONENTNAMES[i], "ham_ItemDeploy_Post"1)

    
    
register_message(get_user_msgid("TextMsg"), "msgRoundEnd")
    
register_message(get_user_msgid("StatusIcon"), "msgStatusIcon")
    
register_message(get_user_msgid("StatusValue"), "msgStatusValue");
    if (
tournymode != 1)
    {
        
register_message(get_user_msgid("ShowMenu"), "message_show_menu")
        
register_message(get_user_msgid("VGUIMenu"), "message_vgui_menu")
    }
    
    
register_event("HLTV""event_round_start""a""1=0""2=0")
    
register_event("AmmoX""ev_AmmoX""be""1=1""1=2""1=3""1=4""1=5""1=6""1=7""1=8""1=9""1=10")
    
register_event("StatusValue""ev_SetTeam""be""1=1");
    
register_event("StatusValue""ev_ShowStatus""be""1=2""2!0");
    
register_event("StatusValue""ev_HideStatus""be""1=1""2=0");
    
register_event("Health""ev_Health""be""1>0");
        
    
register_logevent("logevent_round_start",2"1=Round_Start")
    
register_logevent("logevent_round_end"2"1=Round_End")
    
    
register_menucmd(register_menuid("WeaponMethodMenu"),(1<<0)|(1<<1)|(1<<2),"weapon_method_pushed")
    
register_menucmd(register_menuid("PrimaryWeaponSelect"),(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9),"prim_weapons_pushed")
    
register_menucmd(register_menuid("SecWeaponSelect"),(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7),"sec_weapons_pushed")

    
set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
    
    
//Formats the Mod Name
    
formatex(g_ModNamecharsmax(g_ModName), "Base Builder %s"VERSION)
    
    
register_dictionary("basebuilder.txt");
    
    
gmsgSayText get_user_msgid("SayText")
    
gmsgStatusText get_user_msgid("StatusText");
    
gHudSyncInfo CreateHudSyncObj();
    
g_MaxPlayers get_maxplayers()

    if (
tournymode != 1)
    {
        
server_cmd("mp_limitteams 1")
        
server_cmd("mp_autoteambalance 1")
    }
    else
    {
        
server_cmd("mp_limitteams 0")
        
server_cmd("mp_autoteambalance 0")        
    }
    new 
roundnum get_pcvar_num(g_pcvar_roundnum)
    
server_cmd("mp_freezetime 0")
    
server_cmd("mp_flashlight 0")
    
server_cmd("mp_maxrounds %d"roundnum)
    
server_cmd("mp_winlimit %d"roundnum)
    
server_cmd("mp_roundtime %d"get_pcvar_num(g_pcvar_roundtime))
    
    
g_iEntBarrier find_ent_by_tname( -1"barrier" );
}

public 
plugin_precache()
{
    new 
szModel64 ];
    
formatexszModelcharsmaxszModel ), "models/player/%s/%s.mdl"g_ZombieModelg_ZombieModel );
    
engfuncEngFunc_PrecacheModelszModel );
    
    
engfuncEngFunc_PrecacheSoundg_RoundStart )

    new 
ent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_bomb_target"))
    if (
ent
    {
        
dllfunc(DLLFunc_Spawnent)
        
set_pev(entpev_solidSOLID_NOT)
    }
    
    new 
iBuyZone create_entity("info_map_parameters");
    
DispatchKeyValue(iBuyZone"bombradius""0");
    
DispatchKeyValue(iBuyZone"buying""3");
    
DispatchSpawn(iBuyZone);
}

// Event Round Start (This is before freeze time)
public event_round_start()
{
    
g_RoundStartTime get_gametime()
    
g_ZombiesReleased false
    
    
if (get_pcvar_num(g_pcvar_resetent) == 1)
    {
        new 
cname[10], tname[7];
        for (new 
iEnt g_MaxPlayers+1iEnt MAXENTSiEnt++)
        {
            if( 
is_valid_ent(iEnt) )
            {
                
entity_get_string(iEntEV_SZ_classnamecname9);
                
entity_get_string(iEntEV_SZ_targetnametname6);
                if ( !
IsBlockLocked(iEnt) && iEnt != g_iEntBarrier && equal(cname"func_wall") && !equal(tname"ignore"))
                    
engfuncEngFunc_SetOriginiEntFloat:{ 0.00.00.0 } );
            }
        }
    }
}

public 
cmdHelp(id)
{
    
set_hudmessage(255255255, -1.00.4501.015.00.10.22)
    new 
nLenszHelp[512]
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"WELCOME_MSG"VERSION);
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"BIND_KEY");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE1");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE2");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE3");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE4");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE5");
    
show_hudmessage(idszHelp);
}

// Log Event Round Start (This is AFTER freeze time)
public logevent_round_start()
{
    
set_pev(g_iEntBarrier,pev_solid,SOLID_BSP)
    
set_pev(g_iEntBarrier,pev_rendermode,1)
    
DispatchKeyValue(g_iEntBarrier"renderamt""255");
    
    
set_hudmessage(255255255, -1.00.4501.010.00.10.21)
    new 
nLenszMsg[128]
    
nLen += formatszMsg[nLen], 127-nLen"%L"LANG_SERVER"WELCOME_MSG"VERSION);
    
nLen += formatszMsg[nLen], 127-nLen"%L"LANG_SERVER"BIND_KEY");
    
show_hudmessage(0szMsg);
    
    
print_color(0"%s %s ^x04- ^x01%L"formatmodnameVERSIONLANG_SERVER"ROUND_MSG")
    
print_color(0"%s Round: %d of %d"formatmodname, (g_RoundNum+1), g_pcvar_maxrounds)
    
    
remove_task(TASK_ROUND)
    
remove_task(30000)
    
    new 
iBuildTime get_pcvar_numg_pcvar_buildtime );
    
set_task(1.0"CountDown"30000""0"a"iBuildTime);
    
count_down = (iBuildTime-1);
    
set_task(float(iBuildTime), "Release_Zombies"TASK_ROUND)
    
    if (
get_pcvar_num(g_pcvar_basecalc) == 1)
        
set_task(5.0"Base_Calc")
        
    
set_task(5.0"Fix_Spawns")
    
    
g_CanBuild true

    arrayset
(g_MovingEntfalseMAXENTS)
    
arrayset(g_EntOwner0MAXENTS)
    
arrayset(g_OwnedEnts0g_MaxPlayers+1)
}

public 
CountDown()
{
    
set_hudmessage(255255255, -1.00.000.10.90.10.23)
    
show_hudmessage(0"%L"LANG_SERVER"BUILD_TIME"count_down--);
    
    if (
count_down 0)
    {
        
remove_task(30000);
    }
}

//Resets stuff and swaps teams so they respawn correctly
public logevent_round_end()
{
    if (!
g_CanBuild && get_pcvar_num(g_pcvar_tournymode) != 1)
    {
        new 
players[32], num
        get_players
(playersnum)
        
        new 
player
        
for (new 0numi++)
        {
            
player players[i]
            
cs_set_user_team(playercs_get_user_team(player) == CS_TEAM_T CS_TEAM_CT:CS_TEAM_T)
            
            if (
cs_get_user_team(player) == CS_TEAM_T)
            {
                
g_iszombie[player] = true
                g_ishuman
[player] = false
            
}
            if (
cs_get_user_team(player) == CS_TEAM_CT)
            {
                
g_ishuman[player] = true
                g_iszombie
[player] = false
            
}
        }
        
print_color(0"^x04%L"LANG_SERVER"TEAMS_SWAPPED")
    }
    
    
remove_task(TASK_ROUND)
    
remove_task(30000)
        
    return 
PLUGIN_HANDLED
}

//Death events for respanws and HUD information
public client_death(g_attackerg_victimwpnindexhitplaceTK)
{
    
cmdStopEnt(g_victim)
    
    
set_hudmessage(__________4);
    
show_hudmessage(g_victim"");
    
    
g_isalive[g_victim] = false
    
    
if (g_iszombie[g_victim])
    {
        
set_hudmessage(255255255, -1.00.4501.010.00.10.21)
        
show_hudmessage(g_victim"%L"LANG_SERVER"DEAD_ZOMBIE"get_pcvar_num(g_pcvar_zresptime));
        
set_task(get_pcvar_float(g_pcvar_zresptime), "Respawn_Zombie"g_victim)
    }
    if (
g_ishuman[g_victim])
    {
        
set_hudmessage(255255255, -1.00.4501.010.00.10.21)
        
show_hudmessage(g_victim"%L"LANG_SERVER"DEAD_SURVIVOR");
    }
}

public 
ham_TakeDamage_Post(victiminflictorattackerFloat:damagebits)
{
    if(
get_pcvar_num(g_pcvar_knockback) == && access(victimPAIN_SHOCK_FREE) && g_iszombie[victim])
    {
        
set_pdata_float(victimfPainShock1.05)
    }
}

public 
client_disconnect(id)
{
    
cmdStopEnt(id)

    
g_isconnected[id] = false
    g_isalive
[id] = false
    g_ishuman
[id] = false
    g_iszombie
[id] = false

    
return PLUGIN_CONTINUE
}

//Respawns late joiners, cts only if build time is still on
public client_putinserver(id)
{
    
set_task(7.0,"Respawn_Human",id);
    
g_isconnected[id] = true
    firsttime
[id] = true
    ask
[id] = true
}

public 
Release_Zombies()
{
    
g_CanBuild false
    g_ZombiesReleased 
true
    remove_task
(30000);
    
    new 
players[32], num
    get_players
(playersnum)

    new 
player
    
for(new 0numi++)
    {
        
player players[i]
        if (
g_isalive[player])
        {
            if (
get_user_godmode(player))
                
set_user_godmode(player0)
            if (
g_ishuman[player])
            {
                
cmdStopEnt(player)

                new 
weapon[32]
                
get_pcvar_string(g_pcvar_givenades,weapon,31)
            
                new 
heflashsmoke
                
for(new i=0;i<strlen(weapon);i++)
                {
                    switch(
weapon[i])
                    {
                        case 
'h'he++
                        case 
'f'flash++
                        case 
's'smoke++
                    }
                }
                if(
hegive_item(player,"weapon_hegrenade"), cs_set_user_bpammo(player,CSW_HEGRENADE,he)
                if(
flashgive_item(player,"weapon_flashbang"), cs_set_user_bpammo(player,CSW_FLASHBANG,flash)
                if(
smokegive_item(player,"weapon_smokegrenade"), cs_set_user_bpammo(player,CSW_SMOKEGRENADE,smoke)
                
                if (
g_PrimaryWeapon[player])
                {
                    
get_weaponname(g_PrimaryWeapon[player],weapon,31)
                    
engclient_cmd(playerweapon);
                }
            }
        }
    }
            
    
set_pev(g_iEntBarrier,pev_solid,SOLID_NOT)
    
DispatchKeyValue(g_iEntBarrier"renderamt""0");
    
    
g_RoundNum++
    
set_hudmessage(255255255, -1.00.4501.010.00.10.21)
    
show_hudmessage(0"%L"LANG_SERVER"RELEASE_MSG");
    
client_cmd(0"spk %s"g_RoundStart)
}

//Called on zombie death function
public Respawn_Zombie(id)
{
    if (
g_isconnected[id] && cs_get_user_team(id) == CS_TEAM_T)
    {
        if (
get_user_health(id) == get_pcvar_float(g_pcvar_zombiehp) || !is_user_alive(id))
            
ExecuteHamB(Ham_CS_RoundRespawnid)
        else
            
client_print(idprint_center"%L"LANG_SERVER"FAIL_RESPAWN");
    }
}

//Called on all players for late joiners, parent is above
public Respawn_Human(id)
{
    if (!
g_isconnected[id] || g_isalive[id] || cs_get_user_team(id) == CS_TEAM_SPECTATOR || cs_get_user_team(id) == CS_TEAM_UNASSIGNED)
        return 
PLUGIN_HANDLED
        
    
if (!g_isalive[id] && g_iszombie[id])
        
ExecuteHamB(Ham_CS_RoundRespawnid)
                
    if (!
g_isalive[id] && g_iszombie[id])
        
set_task(3.0,"Respawn_Human",id)
            
    if (
g_CanBuild)
    {
        if (!
g_isalive[id])
            
ExecuteHamB(Ham_CS_RoundRespawnid)
                
        if (!
g_isalive[id])
            
set_task(3.0,"Respawn_Human",id)
    }
    return 
PLUGIN_HANDLED
}

//Sets player health and weapons
public Add_Effects(id)
{
    if (!
g_isconnected[id] || !g_isalive[id])
        return 
PLUGIN_HANDLED
    
    strip_user_weapons
(id)
    
give_item(id"weapon_knife")
    
    if (
cs_get_user_team(id) == CS_TEAM_T)
    {
        if (
g_CanBuild)
            
set_user_godmode(id1)

        
set_pev(idpev_healthget_pcvar_float(g_pcvar_zombiehp)) // use decimal number
    
}
    if (
cs_get_user_team(id) == CS_TEAM_CT)
    {
        
weapon_method_menu(id)
    }
    
ShowHealth(id)
    return 
PLUGIN_HANDLED
}

//AmmoX Ensures BackPack ammo is always full
public ev_AmmoX(id)
{
    
set_pdata_int(idAMMO_SLOT read_data(1), 2005)


public 
fw_GetGameDescription()
{
    
forward_return(FMV_STRINGg_ModName)
    
    return 
FMRES_SUPERCEDE;
}

public 
ham_PlayerSpawn_Post(id)
{
    if (!
is_user_alive(id) || !cs_get_user_team(id))
        return
        
    
set_task(1.0"Add_Effects"id)
    if (
cs_get_user_team(id) == CS_TEAM_CT)
    {
        
g_ishuman[id] = true
        g_iszombie
[id] = false
    
}
    if (
cs_get_user_team(id) == CS_TEAM_T)
    {
        
g_iszombie[id] = true
        g_ishuman
[id] = false
    
}
        
    
g_isalive[id] = true
    remove_task
(id MODELSET_TASK)
    if (
g_iszombie[id])
    {
        
copy(g_PlayerModel[id], charsmax(g_PlayerModel[]), g_ZombieModel)
        new 
currentmodel[32]
        
fm_get_user_model(idcurrentmodelcharsmax(currentmodel))
        if (!
equal(currentmodelg_PlayerModel[id]))
        {
            if (
get_gametime() - g_RoundStartTime 5.0)
                
set_task(5.0 MODELCHANGE_DELAY"fm_user_model_update"id MODELSET_TASK)
            else
                
fm_user_model_update(id MODELSET_TASK)
        }
    }
    else if (
g_HasCustomModel[id])
    {
        
fm_reset_user_model(id)
    }
}

public 
fw_SetClientKeyValue(id, const infobuffer[], const key[])
{   
    if (
g_HasCustomModel[id] && equal(key"model"))
        return 
FMRES_SUPERCEDE
    
return FMRES_IGNORED
}

public 
fw_ClientUserInfoChanged(id)
{
    if (!
g_HasCustomModel[id])
        return 
FMRES_IGNORED
    
static currentmodel[32]
    
fm_get_user_model(idcurrentmodelcharsmax(currentmodel))
    if (!
equal(currentmodelg_PlayerModel[id]) && !task_exists(id MODELSET_TASK))
        
fm_set_user_model(id MODELSET_TASK)
    return 
FMRES_IGNORED
}

public 
fm_user_model_update(taskid)
{
    static 
Float:current_time
    current_time 
get_gametime()
    
    if (
current_time g_ModelsTargetTime >= MODELCHANGE_DELAY)
    {
        
fm_set_user_model(taskid)
        
g_ModelsTargetTime current_time
    
}
    else
    {
        
set_task((g_ModelsTargetTime MODELCHANGE_DELAY) - current_time"fm_set_user_model"taskid)
        
g_ModelsTargetTime g_ModelsTargetTime MODELCHANGE_DELAY
    
}
}

public 
fm_set_user_model(player)
{
    
player -= MODELSET_TASK
    engfunc
(EngFunc_SetClientKeyValueplayerengfunc(EngFunc_GetInfoKeyBufferplayer), "model"g_PlayerModel[player])
    
g_HasCustomModel[player] = true
}

stock fm_get_user_model(playermodel[], len)
{
    
engfunc(EngFunc_InfoKeyValueengfunc(EngFunc_GetInfoKeyBufferplayer), "model"modellen)
}

stock fm_reset_user_model(player)
{
    
g_HasCustomModel[player] = false
    dllfunc
(DLLFunc_ClientUserInfoChangedplayerengfunc(EngFunc_GetInfoKeyBufferplayer))
}

public 
cmdMoveEnt(id)
{
    if (
g_BuildBan[id] == true)
        return 
PLUGIN_HANDLED
    
    
if (g_iszombie[id] && !access(idAFTER_BUILD))
              return 
PLUGIN_HANDLED 
            
    
if (!g_CanBuild && !access(idAFTER_BUILD))
    {
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_TIME_UP")
        return 
PLUGIN_HANDLED 
    
}
    
    if (!
g_isalive[id] && !access(idDEAD_BUILD))
    {
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_DEAD")
        return 
PLUGIN_HANDLED 
    
}

    if (
g_pEnt[id] && is_valid_ent(g_pEnt[id])) 
        
cmdStopEnt(id)
    
    new 
entbodypart
    get_user_aiming 
(id,ent,bodypart)
    
    if (!
is_valid_ent(ent) || ent == g_iEntBarrier)
    {
        return 
PLUGIN_HANDLED
    
}
    
    if (
ent <= g_MaxPlayers && g_isalive[ent])
    {    
        return 
PLUGIN_HANDLED
    
}
        
    if (
IsBlockLocked(ent) || g_MovingEnt[ent])
    {
        return 
PLUGIN_HANDLED
    
}

    if (
get_pcvar_num(g_pcvar_claimable) == 1)
    {
        if (!
g_EntOwner[ent])
        {
            if ((
g_OwnedEnts[id]<get_pcvar_num(g_pcvar_maxclaimable)) || get_pcvar_num(g_pcvar_maxclaimable) == 0)
            {
                
g_EntOwner[ent] = id
                g_OwnedEnts
[id]++
            }
            else
            {
                
client_print (idprint_center"%L"LANG_SERVER"FAIL_MAXOWNED"get_pcvar_num(g_pcvar_maxclaimable))
                
//return PLUGIN_HANDLED 
            
}
        }
        else if (
g_EntOwner[ent] != id && !access(idAFTER_BUILD))
        {
            
client_print (idprint_center"%L"LANG_SERVER"FAIL_ALREADYOWNED")
            return 
PLUGIN_HANDLED 
        
}
    }
    
    new 
tname[7], cname[10];
    
entity_get_string(entEV_SZ_targetnametname6);
    
entity_get_string(entEV_SZ_classnamecname9);
    if (!
equal(cname"func_wall") || equal(tname"ignore"))
    {
        return 
PLUGIN_HANDLED
    
}
    
    new 
origin[3], entOrigin[3], Float:orig[3], Float:mins[3], Float:maxs[3], dist
    
    entity_get_vector
(entEV_VEC_originorig);
    
entity_get_vector(entEV_VEC_minsmins);
    
entity_get_vector(entEV_VEC_maxsmaxs);

    
entOrigin[0] = floatround((mins[0] + maxs[0]) / orig[0]);
    
entOrigin[1] = floatround((mins[1] + maxs[1]) / orig[1]);
    
entOrigin[2] = floatround((mins[2] + maxs[2]) / orig[2]);
    
    
get_user_origin(idorigin);

    
dist get_distance(originentOrigin);
    
    new 
max get_pcvar_num(g_pcvar_entmaxdist)
    new 
min get_pcvar_num(g_pcvar_entmindist)
    if (
min//min
    
{
        if(
dist min//minimum
            
dist get_pcvar_num(g_pcvar_entsetdist);
    }

    if (
max//maximum
    
{
        if (
dist max)
            return 
PLUGIN_HANDLED
    
}
    
    
DispatchKeyValue(ent"rendermode""1");
    
DispatchKeyValue(ent"renderamt""100");
    
DispatchKeyValue(ent"rendercolor""255.0 0.0 0.0");

    
g_MovingEnt[ent] = true
    g_EntMover
[ent] = id
    g_pEnt
[id] = ent
    g_pDist
[id] = dist
    
    
if (!g_CanBuild && access(idAFTER_BUILD))
    {
        new 
adminauthid[35],adminname[35]
        
get_user_authid (id,adminauthid,34)
        
get_user_name(id,adminname,34)
        
Log("[MOVE] Admin: %s || SteamID: %s moved an entity"adminnameadminauthid)
    }
    
    return 
PLUGIN_HANDLED
}

/*public fw_CmdStart(id, uc, random)
{
    new buttons = get_uc(uc, UC_Buttons)
    if(g_CanBuild && (buttons & IN_ATTACK))
    {
        buttons &= ~IN_ATTACK
        set_uc(uc, UC_Buttons, buttons)
        return FMRES_SUPERCEDE
    }
    return FMRES_IGNORED
}*/

public fw_Player_PreThink(id)
{
    if (!
g_pEnt[id] || !is_valid_ent(g_pEnt[id]))
        return 
FMRES_HANDLED
    
    
new buttons pev(idpev_button)
    if(
buttons IN_ATTACK)
    {
        
g_pDist[id] += 3;
        
        if (
g_pDist[id] > get_pcvar_num(g_pcvar_entmaxdist))
        {
            
g_pDist[id] = get_pcvar_num(g_pcvar_entmaxdist)
            
client_print(idprint_center"%L"LANG_SERVER"OBJECT_MAX")
        }
        else
            
client_print(idprint_center"%L"LANG_SERVER"OBJECT_PUSH")
    }
    else if(
buttons IN_ATTACK2)
    {
        
g_pDist[id] -= 3;
            
        if (
g_pDist[id] < get_pcvar_num(g_pcvar_entsetdist))
        {
            
g_pDist[id] = get_pcvar_num(g_pcvar_entsetdist)
            
client_print(idprint_center"%L"LANG_SERVER"OBJECT_MIN")
        }
        else
            
client_print(idprint_center"%L"LANG_SERVER"OBJECT_PULL")
    }
    
    
GrabThink(id)
    
    return 
FMRES_HANDLED
}

public 
GrabThink(id)
{
    new 
Float:aiming[3], origin[3], Float:mins[3], Float:maxs[3], Float:neworigin[3], ent
    
    ent 
g_pEnt[id]

    if (!
g_isconnected[id] || (ent <= g_MaxPlayers)? !g_isconnected[id]:!is_valid_ent(ent))
    {
        
cmdStopEnt(id)
        return 
PLUGIN_HANDLED
    
}
    
    
entity_get_vector(entEV_VEC_minsmins);
    
entity_get_vector(entEV_VEC_maxsmaxs);
    
    
get_user_origin(idorigin3);
    
IVecFVec(originaiming);
    
get_user_origin(idorigin);
    
    
aiming[0] -= float(origin[0]);
    
aiming[1] -= float(origin[1]);
    
aiming[2] -= float(origin[2]);

    new 
Float:scalar float(g_pDist[id]) / vector_length(aiming);

    
origin[0] += floatround(aiming[0] * scalar - (mins[0] + maxs[0]) / 2);
    
origin[1] += floatround(aiming[1] * scalar - (mins[1] + maxs[1]) / 2);
    
origin[2] += floatround(aiming[2] * scalar - (mins[2] + maxs[2]) / 2);
    
    
IVecFVec(originneworigin);
    
entity_set_origin(entneworigin);
    
    return 
PLUGIN_CONTINUE
}

public 
cmdStopEnt(id)
{
    
g_MovingEnt[g_pEnt[id]] = false
    DispatchKeyValue
(g_pEnt[id], "rendermode""0");
    
DispatchKeyValue(g_pEnt[id], "renderamt""255");
    
DispatchKeyValue(g_pEnt[id], "rendercolor""0.0 0.0 0.0");
    if (
get_pcvar_num(g_pcvar_blockgrav) == 1)
        
drop_to_floor(g_pEnt[id])
    
g_EntMover[g_pEnt[id]] = 0
    g_LastMover
[g_pEnt[id]] = id
    g_pEnt
[id] = 0
}

public 
fw_Traceline(Float:start[3], Float:end[3], conditionsidtrace)
{
    if (!
is_user_connected(id)) return PLUGIN_HANDLED
    
    
new ent get_tr2(traceTR_pHit)
    
    if (
pev_valid(ent))
    {
        new 
ent,body
        get_user_aiming
(id,ent,body)
        
        new 
cname[10], tname[7];
        
entity_get_string(entEV_SZ_classnamecname9);
        
entity_get_string(entEV_SZ_targetnametname6);
        if (
equal(cname"func_wall") && !equal(tname"ignore") && ent != g_iEntBarrier && get_pcvar_num(g_pcvar_showmovers) == 1)
        {
            if (
g_CanBuild || access(idADMIN_KICK))
            {
                if (
IsBlockLocked(ent))
                {
                    
set_hudmessage(25500, -1.00.5510.013.00.010.01);
                    
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_LOCKED");
                    return 
PLUGIN_HANDLED
                
}
                
set_hudmessage(050255, -1.00.5510.013.00.010.01);
                if (
get_pcvar_num(g_pcvar_claimable) == 0)
                {
                    new 
currentmover[35], lastmover[35]
                    if (
g_EntMover[ent])
                    {
                        
get_user_name(g_EntMover[ent],currentmover,34)
                        if (!
g_LastMover[ent]) ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_INFO1"currentmover);
                    }
                    if (
g_LastMover[ent])
                    {
                        
get_user_name(g_LastMover[ent],lastmover,34)
                        if (!
g_EntMover[ent]) ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_INFO2"lastmover);
                    }
                    if (
g_LastMover[ent] && g_EntMover[ent]) ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_INFO3"currentmoverlastmover);
                    else if (!
g_LastMover[ent] && !g_EntMover[ent]) ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_INFO4");
                }
                else
                {
                    if (
g_EntOwner[ent])
                    {
                        new 
entowner[35]
                        
get_user_name(g_EntOwner[ent],entowner,34)
                        
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_OWNER"entowner);
                    }
                    else 
                    {
                        
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_OWNER_NONE");
                    }
                }
            }
        }
    }
    if (!
pev_valid(ent)) ClearSyncHud(idgHudSyncInfo);
    
    return 
PLUGIN_HANDLED
}

public 
cmdLockBlock(id)
{
    if (!
access(idLOCK_BLOCKS))
        return 
PLUGIN_HANDLED
        
    
new entbodypart
    get_user_aiming 
(id,ent,bodypart)
    
    new 
tname[7], cname[10];
    
entity_get_string(entEV_SZ_targetnametname6);
    
entity_get_string(entEV_SZ_classnamecname9);

    if (!
ent || !is_valid_ent(ent) || is_user_alive(ent) || ent == g_iEntBarrier || !equal(cname"func_wall") || equal(tname"ignore")) return PLUGIN_HANDLED
    
    
if (!IsBlockLocked(ent) && !g_MovingEnt[ent])
    {
        
LockBlock(ent)
        
DispatchKeyValue(ent"rendermode""1");
        
DispatchKeyValue(ent"rendercolor""125.0 0.0 0.0");
        
        
g_OwnedEnts[g_EntOwner[ent]]--
        
g_EntOwner[ent] = 0
    
}
    else if (
IsBlockLocked(ent))
    {
        
UnlockBlock(ent)
        
DispatchKeyValue(ent"rendermode""0");
    }
    return 
PLUGIN_HANDLED
}

public 
cmdRemoveClaim(id)
{
    if (!
access(idLOCK_BLOCKS))
              return 
PLUGIN_HANDLED 
        
    
new entbodypart
    get_user_aiming 
(id,ent,bodypart)
    
    new 
tname[7], cname[10];
    
entity_get_string(entEV_SZ_targetnametname6);
    
entity_get_string(entEV_SZ_classnamecname9);

    if (!
ent || !is_valid_ent(ent) || is_user_alive(ent) || ent == g_iEntBarrier || !equal(cname"func_wall") || equal(tname"ignore") || IsBlockLocked(ent)) return PLUGIN_HANDLED

    g_OwnedEnts
[g_EntOwner[ent]]--
    
g_EntOwner[ent] = 0
    
    
return PLUGIN_HANDLED
}

public 
cmdRemoveEnt(id)
{
    if (!
access(idREMOVE_BLOCK))
              return 
PLUGIN_HANDLED 

    
if (!g_isalive[id] && !access(idDEAD_REMOVE))
    {
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_REMOVE")
        return 
PLUGIN_HANDLED 
    
}
          
    new 
entbodypart
    get_user_aiming 
(id,ent,bodypart)
    
    if(!
is_valid_ent(ent) || ent == g_iEntBarrier || (ent <= g_MaxPlayers && g_isalive[ent]))
        return 
PLUGIN_HANDLED
    
    
if(IsBlockLocked(ent) || g_MovingEnt[ent])
        return 
PLUGIN_HANDLED

    
new tname[7], cname[10];
    
entity_get_string(entEV_SZ_targetnametname6);
    
entity_get_string(entEV_SZ_classnamecname9);
    if(!
equal(cname"func_wall"))
        return 
PLUGIN_HANDLED
    
    
if(equal(tname"ignore"))
        return 
PLUGIN_HANDLED
        
    g_OwnedEnts
[g_EntOwner[ent]]--
    
g_EntOwner[ent] = 0
    
    remove_entity
(ent)
    
    new 
adminauthid[35],adminname[35]
    
get_user_authid (id,adminauthid,34)
    
get_user_name(id,adminname,34)
    
Log("[REMOVE] Admin: %s || SteamID: %s removed an entity"adminnameadminauthid)
    
    return 
PLUGIN_HANDLED
}

// Ham Weapon Deploy Forward (forces knife only)
public ham_ItemDeploy_Post(weapon_ent)
{
    static 
owner
    owner 
get_pdata_cbase(weapon_entOFFSET_WEAPONOWNEROFFSET_LINUX_WEAPONS);
    
    static 
weaponid
    weaponid 
cs_get_weapon_id(weapon_ent)
    
    
g_CurrentWeapon[owner] = weaponid
    
    
if (g_iszombie[owner] && !((1<<weaponid) & ZOMBIE_ALLOWED_WEAPONS_BITSUM))
    {
        
g_CurrentWeapon[owner] = CSW_KNIFE
        engclient_cmd
(owner"weapon_knife")
    }
    else if (
g_CanBuild && g_ishuman[owner])
    {
        
g_CurrentWeapon[owner] = CSW_KNIFE
        engclient_cmd
(owner"weapon_knife")
        
client_print(ownerprint_center"%L"LANG_SERVER"FAIL_KNIFE_ONLY");
    }
}

public 
msgRoundEnd(const MsgId, const MsgDest, const MsgEntity)
{
    static 
Message[192]
    
get_msg_arg_string(2Message191)
    
    
set_hudmessage(255255255, -1.00.4006.06.00.10.21)
    
    if(
equal(Message"#Game_bomb_drop"))
        return 
PLUGIN_HANDLED
    
    
if (equal(Message"#Terrorists_Win"))
    {
        
show_hudmessage(0"Zombies Win!")
        
set_msg_arg_string(2"")
        switch (
random_num(14))
        {
            case 
1client_cmd(0"spk ambience/the_horror1.wav")
            case 
2client_cmd(0"spk ambience/the_horror2.wav")
            case 
3client_cmd(0"spk ambience/the_horror3.wav")
            case 
4client_cmd(0"spk ambience/the_horror4.wav")
        }
        return 
PLUGIN_HANDLED
    
}
    else if (
equal(Message"#Target_Saved") || equal(Message"#CTs_Win"))
    {
        
show_hudmessage(0"Builders Win!")
        
set_msg_arg_string(2"")
        switch (
random_num(13))
        {
            case 
1client_cmd(0"spk barney/ba_another.wav")
            case 
2client_cmd(0"spk barney/ba_firepl.wav")
            case 
3client_cmd(0"spk barney/ba_seethat.wav")
        }
        return 
PLUGIN_HANDLED
    
}
    return 
PLUGIN_HANDLED
}

public 
ham_WeaponCleaner_Post(iEntity)
{
    
call_think(iEntity)
}

public 
message_show_menu(msgiddestid
{
    if (!
should_autojoin(id))
        return 
PLUGIN_CONTINUE

    
static team_select[] = "#Team_Select"
    
static menu_text_code[sizeof team_select]
    
get_msg_arg_string(4menu_text_codesizeof menu_text_code 1)
    if (!
equal(menu_text_codeteam_select))
        return 
PLUGIN_CONTINUE

    set_force_team_join_task
(idmsgid)

    return 
PLUGIN_HANDLED
}

public 
message_vgui_menu(msgiddestid
{
    if (
get_msg_arg_int(1) != TEAM_SELECT_VGUI_MENU_ID || !should_autojoin(id))
        return 
PLUGIN_CONTINUE
        
    set_force_team_join_task
(idmsgid)

    return 
PLUGIN_HANDLED
}

bool:should_autojoin(id
{
    return (!
get_user_team(id))
}

set_force_team_join_task(idmenu_msgid
{
    static 
param_menu_msgid[2]
    
param_menu_msgid[0] = menu_msgid
    set_task
(AUTO_TEAM_JOIN_DELAY"task_force_team_join"idparam_menu_msgidsizeof param_menu_msgid)
}

public 
task_force_team_join(menu_msgid[], id
{
    if (
get_user_team(id))
        return

    static 
team[2], class[2]
    
get_pcvar_string(g_pcvar_teamteamsizeof team 1)
    
get_pcvar_string(g_pcvar_class, class, sizeof class - 1)
    
force_team_join(idmenu_msgid[0], team, class)
}

stock force_team_join(idmenu_msgid/* const */ team[] = "5"/* const */ class[] = "0"
{
    static 
jointeam[] = "jointeam"
    
if (class[0] == '0') {
        
engclient_cmd(idjointeamteam)
        return
    }

    static 
msg_blockjoinclass[] = "joinclass"
    
msg_block get_msg_block(menu_msgid)
    
set_msg_block(menu_msgidBLOCK_SET)
    
engclient_cmd(idjointeamteam)
    
engclient_cmd(idjoinclass, class)
    
set_msg_block(menu_msgidmsg_block)
}

public 
clcmd_changeteam(id)
{
    if (
g_CanBuild
        
weapon_method_menu(id)
    else 
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_WEAPONS")
    
    if (
g_iszombie[id])
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_ZOMBIE")
        
    return 
PLUGIN_HANDLED
}

public 
clcmd_drop(id)
{
    
client_print (idprint_center"%L"LANG_SERVER"FAIL_DROP")
    return 
PLUGIN_HANDLED
}

public 
clcmd_buy(id)
{
    
client_print (idprint_center"%L"LANG_SERVER"FAIL_BUY")
    return 
PLUGIN_HANDLED
}

public 
fw_Suicide(id)
{
    
client_print (idprint_center"%L"LANG_SERVER"FAIL_SUICIDE")
    
console_print (id"%L"LANG_SERVER"FAIL_SUICIDE")
    return 
FMRES_SUPERCEDE;
}

public 
Base_Calc()
{
    new 
players[32], numctbasenum
    get_players
(playersnum)
    new 
player
    
for(new 0numi++)
    {
        
player players[i]
        if (
cs_get_user_team(player) == CS_TEAM_CT)
            
ct++

        if (
ct 6)
            
basenum 2
        
else
            
basenum = (ct/3)
    }
    
print_color(0"%s %L"formatmodnameLANG_SERVER"BASE_CALC"basenum)
}

public 
cmdBadSpawn_Survivor(id)
{
    if (
access(idBAD_SPAWN))
    {
        new 
players[32], num
        get_players
(playersnum)
            
        new 
player
        
for(new 0numi++)
        {
            
player players[i]
            if (
cs_get_user_team(player) == CS_TEAM_CT && !is_user_alive(player) && g_isconnected[player] && g_CanBuild)
                
ExecuteHamB(Ham_CS_RoundRespawnplayer)
        }
    }
}

public 
Fix_Spawns()
{
    new 
players[32], num
    get_players
(playersnum)
            
    new 
player
    
for(new 0numi++)
    {
        
player players[i]
        if (
cs_get_user_team(player) == CS_TEAM_CT && !is_user_alive(player) && g_isconnected[player] && g_CanBuild)
            
ExecuteHamB(Ham_CS_RoundRespawnplayer)
    }
}

public 
cmdBadSpawn(id)
{
    if (
g_isconnected[id] && g_ishuman[id] && g_CanBuild)
        
ExecuteHamB(Ham_CS_RoundRespawnid)
}

public 
cmdBadSpawn_Zombie(id)
{
    if (
access(idBAD_SPAWN))
    {
        new 
players[32], num
        get_players
(playersnum)
            
        new 
player
        
for(new 0numi++)
        {
            
player players[i]
            if (
cs_get_user_team(player) == CS_TEAM_T && !is_user_alive(player) && g_isconnected[player])
                
ExecuteHamB(Ham_CS_RoundRespawnplayer)
        }
    }
}

public 
msgStatusIcon(const iMsgId, const iMsgDest, const iPlayer)
{
    if(
is_user_alive(iPlayer)) 
    {
        static 
szMsg[8]
        
get_msg_arg_string(2szMsg7)
    
        if(
equal(szMsg"buyzone"))
        {
            
set_pdata_int(iPlayerOFFSET_BUYZONEget_pdata_int(iPlayerOFFSET_BUYZONE) & ~(1<<0))
            return 
PLUGIN_HANDLED
        
}
    }
    return 
PLUGIN_CONTINUE
}

public 
cmdBuildBan(id)
{
    if (
access(idBUILD_BAN))
    {
        new 
arg[32]
        
read_argv(1arg31)
        new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY)
        
g_BuildBan[player] = true
        cmdStopEnt
(player)
        
        new 
adminauthid[35],adminname[35],playername[35],playerauthid[35]
        
get_user_name(id,adminname,34)
        
get_user_authid (id,adminauthid,34)
        
get_user_name(playerplayername34)
        
get_user_authid (player,playerauthid,34)
        
Log("[MOVE] Admin: %s || SteamID: %s banned Player: %s || SteamID: %s from building"adminnameadminauthidplayernameplayerauthid)
        
        
client_print(idprint_console"%L"LANG_SERVER"BUILD_BAN1"playername)
        
client_print(playerprint_center"%L"LANG_SERVER"BUILD_BAN2")
    }
}

public 
cmdBuildUnban(id)
{
    if (
access(idBUILD_BAN))
    {
        new 
arg[32], playername[35]
    
        
read_argv(1arg31)
        new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY)
        
get_user_name(playerplayername34)
        
client_print(idprint_console"%L"LANG_SERVER"UNBUILD_BAN1"playername)
        
g_BuildBan[player] = false
        print_color
(player"%s %L"formatmodnameLANG_SERVER"UNBUILD_BAN2")
    }
}

public 
cmdRevive(id)
{
    if (
access(idREVIVE))
    {
        new 
arg[32]
        
read_argv(1arg31)
        new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY)

        if (
is_user_alive(player))
        {
            
client_print(idprint_console"%L"LANG_SERVER"FAIL_REVIVE")
            return 
PLUGIN_HANDLED
        
}
        
        
ExecuteHamB(Ham_CS_RoundRespawnplayer)
        
        new 
adminauthid[35],adminname[35],playername[35],playerauthid[35]
        
get_user_name(id,adminname,34)
        
get_user_authid (id,adminauthid,34)
        
get_user_name(playerplayername34)
        
get_user_authid (player,playerauthid,34)
        
Log("[REVIVE] Admin: %s || SteamID: %s revived Player: %s || SteamID: %s"adminnameadminauthidplayernameplayerauthid)
        
        
client_print(idprint_console"%L"LANG_SERVER"REVIVE1"playername)
        
client_print(playerprint_center"%L"LANG_SERVER"REVIVE2")
    }
    return 
PLUGIN_HANDLED
}

public 
cmdSwap(id)
{
    if (
access(idSWAP))
    {
        new 
arg[32]
        
read_argv(1arg31)
        new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY)

        if (!
is_user_connected(player)) return PLUGIN_HANDLED
        
        cs_set_user_team
(playercs_get_user_team(player) == CS_TEAM_T CS_TEAM_CT:CS_TEAM_T)
            
        if (
cs_get_user_team(player) == CS_TEAM_T)
        {
            
g_iszombie[player] = true
            g_ishuman
[player] = false
        
}
        if (
cs_get_user_team(player) == CS_TEAM_CT)
        {
            
g_ishuman[player] = true
            g_iszombie
[player] = false
        
}
        
        if (
is_user_alive(player))
            
ExecuteHamB(Ham_CS_RoundRespawnplayer)
        
        new 
adminauthid[35],adminname[35],playername[35],playerauthid[35]
        
get_user_name(id,adminname,34)
        
get_user_authid (id,adminauthid,34)
        
get_user_name(playerplayername34)
        
get_user_authid (player,playerauthid,34)
        
Log("[TEAM-SWAP] Admin: %s || SteamID: %s swapped Player: %s || SteamID: %s"adminnameadminauthidplayernameplayerauthid)
        
        
client_print(idprint_console"%L"LANG_SERVER"SWAP1"playername)
        
client_print(playerprint_center"%L"LANG_SERVER"SWAP2")
    }
    return 
PLUGIN_HANDLED
}

public 
cmdStartRound(id)
{
    if (
access(idSTART_ROUND))
    {
        if (
count_down<10)
        {
            
client_print(idprint_console"%L"LANG_SERVER"FAIL_START_ROUND")
            return 
PLUGIN_HANDLED
        
}
        
        
Release_Zombies()
        
        new 
adminauthid[35],adminname[35]
        
get_user_name(id,adminname,34)
        
get_user_authid (id,adminauthid,34)
        
Log("[START_ROUND] Admin: %s || SteamID: %s started the round"adminnameadminauthid)
        
        
client_print(idprint_center"%L"LANG_SERVER"START_ROUND")
        
client_print(idprint_chat"^x04%L"LANG_SERVER"START_ROUND")
    }
    return 
PLUGIN_HANDLED
}

public 
cmdCheckRound(id)
{
    if (
g_ZombiesReleasedprint_color(id"%s Round: %d of %d"formatmodname, (g_RoundNum), g_pcvar_maxrounds)
    else if (!
g_ZombiesReleasedprint_color(id"%s Round: %d of %d"formatmodname, (g_RoundNum+1), g_pcvar_maxrounds)
}

public 
msgStatusValue()
{
    
//Block the name info, of person you aim at
    
set_msg_block(gmsgStatusTextBLOCK_SET);
}

public 
ev_SetTeam(id)
{
    
g_friend[id] = read_data(2)
}

public 
ev_ShowStatus(id//called when id looks at someone
{
    new 
name[32], pid read_data(2);
    new 
stats[8],bodyhits[8]
    
    
get_user_name(pidname31);
    new 
color1 0color2 0;

    if (
get_user_team(pid) == 1)
        
color1 255;
    else
        
color2 255;

    new 
Float:height=0.35
    
//height=0.60

    
if (g_friend[id] == 1)    // friend
    
{
        new 
clipammowpnid get_user_weapon(pidclipammo);
        new 
wpnname[32];

        if (
wpnid)
            
xmod_get_wpnname(wpnidwpnname31);

        new 
rank get_user_stats(pidstatsbodyhits)
        
set_hudmessage(color150color2, -1.0height10.013.00.010.01);
        
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"PLAYER_INFO1"namerankget_user_health(pid), wpnname);
    } 
    if (
g_friend[id] != 1//enemy
    
{
        new 
rank get_user_stats(pidstatsbodyhits)
        
set_hudmessage(color150color2, -1.0height10.013.00.010.01);
        
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"PLAYER_INFO2"namerank);
    }
}

public 
ev_HideStatus(id)
{
    
ClearSyncHud(idgHudSyncInfo);
}

public 
weapon_method_menu(id)
{
    if(
firsttime[id])
    {
        
firsttime[id] = false
        prim_weapons_menu
(id,0)
    }
    else
    {
        
cur_offset[id] = 0
        
if(ask[id])
        {
            
show_menu(id,(1<<0)|(1<<1)|(1<<2),"Weapon Selection Method^n^n1. New Guns^n2. Last Guns^n3. Last Guns + Save",-1,"WeaponMethodMenu")
        }
        else
        {
            
give_weapons(id)
        }
    }
}

public 
weapon_method_pushed(id,key)
{
    switch(
key)
    {
        case 
0:
        {
            
ask[id] = true
            prim_weapons_menu
(id,0)
        }    
        case 
1:
        {
            
ask[id] = true
            give_weapons
(id)
        }
        case 
2:
        {
            
print_color(id"%s %L"formatmodnameLANG_SERVER"GUNS_MSG")
            
ask[id] = false
            give_weapons
(id)
        }
    }
    return 
PLUGIN_HANDLED;
}

public 
prim_weapons_menu(id,offset)
{
    if(
offset<0offset 0

    
new cvar_value[32]
    
get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
    new 
flags read_flags(cvar_value)

    new 
keyscurnummenu[2048]
    for(new 
i=offset;i<19;i++)
    {
        if(
flags power(2,i))
        {
            
options_on_menu[curnum][id] = i
            keys 
+= (1<<curnum)
    
            
curnum++
            
format(menu,2047,"%s^n%d. %s",menu,curnum,WEAPONNAMES[i])
    
            if(
curnum==8)
            break;
        }
    }

    
format(menu,2047,"\yPrimary Weapon:\w^n%s^n",menu)
    if(
curnum==&& offset<12)
    {
        
keys += (1<<8)
        
format(menu,2047,"%s^n9. Next",menu)
    }
    if(
offset)
    {
        
keys += (1<<9)
        
format(menu,2047,"%s^n0. Back",menu)
    }

    
show_menu(id,keys,menu,-1,"PrimaryWeaponSelect")
}

public 
prim_weapons_pushed(id,key)
{
    if(
key<8)
    {
        
weapon_picked[0][id] = options_on_menu[key][id]
        
cur_offset[id] = 0
        sec_weapons_menu
(id,0)
    }
    else
    {
        if(
key==8)
            
cur_offset[id] += 8
        
if(key==9)
            
cur_offset[id] -= 8
        prim_weapons_menu
(id,cur_offset[id])
    }
    return ;
}

public 
sec_weapons_menu(id,offset)
{
    if(
offset<0offset 0

    
new cvar_value[32]
    
get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
    new 
flags read_flags(cvar_value)

    new 
keyscurnummenu[2048]
    for(new 
i=18;i<24;i++)
    {
        if(
flags power(2,i))
        {
        
options_on_menu[curnum][id] = i
        keys 
+= (1<<curnum)

        
curnum++
        
format(menu,2047,"%s^n%d. %s",menu,curnum,WEAPONNAMES[i])
        }
    }

    
format(menu,2047,"\ySecondary Weapon:\w^n%s",menu)

    
show_menu(id,keys,menu,-1,"SecWeaponSelect")
}

public 
sec_weapons_pushed(id,key)
{
    if(
key<8)
    {
        
weapon_picked[1][id] = options_on_menu[key][id]
    }
    
give_weapons(id)
    return ;
}

public 
give_weapons(id)
{
    
strip_user_weapons(id)

    
give_item(id,"weapon_knife")
   
    new 
weapon[32]
    new 
csw csw_contant(weapon_picked[0][id])
    
get_weaponname(csw,weapon,31)
    
give_item(id,weapon)
    
cs_set_user_bpammo(id,csw,999)
    
g_PrimaryWeapon[id] = csw

    csw 
csw_contant(weapon_picked[1][id])
    
get_weaponname(csw,weapon,31)
    
give_item(id,weapon)
    
cs_set_user_bpammo(id,csw,999)
}

public 
csw_contant(weapon)
{
    new 
num 29
    
switch(weapon)
    {
        case 
0num 3
        
case 1num 5
        
case 2num 7
        
case 3num 8
        
case 4num 12
        
case 5num 13
        
case 6num 14
        
case 7num 15
        
case 8num 18
        
case 9num 19
        
case 10num 20
        
case 11num 21
        
case 12num 22
        
case 13num 23
        
case 14num 24
        
case 15num 27
        
case 16num 28
        
case 17num 30
        
case 18num 1
        
case 19num 10
        
case 20num 11
        
case 21num 16
        
case 22num 17
        
case 23num 26
        
case 24:
        {
            new 
s_weapon[32]
        
            
get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
           
            new 
flags read_flags(s_weapon)
            do
            {
                
num random_num(0,18)
                if(!(
num flags))
                {
                    
num = -1
                
}
            }
            while(
num==-1)
            
num csw_contant(num)
        }
        case 
25:
        {
            new 
s_weapon[32]

            
get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
        
            new 
flags read_flags(s_weapon)
            do
            {
                
num random_num(18,23)
                if(!(
num flags))
                {
                    
num = -1
                
}
            }
            while(
num==-1)
            
num csw_contant(num)
        }
    }
    return 
num;
}


public 
cmdGuns(id)
{
    if(!
g_isalive[id] || !g_isconnected[id] || !g_CanBuild)
        return 
PLUGIN_HANDLED
    
    
if(!g_ishuman[id])
        return 
PLUGIN_HANDLED    

    ask
[id] = true
    weapon_method_menu
(id)
    return 
PLUGIN_HANDLED
}

public 
ev_Health(id)
{
    
ShowHealth(id);
}

public 
ShowHealth(id)
{
    if (
is_user_alive(id))
    {
        new 
Float:hud_time get_pcvar_float(g_pcvar_healthtime);
        
        
set_hudmessage(255255255, -1.00.90hud_timehud_time0.10.24);
        
show_hudmessage(id"%L"LANG_SERVER"PLAYER_HEALTH"get_user_health(id));
        
        
set_task(hud_time 0.1"ShowHealth"id);
    }
}

Log(const message_fmt[], any:...)
{
    static 
message[256];
    
vformat(messagesizeof(message) - 1message_fmt2);
    
    static 
filename[96];
    static 
dir[64];
    if( !
dir[0] )
    {
        
get_basedir(dirsizeof(dir) - 1);
        
add(dirsizeof(dir) - 1"/logs");
    }
    
    
format_time(filenamesizeof(filename) - 1"%m-%d-%Y");
    
format(filenamesizeof(filename) - 1"%s/BB_ACTIVITY_%s.log"dirfilename);
    
    
log_to_file(filename"%s"message);
}

print_color(target, const message[], any:...)
{
    static 
buffer[512], iargscount
    argscount 
numargs()
    
    
// Send to everyone
    
if (!target)
    {
        static 
player
        
for (player 1player <= g_MaxPlayersplayer++)
        {
            if (!
g_isconnected[player])
                continue;

            static 
changed[5], changedcount
            changedcount 
0

            
for (2argscounti++)
            {
                if (
getarg(i) == LANG_PLAYER)
                {
                    
setarg(i0player)
                    
changed[changedcount] = i
                    changedcount
++
                }
            }
            
vformat(buffercharsmax(buffer), message3)

            
message_begin(MSG_ONE_UNRELIABLEgmsgSayText_player)
            
write_byte(player)
            
write_string(buffer)
            
message_end()
            
            for (
0changedcounti++)
                
setarg(changed[i], 0LANG_PLAYER)
        }
    }
    
// Send to specific target
    
else
    {
        
vformat(buffercharsmax(buffer), message3)

        
message_begin(MSG_ONEgmsgSayText_target)
        
write_byte(target)
        
write_string(buffer)
        
message_end()
    }

lRodri. is offline
Send a message via MSN to lRodri.
rak
Veteran Member
Join Date: Oct 2011
Location: banned country
Old 12-28-2012 , 16:54   Re: [AYUDA] Base Builder
#4

si no me equivoco
PHP Code:
#define FLAGS_LOCK    ADMIN_LEVEL_A|ADMIN_USER 
__________________

www.amxmodx-es.com

Steam: Luchokoldo
rak is offline
Send a message via MSN to rak Send a message via Skype™ to rak
StrikerV2
Senior Member
Join Date: Nov 2012
Location: Chile , O Yes!
Old 12-28-2012 , 17:02   Re: [AYUDA] Base Builder
#5

Proba.
PHP Code:
/*
Base Builder Zombie Mod
By: Tirant
*/

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

// Plugin Version
new VERSION[]="5.4"
new formatmodname[] = "^x01 [^x04 Base Builder^x01 ]"

//Models
new const g_ZombieModel[] = "classic2"

//Sounds
new g_RoundStart[] = "basebuilder/round_start.wav"

#define MAX_PLAYERS 32
#define AMMO_SLOT 376
#define MODELSET_TASK 100
#define MODELCHANGE_DELAY 0.5
#define MAXENTS 1365
#define TASK_ROUND 1023
#define AUTO_TEAM_JOIN_DELAY 0.1
#define TEAM_SELECT_VGUI_MENU_ID 2

#define AFTER_BUILD ADMIN_LEVEL_A
#define DEAD_BUILD ADMIN_LEVEL_B
#define REMOVE_BLOCK ADMIN_LEVEL_C
#define DEAD_REMOVE ADMIN_LEVEL_D
#define PAIN_SHOCK_FREE ADMIN_KICK
#define BAD_SPAWN ADMIN_KICK
#define BUILD_BAN ADMIN_KICK
#define REVIVE ADMIN_KICK
#define SWAP ADMIN_KICK
#define START_ROUND ADMIN_BAN

#if cellbits == 32
    #define OFFSET_BUYZONE 235
#else
    #define OFFSET_BUYZONE 268
#endif

#define LockBlock(%1)     ( entity_set_int( %1, EV_INT_iuser1, 1 ) )
#define UnlockBlock(%1)   ( entity_set_int( %1, EV_INT_iuser1, 0 ) )
#define IsBlockLocked(%1) ( entity_get_int( %1, EV_INT_iuser1 ) == 1 )

// CS Weapon CBase Offsets (win32)
const OFFSET_WEAPONOWNER 41

// Linux diff's
const OFFSET_LINUX_WEAPONS 4

new gmsgStatusText
new gmsgSayText
new gHudSyncInfo
new g_MaxPlayers
const fPainShock 108

new bool:g_CanBuild
new bool:g_ZombiesReleased
new g_RoundNum
new g_iEntBarrier
new bool:g_BuildBan[MAX_PLAYERS+1]
new 
g_pEnt[MAX_PLAYERS+1], g_pDist[MAX_PLAYERS+1]
new 
bool:g_MovingEnt[MAXENTS]
new 
g_EntMover[MAXENTS]
new 
g_LastMover[MAXENTS]
new 
g_EntOwner[MAXENTS]
new 
g_OwnedEnts[33]

//Custom Model Stuff
new Float:g_ModelsTargetTimeFloat:g_RoundStartTime
new g_HasCustomModel[MAX_PLAYERS+1], g_PlayerModel[MAX_PLAYERS+1][32]

new 
g_ModName[32]
new 
g_CurrentWeapon[MAX_PLAYERS+1]
new 
g_PrimaryWeapon[MAX_PLAYERS+1]

// Allowed weapons for zombies
const ZOMBIE_ALLOWED_WEAPONS_BITSUM = (1<<CSW_KNIFE)

new 
g_pcvar_teamg_pcvar_classg_pcvar_buildtimeg_pcvar_zombiehpg_pcvar_maxroundsg_pcvar_basecalc,
    
g_pcvar_givenadesg_pcvar_allowedwepsg_pcvar_tournymodeg_pcvar_showmoversg_pcvar_healthtime,
    
g_pcvar_blockgravg_pcvar_knockbackg_pcvar_entmindistg_pcvar_entsetdistg_pcvar_entmaxdist,
    
g_pcvar_roundnumg_pcvar_roundtimeg_pcvar_resetentg_pcvar_zresptimeg_pcvar_maxclaimable,
    
g_pcvar_claimable
    
new g_friend[MAX_PLAYERS+1]

//Cached Stuff for Players
new g_isconnected[MAX_PLAYERS+1]
new 
g_isalive[MAX_PLAYERS+1
new 
g_ishuman[MAX_PLAYERS+1]
new 
g_iszombie[MAX_PLAYERS+1]

//CSDM-Style Weapons Menu
new bool:firsttime[MAX_PLAYERS+1],bool:ask[MAX_PLAYERS+1]
new 
weapon_picked[2][MAX_PLAYERS+1],cur_offset[MAX_PLAYERS+1],options_on_menu[8][MAX_PLAYERS+1]

new 
count_down

// Weapon entity names
new const WEAPONENTNAMES[][] = { """weapon_p228""""weapon_scout""weapon_hegrenade""weapon_xm1014""weapon_c4""weapon_mac10",
            
"weapon_aug""weapon_smokegrenade""weapon_elite""weapon_fiveseven""weapon_ump45""weapon_sg550",
            
"weapon_galil""weapon_famas""weapon_usp""weapon_glock18""weapon_awp""weapon_mp5navy""weapon_m249",
            
"weapon_m3""weapon_m4a1""weapon_tmp""weapon_g3sg1""weapon_flashbang""weapon_deagle""weapon_sg552",
            
"weapon_ak47""weapon_knife""weapon_p90" }
            
static const 
WEAPONNAMES[24][23] = { "Schmidt Scout""XM1014 M4""Ingram MAC-10""Steyr AUG A1""UMP 45""SG-550 Auto-Sniper",
            
"IMI Galil""Famas""AWP Magnum Sniper""MP5 Navy""M249 Para Machinegun""M3 Super 90""M4A1 Carbine",
            
"Schmidt TMP""G3SG1 Auto-Sniper""SG-552 Commando""AK-47 Kalashnikov""ES P90""P228 Compact",
            
"Dual Elite Berettas""Fiveseven""USP .45 ACP Tactical""Glock 18C""Desert Eagle .50 AE"
}

public 
plugin_init()
{
    
register_plugin("Base Builder Zombie Mod"VERSION"Tirant")
    
register_cvar("base_builder"VERSIONFCVAR_SPONLY|FCVAR_SERVER)
    
set_cvar_string("base_builder"VERSION)
    
    
g_pcvar_buildtime register_cvar("bb_build_time""150")
    
g_pcvar_zombiehp register_cvar("bb_zombie_health""2500")
    
g_pcvar_basecalc register_cvar("bb_calc_maxbase""0")
    
g_pcvar_tournymode register_cvar("bb_tournament_mode""0")
    
g_pcvar_showmovers register_cvar("bb_show_moving""1")
    
g_pcvar_blockgrav register_cvar("bb_block_gravity""0")
    
g_pcvar_knockback register_cvar("bb_pain_shock_free""0")
    
g_pcvar_entmaxdist register_cvar("bb_max_move_dist""960")
    
g_pcvar_entmindist register_cvar("bb_min_move_dist""25")
    
g_pcvar_entsetdist register_cvar("bb_min_dist_set""50")
    
g_pcvar_healthtime register_cvar("bb_health_time""12")
    
g_pcvar_resetent register_cvar("bb_reset_blocks""1")
    
g_pcvar_roundtime register_cvar("bb_roundtime""9")
    
g_pcvar_zresptime register_cvar("bb_zombie_respawn_time""5")
    
g_pcvar_roundnum register_cvar("bb_rounds""4")
    
g_pcvar_maxrounds get_cvar_num("mp_maxrounds")
    
g_pcvar_maxclaimable register_cvar("bb_claim_max""6")
    
g_pcvar_claimable register_cvar("bb_claim_mode""0")
        
    
//AJC for auto team (if needed)
    
g_pcvar_team register_cvar("bb_team""5")
    
g_pcvar_class register_cvar("bb_class""5")
        
    
//Guns Menu
    
g_pcvar_givenades register_cvar("bb_give_nades","h"//h f s, put multiple letters for multiple nades
    
g_pcvar_allowedweps register_cvar("bb_weapons","abcdeghijlmnqrstuvwx")
    
    
//Client Commands
    
register_clcmd("+grab","cmdMoveEnt",_," - Starts moving the selected object")         //command to move stuff around
    
register_clcmd("-grab","cmdStopEnt",_," - Stops moving the selected object")         //command to move stuff around
    
register_clcmd("say /respawn","Respawn_Zombie",_," - Respawn while dead (Zombie)")    //command to respawn (zombies only)
    
register_clcmd("say /fixspawn","cmdBadSpawn",_," - Respawn while dead (Survivor)")    //command to respawn (humans only before buildtime)
    
register_clcmd("say /help","cmdHelp",_," - Displays the help hud")             //command to see /help menu
    
register_clcmd("say /rules","cmdHelp",_," - Displays the help hud")             //command to see /help menu
    
register_clcmd("say /round","cmdCheckRound",_," - Displays the round number")        //command to see the current round number
    
register_clcmd("say round","cmdCheckRound",_," - Displays the round number")        //command to see the current round number
    
    //Guns Menu
    
register_clcmd("say guns","cmdGuns",_," - Opens the guns menu")                 //Guns Menu CMD
    
register_clcmd("say_team guns","cmdGuns",_," - Opens the guns menu")            //Guns Menu CMD
    
register_clcmd("say /guns","cmdGuns",_," - Opens the guns menu")            //Guns Menu CMD
    
register_clcmd("say_team /guns","cmdGuns",_," - Opens the guns menu")            //Guns Menu CMD
    
    //Admin Commands
    
register_concmd("removeaim","cmdRemoveEnt",_," - Deletes an object")             //Removes an object (C alive, D dead)
    
register_concmd("lockaim","cmdLockBlock",_," - Locks/Unlocks an object from moving")    //Once to lock, again to unlock
    
register_concmd("unclaimaim","cmdRemoveClaim",_," - Removes a claim on an object")    //Makes block claimable by everyone
    
register_concmd("say /fixspawns","cmdBadSpawn_Survivor",_," - Respawns all dead CTs")     //Global /fixspawn command (Kick)
    
register_concmd("say /respawns","cmdBadSpawn_Zombie",_," - Respawns all dead Ts")     //Global /respawn command (Kick)
    
register_concmd("bb_buildban","cmdBuildBan",_,"<player>")                 //Bans targeted player from building
    
register_concmd("bb_unbuildban","cmdBuildUnban",_,"<player>")                 //Unbans   "       "     "     "
    
register_concmd("bb_revive","cmdRevive",_,"<player>")                    //revives targetted player
    
register_concmd("bb_swap","cmdSwap",_,"<player>")                    //swaps the selected player to the opposite team
    
register_concmd("bb_startround","cmdStartRound",_," - Ends the build phase")        //do i really have to explain this?
    
    //Blocked Commands
    
register_clcmd("drop""clcmd_drop")
    
register_clcmd("buy""clcmd_buy")
    
    new 
tournymode get_pcvar_num(g_pcvar_tournymode)
    if (
tournymode != 1)
    {
        
register_clcmd("chooseteam""clcmd_changeteam")
        
register_clcmd("jointeam""clcmd_changeteam")
    }
    
    
register_forward(FM_GetGameDescription"fw_GetGameDescription")
    
register_forward(FM_SetClientKeyValue"fw_SetClientKeyValue")
    
register_forward(FM_ClientUserInfoChanged"fw_ClientUserInfoChanged")
    
register_forward(FM_PlayerPreThink"fw_Player_PreThink")
    
register_forward(FM_ClientKill"fw_Suicide")
    
//register_forward(FM_CmdStart, "fw_CmdStart")
    
if (get_pcvar_num(g_pcvar_showmovers) == 1)
        
register_forward(FM_TraceLine"fw_Traceline")
    
    
RegisterHam(Ham_Touch"weapon_shield""ham_WeaponCleaner_Post"1)
    
RegisterHam(Ham_Touch"weaponbox""ham_WeaponCleaner_Post"1)
    
RegisterHam(Ham_Spawn"player""ham_PlayerSpawn_Post"1)
    for (new 
1sizeof WEAPONENTNAMESi++)
        if (
WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_DeployWEAPONENTNAMES[i], "ham_ItemDeploy_Post"1)

    
    
register_message(get_user_msgid("TextMsg"), "msgRoundEnd")
    
register_message(get_user_msgid("StatusIcon"), "msgStatusIcon")
    
register_message(get_user_msgid("StatusValue"), "msgStatusValue");
    if (
tournymode != 1)
    {
        
register_message(get_user_msgid("ShowMenu"), "message_show_menu")
        
register_message(get_user_msgid("VGUIMenu"), "message_vgui_menu")
    }
    
    
register_event("HLTV""event_round_start""a""1=0""2=0")
    
register_event("AmmoX""ev_AmmoX""be""1=1""1=2""1=3""1=4""1=5""1=6""1=7""1=8""1=9""1=10")
    
register_event("StatusValue""ev_SetTeam""be""1=1");
    
register_event("StatusValue""ev_ShowStatus""be""1=2""2!0");
    
register_event("StatusValue""ev_HideStatus""be""1=1""2=0");
    
register_event("Health""ev_Health""be""1>0");
        
    
register_logevent("logevent_round_start",2"1=Round_Start")
    
register_logevent("logevent_round_end"2"1=Round_End")
    
    
register_menucmd(register_menuid("WeaponMethodMenu"),(1<<0)|(1<<1)|(1<<2),"weapon_method_pushed")
    
register_menucmd(register_menuid("PrimaryWeaponSelect"),(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9),"prim_weapons_pushed")
    
register_menucmd(register_menuid("SecWeaponSelect"),(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7),"sec_weapons_pushed")

    
set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
    
    
//Formats the Mod Name
    
formatex(g_ModNamecharsmax(g_ModName), "Base Builder %s"VERSION)
    
    
register_dictionary("basebuilder.txt");
    
    
gmsgSayText get_user_msgid("SayText")
    
gmsgStatusText get_user_msgid("StatusText");
    
gHudSyncInfo CreateHudSyncObj();
    
g_MaxPlayers get_maxplayers()

    if (
tournymode != 1)
    {
        
server_cmd("mp_limitteams 1")
        
server_cmd("mp_autoteambalance 1")
    }
    else
    {
        
server_cmd("mp_limitteams 0")
        
server_cmd("mp_autoteambalance 0")        
    }
    new 
roundnum get_pcvar_num(g_pcvar_roundnum)
    
server_cmd("mp_freezetime 0")
    
server_cmd("mp_flashlight 0")
    
server_cmd("mp_maxrounds %d"roundnum)
    
server_cmd("mp_winlimit %d"roundnum)
    
server_cmd("mp_roundtime %d"get_pcvar_num(g_pcvar_roundtime))
    
    
g_iEntBarrier find_ent_by_tname( -1"barrier" );
}

public 
plugin_precache()
{
    new 
szModel64 ];
    
formatexszModelcharsmaxszModel ), "models/player/%s/%s.mdl"g_ZombieModelg_ZombieModel );
    
engfuncEngFunc_PrecacheModelszModel );
    
    
engfuncEngFunc_PrecacheSoundg_RoundStart )

    new 
ent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_bomb_target"))
    if (
ent
    {
        
dllfunc(DLLFunc_Spawnent)
        
set_pev(entpev_solidSOLID_NOT)
    }
    
    new 
iBuyZone create_entity("info_map_parameters");
    
DispatchKeyValue(iBuyZone"bombradius""0");
    
DispatchKeyValue(iBuyZone"buying""3");
    
DispatchSpawn(iBuyZone);
}

// Event Round Start (This is before freeze time)
public event_round_start()
{
    
g_RoundStartTime get_gametime()
    
g_ZombiesReleased false
    
    
if (get_pcvar_num(g_pcvar_resetent) == 1)
    {
        new 
cname[10], tname[7];
        for (new 
iEnt g_MaxPlayers+1iEnt MAXENTSiEnt++)
        {
            if( 
is_valid_ent(iEnt) )
            {
                
entity_get_string(iEntEV_SZ_classnamecname9);
                
entity_get_string(iEntEV_SZ_targetnametname6);
                if ( !
IsBlockLocked(iEnt) && iEnt != g_iEntBarrier && equal(cname"func_wall") && !equal(tname"ignore"))
                    
engfuncEngFunc_SetOriginiEntFloat:{ 0.00.00.0 } );
            }
        }
    }
}

public 
cmdHelp(id)
{
    
set_hudmessage(255255255, -1.00.4501.015.00.10.22)
    new 
nLenszHelp[512]
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"WELCOME_MSG"VERSION);
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"BIND_KEY");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE1");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE2");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE3");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE4");
    
nLen += formatszHelp[nLen], 511-nLen"%L"LANG_SERVER"RULE5");
    
show_hudmessage(idszHelp);
}

// Log Event Round Start (This is AFTER freeze time)
public logevent_round_start()
{
    
set_pev(g_iEntBarrier,pev_solid,SOLID_BSP)
    
set_pev(g_iEntBarrier,pev_rendermode,1)
    
DispatchKeyValue(g_iEntBarrier"renderamt""255");
    
    
set_hudmessage(255255255, -1.00.4501.010.00.10.21)
    new 
nLenszMsg[128]
    
nLen += formatszMsg[nLen], 127-nLen"%L"LANG_SERVER"WELCOME_MSG"VERSION);
    
nLen += formatszMsg[nLen], 127-nLen"%L"LANG_SERVER"BIND_KEY");
    
show_hudmessage(0szMsg);
    
    
print_color(0"%s %s ^x04- ^x01%L"formatmodnameVERSIONLANG_SERVER"ROUND_MSG")
    
print_color(0"%s Round: %d of %d"formatmodname, (g_RoundNum+1), g_pcvar_maxrounds)
    
    
remove_task(TASK_ROUND)
    
remove_task(30000)
    
    new 
iBuildTime get_pcvar_numg_pcvar_buildtime );
    
set_task(1.0"CountDown"30000""0"a"iBuildTime);
    
count_down = (iBuildTime-1);
    
set_task(float(iBuildTime), "Release_Zombies"TASK_ROUND)
    
    if (
get_pcvar_num(g_pcvar_basecalc) == 1)
        
set_task(5.0"Base_Calc")
        
    
set_task(5.0"Fix_Spawns")
    
    
g_CanBuild true

    arrayset
(g_MovingEntfalseMAXENTS)
    
arrayset(g_EntOwner0MAXENTS)
    
arrayset(g_OwnedEnts0g_MaxPlayers+1)
}

public 
CountDown()
{
    
set_hudmessage(255255255, -1.00.000.10.90.10.23)
    
show_hudmessage(0"%L"LANG_SERVER"BUILD_TIME"count_down--);
    
    if (
count_down 0)
    {
        
remove_task(30000);
    }
}

//Resets stuff and swaps teams so they respawn correctly
public logevent_round_end()
{
    if (!
g_CanBuild && get_pcvar_num(g_pcvar_tournymode) != 1)
    {
        new 
players[32], num
        get_players
(playersnum)
        
        new 
player
        
for (new 0numi++)
        {
            
player players[i]
            
cs_set_user_team(playercs_get_user_team(player) == CS_TEAM_T CS_TEAM_CT:CS_TEAM_T)
            
            if (
cs_get_user_team(player) == CS_TEAM_T)
            {
                
g_iszombie[player] = true
                g_ishuman
[player] = false
            
}
            if (
cs_get_user_team(player) == CS_TEAM_CT)
            {
                
g_ishuman[player] = true
                g_iszombie
[player] = false
            
}
        }
        
print_color(0"^x04%L"LANG_SERVER"TEAMS_SWAPPED")
    }
    
    
remove_task(TASK_ROUND)
    
remove_task(30000)
        
    return 
PLUGIN_HANDLED
}

//Death events for respanws and HUD information
public client_death(g_attackerg_victimwpnindexhitplaceTK)
{
    
cmdStopEnt(g_victim)
    
    
set_hudmessage(__________4);
    
show_hudmessage(g_victim"");
    
    
g_isalive[g_victim] = false
    
    
if (g_iszombie[g_victim])
    {
        
set_hudmessage(255255255, -1.00.4501.010.00.10.21)
        
show_hudmessage(g_victim"%L"LANG_SERVER"DEAD_ZOMBIE"get_pcvar_num(g_pcvar_zresptime));
        
set_task(get_pcvar_float(g_pcvar_zresptime), "Respawn_Zombie"g_victim)
    }
    if (
g_ishuman[g_victim])
    {
        
set_hudmessage(255255255, -1.00.4501.010.00.10.21)
        
show_hudmessage(g_victim"%L"LANG_SERVER"DEAD_SURVIVOR");
    }
}

public 
ham_TakeDamage_Post(victiminflictorattackerFloat:damagebits)
{
    if(
get_pcvar_num(g_pcvar_knockback) == && access(victimPAIN_SHOCK_FREE) && g_iszombie[victim])
    {
        
set_pdata_float(victimfPainShock1.05)
    }
}

public 
client_disconnect(id)
{
    
cmdStopEnt(id)

    
g_isconnected[id] = false
    g_isalive
[id] = false
    g_ishuman
[id] = false
    g_iszombie
[id] = false

    
return PLUGIN_CONTINUE
}

//Respawns late joiners, cts only if build time is still on
public client_putinserver(id)
{
    
set_task(7.0,"Respawn_Human",id);
    
g_isconnected[id] = true
    firsttime
[id] = true
    ask
[id] = true
}

public 
Release_Zombies()
{
    
g_CanBuild false
    g_ZombiesReleased 
true
    remove_task
(30000);
    
    new 
players[32], num
    get_players
(playersnum)

    new 
player
    
for(new 0numi++)
    {
        
player players[i]
        if (
g_isalive[player])
        {
            if (
get_user_godmode(player))
                
set_user_godmode(player0)
            if (
g_ishuman[player])
            {
                
cmdStopEnt(player)

                new 
weapon[32]
                
get_pcvar_string(g_pcvar_givenades,weapon,31)
            
                new 
heflashsmoke
                
for(new i=0;i<strlen(weapon);i++)
                {
                    switch(
weapon[i])
                    {
                        case 
'h'he++
                        case 
'f'flash++
                        case 
's'smoke++
                    }
                }
                if(
hegive_item(player,"weapon_hegrenade"), cs_set_user_bpammo(player,CSW_HEGRENADE,he)
                if(
flashgive_item(player,"weapon_flashbang"), cs_set_user_bpammo(player,CSW_FLASHBANG,flash)
                if(
smokegive_item(player,"weapon_smokegrenade"), cs_set_user_bpammo(player,CSW_SMOKEGRENADE,smoke)
                
                if (
g_PrimaryWeapon[player])
                {
                    
get_weaponname(g_PrimaryWeapon[player],weapon,31)
                    
engclient_cmd(playerweapon);
                }
            }
        }
    }
            
    
set_pev(g_iEntBarrier,pev_solid,SOLID_NOT)
    
DispatchKeyValue(g_iEntBarrier"renderamt""0");
    
    
g_RoundNum++
    
set_hudmessage(255255255, -1.00.4501.010.00.10.21)
    
show_hudmessage(0"%L"LANG_SERVER"RELEASE_MSG");
    
client_cmd(0"spk %s"g_RoundStart)
}

//Called on zombie death function
public Respawn_Zombie(id)
{
    if (
g_isconnected[id] && cs_get_user_team(id) == CS_TEAM_T)
    {
        if (
get_user_health(id) == get_pcvar_float(g_pcvar_zombiehp) || !is_user_alive(id))
            
ExecuteHamB(Ham_CS_RoundRespawnid)
        else
            
client_print(idprint_center"%L"LANG_SERVER"FAIL_RESPAWN");
    }
}

//Called on all players for late joiners, parent is above
public Respawn_Human(id)
{
    if (!
g_isconnected[id] || g_isalive[id] || cs_get_user_team(id) == CS_TEAM_SPECTATOR || cs_get_user_team(id) == CS_TEAM_UNASSIGNED)
        return 
PLUGIN_HANDLED
        
    
if (!g_isalive[id] && g_iszombie[id])
        
ExecuteHamB(Ham_CS_RoundRespawnid)
                
    if (!
g_isalive[id] && g_iszombie[id])
        
set_task(3.0,"Respawn_Human",id)
            
    if (
g_CanBuild)
    {
        if (!
g_isalive[id])
            
ExecuteHamB(Ham_CS_RoundRespawnid)
                
        if (!
g_isalive[id])
            
set_task(3.0,"Respawn_Human",id)
    }
    return 
PLUGIN_HANDLED
}

//Sets player health and weapons
public Add_Effects(id)
{
    if (!
g_isconnected[id] || !g_isalive[id])
        return 
PLUGIN_HANDLED
    
    strip_user_weapons
(id)
    
give_item(id"weapon_knife")
    
    if (
cs_get_user_team(id) == CS_TEAM_T)
    {
        if (
g_CanBuild)
            
set_user_godmode(id1)

        
set_pev(idpev_healthget_pcvar_float(g_pcvar_zombiehp)) // use decimal number
    
}
    if (
cs_get_user_team(id) == CS_TEAM_CT)
    {
        
weapon_method_menu(id)
    }
    
ShowHealth(id)
    return 
PLUGIN_HANDLED
}

//AmmoX Ensures BackPack ammo is always full
public ev_AmmoX(id)
{
    
set_pdata_int(idAMMO_SLOT read_data(1), 2005)


public 
fw_GetGameDescription()
{
    
forward_return(FMV_STRINGg_ModName)
    
    return 
FMRES_SUPERCEDE;
}

public 
ham_PlayerSpawn_Post(id)
{
    if (!
is_user_alive(id) || !cs_get_user_team(id))
        return
        
    
set_task(1.0"Add_Effects"id)
    if (
cs_get_user_team(id) == CS_TEAM_CT)
    {
        
g_ishuman[id] = true
        g_iszombie
[id] = false
    
}
    if (
cs_get_user_team(id) == CS_TEAM_T)
    {
        
g_iszombie[id] = true
        g_ishuman
[id] = false
    
}
        
    
g_isalive[id] = true
    remove_task
(id MODELSET_TASK)
    if (
g_iszombie[id])
    {
        
copy(g_PlayerModel[id], charsmax(g_PlayerModel[]), g_ZombieModel)
        new 
currentmodel[32]
        
fm_get_user_model(idcurrentmodelcharsmax(currentmodel))
        if (!
equal(currentmodelg_PlayerModel[id]))
        {
            if (
get_gametime() - g_RoundStartTime 5.0)
                
set_task(5.0 MODELCHANGE_DELAY"fm_user_model_update"id MODELSET_TASK)
            else
                
fm_user_model_update(id MODELSET_TASK)
        }
    }
    else if (
g_HasCustomModel[id])
    {
        
fm_reset_user_model(id)
    }
}

public 
fw_SetClientKeyValue(id, const infobuffer[], const key[])
{   
    if (
g_HasCustomModel[id] && equal(key"model"))
        return 
FMRES_SUPERCEDE
    
return FMRES_IGNORED
}

public 
fw_ClientUserInfoChanged(id)
{
    if (!
g_HasCustomModel[id])
        return 
FMRES_IGNORED
    
static currentmodel[32]
    
fm_get_user_model(idcurrentmodelcharsmax(currentmodel))
    if (!
equal(currentmodelg_PlayerModel[id]) && !task_exists(id MODELSET_TASK))
        
fm_set_user_model(id MODELSET_TASK)
    return 
FMRES_IGNORED
}

public 
fm_user_model_update(taskid)
{
    static 
Float:current_time
    current_time 
get_gametime()
    
    if (
current_time g_ModelsTargetTime >= MODELCHANGE_DELAY)
    {
        
fm_set_user_model(taskid)
        
g_ModelsTargetTime current_time
    
}
    else
    {
        
set_task((g_ModelsTargetTime MODELCHANGE_DELAY) - current_time"fm_set_user_model"taskid)
        
g_ModelsTargetTime g_ModelsTargetTime MODELCHANGE_DELAY
    
}
}

public 
fm_set_user_model(player)
{
    
player -= MODELSET_TASK
    engfunc
(EngFunc_SetClientKeyValueplayerengfunc(EngFunc_GetInfoKeyBufferplayer), "model"g_PlayerModel[player])
    
g_HasCustomModel[player] = true
}

stock fm_get_user_model(playermodel[], len)
{
    
engfunc(EngFunc_InfoKeyValueengfunc(EngFunc_GetInfoKeyBufferplayer), "model"modellen)
}

stock fm_reset_user_model(player)
{
    
g_HasCustomModel[player] = false
    dllfunc
(DLLFunc_ClientUserInfoChangedplayerengfunc(EngFunc_GetInfoKeyBufferplayer))
}

public 
cmdMoveEnt(id)
{
    if (
g_BuildBan[id] == true)
        return 
PLUGIN_HANDLED
    
    
if (g_iszombie[id] && !access(idAFTER_BUILD))
              return 
PLUGIN_HANDLED 
            
    
if (!g_CanBuild && !access(idAFTER_BUILD))
    {
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_TIME_UP")
        return 
PLUGIN_HANDLED 
    
}
    
    if (!
g_isalive[id] && !access(idDEAD_BUILD))
    {
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_DEAD")
        return 
PLUGIN_HANDLED 
    
}

    if (
g_pEnt[id] && is_valid_ent(g_pEnt[id])) 
        
cmdStopEnt(id)
    
    new 
entbodypart
    get_user_aiming 
(id,ent,bodypart)
    
    if (!
is_valid_ent(ent) || ent == g_iEntBarrier)
    {
        return 
PLUGIN_HANDLED
    
}
    
    if (
ent <= g_MaxPlayers && g_isalive[ent])
    {    
        return 
PLUGIN_HANDLED
    
}
        
    if (
IsBlockLocked(ent) || g_MovingEnt[ent])
    {
        return 
PLUGIN_HANDLED
    
}

    if (
get_pcvar_num(g_pcvar_claimable) == 1)
    {
        if (!
g_EntOwner[ent])
        {
            if ((
g_OwnedEnts[id]<get_pcvar_num(g_pcvar_maxclaimable)) || get_pcvar_num(g_pcvar_maxclaimable) == 0)
            {
                
g_EntOwner[ent] = id
                g_OwnedEnts
[id]++
            }
            else
            {
                
client_print (idprint_center"%L"LANG_SERVER"FAIL_MAXOWNED"get_pcvar_num(g_pcvar_maxclaimable))
                
//return PLUGIN_HANDLED 
            
}
        }
        else if (
g_EntOwner[ent] != id && !access(idAFTER_BUILD))
        {
            
client_print (idprint_center"%L"LANG_SERVER"FAIL_ALREADYOWNED")
            return 
PLUGIN_HANDLED 
        
}
    }
    
    new 
tname[7], cname[10];
    
entity_get_string(entEV_SZ_targetnametname6);
    
entity_get_string(entEV_SZ_classnamecname9);
    if (!
equal(cname"func_wall") || equal(tname"ignore"))
    {
        return 
PLUGIN_HANDLED
    
}
    
    new 
origin[3], entOrigin[3], Float:orig[3], Float:mins[3], Float:maxs[3], dist
    
    entity_get_vector
(entEV_VEC_originorig);
    
entity_get_vector(entEV_VEC_minsmins);
    
entity_get_vector(entEV_VEC_maxsmaxs);

    
entOrigin[0] = floatround((mins[0] + maxs[0]) / orig[0]);
    
entOrigin[1] = floatround((mins[1] + maxs[1]) / orig[1]);
    
entOrigin[2] = floatround((mins[2] + maxs[2]) / orig[2]);
    
    
get_user_origin(idorigin);

    
dist get_distance(originentOrigin);
    
    new 
max get_pcvar_num(g_pcvar_entmaxdist)
    new 
min get_pcvar_num(g_pcvar_entmindist)
    if (
min//min
    
{
        if(
dist min//minimum
            
dist get_pcvar_num(g_pcvar_entsetdist);
    }

    if (
max//maximum
    
{
        if (
dist max)
            return 
PLUGIN_HANDLED
    
}
    
    
DispatchKeyValue(ent"rendermode""1");
    
DispatchKeyValue(ent"renderamt""100");
    
DispatchKeyValue(ent"rendercolor""255.0 0.0 0.0");

    
g_MovingEnt[ent] = true
    g_EntMover
[ent] = id
    g_pEnt
[id] = ent
    g_pDist
[id] = dist
    
    
if (!g_CanBuild && access(idAFTER_BUILD))
    {
        new 
adminauthid[35],adminname[35]
        
get_user_authid (id,adminauthid,34)
        
get_user_name(id,adminname,34)
        
Log("[MOVE] Admin: %s || SteamID: %s moved an entity"adminnameadminauthid)
    }
    
    return 
PLUGIN_HANDLED
}

/*public fw_CmdStart(id, uc, random)
{
    new buttons = get_uc(uc, UC_Buttons)
    if(g_CanBuild && (buttons & IN_ATTACK))
    {
        buttons &= ~IN_ATTACK
        set_uc(uc, UC_Buttons, buttons)
        return FMRES_SUPERCEDE
    }
    return FMRES_IGNORED
}*/

public fw_Player_PreThink(id)
{
    if (!
g_pEnt[id] || !is_valid_ent(g_pEnt[id]))
        return 
FMRES_HANDLED
    
    
new buttons pev(idpev_button)
    if(
buttons IN_ATTACK)
    {
        
g_pDist[id] += 3;
        
        if (
g_pDist[id] > get_pcvar_num(g_pcvar_entmaxdist))
        {
            
g_pDist[id] = get_pcvar_num(g_pcvar_entmaxdist)
            
client_print(idprint_center"%L"LANG_SERVER"OBJECT_MAX")
        }
        else
            
client_print(idprint_center"%L"LANG_SERVER"OBJECT_PUSH")
    }
    else if(
buttons IN_ATTACK2)
    {
        
g_pDist[id] -= 3;
            
        if (
g_pDist[id] < get_pcvar_num(g_pcvar_entsetdist))
        {
            
g_pDist[id] = get_pcvar_num(g_pcvar_entsetdist)
            
client_print(idprint_center"%L"LANG_SERVER"OBJECT_MIN")
        }
        else
            
client_print(idprint_center"%L"LANG_SERVER"OBJECT_PULL")
    }
    
    
GrabThink(id)
    
    return 
FMRES_HANDLED
}

public 
GrabThink(id)
{
    new 
Float:aiming[3], origin[3], Float:mins[3], Float:maxs[3], Float:neworigin[3], ent
    
    ent 
g_pEnt[id]

    if (!
g_isconnected[id] || (ent <= g_MaxPlayers)? !g_isconnected[id]:!is_valid_ent(ent))
    {
        
cmdStopEnt(id)
        return 
PLUGIN_HANDLED
    
}
    
    
entity_get_vector(entEV_VEC_minsmins);
    
entity_get_vector(entEV_VEC_maxsmaxs);
    
    
get_user_origin(idorigin3);
    
IVecFVec(originaiming);
    
get_user_origin(idorigin);
    
    
aiming[0] -= float(origin[0]);
    
aiming[1] -= float(origin[1]);
    
aiming[2] -= float(origin[2]);

    new 
Float:scalar float(g_pDist[id]) / vector_length(aiming);

    
origin[0] += floatround(aiming[0] * scalar - (mins[0] + maxs[0]) / 2);
    
origin[1] += floatround(aiming[1] * scalar - (mins[1] + maxs[1]) / 2);
    
origin[2] += floatround(aiming[2] * scalar - (mins[2] + maxs[2]) / 2);
    
    
IVecFVec(originneworigin);
    
entity_set_origin(entneworigin);
    
    return 
PLUGIN_CONTINUE
}

public 
cmdStopEnt(id)
{
    
g_MovingEnt[g_pEnt[id]] = false
    DispatchKeyValue
(g_pEnt[id], "rendermode""0");
    
DispatchKeyValue(g_pEnt[id], "renderamt""255");
    
DispatchKeyValue(g_pEnt[id], "rendercolor""0.0 0.0 0.0");
    if (
get_pcvar_num(g_pcvar_blockgrav) == 1)
        
drop_to_floor(g_pEnt[id])
    
g_EntMover[g_pEnt[id]] = 0
    g_LastMover
[g_pEnt[id]] = id
    g_pEnt
[id] = 0
}

public 
fw_Traceline(Float:start[3], Float:end[3], conditionsidtrace)
{
    if (!
is_user_connected(id)) return PLUGIN_HANDLED
    
    
new ent get_tr2(traceTR_pHit)
    
    if (
pev_valid(ent))
    {
        new 
ent,body
        get_user_aiming
(id,ent,body)
        
        new 
cname[10], tname[7];
        
entity_get_string(entEV_SZ_classnamecname9);
        
entity_get_string(entEV_SZ_targetnametname6);
        if (
equal(cname"func_wall") && !equal(tname"ignore") && ent != g_iEntBarrier && get_pcvar_num(g_pcvar_showmovers) == 1)
        {
            if (
g_CanBuild || access(idADMIN_KICK))
            {
                if (
IsBlockLocked(ent))
                {
                    
set_hudmessage(25500, -1.00.5510.013.00.010.01);
                    
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_LOCKED");
                    return 
PLUGIN_HANDLED
                
}
                
set_hudmessage(050255, -1.00.5510.013.00.010.01);
                if (
get_pcvar_num(g_pcvar_claimable) == 0)
                {
                    new 
currentmover[35], lastmover[35]
                    if (
g_EntMover[ent])
                    {
                        
get_user_name(g_EntMover[ent],currentmover,34)
                        if (!
g_LastMover[ent]) ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_INFO1"currentmover);
                    }
                    if (
g_LastMover[ent])
                    {
                        
get_user_name(g_LastMover[ent],lastmover,34)
                        if (!
g_EntMover[ent]) ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_INFO2"lastmover);
                    }
                    if (
g_LastMover[ent] && g_EntMover[ent]) ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_INFO3"currentmoverlastmover);
                    else if (!
g_LastMover[ent] && !g_EntMover[ent]) ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_INFO4");
                }
                else
                {
                    if (
g_EntOwner[ent])
                    {
                        new 
entowner[35]
                        
get_user_name(g_EntOwner[ent],entowner,34)
                        
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_OWNER"entowner);
                    }
                    else 
                    {
                        
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"OBJECT_OWNER_NONE");
                    }
                }
            }
        }
    }
    if (!
pev_valid(ent)) ClearSyncHud(idgHudSyncInfo);
    
    return 
PLUGIN_HANDLED
}

public 
cmdLockBlock(id)
{
    new 
entbodypart
    get_user_aiming 
(id,ent,bodypart)
    
    new 
tname[7], cname[10];
    
entity_get_string(entEV_SZ_targetnametname6);
    
entity_get_string(entEV_SZ_classnamecname9);

    if (!
ent || !is_valid_ent(ent) || is_user_alive(ent) || ent == g_iEntBarrier || !equal(cname"func_wall") || equal(tname"ignore")) return PLUGIN_HANDLED
    
    
if (!IsBlockLocked(ent) && !g_MovingEnt[ent])
    {
        
LockBlock(ent)
        
DispatchKeyValue(ent"rendermode""1");
        
DispatchKeyValue(ent"rendercolor""125.0 0.0 0.0");
        
        
g_OwnedEnts[g_EntOwner[ent]]--
        
g_EntOwner[ent] = 0
    
}
    else if (
IsBlockLocked(ent))
    {
        
UnlockBlock(ent)
        
DispatchKeyValue(ent"rendermode""0");
    }
    return 
PLUGIN_HANDLED
}

public 
cmdRemoveClaim(id)
{
    new 
entbodypart
    get_user_aiming 
(id,ent,bodypart)
    
    new 
tname[7], cname[10];
    
entity_get_string(entEV_SZ_targetnametname6);
    
entity_get_string(entEV_SZ_classnamecname9);

    if (!
ent || !is_valid_ent(ent) || is_user_alive(ent) || ent == g_iEntBarrier || !equal(cname"func_wall") || equal(tname"ignore") || IsBlockLocked(ent)) return PLUGIN_HANDLED

    g_OwnedEnts
[g_EntOwner[ent]]--
    
g_EntOwner[ent] = 0
    
    
return PLUGIN_HANDLED
}

public 
cmdRemoveEnt(id)
{
    if (!
access(idREMOVE_BLOCK))
              return 
PLUGIN_HANDLED 

    
if (!g_isalive[id] && !access(idDEAD_REMOVE))
    {
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_REMOVE")
        return 
PLUGIN_HANDLED 
    
}
          
    new 
entbodypart
    get_user_aiming 
(id,ent,bodypart)
    
    if(!
is_valid_ent(ent) || ent == g_iEntBarrier || (ent <= g_MaxPlayers && g_isalive[ent]))
        return 
PLUGIN_HANDLED
    
    
if(IsBlockLocked(ent) || g_MovingEnt[ent])
        return 
PLUGIN_HANDLED

    
new tname[7], cname[10];
    
entity_get_string(entEV_SZ_targetnametname6);
    
entity_get_string(entEV_SZ_classnamecname9);
    if(!
equal(cname"func_wall"))
        return 
PLUGIN_HANDLED
    
    
if(equal(tname"ignore"))
        return 
PLUGIN_HANDLED
        
    g_OwnedEnts
[g_EntOwner[ent]]--
    
g_EntOwner[ent] = 0
    
    remove_entity
(ent)
    
    new 
adminauthid[35],adminname[35]
    
get_user_authid (id,adminauthid,34)
    
get_user_name(id,adminname,34)
    
Log("[REMOVE] Admin: %s || SteamID: %s removed an entity"adminnameadminauthid)
    
    return 
PLUGIN_HANDLED
}

// Ham Weapon Deploy Forward (forces knife only)
public ham_ItemDeploy_Post(weapon_ent)
{
    static 
owner
    owner 
get_pdata_cbase(weapon_entOFFSET_WEAPONOWNEROFFSET_LINUX_WEAPONS);
    
    static 
weaponid
    weaponid 
cs_get_weapon_id(weapon_ent)
    
    
g_CurrentWeapon[owner] = weaponid
    
    
if (g_iszombie[owner] && !((1<<weaponid) & ZOMBIE_ALLOWED_WEAPONS_BITSUM))
    {
        
g_CurrentWeapon[owner] = CSW_KNIFE
        engclient_cmd
(owner"weapon_knife")
    }
    else if (
g_CanBuild && g_ishuman[owner])
    {
        
g_CurrentWeapon[owner] = CSW_KNIFE
        engclient_cmd
(owner"weapon_knife")
        
client_print(ownerprint_center"%L"LANG_SERVER"FAIL_KNIFE_ONLY");
    }
}

public 
msgRoundEnd(const MsgId, const MsgDest, const MsgEntity)
{
    static 
Message[192]
    
get_msg_arg_string(2Message191)
    
    
set_hudmessage(255255255, -1.00.4006.06.00.10.21)
    
    if(
equal(Message"#Game_bomb_drop"))
        return 
PLUGIN_HANDLED
    
    
if (equal(Message"#Terrorists_Win"))
    {
        
show_hudmessage(0"Zombies Win!")
        
set_msg_arg_string(2"")
        switch (
random_num(14))
        {
            case 
1client_cmd(0"spk ambience/the_horror1.wav")
            case 
2client_cmd(0"spk ambience/the_horror2.wav")
            case 
3client_cmd(0"spk ambience/the_horror3.wav")
            case 
4client_cmd(0"spk ambience/the_horror4.wav")
        }
        return 
PLUGIN_HANDLED
    
}
    else if (
equal(Message"#Target_Saved") || equal(Message"#CTs_Win"))
    {
        
show_hudmessage(0"Builders Win!")
        
set_msg_arg_string(2"")
        switch (
random_num(13))
        {
            case 
1client_cmd(0"spk barney/ba_another.wav")
            case 
2client_cmd(0"spk barney/ba_firepl.wav")
            case 
3client_cmd(0"spk barney/ba_seethat.wav")
        }
        return 
PLUGIN_HANDLED
    
}
    return 
PLUGIN_HANDLED
}

public 
ham_WeaponCleaner_Post(iEntity)
{
    
call_think(iEntity)
}

public 
message_show_menu(msgiddestid
{
    if (!
should_autojoin(id))
        return 
PLUGIN_CONTINUE

    
static team_select[] = "#Team_Select"
    
static menu_text_code[sizeof team_select]
    
get_msg_arg_string(4menu_text_codesizeof menu_text_code 1)
    if (!
equal(menu_text_codeteam_select))
        return 
PLUGIN_CONTINUE

    set_force_team_join_task
(idmsgid)

    return 
PLUGIN_HANDLED
}

public 
message_vgui_menu(msgiddestid
{
    if (
get_msg_arg_int(1) != TEAM_SELECT_VGUI_MENU_ID || !should_autojoin(id))
        return 
PLUGIN_CONTINUE
        
    set_force_team_join_task
(idmsgid)

    return 
PLUGIN_HANDLED
}

bool:should_autojoin(id
{
    return (!
get_user_team(id))
}

set_force_team_join_task(idmenu_msgid
{
    static 
param_menu_msgid[2]
    
param_menu_msgid[0] = menu_msgid
    set_task
(AUTO_TEAM_JOIN_DELAY"task_force_team_join"idparam_menu_msgidsizeof param_menu_msgid)
}

public 
task_force_team_join(menu_msgid[], id
{
    if (
get_user_team(id))
        return

    static 
team[2], class[2]
    
get_pcvar_string(g_pcvar_teamteamsizeof team 1)
    
get_pcvar_string(g_pcvar_class, class, sizeof class - 1)
    
force_team_join(idmenu_msgid[0], team, class)
}

stock force_team_join(idmenu_msgid/* const */ team[] = "5"/* const */ class[] = "0"
{
    static 
jointeam[] = "jointeam"
    
if (class[0] == '0') {
        
engclient_cmd(idjointeamteam)
        return
    }

    static 
msg_blockjoinclass[] = "joinclass"
    
msg_block get_msg_block(menu_msgid)
    
set_msg_block(menu_msgidBLOCK_SET)
    
engclient_cmd(idjointeamteam)
    
engclient_cmd(idjoinclass, class)
    
set_msg_block(menu_msgidmsg_block)
}

public 
clcmd_changeteam(id)
{
    if (
g_CanBuild
        
weapon_method_menu(id)
    else 
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_WEAPONS")
    
    if (
g_iszombie[id])
        
client_print (idprint_center"%L"LANG_SERVER"FAIL_ZOMBIE")
        
    return 
PLUGIN_HANDLED
}

public 
clcmd_drop(id)
{
    
client_print (idprint_center"%L"LANG_SERVER"FAIL_DROP")
    return 
PLUGIN_HANDLED
}

public 
clcmd_buy(id)
{
    
client_print (idprint_center"%L"LANG_SERVER"FAIL_BUY")
    return 
PLUGIN_HANDLED
}

public 
fw_Suicide(id)
{
    
client_print (idprint_center"%L"LANG_SERVER"FAIL_SUICIDE")
    
console_print (id"%L"LANG_SERVER"FAIL_SUICIDE")
    return 
FMRES_SUPERCEDE;
}

public 
Base_Calc()
{
    new 
players[32], numctbasenum
    get_players
(playersnum)
    new 
player
    
for(new 0numi++)
    {
        
player players[i]
        if (
cs_get_user_team(player) == CS_TEAM_CT)
            
ct++

        if (
ct 6)
            
basenum 2
        
else
            
basenum = (ct/3)
    }
    
print_color(0"%s %L"formatmodnameLANG_SERVER"BASE_CALC"basenum)
}

public 
cmdBadSpawn_Survivor(id)
{
    if (
access(idBAD_SPAWN))
    {
        new 
players[32], num
        get_players
(playersnum)
            
        new 
player
        
for(new 0numi++)
        {
            
player players[i]
            if (
cs_get_user_team(player) == CS_TEAM_CT && !is_user_alive(player) && g_isconnected[player] && g_CanBuild)
                
ExecuteHamB(Ham_CS_RoundRespawnplayer)
        }
    }
}

public 
Fix_Spawns()
{
    new 
players[32], num
    get_players
(playersnum)
            
    new 
player
    
for(new 0numi++)
    {
        
player players[i]
        if (
cs_get_user_team(player) == CS_TEAM_CT && !is_user_alive(player) && g_isconnected[player] && g_CanBuild)
            
ExecuteHamB(Ham_CS_RoundRespawnplayer)
    }
}

public 
cmdBadSpawn(id)
{
    if (
g_isconnected[id] && g_ishuman[id] && g_CanBuild)
        
ExecuteHamB(Ham_CS_RoundRespawnid)
}

public 
cmdBadSpawn_Zombie(id)
{
    if (
access(idBAD_SPAWN))
    {
        new 
players[32], num
        get_players
(playersnum)
            
        new 
player
        
for(new 0numi++)
        {
            
player players[i]
            if (
cs_get_user_team(player) == CS_TEAM_T && !is_user_alive(player) && g_isconnected[player])
                
ExecuteHamB(Ham_CS_RoundRespawnplayer)
        }
    }
}

public 
msgStatusIcon(const iMsgId, const iMsgDest, const iPlayer)
{
    if(
is_user_alive(iPlayer)) 
    {
        static 
szMsg[8]
        
get_msg_arg_string(2szMsg7)
    
        if(
equal(szMsg"buyzone"))
        {
            
set_pdata_int(iPlayerOFFSET_BUYZONEget_pdata_int(iPlayerOFFSET_BUYZONE) & ~(1<<0))
            return 
PLUGIN_HANDLED
        
}
    }
    return 
PLUGIN_CONTINUE
}

public 
cmdBuildBan(id)
{
    if (
access(idBUILD_BAN))
    {
        new 
arg[32]
        
read_argv(1arg31)
        new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY)
        
g_BuildBan[player] = true
        cmdStopEnt
(player)
        
        new 
adminauthid[35],adminname[35],playername[35],playerauthid[35]
        
get_user_name(id,adminname,34)
        
get_user_authid (id,adminauthid,34)
        
get_user_name(playerplayername34)
        
get_user_authid (player,playerauthid,34)
        
Log("[MOVE] Admin: %s || SteamID: %s banned Player: %s || SteamID: %s from building"adminnameadminauthidplayernameplayerauthid)
        
        
client_print(idprint_console"%L"LANG_SERVER"BUILD_BAN1"playername)
        
client_print(playerprint_center"%L"LANG_SERVER"BUILD_BAN2")
    }
}

public 
cmdBuildUnban(id)
{
    if (
access(idBUILD_BAN))
    {
        new 
arg[32], playername[35]
    
        
read_argv(1arg31)
        new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY)
        
get_user_name(playerplayername34)
        
client_print(idprint_console"%L"LANG_SERVER"UNBUILD_BAN1"playername)
        
g_BuildBan[player] = false
        print_color
(player"%s %L"formatmodnameLANG_SERVER"UNBUILD_BAN2")
    }
}

public 
cmdRevive(id)
{
    if (
access(idREVIVE))
    {
        new 
arg[32]
        
read_argv(1arg31)
        new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY)

        if (
is_user_alive(player))
        {
            
client_print(idprint_console"%L"LANG_SERVER"FAIL_REVIVE")
            return 
PLUGIN_HANDLED
        
}
        
        
ExecuteHamB(Ham_CS_RoundRespawnplayer)
        
        new 
adminauthid[35],adminname[35],playername[35],playerauthid[35]
        
get_user_name(id,adminname,34)
        
get_user_authid (id,adminauthid,34)
        
get_user_name(playerplayername34)
        
get_user_authid (player,playerauthid,34)
        
Log("[REVIVE] Admin: %s || SteamID: %s revived Player: %s || SteamID: %s"adminnameadminauthidplayernameplayerauthid)
        
        
client_print(idprint_console"%L"LANG_SERVER"REVIVE1"playername)
        
client_print(playerprint_center"%L"LANG_SERVER"REVIVE2")
    }
    return 
PLUGIN_HANDLED
}

public 
cmdSwap(id)
{
    if (
access(idSWAP))
    {
        new 
arg[32]
        
read_argv(1arg31)
        new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY)

        if (!
is_user_connected(player)) return PLUGIN_HANDLED
        
        cs_set_user_team
(playercs_get_user_team(player) == CS_TEAM_T CS_TEAM_CT:CS_TEAM_T)
            
        if (
cs_get_user_team(player) == CS_TEAM_T)
        {
            
g_iszombie[player] = true
            g_ishuman
[player] = false
        
}
        if (
cs_get_user_team(player) == CS_TEAM_CT)
        {
            
g_ishuman[player] = true
            g_iszombie
[player] = false
        
}
        
        if (
is_user_alive(player))
            
ExecuteHamB(Ham_CS_RoundRespawnplayer)
        
        new 
adminauthid[35],adminname[35],playername[35],playerauthid[35]
        
get_user_name(id,adminname,34)
        
get_user_authid (id,adminauthid,34)
        
get_user_name(playerplayername34)
        
get_user_authid (player,playerauthid,34)
        
Log("[TEAM-SWAP] Admin: %s || SteamID: %s swapped Player: %s || SteamID: %s"adminnameadminauthidplayernameplayerauthid)
        
        
client_print(idprint_console"%L"LANG_SERVER"SWAP1"playername)
        
client_print(playerprint_center"%L"LANG_SERVER"SWAP2")
    }
    return 
PLUGIN_HANDLED
}

public 
cmdStartRound(id)
{
    if (
access(idSTART_ROUND))
    {
        if (
count_down<10)
        {
            
client_print(idprint_console"%L"LANG_SERVER"FAIL_START_ROUND")
            return 
PLUGIN_HANDLED
        
}
        
        
Release_Zombies()
        
        new 
adminauthid[35],adminname[35]
        
get_user_name(id,adminname,34)
        
get_user_authid (id,adminauthid,34)
        
Log("[START_ROUND] Admin: %s || SteamID: %s started the round"adminnameadminauthid)
        
        
client_print(idprint_center"%L"LANG_SERVER"START_ROUND")
        
client_print(idprint_chat"^x04%L"LANG_SERVER"START_ROUND")
    }
    return 
PLUGIN_HANDLED
}

public 
cmdCheckRound(id)
{
    if (
g_ZombiesReleasedprint_color(id"%s Round: %d of %d"formatmodname, (g_RoundNum), g_pcvar_maxrounds)
    else if (!
g_ZombiesReleasedprint_color(id"%s Round: %d of %d"formatmodname, (g_RoundNum+1), g_pcvar_maxrounds)
}

public 
msgStatusValue()
{
    
//Block the name info, of person you aim at
    
set_msg_block(gmsgStatusTextBLOCK_SET);
}

public 
ev_SetTeam(id)
{
    
g_friend[id] = read_data(2)
}

public 
ev_ShowStatus(id//called when id looks at someone
{
    new 
name[32], pid read_data(2);
    new 
stats[8],bodyhits[8]
    
    
get_user_name(pidname31);
    new 
color1 0color2 0;

    if (
get_user_team(pid) == 1)
        
color1 255;
    else
        
color2 255;

    new 
Float:height=0.35
    
//height=0.60

    
if (g_friend[id] == 1)    // friend
    
{
        new 
clipammowpnid get_user_weapon(pidclipammo);
        new 
wpnname[32];

        if (
wpnid)
            
xmod_get_wpnname(wpnidwpnname31);

        new 
rank get_user_stats(pidstatsbodyhits)
        
set_hudmessage(color150color2, -1.0height10.013.00.010.01);
        
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"PLAYER_INFO1"namerankget_user_health(pid), wpnname);
    } 
    if (
g_friend[id] != 1//enemy
    
{
        new 
rank get_user_stats(pidstatsbodyhits)
        
set_hudmessage(color150color2, -1.0height10.013.00.010.01);
        
ShowSyncHudMsg(idgHudSyncInfo"%L"LANG_SERVER"PLAYER_INFO2"namerank);
    }
}

public 
ev_HideStatus(id)
{
    
ClearSyncHud(idgHudSyncInfo);
}

public 
weapon_method_menu(id)
{
    if(
firsttime[id])
    {
        
firsttime[id] = false
        prim_weapons_menu
(id,0)
    }
    else
    {
        
cur_offset[id] = 0
        
if(ask[id])
        {
            
show_menu(id,(1<<0)|(1<<1)|(1<<2),"Weapon Selection Method^n^n1. New Guns^n2. Last Guns^n3. Last Guns + Save",-1,"WeaponMethodMenu")
        }
        else
        {
            
give_weapons(id)
        }
    }
}

public 
weapon_method_pushed(id,key)
{
    switch(
key)
    {
        case 
0:
        {
            
ask[id] = true
            prim_weapons_menu
(id,0)
        }    
        case 
1:
        {
            
ask[id] = true
            give_weapons
(id)
        }
        case 
2:
        {
            
print_color(id"%s %L"formatmodnameLANG_SERVER"GUNS_MSG")
            
ask[id] = false
            give_weapons
(id)
        }
    }
    return 
PLUGIN_HANDLED;
}

public 
prim_weapons_menu(id,offset)
{
    if(
offset<0offset 0

    
new cvar_value[32]
    
get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
    new 
flags read_flags(cvar_value)

    new 
keyscurnummenu[2048]
    for(new 
i=offset;i<19;i++)
    {
        if(
flags power(2,i))
        {
            
options_on_menu[curnum][id] = i
            keys 
+= (1<<curnum)
    
            
curnum++
            
format(menu,2047,"%s^n%d. %s",menu,curnum,WEAPONNAMES[i])
    
            if(
curnum==8)
            break;
        }
    }

    
format(menu,2047,"\yPrimary Weapon:\w^n%s^n",menu)
    if(
curnum==&& offset<12)
    {
        
keys += (1<<8)
        
format(menu,2047,"%s^n9. Next",menu)
    }
    if(
offset)
    {
        
keys += (1<<9)
        
format(menu,2047,"%s^n0. Back",menu)
    }

    
show_menu(id,keys,menu,-1,"PrimaryWeaponSelect")
}

public 
prim_weapons_pushed(id,key)
{
    if(
key<8)
    {
        
weapon_picked[0][id] = options_on_menu[key][id]
        
cur_offset[id] = 0
        sec_weapons_menu
(id,0)
    }
    else
    {
        if(
key==8)
            
cur_offset[id] += 8
        
if(key==9)
            
cur_offset[id] -= 8
        prim_weapons_menu
(id,cur_offset[id])
    }
    return ;
}

public 
sec_weapons_menu(id,offset)
{
    if(
offset<0offset 0

    
new cvar_value[32]
    
get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
    new 
flags read_flags(cvar_value)

    new 
keyscurnummenu[2048]
    for(new 
i=18;i<24;i++)
    {
        if(
flags power(2,i))
        {
        
options_on_menu[curnum][id] = i
        keys 
+= (1<<curnum)

        
curnum++
        
format(menu,2047,"%s^n%d. %s",menu,curnum,WEAPONNAMES[i])
        }
    }

    
format(menu,2047,"\ySecondary Weapon:\w^n%s",menu)

    
show_menu(id,keys,menu,-1,"SecWeaponSelect")
}

public 
sec_weapons_pushed(id,key)
{
    if(
key<8)
    {
        
weapon_picked[1][id] = options_on_menu[key][id]
    }
    
give_weapons(id)
    return ;
}

public 
give_weapons(id)
{
    
strip_user_weapons(id)

    
give_item(id,"weapon_knife")
   
    new 
weapon[32]
    new 
csw csw_contant(weapon_picked[0][id])
    
get_weaponname(csw,weapon,31)
    
give_item(id,weapon)
    
cs_set_user_bpammo(id,csw,999)
    
g_PrimaryWeapon[id] = csw

    csw 
csw_contant(weapon_picked[1][id])
    
get_weaponname(csw,weapon,31)
    
give_item(id,weapon)
    
cs_set_user_bpammo(id,csw,999)
}

public 
csw_contant(weapon)
{
    new 
num 29
    
switch(weapon)
    {
        case 
0num 3
        
case 1num 5
        
case 2num 7
        
case 3num 8
        
case 4num 12
        
case 5num 13
        
case 6num 14
        
case 7num 15
        
case 8num 18
        
case 9num 19
        
case 10num 20
        
case 11num 21
        
case 12num 22
        
case 13num 23
        
case 14num 24
        
case 15num 27
        
case 16num 28
        
case 17num 30
        
case 18num 1
        
case 19num 10
        
case 20num 11
        
case 21num 16
        
case 22num 17
        
case 23num 26
        
case 24:
        {
            new 
s_weapon[32]
        
            
get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
           
            new 
flags read_flags(s_weapon)
            do
            {
                
num random_num(0,18)
                if(!(
num flags))
                {
                    
num = -1
                
}
            }
            while(
num==-1)
            
num csw_contant(num)
        }
        case 
25:
        {
            new 
s_weapon[32]

            
get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
        
            new 
flags read_flags(s_weapon)
            do
            {
                
num random_num(18,23)
                if(!(
num flags))
                {
                    
num = -1
                
}
            }
            while(
num==-1)
            
num csw_contant(num)
        }
    }
    return 
num;
}


public 
cmdGuns(id)
{
    if(!
g_isalive[id] || !g_isconnected[id] || !g_CanBuild)
        return 
PLUGIN_HANDLED
    
    
if(!g_ishuman[id])
        return 
PLUGIN_HANDLED    

    ask
[id] = true
    weapon_method_menu
(id)
    return 
PLUGIN_HANDLED
}

public 
ev_Health(id)
{
    
ShowHealth(id);
}

public 
ShowHealth(id)
{
    if (
is_user_alive(id))
    {
        new 
Float:hud_time get_pcvar_float(g_pcvar_healthtime);
        
        
set_hudmessage(255255255, -1.00.90hud_timehud_time0.10.24);
        
show_hudmessage(id"%L"LANG_SERVER"PLAYER_HEALTH"get_user_health(id));
        
        
set_task(hud_time 0.1"ShowHealth"id);
    }
}

Log(const message_fmt[], any:...)
{
    static 
message[256];
    
vformat(messagesizeof(message) - 1message_fmt2);
    
    static 
filename[96];
    static 
dir[64];
    if( !
dir[0] )
    {
        
get_basedir(dirsizeof(dir) - 1);
        
add(dirsizeof(dir) - 1"/logs");
    }
    
    
format_time(filenamesizeof(filename) - 1"%m-%d-%Y");
    
format(filenamesizeof(filename) - 1"%s/BB_ACTIVITY_%s.log"dirfilename);
    
    
log_to_file(filename"%s"message);
}

print_color(target, const message[], any:...)
{
    static 
buffer[512], iargscount
    argscount 
numargs()
    
    
// Send to everyone
    
if (!target)
    {
        static 
player
        
for (player 1player <= g_MaxPlayersplayer++)
        {
            if (!
g_isconnected[player])
                continue;

            static 
changed[5], changedcount
            changedcount 
0

            
for (2argscounti++)
            {
                if (
getarg(i) == LANG_PLAYER)
                {
                    
setarg(i0player)
                    
changed[changedcount] = i
                    changedcount
++
                }
            }
            
vformat(buffercharsmax(buffer), message3)

            
message_begin(MSG_ONE_UNRELIABLEgmsgSayText_player)
            
write_byte(player)
            
write_string(buffer)
            
message_end()
            
            for (
0changedcounti++)
                
setarg(changed[i], 0LANG_PLAYER)
        }
    }
    
// Send to specific target
    
else
    {
        
vformat(buffercharsmax(buffer), message3)

        
message_begin(MSG_ONEgmsgSayText_target)
        
write_byte(target)
        
write_string(buffer)
        
message_end()
    }

__________________
Mi firma era tan sexy .-.
StrikerV2 is offline
Send a message via MSN to StrikerV2
Meetikcz
BANNED
Join Date: Dec 2012
Old 12-28-2012 , 17:04   Re: [AYUDA] Base Builder
#6

Si quieres que todos los clientes puedan bloquear las piesas solo cambia esto
#define FLAGS_LOCK ADMIN_LEVEL_A
cambialo por:

#define FLAGS_LOCK ADMIN_ALL
Meetikcz is offline
StrikerV2
Senior Member
Join Date: Nov 2012
Location: Chile , O Yes!
Old 12-28-2012 , 17:43   Re: [AYUDA] Base Builder
#7

Quote:
Originally Posted by Meetikcz View Post
Si quieres que todos los clientes puedan bloquear las piesas solo cambia esto
#define FLAGS_LOCK ADMIN_LEVEL_A
cambialo por:

#define FLAGS_LOCK ADMIN_ALL
Y Borrar

PHP Code:
if (!access(idLOCK_BLOCKS))
        return 
PLUGIN_HANDLED 
__________________
Mi firma era tan sexy .-.
StrikerV2 is offline
Send a message via MSN to StrikerV2
lRodri.
Member
Join Date: Apr 2012
Location: Argentina
Old 12-28-2012 , 20:06   Re: [AYUDA] Base Builder
#8

No me funciono. Code Original:

Code:
/*
Base Builder Zombie Mod
Tirant

Version 6.5 Pub
*/

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

//Enable this only if you have bought the credits plugin
//#define BB_CREDITS

#define FLAGS_BUILD 	ADMIN_KICK
#define FLAGS_LOCK 	ADMIN_LEVEL_A
#define FLAGS_BUILDBAN 	ADMIN_KICK
#define FLAGS_SWAP 	ADMIN_KICK
#define FLAGS_REVIVE 	ADMIN_KICK
#define FLAGS_GUNS 	ADMIN_LEVEL_A
#define FLAGS_RELEASE 	ADMIN_BAN
#define FLAGS_OVERRIDE 	ADMIN_BAN

#define VERSION "6.5"
#define MODNAME "^x01 [^x04 Base Builder^x01 ]"

#define LockBlock(%1,%2)  	( entity_set_int( %1, EV_INT_iuser1,     %2 ) )
#define UnlockBlock(%1)   	( entity_set_int( %1, EV_INT_iuser1,     0  ) )
#define BlockLocker(%1)   	( entity_get_int( %1, EV_INT_iuser1         ) )

#define MovingEnt(%1)     	( entity_set_int( %1, EV_INT_iuser2,     1 ) )
#define UnmovingEnt(%1)   	( entity_set_int( %1, EV_INT_iuser2,     0 ) )
#define IsMovingEnt(%1)   	( entity_get_int( %1, EV_INT_iuser2 ) == 1 )

#define SetEntMover(%1,%2)  	( entity_set_int( %1, EV_INT_iuser3, %2 ) )
#define UnsetEntMover(%1)   	( entity_set_int( %1, EV_INT_iuser3, 0  ) )
#define GetEntMover(%1)   	( entity_get_int( %1, EV_INT_iuser3     ) )

#define SetLastMover(%1,%2)  	( entity_set_int( %1, EV_INT_iuser4, %2 ) )
#define UnsetLastMover(%1)   	( entity_set_int( %1, EV_INT_iuser4, 0  ) )
#define GetLastMover(%1)  	( entity_get_int( %1, EV_INT_iuser4     ) )

#define MAXPLAYERS 32
#define MAXENTS 1024
#define AMMO_SLOT 376
#define MODELCHANGE_DELAY 0.5
#define AUTO_TEAM_JOIN_DELAY 0.1
#define TEAM_SELECT_VGUI_MENU_ID 2
#define OBJECT_PUSHPULLRATE 4.0
#define HUD_FRIEND_HEIGHT 0.30

#define BARRIER_COLOR 0.0, 0.0, 0.0
#define BARRIER_RENDERAMT 150.0

#define BLOCK_RENDERAMT 150.0

#define LOCKED_COLOR 125.0, 0.0, 0.0
#define LOCKED_RENDERAMT 225.0

const ZOMBIE_ALLOWED_WEAPONS_BITSUM = (1<<CSW_KNIFE)
#define OFFSET_WPN_WIN 	  41
#define OFFSET_WPN_LINUX  4

#define OFFSET_ACTIVE_ITEM 373
#define OFFSET_LINUX 5

#if cellbits == 32
	#define OFFSET_BUYZONE 235
#else
	#define OFFSET_BUYZONE 268
#endif

new g_iMaxPlayers
new g_msgSayText, g_msgStatusText
new g_HudSync

new g_isConnected[MAXPLAYERS+1]
new g_isAlive[MAXPLAYERS+1]
new g_isZombie[MAXPLAYERS+1]
new g_isBuildBan[MAXPLAYERS+1]
new g_isCustomModel[MAXPLAYERS+1]

enum (+= 5000)
{
	TASK_BUILD = 10000,
	TASK_PREPTIME,
	TASK_MODELSET,
	TASK_RESPAWN,
	TASK_HEALTH,
	TASK_IDLESOUND
}

//Custom Sounds
new g_szRoundStart[][] = 
{
	"basebuilder/round_start.wav",
	"basebuilder/round_start2.wav"
}

#define WIN_ZOMBIES 	"basebuilder/win_zombies2.wav"
#define WIN_BUILDERS 	"basebuilder/win_builders2.wav"

#define PHASE_PREP 	"basebuilder/phase_prep3.wav"
#define PHASE_BUILD 	"basebuilder/phase_build3.wav"

#define LOCK_OBJECT 	"buttons/lightswitch2.wav"
#define LOCK_FAIL	"buttons/button10.wav"

#define GRAB_START	"basebuilder/block_grab.wav"
#define GRAB_STOP	"basebuilder/block_drop.wav"

#define INFECTION	"basebuilder/zombie_kill1.wav"

new const g_szZombiePain[][] =
{
	"basebuilder/zombie/pain/pain1.wav",
	"basebuilder/zombie/pain/pain2.wav",
	"basebuilder/zombie/pain/pain3.wav"
}

new const g_szZombieDie[][] =
{
	"basebuilder/zombie/death/death1.wav",
	"basebuilder/zombie/death/death2.wav",
	"basebuilder/zombie/death/death3.wav"
}

new const g_szZombieIdle[][] =
{
	"basebuilder/zombie/idle/idle1.wav",
	"basebuilder/zombie/idle/idle2.wav",
	"basebuilder/zombie/idle/idle3.wav"
}

new const g_szZombieHit[][] =
{
	"basebuilder/zombie/hit/hit1.wav",
	"basebuilder/zombie/hit/hit1.wav",
	"basebuilder/zombie/hit/hit1.wav"
}

new const g_szZombieMiss[][] =
{
	"basebuilder/zombie/miss/miss1.wav",
	"basebuilder/zombie/miss/miss2.wav",
	"basebuilder/zombie/miss/miss3.wav"
}

//Custom Player Models
new Float:g_fModelsTargetTime, Float:g_fRoundStartTime
new g_szPlayerModel[MAXPLAYERS+1][32]

//Game Name
new g_szModName[32]

new g_iCountDown, g_iEntBarrier
new bool:g_boolCanBuild, bool:g_boolPrepTime, bool:g_boolRoundEnded
new g_iFriend[MAXPLAYERS+1]
new CsTeams:g_iTeam[MAXPLAYERS+1], CsTeams:g_iCurTeam[MAXPLAYERS+1]
new bool:g_boolFirstTeam[MAXPLAYERS+1]

//Building Stores
new Float:g_fOffset1[MAXPLAYERS+1], Float:g_fOffset2[MAXPLAYERS+1], Float:g_fOffset3[MAXPLAYERS+1]
new g_iOwnedEnt[MAXPLAYERS+1], g_iOwnedEntities[MAXPLAYERS+1]
new Float:g_fEntDist[MAXPLAYERS+1]

static const g_szWpnEntNames[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
			"weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
			"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
			"weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
			"weapon_ak47", "weapon_knife", "weapon_p90" }
			
//Weapon Names (For Guns Menu)
static const szWeaponNames[24][23] = { "Schmidt Scout", "XM1014 M4", "Ingram MAC-10", "Steyr AUG A1", "UMP 45", "SG-550 Auto-Sniper",
			"IMI Galil", "Famas", "AWP Magnum Sniper", "MP5 Navy", "M249 Para Machinegun", "M3 Super 90", "M4A1 Carbine",
			"Schmidt TMP", "G3SG1 Auto-Sniper", "SG-552 Commando", "AK-47 Kalashnikov", "ES P90", "P228 Compact",
			"Dual Elite Berettas", "Fiveseven", "USP .45 ACP Tactical", "Glock 18C", "Desert Eagle .50 AE" }
			
#define MAX_COLORS 24
new const Float:g_fColor[MAX_COLORS][3] = 
{
	{200.0, 000.0, 000.0},
	{255.0, 083.0, 073.0},
	{255.0, 117.0, 056.0},
	{255.0, 174.0, 066.0},
	{255.0, 207.0, 171.0},
	{252.0, 232.0, 131.0},
	{254.0, 254.0, 034.0},
	{059.0, 176.0, 143.0},
	{197.0, 227.0, 132.0},
	{000.0, 150.0, 000.0},
	{120.0, 219.0, 226.0},
	{135.0, 206.0, 235.0},
	{128.0, 218.0, 235.0},
	{000.0, 000.0, 255.0},
	{146.0, 110.0, 174.0},
	{255.0, 105.0, 180.0},
	{246.0, 100.0, 175.0},
	{205.0, 074.0, 076.0},
	{250.0, 167.0, 108.0},
	{234.0, 126.0, 093.0},
	{180.0, 103.0, 077.0},
	{149.0, 145.0, 140.0},
	{000.0, 000.0, 000.0},
	{255.0, 255.0, 255.0}
}

new const Float:g_fRenderAmt[MAX_COLORS] = 
{
	100.0, //Red
	135.0, //Red Orange
	140.0, //Orange
	120.0, //Yellow Orange
	140.0, //Peach
	125.0, //Yellow
	100.0, //Lemon Yellow
	125.0, //Jungle Green
	135.0, //Yellow Green
	100.0, //Green
	125.0, //Aquamarine
	150.0, //Baby Blue
	090.0, //Sky Blue
	075.0, //Blue
	175.0, //Violet
	150.0, //Hot Pink
	175.0, //Magenta
	140.0, //Mahogany
	140.0, //Tan
	140.0, //Light Brown
	165.0, //Brown
	175.0, //Gray
	125.0, //Black
	125.0   //White
}

new const g_szColorName[MAX_COLORS][] = 
{
	"Red",
	"Red Orange",
	"Orange",
	"Yellow Orange",
	"Peach",
	"Yellow",
	"Lemon Yellow",
	"Jungle Green",
	"Yellow Green",
	"Green",
	"Aquamarine",
	"Baby Blue",
	"Sky Blue",
	"Blue",
	"Violet",
	"Hot Pink",
	"Magenta",
	"Mahogany",
	"Tan",
	"Light Brown",
	"Brown",
	"Gray",
	"Black",
	"White"
}

enum
{
	COLOR_RED = 0, 		//200, 000, 000
	COLOR_REDORANGE, 	//255, 083, 073
	COLOR_ORANGE, 		//255, 117, 056
	COLOR_YELLOWORANGE, 	//255, 174, 066
	COLOR_PEACH, 		//255, 207, 171
	COLOR_YELLOW, 		//252, 232, 131
	COLOR_LEMONYELLOW, 	//254, 254, 034
	COLOR_JUNGLEGREEN, 	//059, 176, 143
	COLOR_YELLOWGREEN, 	//197, 227, 132
	COLOR_GREEN, 		//000, 200, 000
	COLOR_AQUAMARINE, 	//120, 219, 226
	COLOR_BABYBLUE, 		//135, 206, 235
	COLOR_SKYBLUE, 		//128, 218, 235
	COLOR_BLUE, 		//000, 000, 200
	COLOR_VIOLET, 		//146, 110, 174
	COLOR_PINK, 		//255, 105, 180
	COLOR_MAGENTA, 		//246, 100, 175
	COLOR_MAHOGANY,		//205, 074, 076
	COLOR_TAN, 		//250, 167, 108
	COLOR_LIGHTBROWN, 	//234, 126, 093
	COLOR_BROWN, 		//180, 103, 077
	COLOR_GRAY, 		//149, 145, 140
	COLOR_BLACK, 		//000, 000, 000
	COLOR_WHITE 		//255, 255, 255
}

new g_iColor[MAXPLAYERS+1]
new g_iColorOwner[MAX_COLORS]

//Color Menu
new g_iMenuOffset[MAXPLAYERS+1], g_iMenuOptions[MAXPLAYERS+1][8], g_iWeaponPicked[2][MAXPLAYERS+1],
	g_iPrimaryWeapon[MAXPLAYERS+1]
	
new bool:g_boolFirstTime[MAXPLAYERS+1], bool:g_boolRepick[MAXPLAYERS+1]

new Float:g_fBuildDelay[MAXPLAYERS+1]
#define BUILD_DELAY 0.75

#define KEYS_GENERIC (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)

enum
{
	ATT_HEALTH = 0,
	ATT_SPEED,
	ATT_GRAVITY
}

//Zombie Classes
new g_iZClasses
new g_iZombieClass[MAXPLAYERS+1]
new bool:g_boolFirstSpawn[MAXPLAYERS+1]
new g_szPlayerClass[MAXPLAYERS+1][32]
new g_iNextClass[MAXPLAYERS+1]
new Float:g_fPlayerSpeed[MAXPLAYERS+1]
new bool:g_boolArraysCreated
new Array:g_zclass_name
new Array:g_zclass_info
new Array:g_zclass_modelsstart // start position in models array
new Array:g_zclass_modelsend // end position in models array
new Array:g_zclass_playermodel // player models array
new Array:g_zclass_modelindex // model indices array
new Array:g_zclass_clawmodel
new Array:g_zclass_hp
new Array:g_zclass_spd
new Array:g_zclass_grav
new Array:g_zclass_admin
new Array:g_zclass_credits
//new Float:g_fClassMultiplier[MAXPLAYERS+1][3]

new Array:g_zclass2_realname, Array:g_zclass2_name, Array:g_zclass2_info,
Array:g_zclass2_modelsstart, Array:g_zclass2_modelsend, Array:g_zclass2_playermodel,
Array:g_zclass2_clawmodel, Array:g_zclass2_hp, Array:g_zclass2_spd,
Array:g_zclass2_grav, Array:g_zclass2_admin, Array:g_zclass2_credits, Array:g_zclass_new

//Forwards
new g_fwRoundStart, g_fwPrepStarted, g_fwBuildStarted, g_fwClassPicked, g_fwClassSet,
g_fwPushPull, g_fwGrabEnt_Pre, g_fwGrabEnt_Post, g_fwDropEnt_Pre,
 g_fwDropEnt_Post, g_fwNewColor, g_fwLockEnt_Pre, g_fwLockEnt_Post, g_fwDummyResult

 //Cvars
new g_pcvar_buildtime, g_iBuildTime,
	g_pcvar_preptime, g_iPrepTime,
	g_pcvar_givenades, g_iGrenadeHE, g_iGrenadeFLASH, g_iGrenadeSMOKE,
	g_pcvar_entmindist, Float: g_fEntMinDist,
	g_pcvar_entsetdist, Float: g_fEntSetDist,
	g_pcvar_entmaxdist, Float: g_fEntMaxDist,
	g_pcvar_resetent, g_iResetEnt,
	g_pcvar_showmovers, g_iShowMovers,
	g_pcvar_lockblocks, g_iLockBlocks,
	g_pcvar_lockmax, g_iLockMax,
	g_pcvar_colormode, g_iColorMode,
	g_pcvar_zombietime, g_iZombieTime,
	g_pcvar_infecttime, g_iInfectTime,
	g_pcvar_supercut, g_iSupercut,
	g_pcvar_gunsmenu, g_iGunsMenu,
	g_pcvar_enabled,
	g_pcvar_allowedweps
 
public plugin_precache()
{
	server_cmd("bb_credits_active 0")
	
	register_plugin("Base Builder", VERSION, "Tirant")
	register_cvar("base_builder", VERSION, FCVAR_SPONLY|FCVAR_SERVER)
	set_cvar_string("base_builder", VERSION)
	
	g_pcvar_enabled = register_cvar("bb_enabled", "1")
	
	if (!get_pcvar_num(g_pcvar_enabled))
		return;

	new szCache[64], i;
		
	g_pcvar_buildtime = register_cvar("bb_buildtime", "150") //Build Time
	g_iBuildTime = clamp(get_pcvar_num(g_pcvar_buildtime), 30, 300)
	g_pcvar_preptime = register_cvar("bb_preptime", "30") //Prep Time
	g_iPrepTime = clamp(get_pcvar_num(g_pcvar_preptime), 0, 60)
	g_pcvar_zombietime = register_cvar("bb_zombie_respawn_delay", "3") //Zombie Respawn Delay
	g_iZombieTime = clamp(get_pcvar_num(g_pcvar_zombietime), 1, 30)
	g_pcvar_infecttime = register_cvar("bb_infection_respawn", "5") //Survivor Respawn Infection Delay
	g_iInfectTime = clamp(get_pcvar_num(g_pcvar_infecttime), 0, 30)
	g_pcvar_showmovers = register_cvar("bb_showmovers", "1") //Show Movers
	g_iShowMovers = clamp(get_pcvar_num(g_pcvar_showmovers), 0, 1)
	g_pcvar_lockblocks = register_cvar("bb_lockblocks", "1") //Lock blocks
	g_iLockBlocks = clamp(get_pcvar_num(g_pcvar_lockblocks), 0, 1)
	g_pcvar_lockmax = register_cvar("bb_lockmax", "10") //Lock max
	g_iLockMax = clamp(get_pcvar_num(g_pcvar_lockmax), 0, 50)
	g_pcvar_colormode = register_cvar("bb_colormode", "1") //Color mode <0/1/2> Menu, one color per player, random
	g_iColorMode = clamp(get_pcvar_num(g_pcvar_colormode), 0, 2)
	g_pcvar_entmaxdist = register_cvar("bb_max_move_dist", "768") //Push ceiling
	g_fEntMaxDist = get_pcvar_float(g_pcvar_entmaxdist)
	g_pcvar_entmindist = register_cvar("bb_min_move_dist", "32") //Pull floor
	g_fEntMinDist = get_pcvar_float(g_pcvar_entmindist)
	g_pcvar_entsetdist = register_cvar("bb_min_dist_set", "64") //Grab set
	g_fEntSetDist = get_pcvar_float(g_pcvar_entsetdist)
	g_pcvar_resetent = register_cvar("bb_resetblocks", "1") //Reset blocks on new round
	g_iResetEnt = clamp(get_pcvar_num(g_pcvar_resetent), 0, 1)
	g_pcvar_supercut = register_cvar("bb_zombie_supercut", "0") //One hit kill for zombies
	g_iSupercut = clamp(get_pcvar_num(g_pcvar_supercut), 0, 1)
	g_pcvar_gunsmenu = register_cvar("bb_gunsmenu", "1") //Use the internal guns menu
	g_iGunsMenu = clamp(get_pcvar_num(g_pcvar_gunsmenu), 0, 1)
	
	g_pcvar_givenades = register_cvar("bb_roundnades","h") //Grenades
	g_pcvar_allowedweps = register_cvar("bb_weapons","abcdeghijlmnqrstuvwx")
	
	get_pcvar_string(g_pcvar_givenades, szCache, sizeof szCache - 1)
	for (i=0; i<strlen(szCache);i++)
	{
		switch(szCache[i])
		{
			case 'h': g_iGrenadeHE++
			case 'f': g_iGrenadeFLASH++
			case 's': g_iGrenadeSMOKE++
		}
	}
	
	for (i=0; i<sizeof g_szRoundStart; i++) 	precache_sound(g_szRoundStart[i])
	for (i=0; i<sizeof g_szZombiePain;i++) 	precache_sound(g_szZombiePain[i])
	for (i=0; i<sizeof g_szZombieDie;i++) 	precache_sound(g_szZombieDie[i])
	for (i=0; i<sizeof g_szZombieIdle;i++) 	precache_sound(g_szZombieIdle[i])
	for (i=0; i<sizeof g_szZombieHit;i++) 	precache_sound(g_szZombieHit[i])
	for (i=0; i<sizeof g_szZombieMiss;i++) 	precache_sound(g_szZombieMiss[i])
	
	precache_sound(WIN_ZOMBIES)
	precache_sound(WIN_BUILDERS)
	precache_sound(PHASE_BUILD)
	precache_sound(PHASE_PREP)
	precache_sound(LOCK_OBJECT)
	precache_sound(LOCK_FAIL)
	precache_sound(GRAB_START)
	precache_sound(GRAB_STOP)
	if (g_iInfectTime)
		precache_sound(INFECTION)
	
	i = create_entity("info_bomb_target");
	entity_set_origin(i, Float:{8192.0,8192.0,8192.0})
	
	i = create_entity("info_map_parameters");
	DispatchKeyValue(i, "buying", "3");
	DispatchKeyValue(i, "bombradius", "1");
	DispatchSpawn(i);
	
	g_zclass_name = ArrayCreate(32, 1)
	g_zclass_info = ArrayCreate(32, 1)
	g_zclass_modelsstart = ArrayCreate(1, 1)
	g_zclass_modelsend = ArrayCreate(1, 1)
	g_zclass_playermodel = ArrayCreate(32, 1)
	g_zclass_modelindex = ArrayCreate(1, 1)
	g_zclass_clawmodel = ArrayCreate(32, 1)
	g_zclass_hp = ArrayCreate(1, 1)
	g_zclass_spd = ArrayCreate(1, 1)
	g_zclass_grav = ArrayCreate(1, 1)
	g_zclass_admin = ArrayCreate(1, 1)
	g_zclass_credits = ArrayCreate(1, 1)
	
	g_zclass2_realname = ArrayCreate(32, 1)
	g_zclass2_name = ArrayCreate(32, 1)
	g_zclass2_info = ArrayCreate(32, 1)
	g_zclass2_modelsstart = ArrayCreate(1, 1)
	g_zclass2_modelsend = ArrayCreate(1, 1)
	g_zclass2_playermodel = ArrayCreate(32, 1)
	g_zclass2_clawmodel = ArrayCreate(32, 1)
	g_zclass2_hp = ArrayCreate(1, 1)
	g_zclass2_spd = ArrayCreate(1, 1)
	g_zclass2_grav = ArrayCreate(1, 1)
	g_zclass2_admin = ArrayCreate(1, 1)
	g_zclass2_credits = ArrayCreate(1, 1)
	g_zclass_new = ArrayCreate(1, 1)
	
	g_boolArraysCreated = true
	
	return;
}

public plugin_cfg()
{
	g_boolArraysCreated = false
}

public plugin_init()
{
	if (!get_pcvar_num(g_pcvar_enabled))
		return;
		
	formatex(g_szModName, charsmax(g_szModName), "Base Builder %s", VERSION)
	
	register_clcmd("say", 	   	"cmdSay");
	register_clcmd("say_team",	"cmdSay");
	
	//Added for old users
	register_clcmd("+grab",		"cmdGrabEnt");
	register_clcmd("-grab",		"cmdStopEnt");
	
	register_clcmd("bb_lock",	"cmdLockBlock",0, " - Aim at a block to lock it");
	register_clcmd("bb_claim",	"cmdLockBlock",0, " - Aim at a block to lock it");
	
	register_clcmd("bb_buildban",	"cmdBuildBan",0, " <player>");
	register_clcmd("bb_unbuildban",	"cmdBuildBan",0, " <player>");
	register_clcmd("bb_bban",	"cmdBuildBan",0, " <player>");
	
	register_clcmd("bb_swap",	"cmdSwap",0, " <player>");
	register_clcmd("bb_revive",	"cmdRevive",0, " <player>");
	if (g_iGunsMenu) register_clcmd("bb_guns",	"cmdGuns",0, " <player>");
	register_clcmd("bb_startround",	"cmdStartRound",0, " - Starts the round");
	
	register_logevent("logevent_round_start",2, 	"1=Round_Start")
	register_logevent("logevent_round_end", 2, 	"1=Round_End")
	
	register_message(get_user_msgid("TextMsg"), 	"msgRoundEnd")
	register_message(get_user_msgid("TextMsg"),	"msgSendAudio")
	register_message(get_user_msgid("StatusIcon"), 	"msgStatusIcon");
	register_message(get_user_msgid("Health"), 	"msgHealth");
	register_message(get_user_msgid("StatusValue"), 	"msgStatusValue")
	register_message(get_user_msgid("TeamInfo"), 	"msgTeamInfo");
	
	register_menucmd(register_menuid("ColorsSelect"),KEYS_GENERIC,"colors_pushed")
	register_menucmd(register_menuid("ZClassSelect"),KEYS_GENERIC,"zclass_pushed")
	if (g_iGunsMenu)
	{
		register_menucmd(register_menuid("WeaponMethodMenu"),(1<<0)|(1<<1)|(1<<2),"weapon_method_pushed")
		register_menucmd(register_menuid("PrimaryWeaponSelect"),KEYS_GENERIC,"prim_weapons_pushed")
		register_menucmd(register_menuid("SecWeaponSelect"),KEYS_GENERIC,"sec_weapons_pushed")
	}
	
	register_event("HLTV", 		"ev_RoundStart", "a", "1=0", "2=0")
	register_event("AmmoX", 		"ev_AmmoX", 	 "be", "1=1", "1=2", "1=3", "1=4", "1=5", "1=6", "1=7", "1=8", "1=9", "1=10")
	register_event("Health",   	"ev_Health", 	 "be", "1>0");
	register_event("StatusValue", 	"ev_SetTeam", 	 "be", "1=1");
	register_event("StatusValue", 	"ev_ShowStatus", "be", "1=2", "2!0");
	register_event("StatusValue", 	"ev_HideStatus", "be", "1=1", "2=0");

	RegisterHam(Ham_Touch, 		"weapon_shield","ham_WeaponCleaner_Post", 1)
	RegisterHam(Ham_Touch, 		"weaponbox",  	"ham_WeaponCleaner_Post", 1)
	RegisterHam(Ham_Spawn, 		"player", 	"ham_PlayerSpawn_Post", 1)
	RegisterHam(Ham_TakeDamage, 	"player", 	"ham_TakeDamage")
	for (new i = 1; i < sizeof g_szWpnEntNames; i++)
		if (g_szWpnEntNames[i][0]) RegisterHam(Ham_Item_Deploy, g_szWpnEntNames[i], "ham_ItemDeploy_Post", 1)
	
	register_forward(FM_GetGameDescription, 		"fw_GetGameDescription")
	register_forward(FM_SetClientKeyValue, 		"fw_SetClientKeyValue")
	register_forward(FM_ClientUserInfoChanged, 	"fw_ClientUserInfoChanged")
	register_forward(FM_CmdStart, 			"fw_CmdStart");
	register_forward(FM_PlayerPreThink, 		"fw_PlayerPreThink")
	register_forward(FM_EmitSound,			"fw_EmitSound")
	register_forward(FM_ClientKill,			"fw_Suicide")
	if (g_iShowMovers)
		register_forward(FM_TraceLine, 		"fw_Traceline")
	
	register_clcmd("drop", "clcmd_drop")
	register_clcmd("buy", "clcmd_buy")
	
	//Team Handlers
	register_clcmd("chooseteam",	"clcmd_changeteam")
	register_clcmd("jointeam", 	"clcmd_changeteam")
	register_message(get_user_msgid("ShowMenu"), "message_show_menu")
	register_message(get_user_msgid("VGUIMenu"), "message_vgui_menu")
	
	set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
	
	g_iMaxPlayers = get_maxplayers()
	g_HudSync = CreateHudSyncObj();
	g_msgSayText = get_user_msgid("SayText")
	g_msgStatusText = get_user_msgid("StatusText");
	
	g_iEntBarrier = find_ent_by_tname( -1, "barrier" );
	
	//Custom Forwards
	g_fwRoundStart = CreateMultiForward("bb_round_started", ET_IGNORE)
	g_fwPrepStarted = CreateMultiForward("bb_prepphase_started", ET_IGNORE)
	g_fwBuildStarted = CreateMultiForward("bb_buildphase_started", ET_IGNORE)
	g_fwClassPicked = CreateMultiForward("bb_zombie_class_picked", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwClassSet = CreateMultiForward("bb_zombie_class_set", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwPushPull = CreateMultiForward("bb_block_pushpull", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
	g_fwGrabEnt_Pre = CreateMultiForward("bb_grab_pre", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwGrabEnt_Post = CreateMultiForward("bb_grab_post", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwDropEnt_Pre = CreateMultiForward("bb_drop_pre", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwDropEnt_Post = CreateMultiForward("bb_drop_post", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwNewColor = CreateMultiForward("bb_new_color", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwLockEnt_Pre = CreateMultiForward("bb_lock_pre", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwLockEnt_Post = CreateMultiForward("bb_lock_post", ET_IGNORE, FP_CELL, FP_CELL)
	
	register_dictionary("basebuilder.txt");
}

public plugin_natives()
{
	register_native("bb_register_zombie_class","native_register_zombie_class", 1)
	
	register_native("bb_get_class_cost","native_get_class_cost", 1)
	register_native("bb_get_user_zombie_class","native_get_user_zombie_class", 1)
	register_native("bb_get_user_next_class","native_get_user_next_class", 1)
	register_native("bb_set_user_zombie_class","native_set_user_zombie_class", 1)
	
	
	register_native("bb_is_user_zombie","native_is_user_zombie", 1)
	register_native("bb_is_user_banned","native_is_user_banned", 1)
	
	register_native("bb_is_build_phase","native_bool_buildphase", 1)
	register_native("bb_is_prep_phase","native_bool_prepphase", 1)
	
	register_native("bb_get_build_time","native_get_build_time", 1)
	register_native("bb_set_build_time","native_set_build_time", 1)
	
	register_native("bb_get_user_color","native_get_user_color", 1)
	register_native("bb_set_user_color","native_set_user_color", 1)
	
	register_native("bb_drop_user_block","native_drop_user_block", 1)
	register_native("bb_get_user_block","native_get_user_block", 1)
	register_native("bb_set_user_block","native_set_user_block", 1)
	
	register_native("bb_is_locked_block","native_is_locked_block", 1)
	register_native("bb_lock_block","native_lock_block", 1)
	register_native("bb_unlock_block","native_unlock_block", 1)
	
	register_native("bb_release_zombies","native_release_zombies", 1)
	
	register_native("bb_set_user_primary","native_set_user_primary", 1)
	register_native("bb_get_user_primary","native_get_user_primary", 1)
	
	register_native("bb_get_flags_build","native_get_flags_build", 1)
	register_native("bb_get_flags_lock","native_get_flags_lock", 1)
	register_native("bb_get_flags_buildban","native_get_flags_buildban", 1)
	register_native("bb_get_flags_swap","native_get_flags_swap", 1)
	register_native("bb_get_flags_revive","native_get_flags_revive", 1)
	register_native("bb_get_flags_guns","native_get_flags_guns", 1)
	register_native("bb_get_flags_release","native_get_flags_release", 1)
	register_native("bb_get_flags_override","native_get_flags_override", 1)
	
	//register_native("bb_set_user_mult","native_set_user_mult", 1)
	
	//ZP Natives Converted
	register_native("zp_register_zombie_class","native_register_zombie_class", 1)
	register_native("zp_get_user_zombie_class","native_get_user_zombie_class", 1)
	register_native("zp_get_user_next_class","native_get_user_next_class", 1)
	register_native("zp_set_user_zombie_class","native_set_user_zombie_class", 1)
	register_native("zp_get_user_zombie","native_is_user_zombie", 1)
}

public fw_GetGameDescription()
{
	forward_return(FMV_STRING, g_szModName)
	return FMRES_SUPERCEDE;
}

public client_putinserver(id)
{
	if (!is_user_connected(id))
		return PLUGIN_HANDLED;
		
	g_isConnected[id] = true
	g_isAlive[id] = false
	g_isZombie[id] = false
	g_isBuildBan[id] = false
	g_isCustomModel[id] = false
	g_boolFirstSpawn[id] = true
	g_boolFirstTeam[id] = false
	g_boolFirstTime[id] = true
	g_boolRepick[id] = true
	
	g_iZombieClass[id] = 0
	g_iNextClass[id] = g_iZombieClass[id]
	//for (new i = 0; i < 3; i++) g_fClassMultiplier[id][i] = 1.0
	
	set_task(7.0,"Respawn_Player",id+TASK_RESPAWN);
	
	return PLUGIN_CONTINUE;
}

public client_disconnect(id)
{
	if (g_iOwnedEnt[id])
		cmdStopEnt(id)

	g_isConnected[id] = false
	g_isAlive[id] = false
	g_isZombie[id] = false
	g_isBuildBan[id] = false
	g_isCustomModel[id] = false
	g_boolFirstSpawn[id] = false
	g_boolFirstTeam[id] = false
	g_boolFirstTime[id] = false
	g_boolRepick[id] = false
	
	g_iZombieClass[id] = 0
	g_iNextClass[id] = 0
	//for (new i = 0; i < 3; i++) g_fClassMultiplier[id][i] = 1.0
	
	g_iOwnedEntities[id] = 0
	
	remove_task(id+TASK_RESPAWN)
	remove_task(id+TASK_HEALTH)
	remove_task(id+TASK_IDLESOUND)
	
	for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
	{
		if (is_valid_ent(iEnt) && g_iLockBlocks && BlockLocker(iEnt) == id)
		{
			UnlockBlock(iEnt)
			set_pev(iEnt,pev_rendermode,kRenderNormal)
				
			UnsetLastMover(iEnt);
			UnsetEntMover(iEnt);
		}
	}
}  

public ev_RoundStart()
{
	remove_task(TASK_BUILD)
	remove_task(TASK_PREPTIME)
	
	arrayset(g_iOwnedEntities, 0, MAXPLAYERS+1)
	arrayset(g_iColor, 0, MAXPLAYERS+1)
	arrayset(g_iColorOwner, 0, MAX_COLORS)
	arrayset(g_boolRepick, true, MAXPLAYERS+1)
	
	g_boolRoundEnded = false
	g_boolCanBuild = true
	g_fRoundStartTime = get_gametime()
	
	if (g_iResetEnt)
	{
		new szClass[10], szTarget[7];
		for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
		{
			if (is_valid_ent(iEnt))
			{
				entity_get_string(iEnt, EV_SZ_classname, szClass, 9);
				entity_get_string(iEnt, EV_SZ_targetname, szTarget, 6);
				if (!BlockLocker(iEnt) && iEnt != g_iEntBarrier && equal(szClass, "func_wall") && !equal(szTarget, "ignore"))
				{
					set_pev(iEnt,pev_rendermode,kRenderNormal)
					engfunc( EngFunc_SetOrigin, iEnt, Float:{ 0.0, 0.0, 0.0 } );
					
					UnsetLastMover(iEnt);
					UnsetEntMover(iEnt);
				}
				else if (g_iLockBlocks && BlockLocker(iEnt))
				{
					UnlockBlock(iEnt)
					set_pev(iEnt,pev_rendermode,kRenderNormal)
					engfunc( EngFunc_SetOrigin, iEnt, Float:{ 0.0, 0.0, 0.0 } );
					
					UnsetLastMover(iEnt);
					UnsetEntMover(iEnt);
				}
			}
		}
	}
}

public ev_AmmoX(id)
	set_pdata_int(id, AMMO_SLOT + read_data(1), 200, 5)

public ev_Health(taskid)
{
	if (taskid>g_iMaxPlayers)
		taskid-=TASK_HEALTH
		
	if (is_user_alive(taskid))
	{
		new szGoal[32]
		//if (is_credits_active())
		#if defined BB_CREDITS
			format(szGoal, 31, "^n%L: %d", LANG_SERVER, "HUD_GOAL", credits_get_user_goal(taskid))
		#endif
		
		set_hudmessage(255, 255, 255, -1.0, 0.9, 0, 12.0, 12.0, 0.1, 0.2, 4);
		if (g_isZombie[taskid])
		{
			static szCache1[32]
			ArrayGetString(g_zclass_name, g_iZombieClass[taskid], szCache1, charsmax(szCache1))
		
			show_hudmessage(taskid, "%L: %d^n%L: %s%s", LANG_SERVER, "HUD_HEALTH", pev(taskid, pev_health), LANG_SERVER, "HUD_CLASS", szCache1, szGoal);
		}
		else
		{
			show_hudmessage(taskid, "%L: %d%s", LANG_SERVER, "HUD_HEALTH", pev(taskid, pev_health), szGoal);
		}
		
		set_task(11.9, "ev_Health", taskid+TASK_HEALTH);
	}
}

public msgStatusIcon(const iMsgId, const iMsgDest, const iPlayer)
{
	if(g_isAlive[iPlayer] && g_isConnected[iPlayer]) 
	{
		static szMsg[8]
		get_msg_arg_string(2, szMsg, 7)
    
		if(equal(szMsg, "buyzone"))
		{
			set_pdata_int(iPlayer, OFFSET_BUYZONE, get_pdata_int(iPlayer, OFFSET_BUYZONE) & ~(1<<0))
			return PLUGIN_HANDLED
		}
	}
	return PLUGIN_CONTINUE
} 

public msgHealth(msgid, dest, id)
{
	if(!g_isAlive[id])
		return PLUGIN_CONTINUE;
	
	static hp;
	hp = get_msg_arg_int(1);
	
	if(hp > 255 && (hp % 256) == 0)
		set_msg_arg_int(1, ARG_BYTE, ++hp);
	
	return PLUGIN_CONTINUE;
}

public msgRoundEnd(const MsgId, const MsgDest, const MsgEntity)
{
	static Message[192]
	get_msg_arg_string(2, Message, 191)
	
	if (equal(Message, "#Terrorists_Win"))
	{
		g_boolRoundEnded = true
		set_hudmessage(255, 255, 255, -1.0, 0.40, 0, 6.0, 6.0, 0.1, 0.2, 1)
		show_hudmessage(0, "%L", LANG_SERVER, "WIN_ZOMBIE")
		set_msg_arg_string(2, "")
		client_cmd(0, "spk %s", WIN_ZOMBIES)
		
		return PLUGIN_HANDLED
	}
	else if (equal(Message, "#Target_Saved") || equal(Message, "#CTs_Win"))
	{
		g_boolRoundEnded = true
		set_hudmessage(255, 255, 255, -1.0, 0.40, 0, 6.0, 6.0, 0.1, 0.2, 1)
		show_hudmessage(0, "%L", LANG_SERVER, "WIN_BUILDER")
		set_msg_arg_string(2, "")
		client_cmd(0, "spk %s", WIN_BUILDERS)
		
		return PLUGIN_HANDLED
	}
	return PLUGIN_HANDLED
}

public msgSendAudio(const MsgId, const MsgDest, const MsgEntity)
{
	static szSound[17]
	get_msg_arg_string(2,szSound,16)
	if(equal(szSound[7], "terwin") || equal(szSound[7], "ctwin") || equal(szSound[7], "rounddraw")) return PLUGIN_HANDLED
	return PLUGIN_CONTINUE
}

public ham_WeaponCleaner_Post(iEnt)
{
	call_think(iEnt)
}

public ham_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
	if (!is_valid_ent(victim) || !g_isAlive[victim] || !is_user_connected(attacker))
		return HAM_IGNORED
		
	if(g_boolCanBuild || g_boolRoundEnded || g_boolPrepTime)
		return HAM_SUPERCEDE;
		
	if (victim == attacker)
		return HAM_SUPERCEDE;
		
	if (g_iSupercut)
	{
		damage*=99.0
	}
		
	SetHamParamFloat(4, damage)
	return HAM_HANDLED
}

public ham_ItemDeploy_Post(weapon_ent)
{
	static owner
	owner = get_pdata_cbase(weapon_ent, OFFSET_WPN_WIN, OFFSET_WPN_LINUX);

	static weaponid
	weaponid = cs_get_weapon_id(weapon_ent)
	
	if (g_isZombie[owner] && weaponid == CSW_KNIFE)
	{
		static szClawModel[100]
		ArrayGetString(g_zclass_clawmodel, g_iZombieClass[owner], szClawModel, charsmax(szClawModel))
		format(szClawModel, charsmax(szClawModel), "models/%s.mdl", szClawModel)
		entity_set_string( owner , EV_SZ_viewmodel , szClawModel )  
		entity_set_string( owner , EV_SZ_weaponmodel , "" ) 
	}
	
	if (g_isZombie[owner] && !((1<<weaponid) & ZOMBIE_ALLOWED_WEAPONS_BITSUM))
	{
		engclient_cmd(owner, "weapon_knife")
	}
	else if (g_boolCanBuild)
	{
		engclient_cmd(owner, "weapon_knife")
		client_print(owner, print_center, "%L", LANG_SERVER, "FAIL_KNIFE");
	}
}

public logevent_round_start()
{
	set_pev(g_iEntBarrier,pev_solid,SOLID_BSP)
	set_pev(g_iEntBarrier,pev_rendermode,kRenderTransColor)
	set_pev(g_iEntBarrier,pev_rendercolor, Float:{ BARRIER_COLOR })
	set_pev(g_iEntBarrier,pev_renderamt, Float:{ BARRIER_RENDERAMT })
	
	print_color(0, "^x04 ---[ Base Builder %s ]---", VERSION);
	print_color(0, "^x03 %L", LANG_SERVER, "ROUND_MESSAGE");

	client_cmd(0, "spk %s", PHASE_BUILD)
	
	remove_task(TASK_BUILD)
	set_task(1.0, "task_CountDown", TASK_BUILD,_, _, "a", g_iBuildTime);
	g_iCountDown = (g_iBuildTime-1);
	
	ExecuteForward(g_fwBuildStarted, g_fwDummyResult);
}

public task_CountDown()
{
	g_iCountDown--
	new mins = g_iCountDown/60, secs = g_iCountDown%60
	if (g_iCountDown>=0)
		client_print(0, print_center, "%L - %d:%s%d", LANG_SERVER, "BUILD_TIMER", mins, (secs < 10 ? "0" : ""), secs)
	else
	{
		if (g_iPrepTime)
		{
			g_boolCanBuild = false
			g_boolPrepTime = true
			g_iCountDown = g_iPrepTime+1
			set_task(1.0, "task_PrepTime", TASK_PREPTIME,_, _, "a", g_iCountDown);
			
			set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
			show_hudmessage(0, "%L", LANG_SERVER, "PREP_ANNOUNCE");
			
			new players[32], num
			get_players(players, num)
			for (new i = 0; i < num; i++)
			{
				if (g_isAlive[players[i]] && !g_isZombie[players[i]])
				{
					ExecuteHamB(Ham_CS_RoundRespawn, players[i])
					
					if (g_iOwnedEnt[players[i]])
						cmdStopEnt(players[i])
				}
			}
			print_color(0, "%s^x04 %L", MODNAME, LANG_SERVER, "PREP_ANNOUNCE")
			
			client_cmd(0, "spk %s", PHASE_PREP)
			
			ExecuteForward(g_fwPrepStarted, g_fwDummyResult);
		}
		else
			Release_Zombies()

		remove_task(TASK_BUILD);
		return PLUGIN_HANDLED;
	}
	
	new szTimer[32]
	if (g_iCountDown>10)
	{
		if (mins && !secs) num_to_word(mins, szTimer, 31)
		else if (!mins && secs == 30) num_to_word(secs, szTimer, 31)
		else return PLUGIN_HANDLED;
		
		client_cmd(0, "spk ^"fvox/%s %s remaining^"", szTimer, (mins ? "minutes" : "seconds"))
	}
	else
	{
		num_to_word(g_iCountDown, szTimer, 31)
		client_cmd(0, "spk ^"fvox/%s^"", szTimer)
	}
	return PLUGIN_CONTINUE;
}

public task_PrepTime()
{
	g_iCountDown--
	
	if (g_iCountDown>=0)
		client_print(0, print_center, "%L - 0:%s%d", LANG_SERVER, "PREP_TIMER", (g_iCountDown < 10 ? "0" : ""), g_iCountDown)
	
	if (0<g_iCountDown<11)
	{
		new szTimer[32]
		num_to_word(g_iCountDown, szTimer, 31)
		client_cmd(0, "spk ^"fvox/%s^"", szTimer)
	}
	else if (g_iCountDown == 0)
	{
		Release_Zombies()
		remove_task(TASK_PREPTIME);
		return PLUGIN_HANDLED
	}
	
	return PLUGIN_CONTINUE;
}

public logevent_round_end()
{
	if (g_boolRoundEnded)
	{
		new players[32], num, player
		get_players(players, num)
		for (new i = 0; i < num; i++)
		{
			player = players[i]
			
			if (g_iCurTeam[player] == g_iTeam[player] )
				cs_set_user_team(player, (g_iTeam[player] = (g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T)))
			else
				g_iTeam[player] = g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T
		}
		print_color(0, "%s^x04 %L", MODNAME, LANG_SERVER, "SWAP_ANNOUNCE")
	}
	remove_task(TASK_BUILD)	
	return PLUGIN_HANDLED
}

public client_death(g_attacker, g_victim, wpnindex, hitplace, TK)
{
	if (is_user_alive(g_victim))
		return PLUGIN_HANDLED;
	
	remove_task(g_victim+TASK_IDLESOUND)
	
	g_isAlive[g_victim] = false;
	
	if (TK == 0 && g_attacker != g_victim && g_isZombie[g_attacker])
	{
		client_cmd(0, "spk %s", INFECTION)
		new szPlayerName[32]
		get_user_name(g_victim, szPlayerName, 31)
		set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 5.0, 0.1, 0.2, 1)
		show_hudmessage(0, "%L", LANG_SERVER, "INFECT_ANNOUNCE", szPlayerName);
	}
	
	set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
	if (g_isZombie[g_victim])
	{
		show_hudmessage(g_victim, "%L", LANG_SERVER, "DEATH_ZOMBIE", g_iZombieTime);
		set_task(float(g_iZombieTime), "Respawn_Player", g_victim+TASK_RESPAWN)
	}
	else if (g_iInfectTime)
	{
		show_hudmessage(g_victim, "%L", LANG_SERVER, "DEATH_HUMAN", g_iInfectTime);
		cs_set_user_team(g_victim, CS_TEAM_T)
		g_isZombie[g_victim] = true
		set_task(float(g_iInfectTime), "Respawn_Player", g_victim+TASK_RESPAWN)
	}
	
	return PLUGIN_CONTINUE;
}

public Respawn_Player(id)
{
	id-=TASK_RESPAWN
	
	if (!is_user_connected(id))
		return PLUGIN_HANDLED
	
	if (((g_boolCanBuild || g_boolPrepTime) && cs_get_user_team(id) == CS_TEAM_CT) || cs_get_user_team(id) == CS_TEAM_T)
	{
		ExecuteHamB(Ham_CS_RoundRespawn, id)
		
		//Loop the task until they have successfully spawned
		if (!g_isAlive[id])
			set_task(3.0,"Respawn_Human",id+TASK_RESPAWN)
	}
	return PLUGIN_HANDLED
}

public ham_PlayerSpawn_Post(id)
{
	if (is_user_alive(id))
	{
		g_isAlive[id] = true;
		
		g_isZombie[id] = (cs_get_user_team(id) == CS_TEAM_T ? true : false)
		
		remove_task(id + TASK_RESPAWN)
		remove_task(id + TASK_MODELSET)
		remove_task(id + TASK_IDLESOUND)
		if (g_isZombie[id])
		{
			if (g_boolFirstSpawn[id])
			{
				print_color(id, "This server is running Base Builder v%s by Tirant", VERSION);
				show_zclass_menu(id, 0)
				g_boolFirstSpawn[id] = false
			}
			
			if (g_iNextClass[id] != g_iZombieClass[id])
				g_iZombieClass[id] = g_iNextClass[id]

			set_pev(id, pev_health, float(ArrayGetCell(g_zclass_hp, g_iZombieClass[id]))/**g_fClassMultiplier[id][ATT_HEALTH]*/)
			set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_iZombieClass[id])/**g_fClassMultiplier[id][ATT_GRAVITY]*/)
			g_fPlayerSpeed[id] = float(ArrayGetCell(g_zclass_spd, g_iZombieClass[id]))/**g_fClassMultiplier[id][ATT_SPEED]*/
				
			//Handles the knife and claw model
			strip_user_weapons(id)
			give_item(id, "weapon_knife")
							
			static szClawModel[100]
			ArrayGetString(g_zclass_clawmodel, g_iZombieClass[id], szClawModel, charsmax(szClawModel))
			format(szClawModel, charsmax(szClawModel), "models/%s.mdl", szClawModel)
			entity_set_string( id , EV_SZ_viewmodel , szClawModel )  
			entity_set_string( id , EV_SZ_weaponmodel , "" ) 
						
			ArrayGetString(g_zclass_name, g_iZombieClass[id], g_szPlayerClass[id], charsmax(g_szPlayerClass[]))
			
			set_task(random_float(60.0, 360.0), "task_ZombieIdle", id+TASK_IDLESOUND, _, _, "b")

			ArrayGetString(g_zclass_playermodel, g_iZombieClass[id], g_szPlayerModel[id], charsmax(g_szPlayerModel[]))
			new szCurrentModel[32]
			fm_get_user_model(id, szCurrentModel, charsmax(szCurrentModel))
			if (!equal(szCurrentModel, g_szPlayerModel[id]))
			{
				if (get_gametime() - g_fRoundStartTime < 5.0)
					set_task(5.0 * MODELCHANGE_DELAY, "fm_user_model_update", id + TASK_MODELSET)
				else
					fm_user_model_update(id + TASK_MODELSET)
			}
			
			ExecuteForward(g_fwClassSet, g_fwDummyResult, id, g_iZombieClass[id]);
		}
		else if (g_isCustomModel[id])
		{
			fm_reset_user_model(id)
		}
		
		if (!g_isZombie[id])
		{
			entity_set_string( id , EV_SZ_viewmodel , "models/v_knife.mdl" )  
			
			if (((/*g_boolPrepTime && */g_iPrepTime && !g_boolCanBuild) || (g_boolCanBuild && !g_iPrepTime)) && g_iGunsMenu)
			{
				//if (is_credits_active())
				#if defined BB_CREDITS
					credits_show_gunsmenu(id)
				#else
					show_method_menu(id)
				#endif
			}
				
			if (!g_iColor[id])
			{
				new i = random(MAX_COLORS)
				if (g_iColorMode)
				{
					while (g_iColorOwner[i])
					{
						i = random(MAX_COLORS)
					}
				}
				print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_PICKED", g_szColorName[i]);
				g_iColor[id] = i
				g_iColorOwner[i] = id

				if (g_iOwnedEnt[id])
				{
					set_pev(g_iOwnedEnt[id],pev_rendercolor, g_fColor[g_iColor[id]] )
					set_pev(g_iOwnedEnt[id],pev_renderamt, g_fRenderAmt[g_iColor[id]] )
				}
			}
		}
		
		ev_Health(id)
	}
}

public task_ZombieIdle(taskid)
{
	taskid-=TASK_IDLESOUND
	if (g_isAlive[taskid] && g_isConnected[taskid] && !g_isZombie[taskid])
		emit_sound(taskid, CHAN_VOICE, g_szZombieIdle[random(sizeof g_szZombieIdle - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
}

public fw_SetClientKeyValue(id, const infobuffer[], const key[])
{   
	if (g_isCustomModel[id] && equal(key, "model"))
		return FMRES_SUPERCEDE
	return FMRES_IGNORED
}

public fw_ClientUserInfoChanged(id)
{
	if (!g_isCustomModel[id])
		return FMRES_IGNORED
	static szCurrentModel[32]
	fm_get_user_model(id, szCurrentModel, charsmax(szCurrentModel))
	if (!equal(szCurrentModel, g_szPlayerModel[id]) && !task_exists(id + TASK_MODELSET))
		fm_set_user_model(id + TASK_MODELSET)
	return FMRES_IGNORED
}

public fm_user_model_update(taskid)
{
	static Float:fCurTime
	fCurTime = get_gametime()
	
	if (fCurTime - g_fModelsTargetTime >= MODELCHANGE_DELAY)
	{
		fm_set_user_model(taskid)
		g_fModelsTargetTime = fCurTime
	}
	else
	{
		set_task((g_fModelsTargetTime + MODELCHANGE_DELAY) - fCurTime, "fm_set_user_model", taskid)
		g_fModelsTargetTime += MODELCHANGE_DELAY
	}
}

public fm_set_user_model(player)
{
	player -= TASK_MODELSET
	engfunc(EngFunc_SetClientKeyValue, player, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", g_szPlayerModel[player])
	g_isCustomModel[player] = true
}

stock fm_get_user_model(player, model[], len)
{
	engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", model, len)
}

stock fm_reset_user_model(player)
{
	g_isCustomModel[player] = false
	dllfunc(DLLFunc_ClientUserInfoChanged, player, engfunc(EngFunc_GetInfoKeyBuffer, player))
}

public message_show_menu(msgid, dest, id) 
{
	if (!(!get_user_team(id) && !is_user_bot(id) && !access(id, ADMIN_IMMUNITY)))
		return PLUGIN_CONTINUE

	static team_select[] = "#Team_Select"
	static menu_text_code[sizeof team_select]
	get_msg_arg_string(4, menu_text_code, sizeof menu_text_code - 1)
	if (!equal(menu_text_code, team_select))
		return PLUGIN_CONTINUE

	static param_menu_msgid[2]
	param_menu_msgid[0] = msgid
	set_task(AUTO_TEAM_JOIN_DELAY, "task_force_team_join", id, param_menu_msgid, sizeof param_menu_msgid)

	return PLUGIN_HANDLED
}

public message_vgui_menu(msgid, dest, id) 
{
	if (get_msg_arg_int(1) != TEAM_SELECT_VGUI_MENU_ID || !(!get_user_team(id) && !is_user_bot(id) && !access(id, ADMIN_IMMUNITY)))// 
		return PLUGIN_CONTINUE
		
	static param_menu_msgid[2]
	param_menu_msgid[0] = msgid
	set_task(AUTO_TEAM_JOIN_DELAY, "task_force_team_join", id, param_menu_msgid, sizeof param_menu_msgid)

	return PLUGIN_HANDLED
}

public task_force_team_join(menu_msgid[], id) 
{
	if (get_user_team(id))
		return

	static msg_block
	msg_block = get_msg_block(menu_msgid[0])
	set_msg_block(menu_msgid[0], BLOCK_SET)
	engclient_cmd(id, "jointeam", "5")
	engclient_cmd(id, "joinclass", "5")
	set_msg_block(menu_msgid[0], msg_block)
}

public msgTeamInfo(msgid, dest)
{
	if (dest != MSG_ALL && dest != MSG_BROADCAST)
		return;
	
	static id, team[2]
	id = get_msg_arg_int(1)

	get_msg_arg_string(2, team, charsmax(team))
	switch (team[0])
	{
		case 'T' : // TERRORIST
		{
			g_iCurTeam[id] = CS_TEAM_T;
		}
		case 'C' : // CT
		{
			g_iCurTeam[id] = CS_TEAM_CT;
		}
		case 'S' : // SPECTATOR
		{
			g_iCurTeam[id] = CS_TEAM_SPECTATOR;
		}
		default : g_iCurTeam[id] = CS_TEAM_UNASSIGNED;
	}
	if (!g_boolFirstTeam[id])
	{
		g_boolFirstTeam[id] = true
		g_iTeam[id] = g_iCurTeam[id]
	}
}

public clcmd_changeteam(id)
{
	static CsTeams:team
	team = cs_get_user_team(id)
	
	if (team == CS_TEAM_SPECTATOR || team == CS_TEAM_UNASSIGNED)
		return PLUGIN_CONTINUE;

	show_zclass_menu(id, 0)
	return PLUGIN_HANDLED;
}

public clcmd_drop(id)
{
	client_print (id, print_center, "%L", LANG_SERVER, "FAIL_DROP")
	return PLUGIN_HANDLED
}

public clcmd_buy(id)
{
	client_print (id, print_center, "%L", LANG_SERVER, "FAIL_BUY")
	return PLUGIN_HANDLED
}

public msgStatusValue()
	set_msg_block(g_msgStatusText, BLOCK_SET);

public ev_SetTeam(id)
	g_iFriend[id] = read_data(2)

public ev_ShowStatus(id) //called when id looks at someone
{
	new szName[32], pid = read_data(2);
	get_user_name(pid, szName, 31);

	if (g_iFriend[id] == 1)	// friend
	{
		new clip, ammo, wpnid = get_user_weapon(pid, clip, ammo), szWpnName[32];

		if (wpnid)
			xmod_get_wpnname(wpnid, szWpnName, 31);

		set_hudmessage(0, 225, 0, -1.0, HUD_FRIEND_HEIGHT, 1, 0.01, 3.0, 0.01, 0.01);
		new nLen, szStatus[512]
		if (!g_isZombie[pid])
			nLen += format( szStatus[nLen], 511-nLen, "%s^nHealth: %d | Weapon: %s^nColor: %s", szName, pev(pid, pev_health), szWpnName, g_szColorName[g_iColor[pid]]);
		else
		{
			nLen += format( szStatus[nLen], 511-nLen, "%s^nClass: %s^nHealth: %d", szName, g_szPlayerClass[pid], pev(pid, pev_health));
			
			/*if (is_credits_active())
			{
				nLen += format( szStatus[nLen], 511-nLen, "^n^nClass Multipliers:", szName, g_szPlayerClass[pid], pev(pid, pev_health));
				nLen += format( szStatus[nLen], 511-nLen, "^nHealth: %f", g_fClassMultiplier[pid][ATT_HEALTH]);
				nLen += format( szStatus[nLen], 511-nLen, "^nSpeed: %f", g_fClassMultiplier[pid][ATT_SPEED]);
				nLen += format( szStatus[nLen], 511-nLen, "^nGravity: %f", g_fClassMultiplier[pid][ATT_GRAVITY]);
			}*/
		}
		ShowSyncHudMsg(id, g_HudSync, szStatus);
	} 
	if (g_iFriend[id] != 1) //enemy
	{
		set_hudmessage(225, 0, 0, -1.0, HUD_FRIEND_HEIGHT, 1, 0.01, 3.0, 0.01, 0.01);
		if (g_isZombie[pid])
			ShowSyncHudMsg(id, g_HudSync, "%s", szName);
		else
			ShowSyncHudMsg(id, g_HudSync, "%s^nColor: %s", szName, g_szColorName[g_iColor[pid]]);
	}
}

public ev_HideStatus(id)
	ClearSyncHud(id, g_HudSync);

public cmdSay(id)
{
	if (!g_isConnected[id])
		return PLUGIN_HANDLED;

	new szMessage[32]
	read_args(szMessage, charsmax(szMessage));
	remove_quotes(szMessage);
		
	if(szMessage[0] == '/')
	{
		if (equali(szMessage, "/commands") == 1 || equali(szMessage, "/cmd")  == 1 )
		{
			print_color(id, "%s /class, /respawn, /random, /mycolor, /guns%s%s%s", MODNAME, (g_iColorMode ? ", /whois <color>": ""), (g_iColorMode != 2 ? ", /colors":""), (access(id, FLAGS_LOCK) ? ", /lock":"")  );
		}
		else if (equali(szMessage, "/class") == 1)
		{
			show_zclass_menu(id, 0)
		}
		else if (equali(szMessage, "/respawn") == 1 || equali(szMessage, "/revive")  == 1 || equali(szMessage, "/fixspawn")  == 1)
		{
			if (g_boolCanBuild && !g_isZombie[id])
				ExecuteHamB(Ham_CS_RoundRespawn, id)
			else if (g_isZombie[id])
			{
				if (pev(id, pev_health) == float(ArrayGetCell(g_zclass_hp, g_iZombieClass[id])) || !is_user_alive(id))
					ExecuteHamB(Ham_CS_RoundRespawn, id)
				else
					client_print(id, print_center, "%L", LANG_SERVER, "FAIL_SPAWN");
			}
		}
		else if (equali(szMessage, "/lock") == 1 || equali(szMessage, "/claim") == 1 && g_isAlive[id])
		{
			if (access(id, FLAGS_LOCK))
				cmdLockBlock(id)
			else
				client_print(id, print_center, "%L", LANG_SERVER, "FAIL_ACCESS");
			return PLUGIN_HANDLED;
		}
		else if (equal(szMessage, "/whois",6) && g_iColorMode)
		{
			for ( new i=0; i<MAX_COLORS; i++)
			{
				if (equali(szMessage[7], g_szColorName[i]) == 1)
				{
					if (g_iColorOwner[i])
					{
						new szPlayerName[32]
						get_user_name(g_iColorOwner[i], szPlayerName, 31)
						print_color(id, "%s^x04 %s^x01's color is^x04 %s", MODNAME, szPlayerName, g_szColorName[i]);
					}
					else
						print_color(id, "%s %L^x04 %s", MODNAME, LANG_SERVER, "COLOR_NONE", g_szColorName[i]);
						
					break;
				}
			}
		}
		else if (equali(szMessage, "/colors") == 1 && !g_isZombie[id] && g_boolCanBuild && g_iColorMode != 2)
		{
			show_colors_menu(id, 0)
		}
		else if (equali(szMessage, "/mycolor") == 1 && !g_isZombie[id])
		{
			print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_YOURS", g_szColorName[g_iColor[id]]);
			return PLUGIN_HANDLED
		}
		else if (equali(szMessage, "/random") == 1 && !g_isZombie[id] && g_boolCanBuild)
		{
			new i = random(MAX_COLORS)
			if (g_iColorMode)
			{
				while (g_iColorOwner[i])
				{
					i = random(MAX_COLORS)
				}
			}
			print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_RANDOM", g_szColorName[i]);
			g_iColorOwner[g_iColor[id]] = 0
			g_iColor[id] = i
			g_iColorOwner[i] = id
			
			for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
			{
				if (is_valid_ent(iEnt) && g_iLockBlocks && BlockLocker(iEnt) == id)
					set_pev(iEnt,pev_rendercolor,g_fColor[g_iColor[id]])
			}
			
			ExecuteForward(g_fwNewColor, g_fwDummyResult, id, g_iColor[id]);
		}
		else if (equali(szMessage, "/guns", 5) && g_iGunsMenu)
		{
			if(!g_isAlive[id] || g_isZombie[id])
				return PLUGIN_HANDLED
				
			if (access(id, FLAGS_GUNS))
			{
				new player = cmd_target(id, szMessage[6], 0)
			
				if (!player)
				{
					//if (is_credits_active())
					#if defined BB_CREDITS
						credits_show_gunsmenu(id)
					#else
						show_method_menu(id)
					#endif
					return PLUGIN_CONTINUE
				}
				
				cmdGuns(id, player)
				return PLUGIN_HANDLED;
			}
			else
			{
				if(!g_boolCanBuild || !g_boolRepick[id])
					return PLUGIN_HANDLED	
		
				//if (is_credits_active())
				#if defined BB_CREDITS
					credits_show_gunsmenu(id)
				#else
					show_method_menu(id)
				#endif
				return PLUGIN_HANDLED
			}
		}
		else if (equal(szMessage, "/swap",5) && access(id, FLAGS_SWAP))
		{
			new player = cmd_target(id, szMessage[6], 0)
		
			if (!player)
			{
				print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
				return PLUGIN_CONTINUE
			}
			
			cmdSwap(id, player)
		}
		else if (equal(szMessage, "/revive",7) && access(id, FLAGS_REVIVE))
		{
			new player = cmd_target(id, szMessage[8], 0)
		
			if (!player)
			{
				print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
				return PLUGIN_CONTINUE
			}
			
			cmdRevive(id, player)
		}
		else if (equal(szMessage, "/ban",4) && access(id, FLAGS_BUILDBAN))
		{
			new player = cmd_target(id, szMessage[5], 0)
		
			if (!player)
			{
				print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
				return PLUGIN_CONTINUE
			}
			
			cmdBuildBan(id, player)
		}
		else if (equal(szMessage, "/releasezombies",5) && access(id, FLAGS_RELEASE))
		{
			cmdStartRound(id)
		}
	}
	return PLUGIN_CONTINUE
}

public cmdSwap(id, target)
{
	if (access(id, FLAGS_SWAP))
	{
		new player
		
		if (target) player = target
		else
		{
			new arg[32]
			read_argv(1, arg, 31)
			player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
		}

		if (!player || !is_user_connected(player))
			return client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
			
		cs_set_user_team(player,( g_iTeam[player] = g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T))
			
		if (is_user_alive(player))
			ExecuteHamB(Ham_CS_RoundRespawn, player)
		
		new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
		get_user_name(id,szAdminName,31)
		get_user_authid (id,szAdminAuthid,31)
		get_user_name(player, szPlayerName, 31)
		get_user_authid (player,szPlayerID,31)
		
		client_print(id, print_console, "[Base Builder] Player %s was swapped from the %s team to the %s team", szPlayerName, g_iTeam[player] == CS_TEAM_CT ? "zombie":"builder", g_iTeam[player] == CS_TEAM_CT ? "builder":"zombie")
		Log("[SWAP] Admin: %s || SteamID: %s swapped Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
		
		set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
		show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_SWAP");
		
		print_color(0, "%s Player^x04 %s^x01 has been^x04 swapped^x01 to the^x04 %s^x01 team", MODNAME, szPlayerName, g_iTeam[player] == CS_TEAM_CT ? "builder":"zombie")
	}
	return PLUGIN_HANDLED	
}

public cmdRevive(id, target)
{
	if (access(id, FLAGS_REVIVE))
	{
		new player
		if (target) player = target
		else
		{
			new arg[32]
			read_argv(1, arg, 31)
			player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
		}

		if (!player || !is_user_connected(player))
			return client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
			
		ExecuteHamB(Ham_CS_RoundRespawn, player)
		
		new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
		get_user_name(id,szAdminName,31)
		get_user_authid (id,szAdminAuthid,31)
		get_user_name(player, szPlayerName, 31)
		get_user_authid (player,szPlayerID,31)
		
		client_print(id, print_console, "[Base Builder] Player %s has been^x04 revived", szPlayerName)
		Log("[REVIVE] Admin: %s || SteamID: %s revived Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
		
		set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
		show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_REVIVE");
		
		print_color(0, "%s Player^x04 %s^x01 has been^x04 revived^x01 by an admin", MODNAME, szPlayerName)
	}
	return PLUGIN_HANDLED	
}

public cmdGuns(id, target)
{
	if (access(id, FLAGS_GUNS))
	{
		new player
		if (target) player = target
		else
		{
			new arg[32]
			read_argv(1, arg, 31)
			player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
		}
		
		if (!player || !is_user_connected(player))
		{
			client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
			return PLUGIN_HANDLED;
		}
		
		if (g_isZombie[player])
		{
			return PLUGIN_HANDLED;
		}
		
		if (!g_isAlive[player])
		{
			client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_DEAD");
			return PLUGIN_HANDLED;
		}

		//if (is_credits_active())
		#if defined BB_CREDITS
			credits_show_gunsmenu(player)
		#else
			show_method_menu(player)
		#endif
		
		new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
		get_user_name(id,szAdminName,31)
		get_user_authid (id,szAdminAuthid,31)
		get_user_name(player, szPlayerName, 31)
		get_user_authid (player,szPlayerID,31)
		
		client_print(id, print_console, "[Base Builder] Player %s has had his weapons menu re-opened", szPlayerName);
		Log("[GUNS] Admin: %s || SteamID: %s opened the guns menu for Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID);
		
		set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
		show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_GUNS");
		
		print_color(0, "%s Player^x04 %s^x01 has had their^x04 guns^x01 menu^x04 re-opened", MODNAME, szPlayerName)
	}
	return PLUGIN_HANDLED	
}

public cmdStartRound(id)
{
	if (access(id, FLAGS_RELEASE))
	{
		native_release_zombies()
	}
}

public Release_Zombies()
{
	g_boolCanBuild = false
	remove_task(TASK_BUILD);
	
	g_boolPrepTime = false
	remove_task(TASK_PREPTIME);
	
	new players[32], num, player, szWeapon[32]
	get_players(players, num, "a")
	for(new i = 0; i < num; i++)
	{
		player = players[i]

		if (!g_isZombie[player])
		{
			if (g_iOwnedEnt[player])
				cmdStopEnt(player)

			if(g_iGrenadeHE		) give_item(player,"weapon_hegrenade"	), cs_set_user_bpammo(player,CSW_HEGRENADE,	g_iGrenadeHE)
			if(g_iGrenadeFLASH	) give_item(player,"weapon_flashbang"	), cs_set_user_bpammo(player,CSW_FLASHBANG,	g_iGrenadeFLASH)
			if(g_iGrenadeSMOKE	) give_item(player,"weapon_smokegrenade"	), cs_set_user_bpammo(player,CSW_SMOKEGRENADE,	g_iGrenadeSMOKE)

			if (g_iPrimaryWeapon[player])
			{
				get_weaponname(g_iPrimaryWeapon[player],szWeapon,sizeof szWeapon - 1)
				engclient_cmd(player, szWeapon);
			}
		}
	}
			
	set_pev(g_iEntBarrier,pev_solid,SOLID_NOT)
	set_pev(g_iEntBarrier,pev_renderamt,Float:{ 0.0 })
	
	set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
	show_hudmessage(0, "%L", LANG_SERVER, "RELEASE_ANNOUNCE");
	client_cmd(0, "spk %s", g_szRoundStart[ random( sizeof g_szRoundStart ) ] )
	
	ExecuteForward(g_fwRoundStart, g_fwDummyResult);
}

public fw_CmdStart( id, uc_handle, randseed )
{
	if (!g_isConnected[id] || !g_isAlive[id])
		return FMRES_IGNORED

	//new button = pev(id, pev_button)
	new button = get_uc( uc_handle , UC_Buttons );
	new oldbutton = pev(id, pev_oldbuttons)

	if( button & IN_USE && !(oldbutton & IN_USE) && !g_iOwnedEnt[id])
		cmdGrabEnt(id)
	else if( oldbutton & IN_USE && !(button & IN_USE) && g_iOwnedEnt[id])
		cmdStopEnt(id)

	return FMRES_IGNORED;
}

public cmdGrabEnt(id)
{
	if (g_fBuildDelay[id] + BUILD_DELAY > get_gametime())
	{
		g_fBuildDelay[id] = get_gametime()
		client_print (id, print_center, "%L", LANG_SERVER, "BUILD_SPAM")
		return PLUGIN_HANDLED
	}
	else
		g_fBuildDelay[id] = get_gametime()

	if (g_isBuildBan[id])
	{
		client_print (id, print_center, "%L", LANG_SERVER, "BUILD_BANNED")
		client_cmd(id, "spk %s", LOCK_FAIL);
		return PLUGIN_HANDLED;
	}
	
	if (g_isZombie[id] && !access(id, FLAGS_OVERRIDE))
		return PLUGIN_HANDLED
		
	if (!g_boolCanBuild && !access(id, FLAGS_BUILD) && !access(id, FLAGS_OVERRIDE))
	{
		client_print (id, print_center, "%L", LANG_SERVER, "BUILD_NOTIME")
		return PLUGIN_HANDLED
	}
	
	if (g_iOwnedEnt[id] && is_valid_ent(g_iOwnedEnt[id])) 
		cmdStopEnt(id)
	
	new ent, bodypart
	get_user_aiming (id,ent,bodypart)
	
	if (!is_valid_ent(ent) || ent == g_iEntBarrier || is_user_alive(ent) || IsMovingEnt(ent))
		return PLUGIN_HANDLED;
	
	if ((BlockLocker(ent) && BlockLocker(ent) != id) || (BlockLocker(ent) && !access(id, FLAGS_OVERRIDE)))
		return PLUGIN_HANDLED;
	
	new szClass[10], szTarget[7];
	entity_get_string(ent, EV_SZ_classname, szClass, 9);
	entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
	if (!equal(szClass, "func_wall") || equal(szTarget, "ignore"))
		return PLUGIN_HANDLED;
		
	ExecuteForward(g_fwGrabEnt_Pre, g_fwDummyResult, id, ent);

	new Float:fOrigin[3], iAiming[3], Float:fAiming[3]
	
	get_user_origin(id, iAiming, 3);
	IVecFVec(iAiming, fAiming);
	entity_get_vector(ent, EV_VEC_origin, fOrigin);

	g_fOffset1[id] = fOrigin[0] - fAiming[0];
	g_fOffset2[id] = fOrigin[1] - fAiming[1];
	g_fOffset3[id] = fOrigin[2] - fAiming[2];
	
	g_fEntDist[id] = get_user_aiming(id, ent, bodypart);
		
	if (g_fEntMinDist)
	{
		if (g_fEntDist[id] < g_fEntMinDist)
			g_fEntDist[id] = g_fEntSetDist;
	}
	else if (g_fEntMaxDist)
	{
		if (g_fEntDist[id] > g_fEntMaxDist)
			return PLUGIN_HANDLED
	}

	set_pev(ent,pev_rendermode,kRenderTransColor)
	set_pev(ent,pev_rendercolor, g_fColor[g_iColor[id]] )
	set_pev(ent,pev_renderamt, g_fRenderAmt[g_iColor[id]] )
		
	MovingEnt(ent);
	SetEntMover(ent, id);
	g_iOwnedEnt[id] = ent

	//Checked after object is successfully grabbed
	if (!g_boolCanBuild && (access(id, FLAGS_BUILD) || access(id, FLAGS_OVERRIDE)))
	{
		new adminauthid[32],adminname[32]
		get_user_authid (id,adminauthid,31)
		get_user_name(id,adminname,31)
		Log("[MOVE] Admin: %s || SteamID: %s moved an entity", adminname, adminauthid)
	}
	
	client_cmd(id, "spk %s", GRAB_START);
	
	ExecuteForward(g_fwGrabEnt_Post, g_fwDummyResult, id, ent);
	
	return PLUGIN_HANDLED
}

public cmdStopEnt(id)
{
	if (!g_iOwnedEnt[id])
		return PLUGIN_HANDLED;
		
	new ent = g_iOwnedEnt[id]
	
	ExecuteForward(g_fwDropEnt_Pre, g_fwDummyResult, id, ent);
	
	if (BlockLocker(ent))
	{
		switch(g_iLockBlocks)
		{
			case 0:
			{
				set_pev(ent,pev_rendermode,kRenderTransColor)
				set_pev(ent,pev_rendercolor, Float:{ LOCKED_COLOR })
				set_pev(ent,pev_renderamt,Float:{ LOCKED_RENDERAMT })
			}
			case 1:
			{
				set_pev(ent,pev_rendermode,kRenderTransColor)
				set_pev(ent,pev_rendercolor, g_fColor[g_iColor[id]])
				set_pev(ent,pev_renderamt,Float:{ LOCKED_RENDERAMT })
			}
		}
	}
	else
		set_pev(ent,pev_rendermode,kRenderNormal)	
	
	UnsetEntMover(ent);
	SetLastMover(ent,id);
	g_iOwnedEnt[id] = 0;
	UnmovingEnt(ent);
	
	client_cmd(id, "spk %s", GRAB_STOP);
	
	ExecuteForward(g_fwDropEnt_Post, g_fwDummyResult, id, ent);
	
	return PLUGIN_HANDLED;
}

public cmdLockBlock(id)
{
	if (!g_boolCanBuild && g_iLockBlocks)
	{
		client_print(id, print_center, "%L", LANG_SERVER, "FAIL_LOCK");
		return PLUGIN_HANDLED;
	}
	
	if (!access(id, FLAGS_LOCK) || (g_isZombie[id] && !access(id, FLAGS_OVERRIDE)))
		return PLUGIN_HANDLED;
		
	new ent, bodypart
	get_user_aiming (id,ent,bodypart)
	
	new szTarget[7], szClass[10];
	entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
	entity_get_string(ent, EV_SZ_classname, szClass, 9);
	if (!ent || !is_valid_ent(ent) || is_user_alive(ent) || ent == g_iEntBarrier || !equal(szClass, "func_wall") || equal(szTarget, "ignore"))
		return PLUGIN_HANDLED;
	
	ExecuteForward(g_fwLockEnt_Pre, g_fwDummyResult, id, ent);
	
	switch (g_iLockBlocks)
	{
		case 0:
		{
			if (!BlockLocker(ent) && !IsMovingEnt(ent))
			{
				LockBlock(ent, id);
				set_pev(ent,pev_rendermode,kRenderTransColor)
				set_pev(ent,pev_rendercolor,Float:{LOCKED_COLOR})
				set_pev(ent,pev_renderamt,Float:{LOCKED_RENDERAMT})
				client_cmd(id, "spk %s", LOCK_OBJECT);
			}
			else if (BlockLocker(ent))
			{
				UnlockBlock(ent)
				set_pev(ent,pev_rendermode,kRenderNormal)
				client_cmd(id, "spk %s", LOCK_OBJECT);
			}
		}
		case 1:
		{
			if (!BlockLocker(ent) && !IsMovingEnt(ent))
			{
				if (g_iOwnedEntities[id]<g_iLockMax || !g_iLockMax)
				{
					LockBlock(ent, id)
					g_iOwnedEntities[id]++
					set_pev(ent,pev_rendermode,kRenderTransColor)
					set_pev(ent,pev_rendercolor,g_fColor[g_iColor[id]])
					set_pev(ent,pev_renderamt,Float:{LOCKED_RENDERAMT})
					
					client_print(id, print_center, "%L [ %d / %d ]", LANG_SERVER, "BUILD_CLAIM_NEW", g_iOwnedEntities[id], g_iLockMax)
					client_cmd(id, "spk %s", LOCK_OBJECT);
				}
				else if (g_iOwnedEntities[id]>=g_iLockMax)
				{
					client_print(id, print_center, "%L", LANG_SERVER, "BUILD_CLAIM_MAX", g_iLockMax)
					client_cmd(id, "spk %s", LOCK_FAIL);
				}
			}
			else if (BlockLocker(ent))
			{
				if (BlockLocker(ent) == id || access(id, FLAGS_OVERRIDE))
				{
					g_iOwnedEntities[BlockLocker(ent)]--
					set_pev(ent,pev_rendermode,kRenderNormal)
					
					client_print(BlockLocker(ent), print_center, "%L [ %d / %d ]", LANG_SERVER, "BUILD_CLAIM_LOST", g_iOwnedEntities[BlockLocker(ent)], g_iLockMax)
					
					UnlockBlock(ent)
					client_cmd(id, "spk %s", LOCK_OBJECT);
				}
				else
				{
					client_print(id, print_center, "%L", LANG_SERVER, "BUILD_CLAIM_FAIL")
					client_cmd(id, "spk %s", LOCK_FAIL);
				}
			}	
		}
	}
	
	ExecuteForward(g_fwLockEnt_Post, g_fwDummyResult, id, ent);
	
	return PLUGIN_HANDLED
}

public cmdBuildBan(id, target)
{
	if (access(id, FLAGS_BUILDBAN))
	{
		new player
		if (target) player = target
		else
		{
			new arg[32]
			read_argv(1, arg, 31)
			player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY)
		}
		
		if (!player)
			return client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
		
		new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
		get_user_name(id,szAdminName,31)
		get_user_authid (id,szAdminAuthid,31)
		get_user_name(player, szPlayerName, 31)
		get_user_authid (player,szPlayerID,31)
		
		g_isBuildBan[player] = g_isBuildBan[player] ? false : true
		
		if (g_isBuildBan[player] && g_iOwnedEnt[player])
			cmdStopEnt(player)
		
		client_print(id, print_console, "[Base Builder] Player %s was %s from building", szPlayerName, g_isBuildBan[player] ? "banned":"unbanned")
		Log("[MOVE] Admin: %s || SteamID: %s banned Player: %s || SteamID: %s from building", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
		
		set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
		show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_BUILDBAN", g_isBuildBan[player] ? "disabled":"re-enabled");
		
		print_color(0, "%s Player^x04 %s^x01 has been^x04 %s^x01 from building", MODNAME, szPlayerName, g_isBuildBan[player] ? "banned":"unbanned")
	}
	
	return PLUGIN_HANDLED;
}

public fw_PlayerPreThink(id)
{
	if (!is_user_connected(id))
	{
		cmdStopEnt(id)
		return PLUGIN_HANDLED
	}
	
	if (g_isZombie[id])
		set_pev(id, pev_maxspeed, g_fPlayerSpeed[id])
	
	if (!g_iOwnedEnt[id] || !is_valid_ent(g_iOwnedEnt[id]))
		return FMRES_HANDLED
		
	new buttons = pev(id, pev_button)
	if (buttons & IN_ATTACK)
	{
		g_fEntDist[id] += OBJECT_PUSHPULLRATE;
		
		if (g_fEntDist[id] > g_fEntMaxDist)
		{
			g_fEntDist[id] = g_fEntMaxDist
			client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_MAX")
		}
		else
			client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_PUSH")
			
		ExecuteForward(g_fwPushPull, g_fwDummyResult, id, g_iOwnedEnt[id], 1);
	}
	else if (buttons & IN_ATTACK2)
	{
		g_fEntDist[id] -= OBJECT_PUSHPULLRATE;
			
		if (g_fEntDist[id] < g_fEntSetDist)
		{
			g_fEntDist[id] = g_fEntSetDist
			client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_MIN")
		}
		else
			client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_PULL")
			
		ExecuteForward(g_fwPushPull, g_fwDummyResult, id, g_iOwnedEnt[id], 2);
	}
	
	new iOrigin[3], iLook[3], Float:fOrigin[3], Float:fLook[3], Float:vMoveTo[3], Float:fLength
	    
	get_user_origin(id, iOrigin, 1);
	IVecFVec(iOrigin, fOrigin);
	get_user_origin(id, iLook, 3);
	IVecFVec(iLook, fLook);
	    
	fLength = get_distance_f(fLook, fOrigin);
	if (fLength == 0.0) fLength = 1.0;

	vMoveTo[0] = (fOrigin[0] + (fLook[0] - fOrigin[0]) * g_fEntDist[id] / fLength) + g_fOffset1[id];
	vMoveTo[1] = (fOrigin[1] + (fLook[1] - fOrigin[1]) * g_fEntDist[id] / fLength) + g_fOffset2[id];
	vMoveTo[2] = (fOrigin[2] + (fLook[2] - fOrigin[2]) * g_fEntDist[id] / fLength) + g_fOffset3[id];
	vMoveTo[2] = float(floatround(vMoveTo[2], floatround_floor));

	entity_set_origin(g_iOwnedEnt[id], vMoveTo);
	
	return FMRES_HANDLED
}

public fw_Traceline(Float:start[3], Float:end[3], conditions, id, trace)
{
	if (!is_user_alive(id))
		return PLUGIN_HANDLED
	
	new ent = get_tr2(trace, TR_pHit)
	
	if (is_valid_ent(ent))
	{
		new ent,body
		get_user_aiming(id,ent,body)
		
		new szClass[10], szTarget[7];
		entity_get_string(ent, EV_SZ_classname, szClass, 9);
		entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
		if (equal(szClass, "func_wall") && !equal(szTarget, "ignore") && ent != g_iEntBarrier && g_iShowMovers == 1)
		{
			if (g_boolCanBuild || access(id, ADMIN_SLAY))
			{
				set_hudmessage(0, 50, 255, -1.0, 0.55, 1, 0.01, 3.0, 0.01, 0.01);
				if (!BlockLocker(ent))
				{
					new szCurMover[32], szLastMover[32]
					if (GetEntMover(ent))
					{
						get_user_name(GetEntMover(ent),szCurMover,31)
						if (!GetLastMover(ent))
							ShowSyncHudMsg(id, g_HudSync, "Current Mover: %s^nLast Mover: NONE", szCurMover);
					}
					if (GetLastMover(ent))
					{
						get_user_name(GetLastMover(ent),szLastMover,31)
						if (!GetEntMover(ent))
							ShowSyncHudMsg(id, g_HudSync, "Current Mover: NONE^nLast Mover: %s", szLastMover);
					}
					if (GetEntMover(ent) && GetLastMover(ent))
						ShowSyncHudMsg(id, g_HudSync, "Current Mover: %s^nLast Mover: %s", szCurMover, szLastMover);
					else if (!GetEntMover(ent) && !GetLastMover(ent))
						ShowSyncHudMsg(id, g_HudSync, "This object hasn't been moved");
				}
				else
				{
					new szEntOwner[32]
					get_user_name(BlockLocker(ent),szEntOwner,31)
					ShowSyncHudMsg(id, g_HudSync, "Claimed by: %s", szEntOwner);
				}
			}
		}
	}
	else ClearSyncHud(id, g_HudSync);
	
	return PLUGIN_HANDLED
}

public fw_EmitSound(id,channel,const sample[],Float:volume,Float:attn,flags,pitch)
{
	if (!is_user_connected(id) || !g_isZombie[id] || g_boolCanBuild || g_boolPrepTime || g_boolRoundEnded)
		return FMRES_IGNORED;
		
	if(equal(sample[7], "die", 3) || equal(sample[7], "dea", 3))
	{
		emit_sound(id,channel,g_szZombieDie[random(sizeof g_szZombieDie - 1)],volume,attn,flags,pitch)
		return FMRES_SUPERCEDE
	}
	
	if(equal(sample[7], "bhit", 4))
	{
		emit_sound(id,channel,g_szZombiePain[random(sizeof g_szZombiePain - 1)],volume,attn,flags,pitch)
		return FMRES_SUPERCEDE
	}
	
	// Zombie attacks with knife
	if (equal(sample[8], "kni", 3))
	{
		if (equal(sample[14], "sla", 3)) // slash
		{
			emit_sound(id,channel,g_szZombieMiss[random(sizeof g_szZombieMiss - 1)],volume,attn,flags,pitch)
			return FMRES_SUPERCEDE;
		}
		if (equal(sample[14], "hit", 3)) // hit
		{
			if (sample[17] == 'w') // wall
			{
				emit_sound(id,channel,g_szZombieHit[random(sizeof g_szZombieHit - 1)],volume,attn,flags,pitch)
				return FMRES_SUPERCEDE;
			}
			else
			{
				emit_sound(id,channel,g_szZombieHit[random(sizeof g_szZombieHit - 1)],volume,attn,flags,pitch)
				return FMRES_SUPERCEDE;
			}
		}
		if (equal(sample[14], "sta", 3)) // stab
		{
			emit_sound(id,channel,g_szZombieMiss[random(sizeof g_szZombieMiss - 1)],volume,attn,flags,pitch)
			return FMRES_SUPERCEDE;
		}
	}
	
	return FMRES_IGNORED
}

public fw_Suicide(id) return FMRES_SUPERCEDE

public show_colors_menu(id,offset)
{
	if(offset<0) offset = 0

	new keys, curnum, menu[2048]
	for(new i=offset;i<MAX_COLORS;i++)
	{
		if (g_iColorMode == 0 || (g_iColorMode == 1 && !g_iColorOwner[i]))
		{
			g_iMenuOptions[id][curnum] = i
			keys += (1<<curnum)
	
			curnum++
			format(menu,2047,"%s^n%d. %s", menu, curnum, g_szColorName[i])
	
			if(curnum==8)
				break;
		}
	}

	format(menu,2047,"\ySelect Your Color:^nCurrent: \r%s\w^n^n%s^n", g_szColorName[g_iColor[id]], menu)
	if(curnum==8 && offset<12)
	{
		keys += (1<<8)
		format(menu,2047,"%s^n9. Next",menu)
	}
	if(offset)
	{
		keys += (1<<9)
		format(menu,2047,"%s^n0. Back",menu)
	}

	show_menu(id,keys,menu,-1,"ColorsSelect")
}

public colors_pushed(id,key)
{
	if(key<8)
	{
		g_iColorOwner[g_iMenuOptions[id][key]] = id
		g_iColorOwner[g_iColor[id]] = 0
		g_iColor[id] = g_iMenuOptions[id][key]
		print_color(id, "%s You have picked^x04 %s^x01 as your color", MODNAME, g_szColorName[g_iColor[id]])
		g_iMenuOffset[id] = 0
		
		ExecuteForward(g_fwNewColor, g_fwDummyResult, id, g_iColor[id]);
	}
	else
	{
		if(key==8)
			g_iMenuOffset[id] += 8
		if(key==9)
			g_iMenuOffset[id] -= 8
		show_colors_menu(id,g_iMenuOffset[id])
	}

	return ;
}

public show_zclass_menu(id,offset)
{
	if(offset<0) offset = 0

	new keys, curnum, menu[512], szCache1[32], szCache2[32], iCache3
	for(new i=offset;i<g_iZClasses;i++)
	{
		ArrayGetString(g_zclass_name, i, szCache1, charsmax(szCache1))
		ArrayGetString(g_zclass_info, i, szCache2, charsmax(szCache2))
		iCache3 = ArrayGetCell(g_zclass_admin, i)
		
		// Add to menu
		if (i == g_iZombieClass[id])
			format(menu,511,"%s^n\d%d. %s %s \r%s", menu, curnum+1, szCache1, szCache2, iCache3 == ADMIN_ALL ? "" : "(Admin Only)")
		else
			format(menu,511,"%s^n\w%d. %s \y%s \r%s", menu, curnum+1, szCache1, szCache2, iCache3 == ADMIN_ALL ? "" : "(Admin Only)")
		
		g_iMenuOptions[id][curnum] = i
		keys += (1<<curnum)
	
		curnum++
		
		if(curnum==8)
			break;
	}

	format(menu,511,"\ySelect Your Class:^n\w%s^n", menu)
	if(curnum==8 && offset<12)
	{
		keys += (1<<8)
		format(menu,511,"%s^n\w9. Next",menu)
	}
	if(offset)
	{
		keys += (1<<9)
		format(menu,511,"%s^n\w0. Back",menu)
	}

	show_menu(id,keys,menu,-1,"ZClassSelect")
}

public zclass_pushed(id,key)
{
	if(key<8)
	{
		if (g_iMenuOptions[id][key] == g_iZombieClass[id])
		{
			client_cmd(id, "spk %s", LOCK_FAIL);
			
			print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_CURRENT")
			show_zclass_menu(id,g_iMenuOffset[id])
			return ;
		}
		
		new iCache3 = ArrayGetCell(g_zclass_admin, g_iMenuOptions[id][key])
		
		if ((iCache3 != ADMIN_ALL || !iCache3) && !access(id, iCache3))
		{
			print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_NO_ACCESS")
			show_zclass_menu(id,g_iMenuOffset[id])
			return ;
		}
		
		g_iNextClass[id] = g_iMenuOptions[id][key]
	
		new szCache1[32]
		ArrayGetString(g_zclass_name, g_iMenuOptions[id][key], szCache1, charsmax(szCache1))
		
		if (!g_isZombie[id] || (g_isZombie[id] && (g_boolCanBuild || g_boolPrepTime)))
			print_color(id, "%s You have selected^x04 %s^x01 as your next class", MODNAME, szCache1)
		if (!g_isAlive[id])
			print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_RESPAWN")
		g_iMenuOffset[id] = 0
		
		if (g_isZombie[id] && (g_boolCanBuild || g_boolPrepTime))
			ExecuteHamB(Ham_CS_RoundRespawn, id)
			
		ExecuteForward(g_fwClassPicked, g_fwDummyResult, id, g_iZombieClass[id]);
	}
	else
	{
		if(key==8)
			g_iMenuOffset[id] += 8
		if(key==9)
			g_iMenuOffset[id] -= 8
		show_zclass_menu(id,g_iMenuOffset[id])
	}

	return ;
}

/*------------------------------------------------------------------------------------------------*/
public show_method_menu(id)
{
	if(g_boolFirstTime[id])
	{
		g_boolFirstTime[id] = false
		show_primary_menu(id,0)
	}
	else
	{
		g_iMenuOffset[id] = 0
		show_menu(id,(1<<0)|(1<<1),"\yChoose Your Weapon^n^n\y1. \wNew Guns^n\y2. \wLast Guns",-1,"WeaponMethodMenu")
	}
}

public weapon_method_pushed(id,key)
{
	switch(key)
	{
		case 0: show_primary_menu(id,0)
		case 1: give_weapons(id)
	}
	return ;
}

public show_primary_menu(id,offset)
{
	if(offset<0) offset = 0

	new cvar_value[32]
	get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
	new flags = read_flags(cvar_value)

	new keys, curnum, menu[2048]
	for(new i=offset;i<19;i++)
	{
		if(flags & power(2,i))
		{
			g_iMenuOptions[id][curnum] = i
			keys += (1<<curnum)
	
			curnum++
			format(menu,2047,"%s^n%d. %s",menu,curnum,szWeaponNames[i])
	
			if(curnum==8)
				break;
		}
	}

	format(menu,2047,"\yPrimary Weapon:\w^n%s^n",menu)
	if(curnum==8 && offset<12)
	{
		keys += (1<<8)
		format(menu,2047,"%s^n9. Next",menu)
	}
	if(offset)
	{
		keys += (1<<9)
		format(menu,2047,"%s^n0. Back",menu)
	}

	show_menu(id,keys,menu,-1,"PrimaryWeaponSelect")
}

public prim_weapons_pushed(id,key)
{
	if(key<8)
	{
		g_iWeaponPicked[0][id] = g_iMenuOptions[id][key]
		g_iMenuOffset[id] = 0
		show_secondary_menu(id,0)
	}
	else
	{
		if(key==8)
			g_iMenuOffset[id] += 8
		if(key==9)
			g_iMenuOffset[id] -= 8
		show_primary_menu(id,g_iMenuOffset[id])
	}
	return ;
}

public show_secondary_menu(id,offset)
{
	if(offset<0) offset = 0

	new cvar_value[32]
	get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
	new flags = read_flags(cvar_value)

	new keys, curnum, menu[2048]
	for(new i=18;i<24;i++)
	{
		if(flags & power(2,i))
		{
			g_iMenuOptions[id][curnum] = i
			keys += (1<<curnum)
	
			curnum++
			format(menu,2047,"%s^n%d. %s",menu,curnum,szWeaponNames[i])
		}
	}

	format(menu,2047,"\ySecondary Weapon:\w^n%s",menu)

	show_menu(id,keys,menu,-1,"SecWeaponSelect")
}

public sec_weapons_pushed(id,key)
{
	if(key<8)
	{
		g_iWeaponPicked[1][id] = g_iMenuOptions[id][key]
	}
	give_weapons(id)
	return ;
}

public give_weapons(id)
{
	strip_user_weapons(id)
	give_item(id,"weapon_knife")
   
	new szWeapon[32], csw
	csw = csw_contant(g_iWeaponPicked[0][id])
	get_weaponname(csw,szWeapon,31)
	give_item(id,szWeapon)
	cs_set_user_bpammo(id,csw,999)
	g_iPrimaryWeapon[id] = csw

	csw = csw_contant(g_iWeaponPicked[1][id])
	get_weaponname(csw,szWeapon,31)
	give_item(id,szWeapon)
	cs_set_user_bpammo(id,csw,999)
	
	g_boolRepick[id] = false
}

stock csw_contant(weapon)
{
	new num = 29
	switch(weapon)
	{
		case 0: num = 3
		case 1: num = 5
		case 2: num = 7
		case 3: num = 8
		case 4: num = 12
		case 5: num = 13
		case 6: num = 14
		case 7: num = 15
		case 8: num = 18
		case 9: num = 19
		case 10: num = 20
		case 11: num = 21
		case 12: num = 22
		case 13: num = 23
		case 14: num = 24
		case 15: num = 27
		case 16: num = 28
		case 17: num = 30
		case 18: num = 1
		case 19: num = 10
		case 20: num = 11
		case 21: num = 16
		case 22: num = 17
		case 23: num = 26
		case 24:
		{
			new s_weapon[32]
		
			get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
		   
			new flags = read_flags(s_weapon)
			do
			{
				num = random_num(0,18)
				if(!(num & flags))
				{
					num = -1
				}
			}
			while(num==-1)
			num = csw_contant(num)
		}
		case 25:
		{
			new s_weapon[32]

			get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
		
			new flags = read_flags(s_weapon)
			do
			{
				num = random_num(18,23)
				if(!(num & flags))
				{
					num = -1
				}
			}
			while(num==-1)
			num = csw_contant(num)
		}
	}
	return num;
}
/*------------------------------------------------------------------------------------------------*/

Log(const message_fmt[], any:...)
{
	static message[256];
	vformat(message, sizeof(message) - 1, message_fmt, 2);
	
	static filename[96];
	static dir[64];
	if( !dir[0] )
	{
		get_basedir(dir, sizeof(dir) - 1);
		add(dir, sizeof(dir) - 1, "/logs");
	}
	
	format_time(filename, sizeof(filename) - 1, "%m-%d-%Y");
	format(filename, sizeof(filename) - 1, "%s/BaseBuilder_%s.log", dir, filename);
	
	log_to_file(filename, "%s", message);
}

print_color(target, const message[], any:...)
{
	static buffer[512], i, argscount
	argscount = numargs()
	
	// Send to everyone
	if (!target)
	{
		static player
		for (player = 1; player <= g_iMaxPlayers; player++)
		{
			// Not connected
			if (!g_isConnected[player])
				continue;
			
			// Remember changed arguments
			static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
			changedcount = 0
			
			// Replace LANG_PLAYER with player id
			for (i = 2; i < argscount; i++)
			{
				if (getarg(i) == LANG_PLAYER)
				{
					setarg(i, 0, player)
					changed[changedcount] = i
					changedcount++
				}
			}
			
			// Format message for player
			vformat(buffer, charsmax(buffer), message, 3)
			
			// Send it
			message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
			write_byte(player)
			write_string(buffer)
			message_end()
			
			// Replace back player id's with LANG_PLAYER
			for (i = 0; i < changedcount; i++)
				setarg(changed[i], 0, LANG_PLAYER)
		}
	}
	// Send to specific target
	else
	{
		// Format message for player
		vformat(buffer, charsmax(buffer), message, 3)
		
		// Send it
		message_begin(MSG_ONE, g_msgSayText, _, target)
		write_byte(target)
		write_string(buffer)
		message_end()
	}
}

stock fm_cs_get_current_weapon_ent(id)
	return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX);

public native_register_zombie_class(const name[], const info[], const model[], const clawmodel[], hp, speed, Float:gravity, Float:knockback, adminflags, credits)
{
	if (!g_boolArraysCreated)
		return 0;
		
	// Strings passed byref
	param_convert(1)
	param_convert(2)
	param_convert(3)
	param_convert(4)
	
	// Add the class
	ArrayPushString(g_zclass_name, name)
	ArrayPushString(g_zclass_info, info)
	
	ArrayPushCell(g_zclass_modelsstart, ArraySize(g_zclass_playermodel))
	ArrayPushString(g_zclass_playermodel, model)
	ArrayPushCell(g_zclass_modelsend, ArraySize(g_zclass_playermodel))
	ArrayPushCell(g_zclass_modelindex, -1)
	
	ArrayPushString(g_zclass_clawmodel, clawmodel)
	ArrayPushCell(g_zclass_hp, hp)
	ArrayPushCell(g_zclass_spd, speed)
	ArrayPushCell(g_zclass_grav, gravity)
	ArrayPushCell(g_zclass_admin, adminflags)
	ArrayPushCell(g_zclass_credits, credits)
	
	// Set temporary new class flag
	ArrayPushCell(g_zclass_new, 1)
	
	// Override zombie classes data with our customizations
	new i, k, buffer[32], Float:buffer2, nummodels_custom, nummodels_default, prec_mdl[100], size = ArraySize(g_zclass2_realname)
	for (i = 0; i < size; i++)
	{
		ArrayGetString(g_zclass2_realname, i, buffer, charsmax(buffer))
		
		// Check if this is the intended class to override
		if (!equal(name, buffer))
			continue;
		
		// Remove new class flag
		ArraySetCell(g_zclass_new, g_iZClasses, 0)
		
		// Replace caption
		ArrayGetString(g_zclass2_name, i, buffer, charsmax(buffer))
		ArraySetString(g_zclass_name, g_iZClasses, buffer)
		
		// Replace info
		ArrayGetString(g_zclass2_info, i, buffer, charsmax(buffer))
		ArraySetString(g_zclass_info, g_iZClasses, buffer)
		
		nummodels_custom = ArrayGetCell(g_zclass2_modelsend, i) - ArrayGetCell(g_zclass2_modelsstart, i)
		nummodels_default = ArrayGetCell(g_zclass_modelsend, g_iZClasses) - ArrayGetCell(g_zclass_modelsstart, g_iZClasses)
			
		// Replace each player model and model index
		for (k = 0; k < min(nummodels_custom, nummodels_default); k++)
		{
			ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
			ArraySetString(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k, buffer)
				
			// Precache player model and replace its modelindex with the real one
			formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
			ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k, engfunc(EngFunc_PrecacheModel, prec_mdl))
		}
			
		// We have more custom models than what we can accommodate,
		// Let's make some space...
		if (nummodels_custom > nummodels_default)
		{
			for (k = nummodels_default; k < nummodels_custom; k++)
			{
				ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
				ArrayInsertStringAfter(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k - 1, buffer)
				
				// Precache player model and retrieve its modelindex
				formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
				ArrayInsertCellAfter(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k - 1, engfunc(EngFunc_PrecacheModel, prec_mdl))
			}
				
			// Fix models end index for this class
			ArraySetCell(g_zclass_modelsend, g_iZClasses, ArrayGetCell(g_zclass_modelsend, g_iZClasses) + (nummodels_custom - nummodels_default))
		}
		
		// Replace clawmodel
		ArrayGetString(g_zclass2_clawmodel, i, buffer, charsmax(buffer))
		ArraySetString(g_zclass_clawmodel, g_iZClasses, buffer)
		
		// Precache clawmodel
		formatex(prec_mdl, charsmax(prec_mdl), "models/%s.mdl", buffer)
		engfunc(EngFunc_PrecacheModel, prec_mdl)
		
		// Replace health
		buffer[0] = ArrayGetCell(g_zclass2_hp, i)
		ArraySetCell(g_zclass_hp, g_iZClasses, buffer[0])
		
		// Replace speed
		buffer[0] = ArrayGetCell(g_zclass2_spd, i)
		ArraySetCell(g_zclass_spd, g_iZClasses, buffer[0])
		
		// Replace gravity
		buffer2 = Float:ArrayGetCell(g_zclass2_grav, i)
		ArraySetCell(g_zclass_grav, g_iZClasses, buffer2)
		
		// Replace admin flags
		buffer2 = ArrayGetCell(g_zclass2_admin, i)
		ArraySetCell(g_zclass_admin, g_iZClasses, buffer2)
	
		// Replace credits
		buffer2 = ArrayGetCell(g_zclass2_credits, i)
		ArraySetCell(g_zclass_credits, g_iZClasses, buffer2)
	}
	
	// If class was not overriden with customization data
	if (ArrayGetCell(g_zclass_new, g_iZClasses))
	{
		// Precache default class model and replace modelindex with the real one
		formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", model, model)
		ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses), engfunc(EngFunc_PrecacheModel, prec_mdl))
		
		// Precache default clawmodel
		formatex(prec_mdl, charsmax(prec_mdl), "models/%s.mdl", clawmodel)
		engfunc(EngFunc_PrecacheModel, prec_mdl)
	}

	g_iZClasses++
	
	return g_iZClasses-1
}

public native_get_class_cost(classid)
{
	if (classid < 0 || classid >= g_iZClasses)
		return -1;
	
	return ArrayGetCell(g_zclass_credits, classid)
}

public native_get_user_zombie_class(id) return g_iZombieClass[id];
public native_get_user_next_class(id) return g_iNextClass[id];
public native_set_user_zombie_class(id, classid)
{
	if (classid < 0 || classid >= g_iZClasses)
		return 0;
	
	g_iNextClass[id] = classid
	return 1;
}

public native_is_user_zombie(id) return g_isZombie[id]
public native_is_user_banned(id) return g_isBuildBan[id]

public native_bool_buildphase() return g_boolCanBuild
public native_bool_prepphase() return g_boolPrepTime

public native_get_build_time()
{
	if (g_boolCanBuild)
		return g_iCountDown
		
	return 0;
}

public native_set_build_time(time)
{
	if (g_boolCanBuild)
	{
		g_iCountDown = time
		return 1
	}
		
	return 0;
}

public native_get_user_color(id) return g_iColor[id]
public native_set_user_color(id, color)
{
	g_iColor[id] = color
}

public native_drop_user_block(id)
{
	cmdStopEnt(id)
}
public native_get_user_block(id)
{
	if (g_iOwnedEnt[id])
		return g_iOwnedEnt[id]
		
	return 0;
}
public native_set_user_block(id, entity)
{
	if (is_valid_ent(entity) && !is_user_alive(entity) && !MovingEnt(entity))
		g_iOwnedEnt[id] = entity
}

public native_is_locked_block(entity)
{
	if (is_valid_ent(entity) && !is_user_alive(entity))
		return BlockLocker(entity) ? true : false
		
	return -1;
}
public native_lock_block(entity)
{
	if (is_valid_ent(entity) && !is_user_alive(entity) && !BlockLocker(entity))
	{
		LockBlock(entity, 33);
		set_pev(entity,pev_rendermode,kRenderTransColor)
		set_pev(entity,pev_rendercolor,Float:{LOCKED_COLOR})
		set_pev(entity,pev_renderamt,Float:{LOCKED_RENDERAMT})
	}
}
public native_unlock_block(entity)
{
	if (is_valid_ent(entity) && !is_user_alive(entity) && BlockLocker(entity))
	{
		UnlockBlock(entity)
		set_pev(entity,pev_rendermode,kRenderNormal)
	}
}

public native_release_zombies()
{
	if (g_boolCanBuild || g_boolPrepTime)
	{
		Release_Zombies()
		return 1;
	}
	return 0;
}

public native_set_user_primary(id, csw_primary)
{
	if (CSW_P228<=csw_primary<=CSW_P90)
	{
		g_iPrimaryWeapon[id] = csw_primary
		return g_iPrimaryWeapon[id];
	}
		
	return -1;
}

public native_get_user_primary(id) return g_iPrimaryWeapon[id]

public native_get_flags_build() 		return FLAGS_BUILD
public native_get_flags_lock() 		return FLAGS_LOCK
public native_get_flags_buildban() 	return FLAGS_BUILDBAN
public native_get_flags_swap() 		return FLAGS_SWAP
public native_get_flags_revive() 	return FLAGS_REVIVE
public native_get_flags_guns() 		return FLAGS_GUNS
public native_get_flags_release() 	return FLAGS_RELEASE
public native_get_flags_override() 	return FLAGS_OVERRIDE

/*public native_set_user_mult(id, attribute, Float: amount)
{
	if (attribute < ATT_HEALTH || attribute > ATT_GRAVITY)
		return 0;
		
	if (amount < 1.0)
		amount = 1.0
		
	g_fClassMultiplier[id][attribute] = amount
	
	return 1;
}*/
Lo que yo hice:

Code:
/*
Base Builder Zombie Mod
Tirant

Version 6.5 Pub
*/

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

//Enable this only if you have bought the credits plugin
//#define BB_CREDITS

#define FLAGS_BUILD 	ADMIN_KICK
#define FLAGS_LOCK 	ADMIN_ALL
#define FLAGS_BUILDBAN 	ADMIN_KICK
#define FLAGS_SWAP 	ADMIN_KICK
#define FLAGS_REVIVE 	ADMIN_KICK
#define FLAGS_GUNS 	ADMIN_LEVEL_A
#define FLAGS_RELEASE 	ADMIN_BAN
#define FLAGS_OVERRIDE 	ADMIN_BAN

#define VERSION "6.5"
#define MODNAME "^x01 [^x04 Base Builder^x01 ]"

#define LockBlock(%1,%2)  	( entity_set_int( %1, EV_INT_iuser1,     %2 ) )
#define UnlockBlock(%1)   	( entity_set_int( %1, EV_INT_iuser1,     0  ) )
#define BlockLocker(%1)   	( entity_get_int( %1, EV_INT_iuser1         ) )

#define MovingEnt(%1)     	( entity_set_int( %1, EV_INT_iuser2,     1 ) )
#define UnmovingEnt(%1)   	( entity_set_int( %1, EV_INT_iuser2,     0 ) )
#define IsMovingEnt(%1)   	( entity_get_int( %1, EV_INT_iuser2 ) == 1 )

#define SetEntMover(%1,%2)  	( entity_set_int( %1, EV_INT_iuser3, %2 ) )
#define UnsetEntMover(%1)   	( entity_set_int( %1, EV_INT_iuser3, 0  ) )
#define GetEntMover(%1)   	( entity_get_int( %1, EV_INT_iuser3     ) )

#define SetLastMover(%1,%2)  	( entity_set_int( %1, EV_INT_iuser4, %2 ) )
#define UnsetLastMover(%1)   	( entity_set_int( %1, EV_INT_iuser4, 0  ) )
#define GetLastMover(%1)  	( entity_get_int( %1, EV_INT_iuser4     ) )

#define MAXPLAYERS 32
#define MAXENTS 1024
#define AMMO_SLOT 376
#define MODELCHANGE_DELAY 0.5
#define AUTO_TEAM_JOIN_DELAY 0.1
#define TEAM_SELECT_VGUI_MENU_ID 2
#define OBJECT_PUSHPULLRATE 4.0
#define HUD_FRIEND_HEIGHT 0.30

#define BARRIER_COLOR 0.0, 0.0, 0.0
#define BARRIER_RENDERAMT 150.0

#define BLOCK_RENDERAMT 150.0

#define LOCKED_COLOR 125.0, 0.0, 0.0
#define LOCKED_RENDERAMT 225.0

const ZOMBIE_ALLOWED_WEAPONS_BITSUM = (1<<CSW_KNIFE)
#define OFFSET_WPN_WIN 	  41
#define OFFSET_WPN_LINUX  4

#define OFFSET_ACTIVE_ITEM 373
#define OFFSET_LINUX 5

#if cellbits == 32
	#define OFFSET_BUYZONE 235
#else
	#define OFFSET_BUYZONE 268
#endif

new g_iMaxPlayers
new g_msgSayText, g_msgStatusText
new g_HudSync

new g_isConnected[MAXPLAYERS+1]
new g_isAlive[MAXPLAYERS+1]
new g_isZombie[MAXPLAYERS+1]
new g_isBuildBan[MAXPLAYERS+1]
new g_isCustomModel[MAXPLAYERS+1]

enum (+= 5000)
{
	TASK_BUILD = 10000,
	TASK_PREPTIME,
	TASK_MODELSET,
	TASK_RESPAWN,
	TASK_HEALTH,
	TASK_IDLESOUND
}

//Custom Sounds
new g_szRoundStart[][] = 
{
	"basebuilder/round_start.wav",
	"basebuilder/round_start2.wav"
}

#define WIN_ZOMBIES 	"basebuilder/win_zombies2.wav"
#define WIN_BUILDERS 	"basebuilder/win_builders2.wav"

#define PHASE_PREP 	"basebuilder/phase_prep3.wav"
#define PHASE_BUILD 	"basebuilder/phase_build3.wav"

#define LOCK_OBJECT 	"buttons/lightswitch2.wav"
#define LOCK_FAIL	"buttons/button10.wav"

#define GRAB_START	"basebuilder/block_grab.wav"
#define GRAB_STOP	"basebuilder/block_drop.wav"

#define INFECTION	"basebuilder/zombie_kill1.wav"

new const g_szZombiePain[][] =
{
	"basebuilder/zombie/pain/pain1.wav",
	"basebuilder/zombie/pain/pain2.wav",
	"basebuilder/zombie/pain/pain3.wav"
}

new const g_szZombieDie[][] =
{
	"basebuilder/zombie/death/death1.wav",
	"basebuilder/zombie/death/death2.wav",
	"basebuilder/zombie/death/death3.wav"
}

new const g_szZombieIdle[][] =
{
	"basebuilder/zombie/idle/idle1.wav",
	"basebuilder/zombie/idle/idle2.wav",
	"basebuilder/zombie/idle/idle3.wav"
}

new const g_szZombieHit[][] =
{
	"basebuilder/zombie/hit/hit1.wav",
	"basebuilder/zombie/hit/hit1.wav",
	"basebuilder/zombie/hit/hit1.wav"
}

new const g_szZombieMiss[][] =
{
	"basebuilder/zombie/miss/miss1.wav",
	"basebuilder/zombie/miss/miss2.wav",
	"basebuilder/zombie/miss/miss3.wav"
}

//Custom Player Models
new Float:g_fModelsTargetTime, Float:g_fRoundStartTime
new g_szPlayerModel[MAXPLAYERS+1][32]

//Game Name
new g_szModName[32]

new g_iCountDown, g_iEntBarrier
new bool:g_boolCanBuild, bool:g_boolPrepTime, bool:g_boolRoundEnded
new g_iFriend[MAXPLAYERS+1]
new CsTeams:g_iTeam[MAXPLAYERS+1], CsTeams:g_iCurTeam[MAXPLAYERS+1]
new bool:g_boolFirstTeam[MAXPLAYERS+1]

//Building Stores
new Float:g_fOffset1[MAXPLAYERS+1], Float:g_fOffset2[MAXPLAYERS+1], Float:g_fOffset3[MAXPLAYERS+1]
new g_iOwnedEnt[MAXPLAYERS+1], g_iOwnedEntities[MAXPLAYERS+1]
new Float:g_fEntDist[MAXPLAYERS+1]

static const g_szWpnEntNames[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
			"weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
			"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
			"weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
			"weapon_ak47", "weapon_knife", "weapon_p90" }
			
//Weapon Names (For Guns Menu)
static const szWeaponNames[24][23] = { "Schmidt Scout", "XM1014 M4", "Ingram MAC-10", "Steyr AUG A1", "UMP 45", "SG-550 Auto-Sniper",
			"IMI Galil", "Famas", "AWP Magnum Sniper", "MP5 Navy", "M249 Para Machinegun", "M3 Super 90", "M4A1 Carbine",
			"Schmidt TMP", "G3SG1 Auto-Sniper", "SG-552 Commando", "AK-47 Kalashnikov", "ES P90", "P228 Compact",
			"Dual Elite Berettas", "Fiveseven", "USP .45 ACP Tactical", "Glock 18C", "Desert Eagle .50 AE" }
			
#define MAX_COLORS 24
new const Float:g_fColor[MAX_COLORS][3] = 
{
	{200.0, 000.0, 000.0},
	{255.0, 083.0, 073.0},
	{255.0, 117.0, 056.0},
	{255.0, 174.0, 066.0},
	{255.0, 207.0, 171.0},
	{252.0, 232.0, 131.0},
	{254.0, 254.0, 034.0},
	{059.0, 176.0, 143.0},
	{197.0, 227.0, 132.0},
	{000.0, 150.0, 000.0},
	{120.0, 219.0, 226.0},
	{135.0, 206.0, 235.0},
	{128.0, 218.0, 235.0},
	{000.0, 000.0, 255.0},
	{146.0, 110.0, 174.0},
	{255.0, 105.0, 180.0},
	{246.0, 100.0, 175.0},
	{205.0, 074.0, 076.0},
	{250.0, 167.0, 108.0},
	{234.0, 126.0, 093.0},
	{180.0, 103.0, 077.0},
	{149.0, 145.0, 140.0},
	{000.0, 000.0, 000.0},
	{255.0, 255.0, 255.0}
}

new const Float:g_fRenderAmt[MAX_COLORS] = 
{
	100.0, //Red
	135.0, //Red Orange
	140.0, //Orange
	120.0, //Yellow Orange
	140.0, //Peach
	125.0, //Yellow
	100.0, //Lemon Yellow
	125.0, //Jungle Green
	135.0, //Yellow Green
	100.0, //Green
	125.0, //Aquamarine
	150.0, //Baby Blue
	090.0, //Sky Blue
	075.0, //Blue
	175.0, //Violet
	150.0, //Hot Pink
	175.0, //Magenta
	140.0, //Mahogany
	140.0, //Tan
	140.0, //Light Brown
	165.0, //Brown
	175.0, //Gray
	125.0, //Black
	125.0   //White
}

new const g_szColorName[MAX_COLORS][] = 
{
	"Red",
	"Red Orange",
	"Orange",
	"Yellow Orange",
	"Peach",
	"Yellow",
	"Lemon Yellow",
	"Jungle Green",
	"Yellow Green",
	"Green",
	"Aquamarine",
	"Baby Blue",
	"Sky Blue",
	"Blue",
	"Violet",
	"Hot Pink",
	"Magenta",
	"Mahogany",
	"Tan",
	"Light Brown",
	"Brown",
	"Gray",
	"Black",
	"White"
}

enum
{
	COLOR_RED = 0, 		//200, 000, 000
	COLOR_REDORANGE, 	//255, 083, 073
	COLOR_ORANGE, 		//255, 117, 056
	COLOR_YELLOWORANGE, 	//255, 174, 066
	COLOR_PEACH, 		//255, 207, 171
	COLOR_YELLOW, 		//252, 232, 131
	COLOR_LEMONYELLOW, 	//254, 254, 034
	COLOR_JUNGLEGREEN, 	//059, 176, 143
	COLOR_YELLOWGREEN, 	//197, 227, 132
	COLOR_GREEN, 		//000, 200, 000
	COLOR_AQUAMARINE, 	//120, 219, 226
	COLOR_BABYBLUE, 		//135, 206, 235
	COLOR_SKYBLUE, 		//128, 218, 235
	COLOR_BLUE, 		//000, 000, 200
	COLOR_VIOLET, 		//146, 110, 174
	COLOR_PINK, 		//255, 105, 180
	COLOR_MAGENTA, 		//246, 100, 175
	COLOR_MAHOGANY,		//205, 074, 076
	COLOR_TAN, 		//250, 167, 108
	COLOR_LIGHTBROWN, 	//234, 126, 093
	COLOR_BROWN, 		//180, 103, 077
	COLOR_GRAY, 		//149, 145, 140
	COLOR_BLACK, 		//000, 000, 000
	COLOR_WHITE 		//255, 255, 255
}

new g_iColor[MAXPLAYERS+1]
new g_iColorOwner[MAX_COLORS]

//Color Menu
new g_iMenuOffset[MAXPLAYERS+1], g_iMenuOptions[MAXPLAYERS+1][8], g_iWeaponPicked[2][MAXPLAYERS+1],
	g_iPrimaryWeapon[MAXPLAYERS+1]
	
new bool:g_boolFirstTime[MAXPLAYERS+1], bool:g_boolRepick[MAXPLAYERS+1]

new Float:g_fBuildDelay[MAXPLAYERS+1]
#define BUILD_DELAY 0.75

#define KEYS_GENERIC (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)

enum
{
	ATT_HEALTH = 0,
	ATT_SPEED,
	ATT_GRAVITY
}

//Zombie Classes
new g_iZClasses
new g_iZombieClass[MAXPLAYERS+1]
new bool:g_boolFirstSpawn[MAXPLAYERS+1]
new g_szPlayerClass[MAXPLAYERS+1][32]
new g_iNextClass[MAXPLAYERS+1]
new Float:g_fPlayerSpeed[MAXPLAYERS+1]
new bool:g_boolArraysCreated
new Array:g_zclass_name
new Array:g_zclass_info
new Array:g_zclass_modelsstart // start position in models array
new Array:g_zclass_modelsend // end position in models array
new Array:g_zclass_playermodel // player models array
new Array:g_zclass_modelindex // model indices array
new Array:g_zclass_clawmodel
new Array:g_zclass_hp
new Array:g_zclass_spd
new Array:g_zclass_grav
new Array:g_zclass_admin
new Array:g_zclass_credits
//new Float:g_fClassMultiplier[MAXPLAYERS+1][3]

new Array:g_zclass2_realname, Array:g_zclass2_name, Array:g_zclass2_info,
Array:g_zclass2_modelsstart, Array:g_zclass2_modelsend, Array:g_zclass2_playermodel,
Array:g_zclass2_clawmodel, Array:g_zclass2_hp, Array:g_zclass2_spd,
Array:g_zclass2_grav, Array:g_zclass2_admin, Array:g_zclass2_credits, Array:g_zclass_new

//Forwards
new g_fwRoundStart, g_fwPrepStarted, g_fwBuildStarted, g_fwClassPicked, g_fwClassSet,
g_fwPushPull, g_fwGrabEnt_Pre, g_fwGrabEnt_Post, g_fwDropEnt_Pre,
 g_fwDropEnt_Post, g_fwNewColor, g_fwLockEnt_Pre, g_fwLockEnt_Post, g_fwDummyResult

 //Cvars
new g_pcvar_buildtime, g_iBuildTime,
	g_pcvar_preptime, g_iPrepTime,
	g_pcvar_givenades, g_iGrenadeHE, g_iGrenadeFLASH, g_iGrenadeSMOKE,
	g_pcvar_entmindist, Float: g_fEntMinDist,
	g_pcvar_entsetdist, Float: g_fEntSetDist,
	g_pcvar_entmaxdist, Float: g_fEntMaxDist,
	g_pcvar_resetent, g_iResetEnt,
	g_pcvar_showmovers, g_iShowMovers,
	g_pcvar_lockblocks, g_iLockBlocks,
	g_pcvar_lockmax, g_iLockMax,
	g_pcvar_colormode, g_iColorMode,
	g_pcvar_zombietime, g_iZombieTime,
	g_pcvar_infecttime, g_iInfectTime,
	g_pcvar_supercut, g_iSupercut,
	g_pcvar_gunsmenu, g_iGunsMenu,
	g_pcvar_enabled,
	g_pcvar_allowedweps
 
public plugin_precache()
{
	server_cmd("bb_credits_active 0")
	
	register_plugin("Base Builder", VERSION, "Tirant")
	register_cvar("base_builder", VERSION, FCVAR_SPONLY|FCVAR_SERVER)
	set_cvar_string("base_builder", VERSION)
	
	g_pcvar_enabled = register_cvar("bb_enabled", "1")
	
	if (!get_pcvar_num(g_pcvar_enabled))
		return;

	new szCache[64], i;
		
	g_pcvar_buildtime = register_cvar("bb_buildtime", "150") //Build Time
	g_iBuildTime = clamp(get_pcvar_num(g_pcvar_buildtime), 30, 300)
	g_pcvar_preptime = register_cvar("bb_preptime", "30") //Prep Time
	g_iPrepTime = clamp(get_pcvar_num(g_pcvar_preptime), 0, 60)
	g_pcvar_zombietime = register_cvar("bb_zombie_respawn_delay", "3") //Zombie Respawn Delay
	g_iZombieTime = clamp(get_pcvar_num(g_pcvar_zombietime), 1, 30)
	g_pcvar_infecttime = register_cvar("bb_infection_respawn", "5") //Survivor Respawn Infection Delay
	g_iInfectTime = clamp(get_pcvar_num(g_pcvar_infecttime), 0, 30)
	g_pcvar_showmovers = register_cvar("bb_showmovers", "1") //Show Movers
	g_iShowMovers = clamp(get_pcvar_num(g_pcvar_showmovers), 0, 1)
	g_pcvar_lockblocks = register_cvar("bb_lockblocks", "1") //Lock blocks
	g_iLockBlocks = clamp(get_pcvar_num(g_pcvar_lockblocks), 0, 1)
	g_pcvar_lockmax = register_cvar("bb_lockmax", "10") //Lock max
	g_iLockMax = clamp(get_pcvar_num(g_pcvar_lockmax), 0, 50)
	g_pcvar_colormode = register_cvar("bb_colormode", "1") //Color mode <0/1/2> Menu, one color per player, random
	g_iColorMode = clamp(get_pcvar_num(g_pcvar_colormode), 0, 2)
	g_pcvar_entmaxdist = register_cvar("bb_max_move_dist", "768") //Push ceiling
	g_fEntMaxDist = get_pcvar_float(g_pcvar_entmaxdist)
	g_pcvar_entmindist = register_cvar("bb_min_move_dist", "32") //Pull floor
	g_fEntMinDist = get_pcvar_float(g_pcvar_entmindist)
	g_pcvar_entsetdist = register_cvar("bb_min_dist_set", "64") //Grab set
	g_fEntSetDist = get_pcvar_float(g_pcvar_entsetdist)
	g_pcvar_resetent = register_cvar("bb_resetblocks", "1") //Reset blocks on new round
	g_iResetEnt = clamp(get_pcvar_num(g_pcvar_resetent), 0, 1)
	g_pcvar_supercut = register_cvar("bb_zombie_supercut", "0") //One hit kill for zombies
	g_iSupercut = clamp(get_pcvar_num(g_pcvar_supercut), 0, 1)
	g_pcvar_gunsmenu = register_cvar("bb_gunsmenu", "1") //Use the internal guns menu
	g_iGunsMenu = clamp(get_pcvar_num(g_pcvar_gunsmenu), 0, 1)
	
	g_pcvar_givenades = register_cvar("bb_roundnades","h") //Grenades
	g_pcvar_allowedweps = register_cvar("bb_weapons","abcdeghijlmnqrstuvwx")
	
	get_pcvar_string(g_pcvar_givenades, szCache, sizeof szCache - 1)
	for (i=0; i<strlen(szCache);i++)
	{
		switch(szCache[i])
		{
			case 'h': g_iGrenadeHE++
			case 'f': g_iGrenadeFLASH++
			case 's': g_iGrenadeSMOKE++
		}
	}
	
	for (i=0; i<sizeof g_szRoundStart; i++) 	precache_sound(g_szRoundStart[i])
	for (i=0; i<sizeof g_szZombiePain;i++) 	precache_sound(g_szZombiePain[i])
	for (i=0; i<sizeof g_szZombieDie;i++) 	precache_sound(g_szZombieDie[i])
	for (i=0; i<sizeof g_szZombieIdle;i++) 	precache_sound(g_szZombieIdle[i])
	for (i=0; i<sizeof g_szZombieHit;i++) 	precache_sound(g_szZombieHit[i])
	for (i=0; i<sizeof g_szZombieMiss;i++) 	precache_sound(g_szZombieMiss[i])
	
	precache_sound(WIN_ZOMBIES)
	precache_sound(WIN_BUILDERS)
	precache_sound(PHASE_BUILD)
	precache_sound(PHASE_PREP)
	precache_sound(LOCK_OBJECT)
	precache_sound(LOCK_FAIL)
	precache_sound(GRAB_START)
	precache_sound(GRAB_STOP)
	if (g_iInfectTime)
		precache_sound(INFECTION)
	
	i = create_entity("info_bomb_target");
	entity_set_origin(i, Float:{8192.0,8192.0,8192.0})
	
	i = create_entity("info_map_parameters");
	DispatchKeyValue(i, "buying", "3");
	DispatchKeyValue(i, "bombradius", "1");
	DispatchSpawn(i);
	
	g_zclass_name = ArrayCreate(32, 1)
	g_zclass_info = ArrayCreate(32, 1)
	g_zclass_modelsstart = ArrayCreate(1, 1)
	g_zclass_modelsend = ArrayCreate(1, 1)
	g_zclass_playermodel = ArrayCreate(32, 1)
	g_zclass_modelindex = ArrayCreate(1, 1)
	g_zclass_clawmodel = ArrayCreate(32, 1)
	g_zclass_hp = ArrayCreate(1, 1)
	g_zclass_spd = ArrayCreate(1, 1)
	g_zclass_grav = ArrayCreate(1, 1)
	g_zclass_admin = ArrayCreate(1, 1)
	g_zclass_credits = ArrayCreate(1, 1)
	
	g_zclass2_realname = ArrayCreate(32, 1)
	g_zclass2_name = ArrayCreate(32, 1)
	g_zclass2_info = ArrayCreate(32, 1)
	g_zclass2_modelsstart = ArrayCreate(1, 1)
	g_zclass2_modelsend = ArrayCreate(1, 1)
	g_zclass2_playermodel = ArrayCreate(32, 1)
	g_zclass2_clawmodel = ArrayCreate(32, 1)
	g_zclass2_hp = ArrayCreate(1, 1)
	g_zclass2_spd = ArrayCreate(1, 1)
	g_zclass2_grav = ArrayCreate(1, 1)
	g_zclass2_admin = ArrayCreate(1, 1)
	g_zclass2_credits = ArrayCreate(1, 1)
	g_zclass_new = ArrayCreate(1, 1)
	
	g_boolArraysCreated = true
	
	return;
}

public plugin_cfg()
{
	g_boolArraysCreated = false
}

public plugin_init()
{
	if (!get_pcvar_num(g_pcvar_enabled))
		return;
		
	formatex(g_szModName, charsmax(g_szModName), "Base Builder %s", VERSION)
	
	register_clcmd("say", 	   	"cmdSay");
	register_clcmd("say_team",	"cmdSay");
	
	//Added for old users
	register_clcmd("+grab",		"cmdGrabEnt");
	register_clcmd("-grab",		"cmdStopEnt");
	
	register_clcmd("bb_lock",	"cmdLockBlock",0, " - Aim at a block to lock it");
	register_clcmd("bb_claim",	"cmdLockBlock",0, " - Aim at a block to lock it");
	
	register_clcmd("bb_buildban",	"cmdBuildBan",0, " <player>");
	register_clcmd("bb_unbuildban",	"cmdBuildBan",0, " <player>");
	register_clcmd("bb_bban",	"cmdBuildBan",0, " <player>");
	
	register_clcmd("bb_swap",	"cmdSwap",0, " <player>");
	register_clcmd("bb_revive",	"cmdRevive",0, " <player>");
	if (g_iGunsMenu) register_clcmd("bb_guns",	"cmdGuns",0, " <player>");
	register_clcmd("bb_startround",	"cmdStartRound",0, " - Starts the round");
	
	register_logevent("logevent_round_start",2, 	"1=Round_Start")
	register_logevent("logevent_round_end", 2, 	"1=Round_End")
	
	register_message(get_user_msgid("TextMsg"), 	"msgRoundEnd")
	register_message(get_user_msgid("TextMsg"),	"msgSendAudio")
	register_message(get_user_msgid("StatusIcon"), 	"msgStatusIcon");
	register_message(get_user_msgid("Health"), 	"msgHealth");
	register_message(get_user_msgid("StatusValue"), 	"msgStatusValue")
	register_message(get_user_msgid("TeamInfo"), 	"msgTeamInfo");
	
	register_menucmd(register_menuid("ColorsSelect"),KEYS_GENERIC,"colors_pushed")
	register_menucmd(register_menuid("ZClassSelect"),KEYS_GENERIC,"zclass_pushed")
	if (g_iGunsMenu)
	{
		register_menucmd(register_menuid("WeaponMethodMenu"),(1<<0)|(1<<1)|(1<<2),"weapon_method_pushed")
		register_menucmd(register_menuid("PrimaryWeaponSelect"),KEYS_GENERIC,"prim_weapons_pushed")
		register_menucmd(register_menuid("SecWeaponSelect"),KEYS_GENERIC,"sec_weapons_pushed")
	}
	
	register_event("HLTV", 		"ev_RoundStart", "a", "1=0", "2=0")
	register_event("AmmoX", 		"ev_AmmoX", 	 "be", "1=1", "1=2", "1=3", "1=4", "1=5", "1=6", "1=7", "1=8", "1=9", "1=10")
	register_event("Health",   	"ev_Health", 	 "be", "1>0");
	register_event("StatusValue", 	"ev_SetTeam", 	 "be", "1=1");
	register_event("StatusValue", 	"ev_ShowStatus", "be", "1=2", "2!0");
	register_event("StatusValue", 	"ev_HideStatus", "be", "1=1", "2=0");

	RegisterHam(Ham_Touch, 		"weapon_shield","ham_WeaponCleaner_Post", 1)
	RegisterHam(Ham_Touch, 		"weaponbox",  	"ham_WeaponCleaner_Post", 1)
	RegisterHam(Ham_Spawn, 		"player", 	"ham_PlayerSpawn_Post", 1)
	RegisterHam(Ham_TakeDamage, 	"player", 	"ham_TakeDamage")
	for (new i = 1; i < sizeof g_szWpnEntNames; i++)
		if (g_szWpnEntNames[i][0]) RegisterHam(Ham_Item_Deploy, g_szWpnEntNames[i], "ham_ItemDeploy_Post", 1)
	
	register_forward(FM_GetGameDescription, 		"fw_GetGameDescription")
	register_forward(FM_SetClientKeyValue, 		"fw_SetClientKeyValue")
	register_forward(FM_ClientUserInfoChanged, 	"fw_ClientUserInfoChanged")
	register_forward(FM_CmdStart, 			"fw_CmdStart");
	register_forward(FM_PlayerPreThink, 		"fw_PlayerPreThink")
	register_forward(FM_EmitSound,			"fw_EmitSound")
	register_forward(FM_ClientKill,			"fw_Suicide")
	if (g_iShowMovers)
		register_forward(FM_TraceLine, 		"fw_Traceline")
	
	register_clcmd("drop", "clcmd_drop")
	register_clcmd("buy", "clcmd_buy")
	
	//Team Handlers
	register_clcmd("chooseteam",	"clcmd_changeteam")
	register_clcmd("jointeam", 	"clcmd_changeteam")
	register_message(get_user_msgid("ShowMenu"), "message_show_menu")
	register_message(get_user_msgid("VGUIMenu"), "message_vgui_menu")
	
	set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
	
	g_iMaxPlayers = get_maxplayers()
	g_HudSync = CreateHudSyncObj();
	g_msgSayText = get_user_msgid("SayText")
	g_msgStatusText = get_user_msgid("StatusText");
	
	g_iEntBarrier = find_ent_by_tname( -1, "barrier" );
	
	//Custom Forwards
	g_fwRoundStart = CreateMultiForward("bb_round_started", ET_IGNORE)
	g_fwPrepStarted = CreateMultiForward("bb_prepphase_started", ET_IGNORE)
	g_fwBuildStarted = CreateMultiForward("bb_buildphase_started", ET_IGNORE)
	g_fwClassPicked = CreateMultiForward("bb_zombie_class_picked", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwClassSet = CreateMultiForward("bb_zombie_class_set", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwPushPull = CreateMultiForward("bb_block_pushpull", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
	g_fwGrabEnt_Pre = CreateMultiForward("bb_grab_pre", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwGrabEnt_Post = CreateMultiForward("bb_grab_post", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwDropEnt_Pre = CreateMultiForward("bb_drop_pre", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwDropEnt_Post = CreateMultiForward("bb_drop_post", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwNewColor = CreateMultiForward("bb_new_color", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwLockEnt_Pre = CreateMultiForward("bb_lock_pre", ET_IGNORE, FP_CELL, FP_CELL)
	g_fwLockEnt_Post = CreateMultiForward("bb_lock_post", ET_IGNORE, FP_CELL, FP_CELL)
	
	register_dictionary("basebuilder.txt");
}

public plugin_natives()
{
	register_native("bb_register_zombie_class","native_register_zombie_class", 1)
	
	register_native("bb_get_class_cost","native_get_class_cost", 1)
	register_native("bb_get_user_zombie_class","native_get_user_zombie_class", 1)
	register_native("bb_get_user_next_class","native_get_user_next_class", 1)
	register_native("bb_set_user_zombie_class","native_set_user_zombie_class", 1)
	
	
	register_native("bb_is_user_zombie","native_is_user_zombie", 1)
	register_native("bb_is_user_banned","native_is_user_banned", 1)
	
	register_native("bb_is_build_phase","native_bool_buildphase", 1)
	register_native("bb_is_prep_phase","native_bool_prepphase", 1)
	
	register_native("bb_get_build_time","native_get_build_time", 1)
	register_native("bb_set_build_time","native_set_build_time", 1)
	
	register_native("bb_get_user_color","native_get_user_color", 1)
	register_native("bb_set_user_color","native_set_user_color", 1)
	
	register_native("bb_drop_user_block","native_drop_user_block", 1)
	register_native("bb_get_user_block","native_get_user_block", 1)
	register_native("bb_set_user_block","native_set_user_block", 1)
	
	register_native("bb_is_locked_block","native_is_locked_block", 1)
	register_native("bb_lock_block","native_lock_block", 1)
	register_native("bb_unlock_block","native_unlock_block", 1)
	
	register_native("bb_release_zombies","native_release_zombies", 1)
	
	register_native("bb_set_user_primary","native_set_user_primary", 1)
	register_native("bb_get_user_primary","native_get_user_primary", 1)
	
	register_native("bb_get_flags_build","native_get_flags_build", 1)
	register_native("bb_get_flags_lock","native_get_flags_lock", 1)
	register_native("bb_get_flags_buildban","native_get_flags_buildban", 1)
	register_native("bb_get_flags_swap","native_get_flags_swap", 1)
	register_native("bb_get_flags_revive","native_get_flags_revive", 1)
	register_native("bb_get_flags_guns","native_get_flags_guns", 1)
	register_native("bb_get_flags_release","native_get_flags_release", 1)
	register_native("bb_get_flags_override","native_get_flags_override", 1)
	
	//register_native("bb_set_user_mult","native_set_user_mult", 1)
	
	//ZP Natives Converted
	register_native("zp_register_zombie_class","native_register_zombie_class", 1)
	register_native("zp_get_user_zombie_class","native_get_user_zombie_class", 1)
	register_native("zp_get_user_next_class","native_get_user_next_class", 1)
	register_native("zp_set_user_zombie_class","native_set_user_zombie_class", 1)
	register_native("zp_get_user_zombie","native_is_user_zombie", 1)
}

public fw_GetGameDescription()
{
	forward_return(FMV_STRING, g_szModName)
	return FMRES_SUPERCEDE;
}

public client_putinserver(id)
{
	if (!is_user_connected(id))
		return PLUGIN_HANDLED;
		
	g_isConnected[id] = true
	g_isAlive[id] = false
	g_isZombie[id] = false
	g_isBuildBan[id] = false
	g_isCustomModel[id] = false
	g_boolFirstSpawn[id] = true
	g_boolFirstTeam[id] = false
	g_boolFirstTime[id] = true
	g_boolRepick[id] = true
	
	g_iZombieClass[id] = 0
	g_iNextClass[id] = g_iZombieClass[id]
	//for (new i = 0; i < 3; i++) g_fClassMultiplier[id][i] = 1.0
	
	set_task(7.0,"Respawn_Player",id+TASK_RESPAWN);
	
	return PLUGIN_CONTINUE;
}

public client_disconnect(id)
{
	if (g_iOwnedEnt[id])
		cmdStopEnt(id)

	g_isConnected[id] = false
	g_isAlive[id] = false
	g_isZombie[id] = false
	g_isBuildBan[id] = false
	g_isCustomModel[id] = false
	g_boolFirstSpawn[id] = false
	g_boolFirstTeam[id] = false
	g_boolFirstTime[id] = false
	g_boolRepick[id] = false
	
	g_iZombieClass[id] = 0
	g_iNextClass[id] = 0
	//for (new i = 0; i < 3; i++) g_fClassMultiplier[id][i] = 1.0
	
	g_iOwnedEntities[id] = 0
	
	remove_task(id+TASK_RESPAWN)
	remove_task(id+TASK_HEALTH)
	remove_task(id+TASK_IDLESOUND)
	
	for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
	{
		if (is_valid_ent(iEnt) && g_iLockBlocks && BlockLocker(iEnt) == id)
		{
			UnlockBlock(iEnt)
			set_pev(iEnt,pev_rendermode,kRenderNormal)
				
			UnsetLastMover(iEnt);
			UnsetEntMover(iEnt);
		}
	}
}  

public ev_RoundStart()
{
	remove_task(TASK_BUILD)
	remove_task(TASK_PREPTIME)
	
	arrayset(g_iOwnedEntities, 0, MAXPLAYERS+1)
	arrayset(g_iColor, 0, MAXPLAYERS+1)
	arrayset(g_iColorOwner, 0, MAX_COLORS)
	arrayset(g_boolRepick, true, MAXPLAYERS+1)
	
	g_boolRoundEnded = false
	g_boolCanBuild = true
	g_fRoundStartTime = get_gametime()
	
	if (g_iResetEnt)
	{
		new szClass[10], szTarget[7];
		for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
		{
			if (is_valid_ent(iEnt))
			{
				entity_get_string(iEnt, EV_SZ_classname, szClass, 9);
				entity_get_string(iEnt, EV_SZ_targetname, szTarget, 6);
				if (!BlockLocker(iEnt) && iEnt != g_iEntBarrier && equal(szClass, "func_wall") && !equal(szTarget, "ignore"))
				{
					set_pev(iEnt,pev_rendermode,kRenderNormal)
					engfunc( EngFunc_SetOrigin, iEnt, Float:{ 0.0, 0.0, 0.0 } );
					
					UnsetLastMover(iEnt);
					UnsetEntMover(iEnt);
				}
				else if (g_iLockBlocks && BlockLocker(iEnt))
				{
					UnlockBlock(iEnt)
					set_pev(iEnt,pev_rendermode,kRenderNormal)
					engfunc( EngFunc_SetOrigin, iEnt, Float:{ 0.0, 0.0, 0.0 } );
					
					UnsetLastMover(iEnt);
					UnsetEntMover(iEnt);
				}
			}
		}
	}
}

public ev_AmmoX(id)
	set_pdata_int(id, AMMO_SLOT + read_data(1), 200, 5)

public ev_Health(taskid)
{
	if (taskid>g_iMaxPlayers)
		taskid-=TASK_HEALTH
		
	if (is_user_alive(taskid))
	{
		new szGoal[32]
		//if (is_credits_active())
		#if defined BB_CREDITS
			format(szGoal, 31, "^n%L: %d", LANG_SERVER, "HUD_GOAL", credits_get_user_goal(taskid))
		#endif
		
		set_hudmessage(255, 255, 255, -1.0, 0.9, 0, 12.0, 12.0, 0.1, 0.2, 4);
		if (g_isZombie[taskid])
		{
			static szCache1[32]
			ArrayGetString(g_zclass_name, g_iZombieClass[taskid], szCache1, charsmax(szCache1))
		
			show_hudmessage(taskid, "%L: %d^n%L: %s%s", LANG_SERVER, "HUD_HEALTH", pev(taskid, pev_health), LANG_SERVER, "HUD_CLASS", szCache1, szGoal);
		}
		else
		{
			show_hudmessage(taskid, "%L: %d%s", LANG_SERVER, "HUD_HEALTH", pev(taskid, pev_health), szGoal);
		}
		
		set_task(11.9, "ev_Health", taskid+TASK_HEALTH);
	}
}

public msgStatusIcon(const iMsgId, const iMsgDest, const iPlayer)
{
	if(g_isAlive[iPlayer] && g_isConnected[iPlayer]) 
	{
		static szMsg[8]
		get_msg_arg_string(2, szMsg, 7)
    
		if(equal(szMsg, "buyzone"))
		{
			set_pdata_int(iPlayer, OFFSET_BUYZONE, get_pdata_int(iPlayer, OFFSET_BUYZONE) & ~(1<<0))
			return PLUGIN_HANDLED
		}
	}
	return PLUGIN_CONTINUE
} 

public msgHealth(msgid, dest, id)
{
	if(!g_isAlive[id])
		return PLUGIN_CONTINUE;
	
	static hp;
	hp = get_msg_arg_int(1);
	
	if(hp > 255 && (hp % 256) == 0)
		set_msg_arg_int(1, ARG_BYTE, ++hp);
	
	return PLUGIN_CONTINUE;
}

public msgRoundEnd(const MsgId, const MsgDest, const MsgEntity)
{
	static Message[192]
	get_msg_arg_string(2, Message, 191)
	
	if (equal(Message, "#Terrorists_Win"))
	{
		g_boolRoundEnded = true
		set_hudmessage(255, 255, 255, -1.0, 0.40, 0, 6.0, 6.0, 0.1, 0.2, 1)
		show_hudmessage(0, "%L", LANG_SERVER, "WIN_ZOMBIE")
		set_msg_arg_string(2, "")
		client_cmd(0, "spk %s", WIN_ZOMBIES)
		
		return PLUGIN_HANDLED
	}
	else if (equal(Message, "#Target_Saved") || equal(Message, "#CTs_Win"))
	{
		g_boolRoundEnded = true
		set_hudmessage(255, 255, 255, -1.0, 0.40, 0, 6.0, 6.0, 0.1, 0.2, 1)
		show_hudmessage(0, "%L", LANG_SERVER, "WIN_BUILDER")
		set_msg_arg_string(2, "")
		client_cmd(0, "spk %s", WIN_BUILDERS)
		
		return PLUGIN_HANDLED
	}
	return PLUGIN_HANDLED
}

public msgSendAudio(const MsgId, const MsgDest, const MsgEntity)
{
	static szSound[17]
	get_msg_arg_string(2,szSound,16)
	if(equal(szSound[7], "terwin") || equal(szSound[7], "ctwin") || equal(szSound[7], "rounddraw")) return PLUGIN_HANDLED
	return PLUGIN_CONTINUE
}

public ham_WeaponCleaner_Post(iEnt)
{
	call_think(iEnt)
}

public ham_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
	if (!is_valid_ent(victim) || !g_isAlive[victim] || !is_user_connected(attacker))
		return HAM_IGNORED
		
	if(g_boolCanBuild || g_boolRoundEnded || g_boolPrepTime)
		return HAM_SUPERCEDE;
		
	if (victim == attacker)
		return HAM_SUPERCEDE;
		
	if (g_iSupercut)
	{
		damage*=99.0
	}
		
	SetHamParamFloat(4, damage)
	return HAM_HANDLED
}

public ham_ItemDeploy_Post(weapon_ent)
{
	static owner
	owner = get_pdata_cbase(weapon_ent, OFFSET_WPN_WIN, OFFSET_WPN_LINUX);

	static weaponid
	weaponid = cs_get_weapon_id(weapon_ent)
	
	if (g_isZombie[owner] && weaponid == CSW_KNIFE)
	{
		static szClawModel[100]
		ArrayGetString(g_zclass_clawmodel, g_iZombieClass[owner], szClawModel, charsmax(szClawModel))
		format(szClawModel, charsmax(szClawModel), "models/%s.mdl", szClawModel)
		entity_set_string( owner , EV_SZ_viewmodel , szClawModel )  
		entity_set_string( owner , EV_SZ_weaponmodel , "" ) 
	}
	
	if (g_isZombie[owner] && !((1<<weaponid) & ZOMBIE_ALLOWED_WEAPONS_BITSUM))
	{
		engclient_cmd(owner, "weapon_knife")
	}
	else if (g_boolCanBuild)
	{
		engclient_cmd(owner, "weapon_knife")
		client_print(owner, print_center, "%L", LANG_SERVER, "FAIL_KNIFE");
	}
}

public logevent_round_start()
{
	set_pev(g_iEntBarrier,pev_solid,SOLID_BSP)
	set_pev(g_iEntBarrier,pev_rendermode,kRenderTransColor)
	set_pev(g_iEntBarrier,pev_rendercolor, Float:{ BARRIER_COLOR })
	set_pev(g_iEntBarrier,pev_renderamt, Float:{ BARRIER_RENDERAMT })
	
	print_color(0, "^x04 ---[ Base Builder %s ]---", VERSION);
	print_color(0, "^x03 %L", LANG_SERVER, "ROUND_MESSAGE");

	client_cmd(0, "spk %s", PHASE_BUILD)
	
	remove_task(TASK_BUILD)
	set_task(1.0, "task_CountDown", TASK_BUILD,_, _, "a", g_iBuildTime);
	g_iCountDown = (g_iBuildTime-1);
	
	ExecuteForward(g_fwBuildStarted, g_fwDummyResult);
}

public task_CountDown()
{
	g_iCountDown--
	new mins = g_iCountDown/60, secs = g_iCountDown%60
	if (g_iCountDown>=0)
		client_print(0, print_center, "%L - %d:%s%d", LANG_SERVER, "BUILD_TIMER", mins, (secs < 10 ? "0" : ""), secs)
	else
	{
		if (g_iPrepTime)
		{
			g_boolCanBuild = false
			g_boolPrepTime = true
			g_iCountDown = g_iPrepTime+1
			set_task(1.0, "task_PrepTime", TASK_PREPTIME,_, _, "a", g_iCountDown);
			
			set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
			show_hudmessage(0, "%L", LANG_SERVER, "PREP_ANNOUNCE");
			
			new players[32], num
			get_players(players, num)
			for (new i = 0; i < num; i++)
			{
				if (g_isAlive[players[i]] && !g_isZombie[players[i]])
				{
					ExecuteHamB(Ham_CS_RoundRespawn, players[i])
					
					if (g_iOwnedEnt[players[i]])
						cmdStopEnt(players[i])
				}
			}
			print_color(0, "%s^x04 %L", MODNAME, LANG_SERVER, "PREP_ANNOUNCE")
			
			client_cmd(0, "spk %s", PHASE_PREP)
			
			ExecuteForward(g_fwPrepStarted, g_fwDummyResult);
		}
		else
			Release_Zombies()

		remove_task(TASK_BUILD);
		return PLUGIN_HANDLED;
	}
	
	new szTimer[32]
	if (g_iCountDown>10)
	{
		if (mins && !secs) num_to_word(mins, szTimer, 31)
		else if (!mins && secs == 30) num_to_word(secs, szTimer, 31)
		else return PLUGIN_HANDLED;
		
		client_cmd(0, "spk ^"fvox/%s %s remaining^"", szTimer, (mins ? "minutes" : "seconds"))
	}
	else
	{
		num_to_word(g_iCountDown, szTimer, 31)
		client_cmd(0, "spk ^"fvox/%s^"", szTimer)
	}
	return PLUGIN_CONTINUE;
}

public task_PrepTime()
{
	g_iCountDown--
	
	if (g_iCountDown>=0)
		client_print(0, print_center, "%L - 0:%s%d", LANG_SERVER, "PREP_TIMER", (g_iCountDown < 10 ? "0" : ""), g_iCountDown)
	
	if (0<g_iCountDown<11)
	{
		new szTimer[32]
		num_to_word(g_iCountDown, szTimer, 31)
		client_cmd(0, "spk ^"fvox/%s^"", szTimer)
	}
	else if (g_iCountDown == 0)
	{
		Release_Zombies()
		remove_task(TASK_PREPTIME);
		return PLUGIN_HANDLED
	}
	
	return PLUGIN_CONTINUE;
}

public logevent_round_end()
{
	if (g_boolRoundEnded)
	{
		new players[32], num, player
		get_players(players, num)
		for (new i = 0; i < num; i++)
		{
			player = players[i]
			
			if (g_iCurTeam[player] == g_iTeam[player] )
				cs_set_user_team(player, (g_iTeam[player] = (g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T)))
			else
				g_iTeam[player] = g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T
		}
		print_color(0, "%s^x04 %L", MODNAME, LANG_SERVER, "SWAP_ANNOUNCE")
	}
	remove_task(TASK_BUILD)	
	return PLUGIN_HANDLED
}

public client_death(g_attacker, g_victim, wpnindex, hitplace, TK)
{
	if (is_user_alive(g_victim))
		return PLUGIN_HANDLED;
	
	remove_task(g_victim+TASK_IDLESOUND)
	
	g_isAlive[g_victim] = false;
	
	if (TK == 0 && g_attacker != g_victim && g_isZombie[g_attacker])
	{
		client_cmd(0, "spk %s", INFECTION)
		new szPlayerName[32]
		get_user_name(g_victim, szPlayerName, 31)
		set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 5.0, 0.1, 0.2, 1)
		show_hudmessage(0, "%L", LANG_SERVER, "INFECT_ANNOUNCE", szPlayerName);
	}
	
	set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
	if (g_isZombie[g_victim])
	{
		show_hudmessage(g_victim, "%L", LANG_SERVER, "DEATH_ZOMBIE", g_iZombieTime);
		set_task(float(g_iZombieTime), "Respawn_Player", g_victim+TASK_RESPAWN)
	}
	else if (g_iInfectTime)
	{
		show_hudmessage(g_victim, "%L", LANG_SERVER, "DEATH_HUMAN", g_iInfectTime);
		cs_set_user_team(g_victim, CS_TEAM_T)
		g_isZombie[g_victim] = true
		set_task(float(g_iInfectTime), "Respawn_Player", g_victim+TASK_RESPAWN)
	}
	
	return PLUGIN_CONTINUE;
}

public Respawn_Player(id)
{
	id-=TASK_RESPAWN
	
	if (!is_user_connected(id))
		return PLUGIN_HANDLED
	
	if (((g_boolCanBuild || g_boolPrepTime) && cs_get_user_team(id) == CS_TEAM_CT) || cs_get_user_team(id) == CS_TEAM_T)
	{
		ExecuteHamB(Ham_CS_RoundRespawn, id)
		
		//Loop the task until they have successfully spawned
		if (!g_isAlive[id])
			set_task(3.0,"Respawn_Human",id+TASK_RESPAWN)
	}
	return PLUGIN_HANDLED
}

public ham_PlayerSpawn_Post(id)
{
	if (is_user_alive(id))
	{
		g_isAlive[id] = true;
		
		g_isZombie[id] = (cs_get_user_team(id) == CS_TEAM_T ? true : false)
		
		remove_task(id + TASK_RESPAWN)
		remove_task(id + TASK_MODELSET)
		remove_task(id + TASK_IDLESOUND)
		if (g_isZombie[id])
		{
			if (g_boolFirstSpawn[id])
			{
				print_color(id, "This server is running Base Builder v%s by Tirant", VERSION);
				show_zclass_menu(id, 0)
				g_boolFirstSpawn[id] = false
			}
			
			if (g_iNextClass[id] != g_iZombieClass[id])
				g_iZombieClass[id] = g_iNextClass[id]

			set_pev(id, pev_health, float(ArrayGetCell(g_zclass_hp, g_iZombieClass[id]))/**g_fClassMultiplier[id][ATT_HEALTH]*/)
			set_pev(id, pev_gravity, Float:ArrayGetCell(g_zclass_grav, g_iZombieClass[id])/**g_fClassMultiplier[id][ATT_GRAVITY]*/)
			g_fPlayerSpeed[id] = float(ArrayGetCell(g_zclass_spd, g_iZombieClass[id]))/**g_fClassMultiplier[id][ATT_SPEED]*/
				
			//Handles the knife and claw model
			strip_user_weapons(id)
			give_item(id, "weapon_knife")
							
			static szClawModel[100]
			ArrayGetString(g_zclass_clawmodel, g_iZombieClass[id], szClawModel, charsmax(szClawModel))
			format(szClawModel, charsmax(szClawModel), "models/%s.mdl", szClawModel)
			entity_set_string( id , EV_SZ_viewmodel , szClawModel )  
			entity_set_string( id , EV_SZ_weaponmodel , "" ) 
						
			ArrayGetString(g_zclass_name, g_iZombieClass[id], g_szPlayerClass[id], charsmax(g_szPlayerClass[]))
			
			set_task(random_float(60.0, 360.0), "task_ZombieIdle", id+TASK_IDLESOUND, _, _, "b")

			ArrayGetString(g_zclass_playermodel, g_iZombieClass[id], g_szPlayerModel[id], charsmax(g_szPlayerModel[]))
			new szCurrentModel[32]
			fm_get_user_model(id, szCurrentModel, charsmax(szCurrentModel))
			if (!equal(szCurrentModel, g_szPlayerModel[id]))
			{
				if (get_gametime() - g_fRoundStartTime < 5.0)
					set_task(5.0 * MODELCHANGE_DELAY, "fm_user_model_update", id + TASK_MODELSET)
				else
					fm_user_model_update(id + TASK_MODELSET)
			}
			
			ExecuteForward(g_fwClassSet, g_fwDummyResult, id, g_iZombieClass[id]);
		}
		else if (g_isCustomModel[id])
		{
			fm_reset_user_model(id)
		}
		
		if (!g_isZombie[id])
		{
			entity_set_string( id , EV_SZ_viewmodel , "models/v_knife.mdl" )  
			
			if (((/*g_boolPrepTime && */g_iPrepTime && !g_boolCanBuild) || (g_boolCanBuild && !g_iPrepTime)) && g_iGunsMenu)
			{
				//if (is_credits_active())
				#if defined BB_CREDITS
					credits_show_gunsmenu(id)
				#else
					show_method_menu(id)
				#endif
			}
				
			if (!g_iColor[id])
			{
				new i = random(MAX_COLORS)
				if (g_iColorMode)
				{
					while (g_iColorOwner[i])
					{
						i = random(MAX_COLORS)
					}
				}
				print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_PICKED", g_szColorName[i]);
				g_iColor[id] = i
				g_iColorOwner[i] = id

				if (g_iOwnedEnt[id])
				{
					set_pev(g_iOwnedEnt[id],pev_rendercolor, g_fColor[g_iColor[id]] )
					set_pev(g_iOwnedEnt[id],pev_renderamt, g_fRenderAmt[g_iColor[id]] )
				}
			}
		}
		
		ev_Health(id)
	}
}

public task_ZombieIdle(taskid)
{
	taskid-=TASK_IDLESOUND
	if (g_isAlive[taskid] && g_isConnected[taskid] && !g_isZombie[taskid])
		emit_sound(taskid, CHAN_VOICE, g_szZombieIdle[random(sizeof g_szZombieIdle - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
}

public fw_SetClientKeyValue(id, const infobuffer[], const key[])
{   
	if (g_isCustomModel[id] && equal(key, "model"))
		return FMRES_SUPERCEDE
	return FMRES_IGNORED
}

public fw_ClientUserInfoChanged(id)
{
	if (!g_isCustomModel[id])
		return FMRES_IGNORED
	static szCurrentModel[32]
	fm_get_user_model(id, szCurrentModel, charsmax(szCurrentModel))
	if (!equal(szCurrentModel, g_szPlayerModel[id]) && !task_exists(id + TASK_MODELSET))
		fm_set_user_model(id + TASK_MODELSET)
	return FMRES_IGNORED
}

public fm_user_model_update(taskid)
{
	static Float:fCurTime
	fCurTime = get_gametime()
	
	if (fCurTime - g_fModelsTargetTime >= MODELCHANGE_DELAY)
	{
		fm_set_user_model(taskid)
		g_fModelsTargetTime = fCurTime
	}
	else
	{
		set_task((g_fModelsTargetTime + MODELCHANGE_DELAY) - fCurTime, "fm_set_user_model", taskid)
		g_fModelsTargetTime += MODELCHANGE_DELAY
	}
}

public fm_set_user_model(player)
{
	player -= TASK_MODELSET
	engfunc(EngFunc_SetClientKeyValue, player, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", g_szPlayerModel[player])
	g_isCustomModel[player] = true
}

stock fm_get_user_model(player, model[], len)
{
	engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, player), "model", model, len)
}

stock fm_reset_user_model(player)
{
	g_isCustomModel[player] = false
	dllfunc(DLLFunc_ClientUserInfoChanged, player, engfunc(EngFunc_GetInfoKeyBuffer, player))
}

public message_show_menu(msgid, dest, id) 
{
	if (!(!get_user_team(id) && !is_user_bot(id) && !access(id, ADMIN_IMMUNITY)))
		return PLUGIN_CONTINUE

	static team_select[] = "#Team_Select"
	static menu_text_code[sizeof team_select]
	get_msg_arg_string(4, menu_text_code, sizeof menu_text_code - 1)
	if (!equal(menu_text_code, team_select))
		return PLUGIN_CONTINUE

	static param_menu_msgid[2]
	param_menu_msgid[0] = msgid
	set_task(AUTO_TEAM_JOIN_DELAY, "task_force_team_join", id, param_menu_msgid, sizeof param_menu_msgid)

	return PLUGIN_HANDLED
}

public message_vgui_menu(msgid, dest, id) 
{
	if (get_msg_arg_int(1) != TEAM_SELECT_VGUI_MENU_ID || !(!get_user_team(id) && !is_user_bot(id) && !access(id, ADMIN_IMMUNITY)))// 
		return PLUGIN_CONTINUE
		
	static param_menu_msgid[2]
	param_menu_msgid[0] = msgid
	set_task(AUTO_TEAM_JOIN_DELAY, "task_force_team_join", id, param_menu_msgid, sizeof param_menu_msgid)

	return PLUGIN_HANDLED
}

public task_force_team_join(menu_msgid[], id) 
{
	if (get_user_team(id))
		return

	static msg_block
	msg_block = get_msg_block(menu_msgid[0])
	set_msg_block(menu_msgid[0], BLOCK_SET)
	engclient_cmd(id, "jointeam", "5")
	engclient_cmd(id, "joinclass", "5")
	set_msg_block(menu_msgid[0], msg_block)
}

public msgTeamInfo(msgid, dest)
{
	if (dest != MSG_ALL && dest != MSG_BROADCAST)
		return;
	
	static id, team[2]
	id = get_msg_arg_int(1)

	get_msg_arg_string(2, team, charsmax(team))
	switch (team[0])
	{
		case 'T' : // TERRORIST
		{
			g_iCurTeam[id] = CS_TEAM_T;
		}
		case 'C' : // CT
		{
			g_iCurTeam[id] = CS_TEAM_CT;
		}
		case 'S' : // SPECTATOR
		{
			g_iCurTeam[id] = CS_TEAM_SPECTATOR;
		}
		default : g_iCurTeam[id] = CS_TEAM_UNASSIGNED;
	}
	if (!g_boolFirstTeam[id])
	{
		g_boolFirstTeam[id] = true
		g_iTeam[id] = g_iCurTeam[id]
	}
}

public clcmd_changeteam(id)
{
	static CsTeams:team
	team = cs_get_user_team(id)
	
	if (team == CS_TEAM_SPECTATOR || team == CS_TEAM_UNASSIGNED)
		return PLUGIN_CONTINUE;

	show_zclass_menu(id, 0)
	return PLUGIN_HANDLED;
}

public clcmd_drop(id)
{
	client_print (id, print_center, "%L", LANG_SERVER, "FAIL_DROP")
	return PLUGIN_HANDLED
}

public clcmd_buy(id)
{
	client_print (id, print_center, "%L", LANG_SERVER, "FAIL_BUY")
	return PLUGIN_HANDLED
}

public msgStatusValue()
	set_msg_block(g_msgStatusText, BLOCK_SET);

public ev_SetTeam(id)
	g_iFriend[id] = read_data(2)

public ev_ShowStatus(id) //called when id looks at someone
{
	new szName[32], pid = read_data(2);
	get_user_name(pid, szName, 31);

	if (g_iFriend[id] == 1)	// friend
	{
		new clip, ammo, wpnid = get_user_weapon(pid, clip, ammo), szWpnName[32];

		if (wpnid)
			xmod_get_wpnname(wpnid, szWpnName, 31);

		set_hudmessage(0, 225, 0, -1.0, HUD_FRIEND_HEIGHT, 1, 0.01, 3.0, 0.01, 0.01);
		new nLen, szStatus[512]
		if (!g_isZombie[pid])
			nLen += format( szStatus[nLen], 511-nLen, "%s^nHealth: %d | Weapon: %s^nColor: %s", szName, pev(pid, pev_health), szWpnName, g_szColorName[g_iColor[pid]]);
		else
		{
			nLen += format( szStatus[nLen], 511-nLen, "%s^nClass: %s^nHealth: %d", szName, g_szPlayerClass[pid], pev(pid, pev_health));
			
			/*if (is_credits_active())
			{
				nLen += format( szStatus[nLen], 511-nLen, "^n^nClass Multipliers:", szName, g_szPlayerClass[pid], pev(pid, pev_health));
				nLen += format( szStatus[nLen], 511-nLen, "^nHealth: %f", g_fClassMultiplier[pid][ATT_HEALTH]);
				nLen += format( szStatus[nLen], 511-nLen, "^nSpeed: %f", g_fClassMultiplier[pid][ATT_SPEED]);
				nLen += format( szStatus[nLen], 511-nLen, "^nGravity: %f", g_fClassMultiplier[pid][ATT_GRAVITY]);
			}*/
		}
		ShowSyncHudMsg(id, g_HudSync, szStatus);
	} 
	if (g_iFriend[id] != 1) //enemy
	{
		set_hudmessage(225, 0, 0, -1.0, HUD_FRIEND_HEIGHT, 1, 0.01, 3.0, 0.01, 0.01);
		if (g_isZombie[pid])
			ShowSyncHudMsg(id, g_HudSync, "%s", szName);
		else
			ShowSyncHudMsg(id, g_HudSync, "%s^nColor: %s", szName, g_szColorName[g_iColor[pid]]);
	}
}

public ev_HideStatus(id)
	ClearSyncHud(id, g_HudSync);

public cmdSay(id)
{
	if (!g_isConnected[id])
		return PLUGIN_HANDLED;

	new szMessage[32]
	read_args(szMessage, charsmax(szMessage));
	remove_quotes(szMessage);
		
	if(szMessage[0] == '/')
	{
		if (equali(szMessage, "/commands") == 1 || equali(szMessage, "/cmd")  == 1 )
		{
			print_color(id, "%s /class, /respawn, /random, /mycolor, /guns%s%s%s", MODNAME, (g_iColorMode ? ", /whois <color>": ""), (g_iColorMode != 2 ? ", /colors":""), (access(id, FLAGS_LOCK) ? ", /lock":"")  );
		}
		else if (equali(szMessage, "/class") == 1)
		{
			show_zclass_menu(id, 0)
		}
		else if (equali(szMessage, "/respawn") == 1 || equali(szMessage, "/revive")  == 1 || equali(szMessage, "/fixspawn")  == 1)
		{
			if (g_boolCanBuild && !g_isZombie[id])
				ExecuteHamB(Ham_CS_RoundRespawn, id)
			else if (g_isZombie[id])
			{
				if (pev(id, pev_health) == float(ArrayGetCell(g_zclass_hp, g_iZombieClass[id])) || !is_user_alive(id))
					ExecuteHamB(Ham_CS_RoundRespawn, id)
				else
					client_print(id, print_center, "%L", LANG_SERVER, "FAIL_SPAWN");
			}
		}
		else if (equali(szMessage, "/lock") == 1 || equali(szMessage, "/claim") == 1 && g_isAlive[id])
		{
			client_print(id, print_center, "%L", LANG_SERVER, "FAIL_ACCESS");
			return PLUGIN_HANDLED;
		}
		else if (equal(szMessage, "/whois",6) && g_iColorMode)
		{
			for ( new i=0; i<MAX_COLORS; i++)
			{
				if (equali(szMessage[7], g_szColorName[i]) == 1)
				{
					if (g_iColorOwner[i])
					{
						new szPlayerName[32]
						get_user_name(g_iColorOwner[i], szPlayerName, 31)
						print_color(id, "%s^x04 %s^x01's color is^x04 %s", MODNAME, szPlayerName, g_szColorName[i]);
					}
					else
						print_color(id, "%s %L^x04 %s", MODNAME, LANG_SERVER, "COLOR_NONE", g_szColorName[i]);
						
					break;
				}
			}
		}
		else if (equali(szMessage, "/colors") == 1 && !g_isZombie[id] && g_boolCanBuild && g_iColorMode != 2)
		{
			show_colors_menu(id, 0)
		}
		else if (equali(szMessage, "/mycolor") == 1 && !g_isZombie[id])
		{
			print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_YOURS", g_szColorName[g_iColor[id]]);
			return PLUGIN_HANDLED
		}
		else if (equali(szMessage, "/random") == 1 && !g_isZombie[id] && g_boolCanBuild)
		{
			new i = random(MAX_COLORS)
			if (g_iColorMode)
			{
				while (g_iColorOwner[i])
				{
					i = random(MAX_COLORS)
				}
			}
			print_color(id, "%s^x04 %L:^x01 %s", MODNAME, LANG_SERVER, "COLOR_RANDOM", g_szColorName[i]);
			g_iColorOwner[g_iColor[id]] = 0
			g_iColor[id] = i
			g_iColorOwner[i] = id
			
			for (new iEnt = g_iMaxPlayers+1; iEnt < MAXENTS; iEnt++)
			{
				if (is_valid_ent(iEnt) && g_iLockBlocks && BlockLocker(iEnt) == id)
					set_pev(iEnt,pev_rendercolor,g_fColor[g_iColor[id]])
			}
			
			ExecuteForward(g_fwNewColor, g_fwDummyResult, id, g_iColor[id]);
		}
		else if (equali(szMessage, "/guns", 5) && g_iGunsMenu)
		{
			if(!g_isAlive[id] || g_isZombie[id])
				return PLUGIN_HANDLED
				
			if (access(id, FLAGS_GUNS))
			{
				new player = cmd_target(id, szMessage[6], 0)
			
				if (!player)
				{
					//if (is_credits_active())
					#if defined BB_CREDITS
						credits_show_gunsmenu(id)
					#else
						show_method_menu(id)
					#endif
					return PLUGIN_CONTINUE
				}
				
				cmdGuns(id, player)
				return PLUGIN_HANDLED;
			}
			else
			{
				if(!g_boolCanBuild || !g_boolRepick[id])
					return PLUGIN_HANDLED	
		
				//if (is_credits_active())
				#if defined BB_CREDITS
					credits_show_gunsmenu(id)
				#else
					show_method_menu(id)
				#endif
				return PLUGIN_HANDLED
			}
		}
		else if (equal(szMessage, "/swap",5) && access(id, FLAGS_SWAP))
		{
			new player = cmd_target(id, szMessage[6], 0)
		
			if (!player)
			{
				print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
				return PLUGIN_CONTINUE
			}
			
			cmdSwap(id, player)
		}
		else if (equal(szMessage, "/revive",7) && access(id, FLAGS_REVIVE))
		{
			new player = cmd_target(id, szMessage[8], 0)
		
			if (!player)
			{
				print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
				return PLUGIN_CONTINUE
			}
			
			cmdRevive(id, player)
		}
		else if (equal(szMessage, "/ban",4) && access(id, FLAGS_BUILDBAN))
		{
			new player = cmd_target(id, szMessage[5], 0)
		
			if (!player)
			{
				print_color(id, "%s Player^x04 %s^x01 could not be found or targetted", MODNAME, szMessage[6])
				return PLUGIN_CONTINUE
			}
			
			cmdBuildBan(id, player)
		}
		else if (equal(szMessage, "/releasezombies",5) && access(id, FLAGS_RELEASE))
		{
			cmdStartRound(id)
		}
	}
	return PLUGIN_CONTINUE
}

public cmdSwap(id, target)
{
	if (access(id, FLAGS_SWAP))
	{
		new player
		
		if (target) player = target
		else
		{
			new arg[32]
			read_argv(1, arg, 31)
			player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
		}

		if (!player || !is_user_connected(player))
			return client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
			
		cs_set_user_team(player,( g_iTeam[player] = g_iTeam[player] == CS_TEAM_T ? CS_TEAM_CT : CS_TEAM_T))
			
		if (is_user_alive(player))
			ExecuteHamB(Ham_CS_RoundRespawn, player)
		
		new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
		get_user_name(id,szAdminName,31)
		get_user_authid (id,szAdminAuthid,31)
		get_user_name(player, szPlayerName, 31)
		get_user_authid (player,szPlayerID,31)
		
		client_print(id, print_console, "[Base Builder] Player %s was swapped from the %s team to the %s team", szPlayerName, g_iTeam[player] == CS_TEAM_CT ? "zombie":"builder", g_iTeam[player] == CS_TEAM_CT ? "builder":"zombie")
		Log("[SWAP] Admin: %s || SteamID: %s swapped Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
		
		set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
		show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_SWAP");
		
		print_color(0, "%s Player^x04 %s^x01 has been^x04 swapped^x01 to the^x04 %s^x01 team", MODNAME, szPlayerName, g_iTeam[player] == CS_TEAM_CT ? "builder":"zombie")
	}
	return PLUGIN_HANDLED	
}

public cmdRevive(id, target)
{
	if (access(id, FLAGS_REVIVE))
	{
		new player
		if (target) player = target
		else
		{
			new arg[32]
			read_argv(1, arg, 31)
			player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
		}

		if (!player || !is_user_connected(player))
			return client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
			
		ExecuteHamB(Ham_CS_RoundRespawn, player)
		
		new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
		get_user_name(id,szAdminName,31)
		get_user_authid (id,szAdminAuthid,31)
		get_user_name(player, szPlayerName, 31)
		get_user_authid (player,szPlayerID,31)
		
		client_print(id, print_console, "[Base Builder] Player %s has been^x04 revived", szPlayerName)
		Log("[REVIVE] Admin: %s || SteamID: %s revived Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
		
		set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
		show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_REVIVE");
		
		print_color(0, "%s Player^x04 %s^x01 has been^x04 revived^x01 by an admin", MODNAME, szPlayerName)
	}
	return PLUGIN_HANDLED	
}

public cmdGuns(id, target)
{
	if (access(id, FLAGS_GUNS))
	{
		new player
		if (target) player = target
		else
		{
			new arg[32]
			read_argv(1, arg, 31)
			player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
		}
		
		if (!player || !is_user_connected(player))
		{
			client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
			return PLUGIN_HANDLED;
		}
		
		if (g_isZombie[player])
		{
			return PLUGIN_HANDLED;
		}
		
		if (!g_isAlive[player])
		{
			client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_DEAD");
			return PLUGIN_HANDLED;
		}

		//if (is_credits_active())
		#if defined BB_CREDITS
			credits_show_gunsmenu(player)
		#else
			show_method_menu(player)
		#endif
		
		new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
		get_user_name(id,szAdminName,31)
		get_user_authid (id,szAdminAuthid,31)
		get_user_name(player, szPlayerName, 31)
		get_user_authid (player,szPlayerID,31)
		
		client_print(id, print_console, "[Base Builder] Player %s has had his weapons menu re-opened", szPlayerName);
		Log("[GUNS] Admin: %s || SteamID: %s opened the guns menu for Player: %s || SteamID: %s", szAdminName, szAdminAuthid, szPlayerName, szPlayerID);
		
		set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
		show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_GUNS");
		
		print_color(0, "%s Player^x04 %s^x01 has had their^x04 guns^x01 menu^x04 re-opened", MODNAME, szPlayerName)
	}
	return PLUGIN_HANDLED	
}

public cmdStartRound(id)
{
	if (access(id, FLAGS_RELEASE))
	{
		native_release_zombies()
	}
}

public Release_Zombies()
{
	g_boolCanBuild = false
	remove_task(TASK_BUILD);
	
	g_boolPrepTime = false
	remove_task(TASK_PREPTIME);
	
	new players[32], num, player, szWeapon[32]
	get_players(players, num, "a")
	for(new i = 0; i < num; i++)
	{
		player = players[i]

		if (!g_isZombie[player])
		{
			if (g_iOwnedEnt[player])
				cmdStopEnt(player)

			if(g_iGrenadeHE		) give_item(player,"weapon_hegrenade"	), cs_set_user_bpammo(player,CSW_HEGRENADE,	g_iGrenadeHE)
			if(g_iGrenadeFLASH	) give_item(player,"weapon_flashbang"	), cs_set_user_bpammo(player,CSW_FLASHBANG,	g_iGrenadeFLASH)
			if(g_iGrenadeSMOKE	) give_item(player,"weapon_smokegrenade"	), cs_set_user_bpammo(player,CSW_SMOKEGRENADE,	g_iGrenadeSMOKE)

			if (g_iPrimaryWeapon[player])
			{
				get_weaponname(g_iPrimaryWeapon[player],szWeapon,sizeof szWeapon - 1)
				engclient_cmd(player, szWeapon);
			}
		}
	}
			
	set_pev(g_iEntBarrier,pev_solid,SOLID_NOT)
	set_pev(g_iEntBarrier,pev_renderamt,Float:{ 0.0 })
	
	set_hudmessage(255, 255, 255, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
	show_hudmessage(0, "%L", LANG_SERVER, "RELEASE_ANNOUNCE");
	client_cmd(0, "spk %s", g_szRoundStart[ random( sizeof g_szRoundStart ) ] )
	
	ExecuteForward(g_fwRoundStart, g_fwDummyResult);
}

public fw_CmdStart( id, uc_handle, randseed )
{
	if (!g_isConnected[id] || !g_isAlive[id])
		return FMRES_IGNORED

	//new button = pev(id, pev_button)
	new button = get_uc( uc_handle , UC_Buttons );
	new oldbutton = pev(id, pev_oldbuttons)

	if( button & IN_USE && !(oldbutton & IN_USE) && !g_iOwnedEnt[id])
		cmdGrabEnt(id)
	else if( oldbutton & IN_USE && !(button & IN_USE) && g_iOwnedEnt[id])
		cmdStopEnt(id)

	return FMRES_IGNORED;
}

public cmdGrabEnt(id)
{
	if (g_fBuildDelay[id] + BUILD_DELAY > get_gametime())
	{
		g_fBuildDelay[id] = get_gametime()
		client_print (id, print_center, "%L", LANG_SERVER, "BUILD_SPAM")
		return PLUGIN_HANDLED
	}
	else
		g_fBuildDelay[id] = get_gametime()

	if (g_isBuildBan[id])
	{
		client_print (id, print_center, "%L", LANG_SERVER, "BUILD_BANNED")
		client_cmd(id, "spk %s", LOCK_FAIL);
		return PLUGIN_HANDLED;
	}
	
	if (g_isZombie[id] && !access(id, FLAGS_OVERRIDE))
		return PLUGIN_HANDLED
		
	if (!g_boolCanBuild && !access(id, FLAGS_BUILD) && !access(id, FLAGS_OVERRIDE))
	{
		client_print (id, print_center, "%L", LANG_SERVER, "BUILD_NOTIME")
		return PLUGIN_HANDLED
	}
	
	if (g_iOwnedEnt[id] && is_valid_ent(g_iOwnedEnt[id])) 
		cmdStopEnt(id)
	
	new ent, bodypart
	get_user_aiming (id,ent,bodypart)
	
	if (!is_valid_ent(ent) || ent == g_iEntBarrier || is_user_alive(ent) || IsMovingEnt(ent))
		return PLUGIN_HANDLED;
	
	if ((BlockLocker(ent) && BlockLocker(ent) != id) || (BlockLocker(ent) && !access(id, FLAGS_OVERRIDE)))
		return PLUGIN_HANDLED;
	
	new szClass[10], szTarget[7];
	entity_get_string(ent, EV_SZ_classname, szClass, 9);
	entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
	if (!equal(szClass, "func_wall") || equal(szTarget, "ignore"))
		return PLUGIN_HANDLED;
		
	ExecuteForward(g_fwGrabEnt_Pre, g_fwDummyResult, id, ent);

	new Float:fOrigin[3], iAiming[3], Float:fAiming[3]
	
	get_user_origin(id, iAiming, 3);
	IVecFVec(iAiming, fAiming);
	entity_get_vector(ent, EV_VEC_origin, fOrigin);

	g_fOffset1[id] = fOrigin[0] - fAiming[0];
	g_fOffset2[id] = fOrigin[1] - fAiming[1];
	g_fOffset3[id] = fOrigin[2] - fAiming[2];
	
	g_fEntDist[id] = get_user_aiming(id, ent, bodypart);
		
	if (g_fEntMinDist)
	{
		if (g_fEntDist[id] < g_fEntMinDist)
			g_fEntDist[id] = g_fEntSetDist;
	}
	else if (g_fEntMaxDist)
	{
		if (g_fEntDist[id] > g_fEntMaxDist)
			return PLUGIN_HANDLED
	}

	set_pev(ent,pev_rendermode,kRenderTransColor)
	set_pev(ent,pev_rendercolor, g_fColor[g_iColor[id]] )
	set_pev(ent,pev_renderamt, g_fRenderAmt[g_iColor[id]] )
		
	MovingEnt(ent);
	SetEntMover(ent, id);
	g_iOwnedEnt[id] = ent

	//Checked after object is successfully grabbed
	if (!g_boolCanBuild && (access(id, FLAGS_BUILD) || access(id, FLAGS_OVERRIDE)))
	{
		new adminauthid[32],adminname[32]
		get_user_authid (id,adminauthid,31)
		get_user_name(id,adminname,31)
		Log("[MOVE] Admin: %s || SteamID: %s moved an entity", adminname, adminauthid)
	}
	
	client_cmd(id, "spk %s", GRAB_START);
	
	ExecuteForward(g_fwGrabEnt_Post, g_fwDummyResult, id, ent);
	
	return PLUGIN_HANDLED
}

public cmdStopEnt(id)
{
	if (!g_iOwnedEnt[id])
		return PLUGIN_HANDLED;
		
	new ent = g_iOwnedEnt[id]
	
	ExecuteForward(g_fwDropEnt_Pre, g_fwDummyResult, id, ent);
	
	if (BlockLocker(ent))
	{
		switch(g_iLockBlocks)
		{
			case 0:
			{
				set_pev(ent,pev_rendermode,kRenderTransColor)
				set_pev(ent,pev_rendercolor, Float:{ LOCKED_COLOR })
				set_pev(ent,pev_renderamt,Float:{ LOCKED_RENDERAMT })
			}
			case 1:
			{
				set_pev(ent,pev_rendermode,kRenderTransColor)
				set_pev(ent,pev_rendercolor, g_fColor[g_iColor[id]])
				set_pev(ent,pev_renderamt,Float:{ LOCKED_RENDERAMT })
			}
		}
	}
	else
		set_pev(ent,pev_rendermode,kRenderNormal)	
	
	UnsetEntMover(ent);
	SetLastMover(ent,id);
	g_iOwnedEnt[id] = 0;
	UnmovingEnt(ent);
	
	client_cmd(id, "spk %s", GRAB_STOP);
	
	ExecuteForward(g_fwDropEnt_Post, g_fwDummyResult, id, ent);
	
	return PLUGIN_HANDLED;
}

public cmdLockBlock(id)
{
	if (!g_boolCanBuild && g_iLockBlocks)
	{
		client_print(id, print_center, "%L", LANG_SERVER, "FAIL_LOCK");
		return PLUGIN_HANDLED;
	}
	
	         (g_isZombie[id] && !access(id, FLAGS_OVERRIDE))
		return PLUGIN_HANDLED;
		
	new ent, bodypart
	get_user_aiming (id,ent,bodypart)
	
	new szTarget[7], szClass[10];
	entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
	entity_get_string(ent, EV_SZ_classname, szClass, 9);
	if (!ent || !is_valid_ent(ent) || is_user_alive(ent) || ent == g_iEntBarrier || !equal(szClass, "func_wall") || equal(szTarget, "ignore"))
		return PLUGIN_HANDLED;
	
	ExecuteForward(g_fwLockEnt_Pre, g_fwDummyResult, id, ent);
	
	switch (g_iLockBlocks)
	{
		case 0:
		{
			if (!BlockLocker(ent) && !IsMovingEnt(ent))
			{
				LockBlock(ent, id);
				set_pev(ent,pev_rendermode,kRenderTransColor)
				set_pev(ent,pev_rendercolor,Float:{LOCKED_COLOR})
				set_pev(ent,pev_renderamt,Float:{LOCKED_RENDERAMT})
				client_cmd(id, "spk %s", LOCK_OBJECT);
			}
			else if (BlockLocker(ent))
			{
				UnlockBlock(ent)
				set_pev(ent,pev_rendermode,kRenderNormal)
				client_cmd(id, "spk %s", LOCK_OBJECT);
			}
		}
		case 1:
		{
			if (!BlockLocker(ent) && !IsMovingEnt(ent))
			{
				if (g_iOwnedEntities[id]<g_iLockMax || !g_iLockMax)
				{
					LockBlock(ent, id)
					g_iOwnedEntities[id]++
					set_pev(ent,pev_rendermode,kRenderTransColor)
					set_pev(ent,pev_rendercolor,g_fColor[g_iColor[id]])
					set_pev(ent,pev_renderamt,Float:{LOCKED_RENDERAMT})
					
					client_print(id, print_center, "%L [ %d / %d ]", LANG_SERVER, "BUILD_CLAIM_NEW", g_iOwnedEntities[id], g_iLockMax)
					client_cmd(id, "spk %s", LOCK_OBJECT);
				}
				else if (g_iOwnedEntities[id]>=g_iLockMax)
				{
					client_print(id, print_center, "%L", LANG_SERVER, "BUILD_CLAIM_MAX", g_iLockMax)
					client_cmd(id, "spk %s", LOCK_FAIL);
				}
			}
			else if (BlockLocker(ent))
			{
				if (BlockLocker(ent) == id || access(id, FLAGS_OVERRIDE))
				{
					g_iOwnedEntities[BlockLocker(ent)]--
					set_pev(ent,pev_rendermode,kRenderNormal)
					
					client_print(BlockLocker(ent), print_center, "%L [ %d / %d ]", LANG_SERVER, "BUILD_CLAIM_LOST", g_iOwnedEntities[BlockLocker(ent)], g_iLockMax)
					
					UnlockBlock(ent)
					client_cmd(id, "spk %s", LOCK_OBJECT);
				}
				else
				{
					client_print(id, print_center, "%L", LANG_SERVER, "BUILD_CLAIM_FAIL")
					client_cmd(id, "spk %s", LOCK_FAIL);
				}
			}	
		}
	}
	
	ExecuteForward(g_fwLockEnt_Post, g_fwDummyResult, id, ent);
	
	return PLUGIN_HANDLED
}

public cmdBuildBan(id, target)
{
	if (access(id, FLAGS_BUILDBAN))
	{
		new player
		if (target) player = target
		else
		{
			new arg[32]
			read_argv(1, arg, 31)
			player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY)
		}
		
		if (!player)
			return client_print(id, print_console, "[Base Builder] %L", LANG_SERVER, "FAIL_NAME");
		
		new szAdminAuthid[32],szAdminName[32],szPlayerName[32],szPlayerID[32]
		get_user_name(id,szAdminName,31)
		get_user_authid (id,szAdminAuthid,31)
		get_user_name(player, szPlayerName, 31)
		get_user_authid (player,szPlayerID,31)
		
		g_isBuildBan[player] = g_isBuildBan[player] ? false : true
		
		if (g_isBuildBan[player] && g_iOwnedEnt[player])
			cmdStopEnt(player)
		
		client_print(id, print_console, "[Base Builder] Player %s was %s from building", szPlayerName, g_isBuildBan[player] ? "banned":"unbanned")
		Log("[MOVE] Admin: %s || SteamID: %s banned Player: %s || SteamID: %s from building", szAdminName, szAdminAuthid, szPlayerName, szPlayerID)
		
		set_hudmessage(255,0, 0, -1.0, 0.45, 0, 1.0, 10.0, 0.1, 0.2, 1)
		show_hudmessage(player, "%L", LANG_SERVER, "ADMIN_BUILDBAN", g_isBuildBan[player] ? "disabled":"re-enabled");
		
		print_color(0, "%s Player^x04 %s^x01 has been^x04 %s^x01 from building", MODNAME, szPlayerName, g_isBuildBan[player] ? "banned":"unbanned")
	}
	
	return PLUGIN_HANDLED;
}

public fw_PlayerPreThink(id)
{
	if (!is_user_connected(id))
	{
		cmdStopEnt(id)
		return PLUGIN_HANDLED
	}
	
	if (g_isZombie[id])
		set_pev(id, pev_maxspeed, g_fPlayerSpeed[id])
	
	if (!g_iOwnedEnt[id] || !is_valid_ent(g_iOwnedEnt[id]))
		return FMRES_HANDLED
		
	new buttons = pev(id, pev_button)
	if (buttons & IN_ATTACK)
	{
		g_fEntDist[id] += OBJECT_PUSHPULLRATE;
		
		if (g_fEntDist[id] > g_fEntMaxDist)
		{
			g_fEntDist[id] = g_fEntMaxDist
			client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_MAX")
		}
		else
			client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_PUSH")
			
		ExecuteForward(g_fwPushPull, g_fwDummyResult, id, g_iOwnedEnt[id], 1);
	}
	else if (buttons & IN_ATTACK2)
	{
		g_fEntDist[id] -= OBJECT_PUSHPULLRATE;
			
		if (g_fEntDist[id] < g_fEntSetDist)
		{
			g_fEntDist[id] = g_fEntSetDist
			client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_MIN")
		}
		else
			client_print(id, print_center, "%L", LANG_SERVER, "OBJECT_PULL")
			
		ExecuteForward(g_fwPushPull, g_fwDummyResult, id, g_iOwnedEnt[id], 2);
	}
	
	new iOrigin[3], iLook[3], Float:fOrigin[3], Float:fLook[3], Float:vMoveTo[3], Float:fLength
	    
	get_user_origin(id, iOrigin, 1);
	IVecFVec(iOrigin, fOrigin);
	get_user_origin(id, iLook, 3);
	IVecFVec(iLook, fLook);
	    
	fLength = get_distance_f(fLook, fOrigin);
	if (fLength == 0.0) fLength = 1.0;

	vMoveTo[0] = (fOrigin[0] + (fLook[0] - fOrigin[0]) * g_fEntDist[id] / fLength) + g_fOffset1[id];
	vMoveTo[1] = (fOrigin[1] + (fLook[1] - fOrigin[1]) * g_fEntDist[id] / fLength) + g_fOffset2[id];
	vMoveTo[2] = (fOrigin[2] + (fLook[2] - fOrigin[2]) * g_fEntDist[id] / fLength) + g_fOffset3[id];
	vMoveTo[2] = float(floatround(vMoveTo[2], floatround_floor));

	entity_set_origin(g_iOwnedEnt[id], vMoveTo);
	
	return FMRES_HANDLED
}

public fw_Traceline(Float:start[3], Float:end[3], conditions, id, trace)
{
	if (!is_user_alive(id))
		return PLUGIN_HANDLED
	
	new ent = get_tr2(trace, TR_pHit)
	
	if (is_valid_ent(ent))
	{
		new ent,body
		get_user_aiming(id,ent,body)
		
		new szClass[10], szTarget[7];
		entity_get_string(ent, EV_SZ_classname, szClass, 9);
		entity_get_string(ent, EV_SZ_targetname, szTarget, 6);
		if (equal(szClass, "func_wall") && !equal(szTarget, "ignore") && ent != g_iEntBarrier && g_iShowMovers == 1)
		{
			if (g_boolCanBuild || access(id, ADMIN_SLAY))
			{
				set_hudmessage(0, 50, 255, -1.0, 0.55, 1, 0.01, 3.0, 0.01, 0.01);
				if (!BlockLocker(ent))
				{
					new szCurMover[32], szLastMover[32]
					if (GetEntMover(ent))
					{
						get_user_name(GetEntMover(ent),szCurMover,31)
						if (!GetLastMover(ent))
							ShowSyncHudMsg(id, g_HudSync, "Current Mover: %s^nLast Mover: NONE", szCurMover);
					}
					if (GetLastMover(ent))
					{
						get_user_name(GetLastMover(ent),szLastMover,31)
						if (!GetEntMover(ent))
							ShowSyncHudMsg(id, g_HudSync, "Current Mover: NONE^nLast Mover: %s", szLastMover);
					}
					if (GetEntMover(ent) && GetLastMover(ent))
						ShowSyncHudMsg(id, g_HudSync, "Current Mover: %s^nLast Mover: %s", szCurMover, szLastMover);
					else if (!GetEntMover(ent) && !GetLastMover(ent))
						ShowSyncHudMsg(id, g_HudSync, "This object hasn't been moved");
				}
				else
				{
					new szEntOwner[32]
					get_user_name(BlockLocker(ent),szEntOwner,31)
					ShowSyncHudMsg(id, g_HudSync, "Claimed by: %s", szEntOwner);
				}
			}
		}
	}
	else ClearSyncHud(id, g_HudSync);
	
	return PLUGIN_HANDLED
}

public fw_EmitSound(id,channel,const sample[],Float:volume,Float:attn,flags,pitch)
{
	if (!is_user_connected(id) || !g_isZombie[id] || g_boolCanBuild || g_boolPrepTime || g_boolRoundEnded)
		return FMRES_IGNORED;
		
	if(equal(sample[7], "die", 3) || equal(sample[7], "dea", 3))
	{
		emit_sound(id,channel,g_szZombieDie[random(sizeof g_szZombieDie - 1)],volume,attn,flags,pitch)
		return FMRES_SUPERCEDE
	}
	
	if(equal(sample[7], "bhit", 4))
	{
		emit_sound(id,channel,g_szZombiePain[random(sizeof g_szZombiePain - 1)],volume,attn,flags,pitch)
		return FMRES_SUPERCEDE
	}
	
	// Zombie attacks with knife
	if (equal(sample[8], "kni", 3))
	{
		if (equal(sample[14], "sla", 3)) // slash
		{
			emit_sound(id,channel,g_szZombieMiss[random(sizeof g_szZombieMiss - 1)],volume,attn,flags,pitch)
			return FMRES_SUPERCEDE;
		}
		if (equal(sample[14], "hit", 3)) // hit
		{
			if (sample[17] == 'w') // wall
			{
				emit_sound(id,channel,g_szZombieHit[random(sizeof g_szZombieHit - 1)],volume,attn,flags,pitch)
				return FMRES_SUPERCEDE;
			}
			else
			{
				emit_sound(id,channel,g_szZombieHit[random(sizeof g_szZombieHit - 1)],volume,attn,flags,pitch)
				return FMRES_SUPERCEDE;
			}
		}
		if (equal(sample[14], "sta", 3)) // stab
		{
			emit_sound(id,channel,g_szZombieMiss[random(sizeof g_szZombieMiss - 1)],volume,attn,flags,pitch)
			return FMRES_SUPERCEDE;
		}
	}
	
	return FMRES_IGNORED
}

public fw_Suicide(id) return FMRES_SUPERCEDE

public show_colors_menu(id,offset)
{
	if(offset<0) offset = 0

	new keys, curnum, menu[2048]
	for(new i=offset;i<MAX_COLORS;i++)
	{
		if (g_iColorMode == 0 || (g_iColorMode == 1 && !g_iColorOwner[i]))
		{
			g_iMenuOptions[id][curnum] = i
			keys += (1<<curnum)
	
			curnum++
			format(menu,2047,"%s^n%d. %s", menu, curnum, g_szColorName[i])
	
			if(curnum==8)
				break;
		}
	}

	format(menu,2047,"\ySelect Your Color:^nCurrent: \r%s\w^n^n%s^n", g_szColorName[g_iColor[id]], menu)
	if(curnum==8 && offset<12)
	{
		keys += (1<<8)
		format(menu,2047,"%s^n9. Next",menu)
	}
	if(offset)
	{
		keys += (1<<9)
		format(menu,2047,"%s^n0. Back",menu)
	}

	show_menu(id,keys,menu,-1,"ColorsSelect")
}

public colors_pushed(id,key)
{
	if(key<8)
	{
		g_iColorOwner[g_iMenuOptions[id][key]] = id
		g_iColorOwner[g_iColor[id]] = 0
		g_iColor[id] = g_iMenuOptions[id][key]
		print_color(id, "%s You have picked^x04 %s^x01 as your color", MODNAME, g_szColorName[g_iColor[id]])
		g_iMenuOffset[id] = 0
		
		ExecuteForward(g_fwNewColor, g_fwDummyResult, id, g_iColor[id]);
	}
	else
	{
		if(key==8)
			g_iMenuOffset[id] += 8
		if(key==9)
			g_iMenuOffset[id] -= 8
		show_colors_menu(id,g_iMenuOffset[id])
	}

	return ;
}

public show_zclass_menu(id,offset)
{
	if(offset<0) offset = 0

	new keys, curnum, menu[512], szCache1[32], szCache2[32], iCache3
	for(new i=offset;i<g_iZClasses;i++)
	{
		ArrayGetString(g_zclass_name, i, szCache1, charsmax(szCache1))
		ArrayGetString(g_zclass_info, i, szCache2, charsmax(szCache2))
		iCache3 = ArrayGetCell(g_zclass_admin, i)
		
		// Add to menu
		if (i == g_iZombieClass[id])
			format(menu,511,"%s^n\d%d. %s %s \r%s", menu, curnum+1, szCache1, szCache2, iCache3 == ADMIN_ALL ? "" : "(Admin Only)")
		else
			format(menu,511,"%s^n\w%d. %s \y%s \r%s", menu, curnum+1, szCache1, szCache2, iCache3 == ADMIN_ALL ? "" : "(Admin Only)")
		
		g_iMenuOptions[id][curnum] = i
		keys += (1<<curnum)
	
		curnum++
		
		if(curnum==8)
			break;
	}

	format(menu,511,"\ySelect Your Class:^n\w%s^n", menu)
	if(curnum==8 && offset<12)
	{
		keys += (1<<8)
		format(menu,511,"%s^n\w9. Next",menu)
	}
	if(offset)
	{
		keys += (1<<9)
		format(menu,511,"%s^n\w0. Back",menu)
	}

	show_menu(id,keys,menu,-1,"ZClassSelect")
}

public zclass_pushed(id,key)
{
	if(key<8)
	{
		if (g_iMenuOptions[id][key] == g_iZombieClass[id])
		{
			client_cmd(id, "spk %s", LOCK_FAIL);
			
			print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_CURRENT")
			show_zclass_menu(id,g_iMenuOffset[id])
			return ;
		}
		
		new iCache3 = ArrayGetCell(g_zclass_admin, g_iMenuOptions[id][key])
		
		if ((iCache3 != ADMIN_ALL || !iCache3) && !access(id, iCache3))
		{
			print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_NO_ACCESS")
			show_zclass_menu(id,g_iMenuOffset[id])
			return ;
		}
		
		g_iNextClass[id] = g_iMenuOptions[id][key]
	
		new szCache1[32]
		ArrayGetString(g_zclass_name, g_iMenuOptions[id][key], szCache1, charsmax(szCache1))
		
		if (!g_isZombie[id] || (g_isZombie[id] && (g_boolCanBuild || g_boolPrepTime)))
			print_color(id, "%s You have selected^x04 %s^x01 as your next class", MODNAME, szCache1)
		if (!g_isAlive[id])
			print_color(id, "%s %L", MODNAME, LANG_SERVER, "CLASS_RESPAWN")
		g_iMenuOffset[id] = 0
		
		if (g_isZombie[id] && (g_boolCanBuild || g_boolPrepTime))
			ExecuteHamB(Ham_CS_RoundRespawn, id)
			
		ExecuteForward(g_fwClassPicked, g_fwDummyResult, id, g_iZombieClass[id]);
	}
	else
	{
		if(key==8)
			g_iMenuOffset[id] += 8
		if(key==9)
			g_iMenuOffset[id] -= 8
		show_zclass_menu(id,g_iMenuOffset[id])
	}

	return ;
}

/*------------------------------------------------------------------------------------------------*/
public show_method_menu(id)
{
	if(g_boolFirstTime[id])
	{
		g_boolFirstTime[id] = false
		show_primary_menu(id,0)
	}
	else
	{
		g_iMenuOffset[id] = 0
		show_menu(id,(1<<0)|(1<<1),"\yChoose Your Weapon^n^n\y1. \wNew Guns^n\y2. \wLast Guns",-1,"WeaponMethodMenu")
	}
}

public weapon_method_pushed(id,key)
{
	switch(key)
	{
		case 0: show_primary_menu(id,0)
		case 1: give_weapons(id)
	}
	return ;
}

public show_primary_menu(id,offset)
{
	if(offset<0) offset = 0

	new cvar_value[32]
	get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
	new flags = read_flags(cvar_value)

	new keys, curnum, menu[2048]
	for(new i=offset;i<19;i++)
	{
		if(flags & power(2,i))
		{
			g_iMenuOptions[id][curnum] = i
			keys += (1<<curnum)
	
			curnum++
			format(menu,2047,"%s^n%d. %s",menu,curnum,szWeaponNames[i])
	
			if(curnum==8)
				break;
		}
	}

	format(menu,2047,"\yPrimary Weapon:\w^n%s^n",menu)
	if(curnum==8 && offset<12)
	{
		keys += (1<<8)
		format(menu,2047,"%s^n9. Next",menu)
	}
	if(offset)
	{
		keys += (1<<9)
		format(menu,2047,"%s^n0. Back",menu)
	}

	show_menu(id,keys,menu,-1,"PrimaryWeaponSelect")
}

public prim_weapons_pushed(id,key)
{
	if(key<8)
	{
		g_iWeaponPicked[0][id] = g_iMenuOptions[id][key]
		g_iMenuOffset[id] = 0
		show_secondary_menu(id,0)
	}
	else
	{
		if(key==8)
			g_iMenuOffset[id] += 8
		if(key==9)
			g_iMenuOffset[id] -= 8
		show_primary_menu(id,g_iMenuOffset[id])
	}
	return ;
}

public show_secondary_menu(id,offset)
{
	if(offset<0) offset = 0

	new cvar_value[32]
	get_pcvar_string(g_pcvar_allowedweps,cvar_value,31)
	new flags = read_flags(cvar_value)

	new keys, curnum, menu[2048]
	for(new i=18;i<24;i++)
	{
		if(flags & power(2,i))
		{
			g_iMenuOptions[id][curnum] = i
			keys += (1<<curnum)
	
			curnum++
			format(menu,2047,"%s^n%d. %s",menu,curnum,szWeaponNames[i])
		}
	}

	format(menu,2047,"\ySecondary Weapon:\w^n%s",menu)

	show_menu(id,keys,menu,-1,"SecWeaponSelect")
}

public sec_weapons_pushed(id,key)
{
	if(key<8)
	{
		g_iWeaponPicked[1][id] = g_iMenuOptions[id][key]
	}
	give_weapons(id)
	return ;
}

public give_weapons(id)
{
	strip_user_weapons(id)
	give_item(id,"weapon_knife")
   
	new szWeapon[32], csw
	csw = csw_contant(g_iWeaponPicked[0][id])
	get_weaponname(csw,szWeapon,31)
	give_item(id,szWeapon)
	cs_set_user_bpammo(id,csw,999)
	g_iPrimaryWeapon[id] = csw

	csw = csw_contant(g_iWeaponPicked[1][id])
	get_weaponname(csw,szWeapon,31)
	give_item(id,szWeapon)
	cs_set_user_bpammo(id,csw,999)
	
	g_boolRepick[id] = false
}

stock csw_contant(weapon)
{
	new num = 29
	switch(weapon)
	{
		case 0: num = 3
		case 1: num = 5
		case 2: num = 7
		case 3: num = 8
		case 4: num = 12
		case 5: num = 13
		case 6: num = 14
		case 7: num = 15
		case 8: num = 18
		case 9: num = 19
		case 10: num = 20
		case 11: num = 21
		case 12: num = 22
		case 13: num = 23
		case 14: num = 24
		case 15: num = 27
		case 16: num = 28
		case 17: num = 30
		case 18: num = 1
		case 19: num = 10
		case 20: num = 11
		case 21: num = 16
		case 22: num = 17
		case 23: num = 26
		case 24:
		{
			new s_weapon[32]
		
			get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
		   
			new flags = read_flags(s_weapon)
			do
			{
				num = random_num(0,18)
				if(!(num & flags))
				{
					num = -1
				}
			}
			while(num==-1)
			num = csw_contant(num)
		}
		case 25:
		{
			new s_weapon[32]

			get_pcvar_string(g_pcvar_allowedweps,s_weapon,31)
		
			new flags = read_flags(s_weapon)
			do
			{
				num = random_num(18,23)
				if(!(num & flags))
				{
					num = -1
				}
			}
			while(num==-1)
			num = csw_contant(num)
		}
	}
	return num;
}
/*------------------------------------------------------------------------------------------------*/

Log(const message_fmt[], any:...)
{
	static message[256];
	vformat(message, sizeof(message) - 1, message_fmt, 2);
	
	static filename[96];
	static dir[64];
	if( !dir[0] )
	{
		get_basedir(dir, sizeof(dir) - 1);
		add(dir, sizeof(dir) - 1, "/logs");
	}
	
	format_time(filename, sizeof(filename) - 1, "%m-%d-%Y");
	format(filename, sizeof(filename) - 1, "%s/BaseBuilder_%s.log", dir, filename);
	
	log_to_file(filename, "%s", message);
}

print_color(target, const message[], any:...)
{
	static buffer[512], i, argscount
	argscount = numargs()
	
	// Send to everyone
	if (!target)
	{
		static player
		for (player = 1; player <= g_iMaxPlayers; player++)
		{
			// Not connected
			if (!g_isConnected[player])
				continue;
			
			// Remember changed arguments
			static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
			changedcount = 0
			
			// Replace LANG_PLAYER with player id
			for (i = 2; i < argscount; i++)
			{
				if (getarg(i) == LANG_PLAYER)
				{
					setarg(i, 0, player)
					changed[changedcount] = i
					changedcount++
				}
			}
			
			// Format message for player
			vformat(buffer, charsmax(buffer), message, 3)
			
			// Send it
			message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
			write_byte(player)
			write_string(buffer)
			message_end()
			
			// Replace back player id's with LANG_PLAYER
			for (i = 0; i < changedcount; i++)
				setarg(changed[i], 0, LANG_PLAYER)
		}
	}
	// Send to specific target
	else
	{
		// Format message for player
		vformat(buffer, charsmax(buffer), message, 3)
		
		// Send it
		message_begin(MSG_ONE, g_msgSayText, _, target)
		write_byte(target)
		write_string(buffer)
		message_end()
	}
}

stock fm_cs_get_current_weapon_ent(id)
	return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX);

public native_register_zombie_class(const name[], const info[], const model[], const clawmodel[], hp, speed, Float:gravity, Float:knockback, adminflags, credits)
{
	if (!g_boolArraysCreated)
		return 0;
		
	// Strings passed byref
	param_convert(1)
	param_convert(2)
	param_convert(3)
	param_convert(4)
	
	// Add the class
	ArrayPushString(g_zclass_name, name)
	ArrayPushString(g_zclass_info, info)
	
	ArrayPushCell(g_zclass_modelsstart, ArraySize(g_zclass_playermodel))
	ArrayPushString(g_zclass_playermodel, model)
	ArrayPushCell(g_zclass_modelsend, ArraySize(g_zclass_playermodel))
	ArrayPushCell(g_zclass_modelindex, -1)
	
	ArrayPushString(g_zclass_clawmodel, clawmodel)
	ArrayPushCell(g_zclass_hp, hp)
	ArrayPushCell(g_zclass_spd, speed)
	ArrayPushCell(g_zclass_grav, gravity)
	ArrayPushCell(g_zclass_admin, adminflags)
	ArrayPushCell(g_zclass_credits, credits)
	
	// Set temporary new class flag
	ArrayPushCell(g_zclass_new, 1)
	
	// Override zombie classes data with our customizations
	new i, k, buffer[32], Float:buffer2, nummodels_custom, nummodels_default, prec_mdl[100], size = ArraySize(g_zclass2_realname)
	for (i = 0; i < size; i++)
	{
		ArrayGetString(g_zclass2_realname, i, buffer, charsmax(buffer))
		
		// Check if this is the intended class to override
		if (!equal(name, buffer))
			continue;
		
		// Remove new class flag
		ArraySetCell(g_zclass_new, g_iZClasses, 0)
		
		// Replace caption
		ArrayGetString(g_zclass2_name, i, buffer, charsmax(buffer))
		ArraySetString(g_zclass_name, g_iZClasses, buffer)
		
		// Replace info
		ArrayGetString(g_zclass2_info, i, buffer, charsmax(buffer))
		ArraySetString(g_zclass_info, g_iZClasses, buffer)
		
		nummodels_custom = ArrayGetCell(g_zclass2_modelsend, i) - ArrayGetCell(g_zclass2_modelsstart, i)
		nummodels_default = ArrayGetCell(g_zclass_modelsend, g_iZClasses) - ArrayGetCell(g_zclass_modelsstart, g_iZClasses)
			
		// Replace each player model and model index
		for (k = 0; k < min(nummodels_custom, nummodels_default); k++)
		{
			ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
			ArraySetString(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k, buffer)
				
			// Precache player model and replace its modelindex with the real one
			formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
			ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k, engfunc(EngFunc_PrecacheModel, prec_mdl))
		}
			
		// We have more custom models than what we can accommodate,
		// Let's make some space...
		if (nummodels_custom > nummodels_default)
		{
			for (k = nummodels_default; k < nummodels_custom; k++)
			{
				ArrayGetString(g_zclass2_playermodel, ArrayGetCell(g_zclass2_modelsstart, i) + k, buffer, charsmax(buffer))
				ArrayInsertStringAfter(g_zclass_playermodel, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k - 1, buffer)
				
				// Precache player model and retrieve its modelindex
				formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", buffer, buffer)
				ArrayInsertCellAfter(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses) + k - 1, engfunc(EngFunc_PrecacheModel, prec_mdl))
			}
				
			// Fix models end index for this class
			ArraySetCell(g_zclass_modelsend, g_iZClasses, ArrayGetCell(g_zclass_modelsend, g_iZClasses) + (nummodels_custom - nummodels_default))
		}
		
		// Replace clawmodel
		ArrayGetString(g_zclass2_clawmodel, i, buffer, charsmax(buffer))
		ArraySetString(g_zclass_clawmodel, g_iZClasses, buffer)
		
		// Precache clawmodel
		formatex(prec_mdl, charsmax(prec_mdl), "models/%s.mdl", buffer)
		engfunc(EngFunc_PrecacheModel, prec_mdl)
		
		// Replace health
		buffer[0] = ArrayGetCell(g_zclass2_hp, i)
		ArraySetCell(g_zclass_hp, g_iZClasses, buffer[0])
		
		// Replace speed
		buffer[0] = ArrayGetCell(g_zclass2_spd, i)
		ArraySetCell(g_zclass_spd, g_iZClasses, buffer[0])
		
		// Replace gravity
		buffer2 = Float:ArrayGetCell(g_zclass2_grav, i)
		ArraySetCell(g_zclass_grav, g_iZClasses, buffer2)
		
		// Replace admin flags
		buffer2 = ArrayGetCell(g_zclass2_admin, i)
		ArraySetCell(g_zclass_admin, g_iZClasses, buffer2)
	
		// Replace credits
		buffer2 = ArrayGetCell(g_zclass2_credits, i)
		ArraySetCell(g_zclass_credits, g_iZClasses, buffer2)
	}
	
	// If class was not overriden with customization data
	if (ArrayGetCell(g_zclass_new, g_iZClasses))
	{
		// Precache default class model and replace modelindex with the real one
		formatex(prec_mdl, charsmax(prec_mdl), "models/player/%s/%s.mdl", model, model)
		ArraySetCell(g_zclass_modelindex, ArrayGetCell(g_zclass_modelsstart, g_iZClasses), engfunc(EngFunc_PrecacheModel, prec_mdl))
		
		// Precache default clawmodel
		formatex(prec_mdl, charsmax(prec_mdl), "models/%s.mdl", clawmodel)
		engfunc(EngFunc_PrecacheModel, prec_mdl)
	}

	g_iZClasses++
	
	return g_iZClasses-1
}

public native_get_class_cost(classid)
{
	if (classid < 0 || classid >= g_iZClasses)
		return -1;
	
	return ArrayGetCell(g_zclass_credits, classid)
}

public native_get_user_zombie_class(id) return g_iZombieClass[id];
public native_get_user_next_class(id) return g_iNextClass[id];
public native_set_user_zombie_class(id, classid)
{
	if (classid < 0 || classid >= g_iZClasses)
		return 0;
	
	g_iNextClass[id] = classid
	return 1;
}

public native_is_user_zombie(id) return g_isZombie[id]
public native_is_user_banned(id) return g_isBuildBan[id]

public native_bool_buildphase() return g_boolCanBuild
public native_bool_prepphase() return g_boolPrepTime

public native_get_build_time()
{
	if (g_boolCanBuild)
		return g_iCountDown
		
	return 0;
}

public native_set_build_time(time)
{
	if (g_boolCanBuild)
	{
		g_iCountDown = time
		return 1
	}
		
	return 0;
}

public native_get_user_color(id) return g_iColor[id]
public native_set_user_color(id, color)
{
	g_iColor[id] = color
}

public native_drop_user_block(id)
{
	cmdStopEnt(id)
}
public native_get_user_block(id)
{
	if (g_iOwnedEnt[id])
		return g_iOwnedEnt[id]
		
	return 0;
}
public native_set_user_block(id, entity)
{
	if (is_valid_ent(entity) && !is_user_alive(entity) && !MovingEnt(entity))
		g_iOwnedEnt[id] = entity
}

public native_is_locked_block(entity)
{
	if (is_valid_ent(entity) && !is_user_alive(entity))
		return BlockLocker(entity) ? true : false
		
	return -1;
}
public native_lock_block(entity)
{
	if (is_valid_ent(entity) && !is_user_alive(entity) && !BlockLocker(entity))
	{
		LockBlock(entity, 33);
		set_pev(entity,pev_rendermode,kRenderTransColor)
		set_pev(entity,pev_rendercolor,Float:{LOCKED_COLOR})
		set_pev(entity,pev_renderamt,Float:{LOCKED_RENDERAMT})
	}
}
public native_unlock_block(entity)
{
	if (is_valid_ent(entity) && !is_user_alive(entity) && BlockLocker(entity))
	{
		UnlockBlock(entity)
		set_pev(entity,pev_rendermode,kRenderNormal)
	}
}

public native_release_zombies()
{
	if (g_boolCanBuild || g_boolPrepTime)
	{
		Release_Zombies()
		return 1;
	}
	return 0;
}

public native_set_user_primary(id, csw_primary)
{
	if (CSW_P228<=csw_primary<=CSW_P90)
	{
		g_iPrimaryWeapon[id] = csw_primary
		return g_iPrimaryWeapon[id];
	}
		
	return -1;
}

public native_get_user_primary(id) return g_iPrimaryWeapon[id]

public native_get_flags_build() 		return FLAGS_BUILD
public native_get_flags_lock() 		return FLAGS_LOCK
public native_get_flags_buildban() 	return FLAGS_BUILDBAN
public native_get_flags_swap() 		return FLAGS_SWAP
public native_get_flags_revive() 	return FLAGS_REVIVE
public native_get_flags_guns() 		return FLAGS_GUNS
public native_get_flags_release() 	return FLAGS_RELEASE
public native_get_flags_override() 	return FLAGS_OVERRIDE

/*public native_set_user_mult(id, attribute, Float: amount)
{
	if (attribute < ATT_HEALTH || attribute > ATT_GRAVITY)
		return 0;
		
	if (amount < 1.0)
		amount = 1.0
		
	g_fClassMultiplier[id][attribute] = amount
	
	return 1;
}*/
lRodri. is offline
Send a message via MSN to lRodri.
rak
Veteran Member
Join Date: Oct 2011
Location: banned country
Old 12-28-2012 , 21:00   Re: [AYUDA] Base Builder
#9

Quote:
Originally Posted by rak View Post
si no me equivoco
PHP Code:
#define FLAGS_LOCK    ADMIN_LEVEL_A|ADMIN_USER 
__________________

www.amxmodx-es.com

Steam: Luchokoldo
rak is offline
Send a message via MSN to rak Send a message via Skype™ to rak
Old 12-28-2012, 21:15
StrikerV2
This message has been deleted by lucas_7_94. Reason: Off topic.
Old 12-28-2012, 21:26
rak
This message has been deleted by lucas_7_94. Reason: Off topic.
Old 12-28-2012, 21:29
StrikerV2
This message has been deleted by lucas_7_94. Reason: Off topic.
Meetikcz
BANNED
Join Date: Dec 2012
Old 12-28-2012 , 22:10   Re: [AYUDA] Base Builder
#10

De hecho yo tambien queria haser que todos puedieran bloquear aunque no sean admins y cambie lo que dije y con eso tubo
Meetikcz is offline
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 06:42.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode