PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <zp50_core>
#include <zp50_items>
#define PLUGIN "[ZP] Item: Protective beam"
#define VERSION "1.0"
#define AUTHOR "Natsheh"
#define ITEM_NAME "Beam protection"
#define ITEM_COST 25
#define player_flag(%1) (1<<(%1 & 31))
#define set_flag(%1,%2) (%1 |= player_flag(%2))
#define remove_flag(%1,%2) (%1 &= ~player_flag(%2))
#define check_flag(%1,%2) (%1 & player_flag(%2))
// SUPPORT AMXX 182
#if !defined write_coord_f
#define write_coord_f(%1) engfunc(EngFunc_WriteCoord, %1)
#endif
#if AMXX_VERSION_NUM > 182
#define client_disconnect client_disconnected
#endif
static g_ItemID, g_beam_sprite;
static g_fwid;
static g_max_clients;
static Float:g_fDelay[ 33 ];
static const g_guns_events[][] = {
"events/awp.sc",
"events/g3sg1.sc",
"events/ak47.sc",
"events/scout.sc",
"events/m249.sc",
"events/m4a1.sc",
"events/sg552.sc",
"events/aug.sc",
"events/sg550.sc",
"events/m3.sc",
"events/xm1014.sc",
"events/usp.sc",
"events/mac10.sc",
"events/ump45.sc",
"events/fiveseven.sc",
"events/p90.sc",
"events/deagle.sc",
"events/p228.sc",
"events/glock18.sc",
"events/mp5n.sc",
"events/tmp.sc",
"events/elite_left.sc",
"events/elite_right.sc",
"events/galil.sc",
"events/famas.sc"
}
static g_guns_eventids_bitsum, g_user_has_item;
static g_cvar_one, g_cvar_two, g_cvar_three;
public plugin_precache()
{
g_beam_sprite = precache_model("sprites/laserbeam.spr");
g_fwid = register_forward(FM_PrecacheEvent, "fwPrecacheEvent", 1)
}
public fwPrecacheEvent(type, const name[]) {
for (new i = 0; i < sizeof g_guns_events; ++i) {
if (equal(g_guns_events[i], name)) {
g_guns_eventids_bitsum |= (1<<get_orig_retval())
return FMRES_HANDLED
}
}
return FMRES_IGNORED
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
g_ItemID = zp_items_register(ITEM_NAME, ITEM_COST)
unregister_forward(FM_PrecacheEvent, g_fwid, 1)
register_forward(FM_PlaybackEvent, "fwPlaybackEvent")
g_max_clients = global_get(glb_maxClients);
g_cvar_one = register_cvar("zp_protective_beam_range", "300");
g_cvar_two = register_cvar("zp_protective_beam_dmg", "50");
g_cvar_three = register_cvar("zp_protective_beam_cooldown", "1");
}
public zp_fw_items_select_pre(id, itemid, ignorecost)
{
// This is not our item
if (itemid != g_ItemID)
{
return ZP_ITEM_AVAILABLE;
}
// item only available to humans
if (zp_core_is_zombie(id))
{
return ZP_ITEM_DONT_SHOW;
}
if (check_flag(g_user_has_item,id))
{
return ZP_ITEM_NOT_AVAILABLE;
}
return ZP_ITEM_AVAILABLE;
}
public zp_fw_items_select_post(id, itemid, ignorecost)
{
// This is not our item
if (itemid != g_ItemID)
return;
set_flag(g_user_has_item,id);
}
public client_disconnect(id)
{
remove_flag(g_user_has_item,id);
}
public zp_fw_core_infect_post(id)
{
remove_flag(g_user_has_item,id);
}
public fwPlaybackEvent(flags, invoker, eventid) {
if (!(g_guns_eventids_bitsum & (1<<eventid)) || !(1 <= invoker <= g_max_clients) || !check_flag(g_user_has_item,invoker))
return FMRES_IGNORED
beam_action(invoker);
return FMRES_HANDLED
}
beam_action(id)
{
static Float:fGametime, ent; fGametime = get_gametime();
if(fGametime < g_fDelay[ id ]) return;
static Float:fOrigin[3], Float:fTOrigin[3], Float:fRadius, Float:flDamage; fRadius = get_pcvar_float(g_cvar_one);
pev(id, pev_origin, fOrigin);
flDamage = get_pcvar_float(g_cvar_two);
ent = -1;
while((ent=find_ent_in_sphere(ent, fOrigin, fRadius)))
{
if( !(1 <= ent <= g_max_clients) ) continue;
pev(ent, pev_origin, fTOrigin);
if(zp_core_is_zombie(ent) && is_in_viewcone(id, fTOrigin, 1))
{
create_beam(fOrigin, fTOrigin, { 225, 225, 225 }, 5, 5, 10, 225);
ExecuteHamB(Ham_TakeDamage, ent, id, id, flDamage, DMG_ENERGYBEAM);
}
}
g_fDelay[ id ] = get_pcvar_float(g_cvar_three) + fGametime;
}
create_beam(Float:fStart[3], Float:fEnd[3], iColors[3], iFramerate, iWidth, iLife, iBrightness)
{
enum _:(+=1) { R = 0, G, B };
enum _:(+=1) { X = 0, Y, Z };
message_begin(MSG_ALL, SVC_TEMPENTITY, _, 0);
write_byte(TE_BEAMPOINTS);
write_coord_f(Float:fStart[ X ]);
write_coord_f(Float:fStart[ Y ]);
write_coord_f(Float:fStart[ Z ]);
write_coord_f(Float:fEnd[ X ]);
write_coord_f(Float:fEnd[ Y ]);
write_coord_f(Float:fEnd[ Z ]);
write_short(g_beam_sprite);
write_byte(0);
write_byte(iFramerate);
write_byte(iLife);
write_byte(iWidth);
write_byte( 2 );
write_byte(iColors[ R ]);
write_byte(iColors[ G ]);
write_byte(iColors[ B ]);
write_byte(iBrightness);
write_byte( 2 );
message_end();
}