NoRecoil или Decals

Сообщения
78
Реакции
3
Помог
1 раз(а)
Добрый день, подскажите пожалуйста, можно ли как-то изменить на кастомных оружиях траекторию полета пули. Пример:
Стреляя с weapon_g3sg1 пули на средних дистанциях очень сильно косит.

Стоит щас pev_punchangle,var_punchangle - а именно контроль отдачи. но это только меняет на сколько будет тряска экрана.

Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>

#define weapon_name    "weapon_sg550"
#define weapon_new    "zombus_cso/weapon_vsk94_zombus"

//Check
#define WEAPON_VSK94_SPECIAL_CODE                    4512322
#define Is_CustomItem(%0)            (pev(%0,pev_impulse)==WEAPON_VSK94_SPECIAL_CODE)

#define model_v        "models/zombus_cso/wzombus/v_vsk94.mdl"
#define model_p        "models/zombus_cso/wzombus/p_vsk94.mdl"
#define model_w        "models/zombus_cso/wzombus/w_cso_weapons3.mdl"
#define WEAPON_MODEL_S "models/zombus_cso/wzombus/shell762.mdl"

new const sounds_dump[][] =
{
    "weapons/vsk94-1.wav"
}

#define sound_shot    "weapons/vsk94-1.wav"

new const precache_dump[][] =
{
    "sprites/zombus_cso/weapon_vsk94_zombus.txt",
    "sprites/zombus_cso/640hard2.spr",
    "sprites/zombus_cso/640hud7.spr"
}

new g_shell

new cvar_weapon_ammo, cvar_weapon_bpammo, cvar_weapon_damage, cvar_weapon_speed, cvar_weapon_punchangle,
cvar_weapon_reloadtime, cvar_weapon_deploytime, cvar_weapon_submodel

new g_iSpriteLaser

public plugin_init()
{
    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)
    
    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_TraceAttack, "func_breakable", "fw_TraceAttack");
    RegisterHam(Ham_TraceAttack, "hostage_entity", "fw_TraceAttack");
    RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack");
    RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack");
    
    RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_Post", 1);
    RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack_Post", 1);   
    
    RegisterHam(Ham_Spawn, "weaponbox", "HookHam_WeaponBox_Spawn", 1)
    
    register_forward(FM_SetModel, "HookFm_SetModel", 0)
    register_forward(FM_UpdateClientData, "HookFm_UpdateClientData", 1)
    
    cvar_weapon_ammo = register_cvar("vsk_ammo", "40")
    cvar_weapon_bpammo = register_cvar("vsk_bpammo", "140")
    cvar_weapon_damage = register_cvar("vsk_damage", "1.0")
    cvar_weapon_speed = register_cvar("vsk_fire_speed", "0.13")
    cvar_weapon_punchangle = register_cvar("vsk_recoil", "1.0")
    cvar_weapon_reloadtime = register_cvar("vsk_reload_time", "3.25")
    cvar_weapon_deploytime = register_cvar("vsk_deploy_time", "0.85")
    cvar_weapon_submodel = register_cvar("vsk_submodel", "19")
    
    register_clcmd(weapon_new,"hook_item")
    register_clcmd("test","get_item")
}

public plugin_precache()
{
    engfunc(EngFunc_PrecacheModel,model_v)
    engfunc(EngFunc_PrecacheModel,model_p)
    engfunc(EngFunc_PrecacheModel,model_w)
    
    g_shell = engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_S);

    new i;
    for(i = 0;i < sizeof(sounds_dump);i++) engfunc(EngFunc_PrecacheSound,sounds_dump[i])
    for(i = 0;i < sizeof(precache_dump);i++) engfunc(EngFunc_PrecacheGeneric,precache_dump[i])

    // Sprites
    g_iSpriteLaser = precache_model( "sprites/lgtning.spr")
}

public zp_buy_ammo_1(id)
{
    new iEnt = get_pdata_cbase(id, 373, 5);
    
    if(!Is_CustomItem(iEnt))
        return;   
}

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

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 < get_pcvar_num(cvar_weapon_bpammo))
        set_pdata_int(id, ammotype, get_pcvar_num(cvar_weapon_bpammo), 5)
        
    set_pdata_int(weapon, 51, get_pcvar_num(cvar_weapon_ammo), 4)
    set_pdata_int(weapon, 57, g_shell, 4);
    
    emit_sound(id, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}

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

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

    set_pev(id, pev_viewmodel2, model_v)
    set_pev(id, pev_weaponmodel2, model_p)
    
    set_pdata_float(ent, 46, get_pcvar_float(cvar_weapon_deploytime), 4)
    set_pdata_float(ent, 47, get_pcvar_float(cvar_weapon_deploytime), 4)
    set_pdata_float(ent, 48, get_pcvar_float(cvar_weapon_deploytime), 4)
    
    set_pdata_int(ent, 74, 0, 4)
    set_pdata_int(ent, 55, 0, 4)
    
    Play_WeaponAnim(id, 2)
    
    return HAM_IGNORED
}
public HookHam_Weapon_Add(ent,id)
{
    switch(pev(ent, pev_impulse))
    {
        case WEAPON_VSK94_SPECIAL_CODE: Weaponlist(id, true)
        case 0: Weaponlist(id, false)
    }
    return HAM_IGNORED
}

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))
    {
        static clip, ammotype, ammo, j;
        
        ammotype = 376 + get_pdata_int(ent, 49, 4);       
        clip = get_pdata_int(ent, 51, 4);
        ammo = get_pdata_int(id, ammotype, 5);
        j = min(get_pcvar_num(cvar_weapon_ammo) - 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);       
    }
    return HAM_IGNORED
}

public HookHam_Weapon_Reload(ent)
{
    if(!Is_CustomItem(ent))
        return HAM_IGNORED;
        
    static clip;
    static id;
    
    clip = get_pdata_int(ent, 51, 4);
    id = get_pdata_cbase(ent, 41, 4);
    
    if(clip == get_pcvar_num(cvar_weapon_ammo))
        return HAM_SUPERCEDE;
        
    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_float(id, 83, get_pcvar_float(cvar_weapon_reloadtime), 5);
    set_pdata_float(ent, 48, get_pcvar_float(cvar_weapon_reloadtime), 4);
    
    Play_WeaponAnim(id, 1);
    
    if(get_pdata_int(id, 363, 5) != 90)
        set_pdata_int(id, 363, 90, 5);
        
    set_pdata_int(ent, 54, 1, 4);
    
    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, 1.7, 4)
    Play_WeaponAnim(get_pdata_cbase(ent, 41, 4), 0)
    
    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, get_pcvar_float(cvar_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)
    
    set_pdata_int(ent, 55, 0, 4)

    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_PlaybackEvent,fm_playbackevent,false)
    
    static Float:user_newpunch[3];pev(id,pev_punchangle,user_newpunch)
    user_newpunch[0]=user_punchangle[0]+(user_newpunch[0]-user_punchangle[0])*get_pcvar_float(cvar_weapon_punchangle)
    user_newpunch[1]=user_punchangle[1]+(user_newpunch[1]-user_punchangle[1])*get_pcvar_float(cvar_weapon_punchangle)
    user_newpunch[2]=user_punchangle[2]+(user_newpunch[2]-user_punchangle[2])*get_pcvar_float(cvar_weapon_punchangle)

    //user_newpunch[0] = random_float(-0.4, 0.4)
    //user_newpunch[1] = random_float(-1.0, 1.0)

    set_pev(id,pev_punchangle,user_newpunch)
    
    emit_sound(id, CHAN_WEAPON,sound_shot,1.0, ATTN_NORM, 0, PITCH_NORM)
    
    Play_WeaponAnim(id, 3)
    
    set_pdata_float(ent,48,2.0,4)
    set_pdata_float(ent,46,get_pcvar_float(cvar_weapon_speed),4)
    set_pdata_float(ent,47,get_pcvar_float(cvar_weapon_speed)+0.1,4)
    set_pdata_int(ent,51,ammo-1,4)
    set_pdata_float(id, 111, get_gametime(), 5);
    
    return HAM_SUPERCEDE
}

public HookFm_SetModel(ent,str[]) <SetModel: Enabled>
{
    state SetModel: Disabled;
    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);
        if(item > 0 && Is_CustomItem(item))
        {
            engfunc(EngFunc_SetModel, ent, model_w);
            set_pev(ent, pev_body, get_pcvar_num(cvar_weapon_submodel))
            return FMRES_SUPERCEDE;
        }
    }
    return FMRES_IGNORED;
}
public HookFm_SetModel() <SetModel: Disabled> { return FMRES_IGNORED; }
public HookFm_SetModel() <> { return FMRES_IGNORED; }
public HookHam_WeaponBox_Spawn(ent) state SetModel: Enabled;
public HookFm_PlayBackEvent()return FMRES_SUPERCEDE

public fw_TraceAttack_Post(victim, attacker, Float:damage, Float:fDir[3], ptr, damagetype) <FireBullets: Enabled>
{
    if(!is_user_connected(attacker)) return HAM_IGNORED;
    static item; item = get_pdata_cbase(attacker, 373, 5);
    if(item <= 0 || !Is_CustomItem(item)) return HAM_IGNORED;
    
    static Float:vecEnd[3];
    get_tr2(ptr, TR_vecEndPos, 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(victim);
    write_byte(random_num(41, 45));
    message_end();
    
    static Float:WallVector[3];
    get_tr2(ptr, 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)    //colorid
    write_short(12)    //count
    write_short(3)    //speed
    write_short(75)    //random velocity
    message_end()   

    new vec2[3]
    get_user_origin(attacker, vec2, 3)
    make_beam(attacker, vec2, g_iSpriteLaser, 94, 7, 224, 100)
    
    return HAM_IGNORED;
}

public fw_TraceAttack_Post() <FireBullets: Disabled> { return HAM_IGNORED; }
public fw_TraceAttack_Post() <> { 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
}

stock make_weapon()
{
    static ent;
    static 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_VSK94_SPECIAL_CODE);
    
    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, get_user_msgid("WeaponList"), _, id);
    write_string(set==false?weapon_name:weapon_new);
    write_byte(4);
    write_byte(get_pcvar_num(cvar_weapon_bpammo));
    write_byte(-1);
    write_byte(-1);
    write_byte(0);
    write_byte(16);
    write_byte(13);
    write_byte(0);
    message_end();
}

public fw_TraceAttack(victim, attacker, Float:damage, Float:fDir[3]) <FireBullets: Enabled>
{
    if(!is_user_alive(attacker))
        return HAM_IGNORED;
        
    static item;
    item = get_pdata_cbase(attacker, 373, 5);
    
    if(item <= 0 || !Is_CustomItem(item))
        return HAM_IGNORED;
        
    SetHamParamFloat(3, damage * get_pcvar_float(cvar_weapon_damage));
    return HAM_IGNORED;
}

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

make_beam(id, const origin[3], sprite, red, green, blue, alpha)
{
    //BEAMENTPOINTS
    message_begin( MSG_BROADCAST,SVC_TEMPENTITY)
    write_byte (TE_BEAMENTPOINT)
    write_short(id | 0x1000)
    write_coord(origin[0])
    write_coord(origin[1])
    write_coord(origin[2])
    write_short(sprite) // sprite
    write_byte(1) // framestart
    write_byte(5) // framerate
    write_byte(1) // life
    write_byte(20) // width
    write_byte(0) // noise
    write_byte(red) // r, g, b
    write_byte(green) // r, g, b
    write_byte(blue) // r, g, b
    write_byte(alpha) // brightness
    write_byte(150) // speed
    message_end()
}
 
Сообщения
927
Реакции
548
Помог
13 раз(а)
добавь после атаки
PHP:
#define m_Weapon_iShotsFired                64
#define linux_diff_weapon                   4
set_pdata_int(ent, m_Weapon_iShotsFired, 0, linux_diff_weapon);
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу