Alguem arruma essa pipe bomba ela nao quer explodir aki vou posta a .sma
- Código:
/*
-*- [ZP] Extra Item: Pipe Bomb -*-
-*- Author: 4eRT -*-
-*- About -*-
This plugin is another extra item for Zombie Plague.
It works like Pipe Bomb in Left 4 Dead.
-*- Description -*-
Plugin includes 2 extras: Pipe Bomb for Humans which
drags zombies to nade on ground and then kills them
(or hurts) and Mental Shield for Zombies which can
block Pipe Bombs. All setting can be configured
through the cvars.
-*- Credits -*-
MeRcyLeZZ - Great thanks for your ZP mode!!!
frk_14 & Koshak - for pipe models
crazyeffect - multilingual
meTaLiCroSS - for optimization
-*- Cvars -*-
Pipe Bomb:
zp_pipe_enabled 1 // 0=off plugin 1=on
zp_pipe_radius 200 // radius of pipe bomb area def=200
zp_pipe_duration 10 // time before pipe explodes def=10
zp_pipe_cost 15 // extras cost def=15
zp_pipe_mode 1 // 1=hook zombies to nade and then make them super damage 2=hook zombies to nade and hurt them at the same time def=1
zp_pipe_speed 90.0 // speed at which drags zombies def=80.0
zp_pipe_damage 2200 // damage given to zombies def=2200
zp_pipe_shake 1 // 1=shake zombies screen 0=not def=1
zp_pipe_sound 1 //1=enable beep pipe sound 0=off def=1
zp_pipe_hud 1 // 1=enable hud messages 0=off def=1
zp_pipe_ap 0 // additional ammo packs if you killed zombie by Pipe
Mental Shield:
zp_mshield_enabled 1 // 1=on plugin 0=off
zp_mshield_cost 7 // extras cost def=7
zp_mshield_hud 1 // 1=enable hud 0=off def=1
-*- Modules -*-
fakemeta
hamsandwich
engine
fun
cstrike
-*- History -*-
0.1b (23.01.10)
First release.
0.2b (24.01.10)
Fixed some mistakes.
0.3b (24.01.10)
Added models.
0.4b (25.01.10)
Model bugs fixed.
*/
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <engine>
#include <zombieplague>
#include < fun >
#include <cstrike>
#define VERSION "0.4b"
const m_pPlayer = 41;
new const NADE_TYPE_PIPE = 4327;
new const NADE_DURATION_PIPE = pev_flSwimTime;
new const g_trailspr[] ="sprites/laserbeam.spr";
new const g_ringspr[] = "sprites/shockwave.spr";
new const g_firespr[] = "sprites/zerogxplode.spr";
new const g_sound[] = "items/pipe_beep.wav";
new const g_vmodel[] = "models/zombie_plague/v_pipe.mdl";
new const g_pmodel[] = "models/zombie_plague/p_pipe.mdl";
new const g_wmodel[] = "models/zombie_plague/w_pipe.mdl";
new const g_vflare[] = "models/zombie_plague/v_grenade_flare.mdl"; // type here your custom flare model to prevent bug. now uses default model
new const g_extra_pipe[] = { "Pipe Bomb" };
new const g_extra_shield[] = { "Mental Shield" };
new cvar_duration, cvar_radius, cvar_enabled, cvar_sound, cvar_cost, cvar_mode, cvar_hud, cvar_damage, cvar_speed, cvar_shake, cvar_Scost, cvar_Senabled, cvar_Shud, cvar_extraap; // some cvars
new g_msgsync, g_trail, g_ring, g_fire, g_score, g_death, g_shake, g_pipe, bool: g_has_pipe[33], bool: g_has_shield[33], g_mshield; // some vars
public plugin_init() {
register_plugin("[ZP] Extra: Pipe Bomb", VERSION, "4eRT");
register_forward(FM_SetModel,"fw_SetModel", 1);
register_dictionary("zp_extra_pipe.txt");
RegisterHam(Ham_Think, "grenade", "fw_ThinkGren");
RegisterHam(Ham_Spawn, "player", "fw_Spawn");
RegisterHam(Ham_Item_Deploy, "weapon_smokegrenade", "fw_smDeploy", 1);
// Cvars
cvar_duration = register_cvar("zp_pipe_duration", "10");
cvar_radius = register_cvar ( "zp_pipe_radius", "200");
cvar_enabled = register_cvar("zp_pipe_enabled", "1");
cvar_cost = register_cvar("zp_pipe_cost", "15");
cvar_mode = register_cvar("zp_pipe_mode", "1");
cvar_sound = register_cvar("zp_pipe_sound", "1");
cvar_hud = register_cvar("zp_pipe_hud", "1");
cvar_damage = register_cvar("zp_pipe_damage", "2200");
cvar_speed = register_cvar("zp_pipe_speed", "90.0");
cvar_shake = register_cvar("zp_pipe_shake", "1");
cvar_extraap = register_cvar("zp_pipe_ap", "0");
cvar_Scost = register_cvar("zp_mshield_cost", "7");
cvar_Senabled = register_cvar("zp_mshield_enabled", "1");
cvar_Shud = register_cvar("zp_mshield_hud", "1");
// Registering extra items
if(get_pcvar_num(cvar_enabled))
g_pipe = zp_register_extra_item(g_extra_pipe, get_pcvar_num(cvar_cost), ZP_TEAM_HUMAN);
if(get_pcvar_num(cvar_Senabled))
g_mshield = zp_register_extra_item(g_extra_shield, get_pcvar_num(cvar_Scost), ZP_TEAM_ZOMBIE);
g_msgsync = CreateHudSyncObj();
g_score = get_user_msgid("ScoreInfo");
g_death = get_user_msgid("DeathMsg");
g_shake = get_user_msgid("ScreenShake");
}
public plugin_precache() {
precache_model(g_vmodel);
precache_model(g_pmodel);
precache_model(g_wmodel);
precache_model(g_vflare);
precache_sound(g_sound);
g_fire = precache_model(g_firespr);
g_trail = precache_model(g_trailspr);
g_ring = precache_model(g_ringspr);
}
public replace_models(id)
{
if(get_user_weapon(id) == CSW_SMOKEGRENADE)
{
set_pev(id, pev_viewmodel2, g_vmodel);
set_pev(id, pev_weaponmodel2, g_pmodel);
}
}
public replace_models2(id)
if(get_user_weapon(id) == CSW_SMOKEGRENADE)
set_pev(id, pev_viewmodel2, g_vflare);
public fw_smDeploy(const iEntity)
{
if(pev_valid(iEntity) != 2)
return HAM_IGNORED;
new id = get_pdata_cbase(iEntity, m_pPlayer, 4);
if(g_has_pipe[id] && !zp_get_user_zombie(id) && is_user_alive(id))
{
set_pev(id, pev_viewmodel2, g_vmodel);
set_pev(id, pev_weaponmodel2, g_pmodel);
}
return HAM_IGNORED;
}
public zp_extra_item_selected(id, item)
{
if(item == g_pipe)
{
if(!get_pcvar_num(cvar_enabled))
{
client_print(id, print_chat, "[ZP] %L", id, "DISABLED");
return ZP_PLUGIN_HANDLED;
}
if(g_has_pipe[id])
{
if(get_pcvar_num(cvar_hud) == 1)
{
set_hudmessage(255, 0, 0, -1.0, 0.55, 0, 0.0, 2.0, 2.0, 1.0, -1);
ShowSyncHudMsg(id, g_msgsync, "%L", id, "ALREADY");
}
else
client_print(id, print_chat, "[ZP] %L", id, "ALREADY");
return ZP_PLUGIN_HANDLED;
}
g_has_pipe[id] = true;
new was = cs_get_user_bpammo(id, CSW_SMOKEGRENADE);
if(was >= 1)
cs_set_user_bpammo(id, CSW_SMOKEGRENADE, was + 1);
else
give_item(id, "weapon_smokegrenade");
replace_models(id);
if(get_pcvar_num(cvar_hud) == 1)
{
new msg[32], hud = random_num(0, 1);
if(hud == 0)
formatex(msg, 31, "%L", id, "DANGEROUS");
else
formatex(msg, 31, "%L", id, "GO_EXPLOSIVE");
set_hudmessage(255, 0, 0, -1.0, 0.55, 0, 0.0, 3.0, 2.0, 1.0, -1);
ShowSyncHudMsg(id, g_msgsync, "%s", msg);
}
}
if(item == g_mshield)
{
if(!get_pcvar_num(cvar_Senabled))
{
client_print(id, print_chat, "[ZP] %L", id, "MS_DISABLED");
return ZP_PLUGIN_HANDLED;
}
if(g_has_shield[id])
{
if(get_pcvar_num(cvar_Shud))
{
set_hudmessage(255, 0, 0, -1.0, 0.55, 0, 0.0, 2.0, 2.0, 1.0, -1);
ShowSyncHudMsg(id, g_msgsync, "%L", id, "ALREADY");
}
else
client_print(id, print_chat, "[ZP] %L", id, "ALREADY");
return ZP_PLUGIN_HANDLED;
}
g_has_shield[id] = true;
if(get_pcvar_num(cvar_Shud))
{
set_hudmessage(255, 0, 0, -1.0, 0.55, 0, 0.0, 3.0, 2.0, 1.0, -1);
ShowSyncHudMsg(id, g_msgsync, "%L", id, "PROTECTED");
}
else
client_print(id, print_chat, "[ZP] %L", id, "PROTECTED");
}
return PLUGIN_CONTINUE;
}
public zp_user_infected_post(id)
{
g_has_pipe[id] = false;
g_has_shield[id] = false;
}
public fw_Spawn(id)
{
g_has_pipe[id] = false;
g_has_shield[id] = false;
}
public fw_SetModel(entity, const model[]) // Set smokegrenade pipes effects and type
{
static Float:dmgtime, owner;
pev(entity, pev_dmgtime, dmgtime);
owner = pev(entity, pev_owner);
if(!pev_valid(entity) || dmgtime == 0.0)
return FMRES_IGNORED;
if (model[9] == 's' && model[10] == 'm' && g_has_pipe[owner])
{
g_has_pipe[owner] = false;
entity_set_model(entity, g_wmodel);
replace_models2(owner);
set_rendering(entity, kRenderFxGlowShell, 128, 0, 0, kRenderNormal, 16);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW) // TE id
write_short(entity) // entity
write_short(g_trail) // sprite
write_byte(10) // life
write_byte(10) // width
write_byte(128) // r
write_byte(0) // g
write_byte(0) // b
write_byte(255) // brightness
message_end()
set_pev(entity, pev_flTimeStepSound, NADE_TYPE_PIPE);
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
public fw_ThinkGren(entity) // Grenade think event
{
if (!pev_valid(entity))
return HAM_IGNORED;
static Float:dmgtime, Float: current_time, attacker;
pev(entity, pev_dmgtime, dmgtime);
current_time = get_gametime();
attacker = pev(entity, pev_owner);
if(dmgtime > current_time)
return HAM_IGNORED;
if(pev(entity, pev_flTimeStepSound) == NADE_TYPE_PIPE)
{
static duration;
duration = pev(entity, NADE_DURATION_PIPE);
if (duration > 0)
{
new Float:originF[3]
pev(entity, pev_origin, originF);
if (duration == 1)
{
remove_task(entity);
effect(originF);
if (get_pcvar_num(cvar_mode) == 1)
kill(originF, attacker);
engfunc(EngFunc_RemoveEntity, entity);
return HAM_SUPERCEDE;
}
light(originF, duration);
set_task(0.1, "hook", entity, _, _, "b");
if(get_pcvar_num(cvar_mode) == 2)
set_task(1.0, "hurt", entity, _, _, "b");
if(get_pcvar_num(cvar_sound))
{
if(duration == 2)
set_task(0.1, "beep", entity, _, _, "b");
else
emit_sound(entity, CHAN_WEAPON, g_sound, 1.0, ATTN_NORM, 0, PITCH_HIGH);
}
set_pev(entity, NADE_DURATION_PIPE, --duration);
set_pev(entity, pev_dmgtime, current_time + 3.0);
} else if ((pev(entity, pev_flags) & FL_ONGROUND) && get_speed(entity) < 10)
{
set_pev(entity, NADE_DURATION_PIPE, 1 + get_pcvar_num(cvar_duration)/3);
set_pev(entity, pev_dmgtime, current_time + 0.1);
} else
set_pev(entity, pev_dmgtime, current_time + 0.5);
}
return HAM_IGNORED;
}
public beep(entity) // Plays loop beep sound before explosion
{
//Bugfix
if (!pev_valid(entity))
{
remove_task(entity);
return;
}
emit_sound(entity, CHAN_WEAPON, g_sound, 1.0, ATTN_NORM, 0, PITCH_HIGH);
}
public hook(entity) // Magnet func. Hooks zombies to nade
{
//Bugfix
if (!pev_valid(entity))
{
remove_task(entity);
return;
}
static Float:originF[3], Float:radius, victim = -1;
radius = get_pcvar_float(cvar_radius);
pev(entity, pev_origin, originF);
while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, radius)) != 0)
{
if (!is_user_alive(victim) || !zp_get_user_zombie(victim) || g_has_shield[victim])
continue;
new Float:fl_Velocity[3];
new vicOrigin[3], originN[3];
get_user_origin(victim, vicOrigin);
originN[0] = floatround(originF[0]);
originN[1] = floatround(originF[1]);
originN[2] = floatround(originF[2]);
new distance = get_distance(originN, vicOrigin);
if (distance > 1)
{
new Float:fl_Time = distance / get_pcvar_float(cvar_speed);
fl_Velocity[0] = (originN[0] - vicOrigin[0]) / fl_Time;
fl_Velocity[1] = (originN[1] - vicOrigin[1]) / fl_Time;
fl_Velocity[2] = (originN[2] - vicOrigin[2]) / fl_Time;
} else
{
fl_Velocity[0] = 0.0
fl_Velocity[1] = 0.0
fl_Velocity[2] = 0.0
}
entity_set_vector(victim, EV_VEC_velocity, fl_Velocity);
if(get_pcvar_num(cvar_shake))
{
message_begin(MSG_ONE_UNRELIABLE, g_shake, _, victim)
write_short(1<<14) // amplitude
write_short(1<<14) // duration
write_short(1<<14) // frequency
message_end()
}
}
}
public hurt(entity) // Hurts zombies if mode = 2
{
//Bugfix
if (!pev_valid(entity))
{
remove_task(entity);
return;
}
static Float:originF[3], Float:radius, victim = -1;
radius = get_pcvar_float(cvar_radius)/2.0;
pev(entity, pev_origin, originF);
while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, radius)) != 0)
{
if (!is_user_alive(victim) || !zp_get_user_zombie(victim) || g_has_shield[victim])
continue;
new Float:dam = get_pcvar_float(cvar_damage);
if(get_user_health(victim) - get_pcvar_float(cvar_damage) > 0)
fakedamage(victim, "Pipe Bomb", dam, 256);
}
}
public kill(const Float:originF[3], attacker) // Kills zombies in radius / 2 if mode = 1
{
static Float:radius, victim = -1;
radius = get_pcvar_float(cvar_radius) / 2.0;
while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, radius)) != 0)
{
if (!is_user_alive(victim) || !zp_get_user_zombie(victim) || g_has_shield[victim])
continue;
new Float:dam = get_pcvar_float(cvar_damage);
set_msg_block(g_death, BLOCK_SET);
fakedamage(victim, "Pipe Bomb", dam, 256);
set_msg_block(g_death, BLOCK_NOT);
if(get_user_health(victim) <= 0)
{
SendDeathMsg(attacker, victim);
if(victim != attacker && !zp_get_user_zombie(attacker))
UpdateFrags(attacker, 1, 1);
else
UpdateFrags(attacker, -1, 1);
}
}
}
public light(const Float:originF[3], duration) // Blast ring and small red light around nade from zombie_plague40.sma. Great thx, MeRcyLeZZ!!! ;)
{
// Lighting
engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, originF, 0);
write_byte(TE_DLIGHT); // TE id
engfunc(EngFunc_WriteCoord, originF[0]); // x
engfunc(EngFunc_WriteCoord, originF[1]); // y
engfunc(EngFunc_WriteCoord, originF[2]); // z
write_byte(5); // radius
write_byte(128); // r
write_byte(0); // g
write_byte(0); // b
write_byte(51); //life
write_byte((duration < 2) ? 3 : 0); //decay rate
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_ring) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(128) // red
write_byte(0) // 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_ring) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(128) // red
write_byte(0) // 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_ring) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(128) // red
write_byte(0) // green
write_byte(0) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
}
public effect(const Float:originF[3]) // Explosion effect
{
// 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_ring) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(128) // red
write_byte(0) // green
write_byte(0) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
// Explosion sprite
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, originF[0])
engfunc(EngFunc_WriteCoord, originF[1])
engfunc(EngFunc_WriteCoord, originF[2])
write_short(g_fire) //sprite index
write_byte(25) // scale in 0.1's
write_byte(10) // framerate
write_byte(0) // flags
message_end()
}
UpdateFrags(attacker, frags, scoreboard) // Updates attacker frags
{
// Set attacker frags
set_pev(attacker, pev_frags, float(pev(attacker, pev_frags) + frags))
if(get_pcvar_num(cvar_extraap) > 0)
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(cvar_extraap));
// Update scoreboard with attacker and victim info
if (scoreboard)
{
message_begin(MSG_BROADCAST, g_score)
write_byte(attacker) // id
write_short(pev(attacker, pev_frags)) // frags
write_short(get_user_deaths(attacker)) // deaths
write_short(0) // class?
write_short(get_user_team(attacker)) // team
message_end()
}
}
SendDeathMsg(attacker, victim) // Sends death message
{
message_begin(MSG_BROADCAST, g_death)
write_byte(attacker) // killer
write_byte(victim) // victim
write_byte(0) // headshot flag
write_string("Pipe Bomb") // killer's weapon
message_end()
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/