Available Ultimate VIP Features

Unpaid Requests, Public Plugins
User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#11

Post by Spir0x » 4 years ago

Guys, so who can tell me what's the problem on those codes ? give us a solution please.

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#12

Post by Night Fury » 4 years ago

Add

Code: Select all

#include <zombie_escape>
Before

Code: Select all

#include <ze_vip>
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#13

Post by Spir0x » 4 years ago

OK, I removed norecoil, antidote, leap, trail, now vip menu contains only 4 things.

1. Knife Menu
2. Guns Menu
3. Glow Menu
4. Daily Golds

Knife menu, and glow menu already compiled fine. still (daily golds and lycanthrope won't compile)

Daily Golds:

Code: Select all

#include <zombie_escape>
#include <ze_vip>
 
#define NV_NAME "GET_GOLDS"
#define VIP_ACCESS ADMIN_LEVEL_H
 
enum player_struct {
    mtime,bool:ftime,key[64]
}
new g_player[33][player_struct];
 
new cvar_save_type,cvar_time,cvar_coins;
 
public plugin_natives()
{
    register_plugin("ze_get_free_golds", "native_ze_get_free_golds", 1)
}
 
public native_ze_get_free_golds(id)
{
    if (!is_user_connected(id))
        return -1
 
    cmd_coins(id)
    return true
}
 
public plugin_init() {
 
    register_plugin("Get Escape Golds", "1.0", "ZE DEV TEAM");
   
    cvar_save_type = register_cvar("get_golds_save_type","1"); // how to save data 1 by authid, 2 by ip or 3 by name
    cvar_time = register_cvar("get_golds_minutes","720"); // time in minutes, 720minutes=12hours it will be auto calculated
    cvar_coins = register_cvar("get_golds_coins","200"); // how many coins to give
}
       
public cmd_coins(id) {
 
    new nv = nvault_open(NV_NAME);
   
    if(nv == INVALID_HANDLE) {
        ze_colored_print(id, "!tFor the moment getting golds system is inactive..");
        return;
    }
   
    new txt_min[32],txt_coins[10];
    new coins = get_pcvar_num(cvar_coins),pminutes = get_pcvar_num(cvar_time);
    copy(txt_coins,charsmax(txt_coins),(coins==1)?"coin":"coins");
    build_time(pminutes,txt_min,charsmax(txt_min));
   
    if(g_player[id][ftime]) {
        ze_colored_print(id, "!tYou have received !g%d !tGolds!y, !tget another in !g%s!y!",coins,txt_min);
        ze_set_escape_coins(id, ze_get_escape_coins(id) + coins);
        g_player[id][ftime]=false;
        nvault_touch(nv,g_player[id][key],g_player[id][mtime]=get_systime());
        return;
    }
   
    new user_time=get_systime()-g_player[id][mtime];
    new diff_min=(user_time<(pminutes*60))?pminutes-(user_time/60):pminutes;
    build_time(diff_min,txt_min,charsmax(txt_min));
   
    if(user_time>=(pminutes*60)) {
        ze_colored_print(id, "!tYou have just received !g%d !tGolds!y, !tsince !g%s !tpassed!y!",coins,txt_min);
        ze_set_escape_coins(id, ze_get_escape_coins(id) + coins);  
        nvault_touch(nv,g_player[id][key],g_player[id][mtime]=get_systime());
    }
    else
        ze_colored_print(id, "!tRetry again in !g%s !tfor getting !g%d !tmore Golds!y.",txt_min,coins);
       
    nvault_close(nv);
}
 
public client_putinserver(id) {
       
    new nv,data[32];
    get_auth(id,g_player[id][key],charsmax(g_player[][key]));
    g_player[id][mtime]=get_systime();
    g_player[id][ftime]=false;
    formatex(data,charsmax(data),"%d",g_player[id][mtime]);
   
    if((nv=nvault_open(NV_NAME))==INVALID_HANDLE)
        return;
   
    if(!nvault_lookup(nv,g_player[id][key],data,charsmax(data),g_player[id][mtime])) {
        nvault_set(nv,g_player[id][key],data);
        g_player[id][ftime]=true;
    }
   
    nvault_close(nv);
}    
 
public client_disconnected(id) {
   
    g_player[id][mtime]=0;
    g_player[id][ftime]=false;
}
 
stock get_auth(id,data[],len)
    switch(get_pcvar_num(cvar_save_type)) {
        case 1: get_user_authid(id,data,len);
        case 2: get_user_ip(id,data,len,1);
        case 3: get_user_name(id,data,len);
    }
 
stock build_time(pminutes,data[],len)
    if(pminutes==1)
        copy(data,len,"1 minute");
    else if(pminutes!=1&&pminutes<60)
        formatex(data,len,"%d minutes",pminutes);
    else if(pminutes==60)
        copy(data,len,"1 hour");
    else {
        new ptime=pminutes/60;
        if(ptime*60==pminutes)
            formatex(data,len,"%d %s",ptime,(ptime==1)?"hour":"hours");
        else {
            new diff=pminutes-ptime*60;
            formatex(data,len,"%d %s and %d %s",ptime,(ptime==1)?"hour":"hours",diff,(diff==1)?"minute":"minutes");
        }
    }
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1036\\ f0\\ fs16 \n\\ par }
*/
Lycanthrope:

Code: Select all

#include <zombie_escape>
#include <ze_vip>
#include <fakemeta_util>
#include <cstrike>
 
 
#define CSW_WEAPON_BASE CSW_P90
#define CSW_NEW_WEAPON  "weapon_lycanthrope"
#define CSW_OLD_WEAPON  "weapon_p90"
#define WEAPON_KEY  9299292
#define OLD_WEAPON  "models/w_p90.mdl"
#define is_user_valid(%1) (is_user_alive(%1) && !is_user_bot(%1) && !is_user_hltv(%1) && is_user_connected(%1))
#define VIP_ACCESS ADMIN_LEVEL_H
 
new const Weapon_Models[][] = { "models/Premuim_ZE/v_lycanthrope.mdl", "models/Premuim_ZE/p_lycanthrope.mdl", "models/Premuim_ZE/w_lycanthrope.mdl" }
new const Weapon_Sounds[][] = { "weapons/sg552-shot1.wav", "weapons/sg552-shot2.wav", "weapons/buffsg552_draw.wav", "weapons/buffsg552_idle.wav", "weapons/buffsg552_reload.wav", "weapons/buffsg552_reload_AF.wav" }
new const Weapon_Sprites[][] = { "sprites/weapon_lycanthrope.txt", "sprites/640hud148.spr" }
new const GUNSHOT_DECALS[] = { 41, 42, 43, 44, 45 }
 
new bool:g_Hasscope[33], g_hasZoom[33]
new Cvar_scope_Recoil, Cvar_scope_DMG, Cvar_scope_Clip, Cvar_scope_Ammo, Cvar_scope_Speed
new Float:cl_pushangle[33][3], g_Eventscope, g_scope_TmpClip[33], g_IsInPrimaryAttack, g_Shock
 
public plugin_natives()
{
    register_native("ze_give_lycanthrope", "native_ze_give_lycanthrope", 1)
}
 
public native_ze_give_lycanthrope(id)
{
    if (!is_user_connected(id))
        return -1
 
    Givescope(id)
    return true
}
 
public plugin_precache()
{
    for(new g = 0; g < sizeof(Weapon_Models); g++)
        precache_model(Weapon_Models[g])
    for(new h = 0; h < sizeof(Weapon_Sounds); h++)
        precache_sound(Weapon_Sounds[h])
    for(new t = 0; t < sizeof(Weapon_Sprites); t++)
        precache_generic(Weapon_Sprites[t])
       
    g_Shock = precache_model("sprites/lycanthrope_hit.spr")
       
    register_clcmd(CSW_NEW_WEAPON, "hook")
    register_forward(FM_PrecacheEvent, "Fw_Precache_Event", 1)
}
 
public hook(id)
{
    engclient_cmd(id, CSW_OLD_WEAPON)
    return PLUGIN_HANDLED
}
 
public plugin_init()
{
    register_plugin("[ZE] Extra Item: Lycanthrope", "1.0", "Jack GamePlay")
   
    // Events & Messages
    register_message(get_user_msgid("DeathMsg"), "DeathMsg")
    register_event("CurWeapon", "CurrentWeapon", "be", "1=1")
    register_event("HLTV", "New_Round", "a", "1=0", "2=0")
   
    // Forwards
    register_forward(FM_SetModel, "Fw_Set_Model", 1)
    register_forward(FM_PlaybackEvent, "Fw_Playback_Event")
    register_forward(FM_UpdateClientData, "Fw_Update_Clientdata", 1)
    register_forward(FM_CmdStart, "Fw_CmdStart")
   
    // Hook Chains
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "Fw_Take_DMG")
    // Hams
    RegisterHam(Ham_Weapon_PrimaryAttack, CSW_OLD_WEAPON, "Fw_PrimaryAttack")
    RegisterHam(Ham_Weapon_PrimaryAttack, CSW_OLD_WEAPON, "Fw_PrimaryAttack_Post", 1)
    RegisterHam(Ham_Item_AddToPlayer, CSW_OLD_WEAPON, "Fw_AddToPlayer")
    RegisterHam(Ham_Weapon_Reload, CSW_OLD_WEAPON, "Fw_Reload")
    RegisterHam(Ham_Weapon_Reload, CSW_OLD_WEAPON, "Fw_Reload_Post", 1)
    RegisterHam(Ham_Spawn, "player", "Fw_Spawn", 1)
    RegisterHam(Ham_TraceAttack, "worldspawn", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_breakable", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_wall", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_door", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_plat", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_rotating", "Fw_TraceAttack", 1)
    RegisterHam(Ham_Use, "func_tank", "Fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tankmortar", "Fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tankrocket", "Fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tanklaser", "Fw_UseStationary_Post", 1)
    RegisterHam(Ham_Item_Deploy, CSW_OLD_WEAPON, "Fw_Item_Deploy_Post", 1)
   
    // Cvars
    Cvar_scope_Recoil = register_cvar("ze_scope_recoil", "1.0")
    Cvar_scope_DMG = register_cvar("ze_scope_damage", "6")
    Cvar_scope_Clip = register_cvar("ze_scope_clip", "30")
    Cvar_scope_Ammo = register_cvar("ze_scope_ammo", "150")
    Cvar_scope_Speed = register_cvar("ze_scope_speed", "4.5")
}
 
public Fw_Item_Deploy_Post(weapon_ent)
{
    new id = get_pdata_cbase(weapon_ent, 41, 4)
    g_hasZoom[id] = false
    cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
    CurrentWeapon(id)
}
 
public Fw_UseStationary_Post(entity, caller, activator, use_type)
{
    if (use_type == 0 && is_user_valid(caller))
    {
        CurrentWeapon(caller)
    }
}
 
public Fw_TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
{
    if(!is_user_valid(iAttacker))
        return
   
    static Float:flEnd[3]
    get_tr2(ptr, TR_vecEndPos, flEnd)
   
    if(get_user_weapon(iAttacker) == CSW_WEAPON_BASE && g_Hasscope[iAttacker])
    {
        if(iEnt)
        {
            message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
            write_byte(TE_DECAL)
            engfunc(EngFunc_WriteCoord, flEnd[0])
            engfunc(EngFunc_WriteCoord, flEnd[1])
            engfunc(EngFunc_WriteCoord, flEnd[2])
            write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
            write_short(iEnt)
            message_end()
        }
        else
        {
            message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
            write_byte(TE_WORLDDECAL)
            engfunc(EngFunc_WriteCoord, flEnd[0])
            engfunc(EngFunc_WriteCoord, flEnd[1])
            engfunc(EngFunc_WriteCoord, flEnd[2])
            write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
            message_end()
        }
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_GUNSHOTDECAL)
        engfunc(EngFunc_WriteCoord, flEnd[0])
        engfunc(EngFunc_WriteCoord, flEnd[1])
        engfunc(EngFunc_WriteCoord, flEnd[2])
        write_short(iAttacker)
        write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
        message_end()
       
        engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flEnd, 0)
        write_byte(TE_SPRITE)
        engfunc(EngFunc_WriteCoord, flEnd[0])
        engfunc(EngFunc_WriteCoord, flEnd[1])
        engfunc(EngFunc_WriteCoord, flEnd[2])
        write_short(g_Shock)
        write_byte(5)
        write_byte(150)
        message_end()
    }
}
 
public Fw_Spawn(id)
{
    if(!is_user_valid(id))
        return
       
    Remove_scope(id)
}
 
public New_Round()
{
    for(new i = 0; i < get_member_game(m_nMaxPlayers); i++)
    {
        if(!is_user_valid(i) || !g_Hasscope[i])
            continue
           
        Remove_scope(i)
    }
}
 
public Fw_Reload_Post(weapon_entity)
{
    new id = pev(weapon_entity, pev_owner)
    if (!is_user_valid(id) || ze_is_user_zombie(id) || g_scope_TmpClip[id] == -1)
        return HAM_IGNORED
       
    if(g_Hasscope[id])
    {
        g_hasZoom[id] = false
        cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
        set_pdata_int(weapon_entity, 51, g_scope_TmpClip[id], 4)
        set_pdata_float(weapon_entity, 48, 3.0, 4)
        set_pdata_float(id, 83, 3.0, 5)
        set_pdata_int(weapon_entity, 54, 1, 4)
        UTIL_weapon_anim(id, weapon_entity, 1)
    }
    return HAM_IGNORED
}
 
public Fw_Reload(weapon_entity)
{
    new id = pev(weapon_entity, pev_owner)
    if (!is_user_valid(id) || ze_is_user_zombie(id))
        return HAM_IGNORED
 
    static iClipExtra
    if(g_Hasscope[id])
    {
        iClipExtra = get_pcvar_num(Cvar_scope_Clip)
    }
 
    g_scope_TmpClip[id] = -1
   
    new iBpAmmo = cs_get_user_bpammo(id, CSW_WEAPON_BASE)
    new iClip = get_pdata_int(weapon_entity, 51, 4)
 
    if (iBpAmmo <= 0 || iClip >= iClipExtra)
        return HAM_SUPERCEDE
       
    g_scope_TmpClip[id] = iClip
 
    return HAM_IGNORED
}
 
public Fw_AddToPlayer(ent, id)
{
    if(!is_valid_ent(ent) || !is_user_valid(id) || ze_is_user_zombie(id))
        return HAM_IGNORED
   
    if(entity_get_int(ent, EV_INT_impulse) == WEAPON_KEY)
    {
        g_Hasscope[id] = true
        g_hasZoom[id] = false
        cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
        entity_set_int(ent, EV_INT_impulse, 0)
       
        message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
        write_string(CSW_NEW_WEAPON)
        write_byte(7)
        write_byte(100)
        write_byte(-1)
        write_byte(-1)
        write_byte(0)
        write_byte(8)
        write_byte(CSW_WEAPON_BASE)
        write_byte(0)
        message_end()
        return HAM_HANDLED
    }
    else
    {
        message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
        write_string(CSW_OLD_WEAPON)
        write_byte(7)
        write_byte(100)
        write_byte(-1)
        write_byte(-1)
        write_byte(0)
        write_byte(8)
        write_byte(CSW_WEAPON_BASE)
        write_byte(0)
        message_end()
    }
    return HAM_IGNORED
}
 
public Fw_Precache_Event(type, const name[])
{
    if(equal("events/p90.sc", name))
    {
        g_Eventscope = get_orig_retval()
    }
}
 
public Fw_Update_Clientdata(id, sendweapons, cd_handle)
{
    if(!is_user_valid(id))
        return
 
    if(get_user_weapon(id) == CSW_WEAPON_BASE && g_Hasscope[id])
    {
        set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001)
    }
}
 
public Fw_Playback_Event(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
    if(!is_user_valid(invoker) || !g_IsInPrimaryAttack)
        return
   
    if(eventid == g_Eventscope && get_user_weapon(invoker) == CSW_WEAPON_BASE && g_Hasscope[invoker])
    {
        engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
        UTIL_weapon_anim(invoker, eventid, random_num(3, 5))
        emit_sound(invoker, CHAN_WEAPON, Weapon_Sounds[random_num(0, 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    }
}
 
public ze_user_humanized(id)
{
    if(!is_user_valid(id))
        return
       
    Remove_scope(id)
}
 
public ze_user_infected(id, infector)
{
    if(!is_user_valid(id))
        return
       
    Remove_scope(id)
}
 
public Fw_PrimaryAttack(Weapon)
{
    g_IsInPrimaryAttack = 0
   
    new szClip, szAmmo, id
    id = get_pdata_cbase(Weapon, 41, 4)
    get_user_weapon(id, szClip, szAmmo)
    if(!is_user_valid(id) || ze_is_user_zombie(id))
        return
 
    g_IsInPrimaryAttack = 1
    if(g_Hasscope[id])
    {
        if (!cs_get_weapon_ammo(Weapon))
            return
 
        new Float:push[3]
        pev(id, pev_punchangle, push)
        xs_vec_sub(push, cl_pushangle[id], push)
        xs_vec_mul_scalar(push, get_pcvar_float(Cvar_scope_Recoil), push)
        xs_vec_add(push, cl_pushangle[id], push)
        set_pev(id, pev_punchangle, push)
        UTIL_weapon_anim(id, Weapon, random_num(3, 5))
        emit_sound(id, CHAN_WEAPON, Weapon_Sounds[random_num(0, 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    }
}
 
public Fw_CmdStart(id, handle)
{
    if(!is_user_valid(id) || ze_is_user_zombie(id))
        return
       
    if((get_uc(handle, UC_Buttons) & IN_ATTACK2) && !(pev(id, pev_oldbuttons) & IN_ATTACK2))
    {
        if(get_user_weapon(id) == CSW_WEAPON_BASE && g_Hasscope[id] && !g_hasZoom[id])
        {
            g_hasZoom[id] = true
            cs_set_user_zoom(id, CS_SET_FIRST_ZOOM, 0)
        }
        else if(get_user_weapon(id) == CSW_WEAPON_BASE && g_Hasscope[id] && g_hasZoom[id])
        {
            g_hasZoom[id] = false
            cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
        }
    }
}
 
public Fw_Take_DMG(Victim, Inflictor, Attacker, Float:Damage, DamageType)
{
    if(!is_user_valid(Victim) || !is_user_valid(Attacker) ||ze_is_user_zombie(Attacker))
        return
   
    if(get_user_weapon(Attacker) == CSW_WEAPON_BASE && g_Hasscope[Attacker])
    {
        SetHamParamFloat(4, Damage * get_pcvar_float(Cvar_scope_DMG))
    }
}
 
public Fw_PrimaryAttack_Post(Weapon)
{
    g_IsInPrimaryAttack = 0
    new szClip, szAmmo, id
    id = get_pdata_cbase(Weapon, 41, 4)
    get_user_weapon(id, szClip, szAmmo)
   
    if(!is_user_valid(id) || ze_is_user_zombie(id))
        return
 
    if(g_Hasscope[id])
    {
        if (!cs_get_weapon_ammo(Weapon))
            return
 
        new Float:push[3]
        pev(id, pev_punchangle, push)
        xs_vec_sub(push, cl_pushangle[id], push)
        xs_vec_mul_scalar(push, get_pcvar_float(Cvar_scope_Recoil), push)
        xs_vec_add(push, cl_pushangle[id], push)
        set_pev(id, pev_punchangle, push)
        UTIL_weapon_anim(id, Weapon, random_num(3, 5))
        emit_sound(id, CHAN_WEAPON, Weapon_Sounds[random_num(0, 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    }
}
 
public Fw_Set_Model(entity, model[])
{
    if(!pev_valid(entity) || !equal(model, OLD_WEAPON))
        return FMRES_IGNORED
   
    static szClassName[33], id
    id = pev(entity, pev_owner)
    pev(entity, pev_classname, szClassName, charsmax(szClassName))
    if(!equal(szClassName, "weaponbox"))
        return FMRES_IGNORED
   
    if(g_Hasscope[id] && pev_valid(fm_find_ent_by_owner(-1, CSW_OLD_WEAPON, entity)))
    {
        g_Hasscope[id] = false
        g_hasZoom[id] = false
        cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
        set_pev(fm_find_ent_by_owner(-1, CSW_OLD_WEAPON, entity), pev_impulse, WEAPON_KEY)
        engfunc(EngFunc_SetModel, entity, Weapon_Models[2])
        return FMRES_SUPERCEDE
    }
    return FMRES_IGNORED
}
 
public CurrentWeapon(id)
{
    if(!is_user_valid(id))
        return
       
    if(get_user_weapon(id) == CSW_WEAPON_BASE && g_Hasscope[id])
    {
        if(g_hasZoom[id])
        {
            cs_set_player_view_model(id, CSW_WEAPON_BASE, "")
        }
        else if(!g_hasZoom[id])
        {
            cs_set_player_view_model(id, CSW_WEAPON_BASE, Weapon_Models[0])
        }
        cs_set_player_weap_model(id, CSW_WEAPON_BASE, Weapon_Models[1])
       
        message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
        write_string(CSW_NEW_WEAPON)
        write_byte(7)
        write_byte(100)
        write_byte(-1)
        write_byte(-1)
        write_byte(0)
        write_byte(8)
        write_byte(CSW_WEAPON_BASE)
        write_byte(0)
        message_end()
       
        static Float:iSpeed; iSpeed = get_pcvar_float(Cvar_scope_Speed)
        static Ent; Ent = find_ent_by_owner(-1, CSW_OLD_WEAPON, id)
        if(Ent)
        {
            static Float:Delay; Delay = get_pdata_float( Ent, 46, 4) * iSpeed
            if (Delay > 0.0)
            {
                set_pdata_float(Ent, 46, Delay, 4)
            }
        }
    }
}
 
public 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_valid(iAttacker) || iAttacker == iVictim)   return
   
    if(equal(szTruncatedWeapon, "p90") && get_user_weapon(iAttacker) == CSW_WEAPON_BASE && g_Hasscope[iAttacker])
    {
        set_msg_arg_string(4, "lycanthrope")
    }
}
 
public Givescope(id)
{
    drop_weapons(id, 1)
    new wep = rg_give_item(id, CSW_OLD_WEAPON)
    if (wep > 0)
    {
        cs_set_weapon_ammo(wep, get_pcvar_num(Cvar_scope_Clip))
        cs_set_user_bpammo(id, CSW_WEAPON_BASE, get_pcvar_num(Cvar_scope_Ammo))
       
        message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
        write_string(CSW_NEW_WEAPON)
        write_byte(7)
        write_byte(100)
        write_byte(-1)
        write_byte(-1)
        write_byte(0)
        write_byte(8)
        write_byte(CSW_WEAPON_BASE)
        write_byte(0)
        message_end()
    }
    g_Hasscope[id] = true
    g_hasZoom[id] = false
    cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
    UTIL_weapon_anim(id, CSW_WEAPON_BASE, 2)
    ze_colored_print(id, "!tYou bought Lycanthrope!y.")
}
 
public Remove_scope(id)
{
    if(!is_user_valid(id))
        return
       
    g_Hasscope[id] = false
    g_hasZoom[id] = false
    cs_set_user_zoom(id, CS_SET_NO_ZOOM, 0)
    message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
    write_string(CSW_OLD_WEAPON)
    write_byte(7)
    write_byte(100)
    write_byte(-1)
    write_byte(-1)
    write_byte(0)
    write_byte(8)
    write_byte(CSW_WEAPON_BASE)
    write_byte(0)
    message_end()
    cs_reset_player_view_model(id, CSW_WEAPON_BASE)
    cs_reset_player_weap_model(id, CSW_WEAPON_BASE)
}
 
UTIL_weapon_anim(index, entity, sequence = 0)
{
    set_pev(index, pev_weaponanim, sequence)
 
    message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, index)
    write_byte(sequence)
    write_byte(pev(entity, pev_body))
    message_end()
}
 
stock drop_weapons(id, dropwhat)
{
    static weapons[32], num, i, weaponid
    num = 0
    get_user_weapons(id, weapons, num)
   
    const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_MAC10)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_MAC10)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
   
    for (i = 0; i < num; i++)
    {
        weaponid = weapons[i]
       
        if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
        {
            static wname[32]
            get_weaponname(weaponid, wname, charsmax(wname))
            engclient_cmd(id, "drop", wname)
        }
    }
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ ansicpg1252\\ deff0\\ deflang1036{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ f0\\ fs16 \n\\ par }
*/
VIP Menu (Final):

Code: Select all

#include <zombie_escape>
#include <ze_vip>
 
native ze_open_glow_menu(id)
native ze_give_lycanthrope(id)
native ze_give_infinity(id)
native ze_give_free_golds(id)
 
const OFFSET_CSMENUCODE = 205
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0
 
public plugin_natives()
{
    register_native("ze_open_vip_menu", "native_ze_open_vip_menu", 1)
}
 
public native_ze_open_vip_menu(id)
{
    if (!is_user_connected(id))
        return -1
 
    if (!(get_user_flags(id) & ADMIN_LEVEL_H))
        return false
 
    Show_Menu(id)
    return true
}
 
public plugin_init()
{
    register_plugin("[ZE] VIP Menu", "1.0", "Spi")
    register_menu("VIP Menu", KEYSMENU, "Main_Menu")
}
 
public Show_Menu(id)
{
    static szMenu[250]
    new iLen
   
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\rVIP Menu^n")
   
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y1\d. \wKnife Menu")
   
    if (is_user_alive(id))
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y2\d. \wGuns Menu")
    }
    else
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d2. Guns Menu")
    }
 
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y3\d. \wGlow Menu")
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y4\d. \wDaily Golds")
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\y0\d. \r%L", id, "EXIT")
   
    set_pdata_int(id, OFFSET_CSMENUCODE, 0)
    show_menu(id, KEYSMENU, szMenu, -1, "Main Menu")
}
 
public Main_Menu(id, key)
{
    if (!is_user_connected(id))
        return PLUGIN_HANDLED
   
    switch (key)
    {
        case 0: ze_open_knife_menu(id)
        case 1:
        {
            if (is_user_alive(id))
            {
                    Open_HGunMenu(id)
            }
            else
            {
                ze_colored_print(id, "%L", id, "DEAD_CANT_BUY_WEAPON")
            }
        }
        case 2: ze_open_glow_menu(id)
        case 3: ze_give_free_golds(id)
    }
    return PLUGIN_HANDLED
}
 
public Open_ZGunMenu(id)
{
    new iMenu = menu_create("\rDaily Golds:^n^n", "ZVIPMenu_Handler")
 
    menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL)
    menu_display(id, iMenu, 0)
}
 
public ZVIPMenu_Handler(id, iMenu, iItem)
{
    if (!is_user_connected(id))
        return PLUGIN_CONTINUE
 
    switch (iItem)
    {
        case 0: ze_give_free_golds(id)
    }
   
    menu_destroy(iMenu)
    return PLUGIN_HANDLED
}
  
public Open_HGunMenu(id)
{
    new iMenu = menu_create("\rGuns Menu:^n^n", "HVIPMenu_Handler")
    menu_additem(iMenu, "Lycanthrope")
    menu_additem(iMenu, "Dual Infinity")
 
    menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL)
    menu_display(id, iMenu, 0)
}
 
public HVIPMenu_Handler(id, iMenu, iItem)
{
    if (!is_user_connected(id))
        return PLUGIN_CONTINUE
 
    switch (iItem)
    {
        case 0: ze_give_lycanthrope(id)
        case 1: ze_give_infinity(id)
    }
   
    menu_destroy(iMenu)
    return PLUGIN_HANDLED
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ ansicpg1252\\ deff0\\ deflang1036{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ f0\\ fs16 \n\\ par }
*/
NOTE: Please add chat message to players who press VIP Menu and they don't have access for it.
!tYou are not !gVIP!y!

User avatar
sPe3doN
Senior Member
Senior Member
Algeria
Posts: 258
Joined: 7 years ago
Contact:

#14

Post by sPe3doN » 4 years ago

Lycanthrope:

Code: Select all

#include <zombie_escape>
#include <ze_vip>
#include <fakemeta_util>
#include <cstrike>
#include <engine>

 
 
#define CSW_WEAPON_BASE CSW_P90
#define CSW_NEW_WEAPON  "weapon_lycanthrope"
#define CSW_OLD_WEAPON  "weapon_p90"
#define WEAPON_KEY  9299292
#define OLD_WEAPON  "models/w_p90.mdl"
#define is_user_valid(%1) (is_user_alive(%1) && !is_user_bot(%1) && !is_user_hltv(%1) && is_user_connected(%1))
#define VIP_ACCESS ADMIN_LEVEL_H
 
new const Weapon_Models[][] = { "models/Premuim_ZE/v_lycanthrope.mdl", "models/Premuim_ZE/p_lycanthrope.mdl", "models/Premuim_ZE/w_lycanthrope.mdl" }
new const Weapon_Sounds[][] = { "weapons/sg552-shot1.wav", "weapons/sg552-shot2.wav", "weapons/buffsg552_draw.wav", "weapons/buffsg552_idle.wav", "weapons/buffsg552_reload.wav", "weapons/buffsg552_reload_AF.wav" }
new const Weapon_Sprites[][] = { "sprites/weapon_lycanthrope.txt", "sprites/640hud148.spr" }
new const GUNSHOT_DECALS[] = { 41, 42, 43, 44, 45 }
 
new bool:g_Hasscope[33], g_hasZoom[33]
new Cvar_scope_Recoil, Cvar_scope_DMG, Cvar_scope_Clip, Cvar_scope_Ammo, Cvar_scope_Speed
new Float:cl_pushangle[33][3], g_Eventscope, g_scope_TmpClip[33], g_IsInPrimaryAttack, g_Shock
 
public plugin_natives()
{
    register_native("ze_give_lycanthrope", "native_ze_give_lycanthrope", 1)
}
 
public native_ze_give_lycanthrope(id)
{
    if (!is_user_connected(id))
        return -1
 
    Givescope(id)
    return true
}
 
public plugin_precache()
{
    for(new g = 0; g < sizeof(Weapon_Models); g++)
        precache_model(Weapon_Models[g])
    for(new h = 0; h < sizeof(Weapon_Sounds); h++)
        precache_sound(Weapon_Sounds[h])
    for(new t = 0; t < sizeof(Weapon_Sprites); t++)
        precache_generic(Weapon_Sprites[t])
       
    g_Shock = precache_model("sprites/lycanthrope_hit.spr")
       
    register_clcmd(CSW_NEW_WEAPON, "hook")
    register_forward(FM_PrecacheEvent, "Fw_Precache_Event", 1)
}
 
public hook(id)
{
    engclient_cmd(id, CSW_OLD_WEAPON)
    return PLUGIN_HANDLED
}
 
public plugin_init()
{
    register_plugin("[ZE] Extra Item: Lycanthrope", "1.0", "Jack GamePlay")
   
    // Events & Messages
    register_message(get_user_msgid("DeathMsg"), "DeathMsg")
    register_event("CurWeapon", "CurrentWeapon", "be", "1=1")
    register_event("HLTV", "New_Round", "a", "1=0", "2=0")
   
    // Forwards
    register_forward(FM_SetModel, "Fw_Set_Model", 1)
    register_forward(FM_PlaybackEvent, "Fw_Playback_Event")
    register_forward(FM_UpdateClientData, "Fw_Update_Clientdata", 1)
    register_forward(FM_CmdStart, "Fw_CmdStart")
   
    // Hook Chains
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "Fw_Take_DMG")
    // Hams
    RegisterHam(Ham_Weapon_PrimaryAttack, CSW_OLD_WEAPON, "Fw_PrimaryAttack")
    RegisterHam(Ham_Weapon_PrimaryAttack, CSW_OLD_WEAPON, "Fw_PrimaryAttack_Post", 1)
    RegisterHam(Ham_Item_AddToPlayer, CSW_OLD_WEAPON, "Fw_AddToPlayer")
    RegisterHam(Ham_Weapon_Reload, CSW_OLD_WEAPON, "Fw_Reload")
    RegisterHam(Ham_Weapon_Reload, CSW_OLD_WEAPON, "Fw_Reload_Post", 1)
    RegisterHam(Ham_Spawn, "player", "Fw_Spawn", 1)
    RegisterHam(Ham_TraceAttack, "worldspawn", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_breakable", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_wall", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_door", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_plat", "Fw_TraceAttack", 1)
    RegisterHam(Ham_TraceAttack, "func_rotating", "Fw_TraceAttack", 1)
    RegisterHam(Ham_Use, "func_tank", "Fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tankmortar", "Fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tankrocket", "Fw_UseStationary_Post", 1)
    RegisterHam(Ham_Use, "func_tanklaser", "Fw_UseStationary_Post", 1)
    RegisterHam(Ham_Item_Deploy, CSW_OLD_WEAPON, "Fw_Item_Deploy_Post", 1)
   
    // Cvars
    Cvar_scope_Recoil = register_cvar("ze_scope_recoil", "1.0")
    Cvar_scope_DMG = register_cvar("ze_scope_damage", "6")
    Cvar_scope_Clip = register_cvar("ze_scope_clip", "30")
    Cvar_scope_Ammo = register_cvar("ze_scope_ammo", "150")
    Cvar_scope_Speed = register_cvar("ze_scope_speed", "4.5")
}
 
public Fw_Item_Deploy_Post(weapon_ent)
{
    new id = get_pdata_cbase(weapon_ent, 41, 4)
    g_hasZoom[id] = false
    cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
    CurrentWeapon(id)
}
 
public Fw_UseStationary_Post(entity, caller, activator, use_type)
{
    if (use_type == 0 && is_user_valid(caller))
    {
        CurrentWeapon(caller)
    }
}
 
public Fw_TraceAttack(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
{
    if(!is_user_valid(iAttacker))
        return
   
    static Float:flEnd[3]
    get_tr2(ptr, TR_vecEndPos, flEnd)
   
    if(get_user_weapon(iAttacker) == CSW_WEAPON_BASE && g_Hasscope[iAttacker])
    {
        if(iEnt)
        {
            message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
            write_byte(TE_DECAL)
            engfunc(EngFunc_WriteCoord, flEnd[0])
            engfunc(EngFunc_WriteCoord, flEnd[1])
            engfunc(EngFunc_WriteCoord, flEnd[2])
            write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
            write_short(iEnt)
            message_end()
        }
        else
        {
            message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
            write_byte(TE_WORLDDECAL)
            engfunc(EngFunc_WriteCoord, flEnd[0])
            engfunc(EngFunc_WriteCoord, flEnd[1])
            engfunc(EngFunc_WriteCoord, flEnd[2])
            write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
            message_end()
        }
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_GUNSHOTDECAL)
        engfunc(EngFunc_WriteCoord, flEnd[0])
        engfunc(EngFunc_WriteCoord, flEnd[1])
        engfunc(EngFunc_WriteCoord, flEnd[2])
        write_short(iAttacker)
        write_byte(GUNSHOT_DECALS[random_num (0, sizeof GUNSHOT_DECALS -1)])
        message_end()
       
        engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, flEnd, 0)
        write_byte(TE_SPRITE)
        engfunc(EngFunc_WriteCoord, flEnd[0])
        engfunc(EngFunc_WriteCoord, flEnd[1])
        engfunc(EngFunc_WriteCoord, flEnd[2])
        write_short(g_Shock)
        write_byte(5)
        write_byte(150)
        message_end()
    }
}
 
public Fw_Spawn(id)
{
    if(!is_user_valid(id))
        return
       
    Remove_scope(id)
}
 
public New_Round()
{
    for(new i = 0; i < get_member_game(m_nMaxPlayers); i++)
    {
        if(!is_user_valid(i) || !g_Hasscope[i])
            continue
           
        Remove_scope(i)
    }
}
 
public Fw_Reload_Post(weapon_entity)
{
    new id = pev(weapon_entity, pev_owner)
    if (!is_user_valid(id) || ze_is_user_zombie(id) || g_scope_TmpClip[id] == -1)
        return HAM_IGNORED
       
    if(g_Hasscope[id])
    {
        g_hasZoom[id] = false
        cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
        set_pdata_int(weapon_entity, 51, g_scope_TmpClip[id], 4)
        set_pdata_float(weapon_entity, 48, 3.0, 4)
        set_pdata_float(id, 83, 3.0, 5)
        set_pdata_int(weapon_entity, 54, 1, 4)
        UTIL_weapon_anim(id, weapon_entity, 1)
    }
    return HAM_IGNORED
}
 
public Fw_Reload(weapon_entity)
{
    new id = pev(weapon_entity, pev_owner)
    if (!is_user_valid(id) || ze_is_user_zombie(id))
        return HAM_IGNORED
 
    static iClipExtra
    if(g_Hasscope[id])
    {
        iClipExtra = get_pcvar_num(Cvar_scope_Clip)
    }
 
    g_scope_TmpClip[id] = -1
   
    new iBpAmmo = cs_get_user_bpammo(id, CSW_WEAPON_BASE)
    new iClip = get_pdata_int(weapon_entity, 51, 4)
 
    if (iBpAmmo <= 0 || iClip >= iClipExtra)
        return HAM_SUPERCEDE
       
    g_scope_TmpClip[id] = iClip
 
    return HAM_IGNORED
}
 
public Fw_AddToPlayer(ent, id)
{
    if(!is_valid_ent(ent) || !is_user_valid(id) || ze_is_user_zombie(id))
        return HAM_IGNORED
   
    if(entity_get_int(ent, EV_INT_impulse) == WEAPON_KEY)
    {
        g_Hasscope[id] = true
        g_hasZoom[id] = false
        cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
        entity_set_int(ent, EV_INT_impulse, 0)
       
        message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
        write_string(CSW_NEW_WEAPON)
        write_byte(7)
        write_byte(100)
        write_byte(-1)
        write_byte(-1)
        write_byte(0)
        write_byte(8)
        write_byte(CSW_WEAPON_BASE)
        write_byte(0)
        message_end()
        return HAM_HANDLED
    }
    else
    {
        message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
        write_string(CSW_OLD_WEAPON)
        write_byte(7)
        write_byte(100)
        write_byte(-1)
        write_byte(-1)
        write_byte(0)
        write_byte(8)
        write_byte(CSW_WEAPON_BASE)
        write_byte(0)
        message_end()
    }
    return HAM_IGNORED
}
 
public Fw_Precache_Event(type, const name[])
{
    if(equal("events/p90.sc", name))
    {
        g_Eventscope = get_orig_retval()
    }
}
 
public Fw_Update_Clientdata(id, sendweapons, cd_handle)
{
    if(!is_user_valid(id))
        return
 
    if(get_user_weapon(id) == CSW_WEAPON_BASE && g_Hasscope[id])
    {
        set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001)
    }
}
 
public Fw_Playback_Event(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
    if(!is_user_valid(invoker) || !g_IsInPrimaryAttack)
        return
   
    if(eventid == g_Eventscope && get_user_weapon(invoker) == CSW_WEAPON_BASE && g_Hasscope[invoker])
    {
        engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
        UTIL_weapon_anim(invoker, eventid, random_num(3, 5))
        emit_sound(invoker, CHAN_WEAPON, Weapon_Sounds[random_num(0, 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    }
}
 
public ze_user_humanized(id)
{
    if(!is_user_valid(id))
        return
       
    Remove_scope(id)
}
 
public ze_user_infected(id, infector)
{
    if(!is_user_valid(id))
        return
       
    Remove_scope(id)
}
 
public Fw_PrimaryAttack(Weapon)
{
    g_IsInPrimaryAttack = 0
   
    new szClip, szAmmo, id
    id = get_pdata_cbase(Weapon, 41, 4)
    get_user_weapon(id, szClip, szAmmo)
    if(!is_user_valid(id) || ze_is_user_zombie(id))
        return
 
    g_IsInPrimaryAttack = 1
    if(g_Hasscope[id])
    {
        if (!cs_get_weapon_ammo(Weapon))
            return
 
        new Float:push[3]
        pev(id, pev_punchangle, push)
        xs_vec_sub(push, cl_pushangle[id], push)
        xs_vec_mul_scalar(push, get_pcvar_float(Cvar_scope_Recoil), push)
        xs_vec_add(push, cl_pushangle[id], push)
        set_pev(id, pev_punchangle, push)
        UTIL_weapon_anim(id, Weapon, random_num(3, 5))
        emit_sound(id, CHAN_WEAPON, Weapon_Sounds[random_num(0, 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    }
}
 
public Fw_CmdStart(id, handle)
{
    if(!is_user_valid(id) || ze_is_user_zombie(id))
        return
       
    if((get_uc(handle, UC_Buttons) & IN_ATTACK2) && !(pev(id, pev_oldbuttons) & IN_ATTACK2))
    {
        if(get_user_weapon(id) == CSW_WEAPON_BASE && g_Hasscope[id] && !g_hasZoom[id])
        {
            g_hasZoom[id] = true
            cs_set_user_zoom(id, CS_SET_FIRST_ZOOM, 0)
        }
        else if(get_user_weapon(id) == CSW_WEAPON_BASE && g_Hasscope[id] && g_hasZoom[id])
        {
            g_hasZoom[id] = false
            cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
        }
    }
}
 
public Fw_Take_DMG(Victim, Inflictor, Attacker, Float:Damage, DamageType)
{
    if(!is_user_valid(Victim) || !is_user_valid(Attacker) ||ze_is_user_zombie(Attacker))
        return
   
    if(get_user_weapon(Attacker) == CSW_WEAPON_BASE && g_Hasscope[Attacker])
    {
        SetHamParamFloat(4, Damage * get_pcvar_float(Cvar_scope_DMG))
    }
}
 
public Fw_PrimaryAttack_Post(Weapon)
{
    g_IsInPrimaryAttack = 0
    new szClip, szAmmo, id
    id = get_pdata_cbase(Weapon, 41, 4)
    get_user_weapon(id, szClip, szAmmo)
   
    if(!is_user_valid(id) || ze_is_user_zombie(id))
        return
 
    if(g_Hasscope[id])
    {
        if (!cs_get_weapon_ammo(Weapon))
            return
 
        new Float:push[3]
        pev(id, pev_punchangle, push)
        xs_vec_sub(push, cl_pushangle[id], push)
        xs_vec_mul_scalar(push, get_pcvar_float(Cvar_scope_Recoil), push)
        xs_vec_add(push, cl_pushangle[id], push)
        set_pev(id, pev_punchangle, push)
        UTIL_weapon_anim(id, Weapon, random_num(3, 5))
        emit_sound(id, CHAN_WEAPON, Weapon_Sounds[random_num(0, 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    }
}
 
public Fw_Set_Model(entity, model[])
{
    if(!pev_valid(entity) || !equal(model, OLD_WEAPON))
        return FMRES_IGNORED
   
    static szClassName[33], id
    id = pev(entity, pev_owner)
    pev(entity, pev_classname, szClassName, charsmax(szClassName))
    if(!equal(szClassName, "weaponbox"))
        return FMRES_IGNORED
   
    if(g_Hasscope[id] && pev_valid(fm_find_ent_by_owner(-1, CSW_OLD_WEAPON, entity)))
    {
        g_Hasscope[id] = false
        g_hasZoom[id] = false
        cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
        set_pev(fm_find_ent_by_owner(-1, CSW_OLD_WEAPON, entity), pev_impulse, WEAPON_KEY)
        engfunc(EngFunc_SetModel, entity, Weapon_Models[2])
        return FMRES_SUPERCEDE
    }
    return FMRES_IGNORED
}
 
public CurrentWeapon(id)
{
    if(!is_user_valid(id))
        return
       
    if(get_user_weapon(id) == CSW_WEAPON_BASE && g_Hasscope[id])
    {
        if(g_hasZoom[id])
        {
            cs_set_player_view_model(id, CSW_WEAPON_BASE, "")
        }
        else if(!g_hasZoom[id])
        {
            cs_set_player_view_model(id, CSW_WEAPON_BASE, Weapon_Models[0])
        }
        cs_set_player_weap_model(id, CSW_WEAPON_BASE, Weapon_Models[1])
       
        message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
        write_string(CSW_NEW_WEAPON)
        write_byte(7)
        write_byte(100)
        write_byte(-1)
        write_byte(-1)
        write_byte(0)
        write_byte(8)
        write_byte(CSW_WEAPON_BASE)
        write_byte(0)
        message_end()
       
        static Float:iSpeed; iSpeed = get_pcvar_float(Cvar_scope_Speed)
        static Ent; Ent = find_ent_by_owner(-1, CSW_OLD_WEAPON, id)
        if(Ent)
        {
            static Float:Delay; Delay = get_pdata_float( Ent, 46, 4) * iSpeed
            if (Delay > 0.0)
            {
                set_pdata_float(Ent, 46, Delay, 4)
            }
        }
    }
}
 
public 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_valid(iAttacker) || iAttacker == iVictim)   return
   
    if(equal(szTruncatedWeapon, "p90") && get_user_weapon(iAttacker) == CSW_WEAPON_BASE && g_Hasscope[iAttacker])
    {
        set_msg_arg_string(4, "lycanthrope")
    }
}
 
public Givescope(id)
{
    drop_weapons(id, 1)
    new wep = rg_give_item(id, CSW_OLD_WEAPON)
    if (wep > 0)
    {
        cs_set_weapon_ammo(wep, get_pcvar_num(Cvar_scope_Clip))
        cs_set_user_bpammo(id, CSW_WEAPON_BASE, get_pcvar_num(Cvar_scope_Ammo))
       
        message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
        write_string(CSW_NEW_WEAPON)
        write_byte(7)
        write_byte(100)
        write_byte(-1)
        write_byte(-1)
        write_byte(0)
        write_byte(8)
        write_byte(CSW_WEAPON_BASE)
        write_byte(0)
        message_end()
    }
    g_Hasscope[id] = true
    g_hasZoom[id] = false
    cs_set_user_zoom(id, CS_RESET_ZOOM, 0)
    UTIL_weapon_anim(id, CSW_WEAPON_BASE, 2)
    ze_colored_print(id, "!tYou bought Lycanthrope!y.")
}
 
public Remove_scope(id)
{
    if(!is_user_valid(id))
        return
       
    g_Hasscope[id] = false
    g_hasZoom[id] = false
    cs_set_user_zoom(id, CS_SET_NO_ZOOM, 0)
    message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, id)
    write_string(CSW_OLD_WEAPON)
    write_byte(7)
    write_byte(100)
    write_byte(-1)
    write_byte(-1)
    write_byte(0)
    write_byte(8)
    write_byte(CSW_WEAPON_BASE)
    write_byte(0)
    message_end()
    cs_reset_player_view_model(id, CSW_WEAPON_BASE)
    cs_reset_player_weap_model(id, CSW_WEAPON_BASE)
}
 
UTIL_weapon_anim(index, entity, sequence = 0)
{
    set_pev(index, pev_weaponanim, sequence)
 
    message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, index)
    write_byte(sequence)
    write_byte(pev(entity, pev_body))
    message_end()
}
 
stock drop_weapons(id, dropwhat)
{
    static weapons[32], num, i, weaponid
    num = 0
    get_user_weapons(id, weapons, num)
   
    const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_MAC10)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_MAC10)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
   
    for (i = 0; i < num; i++)
    {
        weaponid = weapons[i]
       
        if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
        {
            static wname[32]
            get_weaponname(weaponid, wname, charsmax(wname))
            engclient_cmd(id, "drop", wname)
        }
    }
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ ansicpg1252\\ deff0\\ deflang1036{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ f0\\ fs16 \n\\ par }
*/
vip menu:

Code: Select all

#include <zombie_escape>
#include <ze_vip>
 
native ze_open_glow_menu(id)
native ze_give_lycanthrope(id)
native ze_give_infinity(id)
native ze_give_free_golds(id)
native ze_open_knife_menu(id)

const OFFSET_CSMENUCODE = 205
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0
 
public plugin_natives()
{
    register_native("ze_open_vip_menu", "native_ze_open_vip_menu", 1)
}
 
public native_ze_open_vip_menu(id)
{
    if (!is_user_connected(id))
        return -1
 
    if (!(get_user_flags(id) & ADMIN_LEVEL_H))
        return false
 
    Show_Menu(id)
    return true
}
 
public plugin_init()
{
    register_plugin("[ZE] VIP Menu", "1.0", "Spi")
    register_menu("VIP Menu", KEYSMENU, "Main_Menu")
}
 
public Show_Menu(id)
{
    static szMenu[250]
    new iLen
   
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\rVIP Menu^n")
   
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y1\d. \wKnife Menu")
   
    if (is_user_alive(id))
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y2\d. \wGuns Menu")
    }
    else
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d2. Guns Menu")
    }
 
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y3\d. \wGlow Menu")
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y4\d. \wDaily Golds")
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\y0\d. \r%L", id, "EXIT")
   
    set_pdata_int(id, OFFSET_CSMENUCODE, 0)
    show_menu(id, KEYSMENU, szMenu, -1, "Main Menu")
}
 
public Main_Menu(id, key)
{
    if (!(get_user_flags(id) & ADMIN_LEVEL_H))
    {
        ze_colored_print(id, "!tyou are not ^4VIP Member")
        return PLUGIN_HANDLED
    }
    else if (!is_user_connected(id))
        return PLUGIN_HANDLED
   
    switch (key)
    {
        case 0: ze_open_knife_menu(id)
        case 1:
        {
            if (is_user_alive(id))
            {
                    Open_HGunMenu(id)
            }
            else
            {
                ze_colored_print(id, "%L", id, "DEAD_CANT_BUY_WEAPON")
            }
        }
        case 2: ze_open_glow_menu(id)
        case 3: ze_give_free_golds(id)
    }
    return PLUGIN_HANDLED
}
 
public Open_ZGunMenu(id)
{
    new iMenu = menu_create("\rDaily Golds:^n^n", "ZVIPMenu_Handler")
 
    menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL)
    menu_display(id, iMenu, 0)
}
 
public ZVIPMenu_Handler(id, iMenu, iItem)
{
    if (!is_user_connected(id))
        return PLUGIN_CONTINUE
 
    switch (iItem)
    {
        case 0: ze_give_free_golds(id)
    }
   
    menu_destroy(iMenu)
    return PLUGIN_HANDLED
}
  
public Open_HGunMenu(id)
{
    new iMenu = menu_create("\rGuns Menu:^n^n", "HVIPMenu_Handler")
    menu_additem(iMenu, "Lycanthrope")
    menu_additem(iMenu, "Dual Infinity")
 
    menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL)
    menu_display(id, iMenu, 0)
}
 
public HVIPMenu_Handler(id, iMenu, iItem)
{
    if (!is_user_connected(id))
        return PLUGIN_CONTINUE
 
    switch (iItem)
    {
        case 0: ze_give_lycanthrope(id)
        case 1: ze_give_infinity(id)
    }
   
    menu_destroy(iMenu)
    return PLUGIN_HANDLED
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ ansicpg1252\\ deff0\\ deflang1036{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ f0\\ fs16 \n\\ par }
*/
Image

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#15

Post by Spir0x » 4 years ago

Ok bro thanks, but daily golds is missing. there's just 1 error in the code.

and please fix this main menu with the daily golds:

Code: Select all

#include <zombie_escape>
#include <ze_zombie_classes>
#include <ze_vip>



// Keys
const OFFSET_CSMENUCODE = 205
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0

public plugin_init()
{
	register_plugin("[ZE] Main Menu", ZE_VERSION, AUTHORS)
	
	// Commands
	register_clcmd("chooseteam", "Cmd_ChooseTeam")
	register_clcmd("say /zemenu", "Cmd_ChooseTeam")
	register_clcmd("say_team /zemenu", "Cmd_ChooseTeam")
	
	// Register Menus
	register_menu("Main Menu", KEYSMENU, "Main_Menu")
}

public Cmd_ChooseTeam(id)
{
	if (!is_user_connected(id))
		return PLUGIN_CONTINUE;
	
	if (get_member(id, m_iTeam) == TEAM_TERRORIST || get_member(id, m_iTeam) == TEAM_CT)
	{
		Show_Menu_Main(id)
		return PLUGIN_HANDLED // Kill the Choose Team Command
	}
	
	// Player in Spec? Allow him to open choose team menu so he can join
	return PLUGIN_CONTINUE
}

// Main Menu
public Show_Menu_Main(id)
{
	static szMenu[250]
	new iLen
    
	// Title
	iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%L^n^n", id, "MAIN_MENU_TITLE")
	
	// 1. Buy Weapons
	if (!ze_is_auto_buy_enabled(id)) // AutoBuy not enabled - normal case
	{
		if (is_user_alive(id))
		{
			iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1.\r %L^n", id, "MENU_WEAPONBUY")
		}
		else
		{
			iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d1. %L^n", id, "MENU_WEAPONBUY")
		}
	}
	else
	{
	// Auto-Buy enabled - Re-enable case
		iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1.\r %L^n", id, "MENU_WEAPONBUY_RE_ENABLE")
	}
	
	// 2. Extra Items
	if (is_user_alive(id))
	{
		iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y2. \r%L^n", id, "MENU_EXTRABUY")
	}
	else
	{
		iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d2. %L^n", id, "MENU_EXTRABUY")
	}
    
	// 3. Unstuck
	if (is_user_alive(id))
	{
		iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y3. \r%L^n^n", id, "MENU_UNSTUCK")
	}
	else
	{
		iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d3. %L^n^n", id, "MENU_UNSTUCK")
	}
	
	// 4. Sounds Menu
	iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y4. \rSounds Menu^n")
	
	// 5. Donate Menu
	iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y5. \rDonate Menu^n")
	
	// 6. Zombie Classes
	iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y6. \rZombie Classes^n^n")
	
	// 7. VIP Menu
	iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y7. \w[ \rVIP Menu \w]^n")
	}
	else
	{
	iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d7. [ \rVIP Menu \d]^n")
	}
	
	// 8. Admin Menu
	if (get_user_flags(id) & ADMIN_KICK)
	{
		iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y8. \w[ \rAdmin Menu \w]^n")
	}
	else
	{
		iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d8. [ \rAdmin Menu \d]^n")
	}
	
	// 0. Exit
	iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\y0.\r %L", id, "EXIT")
    
    	// Fix for AMXX custom menus
	set_pdata_int(id, OFFSET_CSMENUCODE, 0)
	show_menu(id, KEYSMENU, szMenu, -1, "Main Menu")
}

// Main Menu
public Main_Menu(id, key)
{
	// Player disconnected?
	if (!is_user_connected(id))
		return PLUGIN_HANDLED
    
	switch (key)
	{
		case 0: // Buy Guns
		{
			if (!ze_is_auto_buy_enabled(id))
			{
				ze_show_weapon_menu(id)
			}
			else
			{
				ze_disable_auto_buy(id)
				Show_Menu_Main(id)
			}
		}
		case 1: // Extra Items
		{
			if (is_user_alive(id))
			{
				ze_show_items_menu(id)
			}
			else
			{
				ze_colored_print(id, "%L", id, "DEAD_CANT_BUY_WEAPON")
			}
		}
		case 2: // Unstuck
		{
			if (is_user_alive(id))
			{
				client_cmd(id, "say /unstuck")
			}
			else
			{
				ze_colored_print(id, "%L", id, "DEAD_CANT_UNSTUCK")
			}
		}
		case 3: // Sounds Menu
		{
			client_cmd(id, "say /sounds")
		}
		case 4: // Donate Menu
		{
			client_cmd(id, "say /donate")
		
		}
		case 5: // Zombie Classes
		{
			ze_open_zombie_classes_menu(id)
		}
		case 6: // VIP Menu 
		{
			ze_open_vip_menu(id)
		}
		case 7: // Admin Menu
		{
			if (get_user_flags(id) & ADMIN_KICK)
			{
				client_cmd(id, "amxmodmenu")
			}
			else
			{
				ze_colored_print(id, "!tYou are not !gAdmin!y.")
			}
		}
	}
	return PLUGIN_HANDLED
}

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#16

Post by Night Fury » 4 years ago

What is the error you face when you try to compile? Next time post all errors you face!
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#17

Post by Spir0x » 4 years ago

ok man just help me to compile these two codes.

Image

Image

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#18

Post by Night Fury » 4 years ago

Daily:

Code: Select all

#include <zombie_escape>
#include <ze_vip>
 
#define NV_NAME "GET_GOLDS"
#define VIP_ACCESS ADMIN_LEVEL_H
 
enum player_struct {
    mtime,bool:ftime,key[64]
}
new g_player[33][player_struct];
 
new cvar_save_type,cvar_time,cvar_coins;
 
public plugin_natives()
{
    register_native("ze_get_free_golds", "native_ze_get_free_golds", 1)
}
 
public native_ze_get_free_golds(id)
{
    if (!is_user_connected(id))
        return -1
 
    cmd_coins(id)
    return true
}
 
public plugin_init() {
 
    register_plugin("Get Escape Golds", "1.0", "ZE DEV TEAM");
   
    cvar_save_type = register_cvar("get_golds_save_type","1"); // how to save data 1 by authid, 2 by ip or 3 by name
    cvar_time = register_cvar("get_golds_minutes","720"); // time in minutes, 720minutes=12hours it will be auto calculated
    cvar_coins = register_cvar("get_golds_coins","200"); // how many coins to give
}
       
public cmd_coins(id) {
 
    new nv = nvault_open(NV_NAME);
   
    if(nv == INVALID_HANDLE) {
        ze_colored_print(id, "!tFor the moment getting golds system is inactive..");
        return;
    }
   
    new txt_min[32],txt_coins[10];
    new coins = get_pcvar_num(cvar_coins),pminutes = get_pcvar_num(cvar_time);
    copy(txt_coins,charsmax(txt_coins),(coins==1)?"coin":"coins");
    build_time(pminutes,txt_min,charsmax(txt_min));
   
    if(g_player[id][ftime]) {
        ze_colored_print(id, "!tYou have received !g%d !tGolds!y, !tget another in !g%s!y!",coins,txt_min);
        ze_set_escape_coins(id, ze_get_escape_coins(id) + coins);
        g_player[id][ftime]=false;
        nvault_touch(nv,g_player[id][key],g_player[id][mtime]=get_systime());
        return;
    }
   
    new user_time=get_systime()-g_player[id][mtime];
    new diff_min=(user_time<(pminutes*60))?pminutes-(user_time/60):pminutes;
    build_time(diff_min,txt_min,charsmax(txt_min));
   
    if(user_time>=(pminutes*60)) {
        ze_colored_print(id, "!tYou have just received !g%d !tGolds!y, !tsince !g%s !tpassed!y!",coins,txt_min);
        ze_set_escape_coins(id, ze_get_escape_coins(id) + coins);  
        nvault_touch(nv,g_player[id][key],g_player[id][mtime]=get_systime());
    }
    else
        ze_colored_print(id, "!tRetry again in !g%s !tfor getting !g%d !tmore Golds!y.",txt_min,coins);
       
    nvault_close(nv);
}
 
public client_putinserver(id) {
       
    new nv,data[32];
    get_auth(id,g_player[id][key],charsmax(g_player[][key]));
    g_player[id][mtime]=get_systime();
    g_player[id][ftime]=false;
    formatex(data,charsmax(data),"%d",g_player[id][mtime]);
   
    if((nv=nvault_open(NV_NAME))==INVALID_HANDLE)
        return;
   
    if(!nvault_lookup(nv,g_player[id][key],data,charsmax(data),g_player[id][mtime])) {
        nvault_set(nv,g_player[id][key],data);
        g_player[id][ftime]=true;
    }
   
    nvault_close(nv);
}    
 
public client_disconnected(id) {
   
    g_player[id][mtime]=0;
    g_player[id][ftime]=false;
}
 
stock get_auth(id,data[],len)
    switch(get_pcvar_num(cvar_save_type)) {
        case 1: get_user_authid(id,data,len);
        case 2: get_user_ip(id,data,len,1);
        case 3: get_user_name(id,data,len);
    }
 
stock build_time(pminutes,data[],len)
    if(pminutes==1)
        copy(data,len,"1 minute");
    else if(pminutes!=1&&pminutes<60)
        formatex(data,len,"%d minutes",pminutes);
    else if(pminutes==60)
        copy(data,len,"1 hour");
    else {
        new ptime=pminutes/60;
        if(ptime*60==pminutes)
            formatex(data,len,"%d %s",ptime,(ptime==1)?"hour":"hours");
        else {
            new diff=pminutes-ptime*60;
            formatex(data,len,"%d %s and %d %s",ptime,(ptime==1)?"hour":"hours",diff,(diff==1)?"minute":"minutes");
        }
    }
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1036\\ f0\\ fs16 \n\\ par }
*/

Menu:

Code: Select all

#include <zombie_escape>
#include <ze_zombie_classes>
#include <ze_vip>



// Keys
const OFFSET_CSMENUCODE = 205
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0

public plugin_init()
{
    register_plugin("[ZE] Main Menu", ZE_VERSION, AUTHORS)
    
    // Commands
    register_clcmd("chooseteam", "Cmd_ChooseTeam")
    register_clcmd("say /zemenu", "Cmd_ChooseTeam")
    register_clcmd("say_team /zemenu", "Cmd_ChooseTeam")
    
    // Register Menus
    register_menu("Main Menu", KEYSMENU, "Main_Menu")
}

public Cmd_ChooseTeam(id)
{
    if (!is_user_connected(id))
        return PLUGIN_CONTINUE;
    
    if (get_member(id, m_iTeam) == TEAM_TERRORIST || get_member(id, m_iTeam) == TEAM_CT)
    {
        Show_Menu_Main(id)
        return PLUGIN_HANDLED // Kill the Choose Team Command
    }
    
    // Player in Spec? Allow him to open choose team menu so he can join
    return PLUGIN_CONTINUE
}

// Main Menu
public Show_Menu_Main(id)
{
    static szMenu[250]
    new iLen
    
    // Title
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%L^n^n", id, "MAIN_MENU_TITLE")
    
    // 1. Buy Weapons
    if (!ze_is_auto_buy_enabled(id)) // AutoBuy not enabled - normal case
    {
        if (is_user_alive(id))
        {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1.\r %L^n", id, "MENU_WEAPONBUY")
        }
        else
        {
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d1. %L^n", id, "MENU_WEAPONBUY")
        }
    }
    else
    {
    // Auto-Buy enabled - Re-enable case
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1.\r %L^n", id, "MENU_WEAPONBUY_RE_ENABLE")
    }
    
    // 2. Extra Items
    if (is_user_alive(id))
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y2. \r%L^n", id, "MENU_EXTRABUY")
    }
    else
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d2. %L^n", id, "MENU_EXTRABUY")
    }
    
    // 3. Unstuck
    if (is_user_alive(id))
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y3. \r%L^n^n", id, "MENU_UNSTUCK")
    }
    else
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d3. %L^n^n", id, "MENU_UNSTUCK")
    }
    
    // 4. Sounds Menu
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y4. \rSounds Menu^n")
    
    // 5. Donate Menu
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y5. \rDonate Menu^n")
    
    // 6. Zombie Classes
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y6. \rZombie Classes^n^n")
    
    // 7. VIP Menu
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y7. \w[ \rVIP Menu \w]^n")
    
    // 8. Admin Menu
    if (get_user_flags(id) & ADMIN_KICK)
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y8. \w[ \rAdmin Menu \w]^n")
    }
    else
    {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d8. [ \rAdmin Menu \d]^n")
    }
    
    // 0. Exit
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\y0.\r %L", id, "EXIT")
    
        // Fix for AMXX custom menus
    set_pdata_int(id, OFFSET_CSMENUCODE, 0)
    show_menu(id, KEYSMENU, szMenu, -1, "Main Menu")
}

// Main Menu
public Main_Menu(id, key)
{
    // Player disconnected?
    if (!is_user_connected(id))
        return PLUGIN_HANDLED
    
    switch (key)
    {
        case 0: // Buy Guns
        {
            if (!ze_is_auto_buy_enabled(id))
            {
                ze_show_weapon_menu(id)
            }
            else
            {
                ze_disable_auto_buy(id)
                Show_Menu_Main(id)
            }
        }
        case 1: // Extra Items
        {
            if (is_user_alive(id))
            {
                ze_show_items_menu(id)
            }
            else
            {
                ze_colored_print(id, "%L", id, "DEAD_CANT_BUY_WEAPON")
            }
        }
        case 2: // Unstuck
        {
            if (is_user_alive(id))
            {
                client_cmd(id, "say /unstuck")
            }
            else
            {
                ze_colored_print(id, "%L", id, "DEAD_CANT_UNSTUCK")
            }
        }
        case 3: // Sounds Menu
        {
            client_cmd(id, "say /sounds")
        }
        case 4: // Donate Menu
        {
            client_cmd(id, "say /donate")
        
        }
        case 5: // Zombie Classes
        {
            ze_open_zombie_classes_menu(id)
        }
        case 6: // VIP Menu 
        {
            ze_open_vip_menu(id)
        }
        case 7: // Admin Menu
        {
            if (get_user_flags(id) & ADMIN_KICK)
            {
                client_cmd(id, "amxmodmenu")
            }
            else
            {
                ze_colored_print(id, "!tYou are not !gAdmin!y.")
            }
        }
    }
    return PLUGIN_HANDLED
}
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#19

Post by Spir0x » 4 years ago

compiled but see here, the two plugins won't even work on the server when i type "M" choosing team menu appears.

Image

User avatar
sPe3doN
Senior Member
Senior Member
Algeria
Posts: 258
Joined: 7 years ago
Contact:

#20

Post by sPe3doN » 4 years ago

Spir0x wrote: 4 years ago compiled but see here, the two plugins won't even work on the server when i type "M" choosing team menu appears.

Image
vip menu daiyl golds native was

Code: Select all

ze_give_free_golds
and native on daiyl golds plugin was

Code: Select all

ze_get_free_golds
try now
Daily golds:

Code: Select all

#include <zombie_escape>
#include <ze_vip>
 
#define NV_NAME "GET_GOLDS"
#define VIP_ACCESS ADMIN_LEVEL_H
 
enum player_struct {
    mtime,bool:ftime,key[64]
}
new g_player[33][player_struct];
 
new cvar_save_type,cvar_time,cvar_coins;
 
public plugin_natives()
{
    register_native("ze_give_free_golds", "native_ze_give_free_golds", 1)
}
 
public native_ze_give_free_golds(id)
{
    if (!is_user_connected(id))
        return -1
 
    cmd_coins(id)
    return true
}
 
public plugin_init() {
 
    register_plugin("Get Escape Golds", "1.0", "ZE DEV TEAM");
   
    cvar_save_type = register_cvar("get_golds_save_type","1"); // how to save data 1 by authid, 2 by ip or 3 by name
    cvar_time = register_cvar("get_golds_minutes","720"); // time in minutes, 720minutes=12hours it will be auto calculated
    cvar_coins = register_cvar("get_golds_coins","200"); // how many coins to give
}
       
public cmd_coins(id) {
 
    new nv = nvault_open(NV_NAME);
   
    if(nv == INVALID_HANDLE) {
        ze_colored_print(id, "!tFor the moment getting golds system is inactive..");
        return;
    }
   
    new txt_min[32],txt_coins[10];
    new coins = get_pcvar_num(cvar_coins),pminutes = get_pcvar_num(cvar_time);
    copy(txt_coins,charsmax(txt_coins),(coins==1)?"coin":"coins");
    build_time(pminutes,txt_min,charsmax(txt_min));
   
    if(g_player[id][ftime]) {
        ze_colored_print(id, "!tYou have received !g%d !tGolds!y, !tget another in !g%s!y!",coins,txt_min);
        ze_set_escape_coins(id, ze_get_escape_coins(id) + coins);
        g_player[id][ftime]=false;
        nvault_touch(nv,g_player[id][key],g_player[id][mtime]=get_systime());
        return;
    }
   
    new user_time=get_systime()-g_player[id][mtime];
    new diff_min=(user_time<(pminutes*60))?pminutes-(user_time/60):pminutes;
    build_time(diff_min,txt_min,charsmax(txt_min));
   
    if(user_time>=(pminutes*60)) {
        ze_colored_print(id, "!tYou have just received !g%d !tGolds!y, !tsince !g%s !tpassed!y!",coins,txt_min);
        ze_set_escape_coins(id, ze_get_escape_coins(id) + coins);  
        nvault_touch(nv,g_player[id][key],g_player[id][mtime]=get_systime());
    }
    else
        ze_colored_print(id, "!tRetry again in !g%s !tfor getting !g%d !tmore Golds!y.",txt_min,coins);
       
    nvault_close(nv);
}
 
public client_putinserver(id) {
       
    new nv,data[32];
    get_auth(id,g_player[id][key],charsmax(g_player[][key]));
    g_player[id][mtime]=get_systime();
    g_player[id][ftime]=false;
    formatex(data,charsmax(data),"%d",g_player[id][mtime]);
   
    if((nv=nvault_open(NV_NAME))==INVALID_HANDLE)
        return;
   
    if(!nvault_lookup(nv,g_player[id][key],data,charsmax(data),g_player[id][mtime])) {
        nvault_set(nv,g_player[id][key],data);
        g_player[id][ftime]=true;
    }
   
    nvault_close(nv);
}    
 
public client_disconnected(id) {
   
    g_player[id][mtime]=0;
    g_player[id][ftime]=false;
}
 
stock get_auth(id,data[],len)
    switch(get_pcvar_num(cvar_save_type)) {
        case 1: get_user_authid(id,data,len);
        case 2: get_user_ip(id,data,len,1);
        case 3: get_user_name(id,data,len);
    }
 
stock build_time(pminutes,data[],len)
    if(pminutes==1)
        copy(data,len,"1 minute");
    else if(pminutes!=1&&pminutes<60)
        formatex(data,len,"%d minutes",pminutes);
    else if(pminutes==60)
        copy(data,len,"1 hour");
    else {
        new ptime=pminutes/60;
        if(ptime*60==pminutes)
            formatex(data,len,"%d %s",ptime,(ptime==1)?"hour":"hours");
        else {
            new diff=pminutes-ptime*60;
            formatex(data,len,"%d %s and %d %s",ptime,(ptime==1)?"hour":"hours",diff,(diff==1)?"minute":"minutes");
        }
    }
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1036\\ f0\\ fs16 \n\\ par }
*/
Image

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#21

Post by Spir0x » 4 years ago

Thanks

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#22

Post by Spir0x » 4 years ago

guys help me there, the plugin seems like not working. when i press 1. knife menu or 2. Guns menu nothing happen like i didn't press it. can anyone know what's the problem ?

Image

User avatar
sPe3doN
Senior Member
Senior Member
Algeria
Posts: 258
Joined: 7 years ago
Contact:

#23

Post by sPe3doN » 4 years ago

Spir0x wrote: 4 years ago guys help me there, the plugin seems like not working. when i press 1. knife menu or 2. Guns menu nothing happen like i didn't press it. can anyone know what's the problem ?

Image
Can you post you'r code's ?
Image

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#24

Post by Spir0x » 4 years ago

Man all my codes are already posted on this topic go check previous pages. what you want exactly ?

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#25

Post by Night Fury » 4 years ago

There must be an errors.
Give all errors.
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#26

Post by Spir0x » 4 years ago

no errors is appearing bro. just the plugin is not working correctly i think something from the code of vip menu

User avatar
Spir0x
Veteran Member
Veteran Member
Tunisia
Posts: 641
Joined: 7 years ago
Location: Tunisia
Contact:

#27

Post by Spir0x » 4 years ago

Mark it as plugin available and anyone can edit it as he want.

ngamerz
Member
Member
Philippines
Posts: 37
Joined: 3 years ago
Location: Philippines From South Korea

#28

Post by ngamerz » 3 years ago

Is this thread still active?

Please help me! I want to make the menu like this.

VIP Menu
1. Guns
2. Knife Menu

> Guns
1. Salamander
2. Laser Minigun
3. Auto Minigun
4. Stun Rifle
5. Bazooka
6. [ Just give a blank code, i'll edit it ]

> Codes
Salamander:

Code: Select all

#include <zombie_escape>
#include <ze_vip>
#include <amxconst>
#include <fakemeta>
#include <fakemeta_util>
#include <cstrike>
#include <xs>
#include <engine>
#include <fun>

#define PLUGIN "[CSO] Salamander"
#define VERSION "2015"
#define AUTHOR "Dias Pendragon Leon"

#define CSW_SAL CSW_M249
#define weapon_sal "weapon_m249"

#define DAMAGE 38
#define FIRE_SPEED 640.0
#define RECOIL 0.0

#define MODEL_V "models/v_salamander.mdl"
#define MODEL_P "models/p_salamander.mdl"
#define MODEL_W "models/w_salamander.mdl"
#define DEFAULT_W_MODEL "models/w_m249.mdl"

new const WeaponSounds[6][] =
{
	"weapons/flamegun-1.wav",
	"weapons/flamegun_draw.wav",
	"weapons/flamegun_clipin1.wav",
	"weapons/flamegun_clipin2.wav",
	"weapons/flamegun_clipout1.wav",
	"weapons/flamegun_clipout2.wav"
}

new const WeaponResources[7][] = 
{
	"sprites/flame_puff01.spr",
	"sprites/flame_burn01.spr",
	"sprites/weapon_flamethrower.txt",
	"sprites/640hud7_2.spr",
	"sprites/640hud59_2.spr",
	"sprites/640hud60_2.spr",
	"sprites/smokepuff.spr"
}

enum
{
	ANIM_IDLE = 0,
	ANIM_SHOOT,
	ANIM_SHOOT_END,
	ANIM_RELOAD,
	ANIM_DRAW
}

// Marcros
#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)));

// Vars
new g_Had_Salamander, g_WeaponEnt, g_SmokePuff_SprID, Float:g_PunchAngles[33]
new g_MsgCurWeapon, g_MsgWeaponList

// Safety
new g_HamBot
new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
new g_iItemId

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	// Your highness!
	Register_SafetyFunc()
	
	// Forward
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_SetModel, "fw_SetModel")
	register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
	register_forward(FM_CmdStart, "fw_CmdStart")
	register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
	
	// Engine
	register_think("fireinsaigon", "fw_Fire_Think")
	register_touch("fireinsaigon", "*", "fw_Fire_Touch")
	
	// Hams
	RegisterHam(Ham_Item_Deploy, weapon_sal, "fw_Item_Deploy_Post", 1)	
	RegisterHam(Ham_Item_AddToPlayer, weapon_sal, "fw_Item_AddToPlayer_Post", 1)
	
	RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
	RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sal, "fw_Weapon_PrimaryAttack")
	RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sal, "fw_Weapon_PrimaryAttack_Post", 1)
	
	g_MsgCurWeapon = get_user_msgid("CurWeapon")
	g_MsgWeaponList = get_user_msgid("WeaponList")
	
//	register_clcmd("say /get", "Get_Salamander")
	register_clcmd("weapon_flamethrower", "Hook_Weapon")
	
	g_iItemId = ze_register_item("CSO Salamander", 100, 0)
	ze_set_item_vip(g_iItemId, "VIP_A")
}

public plugin_precache()
{
	precache_model(MODEL_V)
	precache_model(MODEL_P)
	precache_model(MODEL_W)
	
	for(new i = 0; i < sizeof(WeaponSounds); i++)
		precache_sound(WeaponSounds[i])
	for(new i = 0; i < sizeof(WeaponResources); i++)
	{
		if(i == 2) precache_generic(WeaponResources[i])
		else if(i == 6) g_SmokePuff_SprID = precache_model(WeaponResources[i])
		else precache_model(WeaponResources[i])
	}
}

public fw_PrecacheEvent_Post(type, const name[])
{
	if(equal("events/m249.sc", name))
		g_WeaponEnt = get_orig_retval()
}

public client_putinserver(id)
{
	Safety_Connected(id)
	if(!g_HamBot && is_user_bot(id))
	{
		g_HamBot = 1
		set_task(0.1, "Register_HamBot", id)
	}
}

public Register_HamBot(id) 
{
	Register_SafetyFuncBot(id)
	RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
}

public client_disconnected(id)
{
	Safety_Disconnected(id)
}

public Hook_Weapon(id)
{
	engclient_cmd(id, weapon_sal)
	return PLUGIN_HANDLED
}

public Get_Salamander(id)
{
	Set_BitVar(g_Had_Salamander, id)
	give_item(id, weapon_sal)
	
	message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
	write_byte(1)
	write_byte(CSW_SAL)
	write_byte(100)
	message_end()
	
	cs_set_user_bpammo(id, CSW_SAL, 200)
}

public Remove_Salamander(id)
{
	UnSet_BitVar(g_Had_Salamander, id)
}

public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
	if(!is_alive(id))
		return FMRES_IGNORED
	if(get_player_weapon(id) != CSW_SAL || !Get_BitVar(g_Had_Salamander, id))
		return FMRES_IGNORED
	
	set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001) 
	
	return FMRES_HANDLED
}

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, DEFAULT_W_MODEL))
	{
		static weapon; weapon = fm_find_ent_by_owner(-1, weapon_sal, entity)
		
		if(!pev_valid(weapon))
			return FMRES_IGNORED
		
		if(Get_BitVar(g_Had_Salamander, id))
		{
			set_pev(weapon, pev_impulse, 442015)
			engfunc(EngFunc_SetModel, entity, MODEL_W)
			
			UnSet_BitVar(g_Had_Salamander, id)
			
			return FMRES_SUPERCEDE
		}
	}

	return FMRES_IGNORED
}

public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
	if(!is_alive(invoker))
		return FMRES_IGNORED
	if(get_player_weapon(invoker) != CSW_SAL || !Get_BitVar(g_Had_Salamander, invoker))
		return FMRES_IGNORED	
	if(eventid == g_WeaponEnt)
	{
		playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)	
		if(pev(invoker, pev_weaponanim) != ANIM_SHOOT) Set_WeaponAnim(invoker, ANIM_SHOOT)
		
		return FMRES_SUPERCEDE
	}
	
	return FMRES_HANDLED
}

public fw_CmdStart(id, uc_handle, seed)
{
	if(!is_alive(id))
		return FMRES_IGNORED
	if(get_player_weapon(id) != CSW_SAL || !Get_BitVar(g_Had_Salamander, id))
		return FMRES_IGNORED
		
	static PressedButton
	PressedButton = get_uc(uc_handle, UC_Buttons)
	
	if(!(PressedButton & IN_ATTACK))
	{
		if((pev(id, pev_oldbuttons) & IN_ATTACK) && pev(id, pev_weaponanim) == ANIM_SHOOT)
		{
			static weapon; weapon = fm_get_user_weapon_entity(id, CSW_SAL)
			if(pev_valid(weapon)) set_pdata_float(weapon, 48, 2.0, 4)
			
			Set_WeaponAnim(id, ANIM_SHOOT_END)
			Make_FireSmoke(id)
		}
	}
		
	return FMRES_HANDLED
}

public Make_FireSmoke(id)
{
	static Float:Origin[3]
	get_position(id, 40.0, 5.0, -15.0, Origin)
	
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
	write_byte(TE_EXPLOSION) 
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(g_SmokePuff_SprID) 
	write_byte(5)
	write_byte(30)
	write_byte(14)
	message_end()
}

public fw_Item_Deploy_Post(Ent)
{
	if(pev_valid(Ent) != 2)
		return
	static Id; Id = get_pdata_cbase(Ent, 41, 4)
	if(get_pdata_cbase(Id, 373) != Ent)
		return
	if(!Get_BitVar(g_Had_Salamander, Id))
		return
	
	set_pev(Id, pev_viewmodel2, MODEL_V)
	set_pev(Id, pev_weaponmodel2, MODEL_P)
}

public fw_Item_AddToPlayer_Post(Ent, id)
{
	if(!pev_valid(Ent))
		return HAM_IGNORED
		
	if(pev(Ent, pev_impulse) == 442015)
	{
		Set_BitVar(g_Had_Salamander, id)
		set_pev(Ent, pev_impulse, 0)
	}
	
	if(Get_BitVar(g_Had_Salamander, id))
	{
		message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, _, id)
		write_string("weapon_flamethrower")
		write_byte(3)
		write_byte(200)
		write_byte(-1)
		write_byte(-1)
		write_byte(0)
		write_byte(4)
		write_byte(CSW_SAL)
		write_byte(0)
		message_end()	
	}
	
	return HAM_HANDLED	
}

public fw_TraceAttack(Ent, Attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
{
	if(!is_alive(Attacker))
		return HAM_IGNORED
	if(get_player_weapon(Attacker) != CSW_SAL || !Get_BitVar(g_Had_Salamander, Attacker))
		return HAM_IGNORED
	
	return HAM_SUPERCEDE
}

public CreateFire(id, Float:Speed)
{
	new iEnt = create_entity("env_sprite")
	if(!pev_valid(iEnt)) return
	
	static Float:vfAngle[3], Float:MyOrigin[3]
	static Float:Origin[3], Float:TargetOrigin[3], Float:Velocity[3]

	get_position(id, 40.0, 5.0, -5.0, Origin)
	get_position(id, 1024.0, 0.0, 0.0, TargetOrigin)
	
	pev(id, pev_angles, vfAngle)
	pev(id, pev_origin, MyOrigin)
	
	vfAngle[2] = float(random(18) * 20)

	// set info for ent
	set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
	set_pev(iEnt, pev_rendermode, kRenderTransAdd)
	set_pev(iEnt, pev_renderamt, 160.0)
	set_pev(iEnt, pev_fuser1, get_gametime() + 1.0)	// time remove
	set_pev(iEnt, pev_scale, 0.25)
	set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
	
	entity_set_string(iEnt, EV_SZ_classname, "fireinsaigon")
	engfunc(EngFunc_SetModel, iEnt, WeaponResources[0])
	set_pev(iEnt, pev_mins, Float:{-1.0, -1.0, -1.0})
	set_pev(iEnt, pev_maxs, Float:{1.0, 1.0, 1.0})
	set_pev(iEnt, pev_origin, Origin)
	set_pev(iEnt, pev_gravity, 0.01)
	set_pev(iEnt, pev_angles, vfAngle)
	set_pev(iEnt, pev_solid, SOLID_TRIGGER)
	set_pev(iEnt, pev_owner, id)	
	set_pev(iEnt, pev_frame, 0.0)
	set_pev(iEnt, pev_iuser2, get_user_team(id))

	get_speed_vector(Origin, TargetOrigin, Speed, Velocity)
	set_pev(iEnt, pev_velocity, Velocity)
	
	emit_sound(iEnt, CHAN_BODY, WeaponSounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)	
}

public fw_Fire_Think(iEnt)
{
	if(!pev_valid(iEnt)) 
		return
	
	static Float:fFrame, Float:fScale
	pev(iEnt, pev_frame, fFrame)
	pev(iEnt, pev_scale, fScale)

	// effect exp
	if(pev(iEnt, pev_movetype) == MOVETYPE_NONE)
	{
		fFrame += 1.0
		fScale += 0.1
		fScale = floatmin(fScale, 1.75)

		if(fFrame > 21.0)
		{
			engfunc(EngFunc_RemoveEntity, iEnt)
			return
		}
		
		set_pev(iEnt, pev_nextthink, get_gametime() + 0.025)
	} else {
		fFrame += 1.25
		fFrame = floatmin(21.0, fFrame)
		fScale += 0.15
		fScale = floatmin(fScale, 1.75)
		
		set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
	}

	set_pev(iEnt, pev_frame, fFrame)
	set_pev(iEnt, pev_scale, fScale)
	
	// time remove
	static Float:fTimeRemove
	pev(iEnt, pev_fuser1, fTimeRemove)
	if (get_gametime() >= fTimeRemove)
	{
		engfunc(EngFunc_RemoveEntity, iEnt)
		return;
	}
}

public fw_Fire_Touch(ent, id)
{
	if(!pev_valid(ent))
		return
		
	if(pev_valid(id))
	{
		static Classname[32]
		pev(id, pev_classname, Classname, sizeof(Classname))
		
		if(equal(Classname, "fireinsaigon")) return
		else if(is_alive(id)) 
		{
			static EntTeam; EntTeam = pev(ent, pev_iuser2)
			if(get_user_team(id) != EntTeam)
			{
				static Attacker; Attacker = pev(ent, pev_owner)
				if(is_connected(Attacker))
				{
					ExecuteHamB(Ham_TakeDamage, id, 0, Attacker, float(DAMAGE), DMG_BULLET)
				}
			}
		}
	}
		
	set_pev(ent, pev_movetype, MOVETYPE_NONE)
	set_pev(ent, pev_solid, SOLID_NOT)
}

public ze_select_item_pre(id, itemid)
{
	// If it is not the gun the player is willing to buy then just make it available.
	// g_iItemId is the handler you made it before.
	// You can name itemid whatever you like but just not the same handler name.
	
	if (itemid != g_iItemId)
		return ZE_ITEM_AVAILABLE
		
	// In this item we are working on, it will be for humans only so we need to hide it for zombies so they do not get it.
	//If you want it to be for zombies, you need to add the not operator "!" before the native so it's gonna be like this:
	// if (!ze_is_user_zombie(id))
	// If you want an item to be for zombies & humans then just don't add the next code.
	
	if (ze_is_user_zombie(id))
		return ZE_ITEM_DONT_SHOW
		
	// Here we need to return a value so you don't get a warning on compiling.
	return ZE_ITEM_AVAILABLE
}

public ze_select_item_post(id, itemid)
{
	// Here we just block buying the gun if it is not the gun the player is willing to buy so we just add return without values.
	if (itemid != g_iItemId)
		return
		
	// Here you can give the item & you can even add a message to notice the player what he bought for example like this:
	ze_colored_print(id, "You have successfully bought the item.")
	
	// Do you remember in public plugin_init(), we found something like this in it:
	// register_clcmd("say /get", "Get_MyWeapon")
	// That line is to allow you to get the gun for free when you type that command.
	// Well, we don't care about it, we care about:
	// Get_MyWeapon
	// This is the function we will use to give the weapon to the player
	// It's like this:
	Get_Salamander(id)
}

public fw_Weapon_PrimaryAttack(ent)
{
	static id; id = pev(ent, pev_owner)
	pev(id, pev_punchangle, g_PunchAngles[id])
	
	return HAM_IGNORED	
}

public fw_Weapon_PrimaryAttack_Post(ent)
{
	static id; id = pev(ent, pev_owner)

	if(get_player_weapon(id) == CSW_SAL && Get_BitVar(g_Had_Salamander, id) && cs_get_weapon_ammo(ent) > 0)
	{
		static Float:push[3]
		pev(id, pev_punchangle, push)
		xs_vec_sub(push, g_PunchAngles[id], push)
		
		xs_vec_mul_scalar(push, RECOIL, push)
		xs_vec_add(push, g_PunchAngles[id], push)
		set_pev(id, pev_punchangle, push)
		
		CreateFire(id, FIRE_SPEED)
	} else {
		static Float:push[3]
		pev(id, pev_punchangle, push)
		xs_vec_sub(push, g_PunchAngles[id], push)
		
		xs_vec_mul_scalar(push, 0.0, push)
		xs_vec_add(push, g_PunchAngles[id], push)
		set_pev(id, pev_punchangle, push)
	}
	
	return HAM_IGNORED	
}

stock Set_WeaponIdleTime(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_PlayerNextAttack(id, Float:nexttime)
{
	set_pdata_float(id, 83, nexttime, 5)
}

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

stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
	new 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]
	new Float: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;
}

stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
{ 
	static Float:vfEnd[3], viEnd[3] 
	get_user_origin(id, viEnd, 3)  
	IVecFVec(viEnd, vfEnd) 
	
	static Float:fOrigin[3], Float:fAngle[3]
	
	pev(id, pev_origin, fOrigin) 
	pev(id, pev_view_ofs, fAngle)
	
	xs_vec_add(fOrigin, fAngle, fOrigin) 
	
	static Float:fAttack[3]
	
	xs_vec_sub(vfEnd, fOrigin, fAttack)
	xs_vec_sub(vfEnd, fOrigin, fAttack) 
	
	static Float:fRate
	
	fRate = fDis / vector_length(fAttack)
	xs_vec_mul_scalar(fAttack, fRate, fAttack)
	
	xs_vec_add(fOrigin, fAttack, output)
}

/* ===============================
------------- SAFETY -------------
=================================*/
public Register_SafetyFunc()
{
	register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
	
	RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
	RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
}

public Register_SafetyFuncBot(id)
{
	RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1)
	RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1)
}

public Safety_Connected(id)
{
	Set_BitVar(g_IsConnected, id)
	UnSet_BitVar(g_IsAlive, id)
	
	g_PlayerWeapon[id] = 0
}

public Safety_Disconnected(id)
{
	UnSet_BitVar(g_IsConnected, id)
	UnSet_BitVar(g_IsAlive, id)
	
	g_PlayerWeapon[id] = 0
}

public Safety_CurWeapon(id)
{
	if(!is_alive(id))
		return
		
	static CSW; CSW = read_data(2)
	if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
}

public fw_Safety_Spawn_Post(id)
{
	if(!is_user_alive(id))
		return
		
	Set_BitVar(g_IsAlive, id)
}

public fw_Safety_Killed_Post(id)
{
	UnSet_BitVar(g_IsAlive, id)
}

public is_connected(id)
{
	if(!(1 <= id <= 32))
		return 0
	if(!Get_BitVar(g_IsConnected, id))
		return 0

	return 1
}

public is_alive(id)
{
	if(!is_connected(id))
		return 0
	if(!Get_BitVar(g_IsAlive, id))
		return 0
		
	return 1
}

public get_player_weapon(id)
{
	if(!is_alive(id))
		return 0
	
	return g_PlayerWeapon[id]
}


// ===================== STOCK... =======================
// ======================================================
Stun Rifle:

Code: Select all

/*
*	Stun Rifle is a CSO weapon, More information about it: http://cso.wikia.com/wiki/Stun_Rifle
*	
*	This plugin written by me: Raheem (The basic things for any weapon not written by me)
*
*	I tried to simulate it same as in CSO, I think it's nearly same else simple things
*	That will be done in next versions.
*
*	Version 1.0 creation date: 16-6-2018
*	Version 1.0 publication date: 20-6-2018
*
*	Last update: 4-8-2018
*
*	TODO List: Fix any problem, include good ideas
*/

#include <zombie_escape>
#include <fakemeta_util>

#define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)

// CWeaponBox
#define m_rgpPlayerItems_CWeaponBox 34

// CBasePlayerItem
#define m_pPlayer 41
#define m_pNext 42
#define m_iId 43

// CBasePlayerWeapon
#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47
#define m_flTimeWeaponIdle 48
#define m_iPrimaryAmmoType 49
#define m_iClip 51
#define m_fInReload 54
#define m_iWeaponState 74

// CBaseMonster
#define m_flNextAttack 83

// CBasePlayer
#define m_iFOV 363
#define m_rpgPlayerItems 367
#define m_pActiveItem 373
#define m_rgAmmo 376

/*-----------------------------------------------------*/

#define WEAPON_KEY 776544229
#define WEAPON_OLD "weapon_ak47"
#define WEAPON_NEW "weapon_stunrifle"

/*-----------------------------------------------------*/

new const WPN_SPRITES[][] =
{
	"sprites/weapon_stunrifle.txt",
	"sprites/640hud169.spr",
	"sprites/640hud7.spr"
}

new const g_szSounds[][] =
{
	"weapons/stunrifle-1.wav",
	"weapons/stunrifle_drawa.wav",
	"weapons/stunrifle_drawb.wav",
	"weapons/stunrifle_drawc.wav",
	"weapons/stunrifle_reloada.wav",
	"weapons/stunrifle_reloadb.wav",
	"weapons/stunrifle_reloadc.wav",
	"weapons/stunrifle_idlea.wav",
	"weapons/stunrifle_idleb.wav",
	"weapons/stunrifle_idlec.wav",
	"weapons/stunrifle_lowbattery.wav",
	"weapons/stunrifle-2.wav"
}

new const iWeaponList[] =
{  
	2, 30, -1, -1, 0, 1, CSW_AK47, 0
}

#define WEAPON_MODEL_V "models/stunrifle/v_stunrifle.mdl"
#define WEAPON_MODEL_P "models/stunrifle/p_stunrifle.mdl"
#define WEAPON_MODEL_W "models/stunrifle/w_stunrifle.mdl"
#define WEAPON_BODY 0

/*-----------------------------------------------------*/

#define WEAPON_COST 0

#define WEAPON_CLIP 30
#define WEAPON_AMMO 90
#define WEAPON_RATE 0.098
#define WEAPON_RECOIL 0.96
#define WEAPON_DAMAGE 1.0 // AK47 damage multiplied by this factor

#define WEAPON_RATE_EX 0.169
#define WEAPON_RECOIL_EX 0.79
#define WEAPON_DAMAGE_EX 1.3
#define WEAPON_NATIVE "native_give_weapon_stunrifle"

/*-----------------------------------------------------*/

// Animations
#define ANIM_IDLE_A 0
#define ANIM_IDLE_B 1
#define ANIM_IDLE_C 2
#define ANIM_ATTACK_A 3
#define ANIM_ATTACK_B 4
#define ANIM_ATTACK_C 5
#define ANIM_RELOAD_A 6
#define ANIM_RELOAD_B 7
#define ANIM_RELOAD_C 8
#define ANIM_DRAW_A 9
#define ANIM_DRAW_B 10
#define ANIM_DRAW_C 11

// from model: Frames / FPS
#define ANIM_IDLE_TIME_A 90/30.0
#define ANIM_SHOOT_TIME_A 31/30.0
#define ANIM_RELOAD_TIME_A 101/30.0
#define ANIM_DRAW_TIME_A 46/30.0
#define ANIM_IDLE_TIME_B 90/30.0
#define ANIM_SHOOT_TIME_B 31/30.0
#define ANIM_RELOAD_TIME_B 101/30.0
#define ANIM_DRAW_TIME_B 46/30.0
#define ANIM_IDLE_TIME_C 90/30.0
#define ANIM_SHOOT_TIME_C 31/30.0
#define ANIM_RELOAD_TIME_C 101/30.0
#define ANIM_DRAW_TIME_C 46/30.0

new g_AllocString_V, 
	g_AllocString_P, 
	g_AllocString_E,

	HamHook: g_fw_TraceAttack[4],
	
	g_iMsgID_Weaponlist,
	g_iStoredEnergy[33],
	bool:g_bHasStunRifle[33],
	g_pCvarBarFillTime,
	g_pCvarRadius,
	g_pCvarElecDmg,
	g_iLigSpr,
	g_iEffSpr,
	g_iEff2Spr,
	bool:g_bReloading[33],
	g_iAppearTimes[33],
	g_iItemID

public plugin_init()
{
	register_plugin("[ZE] Stun Rifle", "1.1", "Raheem");

	// Register our item
	g_iItemID = ze_register_item("Stun Rifle", 300, 0) // It's cost 300 Coins
	
	RegisterHam(Ham_Item_Deploy, WEAPON_OLD, "fw_Item_Deploy_Post", 1);
	RegisterHam(Ham_Item_PostFrame, WEAPON_OLD, "fw_Item_PostFrame");
	RegisterHam(Ham_Item_AddToPlayer, WEAPON_OLD, "fw_Item_AddToPlayer_Post", 1);
	RegisterHam(Ham_Weapon_Reload, WEAPON_OLD, "fw_Weapon_Reload");
	RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_OLD, "fw_Weapon_WeaponIdle");
	RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_OLD, "fw_Weapon_PrimaryAttack");
	
	g_fw_TraceAttack[0] = RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack");
	g_fw_TraceAttack[1] = RegisterHam(Ham_TraceAttack, "info_target",    "fw_TraceAttack");
	g_fw_TraceAttack[2] = RegisterHam(Ham_TraceAttack, "player",         "fw_TraceAttack");
	g_fw_TraceAttack[3] = RegisterHam(Ham_TraceAttack, "hostage_entity", "fw_TraceAttack");
	fm_ham_hook(false);
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1);
	register_forward(FM_PlaybackEvent, "fw_PlaybackEvent");
	register_forward(FM_SetModel, "fw_SetModel");
	
	g_pCvarBarFillTime = register_cvar("stunrifle_barfill_time", "5") // Bar fill time in seconds
	g_pCvarRadius = register_cvar("stunrifle_radius", "500") // elec radius
	g_pCvarElecDmg = register_cvar("stunrifle_electricity_dmg", "10") // electricity damage - lowest damage for 1 bar only
	
	register_clcmd(WEAPON_NEW, "HookSelect");
	g_iMsgID_Weaponlist = get_user_msgid("WeaponList");
}

public plugin_precache()
{
	g_AllocString_V = engfunc(EngFunc_AllocString, WEAPON_MODEL_V);
	g_AllocString_P = engfunc(EngFunc_AllocString, WEAPON_MODEL_P);
	g_AllocString_E = engfunc(EngFunc_AllocString, WEAPON_OLD);
	engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_V);
	engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_P);
	engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_W);
	
	for (new i = 0; i < sizeof g_szSounds; i++) engfunc(EngFunc_PrecacheSound, g_szSounds[i]);
	
	for(new i = 0; i < sizeof WPN_SPRITES;i++) precache_generic(WPN_SPRITES[i]);
	
	g_iLigSpr = precache_model("sprites/lightning.spr");
	g_iEffSpr = precache_model("sprites/ef_buffak_hit.spr");
	g_iEff2Spr = precache_model("sprites/muzzleflash67.spr");
}

public HookSelect(iPlayer)
{
	engclient_cmd(iPlayer, WEAPON_OLD);
}

public give(id)
{
	give_weapon_stunrifle(id)
}

public give_weapon_stunrifle(iPlayer)
{
	static iEnt; iEnt = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E);
	if(iEnt <= 0) return 0;
	set_pev(iEnt, pev_spawnflags, SF_NORESPAWN);
	set_pev(iEnt, pev_impulse, WEAPON_KEY);
	ExecuteHam(Ham_Spawn, iEnt);
	UTIL_DropWeapon(iPlayer, 1);
	if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iEnt)) {
		engfunc(EngFunc_RemoveEntity, iEnt);
		return 0;
	}
	ExecuteHamB(Ham_Item_AttachToPlayer, iEnt, iPlayer);
	set_pdata_int(iEnt, m_iClip, WEAPON_CLIP, 4);
	new iAmmoType = m_rgAmmo +get_pdata_int(iEnt, m_iPrimaryAmmoType, 4);
	if(get_pdata_int(iPlayer, m_rgAmmo, 5) < WEAPON_AMMO)
	set_pdata_int(iPlayer, iAmmoType, WEAPON_AMMO, 5);
	emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	g_iStoredEnergy[iPlayer] = 0;
	g_bHasStunRifle[iPlayer] = true;
	set_task(get_pcvar_float(g_pCvarBarFillTime), "RechargeTask", iPlayer, _, _, "a", 6)
	return 1;
}

public plugin_natives()
{
	register_native(WEAPON_NATIVE, "give_weapon_stunrifle", 1);
}

public ze_select_item_pre(id, itemid)
{
	// Return Available and we will block it in Post, So it dosen't affect other plugins
	if (itemid != g_iItemID)
		return ZE_ITEM_AVAILABLE
	
	// Available for Humans only, So don't show it for zombies
	if (ze_is_user_zombie(id))
		return ZE_ITEM_DONT_SHOW
   
	return ZE_ITEM_AVAILABLE
}

public ze_select_item_post(player, itemid)
{
	if (itemid != g_iItemID)
		return
	
	give_weapon_stunrifle(player)
}

public fw_Item_Deploy_Post(iItem)
{
	if(!CustomItem(iItem)) return;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);

	set_pev_string(iPlayer, pev_viewmodel2, g_AllocString_V);
	set_pev_string(iPlayer, pev_weaponmodel2, g_AllocString_P);
	
	if (g_iStoredEnergy[iPlayer] == 0)
	{
		// Draw A
		UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_A);
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_A, 5);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_A, 4);
	}
	else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
	{
		// Draw B
		UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_B);
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_B, 5);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_B, 4);
	}
	else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
	{
		// Draw C
		UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_C);
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_C, 5);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_C, 4);
	}
}

public fw_Item_PostFrame(iItem)
{
	if(!CustomItem(iItem)) return HAM_IGNORED;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
	if(get_pdata_int(iItem, m_fInReload, 4) == 1) {
		static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
		static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
		static iAmmo; iAmmo = get_pdata_int(iPlayer, iAmmoType, 5);
		static j; j = min(WEAPON_CLIP - iClip, iAmmo);
		set_pdata_int(iItem, m_iClip, iClip+j, 4);
		set_pdata_int(iPlayer, iAmmoType, iAmmo-j, 5);
		set_pdata_int(iItem, m_fInReload, 0, 4);
	}
	else switch(get_pdata_int(iItem, m_iWeaponState, 4) ) {
		case 0: {
			if(get_pdata_float(iItem, m_flNextSecondaryAttack, 4) <= 0.0)
			if(pev(iPlayer, pev_button) & IN_ATTACK2) {
				set_pdata_int(iPlayer, m_iFOV, get_pdata_int(iPlayer, m_iFOV, 5) == 90 ? 60 : 90);
				set_pdata_float(iItem, m_flNextSecondaryAttack, 0.3, 4);
			}
		}
	}
	
	return HAM_IGNORED;
}

public fw_Item_AddToPlayer_Post(iItem, iPlayer)
{
	switch(pev(iItem, pev_impulse)) {
		case WEAPON_KEY: { 
		s_weaponlist(iPlayer, true); 
		g_bHasStunRifle[iPlayer] = true;
		
		if (g_iStoredEnergy[iPlayer] < 6)
		{
			set_task(101/30.0, "OnReloadFinished", iPlayer);
		}
		else if (g_iStoredEnergy[iPlayer] == 6)
		{
			client_print(iPlayer, print_center, "Your Stun Rifle is fully charged!")
		}
		}
		case 0: s_weaponlist(iPlayer, false);
	}
}

public ze_user_infected(infected)
{
	if (g_bHasStunRifle[infected])
	{
		g_bHasStunRifle[infected] = false
		g_iStoredEnergy[infected] = 0;
	}
}

public ze_user_humanized(id)
{
	g_bHasStunRifle[id] = false
	g_iStoredEnergy[id] = 0;
}

public fw_Weapon_Reload(iItem)
{
	if(!CustomItem(iItem)) return HAM_IGNORED;
	static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
	if(iClip >= WEAPON_CLIP) return HAM_SUPERCEDE;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
	static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
	if(get_pdata_int(iPlayer, iAmmoType, 5) <= 0) return HAM_SUPERCEDE
	if(get_pdata_int(iPlayer, m_iFOV, 5) != 90) set_pdata_int(iPlayer, m_iFOV, 90, 5);

	set_pdata_int(iItem, m_iClip, 0, 4);
	ExecuteHam(Ham_Weapon_Reload, iItem);
	set_pdata_int(iItem, m_iClip, iClip, 4);

	set_pdata_int(iItem, m_fInReload, 1, 4);
	
	g_bReloading[iPlayer] = true;
	set_task(3.0, "AttackTask", iPlayer+444)

	if (g_iStoredEnergy[iPlayer] == 0)
	{
		// Reload A
		set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_A, 4);
		set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_A, 4);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_A, 4);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_A, 5);
		
		UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_A);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[10], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
	else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
	{
		// Reload B
		set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_B, 4);
		set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_B, 4);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_B, 4);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_B, 5);
		
		UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_B);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		
		if (notEmpty(iPlayer))
		{
			emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[11], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		}
	}
	else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
	{
		// Reload C
		set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_C, 4);
		set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_C, 4);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_C, 4);
		set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_C, 5);
		
		UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_C);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		
		if (notEmpty(iPlayer))
		{
			emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[11], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
		}
	}
	
	// Set task to recharge the battary
	remove_task(iPlayer)
	set_task(101/30.0, "OnReloadFinished", iPlayer)

	return HAM_SUPERCEDE;
}

public AttackTask(taskid)
{
	g_bReloading[taskid - 444] = false;
		
	// After reload reset the stored energy
	g_iStoredEnergy[taskid - 444] = 0;
	
	g_iAppearTimes[taskid - 444] = 0;
}

public client_PreThink(id)
{
	if (g_bReloading[id] && g_bHasStunRifle[id] && (get_user_weapon(id) == CSW_AK47))
	{
		if (g_iStoredEnergy[id] == 0)
		{
			// Reload A
			
		}
		else if (g_iStoredEnergy[id] > 0 && g_iStoredEnergy[id] <= 3)
		{
			// Reload B
			static Float:flOrigin[3]
			pev(id, pev_origin, flOrigin)
			new iVictim = -1;
			
			while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
			{
				if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
					continue
				
				static Float:flVecOrigin[3];
				pev(iVictim, pev_origin, flVecOrigin);
					
				ElectricBeam(id, flVecOrigin);
					
				ExecuteHam(Ham_TakeDamage, iVictim, id, id, get_pcvar_float(g_pCvarElecDmg) * g_iStoredEnergy[id], DMG_SLASH);
			
				fm_set_user_rendering(iVictim, kRenderFxGlowShell, 51, 51, 225, kRenderNormal, 10);
				set_task(101/30.0, "Delete_Glow", iVictim+4444);
			}
		}
		else if (g_iStoredEnergy[id] > 3 && g_iStoredEnergy[id] <= 6)
		{
			// Reload C
			static Float:flOrigin[3]
			pev(id, pev_origin, flOrigin)
			new iVictim = -1;
			
			while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
			{
				if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
					continue
				
				static Float:flVecOrigin[3]
				pev(iVictim, pev_origin, flVecOrigin)
				
				ElectricBeam(id, flVecOrigin)
				
				ExecuteHam(Ham_TakeDamage, iVictim, id, id, get_pcvar_float(g_pCvarElecDmg) * g_iStoredEnergy[id], DMG_SLASH);
				
				fm_set_user_rendering(iVictim, kRenderFxGlowShell, 51, 51, 225, kRenderNormal, 10);
				set_task(101/30.0, "Delete_Glow", iVictim+4444);
			}
		}
	}
}

public Delete_Glow(taskid)
{
	new id = taskid - 4444;
	fm_set_user_rendering(id);
}

public OnReloadFinished(id)
{
	remove_task(id)
	set_task(get_pcvar_float(g_pCvarBarFillTime), "RechargeTask", id, _, _, "a", 6)
}

public RechargeTask(id)
{
	if (!g_bHasStunRifle[id])
		return
	
	// Increase one bar every x time
	g_iStoredEnergy[id]++
	
	new szBars[100];
	
	switch(g_iStoredEnergy[id])
	{
		case 1:
		{
			szBars = "[ |           ]";
		}
		case 2:
		{
			szBars = "[ | |         ]";
		}
		case 3:
		{
			szBars = "[ | | |       ]";
		}
		case 4:
		{
			szBars = "[ | | | |     ]";
		}
		case 5:
		{
			szBars = "[ | | | | |   ]";
		}
		case 6:
		{
			szBars = "[ | | | | | | ]";
		}
	}
	
	set_dhudmessage(51, 153, 255, -1.0, -0.16, 0, 0.0, get_pcvar_float(g_pCvarBarFillTime) - 0.2)
	show_dhudmessage(id, "Stun Rifle Battary: %s", szBars)
	
	if (g_iStoredEnergy[id] == 6)
	{
		client_print(id, print_center, "Your Stun Rifle is fully charged!")
		remove_task(id)
	}
}

public fw_Weapon_WeaponIdle(iItem)
{
	if(!CustomItem(iItem) || get_pdata_float(iItem, m_flTimeWeaponIdle, 4) > 0.0) return HAM_IGNORED;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);

	if (g_iStoredEnergy[iPlayer] == 0)
	{
		// Idle A
		UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_A);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_A, 4);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[7], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
	else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
	{
		// Idle B
		UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_B);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_B, 4);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[8], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
	else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
	{
		// Idle C
		UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_C);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_C, 4);
		
		emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[9], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	}
	
	return HAM_SUPERCEDE;
}

public fw_Weapon_PrimaryAttack(iItem)
{
	if(!CustomItem(iItem)) return HAM_IGNORED;
	static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
	static iFOV; iFOV = (get_pdata_int(iPlayer, m_iFOV, 5) != 90);
	if(get_pdata_int(iItem, m_iClip, 4) == 0) {
		ExecuteHam(Ham_Weapon_PlayEmptySound, iItem);
		set_pdata_float(iItem, m_flNextPrimaryAttack, 0.2, 4);
		return HAM_SUPERCEDE;
	}
	static fw_TraceLine; fw_TraceLine = register_forward(FM_TraceLine, "fw_TraceLine_Post", 1);
	fm_ham_hook(true);
	state FireBullets: Enabled;
	ExecuteHam(Ham_Weapon_PrimaryAttack, iItem);
	state FireBullets: Disabled;
	unregister_forward(FM_TraceLine, fw_TraceLine, 1);
	fm_ham_hook(false);
	static Float:vecPunchangle[3];

	pev(iPlayer, pev_punchangle, vecPunchangle);
	vecPunchangle[0] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
	vecPunchangle[1] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
	vecPunchangle[2] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
	set_pev(iPlayer, pev_punchangle, vecPunchangle);

	emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
	
	if (g_iStoredEnergy[iPlayer] == 0)
	{
		// Idle A
		UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_A);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_A, 4);
	}
	else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
	{
		// Idle B
		UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_B);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_B, 4);
	}
	else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
	{
		// Idle C
		UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_C);
		set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_C, 4);
	}
	
	Make_Muzzleflash(iPlayer)

	set_pdata_float(iItem, m_flNextPrimaryAttack, iFOV ? WEAPON_RATE_EX : WEAPON_RATE, 4);

	return HAM_SUPERCEDE;
}

public fw_PlaybackEvent() <FireBullets: Enabled> { return FMRES_SUPERCEDE; }
public fw_PlaybackEvent() <FireBullets: Disabled> { return FMRES_IGNORED; }
public fw_PlaybackEvent() <> { return FMRES_IGNORED; }
public fw_TraceAttack(iVictim, iAttacker, Float:flDamage) {
	if(!is_user_connected(iAttacker)) return;
	static iItem; iItem = get_pdata_cbase(iAttacker, m_pActiveItem, 5);
	static iFOV; iFOV = (get_pdata_int(iAttacker, m_iFOV, 5) != 90);
	static Float: flWeaponDamage; flWeaponDamage = (iFOV ? WEAPON_DAMAGE_EX : WEAPON_DAMAGE);
	if(iItem <= 0 || !CustomItem(iItem)) return;
        SetHamParamFloat(3, flDamage * flWeaponDamage);
}

public fw_UpdateClientData_Post(iPlayer, SendWeapons, CD_Handle)
{
	if(get_cd(CD_Handle, CD_DeadFlag) != DEAD_NO) return;
	static iItem; iItem = get_pdata_cbase(iPlayer, m_pActiveItem, 5);
	if(iItem <= 0 || !CustomItem(iItem)) return;
	set_cd(CD_Handle, CD_flNextAttack, 999999.0);
}

public fw_SetModel(iEnt)
{
	static i, szClassname[32], iItem; 
	pev(iEnt, pev_classname, szClassname, 31);
	if(!equal(szClassname, "weaponbox")) return FMRES_IGNORED;
	for(i = 0; i < 6; i++) {
		iItem = get_pdata_cbase(iEnt, m_rgpPlayerItems_CWeaponBox + i, 4);
		if(iItem > 0 && CustomItem(iItem)) {
			engfunc(EngFunc_SetModel, iEnt, WEAPON_MODEL_W);
			set_pev(iEnt, pev_body, WEAPON_BODY);
			new iPlayer = pev(iEnt, pev_owner);
			g_bHasStunRifle[iPlayer] = false;
			remove_task(iPlayer)
			return FMRES_SUPERCEDE;
		}
	}
	return FMRES_IGNORED;
}

public fw_TraceLine_Post(const Float:flOrigin1[3], const Float:flOrigin2[3], iFrag, iIgnore, tr)
{
	if(iFrag & IGNORE_MONSTERS) return FMRES_IGNORED;
	static pHit; pHit = get_tr2(tr, TR_pHit);
	static Float:flvecEndPos[3]; get_tr2(tr, TR_vecEndPos, flvecEndPos);
	if(pHit > 0) {
		if(pev(pHit, pev_solid) != SOLID_BSP) return FMRES_IGNORED;
	}
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, flvecEndPos, 0);
	write_byte(TE_GUNSHOTDECAL);
	engfunc(EngFunc_WriteCoord, flvecEndPos[0]);
	engfunc(EngFunc_WriteCoord, flvecEndPos[1]);
	engfunc(EngFunc_WriteCoord, flvecEndPos[2]);
	write_short(pHit > 0 ? pHit : 0);
	write_byte(random_num(41, 45));
	message_end();

	return FMRES_IGNORED;
}

public fm_ham_hook(bool:on) {
	if(on) {
		EnableHamForward(g_fw_TraceAttack[0]);
		EnableHamForward(g_fw_TraceAttack[1]);
		EnableHamForward(g_fw_TraceAttack[2]);
		EnableHamForward(g_fw_TraceAttack[3]);
	}
	else {
		DisableHamForward(g_fw_TraceAttack[0]);
		DisableHamForward(g_fw_TraceAttack[1]);
		DisableHamForward(g_fw_TraceAttack[2]);
		DisableHamForward(g_fw_TraceAttack[3]);
	}
}

stock UTIL_SendWeaponAnim(iPlayer, iAnim)
{
	set_pev(iPlayer, pev_weaponanim, iAnim);

	message_begin(MSG_ONE, SVC_WEAPONANIM, _, iPlayer);
	write_byte(iAnim);
	write_byte(0);
	message_end();
}

stock UTIL_DropWeapon(iPlayer, iSlot) {
	static iEntity, iNext, szWeaponName[32]; 
	iEntity = get_pdata_cbase(iPlayer, m_rpgPlayerItems + iSlot, 5);
	if(iEntity > 0) {       
		do {
			iNext = get_pdata_cbase(iEntity, m_pNext, 4)
			if(get_weaponname(get_pdata_int(iEntity, m_iId, 4), szWeaponName, 31)) {  
				engclient_cmd(iPlayer, "drop", szWeaponName);
			}
		} while(( iEntity = iNext) > 0);
	}
}

stock s_weaponlist(iPlayer, bool:on)
{
	message_begin(MSG_ONE, g_iMsgID_Weaponlist, {0,0,0}, iPlayer);
	write_string(on ? WEAPON_NEW : WEAPON_OLD);
	write_byte(iWeaponList[0]);
	write_byte(on ? WEAPON_AMMO : iWeaponList[1]);
	write_byte(iWeaponList[2]);
	write_byte(iWeaponList[3]);
	write_byte(iWeaponList[4]);
	write_byte(iWeaponList[5]);
	write_byte(iWeaponList[6]);
	write_byte(iWeaponList[7]);
	message_end();
}

stock ElectricBeam(id, Float:flOrigin[3])
{
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_BEAMENTPOINT)
	write_short(id | 0x1000)
	engfunc(EngFunc_WriteCoord, flOrigin[0])
	engfunc(EngFunc_WriteCoord, flOrigin[1])
	engfunc(EngFunc_WriteCoord, flOrigin[2])
	write_short(g_iLigSpr)
	write_byte(1); // framestart
	write_byte(100); // framerate - 5
	write_byte(1) // life - 30
	write_byte(30); // width
	write_byte(random_num(0, 10)); // noise
	write_byte(51); // r, g, b
	write_byte(51); // r, g, b
	write_byte(255); // r, g, b
	write_byte(200); // brightness
	write_byte(200); // speed
	message_end()
	
	if (g_iAppearTimes[id] >= 2)
		return
	
	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(g_iEffSpr);
	write_byte(10);
	write_byte(10);
	write_byte(TE_EXPLFLAG_NOSOUND|TE_EXPLFLAG_NOPARTICLES|TE_EXPLFLAG_NODLIGHTS);
	message_end();
	
	g_iAppearTimes[id]++
}

stock notEmpty(id)
{
	static Float:flOrigin[3]
	pev(id, pev_origin, flOrigin)
	new iVictim = -1;
			
	while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
	{
		if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
			continue
		
		return true;
	}
	
	return false;
}

public Make_Muzzleflash(id)
{
	static Float:Origin[3], TE_FLAG
	get_position(id, 32.0, 6.0, -15.0, Origin)
	
	TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
	TE_FLAG |= TE_EXPLFLAG_NOSOUND
	TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
	
	engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, Origin, id)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(g_iEff2Spr)
	write_byte(2)
	write_byte(30)
	write_byte(TE_FLAG)
	message_end()
}

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
}
Bazooka:

Code: Select all

#include <zombie_escape> 
 
static const plugin[] = "[ZE] Extra Item: Bazooka"; 
 
static const mrocket[] = "models/zombie_escape/zm_bazooka_missile.mdl";
static const mrpg_w[] = "models/zombie_escape/w_zm_bazooka.mdl";
static const mrpg_v[] = "models/zombie_escape/v_zm_bazooka.mdl";
static const mrpg_p[] = "models/zombie_escape/p_zm_bazooka.mdl";
static const sfire[] = "weapons/rocketfire1.wav";
static const sfly[] = "weapons/nuke_fly.wav"; 
static const shit[] = "weapons/mortarhit.wav";
static const spickup[] = "items/gunpickup2.wav";
 
new g_itemid;
 
new gmsg_screenshake, gmsg_death, gmsg_damage, pcvar_delay, pcvar_maxdmg, pcvar_radius, pcvar_map;
new rocketsmoke, explosion, bazsmoke, white;
new bool:has_baz[33], bool:CanShoot[33];
new dmgcount[33], pcvar_dmgforpacks, pcvar_award;
 
public plugin_init()
{
    register_plugin(plugin, "0.6", "Random1");
   
    pcvar_delay = register_cvar("zp_baz_delay", "10.0");
    pcvar_maxdmg = register_cvar("zp_baz_dmg", "720"); 
    pcvar_radius = register_cvar("zp_baz_radius", "750");
    pcvar_map = register_cvar("zp_baz_map", "0");
    pcvar_dmgforpacks = get_cvar_pointer("zp_human_damage_reward");
    pcvar_award = register_cvar("zp_baz_awardpacks", "1");
   
    if ( pcvar_dmgforpacks == 0 ) {
        set_pcvar_num(pcvar_award, 0);  //if we couldn't read the dmg cvar from zp then set a stop state on dmg reward
        log_amx("[%s] error reading zp_human_damage_reward cvar from zombie plague, turning award for damage off", plugin);
    }
   
    g_itemid = ze_register_item("Bazooka", 65, 0);
   
    register_concmd("zp_bazooka", "give_bazooka", ADMIN_KICK, "<name/@all> gives a bazooka to the spcified target");
    register_event("CurWeapon","switch_to_knife","be","1=1","2=29");
    register_event("HLTV", "event_HLTV", "a", "1=0", "2=0") // New Round
    register_clcmd("drop", "drop_call");
   
    //supports 2 methods of firing, attacking while holding knife and a bind
    register_clcmd("baz_fire", "fire_call");
    register_forward(FM_PlayerPreThink, "fw_prethink");
   
    register_forward(FM_Touch, "fw_touch");
       
    gmsg_screenshake = get_user_msgid("ScreenShake");
    gmsg_death = get_user_msgid("DeathMsg");
    gmsg_damage = get_user_msgid("Damage");
}
public event_HLTV()
{
    //remove entities regardless of cvar
    new rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp");
    while( rpg_temp > 0) {
        engfunc(EngFunc_RemoveEntity, rpg_temp);
        rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp");
    }
   
    if ( get_pcvar_num(pcvar_map) ) return;
   
    for( new id = 1; id <= 32; id++ )
        has_baz[id] = false;
}
 
public ze_select_item_pre(id, itemid)
{
    // This not our item?
    if (itemid != g_itemid)
        return ZE_ITEM_AVAILABLE
   
    // Available for Humans only, So don't show it for zombies
    if (ze_is_user_zombie(id))
        return ZE_ITEM_DONT_SHOW
   
    // Finally return that it's available
    return ZE_ITEM_AVAILABLE
}  
 
public ze_select_item_post(id, itemid)
{
    // This is not our item, Block it here and don't execute the blew code
    if (itemid != g_itemid)
        return
 
    has_baz[id] = true;
    CanShoot[id] = true;
}
 
public give_bazooka(id,level,cid)
{
    if (!cmd_access(id,level,cid,1)) {
        console_print(id,"You have no access to that command");
        return;
    }
    if (read_argc() > 2) {
        console_print(id,"Too many arguments supplied.");
        return;
    }
    new arg1[32];
    read_argv(1, arg1, sizeof(arg1) - 1);
    new player = cmd_target(id, arg1, 10);
    if ( !player ) {
        if ( arg1[0] == '@' ) {
            for ( new i = 1; i <= 32; i++ ) {
                if ( is_user_connected(i) && !has_baz[i] && !ze_is_user_zombie(i) ) {
                    has_baz[i] = true;
                    CanShoot[i] = true;
                    client_print(i, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay));
                }
            }
        } else {
            client_print(id, print_chat, "No Such Player/Team");
            return;
        }
    } else if ( !has_baz[player] && !ze_is_user_zombie(player) ) {
        has_baz[player] = true;
        CanShoot[player] = true;
        client_print(player, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay));
    }
}
 
public ze_user_infected(id, infector)
    if ( has_baz[id] )
        drop_rpg_temp(id);
 
public plugin_precache()
{
    precache_model(mrocket);   
 
    precache_model(mrpg_w);
    precache_model(mrpg_v);
    precache_model(mrpg_p);
 
    precache_sound(sfire);
    precache_sound(sfly);
    precache_sound(shit);
    precache_sound(spickup);
   
    rocketsmoke = precache_model("sprites/smoke.spr");
    explosion = precache_model("sprites/fexplo.spr");
    bazsmoke  = precache_model("sprites/steam1.spr");
    white = precache_model("sprites/white.spr");
}
 
public switch_to_knife(id)
{
    if ( !is_user_alive(id) ) return;
   
    if ( has_baz[id] && CanShoot[id] )
    {
        set_pev(id, pev_viewmodel2, mrpg_v);
        set_pev(id, pev_weaponmodel2, mrpg_p);
    }
}
 
public fw_prethink(id)
{
    static button;
    button = pev(id, pev_button);
    if ( button & IN_ATTACK )
        fire_call(id);
}
public fire_call(id)
{
    if ( !is_user_alive(id) || !has_baz[id] || !CanShoot[id] ) return;
   
    new weapon = get_user_weapon(id);
    if ( weapon == CSW_KNIFE ) fire_rocket(id);
}
 
fire_rocket(id) {
    if ( !CanShoot[id] ) return;
   
    CanShoot[id] = false;
    set_task(get_pcvar_float(pcvar_delay), "rpg_reload", id);
    engclient_cmd(id, "weapon_knife");  //attempt to force model to reset
 
    new Float:StartOrigin[3], Float:Angle[3];
    pev(id, pev_origin, StartOrigin);
    pev(id, pev_angles, Angle);
 
    new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    set_pev(ent, pev_classname, "rpgrocket");
    engfunc(EngFunc_SetModel, ent, mrocket);
    set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
    set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});
    engfunc(EngFunc_SetOrigin, ent, StartOrigin);
    set_pev(ent, pev_angles, Angle);
 
 
    set_pev(ent, pev_solid, 2);
    set_pev(ent, pev_movetype, 5);
    set_pev(ent, pev_owner, id);
 
    new Float:nVelocity[3];
    velocity_by_aim(id, 1500, nVelocity);
    set_pev(ent, pev_velocity, nVelocity);
 
    emit_sound(ent, CHAN_WEAPON, sfire, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    emit_sound(ent, CHAN_VOICE, sfly, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
 
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    write_byte(22);
    write_short(ent);
    write_short(rocketsmoke);
    write_byte(30);
    write_byte(3);
    write_byte(255);
    write_byte(255);
    write_byte(255);
    write_byte(255);
    message_end();
}
//---------------------------------------------------------------------------------------
public rpg_reload(id)
{
    CanShoot[id] = true;
    if ( get_user_weapon(id) == CSW_KNIFE ) switch_to_knife(id);    //sets our model
}
 
//---------------------------------------------------------------------------------------
public fw_touch(ent, touched)
{
    if ( !pev_valid(ent) ) return FMRES_IGNORED;
    static entclass[32];
    pev(ent, pev_classname, entclass, 31);
    if ( equali(entclass, "rpg_temp") )
    {
        static touchclass[32];
        pev(touched, pev_classname, touchclass, 31);
        if ( !equali(touchclass, "player") ) return FMRES_IGNORED;
       
        if( !is_user_alive(touched) || ze_is_user_zombie(touched) ) return FMRES_IGNORED;
           
        emit_sound(touched, CHAN_VOICE, spickup, 1.0, ATTN_NORM, 0, PITCH_NORM);
        has_baz[touched] = true;
       
        engfunc(EngFunc_RemoveEntity, ent);
   
        return FMRES_HANDLED;
    }
    else if ( equali(entclass, "rpgrocket") )
    {
        new Float:EndOrigin[3];
        pev(ent, pev_origin, EndOrigin);
        new NonFloatEndOrigin[3];
        NonFloatEndOrigin[0] = floatround(EndOrigin[0]);
        NonFloatEndOrigin[1] = floatround(EndOrigin[1]);
        NonFloatEndOrigin[2] = floatround(EndOrigin[2]);
   
        emit_sound(ent, CHAN_WEAPON, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
        emit_sound(ent, CHAN_VOICE, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
   
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
        write_byte(17);
        write_coord(NonFloatEndOrigin[0]);
        write_coord(NonFloatEndOrigin[1]);
        write_coord(NonFloatEndOrigin[2] + 128);
        write_short(explosion);
        write_byte(60);
        write_byte(255);
        message_end();
   
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
        write_byte(5);
        write_coord(NonFloatEndOrigin[0]);
        write_coord(NonFloatEndOrigin[1]);
        write_coord(NonFloatEndOrigin[2] + 256);
        write_short(bazsmoke);
        write_byte(125);
        write_byte(5);
        message_end();
   
        new maxdamage = get_pcvar_num(pcvar_maxdmg);
        new damageradius = get_pcvar_num(pcvar_radius);
   
        new PlayerPos[3], distance, damage;
        for (new i = 1; i <= 32; i++) {
            if ( is_user_alive(i))
                {  
                    new id = pev(ent, pev_owner)
                    if ((ze_is_user_zombie(id)))
                        continue;
                       
                    get_user_origin(i, PlayerPos);
       
                    distance = get_distance(PlayerPos, NonFloatEndOrigin);
                    if (distance <= damageradius) {
                    message_begin(MSG_ONE, gmsg_screenshake, {0,0,0}, i);
                    write_short(1<<14);
                    write_short(1<<14);
                    write_short(1<<14);
                    message_end();
       
                    damage = maxdamage - floatround(floatmul(float(maxdamage), floatdiv(float(distance), float(damageradius))));
                    new attacker = pev(ent, pev_owner);
       
                    baz_damage(i, attacker, damage, "bazooka");
                }
            }
        }
   
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
        write_byte(21);
        write_coord(NonFloatEndOrigin[0]);
        write_coord(NonFloatEndOrigin[1]);
        write_coord(NonFloatEndOrigin[2]);
        write_coord(NonFloatEndOrigin[0]);
        write_coord(NonFloatEndOrigin[1]);
        write_coord(NonFloatEndOrigin[2] + 320);
        write_short(white);
        write_byte(0);
        write_byte(0);
        write_byte(16);
        write_byte(128);
        write_byte(0);
        write_byte(255);
        write_byte(255);
        write_byte(192);
        write_byte(128);
        write_byte(0);
        message_end();
   
        engfunc(EngFunc_RemoveEntity, ent);
       
        return FMRES_HANDLED;
    }
    return FMRES_IGNORED;
}
//---------------------------------------------------------------------------------------
public drop_call(id)
{
    if ( has_baz[id] && get_user_weapon(id) == CSW_KNIFE )
    {
        drop_rpg_temp(id);
        return PLUGIN_HANDLED;  //attempt to block can't drop knife message
    }
    return PLUGIN_CONTINUE;
}
 
drop_rpg_temp(id) {
    new Float:fAim[3] , Float:fOrigin[3];
    velocity_by_aim(id , 64 , fAim);
    pev(id , pev_origin , fOrigin);
 
    fOrigin[0] += fAim[0];
    fOrigin[1] += fAim[1];
 
    new rpg = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
 
    set_pev(rpg, pev_classname, "rpg_temp");
    engfunc(EngFunc_SetModel, rpg, mrpg_w);
 
    set_pev(rpg, pev_mins, { -16.0, -16.0, -16.0 } );
    set_pev(rpg, pev_maxs, { 16.0, 16.0, 16.0 } );
 
    set_pev(rpg , pev_solid , 1);
    set_pev(rpg , pev_movetype , 6);
 
    engfunc(EngFunc_SetOrigin, rpg, fOrigin);
 
    has_baz[id] = false;
}
//---------------------------------------------------------------------------------------
baz_damage(id, attacker, damage, weaponDescription[])
{
    if ( pev(id, pev_takedamage) == DAMAGE_NO ) return;
    if ( damage <= 0 ) return;
 
    new userHealth = get_user_health(id);
    if (userHealth - damage <= 0 ) {
        dmgcount[attacker] += userHealth - damage;
        set_msg_block(gmsg_death, BLOCK_SET);
        ExecuteHamB(Ham_Killed, id, attacker, 2);
        set_msg_block(gmsg_death, BLOCK_NOT);
   
       
        message_begin(MSG_BROADCAST, gmsg_death);
        write_byte(attacker);
        write_byte(id);
        write_byte(0);
        write_string(weaponDescription);
        message_end();
       
        set_pev(attacker, pev_frags, float(get_user_frags(attacker) + 1));
           
        new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10];
   
        get_user_name(attacker, kname, 31);
        get_user_team(attacker, kteam, 9);
        get_user_authid(attacker, kauthid, 31);
     
        get_user_name(id, vname, 31);
        get_user_team(id, vteam, 9);
        get_user_authid(id, vauthid, 31);
           
        log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
        kname, get_user_userid(attacker), kauthid, kteam,
        vname, get_user_userid(id), vauthid, vteam, weaponDescription);
    }
    else {
        dmgcount[attacker] += damage;
        new origin[3];
        get_user_origin(id, origin);
       
        message_begin(MSG_ONE,gmsg_damage,{0,0,0},id);
        write_byte(21);
        write_byte(20);
        write_long(DMG_BLAST);
        write_coord(origin[0]);
        write_coord(origin[1]);
        write_coord(origin[2]);
        message_end();
       
        set_pev(id, pev_health, pev(id, pev_health) - float(damage));
    }
    if ( !get_pcvar_num(pcvar_award) ) return;
   
    new breaker = get_pcvar_num(pcvar_dmgforpacks);
    if ( dmgcount[attacker] > breaker )
    {
        new temp = dmgcount[attacker] / breaker
        if ( temp * breaker > dmgcount[attacker] ) return; //should never be possible
        dmgcount[attacker] -= temp * breaker;
        ze_set_escape_coins( attacker, ze_get_escape_coins(attacker) + temp );
    }
} 
Laser Minigun:

Code: Select all

include <ze_vip> 
#include <fakemeta_util> 

#define PLUGIN	"[ZE] CSO Laser Minigun" 
#define VERSION	"1.1"
#define AUTHOR	"Asep Khairul Anam" 

/**** Changelog 1.1 ****
-> Fixed Bug Laserminigun Charge Mode
-> Fixed Some Crash And Bug
-> Rewrite Code
-> Add To Mode Zombie Escape (Add Extra Items) 
*************************/


#define weapon_name		"weapon_m249"
#define weapon_new		"weapon_laserminigun"
#define VIP_ACCESS ADMIN_LEVEL_H

#define ANIM_IDLE		0
#define ANIM_SHOOT_1		7
#define ANIM_SHOOT_2		8
#define ANIM_RELOAD		5
#define ANIM_DRAW		6

#define IDLE_TIME		1.7
#define DRAW_TIME		2.53
#define RELOAD_TIME		5.23

#define WEAPON_KEY		38591238491
#define Is_CustomItem(%0)	(pev(%0,pev_impulse) == WEAPON_KEY)

#define MODEL_V			"models/zombie_escape/v_laserminigun.mdl"
#define MODEL_W			"models/zombie_escape/w_laserminigun.mdl"
#define MODEL_P			"models/zombie_escape/p_laserminiguna.mdl"
#define MODEL_P_CHARGE		"models/zombie_escape/p_laserminigunb.mdl"

/******* CONFIGURATION LASERMINIGUN ********/
#define RECOIL			0.4	
#define DAMAGE_LOW		0.8		
#define DAMAGE_HIGH		1.5	
#define DAMAGE_EXTREME		2.0				
#define WEAPON_SPEED		0.07
#define DAMAGE_BALL_1		330.0
#define DAMAGE_BALL_2		550.0
#define DAMAGE_BALL_3		770.0
#define EXPLODE_RADIUS		250.0
#define WEAPON_CLIP		125
#define WEAPON_BPAMMO		250
#define SHOOTS_FOR_HIGH		20
#define SHOOTS_FOR_EXTRREME	SHOOTS_FOR_HIGH + 20
/**** END OF CONFIGURATION LASERMINIGUN ****/

#define classname_ball	"laserminigun_ball"

#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))

#define MUZZLEFLASH_1	"sprites/muzzleflash37.spr"
#define MUZZLEFLASH_2	"sprites/muzzleflash38.spr"
#define MUZZLEFLASH_3	"sprites/muzzleflash39.spr"

#define SPRITE_BALL_1	"sprites/laserminigun_charge_1.spr"
#define SPRITE_BALL_2	"sprites/laserminigun_charge_2.spr"
#define SPRITE_BALL_3	"sprites/laserminigun_charge_3.spr"

new gMaxPlayers, Msg_WeaponList, g_AllocString_V, g_iItemID 
new g_ChargeState[512],g_ChargeShots[512], g_AllocString_P, g_AllocString_P_charge
new Float:g_VecEndTrace[3], g_ChargeBall[33], g_ChargeForEntity[33]
new g_ChargeBall1_Explosion, g_ChargeBall2_Explosion, g_ChargeBall3_Explosion

new g_Muzzleflash_Ent1,g_Muzzleflash1
new g_Muzzleflash_Ent2,g_Muzzleflash2
new g_Muzzleflash_Ent3,g_Muzzleflash3

new g_MuzzleflashBall_Ent1,g_MuzzleflashBall1
new g_MuzzleflashBall_Ent2,g_MuzzleflashBall2
new g_MuzzleflashBall_Ent3,g_MuzzleflashBall3

new const Weapon_Sounds[15][] = 
{
	"weapons/laserminigun-1.wav",			// 0
	"weapons/laserminigun-charge_start.wav",	// 1
	"weapons/laserminigun-charge_loop.wav",		// 2
	"weapons/laserminigun-charge_origin.wav",	// 3
	"weapons/laserminigun-charge_shoot.wav",	// 4
	"weapons/laserminigun_idle.wav",		// 5
	"weapons/laserminigun_draw.wav",		// 6
	"weapons/laserminigun_clipout2.wav",		// 7
	"weapons/laserminigun_clipout1.wav",		// 8
	"weapons/laserminigun_clipin2.wav",		// 9
	"weapons/laserminigun_clipin1.wav",		// 10
	"weapons/laserminigun_charge_end.wav",		// 11
	"weapons/laserminigun_exp1.wav",		// 12
	"weapons/laserminigun_exp2.wav",		// 13
	"weapons/laserminigun_exp3.wav"			// 14
}

enum
{
	STATE_LOW = 0,
	STATE_HIGH,
	STATE_EXTREME,
	STATE_CHARGE
}

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	RegisterHam(Ham_Item_Deploy,weapon_name,"HookHam_Weapon_Deploy",1)
	RegisterHam(Ham_Item_AddToPlayer,weapon_name,"HookHam_Weapon_Add",1)
	RegisterHam(Ham_Item_PostFrame,weapon_name,"HookHam_Weapon_Frame",0)
	g_iItemID = ze_register_item("Laser MiniGun \r(V.I.P)", 70, 0)  
	
	RegisterHam(Ham_Weapon_Reload,weapon_name,"HookHam_Weapon_Reload",0)
	RegisterHam(Ham_Weapon_WeaponIdle,weapon_name,"HookHam_Weapon_Idle",0)
	RegisterHam(Ham_Weapon_PrimaryAttack,weapon_name,"HookHam_Weapon_PrimaryAttack",0)
	RegisterHam(Ham_TakeDamage,"player","HookHam_TakeDamage")
	
	register_forward(FM_SetModel,"HookFm_SetModel")
	register_forward(FM_AddToFullPack,"fw_AddToFullPack_post",1)
	register_forward(FM_CheckVisibility,"fw_CheckVisibility")
	register_forward(FM_UpdateClientData,"HookFm_UpdateClientData",1)
	
	register_touch("*", classname_ball, "BallTouch")
	
	gMaxPlayers = get_maxplayers()
	Msg_WeaponList = get_user_msgid("WeaponList");
	
	register_clcmd(weapon_new,"hook_item")
}

public plugin_precache()
{
	engfunc(EngFunc_PrecacheModel, MODEL_W)
	engfunc(EngFunc_PrecacheModel, MODEL_V)
	engfunc(EngFunc_PrecacheModel, MODEL_P)
	engfunc(EngFunc_PrecacheModel, MODEL_P_CHARGE)
	
	engfunc(EngFunc_PrecacheModel, SPRITE_BALL_1)
	engfunc(EngFunc_PrecacheModel, SPRITE_BALL_2)
	engfunc(EngFunc_PrecacheModel, SPRITE_BALL_3)
	
	g_AllocString_V = engfunc(EngFunc_AllocString, MODEL_V)
	g_AllocString_P = engfunc(EngFunc_AllocString, MODEL_P)
	g_AllocString_P_charge = engfunc(EngFunc_AllocString, MODEL_P_CHARGE)
	
	for(new i = 0; i < sizeof(Weapon_Sounds); i++)
		engfunc(EngFunc_PrecacheSound,Weapon_Sounds[i])
	
	g_ChargeBall1_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_1.spr")
	g_ChargeBall2_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_2.spr")
	g_ChargeBall3_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_3.spr")
	
	
	g_Muzzleflash_Ent1 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	precache_model(MUZZLEFLASH_1)
	engfunc(EngFunc_SetModel,g_Muzzleflash_Ent1,MUZZLEFLASH_1)
	set_pev(g_Muzzleflash_Ent1,pev_scale,0.1)
	set_pev(g_Muzzleflash_Ent1,pev_rendermode,kRenderTransTexture)
	set_pev(g_Muzzleflash_Ent1,pev_renderamt,0.0)
	
	g_Muzzleflash_Ent2 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	precache_model(MUZZLEFLASH_2)
	engfunc(EngFunc_SetModel,g_Muzzleflash_Ent2,MUZZLEFLASH_2)
	set_pev(g_Muzzleflash_Ent2,pev_scale,0.1)
	set_pev(g_Muzzleflash_Ent2,pev_rendermode,kRenderTransTexture)
	set_pev(g_Muzzleflash_Ent2,pev_renderamt,0.0)
	
	g_Muzzleflash_Ent3 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	precache_model(MUZZLEFLASH_3)
	engfunc(EngFunc_SetModel,g_Muzzleflash_Ent3,MUZZLEFLASH_3)
	set_pev(g_Muzzleflash_Ent3,pev_scale,0.1)
	set_pev(g_Muzzleflash_Ent3,pev_rendermode,kRenderTransTexture)
	set_pev(g_Muzzleflash_Ent3,pev_renderamt,0.0)
	
	g_MuzzleflashBall_Ent1 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent1,SPRITE_BALL_1)
	set_pev(g_MuzzleflashBall_Ent1,pev_scale,0.1)
	set_pev(g_MuzzleflashBall_Ent1,pev_rendermode,kRenderTransTexture)
	set_pev(g_MuzzleflashBall_Ent1,pev_renderamt,0.0)
	set_pev(g_MuzzleflashBall_Ent1,pev_fuser1, 0.1)
	
	g_MuzzleflashBall_Ent2 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent2,SPRITE_BALL_2)
	set_pev(g_MuzzleflashBall_Ent2,pev_scale,0.2)
	set_pev(g_MuzzleflashBall_Ent2,pev_rendermode,kRenderTransTexture)
	set_pev(g_MuzzleflashBall_Ent2,pev_renderamt,0.0)
	set_pev(g_MuzzleflashBall_Ent2,pev_fuser1, 0.2)
	
	g_MuzzleflashBall_Ent3 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
	engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent3,SPRITE_BALL_3)
	set_pev(g_MuzzleflashBall_Ent3,pev_scale,0.25)
	set_pev(g_MuzzleflashBall_Ent3,pev_rendermode,kRenderTransTexture)
	set_pev(g_MuzzleflashBall_Ent3,pev_renderamt,0.0)
	set_pev(g_MuzzleflashBall_Ent3,pev_fuser1, 0.25)
	
	engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_1)
	engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_2)
	engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_3)
	
	engfunc(EngFunc_PrecacheGeneric,"sprites/640hud133.spr")
	engfunc(EngFunc_PrecacheGeneric,"sprites/640hud14.spr")
	engfunc(EngFunc_PrecacheGeneric,"sprites/weapon_laserminigun.txt")
	
	register_forward(FM_Spawn,"HookFm_Spawn",0)
}

public plugin_natives()
{
	register_native("give_laserminigun","get_item", 1)
}

public ze_user_infected(id) 
{
	remove_laserminigun(id)
}

public ze_user_humanized(id)
{ 
	remove_laserminigun(id)
}

public remove_laserminigun(id)
{
	g_ChargeBall[id] = 0
	g_ChargeForEntity[id] = 0
	
	UnSet_BitVar(g_MuzzleflashBall1,id)
	UnSet_BitVar(g_MuzzleflashBall2,id)
	UnSet_BitVar(g_MuzzleflashBall3,id)
}

public ze_select_item_pre(id, itemid)
{
    // This not our item?
    if (itemid != g_iItemID)
        return ZE_ITEM_AVAILABLE
   
    // Available for Humans only, So don't show it for zombies
    if (ze_is_user_zombie(id))
        return ZE_ITEM_DONT_SHOW
   
    // Player Not VIP?
    if (!(ze_get_vip_flags(id) & VIP_A))
        return ZE_ITEM_DONT_SHOW
   
    // Finally return that it's available
    return ZE_ITEM_AVAILABLE
} 
 
public ze_select_item_post(id, itemid)
{
    // This is not our item, Block it here and don't execute the blew code
    if (itemid != g_iItemID)
        return
   
    get_item(id) 
}


public client_command(id)
{
	new Command[32];read_argv(0,Command,charsmax(Command));  
	new ent = fm_find_ent_by_owner(-1,weapon_name,id)
	if(equali(Command,"weapon_",7) && g_ChargeBall[id] && Is_CustomItem(ent) || equali(Command,"lastinv") && g_ChargeBall[id] && Is_CustomItem(ent))
	{  
		client_print(id,print_center,"Saat Ini Senjata Tidak Bisa Di Ganti")
		return PLUGIN_HANDLED;
	}
	else if(equali(Command,"drop") && g_ChargeBall[id] && Is_CustomItem(ent))
	{
		client_print(id,print_center,"Saat Ini Senjata Tidak Bisa Di Drop")
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}

public get_item(id)
{	
	UTIL_DropWeapon(id,1)
	new weapon = make_weapon()
	
	if(weapon <= 0)
		return
	
	if(!ExecuteHamB(Ham_AddPlayerItem,id,weapon))
	{
		engfunc(EngFunc_RemoveEntity,weapon)
		return
	}
	
	ExecuteHam(Ham_Item_AttachToPlayer,weapon,id)
	
	new ammotype = 376 + get_pdata_int(weapon,49,4)
	new ammo = get_pdata_int(id,ammotype,5)
	
	if(ammo < WEAPON_BPAMMO)
		set_pdata_int(id, ammotype, WEAPON_BPAMMO, 5)
		
	set_pdata_int(weapon, 51, WEAPON_CLIP, 4)
	emit_sound(id,CHAN_ITEM,"items/gunpickup2.wav",VOL_NORM,ATTN_NORM,0,PITCH_NORM)
	
	g_ChargeState[weapon] = STATE_LOW
	g_ChargeShots[weapon] = 0
	g_ChargeBall[id] = 0
	g_ChargeForEntity[id] = 0
	
	UnSet_BitVar(g_MuzzleflashBall1,id)
	UnSet_BitVar(g_MuzzleflashBall2,id)
	UnSet_BitVar(g_MuzzleflashBall3,id)
}

public hook_item(id)
{
	engclient_cmd(id,weapon_name)
	return PLUGIN_HANDLED
}

public fw_AddToFullPack_post(esState,iE,ent,iHost,iHostFlags,iPlayer,pSet)
{
	if(ent == g_Muzzleflash_Ent1)
	{
		if(Get_BitVar(g_Muzzleflash1,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,2)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,255.0)
			UnSet_BitVar(g_Muzzleflash1,iHost)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	} 
	if(ent == g_Muzzleflash_Ent2)
	{
		if(Get_BitVar(g_Muzzleflash2,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,2)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,255.0)
			UnSet_BitVar(g_Muzzleflash2,iHost)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
	if(ent == g_Muzzleflash_Ent3)
	{
		if(Get_BitVar(g_Muzzleflash3,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,2)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,255.0)
			UnSet_BitVar(g_Muzzleflash3,iHost)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
	if(ent == g_MuzzleflashBall_Ent1)
	{
		if(Get_BitVar(g_MuzzleflashBall1,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,8)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,240.0)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
	if(ent == g_MuzzleflashBall_Ent2)
	{
		if(Get_BitVar(g_MuzzleflashBall2,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,8)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,240.0)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
	if(ent == g_MuzzleflashBall_Ent3)
	{
		if(Get_BitVar(g_MuzzleflashBall3,iHost))
		{
			set_es(esState,ES_Frame,float(random_num(0,8)))
			set_es(esState,ES_RenderMode,kRenderTransAdd)
			set_es(esState,ES_RenderAmt,240.0)
		}	
		set_es(esState,ES_Skin,iHost)
		set_es(esState,ES_Body,1)
		set_es(esState,ES_AimEnt,iHost)
		set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
	}
}

public fw_CheckVisibility(entity,pSet)
{
	if(entity == g_Muzzleflash_Ent1 || entity == g_Muzzleflash_Ent2 || entity == g_Muzzleflash_Ent3)
	{
		forward_return(FMV_CELL,1)
		return FMRES_SUPERCEDE
	} 
	else if(entity == g_MuzzleflashBall_Ent1 || entity == g_MuzzleflashBall_Ent2 || entity == g_MuzzleflashBall_Ent3)
	{
		forward_return(FMV_CELL,1)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public HookHam_Weapon_Deploy(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
		
	static id
	id = get_pdata_cbase(ent,41,4)

	set_pev_string(id,pev_viewmodel2, g_AllocString_V)
	set_pev_string(id,pev_weaponmodel2, g_AllocString_P)
	
	set_pdata_float(ent,46,DRAW_TIME,4)
	set_pdata_float(ent,47,DRAW_TIME,4)
	set_pdata_float(ent,48,DRAW_TIME,4)
	Play_WeaponAnim(id,ANIM_DRAW)
	set_pdata_string(id,1968,"m249",-1,20)
	Weaponlist(id, true)
	
	return HAM_IGNORED
}

public HookHam_Weapon_Add(ent,id)
{
	switch(pev(ent,pev_impulse))
	{
		case WEAPON_KEY: Weaponlist(id,true)
		case 0: Weaponlist(id,false)
	}
	return HAM_IGNORED
}

public MakeBall(id)
{
	new ent = create_entity("env_sprite"),Float:f_origin[3],Float:f_vec[3]
	set_pev(ent,pev_classname,classname_ball)
	pev(id,pev_origin,f_origin)
	velocity_by_aim(id,35,f_vec)
	
	for(new i=0;i<3;i++){ f_origin[i]+=f_vec[i];f_vec[i]*=40.0;}
	f_origin[2] += (pev(id,pev_flags)&FL_DUCKING)?2.0:10.0;
	
	set_pev(ent,pev_origin,f_origin)
	set_pev(ent,pev_velocity,f_vec)
	set_pev(ent,pev_solid,SOLID_BBOX)
	set_pev(ent,pev_movetype,MOVETYPE_FLY)
	
	if(g_ChargeForEntity[id] == 1)
	{
		set_pev(ent, pev_scale, 0.2)
		entity_set_model(ent,SPRITE_BALL_1)
	}
	else if(g_ChargeForEntity[id] == 2)
	{
		set_pev(ent, pev_scale, 0.25)
		entity_set_model(ent,SPRITE_BALL_1)
	}
	else if(g_ChargeForEntity[id] == 3)
	{
		set_pev(ent, pev_scale, 0.27)
		entity_set_model(ent,SPRITE_BALL_2)
	}
	else if(g_ChargeForEntity[id] == 4)
	{
		set_pev(ent, pev_scale, 0.32)
		entity_set_model(ent,SPRITE_BALL_3)
	}
	
	set_pev(ent,pev_mins,Float:{-4.0,-4.0,-4.0})
	set_pev(ent,pev_maxs,Float:{4.0,4.0,4.0})
	set_pev(ent,pev_owner,id)
	
	set_pev(ent,pev_rendermode,kRenderTransAdd)
	set_pev(ent,pev_renderamt,255.0)
	
	pev(id,pev_v_angle,f_vec)
	set_pev(ent,pev_v_angle,f_vec)
}

public BallTouch(id, ent)
{
	new Float:origin[3],Float:f_vec[3]
	pev(ent, pev_origin, origin)
	velocity_by_aim(ent,-15,f_vec)
	
	for(new i = 0; i < 3; i++)
		origin[i] += f_vec[i] 
	
	static classnameptd[32]
	pev(id, pev_classname, classnameptd, 31)
	if(equali(classnameptd, "func_breakable"))
		ExecuteHamB(Ham_TakeDamage, id, 0, 0, 100.0, DMG_GENERIC)
	
	BallSprites(ent, origin)
	BallDamage(ent)
}

public BallSprites(ent, Float:origin[3])
{
	static owner
	owner = pev(ent, pev_owner)
	
	if(g_ChargeForEntity[owner] == 1)
	{ 
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_SPRITE);
		write_coord(floatround(origin[0]))
		write_coord(floatround(origin[1]))
		write_coord(floatround(origin[2] + 40.0))
		write_short(g_ChargeBall1_Explosion)
		write_byte(30)
		write_byte(225)
		message_end()
		
		emit_sound(ent, CHAN_ITEM, Weapon_Sounds[13], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	else if(g_ChargeForEntity[owner] == 2)
	{ 
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
		write_byte(TE_SPRITE);
		write_coord(floatround(origin[0]))
		write_coord(floatround(origin[1]))
		write_coord(floatround(origin[2] + 40.0))
		write_short(g_ChargeBall1_Explosion)
		write_byte(30)
		write_byte(225)
		message_end()
		
		emit_sound(ent, CHAN_ITEM, Weapon_Sounds[12], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	else if(g_ChargeForEntity[owner] == 3)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
		write_byte(TE_SPRITE);
		write_coord(floatround(origin[0]))
		write_coord(floatround(origin[1]))
		write_coord(floatround(origin[2] + 40.0))
		write_short(g_ChargeBall2_Explosion)
		write_byte(30)
		write_byte(225)
		message_end()
		
		emit_sound(ent, CHAN_ITEM, Weapon_Sounds[13], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
	else if(g_ChargeForEntity[owner] == 4)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_SPRITE)
		write_coord(floatround(origin[0]))
		write_coord(floatround(origin[1]))
		write_coord(floatround(origin[2] + 40.0))
		write_short(g_ChargeBall3_Explosion)
		write_byte(30)
		write_byte(225)
		message_end()
		
		emit_sound(ent, CHAN_ITEM, Weapon_Sounds[14], 1.0, ATTN_NORM, 0, PITCH_NORM)
	}
}

public BallDamage(ent)
{
	static owner, attacker
	owner = pev(ent, pev_owner)
	
	if(!is_user_alive(owner) || ze_is_user_zombie(owner))
	{
		attacker = 0;
		return
	} 
	else attacker = owner
	
	for(new i = 0; i < gMaxPlayers; i++)
	{
		if(i == attacker)
			continue
		if(!is_user_alive(i))
			continue
		if(!ze_is_user_zombie(i))
			continue
		if(entity_range(i, ent) > EXPLODE_RADIUS)
			continue
		
		if(g_ChargeForEntity[attacker] == 1) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_1,DMG_BULLET)
		else if(g_ChargeForEntity[attacker] == 2) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_1,DMG_BULLET)
		else if(g_ChargeForEntity[attacker] == 3) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_2,DMG_BULLET)
		else if(g_ChargeForEntity[attacker] == 4) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_3,DMG_BULLET)
	}
	
	remove_entity(ent)
}

public HookHam_Weapon_Frame(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
	
	static id
	id = get_pdata_cbase(ent,41,4)
	
	if(get_pdata_int(ent,54,4))
	{
		if(get_pdata_float(ent,46,4) >= 0.0)
			return HAM_IGNORED
		
		static clip,ammotype,ammo,j
		clip = get_pdata_int(ent,51,4)
		ammotype = 376 + get_pdata_int(ent,49,4)
		ammo = get_pdata_int(id,ammotype,5)
		j = min(WEAPON_CLIP-clip,ammo)
		set_pdata_int(ent, 51, clip+j, 4)
		set_pdata_int(id, ammotype, ammo-j, 5)
		set_pdata_int(ent, 54, 0, 4)
	}
	
	if(g_ChargeShots[ent] < SHOOTS_FOR_HIGH) g_ChargeState[ent] = STATE_LOW
	else if(g_ChargeShots[ent] >= SHOOTS_FOR_HIGH && g_ChargeShots[ent] < SHOOTS_FOR_EXTRREME) g_ChargeState[ent] = STATE_HIGH
	else if(g_ChargeShots[ent] >= SHOOTS_FOR_EXTRREME) g_ChargeState[ent] = STATE_EXTREME
	if(g_ChargeBall[id]) g_ChargeState[ent] = STATE_CHARGE
	if(g_ChargeShots[ent] > 0 && !(pev(id,pev_button) & IN_ATTACK) &&!g_ChargeBall[id])
		g_ChargeShots[ent]--
	
	static iButton;iButton = pev(id,pev_button)
	g_ChargeBall[id] = pev(ent, pev_iuser1)
	
	new Float:fFinshTime, Float:ScaleNew, Float:ScaleDelay[33]
	pev(ent,pev_fuser1,fFinshTime)
	
	static ammo
	ammo = get_pdata_int(ent,51,4)
	
	if(iButton & IN_ATTACK2)
	{
		if(get_pdata_float(ent, 46, 4) >= 0.0)
			return HAM_IGNORED
		if(ammo == 0)
			return HAM_IGNORED
			
		g_ChargeState[ent] = STATE_CHARGE
		set_pev_string(id,pev_weaponmodel2,g_AllocString_P_charge)
		
		if(!g_ChargeBall[id])
		{
			g_ChargeBall[id] = 1
			fFinshTime = get_gametime()+1.0
			
			Play_WeaponAnim(id, 1)
			emit_sound(ent, CHAN_ITEM, Weapon_Sounds[3], 1.0, ATTN_NORM, 0, PITCH_NORM)
			
			set_pdata_float(ent, 48, 1.0, 4)
			set_pdata_float(ent, 46, 1.0, 4)
			set_pev(ent,pev_iuser1,g_ChargeBall[id])
			
			if(get_gametime() - 0.01 > ScaleDelay[id])
			{
				pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleNew += 0.01
				set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleDelay[id] = get_gametime()
			}
			
			set_pev(ent, pev_fuser1, fFinshTime)
			
			Set_BitVar(g_MuzzleflashBall1,id)
			UnSet_BitVar(g_MuzzleflashBall2,id)
			UnSet_BitVar(g_MuzzleflashBall3,id)
		}
		else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 1)
		{
			g_ChargeBall[id] = 2;
			fFinshTime = get_gametime()+3.0
			
			Play_WeaponAnim(id,2)
			emit_sound(ent, CHAN_ITEM, Weapon_Sounds[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
			
			set_pdata_float(ent, 48, 1.25, 4)
			set_pdata_float(ent, 46, 1.25, 4)
			set_pev(ent,pev_iuser1,g_ChargeBall[id])
			
			if(get_gametime() - 0.01 > ScaleDelay[id])
			{
				pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleNew += 0.02
				set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleDelay[id] = get_gametime()
			}
			
			Set_BitVar(g_MuzzleflashBall1,id)
			UnSet_BitVar(g_MuzzleflashBall2,id)
			UnSet_BitVar(g_MuzzleflashBall3,id)
		}
		else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 2)
		{
			g_ChargeBall[id] = 3
			fFinshTime = get_gametime()+3.0
			
			set_pdata_float(ent, 48, 1.5, 4)
			set_pdata_float(ent, 46, 1.5, 4)
			set_pev(ent,pev_iuser1,g_ChargeBall[id])
			
			if(get_gametime() - 0.01 > ScaleDelay[id])
			{
				pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleNew += 0.05
				set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleDelay[id] = get_gametime()
			}
			
			UnSet_BitVar(g_MuzzleflashBall1,id)
			Set_BitVar(g_MuzzleflashBall2,id)
			UnSet_BitVar(g_MuzzleflashBall3,id)

		}
		else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 3)
		{
			g_ChargeBall[id] = 4
			fFinshTime = get_gametime() + 200.0
			
			Play_WeaponAnim(id, 3)
			emit_sound(ent, CHAN_ITEM, Weapon_Sounds[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
			
			set_pdata_float(ent, 48, 250.0, 4)
			set_pdata_float(ent, 46, 250.0, 4)
			set_pev(ent,pev_iuser1,g_ChargeBall[id])
			
			if(get_gametime() - 0.01 > ScaleDelay[id])
			{
				pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleNew += 0.08
				set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
				ScaleDelay[id] = get_gametime()
			}
			
			set_pev(ent, pev_fuser1, fFinshTime)
			UnSet_BitVar(g_MuzzleflashBall1,id)
			UnSet_BitVar(g_MuzzleflashBall2,id)
			Set_BitVar(g_MuzzleflashBall3,id)
		}
		
		iButton &= ~IN_ATTACK2;
		set_pev(id,pev_button,iButton)
	}
	else
	{
		switch(g_ChargeBall[id])
		{	
			case 1:
			{
				Play_WeaponAnim(id,4)
				emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				set_pdata_float(ent,48,1.63,4)
				set_pdata_float(ent,46,1.0,4)
				
				UnSet_BitVar(g_MuzzleflashBall1,id)
				UnSet_BitVar(g_MuzzleflashBall2,id)
				UnSet_BitVar(g_MuzzleflashBall3,id)
				
				g_ChargeState[ent] = STATE_LOW
				g_ChargeShots[ent] = 0
				g_ChargeForEntity[id] = g_ChargeBall[id]
				
				set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
				MakeBall(id)
				
				if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
				else set_pdata_int(ent,51, 0, 4)
			}
			case 2:
			{
				Play_WeaponAnim(id,4);
				emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				set_pdata_float(ent,48,1.63,4)
				set_pdata_float(ent,46,1.0,4)
				
				UnSet_BitVar(g_MuzzleflashBall1,id)
				UnSet_BitVar(g_MuzzleflashBall2,id)
				UnSet_BitVar(g_MuzzleflashBall3,id)
				
				g_ChargeState[ent] = STATE_LOW
				g_ChargeShots[ent] = 0
				g_ChargeForEntity[id] = g_ChargeBall[id]
				
				set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
				MakeBall(id)
				
				if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
				else set_pdata_int(ent,51, 0, 4)
			}
			case 3:
			{
				Play_WeaponAnim(id,4)
				emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				set_pdata_float(ent,48,1.63,4)
				set_pdata_float(ent,46,1.0,4)
				
				UnSet_BitVar(g_MuzzleflashBall1,id)
				UnSet_BitVar(g_MuzzleflashBall2,id)
				UnSet_BitVar(g_MuzzleflashBall3,id)
				
				g_ChargeState[ent] = STATE_LOW
				g_ChargeShots[ent] = 0
				g_ChargeForEntity[id] = g_ChargeBall[id]
				
				set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
				MakeBall(id)
				
				if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
				else set_pdata_int(ent,51, 0, 4)
			}
			case 4:
			{
				Play_WeaponAnim(id,4)
				emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
				
				set_pdata_float(ent,48,1.63,4)
				set_pdata_float(ent,46,1.0,4)
				
				UnSet_BitVar(g_MuzzleflashBall1,id)
				UnSet_BitVar(g_MuzzleflashBall2,id)
				UnSet_BitVar(g_MuzzleflashBall3,id)
				
				g_ChargeState[ent] = STATE_LOW
				g_ChargeShots[ent] = 0
				g_ChargeForEntity[id] = g_ChargeBall[id]
				
				set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
				MakeBall(id)
					
				if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
				else set_pdata_int(ent,51, 0, 4)
			}
		}
		
		g_ChargeBall[id] = 0
		
		new Float:ResetScale[3]
		pev(g_MuzzleflashBall_Ent1, pev_fuser1, ResetScale[0])
		set_pev(g_MuzzleflashBall_Ent1, pev_scale, ResetScale[0])
		pev(g_MuzzleflashBall_Ent2, pev_fuser1, ResetScale[1])
		set_pev(g_MuzzleflashBall_Ent2, pev_scale, ResetScale[1])
		pev(g_MuzzleflashBall_Ent3, pev_fuser1, ResetScale[2])
		set_pev(g_MuzzleflashBall_Ent3, pev_scale, ResetScale[2])
		
		set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
		set_pev(ent,pev_iuser1,g_ChargeBall[id])
	}
	
	return HAM_IGNORED
}

public HookHam_Weapon_Reload(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
	
	static clip
	clip = get_pdata_int(ent,51,4)
	
	if(clip >= WEAPON_CLIP)
		return HAM_SUPERCEDE
	
	static id
	id = get_pdata_cbase(ent,41,4)
	
	if(get_pdata_int(id, 376 + get_pdata_int(ent,49,4), 5) <= 0)
		return HAM_SUPERCEDE
	
	set_pdata_int(ent, 51, 0,4)
	ExecuteHam(Ham_Weapon_Reload, ent)
	set_pdata_int(ent,51, clip, 4)
	set_pdata_int(ent,54, 1,4)
	set_pdata_float(ent, 46,RELOAD_TIME,4)
	set_pdata_float(ent, 47,RELOAD_TIME,4)
	set_pdata_float(ent, 48,RELOAD_TIME,4)
	set_pdata_float(id, 83, RELOAD_TIME,5)
	Play_WeaponAnim(id, ANIM_RELOAD)
	return HAM_SUPERCEDE;
}

public HookHam_Weapon_Idle(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
		
	if(get_pdata_float(ent, 48, 4) > 0.0)
		return HAM_IGNORED
		
	set_pdata_float(ent,48,IDLE_TIME,4)
	Play_WeaponAnim(get_pdata_cbase(ent, 41, 4), ANIM_IDLE)
	
	return HAM_SUPERCEDE
}

public HookHam_Weapon_PrimaryAttack(ent)
{
	if(!Is_CustomItem(ent))
		return HAM_IGNORED
		
	static ammo
	ammo = get_pdata_int(ent,51,4)
	
	if(ammo <= 0)
	{
		ExecuteHam(Ham_Weapon_PlayEmptySound,ent);
		set_pdata_float(ent,46,WEAPON_SPEED,4)
		return HAM_SUPERCEDE
	}
		
	static id; id = get_pdata_cbase(ent,41,4)
	static Float:user_punchangle[3];pev(id,pev_punchangle,user_punchangle)
	static fm_hooktrace;fm_hooktrace=register_forward(FM_TraceLine,"HookFm_TraceLine",true)
	static fm_playbackevent;fm_playbackevent=register_forward(FM_PlaybackEvent,"HookFm_PlayBackEvent",false)
	
	state FireBullets: Enabled;
	ExecuteHam(Ham_Weapon_PrimaryAttack,ent)
	state FireBullets: Disabled;
	
	unregister_forward(FM_TraceLine,fm_hooktrace,true)
	unregister_forward(FM_PlaybackEvent,fm_playbackevent,false)
	
	Play_WeaponAnim(id,random_num(ANIM_SHOOT_1,ANIM_SHOOT_2))
	set_pdata_int(ent,51,ammo-1,4)
	set_pdata_float(ent,48,2.0,4)
	static Float:user_newpunch[3];pev(id,pev_punchangle,user_newpunch)
	
	user_newpunch[0]=user_punchangle[0]+(user_newpunch[0]-user_punchangle[0])*RECOIL
	user_newpunch[1]=user_punchangle[1]+(user_newpunch[1]-user_punchangle[1])*RECOIL
	user_newpunch[2]=user_punchangle[2]+(user_newpunch[2]-user_punchangle[2])*RECOIL
	set_pev(id,pev_punchangle,user_newpunch)

	emit_sound(ent, CHAN_ITEM, Weapon_Sounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
	set_pdata_float(ent,46,WEAPON_SPEED,4)
	
	new Float:Origin[3]
	get_weapon_position(id,Origin,.add_forward=10.0,.add_right=7.0,.add_up=-10.5)
		
	new Float:Velo[3]
	Velo[0]=g_VecEndTrace[0]-Origin[0]
	Velo[1]=g_VecEndTrace[1]-Origin[1]
	Velo[2]=g_VecEndTrace[2]-Origin[2]
		
	vec_normalize(Velo,Velo)
	vec_mul_scalar(Velo,4096.0,Velo)
	
	if(g_ChargeState[ent] == STATE_LOW)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_USERTRACER)
		engfunc(EngFunc_WriteCoord,Origin[0])
		engfunc(EngFunc_WriteCoord,Origin[1])
		engfunc(EngFunc_WriteCoord,Origin[2])
		engfunc(EngFunc_WriteCoord,Velo[0])
		engfunc(EngFunc_WriteCoord,Velo[1])
		engfunc(EngFunc_WriteCoord,Velo[2])
		write_byte(20)
		write_byte(4)
		write_byte(5)
		message_end()
		
		Set_BitVar(g_Muzzleflash1,id)
	}
	else if(g_ChargeState[ent] == STATE_HIGH)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_USERTRACER)
		engfunc(EngFunc_WriteCoord,Origin[0])
		engfunc(EngFunc_WriteCoord,Origin[1])
		engfunc(EngFunc_WriteCoord,Origin[2])
		engfunc(EngFunc_WriteCoord,Velo[0])
		engfunc(EngFunc_WriteCoord,Velo[1])
		engfunc(EngFunc_WriteCoord,Velo[2])
		write_byte(20)
		write_byte(5)
		write_byte(5)
		message_end()
		
		Set_BitVar(g_Muzzleflash2,id)
	}
	else if(g_ChargeState[ent] == STATE_EXTREME)
	{
		message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
		write_byte(TE_USERTRACER)
		engfunc(EngFunc_WriteCoord,Origin[0])
		engfunc(EngFunc_WriteCoord,Origin[1])
		engfunc(EngFunc_WriteCoord,Origin[2])
		engfunc(EngFunc_WriteCoord,Velo[0])
		engfunc(EngFunc_WriteCoord,Velo[1])
		engfunc(EngFunc_WriteCoord,Velo[2])
		write_byte(20)
		write_byte(1)
		write_byte(5)
		message_end()
		
		Set_BitVar(g_Muzzleflash3,id)
	}
	g_ChargeShots[ent]++
	
	return HAM_SUPERCEDE
}

public HookHam_TakeDamage(victim,inflictor,attacker,Float:damage)<FireBullets: Enabled>
{ 
	new ent = fm_find_ent_by_owner(-1,weapon_name,attacker)
	
	if(g_ChargeState[ent] == STATE_LOW)
		SetHamParamFloat(4,damage*DAMAGE_LOW)
	else if(g_ChargeState[ent] == STATE_HIGH)
		SetHamParamFloat(4,damage*DAMAGE_HIGH)
	else if(g_ChargeState[ent] == STATE_EXTREME)
		SetHamParamFloat(4,damage*DAMAGE_EXTREME)
		
	return HAM_OVERRIDE;
}

public HookHam_TakeDamage()<FireBullets: Disabled>
{ 
	return HAM_IGNORED;
}

public HookHam_TakeDamage()<>
{
	return HAM_IGNORED;
}

public HookFm_SetModel(ent)
{ 
	static i,classname[32],item;pev(ent,pev_classname,classname,31);
	if(!equal(classname,"weaponbox"))
		return FMRES_IGNORED
		
	for(i=0; i < 6; i++)
	{
		item = get_pdata_cbase(ent,34+i,4)
		
		static id
		id = pev(ent,pev_owner)
		
		if(item > 0 && Is_CustomItem(item))
		{
			engfunc(EngFunc_SetModel,ent,MODEL_W)
			g_ChargeState[ent] = STATE_LOW
			g_ChargeShots[ent] = 0
			UnSet_BitVar(g_MuzzleflashBall1,id)
			UnSet_BitVar(g_MuzzleflashBall2,id)
			UnSet_BitVar(g_MuzzleflashBall3,id)
			g_ChargeBall[id] = 0
			
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED;
}

public HookFm_PlayBackEvent()
{ 
	return FMRES_SUPERCEDE
}

public HookFm_TraceLine(Float:tr_start[3],Float:tr_end[3],tr_flag,tr_ignore,tr)
{
	if(tr_flag&IGNORE_MONSTERS)
		return FMRES_IGNORED
		
	static hit
	hit=get_tr2(tr,TR_pHit)
	
	static Decal, glassdecal
	
	if(!glassdecal)
		glassdecal = engfunc(EngFunc_DecalIndex,"{bproof1")
	
	hit = get_tr2(tr,TR_pHit)
	if(hit > 0 && pev_valid(hit))
	{
		if(pev(hit,pev_solid) != SOLID_BSP)
			return FMRES_IGNORED
			
		else if(pev(hit,pev_rendermode) != 0) Decal=glassdecal
		else Decal = random_num(41,45)
	}
	else Decal = random_num(41,45)

	static Float:vecEnd[3]
	get_tr2(tr,TR_vecEndPos,vecEnd)
	g_VecEndTrace = vecEnd
	
	engfunc(EngFunc_MessageBegin,MSG_PAS,SVC_TEMPENTITY,vecEnd,0)
	write_byte(TE_GUNSHOTDECAL)
	engfunc(EngFunc_WriteCoord,vecEnd[0])
	engfunc(EngFunc_WriteCoord,vecEnd[1])
	engfunc(EngFunc_WriteCoord,vecEnd[2])
	write_short(hit>0?hit:0)
	write_byte(Decal)
	message_end()
	
	static Float:WallVector[3];get_tr2(tr,TR_vecPlaneNormal,WallVector)
	engfunc(EngFunc_MessageBegin,MSG_PVS,SVC_TEMPENTITY,vecEnd,0);
	write_byte(TE_STREAK_SPLASH)
	engfunc(EngFunc_WriteCoord,vecEnd[0]);
	engfunc(EngFunc_WriteCoord,vecEnd[1]);
	engfunc(EngFunc_WriteCoord,vecEnd[2]);
	engfunc(EngFunc_WriteCoord,WallVector[0]*random_float(25.0,30.0));
	engfunc(EngFunc_WriteCoord,WallVector[1]*random_float(25.0,30.0));
	engfunc(EngFunc_WriteCoord,WallVector[2]*random_float(25.0,30.0));
	write_byte(111)
	write_short(12)
	write_short(3)
	write_short(75)	
	message_end()
	
	return FMRES_IGNORED
}

public HookFm_UpdateClientData(id,SendWeapons,CD_Handle)
{
	static item
	item = get_pdata_cbase(id,373,5)
	if(item <= 0 || !Is_CustomItem(item))
		return FMRES_IGNORED
		
	set_cd(CD_Handle,CD_flNextAttack,99999.0)
	return FMRES_HANDLED
}

public HookFm_Spawn(id)
{
	if(pev_valid(id) != 2)
		return FMRES_IGNORED
		
	static ClName[32]
	pev(id,pev_classname,ClName,31)
	
	if(strlen(ClName) < 5)
		return FMRES_IGNORED
		
	static Trie:ClBuffer
	if(!ClBuffer) ClBuffer = TrieCreate()
	if(!TrieKeyExists(ClBuffer,ClName))
	{
		TrieSetCell(ClBuffer, ClName, 1)
		RegisterHamFromEntity(Ham_TakeDamage, id, "HookHam_TakeDamage", 0)
	}
	return FMRES_IGNORED
}

stock make_weapon()
{
	static ent, g_AllocString_E
	if(g_AllocString_E || (g_AllocString_E = engfunc(EngFunc_AllocString,weapon_name)))
		ent = engfunc(EngFunc_CreateNamedEntity,g_AllocString_E)
	else
		return 0
	if(ent <= 0)
		return 0
		
	set_pev(ent,pev_spawnflags,SF_NORESPAWN)
	set_pev(ent,pev_impulse,WEAPON_KEY)
	ExecuteHam(Ham_Spawn,ent)
	
	return ent
}

stock UTIL_DropWeapon(id,slot)
{
	static iEntity
	iEntity = get_pdata_cbase(id,(367 + slot),5)
	
	if(iEntity > 0)
	{
		static iNext,szWeaponName[32]
		
		do
		{
			iNext = get_pdata_cbase(iEntity,42,4);
			if(get_weaponname(get_pdata_int(iEntity, 43, 4), szWeaponName, 31))
				engclient_cmd(id,"drop",szWeaponName)
		} 
		while((iEntity=iNext)>0)
	}
}

stock Play_WeaponAnim(id,anim)
{
	set_pev(id,pev_weaponanim,anim)
	message_begin(MSG_ONE_UNRELIABLE,SVC_WEAPONANIM,_,id)
	write_byte(anim)
	write_byte(0)
	message_end()
}

stock Weaponlist(id,bool:set)
{
	if(!is_user_connected(id))
		return
		
	message_begin(MSG_ONE,Msg_WeaponList,_,id);
	write_string(set == false ? weapon_name:weapon_new);
	write_byte(3);
	write_byte(WEAPON_BPAMMO);
	write_byte(-1);
	write_byte(-1);
	write_byte(0);
	write_byte(4);
	write_byte(20);
	write_byte(0);
	message_end();
}

stock get_weapon_position(id,Float:fOrigin[3],Float:add_forward=0.0,Float:add_right=0.0,Float:add_up=0.0)
{
	static Float:Angles[3],Float:ViewOfs[3],Float:vAngles[3]
	static Float:Forward[3],Float:Right[3],Float:Up[3]
	pev(id,pev_v_angle,vAngles)
	pev(id,pev_origin,fOrigin)
	pev(id,pev_view_ofs,ViewOfs)
	vec_add(fOrigin,ViewOfs,fOrigin)
	pev(id,pev_v_angle,Angles)
	engfunc(EngFunc_MakeVectors,Angles)
	global_get(glb_v_forward,Forward)
	global_get(glb_v_right,Right)
	global_get(glb_v_up,Up)
	vec_mul_scalar(Forward,add_forward,Forward)
	vec_mul_scalar(Right,add_right,Right)
	vec_mul_scalar(Up,add_up,Up)
	fOrigin[0]=fOrigin[0]+Forward[0]+Right[0]+Up[0]
	fOrigin[1]=fOrigin[1]+Forward[1]+Right[1]+Up[1]
	fOrigin[2]=fOrigin[2]+Forward[2]+Right[2]+Up[2]
}

vec_add(const Float:in1[],const Float:in2[],Float:out[])
{
	out[0]=in1[0]+in2[0];
	out[1]=in1[1]+in2[1];
	out[2]=in1[2]+in2[2];
}

vec_mul_scalar(const Float:vec[],Float:scalar,Float:out[])
{
	out[0]=vec[0]*scalar;
	out[1]=vec[1]*scalar;
	out[2]=vec[2]*scalar;
}

vec_normalize(const Float:vec[],Float:out[])
{
	new Float:invlen=rsqrt(vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2]);
	out[0]=vec[0]*invlen;
	out[1]=vec[1]*invlen;
	out[2]=vec[2]*invlen;
}

Float:rsqrt(Float:x)
{
	new Float:xhalf=x*0.5;
	
	new i=_:x;
	i=0x5f375a84 - (i>>1);
	x=Float:i;
			
	x=x*(1.5-xhalf*x*x);
	x=x*(1.5-xhalf*x*x);
	x=x*(1.5-xhalf*x*x);
		
	return x;
}
Auto Minigun:

Code: Select all

#include <zombie_escape>
#include <fakemeta_util>
#include <xs>

#define PLUGIN "[MW2] Auto Minigun"
#define VERSION "1.0"
#define AUTHOR "Dias"

new g_player_main[33], g_remoting[33], g_player_main2[33], g_firing[33], 
g_preparing[33], g_ending[33], g_reloading[500]
new Float:g_last_firesound[33]
new const base_model[] = "models/mw2_auto/base.mdl"
new const main_model[] = "models/mw2_auto/main.mdl"
new const muzzleflash_spr[] = "sprites/muzzleflash3_auto.spr"
new muzzleflash_spr_id, Float:g_last_shoot[33]
new g_blood, g_bloodspray, g_dead[500], g_exp_id, g_owner[500], Float:g_check_heat[33]

new const minigun_sound[3][] = {
	"mw2_auto/minigun-starting.wav",
	"mw2_auto/minigun-shooting.wav",
	"mw2_auto/minigun-stoping.wav"
}

new g_minigun, g_had_minigun[33], g_reg, g_heat[500], g_sync_hud1
new cvar_minigun_health, cvar_minigun_dmgrand_start, cvar_minigun_dmgrand_end,
cvar_delay_attack, cvar_reload_time


// Weapon entity names
new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
			"weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
			"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
			"weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
			"weapon_ak47", "weapon_knife", "weapon_p90" }

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_event("HLTV", "event_newround", "a", "1=0", "2=0")
	register_event("DeathMsg", "event_death", "a")
	
	register_think("mw2_mingun_main", "fw_main_think")
	register_forward(FM_CmdStart, "fw_CmdStart")
	for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
		if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)	
	
	g_minigun = ze_register_item("[MW2] Auto-Minigun (Remote)", 35, 0)
	g_sync_hud1 = CreateHudSyncObj(645)
	
	// Cvars
	cvar_minigun_health = register_cvar("zp_minigun_health", "500")
	cvar_minigun_dmgrand_start = register_cvar("zp_minigun_dmgrand_start", "10")
	cvar_minigun_dmgrand_end = register_cvar("zp_minigun_dmgrand_end", "30")
	cvar_delay_attack = register_cvar("zp_minigun_delay_attack", "0.1")
	cvar_reload_time = register_cvar("zp_minigun_reload_time", "30.0")
	
	//register_clcmd("say /make", "create_minigun")
	//register_clcmd("say /remote", "remote_minigun")
}

public plugin_precache()
{
	precache_model(base_model)
	precache_model(main_model)
	
	for(new i = 0; i < sizeof(minigun_sound); i++)
		engfunc(EngFunc_PrecacheSound, minigun_sound[i])
	
	muzzleflash_spr_id = precache_model(muzzleflash_spr)
	g_blood = precache_model("sprites/blood.spr")
	g_bloodspray = precache_model("sprites/bloodspray.spr")		
	g_exp_id = precache_model("sprites/zerogxplode.spr")
}

public event_newround()
{
	remove_entity_name("mw2_mingun_base")
	remove_entity_name("mw2_mingun_main")
	remove_entity_name("mw2_mingun_view")
	
	for(new i = 0; i < get_maxplayers(); i++)
	{
		if(is_user_alive(i) && is_user_connected(i))
		{
			reset_minigun(i)
		}
	}
}

public event_death()
{
	static victim
	victim = read_data(2)
	
	reset_minigun(victim)
}

public reset_minigun(id)
{
	attach_view(id, id)
	
	g_had_minigun[id] = 0
	g_player_main[id] = 0
	g_player_main2[id] = 0
	g_remoting[id] = 0
	g_preparing[id] = 0
	g_firing[id] = 0
	g_ending[id] = 0
	
	remove_task(id+2479)

	message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id)
	write_short(0)
	message_end()	
}

public ze_select_item_pre(id, itemid)
{
    // Return Available and we will block it in Post, So it dosen't affect other plugins
    if (itemid != g_minigun)
        return ZE_ITEM_AVAILABLE
   
    // Available for Humans only, So don't show it for zombies
    if (ze_is_user_zombie(id))
        return ZE_ITEM_DONT_SHOW
   
    return ZE_ITEM_AVAILABLE
}

public ze_select_item_post(id, itemid)
{
    if (itemid != g_minigun)
        return
   
    g_had_minigun[id] = 1
    create_minigun(id)
    client_printcolor(id, "!g[ZE]!y Hold !t(E)!y for 3 seconds to put MW2 Auto-Minigun !!!")
}

public create_minigun(id)
{
	if(!g_had_minigun[id])
		return
	
	g_had_minigun[id] = 0
	
	new Float:Origin[3], Float:Angles[3]
	
	get_position(id, 40.0, 0.0, 0.0, Origin)
	pev(id, pev_angles, Angles)
	
	// Make the Base
	new ent = create_entity("info_target")
	entity_set_origin(ent, Origin);
	
	Angles[0] = 0.0
	entity_set_vector(ent, EV_VEC_angles, Angles)

	entity_set_string(ent,EV_SZ_classname, "mw2_mingun_base")
	entity_set_model(ent, base_model);
	entity_set_int(ent,EV_INT_solid, SOLID_NOT)
	
	entity_set_float(ent,EV_FL_takedamage,1.0)
	entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0)

	new Float:maxs[3] = {10.0,10.0,1.0}
	new Float:mins[3] = {-10.0,-10.0,-1.0}
	entity_set_size(ent,mins,maxs)
	
	set_entity_anim(ent, 0)
	g_dead[ent] = 0
	g_owner[ent] = id
	
	entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)
	
	drop_to_floor(ent)
	
	// Create Main
	ent = create_entity("info_target")
	
	Origin[2] -= 35.0
	entity_set_origin(ent, Origin);
	entity_set_vector(ent, EV_VEC_angles, Angles)
	
	entity_set_string(ent,EV_SZ_classname, "mw2_mingun_main")
	entity_set_model(ent, main_model);
	entity_set_int(ent,EV_INT_solid, SOLID_BBOX)
	
	entity_set_float(ent,EV_FL_takedamage,1.0)
	entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0)	

	new Float:maxs2[3] = {10.0,10.0,20.0}
	new Float:mins2[3] = {-10.0,-10.0,-20.0}
	entity_set_size(ent,mins2,maxs2)	
	
	set_entity_anim(ent, 0)
	g_heat[ent] = 0
	
	entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)	
	g_player_main[id] = ent
	g_dead[ent] = 0
	g_owner[ent] = id
	g_reloading[ent] = 0
	
	drop_to_floor(ent)
	if(!g_reg)
	{
		g_reg = 1
		RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_main_takedamage")
	}
	
	// Create View Ent
	ent = create_entity("info_target")
	
	get_position(id, 40.0, 0.0, 10.0, Origin)
	
	entity_set_origin(ent, Origin);
	entity_set_vector(ent, EV_VEC_angles, Angles)
	
	entity_set_string(ent,EV_SZ_classname, "mw2_mingun_view")
	entity_set_model(ent, main_model);
	
	fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
	
	g_player_main2[id] = ent
}

public ze_user_infected(id)
{
	reset_minigun(id)
}

public do_remote(id)
{
	id -= 2479
	
	remote_minigun(id)
}

public remote_minigun(id)
{
	if(!g_player_main[id])
		return
		
	attach_view(id, g_player_main2[id])
	engclient_cmd(id, "weapon_knife")
	
	set_task(1.0, "task_delay", id)
	
	client_printcolor(id, "!g[ZE]!y Press !t(E)!y to turn of the MW2-Auto Minigun !!!")
}

public task_delay(id)
{
	g_remoting[id] = 1
}

public client_PostThink(id)
{
	if(!g_remoting[id])
		return
	if(!g_player_main[id])
		return	
	if(!pev_valid(g_player_main[id]))
	{
		reset_minigun(id)
		return
	}
	
	if(!g_firing[id] && !g_reloading[g_player_main[id]])
	{
		if(g_heat[g_player_main[id]] > 0)
		{
			static Float:CurTime
			CurTime = get_gametime()
			
			if(CurTime - get_pcvar_float(cvar_delay_attack) * 2 > g_check_heat[id])
			{
				g_heat[g_player_main[id]]--
				g_check_heat[id] = CurTime
			}
		}
	}
	
	static Message[64]
	
	if(g_heat[g_player_main[id]] <= 0)
	{
		set_hudmessage(0, 255, 0, -1.0, 0.90, 0, 1.0, 1.0)
		formatex(Message, sizeof(Message), "Status: Good")
	} else if(g_heat[g_player_main[id]] > 0 && g_heat[g_player_main[id]] < 100) {
		set_hudmessage(255, 255, 0, -1.0, 0.90, 0, 1.0, 1.0)
		formatex(Message, sizeof(Message), "Status: Heat %i%%", g_heat[g_player_main[id]])
	} else if(g_heat[g_player_main[id]] >= 100) {
		set_hudmessage(255, 0, 0, -1.0, 0.90, 0, 1.0, 1.0)
		formatex(Message, sizeof(Message), "Status: OverHeat")
	}
	
	ShowSyncHudMsg(id, g_sync_hud1, Message)
	
	static Float:NewAngles[3], Float:OldAngles[3], Float:Origin[3]
	pev(id, pev_angles, NewAngles)
	pev(g_player_main[id], pev_angles, OldAngles)
	
	NewAngles[2] = OldAngles[2]
	
	pev(g_player_main2[id], pev_origin, Origin)
	//get_position(g_player_main2[id], -10.0, 0.0, 0.0, Origin)
	
	set_pev(g_player_main[id], pev_v_angle, NewAngles)
	set_pev(g_player_main2[id], pev_angles, NewAngles)
	
	NewAngles[0] -= NewAngles[0] * 2
	set_pev(g_player_main[id], pev_angles, NewAngles)
	
	if(get_user_weapon(id) != CSW_KNIFE)
		engclient_cmd(id, "weapon_knife")
}

public fw_main_think(ent)
{
	if(!pev_valid(ent))
		return
	if(pev(ent, pev_health) - 1000.0 < 0)
	{
		if(!g_dead[ent])
			minigun_dead(ent)
			
		return
	}
	
	if(!g_dead[ent])
		entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)	
}

public fw_main_takedamage(victim, inflictor, attacker, Float:Damage, damagebits)
{
	if(!is_user_alive(attacker) || !is_user_connected(attacker))
		return HAM_IGNORED
	
	static Health
	Health = pev(victim, pev_health) - 1000
	
	client_print(attacker, print_center, "MW2 Auto-Minigun Health: %i", Health)
	
	return HAM_HANDLED
}

public minigun_dead(ent)
{
	g_dead[ent] = 1
	
	static Float:Origin[3]
	pev(ent, pev_origin, Origin)
	
	message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(g_exp_id)	// sprite index
	write_byte(30)	// scale in 0.1's
	write_byte(30)	// framerate
	write_byte(0)	// flags
	message_end()
	
	static id
	id = g_owner[ent]
	
	if(is_user_connected(id))
	{
		reset_minigun(id)
		client_printcolor(id, "!g[ZE]!y Your MW2 Auto-Minigun has been !tDestroyed!y !!!")
	}
	
	Origin[0] = 9999.0
	Origin[1] = 9999.0
	Origin[2] = 9999.0
	
	set_pev(ent, pev_origin, Origin)
}

public fw_CmdStart(id, uc_handle, seed)
{
	if(!is_user_alive(id) || !is_user_connected(id))
		return FMRES_IGNORED
	if(!g_player_main[id])
		return FMRES_IGNORED
		
	static PressButton
	PressButton = get_uc(uc_handle, UC_Buttons)
	
	if(g_remoting[id])
	{
		if(PressButton & IN_ATTACK)
		{
			static Float:CurTime
			CurTime = get_gametime()
			
			if(CurTime - get_pcvar_float(cvar_delay_attack) > g_last_shoot[id])
			{
				if(!g_preparing[id] && !g_firing[id] && !g_ending[id])
				{
					g_preparing[id] = 1
					g_firing[id] = 0
					
					set_entity_anim(g_player_main[id], 1)
					set_task(1.5, "start_attack", id)
					
					emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
				}
				
				if(!g_preparing[id] && g_firing[id] && !g_ending[id] && g_heat[g_player_main[id]] < 100)
				{
					minigun_shoot(id)
					
					if(CurTime - get_pcvar_float(cvar_delay_attack) > g_check_heat[id])
					{
						if(g_heat[g_player_main[id]] < 100)
						{
							g_heat[g_player_main[id]]++
						}
						
						g_check_heat[id] = CurTime
					}
				} else if(g_heat[g_player_main[id]] >= 100) {
					if(!g_preparing[id] && g_firing[id] && !g_ending[id] && !g_reloading[g_player_main[id]])
					{
						g_firing[id] = 0
						g_preparing[id] = 0
						g_ending[id] = 1
						
						set_entity_anim(g_player_main[id], 3)
					
						emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
						set_task(2.0, "stop_attack", id)
						
						static Message[128]
						formatex(Message, sizeof(Message), "!g[ZE]!y System is overheat. Please wait !t%i!y seconds !!!", get_pcvar_float(cvar_reload_time))
						
						client_printcolor(id, Message)
						
						g_reloading[g_player_main[id]] = 1
						set_task(get_pcvar_float(cvar_reload_time), "reload_heat", id)
					}
				}
				
				g_last_shoot[id] = CurTime
			}
			
			PressButton &= ~IN_ATTACK
			set_uc(uc_handle, UC_Buttons, PressButton)
		} else {
			if(pev(id, pev_oldbuttons) & IN_ATTACK)
			{
				if(g_preparing[id] || g_firing[id])
				{
					g_firing[id] = 0
					g_preparing[id] = 0
					g_ending[id] = 1
					
					set_entity_anim(g_player_main[id], 3)
					
					emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
					set_task(2.0, "stop_attack", id)
				}
			}
		}
	}
	
	if(PressButton & IN_USE)
	{
		if(g_remoting[id])
		{
			set_task(1.0, "task_delay2", id)
			attach_view(id, id)
			g_preparing[id] = 0
			g_firing[id] = 0
			
			PressButton &= ~IN_USE
			set_uc(uc_handle, UC_Buttons, PressButton)
		} else {
			if(!task_exists(id+2479))
			{
				set_task(3.0, "do_remote", id+2479)
				
				message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id)
				write_short(3)
				message_end()
			}
		}
	} else {
		if(pev(id, pev_oldbuttons) & IN_USE)
		{
			remove_task(id+2479)

			message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("BarTime"), {0,0,0}, id)
			write_short(0)
			message_end()
		}
	}
	
	return FMRES_HANDLED
}

public reload_heat(id)
{
	if(!pev_valid(g_player_main[id]))
		return
	
	g_heat[g_player_main[id]] = 0
	g_reloading[g_player_main[id]] = 0
}

public task_delay2(id)
{
	g_remoting[id] = 0
}

public start_attack(id)
{
	g_preparing[id] = 0
	g_firing[id] = 1
}

public stop_attack(id)
{
	g_preparing[id] = 0
	g_firing[id] = 0
	g_ending[id] = 0
}

public minigun_shoot(id)
{
	if(!g_remoting[id])
	{
		return PLUGIN_HANDLED
	}
	
	static Float:CurTime
	CurTime = get_gametime()
	
	if(CurTime - 0.1 > g_last_firesound[id])
	{
		PlaySound(id, minigun_sound[1])
		emit_sound(g_player_main[id], CHAN_BODY, minigun_sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
		g_last_firesound[id] = CurTime
	}
	
	set_entity_anim(g_player_main[id], 2)
	
	static Float:Origin[3], Float:AimOrigin[3]
	get_position(g_player_main[id], 50.0, 0.0, 0.0, Origin)
	
	Origin[2] += 20.0
	
	message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
	write_byte(TE_EXPLOSION)
	engfunc(EngFunc_WriteCoord, Origin[0])
	engfunc(EngFunc_WriteCoord, Origin[1])
	engfunc(EngFunc_WriteCoord, Origin[2])
	write_short(muzzleflash_spr_id)    // sprite index
	write_byte(5)    // scale in 0.1's
	write_byte(10)    // framerate
	write_byte(4)    // flags
	message_end()	
	
	static Float:Punch[3]
	Punch[0] = random_float(1.0, 5.0)
	Punch[1] = random_float(1.0, 5.0)
	Punch[2] = random_float(1.0, 10.0)
	
	set_pev(id, pev_punchangle, Punch)
				
	get_position(g_player_main[id], 70.0, 0.0, 30.0, Origin)
	get_position(g_player_main[id], 4000.0, 0.0, 30.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)
	
	get_position(g_player_main[id], 4000.0, -30.0, 50.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)
	
	get_position(g_player_main[id], 4000.0, 30.0, -50.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)
	
	get_position(g_player_main[id], 4000.0, -60.0, -70.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)
	
	get_position(g_player_main[id], 4000.0, 60.0, 70.0, AimOrigin)
	create_tracer(id, Origin, AimOrigin)	
	
	return PLUGIN_HANDLED
}

// Ham Weapon Deploy Forward
public fw_Item_Deploy_Post(weapon_ent)
{
	if(pev_valid(weapon_ent))
		return HAM_IGNORED
		
	static id
	id = pev(weapon_ent, pev_owner)
	
	if(g_remoting[id])
		engclient_cmd(id, "weapon_knife")
		
	return HAM_HANDLED
}

stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
	new 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
	
	vAngle[0] = 0.0
	
	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 create_tracer(id, Float:start[3], Float:end[3]) 
{
	new start_[3], end_[3]
	FVecIVec(start, start_)
	FVecIVec(end, end_)
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_TRACER)
	write_coord(start_[0])
	write_coord(start_[1])
	write_coord(start_[2])
	write_coord(end_[0])
	write_coord(end_[1])
	write_coord(end_[2])
	message_end()
	
	static tr, Float:End_Origin[3], Target
	engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, -1, tr)	
	
	get_tr2(tr, TR_vecEndPos, End_Origin)
	Target = get_tr2(tr, TR_pHit)
	
	if(is_user_alive(Target) && ze_is_user_zombie(Target))
	{
		static Float:Origin[3]
		pev(Target, pev_origin, Origin)
		
		// Show some blood :)
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
		write_byte(TE_BLOODSPRITE)
		write_coord(floatround(Origin[0])) 
		write_coord(floatround(Origin[1])) 
		write_coord(floatround(Origin[2])) 
		write_short(g_bloodspray)
		write_short(g_blood)
		write_byte(70)
		write_byte(random_num(1,2))
		message_end()
		
		
		ExecuteHamB(Ham_TakeDamage, Target, 0, id, random_float(get_pcvar_float(cvar_minigun_dmgrand_start), get_pcvar_float(cvar_minigun_dmgrand_end)), DMG_BULLET)
	}
	
	make_bullet(id, End_Origin)
}

stock make_bullet(id, Float:Origin[3])
{
	// Find target
	new target, body
	get_user_aiming(id, target, body, 999999)
	
	if(target > 0 && target <= get_maxplayers())
	{
		new Float:fStart[3], Float:fEnd[3], Float:fRes[3], Float:fVel[3]
		pev(id, pev_origin, fStart)
		
		// Get ids view direction
		velocity_by_aim(id, 64, fVel)
		
		// Calculate position where blood should be displayed
		fStart[0] = Origin[0]
		fStart[1] = Origin[1]
		fStart[2] = Origin[2]
		fEnd[0] = fStart[0]+fVel[0]
		fEnd[1] = fStart[1]+fVel[1]
		fEnd[2] = fStart[2]+fVel[2]
		
		// Draw traceline from victims origin into ids view direction to find
		// the location on the wall to put some blood on there
		new res
		engfunc(EngFunc_TraceLine, fStart, fEnd, 0, target, res)
		get_tr2(res, TR_vecEndPos, fRes)
		
		// Show some blood :)
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
		write_byte(TE_BLOODSPRITE)
		write_coord(floatround(fStart[0])) 
		write_coord(floatround(fStart[1])) 
		write_coord(floatround(fStart[2])) 
		write_short(g_bloodspray)
		write_short(g_blood)
		write_byte(70)
		write_byte(random_num(1,2))
		message_end()
		
		
		} else {
		new decal = 41
		
		// Check if the wall hit is an entity
		if(target)
		{
			// Put decal on an entity
			message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
			write_byte(TE_DECAL)
			write_coord(floatround(Origin[0]))
			write_coord(floatround(Origin[1]))
			write_coord(floatround(Origin[2]))
			write_byte(decal)
			write_short(target)
			message_end()
			} else {
			// Put decal on "world" (a wall)
			message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
			write_byte(TE_WORLDDECAL)
			write_coord(floatround(Origin[0]))
			write_coord(floatround(Origin[1]))
			write_coord(floatround(Origin[2]))
			write_byte(decal)
			message_end()
		}
		
		// Show sparcles
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_GUNSHOTDECAL)
		write_coord(floatround(Origin[0]))
		write_coord(floatround(Origin[1]))
		write_coord(floatround(Origin[2]))
		write_short(id)
		write_byte(decal)
		message_end()
	}
}

stock set_entity_anim(ent, anim)
{
	entity_set_float(ent, EV_FL_animtime, get_gametime())
	entity_set_float(ent, EV_FL_framerate, 1.0)
	entity_set_int(ent, EV_INT_sequence, anim)
}

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

ngamerz
Member
Member
Philippines
Posts: 37
Joined: 3 years ago
Location: Philippines From South Korea

#29

Post by ngamerz » 3 years ago

If you guys, can't do it. Please just post a tutorial for me, so I can do it by myself.

User avatar
Raheem
Mod Developer
Mod Developer
Posts: 2214
Joined: 7 years ago
Contact:

#30

Post by Raheem » 3 years ago

ngamerz wrote: 3 years ago If you guys, can't do it. Please just post a tutorial for me, so I can do it by myself.
Menu:
    1. #include <zombie_escape>
    2. #include <ze_vip>
    3.  
    4. native ze_give_salamander(id)
    5. native ze_give_stunrifle(id)
    6. native ze_give_bazzoka(id)
    7. native give_laserminigun(id)
    8. native give_minigun(id)
    9.  
    10. const OFFSET_CSMENUCODE = 205
    11. const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0
    12.  
    13. public plugin_natives()
    14. {
    15.     register_native("ze_open_vip_menu", "native_ze_open_vip_menu", 1)
    16. }
    17.  
    18. public native_ze_open_vip_menu(id)
    19. {
    20.     if (!is_user_connected(id))
    21.         return -1
    22.  
    23.     if (!(get_user_flags(id) & ADMIN_LEVEL_H))
    24.         return false
    25.  
    26.     Show_Menu(id)
    27.     return true
    28. }
    29.  
    30. public plugin_init()
    31. {
    32.     register_plugin("[ZE] VIP Menu", "1.0", "Spi")
    33.     register_menu("VIP Menu", KEYSMENU, "Main_Menu")
    34. }
    35.  
    36. public Show_Menu(id)
    37. {
    38.     static szMenu[250]
    39.     new iLen
    40.    
    41.     iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\rVIP Menu^n")
    42.    
    43.     iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y1\d. \wKnife Menu")
    44.    
    45.     if (is_user_alive(id))
    46.     {
    47.         iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y2\d. \wGuns Menu")
    48.     }
    49.     else
    50.     {
    51.         iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d2. Guns Menu")
    52.     }
    53.  
    54.     iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\y0\d. \r%L", id, "EXIT")
    55.    
    56.     set_pdata_int(id, OFFSET_CSMENUCODE, 0)
    57.     show_menu(id, KEYSMENU, szMenu, -1, "Main Menu")
    58. }
    59.  
    60. public Main_Menu(id, key)
    61. {
    62.     if (!is_user_connected(id))
    63.         return PLUGIN_HANDLED
    64.    
    65.     switch (key)
    66.     {
    67.         case 0: ze_open_knife_menu(id)
    68.         case 1:
    69.         {
    70.             if (is_user_alive(id))
    71.             {
    72.                     Open_HGunMenu(id)
    73.             }
    74.             else
    75.             {
    76.                 ze_colored_print(id, "%L", id, "DEAD_CANT_BUY_WEAPON")
    77.             }
    78.         }
    79.     }
    80.     return PLUGIN_HANDLED
    81. }
    82.  
    83. public Open_HGunMenu(id)
    84. {
    85.     new iMenu = menu_create("\rGuns Menu:^n^n", "HVIPMenu_Handler")
    86.    
    87.     menu_additem(iMenu, "Salamander")
    88.     menu_additem(iMenu, "Stun Rifle")
    89.     menu_additem(iMenu, "Bazzoka")
    90.     menu_additem(iMenu, "Laser Minigun")
    91.     menu_additem(iMenu, "Minigun")
    92.  
    93.     menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL)
    94.     menu_display(id, iMenu, 0)
    95. }
    96.  
    97. public HVIPMenu_Handler(id, iMenu, iItem)
    98. {
    99.     if (!is_user_connected(id))
    100.         return PLUGIN_CONTINUE
    101.  
    102.     switch (iItem)
    103.     {
    104.         case 0: ze_give_salamander(id)
    105.         case 1: ze_give_stunrifle(id)
    106.         case 2: ze_give_bazzoka(id)
    107.         case 3: give_laserminigun(id)
    108.         case 4: give_minigun(id)
    109.     }
    110.    
    111.     menu_destroy(iMenu)
    112.     return PLUGIN_HANDLED
    113. }
Salamander:
    1. #include <zombie_escape>
    2. #include <ze_vip>
    3. #include <amxconst>
    4. #include <fakemeta>
    5. #include <fakemeta_util>
    6. #include <cstrike>
    7. #include <xs>
    8. #include <engine>
    9. #include <fun>
    10.  
    11. #define PLUGIN "[CSO] Salamander"
    12. #define VERSION "2015"
    13. #define AUTHOR "Dias Pendragon Leon"
    14.  
    15. #define CSW_SAL CSW_M249
    16. #define weapon_sal "weapon_m249"
    17.  
    18. #define DAMAGE 38
    19. #define FIRE_SPEED 640.0
    20. #define RECOIL 0.0
    21.  
    22. #define MODEL_V "models/v_salamander.mdl"
    23. #define MODEL_P "models/p_salamander.mdl"
    24. #define MODEL_W "models/w_salamander.mdl"
    25. #define DEFAULT_W_MODEL "models/w_m249.mdl"
    26.  
    27. new const WeaponSounds[6][] =
    28. {
    29.     "weapons/flamegun-1.wav",
    30.     "weapons/flamegun_draw.wav",
    31.     "weapons/flamegun_clipin1.wav",
    32.     "weapons/flamegun_clipin2.wav",
    33.     "weapons/flamegun_clipout1.wav",
    34.     "weapons/flamegun_clipout2.wav"
    35. }
    36.  
    37. new const WeaponResources[7][] =
    38. {
    39.     "sprites/flame_puff01.spr",
    40.     "sprites/flame_burn01.spr",
    41.     "sprites/weapon_flamethrower.txt",
    42.     "sprites/640hud7_2.spr",
    43.     "sprites/640hud59_2.spr",
    44.     "sprites/640hud60_2.spr",
    45.     "sprites/smokepuff.spr"
    46. }
    47.  
    48. enum
    49. {
    50.     ANIM_IDLE = 0,
    51.     ANIM_SHOOT,
    52.     ANIM_SHOOT_END,
    53.     ANIM_RELOAD,
    54.     ANIM_DRAW
    55. }
    56.  
    57. // Marcros
    58. #define Get_BitVar(%1,%2)       (%1 & (1 << (%2 & 31)))
    59. #define Set_BitVar(%1,%2)       (%1 |= (1 << (%2 & 31)));
    60. #define UnSet_BitVar(%1,%2)     (%1 &= ~(1 << (%2 & 31)));
    61.  
    62. // Vars
    63. new g_Had_Salamander, g_WeaponEnt, g_SmokePuff_SprID, Float:g_PunchAngles[33]
    64. new g_MsgCurWeapon, g_MsgWeaponList
    65.  
    66. // Safety
    67. new g_HamBot
    68. new g_IsConnected, g_IsAlive, g_PlayerWeapon[33]
    69.  
    70. public plugin_init()
    71. {
    72.     register_plugin(PLUGIN, VERSION, AUTHOR)
    73.    
    74.     // Your highness!
    75.     Register_SafetyFunc()
    76.    
    77.     // Forward
    78.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
    79.     register_forward(FM_SetModel, "fw_SetModel")
    80.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
    81.     register_forward(FM_CmdStart, "fw_CmdStart")
    82.     register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
    83.    
    84.     // Engine
    85.     register_think("fireinsaigon", "fw_Fire_Think")
    86.     register_touch("fireinsaigon", "*", "fw_Fire_Touch")
    87.    
    88.     // Hams
    89.     RegisterHam(Ham_Item_Deploy, weapon_sal, "fw_Item_Deploy_Post", 1) 
    90.     RegisterHam(Ham_Item_AddToPlayer, weapon_sal, "fw_Item_AddToPlayer_Post", 1)
    91.    
    92.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
    93.     RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")
    94.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sal, "fw_Weapon_PrimaryAttack")
    95.     RegisterHam(Ham_Weapon_PrimaryAttack, weapon_sal, "fw_Weapon_PrimaryAttack_Post", 1)
    96.    
    97.     g_MsgCurWeapon = get_user_msgid("CurWeapon")
    98.     g_MsgWeaponList = get_user_msgid("WeaponList")
    99.    
    100.     register_clcmd("weapon_flamethrower", "Hook_Weapon")
    101. }
    102.  
    103. public plugin_precache()
    104. {
    105.     precache_model(MODEL_V)
    106.     precache_model(MODEL_P)
    107.     precache_model(MODEL_W)
    108.    
    109.     for(new i = 0; i < sizeof(WeaponSounds); i++)
    110.         precache_sound(WeaponSounds[i])
    111.     for(new i = 0; i < sizeof(WeaponResources); i++)
    112.     {
    113.         if(i == 2) precache_generic(WeaponResources[i])
    114.         else if(i == 6) g_SmokePuff_SprID = precache_model(WeaponResources[i])
    115.         else precache_model(WeaponResources[i])
    116.     }
    117. }
    118.  
    119. public plugin_natives()
    120. {
    121.     register_native("ze_give_salamander", "native_ze_give_salamander", 1)
    122. }
    123.  
    124. public native_ze_give_salamander(id)
    125. {
    126.     Get_Salamander(id)
    127. }
    128.  
    129. public fw_PrecacheEvent_Post(type, const name[])
    130. {
    131.     if(equal("events/m249.sc", name))
    132.         g_WeaponEnt = get_orig_retval()
    133. }
    134.  
    135. public client_putinserver(id)
    136. {
    137.     Safety_Connected(id)
    138.     if(!g_HamBot && is_user_bot(id))
    139.     {
    140.         g_HamBot = 1
    141.         set_task(0.1, "Register_HamBot", id)
    142.     }
    143. }
    144.  
    145. public Register_HamBot(id)
    146. {
    147.     Register_SafetyFuncBot(id)
    148.     RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
    149. }
    150.  
    151. public client_disconnected(id)
    152. {
    153.     Safety_Disconnected(id)
    154. }
    155.  
    156. public Hook_Weapon(id)
    157. {
    158.     engclient_cmd(id, weapon_sal)
    159.     return PLUGIN_HANDLED
    160. }
    161.  
    162. public Get_Salamander(id)
    163. {
    164.     Set_BitVar(g_Had_Salamander, id)
    165.     give_item(id, weapon_sal)
    166.    
    167.     message_begin(MSG_ONE_UNRELIABLE, g_MsgCurWeapon, _, id)
    168.     write_byte(1)
    169.     write_byte(CSW_SAL)
    170.     write_byte(100)
    171.     message_end()
    172.    
    173.     cs_set_user_bpammo(id, CSW_SAL, 200)
    174. }
    175.  
    176. public Remove_Salamander(id)
    177. {
    178.     UnSet_BitVar(g_Had_Salamander, id)
    179. }
    180.  
    181. public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
    182. {
    183.     if(!is_alive(id))
    184.         return FMRES_IGNORED
    185.     if(get_player_weapon(id) != CSW_SAL || !Get_BitVar(g_Had_Salamander, id))
    186.         return FMRES_IGNORED
    187.    
    188.     set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
    189.    
    190.     return FMRES_HANDLED
    191. }
    192.  
    193. public fw_SetModel(entity, model[])
    194. {
    195.     if(!pev_valid(entity))
    196.         return FMRES_IGNORED
    197.    
    198.     static szClassName[33]
    199.     pev(entity, pev_classname, szClassName, charsmax(szClassName))
    200.    
    201.     if(!equal(szClassName, "weaponbox"))
    202.         return FMRES_IGNORED
    203.    
    204.     static id
    205.     id = pev(entity, pev_owner)
    206.    
    207.     if(equal(model, DEFAULT_W_MODEL))
    208.     {
    209.         static weapon; weapon = fm_find_ent_by_owner(-1, weapon_sal, entity)
    210.        
    211.         if(!pev_valid(weapon))
    212.             return FMRES_IGNORED
    213.        
    214.         if(Get_BitVar(g_Had_Salamander, id))
    215.         {
    216.             set_pev(weapon, pev_impulse, 442015)
    217.             engfunc(EngFunc_SetModel, entity, MODEL_W)
    218.            
    219.             UnSet_BitVar(g_Had_Salamander, id)
    220.            
    221.             return FMRES_SUPERCEDE
    222.         }
    223.     }
    224.  
    225.     return FMRES_IGNORED
    226. }
    227.  
    228. public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
    229. {
    230.     if(!is_alive(invoker))
    231.         return FMRES_IGNORED
    232.     if(get_player_weapon(invoker) != CSW_SAL || !Get_BitVar(g_Had_Salamander, invoker))
    233.         return FMRES_IGNORED   
    234.     if(eventid == g_WeaponEnt)
    235.     {
    236.         playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
    237.         if(pev(invoker, pev_weaponanim) != ANIM_SHOOT) Set_WeaponAnim(invoker, ANIM_SHOOT)
    238.        
    239.         return FMRES_SUPERCEDE
    240.     }
    241.    
    242.     return FMRES_HANDLED
    243. }
    244.  
    245. public fw_CmdStart(id, uc_handle, seed)
    246. {
    247.     if(!is_alive(id))
    248.         return FMRES_IGNORED
    249.     if(get_player_weapon(id) != CSW_SAL || !Get_BitVar(g_Had_Salamander, id))
    250.         return FMRES_IGNORED
    251.        
    252.     static PressedButton
    253.     PressedButton = get_uc(uc_handle, UC_Buttons)
    254.    
    255.     if(!(PressedButton & IN_ATTACK))
    256.     {
    257.         if((pev(id, pev_oldbuttons) & IN_ATTACK) && pev(id, pev_weaponanim) == ANIM_SHOOT)
    258.         {
    259.             static weapon; weapon = fm_get_user_weapon_entity(id, CSW_SAL)
    260.             if(pev_valid(weapon)) set_pdata_float(weapon, 48, 2.0, 4)
    261.            
    262.             Set_WeaponAnim(id, ANIM_SHOOT_END)
    263.             Make_FireSmoke(id)
    264.         }
    265.     }
    266.        
    267.     return FMRES_HANDLED
    268. }
    269.  
    270. public Make_FireSmoke(id)
    271. {
    272.     static Float:Origin[3]
    273.     get_position(id, 40.0, 5.0, -15.0, Origin)
    274.    
    275.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    276.     write_byte(TE_EXPLOSION)
    277.     engfunc(EngFunc_WriteCoord, Origin[0])
    278.     engfunc(EngFunc_WriteCoord, Origin[1])
    279.     engfunc(EngFunc_WriteCoord, Origin[2])
    280.     write_short(g_SmokePuff_SprID)
    281.     write_byte(5)
    282.     write_byte(30)
    283.     write_byte(14)
    284.     message_end()
    285. }
    286.  
    287. public fw_Item_Deploy_Post(Ent)
    288. {
    289.     if(pev_valid(Ent) != 2)
    290.         return
    291.     static Id; Id = get_pdata_cbase(Ent, 41, 4)
    292.     if(get_pdata_cbase(Id, 373) != Ent)
    293.         return
    294.     if(!Get_BitVar(g_Had_Salamander, Id))
    295.         return
    296.    
    297.     set_pev(Id, pev_viewmodel2, MODEL_V)
    298.     set_pev(Id, pev_weaponmodel2, MODEL_P)
    299. }
    300.  
    301. public fw_Item_AddToPlayer_Post(Ent, id)
    302. {
    303.     if(!pev_valid(Ent))
    304.         return HAM_IGNORED
    305.        
    306.     if(pev(Ent, pev_impulse) == 442015)
    307.     {
    308.         Set_BitVar(g_Had_Salamander, id)
    309.         set_pev(Ent, pev_impulse, 0)
    310.     }
    311.    
    312.     if(Get_BitVar(g_Had_Salamander, id))
    313.     {
    314.         message_begin(MSG_ONE_UNRELIABLE, g_MsgWeaponList, _, id)
    315.         write_string("weapon_flamethrower")
    316.         write_byte(3)
    317.         write_byte(200)
    318.         write_byte(-1)
    319.         write_byte(-1)
    320.         write_byte(0)
    321.         write_byte(4)
    322.         write_byte(CSW_SAL)
    323.         write_byte(0)
    324.         message_end()  
    325.     }
    326.    
    327.     return HAM_HANDLED 
    328. }
    329.  
    330. public fw_TraceAttack(Ent, Attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
    331. {
    332.     if(!is_alive(Attacker))
    333.         return HAM_IGNORED
    334.     if(get_player_weapon(Attacker) != CSW_SAL || !Get_BitVar(g_Had_Salamander, Attacker))
    335.         return HAM_IGNORED
    336.    
    337.     return HAM_SUPERCEDE
    338. }
    339.  
    340. public CreateFire(id, Float:Speed)
    341. {
    342.     new iEnt = create_entity("env_sprite")
    343.     if(!pev_valid(iEnt)) return
    344.    
    345.     static Float:vfAngle[3], Float:MyOrigin[3]
    346.     static Float:Origin[3], Float:TargetOrigin[3], Float:Velocity[3]
    347.  
    348.     get_position(id, 40.0, 5.0, -5.0, Origin)
    349.     get_position(id, 1024.0, 0.0, 0.0, TargetOrigin)
    350.    
    351.     pev(id, pev_angles, vfAngle)
    352.     pev(id, pev_origin, MyOrigin)
    353.    
    354.     vfAngle[2] = float(random(18) * 20)
    355.  
    356.     // set info for ent
    357.     set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
    358.     set_pev(iEnt, pev_rendermode, kRenderTransAdd)
    359.     set_pev(iEnt, pev_renderamt, 160.0)
    360.     set_pev(iEnt, pev_fuser1, get_gametime() + 1.0) // time remove
    361.     set_pev(iEnt, pev_scale, 0.25)
    362.     set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
    363.    
    364.     entity_set_string(iEnt, EV_SZ_classname, "fireinsaigon")
    365.     engfunc(EngFunc_SetModel, iEnt, WeaponResources[0])
    366.     set_pev(iEnt, pev_mins, Float:{-1.0, -1.0, -1.0})
    367.     set_pev(iEnt, pev_maxs, Float:{1.0, 1.0, 1.0})
    368.     set_pev(iEnt, pev_origin, Origin)
    369.     set_pev(iEnt, pev_gravity, 0.01)
    370.     set_pev(iEnt, pev_angles, vfAngle)
    371.     set_pev(iEnt, pev_solid, SOLID_TRIGGER)
    372.     set_pev(iEnt, pev_owner, id)   
    373.     set_pev(iEnt, pev_frame, 0.0)
    374.     set_pev(iEnt, pev_iuser2, get_user_team(id))
    375.  
    376.     get_speed_vector(Origin, TargetOrigin, Speed, Velocity)
    377.     set_pev(iEnt, pev_velocity, Velocity)
    378.    
    379.     emit_sound(iEnt, CHAN_BODY, WeaponSounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
    380. }
    381.  
    382. public fw_Fire_Think(iEnt)
    383. {
    384.     if(!pev_valid(iEnt))
    385.         return
    386.    
    387.     static Float:fFrame, Float:fScale
    388.     pev(iEnt, pev_frame, fFrame)
    389.     pev(iEnt, pev_scale, fScale)
    390.  
    391.     // effect exp
    392.     if(pev(iEnt, pev_movetype) == MOVETYPE_NONE)
    393.     {
    394.         fFrame += 1.0
    395.         fScale += 0.1
    396.         fScale = floatmin(fScale, 1.75)
    397.  
    398.         if(fFrame > 21.0)
    399.         {
    400.             engfunc(EngFunc_RemoveEntity, iEnt)
    401.             return
    402.         }
    403.        
    404.         set_pev(iEnt, pev_nextthink, get_gametime() + 0.025)
    405.     } else {
    406.         fFrame += 1.25
    407.         fFrame = floatmin(21.0, fFrame)
    408.         fScale += 0.15
    409.         fScale = floatmin(fScale, 1.75)
    410.        
    411.         set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
    412.     }
    413.  
    414.     set_pev(iEnt, pev_frame, fFrame)
    415.     set_pev(iEnt, pev_scale, fScale)
    416.    
    417.     // time remove
    418.     static Float:fTimeRemove
    419.     pev(iEnt, pev_fuser1, fTimeRemove)
    420.     if (get_gametime() >= fTimeRemove)
    421.     {
    422.         engfunc(EngFunc_RemoveEntity, iEnt)
    423.         return;
    424.     }
    425. }
    426.  
    427. public fw_Fire_Touch(ent, id)
    428. {
    429.     if(!pev_valid(ent))
    430.         return
    431.        
    432.     if(pev_valid(id))
    433.     {
    434.         static Classname[32]
    435.         pev(id, pev_classname, Classname, sizeof(Classname))
    436.        
    437.         if(equal(Classname, "fireinsaigon")) return
    438.         else if(is_alive(id))
    439.         {
    440.             static EntTeam; EntTeam = pev(ent, pev_iuser2)
    441.             if(get_user_team(id) != EntTeam)
    442.             {
    443.                 static Attacker; Attacker = pev(ent, pev_owner)
    444.                 if(is_connected(Attacker))
    445.                 {
    446.                     ExecuteHamB(Ham_TakeDamage, id, 0, Attacker, float(DAMAGE), DMG_BULLET)
    447.                 }
    448.             }
    449.         }
    450.     }
    451.        
    452.     set_pev(ent, pev_movetype, MOVETYPE_NONE)
    453.     set_pev(ent, pev_solid, SOLID_NOT)
    454. }
    455.  
    456. public fw_Weapon_PrimaryAttack(ent)
    457. {
    458.     static id; id = pev(ent, pev_owner)
    459.     pev(id, pev_punchangle, g_PunchAngles[id])
    460.    
    461.     return HAM_IGNORED 
    462. }
    463.  
    464. public fw_Weapon_PrimaryAttack_Post(ent)
    465. {
    466.     static id; id = pev(ent, pev_owner)
    467.  
    468.     if(get_player_weapon(id) == CSW_SAL && Get_BitVar(g_Had_Salamander, id) && cs_get_weapon_ammo(ent) > 0)
    469.     {
    470.         static Float:push[3]
    471.         pev(id, pev_punchangle, push)
    472.         xs_vec_sub(push, g_PunchAngles[id], push)
    473.        
    474.         xs_vec_mul_scalar(push, RECOIL, push)
    475.         xs_vec_add(push, g_PunchAngles[id], push)
    476.         set_pev(id, pev_punchangle, push)
    477.        
    478.         CreateFire(id, FIRE_SPEED)
    479.     } else {
    480.         static Float:push[3]
    481.         pev(id, pev_punchangle, push)
    482.         xs_vec_sub(push, g_PunchAngles[id], push)
    483.        
    484.         xs_vec_mul_scalar(push, 0.0, push)
    485.         xs_vec_add(push, g_PunchAngles[id], push)
    486.         set_pev(id, pev_punchangle, push)
    487.     }
    488.    
    489.     return HAM_IGNORED 
    490. }
    491.  
    492. stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle)
    493. {
    494.     static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
    495.     if(!pev_valid(entwpn))
    496.         return
    497.        
    498.     set_pdata_float(entwpn, 46, TimeIdle, 4)
    499.     set_pdata_float(entwpn, 47, TimeIdle, 4)
    500.     set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
    501. }
    502.  
    503. stock Set_PlayerNextAttack(id, Float:nexttime)
    504. {
    505.     set_pdata_float(id, 83, nexttime, 5)
    506. }
    507.  
    508. stock Set_WeaponAnim(id, anim)
    509. {
    510.     set_pev(id, pev_weaponanim, anim)
    511.    
    512.     message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
    513.     write_byte(anim)
    514.     write_byte(pev(id, pev_body))
    515.     message_end()
    516. }
    517.  
    518. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
    519. {
    520.     new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    521.    
    522.     pev(id, pev_origin, vOrigin)
    523.     pev(id, pev_view_ofs,vUp) //for player
    524.     xs_vec_add(vOrigin,vUp,vOrigin)
    525.     pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
    526.    
    527.     angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
    528.     angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
    529.     angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
    530.    
    531.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
    532.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
    533.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
    534. }
    535.  
    536. stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
    537. {
    538.     new_velocity[0] = origin2[0] - origin1[0]
    539.     new_velocity[1] = origin2[1] - origin1[1]
    540.     new_velocity[2] = origin2[2] - origin1[2]
    541.     new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
    542.     new_velocity[0] *= num
    543.     new_velocity[1] *= num
    544.     new_velocity[2] *= num
    545.    
    546.     return 1;
    547. }
    548.  
    549. stock get_weapon_attachment(id, Float:output[3], Float:fDis = 40.0)
    550. {
    551.     static Float:vfEnd[3], viEnd[3]
    552.     get_user_origin(id, viEnd, 3)  
    553.     IVecFVec(viEnd, vfEnd)
    554.    
    555.     static Float:fOrigin[3], Float:fAngle[3]
    556.    
    557.     pev(id, pev_origin, fOrigin)
    558.     pev(id, pev_view_ofs, fAngle)
    559.    
    560.     xs_vec_add(fOrigin, fAngle, fOrigin)
    561.    
    562.     static Float:fAttack[3]
    563.    
    564.     xs_vec_sub(vfEnd, fOrigin, fAttack)
    565.     xs_vec_sub(vfEnd, fOrigin, fAttack)
    566.    
    567.     static Float:fRate
    568.    
    569.     fRate = fDis / vector_length(fAttack)
    570.     xs_vec_mul_scalar(fAttack, fRate, fAttack)
    571.    
    572.     xs_vec_add(fOrigin, fAttack, output)
    573. }
    574.  
    575. /* ===============================
    576. ------------- SAFETY -------------
    577. =================================*/
    578. public Register_SafetyFunc()
    579. {
    580.     register_event("CurWeapon", "Safety_CurWeapon", "be", "1=1")
    581.    
    582.     RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
    583.     RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
    584. }
    585.  
    586. public Register_SafetyFuncBot(id)
    587. {
    588.     RegisterHamFromEntity(Ham_Spawn, id, "fw_Safety_Spawn_Post", 1)
    589.     RegisterHamFromEntity(Ham_Killed, id, "fw_Safety_Killed_Post", 1)
    590. }
    591.  
    592. public Safety_Connected(id)
    593. {
    594.     Set_BitVar(g_IsConnected, id)
    595.     UnSet_BitVar(g_IsAlive, id)
    596.    
    597.     g_PlayerWeapon[id] = 0
    598. }
    599.  
    600. public Safety_Disconnected(id)
    601. {
    602.     UnSet_BitVar(g_IsConnected, id)
    603.     UnSet_BitVar(g_IsAlive, id)
    604.    
    605.     g_PlayerWeapon[id] = 0
    606. }
    607.  
    608. public Safety_CurWeapon(id)
    609. {
    610.     if(!is_alive(id))
    611.         return
    612.        
    613.     static CSW; CSW = read_data(2)
    614.     if(g_PlayerWeapon[id] != CSW) g_PlayerWeapon[id] = CSW
    615. }
    616.  
    617. public fw_Safety_Spawn_Post(id)
    618. {
    619.     if(!is_user_alive(id))
    620.         return
    621.        
    622.     Set_BitVar(g_IsAlive, id)
    623. }
    624.  
    625. public fw_Safety_Killed_Post(id)
    626. {
    627.     UnSet_BitVar(g_IsAlive, id)
    628. }
    629.  
    630. public is_connected(id)
    631. {
    632.     if(!(1 <= id <= 32))
    633.         return 0
    634.     if(!Get_BitVar(g_IsConnected, id))
    635.         return 0
    636.  
    637.     return 1
    638. }
    639.  
    640. public is_alive(id)
    641. {
    642.     if(!is_connected(id))
    643.         return 0
    644.     if(!Get_BitVar(g_IsAlive, id))
    645.         return 0
    646.        
    647.     return 1
    648. }
    649.  
    650. public get_player_weapon(id)
    651. {
    652.     if(!is_alive(id))
    653.         return 0
    654.    
    655.     return g_PlayerWeapon[id]
    656. }
    657.  
    658.  
    659. // ===================== STOCK... =======================
    660. // ======================================================
StunRifle:
    1. /*
    2. *   Stun Rifle is a CSO weapon, More information about it: http://cso.wikia.com/wiki/Stun_Rifle
    3. *  
    4. *   This plugin written by me: Raheem (The basic things for any weapon not written by me)
    5. *
    6. *   I tried to simulate it same as in CSO, I think it's nearly same else simple things
    7. *   That will be done in next versions.
    8. *
    9. *   Version 1.0 creation date: 16-6-2018
    10. *   Version 1.0 publication date: 20-6-2018
    11. *
    12. *   Last update: 4-8-2018
    13. *
    14. *   TODO List: Fix any problem, include good ideas
    15. */
    16.  
    17. #include <zombie_escape>
    18. #include <fakemeta_util>
    19.  
    20. #define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
    21.  
    22. // CWeaponBox
    23. #define m_rgpPlayerItems_CWeaponBox 34
    24.  
    25. // CBasePlayerItem
    26. #define m_pPlayer 41
    27. #define m_pNext 42
    28. #define m_iId 43
    29.  
    30. // CBasePlayerWeapon
    31. #define m_flNextPrimaryAttack 46
    32. #define m_flNextSecondaryAttack 47
    33. #define m_flTimeWeaponIdle 48
    34. #define m_iPrimaryAmmoType 49
    35. #define m_iClip 51
    36. #define m_fInReload 54
    37. #define m_iWeaponState 74
    38.  
    39. // CBaseMonster
    40. #define m_flNextAttack 83
    41.  
    42. // CBasePlayer
    43. #define m_iFOV 363
    44. #define m_rpgPlayerItems 367
    45. #define m_pActiveItem 373
    46. #define m_rgAmmo 376
    47.  
    48. /*-----------------------------------------------------*/
    49.  
    50. #define WEAPON_KEY 776544229
    51. #define WEAPON_OLD "weapon_ak47"
    52. #define WEAPON_NEW "weapon_stunrifle"
    53.  
    54. /*-----------------------------------------------------*/
    55.  
    56. new const WPN_SPRITES[][] =
    57. {
    58.     "sprites/weapon_stunrifle.txt",
    59.     "sprites/640hud169.spr",
    60.     "sprites/640hud7.spr"
    61. }
    62.  
    63. new const g_szSounds[][] =
    64. {
    65.     "weapons/stunrifle-1.wav",
    66.     "weapons/stunrifle_drawa.wav",
    67.     "weapons/stunrifle_drawb.wav",
    68.     "weapons/stunrifle_drawc.wav",
    69.     "weapons/stunrifle_reloada.wav",
    70.     "weapons/stunrifle_reloadb.wav",
    71.     "weapons/stunrifle_reloadc.wav",
    72.     "weapons/stunrifle_idlea.wav",
    73.     "weapons/stunrifle_idleb.wav",
    74.     "weapons/stunrifle_idlec.wav",
    75.     "weapons/stunrifle_lowbattery.wav",
    76.     "weapons/stunrifle-2.wav"
    77. }
    78.  
    79. new const iWeaponList[] =
    80. {  
    81.     2, 30, -1, -1, 0, 1, CSW_AK47, 0
    82. }
    83.  
    84. #define WEAPON_MODEL_V "models/stunrifle/v_stunrifle.mdl"
    85. #define WEAPON_MODEL_P "models/stunrifle/p_stunrifle.mdl"
    86. #define WEAPON_MODEL_W "models/stunrifle/w_stunrifle.mdl"
    87. #define WEAPON_BODY 0
    88.  
    89. /*-----------------------------------------------------*/
    90.  
    91. #define WEAPON_COST 0
    92.  
    93. #define WEAPON_CLIP 30
    94. #define WEAPON_AMMO 90
    95. #define WEAPON_RATE 0.098
    96. #define WEAPON_RECOIL 0.96
    97. #define WEAPON_DAMAGE 1.0 // AK47 damage multiplied by this factor
    98.  
    99. #define WEAPON_RATE_EX 0.169
    100. #define WEAPON_RECOIL_EX 0.79
    101. #define WEAPON_DAMAGE_EX 1.3
    102. #define WEAPON_NATIVE "native_give_weapon_stunrifle"
    103.  
    104. /*-----------------------------------------------------*/
    105.  
    106. // Animations
    107. #define ANIM_IDLE_A 0
    108. #define ANIM_IDLE_B 1
    109. #define ANIM_IDLE_C 2
    110. #define ANIM_ATTACK_A 3
    111. #define ANIM_ATTACK_B 4
    112. #define ANIM_ATTACK_C 5
    113. #define ANIM_RELOAD_A 6
    114. #define ANIM_RELOAD_B 7
    115. #define ANIM_RELOAD_C 8
    116. #define ANIM_DRAW_A 9
    117. #define ANIM_DRAW_B 10
    118. #define ANIM_DRAW_C 11
    119.  
    120. // from model: Frames / FPS
    121. #define ANIM_IDLE_TIME_A 90/30.0
    122. #define ANIM_SHOOT_TIME_A 31/30.0
    123. #define ANIM_RELOAD_TIME_A 101/30.0
    124. #define ANIM_DRAW_TIME_A 46/30.0
    125. #define ANIM_IDLE_TIME_B 90/30.0
    126. #define ANIM_SHOOT_TIME_B 31/30.0
    127. #define ANIM_RELOAD_TIME_B 101/30.0
    128. #define ANIM_DRAW_TIME_B 46/30.0
    129. #define ANIM_IDLE_TIME_C 90/30.0
    130. #define ANIM_SHOOT_TIME_C 31/30.0
    131. #define ANIM_RELOAD_TIME_C 101/30.0
    132. #define ANIM_DRAW_TIME_C 46/30.0
    133.  
    134. new g_AllocString_V,
    135.     g_AllocString_P,
    136.     g_AllocString_E,
    137.  
    138.     HamHook: g_fw_TraceAttack[4],
    139.    
    140.     g_iMsgID_Weaponlist,
    141.     g_iStoredEnergy[33],
    142.     bool:g_bHasStunRifle[33],
    143.     g_pCvarBarFillTime,
    144.     g_pCvarRadius,
    145.     g_pCvarElecDmg,
    146.     g_iLigSpr,
    147.     g_iEffSpr,
    148.     g_iEff2Spr,
    149.     bool:g_bReloading[33],
    150.     g_iAppearTimes[33]
    151.  
    152. public plugin_init()
    153. {
    154.     register_plugin("[ZE] Stun Rifle", "1.1", "Raheem");
    155.    
    156.     RegisterHam(Ham_Item_Deploy, WEAPON_OLD, "fw_Item_Deploy_Post", 1);
    157.     RegisterHam(Ham_Item_PostFrame, WEAPON_OLD, "fw_Item_PostFrame");
    158.     RegisterHam(Ham_Item_AddToPlayer, WEAPON_OLD, "fw_Item_AddToPlayer_Post", 1);
    159.     RegisterHam(Ham_Weapon_Reload, WEAPON_OLD, "fw_Weapon_Reload");
    160.     RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_OLD, "fw_Weapon_WeaponIdle");
    161.     RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_OLD, "fw_Weapon_PrimaryAttack");
    162.    
    163.     g_fw_TraceAttack[0] = RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack");
    164.     g_fw_TraceAttack[1] = RegisterHam(Ham_TraceAttack, "info_target",    "fw_TraceAttack");
    165.     g_fw_TraceAttack[2] = RegisterHam(Ham_TraceAttack, "player",         "fw_TraceAttack");
    166.     g_fw_TraceAttack[3] = RegisterHam(Ham_TraceAttack, "hostage_entity", "fw_TraceAttack");
    167.     fm_ham_hook(false);
    168.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1);
    169.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent");
    170.     register_forward(FM_SetModel, "fw_SetModel");
    171.    
    172.     g_pCvarBarFillTime = register_cvar("stunrifle_barfill_time", "5") // Bar fill time in seconds
    173.     g_pCvarRadius = register_cvar("stunrifle_radius", "500") // elec radius
    174.     g_pCvarElecDmg = register_cvar("stunrifle_electricity_dmg", "10") // electricity damage - lowest damage for 1 bar only
    175.    
    176.     register_clcmd(WEAPON_NEW, "HookSelect");
    177.     g_iMsgID_Weaponlist = get_user_msgid("WeaponList");
    178. }
    179.  
    180. public plugin_precache()
    181. {
    182.     g_AllocString_V = engfunc(EngFunc_AllocString, WEAPON_MODEL_V);
    183.     g_AllocString_P = engfunc(EngFunc_AllocString, WEAPON_MODEL_P);
    184.     g_AllocString_E = engfunc(EngFunc_AllocString, WEAPON_OLD);
    185.     engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_V);
    186.     engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_P);
    187.     engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_W);
    188.    
    189.     for (new i = 0; i < sizeof g_szSounds; i++) engfunc(EngFunc_PrecacheSound, g_szSounds[i]);
    190.    
    191.     for(new i = 0; i < sizeof WPN_SPRITES;i++) precache_generic(WPN_SPRITES[i]);
    192.    
    193.     g_iLigSpr = precache_model("sprites/lightning.spr");
    194.     g_iEffSpr = precache_model("sprites/ef_buffak_hit.spr");
    195.     g_iEff2Spr = precache_model("sprites/muzzleflash67.spr");
    196. }
    197.  
    198. public plugin_natives()
    199. {
    200.     register_native("ze_give_stunrifle", "native_ze_give_stunrifle", 1)
    201. }
    202.  
    203. public native_ze_give_stunrifle(id)
    204. {
    205.     give(id)
    206. }
    207.  
    208. public HookSelect(iPlayer)
    209. {
    210.     engclient_cmd(iPlayer, WEAPON_OLD);
    211. }
    212.  
    213. public give(id)
    214. {
    215.     give_weapon_stunrifle(id)
    216. }
    217.  
    218. public give_weapon_stunrifle(iPlayer)
    219. {
    220.     static iEnt; iEnt = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E);
    221.     if(iEnt <= 0) return 0;
    222.     set_pev(iEnt, pev_spawnflags, SF_NORESPAWN);
    223.     set_pev(iEnt, pev_impulse, WEAPON_KEY);
    224.     ExecuteHam(Ham_Spawn, iEnt);
    225.     UTIL_DropWeapon(iPlayer, 1);
    226.     if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iEnt)) {
    227.         engfunc(EngFunc_RemoveEntity, iEnt);
    228.         return 0;
    229.     }
    230.     ExecuteHamB(Ham_Item_AttachToPlayer, iEnt, iPlayer);
    231.     set_pdata_int(iEnt, m_iClip, WEAPON_CLIP, 4);
    232.     new iAmmoType = m_rgAmmo +get_pdata_int(iEnt, m_iPrimaryAmmoType, 4);
    233.     if(get_pdata_int(iPlayer, m_rgAmmo, 5) < WEAPON_AMMO)
    234.     set_pdata_int(iPlayer, iAmmoType, WEAPON_AMMO, 5);
    235.     emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    236.     g_iStoredEnergy[iPlayer] = 0;
    237.     g_bHasStunRifle[iPlayer] = true;
    238.     set_task(get_pcvar_float(g_pCvarBarFillTime), "RechargeTask", iPlayer, _, _, "a", 6)
    239.     return 1;
    240. }
    241.  
    242. public plugin_natives()
    243. {
    244.     register_native(WEAPON_NATIVE, "give_weapon_stunrifle", 1);
    245. }
    246.  
    247. public fw_Item_Deploy_Post(iItem)
    248. {
    249.     if(!CustomItem(iItem)) return;
    250.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    251.  
    252.     set_pev_string(iPlayer, pev_viewmodel2, g_AllocString_V);
    253.     set_pev_string(iPlayer, pev_weaponmodel2, g_AllocString_P);
    254.    
    255.     if (g_iStoredEnergy[iPlayer] == 0)
    256.     {
    257.         // Draw A
    258.         UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_A);
    259.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    260.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_A, 5);
    261.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_A, 4);
    262.     }
    263.     else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
    264.     {
    265.         // Draw B
    266.         UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_B);
    267.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    268.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_B, 5);
    269.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_B, 4);
    270.     }
    271.     else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
    272.     {
    273.         // Draw C
    274.         UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW_C);
    275.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    276.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME_C, 5);
    277.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME_C, 4);
    278.     }
    279. }
    280.  
    281. public fw_Item_PostFrame(iItem)
    282. {
    283.     if(!CustomItem(iItem)) return HAM_IGNORED;
    284.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    285.     if(get_pdata_int(iItem, m_fInReload, 4) == 1) {
    286.         static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
    287.         static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
    288.         static iAmmo; iAmmo = get_pdata_int(iPlayer, iAmmoType, 5);
    289.         static j; j = min(WEAPON_CLIP - iClip, iAmmo);
    290.         set_pdata_int(iItem, m_iClip, iClip+j, 4);
    291.         set_pdata_int(iPlayer, iAmmoType, iAmmo-j, 5);
    292.         set_pdata_int(iItem, m_fInReload, 0, 4);
    293.     }
    294.     else switch(get_pdata_int(iItem, m_iWeaponState, 4) ) {
    295.         case 0: {
    296.             if(get_pdata_float(iItem, m_flNextSecondaryAttack, 4) <= 0.0)
    297.             if(pev(iPlayer, pev_button) & IN_ATTACK2) {
    298.                 set_pdata_int(iPlayer, m_iFOV, get_pdata_int(iPlayer, m_iFOV, 5) == 90 ? 60 : 90);
    299.                 set_pdata_float(iItem, m_flNextSecondaryAttack, 0.3, 4);
    300.             }
    301.         }
    302.     }
    303.    
    304.     return HAM_IGNORED;
    305. }
    306.  
    307. public fw_Item_AddToPlayer_Post(iItem, iPlayer)
    308. {
    309.     switch(pev(iItem, pev_impulse)) {
    310.         case WEAPON_KEY: {
    311.         s_weaponlist(iPlayer, true);
    312.         g_bHasStunRifle[iPlayer] = true;
    313.        
    314.         if (g_iStoredEnergy[iPlayer] < 6)
    315.         {
    316.             set_task(101/30.0, "OnReloadFinished", iPlayer);
    317.         }
    318.         else if (g_iStoredEnergy[iPlayer] == 6)
    319.         {
    320.             client_print(iPlayer, print_center, "Your Stun Rifle is fully charged!")
    321.         }
    322.         }
    323.         case 0: s_weaponlist(iPlayer, false);
    324.     }
    325. }
    326.  
    327. public ze_user_infected(infected)
    328. {
    329.     if (g_bHasStunRifle[infected])
    330.     {
    331.         g_bHasStunRifle[infected] = false
    332.         g_iStoredEnergy[infected] = 0;
    333.     }
    334. }
    335.  
    336. public ze_user_humanized(id)
    337. {
    338.     g_bHasStunRifle[id] = false
    339.     g_iStoredEnergy[id] = 0;
    340. }
    341.  
    342. public fw_Weapon_Reload(iItem)
    343. {
    344.     if(!CustomItem(iItem)) return HAM_IGNORED;
    345.     static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
    346.     if(iClip >= WEAPON_CLIP) return HAM_SUPERCEDE;
    347.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    348.     static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
    349.     if(get_pdata_int(iPlayer, iAmmoType, 5) <= 0) return HAM_SUPERCEDE
    350.     if(get_pdata_int(iPlayer, m_iFOV, 5) != 90) set_pdata_int(iPlayer, m_iFOV, 90, 5);
    351.  
    352.     set_pdata_int(iItem, m_iClip, 0, 4);
    353.     ExecuteHam(Ham_Weapon_Reload, iItem);
    354.     set_pdata_int(iItem, m_iClip, iClip, 4);
    355.  
    356.     set_pdata_int(iItem, m_fInReload, 1, 4);
    357.    
    358.     g_bReloading[iPlayer] = true;
    359.     set_task(3.0, "AttackTask", iPlayer+444)
    360.  
    361.     if (g_iStoredEnergy[iPlayer] == 0)
    362.     {
    363.         // Reload A
    364.         set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_A, 4);
    365.         set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_A, 4);
    366.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_A, 4);
    367.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_A, 5);
    368.        
    369.         UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_A);
    370.        
    371.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    372.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[10], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    373.     }
    374.     else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
    375.     {
    376.         // Reload B
    377.         set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_B, 4);
    378.         set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_B, 4);
    379.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_B, 4);
    380.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_B, 5);
    381.        
    382.         UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_B);
    383.        
    384.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    385.        
    386.         if (notEmpty(iPlayer))
    387.         {
    388.             emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[11], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    389.         }
    390.     }
    391.     else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
    392.     {
    393.         // Reload C
    394.         set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME_C, 4);
    395.         set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME_C, 4);
    396.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME_C, 4);
    397.         set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME_C, 5);
    398.        
    399.         UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD_C);
    400.        
    401.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[6], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    402.        
    403.         if (notEmpty(iPlayer))
    404.         {
    405.             emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[11], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    406.         }
    407.     }
    408.    
    409.     // Set task to recharge the battary
    410.     remove_task(iPlayer)
    411.     set_task(101/30.0, "OnReloadFinished", iPlayer)
    412.  
    413.     return HAM_SUPERCEDE;
    414. }
    415.  
    416. public AttackTask(taskid)
    417. {
    418.     g_bReloading[taskid - 444] = false;
    419.        
    420.     // After reload reset the stored energy
    421.     g_iStoredEnergy[taskid - 444] = 0;
    422.    
    423.     g_iAppearTimes[taskid - 444] = 0;
    424. }
    425.  
    426. public client_PreThink(id)
    427. {
    428.     if (g_bReloading[id] && g_bHasStunRifle[id] && (get_user_weapon(id) == CSW_AK47))
    429.     {
    430.         if (g_iStoredEnergy[id] == 0)
    431.         {
    432.             // Reload A
    433.            
    434.         }
    435.         else if (g_iStoredEnergy[id] > 0 && g_iStoredEnergy[id] <= 3)
    436.         {
    437.             // Reload B
    438.             static Float:flOrigin[3]
    439.             pev(id, pev_origin, flOrigin)
    440.             new iVictim = -1;
    441.            
    442.             while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
    443.             {
    444.                 if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
    445.                     continue
    446.                
    447.                 static Float:flVecOrigin[3];
    448.                 pev(iVictim, pev_origin, flVecOrigin);
    449.                    
    450.                 ElectricBeam(id, flVecOrigin);
    451.                    
    452.                 ExecuteHam(Ham_TakeDamage, iVictim, id, id, get_pcvar_float(g_pCvarElecDmg) * g_iStoredEnergy[id], DMG_SLASH);
    453.            
    454.                 fm_set_user_rendering(iVictim, kRenderFxGlowShell, 51, 51, 225, kRenderNormal, 10);
    455.                 set_task(101/30.0, "Delete_Glow", iVictim+4444);
    456.             }
    457.         }
    458.         else if (g_iStoredEnergy[id] > 3 && g_iStoredEnergy[id] <= 6)
    459.         {
    460.             // Reload C
    461.             static Float:flOrigin[3]
    462.             pev(id, pev_origin, flOrigin)
    463.             new iVictim = -1;
    464.            
    465.             while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
    466.             {
    467.                 if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
    468.                     continue
    469.                
    470.                 static Float:flVecOrigin[3]
    471.                 pev(iVictim, pev_origin, flVecOrigin)
    472.                
    473.                 ElectricBeam(id, flVecOrigin)
    474.                
    475.                 ExecuteHam(Ham_TakeDamage, iVictim, id, id, get_pcvar_float(g_pCvarElecDmg) * g_iStoredEnergy[id], DMG_SLASH);
    476.                
    477.                 fm_set_user_rendering(iVictim, kRenderFxGlowShell, 51, 51, 225, kRenderNormal, 10);
    478.                 set_task(101/30.0, "Delete_Glow", iVictim+4444);
    479.             }
    480.         }
    481.     }
    482. }
    483.  
    484. public Delete_Glow(taskid)
    485. {
    486.     new id = taskid - 4444;
    487.     fm_set_user_rendering(id);
    488. }
    489.  
    490. public OnReloadFinished(id)
    491. {
    492.     remove_task(id)
    493.     set_task(get_pcvar_float(g_pCvarBarFillTime), "RechargeTask", id, _, _, "a", 6)
    494. }
    495.  
    496. public RechargeTask(id)
    497. {
    498.     if (!g_bHasStunRifle[id])
    499.         return
    500.    
    501.     // Increase one bar every x time
    502.     g_iStoredEnergy[id]++
    503.    
    504.     new szBars[100];
    505.    
    506.     switch(g_iStoredEnergy[id])
    507.     {
    508.         case 1:
    509.         {
    510.             szBars = "[ |           ]";
    511.         }
    512.         case 2:
    513.         {
    514.             szBars = "[ | |         ]";
    515.         }
    516.         case 3:
    517.         {
    518.             szBars = "[ | | |       ]";
    519.         }
    520.         case 4:
    521.         {
    522.             szBars = "[ | | | |     ]";
    523.         }
    524.         case 5:
    525.         {
    526.             szBars = "[ | | | | |   ]";
    527.         }
    528.         case 6:
    529.         {
    530.             szBars = "[ | | | | | | ]";
    531.         }
    532.     }
    533.    
    534.     set_dhudmessage(51, 153, 255, -1.0, -0.16, 0, 0.0, get_pcvar_float(g_pCvarBarFillTime) - 0.2)
    535.     show_dhudmessage(id, "Stun Rifle Battary: %s", szBars)
    536.    
    537.     if (g_iStoredEnergy[id] == 6)
    538.     {
    539.         client_print(id, print_center, "Your Stun Rifle is fully charged!")
    540.         remove_task(id)
    541.     }
    542. }
    543.  
    544. public fw_Weapon_WeaponIdle(iItem)
    545. {
    546.     if(!CustomItem(iItem) || get_pdata_float(iItem, m_flTimeWeaponIdle, 4) > 0.0) return HAM_IGNORED;
    547.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    548.  
    549.     if (g_iStoredEnergy[iPlayer] == 0)
    550.     {
    551.         // Idle A
    552.         UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_A);
    553.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_A, 4);
    554.        
    555.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[7], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    556.     }
    557.     else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
    558.     {
    559.         // Idle B
    560.         UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_B);
    561.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_B, 4);
    562.        
    563.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[8], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    564.     }
    565.     else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
    566.     {
    567.         // Idle C
    568.         UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE_C);
    569.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME_C, 4);
    570.        
    571.         emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[9], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    572.     }
    573.    
    574.     return HAM_SUPERCEDE;
    575. }
    576.  
    577. public fw_Weapon_PrimaryAttack(iItem)
    578. {
    579.     if(!CustomItem(iItem)) return HAM_IGNORED;
    580.     static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
    581.     static iFOV; iFOV = (get_pdata_int(iPlayer, m_iFOV, 5) != 90);
    582.     if(get_pdata_int(iItem, m_iClip, 4) == 0) {
    583.         ExecuteHam(Ham_Weapon_PlayEmptySound, iItem);
    584.         set_pdata_float(iItem, m_flNextPrimaryAttack, 0.2, 4);
    585.         return HAM_SUPERCEDE;
    586.     }
    587.     static fw_TraceLine; fw_TraceLine = register_forward(FM_TraceLine, "fw_TraceLine_Post", 1);
    588.     fm_ham_hook(true);
    589.     state FireBullets: Enabled;
    590.     ExecuteHam(Ham_Weapon_PrimaryAttack, iItem);
    591.     state FireBullets: Disabled;
    592.     unregister_forward(FM_TraceLine, fw_TraceLine, 1);
    593.     fm_ham_hook(false);
    594.     static Float:vecPunchangle[3];
    595.  
    596.     pev(iPlayer, pev_punchangle, vecPunchangle);
    597.     vecPunchangle[0] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
    598.     vecPunchangle[1] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
    599.     vecPunchangle[2] *= iFOV ? WEAPON_RECOIL_EX : WEAPON_RECOIL;
    600.     set_pev(iPlayer, pev_punchangle, vecPunchangle);
    601.  
    602.     emit_sound(iPlayer, CHAN_WEAPON, g_szSounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    603.    
    604.     if (g_iStoredEnergy[iPlayer] == 0)
    605.     {
    606.         // Idle A
    607.         UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_A);
    608.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_A, 4);
    609.     }
    610.     else if (g_iStoredEnergy[iPlayer] > 0 && g_iStoredEnergy[iPlayer] <= 3)
    611.     {
    612.         // Idle B
    613.         UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_B);
    614.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_B, 4);
    615.     }
    616.     else if (g_iStoredEnergy[iPlayer] > 3 && g_iStoredEnergy[iPlayer] <= 6)
    617.     {
    618.         // Idle C
    619.         UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK_C);
    620.         set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME_C, 4);
    621.     }
    622.    
    623.     Make_Muzzleflash(iPlayer)
    624.  
    625.     set_pdata_float(iItem, m_flNextPrimaryAttack, iFOV ? WEAPON_RATE_EX : WEAPON_RATE, 4);
    626.  
    627.     return HAM_SUPERCEDE;
    628. }
    629.  
    630. public fw_PlaybackEvent() <FireBullets: Enabled> { return FMRES_SUPERCEDE; }
    631. public fw_PlaybackEvent() <FireBullets: Disabled> { return FMRES_IGNORED; }
    632. public fw_PlaybackEvent() <> { return FMRES_IGNORED; }
    633. public fw_TraceAttack(iVictim, iAttacker, Float:flDamage) {
    634.     if(!is_user_connected(iAttacker)) return;
    635.     static iItem; iItem = get_pdata_cbase(iAttacker, m_pActiveItem, 5);
    636.     static iFOV; iFOV = (get_pdata_int(iAttacker, m_iFOV, 5) != 90);
    637.     static Float: flWeaponDamage; flWeaponDamage = (iFOV ? WEAPON_DAMAGE_EX : WEAPON_DAMAGE);
    638.     if(iItem <= 0 || !CustomItem(iItem)) return;
    639.         SetHamParamFloat(3, flDamage * flWeaponDamage);
    640. }
    641.  
    642. public fw_UpdateClientData_Post(iPlayer, SendWeapons, CD_Handle)
    643. {
    644.     if(get_cd(CD_Handle, CD_DeadFlag) != DEAD_NO) return;
    645.     static iItem; iItem = get_pdata_cbase(iPlayer, m_pActiveItem, 5);
    646.     if(iItem <= 0 || !CustomItem(iItem)) return;
    647.     set_cd(CD_Handle, CD_flNextAttack, 999999.0);
    648. }
    649.  
    650. public fw_SetModel(iEnt)
    651. {
    652.     static i, szClassname[32], iItem;
    653.     pev(iEnt, pev_classname, szClassname, 31);
    654.     if(!equal(szClassname, "weaponbox")) return FMRES_IGNORED;
    655.     for(i = 0; i < 6; i++) {
    656.         iItem = get_pdata_cbase(iEnt, m_rgpPlayerItems_CWeaponBox + i, 4);
    657.         if(iItem > 0 && CustomItem(iItem)) {
    658.             engfunc(EngFunc_SetModel, iEnt, WEAPON_MODEL_W);
    659.             set_pev(iEnt, pev_body, WEAPON_BODY);
    660.             new iPlayer = pev(iEnt, pev_owner);
    661.             g_bHasStunRifle[iPlayer] = false;
    662.             remove_task(iPlayer)
    663.             return FMRES_SUPERCEDE;
    664.         }
    665.     }
    666.     return FMRES_IGNORED;
    667. }
    668.  
    669. public fw_TraceLine_Post(const Float:flOrigin1[3], const Float:flOrigin2[3], iFrag, iIgnore, tr)
    670. {
    671.     if(iFrag & IGNORE_MONSTERS) return FMRES_IGNORED;
    672.     static pHit; pHit = get_tr2(tr, TR_pHit);
    673.     static Float:flvecEndPos[3]; get_tr2(tr, TR_vecEndPos, flvecEndPos);
    674.     if(pHit > 0) {
    675.         if(pev(pHit, pev_solid) != SOLID_BSP) return FMRES_IGNORED;
    676.     }
    677.     engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, flvecEndPos, 0);
    678.     write_byte(TE_GUNSHOTDECAL);
    679.     engfunc(EngFunc_WriteCoord, flvecEndPos[0]);
    680.     engfunc(EngFunc_WriteCoord, flvecEndPos[1]);
    681.     engfunc(EngFunc_WriteCoord, flvecEndPos[2]);
    682.     write_short(pHit > 0 ? pHit : 0);
    683.     write_byte(random_num(41, 45));
    684.     message_end();
    685.  
    686.     return FMRES_IGNORED;
    687. }
    688.  
    689. public fm_ham_hook(bool:on) {
    690.     if(on) {
    691.         EnableHamForward(g_fw_TraceAttack[0]);
    692.         EnableHamForward(g_fw_TraceAttack[1]);
    693.         EnableHamForward(g_fw_TraceAttack[2]);
    694.         EnableHamForward(g_fw_TraceAttack[3]);
    695.     }
    696.     else {
    697.         DisableHamForward(g_fw_TraceAttack[0]);
    698.         DisableHamForward(g_fw_TraceAttack[1]);
    699.         DisableHamForward(g_fw_TraceAttack[2]);
    700.         DisableHamForward(g_fw_TraceAttack[3]);
    701.     }
    702. }
    703.  
    704. stock UTIL_SendWeaponAnim(iPlayer, iAnim)
    705. {
    706.     set_pev(iPlayer, pev_weaponanim, iAnim);
    707.  
    708.     message_begin(MSG_ONE, SVC_WEAPONANIM, _, iPlayer);
    709.     write_byte(iAnim);
    710.     write_byte(0);
    711.     message_end();
    712. }
    713.  
    714. stock UTIL_DropWeapon(iPlayer, iSlot) {
    715.     static iEntity, iNext, szWeaponName[32];
    716.     iEntity = get_pdata_cbase(iPlayer, m_rpgPlayerItems + iSlot, 5);
    717.     if(iEntity > 0) {      
    718.         do {
    719.             iNext = get_pdata_cbase(iEntity, m_pNext, 4)
    720.             if(get_weaponname(get_pdata_int(iEntity, m_iId, 4), szWeaponName, 31)) {  
    721.                 engclient_cmd(iPlayer, "drop", szWeaponName);
    722.             }
    723.         } while(( iEntity = iNext) > 0);
    724.     }
    725. }
    726.  
    727. stock s_weaponlist(iPlayer, bool:on)
    728. {
    729.     message_begin(MSG_ONE, g_iMsgID_Weaponlist, {0,0,0}, iPlayer);
    730.     write_string(on ? WEAPON_NEW : WEAPON_OLD);
    731.     write_byte(iWeaponList[0]);
    732.     write_byte(on ? WEAPON_AMMO : iWeaponList[1]);
    733.     write_byte(iWeaponList[2]);
    734.     write_byte(iWeaponList[3]);
    735.     write_byte(iWeaponList[4]);
    736.     write_byte(iWeaponList[5]);
    737.     write_byte(iWeaponList[6]);
    738.     write_byte(iWeaponList[7]);
    739.     message_end();
    740. }
    741.  
    742. stock ElectricBeam(id, Float:flOrigin[3])
    743. {
    744.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    745.     write_byte(TE_BEAMENTPOINT)
    746.     write_short(id | 0x1000)
    747.     engfunc(EngFunc_WriteCoord, flOrigin[0])
    748.     engfunc(EngFunc_WriteCoord, flOrigin[1])
    749.     engfunc(EngFunc_WriteCoord, flOrigin[2])
    750.     write_short(g_iLigSpr)
    751.     write_byte(1); // framestart
    752.     write_byte(100); // framerate - 5
    753.     write_byte(1) // life - 30
    754.     write_byte(30); // width
    755.     write_byte(random_num(0, 10)); // noise
    756.     write_byte(51); // r, g, b
    757.     write_byte(51); // r, g, b
    758.     write_byte(255); // r, g, b
    759.     write_byte(200); // brightness
    760.     write_byte(200); // speed
    761.     message_end()
    762.    
    763.     if (g_iAppearTimes[id] >= 2)
    764.         return
    765.    
    766.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    767.     write_byte(TE_EXPLOSION);
    768.     engfunc(EngFunc_WriteCoord, flOrigin[0]);
    769.     engfunc(EngFunc_WriteCoord, flOrigin[1]);
    770.     engfunc(EngFunc_WriteCoord, flOrigin[2]);
    771.     write_short(g_iEffSpr);
    772.     write_byte(10);
    773.     write_byte(10);
    774.     write_byte(TE_EXPLFLAG_NOSOUND|TE_EXPLFLAG_NOPARTICLES|TE_EXPLFLAG_NODLIGHTS);
    775.     message_end();
    776.    
    777.     g_iAppearTimes[id]++
    778. }
    779.  
    780. stock notEmpty(id)
    781. {
    782.     static Float:flOrigin[3]
    783.     pev(id, pev_origin, flOrigin)
    784.     new iVictim = -1;
    785.            
    786.     while ((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, flOrigin, get_pcvar_float(g_pCvarRadius))) != 0)
    787.     {
    788.         if (!is_user_alive(iVictim) || !ze_is_user_zombie(iVictim))
    789.             continue
    790.        
    791.         return true;
    792.     }
    793.    
    794.     return false;
    795. }
    796.  
    797. public Make_Muzzleflash(id)
    798. {
    799.     static Float:Origin[3], TE_FLAG
    800.     get_position(id, 32.0, 6.0, -15.0, Origin)
    801.    
    802.     TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
    803.     TE_FLAG |= TE_EXPLFLAG_NOSOUND
    804.     TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
    805.    
    806.     engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, Origin, id)
    807.     write_byte(TE_EXPLOSION)
    808.     engfunc(EngFunc_WriteCoord, Origin[0])
    809.     engfunc(EngFunc_WriteCoord, Origin[1])
    810.     engfunc(EngFunc_WriteCoord, Origin[2])
    811.     write_short(g_iEff2Spr)
    812.     write_byte(2)
    813.     write_byte(30)
    814.     write_byte(TE_FLAG)
    815.     message_end()
    816. }
    817.  
    818. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
    819. {
    820.     static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    821.    
    822.     pev(id, pev_origin, vOrigin)
    823.     pev(id, pev_view_ofs, vUp) //for player
    824.     xs_vec_add(vOrigin, vUp, vOrigin)
    825.     pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
    826.    
    827.     angle_vector(vAngle,ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
    828.     angle_vector(vAngle,ANGLEVECTOR_RIGHT, vRight)
    829.     angle_vector(vAngle,ANGLEVECTOR_UP, vUp)
    830.    
    831.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
    832.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
    833.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
    834. }
Bazzoka:
    1. #include <zombie_escape>
    2.  
    3. static const plugin[] = "[ZE] Extra Item: Bazooka";
    4.  
    5. static const mrocket[] = "models/zombie_escape/zm_bazooka_missile.mdl";
    6. static const mrpg_w[] = "models/zombie_escape/w_zm_bazooka.mdl";
    7. static const mrpg_v[] = "models/zombie_escape/v_zm_bazooka.mdl";
    8. static const mrpg_p[] = "models/zombie_escape/p_zm_bazooka.mdl";
    9. static const sfire[] = "weapons/rocketfire1.wav";
    10. static const sfly[] = "weapons/nuke_fly.wav";
    11. static const shit[] = "weapons/mortarhit.wav";
    12. static const spickup[] = "items/gunpickup2.wav";
    13.  
    14. new gmsg_screenshake, gmsg_death, gmsg_damage, pcvar_delay, pcvar_maxdmg, pcvar_radius, pcvar_map;
    15. new rocketsmoke, explosion, bazsmoke, white;
    16. new bool:has_baz[33], bool:CanShoot[33];
    17. new dmgcount[33], pcvar_dmgforpacks, pcvar_award;
    18.  
    19. public plugin_init()
    20. {
    21.     register_plugin(plugin, "0.6", "Random1");
    22.    
    23.     pcvar_delay = register_cvar("zp_baz_delay", "10.0");
    24.     pcvar_maxdmg = register_cvar("zp_baz_dmg", "720");
    25.     pcvar_radius = register_cvar("zp_baz_radius", "750");
    26.     pcvar_map = register_cvar("zp_baz_map", "0");
    27.     pcvar_dmgforpacks = get_cvar_pointer("zp_human_damage_reward");
    28.     pcvar_award = register_cvar("zp_baz_awardpacks", "1");
    29.    
    30.     if ( pcvar_dmgforpacks == 0 ) {
    31.         set_pcvar_num(pcvar_award, 0);  //if we couldn't read the dmg cvar from zp then set a stop state on dmg reward
    32.         log_amx("[%s] error reading zp_human_damage_reward cvar from zombie plague, turning award for damage off", plugin);
    33.     }
    34.    
    35.     register_concmd("zp_bazooka", "give_bazooka", ADMIN_KICK, "<name/@all> gives a bazooka to the spcified target");
    36.     register_event("CurWeapon","switch_to_knife","be","1=1","2=29");
    37.     register_event("HLTV", "event_HLTV", "a", "1=0", "2=0") // New Round
    38.     register_clcmd("drop", "drop_call");
    39.    
    40.     //supports 2 methods of firing, attacking while holding knife and a bind
    41.     register_clcmd("baz_fire", "fire_call");
    42.     register_forward(FM_PlayerPreThink, "fw_prethink");
    43.    
    44.     register_forward(FM_Touch, "fw_touch");
    45.        
    46.     gmsg_screenshake = get_user_msgid("ScreenShake");
    47.     gmsg_death = get_user_msgid("DeathMsg");
    48.     gmsg_damage = get_user_msgid("Damage");
    49. }
    50.  
    51. public plugin_natives()
    52. {
    53.     register_native("ze_give_bazzoka", "native_ze_give_bazzoka", 1)
    54. }
    55.  
    56. public native_ze_give_bazzoka(id)
    57. {
    58.     has_baz[id] = true;
    59.     CanShoot[id] = true;
    60. }
    61.  
    62. public event_HLTV()
    63. {
    64.     //remove entities regardless of cvar
    65.     new rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp");
    66.     while( rpg_temp > 0) {
    67.         engfunc(EngFunc_RemoveEntity, rpg_temp);
    68.         rpg_temp = engfunc(EngFunc_FindEntityByString, -1, "classname", "rpg_temp");
    69.     }
    70.    
    71.     if ( get_pcvar_num(pcvar_map) ) return;
    72.    
    73.     for( new id = 1; id <= 32; id++ )
    74.         has_baz[id] = false;
    75. }
    76.  
    77. public give_bazooka(id,level,cid)
    78. {
    79.     if (!cmd_access(id,level,cid,1)) {
    80.         console_print(id,"You have no access to that command");
    81.         return;
    82.     }
    83.     if (read_argc() > 2) {
    84.         console_print(id,"Too many arguments supplied.");
    85.         return;
    86.     }
    87.     new arg1[32];
    88.     read_argv(1, arg1, sizeof(arg1) - 1);
    89.     new player = cmd_target(id, arg1, 10);
    90.     if ( !player ) {
    91.         if ( arg1[0] == '@' ) {
    92.             for ( new i = 1; i <= 32; i++ ) {
    93.                 if ( is_user_connected(i) && !has_baz[i] && !ze_is_user_zombie(i) ) {
    94.                     has_baz[i] = true;
    95.                     CanShoot[i] = true;
    96.                     client_print(i, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay));
    97.                 }
    98.             }
    99.         } else {
    100.             client_print(id, print_chat, "No Such Player/Team");
    101.             return;
    102.         }
    103.     } else if ( !has_baz[player] && !ze_is_user_zombie(player) ) {
    104.         has_baz[player] = true;
    105.         CanShoot[player] = true;
    106.         client_print(player, print_chat, "[ZP BAZ] You now have a bazooka, attack while holding knife(will take %2.1f seconds to reload", get_pcvar_float(pcvar_delay));
    107.     }
    108. }
    109.  
    110. public ze_user_infected(id, infector)
    111.     if ( has_baz[id] )
    112.         drop_rpg_temp(id);
    113.  
    114. public plugin_precache()
    115. {
    116.     precache_model(mrocket);  
    117.  
    118.     precache_model(mrpg_w);
    119.     precache_model(mrpg_v);
    120.     precache_model(mrpg_p);
    121.  
    122.     precache_sound(sfire);
    123.     precache_sound(sfly);
    124.     precache_sound(shit);
    125.     precache_sound(spickup);
    126.    
    127.     rocketsmoke = precache_model("sprites/smoke.spr");
    128.     explosion = precache_model("sprites/fexplo.spr");
    129.     bazsmoke  = precache_model("sprites/steam1.spr");
    130.     white = precache_model("sprites/white.spr");
    131. }
    132.  
    133. public switch_to_knife(id)
    134. {
    135.     if ( !is_user_alive(id) ) return;
    136.    
    137.     if ( has_baz[id] && CanShoot[id] )
    138.     {
    139.         set_pev(id, pev_viewmodel2, mrpg_v);
    140.         set_pev(id, pev_weaponmodel2, mrpg_p);
    141.     }
    142. }
    143.  
    144. public fw_prethink(id)
    145. {
    146.     static button;
    147.     button = pev(id, pev_button);
    148.     if ( button & IN_ATTACK )
    149.         fire_call(id);
    150. }
    151. public fire_call(id)
    152. {
    153.     if ( !is_user_alive(id) || !has_baz[id] || !CanShoot[id] ) return;
    154.    
    155.     new weapon = get_user_weapon(id);
    156.     if ( weapon == CSW_KNIFE ) fire_rocket(id);
    157. }
    158.  
    159. fire_rocket(id) {
    160.     if ( !CanShoot[id] ) return;
    161.    
    162.     CanShoot[id] = false;
    163.     set_task(get_pcvar_float(pcvar_delay), "rpg_reload", id);
    164.     engclient_cmd(id, "weapon_knife");  //attempt to force model to reset
    165.  
    166.     new Float:StartOrigin[3], Float:Angle[3];
    167.     pev(id, pev_origin, StartOrigin);
    168.     pev(id, pev_angles, Angle);
    169.  
    170.     new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    171.     set_pev(ent, pev_classname, "rpgrocket");
    172.     engfunc(EngFunc_SetModel, ent, mrocket);
    173.     set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
    174.     set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});
    175.     engfunc(EngFunc_SetOrigin, ent, StartOrigin);
    176.     set_pev(ent, pev_angles, Angle);
    177.  
    178.  
    179.     set_pev(ent, pev_solid, 2);
    180.     set_pev(ent, pev_movetype, 5);
    181.     set_pev(ent, pev_owner, id);
    182.  
    183.     new Float:nVelocity[3];
    184.     velocity_by_aim(id, 1500, nVelocity);
    185.     set_pev(ent, pev_velocity, nVelocity);
    186.  
    187.     emit_sound(ent, CHAN_WEAPON, sfire, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    188.     emit_sound(ent, CHAN_VOICE, sfly, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    189.  
    190.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    191.     write_byte(22);
    192.     write_short(ent);
    193.     write_short(rocketsmoke);
    194.     write_byte(30);
    195.     write_byte(3);
    196.     write_byte(255);
    197.     write_byte(255);
    198.     write_byte(255);
    199.     write_byte(255);
    200.     message_end();
    201. }
    202. //---------------------------------------------------------------------------------------
    203. public rpg_reload(id)
    204. {
    205.     CanShoot[id] = true;
    206.     if ( get_user_weapon(id) == CSW_KNIFE ) switch_to_knife(id);    //sets our model
    207. }
    208.  
    209. //---------------------------------------------------------------------------------------
    210. public fw_touch(ent, touched)
    211. {
    212.     if ( !pev_valid(ent) ) return FMRES_IGNORED;
    213.     static entclass[32];
    214.     pev(ent, pev_classname, entclass, 31);
    215.     if ( equali(entclass, "rpg_temp") )
    216.     {
    217.         static touchclass[32];
    218.         pev(touched, pev_classname, touchclass, 31);
    219.         if ( !equali(touchclass, "player") ) return FMRES_IGNORED;
    220.        
    221.         if( !is_user_alive(touched) || ze_is_user_zombie(touched) ) return FMRES_IGNORED;
    222.            
    223.         emit_sound(touched, CHAN_VOICE, spickup, 1.0, ATTN_NORM, 0, PITCH_NORM);
    224.         has_baz[touched] = true;
    225.        
    226.         engfunc(EngFunc_RemoveEntity, ent);
    227.    
    228.         return FMRES_HANDLED;
    229.     }
    230.     else if ( equali(entclass, "rpgrocket") )
    231.     {
    232.         new Float:EndOrigin[3];
    233.         pev(ent, pev_origin, EndOrigin);
    234.         new NonFloatEndOrigin[3];
    235.         NonFloatEndOrigin[0] = floatround(EndOrigin[0]);
    236.         NonFloatEndOrigin[1] = floatround(EndOrigin[1]);
    237.         NonFloatEndOrigin[2] = floatround(EndOrigin[2]);
    238.    
    239.         emit_sound(ent, CHAN_WEAPON, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    240.         emit_sound(ent, CHAN_VOICE, shit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    241.    
    242.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    243.         write_byte(17);
    244.         write_coord(NonFloatEndOrigin[0]);
    245.         write_coord(NonFloatEndOrigin[1]);
    246.         write_coord(NonFloatEndOrigin[2] + 128);
    247.         write_short(explosion);
    248.         write_byte(60);
    249.         write_byte(255);
    250.         message_end();
    251.    
    252.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    253.         write_byte(5);
    254.         write_coord(NonFloatEndOrigin[0]);
    255.         write_coord(NonFloatEndOrigin[1]);
    256.         write_coord(NonFloatEndOrigin[2] + 256);
    257.         write_short(bazsmoke);
    258.         write_byte(125);
    259.         write_byte(5);
    260.         message_end();
    261.    
    262.         new maxdamage = get_pcvar_num(pcvar_maxdmg);
    263.         new damageradius = get_pcvar_num(pcvar_radius);
    264.    
    265.         new PlayerPos[3], distance, damage;
    266.         for (new i = 1; i <= 32; i++) {
    267.             if ( is_user_alive(i))
    268.                 {  
    269.                     new id = pev(ent, pev_owner)
    270.                     if ((ze_is_user_zombie(id)))
    271.                         continue;
    272.                        
    273.                     get_user_origin(i, PlayerPos);
    274.        
    275.                     distance = get_distance(PlayerPos, NonFloatEndOrigin);
    276.                     if (distance <= damageradius) {
    277.                     message_begin(MSG_ONE, gmsg_screenshake, {0,0,0}, i);
    278.                     write_short(1<<14);
    279.                     write_short(1<<14);
    280.                     write_short(1<<14);
    281.                     message_end();
    282.        
    283.                     damage = maxdamage - floatround(floatmul(float(maxdamage), floatdiv(float(distance), float(damageradius))));
    284.                     new attacker = pev(ent, pev_owner);
    285.        
    286.                     baz_damage(i, attacker, damage, "bazooka");
    287.                 }
    288.             }
    289.         }
    290.    
    291.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
    292.         write_byte(21);
    293.         write_coord(NonFloatEndOrigin[0]);
    294.         write_coord(NonFloatEndOrigin[1]);
    295.         write_coord(NonFloatEndOrigin[2]);
    296.         write_coord(NonFloatEndOrigin[0]);
    297.         write_coord(NonFloatEndOrigin[1]);
    298.         write_coord(NonFloatEndOrigin[2] + 320);
    299.         write_short(white);
    300.         write_byte(0);
    301.         write_byte(0);
    302.         write_byte(16);
    303.         write_byte(128);
    304.         write_byte(0);
    305.         write_byte(255);
    306.         write_byte(255);
    307.         write_byte(192);
    308.         write_byte(128);
    309.         write_byte(0);
    310.         message_end();
    311.    
    312.         engfunc(EngFunc_RemoveEntity, ent);
    313.        
    314.         return FMRES_HANDLED;
    315.     }
    316.     return FMRES_IGNORED;
    317. }
    318. //---------------------------------------------------------------------------------------
    319. public drop_call(id)
    320. {
    321.     if ( has_baz[id] && get_user_weapon(id) == CSW_KNIFE )
    322.     {
    323.         drop_rpg_temp(id);
    324.         return PLUGIN_HANDLED;  //attempt to block can't drop knife message
    325.     }
    326.     return PLUGIN_CONTINUE;
    327. }
    328.  
    329. drop_rpg_temp(id) {
    330.     new Float:fAim[3] , Float:fOrigin[3];
    331.     velocity_by_aim(id , 64 , fAim);
    332.     pev(id , pev_origin , fOrigin);
    333.  
    334.     fOrigin[0] += fAim[0];
    335.     fOrigin[1] += fAim[1];
    336.  
    337.     new rpg = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
    338.  
    339.     set_pev(rpg, pev_classname, "rpg_temp");
    340.     engfunc(EngFunc_SetModel, rpg, mrpg_w);
    341.  
    342.     set_pev(rpg, pev_mins, { -16.0, -16.0, -16.0 } );
    343.     set_pev(rpg, pev_maxs, { 16.0, 16.0, 16.0 } );
    344.  
    345.     set_pev(rpg , pev_solid , 1);
    346.     set_pev(rpg , pev_movetype , 6);
    347.  
    348.     engfunc(EngFunc_SetOrigin, rpg, fOrigin);
    349.  
    350.     has_baz[id] = false;
    351. }
    352. //---------------------------------------------------------------------------------------
    353. baz_damage(id, attacker, damage, weaponDescription[])
    354. {
    355.     if ( pev(id, pev_takedamage) == DAMAGE_NO ) return;
    356.     if ( damage <= 0 ) return;
    357.  
    358.     new userHealth = get_user_health(id);
    359.     if (userHealth - damage <= 0 ) {
    360.         dmgcount[attacker] += userHealth - damage;
    361.         set_msg_block(gmsg_death, BLOCK_SET);
    362.         ExecuteHamB(Ham_Killed, id, attacker, 2);
    363.         set_msg_block(gmsg_death, BLOCK_NOT);
    364.    
    365.        
    366.         message_begin(MSG_BROADCAST, gmsg_death);
    367.         write_byte(attacker);
    368.         write_byte(id);
    369.         write_byte(0);
    370.         write_string(weaponDescription);
    371.         message_end();
    372.        
    373.         set_pev(attacker, pev_frags, float(get_user_frags(attacker) + 1));
    374.            
    375.         new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10];
    376.    
    377.         get_user_name(attacker, kname, 31);
    378.         get_user_team(attacker, kteam, 9);
    379.         get_user_authid(attacker, kauthid, 31);
    380.      
    381.         get_user_name(id, vname, 31);
    382.         get_user_team(id, vteam, 9);
    383.         get_user_authid(id, vauthid, 31);
    384.            
    385.         log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
    386.         kname, get_user_userid(attacker), kauthid, kteam,
    387.         vname, get_user_userid(id), vauthid, vteam, weaponDescription);
    388.     }
    389.     else {
    390.         dmgcount[attacker] += damage;
    391.         new origin[3];
    392.         get_user_origin(id, origin);
    393.        
    394.         message_begin(MSG_ONE,gmsg_damage,{0,0,0},id);
    395.         write_byte(21);
    396.         write_byte(20);
    397.         write_long(DMG_BLAST);
    398.         write_coord(origin[0]);
    399.         write_coord(origin[1]);
    400.         write_coord(origin[2]);
    401.         message_end();
    402.        
    403.         set_pev(id, pev_health, pev(id, pev_health) - float(damage));
    404.     }
    405.     if ( !get_pcvar_num(pcvar_award) ) return;
    406.    
    407.     new breaker = get_pcvar_num(pcvar_dmgforpacks);
    408.     if ( dmgcount[attacker] > breaker )
    409.     {
    410.         new temp = dmgcount[attacker] / breaker
    411.         if ( temp * breaker > dmgcount[attacker] ) return; //should never be possible
    412.         dmgcount[attacker] -= temp * breaker;
    413.         ze_set_escape_coins( attacker, ze_get_escape_coins(attacker) + temp );
    414.     }
    415. }
Laser Minigun:
    1. #include <zombie_escape>
    2. #include <fakemeta_util>
    3.  
    4. #define PLUGIN  "[ZE] CSO Laser Minigun"
    5. #define VERSION "1.1"
    6. #define AUTHOR  "Asep Khairul Anam"
    7.  
    8. /**** Changelog 1.1 ****
    9. -> Fixed Bug Laserminigun Charge Mode
    10. -> Fixed Some Crash And Bug
    11. -> Rewrite Code
    12. -> Add To Mode Zombie Escape (Add Extra Items)
    13. *************************/
    14.  
    15.  
    16. #define weapon_name     "weapon_m249"
    17. #define weapon_new      "weapon_laserminigun"
    18. #define VIP_ACCESS ADMIN_LEVEL_H
    19.  
    20. #define ANIM_IDLE       0
    21. #define ANIM_SHOOT_1        7
    22. #define ANIM_SHOOT_2        8
    23. #define ANIM_RELOAD     5
    24. #define ANIM_DRAW       6
    25.  
    26. #define IDLE_TIME       1.7
    27. #define DRAW_TIME       2.53
    28. #define RELOAD_TIME     5.23
    29.  
    30. #define WEAPON_KEY      38591238491
    31. #define Is_CustomItem(%0)   (pev(%0,pev_impulse) == WEAPON_KEY)
    32.  
    33. #define MODEL_V         "models/zombie_escape/v_laserminigun.mdl"
    34. #define MODEL_W         "models/zombie_escape/w_laserminigun.mdl"
    35. #define MODEL_P         "models/zombie_escape/p_laserminiguna.mdl"
    36. #define MODEL_P_CHARGE      "models/zombie_escape/p_laserminigunb.mdl"
    37.  
    38. /******* CONFIGURATION LASERMINIGUN ********/
    39. #define RECOIL          0.4
    40. #define DAMAGE_LOW      0.8    
    41. #define DAMAGE_HIGH     1.5
    42. #define DAMAGE_EXTREME      2.0            
    43. #define WEAPON_SPEED        0.07
    44. #define DAMAGE_BALL_1       330.0
    45. #define DAMAGE_BALL_2       550.0
    46. #define DAMAGE_BALL_3       770.0
    47. #define EXPLODE_RADIUS      250.0
    48. #define WEAPON_CLIP     125
    49. #define WEAPON_BPAMMO       250
    50. #define SHOOTS_FOR_HIGH     20
    51. #define SHOOTS_FOR_EXTRREME SHOOTS_FOR_HIGH + 20
    52. /**** END OF CONFIGURATION LASERMINIGUN ****/
    53.  
    54. #define classname_ball  "laserminigun_ball"
    55.  
    56. #define Get_BitVar(%1,%2) (%1&(1<<(%2&31)))
    57. #define Set_BitVar(%1,%2) %1|=(1<<(%2&31))
    58. #define UnSet_BitVar(%1,%2) %1&=~(1<<(%2&31))
    59.  
    60. #define MUZZLEFLASH_1   "sprites/muzzleflash37.spr"
    61. #define MUZZLEFLASH_2   "sprites/muzzleflash38.spr"
    62. #define MUZZLEFLASH_3   "sprites/muzzleflash39.spr"
    63.  
    64. #define SPRITE_BALL_1   "sprites/laserminigun_charge_1.spr"
    65. #define SPRITE_BALL_2   "sprites/laserminigun_charge_2.spr"
    66. #define SPRITE_BALL_3   "sprites/laserminigun_charge_3.spr"
    67.  
    68. new gMaxPlayers, Msg_WeaponList, g_AllocString_V
    69. new g_ChargeState[512],g_ChargeShots[512], g_AllocString_P, g_AllocString_P_charge
    70. new Float:g_VecEndTrace[3], g_ChargeBall[33], g_ChargeForEntity[33]
    71. new g_ChargeBall1_Explosion, g_ChargeBall2_Explosion, g_ChargeBall3_Explosion
    72.  
    73. new g_Muzzleflash_Ent1,g_Muzzleflash1
    74. new g_Muzzleflash_Ent2,g_Muzzleflash2
    75. new g_Muzzleflash_Ent3,g_Muzzleflash3
    76.  
    77. new g_MuzzleflashBall_Ent1,g_MuzzleflashBall1
    78. new g_MuzzleflashBall_Ent2,g_MuzzleflashBall2
    79. new g_MuzzleflashBall_Ent3,g_MuzzleflashBall3
    80.  
    81. new const Weapon_Sounds[15][] =
    82. {
    83.     "weapons/laserminigun-1.wav",           // 0
    84.     "weapons/laserminigun-charge_start.wav",    // 1
    85.     "weapons/laserminigun-charge_loop.wav",     // 2
    86.     "weapons/laserminigun-charge_origin.wav",   // 3
    87.     "weapons/laserminigun-charge_shoot.wav",    // 4
    88.     "weapons/laserminigun_idle.wav",        // 5
    89.     "weapons/laserminigun_draw.wav",        // 6
    90.     "weapons/laserminigun_clipout2.wav",        // 7
    91.     "weapons/laserminigun_clipout1.wav",        // 8
    92.     "weapons/laserminigun_clipin2.wav",     // 9
    93.     "weapons/laserminigun_clipin1.wav",     // 10
    94.     "weapons/laserminigun_charge_end.wav",      // 11
    95.     "weapons/laserminigun_exp1.wav",        // 12
    96.     "weapons/laserminigun_exp2.wav",        // 13
    97.     "weapons/laserminigun_exp3.wav"         // 14
    98. }
    99.  
    100. enum
    101. {
    102.     STATE_LOW = 0,
    103.     STATE_HIGH,
    104.     STATE_EXTREME,
    105.     STATE_CHARGE
    106. }
    107.  
    108. public plugin_init()
    109. {
    110.     register_plugin(PLUGIN, VERSION, AUTHOR)
    111.    
    112.     RegisterHam(Ham_Item_Deploy,weapon_name,"HookHam_Weapon_Deploy",1)
    113.     RegisterHam(Ham_Item_AddToPlayer,weapon_name,"HookHam_Weapon_Add",1)
    114.     RegisterHam(Ham_Item_PostFrame,weapon_name,"HookHam_Weapon_Frame",0)
    115.    
    116.     RegisterHam(Ham_Weapon_Reload,weapon_name,"HookHam_Weapon_Reload",0)
    117.     RegisterHam(Ham_Weapon_WeaponIdle,weapon_name,"HookHam_Weapon_Idle",0)
    118.     RegisterHam(Ham_Weapon_PrimaryAttack,weapon_name,"HookHam_Weapon_PrimaryAttack",0)
    119.     RegisterHam(Ham_TakeDamage,"player","HookHam_TakeDamage")
    120.    
    121.     register_forward(FM_SetModel,"HookFm_SetModel")
    122.     register_forward(FM_AddToFullPack,"fw_AddToFullPack_post",1)
    123.     register_forward(FM_CheckVisibility,"fw_CheckVisibility")
    124.     register_forward(FM_UpdateClientData,"HookFm_UpdateClientData",1)
    125.    
    126.     register_touch("*", classname_ball, "BallTouch")
    127.    
    128.     gMaxPlayers = get_maxplayers()
    129.     Msg_WeaponList = get_user_msgid("WeaponList");
    130.    
    131.     register_clcmd(weapon_new,"hook_item")
    132. }
    133.  
    134. public plugin_precache()
    135. {
    136.     engfunc(EngFunc_PrecacheModel, MODEL_W)
    137.     engfunc(EngFunc_PrecacheModel, MODEL_V)
    138.     engfunc(EngFunc_PrecacheModel, MODEL_P)
    139.     engfunc(EngFunc_PrecacheModel, MODEL_P_CHARGE)
    140.    
    141.     engfunc(EngFunc_PrecacheModel, SPRITE_BALL_1)
    142.     engfunc(EngFunc_PrecacheModel, SPRITE_BALL_2)
    143.     engfunc(EngFunc_PrecacheModel, SPRITE_BALL_3)
    144.    
    145.     g_AllocString_V = engfunc(EngFunc_AllocString, MODEL_V)
    146.     g_AllocString_P = engfunc(EngFunc_AllocString, MODEL_P)
    147.     g_AllocString_P_charge = engfunc(EngFunc_AllocString, MODEL_P_CHARGE)
    148.    
    149.     for(new i = 0; i < sizeof(Weapon_Sounds); i++)
    150.         engfunc(EngFunc_PrecacheSound,Weapon_Sounds[i])
    151.    
    152.     g_ChargeBall1_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_1.spr")
    153.     g_ChargeBall2_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_2.spr")
    154.     g_ChargeBall3_Explosion = engfunc(EngFunc_PrecacheModel,"sprites/laserminigun_explode_3.spr")
    155.    
    156.    
    157.     g_Muzzleflash_Ent1 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    158.     precache_model(MUZZLEFLASH_1)
    159.     engfunc(EngFunc_SetModel,g_Muzzleflash_Ent1,MUZZLEFLASH_1)
    160.     set_pev(g_Muzzleflash_Ent1,pev_scale,0.1)
    161.     set_pev(g_Muzzleflash_Ent1,pev_rendermode,kRenderTransTexture)
    162.     set_pev(g_Muzzleflash_Ent1,pev_renderamt,0.0)
    163.    
    164.     g_Muzzleflash_Ent2 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    165.     precache_model(MUZZLEFLASH_2)
    166.     engfunc(EngFunc_SetModel,g_Muzzleflash_Ent2,MUZZLEFLASH_2)
    167.     set_pev(g_Muzzleflash_Ent2,pev_scale,0.1)
    168.     set_pev(g_Muzzleflash_Ent2,pev_rendermode,kRenderTransTexture)
    169.     set_pev(g_Muzzleflash_Ent2,pev_renderamt,0.0)
    170.    
    171.     g_Muzzleflash_Ent3 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    172.     precache_model(MUZZLEFLASH_3)
    173.     engfunc(EngFunc_SetModel,g_Muzzleflash_Ent3,MUZZLEFLASH_3)
    174.     set_pev(g_Muzzleflash_Ent3,pev_scale,0.1)
    175.     set_pev(g_Muzzleflash_Ent3,pev_rendermode,kRenderTransTexture)
    176.     set_pev(g_Muzzleflash_Ent3,pev_renderamt,0.0)
    177.    
    178.     g_MuzzleflashBall_Ent1 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    179.     engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent1,SPRITE_BALL_1)
    180.     set_pev(g_MuzzleflashBall_Ent1,pev_scale,0.1)
    181.     set_pev(g_MuzzleflashBall_Ent1,pev_rendermode,kRenderTransTexture)
    182.     set_pev(g_MuzzleflashBall_Ent1,pev_renderamt,0.0)
    183.     set_pev(g_MuzzleflashBall_Ent1,pev_fuser1, 0.1)
    184.    
    185.     g_MuzzleflashBall_Ent2 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    186.     engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent2,SPRITE_BALL_2)
    187.     set_pev(g_MuzzleflashBall_Ent2,pev_scale,0.2)
    188.     set_pev(g_MuzzleflashBall_Ent2,pev_rendermode,kRenderTransTexture)
    189.     set_pev(g_MuzzleflashBall_Ent2,pev_renderamt,0.0)
    190.     set_pev(g_MuzzleflashBall_Ent2,pev_fuser1, 0.2)
    191.    
    192.     g_MuzzleflashBall_Ent3 = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target"))
    193.     engfunc(EngFunc_SetModel,g_MuzzleflashBall_Ent3,SPRITE_BALL_3)
    194.     set_pev(g_MuzzleflashBall_Ent3,pev_scale,0.25)
    195.     set_pev(g_MuzzleflashBall_Ent3,pev_rendermode,kRenderTransTexture)
    196.     set_pev(g_MuzzleflashBall_Ent3,pev_renderamt,0.0)
    197.     set_pev(g_MuzzleflashBall_Ent3,pev_fuser1, 0.25)
    198.    
    199.     engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_1)
    200.     engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_2)
    201.     engfunc(EngFunc_PrecacheGeneric,MUZZLEFLASH_3)
    202.    
    203.     engfunc(EngFunc_PrecacheGeneric,"sprites/640hud133.spr")
    204.     engfunc(EngFunc_PrecacheGeneric,"sprites/640hud14.spr")
    205.     engfunc(EngFunc_PrecacheGeneric,"sprites/weapon_laserminigun.txt")
    206.    
    207.     register_forward(FM_Spawn,"HookFm_Spawn",0)
    208. }
    209.  
    210. public plugin_natives()
    211. {
    212.     register_native("give_laserminigun","get_item", 1)
    213. }
    214.  
    215. public ze_user_infected(id)
    216. {
    217.     remove_laserminigun(id)
    218. }
    219.  
    220. public ze_user_humanized(id)
    221. {
    222.     remove_laserminigun(id)
    223. }
    224.  
    225. public remove_laserminigun(id)
    226. {
    227.     g_ChargeBall[id] = 0
    228.     g_ChargeForEntity[id] = 0
    229.    
    230.     UnSet_BitVar(g_MuzzleflashBall1,id)
    231.     UnSet_BitVar(g_MuzzleflashBall2,id)
    232.     UnSet_BitVar(g_MuzzleflashBall3,id)
    233. }
    234.  
    235. public client_command(id)
    236. {
    237.     new Command[32];read_argv(0,Command,charsmax(Command));  
    238.     new ent = fm_find_ent_by_owner(-1,weapon_name,id)
    239.     if(equali(Command,"weapon_",7) && g_ChargeBall[id] && Is_CustomItem(ent) || equali(Command,"lastinv") && g_ChargeBall[id] && Is_CustomItem(ent))
    240.     {  
    241.         client_print(id,print_center,"Saat Ini Senjata Tidak Bisa Di Ganti")
    242.         return PLUGIN_HANDLED;
    243.     }
    244.     else if(equali(Command,"drop") && g_ChargeBall[id] && Is_CustomItem(ent))
    245.     {
    246.         client_print(id,print_center,"Saat Ini Senjata Tidak Bisa Di Drop")
    247.         return PLUGIN_HANDLED;
    248.     }
    249.     return PLUGIN_CONTINUE;
    250. }
    251.  
    252. public get_item(id)
    253. {  
    254.     UTIL_DropWeapon(id,1)
    255.     new weapon = make_weapon()
    256.    
    257.     if(weapon <= 0)
    258.         return
    259.    
    260.     if(!ExecuteHamB(Ham_AddPlayerItem,id,weapon))
    261.     {
    262.         engfunc(EngFunc_RemoveEntity,weapon)
    263.         return
    264.     }
    265.    
    266.     ExecuteHam(Ham_Item_AttachToPlayer,weapon,id)
    267.    
    268.     new ammotype = 376 + get_pdata_int(weapon,49,4)
    269.     new ammo = get_pdata_int(id,ammotype,5)
    270.    
    271.     if(ammo < WEAPON_BPAMMO)
    272.         set_pdata_int(id, ammotype, WEAPON_BPAMMO, 5)
    273.        
    274.     set_pdata_int(weapon, 51, WEAPON_CLIP, 4)
    275.     emit_sound(id,CHAN_ITEM,"items/gunpickup2.wav",VOL_NORM,ATTN_NORM,0,PITCH_NORM)
    276.    
    277.     g_ChargeState[weapon] = STATE_LOW
    278.     g_ChargeShots[weapon] = 0
    279.     g_ChargeBall[id] = 0
    280.     g_ChargeForEntity[id] = 0
    281.    
    282.     UnSet_BitVar(g_MuzzleflashBall1,id)
    283.     UnSet_BitVar(g_MuzzleflashBall2,id)
    284.     UnSet_BitVar(g_MuzzleflashBall3,id)
    285. }
    286.  
    287. public hook_item(id)
    288. {
    289.     engclient_cmd(id,weapon_name)
    290.     return PLUGIN_HANDLED
    291. }
    292.  
    293. public fw_AddToFullPack_post(esState,iE,ent,iHost,iHostFlags,iPlayer,pSet)
    294. {
    295.     if(ent == g_Muzzleflash_Ent1)
    296.     {
    297.         if(Get_BitVar(g_Muzzleflash1,iHost))
    298.         {
    299.             set_es(esState,ES_Frame,float(random_num(0,2)))
    300.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    301.             set_es(esState,ES_RenderAmt,255.0)
    302.             UnSet_BitVar(g_Muzzleflash1,iHost)
    303.         }  
    304.         set_es(esState,ES_Skin,iHost)
    305.         set_es(esState,ES_Body,1)
    306.         set_es(esState,ES_AimEnt,iHost)
    307.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    308.     }
    309.     if(ent == g_Muzzleflash_Ent2)
    310.     {
    311.         if(Get_BitVar(g_Muzzleflash2,iHost))
    312.         {
    313.             set_es(esState,ES_Frame,float(random_num(0,2)))
    314.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    315.             set_es(esState,ES_RenderAmt,255.0)
    316.             UnSet_BitVar(g_Muzzleflash2,iHost)
    317.         }  
    318.         set_es(esState,ES_Skin,iHost)
    319.         set_es(esState,ES_Body,1)
    320.         set_es(esState,ES_AimEnt,iHost)
    321.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    322.     }
    323.     if(ent == g_Muzzleflash_Ent3)
    324.     {
    325.         if(Get_BitVar(g_Muzzleflash3,iHost))
    326.         {
    327.             set_es(esState,ES_Frame,float(random_num(0,2)))
    328.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    329.             set_es(esState,ES_RenderAmt,255.0)
    330.             UnSet_BitVar(g_Muzzleflash3,iHost)
    331.         }  
    332.         set_es(esState,ES_Skin,iHost)
    333.         set_es(esState,ES_Body,1)
    334.         set_es(esState,ES_AimEnt,iHost)
    335.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    336.     }
    337.     if(ent == g_MuzzleflashBall_Ent1)
    338.     {
    339.         if(Get_BitVar(g_MuzzleflashBall1,iHost))
    340.         {
    341.             set_es(esState,ES_Frame,float(random_num(0,8)))
    342.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    343.             set_es(esState,ES_RenderAmt,240.0)
    344.         }  
    345.         set_es(esState,ES_Skin,iHost)
    346.         set_es(esState,ES_Body,1)
    347.         set_es(esState,ES_AimEnt,iHost)
    348.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    349.     }
    350.     if(ent == g_MuzzleflashBall_Ent2)
    351.     {
    352.         if(Get_BitVar(g_MuzzleflashBall2,iHost))
    353.         {
    354.             set_es(esState,ES_Frame,float(random_num(0,8)))
    355.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    356.             set_es(esState,ES_RenderAmt,240.0)
    357.         }  
    358.         set_es(esState,ES_Skin,iHost)
    359.         set_es(esState,ES_Body,1)
    360.         set_es(esState,ES_AimEnt,iHost)
    361.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    362.     }
    363.     if(ent == g_MuzzleflashBall_Ent3)
    364.     {
    365.         if(Get_BitVar(g_MuzzleflashBall3,iHost))
    366.         {
    367.             set_es(esState,ES_Frame,float(random_num(0,8)))
    368.             set_es(esState,ES_RenderMode,kRenderTransAdd)
    369.             set_es(esState,ES_RenderAmt,240.0)
    370.         }  
    371.         set_es(esState,ES_Skin,iHost)
    372.         set_es(esState,ES_Body,1)
    373.         set_es(esState,ES_AimEnt,iHost)
    374.         set_es(esState,ES_MoveType,MOVETYPE_FOLLOW)
    375.     }
    376. }
    377.  
    378. public fw_CheckVisibility(entity,pSet)
    379. {
    380.     if(entity == g_Muzzleflash_Ent1 || entity == g_Muzzleflash_Ent2 || entity == g_Muzzleflash_Ent3)
    381.     {
    382.         forward_return(FMV_CELL,1)
    383.         return FMRES_SUPERCEDE
    384.     }
    385.     else if(entity == g_MuzzleflashBall_Ent1 || entity == g_MuzzleflashBall_Ent2 || entity == g_MuzzleflashBall_Ent3)
    386.     {
    387.         forward_return(FMV_CELL,1)
    388.         return FMRES_SUPERCEDE
    389.     }
    390.     return FMRES_IGNORED
    391. }
    392.  
    393. public HookHam_Weapon_Deploy(ent)
    394. {
    395.     if(!Is_CustomItem(ent))
    396.         return HAM_IGNORED
    397.        
    398.     static id
    399.     id = get_pdata_cbase(ent,41,4)
    400.  
    401.     set_pev_string(id,pev_viewmodel2, g_AllocString_V)
    402.     set_pev_string(id,pev_weaponmodel2, g_AllocString_P)
    403.    
    404.     set_pdata_float(ent,46,DRAW_TIME,4)
    405.     set_pdata_float(ent,47,DRAW_TIME,4)
    406.     set_pdata_float(ent,48,DRAW_TIME,4)
    407.     Play_WeaponAnim(id,ANIM_DRAW)
    408.     set_pdata_string(id,1968,"m249",-1,20)
    409.     Weaponlist(id, true)
    410.    
    411.     return HAM_IGNORED
    412. }
    413.  
    414. public HookHam_Weapon_Add(ent,id)
    415. {
    416.     switch(pev(ent,pev_impulse))
    417.     {
    418.         case WEAPON_KEY: Weaponlist(id,true)
    419.         case 0: Weaponlist(id,false)
    420.     }
    421.     return HAM_IGNORED
    422. }
    423.  
    424. public MakeBall(id)
    425. {
    426.     new ent = create_entity("env_sprite"),Float:f_origin[3],Float:f_vec[3]
    427.     set_pev(ent,pev_classname,classname_ball)
    428.     pev(id,pev_origin,f_origin)
    429.     velocity_by_aim(id,35,f_vec)
    430.    
    431.     for(new i=0;i<3;i++){ f_origin[i]+=f_vec[i];f_vec[i]*=40.0;}
    432.     f_origin[2] += (pev(id,pev_flags)&FL_DUCKING)?2.0:10.0;
    433.    
    434.     set_pev(ent,pev_origin,f_origin)
    435.     set_pev(ent,pev_velocity,f_vec)
    436.     set_pev(ent,pev_solid,SOLID_BBOX)
    437.     set_pev(ent,pev_movetype,MOVETYPE_FLY)
    438.    
    439.     if(g_ChargeForEntity[id] == 1)
    440.     {
    441.         set_pev(ent, pev_scale, 0.2)
    442.         entity_set_model(ent,SPRITE_BALL_1)
    443.     }
    444.     else if(g_ChargeForEntity[id] == 2)
    445.     {
    446.         set_pev(ent, pev_scale, 0.25)
    447.         entity_set_model(ent,SPRITE_BALL_1)
    448.     }
    449.     else if(g_ChargeForEntity[id] == 3)
    450.     {
    451.         set_pev(ent, pev_scale, 0.27)
    452.         entity_set_model(ent,SPRITE_BALL_2)
    453.     }
    454.     else if(g_ChargeForEntity[id] == 4)
    455.     {
    456.         set_pev(ent, pev_scale, 0.32)
    457.         entity_set_model(ent,SPRITE_BALL_3)
    458.     }
    459.    
    460.     set_pev(ent,pev_mins,Float:{-4.0,-4.0,-4.0})
    461.     set_pev(ent,pev_maxs,Float:{4.0,4.0,4.0})
    462.     set_pev(ent,pev_owner,id)
    463.    
    464.     set_pev(ent,pev_rendermode,kRenderTransAdd)
    465.     set_pev(ent,pev_renderamt,255.0)
    466.    
    467.     pev(id,pev_v_angle,f_vec)
    468.     set_pev(ent,pev_v_angle,f_vec)
    469. }
    470.  
    471. public BallTouch(id, ent)
    472. {
    473.     new Float:origin[3],Float:f_vec[3]
    474.     pev(ent, pev_origin, origin)
    475.     velocity_by_aim(ent,-15,f_vec)
    476.    
    477.     for(new i = 0; i < 3; i++)
    478.         origin[i] += f_vec[i]
    479.    
    480.     static classnameptd[32]
    481.     pev(id, pev_classname, classnameptd, 31)
    482.     if(equali(classnameptd, "func_breakable"))
    483.         ExecuteHamB(Ham_TakeDamage, id, 0, 0, 100.0, DMG_GENERIC)
    484.    
    485.     BallSprites(ent, origin)
    486.     BallDamage(ent)
    487. }
    488.  
    489. public BallSprites(ent, Float:origin[3])
    490. {
    491.     static owner
    492.     owner = pev(ent, pev_owner)
    493.    
    494.     if(g_ChargeForEntity[owner] == 1)
    495.     {
    496.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    497.         write_byte(TE_SPRITE);
    498.         write_coord(floatround(origin[0]))
    499.         write_coord(floatround(origin[1]))
    500.         write_coord(floatround(origin[2] + 40.0))
    501.         write_short(g_ChargeBall1_Explosion)
    502.         write_byte(30)
    503.         write_byte(225)
    504.         message_end()
    505.        
    506.         emit_sound(ent, CHAN_ITEM, Weapon_Sounds[13], 1.0, ATTN_NORM, 0, PITCH_NORM)
    507.     }
    508.     else if(g_ChargeForEntity[owner] == 2)
    509.     {
    510.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
    511.         write_byte(TE_SPRITE);
    512.         write_coord(floatround(origin[0]))
    513.         write_coord(floatround(origin[1]))
    514.         write_coord(floatround(origin[2] + 40.0))
    515.         write_short(g_ChargeBall1_Explosion)
    516.         write_byte(30)
    517.         write_byte(225)
    518.         message_end()
    519.        
    520.         emit_sound(ent, CHAN_ITEM, Weapon_Sounds[12], 1.0, ATTN_NORM, 0, PITCH_NORM)
    521.     }
    522.     else if(g_ChargeForEntity[owner] == 3)
    523.     {
    524.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
    525.         write_byte(TE_SPRITE);
    526.         write_coord(floatround(origin[0]))
    527.         write_coord(floatround(origin[1]))
    528.         write_coord(floatround(origin[2] + 40.0))
    529.         write_short(g_ChargeBall2_Explosion)
    530.         write_byte(30)
    531.         write_byte(225)
    532.         message_end()
    533.        
    534.         emit_sound(ent, CHAN_ITEM, Weapon_Sounds[13], 1.0, ATTN_NORM, 0, PITCH_NORM)
    535.     }
    536.     else if(g_ChargeForEntity[owner] == 4)
    537.     {
    538.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    539.         write_byte(TE_SPRITE)
    540.         write_coord(floatround(origin[0]))
    541.         write_coord(floatround(origin[1]))
    542.         write_coord(floatround(origin[2] + 40.0))
    543.         write_short(g_ChargeBall3_Explosion)
    544.         write_byte(30)
    545.         write_byte(225)
    546.         message_end()
    547.        
    548.         emit_sound(ent, CHAN_ITEM, Weapon_Sounds[14], 1.0, ATTN_NORM, 0, PITCH_NORM)
    549.     }
    550. }
    551.  
    552. public BallDamage(ent)
    553. {
    554.     static owner, attacker
    555.     owner = pev(ent, pev_owner)
    556.    
    557.     if(!is_user_alive(owner) || ze_is_user_zombie(owner))
    558.     {
    559.         attacker = 0;
    560.         return
    561.     }
    562.     else attacker = owner
    563.    
    564.     for(new i = 0; i < gMaxPlayers; i++)
    565.     {
    566.         if(i == attacker)
    567.             continue
    568.         if(!is_user_alive(i))
    569.             continue
    570.         if(!ze_is_user_zombie(i))
    571.             continue
    572.         if(entity_range(i, ent) > EXPLODE_RADIUS)
    573.             continue
    574.        
    575.         if(g_ChargeForEntity[attacker] == 1) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_1,DMG_BULLET)
    576.         else if(g_ChargeForEntity[attacker] == 2) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_1,DMG_BULLET)
    577.         else if(g_ChargeForEntity[attacker] == 3) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_2,DMG_BULLET)
    578.         else if(g_ChargeForEntity[attacker] == 4) ExecuteHamB(Ham_TakeDamage,i,0,attacker,DAMAGE_BALL_3,DMG_BULLET)
    579.     }
    580.    
    581.     remove_entity(ent)
    582. }
    583.  
    584. public HookHam_Weapon_Frame(ent)
    585. {
    586.     if(!Is_CustomItem(ent))
    587.         return HAM_IGNORED
    588.    
    589.     static id
    590.     id = get_pdata_cbase(ent,41,4)
    591.    
    592.     if(get_pdata_int(ent,54,4))
    593.     {
    594.         if(get_pdata_float(ent,46,4) >= 0.0)
    595.             return HAM_IGNORED
    596.        
    597.         static clip,ammotype,ammo,j
    598.         clip = get_pdata_int(ent,51,4)
    599.         ammotype = 376 + get_pdata_int(ent,49,4)
    600.         ammo = get_pdata_int(id,ammotype,5)
    601.         j = min(WEAPON_CLIP-clip,ammo)
    602.         set_pdata_int(ent, 51, clip+j, 4)
    603.         set_pdata_int(id, ammotype, ammo-j, 5)
    604.         set_pdata_int(ent, 54, 0, 4)
    605.     }
    606.    
    607.     if(g_ChargeShots[ent] < SHOOTS_FOR_HIGH) g_ChargeState[ent] = STATE_LOW
    608.     else if(g_ChargeShots[ent] >= SHOOTS_FOR_HIGH && g_ChargeShots[ent] < SHOOTS_FOR_EXTRREME) g_ChargeState[ent] = STATE_HIGH
    609.     else if(g_ChargeShots[ent] >= SHOOTS_FOR_EXTRREME) g_ChargeState[ent] = STATE_EXTREME
    610.     if(g_ChargeBall[id]) g_ChargeState[ent] = STATE_CHARGE
    611.     if(g_ChargeShots[ent] > 0 && !(pev(id,pev_button) & IN_ATTACK) &&!g_ChargeBall[id])
    612.         g_ChargeShots[ent]--
    613.    
    614.     static iButton;iButton = pev(id,pev_button)
    615.     g_ChargeBall[id] = pev(ent, pev_iuser1)
    616.    
    617.     new Float:fFinshTime, Float:ScaleNew, Float:ScaleDelay[33]
    618.     pev(ent,pev_fuser1,fFinshTime)
    619.    
    620.     static ammo
    621.     ammo = get_pdata_int(ent,51,4)
    622.    
    623.     if(iButton & IN_ATTACK2)
    624.     {
    625.         if(get_pdata_float(ent, 46, 4) >= 0.0)
    626.             return HAM_IGNORED
    627.         if(ammo == 0)
    628.             return HAM_IGNORED
    629.            
    630.         g_ChargeState[ent] = STATE_CHARGE
    631.         set_pev_string(id,pev_weaponmodel2,g_AllocString_P_charge)
    632.        
    633.         if(!g_ChargeBall[id])
    634.         {
    635.             g_ChargeBall[id] = 1
    636.             fFinshTime = get_gametime()+1.0
    637.            
    638.             Play_WeaponAnim(id, 1)
    639.             emit_sound(ent, CHAN_ITEM, Weapon_Sounds[3], 1.0, ATTN_NORM, 0, PITCH_NORM)
    640.            
    641.             set_pdata_float(ent, 48, 1.0, 4)
    642.             set_pdata_float(ent, 46, 1.0, 4)
    643.             set_pev(ent,pev_iuser1,g_ChargeBall[id])
    644.            
    645.             if(get_gametime() - 0.01 > ScaleDelay[id])
    646.             {
    647.                 pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    648.                 ScaleNew += 0.01
    649.                 set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    650.                 ScaleDelay[id] = get_gametime()
    651.             }
    652.            
    653.             set_pev(ent, pev_fuser1, fFinshTime)
    654.            
    655.             Set_BitVar(g_MuzzleflashBall1,id)
    656.             UnSet_BitVar(g_MuzzleflashBall2,id)
    657.             UnSet_BitVar(g_MuzzleflashBall3,id)
    658.         }
    659.         else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 1)
    660.         {
    661.             g_ChargeBall[id] = 2;
    662.             fFinshTime = get_gametime()+3.0
    663.            
    664.             Play_WeaponAnim(id,2)
    665.             emit_sound(ent, CHAN_ITEM, Weapon_Sounds[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
    666.            
    667.             set_pdata_float(ent, 48, 1.25, 4)
    668.             set_pdata_float(ent, 46, 1.25, 4)
    669.             set_pev(ent,pev_iuser1,g_ChargeBall[id])
    670.            
    671.             if(get_gametime() - 0.01 > ScaleDelay[id])
    672.             {
    673.                 pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    674.                 ScaleNew += 0.02
    675.                 set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    676.                 ScaleDelay[id] = get_gametime()
    677.             }
    678.            
    679.             Set_BitVar(g_MuzzleflashBall1,id)
    680.             UnSet_BitVar(g_MuzzleflashBall2,id)
    681.             UnSet_BitVar(g_MuzzleflashBall3,id)
    682.         }
    683.         else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 2)
    684.         {
    685.             g_ChargeBall[id] = 3
    686.             fFinshTime = get_gametime()+3.0
    687.            
    688.             set_pdata_float(ent, 48, 1.5, 4)
    689.             set_pdata_float(ent, 46, 1.5, 4)
    690.             set_pev(ent,pev_iuser1,g_ChargeBall[id])
    691.            
    692.             if(get_gametime() - 0.01 > ScaleDelay[id])
    693.             {
    694.                 pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    695.                 ScaleNew += 0.05
    696.                 set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    697.                 ScaleDelay[id] = get_gametime()
    698.             }
    699.            
    700.             UnSet_BitVar(g_MuzzleflashBall1,id)
    701.             Set_BitVar(g_MuzzleflashBall2,id)
    702.             UnSet_BitVar(g_MuzzleflashBall3,id)
    703.  
    704.         }
    705.         else if(get_gametime() > fFinshTime && g_ChargeBall[id] == 3)
    706.         {
    707.             g_ChargeBall[id] = 4
    708.             fFinshTime = get_gametime() + 200.0
    709.            
    710.             Play_WeaponAnim(id, 3)
    711.             emit_sound(ent, CHAN_ITEM, Weapon_Sounds[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
    712.            
    713.             set_pdata_float(ent, 48, 250.0, 4)
    714.             set_pdata_float(ent, 46, 250.0, 4)
    715.             set_pev(ent,pev_iuser1,g_ChargeBall[id])
    716.            
    717.             if(get_gametime() - 0.01 > ScaleDelay[id])
    718.             {
    719.                 pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    720.                 ScaleNew += 0.08
    721.                 set_pev(g_MuzzleflashBall_Ent1, pev_scale, ScaleNew)
    722.                 ScaleDelay[id] = get_gametime()
    723.             }
    724.            
    725.             set_pev(ent, pev_fuser1, fFinshTime)
    726.             UnSet_BitVar(g_MuzzleflashBall1,id)
    727.             UnSet_BitVar(g_MuzzleflashBall2,id)
    728.             Set_BitVar(g_MuzzleflashBall3,id)
    729.         }
    730.        
    731.         iButton &= ~IN_ATTACK2;
    732.         set_pev(id,pev_button,iButton)
    733.     }
    734.     else
    735.     {
    736.         switch(g_ChargeBall[id])
    737.         {  
    738.             case 1:
    739.             {
    740.                 Play_WeaponAnim(id,4)
    741.                 emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
    742.                
    743.                 set_pdata_float(ent,48,1.63,4)
    744.                 set_pdata_float(ent,46,1.0,4)
    745.                
    746.                 UnSet_BitVar(g_MuzzleflashBall1,id)
    747.                 UnSet_BitVar(g_MuzzleflashBall2,id)
    748.                 UnSet_BitVar(g_MuzzleflashBall3,id)
    749.                
    750.                 g_ChargeState[ent] = STATE_LOW
    751.                 g_ChargeShots[ent] = 0
    752.                 g_ChargeForEntity[id] = g_ChargeBall[id]
    753.                
    754.                 set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    755.                 MakeBall(id)
    756.                
    757.                 if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
    758.                 else set_pdata_int(ent,51, 0, 4)
    759.             }
    760.             case 2:
    761.             {
    762.                 Play_WeaponAnim(id,4);
    763.                 emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
    764.                
    765.                 set_pdata_float(ent,48,1.63,4)
    766.                 set_pdata_float(ent,46,1.0,4)
    767.                
    768.                 UnSet_BitVar(g_MuzzleflashBall1,id)
    769.                 UnSet_BitVar(g_MuzzleflashBall2,id)
    770.                 UnSet_BitVar(g_MuzzleflashBall3,id)
    771.                
    772.                 g_ChargeState[ent] = STATE_LOW
    773.                 g_ChargeShots[ent] = 0
    774.                 g_ChargeForEntity[id] = g_ChargeBall[id]
    775.                
    776.                 set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    777.                 MakeBall(id)
    778.                
    779.                 if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
    780.                 else set_pdata_int(ent,51, 0, 4)
    781.             }
    782.             case 3:
    783.             {
    784.                 Play_WeaponAnim(id,4)
    785.                 emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
    786.                
    787.                 set_pdata_float(ent,48,1.63,4)
    788.                 set_pdata_float(ent,46,1.0,4)
    789.                
    790.                 UnSet_BitVar(g_MuzzleflashBall1,id)
    791.                 UnSet_BitVar(g_MuzzleflashBall2,id)
    792.                 UnSet_BitVar(g_MuzzleflashBall3,id)
    793.                
    794.                 g_ChargeState[ent] = STATE_LOW
    795.                 g_ChargeShots[ent] = 0
    796.                 g_ChargeForEntity[id] = g_ChargeBall[id]
    797.                
    798.                 set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    799.                 MakeBall(id)
    800.                
    801.                 if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
    802.                 else set_pdata_int(ent,51, 0, 4)
    803.             }
    804.             case 4:
    805.             {
    806.                 Play_WeaponAnim(id,4)
    807.                 emit_sound(ent, CHAN_ITEM, Weapon_Sounds[4], 1.0, ATTN_NORM, 0, PITCH_NORM)
    808.                
    809.                 set_pdata_float(ent,48,1.63,4)
    810.                 set_pdata_float(ent,46,1.0,4)
    811.                
    812.                 UnSet_BitVar(g_MuzzleflashBall1,id)
    813.                 UnSet_BitVar(g_MuzzleflashBall2,id)
    814.                 UnSet_BitVar(g_MuzzleflashBall3,id)
    815.                
    816.                 g_ChargeState[ent] = STATE_LOW
    817.                 g_ChargeShots[ent] = 0
    818.                 g_ChargeForEntity[id] = g_ChargeBall[id]
    819.                
    820.                 set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    821.                 MakeBall(id)
    822.                    
    823.                 if(ammo > 19) set_pdata_int(ent, 51, ammo - 20, 4)
    824.                 else set_pdata_int(ent,51, 0, 4)
    825.             }
    826.         }
    827.        
    828.         g_ChargeBall[id] = 0
    829.        
    830.         new Float:ResetScale[3]
    831.         pev(g_MuzzleflashBall_Ent1, pev_fuser1, ResetScale[0])
    832.         set_pev(g_MuzzleflashBall_Ent1, pev_scale, ResetScale[0])
    833.         pev(g_MuzzleflashBall_Ent2, pev_fuser1, ResetScale[1])
    834.         set_pev(g_MuzzleflashBall_Ent2, pev_scale, ResetScale[1])
    835.         pev(g_MuzzleflashBall_Ent3, pev_fuser1, ResetScale[2])
    836.         set_pev(g_MuzzleflashBall_Ent3, pev_scale, ResetScale[2])
    837.        
    838.         set_pev_string(id,pev_weaponmodel2,g_AllocString_P)
    839.         set_pev(ent,pev_iuser1,g_ChargeBall[id])
    840.     }
    841.    
    842.     return HAM_IGNORED
    843. }
    844.  
    845. public HookHam_Weapon_Reload(ent)
    846. {
    847.     if(!Is_CustomItem(ent))
    848.         return HAM_IGNORED
    849.    
    850.     static clip
    851.     clip = get_pdata_int(ent,51,4)
    852.    
    853.     if(clip >= WEAPON_CLIP)
    854.         return HAM_SUPERCEDE
    855.    
    856.     static id
    857.     id = get_pdata_cbase(ent,41,4)
    858.    
    859.     if(get_pdata_int(id, 376 + get_pdata_int(ent,49,4), 5) <= 0)
    860.         return HAM_SUPERCEDE
    861.    
    862.     set_pdata_int(ent, 51, 0,4)
    863.     ExecuteHam(Ham_Weapon_Reload, ent)
    864.     set_pdata_int(ent,51, clip, 4)
    865.     set_pdata_int(ent,54, 1,4)
    866.     set_pdata_float(ent, 46,RELOAD_TIME,4)
    867.     set_pdata_float(ent, 47,RELOAD_TIME,4)
    868.     set_pdata_float(ent, 48,RELOAD_TIME,4)
    869.     set_pdata_float(id, 83, RELOAD_TIME,5)
    870.     Play_WeaponAnim(id, ANIM_RELOAD)
    871.     return HAM_SUPERCEDE;
    872. }
    873.  
    874. public HookHam_Weapon_Idle(ent)
    875. {
    876.     if(!Is_CustomItem(ent))
    877.         return HAM_IGNORED
    878.        
    879.     if(get_pdata_float(ent, 48, 4) > 0.0)
    880.         return HAM_IGNORED
    881.        
    882.     set_pdata_float(ent,48,IDLE_TIME,4)
    883.     Play_WeaponAnim(get_pdata_cbase(ent, 41, 4), ANIM_IDLE)
    884.    
    885.     return HAM_SUPERCEDE
    886. }
    887.  
    888. public HookHam_Weapon_PrimaryAttack(ent)
    889. {
    890.     if(!Is_CustomItem(ent))
    891.         return HAM_IGNORED
    892.        
    893.     static ammo
    894.     ammo = get_pdata_int(ent,51,4)
    895.    
    896.     if(ammo <= 0)
    897.     {
    898.         ExecuteHam(Ham_Weapon_PlayEmptySound,ent);
    899.         set_pdata_float(ent,46,WEAPON_SPEED,4)
    900.         return HAM_SUPERCEDE
    901.     }
    902.        
    903.     static id; id = get_pdata_cbase(ent,41,4)
    904.     static Float:user_punchangle[3];pev(id,pev_punchangle,user_punchangle)
    905.     static fm_hooktrace;fm_hooktrace=register_forward(FM_TraceLine,"HookFm_TraceLine",true)
    906.     static fm_playbackevent;fm_playbackevent=register_forward(FM_PlaybackEvent,"HookFm_PlayBackEvent",false)
    907.    
    908.     state FireBullets: Enabled;
    909.     ExecuteHam(Ham_Weapon_PrimaryAttack,ent)
    910.     state FireBullets: Disabled;
    911.    
    912.     unregister_forward(FM_TraceLine,fm_hooktrace,true)
    913.     unregister_forward(FM_PlaybackEvent,fm_playbackevent,false)
    914.    
    915.     Play_WeaponAnim(id,random_num(ANIM_SHOOT_1,ANIM_SHOOT_2))
    916.     set_pdata_int(ent,51,ammo-1,4)
    917.     set_pdata_float(ent,48,2.0,4)
    918.     static Float:user_newpunch[3];pev(id,pev_punchangle,user_newpunch)
    919.    
    920.     user_newpunch[0]=user_punchangle[0]+(user_newpunch[0]-user_punchangle[0])*RECOIL
    921.     user_newpunch[1]=user_punchangle[1]+(user_newpunch[1]-user_punchangle[1])*RECOIL
    922.     user_newpunch[2]=user_punchangle[2]+(user_newpunch[2]-user_punchangle[2])*RECOIL
    923.     set_pev(id,pev_punchangle,user_newpunch)
    924.  
    925.     emit_sound(ent, CHAN_ITEM, Weapon_Sounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
    926.     set_pdata_float(ent,46,WEAPON_SPEED,4)
    927.    
    928.     new Float:Origin[3]
    929.     get_weapon_position(id,Origin,.add_forward=10.0,.add_right=7.0,.add_up=-10.5)
    930.        
    931.     new Float:Velo[3]
    932.     Velo[0]=g_VecEndTrace[0]-Origin[0]
    933.     Velo[1]=g_VecEndTrace[1]-Origin[1]
    934.     Velo[2]=g_VecEndTrace[2]-Origin[2]
    935.        
    936.     vec_normalize(Velo,Velo)
    937.     vec_mul_scalar(Velo,4096.0,Velo)
    938.    
    939.     if(g_ChargeState[ent] == STATE_LOW)
    940.     {
    941.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    942.         write_byte(TE_USERTRACER)
    943.         engfunc(EngFunc_WriteCoord,Origin[0])
    944.         engfunc(EngFunc_WriteCoord,Origin[1])
    945.         engfunc(EngFunc_WriteCoord,Origin[2])
    946.         engfunc(EngFunc_WriteCoord,Velo[0])
    947.         engfunc(EngFunc_WriteCoord,Velo[1])
    948.         engfunc(EngFunc_WriteCoord,Velo[2])
    949.         write_byte(20)
    950.         write_byte(4)
    951.         write_byte(5)
    952.         message_end()
    953.        
    954.         Set_BitVar(g_Muzzleflash1,id)
    955.     }
    956.     else if(g_ChargeState[ent] == STATE_HIGH)
    957.     {
    958.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    959.         write_byte(TE_USERTRACER)
    960.         engfunc(EngFunc_WriteCoord,Origin[0])
    961.         engfunc(EngFunc_WriteCoord,Origin[1])
    962.         engfunc(EngFunc_WriteCoord,Origin[2])
    963.         engfunc(EngFunc_WriteCoord,Velo[0])
    964.         engfunc(EngFunc_WriteCoord,Velo[1])
    965.         engfunc(EngFunc_WriteCoord,Velo[2])
    966.         write_byte(20)
    967.         write_byte(5)
    968.         write_byte(5)
    969.         message_end()
    970.        
    971.         Set_BitVar(g_Muzzleflash2,id)
    972.     }
    973.     else if(g_ChargeState[ent] == STATE_EXTREME)
    974.     {
    975.         message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
    976.         write_byte(TE_USERTRACER)
    977.         engfunc(EngFunc_WriteCoord,Origin[0])
    978.         engfunc(EngFunc_WriteCoord,Origin[1])
    979.         engfunc(EngFunc_WriteCoord,Origin[2])
    980.         engfunc(EngFunc_WriteCoord,Velo[0])
    981.         engfunc(EngFunc_WriteCoord,Velo[1])
    982.         engfunc(EngFunc_WriteCoord,Velo[2])
    983.         write_byte(20)
    984.         write_byte(1)
    985.         write_byte(5)
    986.         message_end()
    987.        
    988.         Set_BitVar(g_Muzzleflash3,id)
    989.     }
    990.     g_ChargeShots[ent]++
    991.    
    992.     return HAM_SUPERCEDE
    993. }
    994.  
    995. public HookHam_TakeDamage(victim,inflictor,attacker,Float:damage)<FireBullets: Enabled>
    996. {
    997.     new ent = fm_find_ent_by_owner(-1,weapon_name,attacker)
    998.    
    999.     if(g_ChargeState[ent] == STATE_LOW)
    1000.         SetHamParamFloat(4,damage*DAMAGE_LOW)
    1001.     else if(g_ChargeState[ent] == STATE_HIGH)
    1002.         SetHamParamFloat(4,damage*DAMAGE_HIGH)
    1003.     else if(g_ChargeState[ent] == STATE_EXTREME)
    1004.         SetHamParamFloat(4,damage*DAMAGE_EXTREME)
    1005.        
    1006.     return HAM_OVERRIDE;
    1007. }
    1008.  
    1009. public HookHam_TakeDamage()<FireBullets: Disabled>
    1010. {
    1011.     return HAM_IGNORED;
    1012. }
    1013.  
    1014. public HookHam_TakeDamage()<>
    1015. {
    1016.     return HAM_IGNORED;
    1017. }
    1018.  
    1019. public HookFm_SetModel(ent)
    1020. {
    1021.     static i,classname[32],item;pev(ent,pev_classname,classname,31);
    1022.     if(!equal(classname,"weaponbox"))
    1023.         return FMRES_IGNORED
    1024.        
    1025.     for(i=0; i < 6; i++)
    1026.     {
    1027.         item = get_pdata_cbase(ent,34+i,4)
    1028.        
    1029.         static id
    1030.         id = pev(ent,pev_owner)
    1031.        
    1032.         if(item > 0 && Is_CustomItem(item))
    1033.         {
    1034.             engfunc(EngFunc_SetModel,ent,MODEL_W)
    1035.             g_ChargeState[ent] = STATE_LOW
    1036.             g_ChargeShots[ent] = 0
    1037.             UnSet_BitVar(g_MuzzleflashBall1,id)
    1038.             UnSet_BitVar(g_MuzzleflashBall2,id)
    1039.             UnSet_BitVar(g_MuzzleflashBall3,id)
    1040.             g_ChargeBall[id] = 0
    1041.            
    1042.             return FMRES_SUPERCEDE
    1043.         }
    1044.     }
    1045.     return FMRES_IGNORED;
    1046. }
    1047.  
    1048. public HookFm_PlayBackEvent()
    1049. {
    1050.     return FMRES_SUPERCEDE
    1051. }
    1052.  
    1053. public HookFm_TraceLine(Float:tr_start[3],Float:tr_end[3],tr_flag,tr_ignore,tr)
    1054. {
    1055.     if(tr_flag&IGNORE_MONSTERS)
    1056.         return FMRES_IGNORED
    1057.        
    1058.     static hit
    1059.     hit=get_tr2(tr,TR_pHit)
    1060.    
    1061.     static Decal, glassdecal
    1062.    
    1063.     if(!glassdecal)
    1064.         glassdecal = engfunc(EngFunc_DecalIndex,"{bproof1")
    1065.    
    1066.     hit = get_tr2(tr,TR_pHit)
    1067.     if(hit > 0 && pev_valid(hit))
    1068.     {
    1069.         if(pev(hit,pev_solid) != SOLID_BSP)
    1070.             return FMRES_IGNORED
    1071.            
    1072.         else if(pev(hit,pev_rendermode) != 0) Decal=glassdecal
    1073.         else Decal = random_num(41,45)
    1074.     }
    1075.     else Decal = random_num(41,45)
    1076.  
    1077.     static Float:vecEnd[3]
    1078.     get_tr2(tr,TR_vecEndPos,vecEnd)
    1079.     g_VecEndTrace = vecEnd
    1080.    
    1081.     engfunc(EngFunc_MessageBegin,MSG_PAS,SVC_TEMPENTITY,vecEnd,0)
    1082.     write_byte(TE_GUNSHOTDECAL)
    1083.     engfunc(EngFunc_WriteCoord,vecEnd[0])
    1084.     engfunc(EngFunc_WriteCoord,vecEnd[1])
    1085.     engfunc(EngFunc_WriteCoord,vecEnd[2])
    1086.     write_short(hit>0?hit:0)
    1087.     write_byte(Decal)
    1088.     message_end()
    1089.    
    1090.     static Float:WallVector[3];get_tr2(tr,TR_vecPlaneNormal,WallVector)
    1091.     engfunc(EngFunc_MessageBegin,MSG_PVS,SVC_TEMPENTITY,vecEnd,0);
    1092.     write_byte(TE_STREAK_SPLASH)
    1093.     engfunc(EngFunc_WriteCoord,vecEnd[0]);
    1094.     engfunc(EngFunc_WriteCoord,vecEnd[1]);
    1095.     engfunc(EngFunc_WriteCoord,vecEnd[2]);
    1096.     engfunc(EngFunc_WriteCoord,WallVector[0]*random_float(25.0,30.0));
    1097.     engfunc(EngFunc_WriteCoord,WallVector[1]*random_float(25.0,30.0));
    1098.     engfunc(EngFunc_WriteCoord,WallVector[2]*random_float(25.0,30.0));
    1099.     write_byte(111)
    1100.     write_short(12)
    1101.     write_short(3)
    1102.     write_short(75)
    1103.     message_end()
    1104.    
    1105.     return FMRES_IGNORED
    1106. }
    1107.  
    1108. public HookFm_UpdateClientData(id,SendWeapons,CD_Handle)
    1109. {
    1110.     static item
    1111.     item = get_pdata_cbase(id,373,5)
    1112.     if(item <= 0 || !Is_CustomItem(item))
    1113.         return FMRES_IGNORED
    1114.        
    1115.     set_cd(CD_Handle,CD_flNextAttack,99999.0)
    1116.     return FMRES_HANDLED
    1117. }
    1118.  
    1119. public HookFm_Spawn(id)
    1120. {
    1121.     if(pev_valid(id) != 2)
    1122.         return FMRES_IGNORED
    1123.        
    1124.     static ClName[32]
    1125.     pev(id,pev_classname,ClName,31)
    1126.    
    1127.     if(strlen(ClName) < 5)
    1128.         return FMRES_IGNORED
    1129.        
    1130.     static Trie:ClBuffer
    1131.     if(!ClBuffer) ClBuffer = TrieCreate()
    1132.     if(!TrieKeyExists(ClBuffer,ClName))
    1133.     {
    1134.         TrieSetCell(ClBuffer, ClName, 1)
    1135.         RegisterHamFromEntity(Ham_TakeDamage, id, "HookHam_TakeDamage", 0)
    1136.     }
    1137.     return FMRES_IGNORED
    1138. }
    1139.  
    1140. stock make_weapon()
    1141. {
    1142.     static ent, g_AllocString_E
    1143.     if(g_AllocString_E || (g_AllocString_E = engfunc(EngFunc_AllocString,weapon_name)))
    1144.         ent = engfunc(EngFunc_CreateNamedEntity,g_AllocString_E)
    1145.     else
    1146.         return 0
    1147.     if(ent <= 0)
    1148.         return 0
    1149.        
    1150.     set_pev(ent,pev_spawnflags,SF_NORESPAWN)
    1151.     set_pev(ent,pev_impulse,WEAPON_KEY)
    1152.     ExecuteHam(Ham_Spawn,ent)
    1153.    
    1154.     return ent
    1155. }
    1156.  
    1157. stock UTIL_DropWeapon(id,slot)
    1158. {
    1159.     static iEntity
    1160.     iEntity = get_pdata_cbase(id,(367 + slot),5)
    1161.    
    1162.     if(iEntity > 0)
    1163.     {
    1164.         static iNext,szWeaponName[32]
    1165.        
    1166.         do
    1167.         {
    1168.             iNext = get_pdata_cbase(iEntity,42,4);
    1169.             if(get_weaponname(get_pdata_int(iEntity, 43, 4), szWeaponName, 31))
    1170.                 engclient_cmd(id,"drop",szWeaponName)
    1171.         }
    1172.         while((iEntity=iNext)>0)
    1173.     }
    1174. }
    1175.  
    1176. stock Play_WeaponAnim(id,anim)
    1177. {
    1178.     set_pev(id,pev_weaponanim,anim)
    1179.     message_begin(MSG_ONE_UNRELIABLE,SVC_WEAPONANIM,_,id)
    1180.     write_byte(anim)
    1181.     write_byte(0)
    1182.     message_end()
    1183. }
    1184.  
    1185. stock Weaponlist(id,bool:set)
    1186. {
    1187.     if(!is_user_connected(id))
    1188.         return
    1189.        
    1190.     message_begin(MSG_ONE,Msg_WeaponList,_,id);
    1191.     write_string(set == false ? weapon_name:weapon_new);
    1192.     write_byte(3);
    1193.     write_byte(WEAPON_BPAMMO);
    1194.     write_byte(-1);
    1195.     write_byte(-1);
    1196.     write_byte(0);
    1197.     write_byte(4);
    1198.     write_byte(20);
    1199.     write_byte(0);
    1200.     message_end();
    1201. }
    1202.  
    1203. stock get_weapon_position(id,Float:fOrigin[3],Float:add_forward=0.0,Float:add_right=0.0,Float:add_up=0.0)
    1204. {
    1205.     static Float:Angles[3],Float:ViewOfs[3],Float:vAngles[3]
    1206.     static Float:Forward[3],Float:Right[3],Float:Up[3]
    1207.     pev(id,pev_v_angle,vAngles)
    1208.     pev(id,pev_origin,fOrigin)
    1209.     pev(id,pev_view_ofs,ViewOfs)
    1210.     vec_add(fOrigin,ViewOfs,fOrigin)
    1211.     pev(id,pev_v_angle,Angles)
    1212.     engfunc(EngFunc_MakeVectors,Angles)
    1213.     global_get(glb_v_forward,Forward)
    1214.     global_get(glb_v_right,Right)
    1215.     global_get(glb_v_up,Up)
    1216.     vec_mul_scalar(Forward,add_forward,Forward)
    1217.     vec_mul_scalar(Right,add_right,Right)
    1218.     vec_mul_scalar(Up,add_up,Up)
    1219.     fOrigin[0]=fOrigin[0]+Forward[0]+Right[0]+Up[0]
    1220.     fOrigin[1]=fOrigin[1]+Forward[1]+Right[1]+Up[1]
    1221.     fOrigin[2]=fOrigin[2]+Forward[2]+Right[2]+Up[2]
    1222. }
    1223.  
    1224. vec_add(const Float:in1[],const Float:in2[],Float:out[])
    1225. {
    1226.     out[0]=in1[0]+in2[0];
    1227.     out[1]=in1[1]+in2[1];
    1228.     out[2]=in1[2]+in2[2];
    1229. }
    1230.  
    1231. vec_mul_scalar(const Float:vec[],Float:scalar,Float:out[])
    1232. {
    1233.     out[0]=vec[0]*scalar;
    1234.     out[1]=vec[1]*scalar;
    1235.     out[2]=vec[2]*scalar;
    1236. }
    1237.  
    1238. vec_normalize(const Float:vec[],Float:out[])
    1239. {
    1240.     new Float:invlen=rsqrt(vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2]);
    1241.     out[0]=vec[0]*invlen;
    1242.     out[1]=vec[1]*invlen;
    1243.     out[2]=vec[2]*invlen;
    1244. }
    1245.  
    1246. Float:rsqrt(Float:x)
    1247. {
    1248.     new Float:xhalf=x*0.5;
    1249.    
    1250.     new i=_:x;
    1251.     i=0x5f375a84 - (i>>1);
    1252.     x=Float:i;
    1253.            
    1254.     x=x*(1.5-xhalf*x*x);
    1255.     x=x*(1.5-xhalf*x*x);
    1256.     x=x*(1.5-xhalf*x*x);
    1257.        
    1258.     return x;
    1259. }
Minigun:
    1. #include <zombie_escape>
    2. #include <fakemeta_util>
    3. #include <xs>
    4.  
    5. #define PLUGIN "[MW2] Auto Minigun"
    6. #define VERSION "1.0"
    7. #define AUTHOR "Dias"
    8.  
    9. new g_player_main[33], g_remoting[33], g_player_main2[33], g_firing[33],
    10. g_preparing[33], g_ending[33], g_reloading[500]
    11. new Float:g_last_firesound[33]
    12. new const base_model[] = "models/mw2_auto/base.mdl"
    13. new const main_model[] = "models/mw2_auto/main.mdl"
    14. new const muzzleflash_spr[] = "sprites/muzzleflash3_auto.spr"
    15. new muzzleflash_spr_id, Float:g_last_shoot[33]
    16. new g_blood, g_bloodspray, g_dead[500], g_exp_id, g_owner[500], Float:g_check_heat[33]
    17.  
    18. new const minigun_sound[3][] = {
    19.     "mw2_auto/minigun-starting.wav",
    20.     "mw2_auto/minigun-shooting.wav",
    21.     "mw2_auto/minigun-stoping.wav"
    22. }
    23.  
    24. new g_had_minigun[33], g_reg, g_heat[500], g_sync_hud1
    25. new cvar_minigun_health, cvar_minigun_dmgrand_start, cvar_minigun_dmgrand_end,
    26. cvar_delay_attack, cvar_reload_time
    27.  
    28.  
    29. // Weapon entity names
    30. new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
    31.             "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
    32.             "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
    33.             "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
    34.             "weapon_ak47", "weapon_knife", "weapon_p90" }
    35.  
    36. public plugin_init()
    37. {
    38.     register_plugin(PLUGIN, VERSION, AUTHOR)
    39.    
    40.     register_event("HLTV", "event_newround", "a", "1=0", "2=0")
    41.     register_event("DeathMsg", "event_death", "a")
    42.    
    43.     register_think("mw2_mingun_main", "fw_main_think")
    44.     register_forward(FM_CmdStart, "fw_CmdStart")
    45.     for (new i = 1; i < sizeof WEAPONENTNAMES; i++)
    46.         if (WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_Deploy, WEAPONENTNAMES[i], "fw_Item_Deploy_Post", 1)
    47.    
    48.     g_sync_hud1 = CreateHudSyncObj(645)
    49.    
    50.     // Cvars
    51.     cvar_minigun_health = register_cvar("zp_minigun_health", "500")
    52.     cvar_minigun_dmgrand_start = register_cvar("zp_minigun_dmgrand_start", "10")
    53.     cvar_minigun_dmgrand_end = register_cvar("zp_minigun_dmgrand_end", "30")
    54.     cvar_delay_attack = register_cvar("zp_minigun_delay_attack", "0.1")
    55.     cvar_reload_time = register_cvar("zp_minigun_reload_time", "30.0")
    56.    
    57.     //register_clcmd("say /make", "create_minigun")
    58.     //register_clcmd("say /remote", "remote_minigun")
    59. }
    60.  
    61. public plugin_precache()
    62. {
    63.     precache_model(base_model)
    64.     precache_model(main_model)
    65.    
    66.     for(new i = 0; i < sizeof(minigun_sound); i++)
    67.         engfunc(EngFunc_PrecacheSound, minigun_sound[i])
    68.    
    69.     muzzleflash_spr_id = precache_model(muzzleflash_spr)
    70.     g_blood = precache_model("sprites/blood.spr")
    71.     g_bloodspray = precache_model("sprites/bloodspray.spr")    
    72.     g_exp_id = precache_model("sprites/zerogxplode.spr")
    73. }
    74.  
    75. public plugin_natives()
    76. {
    77.     register_native("give_minigun","native_give_minigun", 1)
    78. }
    79.  
    80. public native_give_minigun(id)
    81. {
    82.     g_had_minigun[id] = 1
    83.     create_minigun(id)
    84.     client_printcolor(id, "!g[ZE]!y Hold !t(E)!y for 3 seconds to put MW2 Auto-Minigun !!!")
    85. }
    86.  
    87. public event_newround()
    88. {
    89.     remove_entity_name("mw2_mingun_base")
    90.     remove_entity_name("mw2_mingun_main")
    91.     remove_entity_name("mw2_mingun_view")
    92.    
    93.     for(new i = 0; i < get_maxplayers(); i++)
    94.     {
    95.         if(is_user_alive(i) && is_user_connected(i))
    96.         {
    97.             reset_minigun(i)
    98.         }
    99.     }
    100. }
    101.  
    102. public event_death()
    103. {
    104.     static victim
    105.     victim = read_data(2)
    106.    
    107.     reset_minigun(victim)
    108. }
    109.  
    110. public reset_minigun(id)
    111. {
    112.     attach_view(id, id)
    113.    
    114.     g_had_minigun[id] = 0
    115.     g_player_main[id] = 0
    116.     g_player_main2[id] = 0
    117.     g_remoting[id] = 0
    118.     g_preparing[id] = 0
    119.     g_firing[id] = 0
    120.     g_ending[id] = 0
    121.    
    122.     remove_task(id+2479)
    123.  
    124.     message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id)
    125.     write_short(0)
    126.     message_end()  
    127. }
    128.  
    129. public create_minigun(id)
    130. {
    131.     if(!g_had_minigun[id])
    132.         return
    133.    
    134.     g_had_minigun[id] = 0
    135.    
    136.     new Float:Origin[3], Float:Angles[3]
    137.    
    138.     get_position(id, 40.0, 0.0, 0.0, Origin)
    139.     pev(id, pev_angles, Angles)
    140.    
    141.     // Make the Base
    142.     new ent = create_entity("info_target")
    143.     entity_set_origin(ent, Origin);
    144.    
    145.     Angles[0] = 0.0
    146.     entity_set_vector(ent, EV_VEC_angles, Angles)
    147.  
    148.     entity_set_string(ent,EV_SZ_classname, "mw2_mingun_base")
    149.     entity_set_model(ent, base_model);
    150.     entity_set_int(ent,EV_INT_solid, SOLID_NOT)
    151.    
    152.     entity_set_float(ent,EV_FL_takedamage,1.0)
    153.     entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0)
    154.  
    155.     new Float:maxs[3] = {10.0,10.0,1.0}
    156.     new Float:mins[3] = {-10.0,-10.0,-1.0}
    157.     entity_set_size(ent,mins,maxs)
    158.    
    159.     set_entity_anim(ent, 0)
    160.     g_dead[ent] = 0
    161.     g_owner[ent] = id
    162.    
    163.     entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)
    164.    
    165.     drop_to_floor(ent)
    166.    
    167.     // Create Main
    168.     ent = create_entity("info_target")
    169.    
    170.     Origin[2] -= 35.0
    171.     entity_set_origin(ent, Origin);
    172.     entity_set_vector(ent, EV_VEC_angles, Angles)
    173.    
    174.     entity_set_string(ent,EV_SZ_classname, "mw2_mingun_main")
    175.     entity_set_model(ent, main_model);
    176.     entity_set_int(ent,EV_INT_solid, SOLID_BBOX)
    177.    
    178.     entity_set_float(ent,EV_FL_takedamage,1.0)
    179.     entity_set_float(ent,EV_FL_health, get_pcvar_float(cvar_minigun_health) + 1000.0)  
    180.  
    181.     new Float:maxs2[3] = {10.0,10.0,20.0}
    182.     new Float:mins2[3] = {-10.0,-10.0,-20.0}
    183.     entity_set_size(ent,mins2,maxs2)   
    184.    
    185.     set_entity_anim(ent, 0)
    186.     g_heat[ent] = 0
    187.    
    188.     entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)  
    189.     g_player_main[id] = ent
    190.     g_dead[ent] = 0
    191.     g_owner[ent] = id
    192.     g_reloading[ent] = 0
    193.    
    194.     drop_to_floor(ent)
    195.     if(!g_reg)
    196.     {
    197.         g_reg = 1
    198.         RegisterHamFromEntity(Ham_TakeDamage, ent, "fw_main_takedamage")
    199.     }
    200.    
    201.     // Create View Ent
    202.     ent = create_entity("info_target")
    203.    
    204.     get_position(id, 40.0, 0.0, 10.0, Origin)
    205.    
    206.     entity_set_origin(ent, Origin);
    207.     entity_set_vector(ent, EV_VEC_angles, Angles)
    208.    
    209.     entity_set_string(ent,EV_SZ_classname, "mw2_mingun_view")
    210.     entity_set_model(ent, main_model);
    211.    
    212.     fm_set_rendering(ent, kRenderFxGlowShell, 0, 0, 0, kRenderTransAlpha, 0)
    213.    
    214.     g_player_main2[id] = ent
    215. }
    216.  
    217. public ze_user_infected(id)
    218. {
    219.     reset_minigun(id)
    220. }
    221.  
    222. public do_remote(id)
    223. {
    224.     id -= 2479
    225.    
    226.     remote_minigun(id)
    227. }
    228.  
    229. public remote_minigun(id)
    230. {
    231.     if(!g_player_main[id])
    232.         return
    233.        
    234.     attach_view(id, g_player_main2[id])
    235.     engclient_cmd(id, "weapon_knife")
    236.    
    237.     set_task(1.0, "task_delay", id)
    238.    
    239.     client_printcolor(id, "!g[ZE]!y Press !t(E)!y to turn of the MW2-Auto Minigun !!!")
    240. }
    241.  
    242. public task_delay(id)
    243. {
    244.     g_remoting[id] = 1
    245. }
    246.  
    247. public client_PostThink(id)
    248. {
    249.     if(!g_remoting[id])
    250.         return
    251.     if(!g_player_main[id])
    252.         return 
    253.     if(!pev_valid(g_player_main[id]))
    254.     {
    255.         reset_minigun(id)
    256.         return
    257.     }
    258.    
    259.     if(!g_firing[id] && !g_reloading[g_player_main[id]])
    260.     {
    261.         if(g_heat[g_player_main[id]] > 0)
    262.         {
    263.             static Float:CurTime
    264.             CurTime = get_gametime()
    265.            
    266.             if(CurTime - get_pcvar_float(cvar_delay_attack) * 2 > g_check_heat[id])
    267.             {
    268.                 g_heat[g_player_main[id]]--
    269.                 g_check_heat[id] = CurTime
    270.             }
    271.         }
    272.     }
    273.    
    274.     static Message[64]
    275.    
    276.     if(g_heat[g_player_main[id]] <= 0)
    277.     {
    278.         set_hudmessage(0, 255, 0, -1.0, 0.90, 0, 1.0, 1.0)
    279.         formatex(Message, sizeof(Message), "Status: Good")
    280.     } else if(g_heat[g_player_main[id]] > 0 && g_heat[g_player_main[id]] < 100) {
    281.         set_hudmessage(255, 255, 0, -1.0, 0.90, 0, 1.0, 1.0)
    282.         formatex(Message, sizeof(Message), "Status: Heat %i%%", g_heat[g_player_main[id]])
    283.     } else if(g_heat[g_player_main[id]] >= 100) {
    284.         set_hudmessage(255, 0, 0, -1.0, 0.90, 0, 1.0, 1.0)
    285.         formatex(Message, sizeof(Message), "Status: OverHeat")
    286.     }
    287.    
    288.     ShowSyncHudMsg(id, g_sync_hud1, Message)
    289.    
    290.     static Float:NewAngles[3], Float:OldAngles[3], Float:Origin[3]
    291.     pev(id, pev_angles, NewAngles)
    292.     pev(g_player_main[id], pev_angles, OldAngles)
    293.    
    294.     NewAngles[2] = OldAngles[2]
    295.    
    296.     pev(g_player_main2[id], pev_origin, Origin)
    297.     //get_position(g_player_main2[id], -10.0, 0.0, 0.0, Origin)
    298.    
    299.     set_pev(g_player_main[id], pev_v_angle, NewAngles)
    300.     set_pev(g_player_main2[id], pev_angles, NewAngles)
    301.    
    302.     NewAngles[0] -= NewAngles[0] * 2
    303.     set_pev(g_player_main[id], pev_angles, NewAngles)
    304.    
    305.     if(get_user_weapon(id) != CSW_KNIFE)
    306.         engclient_cmd(id, "weapon_knife")
    307. }
    308.  
    309. public fw_main_think(ent)
    310. {
    311.     if(!pev_valid(ent))
    312.         return
    313.     if(pev(ent, pev_health) - 1000.0 < 0)
    314.     {
    315.         if(!g_dead[ent])
    316.             minigun_dead(ent)
    317.            
    318.         return
    319.     }
    320.    
    321.     if(!g_dead[ent])
    322.         entity_set_float(ent,EV_FL_nextthink, halflife_time() + 0.01)  
    323. }
    324.  
    325. public fw_main_takedamage(victim, inflictor, attacker, Float:Damage, damagebits)
    326. {
    327.     if(!is_user_alive(attacker) || !is_user_connected(attacker))
    328.         return HAM_IGNORED
    329.    
    330.     static Health
    331.     Health = pev(victim, pev_health) - 1000
    332.    
    333.     client_print(attacker, print_center, "MW2 Auto-Minigun Health: %i", Health)
    334.    
    335.     return HAM_HANDLED
    336. }
    337.  
    338. public minigun_dead(ent)
    339. {
    340.     g_dead[ent] = 1
    341.    
    342.     static Float:Origin[3]
    343.     pev(ent, pev_origin, Origin)
    344.    
    345.     message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
    346.     write_byte(TE_EXPLOSION)
    347.     engfunc(EngFunc_WriteCoord, Origin[0])
    348.     engfunc(EngFunc_WriteCoord, Origin[1])
    349.     engfunc(EngFunc_WriteCoord, Origin[2])
    350.     write_short(g_exp_id)   // sprite index
    351.     write_byte(30)  // scale in 0.1's
    352.     write_byte(30)  // framerate
    353.     write_byte(0)   // flags
    354.     message_end()
    355.    
    356.     static id
    357.     id = g_owner[ent]
    358.    
    359.     if(is_user_connected(id))
    360.     {
    361.         reset_minigun(id)
    362.         client_printcolor(id, "!g[ZE]!y Your MW2 Auto-Minigun has been !tDestroyed!y !!!")
    363.     }
    364.    
    365.     Origin[0] = 9999.0
    366.     Origin[1] = 9999.0
    367.     Origin[2] = 9999.0
    368.    
    369.     set_pev(ent, pev_origin, Origin)
    370. }
    371.  
    372. public fw_CmdStart(id, uc_handle, seed)
    373. {
    374.     if(!is_user_alive(id) || !is_user_connected(id))
    375.         return FMRES_IGNORED
    376.     if(!g_player_main[id])
    377.         return FMRES_IGNORED
    378.        
    379.     static PressButton
    380.     PressButton = get_uc(uc_handle, UC_Buttons)
    381.    
    382.     if(g_remoting[id])
    383.     {
    384.         if(PressButton & IN_ATTACK)
    385.         {
    386.             static Float:CurTime
    387.             CurTime = get_gametime()
    388.            
    389.             if(CurTime - get_pcvar_float(cvar_delay_attack) > g_last_shoot[id])
    390.             {
    391.                 if(!g_preparing[id] && !g_firing[id] && !g_ending[id])
    392.                 {
    393.                     g_preparing[id] = 1
    394.                     g_firing[id] = 0
    395.                    
    396.                     set_entity_anim(g_player_main[id], 1)
    397.                     set_task(1.5, "start_attack", id)
    398.                    
    399.                     emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[0], 1.0, ATTN_NORM, 0, PITCH_NORM)
    400.                 }
    401.                
    402.                 if(!g_preparing[id] && g_firing[id] && !g_ending[id] && g_heat[g_player_main[id]] < 100)
    403.                 {
    404.                     minigun_shoot(id)
    405.                    
    406.                     if(CurTime - get_pcvar_float(cvar_delay_attack) > g_check_heat[id])
    407.                     {
    408.                         if(g_heat[g_player_main[id]] < 100)
    409.                         {
    410.                             g_heat[g_player_main[id]]++
    411.                         }
    412.                        
    413.                         g_check_heat[id] = CurTime
    414.                     }
    415.                 } else if(g_heat[g_player_main[id]] >= 100) {
    416.                     if(!g_preparing[id] && g_firing[id] && !g_ending[id] && !g_reloading[g_player_main[id]])
    417.                     {
    418.                         g_firing[id] = 0
    419.                         g_preparing[id] = 0
    420.                         g_ending[id] = 1
    421.                        
    422.                         set_entity_anim(g_player_main[id], 3)
    423.                    
    424.                         emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
    425.                         set_task(2.0, "stop_attack", id)
    426.                        
    427.                         static Message[128]
    428.                         formatex(Message, sizeof(Message), "!g[ZE]!y System is overheat. Please wait !t%i!y seconds !!!", get_pcvar_float(cvar_reload_time))
    429.                        
    430.                         client_printcolor(id, Message)
    431.                        
    432.                         g_reloading[g_player_main[id]] = 1
    433.                         set_task(get_pcvar_float(cvar_reload_time), "reload_heat", id)
    434.                     }
    435.                 }
    436.                
    437.                 g_last_shoot[id] = CurTime
    438.             }
    439.            
    440.             PressButton &= ~IN_ATTACK
    441.             set_uc(uc_handle, UC_Buttons, PressButton)
    442.         } else {
    443.             if(pev(id, pev_oldbuttons) & IN_ATTACK)
    444.             {
    445.                 if(g_preparing[id] || g_firing[id])
    446.                 {
    447.                     g_firing[id] = 0
    448.                     g_preparing[id] = 0
    449.                     g_ending[id] = 1
    450.                    
    451.                     set_entity_anim(g_player_main[id], 3)
    452.                    
    453.                     emit_sound(g_player_main[id], CHAN_WEAPON, minigun_sound[2], 1.0, ATTN_NORM, 0, PITCH_NORM)
    454.                     set_task(2.0, "stop_attack", id)
    455.                 }
    456.             }
    457.         }
    458.     }
    459.    
    460.     if(PressButton & IN_USE)
    461.     {
    462.         if(g_remoting[id])
    463.         {
    464.             set_task(1.0, "task_delay2", id)
    465.             attach_view(id, id)
    466.             g_preparing[id] = 0
    467.             g_firing[id] = 0
    468.            
    469.             PressButton &= ~IN_USE
    470.             set_uc(uc_handle, UC_Buttons, PressButton)
    471.         } else {
    472.             if(!task_exists(id+2479))
    473.             {
    474.                 set_task(3.0, "do_remote", id+2479)
    475.                
    476.                 message_begin(MSG_ONE_UNRELIABLE, 108, {0,0,0}, id)
    477.                 write_short(3)
    478.                 message_end()
    479.             }
    480.         }
    481.     } else {
    482.         if(pev(id, pev_oldbuttons) & IN_USE)
    483.         {
    484.             remove_task(id+2479)
    485.  
    486.             message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("BarTime"), {0,0,0}, id)
    487.             write_short(0)
    488.             message_end()
    489.         }
    490.     }
    491.    
    492.     return FMRES_HANDLED
    493. }
    494.  
    495. public reload_heat(id)
    496. {
    497.     if(!pev_valid(g_player_main[id]))
    498.         return
    499.    
    500.     g_heat[g_player_main[id]] = 0
    501.     g_reloading[g_player_main[id]] = 0
    502. }
    503.  
    504. public task_delay2(id)
    505. {
    506.     g_remoting[id] = 0
    507. }
    508.  
    509. public start_attack(id)
    510. {
    511.     g_preparing[id] = 0
    512.     g_firing[id] = 1
    513. }
    514.  
    515. public stop_attack(id)
    516. {
    517.     g_preparing[id] = 0
    518.     g_firing[id] = 0
    519.     g_ending[id] = 0
    520. }
    521.  
    522. public minigun_shoot(id)
    523. {
    524.     if(!g_remoting[id])
    525.     {
    526.         return PLUGIN_HANDLED
    527.     }
    528.    
    529.     static Float:CurTime
    530.     CurTime = get_gametime()
    531.    
    532.     if(CurTime - 0.1 > g_last_firesound[id])
    533.     {
    534.         PlaySound(id, minigun_sound[1])
    535.         emit_sound(g_player_main[id], CHAN_BODY, minigun_sound[1], 1.0, ATTN_NORM, 0, PITCH_NORM)
    536.         g_last_firesound[id] = CurTime
    537.     }
    538.    
    539.     set_entity_anim(g_player_main[id], 2)
    540.    
    541.     static Float:Origin[3], Float:AimOrigin[3]
    542.     get_position(g_player_main[id], 50.0, 0.0, 0.0, Origin)
    543.    
    544.     Origin[2] += 20.0
    545.    
    546.     message_begin(MSG_BROADCAST ,SVC_TEMPENTITY)
    547.     write_byte(TE_EXPLOSION)
    548.     engfunc(EngFunc_WriteCoord, Origin[0])
    549.     engfunc(EngFunc_WriteCoord, Origin[1])
    550.     engfunc(EngFunc_WriteCoord, Origin[2])
    551.     write_short(muzzleflash_spr_id)    // sprite index
    552.     write_byte(5)    // scale in 0.1's
    553.     write_byte(10)    // framerate
    554.     write_byte(4)    // flags
    555.     message_end()  
    556.    
    557.     static Float:Punch[3]
    558.     Punch[0] = random_float(1.0, 5.0)
    559.     Punch[1] = random_float(1.0, 5.0)
    560.     Punch[2] = random_float(1.0, 10.0)
    561.    
    562.     set_pev(id, pev_punchangle, Punch)
    563.                
    564.     get_position(g_player_main[id], 70.0, 0.0, 30.0, Origin)
    565.     get_position(g_player_main[id], 4000.0, 0.0, 30.0, AimOrigin)
    566.     create_tracer(id, Origin, AimOrigin)
    567.    
    568.     get_position(g_player_main[id], 4000.0, -30.0, 50.0, AimOrigin)
    569.     create_tracer(id, Origin, AimOrigin)
    570.    
    571.     get_position(g_player_main[id], 4000.0, 30.0, -50.0, AimOrigin)
    572.     create_tracer(id, Origin, AimOrigin)
    573.    
    574.     get_position(g_player_main[id], 4000.0, -60.0, -70.0, AimOrigin)
    575.     create_tracer(id, Origin, AimOrigin)
    576.    
    577.     get_position(g_player_main[id], 4000.0, 60.0, 70.0, AimOrigin)
    578.     create_tracer(id, Origin, AimOrigin)   
    579.    
    580.     return PLUGIN_HANDLED
    581. }
    582.  
    583. // Ham Weapon Deploy Forward
    584. public fw_Item_Deploy_Post(weapon_ent)
    585. {
    586.     if(pev_valid(weapon_ent))
    587.         return HAM_IGNORED
    588.        
    589.     static id
    590.     id = pev(weapon_ent, pev_owner)
    591.    
    592.     if(g_remoting[id])
    593.         engclient_cmd(id, "weapon_knife")
    594.        
    595.     return HAM_HANDLED
    596. }
    597.  
    598. stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
    599. {
    600.     new Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    601.    
    602.     pev(id, pev_origin, vOrigin)
    603.     pev(id, pev_view_ofs,vUp) //for player
    604.     xs_vec_add(vOrigin,vUp,vOrigin)
    605.     pev(id, pev_v_angle, vAngle) // if normal entity ,use pev_angles
    606.    
    607.     vAngle[0] = 0.0
    608.    
    609.     angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward) //or use EngFunc_AngleVectors
    610.     angle_vector(vAngle,ANGLEVECTOR_RIGHT,vRight)
    611.     angle_vector(vAngle,ANGLEVECTOR_UP,vUp)
    612.    
    613.     vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
    614.     vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
    615.     vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
    616. }
    617.  
    618. stock create_tracer(id, Float:start[3], Float:end[3])
    619. {
    620.     new start_[3], end_[3]
    621.     FVecIVec(start, start_)
    622.     FVecIVec(end, end_)
    623.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    624.     write_byte(TE_TRACER)
    625.     write_coord(start_[0])
    626.     write_coord(start_[1])
    627.     write_coord(start_[2])
    628.     write_coord(end_[0])
    629.     write_coord(end_[1])
    630.     write_coord(end_[2])
    631.     message_end()
    632.    
    633.     static tr, Float:End_Origin[3], Target
    634.     engfunc(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, -1, tr)   
    635.    
    636.     get_tr2(tr, TR_vecEndPos, End_Origin)
    637.     Target = get_tr2(tr, TR_pHit)
    638.    
    639.     if(is_user_alive(Target) && ze_is_user_zombie(Target))
    640.     {
    641.         static Float:Origin[3]
    642.         pev(Target, pev_origin, Origin)
    643.        
    644.         // Show some blood :)
    645.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    646.         write_byte(TE_BLOODSPRITE)
    647.         write_coord(floatround(Origin[0]))
    648.         write_coord(floatround(Origin[1]))
    649.         write_coord(floatround(Origin[2]))
    650.         write_short(g_bloodspray)
    651.         write_short(g_blood)
    652.         write_byte(70)
    653.         write_byte(random_num(1,2))
    654.         message_end()
    655.        
    656.        
    657.         ExecuteHamB(Ham_TakeDamage, Target, 0, id, random_float(get_pcvar_float(cvar_minigun_dmgrand_start), get_pcvar_float(cvar_minigun_dmgrand_end)), DMG_BULLET)
    658.     }
    659.    
    660.     make_bullet(id, End_Origin)
    661. }
    662.  
    663. stock make_bullet(id, Float:Origin[3])
    664. {
    665.     // Find target
    666.     new target, body
    667.     get_user_aiming(id, target, body, 999999)
    668.    
    669.     if(target > 0 && target <= get_maxplayers())
    670.     {
    671.         new Float:fStart[3], Float:fEnd[3], Float:fRes[3], Float:fVel[3]
    672.         pev(id, pev_origin, fStart)
    673.        
    674.         // Get ids view direction
    675.         velocity_by_aim(id, 64, fVel)
    676.        
    677.         // Calculate position where blood should be displayed
    678.         fStart[0] = Origin[0]
    679.         fStart[1] = Origin[1]
    680.         fStart[2] = Origin[2]
    681.         fEnd[0] = fStart[0]+fVel[0]
    682.         fEnd[1] = fStart[1]+fVel[1]
    683.         fEnd[2] = fStart[2]+fVel[2]
    684.        
    685.         // Draw traceline from victims origin into ids view direction to find
    686.         // the location on the wall to put some blood on there
    687.         new res
    688.         engfunc(EngFunc_TraceLine, fStart, fEnd, 0, target, res)
    689.         get_tr2(res, TR_vecEndPos, fRes)
    690.        
    691.         // Show some blood :)
    692.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    693.         write_byte(TE_BLOODSPRITE)
    694.         write_coord(floatround(fStart[0]))
    695.         write_coord(floatround(fStart[1]))
    696.         write_coord(floatround(fStart[2]))
    697.         write_short(g_bloodspray)
    698.         write_short(g_blood)
    699.         write_byte(70)
    700.         write_byte(random_num(1,2))
    701.         message_end()
    702.        
    703.        
    704.         } else {
    705.         new decal = 41
    706.        
    707.         // Check if the wall hit is an entity
    708.         if(target)
    709.         {
    710.             // Put decal on an entity
    711.             message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    712.             write_byte(TE_DECAL)
    713.             write_coord(floatround(Origin[0]))
    714.             write_coord(floatround(Origin[1]))
    715.             write_coord(floatround(Origin[2]))
    716.             write_byte(decal)
    717.             write_short(target)
    718.             message_end()
    719.             } else {
    720.             // Put decal on "world" (a wall)
    721.             message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    722.             write_byte(TE_WORLDDECAL)
    723.             write_coord(floatround(Origin[0]))
    724.             write_coord(floatround(Origin[1]))
    725.             write_coord(floatround(Origin[2]))
    726.             write_byte(decal)
    727.             message_end()
    728.         }
    729.        
    730.         // Show sparcles
    731.         message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    732.         write_byte(TE_GUNSHOTDECAL)
    733.         write_coord(floatround(Origin[0]))
    734.         write_coord(floatround(Origin[1]))
    735.         write_coord(floatround(Origin[2]))
    736.         write_short(id)
    737.         write_byte(decal)
    738.         message_end()
    739.     }
    740. }
    741.  
    742. stock set_entity_anim(ent, anim)
    743. {
    744.     entity_set_float(ent, EV_FL_animtime, get_gametime())
    745.     entity_set_float(ent, EV_FL_framerate, 1.0)
    746.     entity_set_int(ent, EV_INT_sequence, anim)
    747. }
    748.  
    749. stock client_printcolor(const id, const input[], any:...)
    750. {
    751.     new iCount = 1, iPlayers[32]
    752.     static szMsg[191]
    753.    
    754.     vformat(szMsg, charsmax(szMsg), input, 3)
    755.     replace_all(szMsg, 190, "!g", "^4")
    756.     replace_all(szMsg, 190, "!y", "^1")
    757.     replace_all(szMsg, 190, "!t", "^3")
    758.    
    759.     if(id) iPlayers[0] = id
    760.     else get_players(iPlayers, iCount, "ch")
    761.    
    762.     for (new i = 0; i < iCount; i++)
    763.     {
    764.         if(is_user_connected(iPlayers[i]))
    765.         {
    766.             message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, iPlayers[i])
    767.             write_byte(iPlayers[i])
    768.             write_string(szMsg)
    769.             message_end()
    770.         }
    771.     }
    772. }
He who fails to plan is planning to fail

Post Reply

Create an account or sign in to join the discussion

You need to be a member in order to post a reply

Create an account

Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute

Register

Sign in

Who is online

Users browsing this forum: No registered users and 3 guests