Raised This Month: $32 Target: $400
 8% 

Add an exception to Weapon Physics plugin


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
sekac
Senior Member
Join Date: Nov 2016
Old 07-17-2018 , 12:34   Add an exception to Weapon Physics plugin
Reply With Quote #1

Can someone make it so if you shoot the C4, nothing happens? Also if something explodes near the C4 it shouldn't get affected by it either.

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

sekac is offline
666
Senior Member
Join Date: Mar 2015
Old 07-18-2018 , 22:43   Re: Add an exception to Weapon Physics plugin
Reply With Quote #2

Quote:
Originally Posted by sekac View Post
Can someone make it so if you shoot the C4, nothing happens? Also if something explodes near the C4 it shouldn't get affected by it either.

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

EDIT AND TEST

PHP Code:
public shoot_item(entattackerFloat:damageFloat:direction[3], tracedamagebits
{
    new 
Model32 ];
    
peventpev_modelModel31 );
    
    if( 
containiModel"w_backpack" ) != -1)
        return 
HAM_SUPERCEDE
        
    
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 

666 is offline
sekac
Senior Member
Join Date: Nov 2016
Old 07-19-2018 , 13:21   Re: Add an exception to Weapon Physics plugin
Reply With Quote #3

It works, but grenades can still move it
sekac is offline
Ghosted
Veteran Member
Join Date: Apr 2015
Location: Georgia
Old 07-19-2018 , 14:14   Re: Add an exception to Weapon Physics plugin
Reply With Quote #4

Quote:
Originally Posted by 666 View Post
EDIT AND TEST

PHP Code:
public shoot_item(entattackerFloat:damageFloat:direction[3], tracedamagebits
{
    new 
Model32 ];
    
peventpev_modelModel31 );
    
    if( 
containiModel"w_backpack" ) != -1)
        return 
HAM_SUPERCEDE
        
    
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 

I smell hell ...
__________________

[MOD] CS Weapon Mod V1.7.1
[MM] MetaMod-C V1.0
[MOD] CS NPC Mod (5%)


Probably Left AM
Ghosted is offline
666
Senior Member
Join Date: Mar 2015
Old 07-19-2018 , 20:36   Re: Add an exception to Weapon Physics plugin
Reply With Quote #5

Quote:
Originally Posted by sekac View Post
It works, but grenades can still move it
ADD CODE IN DAMAGE_ITEM

PHP Code:
    new Model32 ]; 
    
peventpev_modelModel31 ); 
     
    if( 
containiModel"w_backpack" ) != -1
        return 
HAM_SUPERCEDE 
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 18:15.


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