Hey Cheap, Im back with more questions and suggestions 'bout new ver
.
How to creat zombie climbing class like "marcellus" done in his class version, i dont really know how to creat such a class?
Code:
#include <amxmodx>
#include <biohazard>
#include <hamsandwich>
#include <fakemeta_util>
#include <bh_classes>
#define STR_T 32
#define MAX_PLAYERS 32
#define D_ZOMBIE_NAME "Climbing Zombie"
#define D_ZOMBIE_DESC "Can climb walls, damage by light | - HP | + Spd | + Knockback"
#define D_PLAYER_MODEL "models/player/..."
#define D_CLAWS "models/..."
new g_clsid, 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]
public plugin_init() {
register_plugin("bio_climbingzombie","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 event_clearclientdata(id) {
g_nextdmg[id] = 0.0
g_shoottime[id] = 0.0
}
public plugin_init2() {
new clsid = RegisterZombie(D_ZOMBIE_NAME, D_ZOMBIE_DESC)
BH_set_string(clsid, zm_player_model, D_PLAYER_MODEL)
BH_set_string(clsid, zm_claws_model, D_CLAWS)
BH_set_float(clsid, zm_gravity, 0.75)
BH_set_float(clsid, zm_health, 500.0)
BH_set_float(clsid, zm_health, 1000.0, true)
BH_set_float(clsid, zm_speed, 300.0)
BH_set_float(clsid, zm_speed, 350.0, true)
BH_set_integer(clsid, zm_can_regen, 0)
BH_set_float(clsid, zm_regen_delay, 0.05)
BH_set_integer(clsid, zm_can_be_kbed, 1)
BH_set_float(clsid, zm_kb_multi, 2.0)
BH_set_integer(clsid, zm_fov,120)
BH_set_float(clsid, zm_kb_hp, 150.0)
BH_set_float(clsid, zm_regen_startdelay, 0.0)
BH_set_float(clsid, zm_kb_duck_multi, 0.80)
BH_set_integer(clsid, zm_has_nvg, 1)
BH_set_integer(clsid, zm_can_infect, 1)
g_clsid = clsid
if (is_user_first_zombie(id)){
cvar_speed = register_cvar("bh_zm_climbingspeed", "500")
}
else{
cvar_speed = register_cvar("bh_zm_climbingspeed", "300")
}
cvar_minillum = register_cvar("bh_zm_minlight", "20.0")
cvar_damage = register_cvar("bh_zm_lightdamage", "10.0")
cvar_delay = register_cvar("bh_zm_climbdelay", "0.3")
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_clsid != BH_get_user_classid(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)
//client_print(0, print_chat,"-- id=%d -- light=%2f, illum=%2f", id, test, getillumination(id))
// Player has not our zombie class
if(g_clsid != BH_get_user_classid(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 && button & IN_DUCK)
{
if(get_distance_f(origin, g_wallorigin[id]) > 10.0)
return HAM_IGNORED
if(pev(id, pev_flags) & FL_ONGROUND)
return HAM_IGNORED
if (get_gametime() < g_shoottime[id]) {
return HAM_IGNORED
}
if(button & IN_FORWARD)
{
static Float:velocity[3]
velocity_by_aim(id, get_pcvar_num(cvar_speed), velocity)
fm_set_user_velocity(id, velocity)
}
else if(button & IN_BACK)
{
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_zombify(id) if (is_user_alive(id) && g_clsid == BH_get_user_classid(id)) {
BH_client_print(id, "To climb a wall : press JUMP + DUCK")
}
public cheese_takedamage(victim, inflictor, attacker, Float:damage, damagetype)
{
if (is_user_alive(victim)) {
if (g_clsid == BH_get_user_classid(victim)) {
g_shoottime[victim] = get_gametime() + get_pcvar_float(cvar_delay);
}
}
return HAM_IGNORED
}
/*
Float:getillumination(id) {
static Float:i ; i = float(engfunc(EngFunc_GetEntityIllum, id))
if (i > 75.0) i = 75.0
return (100.0 * xs_sqrt(i / 75.0));
}*/