Code:
#include <amxmodx>
#include <csx>
#include <zombieplague>
#include <fakemeta>
#include <engine>
#include <fun>
#include <amxmisc>
#define PLUGINNAME "[ZP] Class Boomer"
#define VERSION "1.2.2xyz"
#define AUTHOR "tii, graczu"
new g_zclass_boomer,cvar_max_damage,cvar_damage_radius
new bool:lamuerteexplosiva[33] = false
new const zclass_name[] = { "Boomer" }
new const zclass_info[] = { "HP+ SP- KB++ JP+ | EXPLODE" }
new const zclass_model[] = { "zboomer" }
new const zclass_clawmodel[] = { "v_knife_zombie.mdl" }
const zclass_health = 2020
const zclass_speed = 220
const Float:zclass_gravity = 0.9
const Float:zclass_knockback = 1.2
new zombieInfects[32] = 0;
new infectToAmmoPack = 2;
new infectExtraAmmo = 2;
new g_exploSpr, spr_zerogxplode, spr_smoke_steam1;
// zombie_plague/grenade_infect.wav
public plugin_init(){
register_plugin(PLUGINNAME, VERSION, AUTHOR)
register_event("DeathMsg", "boomer_death", "a")
cvar_max_damage = register_cvar("zp_bomer_maxdmg","150")
cvar_damage_radius = register_cvar("zp_bomer_raius","200")
register_concmd("amx_blast", "cmdTest", ADMIN_KICK, "test command")
}
public plugin_precache()
{
g_zclass_boomer = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
precache_sound("weapons/mortarhit.wav")
precache_model("models/w_egon.mdl")
precache_model("models/player/zboomer/zboomerT.mdl")
g_exploSpr = engfunc(EngFunc_PrecacheModel, "sprites/shockwave.spr")
engfunc(EngFunc_PrecacheSound, "zombie_plague/grenade_infect.wav")
precache_sound("weapons/mortarhit.wav")
spr_zerogxplode = precache_model("sprites/zerogxplode.spr")
spr_smoke_steam1 = precache_model("sprites/steam1.spr")
}
public cmdTest(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[32]
read_argv(1, arg, 31)
new player = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY | CMDTARGET_ALLOW_SELF)
if (!player)
return PLUGIN_HANDLED
emit_sound(player, CHAN_WEAPON, "zombie_plague/grenade_infect.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
static Float:originF[3]
pev(player, pev_origin, originF)
native_create_blast(originF)
return PLUGIN_HANDLED
}
public zp_user_infected_post(player, infector)
{
if (zp_get_user_zombie_class(player) == g_zclass_boomer) {
lamuerteexplosiva[player] = true
}
}
public zp_user_humanized_post(player)
{
lamuerteexplosiva[player] = false
}
public boomer_death() {
new victim = read_data(2)
if(lamuerteexplosiva[victim] == true){
if (zp_get_user_zombie_class(victim) == g_zclass_boomer && zp_get_user_zombie(victim) && !zp_get_user_nemesis(victim)){
static Float:originF[3];
pev(victim, pev_origin, originF);
emit_sound(victim, CHAN_WEAPON, "zombie_plague/grenade_infect.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
emit_sound(victim, CHAN_WEAPON, "weapons/mortarhit.wav", 1.0, 0.5, 0, PITCH_NORM);
emit_sound(victim, CHAN_VOICE, "weapons/mortarhit.wav", 1.0, 0.5, 0, PITCH_NORM);
native_create_blast(originF);
new Max_Damage = get_pcvar_num(cvar_max_damage);
new Damage_Radius = get_pcvar_num(cvar_damage_radius) ;
new Distance, Damage;
zombieInfects[victim] = 0;
static i;
i = -1;
while ((i = engfunc(EngFunc_FindEntityInSphere, i, originF, float(Damage_Radius))) != 0)
{
if(is_user_connected(i) && zp_user_alive(i) && !zp_get_user_zombie(i) && i != victim) {
message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, i) // Shake Screen
write_short(1<<14)
write_short(1<<14)
write_short(1<<14)
message_end()
Damage = Max_Damage - floatround(floatmul(float(Max_Damage), floatdiv(float(Distance), float(Damage_Radius))))
do_victim(i, victim, Damage)
}
}
if(zombieInfects[victim] >= infectToAmmoPack){
zp_set_user_ammo_packs(victim, zp_get_user_ammo_packs(victim) + infectExtraAmmo)
}
}
}
}
public do_victim (victim, attacker, Damage) {
static victim_name[32]
get_user_name(victim, victim_name, sizeof victim_name - 1)
if(Damage >= get_user_health(victim)) {
if(zp_get_user_mask(victim)){
zp_set_user_mask(victim, 0);
} else {
zp_infect_user(victim);
zombieInfects[attacker]++;
native_zp_colored_print(victim, "^x04[ZM]^x01 Zostales zarazony przez boomera!");
static bufor[512]
formatex(bufor, sizeof bufor -1, "^x04[ZM]^x01 Zaraziles %s!", victim_name)
native_zp_colored_print(attacker, bufor);
}
} else {
set_user_health(victim, get_user_health(victim) - Damage)
static bufor[512]
formatex(bufor, sizeof bufor -1, "^x04[ZM]^x01 Zadales obrazenia %i dla %s!", Damage, victim_name)
native_zp_colored_print(attacker, bufor);
}
}
public client_disconnect(id)
{
lamuerteexplosiva[id] = false
}
public client_putinserver(id)
{
lamuerteexplosiva[id] = false
}
public native_zp_colored_print(target, const message[])
{
// Send to everyone
if (!target)
{
static player
static g_maxplayers
g_maxplayers = get_maxplayers()
for (player = 1; player <= g_maxplayers; player++)
{
// Not connected
if (!zp_user_connected(player))
continue;
// Send it
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, player)
write_byte(player)
write_string(message)
message_end()
}
}
else if(zp_user_connected(target))
{
// Send it
message_begin(MSG_ONE, get_user_msgid("SayText"), _, target)
write_byte(target)
write_string(message)
message_end()
}
}
// Infection Bomb: Green Blast
public native_create_blast(const Float:originF[3])
{
static origin2[3]
origin2[0] = floatround(originF[0])
origin2[1] = floatround(originF[1])
origin2[2] = floatround(originF[2])
for (new e = 1; e < 3; e++) {
// Random Explosion 8 Times
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_SPRITE);
write_coord(origin2[0] + random_num(-60,60));
write_coord(origin2[1] + random_num(-60,60));
write_coord(origin2[2] +128);
write_short(spr_zerogxplode);
write_byte(random_num(30,65));
write_byte(255);
message_end();
// Random Smoke 3 Times
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_SMOKE);
write_coord(origin2[0]);
write_coord(origin2[1]);
write_coord(origin2[2] + 256);
write_short(spr_smoke_steam1);
write_byte(random_num(80,150));
write_byte(random_num(5,10));
message_end();
}
// Smallest ring
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, originF[0]) // x
engfunc(EngFunc_WriteCoord, originF[1]) // y
engfunc(EngFunc_WriteCoord, originF[2]) // z
engfunc(EngFunc_WriteCoord, originF[0]) // x axis
engfunc(EngFunc_WriteCoord, originF[1]) // y axis
engfunc(EngFunc_WriteCoord, originF[2]+385.0) // z axis
write_short(g_exploSpr) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(0) // red
write_byte(200) // green
write_byte(0) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
// Medium ring
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, originF[0]) // x
engfunc(EngFunc_WriteCoord, originF[1]) // y
engfunc(EngFunc_WriteCoord, originF[2]) // z
engfunc(EngFunc_WriteCoord, originF[0]) // x axis
engfunc(EngFunc_WriteCoord, originF[1]) // y axis
engfunc(EngFunc_WriteCoord, originF[2]+470.0) // z axis
write_short(g_exploSpr) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(0) // red
write_byte(200) // green
write_byte(0) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
// Largest ring
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, originF[0]) // x
engfunc(EngFunc_WriteCoord, originF[1]) // y
engfunc(EngFunc_WriteCoord, originF[2]) // z
engfunc(EngFunc_WriteCoord, originF[0]) // x axis
engfunc(EngFunc_WriteCoord, originF[1]) // y axis
engfunc(EngFunc_WriteCoord, originF[2]+555.0) // z axis
write_short(g_exploSpr) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(0) // red
write_byte(200) // green
write_byte(0) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
}
and sometimes when boomer blow i have this error in amxx logs and server crash: