Raised This Month: $51 Target: $400
 12% 

Disable weapon bounce when drop


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
666
Senior Member
Join Date: Mar 2015
Old 11-17-2018 , 20:31   Disable weapon bounce when drop
Reply With Quote #1

I want to disable the rebound of weapons when they are thrown, since they bounce 2 times and does not let pick up the weapon while it bounces or even better that players can pick up weapons in the air

PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <xs>

#if AMXX_VERSION_NUM < 180

    #define HAM_IGNORED 1
    #define HAM_HANDLED 2
    #define Ham_Spawn Ham:0
    #define Ham_TraceAttack Ham:8
    #define Ham_TakeDamage Ham:9
    #define Ham_Touch Ham:42
    
    
native HamHook:RegisterHam(Ham:function, const EntityClass[], const Callback[], Post=0)
    
native SetHamParamFloat(whichFloat:value)
    
native DisableHamForward(HamHook:fwd)
    
native EnableHamForward(HamHook:fwd)

#else

    #include <hamsandwich>

#endif

#define PLUGIN "Weapon Physics"
#define VERSION "2.1"
#define AUTHOR "Nomexous"

/*

Version 1.0
 - Initial release.

Version 2.0
 - Added. Ability to compile on amxmodx.org's online compiler.
 - Added. Menu for enabling/disabling the plugin.
 - Added. Ability for weapons to be moved when shot.
 - Added. Sparks when weapon hits a wall while moving above a certain speed.
 - Added. Hooking of custom classes.
 - Fixed. Looping bounce sound when touching dead bodies in DoD.
 
Version 2.1
 - Fixed. Custom item spawn debug message removed.
 - Fixed. Non-visible entities no longer react to explosions (e.g. armoury_entities that have been picked up).
 - Changed. Shooting of weapons now off by default.
 - Added. Menu option for weapon clatter.

*/

#define BOUNCE "items/weapondrop1.wav"
#define RIC "debris/metal6.wav"

// Persistant items that don't disappear when picked up.
new const persistant[][] = { "armoury_entity" }

// Dropped items.
new const classes[][] = { "weaponbox""item_thighpack""weapon_shield" }

// The base is what the entity is created as, e.g. ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")).
// Put all of them here. Make sure that this custom entity can take damage, otherwise it won't work!
new const custom_base[][] = { "info_target" }
// What the entity's classname is changed to after it's created, e.g. set_pev(ent, pev_classname, "fakeweapon")
new const custom_classname[][] = { "fakeweapon" }

#define HOOK_COUNT 4 * (sizeof persistant + sizeof classes + sizeof custom_base)

new HamHook:hamhooks[HOOK_COUNT]
new 
traceline_fid 0

new custom_countshootweapons_pcvarphysics_pcvarclatter_sound_pcvar

new Float:multiplier 15.0

public plugin_precache()
{
    
custom_count sizeof custom_classname
    precache_sound
(BOUNCE)
    
precache_sound(RIC)
    
    
physics_pcvar register_cvar("weapon_physics_enabled""1")
    
shootweapons_pcvar register_cvar("weapon_physics_shoot_weapons""0")
    
clatter_sound_pcvar register_cvar("weapon_physics_weapons_clatter""1")
    
    
do_ham_hooks()
}

public 
do_ham_hooks()
{
    new 
count 0
    
    
for (new isizeof persistanti++)
    {
        
hamhooks[count++] = RegisterHam(Ham_Spawnpersistant[i], "spawn_persistant_item"1)
        
hamhooks[count++] = RegisterHam(Ham_Touchpersistant[i], "touch_item")
        
hamhooks[count++] = RegisterHam(Ham_TakeDamagepersistant[i], "damage_item")
        
hamhooks[count++] = RegisterHam(Ham_TraceAttackpersistant[i], "shoot_item")
    }
    
    for (new 
xsizeof classesx++)
    {
        
hamhooks[count++] = RegisterHam(Ham_Spawnclasses[x], "spawn_item"1)
        
hamhooks[count++] = RegisterHam(Ham_Touchclasses[x], "touch_item")
        
hamhooks[count++] = RegisterHam(Ham_TakeDamageclasses[x], "damage_item")
        
hamhooks[count++] = RegisterHam(Ham_TraceAttackclasses[x], "shoot_item")
    }
    
    for (new 
nsizeof custom_basen++)
    {
        
hamhooks[count++] = RegisterHam(Ham_Spawncustom_base[n], "spawn_custom_item"1)
        
hamhooks[count++] = RegisterHam(Ham_Touchcustom_base[n], "touch_custom_item")
        
hamhooks[count++] = RegisterHam(Ham_TakeDamagecustom_base[n], "damage_custom_item")
        
hamhooks[count++] = RegisterHam(Ham_TraceAttackcustom_base[n], "shoot_item")
    }
}

public 
update_hooks_and_forwards()
{
    if (
get_pcvar_num(physics_pcvar))
    {
        for (new 
isizeof hamhooksi++)
        {
            
EnableHamForward(hamhooks[i])
        }
    }
    else
    {
        for (new 
isizeof hamhooksi++)
        {
            
DisableHamForward(hamhooks[i])
        }
    }
    
    if (
get_pcvar_num(shootweapons_pcvar) && get_pcvar_num(physics_pcvar) && !traceline_fid)
    {
        
traceline_fid register_forward(FM_TraceLine"fw_traceline")
    }
    
    if ((!
get_pcvar_num(shootweapons_pcvar) || !get_pcvar_num(physics_pcvar)) && traceline_fid)
    {
        
unregister_forward(FM_TraceLinetraceline_fid)
        
traceline_fid 0
    
}
}

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
register_event("HLTV""restart""a""1=0""2=0")
    
    
update_hooks_and_forwards()
    
    
register_clcmd("amx_weapon_physics_menu""conjure_menu"ADMIN_SLAY"Shows weapon physics menu.")
    
    
// This multiplier controls how fast the grenade will propel items. Originally, I wanted it to just be proportional to
    // the damage, but CZ and CS has different grenade strengths. Add your own here.
    
new mods[][] = { "cstrike""czero" }
    new 
Float:mult[] = { 22.0,  17.0 }
    
    new 
modname[10]
    
get_modname(modname9)
    
    for (new 
isizeof modsi++)
    {
        if (
equal(modnamemods[i]))
        {
            
multiplier mult[i]
        }
    }
}

public 
conjure_menu(idlevelcid)
{
    if (
cmd_access(idlevelcid1))
    {
        
wpm(id)
    }
    return 
PLUGIN_HANDLED
}

public 
wpm(id)
{
    static 
wpmenu
    
    wpmenu 
menu_create("Weapon Physics""menu_h")
    
    
get_pcvar_num(physics_pcvar) ? menu_additem(wpmenu"Weapon physics: \yEnabled""1") : menu_additem(wpmenu"Weapon phyics: \rDisabled""1")
    
get_pcvar_num(shootweapons_pcvar) ? menu_additem(wpmenu"Shoot weapons: \yEnabled""2") : menu_additem(wpmenu"Shoot weapons: \rDisabled""2")
    
get_pcvar_num(clatter_sound_pcvar) ? menu_additem(wpmenu"Weapons clatter: \yEnabled""3") : menu_additem(wpmenu"Weapons clatter: \rDisabled""3")
    
    
menu_display(idwpmenu0)
    return 
PLUGIN_HANDLED
}

public 
menu_h(idmenuitem)
{
    switch (
item)
    {
        case 
0:
        {
            
set_pcvar_num(physics_pcvar, !get_pcvar_num(physics_pcvar))
        }
        
        case 
1:
        {
            
set_pcvar_num(shootweapons_pcvar, !get_pcvar_num(shootweapons_pcvar))
        }
        
        case 
2:
        {
            
set_pcvar_num(clatter_sound_pcvar, !get_pcvar_num(clatter_sound_pcvar))
        }
        
        default:
        {
            
update_hooks_and_forwards()
            
menu_destroy(menu)
            return 
PLUGIN_HANDLED
        
}
    }
    
    
menu_destroy(menu)
    
wpm(id)
    return 
PLUGIN_HANDLED
}

public 
restart()
{
    for (new 
isizeof persistanti++)
    {
        new 
o
        
while ((engfunc(EngFunc_FindEntityByStringo"classname"persistant[i])))
        {
            static 
Float:origin[3], Float:angles[3]
            
pev(opev_vuser1origin)
            
pev(opev_vuser2angles)
            
set_pev(opev_anglesangles)
            
set_pev(opev_avelocityFloat:{0.00.00.0})
            
engfunc(EngFunc_SetOriginoorigin)
            
engfunc(EngFunc_DropToFlooro)
        }
    }
}

public 
spawn_item(ent)
{
    
set_pev(entpev_movetypeMOVETYPE_BOUNCE)
    
set_pev(entpev_takedamageDAMAGE_YES)
    
set_pev(entpev_health100.0)
    
    return 
HAM_IGNORED
}

public 
spawn_persistant_item(ent)
{
    
set_pev(entpev_movetypeMOVETYPE_BOUNCE)
    
set_pev(entpev_takedamageDAMAGE_YES)
    
set_pev(entpev_health100.0)
    
    new 
Float:origin[3], Float:angles[3]
    
pev(entpev_originorigin)
    
pev(entpev_anglesangles)
    
set_pev(entpev_vuser1origin)
    
set_pev(entpev_vuser2angles)
    
    return 
HAM_IGNORED
}

public 
spawn_custom_item(ent)
{
    if (
is_custom_ent(ent))
    {
        return 
spawn_item(ent)
    }
    return 
HAM_IGNORED
}

public 
damage_item(entinflictorattackerFloat:damagedamagebits)
{
    if (
pev(entpev_effects) & EF_NODRAW) return HAM_IGNORED
    
    
static Float:ent_v[3], Float:ent_o[3], Float:inflictor_o[3], Float:temp[3]
    
pev(entpev_velocityent_v)
    
pev(entpev_originent_o)
    
pev(inflictorpev_origininflictor_o)
    
xs_vec_sub(ent_oinflictor_otemp)
    
xs_vec_normalize(temptemp)
    
xs_vec_mul_scalar(tempdamagetemp)
    
xs_vec_mul_scalar(tempmultipliertemp)
    
xs_vec_add(ent_vtempent_v)
    
set_pev(entpev_velocityent_v)
    
    
// Set a random yaw. I would've set random pitch and roll, but then the weapons don't land flat, even with my Lie Flat plugin.
    
static Float:av[3]
    
//av[0] = random_float(-1000.0, 1000.0)
    
av[1] = random_float(-1000.01000.0)
    
//av[2] = random_float(-1000.0, 1000.0)
    
set_pev(entpev_avelocityav)
    
    
SetHamParamFloat(40.0)
    return 
HAM_HANDLED
}

public 
damage_custom_item(entinflictorattackerFloat:damagedamagebits)
{
    if (
is_custom_ent(ent))
    {
        static 
Float:ent_v[3], Float:ent_o[3], Float:inflictor_o[3], Float:temp[3]
        
pev(entpev_velocityent_v)
        
pev(entpev_originent_o)
        
pev(inflictorpev_origininflictor_o)
        
xs_vec_sub(ent_oinflictor_otemp)
        
xs_vec_normalize(temptemp)
        
xs_vec_mul_scalar(tempdamagetemp)
        
xs_vec_mul_scalar(tempmultipliertemp)
        
xs_vec_add(ent_vtempent_v)
        
set_pev(entpev_velocityent_v)
        
        
// Set a random yaw. I would've set random pitch and roll, but then the weapons don't land flat, even with my Lie Flat plugin.
        
static Float:av[3]
        
av[1] = random_float(-1000.01000.0)
        
set_pev(entpev_avelocityav)
        
        
SetHamParamFloat(40.0)
        return 
HAM_HANDLED
    
}
    return 
HAM_IGNORED
}

public 
touch_item(enttouched)
{
    if (
pev(touchedpev_solid) < SOLID_BBOX) return HAM_IGNORED
    
    
if (<= touched <= 32) return HAM_IGNORED // Prevents bugginess when someone drops a gun (or in DoD, when a gun gets stuck inside a dead body).
    
    
static Float:v[3]
    
pev(entpev_velocityv)
    
    if (
xs_vec_len(v) > 700.0)
    {
        static 
Float:origin[3]
        
pev(entpev_originorigin)
        
origin[0] += random_float(-10.010.0)
        
origin[1] += random_float(-10.010.0)
        
origin[2] += random_float(-10.010.0)
        
draw_spark(origin)
    }
    
    
xs_vec_mul_scalar(v0.4v)
    
set_pev(entpev_velocityv)
    
    if (
get_pcvar_num(clatter_sound_pcvar))
    {
        
engfunc(EngFunc_EmitSoundentCHAN_WEAPONBOUNCE0.25ATTN_STATIC0PITCH_NORM)
    }
    
    return 
HAM_IGNORED
}

public 
touch_custom_item(enttouched)
{
    if (
is_custom_ent(ent))
    {
        return 
touch_item(enttouched)
    }
    return 
HAM_IGNORED
}

public 
shoot_item(entattackerFloat:damageFloat:direction[3], tracedamagebits)
{
    static 
Float:endpoint[3]
    
get_tr2(traceTR_vecEndPosendpoint)
    
draw_spark(endpoint)
    
    static 
Float:velocity[3]
    
pev(entpev_velocityvelocity)
    
    
xs_vec_mul_scalar(directiondamagedirection)
    
xs_vec_mul_scalar(directionmultiplierdirection)
    
xs_vec_add(directionvelocityvelocity)
    
set_pev(entpev_velocityvelocity)
    
    
engfunc(EngFunc_EmitSoundentCHAN_ITEMRIC0.5ATTN_STATIC0PITCH_NORM)
    
    return 
HAM_IGNORED
}

public 
fw_traceline(Float:start[3], Float:end[3], conditionsidtrace)
{
    
// Spectators don't need to run this.
    
if (!is_user_alive(id)) return FMRES_IGNORED
    
    
// If we hit a player, don't bother searching for an item nearby.
    
if (is_user_alive(get_tr2(traceTR_pHit))) return FMRES_IGNORED
    
    
static Float:endpt[3], tr 0i
    
    get_tr2
(traceTR_vecEndPosendpt)
    
    
0
    
    
while ((engfunc(EngFunc_FindEntityInSphereiendpt20.0)))
    {
        if (
is_shootable_ent(i))
        {
            
engfunc(EngFunc_TraceModelstartendHULL_POINTitr)
        
            if (
pev_valid(get_tr2(trTR_pHit)))
            {
                
get_tr2(trTR_vecEndPosendpt)
                
set_tr2(traceTR_vecEndPosendpt)
                
                
set_tr2(traceTR_pHiti)
                
                return 
FMRES_IGNORED
            
}
        }
    }
    
    return 
FMRES_IGNORED
}

public 
is_shootable_ent(ent)
{
    static 
classname[32]
    
pev(entpev_classnameclassname31)
    
    for (new 
isizeof classesi++)
    {
        if (
equal(classnameclasses[i]))
        {
            return 
true
        
}
    }
    
    for (new 
isizeof persistanti++)
    {
        if (
equal(classnamepersistant[i]))
        {
            return 
true
        
}
    }
    
    for (new 
isizeof custom_classnamei++)
    {
        if (
equal(classnamecustom_classname[i]))
        {
            return 
true
        
}
    }
    
    return 
false
}

public 
is_custom_ent(ent)
{
    static 
classname[40]
    
pev(entpev_classnameclassname39)
    
    for (new 
icustom_counti++)
    {
        if (
equal(classnamecustom_classname[i]))
        {
            return 
true
        
}
    }
    
    return 
false
}

stock draw_spark(Float:origin[3])
{
    
message_begin(MSG_ALLSVC_TEMPENTITY)
    
write_byte(TE_SPARKS)
    
engfunc(EngFunc_WriteCoordorigin[0])
    
engfunc(EngFunc_WriteCoordorigin[1])
    
engfunc(EngFunc_WriteCoordorigin[2])
    
message_end()    


Last edited by 666; 11-19-2018 at 15:44.
666 is offline
Reply



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

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

Forum Jump


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


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