PHP Code:
/*
*
* Date creation: / v0.1 - 07.05.11, v0.2 - 15.05.11, v0.3 - 09.07.11, v0.4 - 13.07.11, v0.4a - 18.07.11
*
* v0.1 - [first release]
* v0.2 - [removed sound on activate & few little errors]
* v0.3 - [code little rewriting]
* v0.4 - [1)added chek cvar "mp_weaponstay", 2)added cvar "amx_HL_hurt_player"]
* v0.4a - [1)added chek on hit - victim alive ?, 2)fix HANDGRENADE touch, 3)fix "4" cvar 1-st value, 4)Now support damager plugin, 5)Fixed plugin run time error with HLW_MP5(then grenade throw & weapon swiched)].
*
* http://aghl.ru/forum/ - Russian Half-Life and Adrenaline Gamer Community
*
*/
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#define PLUGIN "activate on shoot"
#define VERSION "0.4a"
#define AUTHOR "Turanga_Leela"
new drop, push, use, pain
new const func_classes[][] =
{
"func_door",
"func_door_rotating",
"func_button"
}
new const monsters[][] =
{
"monster_satchel",
"grenade",
"monster_snark"
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
set_task(0.0, "map_restart")
for(new u; u < sizeof func_classes; u++)
RegisterHam(Ham_TraceAttack, func_classes[u], "classes_TraceAttack", 1)
RegisterHam(Ham_TraceAttack, "func_pushable", "pushable", 1)
for(new i; i < sizeof monsters; i++)
RegisterHam(Ham_Touch, monsters[i], "monsters_touch", 1)
drop = register_cvar("amx_HL_drop_on_touch", "1")
push = register_cvar("amx_HL_push_objects", "1")
use = register_cvar("amx_HL_use_objects", "1")
pain = register_cvar("amx_HL_hurt_player", "1")
}
public map_restart()
{
if(get_cvar_num("mp_weaponstay"))
{
set_cvar_num("mp_weaponstay", 0)
server_cmd("restart")
}
}
public pushable(this)
velocity_func(this, 0, 1)
velocity_func(ent, victim, mode)
{
if(!get_pcvar_num(push)) return;
new Float:vel[3]
switch(mode)
{
case 1: // func_pushable
{
vel[0] = random_float(-125.0, 125.0), vel[1] = random_float(-125.0, 125.0), vel[2] = random_float(25.0, 125.0)
set_pev(ent, pev_velocity, vel)
}
case 2: // player
{
pev(ent, pev_velocity, vel)
vel[0] *= 2, vel[1] *= 2, vel[2] *= 2
set_pev(victim, pev_velocity, vel)
}
}
}
public classes_TraceAttack(this, idattacker)
use_func(this, idattacker)
use_func(this, agressor)
{
if(get_pcvar_num(use))
ExecuteHamB(Ham_Use, this, agressor, agressor, 2, 1.0)
}
public monsters_touch(monster, target)
{
new array[32]
new owner = pev(monster, pev_owner)
pev(target, pev_classname, array, charsmax(array))
if(equal(array, "func_door") || equal(array, "func_door_rotating") || equal(array, "func_button"))
use_func(target, owner)
else if(equal(array, "func_pushable"))
velocity_func(monster, target, 1)
else if(equal(array, "player"))
{
if(!is_user_alive(target) || target == owner ) return
new skip
pev(monster, pev_model, array, charsmax(array))
if(equal(array, "models/w_grenade.mdl")) set_pev(monster, pev_solid, SOLID_NOT)
else if(equal(array, "models/w_squeak.mdl")) skip = 1
else if(equal(array, "models/w_satchel.mdl")) skip = 0
else return // HLW_MP5(grenade) has NO model "o_O"
if(get_pcvar_num(drop))
console_cmd(target, "drop")
velocity_func(monster, target, 2)
if(!skip)
hurt_func(owner, target, get_pcvar_num(pain), monster)
}
}
hurt_func(killer, victim, mode, inflictor)
{
new damage
switch(mode)
{
case 0: return
case 1:
{
new Float: kil_orig[3], Float: vic_orig[3]
pev(victim, pev_origin, vic_orig), pev(killer, pev_origin, kil_orig)
damage = floatround(get_distance_f(kil_orig, vic_orig)) / 32
}
case 2,3,4,5,6,7,8,9,10,11: damage = random(get_pcvar_num(pain))
default: damage = get_pcvar_num(pain)
}
(pev(victim, pev_health) - float(damage) >= 1.0) ? (ExecuteHamB(Ham_TakeDamage, victim, inflictor, killer, float(damage), 0)):ExecuteHamB(Ham_Killed, victim, killer, 2)
}