Code: Select all
#include <amxmodx>
#include <biohazard>
#include <hamsandwich>
#include <fakemeta_util>
#define DISABLE_TIME 2.0
#define STR_T 32
#define MAX_PLAYERS 32
#define D_ZOMBIE_NAME "Witch"
#define D_ZOMBIE_DESC "Space"
#define D_PLAYER_MODEL "models/player/Biohazard32/bio32_witch/witch.mdl"
#define D_CLAWS "models/bio32/v_knife_witch.mdl"
new g_class
new cvar_speed, g_smoke, cvar_minillum, cvar_damage, cvar_delay
new Float:g_wallorigin[33][3]
new Float:g_nextdmg[33]
new Float:g_shoottime[33]
new bool:g_bCantFly[33]
public plugin_init() {
register_plugin("bio_witchzombie","1.2b","bipbip")
is_biomod_active() ? plugin_init2() : pause("ad")
}
public plugin_precache() {
precache_model(D_PLAYER_MODEL)
precache_model(D_CLAWS)
g_smoke = precache_model( "sprites/steam1.spr" )
}
public plugin_init2() {
g_class = register_class(D_ZOMBIE_NAME, D_ZOMBIE_DESC)
if(g_class != -1)
{
set_class_data(g_class, DATA_HEALTH, 333.0)
set_class_data(g_class, DATA_SPEED, 280.0)
set_class_data(g_class, DATA_GRAVITY, 0.8)
set_class_data(g_class, DATA_REGENDLY, 0.3)
set_class_pmodel(g_class, D_PLAYER_MODEL)
set_class_wmodel(g_class, D_CLAWS)
}
cvar_speed = register_cvar("bh_zm_climbingspeed", "220")
cvar_minillum = register_cvar("bh_zm_minlight", "300")
cvar_damage = register_cvar("bh_zm_lightdamage", "0")
cvar_delay = register_cvar("bh_zm_climbdelay", "0")
RegisterHam(Ham_Touch, "player", "cheese_player_touch", 1)
RegisterHam(Ham_Player_PreThink, "player", "cheese_player_prethink", 1)
RegisterHam(Ham_TakeDamage, "player", "cheese_takedamage", 1)
}
public cheese_player_touch(id, world) {
if(!is_user_alive(id) || g_class != get_user_class(id))
return HAM_IGNORED
new classname[STR_T]
pev(world, pev_classname, classname, (STR_T-1))
if(equal(classname, "worldspawn") || equal(classname, "func_wall") || equal(classname, "func_breakable"))
pev(id, pev_origin, g_wallorigin[id])
return HAM_IGNORED
}
public cheese_player_prethink(id) {
// Player not alive or not zombie
if(!is_user_alive(id) || !is_user_zombie(id)) {
return HAM_IGNORED
}
static Float:test ; pev(id, pev_light_level, test)
// Player has not our zombie class
if(g_class != get_user_class(id)) {
return HAM_IGNORED
}
static Float:origin[3]
pev(id, pev_origin, origin)
if (get_gametime() > g_nextdmg[id]) {
static Float:lightlevel; pev(id,pev_light_level, lightlevel)
if (lightlevel > get_pcvar_float(cvar_minillum)) {
fm_fakedamage(id, "light", get_pcvar_float(cvar_damage), DMG_BURN)
// do some smokes
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( TE_SMOKE )
engfunc(EngFunc_WriteCoord, origin[ 0 ] )
engfunc(EngFunc_WriteCoord, origin[ 1 ] )
engfunc(EngFunc_WriteCoord, origin[ 2 ] )
write_short( g_smoke )
write_byte( 20 )
write_byte( 10 )
message_end()
g_nextdmg[id] = get_gametime() + 1.0
}
}
// from Cheap_Suit's Upgrades Mod eXtended
static button ; button = pev(id, pev_button)
if(button & IN_JUMP && !g_bCantFly[id])
{
static Float:velocity[3]
velocity_by_aim(id, get_pcvar_num(cvar_speed), velocity)
fm_set_user_velocity(id, velocity)
}
return HAM_IGNORED
}
public event_infect(victim, attacker) {
g_nextdmg[victim] = 0.0
g_shoottime[victim] = 0.0
}
public cheese_takedamage(victim, inflictor, attacker, Float:damage, damagetype)
{
if (is_user_alive(victim))
{
if (g_class == get_user_class(victim))
{
g_shoottime[victim] = get_gametime() + get_pcvar_float(cvar_delay);
g_bCantFly[victim] = true;
set_task(DISABLE_TIME, "Reset", victim)
}
}
return HAM_IGNORED
}
public Reset(id) g_bCantFly[id] = false;