Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <zombieplaguenightmare>
#define PLUGINNAME "[ZPNM] Bazooka"
#define VERSION "1.3.2"
//#define DEBUG
#define TE_EXPLOSION 3
#define TE_BEAMFOLLOW 22
#define TE_BEAMCYLINDER 21
const PDATA_SAFE = 2
const OFFSET_WEAPONOWNER = 41
const OFFSET_LINUX_WEAPONS = 4 // weapon offsets are only 4 steps higher on Linux
new ROCKET_MDL[] = "models/rpgrocket.mdl"
new ROCKET_SOUND[] = "weapons/rocketfire1.wav"
new V_BZK[] = "models/v_93bazooka.mdl";
new P_BZK[] = "models/p_zpdebazooka.mdl"
new W_BZK[] = "models/w_zpdebazooka.mdl"
new getrocket[] = "items/9mmclip2.wav"
//new g_knife_model[33][64]
new explosion, trail, white,
g_item_bazooka, g_MaxPlayers
new g_msgDeath
new g_hasbzk[33], g_countdown[33]
new cvar_RocketDelay, cvar_RocketSpeed,
cvar_RocketDmg, cvar_Dmg_range, cvar_oneround,
cvar_reward, cvar_reloadcount
public plugin_init()
{
register_plugin(PLUGINNAME, VERSION, "Random1, D i 5 7 i n c T")
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
register_cvar("zpnm_bzk_version", VERSION, FCVAR_SERVER)
register_forward(FM_CmdStart, "fw_CmdStart")
RegisterHam(Ham_Item_Deploy, "weapon_knife", "fw_Knife_Deploy_Post", 1)
register_clcmd("drop", "cmdDrop")
// register_clcmd("say /bzkhelp", "cmdHelp", 0, ": Displays Bazooka help")
g_MaxPlayers = get_maxplayers()
g_item_bazooka = zp_register_extra_item("Bazooka", 35, ZP_TEAM_HUMAN | ZP_TEAM_SURVIVOR)
g_msgDeath = get_user_msgid("DeathMsg")
cvar_RocketDelay = register_cvar("zpnm_bzk_rocket_delay", "15")
cvar_RocketSpeed = register_cvar("zpnm_bzk_rocket_speed", "2757")
cvar_RocketDmg = register_cvar("zpnm_bzk_rocket_damage", "1157")
cvar_Dmg_range = register_cvar("zpnm_bzk_damage_radius", "577")
cvar_oneround = register_cvar("zpnm_bzk_oneround", "0")
cvar_reward = register_cvar("zpnm_bzk_reward", "1")
cvar_reloadcount = register_cvar("zpnm_bzk_reloadcount", "3")
}
public plugin_precache()
{
precache_model(V_BZK)
precache_model(P_BZK)
precache_model(W_BZK)
precache_model(ROCKET_MDL)
precache_sound(ROCKET_SOUND)
precache_sound(getrocket)
explosion = precache_model("sprites/zerogxplode.spr")
trail = precache_model("sprites/smoke.spr")
white = precache_model("sprites/white.spr")
}
public plugin_cfg()
set_task(1.57, "cache_settings")
public cache_settings()
{
cvar_RocketDmg = get_pcvar_num(cvar_RocketDmg)
cvar_Dmg_range = get_pcvar_num(cvar_Dmg_range)
cvar_reward = get_pcvar_num(cvar_reward)
}
public client_disconnect(id)
{
remove_task(id)
if (g_hasbzk[id])
drop_bazooka(id, 1)
else
{
g_countdown[id] = 0
g_hasbzk[id] = false
}
}
public event_round_start()
{
remove_rockets()
remove_bazookas()
if (get_pcvar_num(cvar_oneround))
{
for (new id = 1; id <= g_MaxPlayers; id++)
{
remove_task(id)
g_countdown[id] = 0
g_hasbzk[id] = false
}
}
}
public fw_CmdStart(id, UC_Handle, Seed)
{
if (!g_hasbzk[id] || get_user_weapon(id) != CSW_KNIFE)
return;
if (g_countdown[id])
/* {
entity_set_string(id, EV_SZ_viewmodel, g_knife_model[id])
entity_set_string(id, EV_SZ_weaponmodel, "models/p_knife.mdl")
*/
return;
// }
static afButtons
afButtons = get_uc(UC_Handle, UC_Buttons)
if (afButtons & IN_ATTACK)
{
afButtons &= ~IN_ATTACK
set_uc(UC_Handle, UC_Buttons, afButtons)
attack1(id)
}
}
public attack1(id)
{
new fuck, rocket;
if(!fuck)
fuck = engfunc(EngFunc_AllocString, "info_target"); // alloc string once per load
if (!pev_valid((rocket = engfunc(EngFunc_CreateNamedEntity, fuck))))
return;
static Float: VAngle[ 3 ], Float: Forward[ 3 ], Float: Velocity[ 3 ], Float: Origin[ 3 ], Float: Angles[ 3 ];
new Float: RocketSpeed;
engfunc(EngFunc_SetModel,rocket, ROCKET_MDL)
set_pev(rocket, pev_classname, "zpnm_bzk_rocket")//2clipefuck off
entity_set_int(rocket, EV_INT_movetype, MOVETYPE_FLY)
entity_set_int(rocket, EV_INT_solid, SOLID_BBOX)
set_pev( rocket, pev_effects, EF_LIGHT );
pev( id, pev_v_angle, VAngle );
engfunc( EngFunc_MakeVectors, VAngle );
global_get( glb_v_forward, Forward );
Forward[ 0 ] *= 64.0;
Forward[ 1 ] *= 64.0;
Forward[ 2 ] *= 64.0;
global_get( glb_v_forward, Velocity );
Velocity[ 0 ] *= ( RocketSpeed = get_pcvar_float( cvar_RocketSpeed ) );
Velocity[ 1 ] *= RocketSpeed;
Velocity[ 2 ] *= RocketSpeed;//bleahhh
pev( id, pev_origin, Origin );
// get_user_origin(id, Origin, 1)
Origin[ 0 ] += floatround(Forward[ 0 ]);
Origin[ 1 ] += floatround(Forward[ 1 ]);
Origin[ 2 ] += floatround(Forward[ 2 ]);
engfunc( EngFunc_SetOrigin, rocket, Origin );
set_pev( rocket, pev_velocity, Velocity );
engfunc( EngFunc_VecToAngles, Velocity, Angles );
set_pev( rocket, pev_angles, Angles );
set_pev( rocket, pev_owner, id );
/* new Float:StartOrigin[3], Float:Angle[3];
pev(id, pev_origin, StartOrigin);
pev(id, pev_v_angle, Angle);
Angle[0] *= -1.0;
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
set_pev(ent, pev_classname, "zpnm_bzk_rocket");
engfunc(EngFunc_SetModel, ent, ROCKET_MDL);
set_pev(ent, pev_mins, {-1.0, -1.0, -1.0});
set_pev(ent, pev_maxs, {1.0, 1.0, 1.0});
engfunc(EngFunc_SetOrigin, ent, StartOrigin);
set_pev(ent, pev_v_angle, Angle);
set_pev(ent, pev_solid, 2);
set_pev(ent, pev_movetype, 5);
set_pev(ent, pev_owner, id);
new Float:nVelocity[3];
velocity_by_aim(id, get_pcvar_num(cvar_RocketSpeed), nVelocity);
set_pev(ent, pev_velocity, nVelocity);*/
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_BEAMFOLLOW );
write_short( rocket );
write_short( trail );
write_byte( 25 );
write_byte( 5 );
write_byte( 191 );
write_byte( 191 );
write_byte( 191 );
write_byte( random_num( 150, 240 ) );
message_end( );
emit_sound(rocket, CHAN_WEAPON, ROCKET_SOUND, 1.0, ATTN_NORM, 0, PITCH_NORM)
if (get_pcvar_num(cvar_RocketDelay))
{
g_countdown[id] = get_pcvar_num(cvar_RocketDelay) + 1
rocket_reload_countdown(id)
if (get_pcvar_num(cvar_reloadcount) > 1)
{
message_begin(MSG_ONE, 108, {0, 0, 0}, id)
write_short(get_pcvar_num(cvar_RocketDelay)) //No float allowed
message_end()
}
}
}
public fw_Knife_Deploy_Post(weapon_ent) //check_models
{
// Get weapon's owner
static owner
owner = fm_cs_get_weapon_ent_owner(weapon_ent)
// Valid owner?
if (!pev_valid(owner))
return;
#if defined DEBUG
client_print(0, print_chat, "Player %d switched to knife", owner)
#endif
if (zp_get_user_zombie(owner) || !g_hasbzk[owner] || g_countdown[owner]) //|| get_user_weapon(owner) != CSW_KNIFE
return;
switchmodel(owner)
#if defined DEBUG
client_print(0, print_chat, "Player %d has bazooka and rocket is loaded", owner)
#endif
}
public switchmodel(id)
{
entity_set_string(id, EV_SZ_viewmodel, V_BZK)
entity_set_string(id, EV_SZ_weaponmodel, P_BZK)
}
public remove_bazookas()
{
// server_print("[ZPNM] Searching for BAZOOKAS...")
new nextitem = -1
nextitem = find_ent_by_class(-1, "zpnm_bzk")
while (nextitem)
{
// server_print("")
// server_cmd("echo [ZPNM] Found BAZOOKA entity with ID %d.", nextitem)
if (is_valid_ent(nextitem))
{
// server_cmd("echo [ZPNM] BAZOOKA entity with ID %d is valid. Removing...", nextitem)
engfunc(EngFunc_RemoveEntity, nextitem)
}
// server_cmd("echo [ZPNM] BAZOOKA entity with ID %d removed. Searching for another one...", nextitem)
nextitem = find_ent_by_class(-1, "zpnm_bzk")
}
// server_print("")
}
public remove_rockets()
{
// server_print("")
// server_print("[ZPNM] Searching for ROCKETS...")
new nextitem = -1
nextitem = find_ent_by_class(-1, "zpnm_bzk_rocket")
while (nextitem)
{
// server_print("")
// server_cmd("echo [ZPNM] Found rocket entity with ID %d.", nextitem)
if (is_valid_ent(nextitem))
{
// server_cmd("echo [ZPNM] Rocket entity with ID %d is valid. Removing...", nextitem)
engfunc(EngFunc_RemoveEntity, nextitem)
}
// server_cmd("echo [ZPNM] Rocket entity with ID %d removed. Searching for another one...", nextitem)
nextitem = find_ent_by_class(-1, "zpnm_bzk_rocket")
}
}
/*
public cmdHelp(id)
{
static bzkmotd[450], title[64], dpos
dpos = 0
formatex(title, 63, "%s v%s", PLUGINNAME, VERSION)
dpos += formatex(bzkmotd[dpos], 2047-dpos, "<html><head><style type=^"text/css^">pre{color:#FF0505;}body{background:#000000;margin-left:16px;margin-top:1px;}</style></head><pre><body>")
dpos += formatex(bzkmotd[dpos], 2047-dpos, "<b>%s</b>^n^n", title)
dpos += formatex(bzkmotd[dpos], 2047-dpos, "How to use:^n")
dpos += formatex(bzkmotd[dpos], 2047-dpos, "=============^n^n")
dpos += formatex(bzkmotd[dpos], 2047-dpos, "- choose/have Knive(Bazooka) & use ATTACK to shoot a Rocket^n^n")
dpos += formatex(bzkmotd[dpos], 2047-dpos, "INFO^n")
dpos += formatex(bzkmotd[dpos], 2047-dpos, "MAX Rocket Dmg set to: <b>%i dmg</b>^n", cvar_RocketDmg)
dpos += formatex(bzkmotd[dpos], 2047-dpos, "New Rocket comes ervry <b>%i Sec.</b>^n^n", get_pcvar_num(cvar_RocketDelay))
dpos += formatex(bzkmotd[dpos], 2047-dpos, "-Have Fun!")
show_motd(id, bzkmotd, title)
}*/
public zpnm_user_killed_post(id)
{
if (!zp_has_round_started())
return;
remove_task(id)
if (g_hasbzk[id])
drop_bazooka(id, 1)
g_countdown[id] = 0
}
public cmdDrop(id)
{
if (!g_hasbzk[id] || get_user_weapon(id) != CSW_KNIFE)
return PLUGIN_CONTINUE;
drop_bazooka(id, 0)
if (!zp_get_user_zombie(id))
{
entity_set_string(id, EV_SZ_viewmodel, "models/v_knife.mdl")
entity_set_string(id, EV_SZ_weaponmodel, "models/p_knife.mdl")
}
return PLUGIN_HANDLED;
}
public drop_bazooka(id, org)
{
if (!g_hasbzk[id])
return;
new Float:origin[3]
entity_get_vector(id, EV_VEC_origin, origin)
if (!org)
{
new Float:Aim[3]
VelocityByAim(id, 64, Aim)
origin[0] += Aim[0]
origin[1] += Aim[1]
}
new bazooka = create_entity("info_target")
entity_set_string(bazooka, EV_SZ_classname, "zpnm_bzk")
entity_set_model(bazooka, W_BZK)
fm_set_rendering(bazooka)
entity_set_size(bazooka, Float:{ -16.0, -16.0, -16.0 }, Float:{ 16.0, 16.0, 16.0 })
entity_set_int(bazooka, EV_INT_solid, 1)
entity_set_int(bazooka, EV_INT_movetype, 6)
entity_set_vector(bazooka, EV_VEC_origin, origin)
if (get_pcvar_num(cvar_reloadcount) > 1 && g_countdown[id])
{
message_begin(MSG_ONE, 108, {0, 0, 0}, id)
write_short(0)
message_end()
}
g_hasbzk[id] = false
#if defined DEBUG
client_print(0, print_chat, "Player %d dropped the bazooka.", id)
#endif
}
public pfn_touch(ptr, ptd)
{
if (!is_valid_ent(ptr))
return;
static classname[32]
entity_get_string(ptr, EV_SZ_classname, classname, 31)
if (equali(classname, "zpnm_bzk"))
{
if (!zpnm_get_user_valid(ptd) || !zpnm_get_user_alive(ptd) || zp_get_user_zombie(ptd) || g_hasbzk[ptd])
return;
g_hasbzk[ptd] = true
client_cmd(ptd, "spk items/gunpickup2.wav")
if (!g_countdown[ptd])
{
client_print(ptd, print_center, "Your bazooka is now reloaded")
if (get_user_weapon(ptd) != CSW_KNIFE)
engclient_cmd(ptd, "weapon_knife")
else
switchmodel(ptd)
}
else
client_print(ptd, print_center, "Your bazooka will be reloaded in %d second%s", g_countdown[ptd], g_countdown[ptd] > 1 ? "s" : "" )
engfunc(EngFunc_RemoveEntity, ptr)
}
else if (equali(classname, "zpnm_bzk_rocket"))
{
static Float:fOrigin[3], iOrigin[3]
entity_get_vector(ptr, EV_VEC_origin, fOrigin)
FVecIVec(fOrigin, iOrigin)
#if defined DEBUG
client_print(0, print_chat, "Rocket hit origin: %d(%.2f) | %d(%.2f) | %d(%.2f)", iOrigin[0], fOrigin[0], iOrigin[1], fOrigin[1], iOrigin[2], fOrigin[2])
#endif
bzk_radius_damage(ptr) //, iOrigin
message_begin(MSG_BROADCAST, SVC_TEMPENTITY, iOrigin)
write_byte(TE_EXPLOSION)
write_coord(iOrigin[0])
write_coord(iOrigin[1])
write_coord(iOrigin[2])
write_short(explosion)
write_byte(30)
write_byte(15)
write_byte(0)
message_end()
message_begin(MSG_ALL, SVC_TEMPENTITY, iOrigin)
write_byte(TE_BEAMCYLINDER)
write_coord(iOrigin[0])
write_coord(iOrigin[1])
write_coord(iOrigin[2])
write_coord(iOrigin[0])
write_coord(iOrigin[1])
write_coord(iOrigin[2]+200)
write_short(white)
write_byte(0)
write_byte(1)
write_byte(6)
write_byte(8)
write_byte(1)
write_byte(255)
write_byte(255)
write_byte(192)
write_byte(128)
write_byte(5)
message_end()
if (is_valid_ent(ptd))
{
entity_get_string(ptd, EV_SZ_classname, classname, 31)
if (equali(classname, "func_breakable"))
force_use(ptr, ptd)
}
engfunc(EngFunc_RemoveEntity, ptr)
}
}
public zp_user_infected_post(id)
{
drop_bazooka(id, 1)
static iEnt
iEnt = find_ent_by_owner(-1, "zpnm_bzk_rocket", id)
if (is_valid_ent(iEnt))
engfunc(EngFunc_RemoveEntity, iEnt)
}
public zp_extra_item_selected(id, itemid)
{
if (itemid != g_item_bazooka)
return PLUGIN_CONTINUE;
if (g_hasbzk[id])
{
client_print(id, print_center, "You already have a bazooka!")
return ZP_PLUGIN_HANDLED;
}
remove_task(id)
g_hasbzk[id] = true
g_countdown[id] = 0
client_cmd(id, "spk items/gunpickup2.wav")
client_print(id, print_center, "Your bazooka is now reloaded")
// client_print(id, print_chat, "[ZP] Say /bzkhelp to display the bazooka help page")
if (get_user_weapon(id) != CSW_KNIFE)
engclient_cmd(id, "weapon_knife")
else
switchmodel(id)
return PLUGIN_CONTINUE;
}
public rocket_reload_countdown(id)
{
g_countdown[id]--
if (!g_countdown[id])
{
if (g_hasbzk[id])
{
client_print(id, print_center, "Your bazooka is now reloaded")
if (!zpnm_get_user_alive(id))
return;
engfunc(EngFunc_EmitSound, id, CHAN_WEAPON, getrocket, 1.0, ATTN_NORM, 0, PITCH_NORM)
if (get_user_weapon(id) == CSW_KNIFE)
switchmodel(id)
}
}
else
{
static reloadcount
reloadcount = get_pcvar_num(cvar_reloadcount)
if (g_hasbzk[id] && (reloadcount > 2 || reloadcount == 1))
client_print(id, print_center, "Your bazooka will be reloaded in %d second%s", g_countdown[id], g_countdown[id] > 1 ? "s" : "" )
set_task(1.0, "rocket_reload_countdown", id)
}
}
stock bzk_radius_damage(entity) //, origin[]
{
static id, Float:range, i //
id = entity_get_edict(entity, EV_ENT_owner)
range = float(cvar_Dmg_range)
/*
#if defined DEBUG
client_print(0, print_chat, "Rocket hit at %d, %d, %d. Explosion radius: %.2f. Owner: %d", origin[0], origin[1], origin[2], range, id)
#endif
new i = -1
while ((i = engfunc(EngFunc_FindEntityInSphere, i, origin, range)) != 0)
{
#if defined DEBUG
server_cmd("echo Found entity with id #%d", i)
#endif
if (!is_user_connected(i))
{
#if defined DEBUG
server_cmd("echo Entity %d is not connected(not a player)", i)
#endif
if (!pev_valid(i))
continue;
#if defined DEBUG
server_cmd("echo Entity %d seems to be valid.", i)
#endif
static classname[32]
pev(i, pev_classname, classname, 31)
if (equali(classname, "func_breakable"))
#if defined DEBUG
{
server_cmd("echo Entity %d is breakable. Trying to destroy it.", i)
#endif
force_use(id, i)
#if defined DEBUG
}
#endif
continue;
}
if (!zpnm_get_user_valid(i) || !zpnm_get_user_alive(i) || !zp_get_user_zombie(i))
continue;
#if defined DEBUG
server_cmd("echo Entity %d is a valid, alive and zombie player. Trying to do damage.", i)
#endif
static Float:dmg, hp
if (!zpnm_get_user_assassin(i))
{
static Float:maxdmg
maxdmg = float(cvar_RocketDmg)
dmg = maxdmg - (maxdmg / range) * entity_range(entity, i)
}
else
dmg = 57.0
hp = get_user_health(i)
if (hp > dmg)
{
if (cvar_reward)
ExecuteHamB(Ham_TakeDamage, i, id, id, dmg, DMG_BLAST)
else
ExecuteHam(Ham_TakeDamage, i, id, id, dmg, DMG_BLAST)
}
else
{
// code from MeRcyLeZZ
set_msg_block(g_msgDeath, BLOCK_SET)
if (cvar_reward)
ExecuteHamB(Ham_Killed, i, id, 2) //set last param to 2 if you want victim to gib
else
ExecuteHam(Ham_Killed, i, id, 2)
set_msg_block(g_msgDeath, BLOCK_NOT)
message_begin(MSG_BROADCAST, g_msgDeath)
write_byte(id)
write_byte(i)
write_byte(0) //headshot
write_string("bazooka")
message_end()
}
}
*/
for (i = 1; i < g_MaxPlayers; i++)
{
if (zpnm_get_user_alive(i))
{
static Float:dist
dist = entity_range(entity, i)
if (dist <= range)
{
static Float:maxdmg, Float:damage, hp
maxdmg = float(cvar_RocketDmg)
damage = maxdmg - (maxdmg / range) * dist
if (zp_get_user_first_zombie(i))
damage = damage / 3
else if (zpnm_get_user_assassin(i))
damage = damage / 15
hp = get_user_health(i)
if (!zp_get_user_zombie(id) && zp_get_user_zombie(i))
{
if (hp > damage)
ExecuteHamB(Ham_TakeDamage, i, id, id, damage, DMG_BLAST)
else
log_kill(id, i, "bazooka", 0)
}
}
}
}
}
stock log_kill(killer, victim, weapon[], headshot)
{
// code from MeRcyLeZZ
set_msg_block(g_msgDeath, BLOCK_SET)
ExecuteHamB(Ham_Killed, victim, killer, 2) //set last param to 2 if you want victim to gib
set_msg_block(g_msgDeath, BLOCK_NOT)
message_begin(MSG_BROADCAST, g_msgDeath)
write_byte(killer)
write_byte(victim)
write_byte(headshot)
write_string(weapon)
message_end()
//
// if (get_user_team(killer) != get_user_team(victim))
// set_user_frags(killer, get_user_frags(killer)+1)
}
// Get Weapon Entity's Owner
stock fm_cs_get_weapon_ent_owner(ent)
{
// Prevent server crash if entity's private data not initalized
if (pev_valid(ent) != PDATA_SAFE)
return -1;
return get_pdata_cbase(ent, OFFSET_WEAPONOWNER, OFFSET_LINUX_WEAPONS);
}
// Set entity's rendering type (from fakemeta_util)
stock fm_set_rendering(entity)
{
static Float:color[3]
color[0] = random_float(175.0, 255.0)
color[1] = random_float(0.0, 255.0)
color[2] = random_float(0.0, 255.0)
set_pev(entity, pev_renderfx, kRenderFxGlowShell)
set_pev(entity, pev_rendercolor, color)
set_pev(entity, pev_rendermode, kRenderNormal)
set_pev(entity, pev_renderamt, random_float(57.7, 75.7))
}