Re: Beam do damage when attacking
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(); }
give this a try and tell me the result.
|