Код:
/*
v0.1 - v0.1c [02.08.2011] - first release + code fix
v0.2 [04.08.2011] - added lie flat
v0.3 [26.08.2011] (+KORD_12.7 optimizations) - 1)added reflect damage, 2)added sounds, 3)removed cvar "spin", 4)fixed cvar "jump"
v0.4 [17.10.2011] 1)removed sound cvar 2)added shoot reaction 3)optimizations
http://aghl.ru/forum/ - Russian Half-Life and Adrenaline Gamer Community
Code has taken from "Weapon_Physics" & "Lie_Flat" by author "Nexus"
*/
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <xs>
#define WP_BLOCK(%1) (1 << %1 & ~(1 << 19 | 1 << 25 | 1 << 26))
/* <<< OPTIONS >>> */
//#define Half_Life // comment this to enable for cstrike !
new g_reflect, g_MaxPlayers
new const g_classes[][] =
{
#if defined Half_Life
"info_target",
"weaponbox"
#endif
#if !defined Half_Life
"info_target",
"weaponbox",
"item_thighpack",
"armoury_entity",
// shield - must be lastest!
"weapon_shield"
#endif
}
#define PLUGIN "hl_weapon_physics"
#define VERSION "0.4"
#define AUTHOR "Turanga_Leela"
new const wp_sounds[][] =
{
"debris/metal6.wav",
"items/weapondrop1.wav"
}
public plugin_precache()
{
for(new i; i < sizeof wp_sounds; i++)
precache_sound(wp_sounds[i])
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_forward(FM_PlaybackEvent, "Play_back_event_Pre")
g_MaxPlayers = get_maxplayers()
g_reflect = register_cvar("hl_wp_reflect", "1")
for(new h; h < sizeof g_classes; h++)
{
RegisterHam(Ham_Spawn, g_classes[h], "Spawn_Post", 1)
RegisterHam(Ham_Touch, g_classes[h], "Touch_Post", 1)
RegisterHam(Ham_TakeDamage, g_classes[h], "TakeDamage_Pre")
}
}
/*
Class: weaponbox
Model: models/w_fiveseven.mdl
Index: 110
Solid: 1
Flags: 512
*/
public Touch_Post(ent, touched)
{
if(check_pev(touched, pev_solid) < SOLID_BSP) return
//func_a_vel(ent, 1)
emit_sound_func(ent, 0.25, 1)
static
trace,
Float:vel[3],
Float:origin[3],
Float:angles[3],
Float:trace_to[3],
Float:right[3],
Float:up[3],
Float:fwd[3],
Float:angles2[3],
Float:vector[3],
Float:change_a_vel[3]
pev(ent, pev_velocity, vel)
xs_vec_mul_scalar(vel, 0.4, vel)
set_pev(ent, pev_velocity, vel)
pev(ent, pev_origin, origin)
pev(ent, pev_angles, angles)
xs_vec_sub(origin, Float:{0.0, 0.0, 10.0}, trace_to)
engfunc(EngFunc_TraceLine, origin, trace_to, IGNORE_MONSTERS, ent, trace)
angle_vector(angles, ANGLEVECTOR_FORWARD, vector)
get_tr2(trace, TR_vecPlaneNormal, up)
if(!up[2]) return
xs_vec_cross(vector, up, right)
xs_vec_cross(up, right, fwd)
vector_to_angle(fwd, angles)
vector_to_angle(right, angles2)
angles[2] = -1.0 * angles2[0]
set_pev(ent, pev_angles, angles)
change_a_vel[0] = angles[1] + vel[2] - angles[2] + vel[1]
change_a_vel[1] = angles[2] + vel[0] - angles[0] + vel[2]
change_a_vel[2] = angles[0] + vel[1] - angles[1] + vel[0]
set_pev(ent, pev_avelocity, change_a_vel)
}
check_pev(ent, pev_is)
{
return pev(ent, pev_is)
}
public Play_back_event_Pre(flags, id, eventid)
{
if(eventid < 29 && 1 << eventid & ~(1 << 19 | 1 << 25 | 1 << 26))
{
static
ent,
Float:start_aim[3],
end_aim[3],
Float:end_aim_f[3]//,
//class[32]
pev(id, pev_origin, start_aim)
get_user_origin(id, end_aim, 3)
for(new v; v < 3; v++)
end_aim_f[v] = float(end_aim[v])
while((ent = engfunc(EngFunc_FindEntityInSphere, ent, end_aim_f, 25.0)) != 0)
{
if(ent <= g_MaxPlayers) return
if(!(check_pev(ent, pev_flags) & FL_ONGROUND || 1 << check_pev(ent, pev_solid) & (1 << SOLID_BBOX | 1 << SOLID_TRIGGER))) return
continue_func(ent, id, start_aim, end_aim_f, 1)
/*
pev(ent, pev_classname, class, charsmax(class))
if(equali(class, "fakeweapon"))
continue_func(ent, id, start_aim, end_aim_f, 1)
else if(equali(class, "weapon_shield"))
continue_func(ent, id, start_aim, end_aim_f, 0)
else
{
for(new i = 1; i < sizeof g_classes - 1; i++)
{
if(equali(class, g_classes[i]))
continue_func(ent, id, start_aim, end_aim_f, 1)
}
}
*/
}
}
}
///*
continue_func(ent, id, Float:start[], Float:end[], mode)
{
static Trace, Float:damage
engfunc(EngFunc_TraceModel, start, end, HULL_POINT, ent, Trace)
if(get_tr2(Trace, TR_pHit) == ent)
{
func_a_vel(ent, mode)
emit_sound_func(ent, 0.5, 0)
switch(get_user_weapon(id))
{
case CSW_USP, CSW_ELITE, CSW_GLOCK18, CSW_FIVESEVEN, CSW_P228: damage = 30.0
case CSW_MAC10, CSW_TMP: damage = 35.0
case CSW_MP5NAVY, CSW_UMP45, CSW_P90: damage = 40.0
case CSW_M249, CSW_DEAGLE, CSW_M3, CSW_XM1014: damage = 45.0
case CSW_M4A1, CSW_AK47, CSW_SG552, CSW_AUG, CSW_GALIL, CSW_FAMAS: damage = 50.0
case CSW_SCOUT, CSW_SG550, CSW_G3SG1: damage = 55.0
case CSW_AWP: damage = 60.0
default: return 0
}
ExecuteHamB(Ham_TakeDamage, ent, id, id, damage, DMG_BULLET)
}
return 1
}
//*/
func_a_vel(ent, mode)
{
static Float:avel[3]
for(new j; j < 3; j++)
avel[j] = random_float(-25.0, 25.0)
if(mode)
{
avel[0] *= 2
avel[1] *= 4
avel[2] *= 2
}
set_pev(ent, pev_avelocity, avel)
}
emit_sound_func(ent, Float:value, mode)
{
engfunc(EngFunc_EmitSound, ent, CHAN_AUTO, wp_sounds[mode], value, ATTN_STATIC, 0, PITCH_NORM)
}
public Spawn_Post(ent)
{
set_pev(ent, pev_takedamage, DAMAGE_YES)
set_pev(ent, pev_health, 100.0)
set_pev(ent, pev_movetype, MOVETYPE_BOUNCE)
func_a_vel(ent, 0)
}
public TakeDamage_Pre(ent, inflictor, attacker, Float:damage, damagebits)
{
if(!get_pcvar_num(g_reflect)) return
static
Float:ent_vel[3],
Float:ent_origin[3],
Float:inflictor_origin[3],
Float:temp[3]
if(damage > 150.0) damage = 150.0
pev(ent, pev_velocity, ent_vel)
pev(ent, pev_origin, ent_origin)
pev(inflictor, pev_origin, inflictor_origin)
xs_vec_sub(ent_origin, inflictor_origin, temp)
xs_vec_mul_scalar(temp, damage * 22 / get_distance_f(inflictor_origin, ent_origin), temp)
xs_vec_add(temp, ent_vel, ent_vel)
set_pev(ent, pev_velocity, ent_vel)
SetHamParamFloat(4, 0.0)
}