[REZOLVAT]Afisiare meniu arme si clase de zombi

Discutii legate de instalarea, configurarea si modificarea unui server de Counter-Strike.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

30 Jul 2014, 17:38

Salut.
Cand imi aleg armele de la inceput sau clasa de zombie imi apar asa

Image
Image

Cum rezolv acel ”W” , ”R” , ”Y” din fata
Last edited by Cosmin on 01 Aug 2014, 15:58, edited 1 time in total.
Reason: #Rezolvat.
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

30 Jul 2014, 19:22

defapt aia trebuia sa fie culoarea insa este gresit ceva,posteaza sursa.
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

30 Jul 2014, 20:25

scosmynnnn wrote:defapt aia trebuia sa fie culoarea insa este gresit ceva,posteaza sursa.
Poti fi mai explicit? La ce sursa te referi?

Eu ma refer de exemplu la w-u ala de la arma , apare w arme noi
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

30 Jul 2014, 20:32

sursa de la pluginul tau de zm,care are in componenta meniurile astea.
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

30 Jul 2014, 21:22

scosmynnnn wrote:sursa de la pluginul tau de zm,care are in componenta meniurile astea.
Am gasit in plugins.ini

// Weapons Menu
bio_weapon_compound_bow.amxx
bio_weapon_m32.amxx

Deci cred ca cele doua sunt.

bio_weapon_compound_bow.amxx
| Afiseaza codul
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include < biohazard >
#include < weapon >

#define PLUGIN "[Bio] Weapon Primary: Compound Bow"
#define VERSION "1.0"
#define AUTHOR "Dias Leon"

// =========== Resources Config
#define V_MODEL		"models/Biohazard30/Weapons/CompoundBow/v_bow.mdl"
#define P_MODEL		"models/Biohazard30/Weapons/CompoundBow/p_bow.mdl"
#define P_MODEL_EMPTY	"models/Biohazard30/Weapons/CompoundBow/p_bow_empty.mdl"
#define W_MODEL		"models/Biohazard30/Weapons/CompoundBow/w_bow.mdl"

#define ARROW_MODEl	"models/Biohazard30/Weapons/CompoundBow/arrow.mdl"

new const WeaponSounds[7][] =
{
    "weapons/bow_shoot1.wav",
    "weapons/bow_charge_shoot1_empty.wav",
    "weapons/bow_charge_shoot2.wav",
    "weapons/bow_draw.wav",
    "weapons/bow_charge_start1.wav",
    "weapons/bow_charge_start2.wav",
    "weapons/bow_charge_finish1.wav"
}

new const WeaponResources[3][] =
{
    "sprites/bio_weapon_bow.txt",
    "sprites/Biohazard30/Weapons/CompoundBow/640hud12_2.spr",
    "sprites/Biohazard30/Weapons/CompoundBow/640hud98_2.spr"
}

enum
{
    BOW_ANIM_IDLE = 0,
    BOW_ANIM_IDLE_EMPTY,
    BOW_ANIM_SHOOT1, // 0.45
    BOW_ANIM_SHOOT1_EMPTY,
    BOW_ANIM_DRAW,
    BOW_ANIM_DRAW_EMPTY,
    BOW_ANIM_CHARGE_START, // 0.5
    BOW_ANIM_CHARGE_FINISH, // 0.35
    BOW_ANIM_CHARGE_IDLE1, // 0.35
    BOW_ANIM_CHARGE_IDLE2, // 0.35
    BOW_ANIM_CHARGE_SHOOT1, // 1.3
    BOW_ANIM_CHARGE_SHOOT1_EMPTY, // 0.6
    BOW_ANIM_CHARGE_SHOOT2, // 1.3
    BOW_ANIM_CHARGE_SHOOT2_EMPTY // 0.6
}

// =========== Main Config
#define CSW_BOW CSW_M4A1
#define weapon_bow "weapon_m4a1"
#define BOW_AMMOID 1

#define ARROW_DEFAULT 500
#define ARROW_CLASSNAME "arrow"
#define ARROW_SPEED 2000.0

#define TIME_DRAW 0.75
#define TIME_RELOADA 0.45
#define TIME_RELOADB 1.25
#define TIME_CHARGE 0.5

#define DAMAGE_A 40
#define DAMAGE_B 160

#define WEAPON_SECRETCODE 3102013 // Create Date
#define WEAPON_ANIMEXT "carbine"
#define WEAPON_OLDWMODEL "models/w_m4a1.mdl"

// =========== WeaponList Config
#define WL_NAME "bio_weapon_bow"
#define WL_PRIAMMOID 4
#define WL_PRIAMMOMAX 60 // 30
#define WL_SECAMMOID -1
#define WL_SECAMMOIDMAX -1
#define WL_SLOTID 0
#define WL_NUMINSLOT 6
#define WL_FLAG 0

// MACROS
#define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
#define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
#define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))

enum
{
    TEAM_T = 1,
    TEAM_CT
}

enum
{
    WEAPON_NONE = 0,
    WEAPON_STARTCHARGING,
    WEAPON_WAITCHARGING,
    WEAPON_CHARGING,
    WEAPON_FINISHCHARGING
}

// Vars
new g_Had_CompoundBow, g_InTempingAttack, g_BowArrow[33], g_WeaponState[33], Float:g_TimeCharge[33]
new g_MsgCurWeapon, g_MsgAmmoX, g_MsgWeaponList
new g_SprId_LaserBeam

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")

    register_event( "HLTV", "hltv_NewRound", "a", "1=0", "2=0" );
    
    register_think(ARROW_CLASSNAME, "fw_Think_Arrow")
    register_touch(ARROW_CLASSNAME, "*", "fw_Touch_Arrow")
    
    register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
    register_forward(FM_CmdStart, "fw_CmdStart")
    register_forward(FM_SetModel, "fw_SetModel")    
    register_forward(FM_EmitSound, "fw_EmitSound")
    register_forward(FM_TraceLine, "fw_TraceLine")
    register_forward(FM_TraceHull, "fw_TraceHull")        
    
    RegisterHam(Ham_Item_AddToPlayer, weapon_bow, "fw_Item_AddToPlayer_Post", 1)
    RegisterHam(Ham_Item_Deploy, weapon_bow, "fw_Item_Deploy_Post", 1)
    RegisterHam(Ham_Weapon_WeaponIdle, weapon_bow, "fw_Weapon_WeaponIdle_Post", 1)
    
    g_MsgCurWeapon = get_user_msgid("CurWeapon")
    g_MsgAmmoX = get_user_msgid("AmmoX")
    g_MsgWeaponList = get_user_msgid("WeaponList")
    
    register_clcmd(WL_NAME, "WeaponList_Hook")
}

public plugin_precache()
{
    engfunc(EngFunc_PrecacheModel, V_MODEL)
    engfunc(EngFunc_PrecacheModel, P_MODEL)
    engfunc(EngFunc_PrecacheModel, P_MODEL_EMPTY)
    engfunc(EngFunc_PrecacheModel, W_MODEL)
    engfunc(EngFunc_PrecacheModel, ARROW_MODEl)
    
    new i
    for(i = 0; i < sizeof(WeaponSounds); i++)
        engfunc(EngFunc_PrecacheSound, WeaponSounds)
    for(i = 0; i < sizeof(WeaponResources); i++)
    {
        if(i == 0) engfunc(EngFunc_PrecacheGeneric, WeaponResources)
        else engfunc(EngFunc_PrecacheModel, WeaponResources)
    }
    
    g_SprId_LaserBeam = engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr")
}

public hltv_NewRound(  ) {

	for( new id = 0; id < get_maxplayers(  ); id++ ) {

		if( is_user_alive( id ) && is_user_connected( id ) ) {

			Remove_CompoundBow( id );
		}
	}
}

public plugin_natives(  ) {

	register_native( "set_user_bow", "set_user_bow", 1 );
}

public set_user_bow( id, bow ) {

	if( bow ) {
		Get_CompoundBow( id );
	} else {
		Remove_CompoundBow( id );
	}
}

public Get_CompoundBow(id)
{
    if(!is_user_alive(id))
        return
        
    Set_BitVar(g_Had_CompoundBow, id)
    g_BowArrow[id] = ARROW_DEFAULT
    g_WeaponState[id] = WEAPON_NONE
    
    fm_give_item(id, weapon_bow)
    UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])
}

public Remove_CompoundBow(id)
{
    UnSet_BitVar(g_Had_CompoundBow, id)
    g_BowArrow[id] = 0
}

public WeaponList_Hook(id)
{
    engclient_cmd(id, weapon_bow)
    return PLUGIN_HANDLED
}

public UpdateAmmo(id, CSWID, AmmoID, Ammo, BpAmmo)
{
    message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
    write_byte(1)
    write_byte(CSWID)
    write_byte(Ammo)
    message_end()
    
    message_begin(MSG_ONE_UNRELIABLE, g_MsgAmmoX, _, id)
    write_byte(AmmoID)
    write_byte(BpAmmo)
    message_end()
    
    cs_set_user_bpammo(id, CSWID, BpAmmo)
}

public Event_CurWeapon(id)
{
    static CSWID; CSWID = read_data(2)
    if(CSWID != CSW_BOW) return
    if(!Get_BitVar(g_Had_CompoundBow, id)) return
    
    UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])
}

public fw_Think_Arrow(Ent)
{
    if(!pev_valid(Ent))
        return
    if(pev(Ent, pev_iuser4))
    {
        engfunc(EngFunc_RemoveEntity, Ent)
        return
    }
    static Id; Id = pev(Ent, pev_iuser1)
    if(!is_user_connected(Id))    
        return

    if(!pev(Ent, pev_iuser3))
    {
        if(entity_range(Ent, Id) < 250.0)
        {
            set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
            return
        }

        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_BEAMFOLLOW)
        write_short(Ent)
        write_short(g_SprId_LaserBeam)
        write_byte(10)
        write_byte(2)
        write_byte(255)
        write_byte(127)
        write_byte(127)
        write_byte(127)
        message_end()
        
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_BEAMFOLLOW)
        write_short(Ent)
        write_short(g_SprId_LaserBeam)
        write_byte(10)
        write_byte(2)
        write_byte(255)
        write_byte(255)
        write_byte(255)
        write_byte(127)
        message_end()
        
        set_pev(Ent, pev_iuser3, 1)
    }
        
    set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
}

public fw_Touch_Arrow(Ent, Id)
{
    if(!pev_valid(Ent))
        return
    if(pev(Ent, pev_movetype) == MOVETYPE_NONE)
        return
        
    // Remove Ent
    set_pev(Ent, pev_movetype, MOVETYPE_NONE)
    set_pev(Ent, pev_solid, SOLID_NOT)
        
    if(!is_user_alive(Id)) // Wall
    {
        set_pev(Ent, pev_iuser4, 1)
        set_pev(Ent, pev_nextthink, get_gametime() + 3.0)
        
        static Float:Origin[3]; pev(Ent, pev_origin, Origin)
        MakeBulletDecal(Origin)
    } else { // Player
        static Attacker; Attacker = pev(Ent, pev_iuser1)
        if(!is_user_connected(Attacker) || Attacker == Id)
        {
            engfunc(EngFunc_RemoveEntity, Ent)
            return
        }
            
        do_attack(Attacker, Id, 0, float(DAMAGE_A) * 1.5)
        engfunc(EngFunc_RemoveEntity, Ent)
    }
}

public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
    if(get_user_weapon(id) != CSW_BOW || !Get_BitVar(g_Had_CompoundBow, id))
        return FMRES_IGNORED
    
    set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001) 
    
    return FMRES_HANDLED
}

public fw_CmdStart(id, uc_handle, seed)
{
    if(get_user_weapon(id) != CSW_BOW || !Get_BitVar(g_Had_CompoundBow, id))
        return
    
    static CurButton; CurButton = get_uc(uc_handle, UC_Buttons)
    if(CurButton & IN_ATTACK)
    {
        CurButton &= ~IN_ATTACK
        set_uc(uc_handle, UC_Buttons, CurButton)
        
        Bow_NormalAttackHandle(id, 0)
    }
    
    static Ent; Ent = fm_get_user_weapon_entity(id, CSW_BOW)
    if(!pev_valid(Ent)) return
    
    if(CurButton & IN_ATTACK2) 
    {
        CurButton &= ~IN_ATTACK2
        set_uc(uc_handle, UC_Buttons, CurButton)
        
        if(get_pdata_float(Ent, 46, 4) > 0.0 || get_pdata_float(Ent, 47, 4) > 0.0) 
            return
        if(!g_BowArrow[id])
            return
            
        switch(g_WeaponState[id])
        {
            case WEAPON_NONE: 
            {
                Set_Weapon_Anim(id, BOW_ANIM_CHARGE_START)
                Set_Weapon_TimeIdle(id, CSW_BOW, 0.5)
                Set_Player_NextAttack(id, 0.5)
                
                g_WeaponState[id] = WEAPON_STARTCHARGING
            }
            case WEAPON_STARTCHARGING:
            {
                Set_Weapon_Anim(id, BOW_ANIM_CHARGE_IDLE1)
                Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
                Set_Player_NextAttack(id, 0.35)
                
                g_TimeCharge[id] = get_gametime()
                g_WeaponState[id] = WEAPON_WAITCHARGING
            }
            case WEAPON_WAITCHARGING:
            {
                Set_Weapon_Anim(id, BOW_ANIM_CHARGE_IDLE1)
                Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
                Set_Player_NextAttack(id, 0.35)
                
                g_WeaponState[id] = WEAPON_WAITCHARGING
                
                if(get_gametime() >= (g_TimeCharge[id] + TIME_CHARGE))
                {
                    Set_Weapon_Anim(id, BOW_ANIM_CHARGE_FINISH)
                    Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
                    Set_Player_NextAttack(id, 0.35)
                    
                    g_WeaponState[id] = WEAPON_FINISHCHARGING
                }
            }
            case WEAPON_FINISHCHARGING:
            {
                Set_Weapon_Anim(id, BOW_ANIM_CHARGE_IDLE2)
                Set_Weapon_TimeIdle(id, CSW_BOW, 0.35)
                Set_Player_NextAttack(id, 0.35)
                
                g_WeaponState[id] = WEAPON_FINISHCHARGING
            }
        }
    } else {
        static OldButton; OldButton = pev(id, pev_oldbuttons)
        if(OldButton & IN_ATTACK2)
        {
            if(g_WeaponState[id] == WEAPON_WAITCHARGING)
            {
                set_pdata_float(id, 83, 0.0, 5)
                Bow_NormalAttackHandle(id, 1)
            } else if(g_WeaponState[id] == WEAPON_FINISHCHARGING) {
                Bow_ChargeAttackHandle(id)
            }
        } else {
            if(get_pdata_float(Ent, 46, 4) > 0.0 || get_pdata_float(Ent, 47, 4) > 0.0) 
                return
            
            if(g_WeaponState[id] == WEAPON_STARTCHARGING)
            {
                set_pdata_float(id, 83, 0.0, 5)
                Bow_NormalAttackHandle(id, 1)
            }
            
            g_WeaponState[id] = WEAPON_NONE
        }
    }
    
    return 
}

public fw_SetModel(entity, model[])
{
    if(!pev_valid(entity))
        return FMRES_IGNORED
    
    static szClassName[33]
    pev(entity, pev_classname, szClassName, charsmax(szClassName))
    
    if(!equal(szClassName, "weaponbox"))
        return FMRES_IGNORED
    
    static id; id = pev(entity, pev_owner)
    
    if(equal(model, WEAPON_OLDWMODEL))
    {
        static weapon
        weapon = fm_find_ent_by_owner(-1, weapon_bow, entity)
        
        if(!pev_valid(weapon))
            return FMRES_IGNORED
        
        if(Get_BitVar(g_Had_CompoundBow, id))
        {
            set_pev(weapon, pev_impulse, WEAPON_SECRETCODE)
            set_pev(weapon, pev_iuser1, g_BowArrow[id])
            
            engfunc(EngFunc_SetModel, entity, W_MODEL)
            Remove_CompoundBow(id)
            
            return FMRES_SUPERCEDE
        }
    }

    return FMRES_IGNORED
}


public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
{
    if(!is_user_connected(id))
        return FMRES_IGNORED
    if(!Get_BitVar(g_InTempingAttack, id))
        return FMRES_IGNORED
        
    if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
    {
        if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
            return FMRES_SUPERCEDE
        if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
        {
            if (sample[17] == 'w')  return FMRES_SUPERCEDE
            else  return FMRES_SUPERCEDE
        }
        if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
            return FMRES_SUPERCEDE;
    }
    
    return FMRES_IGNORED
}

public fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monster, id, handle)
{
    if(!is_user_alive(id))
        return FMRES_IGNORED   

    if(is_user_zombie(id))
        return FMRES_IGNORED    

    if(!Get_BitVar(g_InTempingAttack, id))
        return FMRES_IGNORED
    
    static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
    
    pev(id, pev_origin, fOrigin)
    pev(id, pev_view_ofs, view_ofs)
    xs_vec_add(fOrigin, view_ofs, vecStart)
    pev(id, pev_v_angle, v_angle)
    
    engfunc(EngFunc_MakeVectors, v_angle)
    get_global_vector(GL_v_forward, v_forward)

    xs_vec_mul_scalar(v_forward, 0.0, v_forward)
    xs_vec_add(vecStart, v_forward, vecEnd)
    
    engfunc(EngFunc_TraceLine, vecStart, vecEnd, ignored_monster, id, handle)
    
    return FMRES_SUPERCEDE
}

public fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monster, hull, id, handle)
{
    if(!is_user_alive(id))
        return FMRES_IGNORED    

    if(is_user_zombie(id))
        return FMRES_IGNORED  

    if(!Get_BitVar(g_InTempingAttack, id))
        return FMRES_IGNORED
    
    static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
    
    pev(id, pev_origin, fOrigin)
    pev(id, pev_view_ofs, view_ofs)
    xs_vec_add(fOrigin, view_ofs, vecStart)
    pev(id, pev_v_angle, v_angle)
    
    engfunc(EngFunc_MakeVectors, v_angle)
    get_global_vector(GL_v_forward, v_forward)
    
    xs_vec_mul_scalar(v_forward, 0.0, v_forward)
    xs_vec_add(vecStart, v_forward, vecEnd)
    
    engfunc(EngFunc_TraceHull, vecStart, vecEnd, ignored_monster, hull, id, handle)
    
    return FMRES_SUPERCEDE
}

public Bow_NormalAttackHandle(id, UnCharge)
{
    if(get_pdata_float(id, 83, 5) > 0.0)
        return
    if(!g_BowArrow[id])
    {
        set_pdata_float(id, 83, 1.0, 5)
        Set_Weapon_Anim(id, BOW_ANIM_IDLE_EMPTY)
        
        return
    }
        
    g_BowArrow[id]--
    UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])

    Create_FakeAttack(id)
    
    Set_Weapon_Anim(id, UnCharge ? BOW_ANIM_CHARGE_SHOOT1 : BOW_ANIM_SHOOT1)
    emit_sound(id, CHAN_WEAPON, WeaponSounds[UnCharge ? 1 : 0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    
    Create_ArrowA(id)
    Make_Push(id)
    
    Set_Player_NextAttack(id, UnCharge ? TIME_RELOADB : TIME_RELOADA)
    Set_Weapon_TimeIdle(id, CSW_BOW, UnCharge ? TIME_RELOADB : TIME_RELOADA)
    
    g_WeaponState[id] = WEAPON_NONE
}

public Bow_ChargeAttackHandle(id)
{
    if(!g_BowArrow[id])
    {
        set_pdata_float(id, 83, 1.0, 5)
        Set_Weapon_Anim(id, BOW_ANIM_IDLE_EMPTY)
        
        return
    }
        
    g_BowArrow[id]--
    UpdateAmmo(id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[id])

    Create_FakeAttack(id)
    
    Set_Weapon_Anim(id, BOW_ANIM_CHARGE_SHOOT2)
    emit_sound(id, CHAN_WEAPON, WeaponSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    
    ChargedShoot(id)
    Make_Push(id)
    
    Set_Player_NextAttack(id, TIME_RELOADB)
    Set_Weapon_TimeIdle(id, CSW_BOW, TIME_RELOADB)    
    
    g_WeaponState[id] = WEAPON_NONE
}

public ChargedShoot(id)
{
    static Float:StartOrigin[3], Float:EndOrigin[3], Float:EndOrigin2[3]
    
    Get_Position(id, 40.0, 0.0, 0.0, StartOrigin)
    Get_Position(id, 4096.0, 0.0, 0.0, EndOrigin)
    
    static TrResult; TrResult = create_tr2()
    engfunc(EngFunc_TraceLine, StartOrigin, EndOrigin, IGNORE_MONSTERS, id, TrResult) 
    get_tr2(TrResult, TR_vecEndPos, EndOrigin2)
    free_tr2(TrResult)
    
    message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
    write_byte(TE_BEAMPOINTS)
    engfunc(EngFunc_WriteCoord, StartOrigin[0])
    engfunc(EngFunc_WriteCoord, StartOrigin[1])
    engfunc(EngFunc_WriteCoord, StartOrigin[2])
    engfunc(EngFunc_WriteCoord, EndOrigin2[0])
    engfunc(EngFunc_WriteCoord, EndOrigin2[1])
    engfunc(EngFunc_WriteCoord, EndOrigin2[2])
    write_short(g_SprId_LaserBeam)    // sprite index
    write_byte(0)    // starting frame
    write_byte(0)    // frame rate in 0.1's
    write_byte(20)    // life in 0.1's
    write_byte(10)    // line width in 0.1's
    write_byte(0)    // noise amplitude in 0.01's
    write_byte(255)    // Red
    write_byte(127)    // Green
    write_byte(127)    // Blue
    write_byte(127)    // brightness
    write_byte(0)    // scroll speed in 0.1's
    message_end()
    
    message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
    write_byte(TE_BEAMPOINTS)
    engfunc(EngFunc_WriteCoord, StartOrigin[0])
    engfunc(EngFunc_WriteCoord, StartOrigin[1])
    engfunc(EngFunc_WriteCoord, StartOrigin[2])
    engfunc(EngFunc_WriteCoord, EndOrigin2[0])
    engfunc(EngFunc_WriteCoord, EndOrigin2[1])
    engfunc(EngFunc_WriteCoord, EndOrigin2[2])
    write_short(g_SprId_LaserBeam)    // sprite index
    write_byte(0)    // starting frame
    write_byte(0)    // frame rate in 0.1's
    write_byte(20)    // life in 0.1's
    write_byte(10)    // line width in 0.1's
    write_byte(0)    // noise amplitude in 0.01's
    write_byte(255)    // Red
    write_byte(255)    // Green
    write_byte(255)    // Blue
    write_byte(127)    // brightness
    write_byte(0)    // scroll speed in 0.1's
    message_end()
    
    ChargedDamage(id, StartOrigin, EndOrigin2)
}

public ChargedDamage(id, Float:Start[3], Float:End[3])
{
    static TrResult; TrResult = create_tr2()
    
    // Trace First Time
    engfunc(EngFunc_TraceLine, Start, End, DONT_IGNORE_MONSTERS, id, TrResult) 
    static pHit1; pHit1 = get_tr2(TrResult, TR_pHit)
    static Float:End1[3]; get_tr2(TrResult, TR_vecEndPos, End1)
    
    if(is_user_alive(pHit1)) 
    {
        do_attack(id, pHit1, 0, float(DAMAGE_B) * 1.5)
        engfunc(EngFunc_TraceLine, End1, End, DONT_IGNORE_MONSTERS, pHit1, TrResult) 
    } else engfunc(EngFunc_TraceLine, End1, End, DONT_IGNORE_MONSTERS, -1, TrResult) 
    
    // Trace Second Time
    static pHit2; pHit2 = get_tr2(TrResult, TR_pHit)
    static Float:End2[3]; get_tr2(TrResult, TR_vecEndPos, End2)
    
    if(is_user_alive(pHit2)) 
    {
        do_attack(id, pHit2, 0, float(DAMAGE_B) * 1.5)
        engfunc(EngFunc_TraceLine, End2, End, DONT_IGNORE_MONSTERS, pHit2, TrResult) 
    } else engfunc(EngFunc_TraceLine, End2, End, DONT_IGNORE_MONSTERS, -1, TrResult) 
    
    // Trace Third Time
    static pHit3; pHit3 = get_tr2(TrResult, TR_pHit)
    static Float:End3[3]; get_tr2(TrResult, TR_vecEndPos, End3)
    
    if(is_user_alive(pHit3)) 
    {
        do_attack(id, pHit3, 0, float(DAMAGE_B) * 1.5)
        engfunc(EngFunc_TraceLine, End3, End, DONT_IGNORE_MONSTERS, pHit3, TrResult) 
    } else engfunc(EngFunc_TraceLine, End3, End, DONT_IGNORE_MONSTERS, -1, TrResult) 
    
    // Trace Fourth Time
    static pHit4; pHit4 = get_tr2(TrResult, TR_pHit)
    if(is_user_alive(pHit4)) do_attack(id, pHit4, 0, float(DAMAGE_B) * 1.5)

    free_tr2(TrResult)
}

public Create_ArrowA(id)
{
    static Float:StartOrigin[3], Float:EndOrigin[3], Float:Angles[3]
    
    Get_Position(id, 40.0, 0.0, 0.0, StartOrigin)
    Get_Position(id, 4096.0, 0.0, 0.0, EndOrigin)
    pev(id, pev_v_angle, Angles)
    
    Angles[0] *= -1
    
    static Arrow; Arrow = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_sprite"))
    if(!pev_valid(Arrow)) return
    
    set_pev(Arrow, pev_movetype, MOVETYPE_FLY)
    set_pev(Arrow, pev_iuser1, id) // Better than pev_owner
    set_pev(Arrow, pev_iuser2, Get_SpecialTeam(id, cs_get_user_team(id)))
    set_pev(Arrow, pev_iuser3, 0)
    set_pev(Arrow, pev_iuser4, 0)
    
    entity_set_string(Arrow, EV_SZ_classname, ARROW_CLASSNAME)
    engfunc(EngFunc_SetModel, Arrow, ARROW_MODEl)
    set_pev(Arrow, pev_mins, Float:{-1.0, -1.0, -1.0})
    set_pev(Arrow, pev_maxs, Float:{1.0, 1.0, 1.0})
    set_pev(Arrow, pev_origin, StartOrigin)
    set_pev(Arrow, pev_angles, Angles)
    set_pev(Arrow, pev_gravity, 0.01)
    set_pev(Arrow, pev_solid, SOLID_BBOX)
    
    set_pev(Arrow, pev_nextthink, get_gametime() + 0.1)
    
    static Float:Velocity[3]
    get_speed_vector(StartOrigin, EndOrigin, ARROW_SPEED, Velocity)
    set_pev(Arrow, pev_velocity, Velocity)
}

public Create_FakeAttack(id)
{
    static Ent; Ent = fm_get_user_weapon_entity(id, CSW_KNIFE)
    if(!pev_valid(Ent)) return
    
    Set_BitVar(g_InTempingAttack, id)
    ExecuteHamB(Ham_Weapon_PrimaryAttack, Ent)
    
    // Set Real Attack Anim
    static iAnimDesired,  szAnimation[64]

    formatex(szAnimation, charsmax(szAnimation), (pev(id, pev_flags) & FL_DUCKING) ? "crouch_shoot_%s" : "ref_shoot_%s", WEAPON_ANIMEXT)
    if((iAnimDesired = lookup_sequence(id, szAnimation)) == -1)
        iAnimDesired = 0
    
    set_pev(id, pev_sequence, iAnimDesired)
    UnSet_BitVar(g_InTempingAttack, id)
}

public Make_Push(id)
{
    static Float:VirtualVec[3]
    VirtualVec[0] = random_float(-1.0, -2.0)
    VirtualVec[1] = random_float(1.0, -1.0)
    VirtualVec[2] = 0.0    
    
    set_pev(id, pev_punchangle, VirtualVec)        
}

public fw_Item_AddToPlayer_Post(Ent, Id)
{
    if(pev(Ent, pev_impulse) == WEAPON_SECRETCODE)
    {
        Set_BitVar(g_Had_CompoundBow, Id)
        
        g_BowArrow[Id] = pev(Ent, pev_iuser1)
        UpdateAmmo(Id, CSW_BOW, BOW_AMMOID, -1, g_BowArrow[Id])
        
        set_pev(Ent, pev_impulse, 0)
    }            
    
    g_WeaponState[Id] = WEAPON_NONE
    
    message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, _, Id)
    write_string((Get_BitVar(g_Had_CompoundBow, Id) ? WL_NAME : weapon_bow))
    write_byte(WL_PRIAMMOID)
    write_byte(WL_PRIAMMOMAX)
    write_byte(WL_SECAMMOID)
    write_byte(WL_SECAMMOIDMAX)
    write_byte(WL_SLOTID)
    write_byte(WL_NUMINSLOT)
    write_byte(CSW_BOW)
    write_byte(WL_FLAG)
    message_end()
}

public fw_Item_Deploy_Post(Ent)
{
    if(!pev_valid(Ent))
        return
        
    static Id; Id = get_pdata_cbase(Ent, 41, 4)
    if(!Get_BitVar(g_Had_CompoundBow, Id))
        return
        
    set_pev(Id, pev_viewmodel2, V_MODEL)
    set_pev(Id, pev_weaponmodel2, g_BowArrow[Id] ? P_MODEL : P_MODEL_EMPTY)
    
    set_pdata_string(Id, (492) * 4, WEAPON_ANIMEXT, -1 , 20)
    
    Set_Weapon_TimeIdle(Id, CSW_BOW, TIME_DRAW)
    Set_Player_NextAttack(Id, TIME_DRAW)
    
    Set_Weapon_Anim(Id, g_BowArrow[Id] ? BOW_ANIM_DRAW : BOW_ANIM_DRAW_EMPTY)
}

public fw_Weapon_WeaponIdle_Post(Ent)
{
    if(!pev_valid(Ent))
        return
        
    static Id; Id = get_pdata_cbase(Ent, 41, 4)
    if(!Get_BitVar(g_Had_CompoundBow, Id))
        return
        
    if(get_pdata_float(Ent, 48, 4) <= 0.1) 
    {
        Set_Weapon_Anim(Id, g_BowArrow[Id] ? BOW_ANIM_IDLE : BOW_ANIM_IDLE_EMPTY)
        set_pdata_float(Ent, 48, 20.0, 4)
    }
    
    return
}

public Get_SpecialTeam(Ent, CsTeams:Team)
{
    if(Team == CS_TEAM_T) return TEAM_T
    else if(Team == CS_TEAM_CT) return TEAM_CT
    
    return 0
}

public CsTeams:Get_ArrowTeam(Ent)
{
    if(pev(Ent, pev_iuser2) == TEAM_T) return CS_TEAM_T
    else if(pev(Ent, pev_iuser2) == TEAM_CT) return CS_TEAM_CT
    
    return CS_TEAM_UNASSIGNED
}

stock MakeBulletDecal(Float:Origin[3])
{
    // Find target
    static decal; decal = random_num(41, 45)
    
    // Put decal on "world" (a wall)
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(TE_WORLDDECAL)
    engfunc(EngFunc_WriteCoord, Origin[0])
    engfunc(EngFunc_WriteCoord, Origin[1])
    engfunc(EngFunc_WriteCoord, Origin[2])
    write_byte(decal)
    message_end()
}

stock Set_Weapon_Anim(id, WeaponAnim)
{
    set_pev(id, pev_weaponanim, WeaponAnim)
    
    message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
    write_byte(WeaponAnim)
    write_byte(pev(id, pev_body))
    message_end()
}

stock Set_Weapon_TimeIdle(id, WeaponId ,Float:TimeIdle)
{
    static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
    if(!pev_valid(entwpn)) 
        return
        
    set_pdata_float(entwpn, 46, TimeIdle, 4)
    set_pdata_float(entwpn, 47, TimeIdle, 4)
    set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
}

stock Set_Player_NextAttack(id, Float:nexttime)
{
    set_pdata_float(id, 83, nexttime, 5)
}

stock Get_Position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
    static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    
    pev(id, pev_origin, vOrigin)
    pev(id, pev_view_ofs,vUp) //for player
    xs_vec_add(vOrigin,vUp,vOrigin)
    pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
    
    angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
    angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
    angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
    
    vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
    vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
    vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}

stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
    new_velocity[0] = origin2[0] - origin1[0]
    new_velocity[1] = origin2[1] - origin1[1]
    new_velocity[2] = origin2[2] - origin1[2]
    static Float:num; num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
    new_velocity[0] *= num
    new_velocity[1] *= num
    new_velocity[2] *= num
    
    return 1;
}

do_attack(Attacker, Victim, Inflictor, Float:fDamage)
{
    fake_player_trace_attack(Attacker, Victim, fDamage)
    fake_take_damage(Attacker, Victim, fDamage, Inflictor)
}

fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
{
    // get fDirection
    static Float:fAngles[3], Float:fDirection[3]
    pev(iAttacker, pev_angles, fAngles)
    angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
    
    // get fStart
    static Float:fStart[3], Float:fViewOfs[3]
    pev(iAttacker, pev_origin, fStart)
    pev(iAttacker, pev_view_ofs, fViewOfs)
    xs_vec_add(fViewOfs, fStart, fStart)
    
    // get aimOrigin
    static iAimOrigin[3], Float:fAimOrigin[3]
    get_user_origin(iAttacker, iAimOrigin, 3)
    IVecFVec(iAimOrigin, fAimOrigin)
    
    // TraceLine from fStart to AimOrigin
    static pentru; pentru = create_tr2() 
    engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, pentru)
    static pHit; pHit = get_tr2(pentru, TR_pHit)
    static iHitgroup; iHitgroup = get_tr2(pentru, TR_iHitgroup)
    static Float:fEndPos[3]
    get_tr2(pentru, TR_vecEndPos, fEndPos)

    // get target & body at aiming
    static iTarget, iBody
    get_user_aiming(iAttacker, iTarget, iBody)
    
    // if aiming find target is iVictim then update iHitgroup
    if (iTarget == iVictim)
    {
        iHitgroup = iBody
    }
    
    // if pentru find target not is iVictim
    else if (pHit != iVictim)
    {
        // get AimOrigin in iVictim
        static Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
        pev(iVictim, pev_origin, fVicOrigin)
        pev(iVictim, pev_view_ofs, fVicViewOfs) 
        xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
        fAimInVictim[2] = fStart[2]
        fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
        
        // check aim in size of iVictim
        static iAngleToVictim; iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
        iAngleToVictim = abs(iAngleToVictim)
        static Float:fDis; fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
        static Float:fVicSize[3]
        pev(iVictim, pev_size , fVicSize)
        if ( fDis <= fVicSize[0] * 0.5 )
        {
            // TraceLine from fStart to aimOrigin in iVictim
            static ptr2; ptr2 = create_tr2() 
            engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
            static pHit2; pHit2 = get_tr2(ptr2, TR_pHit)
            static iHitgroup2; iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
            
            // if ptr2 find target is iVictim
            if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
            {
                pHit = iVictim
                iHitgroup = iHitgroup2
                get_tr2(ptr2, TR_vecEndPos, fEndPos)
            }
            
            free_tr2(ptr2)
        }
        
        // if pHit still not is iVictim then set default HitGroup
        if (pHit != iVictim)
        {
            // set default iHitgroup
            iHitgroup = HIT_GENERIC
            
            static ptr3; ptr3 = create_tr2() 
            engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
            get_tr2(ptr3, TR_vecEndPos, fEndPos)
            
            // free ptr3
            free_tr2(ptr3)
        }
    }
    
    // set new Hit & Hitgroup & EndPos
    set_tr2(pentru, TR_pHit, iVictim)
    set_tr2(pentru, TR_iHitgroup, iHitgroup)
    set_tr2(pentru, TR_vecEndPos, fEndPos)

    // ExecuteHam
    fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, pentru)
    
    // free pentru
    free_tr2(pentru)
}

stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
    ExecuteHamB(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
}

stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
    ExecuteHamB(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
}

stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
{
    static Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
    pev(id, pev_origin, fOrigin)
    get_user_origin(id, iAimOrigin, 3) // end position from eyes
    IVecFVec(iAimOrigin, fAimOrigin)
    xs_vec_sub(fAimOrigin, fOrigin, fV1)
    
    static Float:fV2[3]
    xs_vec_sub(fTarget, fOrigin, fV2)
    
    static iResult; iResult = get_angle_between_vectors(fV1, fV2)
    
    if (TargetSize > 0.0)
    {
        static Float:fTan; fTan = TargetSize / get_distance_f(fOrigin, fTarget)
        static fAngleToTargetSize; fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
        iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
    }
    
    return iResult
}

stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
{
    static Float:fA1[3], Float:fA2[3]
    engfunc(EngFunc_VecToAngles, fV1, fA1)
    engfunc(EngFunc_VecToAngles, fV2, fA2)
    
    static iResult; iResult = floatround(fA1[1] - fA2[1])
    iResult = iResult % 360
    iResult = (iResult > 180) ? (iResult - 360) : iResult
    
    return iResult
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/



bio_weapon_m32.amxx
| Afiseaza codul
#include < amxmodx>
#include < amxmisc>
#include < fakemeta>
//#include < fakemeta_util >
#include < biohazard >
#include < engine >
#include < fun >
#include < hamsandwich >
#include < xs >
#include < cstrike >

new const 
	PLUGIN_NAME[  ] = "[Bio] Weapon: Milkor m32", 
	PLUGIN_VERSION[  ] = "2.0", 
	PLUGIN_AUTHOR[  ] = "Author";

#define ENG_NULLENT             -1
#define EV_INT_WEAPONKEY        EV_INT_impulse
#define m32_WEAPONKEY     91421

new const GRENADE_MODEL[] = "models/Biohazard30/bonus_box/MilkorM32/grenade.mdl"
new in_zoom[33]
new g_reload[33]
// Sprites
new const GRENADE_TRAIL[] = "sprites/laserbeam.spr"
new const GRENADE_EXPLOSION[] = "sprites/zerogxplode.spr"
new sTrail, sExplo

new const m32_Fire_Sounds[][] = { "weapons/m32-1.wav" }

new m32_V_MODEL[64] = "models/Biohazard30/bonus_box/MilkorM32/v_m32.mdl"
new m32_P_MODEL[64] = "models/Biohazard30/bonus_box/MilkorM32/p_m32.mdl"
new m32_W_MODEL[64] = "models/Biohazard30/bonus_box/MilkorM32/w_m32.mdl"

new cvar_clip_m32, cvar_m32_ammo,cvar_dmg;
new g_has_m32[33]
new g_MaxPlayers, g_orig_event_m32

public plugin_init(  ) {

	register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );

	register_message(get_user_msgid("DeathMsg"), "M32_message_DeathMsg")

	register_event("CurWeapon","m32_CurrentWeapon","be","1=1")
	register_event("HLTV", "YeniTur", "a", "1=0", "2=0")

	register_forward(FM_CmdStart, "fw_CmdStart")
	register_forward(FM_SetModel, "modelka")
	register_forward(FM_UpdateClientData, "m32_ClientDataPost", 1)
	register_forward(FM_PlaybackEvent, "PlaybackEvent")

	RegisterHam( Ham_Weapon_PrimaryAttack, "weapon_m3", "fw_attack" )
	RegisterHam( Ham_Weapon_PrimaryAttack, "weapon_m3", "fw_attackp", 1 )
	RegisterHam(Ham_Item_Deploy,"weapon_m3", "fw_Item_Deploy_Post", 1)
	RegisterHam(Ham_Weapon_Reload, "weapon_m3", "fw_r")
	RegisterHam(Ham_Weapon_Reload, "weapon_m3", "fw_reload" )
	RegisterHam(Ham_Item_AddToPlayer, "weapon_m3", "m32AddToPlayer")
	
	cvar_clip_m32 = register_cvar("bio_m32_clip", "6")
	cvar_m32_ammo = register_cvar("bio_m32_ammo", "60")
	cvar_dmg = register_cvar("bio_m32_dmg","60.0")

	g_MaxPlayers = get_maxplayers()
}

public plugin_precache(  ) {

	precache_model(m32_V_MODEL)
	precache_model(m32_P_MODEL)
	precache_model(m32_W_MODEL)
	precache_model(GRENADE_MODEL)

	sTrail = precache_model(GRENADE_TRAIL)
	sExplo = precache_model(GRENADE_EXPLOSION)

	precache_sound("weapons/m32_after_reload.wav")
	precache_sound("weapons/m32_insert.wav")
	precache_sound("weapons/m32_start_reload.wav")
	precache_sound( m32_Fire_Sounds[0] )

	precache_generic( "sprites/bio_weapon_m32.txt" )
	precache_generic( "sprites/Biohazard30/bonus_box/MilkorM32/640hud75.spr" )
	precache_generic( "sprites/Biohazard30/bonus_box/MilkorM32/640hud7x.spr" )
	precache_generic( "sprites/Biohazard30/bonus_box/MilkorM32/scope_grenade.spr" )

	register_clcmd("bio_weapon_m32", "Hook_SelectM32")
	register_forward(FM_PrecacheEvent, "fwPrecacheEvent_Post", 1)
}

public plugin_natives(  ) {

	register_native( "get_user_m32", "get_user_m32", 1 );
	register_native( "set_user_m32", "set_user_m32", 1 );
}

public get_user_m32( id ) {
	return g_has_m32[ id ];
}

public set_user_m32( id, m32 ) {

	if( m32 ) {

		if( !g_has_m32[ id ] ) {

			g_has_m32[ id ] = true;
			WeaponList( id, m32_WEAPONKEY );
			set_zoom( id, 0 );
			g_reload[ id ] = 0;

			new iWep2 = give_item( id, "weapon_m3" );
			if( iWep2 > 0 ) {

				cs_set_weapon_ammo( iWep2, get_pcvar_num( cvar_clip_m32 ) );
				cs_set_user_bpammo( id, CSW_M3, get_pcvar_num( cvar_m32_ammo ) )
			}

			if( in_zoom[ id ] ) { 

				cs_set_user_zoom( id, CS_RESET_ZOOM, 1 );
				in_zoom[ id ] = 0;
			}
		}
	} else {
		if( g_has_m32[ id ] ) {

			g_has_m32[ id ] = false;
		}
	}
}

public YeniTur(){
	for(new id = 0; id < get_maxplayers(); id++){
		if(is_user_alive(id) && is_user_connected(id)){
			g_has_m32[id] = false
		}
	}
}

public Hook_SelectM32(id){
	engclient_cmd(id, "weapon_m3")
	return PLUGIN_HANDLED
}
public fwPrecacheEvent_Post(type, const name[]){
	if (equal("events/m3.sc", name)){
		g_orig_event_m32 = get_orig_retval()
		return FMRES_HANDLED
	}
	
	return FMRES_IGNORED
}

public modelka(entity, model[]){
	if(!is_valid_ent(entity))
		return FMRES_IGNORED;
	
	static szClassName[33]
	entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName))
	
	if(!equal(szClassName, "weaponbox"))
		return FMRES_IGNORED;
	
	static iOwner
	iOwner = entity_get_edict(entity, EV_ENT_owner)
	
	if(equal(model, "models/w_m3.mdl")){
		static iStoredAugID
		iStoredAugID = find_ent_by_owner(-1, "weapon_m3", entity)
		
		if(!is_valid_ent(iStoredAugID))
			return FMRES_IGNORED;
		
		if(g_has_m32[iOwner]){
			entity_set_int(iStoredAugID, EV_INT_impulse, 91421)
			g_has_m32[iOwner] = false
			g_reload[iOwner]=0
			if(in_zoom[iOwner]){
				set_zoom(iOwner,0)
				return PLUGIN_CONTINUE
			}
			entity_set_model(entity, m32_W_MODEL)
			
			return FMRES_SUPERCEDE;
		}
	}
	
	return FMRES_IGNORED;
}

public m32AddToPlayer(m32, id){
	if(!is_valid_ent(m32) || !is_user_connected(id)) return HAM_IGNORED
        
	if(entity_get_int(m32, EV_INT_WEAPONKEY) == m32_WEAPONKEY){
		g_has_m32[id] = true
		g_reload[id]=0
		set_zoom(id,0)
		entity_set_int(m32, EV_INT_WEAPONKEY, 0)
		WeaponList( id, m32_WEAPONKEY );
		return HAM_HANDLED
	}
	if(entity_get_int(m32, EV_INT_WEAPONKEY) != m32_WEAPONKEY) WeaponList( id, m32_WEAPONKEY );
	
	return HAM_IGNORED
}
public fw_Item_Deploy_Post(weapon_ent){
	new owner
	owner = pev(weapon_ent,pev_owner)
	if(is_user_alive(owner) && get_user_weapon(owner) == CSW_M3){
		set_zoom(owner,0)
	}
	static weaponid
	weaponid = cs_get_weapon_id(weapon_ent)
	if(is_user_alive(owner))
	replace_weapon_models(owner, weaponid)
}
public m32_CurrentWeapon(id){
	if( read_data(2) != CSW_M3 ) {
		if( g_reload[id] ) {
			g_reload[id] = false
			remove_task( id + 1331 )
		}
	}
	replace_weapon_models(id, read_data(2))
	remove_task(id)
} 
 
replace_weapon_models(id, weaponid)
{
	switch (weaponid)
	{
		case CSW_M3:
		{
			if(g_has_m32[id] && is_user_alive(id))
			{
				set_pev(id, pev_viewmodel2, m32_V_MODEL)
				set_pev(id, pev_weaponmodel2, m32_P_MODEL)
			}
		}
	}
}
 
public m32_ClientDataPost(Player, SendWeapons, CD_Handle)
{
	if(!is_user_alive(Player) || (get_user_weapon(Player) != CSW_M3) || !g_has_m32[Player])
		return FMRES_IGNORED
        
	set_cd(CD_Handle, CD_flNextAttack, halflife_time () + 0.00001)
	return FMRES_HANDLED
}

public fw_CmdStart(id, uc_handle, seed) 
{
	new ammo, clip, weapon = get_user_weapon(id, clip, ammo)
	if (!g_has_m32[id] || weapon != CSW_M3 || !is_user_alive(id))
		return

	if(( get_uc( uc_handle, UC_Buttons ) & IN_ATTACK2 ) && !( pev( id, pev_oldbuttons ) & IN_ATTACK2 )) {
		if(!in_zoom[id] && !g_reload[id]) set_zoom(id,1)
		else set_zoom(id,0)
	}
}

public fw_attack( wpn ) {
	if( g_has_m32[ pev( wpn, pev_owner ) ] )
		return HAM_SUPERCEDE

	return HAM_IGNORED
}

public fw_attackp( wpn ) {
	new id = pev( wpn, pev_owner ), clip, bpammo
	get_user_weapon( id, clip, bpammo )
	if( g_has_m32[ id ] ) {
		if( clip > 0 ) {
			if( g_reload[id] ) {
				UTIL_PlayWeaponAnimation( id, 4 )
				set_pdata_float( id, 83, 1.0 )
				remove_task( id + 1331 )
				g_reload[id] = false
				return
			}

			UTIL_PlayWeaponAnimation(id,random_num(1,2))
			emit_sound( id, CHAN_WEAPON, m32_Fire_Sounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM )
			FireGrenade( id )
			MakeRecoil( id )

			set_pdata_float( id, 83, 0.6 )
		}
	}
}

public MakeRecoil(id)
{
	if(!is_user_alive(id))
		return;

	if(is_user_zombie(id))
		return;

	if(!g_has_m32[id])
		return;

	static Float:punchAngle[3];
	punchAngle[0] = float(random_num(-1 * 400, 400)) / 100.0;
	punchAngle[1] = float(random_num(-1 * 700, 700)) / 100.0;
	punchAngle[2] = 0.0;
	set_pev(id, pev_punchangle, punchAngle);
}

public FireGrenade(id)
{
	new ammo, clip
	get_user_weapon(id, clip, ammo)
	static wep

	wep = find_ent_by_owner(-1, "weapon_m3", id)
	cs_set_weapon_ammo(wep,clip-1)

	new Float:origin[3],Float:velocity[3],Float:angles[3]
	engfunc(EngFunc_GetAttachment, id, 0, origin,angles)

	pev(id,pev_angles,angles)
	new ent = create_entity( "info_target" ) 

	set_pev( ent, pev_classname, "m32_grenade" )
	set_pev( ent, pev_solid, SOLID_BBOX )
	set_pev( ent, pev_movetype, MOVETYPE_TOSS )
	set_pev( ent, pev_mins, { -0.1, -0.1, -0.1 } )
	set_pev( ent, pev_maxs, { 0.1, 0.1, 0.1 } )

	entity_set_model( ent, GRENADE_MODEL )

	set_pev( ent, pev_origin, origin )
	set_pev( ent, pev_angles, angles )
	set_pev( ent, pev_owner, id )

	velocity_by_aim( id, in_zoom[id]? 1400 : 1000 , velocity )
	set_pev( ent, pev_velocity, velocity )

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_BEAMFOLLOW) // Temporary entity ID
	write_short(ent) // Entity
	write_short(sTrail) // Sprite index
	write_byte(10) // Life
	write_byte(3) // Line width
	write_byte(255) // Red
	write_byte(255) // Green
	write_byte(255) // Blue
	write_byte(50) // Alpha
	message_end() 

	return PLUGIN_CONTINUE
}	

// We hit something!!!
public pfn_touch(pentru, ptd)
{
	// If ent is valid
	if (pev_valid(pentru))
	{	
		// Get classnames
		static classname[32]
		pev(pentru, pev_classname, classname, 31)
		
		// Our ent
		if(equal(classname, "m32_grenade"))
		{
			// Get it's origin
			new Float:originF[3]
			pev(pentru, pev_origin, originF)

			engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, originF, 0)
			write_byte(TE_WORLDDECAL)
			engfunc(EngFunc_WriteCoord, originF[0])
			engfunc(EngFunc_WriteCoord, originF[1])
			engfunc(EngFunc_WriteCoord, originF[2])
			write_byte(engfunc(EngFunc_DecalIndex,"{scorch3"))
			message_end()

			// Draw explosion
			message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
			write_byte(TE_EXPLOSION) // Temporary entity ID
			engfunc(EngFunc_WriteCoord, originF[0]) // engfunc because float
			engfunc(EngFunc_WriteCoord, originF[1])
			engfunc(EngFunc_WriteCoord, originF[2]+30.0)
			write_short(sExplo) // Sprite index
			write_byte(25) // Scale
			write_byte(35) // Framerate
			write_byte(0) // Flags
			message_end()
			
			// Get owner
			new owner = pev(pentru, pev_owner)
			// Alive...
			new a = FM_NULLENT
			// Get distance between victim and epicenter
			while((a = find_ent_in_sphere(a,originF,300.0)) != 0) {
				if( a!=owner&& a!=pentru&&pev(a,pev_takedamage)!=DAMAGE_NO) ExecuteHamB( Ham_TakeDamage, a ,owner ,owner,  get_pcvar_float(cvar_dmg), DMG_BULLET )
				set_pev(pentru, pev_flags, FL_KILLME)
			}
		}
	}
		
}	
 
public PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if ((eventid != g_orig_event_m32))
		return FMRES_IGNORED
	if (!(1 <= invoker <= g_MaxPlayers))
		return FMRES_IGNORED

	playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
	return FMRES_SUPERCEDE
}

public M32_message_DeathMsg(msg_id, msg_dest, id)
{
	static szTruncatedWeapon[33], iAttacker, iVictim
        
	get_msg_arg_string(4, szTruncatedWeapon, charsmax(szTruncatedWeapon))
        
	iAttacker = get_msg_arg_int(1)
	iVictim = get_msg_arg_int(2)
        
	if(!is_user_connected(iAttacker) || iAttacker == iVictim) return PLUGIN_CONTINUE
        
	if(get_user_weapon(iAttacker) == CSW_M3)
	{
		if(g_has_m32[iAttacker])
			set_msg_arg_string(4, "grenade")
	}
                
	return PLUGIN_CONTINUE
}
 
public fw_r( wpn ) {
	if( g_has_m32[ pev( wpn, pev_owner ) ] ) {
		fw_reload( wpn )
		return HAM_SUPERCEDE
	}
	return HAM_IGNORED
}

public fw_reload(weapon) {
	new id = pev( weapon, pev_owner )
	new clip, bpammo
	get_user_weapon(id, clip, bpammo )
	if( g_has_m32[ id ] && clip < 6 && bpammo > 0 ) {
		if(!task_exists( id+1331 )) set_task( 0.1, "reload", id+1331 )
	}
	if(in_zoom[id])
	{
		cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
		in_zoom[id] = 0
	}
	return HAM_IGNORED
}

public reload( id ) {
	id -= 1331
	new clip, bpammo, weapon = find_ent_by_owner( -1, "weapon_m3", id )
	get_user_weapon(id, clip, bpammo )
	if(!g_reload[id]) {
			set_zoom(id,0)
			UTIL_PlayWeaponAnimation( id, 5 )
			g_reload[ id ] = 1
			set_pdata_float( id, 83, 1.0, 5 )
			set_task( 1.0, "reload", id+1331 )
			return
	}

	if(in_zoom[id])
	{
		cs_set_user_zoom(id, CS_RESET_ZOOM, 1)
		in_zoom[id] = 0
	}
	
	if( clip > 5 || bpammo < 1 ) {
		UTIL_PlayWeaponAnimation( id, 4 )
		g_reload[ id ] = 0
		set_pdata_float( id, 83, 1.5, 5 )
		return
	}

	cs_set_user_bpammo( id, CSW_M3, bpammo - 1 )
	cs_set_weapon_ammo( weapon, clip + 1 )
	set_pdata_float( id, 83, 1.0, 5 )
	UTIL_PlayWeaponAnimation( id, 3 )
	set_task( 1.0, "reload", id+1331 )
}

stock set_zoom(index,type){
	if(type==0){
		if(in_zoom[index]==1){
			cs_set_user_zoom(index, CS_SET_AUGSG552_ZOOM, 1)

			in_zoom[index]=0
			emit_sound( index, CHAN_ITEM, "weapons/zoom.wav", 0.20, 2.40, 0, 100 )
		}
	}
	if(type==1){
		if(in_zoom[index]==0){
			cs_set_user_zoom(index, CS_RESET_ZOOM, 1)

			in_zoom[index]=1
			emit_sound( index, CHAN_ITEM, "weapons/zoom.wav", 0.20, 2.40, 0, 100 )
		}
	}
}

public WeaponList( id, Type ) {

	new szMsgWeaponList = get_user_msgid( "WeaponList" );
	
	switch( Type ) {

		case m32_WEAPONKEY: {

			message_begin( MSG_ONE, szMsgWeaponList, _, id );
			write_string( g_has_m32[ id ] == 1 ? "bio_weapon_m32" : "weapon_m3" );		// WeaponName
			write_byte( 5 );							// PrimaryAmmoID
			write_byte( 32 );							// PrimaryAmmoMaxAmount
			write_byte( -1 );							// SecondaryAmmoID
			write_byte( -1 );							// SecondaryAmmoMaxAmount
			write_byte( 0 );							// SlotID (0...N)
			write_byte( 5 );							// NumberInSlot (1...N)
			write_byte( 21 );							// WeaponID
			write_byte( 0 );							// Flags
			message_end(  );
		}
	}
}

stock UTIL_PlayWeaponAnimation( const Player, const Sequence ) {

	set_pev( Player, pev_weaponanim, Sequence );

	message_begin( MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player );
	write_byte( Sequence );
	write_byte( 2 );
	message_end(  );
}
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

30 Jul 2014, 21:26

nu-s astea.
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

30 Jul 2014, 21:51

Am luat toate alea la rand si chiar nu il gasesc... :-s
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

30 Jul 2014, 21:53

pai trebuiesc shopurile alea man,shop.amxx s'au ceva de genu' trebuie sa ai.
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

30 Jul 2014, 23:31

Acestea sunt totate pluginurile mele si toate sursele

Image
Image
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

31 Jul 2014, 19:12

Am luat pe rand toate pluginurile si cred ca de vina este biohazard.amxx
Uitati sursa
| Afiseaza codul
/* Biohazard - Zombie Mod, Classic Infection with new modes
 * Author: cheap_suit, CO-Author: The YONTU
 * Credits: sDs|Aragon* */

#define PLUGIN_NAME	"Biohazard - Zombie Mod"
#define PLUGIN_VERSION	"3.1"
#define PLUGIN_AUTHOR	"cheap_suit"

#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >
#include < xs >

native get_user_golds( id );
native is_user_vip( id );

static const ServerLicensedIp[  ] = "192.168.0.10";

// Aici eliminati/adaugati slash-urile(//) din fata linii daca vreti sa fie activate/dezactivate
#define ULTRA_BLOOD	// Sare mai mult sange cand infectezi
#define GRENADE_STATUS	// Cand tii o grenada in mana in stanga sus va aparea o imagine specifica grenadei

#define FOG_ENABLE  	     1
#define FOG_DENSITY	    "0.0025"
#define FOG_COLOR   	    "128 128 128"	//"127 170 255"

#define DEFAULT_PMODEL	    "models/player/bio30_zombie/bio30_zombie.mdl"	// Zombie Model
#define DEFAULT_WMODEL	    "models/player/bio30_zombie/claws_zombie.mdl"	// Zombie Hands

#define DEFAULT_HEALTH		400.0	// Health value
#define DEFAULT_SPEED		290.0	// Speed value
#define DEFAULT_GRAVITY		0.8	// Gravity multiplier
#define DEFAULT_ATTACK		2.0	// Zombie damage multiplier
#define DEFAULT_REGENDLY	0.18	// Regeneration delay value
#define DEFAULT_KNOCKBACK	1.0	// Knockback multiplier
#define DEFAULT_NOFLASH	1.0	// Set 1.0 for Zombie No flash
#define DEFAULT_ONLYVIP		0.0	// Set 1.0 for Zombie Class Only VIP

#define clamp_byte(%1)		( clamp( %1, 0, 255 ) )
#define pack_color(%1,%2,%3)	( %3 + ( %2 << 8 ) + ( %1 << 16 ) )

#define FFADE_IN			0x0000	// Just here so we don't pass 0 into the function
#define FFADE_OUT		0x0001	// Fade out (not in)
#define FFADE_MODULATE		0x0002	// Modulate (don't blend)
#define FFADE_STAYOUT		0x0004	// ignores the duration, stays faded out until new ScreenFade message received
#define UNIT_SECOND		(1<<12)

#define OFFSET_DEATH 		444
#define OFFSET_TEAM 		114
#define OFFSET_ARMOR 		112
#define OFFSET_NVG 		129
#define OFFSET_CSMONEY 		115
#define OFFSET_PRIMARYWEAPON 	116
#define OFFSET_WEAPONTYPE 	43
#define OFFSET_CLIPAMMO		51
#define EXTRAOFFSET_WEAPONS 	4

#define OFFSET_AMMO_338MAGNUM 	377
#define OFFSET_AMMO_762NATO 		378
#define OFFSET_AMMO_556NATOBOX 	379
#define OFFSET_AMMO_556NATO 		380
#define OFFSET_AMMO_BUCKSHOT 		381
#define OFFSET_AMMO_45ACP 		382
#define OFFSET_AMMO_57MM 		383
#define OFFSET_AMMO_50AE 		384
#define OFFSET_AMMO_357SIG 		385
#define OFFSET_AMMO_9MM 		386

#define OFFSET_LASTPRIM 	368
#define OFFSET_LASTSEC 		369
#define OFFSET_LASTKNI 		370

#define TASKID_COUNTDOWN		452
#define TASKID_STRIPNGIVE		698
#define TASKID_NEWROUND		641
#define TASKID_INITROUND 		222
#define TASKID_STARTROUND 		153
#define TASKID_BALANCETEAM 		375
#define TASKID_UPDATESCR 		264
#define TASKID_SPAWNDELAY 		786
#define TASKID_WEAPONSMENU 		564
#define TASKID_CHECKSPAWN 		423
#define TASKID_CZBOTPDATA 		312
#define TASK_GLOW_DIE			1212

#define EQUIP_PRI 	(1<<0)
#define EQUIP_SEC 	(1<<1)
#define EQUIP_GREN 	(1<<2)
#define EQUIP_ALL 	(1<<0 | 1<<1 | 1<<2)

#define HAS_NVG 	(1<<0)
#define ATTRIB_BOMB 	(1<<1)
#define DMG_HEGRENADE 	(1<<24)

#define MODEL_CLASSNAME 	"player_model"
#define IMPULSE_FLASHLIGHT 	100

#define MAX_SPAWNS 	128
#define MAX_CLASSES 	14
#define MAX_DATA 	13

#define DATA_HEALTH 	0
#define DATA_SPEED 	1
#define DATA_GRAVITY 	2
#define DATA_ATTACK 	3
#define DATA_REGENDLY 	4
#define DATA_KNOCKBACK 	5
#define DATA_NOFLASH 	6
#define DATA_ONLYVIP 	7

#define fm_get_user_team(%1) get_pdata_int(%1, OFFSET_TEAM)
#define fm_get_user_deaths(%1) get_pdata_int(%1, OFFSET_DEATH)
#define fm_set_user_deaths(%1,%2) set_pdata_int(%1, OFFSET_DEATH, %2)
#define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CSMONEY)
#define fm_get_user_armortype(%1) get_pdata_int(%1, OFFSET_ARMOR)
#define fm_set_user_armortype(%1,%2) set_pdata_int(%1, OFFSET_ARMOR, %2)
#define fm_get_weapon_id(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define fm_get_weapon_ammo(%1) get_pdata_int(%1, OFFSET_CLIPAMMO, EXTRAOFFSET_WEAPONS)
#define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
#define fm_reset_user_primary(%1) set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
#define fm_lastprimary(%1) get_pdata_cbase(id, OFFSET_LASTPRIM)
#define fm_lastsecondry(%1) get_pdata_cbase(id, OFFSET_LASTSEC)
#define fm_lastknife(%1) get_pdata_cbase(id, OFFSET_LASTKNI)
#define fm_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), "model", %2, %3) 

#define _random(%1) random_num(0, %1 - 1)
#define AMMOWP_NULL (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

enum
{
	MAX_CLIP = 0,
	MAX_AMMO
}

enum
{
	MENU_PRIMARY = 1,
	MENU_SECONDARY
}

enum
{
	CS_TEAM_UNASSIGNED = 0,
	CS_TEAM_T,
	CS_TEAM_CT,
	CS_TEAM_SPECTATOR
}

enum
{
	CS_ARMOR_NONE = 0,
	CS_ARMOR_KEVLAR,
	CS_ARMOR_VESTHELM
}

enum
{
	KBPOWER_357SIG = 0,
	KBPOWER_762NATO,
	KBPOWER_BUCKSHOT,
	KBPOWER_45ACP,
	KBPOWER_556NATO,
	KBPOWER_9MM,
	KBPOWER_57MM,
	KBPOWER_338MAGNUM,
	KBPOWER_556NATOBOX,
	KBPOWER_50AE
}

new g_zombie_weapname[] = "melee"
new g_infection_name[]  = "infection"

// primary weapons (menu|game)
new g_primaryweapons[][][] = 
{ 
	{ "M4A1 Carbine",     "weapon_m4a1"    },
	{ "AK-47 Kalashnikov",     "weapon_ak47"    },
	{ "Steyr AUG A1",      "weapon_aug"     },
	{ "SG-552 Commando",    "weapon_sg552"   },
	//{ "Galil",    "weapon_galil"   },
	{ "Famas",    "weapon_famas"   },
	{ "MP5 Navy", "weapon_mp5navy" },
	{ "XM1014 M4",   "weapon_xm1014"  },
	{ "M3 Super 90",       "weapon_m3"      },
	//{ "P90",      "weapon_p90"     },
	{ "M249 Para Machinegun",     "weapon_m249"    },
	{ "SG-550 Auto-Sniper",    "weapon_sg550"   },
	{ "G3SG1 Auto-Sniper",    "weapon_g3sg1"   },
	{ "AWP Magnum Sniper",    "weapon_awp"   }	
}

// secondary weapons (menu|game)
new g_secondaryweapons[][][] = 
{ 
	{ "Desert Eagle .50 AE",   "weapon_deagle"  },
	{ "USP .45 ACP Tactical",      "weapon_usp"     },
	{ "Dual Elite Berettas",    "weapon_elite"   },
	{ "Glock 18C",    "weapon_glock18"   }
}

// grenade loadout (game)
new g_grenades[][] = 
{ 
	"weapon_hegrenade",
	"weapon_flashbang",
	"weapon_smokegrenade"
}

new Float:g_knockbackpower[] =
{
	3.0,  // KBPOWER_357SIG
	4.0,  // KBPOWER_762NATO
	9.5,  // KBPOWER_BUCKSHOT
	3.0,  // KBPOWER_45ACP
	4.5,  // KBPOWER_556NATO
	3.0,  // KBPOWER_9MM
	3.5,  // KBPOWER_57MM
	12.0, // KBPOWER_338MAGNUM
	4.0,  // KBPOWER_556NATOBOX
	3.8   // KBPOWER_50AE
}

new g_appear_sounds[  ][  ] = {

	"Biohazard30/zombie_coming_1.wav",
	"Biohazard30/zombie_coming_2.wav",
	"Biohazard30/zombie_coming_3.wav",
	"Biohazard30/zombie_comeback.wav"
}

new g_survivor_win_sounds[][] =
{
	"Biohazard30/survivor_win1.wav",
	"Biohazard30/survivor_win2.wav",
	"Biohazard30/survivor_win3.wav"
}

new g_zombie_win_sounds[][] = 
{ 
	"Biohazard30/zombie_win1.wav",
	"Biohazard30/zombie_win2.wav",
	"Biohazard30/zombie_win3.wav"	
}

new g_scream_sounds[][] = 
{ 
	"Biohazard30/zombie_infec1.wav",
	"Biohazard30/zombie_infec2.wav",
	"Biohazard30/zombie_infec3.wav"
}

new g_zombie_miss_sounds[][] = 
{ 
	"zombie/claw_miss1.wav",
	"zombie/claw_miss2.wav"				
}

new g_zombie_hit_sounds[][] = 
{ 
	"zombie/claw_strike1.wav",
	"zombie/claw_strike2.wav",
	"zombie/claw_strike3.wav"
}

new g_zombie_die_sounds[][] = 
{
	"Biohazard30/zombie_die1.wav",
	"Biohazard30/zombie_die2.wav",
	"Biohazard30/zombie_die3.wav",
	"Biohazard30/zombie_die4.wav",
	"Biohazard30/zombie_die5.wav"
}

new CountDownSounds[][] = {

	"Biohazard30/Countdown/timer01.wav",
	"Biohazard30/Countdown/timer02.wav",
	"Biohazard30/Countdown/timer03.wav",
	"Biohazard30/Countdown/timer04.wav",
	"Biohazard30/Countdown/timer05.wav",
	"Biohazard30/Countdown/timer06.wav",
	"Biohazard30/Countdown/timer07.wav",
	"Biohazard30/Countdown/timer08.wav",
	"Biohazard30/Countdown/timer09.wav",
	"Biohazard30/Countdown/timer10.wav"
}

new const g_weapon_ammo[  ][  ] = {

	{ -1, -1 },	// NULL
	{ 13, 52 },	// CSW_P228
	{ -1, -1 },	// NULL
	{ 15, 75 },	// CSW_SCOUT
	{ -1, -1 },	// CSW_HEGRENADE
	{ 15, 30 },	// CSW_XM1014
	{ -1, -1 },	// CSW_C4
	{ 35, 140 },	// CSW_MAC10
	{ 40, 120 },	// CSW_AUG
	{ -1, -1 },	// CSW_SMOKEGRENADE
	{ 30, 150 },	// CSW_ELITE
	{ 20, 100 },	// CSW_FIVESEVEN
	{ 25, 100 },	// CSW_UMP45
	{ 40, 80 },	// CSW_SG550
	{ 40, 160 },	// CSW_GALIL
	{ 30, 120 },	// CSW_FAMAS
	{ 20, 160 },	// CSW_USP
	{ 20, 120 },	// CSW_GLOCK18
	{ 3, 30 },	// CSW_AWP
	{ 40, 120 },	// CSW_MP5NAVY
	{ 100, 200 },	// CSW_M249
	{ 13, 39 },	// CSW_M3
	{ 45, 90 },	// CSW_M4A1
	{ 30, 120 },	// CSW_TMP
	{ 20, 60 },	// CSW_G3SG1
	{ -1, -1 },	// CSW_FLASHBANG
	{ 15, 45 },	// CSW_DEAGLE
	{ 25, 125 },	// CSW_SG552
	{ 40, 120 },	// CSW_AK47
	{ -1, -1 },	// CSW_KNIFE
	{ 50, 130 }	// CSW_P90
}

new const g_weapon_knockback[] =
{
	-1, 
	KBPOWER_357SIG, 
	-1, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_BUCKSHOT, 
	-1, 
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	-1, 
	KBPOWER_9MM, 
	KBPOWER_57MM,
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_45ACP,
	KBPOWER_9MM, 
	KBPOWER_338MAGNUM,
	KBPOWER_9MM, 
	KBPOWER_556NATOBOX,
	KBPOWER_BUCKSHOT, 
	KBPOWER_556NATO, 
	KBPOWER_9MM, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_50AE, 
	KBPOWER_556NATO, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_57MM
}

new const CS_TEAM_NAMES[  ][  ] = {

	  "UNASSIGNED"
	, "TERRORIST"
	, "CT"
	, "SPECTATOR"
}

new const g_remove_entities[][] = 
{ 
	"func_bomb_target",    
	"info_bomb_target", 
	"hostage_entity",      
	"monster_scientist", 
	"func_hostage_rescue", 
	"info_hostage_rescue",
	"info_vip_start",      
	"func_vip_safetyzone", 
	"func_escapezone",     
	"func_buyzone"
}

new const g_dataname[][] = 
{ 
	"HEALTH", 
	"SPEED", 
	"GRAVITY", 
	"ATTACK", 
	"REGENDLY", 
	"KNOCKBACK",
	"NOFLASH",
	"ONLYVIP"
}

new const g_teaminfo[][] = 
{ 
	"UNASSIGNED", 
	"TERRORIST",
	"CT",
	"SPECTATOR" 
}

new SkyTermination[  ][  ] = {

	"bk",
	"dn",
	"ft",
	"lf",
	"rt",
	"up"
}

// Global Vars
new CountDownDelay;
new g_maxplayers;
new g_spawncount;
new g_buyzone;
new g_botclient_pdata;
new g_menuposition[33];
new g_player_weapons[33][2];

// Sync HUD
new g_sync_hpdisplay;
new g_sync_msgdisplay;

// Forwards
new g_fwd_spawn;
new g_fwd_result;
new g_fwd_infect;
new g_fwd_gamestart; 

// Messages
new g_msg_flashlight;
new g_msg_teaminfo;
new g_msg_scoreattrib;
new g_msg_money;
new g_msg_scoreinfo;
new g_msg_deathmsg;
new g_msg_screenfade;

new Float:g_buytime;
new Float:g_spawns[MAX_SPAWNS+1][9];
new Float:g_vecvel[3];
new Float:g_teams_targettime;
new g_switchingteam;

// Global Booleans without parametres
new bool:g_brestorevel;
new bool:g_infecting;
new bool:g_gamestarted;
new bool:g_roundstarted;
new bool:g_roundended;
new bool:g_czero;

// Global Booleans with parametres
new bool:g_disconnected[33];	// Is user Disconnected
new bool:g_blockmodel[33];	// Block Model ?
new bool:g_showmenu[33];	// Show menu ?
new bool:g_menufailsafe[33];	// Show menu fail ?
new bool:g_welcomemsg[33];	// Display welcom msg ?
new bool:g_suicide[33];	// Is user suicided ?

// Zombie Classes & Zombie Configuration
new bool:g_zombie[33];	// Is user Zombie ?
new bool:g_falling[33];	// Is user Touch floor ?
new bool:g_preinfect[33];	// Is user preinfect ?
new g_classcount;
new g_class_name[MAX_CLASSES+1][32];
new g_class_desc[MAX_CLASSES+1][32];
new g_class_pmodel[MAX_CLASSES+1][64];
new g_class_wmodel[MAX_CLASSES+1][64];
new Float:g_class_data[MAX_CLASSES+1][MAX_DATA];
new g_player_class[33];
new Float:g_regendelay[33];
//new Float:g_hitdelay[33];
new g_mutate[33];
new g_victim[33];
new g_modelent[33];

// Cvars
new cvar_randomspawn;
new cvar_skyname;
new cvar_autoteambalance[4];
new cvar_starttime;
new cvar_countdown;
new cvar_autonvg;
new cvar_winsounds;
new cvar_weaponsmenu;
new cvar_lights;
new cvar_killbonus;
new cvar_enabled;
new cvar_gamedescription;
new cvar_botquota;
new cvar_maxzombies;
new cvar_flashbang;
new cvar_buytime;
new cvar_respawnaszombie;
new cvar_punishsuicide;
new cvar_infectmoney;
new cvar_showtruehealth;
new cvar_obeyarmor;
new cvar_impactexplode;
new cvar_caphealthdisplay;
new cvar_zombie_hpmulti;
new cvar_randomclass;
new cvar_zombiemulti;
new cvar_ammo;
new cvar_killreward;
new cvar_painshockfree;
new cvar_zombie_class;
// Knock back system
new cvar_shootobjects;
new cvar_pushpwr_weapon;
new cvar_pushpwr_zombie;
new cvar_knockback_duck;
new cvar_knockback;
new cvar_knockback_dist;
new cvar_biohazard_icon;
new cvar_entrie_class_vip;
new cvar_zombie_appear_sound;

#if defined GRENADE_STATUS
// Cvars
new cvar_status;
new cvar_fire_icon;
new cvar_fire_color;
new cvar_frost_icon;
new cvar_frost_color;
new cvar_flare_icon;
new cvar_flare_color;
// Vars
new g_StatusIcon;
new g_GrenadeIcon[ 33 ][ 32 ];
#endif

public plugin_precache()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );
		register_cvar( "bh_version", PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER );
		set_cvar_string( "bh_version", PLUGIN_VERSION );
	
		cvar_enabled = register_cvar("bh_enabled", "1")

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_gamedescription = register_cvar("bh_gamedescription", "Biohazard v3.1b")
		cvar_skyname = register_cvar("bh_skyname", "siv2")
		cvar_lights = register_cvar("bh_lights", "d")
		cvar_starttime = register_cvar("bh_starttime", "15.0")
		cvar_countdown = register_cvar("bh_countdown", "1")
		cvar_buytime = register_cvar("bh_buytime", "0")
		cvar_randomspawn = register_cvar("bh_randomspawn", "1")
		cvar_punishsuicide = register_cvar("bh_punishsuicide", "1")
		cvar_winsounds = register_cvar("bh_winsounds", "1")
		cvar_autonvg = register_cvar("bh_autonvg", "1")
		cvar_respawnaszombie = register_cvar("bh_respawnaszombie", "1")
		cvar_painshockfree = register_cvar("bh_painshockfree", "1")
		cvar_knockback = register_cvar("bh_knockback", "1")
		cvar_knockback_duck = register_cvar("bh_knockback_duck", "1")
		cvar_knockback_dist = register_cvar("bh_knockback_dist", "280.0")
		cvar_obeyarmor = register_cvar("bh_obeyarmor", "0")
		cvar_infectmoney = register_cvar("bh_infectionmoney", "1000")
		cvar_biohazard_icon = register_cvar("bh_biohazard_icon", "1")
		cvar_caphealthdisplay = register_cvar("bh_caphealthdisplay", "1")
		cvar_weaponsmenu = register_cvar("bh_weaponsmenu", "1")
		cvar_ammo = register_cvar("bh_ammo", "1")
		cvar_maxzombies = register_cvar("bh_maxzombies", "31")
		cvar_flashbang = register_cvar("bh_flashbang", "1")
		cvar_impactexplode = register_cvar("bh_impactexplode", "1")
		cvar_showtruehealth = register_cvar("bh_showtruehealth", "1")
		cvar_zombiemulti = register_cvar("bh_zombie_countmulti", "0.15")
		cvar_zombie_hpmulti = register_cvar("bh_zombie_hpmulti", "10000.0")
		cvar_zombie_class = register_cvar("bh_zombie_class", "1")
		cvar_randomclass = register_cvar("bh_randomclass", "1")
		cvar_killbonus = register_cvar("bh_kill_bonus", "1")
		cvar_killreward = register_cvar("bh_kill_reward", "2")
		cvar_shootobjects = register_cvar("bh_shootobjects", "1")
		cvar_pushpwr_weapon = register_cvar("bh_pushpwr_weapon", "2.0")
		cvar_pushpwr_zombie = register_cvar("bh_pushpwr_zombie", "5.0")
		cvar_entrie_class_vip = register_cvar("bh_entrie_class_only_vip", "0")
		cvar_zombie_appear_sound = register_cvar( "bh_zombie_appear_sound", "2" );
	
		new file[64]
		get_configsdir(file, 63)
		format(file, 63, "%s/bh_cvars.cfg", file)
	
		if(file_exists(file)) 
			server_cmd( "exec %s", file)
	
		new mapname[32]
		get_mapname(mapname, 31)
		register_spawnpoints(mapname)
		
		register_zombieclasses("bh_zombieclass.ini")
		register_dictionary("biohazard.txt")
	
		precache_model(DEFAULT_PMODEL)
		precache_model(DEFAULT_WMODEL)
	
		new i
		for(i = 0; i < g_classcount; i++)
		{
			precache_model(g_class_pmodel)
			precache_model(g_class_wmodel)
		}

		for( i = 0; i < sizeof g_appear_sounds; i++ )
			precache_sound( g_appear_sounds[ i ] );
	
		for(i = 0; i < sizeof g_zombie_miss_sounds; i++)
			precache_sound(g_zombie_miss_sounds)
	
		for(i = 0; i < sizeof g_zombie_hit_sounds; i++) 
			precache_sound(g_zombie_hit_sounds)
	
		for(i = 0; i < sizeof g_scream_sounds; i++) 
			precache_sound(g_scream_sounds)
	
		for(i = 0; i < sizeof g_zombie_die_sounds; i++)
			precache_sound(g_zombie_die_sounds)
	
		for(i = 0; i < sizeof g_zombie_win_sounds; i++) 
			precache_sound(g_zombie_win_sounds)

		for(i = 0; i < sizeof CountDownSounds; i++)
			precache_sound(CountDownSounds)

		for(i = 0; i < sizeof g_survivor_win_sounds; i++)
			precache_sound(g_survivor_win_sounds)

		// Sky Changer
		new SkyName[ 32 ];
		get_pcvar_string( cvar_skyname, SkyName, 31 );
	
		if( strlen( SkyName ) > 0 )
			set_cvar_string( "sv_skyname", SkyName );

		for( i = 0; i < sizeof SkyTermination; ++i ) {

			new Sky[ 64 ];
			formatex( Sky, sizeof( Sky ) - 1, "gfx/env/%s%s.tga", SkyName, SkyTermination[ i ] );
			precache_generic( Sky );
		}
	
		g_fwd_spawn = register_forward(FM_Spawn, "fwd_spawn")
	
		g_buyzone = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"))
		if(g_buyzone) 
		{
			dllfunc(DLLFunc_Spawn, g_buyzone)
			set_pev(g_buyzone, pev_solid, SOLID_NOT)
		}
	
		new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_bomb_target"))
		if(ent) 
		{
			dllfunc(DLLFunc_Spawn, ent)
			set_pev(ent, pev_solid, SOLID_NOT)
		}

		#if FOG_ENABLE
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
		if(ent)
		{
			fm_set_kvd(ent, "density", FOG_DENSITY, "env_fog")
			fm_set_kvd(ent, "rendercolor", FOG_COLOR, "env_fog")
		}
		#endif
	}
}

public plugin_init()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_botquota = get_cvar_pointer("bot_quota")
		cvar_autoteambalance[0] = get_cvar_pointer("mp_autoteambalance")
		cvar_autoteambalance[1] = get_pcvar_num(cvar_autoteambalance[0])
		set_pcvar_num(cvar_autoteambalance[0], 0)

		register_clcmd("jointeam", "cmd_jointeam")
		register_clcmd("say /class", "cmd_classmenu")
		register_clcmd("say_team /class", "cmd_classmenu")
		register_clcmd("say /guns", "cmd_enablemenu")
		register_clcmd("say_team /guns", "cmd_enablemenu")
		register_clcmd("say /help", "cmd_helpmotd")
		register_clcmd("amx_infect", "cmd_infectuser", ADMIN_BAN, "<name or #userid>")
	
		register_menu("Equipment", 1023, "action_equip")
		register_menu("Primary", 1023, "action_prim")
		register_menu("Secondary", 1023, "action_sec")
	
		unregister_forward(FM_Spawn, g_fwd_spawn)
		register_forward(FM_CmdStart, "fwd_cmdstart")
		register_forward(FM_EmitSound, "fwd_emitsound")
		register_forward(FM_GetGameDescription, "fwd_gamedescription")
		register_forward(FM_CreateNamedEntity, "fwd_createnamedentity")
		register_forward(FM_ClientKill, "fwd_clientkill")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink_post", 1)
		register_forward(FM_PlayerPostThink, "fwd_player_postthink")
		register_forward(FM_SetClientKeyValue, "fwd_setclientkeyvalue")

		RegisterHam(Ham_TakeDamage, "player", "bacon_takedamage_player")
		RegisterHam(Ham_Killed, "player", "bacon_killed_player")
		RegisterHam(Ham_Spawn, "player", "bacon_spawn_player_post", 1)
		RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
		RegisterHam(Ham_TraceAttack, "func_pushable", "bacon_traceattack_pushable")
		RegisterHam(Ham_Use, "func_tank", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankmortar", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankrocket", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tanklaser", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_pushable", "bacon_use_pushable")
		RegisterHam(Ham_Touch, "func_pushable", "bacon_touch_pushable")
		RegisterHam(Ham_Touch, "weaponbox", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "armoury_entity", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "weapon_shield", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "grenade", "bacon_touch_grenade")
		RegisterHam(Ham_Item_Deploy , "weapon_knife", "bacon_claws_deploy_post", 1);

		register_message(get_user_msgid("Health"), "msg_health")
		register_message(get_user_msgid("TextMsg"), "msg_textmsg")
		register_message(get_user_msgid("SendAudio"), "msg_sendaudio")
		register_message(get_user_msgid("StatusIcon"), "msg_statusicon")
		register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
		register_message(get_user_msgid("DeathMsg"), "msg_deathmsg")
		register_message(get_user_msgid("ScreenFade"), "msg_screenfade")
		register_message(get_user_msgid("TeamInfo"), "msg_teaminfo")
		register_message(get_user_msgid("ClCorpse"), "msg_clcorpse")
		register_message(get_user_msgid("WeapPickup"), "msg_weaponpickup")
		register_message(get_user_msgid("AmmoPickup"), "msg_ammopickup")

		register_event("TextMsg", "event_textmsg", "a", "2=#Game_will_restart_in")
		register_event("HLTV", "event_newround", "a", "1=0", "2=0")
		register_event("CurWeapon", "event_curweapon", "be", "1=1")
		register_event("ArmorType", "event_armortype", "be")
		register_event("Damage", "event_damage", "be")
	
		register_logevent("logevent_round_start", 2, "1=Round_Start")
		register_logevent("logevent_round_end", 2, "1=Round_End")
	
		g_msg_flashlight = get_user_msgid("Flashlight")
		g_msg_teaminfo = get_user_msgid("TeamInfo")
		g_msg_scoreattrib = get_user_msgid("ScoreAttrib")
		g_msg_scoreinfo = get_user_msgid("ScoreInfo")
		g_msg_deathmsg = get_user_msgid("DeathMsg")
		g_msg_money = get_user_msgid("Money")
		g_msg_screenfade = get_user_msgid("ScreenFade")
	
		g_fwd_infect = CreateMultiForward("event_infect", ET_IGNORE, FP_CELL, FP_CELL)
		g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_IGNORE)

		g_sync_hpdisplay = CreateHudSyncObj()
		g_sync_msgdisplay = CreateHudSyncObj()
	
		g_maxplayers = get_maxplayers()
	
		new mod[3]
		get_modname(mod, 2)
		g_czero = (mod[0] == 'c' && mod[1] == 'z') ? true : false
	
		// Lights Map
		new lights[2]
		get_pcvar_string(cvar_lights, lights, 1)
	
		if(strlen(lights) > 0)
		{
			set_task(3.0, "task_lights", _, _, _, "b")
		
			set_cvar_num("sv_skycolor_r", 0)
			set_cvar_num("sv_skycolor_g", 0)
			set_cvar_num("sv_skycolor_b", 0)
		}
	
		// Show Details
		if(get_pcvar_num(cvar_showtruehealth))
			set_task(0.1, "task_showtruehealth", _, _, _, "b")

#if defined GRENADE_STATUS
		GrenadeStatus(  );
#endif

		server_print( "[Biohazard 3.1] Felicitari! Detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
	} else {

		server_print( "[Biohazard 3.1] Nu detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
		server_print( "[Biohazard 3.1] Pentru mai multe detalii contacteaza-ma la Y!M: [email protected] !" );

		pause( "ade" );
	}
}

public plugin_end()
	if(get_pcvar_num(cvar_enabled))
		set_pcvar_num(cvar_autoteambalance[0], cvar_autoteambalance[1])

public plugin_natives()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_library("biohazardf")
		register_native("preinfect_user", "native_preinfect_user", 1)
		register_native("infect_user", "native_infect_user", 1)
		register_native("cure_user", "native_cure_user", 1)
		register_native("register_class", "native_register_class", 1)
		register_native("get_class_id", "native_get_class_id", 1)
		register_native("set_class_pmodel", "native_set_class_pmodel", 1)
		register_native("set_class_wmodel", "native_set_class_wmodel", 1)
		register_native("set_class_data", "native_set_class_data", 1)
		register_native("get_class_data", "native_get_class_data", 1)
		register_native("game_started", "native_game_started", 1)
		register_native("is_user_zombie", "native_is_user_zombie", 1)
		register_native("is_user_infected", "native_is_user_infected", 1)
		register_native("get_user_class", "native_get_user_class",  1)
		register_native("get_humans", "native_get_humans", 1)
		register_native("get_zombies", "native_get_zombies", 1)
	}
}

public client_connect(id)
{
	g_showmenu[id] = true
	g_welcomemsg[id] = true
	g_blockmodel[id] = true
	g_zombie[id] = false
	g_preinfect[id] = false
	g_disconnected[id] = false
	g_falling[id] = false
	g_menufailsafe[id] = false
	g_victim[id] = 0
	g_mutate[id] = -1
	g_player_class[id] = 0
	g_player_weapons[id][0] = -1
	g_player_weapons[id][1] = -1
	g_regendelay[id] = 0.0

	remove_user_model(g_modelent[id])
}

public client_putinserver(id)
{
	if(!g_botclient_pdata && g_czero) 
	{
		static param[1]
		param[0] = id
		
		if(!task_exists(TASKID_CZBOTPDATA))
			set_task(1.0, "task_botclient_pdata", TASKID_CZBOTPDATA, param, 1)
	}

	if( get_pcvar_num( cvar_entrie_class_vip ) ) {

		if( g_classcount > 1 ) {
		
			new HaveClass = false;
		
			if( is_user_bot( id ) )
				return 1;

			for( new i = 0; i < g_classcount; i++ ) {

				if( g_class_data[ i ][ DATA_ONLYVIP ] == 0.0 && is_user_vip( id ) || g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 ) {

					g_player_class[ id ] = i;
					HaveClass = true;
				}
			}
		
			if( !HaveClass ) {
				
				if( get_pcvar_num( cvar_randomclass ) && g_classcount > 1 ) {
					
					g_player_class[ id ] = _random( g_classcount );
				}
			}
		}
	}

	return 0;
}

public client_disconnect(id)
{
	remove_task(TASKID_STRIPNGIVE + id)
	remove_task(TASKID_UPDATESCR + id)
	remove_task(TASKID_SPAWNDELAY + id)
	remove_task(TASKID_WEAPONSMENU + id)
	remove_task(TASKID_CHECKSPAWN + id)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );

	g_disconnected[id] = true
	remove_user_model(g_modelent[id])
}

public cmd_jointeam(id)
{
	if(is_user_alive(id) && g_zombie[id])
	{
		ColorChat( id, "%L", id, "CMD_TEAMCHANGE")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public cmd_classmenu( id ) {

	if( is_user_connected( id ) && g_classcount ) {
		
		new ClassMenuTitle[ 64 ];
		new ClassMenu;
		
		formatex( ClassMenuTitle, sizeof( ClassMenuTitle ) - 1, "\r%L", 0, "MENU_TITLE4" );
		ClassMenu = menu_create( ClassMenuTitle, "ClassCmd" );
		
		for( new i = 0; i < g_classcount; ++i ) {
			
			new ClassInfo[ 512 ];
			
			if( g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) )
				formatex( ClassInfo, sizeof( ClassInfo ) - 1,"\d%s (\d%s) - \rOnly VIP", g_class_name[ i ], g_class_desc[ i ] );
			else
				formatex( ClassInfo, sizeof( ClassInfo ) - 1, "\w%s \r(\y%s\r)", g_class_name[ i ], g_class_desc[ i ] );
			
			new Num[ 64 ];
			formatex( Num, sizeof( Num ) - 1, "%d", i );
			menu_additem( ClassMenu, ClassInfo, Num, 0 );
		}
		
		menu_setprop( ClassMenu, MPROP_EXIT, MEXIT_ALL );
		
		menu_display( id, ClassMenu, 0 );
	}
}

public cmd_enablemenu(id)
{	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		ColorChat( id, "%L", id, g_showmenu[id] == false ? "MENU_REENABLED" : "MENU_ALENABLED")
		g_showmenu[id] = true
	}
}

public cmd_helpmotd(id)
{
	static motd[2048]
	formatex(motd, 2047, "%L", id, "HELP_MOTD")
	replace(motd, 2047, "#Version#", PLUGIN_VERSION)
	
	show_motd(id, motd, "Biohazard Help")
}	

public cmd_infectuser(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED_MAIN
	
	static arg1[32]
	read_argv(1, arg1, 31)
	
	static target
	target = cmd_target(id, arg1, (CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF|CMDTARGET_ONLY_ALIVE))
	
	if(!is_user_connected(target) || g_zombie[target])
		return PLUGIN_HANDLED_MAIN
	
	if(!allow_infection())
	{
		console_print(id, "%L", id, "CMD_MAXZOMBIES")
		return PLUGIN_HANDLED_MAIN
	}
	
	if(!g_gamestarted)
	{
		console_print(id, "%L", id, "CMD_GAMENOTSTARTED")
		return PLUGIN_HANDLED_MAIN
	}
			
	static name[32] 
	get_user_name(target, name, 31)
	
	console_print(id, "%L", id, "CMD_INFECTED", name)
	infect_user(target, 0)
	
	return PLUGIN_HANDLED_MAIN
}

public msg_teaminfo(msgid, dest, id)
{
	if(!g_gamestarted)
		return PLUGIN_CONTINUE

	// Don't pick up our own TeamInfo messages for this player (bugfix)
	if (g_switchingteam)
		return PLUGIN_CONTINUE

	static team[2]
	get_msg_arg_string(2, team, 1)
	
	if(team[0] != 'U')
		return PLUGIN_CONTINUE

	id = get_msg_arg_int(1)
	if(is_user_alive(id) || !g_disconnected[id])
		return PLUGIN_CONTINUE

	g_disconnected[id] = false
	id = randomly_pick_zombie()
	if(id)
	{
		fm_set_user_team(id, g_zombie[id] ? CS_TEAM_CT : CS_TEAM_T, 0)
		set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)
	}
	return PLUGIN_CONTINUE
}

public msg_screenfade(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_flashbang))
		return PLUGIN_CONTINUE
	
	if(!g_zombie[id] || !is_user_alive(id) || g_class_data[g_player_class[id]][DATA_NOFLASH] > 0.0)
	{
		static data[4]
		data[0] = get_msg_arg_int(4)
		data[1] = get_msg_arg_int(5)
		data[2] = get_msg_arg_int(6)
		data[3] = get_msg_arg_int(7)
		
		if(data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] > 199)
			return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public msg_scoreattrib(msgid, dest, id)
{
	static attrib 
	attrib = get_msg_arg_int(2)
	
	if(attrib == ATTRIB_BOMB)
		set_msg_arg_int(2, ARG_BYTE, 0)
}

public msg_statusicon(msgid, dest, id)
{
	static icon[3]
	get_msg_arg_string(2, icon, 2)
	
	return (icon[0] == 'c' && icon[1] == '4') ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}

public msg_weaponpickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_ammopickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_deathmsg(msgid, dest, id) 
{
	static killer
	killer = get_msg_arg_int(1)

	if(is_user_connected(killer) && g_zombie[killer])
		set_msg_arg_string(4, g_zombie_weapname)
}

public msg_sendaudio(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_winsounds))
		return PLUGIN_CONTINUE
	
	static audiocode [22]
	get_msg_arg_string(2, audiocode, 21)
	
	if(equal(audiocode[7], "terwin"))
		set_msg_arg_string(2, g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
	else if(equal(audiocode[7], "ctwin"))
		set_msg_arg_string(2, g_survivor_win_sounds[_random(sizeof g_survivor_win_sounds)])
	
	return PLUGIN_CONTINUE
}

public msg_health(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_caphealthdisplay))
		return PLUGIN_CONTINUE
	
	static health
	health = get_msg_arg_int(1)
		
	if(health > 255) 
		set_msg_arg_int(1, ARG_BYTE, 255)
	
	return PLUGIN_CONTINUE
}

public msg_textmsg(msgid, dest, id)
{
	if(get_msg_arg_int(1) != 4)
		return PLUGIN_CONTINUE
	
	static txtmsg[25], winmsg[32]
	get_msg_arg_string(2, txtmsg, 24)
	
	if(equal(txtmsg[1], "Game_bomb_drop"))
		return PLUGIN_HANDLED

	else if(equal(txtmsg[1], "Terrorists_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_ZOMBIES")
		set_msg_arg_string(2, winmsg)
	}
	else if(equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_SURVIVORS")
		set_msg_arg_string(2, winmsg)
	}
	return PLUGIN_CONTINUE
}

public msg_clcorpse(msgid, dest, id)
{
	id = get_msg_arg_int(12)
	if(!g_zombie[id])
		return PLUGIN_CONTINUE
	
	static ent
	ent = fm_find_ent_by_owner(-1, MODEL_CLASSNAME, id)
	
	if(ent)
	{
		static model[64]
		pev(ent, pev_model, model, 63)
		
		set_msg_arg_string(1, model)
	}

	return PLUGIN_CONTINUE
}

public logevent_round_start()
{
	g_roundended = false
	g_roundstarted = true
	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public logevent_round_end()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	remove_task(TASKID_BALANCETEAM) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	set_task(0.1, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_textmsg()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	static seconds[5] 
	read_data(3, seconds, 4)
	
	static Float:tasktime 
	tasktime = float(str_to_num(seconds)) - 0.5
	
	remove_task(TASKID_BALANCETEAM)
	
	set_task(tasktime, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_newround()
{
	g_gamestarted = false
	
	static buytime 
	buytime = get_pcvar_num(cvar_buytime)
	
	if(buytime) 
		g_buytime = buytime + get_gametime()
	
	static id
	for(id = 0; id <= g_maxplayers; id++)
	{
		if(is_user_connected(id))
			g_blockmodel[id] = true
	}
	
	remove_task(TASKID_NEWROUND) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );
	
	set_task(0.1, "task_newround", TASKID_NEWROUND)
	set_task(get_pcvar_float(cvar_starttime), "task_initround", TASKID_INITROUND)

	if( get_pcvar_num( cvar_countdown ) ) {

		CountDownDelay = get_pcvar_num( cvar_starttime );
		set_task( 0.1, "TASK_CountDown", TASKID_COUNTDOWN );
	}
}

public event_curweapon(id)
{
	if(!is_user_alive(id))
		return PLUGIN_CONTINUE
	
	static weapon
	weapon = read_data(2)

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if( g_zombie[ id ] ) {

		if( weapon != CSW_KNIFE && weapon != CSW_FLASHBANG && !task_exists( TASKID_STRIPNGIVE + id ) )
			set_task( 0.1, "task_stripngive", TASKID_STRIPNGIVE + id );

		return PLUGIN_CONTINUE;
	}

	static ammotype
	ammotype = get_pcvar_num(cvar_ammo)
	
	if(!ammotype || (AMMOWP_NULL & (1<<weapon)))
		return PLUGIN_CONTINUE

	static maxammo
	switch(ammotype)
	{
		case 1: maxammo = g_weapon_ammo[weapon][MAX_AMMO]
		case 2: maxammo = g_weapon_ammo[weapon][MAX_CLIP]
	}

	if(!maxammo)
		return PLUGIN_CONTINUE
	
	switch(ammotype)
	{
		case 1:
		{
			static ammo
			ammo = fm_get_user_bpammo(id, weapon)
			
			if(ammo < 1) 
				fm_set_user_bpammo(id, weapon, maxammo)
		}
		case 2:
		{
			static clip; clip = read_data(3)
			if(clip < 1)
			{
				static weaponname[32]
				get_weaponname(weapon, weaponname, 31)
				
				static ent 
				ent = fm_find_ent_by_owner(-1, weaponname, id)
				
				fm_set_weapon_ammo(ent, maxammo)
			}
		}
	}

	return PLUGIN_CONTINUE
}

public event_armortype(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return PLUGIN_CONTINUE
	
	if(fm_get_user_armortype(id) != CS_ARMOR_NONE)
		fm_set_user_armortype(id, CS_ARMOR_NONE)
	
	return PLUGIN_CONTINUE
}

public event_damage(victim)
{
	if(!is_user_alive(victim) || !g_gamestarted)
		return PLUGIN_CONTINUE

	if(!g_zombie[victim])
	{
		static attacker
		attacker = get_user_attacker(victim)
		
		if(!is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
			return PLUGIN_CONTINUE
		
		if(g_victim[attacker] == victim)
		{
			g_infecting = true
			g_victim[attacker] = 0

			message_begin(MSG_ALL, g_msg_deathmsg)
			write_byte(attacker)
			write_byte(victim)
			write_byte(0)
			write_string(g_infection_name)
			message_end()
			
			message_begin(MSG_ALL, g_msg_scoreattrib)
			write_byte(victim)
			write_byte(0)
			message_end()
			
			infect_user(victim, attacker)
			
			static Float:frags, deaths
			pev(attacker, pev_frags, frags)
			deaths = fm_get_user_deaths(victim)
			
			set_pev(attacker, pev_frags, frags  + 1.0)
			fm_set_user_deaths(victim, deaths + 1)
			
			fm_set_user_money(attacker, get_pcvar_num(cvar_infectmoney))
		
			static params[2]
			params[0] = attacker 
			params[1] = victim
	
			set_task(0.3, "task_updatescore", TASKID_UPDATESCR, params, 2)
		}
		g_infecting = false
	}
	return PLUGIN_CONTINUE
}

public fwd_player_prethink(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static flags
	flags = pev(id, pev_flags)
	
	if(flags & FL_ONGROUND)
	{
		if(get_pcvar_num(cvar_painshockfree))
		{
			pev(id, pev_velocity, g_vecvel)
			g_brestorevel = true
		}
	}
	else
	{
		static Float:fallvelocity
		pev(id, pev_flFallVelocity, fallvelocity)
		
		g_falling[id] = fallvelocity >= 350.0 ? true : false
	}
		
	if(g_gamestarted)
	{	
		static Float:gametime
		gametime = get_gametime()
		
		static pclass
		pclass = g_player_class[id]

		static Float:health
		pev(id, pev_health, health)
		
		if(health < g_class_data[pclass][DATA_HEALTH] && g_regendelay[id] < gametime)
		{
			set_pev(id, pev_health, health + 1.0)
			g_regendelay[id] = gametime + g_class_data[pclass][DATA_REGENDLY]
		}
	}

	if( get_pcvar_num( cvar_biohazard_icon ) > 0 ) {

		if( is_user_alive( id ) ) {

			if( g_preinfect[ id ] && !g_zombie[ id ] ) set_biohazard_icon( id, 2, 255, 255, 0 );
			else if( g_zombie[ id ] ) set_biohazard_icon( id, 1, 255, 0, 0 );
			else if( !g_zombie[ id ] && !g_preinfect[ id ] ) set_biohazard_icon( id, 1, 125, 178, 255 );
		} else set_biohazard_icon( id, 0, 0, 0 ,0 );
	}

	return FMRES_IGNORED
}

public fwd_player_prethink_post(id)
{
	if(!g_brestorevel)
		return FMRES_IGNORED

	g_brestorevel = false
		
	static flag
	flag = pev(id, pev_flags)
	
	if(!(flag & FL_ONTRAIN))
	{
		static ent
		ent = pev(id, pev_groundentity)
		
		if(pev_valid(ent) && (flag & FL_CONVEYOR))
		{
			static Float:vectemp[3]
			pev(id, pev_basevelocity, vectemp)
			
			xs_vec_add(g_vecvel, vectemp, g_vecvel)
		}
	
		set_pev(id, pev_velocity, g_vecvel)
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public fwd_player_postthink(id)
{ 
	if(!is_user_alive(id))
		return FMRES_IGNORED
	
	if(g_zombie[id] && g_falling[id] && (pev(id, pev_flags) & FL_ONGROUND))
	{	
		set_pev(id, pev_watertype, CONTENTS_WATER)
		g_falling[id] = false
	}
	
	if(get_pcvar_num(cvar_buytime))
	{
		if(pev_valid(g_buyzone) && g_buytime > get_gametime())
			dllfunc(DLLFunc_Touch, g_buyzone, id)
	}

	return FMRES_IGNORED
}

public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch)
{	
	if(channel == CHAN_ITEM && sample[6] == 'n' && sample[7] == 'v' && sample[8] == 'g')
		return FMRES_SUPERCEDE	
	
	if(!is_user_connected(id) || !g_zombie[id])
		return FMRES_IGNORED	

	if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
	{
		if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
		{
			emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			return FMRES_SUPERCEDE
		}
		else if(sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't' || sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
		{
			if(sample[17] == 'w' && sample[18] == 'a' && sample[19] == 'l')
				emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			else
				emit_sound(id, channel, g_zombie_hit_sounds[_random(sizeof g_zombie_hit_sounds)], volume, attn, flag, pitch)
			
			return FMRES_SUPERCEDE
		}
	}			
	else if(sample[7] == 'd' && (sample[8] == 'i' && sample[9] == 'e' || sample[12] == '6'))
	{
		emit_sound(id, channel, g_zombie_die_sounds[_random(sizeof g_zombie_die_sounds)], volume, attn, flag, pitch)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_cmdstart(id, handle, seed)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static impulse
	impulse = get_uc(handle, UC_Impulse)
	
	if(impulse == IMPULSE_FLASHLIGHT)
	{
		set_uc(handle, UC_Impulse, 0)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_spawn(ent)
{
	if(!pev_valid(ent)) 
		return FMRES_IGNORED
	
	static classname[32]
	pev(ent, pev_classname, classname, 31)

	static i
	for(i = 0; i < sizeof g_remove_entities; ++i)
	{
		if(equal(classname, g_remove_entities))
		{
			engfunc(EngFunc_RemoveEntity, ent)
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public fwd_gamedescription() 
{ 
	static gamename[32]
	get_pcvar_string(cvar_gamedescription, gamename, 31)
	
	forward_return(FMV_STRING, gamename)
	
	return FMRES_SUPERCEDE
}  

public fwd_createnamedentity(entclassname)
{
	static classname[10]
	engfunc(EngFunc_SzFromIndex, entclassname, classname, 9)
	
	return (classname[7] == 'c' && classname[8] == '4') ? FMRES_SUPERCEDE : FMRES_IGNORED
}

public fwd_clientkill(id)
{
	if(get_pcvar_num(cvar_punishsuicide) && is_user_alive(id))
		g_suicide[id] = true
}

public fwd_setclientkeyvalue(id, infobuffer, const key[])
{
	if(!equal(key, "model") || !g_blockmodel[id])
		return FMRES_IGNORED
	
	static model[32]
	fm_get_user_model(id, model, 31)
	
	if(equal(model, "gordon"))
		return FMRES_IGNORED
	
	g_blockmodel[id] = false
	
	return FMRES_SUPERCEDE
}

public bacon_touch_weapon(ent, id)
	return (is_user_alive(id) && g_zombie[id]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_tank(ent, caller, activator, use_type, Float:value)
	return (is_user_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_pushable(ent, caller, activator, use_type, Float:value)
	return HAM_SUPERCEDE

public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!g_gamestarted) 
		return HAM_SUPERCEDE
	
	if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
		return HAM_IGNORED
	
	if(!is_user_connected(attacker) || !g_zombie[victim])
		return HAM_IGNORED
	
	static kbpower
	kbpower = g_weapon_knockback[get_user_weapon(attacker)]
	
	if(kbpower != -1) 
	{
		static flags
		flags = pev(victim, pev_flags)
		
		if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND)))
			return HAM_IGNORED
		
		static Float:origins[2][3]
		pev(victim, pev_origin, origins[0])
		pev(attacker, pev_origin, origins[1])
		
		if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
		{
			static Float:velocity[3]
			pev(victim, pev_velocity, velocity)
			
			static Float:tempvec
			tempvec = velocity[2]	
			
			xs_vec_mul_scalar(direction, damage, direction)
			xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
			xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)
			
			xs_vec_add(direction, velocity, velocity)
			velocity[2] = tempvec
			
			set_pev(victim, pev_velocity, velocity)
			
			return HAM_HANDLED
		}
	}
	return HAM_IGNORED
}

public bacon_touch_grenade(ent, world)
{
	if(!get_pcvar_num(cvar_impactexplode))
		return HAM_IGNORED
	
	static model[12]
	pev(ent, pev_model, model, 11)
	
	if(model[9] == 'h' && model[10] == 'e')
	{
		set_pev(ent, pev_dmgtime, 0.0)
		
		return HAM_HANDLED
	}
	return HAM_IGNORED
}

public bacon_takedamage_player(victim, inflictor, attacker, Float:damage, damagetype)
{
	if(damagetype & DMG_GENERIC || victim == attacker || !is_user_alive(victim) || !is_user_connected(attacker))
		return HAM_IGNORED

	if(!g_gamestarted || (!g_zombie[victim] && !g_zombie[attacker]) || ((damagetype & DMG_HEGRENADE) && g_zombie[attacker]))
		return HAM_SUPERCEDE

	if(g_zombie[attacker])
	{
		if(get_user_weapon(attacker) != CSW_KNIFE)
			return HAM_SUPERCEDE

		damage *= g_class_data[g_player_class[attacker]][DATA_ATTACK]
		
		static Float:armor
		pev(victim, pev_armorvalue, armor)
		
		if(get_pcvar_num(cvar_obeyarmor) && armor > 0.0)
		{
			armor -= damage
			
			if(armor < 0.0) 
				armor = 0.0
			
			set_pev(victim, pev_armorvalue, armor)
			SetHamParamFloat(4, 0.0)
		}
		else
		{
			static bool:infect
			infect = allow_infection()
			
			g_victim[attacker] = infect ? victim : 0
					
			if(!g_infecting)
				SetHamParamFloat(4, infect ? 0.0 : damage)
			else	
				SetHamParamFloat(4, 0.0)
		}
	}
	return HAM_HANDLED
}

public bacon_killed_player(victim, killer, shouldgib)
{
	if(!is_user_alive(killer) || g_zombie[killer] || !g_zombie[victim])
		return HAM_IGNORED

	static killbonus
	killbonus = get_pcvar_num(cvar_killbonus)
	
	if(killbonus)
		set_pev(killer, pev_frags, pev(killer, pev_frags) + float(killbonus))
	
	static killreward
	killreward = get_pcvar_num(cvar_killreward)
	
	if(!killreward) 
		return HAM_IGNORED
	
	static weapon, maxclip, ent, weaponname[32]
	switch(killreward)
	{
		case 1: 
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
		}
		case 2:
		{
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
		case 3:
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
				
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
	}
	return HAM_IGNORED
}

public bacon_spawn_player_post(id)
{	
	if(!is_user_alive(id))
		return HAM_IGNORED
	
	static team
	team = fm_get_user_team(id)
	
	if(team != CS_TEAM_T && team != CS_TEAM_CT)
		return HAM_IGNORED
	
	if(g_zombie[id])
	{
		if(get_pcvar_num(cvar_respawnaszombie) && !g_roundended)
		{
			set_zombie_attibutes(id)
			
			return HAM_IGNORED
		}
		else
			cure_user(id)
	}
	else if(pev(id, pev_rendermode) == kRenderTransTexture)
		reset_user_model(id)
	
	set_task(0.3, "task_spawned", TASKID_SPAWNDELAY + id)
	set_task(5.0, "task_checkspawn", TASKID_CHECKSPAWN + id)
	
	return HAM_IGNORED
}

public bacon_touch_pushable(ent, id)
{
	static movetype
	pev(id, pev_movetype)
	
	if(movetype == MOVETYPE_NOCLIP || movetype == MOVETYPE_NONE)
		return HAM_IGNORED	
	
	if(is_user_alive(id))
	{
		set_pev(id, pev_movetype, MOVETYPE_WALK)
		
		if(!(pev(id, pev_flags) & FL_ONGROUND))
			return HAM_SUPERCEDE
	}
	
	if(!get_pcvar_num(cvar_shootobjects))
		return HAM_IGNORED
	
	static Float:velocity[2][3]
	pev(ent, pev_velocity, velocity[0])
	
	if(vector_length(velocity[0]) > 0.0)
	{
		pev(id, pev_velocity, velocity[1])
		velocity[1][0] += velocity[0][0]
		velocity[1][1] += velocity[0][1]
		
		set_pev(id, pev_velocity, velocity[1])
	}
	return HAM_SUPERCEDE
}

public bacon_traceattack_pushable(ent, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!get_pcvar_num(cvar_shootobjects) || !is_user_alive(attacker))
		return HAM_IGNORED
	
	static Float:velocity[3]
	pev(ent, pev_velocity, velocity)
			
	static Float:tempvec
	tempvec = velocity[2]	
			
	xs_vec_mul_scalar(direction, damage, direction)
	xs_vec_mul_scalar(direction, g_zombie[attacker] ? 
	get_pcvar_float(cvar_pushpwr_zombie) : get_pcvar_float(cvar_pushpwr_weapon), direction)
	xs_vec_add(direction, velocity, velocity)
	velocity[2] = tempvec
	
	set_pev(ent, pev_velocity, velocity)
	
	return HAM_HANDLED
}

public bacon_claws_deploy_post( iEntity ) {

	static szOwner;
	szOwner = get_pdata_cbase( iEntity, 41, EXTRAOFFSET_WEAPONS );

	if( g_zombie[ szOwner ] ) {

		set_pev( szOwner, pev_viewmodel2, g_class_wmodel[ g_player_class[ szOwner ] ] );
		set_pev( szOwner, pev_weaponmodel2, "" );
	}
}

public TASK_CountDown(  ) {

	new Players[ 32 ];
	new PlayersNum;
	get_players( Players, PlayersNum, "a" );
	
	if( CountDownDelay > sizeof CountDownSounds + 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
	} else if( CountDownDelay > 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		emit_sound( 0, CHAN_VOICE, CountDownSounds[ CountDownDelay - 1 ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );

		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
		
		for( new i = 0 ; i < PlayersNum ; i++ ) {

			if( is_user_connected( Players[ i ] ) ) {

				new color[ 3 ];
				color[ 0 ] = 125;
				color[ 1 ] = 170;
				color[ 2 ] = 255;
				UTIL_ScreenFade( Players[ i ], color, 0.5, 0.5, 110 );

				new shock[ 3 ];
				shock[ 0 ] = 3;
				shock[ 1 ] = 2;
				shock[ 2 ] = 3;
				message_begin( MSG_ONE, get_user_msgid( "ScreenShake" ), _, Players[ i ] );
				write_short( ( 1<<12 ) * shock[ 0 ] );
				write_short( ( 1<<12 ) * shock[ 1 ] );
				write_short( ( 1<<12 ) * shock[ 2 ] );
				message_end(  );
			}
		}	
	} else if( CountDownDelay <= 1 )
		CountDownDelay = 0;
}

public task_spawned(taskid)
{
	static id
	id = taskid - TASKID_SPAWNDELAY
	
	if(is_user_alive(id))
	{
		if( !get_pcvar_num( cvar_weaponsmenu ) ) {

			for( new i = 0; i < sizeof g_grenades; ++i )
				bacon_give_weapon( id, g_grenades[ i ] );
		}

		if(g_welcomemsg[id])
		{
			g_welcomemsg[id] = false
			
			static message[192]
			formatex(message, 191, "%L", id, "WELCOME_TXT")
			replace(message, 191, "#Version#", PLUGIN_VERSION)
			
			ColorChat(id, message)
		}
		
		if(g_suicide[id])
		{
			g_suicide[id] = false
			
			user_silentkill(id)
			remove_task(TASKID_CHECKSPAWN + id)

			ColorChat(id, "%L", id, "SUICIDEPUNISH_TXT")
			
			return
		}
		
		if(get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
			is_user_bot(id) ? bot_weapons(id) : display_equipmenu(id)
		
		if(!g_gamestarted)
			ColorChat(id, "%L %L", id, "SCAN_RESULTS", id, g_preinfect[id] ? "SCAN_INFECTED" : "SCAN_CLEAN")
		else
		{
			static team
			team = fm_get_user_team(id)
			
			if(team == CS_TEAM_T)
				fm_set_user_team(id, CS_TEAM_CT)
		}

		if(get_pcvar_num(cvar_biohazard_icon) > 0) {
			if(g_preinfect[id] && !g_zombie[id])
				set_biohazard_icon(id, 2, 255, 255, 0)
			else if(g_zombie[id])
				set_biohazard_icon(id, 1, 255, 0, 0)
			else if(!g_zombie[id] && !g_preinfect[id])
				set_biohazard_icon(id, 1, 125, 178, 255)
		}
	}
}

public task_checkspawn(taskid)
{
	static id
	id = taskid - TASKID_CHECKSPAWN
	
	if(!is_user_connected(id) || is_user_alive(id) || g_roundended)
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
		ExecuteHamB(Ham_CS_RoundRespawn, id)
}
	
public task_showtruehealth()
{
	static id, Float:health, Float:gravity, Float:speed, class
	for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id) && !is_user_bot(id) && g_zombie[id])
	{
		pev( id, pev_health, health );
		pev( id, pev_gravity, gravity );
		pev( id, pev_maxspeed, speed );
		class = g_player_class[id]

		if(g_classcount > 1) {

			set_hudmessage(0, 255, 20, -1.0, 0.8, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Class: %s - Desc: %s^nHealth: %0.f^n^nSpeed: %0.1f^nGolds: %i", g_class_name[class], g_class_desc[class], health, speed, get_user_golds( id ) );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		} else {

			set_hudmessage(0, 230, 210, 0.01, 0.9, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Speed: %0.1f   Gravity: %0.1f", speed, gravity / 0.00125 );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		}
	}
}

public task_lights()
{
	static light[2]
	get_pcvar_string(cvar_lights, light, 1)
	
	engfunc(EngFunc_LightStyle, 0, light)
}

public task_updatescore(params[])
{
	if(!g_gamestarted) 
		return
	
	static attacker
	attacker = params[0]
	
	static victim
	victim = params[1]
	
	if(!is_user_connected(attacker))
		return

	static frags, deaths, team
	frags  = get_user_frags(attacker)
	deaths = fm_get_user_deaths(attacker)
	team   = get_user_team(attacker)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(attacker)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
	
	if(!is_user_connected(victim))
		return
	
	frags  = get_user_frags(victim)
	deaths = fm_get_user_deaths(victim)
	team   = get_user_team(victim)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(victim)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
}

public task_weaponsmenu(taskid)
{
	static id
	id = taskid - TASKID_WEAPONSMENU
	
	if(is_user_alive(id) && !g_zombie[id] && g_menufailsafe[id])
		display_equipmenu(id)
}

public task_stripngive(taskid)
{
	static id
	id = taskid - TASKID_STRIPNGIVE
	
	if(is_user_alive(id))
	{
		fm_strip_user_weapons(id)
		fm_reset_user_primary(id)
		bacon_give_weapon(id, "weapon_knife")
		
		set_pev(id, pev_weaponmodel2, "")
		set_pev(id, pev_viewmodel2, g_class_wmodel[g_player_class[id]])
		set_pev(id, pev_maxspeed, g_class_data[g_player_class[id]][DATA_SPEED])
	}
}

public task_newround()
{
	static players[32], num, zombies, i, id
	get_players(players, num, "a")

	if(num > 1)
	{
		for(i = 0; i < num; i++) 
			g_preinfect[players[i]] = false
		
		zombies = clamp(floatround(num * get_pcvar_float(cvar_zombiemulti)), 1, 31)
		
		i = 0
		while(i < zombies)
		{
			id = players[_random(num)]
			if(!g_preinfect[id])
			{
				g_preinfect[id] = true
				i++
			}
		}
	}
	
	if(!get_pcvar_num(cvar_randomspawn) || g_spawncount <= 0) 
		return
	
	static team
	for(i = 0; i < num; i++)
	{
		id = players[i]
		
		team = fm_get_user_team(id)
		if(team != CS_TEAM_T && team != CS_TEAM_CT || pev(id, pev_iuser1))
			continue
		
		static spawn_index
		spawn_index = _random(g_spawncount)
	
		static Float:spawndata[3]
		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		
		if(!fm_is_hull_vacant(spawndata, HULL_HUMAN))
		{
			static i
			for(i = spawn_index + 1; i != spawn_index; i++)
			{
				if(i >= g_spawncount) i = 0

				spawndata[0] = g_spawns[i][0]
				spawndata[1] = g_spawns[i][1]
				spawndata[2] = g_spawns[i][2]

				if(fm_is_hull_vacant(spawndata, HULL_HUMAN))
				{
					spawn_index = i
					break
				}
			}
		}

		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		engfunc(EngFunc_SetOrigin, id, spawndata)

		spawndata[0] = g_spawns[spawn_index][3]
		spawndata[1] = g_spawns[spawn_index][4]
		spawndata[2] = g_spawns[spawn_index][5]
		set_pev(id, pev_angles, spawndata)

		spawndata[0] = g_spawns[spawn_index][6]
		spawndata[1] = g_spawns[spawn_index][7]
		spawndata[2] = g_spawns[spawn_index][8]
		set_pev(id, pev_v_angle, spawndata)

		set_pev(id, pev_fixangle, 1)
	}
}

public task_initround()
{
	static zombiecount, newzombie
	zombiecount = 0
	newzombie = 0

	static players[32], num, i, id
	get_players(players, num, "a")

	for(i = 0; i < num; i++) if(g_preinfect[players[i]])
	{
		newzombie = players[i]
		zombiecount++
	}
	
	if(zombiecount > 1) 
		newzombie = 0
	else if(zombiecount < 1) 
		newzombie = players[_random(num)]
	
	for(i = 0; i < num; i++)
	{
		id = players[i]
		if(id == newzombie || g_preinfect[id])
			infect_user(id, 0)
		else
		{
			fm_set_user_team(id, CS_TEAM_CT, 0)
			add_delay(id, "update_team")
		}
	}
	
	set_hudmessage(_, _, _, _, _, 1)
	if(newzombie)
	{
		static name[32]
		get_user_name(newzombie, name, 31)
		
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD", name)
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT", name)
	}
	else
	{
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD2")
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT2")
	}
	
	set_task(0.51, "task_startround", TASKID_STARTROUND)

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 2 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

public task_startround()
{
	g_gamestarted = true
	ExecuteForward(g_fwd_gamestart, g_fwd_result)
}

public task_balanceteam()
{
	static players[3][32], count[3]
	get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
	
	count[CS_TEAM_T] = 0
	count[CS_TEAM_CT] = 0
	
	static i, id, team
	for(i = 0; i < count[CS_TEAM_UNASSIGNED]; i++)
	{
		id = players[CS_TEAM_UNASSIGNED][i] 
		team = fm_get_user_team(id)
		
		if(team == CS_TEAM_T || team == CS_TEAM_CT)
			players[team][count[team]++] = id
	}

	if(abs(count[CS_TEAM_T] - count[CS_TEAM_CT]) <= 1) 
		return

	static maxplayers
	maxplayers = (count[CS_TEAM_T] + count[CS_TEAM_CT]) / 2
	
	if(count[CS_TEAM_T] > maxplayers)
	{
		for(i = 0; i < (count[CS_TEAM_T] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT, 0)
	}
	else
	{
		for(i = 0; i < (count[CS_TEAM_CT] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T, 0)
	}
}

public task_botclient_pdata(id) 
{
	if(g_botclient_pdata || !is_user_connected(id))
		return
	
	if(get_pcvar_num(cvar_botquota) && is_user_bot(id))
	{
		RegisterHamFromEntity(Ham_TakeDamage, id, "bacon_takedamage_player")
		RegisterHamFromEntity(Ham_Killed, id, "bacon_killed_player")
		RegisterHamFromEntity(Ham_TraceAttack, id, "bacon_traceattack_player")
		RegisterHamFromEntity(Ham_Spawn, id, "bacon_spawn_player_post", 1)
		
		g_botclient_pdata = 1
	}
}

public bot_weapons(id)
{
	g_player_weapons[id][0] = _random(sizeof g_primaryweapons)
	g_player_weapons[id][1] = _random(sizeof g_secondaryweapons)
	
	equipweapon(id, EQUIP_ALL)
}

public update_team(id)
{
	if(!is_user_connected(id))
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
	{
		emessage_begin(MSG_ALL, g_msg_teaminfo)
		ewrite_byte(id)
		ewrite_string(g_teaminfo[team])
		emessage_end()
	}
}

public infect_user(victim, attacker)
{
	if(!is_user_alive(victim))
		return

	message_begin(MSG_ONE, g_msg_screenfade, _, victim)
	write_short(1<<10)
	write_short(1<<10)
	write_short(0)
	write_byte((g_mutate[victim] != -1) ? 255 : 100)
	write_byte(100)
	write_byte(100)
	write_byte(250)
	message_end()

	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenShake" ), _, victim )
	write_short( ( 1<<12 ) * 4 ) // amplitude
	write_short( ( 1<<12 ) * 2 ) // duration
	write_short( ( 1<<12 ) * 10 ) // frequency
	message_end(  )
		
	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "Damage" ), _, victim )
	write_byte( 0 ) // damage save
	write_byte( 0 ) // damage take
	write_long( DMG_NERVEGAS ) // damage type - DMG_RADIATION
	write_coord( 0 ) // x
	write_coord( 0 ) // y
	write_coord( 0 ) // z
	message_end(  )

	// Get player's origin
	new Origin[ 3 ]
	get_user_origin( victim, Origin )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_IMPLOSION ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 128 ) // radius
	write_byte( 20 ) // count
	write_byte( 3 ) // duration
	message_end(  )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_DLIGHT ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 20 ) // radius
	write_byte( 0 ) // r
	write_byte( 150 ) // g
	write_byte( 0 ) // b
	write_byte( 2 ) // life
	write_byte( 0 ) // decay rate
	message_end(  )

#if defined ULTRA_BLOOD
	static origin[3];
	get_user_origin(victim, origin)

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_PARTICLEBURST)
	write_coord(origin[0])
	write_coord(origin[1])
	write_coord(origin[2])
	write_short(50)
	write_byte(70)
	write_byte(3)
	message_end()
#endif
	
	if(g_mutate[victim] != -1)
	{
		g_player_class[victim] = g_mutate[victim]
		g_mutate[victim] = -1
		
		set_hudmessage(_, _, _, _, _, 1)
		ShowSyncHudMsg(victim, g_sync_msgdisplay, "%L", victim, "MUTATION_HUD", g_class_name[g_player_class[victim]])
	}
	
	fm_set_user_team(victim, CS_TEAM_T)
	set_zombie_attibutes(victim)
	
	emit_sound(victim, CHAN_STATIC, g_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
	ExecuteForward(g_fwd_infect, g_fwd_result, victim, attacker)
}

public cure_user(id)
{
	if(!is_user_alive(id)) 
		return

	g_zombie[id] = false
	g_falling[id] = false

	g_showmenu[id] = true;

	reset_user_model(id)
	fm_set_user_nvg(id, 0)
	set_pev(id, pev_gravity, 1.0)
	
	if( fm_get_user_team( id ) != CS_TEAM_CT ) { // need to change team?

		fm_set_user_team( id, CS_TEAM_CT );
		fm_user_team_update( id );
	}

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if(equal(viewmodel, g_class_wmodel[g_player_class[id]]))
	{
		static weapon 
		weapon = fm_lastknife(id)

		if(pev_valid(weapon))
			ExecuteHam(Ham_Item_Deploy, weapon)
	}

	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public display_equipmenu(id)
{
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L^n^n", id, "MENU_TITLE1")
	
	static bool:hasweap
	hasweap = ((g_player_weapons[id][0]) != -1 && (g_player_weapons[id][1] != -1)) ? true : false
	
	len += formatex(menubody[len], 511 - len,"\r1.\w %L^n", id, "MENU_NEWWEAPONS")
	len += formatex(menubody[len], 511 - len,"%s2.\w %L^n", hasweap ? "\r" : "\d", id, "MENU_PREVSETUP")
	len += formatex(menubody[len], 511 - len,"%s3.\w %L^n^n", hasweap ? "\r" : "\d", id, "MENU_DONTSHOW")
	len += formatex(menubody[len], 511 - len,"\r5.\w %L^n", id, "MENU_EXIT")
	
	static keys
	keys = (MENU_KEY_1|MENU_KEY_5)
	
	if(hasweap) 
		keys |= (MENU_KEY_2|MENU_KEY_3)
	
	show_menu(id, keys, menubody, -1, "Equipment")
}

public action_equip(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key)
	{
		case 0: display_weaponmenu(id, MENU_PRIMARY, g_menuposition[id] = 0)
		case 1: equipweapon(id, EQUIP_ALL)
		case 2:
		{
			g_showmenu[id] = false
			equipweapon(id, EQUIP_ALL)
			ColorChat(id, "%L", id, "MENU_CMDENABLE")
		}
	}
	
	if(key > 0)
	{
		g_menufailsafe[id] = false
		remove_task(TASKID_WEAPONSMENU + id)
	}
	return PLUGIN_HANDLED
}


public display_weaponmenu(id, menuid, pos)
{
	if(pos < 0 || menuid < 0)
		return
	
	static start
	start = pos * 8
	
	static maxitem
	maxitem = menuid == MENU_PRIMARY ? sizeof g_primaryweapons : sizeof g_secondaryweapons

  	if(start >= maxitem)
    		start = pos = g_menuposition[id]
	
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L\w^n^n", id, menuid == MENU_PRIMARY ? "MENU_TITLE2" : "MENU_TITLE3")

	static end
	end = start + 8
	if(end > maxitem)
    		end = maxitem
	
	static keys
	keys = MENU_KEY_0
	
	static a, b
	b = 0
	
  	for(a = start; a < end; ++a) 
	{
		keys |= (1<<b)
		len += formatex(menubody[len], 511 - len,"\r%d.\w %s^n", ++b, menuid == MENU_PRIMARY ? g_primaryweapons[a][0]: g_secondaryweapons[a][0])
  	}

  	if(end != maxitem)
	{
    		formatex(menubody[len], 511 - len, "^n\r9.\w %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
    		keys |= MENU_KEY_9
  	}
  	else	
		formatex(menubody[len], 511 - len, "^n\r0.\w %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
	
  	show_menu(id, keys, menubody, -1, menuid == MENU_PRIMARY ? "Primary" : "Secondary")
}

public action_prim(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED

	switch(key)
	{
    		case 8: display_weaponmenu(id, MENU_PRIMARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_PRIMARY, --g_menuposition[id])
    		default:
		{
			g_player_weapons[id][0] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_PRI)
			
			display_weaponmenu(id, MENU_SECONDARY, g_menuposition[id] = 0)
		}
	}
	return PLUGIN_HANDLED
}

public action_sec(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key) 
	{
    		case 8: display_weaponmenu(id, MENU_SECONDARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_SECONDARY, --g_menuposition[id])
    		default:
		{
			g_menufailsafe[id] = false
			remove_task(TASKID_WEAPONSMENU + id)
			
			g_player_weapons[id][1] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_SEC)
			equipweapon(id, EQUIP_GREN)
		}
	}
	return PLUGIN_HANDLED
}

public ClassCmd( id, szMenu, szItem ) {

	if( szItem == MENU_EXIT ) {

		menu_destroy( szMenu );
		return PLUGIN_HANDLED;
	}

	new szData[ 6 ], szName[ 64 ];
	new iAccess, iCallBack;

	menu_item_getinfo( szMenu, szItem, iAccess, szData, 5, szName, 63, iCallBack );
	new iKey = str_to_num( szData );

	if( g_class_data[ iKey ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) ) {

		ColorChat( id, "%L", id, "MENU_CLASSONLYVIP", g_class_name[ iKey ] );
		cmd_classmenu( id );
	}

	else {

		g_mutate[ id ] = iKey;
		ColorChat( id, "%L", id, "MENU_CHANGECLASS", g_class_name[ g_mutate[ id ] ] );
	}

	menu_destroy( szMenu );
	return PLUGIN_HANDLED;
}

public register_spawnpoints(const mapname[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new csdmfile[64], line[64], data[10][6]
	formatex(csdmfile, 63, "%s/csdm/%s.spawns.cfg", configdir, mapname)

	if(file_exists(csdmfile))
	{
		new file
		file = fopen(csdmfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 63)
			if(!line[0] || str_count(line,' ') < 2) 
				continue

			parse(line, data[0], 5, data[1], 5, data[2], 5, data[3], 5, data[4], 5, data[5], 5, data[6], 5, data[7], 5, data[8], 5, data[9], 5)

			g_spawns[g_spawncount][0] = floatstr(data[0]), g_spawns[g_spawncount][1] = floatstr(data[1])
			g_spawns[g_spawncount][2] = floatstr(data[2]), g_spawns[g_spawncount][3] = floatstr(data[3])
			g_spawns[g_spawncount][4] = floatstr(data[4]), g_spawns[g_spawncount][5] = floatstr(data[5])
			g_spawns[g_spawncount][6] = floatstr(data[7]), g_spawns[g_spawncount][7] = floatstr(data[8])
			g_spawns[g_spawncount][8] = floatstr(data[9])
			
			if(++g_spawncount >= MAX_SPAWNS) 
				break
		}
		if(file) 
			fclose(file)
	}
}

public register_zombieclasses(filename[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new configfile[64]
	formatex(configfile, 63, "%s/%s", configdir, filename)

	if(get_pcvar_num(cvar_zombie_class) && file_exists(configfile))
	{			
		new line[128], leftstr[32], rightstr[64],  classname[32], data[MAX_DATA], i
		
		new file
		file = fopen(configfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 127), trim(line)
			if(!line[0] || line[0] == ';') continue
			
			if(line[0] == '[' && line[strlen(line) - 1] == ']')
			{
				copy(classname, strlen(line) - 2, line[1])

				if(register_class(classname) == -1)
					break
				
				continue
			}
			strtok(line, leftstr, 31, rightstr, 63, '=', 1)
				
			if(equali(leftstr, "DESC"))
				copy(g_class_desc[g_classcount - 1], 31, rightstr)
			else if(equali(leftstr, "PMODEL"))
				copy(g_class_pmodel[g_classcount - 1], 63, rightstr)
			else if(equali(leftstr, "WMODEL"))
				copy(g_class_wmodel[g_classcount - 1], 63, rightstr)
				
			for(i = 0; i < MAX_DATA; i++)
				data[i] = equali(leftstr, g_dataname[i])
				
			for(i = 0; i < MAX_DATA; i++) if(data[i])
			{
				g_class_data[g_classcount - 1][i] = floatstr(rightstr)
				break
			}
		}
		if(file) fclose(file)
	} 
	else 
		register_class("default")
}

public register_class(classname[])
{
	if(g_classcount >= MAX_CLASSES)
		return -1
	
	copy(g_class_name[g_classcount], 31, classname)
	copy(g_class_pmodel[g_classcount], 63, DEFAULT_PMODEL)
	copy(g_class_wmodel[g_classcount], 63, DEFAULT_WMODEL)
		
	g_class_data[g_classcount][DATA_HEALTH] = DEFAULT_HEALTH
	g_class_data[g_classcount][DATA_SPEED] = DEFAULT_SPEED	
	g_class_data[g_classcount][DATA_GRAVITY] = DEFAULT_GRAVITY
	g_class_data[g_classcount][DATA_ATTACK] = DEFAULT_ATTACK
	g_class_data[g_classcount][DATA_REGENDLY] = DEFAULT_REGENDLY
	g_class_data[g_classcount][DATA_KNOCKBACK] = DEFAULT_KNOCKBACK
	g_class_data[g_classcount][DATA_NOFLASH] = DEFAULT_NOFLASH
	g_class_data[g_classcount][DATA_ONLYVIP] = DEFAULT_ONLYVIP
	g_classcount++
	
	return (g_classcount - 1)
}

public native_register_class(classname[], description[])
{
	param_convert(1)
	param_convert(2)
	
	static classid
	classid = register_class(classname)
	
	if(classid != -1)
		copy(g_class_desc[classid], 31, description)

	return classid
}

public native_set_class_pmodel(classid, player_model[])
{
	param_convert(2)
	copy(g_class_pmodel[classid], 63, player_model)
}

public native_set_class_wmodel(classid, weapon_model[])
{
	param_convert(2)
	copy(g_class_wmodel[classid], 63, weapon_model) 
}

public native_is_user_zombie(index)
	return g_zombie[index] == true ? 1 : 0

public native_get_user_class(index)
	return g_player_class[index]

public native_is_user_infected(index)
	return g_preinfect[index] == true ? 1 : 0

public native_game_started()
	return g_gamestarted

public native_preinfect_user(index, bool:yesno)
{
	if(is_user_alive(index) && !g_gamestarted)
		g_preinfect[index] = yesno
}

public native_infect_user(victim, attacker)
{
	if(allow_infection() && g_gamestarted)
		infect_user(victim, attacker)
}

public native_cure_user(index)
	cure_user(index)

public native_get_class_id(classname[])
{
	param_convert(1)
	
	static i
	for(i = 0; i < g_classcount; i++)
	{
		if(equali(classname, g_class_name[i]))
			return i
	}
	return -1
}

public Float:native_get_class_data(classid, dataid)
	return g_class_data[classid][dataid]

public native_set_class_data(classid, dataid, Float:value)
	g_class_data[classid][dataid] = value

public native_get_humans(  ) {

	static iHumans;
	iHumans = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && !g_zombie[ id ] ) 
			iHumans++;
	}

	return iHumans;
}

public native_get_zombies(  ) {

	static iZombies;
	iZombies = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && g_zombie[ id ] ) 
			iZombies++;
	}

	return iZombies;
}

stock bool:fm_is_hull_vacant(const Float:origin[3], hull)
{
	static tr
	tr = 0
	
	engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, tr)
	return (!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen)) ? true : false
}

stock fm_set_kvd(entity, const key[], const value[], const classname[] = "") 
{
	set_kvd(0, KV_ClassName, classname)
	set_kvd(0, KV_KeyName, key)
	set_kvd(0, KV_Value, value)
	set_kvd(0, KV_fHandled, 0)

	return dllfunc(DLLFunc_KeyValue, entity, 0)
}

stock fm_strip_user_weapons(index) 
{
	static stripent
	if(!pev_valid(stripent))
	{
		stripent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
		dllfunc(DLLFunc_Spawn, stripent), set_pev(stripent, pev_solid, SOLID_NOT)
	}
	dllfunc(DLLFunc_Use, stripent, index)
	
	return 1
}

stock fm_set_entity_visibility(index, visible = 1)
	set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)

stock fm_find_ent_by_owner(index, const classname[], owner) 
{
	static ent
	ent = index
	
	while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) && pev(ent, pev_owner) != owner) {}
	
	return ent
}

stock bacon_give_weapon(index, weapon[])
{
	if(!equal(weapon,"weapon_", 7))
		return 0

	static ent
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon))
	
	if(!pev_valid(ent)) 
		return 0
    
	set_pev(ent, pev_spawnflags, SF_NORESPAWN)
	dllfunc(DLLFunc_Spawn, ent)
   
	if(!ExecuteHamB(Ham_AddPlayerItem, index, ent))
	{
		if(pev_valid(ent)) set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
		return 0
	}
	ExecuteHamB(Ham_Item_AttachToPlayer, ent, index)

	return 1
}

stock bacon_strip_weapon(index, weapon[])
{
	if(!equal(weapon, "weapon_", 7)) 
		return 0

	static weaponid 
	weaponid = get_weaponid(weapon)
	
	if(!weaponid) 
		return 0

	static weaponent
	weaponent = fm_find_ent_by_owner(-1, weapon, index)
	
	if(!weaponent) 
		return 0

	if(get_user_weapon(index) == weaponid) 
		ExecuteHamB(Ham_Weapon_RetireWeapon, weaponent)

	if(!ExecuteHamB(Ham_RemovePlayerItem, index, weaponent)) 
		return 0
	
	ExecuteHamB(Ham_Item_Kill, weaponent)
	set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<weaponid))

	return 1
}

stock fm_set_user_team( index, team, update = 1 ) {

	set_pdata_int( index, OFFSET_TEAM, team );

	if( update ) {

		emessage_begin( MSG_ALL, g_msg_teaminfo );
		ewrite_byte( index );
		ewrite_string( g_teaminfo[ team ] );
		emessage_end(  );
	}
	return 1;
}

stock fm_get_user_bpammo(index, weapon)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	return offset ? get_pdata_int(index, offset) : 0
}

stock fm_set_user_bpammo(index, weapon, amount)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	
	if(offset) 
		set_pdata_int(index, offset, amount)
	
	return 1
}

stock fm_set_user_rendering( iEntity, fx = kRenderFxNone, Red = 255, Green = 255, Blue = 255, iRender = kRenderNormal, Amount = 16 ) {

	new Float:RenderColor[ 3 ];
	RenderColor[ 0 ] = float( Red );
	RenderColor[ 1 ] = float( Green );
	RenderColor[ 2 ] = float( Blue );

	set_pev( iEntity, pev_renderfx, fx );
	set_pev( iEntity, pev_rendercolor, RenderColor );
	set_pev( iEntity, pev_rendermode, iRender );
	set_pev( iEntity, pev_renderamt, float( Amount ) );

	return 1;
}

stock fm_set_user_nvg(index, onoff = 1)
{
	static nvg
	nvg = get_pdata_int(index, OFFSET_NVG)
	
	set_pdata_int(index, OFFSET_NVG, onoff == 1 ? nvg | HAS_NVG : nvg & ~HAS_NVG)
	return 1
}

stock fm_set_user_money(index, addmoney, update = 1)
{
	static money
	money = fm_get_user_money(index) + addmoney
	
	set_pdata_int(index, OFFSET_CSMONEY, money)
	
	if(update)
	{
		message_begin(MSG_ONE, g_msg_money, _, index)
		write_long(clamp(money, 0, 16000))
		write_byte(1)
		message_end()
	}
	return 1
}

stock fm_user_team_update(id)
{
	static Float:current_time
	current_time = get_gametime()
	
	if (current_time - g_teams_targettime >= 0.1)
	{
		set_task(0.1, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = current_time + 0.1
	}
	else
	{
		set_task((g_teams_targettime + 0.1) - current_time, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = g_teams_targettime + 0.1
	}
}

public fm_cs_set_user_team_msg(taskid)
{
	// Note to self: this next message can now be received by other plugins
	
	// Set the switching team flag
	g_switchingteam = true
	
	// Tell everyone my new team
	emessage_begin(MSG_ALL, g_msg_teaminfo )
	ewrite_byte(taskid - 1212) // player
	ewrite_string(CS_TEAM_NAMES[fm_get_user_team(taskid - 1212)]) // team
	emessage_end()
	
	// Done switching team
	g_switchingteam = false
}

stock str_count(str[], searchchar)
{
	static maxlen
	maxlen = strlen(str)
	
	static i, count
	count = 0
	
	for(i = 0; i <= maxlen; i++) if(str[i] == searchchar)
		count++

	return count
}

stock reset_user_model(index)
{
	set_pev(index, pev_rendermode, kRenderNormal)
	set_pev(index, pev_renderamt, 0.0)

	if(pev_valid(g_modelent[index]))
		fm_set_entity_visibility(g_modelent[index], 0)
}

stock remove_user_model(ent)
{
	static id
	id = pev(ent, pev_owner)
	
	if(pev_valid(ent)) 
		engfunc(EngFunc_RemoveEntity, ent)

	g_modelent[id] = 0
}

stock set_zombie_attibutes(index)
{
	if(!is_user_alive(index)) 
		return

	g_zombie[index] = true

	if(!task_exists(TASKID_STRIPNGIVE + index))
		set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + index)

	static Float:health
	health = g_class_data[g_player_class[index]][DATA_HEALTH]
	
	if(g_preinfect[index]) 
		health *= get_pcvar_float(cvar_zombie_hpmulti)
	
	set_pev(index, pev_health, health)
	set_pev(index, pev_gravity, g_class_data[g_player_class[index]][DATA_GRAVITY])
	set_pev(index, pev_body, 0)
	set_pev(index, pev_armorvalue, 0.0)
	set_pev(index, pev_renderamt, 0.0)
	set_pev(index, pev_rendermode, kRenderTransTexture)
	
	fm_set_user_armortype(index, CS_ARMOR_NONE)
	fm_set_user_nvg(index)
	
	if(get_pcvar_num(cvar_autonvg)) 
		engclient_cmd(index, "nightvision")
	
	if(!pev_valid(g_modelent[index]))
	{
		static ent
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		if(pev_valid(ent))
		{
			engfunc(EngFunc_SetModel, ent, g_class_pmodel[g_player_class[index]])
			set_pev(ent, pev_classname, MODEL_CLASSNAME)
			set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
			set_pev(ent, pev_aiment, index)
			set_pev(ent, pev_owner, index)
				
			g_modelent[index] = ent
		}
	}
	else
	{
		engfunc(EngFunc_SetModel, g_modelent[index], g_class_pmodel[g_player_class[index]])
		fm_set_entity_visibility(g_modelent[index], 1)
	}

	static effects
	effects = pev(index, pev_effects)
	
	if(effects & EF_DIMLIGHT)
	{
		message_begin(MSG_ONE, g_msg_flashlight, _, index)
		write_byte(0)
		write_byte(100)
		message_end()
		
		set_pev(index, pev_effects, effects & ~EF_DIMLIGHT)
	}

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 1 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

PlaySound( const szSound[  ] ) {

	client_cmd( 0, "spk ^"%s^"", szSound );
}

stock bool:allow_infection()
{
	static count[2]
	count[0] = 0
	count[1] = 0
	
	static index, maxzombies
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(is_user_connected(index) && g_zombie[index]) 
			count[0]++
		else if(is_user_alive(index)) 
			count[1]++
	}
	
	maxzombies = clamp(get_pcvar_num(cvar_maxzombies), 1, 31)
	return (count[0] < maxzombies && count[1] > 1) ? true : false
}

stock randomly_pick_zombie()
{
	static data[4]
	data[0] = 0 
	data[1] = 0 
	data[2] = 0 
	data[3] = 0
	
	static index, players[2][32]
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(!is_user_alive(index)) 
			continue
		
		if(g_zombie[index])
		{
			data[0]++
			players[0][data[2]++] = index
		}
		else 
		{
			data[1]++
			players[1][data[3]++] = index
		}
	}

	if(data[0] > 0 &&  data[1] < 1) 
		return players[0][_random(data[2])]
	
	return (data[0] < 1 && data[1] > 0) ?  players[1][_random(data[3])] : 0
}

stock equipweapon(id, weapon)
{
	if(!is_user_alive(id)) 
		return

	static weaponid[2], weaponent, weapname[32]
	
	if(weapon & EQUIP_PRI)
	{
		weaponent = fm_lastprimary(id)
		weaponid[1] = get_weaponid(g_primaryweapons[g_player_weapons[id][0]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_primaryweapons[g_player_weapons[id][0]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}

	if(weapon & EQUIP_SEC)
	{
		weaponent = fm_lastsecondry(id)
		weaponid[1] = get_weaponid(g_secondaryweapons[g_player_weapons[id][1]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_secondaryweapons[g_player_weapons[id][1]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}
	
	if(weapon & EQUIP_GREN)
	{
		static i
		for(i = 0; i < sizeof g_grenades; i++) if(!user_has_weapon(id, get_weaponid(g_grenades[i])))
			bacon_give_weapon(id, g_grenades[i])
	}
}

stock add_delay(index, const task[])
{
	switch(index)
	{
		case 1..8:   set_task(0.1, task, index)
		case 9..16:  set_task(0.2, task, index)
		case 17..24: set_task(0.3, task, index)
		case 25..32: set_task(0.4, task, index)
	}
}

stock set_biohazard_icon(id, mode, red, green, blue) {

	message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, id);
	write_byte(mode); // status (0=hide, 1=show, 2=flash)
	write_string("dmg_bio"); // sprite name
	write_byte(red); // red
	write_byte(green); // green
	write_byte(blue); // blue
	message_end();
}

stock FixedUnsigned16(Float:flValue, iScale) {
	new iOutput;
	
	iOutput = floatround(flValue * iScale);
	if(iOutput < 0)
		iOutput = 0;
	
	if(iOutput > 0xFFFF)
		iOutput = 0xFFFF;
	return iOutput;
}

stock UTIL_ScreenFade(id=0,iColor[3],Float:flFxTime=-1.0,Float:flHoldTime=0.0,iAlpha=0,iFlags=FFADE_IN,bool:bReliable=false,bool:bExternal=false) {
	if(id && !is_user_connected(id))
		return;
	
	new iFadeTime;
	if(flFxTime == -1.0) {
		iFadeTime = 4;
	}
	else {
		iFadeTime = FixedUnsigned16(flFxTime , 1<<12);
	}
	
	static gmsgScreenFade;
	if(!gmsgScreenFade) {
		gmsgScreenFade = get_user_msgid("ScreenFade");
	}
	
	new MSG_DEST;
	if(bReliable) {
		MSG_DEST = id ? MSG_ONE : MSG_ALL;
	}
	else {
		MSG_DEST = id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST;
	}
	
	if(bExternal) {
		emessage_begin(MSG_DEST, gmsgScreenFade, _, id);
		ewrite_short(iFadeTime);
		ewrite_short(FixedUnsigned16(flHoldTime , 1<<12));
		ewrite_short(iFlags);
		ewrite_byte(iColor[0]);
		ewrite_byte(iColor[1]);
		ewrite_byte(iColor[2]);
		ewrite_byte(iAlpha);
		emessage_end();
	}
	else {
		message_begin(MSG_DEST, gmsgScreenFade, _, id);
		write_short(iFadeTime);
		write_short(FixedUnsigned16(flHoldTime , 1<<12));
		write_short(iFlags);
		write_byte(iColor[0]);
		write_byte(iColor[1]);
		write_byte(iColor[2]);
		write_byte(iAlpha);
		message_end();
	}
}

#if defined GRENADE_STATUS
public GrenadeStatus(  ) {

	// Nade Status Cvar
	cvar_status = register_cvar("bio_nadestatus_icon","1") // [0=Hide | 1=Show | 2=Flash (Don't work with red color)]
	
	// Fire Grenade Cvars
	cvar_fire_icon = register_cvar("bio_firenade_icon","1") // [0=Disable | 1=Enable]
	cvar_fire_color = register_cvar("bio_firenade_color","255 0 0") // Color of Fire Nade in RGB
	
	// Frost Grenade Cvars
	cvar_frost_icon = register_cvar("bio_frostnade_icon","1") // [0=Disable | 1=Enable]
	cvar_frost_color = register_cvar("bio_frostnade_color","100 149 237") // Color of Frost Nade in RGB
	
	// Flare Grenade Cvars
	cvar_flare_icon = register_cvar("bio_flarenade_icon","1") // [0=Disable | 1=Enable]
	cvar_flare_color = register_cvar("bio_flarenade_color","255 255 255") // Color of Flare Nade in RGB

	register_event("CurWeapon", "GrenadeIcon", "be", "1=1")
	
	g_StatusIcon = get_user_msgid("StatusIcon")
}

public GrenadeIcon( id ) {

	RemoveGrenadeIcon( id );
		
	if( is_user_bot( id ) )
		return 1;
		
	static NadeType, GrenadeSprite[ 16 ], Color[ 17 ], Red[ 5 ], Green[ 5 ], Blue[ 5 ];
	NadeType = get_user_weapon( id )
	
	switch( NadeType ) {

		case CSW_HEGRENADE: {

			if( !g_zombie[ id ] ) {

				if( !get_pcvar_num( cvar_fire_icon ) )
					return 1;
				
				GrenadeSprite = "dmg_heat";
				get_pcvar_string( cvar_fire_color, Color, charsmax( Color ) );
				
			}
		}

		case CSW_FLASHBANG: {

			if( !get_pcvar_num( cvar_frost_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_cold";
			get_pcvar_string( cvar_frost_color, Color, charsmax( Color ) );
		}

		case CSW_SMOKEGRENADE: {

			if( !get_pcvar_num( cvar_flare_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_shock";
			get_pcvar_string( cvar_flare_color, Color, charsmax( Color ) );
		}

		default: return 1;
	}

	parse( Color, Red, charsmax( Red ), Green, charsmax( Green ), Blue, charsmax( Blue ) );
	g_GrenadeIcon[ id ] = GrenadeSprite;
	
	message_begin( MSG_ONE, g_StatusIcon, {0, 0, 0 }, id );
	write_byte( get_pcvar_num( cvar_status ) ) // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] ) // Sprite Name
	write_byte( str_to_num( Red ) ) // Red
	write_byte( str_to_num( Green ) ) // Green
	write_byte( str_to_num( Blue ) ) // Blue
	message_end(  );

	return 1;
}

public RemoveGrenadeIcon( id ) {

	message_begin( MSG_ONE, g_StatusIcon, { 0, 0, 0 },id );
	write_byte( 0 ); // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] );
	message_end(  )
}
#endif

stock HudMessage(const id, const message[], red = 0, green = 160, blue = 0, Float:x = -1.0, Float:y = 0.65, effects = 2, Float:fxtime = 0.01, Float:holdtime = 3.0, Float:fadeintime = 0.01, Float:fadeouttime = 0.01) {
	new count = 1, players[32];
	
	if(id) players[0] = id;
	else get_players(players, count, "ch"); {
		for(new i = 0; i < count; i++) {
			if(is_user_connected(players[i])) {	
				new color = pack_color(clamp_byte(red), clamp_byte(green), clamp_byte(blue))
				
				message_begin(MSG_ONE_UNRELIABLE, SVC_DIRECTOR, _, players[i]);
				write_byte(strlen(message) + 31);
				write_byte(DRC_CMD_MESSAGE);
				write_byte(effects);
				write_long(color);
				write_long(_:x);
				write_long(_:y);
				write_long(_:fadeintime);
				write_long(_:fadeouttime);
				write_long(_:holdtime);
				write_long(_:fxtime);
				write_string(message);
				message_end();
			}
		}
	}
}

stock ColorChat( const id, const input[  ], any:... ) {

	new iCount = 1, szPlayers[ 32 ];
	static szMsg[ 191 ];

	vformat( szMsg, 190, input, 3 );

	replace_all( szMsg, 190, "!4", "^4" );
	replace_all( szMsg, 190, "!1", "^1" );
	replace_all( szMsg, 190, "!3", "^3" );

	if( id ) {
		szPlayers[ 0 ] = id;
	} else {
		get_players( szPlayers, iCount, "ch" );
	}

	for( new i = 0; i < iCount; i++ ) {

		if( is_user_connected( szPlayers[ i ] ) ) {

			message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, szPlayers[ i ] );
			write_byte( szPlayers[ i ] );
			write_string( szMsg );
			message_end(  );
		}
	}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1048\\ f0\\ fs16 \n\\ par }
*/
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

31 Jul 2014, 21:02

| Afiseaza codul
/* Biohazard - Zombie Mod, Classic Infection with new modes
 * Author: cheap_suit, CO-Author: The YONTU
 * Credits: sDs|Aragon* */

#define PLUGIN_NAME	"Biohazard - Zombie Mod"
#define PLUGIN_VERSION	"3.1"
#define PLUGIN_AUTHOR	"cheap_suit"

#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >
#include < xs >

native get_user_golds( id );
native is_user_vip( id );

static const ServerLicensedIp[  ] = "192.168.0.10";

// Aici eliminati/adaugati slash-urile(//) din fata linii daca vreti sa fie activate/dezactivate
#define ULTRA_BLOOD	// Sare mai mult sange cand infectezi
#define GRENADE_STATUS	// Cand tii o grenada in mana in stanga sus va aparea o imagine specifica grenadei

#define FOG_ENABLE  	     1
#define FOG_DENSITY	    "0.0025"
#define FOG_COLOR   	    "128 128 128"	//"127 170 255"

#define DEFAULT_PMODEL	    "models/player/bio30_zombie/bio30_zombie.mdl"	// Zombie Model
#define DEFAULT_WMODEL	    "models/player/bio30_zombie/claws_zombie.mdl"	// Zombie Hands

#define DEFAULT_HEALTH		400.0	// Health value
#define DEFAULT_SPEED		290.0	// Speed value
#define DEFAULT_GRAVITY		0.8	// Gravity multiplier
#define DEFAULT_ATTACK		2.0	// Zombie damage multiplier
#define DEFAULT_REGENDLY	0.18	// Regeneration delay value
#define DEFAULT_KNOCKBACK	1.0	// Knockback multiplier
#define DEFAULT_NOFLASH	1.0	// Set 1.0 for Zombie No flash
#define DEFAULT_ONLYVIP		0.0	// Set 1.0 for Zombie Class Only VIP

#define clamp_byte(%1)		( clamp( %1, 0, 255 ) )
#define pack_color(%1,%2,%3)	( %3 + ( %2 << 8 ) + ( %1 << 16 ) )

#define FFADE_IN			0x0000	// Just here so we don't pass 0 into the function
#define FFADE_OUT		0x0001	// Fade out (not in)
#define FFADE_MODULATE		0x0002	// Modulate (don't blend)
#define FFADE_STAYOUT		0x0004	// ignores the duration, stays faded out until new ScreenFade message received
#define UNIT_SECOND		(1<<12)

#define OFFSET_DEATH 		444
#define OFFSET_TEAM 		114
#define OFFSET_ARMOR 		112
#define OFFSET_NVG 		129
#define OFFSET_CSMONEY 		115
#define OFFSET_PRIMARYWEAPON 	116
#define OFFSET_WEAPONTYPE 	43
#define OFFSET_CLIPAMMO		51
#define EXTRAOFFSET_WEAPONS 	4

#define OFFSET_AMMO_338MAGNUM 	377
#define OFFSET_AMMO_762NATO 		378
#define OFFSET_AMMO_556NATOBOX 	379
#define OFFSET_AMMO_556NATO 		380
#define OFFSET_AMMO_BUCKSHOT 		381
#define OFFSET_AMMO_45ACP 		382
#define OFFSET_AMMO_57MM 		383
#define OFFSET_AMMO_50AE 		384
#define OFFSET_AMMO_357SIG 		385
#define OFFSET_AMMO_9MM 		386

#define OFFSET_LASTPRIM 	368
#define OFFSET_LASTSEC 		369
#define OFFSET_LASTKNI 		370

#define TASKID_COUNTDOWN		452
#define TASKID_STRIPNGIVE		698
#define TASKID_NEWROUND		641
#define TASKID_INITROUND 		222
#define TASKID_STARTROUND 		153
#define TASKID_BALANCETEAM 		375
#define TASKID_UPDATESCR 		264
#define TASKID_SPAWNDELAY 		786
#define TASKID_WEAPONSMENU 		564
#define TASKID_CHECKSPAWN 		423
#define TASKID_CZBOTPDATA 		312
#define TASK_GLOW_DIE			1212

#define EQUIP_PRI 	(1<<0)
#define EQUIP_SEC 	(1<<1)
#define EQUIP_GREN 	(1<<2)
#define EQUIP_ALL 	(1<<0 | 1<<1 | 1<<2)

#define HAS_NVG 	(1<<0)
#define ATTRIB_BOMB 	(1<<1)
#define DMG_HEGRENADE 	(1<<24)

#define MODEL_CLASSNAME 	"player_model"
#define IMPULSE_FLASHLIGHT 	100

#define MAX_SPAWNS 	128
#define MAX_CLASSES 	14
#define MAX_DATA 	13

#define DATA_HEALTH 	0
#define DATA_SPEED 	1
#define DATA_GRAVITY 	2
#define DATA_ATTACK 	3
#define DATA_REGENDLY 	4
#define DATA_KNOCKBACK 	5
#define DATA_NOFLASH 	6
#define DATA_ONLYVIP 	7

#define fm_get_user_team(%1) get_pdata_int(%1, OFFSET_TEAM)
#define fm_get_user_deaths(%1) get_pdata_int(%1, OFFSET_DEATH)
#define fm_set_user_deaths(%1,%2) set_pdata_int(%1, OFFSET_DEATH, %2)
#define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CSMONEY)
#define fm_get_user_armortype(%1) get_pdata_int(%1, OFFSET_ARMOR)
#define fm_set_user_armortype(%1,%2) set_pdata_int(%1, OFFSET_ARMOR, %2)
#define fm_get_weapon_id(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define fm_get_weapon_ammo(%1) get_pdata_int(%1, OFFSET_CLIPAMMO, EXTRAOFFSET_WEAPONS)
#define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
#define fm_reset_user_primary(%1) set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
#define fm_lastprimary(%1) get_pdata_cbase(id, OFFSET_LASTPRIM)
#define fm_lastsecondry(%1) get_pdata_cbase(id, OFFSET_LASTSEC)
#define fm_lastknife(%1) get_pdata_cbase(id, OFFSET_LASTKNI)
#define fm_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), "model", %2, %3) 

#define _random(%1) random_num(0, %1 - 1)
#define AMMOWP_NULL (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

enum
{
	MAX_CLIP = 0,
	MAX_AMMO
}

enum
{
	MENU_PRIMARY = 1,
	MENU_SECONDARY
}

enum
{
	CS_TEAM_UNASSIGNED = 0,
	CS_TEAM_T,
	CS_TEAM_CT,
	CS_TEAM_SPECTATOR
}

enum
{
	CS_ARMOR_NONE = 0,
	CS_ARMOR_KEVLAR,
	CS_ARMOR_VESTHELM
}

enum
{
	KBPOWER_357SIG = 0,
	KBPOWER_762NATO,
	KBPOWER_BUCKSHOT,
	KBPOWER_45ACP,
	KBPOWER_556NATO,
	KBPOWER_9MM,
	KBPOWER_57MM,
	KBPOWER_338MAGNUM,
	KBPOWER_556NATOBOX,
	KBPOWER_50AE
}

new g_zombie_weapname[] = "melee"
new g_infection_name[]  = "infection"

// primary weapons (menu|game)
new g_primaryweapons[][][] = 
{ 
	{ "M4A1 Carbine",     "weapon_m4a1"    },
	{ "AK-47 Kalashnikov",     "weapon_ak47"    },
	{ "Steyr AUG A1",      "weapon_aug"     },
	{ "SG-552 Commando",    "weapon_sg552"   },
	//{ "Galil",    "weapon_galil"   },
	{ "Famas",    "weapon_famas"   },
	{ "MP5 Navy", "weapon_mp5navy" },
	{ "XM1014 M4",   "weapon_xm1014"  },
	{ "M3 Super 90",       "weapon_m3"      },
	//{ "P90",      "weapon_p90"     },
	{ "M249 Para Machinegun",     "weapon_m249"    },
	{ "SG-550 Auto-Sniper",    "weapon_sg550"   },
	{ "G3SG1 Auto-Sniper",    "weapon_g3sg1"   },
	{ "AWP Magnum Sniper",    "weapon_awp"   }	
}

// secondary weapons (menu|game)
new g_secondaryweapons[][][] = 
{ 
	{ "Desert Eagle .50 AE",   "weapon_deagle"  },
	{ "USP .45 ACP Tactical",      "weapon_usp"     },
	{ "Dual Elite Berettas",    "weapon_elite"   },
	{ "Glock 18C",    "weapon_glock18"   }
}

// grenade loadout (game)
new g_grenades[][] = 
{ 
	"weapon_hegrenade",
	"weapon_flashbang",
	"weapon_smokegrenade"
}

new Float:g_knockbackpower[] =
{
	3.0,  // KBPOWER_357SIG
	4.0,  // KBPOWER_762NATO
	9.5,  // KBPOWER_BUCKSHOT
	3.0,  // KBPOWER_45ACP
	4.5,  // KBPOWER_556NATO
	3.0,  // KBPOWER_9MM
	3.5,  // KBPOWER_57MM
	12.0, // KBPOWER_338MAGNUM
	4.0,  // KBPOWER_556NATOBOX
	3.8   // KBPOWER_50AE
}

new g_appear_sounds[  ][  ] = {

	"Biohazard30/zombie_coming_1.wav",
	"Biohazard30/zombie_coming_2.wav",
	"Biohazard30/zombie_coming_3.wav",
	"Biohazard30/zombie_comeback.wav"
}

new g_survivor_win_sounds[][] =
{
	"Biohazard30/survivor_win1.wav",
	"Biohazard30/survivor_win2.wav",
	"Biohazard30/survivor_win3.wav"
}

new g_zombie_win_sounds[][] = 
{ 
	"Biohazard30/zombie_win1.wav",
	"Biohazard30/zombie_win2.wav",
	"Biohazard30/zombie_win3.wav"	
}

new g_scream_sounds[][] = 
{ 
	"Biohazard30/zombie_infec1.wav",
	"Biohazard30/zombie_infec2.wav",
	"Biohazard30/zombie_infec3.wav"
}

new g_zombie_miss_sounds[][] = 
{ 
	"zombie/claw_miss1.wav",
	"zombie/claw_miss2.wav"				
}

new g_zombie_hit_sounds[][] = 
{ 
	"zombie/claw_strike1.wav",
	"zombie/claw_strike2.wav",
	"zombie/claw_strike3.wav"
}

new g_zombie_die_sounds[][] = 
{
	"Biohazard30/zombie_die1.wav",
	"Biohazard30/zombie_die2.wav",
	"Biohazard30/zombie_die3.wav",
	"Biohazard30/zombie_die4.wav",
	"Biohazard30/zombie_die5.wav"
}

new CountDownSounds[][] = {

	"Biohazard30/Countdown/timer01.wav",
	"Biohazard30/Countdown/timer02.wav",
	"Biohazard30/Countdown/timer03.wav",
	"Biohazard30/Countdown/timer04.wav",
	"Biohazard30/Countdown/timer05.wav",
	"Biohazard30/Countdown/timer06.wav",
	"Biohazard30/Countdown/timer07.wav",
	"Biohazard30/Countdown/timer08.wav",
	"Biohazard30/Countdown/timer09.wav",
	"Biohazard30/Countdown/timer10.wav"
}

new const g_weapon_ammo[  ][  ] = {

	{ -1, -1 },	// NULL
	{ 13, 52 },	// CSW_P228
	{ -1, -1 },	// NULL
	{ 15, 75 },	// CSW_SCOUT
	{ -1, -1 },	// CSW_HEGRENADE
	{ 15, 30 },	// CSW_XM1014
	{ -1, -1 },	// CSW_C4
	{ 35, 140 },	// CSW_MAC10
	{ 40, 120 },	// CSW_AUG
	{ -1, -1 },	// CSW_SMOKEGRENADE
	{ 30, 150 },	// CSW_ELITE
	{ 20, 100 },	// CSW_FIVESEVEN
	{ 25, 100 },	// CSW_UMP45
	{ 40, 80 },	// CSW_SG550
	{ 40, 160 },	// CSW_GALIL
	{ 30, 120 },	// CSW_FAMAS
	{ 20, 160 },	// CSW_USP
	{ 20, 120 },	// CSW_GLOCK18
	{ 3, 30 },	// CSW_AWP
	{ 40, 120 },	// CSW_MP5NAVY
	{ 100, 200 },	// CSW_M249
	{ 13, 39 },	// CSW_M3
	{ 45, 90 },	// CSW_M4A1
	{ 30, 120 },	// CSW_TMP
	{ 20, 60 },	// CSW_G3SG1
	{ -1, -1 },	// CSW_FLASHBANG
	{ 15, 45 },	// CSW_DEAGLE
	{ 25, 125 },	// CSW_SG552
	{ 40, 120 },	// CSW_AK47
	{ -1, -1 },	// CSW_KNIFE
	{ 50, 130 }	// CSW_P90
}

new const g_weapon_knockback[] =
{
	-1, 
	KBPOWER_357SIG, 
	-1, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_BUCKSHOT, 
	-1, 
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	-1, 
	KBPOWER_9MM, 
	KBPOWER_57MM,
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_45ACP,
	KBPOWER_9MM, 
	KBPOWER_338MAGNUM,
	KBPOWER_9MM, 
	KBPOWER_556NATOBOX,
	KBPOWER_BUCKSHOT, 
	KBPOWER_556NATO, 
	KBPOWER_9MM, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_50AE, 
	KBPOWER_556NATO, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_57MM
}

new const CS_TEAM_NAMES[  ][  ] = {

	  "UNASSIGNED"
	, "TERRORIST"
	, "CT"
	, "SPECTATOR"
}

new const g_remove_entities[][] = 
{ 
	"func_bomb_target",    
	"info_bomb_target", 
	"hostage_entity",      
	"monster_scientist", 
	"func_hostage_rescue", 
	"info_hostage_rescue",
	"info_vip_start",      
	"func_vip_safetyzone", 
	"func_escapezone",     
	"func_buyzone"
}

new const g_dataname[][] = 
{ 
	"HEALTH", 
	"SPEED", 
	"GRAVITY", 
	"ATTACK", 
	"REGENDLY", 
	"KNOCKBACK",
	"NOFLASH",
	"ONLYVIP"
}

new const g_teaminfo[][] = 
{ 
	"UNASSIGNED", 
	"TERRORIST",
	"CT",
	"SPECTATOR" 
}

new SkyTermination[  ][  ] = {

	"bk",
	"dn",
	"ft",
	"lf",
	"rt",
	"up"
}

// Global Vars
new CountDownDelay;
new g_maxplayers;
new g_spawncount;
new g_buyzone;
new g_botclient_pdata;
new g_menuposition[33];
new g_player_weapons[33][2];

// Sync HUD
new g_sync_hpdisplay;
new g_sync_msgdisplay;

// Forwards
new g_fwd_spawn;
new g_fwd_result;
new g_fwd_infect;
new g_fwd_gamestart; 

// Messages
new g_msg_flashlight;
new g_msg_teaminfo;
new g_msg_scoreattrib;
new g_msg_money;
new g_msg_scoreinfo;
new g_msg_deathmsg;
new g_msg_screenfade;

new Float:g_buytime;
new Float:g_spawns[MAX_SPAWNS+1][9];
new Float:g_vecvel[3];
new Float:g_teams_targettime;
new g_switchingteam;

// Global Booleans without parametres
new bool:g_brestorevel;
new bool:g_infecting;
new bool:g_gamestarted;
new bool:g_roundstarted;
new bool:g_roundended;
new bool:g_czero;

// Global Booleans with parametres
new bool:g_disconnected[33];	// Is user Disconnected
new bool:g_blockmodel[33];	// Block Model ?
new bool:g_showmenu[33];	// Show menu ?
new bool:g_menufailsafe[33];	// Show menu fail ?
new bool:g_welcomemsg[33];	// Display welcom msg ?
new bool:g_suicide[33];	// Is user suicided ?

// Zombie Classes & Zombie Configuration
new bool:g_zombie[33];	// Is user Zombie ?
new bool:g_falling[33];	// Is user Touch floor ?
new bool:g_preinfect[33];	// Is user preinfect ?
new g_classcount;
new g_class_name[MAX_CLASSES+1][32];
new g_class_desc[MAX_CLASSES+1][32];
new g_class_pmodel[MAX_CLASSES+1][64];
new g_class_wmodel[MAX_CLASSES+1][64];
new Float:g_class_data[MAX_CLASSES+1][MAX_DATA];
new g_player_class[33];
new Float:g_regendelay[33];
//new Float:g_hitdelay[33];
new g_mutate[33];
new g_victim[33];
new g_modelent[33];

// Cvars
new cvar_randomspawn;
new cvar_skyname;
new cvar_autoteambalance[4];
new cvar_starttime;
new cvar_countdown;
new cvar_autonvg;
new cvar_winsounds;
new cvar_weaponsmenu;
new cvar_lights;
new cvar_killbonus;
new cvar_enabled;
new cvar_gamedescription;
new cvar_botquota;
new cvar_maxzombies;
new cvar_flashbang;
new cvar_buytime;
new cvar_respawnaszombie;
new cvar_punishsuicide;
new cvar_infectmoney;
new cvar_showtruehealth;
new cvar_obeyarmor;
new cvar_impactexplode;
new cvar_caphealthdisplay;
new cvar_zombie_hpmulti;
new cvar_randomclass;
new cvar_zombiemulti;
new cvar_ammo;
new cvar_killreward;
new cvar_painshockfree;
new cvar_zombie_class;
// Knock back system
new cvar_shootobjects;
new cvar_pushpwr_weapon;
new cvar_pushpwr_zombie;
new cvar_knockback_duck;
new cvar_knockback;
new cvar_knockback_dist;
new cvar_biohazard_icon;
new cvar_entrie_class_vip;
new cvar_zombie_appear_sound;

#if defined GRENADE_STATUS
// Cvars
new cvar_status;
new cvar_fire_icon;
new cvar_fire_color;
new cvar_frost_icon;
new cvar_frost_color;
new cvar_flare_icon;
new cvar_flare_color;
// Vars
new g_StatusIcon;
new g_GrenadeIcon[ 33 ][ 32 ];
#endif

public plugin_precache()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );
		register_cvar( "bh_version", PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER );
		set_cvar_string( "bh_version", PLUGIN_VERSION );
	
		cvar_enabled = register_cvar("bh_enabled", "1")

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_gamedescription = register_cvar("bh_gamedescription", "Biohazard v3.1b")
		cvar_skyname = register_cvar("bh_skyname", "siv2")
		cvar_lights = register_cvar("bh_lights", "d")
		cvar_starttime = register_cvar("bh_starttime", "15.0")
		cvar_countdown = register_cvar("bh_countdown", "1")
		cvar_buytime = register_cvar("bh_buytime", "0")
		cvar_randomspawn = register_cvar("bh_randomspawn", "1")
		cvar_punishsuicide = register_cvar("bh_punishsuicide", "1")
		cvar_winsounds = register_cvar("bh_winsounds", "1")
		cvar_autonvg = register_cvar("bh_autonvg", "1")
		cvar_respawnaszombie = register_cvar("bh_respawnaszombie", "1")
		cvar_painshockfree = register_cvar("bh_painshockfree", "1")
		cvar_knockback = register_cvar("bh_knockback", "1")
		cvar_knockback_duck = register_cvar("bh_knockback_duck", "1")
		cvar_knockback_dist = register_cvar("bh_knockback_dist", "280.0")
		cvar_obeyarmor = register_cvar("bh_obeyarmor", "0")
		cvar_infectmoney = register_cvar("bh_infectionmoney", "1000")
		cvar_biohazard_icon = register_cvar("bh_biohazard_icon", "1")
		cvar_caphealthdisplay = register_cvar("bh_caphealthdisplay", "1")
		cvar_weaponsmenu = register_cvar("bh_weaponsmenu", "1")
		cvar_ammo = register_cvar("bh_ammo", "1")
		cvar_maxzombies = register_cvar("bh_maxzombies", "31")
		cvar_flashbang = register_cvar("bh_flashbang", "1")
		cvar_impactexplode = register_cvar("bh_impactexplode", "1")
		cvar_showtruehealth = register_cvar("bh_showtruehealth", "1")
		cvar_zombiemulti = register_cvar("bh_zombie_countmulti", "0.15")
		cvar_zombie_hpmulti = register_cvar("bh_zombie_hpmulti", "10000.0")
		cvar_zombie_class = register_cvar("bh_zombie_class", "1")
		cvar_randomclass = register_cvar("bh_randomclass", "1")
		cvar_killbonus = register_cvar("bh_kill_bonus", "1")
		cvar_killreward = register_cvar("bh_kill_reward", "2")
		cvar_shootobjects = register_cvar("bh_shootobjects", "1")
		cvar_pushpwr_weapon = register_cvar("bh_pushpwr_weapon", "2.0")
		cvar_pushpwr_zombie = register_cvar("bh_pushpwr_zombie", "5.0")
		cvar_entrie_class_vip = register_cvar("bh_entrie_class_only_vip", "0")
		cvar_zombie_appear_sound = register_cvar( "bh_zombie_appear_sound", "2" );
	
		new file[64]
		get_configsdir(file, 63)
		format(file, 63, "%s/bh_cvars.cfg", file)
	
		if(file_exists(file)) 
			server_cmd( "exec %s", file)
	
		new mapname[32]
		get_mapname(mapname, 31)
		register_spawnpoints(mapname)
		
		register_zombieclasses("bh_zombieclass.ini")
		register_dictionary("biohazard.txt")
	
		precache_model(DEFAULT_PMODEL)
		precache_model(DEFAULT_WMODEL)
	
		new i
		for(i = 0; i < g_classcount; i++)
		{
			precache_model(g_class_pmodel)
			precache_model(g_class_wmodel)
		}

		for( i = 0; i < sizeof g_appear_sounds; i++ )
			precache_sound( g_appear_sounds[ i ] );
	
		for(i = 0; i < sizeof g_zombie_miss_sounds; i++)
			precache_sound(g_zombie_miss_sounds)
	
		for(i = 0; i < sizeof g_zombie_hit_sounds; i++) 
			precache_sound(g_zombie_hit_sounds)
	
		for(i = 0; i < sizeof g_scream_sounds; i++) 
			precache_sound(g_scream_sounds)
	
		for(i = 0; i < sizeof g_zombie_die_sounds; i++)
			precache_sound(g_zombie_die_sounds)
	
		for(i = 0; i < sizeof g_zombie_win_sounds; i++) 
			precache_sound(g_zombie_win_sounds)

		for(i = 0; i < sizeof CountDownSounds; i++)
			precache_sound(CountDownSounds)

		for(i = 0; i < sizeof g_survivor_win_sounds; i++)
			precache_sound(g_survivor_win_sounds)

		// Sky Changer
		new SkyName[ 32 ];
		get_pcvar_string( cvar_skyname, SkyName, 31 );
	
		if( strlen( SkyName ) > 0 )
			set_cvar_string( "sv_skyname", SkyName );

		for( i = 0; i < sizeof SkyTermination; ++i ) {

			new Sky[ 64 ];
			formatex( Sky, sizeof( Sky ) - 1, "gfx/env/%s%s.tga", SkyName, SkyTermination[ i ] );
			precache_generic( Sky );
		}
	
		g_fwd_spawn = register_forward(FM_Spawn, "fwd_spawn")
	
		g_buyzone = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"))
		if(g_buyzone) 
		{
			dllfunc(DLLFunc_Spawn, g_buyzone)
			set_pev(g_buyzone, pev_solid, SOLID_NOT)
		}
	
		new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_bomb_target"))
		if(ent) 
		{
			dllfunc(DLLFunc_Spawn, ent)
			set_pev(ent, pev_solid, SOLID_NOT)
		}

		#if FOG_ENABLE
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
		if(ent)
		{
			fm_set_kvd(ent, "density", FOG_DENSITY, "env_fog")
			fm_set_kvd(ent, "rendercolor", FOG_COLOR, "env_fog")
		}
		#endif
	}
}

public plugin_init()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_botquota = get_cvar_pointer("bot_quota")
		cvar_autoteambalance[0] = get_cvar_pointer("mp_autoteambalance")
		cvar_autoteambalance[1] = get_pcvar_num(cvar_autoteambalance[0])
		set_pcvar_num(cvar_autoteambalance[0], 0)

		register_clcmd("jointeam", "cmd_jointeam")
		register_clcmd("say /class", "cmd_classmenu")
		register_clcmd("say_team /class", "cmd_classmenu")
		register_clcmd("say /guns", "cmd_enablemenu")
		register_clcmd("say_team /guns", "cmd_enablemenu")
		register_clcmd("say /help", "cmd_helpmotd")
		register_clcmd("amx_infect", "cmd_infectuser", ADMIN_BAN, "<name or #userid>")
	
		register_menu("Equipment", 1023, "action_equip")
		register_menu("Primary", 1023, "action_prim")
		register_menu("Secondary", 1023, "action_sec")
	
		unregister_forward(FM_Spawn, g_fwd_spawn)
		register_forward(FM_CmdStart, "fwd_cmdstart")
		register_forward(FM_EmitSound, "fwd_emitsound")
		register_forward(FM_GetGameDescription, "fwd_gamedescription")
		register_forward(FM_CreateNamedEntity, "fwd_createnamedentity")
		register_forward(FM_ClientKill, "fwd_clientkill")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink_post", 1)
		register_forward(FM_PlayerPostThink, "fwd_player_postthink")
		register_forward(FM_SetClientKeyValue, "fwd_setclientkeyvalue")

		RegisterHam(Ham_TakeDamage, "player", "bacon_takedamage_player")
		RegisterHam(Ham_Killed, "player", "bacon_killed_player")
		RegisterHam(Ham_Spawn, "player", "bacon_spawn_player_post", 1)
		RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
		RegisterHam(Ham_TraceAttack, "func_pushable", "bacon_traceattack_pushable")
		RegisterHam(Ham_Use, "func_tank", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankmortar", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankrocket", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tanklaser", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_pushable", "bacon_use_pushable")
		RegisterHam(Ham_Touch, "func_pushable", "bacon_touch_pushable")
		RegisterHam(Ham_Touch, "weaponbox", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "armoury_entity", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "weapon_shield", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "grenade", "bacon_touch_grenade")
		RegisterHam(Ham_Item_Deploy , "weapon_knife", "bacon_claws_deploy_post", 1);

		register_message(get_user_msgid("Health"), "msg_health")
		register_message(get_user_msgid("TextMsg"), "msg_textmsg")
		register_message(get_user_msgid("SendAudio"), "msg_sendaudio")
		register_message(get_user_msgid("StatusIcon"), "msg_statusicon")
		register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
		register_message(get_user_msgid("DeathMsg"), "msg_deathmsg")
		register_message(get_user_msgid("ScreenFade"), "msg_screenfade")
		register_message(get_user_msgid("TeamInfo"), "msg_teaminfo")
		register_message(get_user_msgid("ClCorpse"), "msg_clcorpse")
		register_message(get_user_msgid("WeapPickup"), "msg_weaponpickup")
		register_message(get_user_msgid("AmmoPickup"), "msg_ammopickup")

		register_event("TextMsg", "event_textmsg", "a", "2=#Game_will_restart_in")
		register_event("HLTV", "event_newround", "a", "1=0", "2=0")
		register_event("CurWeapon", "event_curweapon", "be", "1=1")
		register_event("ArmorType", "event_armortype", "be")
		register_event("Damage", "event_damage", "be")
	
		register_logevent("logevent_round_start", 2, "1=Round_Start")
		register_logevent("logevent_round_end", 2, "1=Round_End")
	
		g_msg_flashlight = get_user_msgid("Flashlight")
		g_msg_teaminfo = get_user_msgid("TeamInfo")
		g_msg_scoreattrib = get_user_msgid("ScoreAttrib")
		g_msg_scoreinfo = get_user_msgid("ScoreInfo")
		g_msg_deathmsg = get_user_msgid("DeathMsg")
		g_msg_money = get_user_msgid("Money")
		g_msg_screenfade = get_user_msgid("ScreenFade")
	
		g_fwd_infect = CreateMultiForward("event_infect", ET_IGNORE, FP_CELL, FP_CELL)
		g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_IGNORE)

		g_sync_hpdisplay = CreateHudSyncObj()
		g_sync_msgdisplay = CreateHudSyncObj()
	
		g_maxplayers = get_maxplayers()
	
		new mod[3]
		get_modname(mod, 2)
		g_czero = (mod[0] == 'c' && mod[1] == 'z') ? true : false
	
		// Lights Map
		new lights[2]
		get_pcvar_string(cvar_lights, lights, 1)
	
		if(strlen(lights) > 0)
		{
			set_task(3.0, "task_lights", _, _, _, "b")
		
			set_cvar_num("sv_skycolor_r", 0)
			set_cvar_num("sv_skycolor_g", 0)
			set_cvar_num("sv_skycolor_b", 0)
		}
	
		// Show Details
		if(get_pcvar_num(cvar_showtruehealth))
			set_task(0.1, "task_showtruehealth", _, _, _, "b")

#if defined GRENADE_STATUS
		GrenadeStatus(  );
#endif

		server_print( "[Biohazard 3.1] Felicitari! Detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
	} else {

		server_print( "[Biohazard 3.1] Nu detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
		server_print( "[Biohazard 3.1] Pentru mai multe detalii contacteaza-ma la Y!M: [email protected] !" );

		pause( "ade" );
	}
}

public plugin_end()
	if(get_pcvar_num(cvar_enabled))
		set_pcvar_num(cvar_autoteambalance[0], cvar_autoteambalance[1])

public plugin_natives()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_library("biohazardf")
		register_native("preinfect_user", "native_preinfect_user", 1)
		register_native("infect_user", "native_infect_user", 1)
		register_native("cure_user", "native_cure_user", 1)
		register_native("register_class", "native_register_class", 1)
		register_native("get_class_id", "native_get_class_id", 1)
		register_native("set_class_pmodel", "native_set_class_pmodel", 1)
		register_native("set_class_wmodel", "native_set_class_wmodel", 1)
		register_native("set_class_data", "native_set_class_data", 1)
		register_native("get_class_data", "native_get_class_data", 1)
		register_native("game_started", "native_game_started", 1)
		register_native("is_user_zombie", "native_is_user_zombie", 1)
		register_native("is_user_infected", "native_is_user_infected", 1)
		register_native("get_user_class", "native_get_user_class",  1)
		register_native("get_humans", "native_get_humans", 1)
		register_native("get_zombies", "native_get_zombies", 1)
	}
}

public client_connect(id)
{
	g_showmenu[id] = true
	g_welcomemsg[id] = true
	g_blockmodel[id] = true
	g_zombie[id] = false
	g_preinfect[id] = false
	g_disconnected[id] = false
	g_falling[id] = false
	g_menufailsafe[id] = false
	g_victim[id] = 0
	g_mutate[id] = -1
	g_player_class[id] = 0
	g_player_weapons[id][0] = -1
	g_player_weapons[id][1] = -1
	g_regendelay[id] = 0.0

	remove_user_model(g_modelent[id])
}

public client_putinserver(id)
{
	if(!g_botclient_pdata && g_czero) 
	{
		static param[1]
		param[0] = id
		
		if(!task_exists(TASKID_CZBOTPDATA))
			set_task(1.0, "task_botclient_pdata", TASKID_CZBOTPDATA, param, 1)
	}

	if( get_pcvar_num( cvar_entrie_class_vip ) ) {

		if( g_classcount > 1 ) {
		
			new HaveClass = false;
		
			if( is_user_bot( id ) )
				return 1;

			for( new i = 0; i < g_classcount; i++ ) {

				if( g_class_data[ i ][ DATA_ONLYVIP ] == 0.0 && is_user_vip( id ) || g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 ) {

					g_player_class[ id ] = i;
					HaveClass = true;
				}
			}
		
			if( !HaveClass ) {
				
				if( get_pcvar_num( cvar_randomclass ) && g_classcount > 1 ) {
					
					g_player_class[ id ] = _random( g_classcount );
				}
			}
		}
	}

	return 0;
}

public client_disconnect(id)
{
	remove_task(TASKID_STRIPNGIVE + id)
	remove_task(TASKID_UPDATESCR + id)
	remove_task(TASKID_SPAWNDELAY + id)
	remove_task(TASKID_WEAPONSMENU + id)
	remove_task(TASKID_CHECKSPAWN + id)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );

	g_disconnected[id] = true
	remove_user_model(g_modelent[id])
}

public cmd_jointeam(id)
{
	if(is_user_alive(id) && g_zombie[id])
	{
		ColorChat( id, "%L", id, "CMD_TEAMCHANGE")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public cmd_classmenu( id ) {

	if( is_user_connected( id ) && g_classcount ) {
		
		new ClassMenuTitle[ 64 ];
		new ClassMenu;
		
		formatex( ClassMenuTitle, sizeof( ClassMenuTitle ) - 1, "\r%L", 0, "MENU_TITLE4" );
		ClassMenu = menu_create( ClassMenuTitle, "ClassCmd" );
		
		for( new i = 0; i < g_classcount; ++i ) {
			
			new ClassInfo[ 512 ];
			
			if( g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) )
				formatex( ClassInfo, sizeof( ClassInfo ) - 1,"\d %s (\d%s) - \rOnly VIP", g_class_name[ i ], g_class_desc[ i ] );
			else
				formatex( ClassInfo, sizeof( ClassInfo ) - 1, "\w %s \r(\y%s\r)", g_class_name[ i ], g_class_desc[ i ] );
			
			new Num[ 64 ];
			formatex( Num, sizeof( Num ) - 1, "%d", i );
			menu_additem( ClassMenu, ClassInfo, Num, 0 );
		}
		
		menu_setprop( ClassMenu, MPROP_EXIT, MEXIT_ALL );
		
		menu_display( id, ClassMenu, 0 );
	}
}

public cmd_enablemenu(id)
{	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		ColorChat( id, "%L", id, g_showmenu[id] == false ? "MENU_REENABLED" : "MENU_ALENABLED")
		g_showmenu[id] = true
	}
}

public cmd_helpmotd(id)
{
	static motd[2048]
	formatex(motd, 2047, "%L", id, "HELP_MOTD")
	replace(motd, 2047, "#Version#", PLUGIN_VERSION)
	
	show_motd(id, motd, "Biohazard Help")
}	

public cmd_infectuser(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED_MAIN
	
	static arg1[32]
	read_argv(1, arg1, 31)
	
	static target
	target = cmd_target(id, arg1, (CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF|CMDTARGET_ONLY_ALIVE))
	
	if(!is_user_connected(target) || g_zombie[target])
		return PLUGIN_HANDLED_MAIN
	
	if(!allow_infection())
	{
		console_print(id, "%L", id, "CMD_MAXZOMBIES")
		return PLUGIN_HANDLED_MAIN
	}
	
	if(!g_gamestarted)
	{
		console_print(id, "%L", id, "CMD_GAMENOTSTARTED")
		return PLUGIN_HANDLED_MAIN
	}
			
	static name[32] 
	get_user_name(target, name, 31)
	
	console_print(id, "%L", id, "CMD_INFECTED", name)
	infect_user(target, 0)
	
	return PLUGIN_HANDLED_MAIN
}

public msg_teaminfo(msgid, dest, id)
{
	if(!g_gamestarted)
		return PLUGIN_CONTINUE

	// Don't pick up our own TeamInfo messages for this player (bugfix)
	if (g_switchingteam)
		return PLUGIN_CONTINUE

	static team[2]
	get_msg_arg_string(2, team, 1)
	
	if(team[0] != 'U')
		return PLUGIN_CONTINUE

	id = get_msg_arg_int(1)
	if(is_user_alive(id) || !g_disconnected[id])
		return PLUGIN_CONTINUE

	g_disconnected[id] = false
	id = randomly_pick_zombie()
	if(id)
	{
		fm_set_user_team(id, g_zombie[id] ? CS_TEAM_CT : CS_TEAM_T, 0)
		set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)
	}
	return PLUGIN_CONTINUE
}

public msg_screenfade(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_flashbang))
		return PLUGIN_CONTINUE
	
	if(!g_zombie[id] || !is_user_alive(id) || g_class_data[g_player_class[id]][DATA_NOFLASH] > 0.0)
	{
		static data[4]
		data[0] = get_msg_arg_int(4)
		data[1] = get_msg_arg_int(5)
		data[2] = get_msg_arg_int(6)
		data[3] = get_msg_arg_int(7)
		
		if(data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] > 199)
			return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public msg_scoreattrib(msgid, dest, id)
{
	static attrib 
	attrib = get_msg_arg_int(2)
	
	if(attrib == ATTRIB_BOMB)
		set_msg_arg_int(2, ARG_BYTE, 0)
}

public msg_statusicon(msgid, dest, id)
{
	static icon[3]
	get_msg_arg_string(2, icon, 2)
	
	return (icon[0] == 'c' && icon[1] == '4') ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}

public msg_weaponpickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_ammopickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_deathmsg(msgid, dest, id) 
{
	static killer
	killer = get_msg_arg_int(1)

	if(is_user_connected(killer) && g_zombie[killer])
		set_msg_arg_string(4, g_zombie_weapname)
}

public msg_sendaudio(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_winsounds))
		return PLUGIN_CONTINUE
	
	static audiocode [22]
	get_msg_arg_string(2, audiocode, 21)
	
	if(equal(audiocode[7], "terwin"))
		set_msg_arg_string(2, g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
	else if(equal(audiocode[7], "ctwin"))
		set_msg_arg_string(2, g_survivor_win_sounds[_random(sizeof g_survivor_win_sounds)])
	
	return PLUGIN_CONTINUE
}

public msg_health(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_caphealthdisplay))
		return PLUGIN_CONTINUE
	
	static health
	health = get_msg_arg_int(1)
		
	if(health > 255) 
		set_msg_arg_int(1, ARG_BYTE, 255)
	
	return PLUGIN_CONTINUE
}

public msg_textmsg(msgid, dest, id)
{
	if(get_msg_arg_int(1) != 4)
		return PLUGIN_CONTINUE
	
	static txtmsg[25], winmsg[32]
	get_msg_arg_string(2, txtmsg, 24)
	
	if(equal(txtmsg[1], "Game_bomb_drop"))
		return PLUGIN_HANDLED

	else if(equal(txtmsg[1], "Terrorists_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_ZOMBIES")
		set_msg_arg_string(2, winmsg)
	}
	else if(equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_SURVIVORS")
		set_msg_arg_string(2, winmsg)
	}
	return PLUGIN_CONTINUE
}

public msg_clcorpse(msgid, dest, id)
{
	id = get_msg_arg_int(12)
	if(!g_zombie[id])
		return PLUGIN_CONTINUE
	
	static ent
	ent = fm_find_ent_by_owner(-1, MODEL_CLASSNAME, id)
	
	if(ent)
	{
		static model[64]
		pev(ent, pev_model, model, 63)
		
		set_msg_arg_string(1, model)
	}

	return PLUGIN_CONTINUE
}

public logevent_round_start()
{
	g_roundended = false
	g_roundstarted = true
	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public logevent_round_end()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	remove_task(TASKID_BALANCETEAM) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	set_task(0.1, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_textmsg()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	static seconds[5] 
	read_data(3, seconds, 4)
	
	static Float:tasktime 
	tasktime = float(str_to_num(seconds)) - 0.5
	
	remove_task(TASKID_BALANCETEAM)
	
	set_task(tasktime, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_newround()
{
	g_gamestarted = false
	
	static buytime 
	buytime = get_pcvar_num(cvar_buytime)
	
	if(buytime) 
		g_buytime = buytime + get_gametime()
	
	static id
	for(id = 0; id <= g_maxplayers; id++)
	{
		if(is_user_connected(id))
			g_blockmodel[id] = true
	}
	
	remove_task(TASKID_NEWROUND) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );
	
	set_task(0.1, "task_newround", TASKID_NEWROUND)
	set_task(get_pcvar_float(cvar_starttime), "task_initround", TASKID_INITROUND)

	if( get_pcvar_num( cvar_countdown ) ) {

		CountDownDelay = get_pcvar_num( cvar_starttime );
		set_task( 0.1, "TASK_CountDown", TASKID_COUNTDOWN );
	}
}

public event_curweapon(id)
{
	if(!is_user_alive(id))
		return PLUGIN_CONTINUE
	
	static weapon
	weapon = read_data(2)

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if( g_zombie[ id ] ) {

		if( weapon != CSW_KNIFE && weapon != CSW_FLASHBANG && !task_exists( TASKID_STRIPNGIVE + id ) )
			set_task( 0.1, "task_stripngive", TASKID_STRIPNGIVE + id );

		return PLUGIN_CONTINUE;
	}

	static ammotype
	ammotype = get_pcvar_num(cvar_ammo)
	
	if(!ammotype || (AMMOWP_NULL & (1<<weapon)))
		return PLUGIN_CONTINUE

	static maxammo
	switch(ammotype)
	{
		case 1: maxammo = g_weapon_ammo[weapon][MAX_AMMO]
		case 2: maxammo = g_weapon_ammo[weapon][MAX_CLIP]
	}

	if(!maxammo)
		return PLUGIN_CONTINUE
	
	switch(ammotype)
	{
		case 1:
		{
			static ammo
			ammo = fm_get_user_bpammo(id, weapon)
			
			if(ammo < 1) 
				fm_set_user_bpammo(id, weapon, maxammo)
		}
		case 2:
		{
			static clip; clip = read_data(3)
			if(clip < 1)
			{
				static weaponname[32]
				get_weaponname(weapon, weaponname, 31)
				
				static ent 
				ent = fm_find_ent_by_owner(-1, weaponname, id)
				
				fm_set_weapon_ammo(ent, maxammo)
			}
		}
	}

	return PLUGIN_CONTINUE
}

public event_armortype(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return PLUGIN_CONTINUE
	
	if(fm_get_user_armortype(id) != CS_ARMOR_NONE)
		fm_set_user_armortype(id, CS_ARMOR_NONE)
	
	return PLUGIN_CONTINUE
}

public event_damage(victim)
{
	if(!is_user_alive(victim) || !g_gamestarted)
		return PLUGIN_CONTINUE

	if(!g_zombie[victim])
	{
		static attacker
		attacker = get_user_attacker(victim)
		
		if(!is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
			return PLUGIN_CONTINUE
		
		if(g_victim[attacker] == victim)
		{
			g_infecting = true
			g_victim[attacker] = 0

			message_begin(MSG_ALL, g_msg_deathmsg)
			write_byte(attacker)
			write_byte(victim)
			write_byte(0)
			write_string(g_infection_name)
			message_end()
			
			message_begin(MSG_ALL, g_msg_scoreattrib)
			write_byte(victim)
			write_byte(0)
			message_end()
			
			infect_user(victim, attacker)
			
			static Float:frags, deaths
			pev(attacker, pev_frags, frags)
			deaths = fm_get_user_deaths(victim)
			
			set_pev(attacker, pev_frags, frags  + 1.0)
			fm_set_user_deaths(victim, deaths + 1)
			
			fm_set_user_money(attacker, get_pcvar_num(cvar_infectmoney))
		
			static params[2]
			params[0] = attacker 
			params[1] = victim
	
			set_task(0.3, "task_updatescore", TASKID_UPDATESCR, params, 2)
		}
		g_infecting = false
	}
	return PLUGIN_CONTINUE
}

public fwd_player_prethink(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static flags
	flags = pev(id, pev_flags)
	
	if(flags & FL_ONGROUND)
	{
		if(get_pcvar_num(cvar_painshockfree))
		{
			pev(id, pev_velocity, g_vecvel)
			g_brestorevel = true
		}
	}
	else
	{
		static Float:fallvelocity
		pev(id, pev_flFallVelocity, fallvelocity)
		
		g_falling[id] = fallvelocity >= 350.0 ? true : false
	}
		
	if(g_gamestarted)
	{	
		static Float:gametime
		gametime = get_gametime()
		
		static pclass
		pclass = g_player_class[id]

		static Float:health
		pev(id, pev_health, health)
		
		if(health < g_class_data[pclass][DATA_HEALTH] && g_regendelay[id] < gametime)
		{
			set_pev(id, pev_health, health + 1.0)
			g_regendelay[id] = gametime + g_class_data[pclass][DATA_REGENDLY]
		}
	}

	if( get_pcvar_num( cvar_biohazard_icon ) > 0 ) {

		if( is_user_alive( id ) ) {

			if( g_preinfect[ id ] && !g_zombie[ id ] ) set_biohazard_icon( id, 2, 255, 255, 0 );
			else if( g_zombie[ id ] ) set_biohazard_icon( id, 1, 255, 0, 0 );
			else if( !g_zombie[ id ] && !g_preinfect[ id ] ) set_biohazard_icon( id, 1, 125, 178, 255 );
		} else set_biohazard_icon( id, 0, 0, 0 ,0 );
	}

	return FMRES_IGNORED
}

public fwd_player_prethink_post(id)
{
	if(!g_brestorevel)
		return FMRES_IGNORED

	g_brestorevel = false
		
	static flag
	flag = pev(id, pev_flags)
	
	if(!(flag & FL_ONTRAIN))
	{
		static ent
		ent = pev(id, pev_groundentity)
		
		if(pev_valid(ent) && (flag & FL_CONVEYOR))
		{
			static Float:vectemp[3]
			pev(id, pev_basevelocity, vectemp)
			
			xs_vec_add(g_vecvel, vectemp, g_vecvel)
		}
	
		set_pev(id, pev_velocity, g_vecvel)
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public fwd_player_postthink(id)
{ 
	if(!is_user_alive(id))
		return FMRES_IGNORED
	
	if(g_zombie[id] && g_falling[id] && (pev(id, pev_flags) & FL_ONGROUND))
	{	
		set_pev(id, pev_watertype, CONTENTS_WATER)
		g_falling[id] = false
	}
	
	if(get_pcvar_num(cvar_buytime))
	{
		if(pev_valid(g_buyzone) && g_buytime > get_gametime())
			dllfunc(DLLFunc_Touch, g_buyzone, id)
	}

	return FMRES_IGNORED
}

public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch)
{	
	if(channel == CHAN_ITEM && sample[6] == 'n' && sample[7] == 'v' && sample[8] == 'g')
		return FMRES_SUPERCEDE	
	
	if(!is_user_connected(id) || !g_zombie[id])
		return FMRES_IGNORED	

	if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
	{
		if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
		{
			emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			return FMRES_SUPERCEDE
		}
		else if(sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't' || sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
		{
			if(sample[17] == 'w' && sample[18] == 'a' && sample[19] == 'l')
				emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			else
				emit_sound(id, channel, g_zombie_hit_sounds[_random(sizeof g_zombie_hit_sounds)], volume, attn, flag, pitch)
			
			return FMRES_SUPERCEDE
		}
	}			
	else if(sample[7] == 'd' && (sample[8] == 'i' && sample[9] == 'e' || sample[12] == '6'))
	{
		emit_sound(id, channel, g_zombie_die_sounds[_random(sizeof g_zombie_die_sounds)], volume, attn, flag, pitch)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_cmdstart(id, handle, seed)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static impulse
	impulse = get_uc(handle, UC_Impulse)
	
	if(impulse == IMPULSE_FLASHLIGHT)
	{
		set_uc(handle, UC_Impulse, 0)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_spawn(ent)
{
	if(!pev_valid(ent)) 
		return FMRES_IGNORED
	
	static classname[32]
	pev(ent, pev_classname, classname, 31)

	static i
	for(i = 0; i < sizeof g_remove_entities; ++i)
	{
		if(equal(classname, g_remove_entities))
		{
			engfunc(EngFunc_RemoveEntity, ent)
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public fwd_gamedescription() 
{ 
	static gamename[32]
	get_pcvar_string(cvar_gamedescription, gamename, 31)
	
	forward_return(FMV_STRING, gamename)
	
	return FMRES_SUPERCEDE
}  

public fwd_createnamedentity(entclassname)
{
	static classname[10]
	engfunc(EngFunc_SzFromIndex, entclassname, classname, 9)
	
	return (classname[7] == 'c' && classname[8] == '4') ? FMRES_SUPERCEDE : FMRES_IGNORED
}

public fwd_clientkill(id)
{
	if(get_pcvar_num(cvar_punishsuicide) && is_user_alive(id))
		g_suicide[id] = true
}

public fwd_setclientkeyvalue(id, infobuffer, const key[])
{
	if(!equal(key, "model") || !g_blockmodel[id])
		return FMRES_IGNORED
	
	static model[32]
	fm_get_user_model(id, model, 31)
	
	if(equal(model, "gordon"))
		return FMRES_IGNORED
	
	g_blockmodel[id] = false
	
	return FMRES_SUPERCEDE
}

public bacon_touch_weapon(ent, id)
	return (is_user_alive(id) && g_zombie[id]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_tank(ent, caller, activator, use_type, Float:value)
	return (is_user_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_pushable(ent, caller, activator, use_type, Float:value)
	return HAM_SUPERCEDE

public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!g_gamestarted) 
		return HAM_SUPERCEDE
	
	if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
		return HAM_IGNORED
	
	if(!is_user_connected(attacker) || !g_zombie[victim])
		return HAM_IGNORED
	
	static kbpower
	kbpower = g_weapon_knockback[get_user_weapon(attacker)]
	
	if(kbpower != -1) 
	{
		static flags
		flags = pev(victim, pev_flags)
		
		if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND)))
			return HAM_IGNORED
		
		static Float:origins[2][3]
		pev(victim, pev_origin, origins[0])
		pev(attacker, pev_origin, origins[1])
		
		if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
		{
			static Float:velocity[3]
			pev(victim, pev_velocity, velocity)
			
			static Float:tempvec
			tempvec = velocity[2]	
			
			xs_vec_mul_scalar(direction, damage, direction)
			xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
			xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)
			
			xs_vec_add(direction, velocity, velocity)
			velocity[2] = tempvec
			
			set_pev(victim, pev_velocity, velocity)
			
			return HAM_HANDLED
		}
	}
	return HAM_IGNORED
}

public bacon_touch_grenade(ent, world)
{
	if(!get_pcvar_num(cvar_impactexplode))
		return HAM_IGNORED
	
	static model[12]
	pev(ent, pev_model, model, 11)
	
	if(model[9] == 'h' && model[10] == 'e')
	{
		set_pev(ent, pev_dmgtime, 0.0)
		
		return HAM_HANDLED
	}
	return HAM_IGNORED
}

public bacon_takedamage_player(victim, inflictor, attacker, Float:damage, damagetype)
{
	if(damagetype & DMG_GENERIC || victim == attacker || !is_user_alive(victim) || !is_user_connected(attacker))
		return HAM_IGNORED

	if(!g_gamestarted || (!g_zombie[victim] && !g_zombie[attacker]) || ((damagetype & DMG_HEGRENADE) && g_zombie[attacker]))
		return HAM_SUPERCEDE

	if(g_zombie[attacker])
	{
		if(get_user_weapon(attacker) != CSW_KNIFE)
			return HAM_SUPERCEDE

		damage *= g_class_data[g_player_class[attacker]][DATA_ATTACK]
		
		static Float:armor
		pev(victim, pev_armorvalue, armor)
		
		if(get_pcvar_num(cvar_obeyarmor) && armor > 0.0)
		{
			armor -= damage
			
			if(armor < 0.0) 
				armor = 0.0
			
			set_pev(victim, pev_armorvalue, armor)
			SetHamParamFloat(4, 0.0)
		}
		else
		{
			static bool:infect
			infect = allow_infection()
			
			g_victim[attacker] = infect ? victim : 0
					
			if(!g_infecting)
				SetHamParamFloat(4, infect ? 0.0 : damage)
			else	
				SetHamParamFloat(4, 0.0)
		}
	}
	return HAM_HANDLED
}

public bacon_killed_player(victim, killer, shouldgib)
{
	if(!is_user_alive(killer) || g_zombie[killer] || !g_zombie[victim])
		return HAM_IGNORED

	static killbonus
	killbonus = get_pcvar_num(cvar_killbonus)
	
	if(killbonus)
		set_pev(killer, pev_frags, pev(killer, pev_frags) + float(killbonus))
	
	static killreward
	killreward = get_pcvar_num(cvar_killreward)
	
	if(!killreward) 
		return HAM_IGNORED
	
	static weapon, maxclip, ent, weaponname[32]
	switch(killreward)
	{
		case 1: 
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
		}
		case 2:
		{
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
		case 3:
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
				
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
	}
	return HAM_IGNORED
}

public bacon_spawn_player_post(id)
{	
	if(!is_user_alive(id))
		return HAM_IGNORED
	
	static team
	team = fm_get_user_team(id)
	
	if(team != CS_TEAM_T && team != CS_TEAM_CT)
		return HAM_IGNORED
	
	if(g_zombie[id])
	{
		if(get_pcvar_num(cvar_respawnaszombie) && !g_roundended)
		{
			set_zombie_attibutes(id)
			
			return HAM_IGNORED
		}
		else
			cure_user(id)
	}
	else if(pev(id, pev_rendermode) == kRenderTransTexture)
		reset_user_model(id)
	
	set_task(0.3, "task_spawned", TASKID_SPAWNDELAY + id)
	set_task(5.0, "task_checkspawn", TASKID_CHECKSPAWN + id)
	
	return HAM_IGNORED
}

public bacon_touch_pushable(ent, id)
{
	static movetype
	pev(id, pev_movetype)
	
	if(movetype == MOVETYPE_NOCLIP || movetype == MOVETYPE_NONE)
		return HAM_IGNORED	
	
	if(is_user_alive(id))
	{
		set_pev(id, pev_movetype, MOVETYPE_WALK)
		
		if(!(pev(id, pev_flags) & FL_ONGROUND))
			return HAM_SUPERCEDE
	}
	
	if(!get_pcvar_num(cvar_shootobjects))
		return HAM_IGNORED
	
	static Float:velocity[2][3]
	pev(ent, pev_velocity, velocity[0])
	
	if(vector_length(velocity[0]) > 0.0)
	{
		pev(id, pev_velocity, velocity[1])
		velocity[1][0] += velocity[0][0]
		velocity[1][1] += velocity[0][1]
		
		set_pev(id, pev_velocity, velocity[1])
	}
	return HAM_SUPERCEDE
}

public bacon_traceattack_pushable(ent, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!get_pcvar_num(cvar_shootobjects) || !is_user_alive(attacker))
		return HAM_IGNORED
	
	static Float:velocity[3]
	pev(ent, pev_velocity, velocity)
			
	static Float:tempvec
	tempvec = velocity[2]	
			
	xs_vec_mul_scalar(direction, damage, direction)
	xs_vec_mul_scalar(direction, g_zombie[attacker] ? 
	get_pcvar_float(cvar_pushpwr_zombie) : get_pcvar_float(cvar_pushpwr_weapon), direction)
	xs_vec_add(direction, velocity, velocity)
	velocity[2] = tempvec
	
	set_pev(ent, pev_velocity, velocity)
	
	return HAM_HANDLED
}

public bacon_claws_deploy_post( iEntity ) {

	static szOwner;
	szOwner = get_pdata_cbase( iEntity, 41, EXTRAOFFSET_WEAPONS );

	if( g_zombie[ szOwner ] ) {

		set_pev( szOwner, pev_viewmodel2, g_class_wmodel[ g_player_class[ szOwner ] ] );
		set_pev( szOwner, pev_weaponmodel2, "" );
	}
}

public TASK_CountDown(  ) {

	new Players[ 32 ];
	new PlayersNum;
	get_players( Players, PlayersNum, "a" );
	
	if( CountDownDelay > sizeof CountDownSounds + 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
	} else if( CountDownDelay > 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		emit_sound( 0, CHAN_VOICE, CountDownSounds[ CountDownDelay - 1 ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );

		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
		
		for( new i = 0 ; i < PlayersNum ; i++ ) {

			if( is_user_connected( Players[ i ] ) ) {

				new color[ 3 ];
				color[ 0 ] = 125;
				color[ 1 ] = 170;
				color[ 2 ] = 255;
				UTIL_ScreenFade( Players[ i ], color, 0.5, 0.5, 110 );

				new shock[ 3 ];
				shock[ 0 ] = 3;
				shock[ 1 ] = 2;
				shock[ 2 ] = 3;
				message_begin( MSG_ONE, get_user_msgid( "ScreenShake" ), _, Players[ i ] );
				write_short( ( 1<<12 ) * shock[ 0 ] );
				write_short( ( 1<<12 ) * shock[ 1 ] );
				write_short( ( 1<<12 ) * shock[ 2 ] );
				message_end(  );
			}
		}	
	} else if( CountDownDelay <= 1 )
		CountDownDelay = 0;
}

public task_spawned(taskid)
{
	static id
	id = taskid - TASKID_SPAWNDELAY
	
	if(is_user_alive(id))
	{
		if( !get_pcvar_num( cvar_weaponsmenu ) ) {

			for( new i = 0; i < sizeof g_grenades; ++i )
				bacon_give_weapon( id, g_grenades[ i ] );
		}

		if(g_welcomemsg[id])
		{
			g_welcomemsg[id] = false
			
			static message[192]
			formatex(message, 191, "%L", id, "WELCOME_TXT")
			replace(message, 191, "#Version#", PLUGIN_VERSION)
			
			ColorChat(id, message)
		}
		
		if(g_suicide[id])
		{
			g_suicide[id] = false
			
			user_silentkill(id)
			remove_task(TASKID_CHECKSPAWN + id)

			ColorChat(id, "%L", id, "SUICIDEPUNISH_TXT")
			
			return
		}
		
		if(get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
			is_user_bot(id) ? bot_weapons(id) : display_equipmenu(id)
		
		if(!g_gamestarted)
			ColorChat(id, "%L %L", id, "SCAN_RESULTS", id, g_preinfect[id] ? "SCAN_INFECTED" : "SCAN_CLEAN")
		else
		{
			static team
			team = fm_get_user_team(id)
			
			if(team == CS_TEAM_T)
				fm_set_user_team(id, CS_TEAM_CT)
		}

		if(get_pcvar_num(cvar_biohazard_icon) > 0) {
			if(g_preinfect[id] && !g_zombie[id])
				set_biohazard_icon(id, 2, 255, 255, 0)
			else if(g_zombie[id])
				set_biohazard_icon(id, 1, 255, 0, 0)
			else if(!g_zombie[id] && !g_preinfect[id])
				set_biohazard_icon(id, 1, 125, 178, 255)
		}
	}
}

public task_checkspawn(taskid)
{
	static id
	id = taskid - TASKID_CHECKSPAWN
	
	if(!is_user_connected(id) || is_user_alive(id) || g_roundended)
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
		ExecuteHamB(Ham_CS_RoundRespawn, id)
}
	
public task_showtruehealth()
{
	static id, Float:health, Float:gravity, Float:speed, class
	for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id) && !is_user_bot(id) && g_zombie[id])
	{
		pev( id, pev_health, health );
		pev( id, pev_gravity, gravity );
		pev( id, pev_maxspeed, speed );
		class = g_player_class[id]

		if(g_classcount > 1) {

			set_hudmessage(0, 255, 20, -1.0, 0.8, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Class: %s - Desc: %s^nHealth: %0.f^n^nSpeed: %0.1f^nGolds: %i", g_class_name[class], g_class_desc[class], health, speed, get_user_golds( id ) );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		} else {

			set_hudmessage(0, 230, 210, 0.01, 0.9, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Speed: %0.1f   Gravity: %0.1f", speed, gravity / 0.00125 );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		}
	}
}

public task_lights()
{
	static light[2]
	get_pcvar_string(cvar_lights, light, 1)
	
	engfunc(EngFunc_LightStyle, 0, light)
}

public task_updatescore(params[])
{
	if(!g_gamestarted) 
		return
	
	static attacker
	attacker = params[0]
	
	static victim
	victim = params[1]
	
	if(!is_user_connected(attacker))
		return

	static frags, deaths, team
	frags  = get_user_frags(attacker)
	deaths = fm_get_user_deaths(attacker)
	team   = get_user_team(attacker)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(attacker)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
	
	if(!is_user_connected(victim))
		return
	
	frags  = get_user_frags(victim)
	deaths = fm_get_user_deaths(victim)
	team   = get_user_team(victim)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(victim)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
}

public task_weaponsmenu(taskid)
{
	static id
	id = taskid - TASKID_WEAPONSMENU
	
	if(is_user_alive(id) && !g_zombie[id] && g_menufailsafe[id])
		display_equipmenu(id)
}

public task_stripngive(taskid)
{
	static id
	id = taskid - TASKID_STRIPNGIVE
	
	if(is_user_alive(id))
	{
		fm_strip_user_weapons(id)
		fm_reset_user_primary(id)
		bacon_give_weapon(id, "weapon_knife")
		
		set_pev(id, pev_weaponmodel2, "")
		set_pev(id, pev_viewmodel2, g_class_wmodel[g_player_class[id]])
		set_pev(id, pev_maxspeed, g_class_data[g_player_class[id]][DATA_SPEED])
	}
}

public task_newround()
{
	static players[32], num, zombies, i, id
	get_players(players, num, "a")

	if(num > 1)
	{
		for(i = 0; i < num; i++) 
			g_preinfect[players[i]] = false
		
		zombies = clamp(floatround(num * get_pcvar_float(cvar_zombiemulti)), 1, 31)
		
		i = 0
		while(i < zombies)
		{
			id = players[_random(num)]
			if(!g_preinfect[id])
			{
				g_preinfect[id] = true
				i++
			}
		}
	}
	
	if(!get_pcvar_num(cvar_randomspawn) || g_spawncount <= 0) 
		return
	
	static team
	for(i = 0; i < num; i++)
	{
		id = players[i]
		
		team = fm_get_user_team(id)
		if(team != CS_TEAM_T && team != CS_TEAM_CT || pev(id, pev_iuser1))
			continue
		
		static spawn_index
		spawn_index = _random(g_spawncount)
	
		static Float:spawndata[3]
		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		
		if(!fm_is_hull_vacant(spawndata, HULL_HUMAN))
		{
			static i
			for(i = spawn_index + 1; i != spawn_index; i++)
			{
				if(i >= g_spawncount) i = 0

				spawndata[0] = g_spawns[i][0]
				spawndata[1] = g_spawns[i][1]
				spawndata[2] = g_spawns[i][2]

				if(fm_is_hull_vacant(spawndata, HULL_HUMAN))
				{
					spawn_index = i
					break
				}
			}
		}

		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		engfunc(EngFunc_SetOrigin, id, spawndata)

		spawndata[0] = g_spawns[spawn_index][3]
		spawndata[1] = g_spawns[spawn_index][4]
		spawndata[2] = g_spawns[spawn_index][5]
		set_pev(id, pev_angles, spawndata)

		spawndata[0] = g_spawns[spawn_index][6]
		spawndata[1] = g_spawns[spawn_index][7]
		spawndata[2] = g_spawns[spawn_index][8]
		set_pev(id, pev_v_angle, spawndata)

		set_pev(id, pev_fixangle, 1)
	}
}

public task_initround()
{
	static zombiecount, newzombie
	zombiecount = 0
	newzombie = 0

	static players[32], num, i, id
	get_players(players, num, "a")

	for(i = 0; i < num; i++) if(g_preinfect[players[i]])
	{
		newzombie = players[i]
		zombiecount++
	}
	
	if(zombiecount > 1) 
		newzombie = 0
	else if(zombiecount < 1) 
		newzombie = players[_random(num)]
	
	for(i = 0; i < num; i++)
	{
		id = players[i]
		if(id == newzombie || g_preinfect[id])
			infect_user(id, 0)
		else
		{
			fm_set_user_team(id, CS_TEAM_CT, 0)
			add_delay(id, "update_team")
		}
	}
	
	set_hudmessage(_, _, _, _, _, 1)
	if(newzombie)
	{
		static name[32]
		get_user_name(newzombie, name, 31)
		
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD", name)
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT", name)
	}
	else
	{
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD2")
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT2")
	}
	
	set_task(0.51, "task_startround", TASKID_STARTROUND)

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 2 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

public task_startround()
{
	g_gamestarted = true
	ExecuteForward(g_fwd_gamestart, g_fwd_result)
}

public task_balanceteam()
{
	static players[3][32], count[3]
	get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
	
	count[CS_TEAM_T] = 0
	count[CS_TEAM_CT] = 0
	
	static i, id, team
	for(i = 0; i < count[CS_TEAM_UNASSIGNED]; i++)
	{
		id = players[CS_TEAM_UNASSIGNED][i] 
		team = fm_get_user_team(id)
		
		if(team == CS_TEAM_T || team == CS_TEAM_CT)
			players[team][count[team]++] = id
	}

	if(abs(count[CS_TEAM_T] - count[CS_TEAM_CT]) <= 1) 
		return

	static maxplayers
	maxplayers = (count[CS_TEAM_T] + count[CS_TEAM_CT]) / 2
	
	if(count[CS_TEAM_T] > maxplayers)
	{
		for(i = 0; i < (count[CS_TEAM_T] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT, 0)
	}
	else
	{
		for(i = 0; i < (count[CS_TEAM_CT] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T, 0)
	}
}

public task_botclient_pdata(id) 
{
	if(g_botclient_pdata || !is_user_connected(id))
		return
	
	if(get_pcvar_num(cvar_botquota) && is_user_bot(id))
	{
		RegisterHamFromEntity(Ham_TakeDamage, id, "bacon_takedamage_player")
		RegisterHamFromEntity(Ham_Killed, id, "bacon_killed_player")
		RegisterHamFromEntity(Ham_TraceAttack, id, "bacon_traceattack_player")
		RegisterHamFromEntity(Ham_Spawn, id, "bacon_spawn_player_post", 1)
		
		g_botclient_pdata = 1
	}
}

public bot_weapons(id)
{
	g_player_weapons[id][0] = _random(sizeof g_primaryweapons)
	g_player_weapons[id][1] = _random(sizeof g_secondaryweapons)
	
	equipweapon(id, EQUIP_ALL)
}

public update_team(id)
{
	if(!is_user_connected(id))
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
	{
		emessage_begin(MSG_ALL, g_msg_teaminfo)
		ewrite_byte(id)
		ewrite_string(g_teaminfo[team])
		emessage_end()
	}
}

public infect_user(victim, attacker)
{
	if(!is_user_alive(victim))
		return

	message_begin(MSG_ONE, g_msg_screenfade, _, victim)
	write_short(1<<10)
	write_short(1<<10)
	write_short(0)
	write_byte((g_mutate[victim] != -1) ? 255 : 100)
	write_byte(100)
	write_byte(100)
	write_byte(250)
	message_end()

	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenShake" ), _, victim )
	write_short( ( 1<<12 ) * 4 ) // amplitude
	write_short( ( 1<<12 ) * 2 ) // duration
	write_short( ( 1<<12 ) * 10 ) // frequency
	message_end(  )
		
	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "Damage" ), _, victim )
	write_byte( 0 ) // damage save
	write_byte( 0 ) // damage take
	write_long( DMG_NERVEGAS ) // damage type - DMG_RADIATION
	write_coord( 0 ) // x
	write_coord( 0 ) // y
	write_coord( 0 ) // z
	message_end(  )

	// Get player's origin
	new Origin[ 3 ]
	get_user_origin( victim, Origin )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_IMPLOSION ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 128 ) // radius
	write_byte( 20 ) // count
	write_byte( 3 ) // duration
	message_end(  )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_DLIGHT ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 20 ) // radius
	write_byte( 0 ) // r
	write_byte( 150 ) // g
	write_byte( 0 ) // b
	write_byte( 2 ) // life
	write_byte( 0 ) // decay rate
	message_end(  )

#if defined ULTRA_BLOOD
	static origin[3];
	get_user_origin(victim, origin)

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_PARTICLEBURST)
	write_coord(origin[0])
	write_coord(origin[1])
	write_coord(origin[2])
	write_short(50)
	write_byte(70)
	write_byte(3)
	message_end()
#endif
	
	if(g_mutate[victim] != -1)
	{
		g_player_class[victim] = g_mutate[victim]
		g_mutate[victim] = -1
		
		set_hudmessage(_, _, _, _, _, 1)
		ShowSyncHudMsg(victim, g_sync_msgdisplay, "%L", victim, "MUTATION_HUD", g_class_name[g_player_class[victim]])
	}
	
	fm_set_user_team(victim, CS_TEAM_T)
	set_zombie_attibutes(victim)
	
	emit_sound(victim, CHAN_STATIC, g_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
	ExecuteForward(g_fwd_infect, g_fwd_result, victim, attacker)
}

public cure_user(id)
{
	if(!is_user_alive(id)) 
		return

	g_zombie[id] = false
	g_falling[id] = false

	g_showmenu[id] = true;

	reset_user_model(id)
	fm_set_user_nvg(id, 0)
	set_pev(id, pev_gravity, 1.0)
	
	if( fm_get_user_team( id ) != CS_TEAM_CT ) { // need to change team?

		fm_set_user_team( id, CS_TEAM_CT );
		fm_user_team_update( id );
	}

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if(equal(viewmodel, g_class_wmodel[g_player_class[id]]))
	{
		static weapon 
		weapon = fm_lastknife(id)

		if(pev_valid(weapon))
			ExecuteHam(Ham_Item_Deploy, weapon)
	}

	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public display_equipmenu(id)
{
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L^n^n", id, "MENU_TITLE1")
	
	static bool:hasweap
	hasweap = ((g_player_weapons[id][0]) != -1 && (g_player_weapons[id][1] != -1)) ? true : false
	
	len += formatex(menubody[len], 511 - len,"\r1.\w %L^n", id, "MENU_NEWWEAPONS")
	len += formatex(menubody[len], 511 - len,"%s2.\w %L^n", hasweap ? "\r" : "\d", id, "MENU_PREVSETUP")
	len += formatex(menubody[len], 511 - len,"%s3.\w %L^n^n", hasweap ? "\r" : "\d", id, "MENU_DONTSHOW")
	len += formatex(menubody[len], 511 - len,"\r5.\w %L^n", id, "MENU_EXIT")
	
	static keys
	keys = (MENU_KEY_1|MENU_KEY_5)
	
	if(hasweap) 
		keys |= (MENU_KEY_2|MENU_KEY_3)
	
	show_menu(id, keys, menubody, -1, "Equipment")
}

public action_equip(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key)
	{
		case 0: display_weaponmenu(id, MENU_PRIMARY, g_menuposition[id] = 0)
		case 1: equipweapon(id, EQUIP_ALL)
		case 2:
		{
			g_showmenu[id] = false
			equipweapon(id, EQUIP_ALL)
			ColorChat(id, "%L", id, "MENU_CMDENABLE")
		}
	}
	
	if(key > 0)
	{
		g_menufailsafe[id] = false
		remove_task(TASKID_WEAPONSMENU + id)
	}
	return PLUGIN_HANDLED
}


public display_weaponmenu(id, menuid, pos)
{
	if(pos < 0 || menuid < 0)
		return
	
	static start
	start = pos * 8
	
	static maxitem
	maxitem = menuid == MENU_PRIMARY ? sizeof g_primaryweapons : sizeof g_secondaryweapons

  	if(start >= maxitem)
    		start = pos = g_menuposition[id]
	
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L\w^n^n", id, menuid == MENU_PRIMARY ? "MENU_TITLE2" : "MENU_TITLE3")

	static end
	end = start + 8
	if(end > maxitem)
    		end = maxitem
	
	static keys
	keys = MENU_KEY_0
	
	static a, b
	b = 0
	
  	for(a = start; a < end; ++a) 
	{
		keys |= (1<<b)
		len += formatex(menubody[len], 511 - len,"\r%d.\w %s^n", ++b, menuid == MENU_PRIMARY ? g_primaryweapons[a][0]: g_secondaryweapons[a][0])
  	}

  	if(end != maxitem)
	{
    		formatex(menubody[len], 511 - len, "^n\r9.\w %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
    		keys |= MENU_KEY_9
  	}
  	else	
		formatex(menubody[len], 511 - len, "^n\r0.\w %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
	
  	show_menu(id, keys, menubody, -1, menuid == MENU_PRIMARY ? "Primary" : "Secondary")
}

public action_prim(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED

	switch(key)
	{
    		case 8: display_weaponmenu(id, MENU_PRIMARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_PRIMARY, --g_menuposition[id])
    		default:
		{
			g_player_weapons[id][0] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_PRI)
			
			display_weaponmenu(id, MENU_SECONDARY, g_menuposition[id] = 0)
		}
	}
	return PLUGIN_HANDLED
}

public action_sec(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key) 
	{
    		case 8: display_weaponmenu(id, MENU_SECONDARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_SECONDARY, --g_menuposition[id])
    		default:
		{
			g_menufailsafe[id] = false
			remove_task(TASKID_WEAPONSMENU + id)
			
			g_player_weapons[id][1] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_SEC)
			equipweapon(id, EQUIP_GREN)
		}
	}
	return PLUGIN_HANDLED
}

public ClassCmd( id, szMenu, szItem ) {

	if( szItem == MENU_EXIT ) {

		menu_destroy( szMenu );
		return PLUGIN_HANDLED;
	}

	new szData[ 6 ], szName[ 64 ];
	new iAccess, iCallBack;

	menu_item_getinfo( szMenu, szItem, iAccess, szData, 5, szName, 63, iCallBack );
	new iKey = str_to_num( szData );

	if( g_class_data[ iKey ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) ) {

		ColorChat( id, "%L", id, "MENU_CLASSONLYVIP", g_class_name[ iKey ] );
		cmd_classmenu( id );
	}

	else {

		g_mutate[ id ] = iKey;
		ColorChat( id, "%L", id, "MENU_CHANGECLASS", g_class_name[ g_mutate[ id ] ] );
	}

	menu_destroy( szMenu );
	return PLUGIN_HANDLED;
}

public register_spawnpoints(const mapname[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new csdmfile[64], line[64], data[10][6]
	formatex(csdmfile, 63, "%s/csdm/%s.spawns.cfg", configdir, mapname)

	if(file_exists(csdmfile))
	{
		new file
		file = fopen(csdmfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 63)
			if(!line[0] || str_count(line,' ') < 2) 
				continue

			parse(line, data[0], 5, data[1], 5, data[2], 5, data[3], 5, data[4], 5, data[5], 5, data[6], 5, data[7], 5, data[8], 5, data[9], 5)

			g_spawns[g_spawncount][0] = floatstr(data[0]), g_spawns[g_spawncount][1] = floatstr(data[1])
			g_spawns[g_spawncount][2] = floatstr(data[2]), g_spawns[g_spawncount][3] = floatstr(data[3])
			g_spawns[g_spawncount][4] = floatstr(data[4]), g_spawns[g_spawncount][5] = floatstr(data[5])
			g_spawns[g_spawncount][6] = floatstr(data[7]), g_spawns[g_spawncount][7] = floatstr(data[8])
			g_spawns[g_spawncount][8] = floatstr(data[9])
			
			if(++g_spawncount >= MAX_SPAWNS) 
				break
		}
		if(file) 
			fclose(file)
	}
}

public register_zombieclasses(filename[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new configfile[64]
	formatex(configfile, 63, "%s/%s", configdir, filename)

	if(get_pcvar_num(cvar_zombie_class) && file_exists(configfile))
	{			
		new line[128], leftstr[32], rightstr[64],  classname[32], data[MAX_DATA], i
		
		new file
		file = fopen(configfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 127), trim(line)
			if(!line[0] || line[0] == ';') continue
			
			if(line[0] == '[' && line[strlen(line) - 1] == ']')
			{
				copy(classname, strlen(line) - 2, line[1])

				if(register_class(classname) == -1)
					break
				
				continue
			}
			strtok(line, leftstr, 31, rightstr, 63, '=', 1)
				
			if(equali(leftstr, "DESC"))
				copy(g_class_desc[g_classcount - 1], 31, rightstr)
			else if(equali(leftstr, "PMODEL"))
				copy(g_class_pmodel[g_classcount - 1], 63, rightstr)
			else if(equali(leftstr, "WMODEL"))
				copy(g_class_wmodel[g_classcount - 1], 63, rightstr)
				
			for(i = 0; i < MAX_DATA; i++)
				data[i] = equali(leftstr, g_dataname[i])
				
			for(i = 0; i < MAX_DATA; i++) if(data[i])
			{
				g_class_data[g_classcount - 1][i] = floatstr(rightstr)
				break
			}
		}
		if(file) fclose(file)
	} 
	else 
		register_class("default")
}

public register_class(classname[])
{
	if(g_classcount >= MAX_CLASSES)
		return -1
	
	copy(g_class_name[g_classcount], 31, classname)
	copy(g_class_pmodel[g_classcount], 63, DEFAULT_PMODEL)
	copy(g_class_wmodel[g_classcount], 63, DEFAULT_WMODEL)
		
	g_class_data[g_classcount][DATA_HEALTH] = DEFAULT_HEALTH
	g_class_data[g_classcount][DATA_SPEED] = DEFAULT_SPEED	
	g_class_data[g_classcount][DATA_GRAVITY] = DEFAULT_GRAVITY
	g_class_data[g_classcount][DATA_ATTACK] = DEFAULT_ATTACK
	g_class_data[g_classcount][DATA_REGENDLY] = DEFAULT_REGENDLY
	g_class_data[g_classcount][DATA_KNOCKBACK] = DEFAULT_KNOCKBACK
	g_class_data[g_classcount][DATA_NOFLASH] = DEFAULT_NOFLASH
	g_class_data[g_classcount][DATA_ONLYVIP] = DEFAULT_ONLYVIP
	g_classcount++
	
	return (g_classcount - 1)
}

public native_register_class(classname[], description[])
{
	param_convert(1)
	param_convert(2)
	
	static classid
	classid = register_class(classname)
	
	if(classid != -1)
		copy(g_class_desc[classid], 31, description)

	return classid
}

public native_set_class_pmodel(classid, player_model[])
{
	param_convert(2)
	copy(g_class_pmodel[classid], 63, player_model)
}

public native_set_class_wmodel(classid, weapon_model[])
{
	param_convert(2)
	copy(g_class_wmodel[classid], 63, weapon_model) 
}

public native_is_user_zombie(index)
	return g_zombie[index] == true ? 1 : 0

public native_get_user_class(index)
	return g_player_class[index]

public native_is_user_infected(index)
	return g_preinfect[index] == true ? 1 : 0

public native_game_started()
	return g_gamestarted

public native_preinfect_user(index, bool:yesno)
{
	if(is_user_alive(index) && !g_gamestarted)
		g_preinfect[index] = yesno
}

public native_infect_user(victim, attacker)
{
	if(allow_infection() && g_gamestarted)
		infect_user(victim, attacker)
}

public native_cure_user(index)
	cure_user(index)

public native_get_class_id(classname[])
{
	param_convert(1)
	
	static i
	for(i = 0; i < g_classcount; i++)
	{
		if(equali(classname, g_class_name[i]))
			return i
	}
	return -1
}

public Float:native_get_class_data(classid, dataid)
	return g_class_data[classid][dataid]

public native_set_class_data(classid, dataid, Float:value)
	g_class_data[classid][dataid] = value

public native_get_humans(  ) {

	static iHumans;
	iHumans = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && !g_zombie[ id ] ) 
			iHumans++;
	}

	return iHumans;
}

public native_get_zombies(  ) {

	static iZombies;
	iZombies = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && g_zombie[ id ] ) 
			iZombies++;
	}

	return iZombies;
}

stock bool:fm_is_hull_vacant(const Float:origin[3], hull)
{
	static tr
	tr = 0
	
	engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, tr)
	return (!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen)) ? true : false
}

stock fm_set_kvd(entity, const key[], const value[], const classname[] = "") 
{
	set_kvd(0, KV_ClassName, classname)
	set_kvd(0, KV_KeyName, key)
	set_kvd(0, KV_Value, value)
	set_kvd(0, KV_fHandled, 0)

	return dllfunc(DLLFunc_KeyValue, entity, 0)
}

stock fm_strip_user_weapons(index) 
{
	static stripent
	if(!pev_valid(stripent))
	{
		stripent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
		dllfunc(DLLFunc_Spawn, stripent), set_pev(stripent, pev_solid, SOLID_NOT)
	}
	dllfunc(DLLFunc_Use, stripent, index)
	
	return 1
}

stock fm_set_entity_visibility(index, visible = 1)
	set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)

stock fm_find_ent_by_owner(index, const classname[], owner) 
{
	static ent
	ent = index
	
	while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) && pev(ent, pev_owner) != owner) {}
	
	return ent
}

stock bacon_give_weapon(index, weapon[])
{
	if(!equal(weapon,"weapon_", 7))
		return 0

	static ent
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon))
	
	if(!pev_valid(ent)) 
		return 0
    
	set_pev(ent, pev_spawnflags, SF_NORESPAWN)
	dllfunc(DLLFunc_Spawn, ent)
   
	if(!ExecuteHamB(Ham_AddPlayerItem, index, ent))
	{
		if(pev_valid(ent)) set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
		return 0
	}
	ExecuteHamB(Ham_Item_AttachToPlayer, ent, index)

	return 1
}

stock bacon_strip_weapon(index, weapon[])
{
	if(!equal(weapon, "weapon_", 7)) 
		return 0

	static weaponid 
	weaponid = get_weaponid(weapon)
	
	if(!weaponid) 
		return 0

	static weaponent
	weaponent = fm_find_ent_by_owner(-1, weapon, index)
	
	if(!weaponent) 
		return 0

	if(get_user_weapon(index) == weaponid) 
		ExecuteHamB(Ham_Weapon_RetireWeapon, weaponent)

	if(!ExecuteHamB(Ham_RemovePlayerItem, index, weaponent)) 
		return 0
	
	ExecuteHamB(Ham_Item_Kill, weaponent)
	set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<weaponid))

	return 1
}

stock fm_set_user_team( index, team, update = 1 ) {

	set_pdata_int( index, OFFSET_TEAM, team );

	if( update ) {

		emessage_begin( MSG_ALL, g_msg_teaminfo );
		ewrite_byte( index );
		ewrite_string( g_teaminfo[ team ] );
		emessage_end(  );
	}
	return 1;
}

stock fm_get_user_bpammo(index, weapon)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	return offset ? get_pdata_int(index, offset) : 0
}

stock fm_set_user_bpammo(index, weapon, amount)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	
	if(offset) 
		set_pdata_int(index, offset, amount)
	
	return 1
}

stock fm_set_user_rendering( iEntity, fx = kRenderFxNone, Red = 255, Green = 255, Blue = 255, iRender = kRenderNormal, Amount = 16 ) {

	new Float:RenderColor[ 3 ];
	RenderColor[ 0 ] = float( Red );
	RenderColor[ 1 ] = float( Green );
	RenderColor[ 2 ] = float( Blue );

	set_pev( iEntity, pev_renderfx, fx );
	set_pev( iEntity, pev_rendercolor, RenderColor );
	set_pev( iEntity, pev_rendermode, iRender );
	set_pev( iEntity, pev_renderamt, float( Amount ) );

	return 1;
}

stock fm_set_user_nvg(index, onoff = 1)
{
	static nvg
	nvg = get_pdata_int(index, OFFSET_NVG)
	
	set_pdata_int(index, OFFSET_NVG, onoff == 1 ? nvg | HAS_NVG : nvg & ~HAS_NVG)
	return 1
}

stock fm_set_user_money(index, addmoney, update = 1)
{
	static money
	money = fm_get_user_money(index) + addmoney
	
	set_pdata_int(index, OFFSET_CSMONEY, money)
	
	if(update)
	{
		message_begin(MSG_ONE, g_msg_money, _, index)
		write_long(clamp(money, 0, 16000))
		write_byte(1)
		message_end()
	}
	return 1
}

stock fm_user_team_update(id)
{
	static Float:current_time
	current_time = get_gametime()
	
	if (current_time - g_teams_targettime >= 0.1)
	{
		set_task(0.1, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = current_time + 0.1
	}
	else
	{
		set_task((g_teams_targettime + 0.1) - current_time, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = g_teams_targettime + 0.1
	}
}

public fm_cs_set_user_team_msg(taskid)
{
	// Note to self: this next message can now be received by other plugins
	
	// Set the switching team flag
	g_switchingteam = true
	
	// Tell everyone my new team
	emessage_begin(MSG_ALL, g_msg_teaminfo )
	ewrite_byte(taskid - 1212) // player
	ewrite_string(CS_TEAM_NAMES[fm_get_user_team(taskid - 1212)]) // team
	emessage_end()
	
	// Done switching team
	g_switchingteam = false
}

stock str_count(str[], searchchar)
{
	static maxlen
	maxlen = strlen(str)
	
	static i, count
	count = 0
	
	for(i = 0; i <= maxlen; i++) if(str[i] == searchchar)
		count++

	return count
}

stock reset_user_model(index)
{
	set_pev(index, pev_rendermode, kRenderNormal)
	set_pev(index, pev_renderamt, 0.0)

	if(pev_valid(g_modelent[index]))
		fm_set_entity_visibility(g_modelent[index], 0)
}

stock remove_user_model(ent)
{
	static id
	id = pev(ent, pev_owner)
	
	if(pev_valid(ent)) 
		engfunc(EngFunc_RemoveEntity, ent)

	g_modelent[id] = 0
}

stock set_zombie_attibutes(index)
{
	if(!is_user_alive(index)) 
		return

	g_zombie[index] = true

	if(!task_exists(TASKID_STRIPNGIVE + index))
		set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + index)

	static Float:health
	health = g_class_data[g_player_class[index]][DATA_HEALTH]
	
	if(g_preinfect[index]) 
		health *= get_pcvar_float(cvar_zombie_hpmulti)
	
	set_pev(index, pev_health, health)
	set_pev(index, pev_gravity, g_class_data[g_player_class[index]][DATA_GRAVITY])
	set_pev(index, pev_body, 0)
	set_pev(index, pev_armorvalue, 0.0)
	set_pev(index, pev_renderamt, 0.0)
	set_pev(index, pev_rendermode, kRenderTransTexture)
	
	fm_set_user_armortype(index, CS_ARMOR_NONE)
	fm_set_user_nvg(index)
	
	if(get_pcvar_num(cvar_autonvg)) 
		engclient_cmd(index, "nightvision")
	
	if(!pev_valid(g_modelent[index]))
	{
		static ent
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		if(pev_valid(ent))
		{
			engfunc(EngFunc_SetModel, ent, g_class_pmodel[g_player_class[index]])
			set_pev(ent, pev_classname, MODEL_CLASSNAME)
			set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
			set_pev(ent, pev_aiment, index)
			set_pev(ent, pev_owner, index)
				
			g_modelent[index] = ent
		}
	}
	else
	{
		engfunc(EngFunc_SetModel, g_modelent[index], g_class_pmodel[g_player_class[index]])
		fm_set_entity_visibility(g_modelent[index], 1)
	}

	static effects
	effects = pev(index, pev_effects)
	
	if(effects & EF_DIMLIGHT)
	{
		message_begin(MSG_ONE, g_msg_flashlight, _, index)
		write_byte(0)
		write_byte(100)
		message_end()
		
		set_pev(index, pev_effects, effects & ~EF_DIMLIGHT)
	}

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 1 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

PlaySound( const szSound[  ] ) {

	client_cmd( 0, "spk ^"%s^"", szSound );
}

stock bool:allow_infection()
{
	static count[2]
	count[0] = 0
	count[1] = 0
	
	static index, maxzombies
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(is_user_connected(index) && g_zombie[index]) 
			count[0]++
		else if(is_user_alive(index)) 
			count[1]++
	}
	
	maxzombies = clamp(get_pcvar_num(cvar_maxzombies), 1, 31)
	return (count[0] < maxzombies && count[1] > 1) ? true : false
}

stock randomly_pick_zombie()
{
	static data[4]
	data[0] = 0 
	data[1] = 0 
	data[2] = 0 
	data[3] = 0
	
	static index, players[2][32]
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(!is_user_alive(index)) 
			continue
		
		if(g_zombie[index])
		{
			data[0]++
			players[0][data[2]++] = index
		}
		else 
		{
			data[1]++
			players[1][data[3]++] = index
		}
	}

	if(data[0] > 0 &&  data[1] < 1) 
		return players[0][_random(data[2])]
	
	return (data[0] < 1 && data[1] > 0) ?  players[1][_random(data[3])] : 0
}

stock equipweapon(id, weapon)
{
	if(!is_user_alive(id)) 
		return

	static weaponid[2], weaponent, weapname[32]
	
	if(weapon & EQUIP_PRI)
	{
		weaponent = fm_lastprimary(id)
		weaponid[1] = get_weaponid(g_primaryweapons[g_player_weapons[id][0]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_primaryweapons[g_player_weapons[id][0]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}

	if(weapon & EQUIP_SEC)
	{
		weaponent = fm_lastsecondry(id)
		weaponid[1] = get_weaponid(g_secondaryweapons[g_player_weapons[id][1]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_secondaryweapons[g_player_weapons[id][1]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}
	
	if(weapon & EQUIP_GREN)
	{
		static i
		for(i = 0; i < sizeof g_grenades; i++) if(!user_has_weapon(id, get_weaponid(g_grenades[i])))
			bacon_give_weapon(id, g_grenades[i])
	}
}

stock add_delay(index, const task[])
{
	switch(index)
	{
		case 1..8:   set_task(0.1, task, index)
		case 9..16:  set_task(0.2, task, index)
		case 17..24: set_task(0.3, task, index)
		case 25..32: set_task(0.4, task, index)
	}
}

stock set_biohazard_icon(id, mode, red, green, blue) {

	message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, id);
	write_byte(mode); // status (0=hide, 1=show, 2=flash)
	write_string("dmg_bio"); // sprite name
	write_byte(red); // red
	write_byte(green); // green
	write_byte(blue); // blue
	message_end();
}

stock FixedUnsigned16(Float:flValue, iScale) {
	new iOutput;
	
	iOutput = floatround(flValue * iScale);
	if(iOutput < 0)
		iOutput = 0;
	
	if(iOutput > 0xFFFF)
		iOutput = 0xFFFF;
	return iOutput;
}

stock UTIL_ScreenFade(id=0,iColor[3],Float:flFxTime=-1.0,Float:flHoldTime=0.0,iAlpha=0,iFlags=FFADE_IN,bool:bReliable=false,bool:bExternal=false) {
	if(id && !is_user_connected(id))
		return;
	
	new iFadeTime;
	if(flFxTime == -1.0) {
		iFadeTime = 4;
	}
	else {
		iFadeTime = FixedUnsigned16(flFxTime , 1<<12);
	}
	
	static gmsgScreenFade;
	if(!gmsgScreenFade) {
		gmsgScreenFade = get_user_msgid("ScreenFade");
	}
	
	new MSG_DEST;
	if(bReliable) {
		MSG_DEST = id ? MSG_ONE : MSG_ALL;
	}
	else {
		MSG_DEST = id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST;
	}
	
	if(bExternal) {
		emessage_begin(MSG_DEST, gmsgScreenFade, _, id);
		ewrite_short(iFadeTime);
		ewrite_short(FixedUnsigned16(flHoldTime , 1<<12));
		ewrite_short(iFlags);
		ewrite_byte(iColor[0]);
		ewrite_byte(iColor[1]);
		ewrite_byte(iColor[2]);
		ewrite_byte(iAlpha);
		emessage_end();
	}
	else {
		message_begin(MSG_DEST, gmsgScreenFade, _, id);
		write_short(iFadeTime);
		write_short(FixedUnsigned16(flHoldTime , 1<<12));
		write_short(iFlags);
		write_byte(iColor[0]);
		write_byte(iColor[1]);
		write_byte(iColor[2]);
		write_byte(iAlpha);
		message_end();
	}
}

#if defined GRENADE_STATUS
public GrenadeStatus(  ) {

	// Nade Status Cvar
	cvar_status = register_cvar("bio_nadestatus_icon","1") // [0=Hide | 1=Show | 2=Flash (Don't work with red color)]
	
	// Fire Grenade Cvars
	cvar_fire_icon = register_cvar("bio_firenade_icon","1") // [0=Disable | 1=Enable]
	cvar_fire_color = register_cvar("bio_firenade_color","255 0 0") // Color of Fire Nade in RGB
	
	// Frost Grenade Cvars
	cvar_frost_icon = register_cvar("bio_frostnade_icon","1") // [0=Disable | 1=Enable]
	cvar_frost_color = register_cvar("bio_frostnade_color","100 149 237") // Color of Frost Nade in RGB
	
	// Flare Grenade Cvars
	cvar_flare_icon = register_cvar("bio_flarenade_icon","1") // [0=Disable | 1=Enable]
	cvar_flare_color = register_cvar("bio_flarenade_color","255 255 255") // Color of Flare Nade in RGB

	register_event("CurWeapon", "GrenadeIcon", "be", "1=1")
	
	g_StatusIcon = get_user_msgid("StatusIcon")
}

public GrenadeIcon( id ) {

	RemoveGrenadeIcon( id );
		
	if( is_user_bot( id ) )
		return 1;
		
	static NadeType, GrenadeSprite[ 16 ], Color[ 17 ], Red[ 5 ], Green[ 5 ], Blue[ 5 ];
	NadeType = get_user_weapon( id )
	
	switch( NadeType ) {

		case CSW_HEGRENADE: {

			if( !g_zombie[ id ] ) {

				if( !get_pcvar_num( cvar_fire_icon ) )
					return 1;
				
				GrenadeSprite = "dmg_heat";
				get_pcvar_string( cvar_fire_color, Color, charsmax( Color ) );
				
			}
		}

		case CSW_FLASHBANG: {

			if( !get_pcvar_num( cvar_frost_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_cold";
			get_pcvar_string( cvar_frost_color, Color, charsmax( Color ) );
		}

		case CSW_SMOKEGRENADE: {

			if( !get_pcvar_num( cvar_flare_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_shock";
			get_pcvar_string( cvar_flare_color, Color, charsmax( Color ) );
		}

		default: return 1;
	}

	parse( Color, Red, charsmax( Red ), Green, charsmax( Green ), Blue, charsmax( Blue ) );
	g_GrenadeIcon[ id ] = GrenadeSprite;
	
	message_begin( MSG_ONE, g_StatusIcon, {0, 0, 0 }, id );
	write_byte( get_pcvar_num( cvar_status ) ) // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] ) // Sprite Name
	write_byte( str_to_num( Red ) ) // Red
	write_byte( str_to_num( Green ) ) // Green
	write_byte( str_to_num( Blue ) ) // Blue
	message_end(  );

	return 1;
}

public RemoveGrenadeIcon( id ) {

	message_begin( MSG_ONE, g_StatusIcon, { 0, 0, 0 },id );
	write_byte( 0 ); // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] );
	message_end(  )
}
#endif

stock HudMessage(const id, const message[], red = 0, green = 160, blue = 0, Float:x = -1.0, Float:y = 0.65, effects = 2, Float:fxtime = 0.01, Float:holdtime = 3.0, Float:fadeintime = 0.01, Float:fadeouttime = 0.01) {
	new count = 1, players[32];
	
	if(id) players[0] = id;
	else get_players(players, count, "ch"); {
		for(new i = 0; i < count; i++) {
			if(is_user_connected(players[i])) {	
				new color = pack_color(clamp_byte(red), clamp_byte(green), clamp_byte(blue))
				
				message_begin(MSG_ONE_UNRELIABLE, SVC_DIRECTOR, _, players[i]);
				write_byte(strlen(message) + 31);
				write_byte(DRC_CMD_MESSAGE);
				write_byte(effects);
				write_long(color);
				write_long(_:x);
				write_long(_:y);
				write_long(_:fadeintime);
				write_long(_:fadeouttime);
				write_long(_:holdtime);
				write_long(_:fxtime);
				write_string(message);
				message_end();
			}
		}
	}
}

stock ColorChat( const id, const input[  ], any:... ) {

	new iCount = 1, szPlayers[ 32 ];
	static szMsg[ 191 ];

	vformat( szMsg, 190, input, 3 );

	replace_all( szMsg, 190, "!4", "^4" );
	replace_all( szMsg, 190, "!1", "^1" );
	replace_all( szMsg, 190, "!3", "^3" );

	if( id ) {
		szPlayers[ 0 ] = id;
	} else {
		get_players( szPlayers, iCount, "ch" );
	}

	for( new i = 0; i < iCount; i++ ) {

		if( is_user_connected( szPlayers[ i ] ) ) {

			message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, szPlayers[ i ] );
			write_byte( szPlayers[ i ] );
			write_string( szMsg );
			message_end(  );
		}
	}
}

Nu cred ca merge nici asa dar sa vedem,daca nu merge nici asa sa postezi o sursa a unei clase de zombie, bio_zombie_smoker.sma etc..
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

31 Jul 2014, 21:41

Nu merge... doar a facut putin spatiu intre w si clase uite:
Image

bio_zombie_zeus
| Afiseaza codul
#include <amxmodx>
#include <biohazard>

#define PLUGIN  "[Bio] Zombie Class: Polymorph"
#define AUTHOR  "YONTU"
#define VERSION "1.0"

#define ZOMBIE_NAME 	"Polymorph"						//Zombie Name
#define ZOMBIE_DESC 	"Quad Damage, Ultra Speed, Gravity"				//Zobmie Description
#define ZOMBIE_MODEL 	"models/player/bio30_chinese/bio30_chinese.mdl"		//Zombie Model
#define ZOMBIE_CLAWS 	"models/player/bio30_chinese/claws_chinese.mdl"			//Claws Model
#define ZOMBIE_HEALTH		300.0	//Health value
#define ZOMBIE_SPEED		1000.0	//Speed value
#define ZOMBIE_GRAVITY		0.3	//Gravity multiplier
#define ZOMBIE_ATTACK		7.0	//Zombie damage multiplier
#define ZOMBIE_REGENDLY		3.0 //Regeneration delay value
#define ZOMBIE_KNOCKBACK	3.5	//Knockback multiplier
#define ZOMBIE_NOFLASH		1.0	//No flash
#define ZOMBIE_ONLYVIP		0.0	// Only VIP

new Class;

public plugin_init() {
       
	register_plugin(PLUGIN,AUTHOR,VERSION)
	is_biomod_active() ? plugin_init2() : pause("ad")
}
	
public plugin_init2() { 
      
	register_plugin(PLUGIN,AUTHOR,VERSION)
	Class = register_class(ZOMBIE_NAME, ZOMBIE_DESC)

	set_class_pmodel(Class, ZOMBIE_MODEL)
	set_class_wmodel(Class, ZOMBIE_CLAWS)
	set_class_data(Class, DATA_HEALTH, ZOMBIE_HEALTH);
	set_class_data(Class, DATA_SPEED, ZOMBIE_SPEED);
	set_class_data(Class, DATA_GRAVITY, ZOMBIE_GRAVITY);
	set_class_data(Class, DATA_ATTACK, ZOMBIE_ATTACK);
	set_class_data(Class, DATA_REGENDLY, ZOMBIE_REGENDLY);
	set_class_data(Class, DATA_KNOCKBACK, ZOMBIE_KNOCKBACK);
	set_class_data(Class, DATA_NOFLASH, ZOMBIE_NOFLASH);
	set_class_data(Class, DATA_ONLYVIP, ZOMBIE_ONLYVIP);
}

public plugin_precache() {

	precache_model(ZOMBIE_MODEL)
	precache_model(ZOMBIE_CLAWS)
}

public event_infect(victim, attacker) {

	if(get_user_class(victim) == Class) {

		ColorChat(victim, "^x04[Biohazard]^x03 ATENTIE^x01: Ai^x03 viteza^x01 marita,^x03 gravitate^x01 mica,^x03 extra damage^x01, dar^x03 viata^x01 mica si^x03 knocback^x01 mare." )
	}
}

stock ColorChat(const id, const input[], any:...) {
	new count = 1, players[32];
	static msg[191];
	vformat(msg, 190, input, 3);
	
	replace_all(msg, 190, "!g", "^4");
	replace_all(msg, 190, "!y", "^1");
	replace_all(msg, 190, "!t", "^3");
	
	if(id) players[0] = id;
	else get_players(players, count, "ch"); {
		for(new i = 0; i < count; i++) {
			if(is_user_connected(players)) {
				message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players);
				write_byte(players);
				write_string(msg);
				message_end();
			}
		}
	} 
}




bio_zombie_tight
| Afiseaza codul
#include <amxmodx>
#include <biohazard>
#include <engine>
#include <hamsandwich>

#define PLUGIN  "[Bio] Zombie Class: Tight"
#define AUTHOR  "Aragon*"
#define VERSION "1.0"

#define ZOMBIE_NAME	"Tight"						//Zombie Name
#define ZOMBIE_DESC	"Multi Jump( 10 Jumps )"				//Zobmie Description
#define ZOMBIE_MODEL 		"models/player/bio30_tight/bio30_tight.mdl"
#define ZOMBIE_CLAWS 		"models/player/bio30_tight/claws_tight.mdl"
#define ZOMBIE_HEALTH		520.0	//Health value
#define ZOMBIE_SPEED		340.0	//Speed value
#define ZOMBIE_GRAVITY		0.7	//Gravity multiplier
#define ZOMBIE_ATTACK		1.3	//Zombie damage multiplier
#define ZOMBIE_REGENDLY		0.33	//Regeneration delay value
#define ZOMBIE_KNOCKBACK	2.12	//Knockback multiplier
#define ZOMBIE_NOFLASH		0.0	//No flash
#define ZOMBIE_ONLYVIP		0.0	//VIP ?

new Class;
new jumpznum[33] = 0
new bool:dozjump[33] = false  
new jumps

public plugin_init() {         
	register_plugin(PLUGIN,AUTHOR,VERSION)
	is_biomod_active() ? plugin_init2() : pause("ad")
	}
	
public plugin_init2() {    
	register_plugin(PLUGIN,AUTHOR,VERSION)
	Class = register_class(ZOMBIE_NAME, ZOMBIE_DESC)
	set_class_pmodel(Class, ZOMBIE_MODEL)
	set_class_wmodel(Class, ZOMBIE_CLAWS)
	set_class_data(Class, DATA_HEALTH, ZOMBIE_HEALTH);
	set_class_data(Class, DATA_SPEED, ZOMBIE_SPEED);
	set_class_data(Class, DATA_GRAVITY, ZOMBIE_GRAVITY);
	set_class_data(Class, DATA_ATTACK, ZOMBIE_ATTACK);
	set_class_data(Class, DATA_REGENDLY, ZOMBIE_REGENDLY);
	set_class_data(Class, DATA_KNOCKBACK, ZOMBIE_KNOCKBACK);
	set_class_data(Class, DATA_NOFLASH, ZOMBIE_NOFLASH);
	set_class_data(Class, DATA_ONLYVIP, ZOMBIE_ONLYVIP);
	
	jumps = register_cvar("bio_tight_multijump","6")  // +1 jumps
	RegisterHam(Ham_Spawn, "player", "Spawn", 1);
	register_event("DeathMsg", "Death", "a")
	}
public plugin_precache() {
	precache_model(ZOMBIE_MODEL)
	precache_model(ZOMBIE_CLAWS)
	}
	
public Spawn(id) {
	jumpznum[id] = 0
	dozjump[id] = false
	}
	
public Death() {
	jumpznum[read_data(2)] = 0
	dozjump[read_data(2)] = false
	}
	
public client_PreThink(id) {
	if(!is_user_alive(id) || !is_user_zombie(id)) return PLUGIN_CONTINUE
	if(get_user_class(id) != Class) return PLUGIN_CONTINUE
    
	new nzbut = get_user_button(id)
	new ozbut = get_user_oldbutton(id)
	if((nzbut & IN_JUMP) && !(get_entity_flags(id) & FL_ONGROUND) && !(ozbut & IN_JUMP)) {
	if (jumpznum[id] < get_pcvar_num(jumps)) {
	dozjump[id] = true
	jumpznum[id]++
	return PLUGIN_CONTINUE
	}
	}
	if((nzbut & IN_JUMP) && (get_entity_flags(id) & FL_ONGROUND)) {
	jumpznum[id] = 0
	return PLUGIN_CONTINUE
	}    
	return PLUGIN_CONTINUE
	}

public client_PostThink(id) {
	if(!is_user_alive(id) || !is_user_zombie(id)) return PLUGIN_CONTINUE
	if(get_user_class(id) != Class) return PLUGIN_CONTINUE
    
	if(dozjump[id] == true) {
	new Float:vezlocityz[3]    
	entity_get_vector(id,EV_VEC_velocity,vezlocityz)
	vezlocityz[2] = random_float(265.0,285.0)
	entity_set_vector(id,EV_VEC_velocity,vezlocityz)
	dozjump[id] = false
	return PLUGIN_CONTINUE
	}    
	return PLUGIN_CONTINUE
	}


bio_zombie_strong
| Afiseaza codul
#include <amxmodx>
#include <biohazard>

#define PLUGIN  "[Bio] Zombie Class: Hercules"
#define AUTHOR  "YONTU"
#define VERSION "1.0"

#define ZOMBIE_NAME 	"Hercules"						//Zombie Name
#define ZOMBIE_DESC 	"Strong, Levitation, Extra Knockback"				//Zobmie Description
#define ZOMBIE_MODEL 	"models/player/bio30_zombie/bio30_zombie.mdl"			//Zombie Model
#define ZOMBIE_CLAWS 	"models/player/bio30_zombie/claws_zombie.mdl"			//Claws Model
#define ZOMBIE_HEALTH		660.0	//Health value
#define ZOMBIE_SPEED		325.0	//Speed value
#define ZOMBIE_GRAVITY		0.73	//Gravity multiplier
#define ZOMBIE_ATTACK		5.0	//Zombie damage multiplier
#define ZOMBIE_REGENDLY		2.0	//Regeneration delay value
#define ZOMBIE_KNOCKBACK	2.1	//Knockback multiplier
#define ZOMBIE_NOFLASH		0.0	//No flash
#define ZOMBIE_ONLYVIP		0.0	// Only VIP

new Class;

public plugin_init() {         
	register_plugin(PLUGIN,AUTHOR,VERSION)
	is_biomod_active() ? plugin_init2() : pause("ad")
	}
	
public plugin_init2() {       
	register_plugin(PLUGIN,AUTHOR,VERSION)
	Class = register_class(ZOMBIE_NAME, ZOMBIE_DESC)

	set_class_pmodel(Class, ZOMBIE_MODEL)
	set_class_wmodel(Class, ZOMBIE_CLAWS)
	set_class_data(Class, DATA_HEALTH, ZOMBIE_HEALTH);
	set_class_data(Class, DATA_SPEED, ZOMBIE_SPEED);
	set_class_data(Class, DATA_GRAVITY, ZOMBIE_GRAVITY);
	set_class_data(Class, DATA_ATTACK, ZOMBIE_ATTACK);
	set_class_data(Class, DATA_REGENDLY, ZOMBIE_REGENDLY);
	set_class_data(Class, DATA_KNOCKBACK, ZOMBIE_KNOCKBACK);
	set_class_data(Class, DATA_NOFLASH, ZOMBIE_NOFLASH);
	set_class_data(Class, DATA_ONLYVIP, ZOMBIE_ONLYVIP);
	}
public plugin_precache() {
	precache_model(ZOMBIE_MODEL)
	precache_model(ZOMBIE_CLAWS)
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/


bio_zombie_stamper
| Afiseaza codul
#include <amxmodx>
#include <biohazard>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <xs>

#define PLUGIN  "[Bio] Zombie Class: Stamper"
#define AUTHOR  "Aragon*"
#define VERSION "1.0"

#define ZOMBIE_NAME 	"Stamper"					//Zombie Name
#define ZOMBIE_DESC 	"Stamping the Coffin"				//Zobmie Description
#define ZOMBIE_MODEL 		"models/player/bio30_stamper/bio30_stamper.mdl"
#define ZOMBIE_CLAWS 		"models/player/bio30_stamper/claws_stamper.mdl"
#define ZOMBIE_HEALTH		530.0	//Health value
#define ZOMBIE_SPEED		330.0	//Speed value
#define ZOMBIE_GRAVITY		0.5	//Gravity multiplier
#define ZOMBIE_ATTACK		1.2	//Zombie damage multiplier
#define ZOMBIE_REGENDLY		0.25	//Regeneration delay value
#define ZOMBIE_KNOCKBACK	3.0	//Knockback multiplier
#define ZOMBIE_NOFLASH		0.0	//No flash
#define Z_ONLYVIP		0.0

#define TASK_COFFIN 1948
#define TASK_FREEZE 2105
#define TASK_COOLDOWN 7503
#define TASK_BOT 8209
#define TASK_HEALTH 3507

#define ID_COFFIN (taskid - TASK_COFFIN)
#define ID_FREEZE (taskid - TASK_FREEZE)
#define ID_COOLDOWN (taskid - TASK_COOLDOWN)
#define ID_BOT (taskid - TASK_BOT)
#define ID_HEALTH (taskid - TASK_HEALTH)

new const CLASSNAME[] = "Coffin"

new const SOUND_DROP[] = 	"Biohazard30/bio30_stamper/CoffinIronMaidenPlanting.wav"
new const SOUND_HIT[] = 		"debris/wood1.wav"
new const SOUND_EXPLODE[] = 	"Biohazard30/bio30_stamper/CoffinIronMaidenExplosion.wav"

new const MODEL[] = 		"models/Biohazard30/bio30_stamper/Coffin.mdl"

const UNIT_SECOND = (1<<12)
const BREAK_WOOD = 0x08

new Class
new Planting[33], Power_Cooldown[33], Frozen[33], Float:TempSpeed[33], bool:cd[33];
new SpriteBeam, SpriteExplode, SpriteBlast, SpriteTrapped

new CvarExplosionRadius, CvarExplosionDamage, CvarCooldown, CvareFreezeCooldown, CvarCoffinHealth, CvarHumanTrappedSpeed;

new const Tag[  ] = "[Biohazard]";

public plugin_init() {       
  
	register_plugin(PLUGIN,AUTHOR,VERSION)
	is_biomod_active() ? plugin_init2() : pause("ad")
}

public plugin_init2() { 

	Class = register_class(ZOMBIE_NAME, ZOMBIE_DESC)

	set_class_pmodel(Class, ZOMBIE_MODEL)
	set_class_wmodel(Class, ZOMBIE_CLAWS)
	set_class_data(Class, DATA_HEALTH, ZOMBIE_HEALTH);
	set_class_data(Class, DATA_SPEED, ZOMBIE_SPEED);
	set_class_data(Class, DATA_GRAVITY, ZOMBIE_GRAVITY);
	set_class_data(Class, DATA_ATTACK, ZOMBIE_ATTACK);
	set_class_data(Class, DATA_REGENDLY, ZOMBIE_REGENDLY);
	set_class_data(Class, DATA_KNOCKBACK, ZOMBIE_KNOCKBACK);
	set_class_data(Class, DATA_NOFLASH, ZOMBIE_NOFLASH);
	set_class_data(Class, DATA_ONLYVIP, Z_ONLYVIP);
	
	CvarExplosionRadius = register_cvar("bio_coffin_explosion_radius", "200.0")
	CvarExplosionDamage = register_cvar("bio_coffin_explosion_damage", "80.0")
	CvarCooldown = register_cvar("bio_coffin_cooldown", "25")
	CvareFreezeCooldown = register_cvar("bio_coffin_freeze_cooldown", "10.0")
	CvarCoffinHealth = register_cvar("bio_coffin_health", "500.0")
	CvarHumanTrappedSpeed = register_cvar("bio_coffin_human_traped_speed", "50.0")

	register_clcmd("drop", "Coffin")

	register_event("HLTV", "RoundStart", "a", "1=0", "2=0")
	register_event("DeathMsg", "Death", "a")
	register_event("CurWeapon","CurWeapon","be","1=1")

	register_logevent("RoundEnd", 2, "1=Round_End")

	RegisterHam(Ham_TraceAttack, "info_target", "CoffinTraceAttack")
	RegisterHam(Ham_Think, "info_target", "CoffinThink")
}

public plugin_precache() {

	precache_model(ZOMBIE_MODEL)
	precache_model(ZOMBIE_CLAWS)	
	precache_sound(SOUND_DROP)
	precache_sound(SOUND_HIT)
	precache_sound(SOUND_EXPLODE)
	precache_model(MODEL)

	SpriteBeam = precache_model("sprites/shockwave.spr")
	SpriteExplode = precache_model("models/woodgibs.mdl")
	SpriteBlast = precache_model("sprites/Biohazard30/Weapons/K1ases/k1ases_ability.spr")
	SpriteTrapped = precache_model("sprites/Biohazard30/bio30_stamper/Trap.spr")
}
	
public client_putinserver(id) {
	ResetValue(id)
	}

public client_disconnect(id) {
	ResetValue(id)
	}

public RoundStart() {
	for(new id = 1; id <= get_maxplayers(); id++) {
	if(is_user_connected(id)) ResetValue(id);
	}
	}

public RoundEnd() {
	RemoveAllCoffin()
	}

public Death() {
	new id = read_data(2)
	if(is_user_connected(id)) ResetValue(id);
	}
	
public CurWeapon(id) {
	if(!is_user_alive(id)) return PLUGIN_CONTINUE;
	
	if(Frozen[id]) set_pev(id, pev_maxspeed, get_pcvar_float(CvarHumanTrappedSpeed));
	
	return PLUGIN_CONTINUE;
	}
	
public event_infect(victim, attacker) {
	if(get_user_class(victim) == Class) {
		ResetValue(victim)
		ColorChat(victim, "^x04%s^x01 Pentru a planta un^x03 Coffin^x01 apasa tasta^x03 G^x01.", Tag)
	}
}

public Coffin(id) {
	if(!is_user_alive(id) || !is_user_zombie(id)) return PLUGIN_CONTINUE
	
	if(get_user_class(id) == Class && get_user_weapon(id) == CSW_KNIFE) {
	if(!Planting[id] && !cd[id]) {
	Planting[id] = 1	
	TaskCoffin(id)
	return PLUGIN_HANDLED
	}
	}

	return PLUGIN_CONTINUE
	}

public TaskCoffin(id) {
	Planting[id] = 0
	cd[id] = true;
	Power_Cooldown[id] = get_pcvar_num(CvarCooldown)
	CreateCoffinCancer(id)
	set_task(get_pcvar_float(CvarCooldown), "ResetCooldown", id)
	Power_Cooldown[id] = get_pcvar_num(CvarCooldown)
	set_task(1.0, "ShowHUD", id, _, _, "b")
	set_hudmessage(0, 100, 200, 0.05, 0.60, 0, 1.0, 1.1, 0.0, 0.0, -11)
	if(get_pcvar_num(CvarCooldown) != 1) {
	show_hudmessage(id, "Puterea iti va reveni in: %d secunde.",get_pcvar_num(CvarCooldown))
	}
	if(get_pcvar_num(CvarCooldown) == 1) {
	show_hudmessage(id, "Puterea iti va reveni in: %d secunda.",get_pcvar_num(CvarCooldown))
	}
	}
	
public ShowHUD(id) {
	if (!is_user_alive(id) || !is_user_zombie(id) || get_user_class(id) != Class) {
	remove_task(id)
	cd[id] = false
	Power_Cooldown[id] = 0;
	return PLUGIN_HANDLED
	}
	set_hudmessage(0, 100, 200, 0.05, 0.60, 0, 1.0, 1.1, 0.0, 0.0, -11)
	if(is_user_alive(id) && Power_Cooldown[id] == 1) {
	Power_Cooldown[id] --;
	show_hudmessage(id, "Puterea iti va reveni in: %d secunda.",Power_Cooldown[id])
	}
	if(is_user_alive(id) && Power_Cooldown[id] > 1) {
	Power_Cooldown[id] --;
	show_hudmessage(id, "Puterea iti va reveni in: %d secunde.",Power_Cooldown[id])
	}
	if(Power_Cooldown[id] <= 0) {
	show_hudmessage(id, "Ti-a revenit puterea.")
	remove_task(id)
	cd[id] = false
	Power_Cooldown[id] = 0;
	}
	return PLUGIN_HANDLED
	}
	
public ResetCooldown(id) {
	Power_Cooldown[id] = 0
	cd[id] = false
	ColorChat(id, "^x04%s^x01 Apasa din nou tasta^x03 G^x01 pentru a planta un Coffin.", Tag)
	}

public ResetFreeze(taskid) {
	UnFreezePlayer(ID_FREEZE)
	}

public CoffinTraceAttack(ent, attacker, Float: damage, Float: direction[3], trace, damageBits) {
	if(ent == attacker || !is_user_connected(attacker) || !is_valid_ent(ent)) return HAM_IGNORED;
	
	if(!(damageBits & DMG_BULLET)) return HAM_IGNORED;
	
	new className[32];
	entity_get_string(ent, EV_SZ_classname, className, charsmax(className))
	
	if(!equali(className, CLASSNAME)) return HAM_IGNORED;
	
	new Float: end[3]
	get_tr2(trace, TR_vecEndPos, end);
	
	message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
	write_byte(TE_SPARKS)
	engfunc(EngFunc_WriteCoord, end[0])
	engfunc(EngFunc_WriteCoord, end[1])
	engfunc(EngFunc_WriteCoord, end[2])
	message_end()
	
	emit_sound(ent, CHAN_VOICE, SOUND_HIT,  VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	
	return HAM_IGNORED;
	}

public CoffinThink(ent) {
	if(!is_valid_ent(ent)) return;
	
	static className[32];
	entity_get_string(ent, EV_SZ_classname, className, charsmax(className))
	
	if(!equali(className, CLASSNAME)) return;
	
	CoffinExplodeKaboom(ent)
	}

CreateCoffinCancer(id) {	

	new Float: origin[3], Float: angle[3], Float:angle2[3], Float:vector[3]
	entity_get_vector(id, EV_VEC_origin, origin)
	get_origin_distance(id, vector, 40.0)

	vector[2] += 25.0
	entity_get_vector(id, EV_VEC_angles, angle)

	new ent = create_entity("info_target")
	entity_set_string(ent, EV_SZ_classname, CLASSNAME)
	entity_get_vector(ent, EV_VEC_angles, angle2)
	angle[0] = angle2[0]
	entity_set_vector(ent, EV_VEC_angles, angle)
	entity_set_origin(ent, vector)
	entity_set_float(ent, EV_FL_takedamage, 1.0)
	entity_set_float(ent, EV_FL_health, 1000.0+get_pcvar_float(CvarCoffinHealth))
	entity_set_model(ent, MODEL)
	entity_set_int(ent, EV_INT_movetype, MOVETYPE_PUSHSTEP)
	entity_set_int(ent, EV_INT_solid, SOLID_BBOX)

	new Float:mins[3] = {-10.0, -6.0, -36.0}
	new Float:maxs[3] = {10.0, 6.0, 36.0}

	entity_set_size(ent, mins, maxs)
	entity_set_int(ent, EV_INT_iuser2, id)
	drop_to_floor(ent)
	
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
	write_byte(TE_BEAMCYLINDER)
	engfunc(EngFunc_WriteCoord, origin[0])
	engfunc(EngFunc_WriteCoord, origin[1])
	engfunc(EngFunc_WriteCoord, origin[2])
	engfunc(EngFunc_WriteCoord, origin[0])
	engfunc(EngFunc_WriteCoord, origin[1])
	engfunc(EngFunc_WriteCoord, origin[2]+200.0)
	write_short(SpriteBeam)
	write_byte(0)
	write_byte(0)
	write_byte(4)
	write_byte(10)
	write_byte(0)
	write_byte(150)
	write_byte(150)
	write_byte(150)
	write_byte(200)
	write_byte(0)
	message_end()

	emit_sound(ent, CHAN_VOICE, SOUND_DROP,  VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	set_task(0.2, "TaskCoffinHealth", ent+TASK_HEALTH, _, _, "b")
	entity_set_float(ent, EV_FL_nextthink, get_gametime() + get_pcvar_float(CvarCooldown))
	
	static victim; victim = -1
	while((victim = find_ent_in_sphere(victim, origin, get_pcvar_float(CvarExplosionRadius))) != 0) {
	if(!is_user_alive(victim) || is_user_zombie(victim) || Frozen[victim]) continue;
	
	SetFreezePlayer(victim)
	CreateScreenShake(victim)
	set_task(get_pcvar_float(CvareFreezeCooldown), "ResetFreeze", victim+TASK_FREEZE)
	}
	set_task(0.2, "CheckStuck", ent)
	}

public CheckStuck(ent) {
	if(!is_valid_ent(ent)) return;
	
	if(is_player_stuck(ent)) CoffinExplodeKaboom(ent);
	}

public TaskCoffinHealth(taskid) {
	if(!is_valid_ent(ID_HEALTH)) return;
	
	if(pev(ID_HEALTH, pev_health) < 1000.0) CoffinExplodeKaboom(ID_HEALTH);
	}

CoffinExplodeKaboom(ent) {
	if(!is_valid_ent(ent)) return;

	remove_task(ent+TASK_HEALTH)
	
	static Float:flOrigin[3]
	entity_get_vector(ent, EV_VEC_origin, flOrigin)
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, flOrigin[0])
	engfunc(EngFunc_WriteCoord, flOrigin[1])
	engfunc(EngFunc_WriteCoord, flOrigin[2])
	write_short(SpriteBlast)
	write_byte(40)
	write_byte(30)
	write_byte(14)
	message_end()
	
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flOrigin, 0)
	write_byte(TE_BREAKMODEL)
	engfunc(EngFunc_WriteCoord, flOrigin[0])
	engfunc(EngFunc_WriteCoord, flOrigin[1])
	engfunc(EngFunc_WriteCoord, flOrigin[2]+24)
	engfunc(EngFunc_WriteCoord, 16)
	engfunc(EngFunc_WriteCoord, 16)
	engfunc(EngFunc_WriteCoord, 16)
	engfunc(EngFunc_WriteCoord, random_num(-50, 50))
	engfunc(EngFunc_WriteCoord, random_num(-50, 50))
	engfunc(EngFunc_WriteCoord, 25)
	write_byte(10)
	write_short(SpriteExplode)
	write_byte(10)
	write_byte(25)
	write_byte(BREAK_WOOD)
	message_end()
	
	emit_sound(ent, CHAN_VOICE, SOUND_EXPLODE,  VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
	
	static attacker; attacker = entity_get_int(ent, EV_INT_iuser2)
	
	if (!is_user_connected(attacker)) {
	remove_entity(ent)
	return;
	}
	
	static victim; victim = -1
	
	while((victim = find_ent_in_sphere(victim, flOrigin, get_pcvar_float(CvarExplosionRadius))) != 0) {
	if(!is_user_alive(victim) || !is_valid_ent(victim)) continue;
		
	CreateScreenShake(victim)
		
	if(get_user_health(victim) > get_pcvar_float(CvarExplosionDamage)) ExecuteHam(Ham_TakeDamage, victim, attacker, attacker, get_pcvar_float(CvarExplosionDamage), DMG_BLAST);
	else ExecuteHamB(Ham_Killed, victim, attacker, 0);
	}
	remove_entity(ent)
	}

SetFreezePlayer(id) {
	Frozen[id] = 1
	pev(id, pev_maxspeed, TempSpeed[id])
	set_pev(id, pev_maxspeed, get_pcvar_float(CvarHumanTrappedSpeed))
	client_print(id, print_center, "You are trapped right now!")
	CreateSlowSprites(id)
	}

UnFreezePlayer(id) {
	Frozen[id] = 0
	if(is_user_zombie(id)) return;
	set_pev(id, pev_maxspeed, TempSpeed[id])
	client_print(id, print_center, "You no longer trapped!")
	RemoveSlowSprites(id)
	}

RemoveAllCoffin() {	
	new ent
	ent = find_ent_by_class(-1, CLASSNAME)
	
	while(ent > 0) {
	remove_task(ent+TASK_HEALTH)
	remove_entity(ent)
	ent = find_ent_by_class(-1, CLASSNAME)
	}
	}

get_origin_distance(index, Float:origin[3], Float:dist) {
	new Float:start[3]
	new Float:view_ofs[3]
	
	pev(index, pev_origin, start)
	pev(index, pev_view_ofs, view_ofs)
	xs_vec_add(start, view_ofs, start)
	
	new Float:dest[3]
	pev(index, pev_angles, dest)
	
	engfunc(EngFunc_MakeVectors, dest)
	global_get(glb_v_forward, dest)
	
	xs_vec_mul_scalar(dest, dist, dest)
	xs_vec_add(start, dest, dest)
	
	engfunc(EngFunc_TraceLine, start, dest, 0, index, 0)
	get_tr2(0, TR_vecEndPos, origin)
	
	return 1
	}

is_player_stuck(id) {
	static Float:originF[3]
	pev(id, pev_origin, originF)
	
	engfunc(EngFunc_TraceHull, originF, originF, 0, (pev(id, pev_flags) & FL_DUCKING) ? HULL_HEAD : HULL_HUMAN, id, 0)
	
	if (get_tr2(0, TR_StartSolid) || get_tr2(0, TR_AllSolid) || !get_tr2(0, TR_InOpen))
		return true
	
	return false
	}

CreateScreenShake(id) {
	if(is_user_connected(id)) {
	new shake[3]
	shake[0] = random_num(2,20)
	shake[1] = random_num(2,5)
	shake[2] = random_num(2,20)
	message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenShake"), _, id)
	write_short(UNIT_SECOND*shake[0])
	write_short(UNIT_SECOND*shake[1])
	write_short(UNIT_SECOND*shake[2])
	message_end()
	}
	}

CreateSlowSprites(id) {
	if(is_user_connected(id)) {
	message_begin(MSG_ALL, SVC_TEMPENTITY)
	write_byte(TE_PLAYERATTACHMENT)
	write_byte(id)
	write_coord(35)
	write_short(SpriteTrapped)
	write_short(999)
	message_end()
	}
	}

RemoveSlowSprites(id) {
	if(is_user_connected(id)) {
	message_begin(MSG_ALL, SVC_TEMPENTITY)
	write_byte(TE_KILLPLAYERATTACHMENTS)
	write_byte(id)
	message_end()
	}
	}

ResetValue(id) {
	if(Frozen[id]) RemoveSlowSprites(id);
	
	Planting[id] = 0
	Power_Cooldown[id] = 0
	Frozen[id] = 0
	cd[id] = false
	
	remove_task(id+TASK_COFFIN)
	remove_task(id+TASK_FREEZE)
	remove_task(id+TASK_COOLDOWN)
	remove_task(id+TASK_BOT)
	}

stock ColorChat(const id, const input[], any:...) {
	new count = 1, players[32];
	static msg[191];
	vformat(msg, 190, input, 3);
 
	replace_all(msg, 190, "!x04", "^4");
	replace_all(msg, 190, "!x01", "^1");
	replace_all(msg, 190, "!x03", "^3");
 
	if(id) players[0] = id;
	else get_players(players, count, "ch"); {
	for(new i = 0; i < count; i++) {
	if(is_user_connected(players)) {
	message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players);
	write_byte(players);
	write_string(msg);
	message_end();
	}
	}
	}
	}


bio_zombie_smoker
| Afiseaza codul
#include <amxmodx>
#include <biohazard>
#include <fakemeta>
#include <hamsandwich>
#include <engine>

#define PLUGIN  "[Bio] Zombie: Smoker"
#define AUTHOR  "MaHu"
#define VERSION "0.1"

#define ICON_HIDE 0
#define ICON_SHOW 1
#define ICON_FLASH 2

#define D_ZOMBIE_NAME "Smoker"
#define D_ZOMBIE_DESC "Can drag players"
#define D_PLAYER_MODEL "models/player/bio30_smoker/bio30_smoker.mdl"
#define D_CLAWS "models/player/bio30_smoker/claws_smoker.mdl"

//Sounds
new g_sndMiss[] = "Biohazard30/bio30_smoker/Smoker_TongueHit_miss.wav"
new g_sndDrag[] = "Biohazard30/bio30_smoker/Smoker_TongueHit_drag.wav"


//Some vars
new g_hooked[33], g_hooksLeft[33], g_unable2move[33], g_ovr_dmg[33]
new Float:g_lastHook[33]
new bool: g_bind_use[33] = false, bool: g_drag_i[33] = false

//Cvars
new cvar_maxdrags, cvar_dragspeed, cvar_cooldown, cvar_dmg2stop, cvar_mates, cvar_unb2move;

//Menu keys
new g_class
new g_Line

new const Tag[  ] = "[Biohazard]";

public plugin_precache( )
{
	precache_model(D_PLAYER_MODEL)
	precache_model(D_CLAWS)
	precache_sound(g_sndDrag)
	precache_sound(g_sndMiss)
	g_Line = precache_model("sprites/zbeam4.spr")
}

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	is_biomod_active(  ) ? plugin_init2(  ) : pause( "ad" );
}

public plugin_init2(  ) {
	
	cvar_dragspeed = register_cvar("bio_smoker_dragspeed", "260")
	cvar_maxdrags = register_cvar("bio_smoker_maxdrags", "10")
	cvar_cooldown = register_cvar("bio_smoker_cooldown", "15")
	cvar_dmg2stop = register_cvar("bio_smoker_dmg2stop", "75")
	cvar_mates = register_cvar("bio_smoker_mates", "0")
	cvar_unb2move = register_cvar("bio_smoker_unable_move", "1")

	register_clcmd("+drag","drag_start", ADMIN_USER, "bind ^"key^" ^"+drag^"")
	register_clcmd("-drag","drag_end")
	
	register_event("ResetHUD", "newSpawn", "b")
	register_event("DeathMsg", "smoker_death", "a")
	
	register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
	
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage")
	
	g_class = register_class(D_ZOMBIE_NAME, D_ZOMBIE_DESC)
	
	if(g_class != -1)
	{
		set_class_data(g_class, DATA_HEALTH, 510.0)
		set_class_data(g_class, DATA_SPEED, 320.0)
		set_class_data(g_class, DATA_GRAVITY, 0.91)
		set_class_data(g_class, DATA_ATTACK, 1.6)
		set_class_data(g_class, DATA_REGENDLY, 0.20)
		set_class_data(g_class, DATA_KNOCKBACK, 1.0)
		set_class_data(g_class, DATA_NOFLASH, 0.0)
		set_class_data(g_class, DATA_ONLYVIP, 0.0)
		set_class_pmodel(g_class, D_PLAYER_MODEL)
		set_class_wmodel(g_class, D_CLAWS)
	}
	
}

public event_infect(victim) {
	
	if(get_user_class(victim) == g_class){
		
		g_hooksLeft[victim] = get_pcvar_num(cvar_maxdrags)
		ColorChat(victim,"!g%s!y Pentru a trage supravietuitorii la tine apasa tasta!t Z!y!", Tag)
		client_cmd( victim, "bind z +drag" );

	}
	
	return PLUGIN_CONTINUE
}

public newSpawn(id)
{
	if (g_hooked[id])
		drag_end(id)
}
public drag_start(id) // starts drag, checks if player is Smoker, checks cvars
{		
	if (is_user_zombie(id) && (get_user_class(id) == g_class) && !g_drag_i[id]) {
		
		static Float:cdown
		cdown = get_pcvar_float(cvar_cooldown)
		
		if (!is_user_alive(id)) {
			ColorChat(id,"!g%s!t Nu poti atrage cand esti mort!", Tag)
			return PLUGIN_HANDLED
		}
		
		if (g_hooksLeft[id] <= 0) {
			ColorChat(id,"!g%s!t Nu poti atrage mai multi oameni!", Tag)
			return PLUGIN_HANDLED
		}
		
		if (get_gametime() - g_lastHook[id] < cdown) {
			ColorChat(id,"!g%s!y Asteapta!t %.f sec.!y sa atragi din nou!", Tag, get_pcvar_float(cvar_cooldown) - (get_gametime() - g_lastHook[id]))
			return PLUGIN_HANDLED
		}
		
		new hooktarget, body
		get_user_aiming(id, hooktarget, body)
		
		if (is_user_alive(hooktarget)) {
			if (!is_user_zombie(hooktarget))
			{
				
				g_hooked[id] = hooktarget
				emit_sound(hooktarget, CHAN_BODY, g_sndDrag, 1.0, ATTN_NORM, 0, PITCH_HIGH)
			}
			else
			{
				if (get_pcvar_num(cvar_mates) == 1)
				{
					g_hooked[id] = hooktarget
					emit_sound(hooktarget, CHAN_BODY, g_sndDrag, 1.0, ATTN_NORM, 0, PITCH_HIGH)
				}
				else
				{
					ColorChat(id,"!g%s!t Nu poti atrage coechipieri!", Tag)
					return PLUGIN_HANDLED
				}
			}
			
			if (get_pcvar_float(cvar_dragspeed) <= 0.0)
				cvar_dragspeed = 1
			
			new parm[2]
			parm[0] = id
			parm[1] = hooktarget
			
			set_task(0.1, "smoker_reelin", id, parm, 2, "b")
			harpoon_target(parm)
			
			g_hooksLeft[id]--
			ColorChat(id,"!g%s!y mai poti targe jucatorul inca de!t %d!y ori !", Tag, g_hooksLeft[id])
			g_drag_i[id] = true
			
			if(get_pcvar_num(cvar_unb2move) == 1)
				g_unable2move[hooktarget] = true
			
			if(get_pcvar_num(cvar_unb2move) == 2)
				g_unable2move[id] = true
			
			if(get_pcvar_num(cvar_unb2move) == 3)
			{
				g_unable2move[hooktarget] = true
				g_unable2move[id] = true
			}
			} else {
			g_hooked[id] = 33
			noTarget(id)
			emit_sound(hooktarget, CHAN_BODY, g_sndMiss, 1.0, ATTN_NORM, 0, PITCH_HIGH)
			g_drag_i[id] = true
			g_hooksLeft[id]--
			ColorChat(id,"!g%s!y mai poti targe jucatorul inca de!t %d!y ori!", Tag, g_hooksLeft[id] )
		}
	}
	else
		return PLUGIN_HANDLED
	
	return PLUGIN_CONTINUE
}
public smoker_reelin(parm[]) // dragging player to smoker
{
	new id = parm[0]
	new victim = parm[1]
	
	if (!g_hooked[id] || !is_user_alive(victim))
	{
		drag_end(id)
		return
	}
	
	new Float:fl_Velocity[3]
	new idOrigin[3], vicOrigin[3]
	
	get_user_origin(victim, vicOrigin)
	get_user_origin(id, idOrigin)
	
	new distance = get_distance(idOrigin, vicOrigin)
	
	if (distance > 1) {
		new Float:fl_Time = distance / get_pcvar_float(cvar_dragspeed)
		
		fl_Velocity[0] = (idOrigin[0] - vicOrigin[0]) / fl_Time
		fl_Velocity[1] = (idOrigin[1] - vicOrigin[1]) / fl_Time
		fl_Velocity[2] = (idOrigin[2] - vicOrigin[2]) / fl_Time
		} else {
		fl_Velocity[0] = 0.0
		fl_Velocity[1] = 0.0
		fl_Velocity[2] = 0.0
	}
	
	entity_set_vector(victim, EV_VEC_velocity, fl_Velocity) //<- rewritten. now uses engine
}

public drag_end(id) // drags end function
{
	g_hooked[id] = 0
	beam_remove(id)
	remove_task(id)
	
	if (g_drag_i[id])
		g_lastHook[id] = get_gametime()
	
	g_drag_i[id] = false
	g_unable2move[id] = false
}

public smoker_death() // if smoker dies drag off
{
	new id = read_data(2)
	
	beam_remove(id)
	
	if (g_hooked[id])
		drag_end(id)
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage) // if take damage drag off
{
	if (is_user_alive(attacker) && (get_pcvar_num(cvar_dmg2stop) > 0))
	{
		g_ovr_dmg[victim] = g_ovr_dmg[victim] + floatround(damage)
		if (g_ovr_dmg[victim] >= get_pcvar_num(cvar_dmg2stop))
		{
			g_ovr_dmg[victim] = 0
			drag_end(victim)
			return HAM_IGNORED;
		}
	}
	
	return HAM_IGNORED;
}
public fw_PlayerPreThink(id)
{
	if (!is_user_alive(id))
		return FMRES_IGNORED
	
	new button = get_user_button(id)
	new oldbutton = get_user_oldbutton(id)
	
	if (g_bind_use[id] && is_user_zombie(id) && get_user_class(id) == g_class)
	{
		if (!(oldbutton & IN_USE) && (button & IN_USE))
			drag_start(id)
		
		if ((oldbutton & IN_USE) && !(button & IN_USE))
			drag_end(id)
	}
	
	if (!g_drag_i[id]) {
		g_unable2move[id] = false
	}
	
	if (g_unable2move[id] && get_pcvar_num(cvar_unb2move) > 0)
	{
		set_pev(id, pev_maxspeed, 1.0)
	}
	
	return PLUGIN_CONTINUE
}
public harpoon_target(parm[]) // set beam (ex. tongue:) if target is player
{
	new id = parm[0]
	new hooktarget = parm[1]
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(8)	// TE_BEAMENTS
	write_short(id)
	write_short(hooktarget)
	write_short(g_Line)	// sprite index
	write_byte(0)	// start frame
	write_byte(0)	// framerate
	write_byte(200)	// life
	write_byte(8)	// width
	write_byte(1)	// noise
	write_byte(155)	// r, g, b
	write_byte(155)	// r, g, b
	write_byte(55)	// r, g, b
	write_byte(90)	// brightness
	write_byte(10)	// speed
	message_end()
}

public noTarget(id) // set beam if target isn't player
{
	new endorigin[3]
	
	get_user_origin(id, endorigin, 3)
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte( TE_BEAMENTPOINT ); // TE_BEAMENTPOINT
	write_short(id)
	write_coord(endorigin[0])
	write_coord(endorigin[1])
	write_coord(endorigin[2])
	write_short(g_Line) // sprite index
	write_byte(0)	// start frame
	write_byte(0)	// framerate
	write_byte(200)	// life
	write_byte(8)	// width
	write_byte(1)	// noise
	write_byte(155)	// r, g, b
	write_byte(155)	// r, g, b
	write_byte(55)	// r, g, b
	write_byte(75)	// brightness
	write_byte(0)	// speed
	message_end()
}

public beam_remove(id) // remove beam
{
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(99)	//TE_KILLBEAM
	write_short(id)	//entity
	message_end()
}

stock ColorChat(const id, const input[], any:...) {
	new count = 1, players[32];
	static msg[191];
	vformat(msg, 190, input, 3);
	
	replace_all(msg, 190, "!g", "^4");
	replace_all(msg, 190, "!y", "^1");
	replace_all(msg, 190, "!t", "^3");
	
	if(id) players[0] = id;
	else get_players(players, count, "ch"); {
		for(new i = 0; i < count; i++) {
			if(is_user_connected(players)) {
				message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players);
				write_byte(players);
				write_string(msg);
				message_end();
			}
		}
	} 
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/


bio_zombie_raptor
| Afiseaza codul
#include <amxmodx>
#include <biohazard>
#include <hamsandwich>
#include <fakemeta_util>

#define STR_T 32
#define MAX_PLAYERS 32

#define D_ZOMBIE_NAME		"Raptor"
#define D_ZOMBIE_DESC		"Can climbing on walls"
#define D_PLAYER_MODEL 	"models/player/bio30_raptor/bio30_raptor.mdl"		//Zombie Model
#define D_CLAWS	 	"models/player/bio30_raptor/claws_raptor.mdl"	//Claws Model

new g_class	
new cvar_speed, cvar_delay

new Float:g_wallorigin[33][3]
new Float:g_nextdmg[33]
new Float:g_shoottime[33]

public plugin_init()
{         
	register_plugin("bio_raptor","1.2b","bipbip")
	is_biomod_active() ? plugin_init2() : pause("ad")
}
public plugin_precache()
{
	precache_model(D_PLAYER_MODEL)
	precache_model(D_CLAWS)
}

public plugin_init2()
{
	g_class = register_class(D_ZOMBIE_NAME, D_ZOMBIE_DESC)

	if(g_class != -1)
	{
		set_class_data(g_class, DATA_HEALTH, 490.0)
		set_class_data(g_class, DATA_SPEED, 350.0)
		set_class_data(g_class, DATA_GRAVITY, 0.7)
		set_class_data(g_class, DATA_ATTACK, 3.0)
		set_class_data(g_class, DATA_REGENDLY, 2.0)
		set_class_data(g_class, DATA_KNOCKBACK, 1.5)
		set_class_data(g_class, DATA_NOFLASH, 0.0)
		set_class_data(g_class, DATA_ONLYVIP, 0.0)
		set_class_pmodel(g_class, D_PLAYER_MODEL)
		set_class_wmodel(g_class, D_CLAWS)
	}
	
	cvar_speed = register_cvar("bio_climbingspeed", "200")
	cvar_delay = register_cvar("bio_climbdelay", "0.1")

	RegisterHam(Ham_Touch, "player", "cheese_player_touch", 1)
	RegisterHam(Ham_Player_PreThink, "player", "cheese_player_prethink", 1)
	RegisterHam(Ham_TakeDamage, "player", "cheese_takedamage", 1)
}


public cheese_player_touch(id, world) {
	
	if(!is_user_alive(id) || g_class != get_user_class(id))
		return HAM_IGNORED
	
	new classname[STR_T]
	pev(world, pev_classname, classname, (STR_T-1))
	
	if(equal(classname, "worldspawn") || equal(classname, "func_wall") || equal(classname, "func_breakable"))
		pev(id, pev_origin, g_wallorigin[id])

	return HAM_IGNORED	
	
}

public cheese_player_prethink(id) {

	// Player not alive or not zombie
	if(!is_user_alive(id) || !is_user_zombie(id)) {
		return HAM_IGNORED
	}

	// Player has not our zombie class
	if(g_class != get_user_class(id)) {
		return HAM_IGNORED
	}

	static Float:origin[3]
	pev(id, pev_origin, origin)
	
	// from Cheap_Suit's  Upgrades Mod eXtended
	static button ; button = pev(id, pev_button)

	if(button & /*IN_ATTACK*/IN_JUMP)
	{
		if(get_distance_f(origin, g_wallorigin[id]) > 10.0)
			return HAM_IGNORED
		
		if(pev(id, pev_flags) & FL_ONGROUND)
			return HAM_IGNORED
		
		if (get_gametime() < g_shoottime[id]) {
			return HAM_IGNORED
		}
		
		if(button & IN_FORWARD)
		{
			static Float:velocity[3]
			velocity_by_aim(id, get_pcvar_num(cvar_speed), velocity)
			fm_set_user_velocity(id, velocity)
		}
		else if(button & IN_BACK)
		{
			static Float:velocity[3]
			velocity_by_aim(id, -get_pcvar_num(cvar_speed), velocity)
			fm_set_user_velocity(id, velocity)
		}
	}

	return HAM_IGNORED
}

public event_infect(victim, attacker) 
{
	if(is_user_alive(victim) && get_user_class(victim) == g_class)
	{
		g_nextdmg[victim] = 0.0
		g_shoottime[victim] = 0.0

		ColorChat( victim, "!g[Biohazard]!y Pentru a te catara pe pereti pasa butonul!t SPACE!y +!t W!y." );
	}
}

public cheese_takedamage(victim, inflictor, attacker, Float:damage, damagetype)
{
	if (is_user_alive(victim)) {
		if (g_class == get_user_class(victim)) {
			g_shoottime[victim] = get_gametime() + get_pcvar_float(cvar_delay);
		}
	}
	return HAM_IGNORED
}

stock ColorChat(const id, const input[], any:...) {
	new count = 1, players[32];
	static msg[191];
	vformat(msg, 190, input, 3);
	
	replace_all(msg, 190, "!g", "^4");
	replace_all(msg, 190, "!y", "^1");
	replace_all(msg, 190, "!t", "^3");
	
	if(id) players[0] = id;
	else get_players(players, count, "ch"); {
		for(new i = 0; i < count; i++) {
			if(is_user_connected(players)) {
				message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
				write_byte(players[i]);
				write_string(msg);
				message_end();
			}
		}
	} 
}


Si mai sunt.. vrei sa le pun pe toate?
Post Reply

Return to “Probleme la servere dedicate de Counter-Strike”

  • Information
  • Who is online

    Users browsing this forum: Google [Bot] and 33 guests