JUMP GRENADE:
Code: Select all
/*
- Создание плагинов на закз:
- Контакты:
- Vk: http://vk.com/Opo4uMapy
- ICQ: 585552410
*/
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < zombieplague >
#define PLUGIN "[ZP] Extra Item: Jump Bomb"
#define VERSION "1.0"
#define AUTHOR "Opo4uMapy"
native cs_get_user_bpammo(index, weapon)
native cs_set_user_bpammo(index, weapon, amount)
#define JUMPBOMB_ID 55556
/////////////////////////////////////Cvars/////////////////////////////////////
#define ITEM_NAME "Jump Grenade" // Имя айтема
#define ITEM_COST 6 // Стоимость за 1 бомбу
#define MAX_GRENADE 5 // Лимит гранат
#define RADIUS 300.0 // Радиус взрыва
#define JUMP_DAMAGE 20 // Урон
#define JUMP_EXP 500.0 // Сила отдачи от гранаты
#define GRENADE_ICON //Иконка с лева. Что бы отключить поставьте //
#define BUY_GRENADE_MSG "[ZP] Вы купили гранату джамп"
#define MAX_GRENADE_MSG "[ZP] Вы купили маскимум гранат"
#define TRAIL //Трайл за гранатой. Что бы отключить закоментируем ( //#define TRAIL )
/////////////////////////////////////WeaponList/////////////////////////////////////
#define WEAPONLIST // WeaponList. Что бы отключить закоментируем ( //#define WEAPONLIST )
#define WEAPON_DEFAULT "weapon_smokegrenade" //Weapon под которую сделана граната
#define DEFAULT_CSW CSW_SMOKEGRENADE //CSW под которую сделана граната
#if defined WEAPONLIST
#define WEAPON_NEW "weapon_zombj1_sisa" //Название WeaponList'a новой гранаты
new const WeaponList_Sprite[][] =
{
"sprites/weapon_zombj1_sisa.txt",
"sprites/640hud61.spr",
"sprites/640hud7x.spr"
}
enum
{
prim_ammoid = 13,
prim_ammomaxamount = 1,
sec_ammoid = -1,
sec_ammomaxamount = -1,
slotid = 3,
number_in_slot = 3,
weaponid = 9,
flags = 24
}
#endif
////////////////////////////////////////////////////////////////////////////////////
// Модели гранаты
new const BOMB_MODEL[][] =
{
"models/v_zombibomb.mdl",
"models/p_zombibomb.mdl",
"models/w_zombibomb.mdl"
}
//Звуки покупки
#define g_SoundGrenadeBuy "items/gunpickup2.wav"
#define g_SoundAmmoPurchase "items/9mmclip1.wav"
//Звук взрыва
#define g_SoundBombExplode "nst_zombie/zombi_bomb_exp.wav"
//Не изменять! Звуки прописаны в модели.
new const frogbomb_sound[][] =
{
"nst_zombie/zombi_bomb_pull_1.wav",
"nst_zombie/zombi_bomb_deploy.wav",
"nst_zombie/zombi_bomb_throw.wav"
}
new const frogbomb_sound_idle[][] =
{
"nst_zombie/zombi_bomb_idle_1.wav",
"nst_zombie/zombi_bomb_idle_2.wav",
"nst_zombie/zombi_bomb_idle_3.wav",
"nst_zombie/zombi_bomb_idle_4.wav"
}
new g_itemid
new g_JumpGrenadeCount[33], g_iExplo
#if defined TRAIL
new g_trailSpr
#endif
#if defined GRENADE_ICON
new grenade_icons[33][32]
#endif
public plugin_precache()
{
static i
for(i = 0; i < sizeof BOMB_MODEL; i++)
precache_model(BOMB_MODEL[i])
for(i = 0; i < sizeof frogbomb_sound; i++)
precache_sound(frogbomb_sound[i])
for(i = 0; i < sizeof frogbomb_sound_idle; i++)
precache_sound(frogbomb_sound_idle[i])
precache_sound(g_SoundGrenadeBuy)
precache_sound(g_SoundAmmoPurchase)
precache_sound(g_SoundBombExplode)
#if defined WEAPONLIST
register_clcmd(WEAPON_NEW, "hook")
for(i = 0; i < sizeof WeaponList_Sprite; i++)
precache_generic(WeaponList_Sprite[i])
#endif
g_iExplo = precache_model("sprites/zombiebomb_exp.spr")
#if defined TRAIL
g_trailSpr = precache_model("sprites/laserbeam.spr")
#endif
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
//Ham
RegisterHam(Ham_Think, "grenade", "fw_ThinkGrenade")
RegisterHam(Ham_Item_Deploy, WEAPON_DEFAULT, "DeployPost", 1)
//Forward
register_forward(FM_SetModel, "fw_SetModel")
//Event
register_event("DeathMsg", "DeathMsg", "a")
#if defined GRENADE_ICON
register_event("CurWeapon", "grenade_icon", "be", "1=1")
#endif
//Extra Item
g_itemid = zp_register_extra_item(ITEM_NAME, ITEM_COST, ZP_TEAM_ZOMBIE)
}
#if defined WEAPONLIST
public hook(id)
{
if(!is_user_connected(id))
return PLUGIN_CONTINUE
engclient_cmd(id, WEAPON_DEFAULT)
return PLUGIN_HANDLED
}
#endif
public zp_extra_item_selected(id, Item)
{
if(Item == g_itemid)
{
if(g_JumpGrenadeCount[id] >= MAX_GRENADE)
{
client_print(id, print_chat, "%s", MAX_GRENADE_MSG)
return ZP_PLUGIN_HANDLED
}
new Ammo = cs_get_user_bpammo(id, DEFAULT_CSW)
if(g_JumpGrenadeCount[id] >= 1)
{
cs_set_user_bpammo(id, DEFAULT_CSW, Ammo + 1)
emit_sound(id, CHAN_ITEM, g_SoundAmmoPurchase, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
g_JumpGrenadeCount[id]++
}
else
{
fm_give_item(id, WEAPON_DEFAULT)
client_print(id, print_chat, "%s", BUY_GRENADE_MSG)
emit_sound(id, CHAN_ITEM, g_SoundGrenadeBuy, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
g_JumpGrenadeCount[id] = 1
}
AmmoPickup(id)
#if defined WEAPONLIST
WeaponList(id, 1)
#endif
}
return PLUGIN_HANDLED
}
public zp_user_infected_post(id, infector, nemesis)
{
if(zp_get_user_nemesis(id) || zp_is_survivor_round() || zp_is_nemesis_round())
return
g_JumpGrenadeCount[id] = 0
fm_give_item(id, WEAPON_DEFAULT)
cs_set_user_bpammo(id, DEFAULT_CSW, 1)
emit_sound(id, CHAN_ITEM, g_SoundGrenadeBuy, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
AmmoPickup(id)
g_JumpGrenadeCount[id] = 1
#if defined WEAPONLIST
WeaponList(id, 1)
#endif
}
public zp_user_humanized_post(id, survivor)
{
g_JumpGrenadeCount[id] = 0
#if defined WEAPONLIST
WeaponList(id, 0)
#endif
}
public DeployPost(entity)
{
static id
id = get_pdata_cbase(entity, 41, 4)
if(!is_user_alive(id) || !zp_get_user_zombie(id) || zp_get_user_nemesis(id) || zp_get_user_survivor(id))
return PLUGIN_CONTINUE
set_pev(id, pev_viewmodel2, BOMB_MODEL[0])
set_pev(id, pev_weaponmodel2, BOMB_MODEL[1])
return PLUGIN_CONTINUE
}
public fw_SetModel(Entity, const Model[])
{
if (Entity < 0)
return FMRES_IGNORED
if (pev(Entity, pev_dmgtime) == 0.0)
return FMRES_IGNORED
new iOwner = pev(Entity, pev_owner)
if(!zp_get_user_zombie(iOwner))
return FMRES_IGNORED
if(g_JumpGrenadeCount[iOwner] >= 1 && equal(Model[7], "w_sm", 4))
{
g_JumpGrenadeCount[iOwner]--
set_pev(Entity, pev_flTimeStepSound, JUMPBOMB_ID)
set_pev(Entity, pev_body, 23)
fm_set_rendering(Entity, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 16)
#if defined TRAIL
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(Entity) // entity
write_short(g_trailSpr) // sprite
write_byte(2) // life
write_byte(5) // width
write_byte(0) // r
write_byte(200) // g
write_byte(0) // b
write_byte(200) // brightness
message_end()
#endif
engfunc(EngFunc_SetModel, Entity, BOMB_MODEL[2])
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
public fw_ThinkGrenade(Entity)
{
if(!pev_valid(Entity))
return HAM_IGNORED
static Float:dmg_time
pev(Entity, pev_dmgtime, dmg_time)
if(dmg_time > get_gametime())
return HAM_IGNORED
if(pev(Entity, pev_flTimeStepSound) == JUMPBOMB_ID)
{
JumpBombExplode(Entity)
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
public JumpBombExplode(Entity)
{
if(Entity < 0)
return
static Float:Origin[3]
pev(Entity, pev_origin, Origin)
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, Origin, 0)
write_byte(TE_SPRITE)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2] + 45.0)
write_short(g_iExplo)
write_byte(35)
write_byte(186)
message_end()
emit_sound(Entity, CHAN_WEAPON, g_SoundBombExplode, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
for(new victim = 1; victim <= get_maxplayers(); victim++)
{
if (!is_user_alive(victim))
continue
new Float:VictimOrigin[3]
pev(victim, pev_origin, VictimOrigin)
new Float:Distance = get_distance_f(Origin, VictimOrigin)
if(Distance <= RADIUS)
{
static Float:NewSpeed
NewSpeed = JUMP_EXP * (1.0 - (Distance / RADIUS))
static Float:Velocity[3]
get_speed_vector(Origin, VictimOrigin, NewSpeed, Velocity)
set_pev(victim, pev_velocity, Velocity)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenShake"), _, victim)
write_short(1<<12 * 10)
write_short(1<<12 * 10)
write_short(1<<12 * 10)
message_end()
if(zp_get_user_zombie(victim))
set_user_takedamage(victim, JUMP_DAMAGE)
}
}
engfunc(EngFunc_RemoveEntity, Entity)
}
#if defined GRENADE_ICON
public grenade_icon(id)
{
remove_grenade_icon(id)
if(is_user_bot(id))
return
static igrenade, grenade_sprite[16], grenade_color[3]
igrenade = get_user_weapon(id)
switch(igrenade)
{
case DEFAULT_CSW:
{
if(!is_user_alive(id) || zp_get_user_zombie(id))
{
grenade_sprite = "dmg_gas"
grenade_color = {255, 165, 0}
}
else
{
grenade_sprite = ""
grenade_color = {0, 0, 0}
}
}
default: return
}
grenade_icons[id] = grenade_sprite
message_begin(MSG_ONE, get_user_msgid("StatusIcon"),{0, 0, 0}, id)
write_byte(1)
write_string(grenade_icons[id])
write_byte(grenade_color[0])
write_byte(grenade_color[1])
write_byte(grenade_color[2])
message_end()
return
}
#endif
public zp_round_ended()
{
for(new id = 1; id <= get_maxplayers(); id++)
{
if(!is_user_alive(id) || !zp_get_user_zombie(id))
continue
ham_strip_weapon(id, WEAPON_DEFAULT)
g_JumpGrenadeCount[id] = 0
}
}
public DeathMsg()
{
new attacker = read_data(1)
new victim = read_data(2)
if(!is_user_connected(attacker))
return HAM_IGNORED
if(victim == attacker || !victim)
return HAM_IGNORED
if(!zp_get_user_zombie(victim))
return HAM_IGNORED
#if defined GRENADE_ICON
remove_grenade_icon(victim)
#endif
#if defined WEAPONLIST
WeaponList(victim, 0)
#endif
g_JumpGrenadeCount[victim] = 0
return HAM_HANDLED
}
public client_connect(id) g_JumpGrenadeCount[id] = 0
#if defined WEAPONLIST
WeaponList(index, mode = 0)
{
if (!is_user_connected(index))
return
message_begin(MSG_ONE, get_user_msgid("WeaponList"), {0, 0, 0}, index)
write_string(mode ? WEAPON_NEW : WEAPON_DEFAULT)
write_byte(prim_ammoid)
write_byte(prim_ammomaxamount)
write_byte(sec_ammoid)
write_byte(sec_ammomaxamount)
write_byte(slotid)
write_byte(number_in_slot)
write_byte(weaponid)
write_byte(flags)
message_end()
}
#endif
#if defined GRENADE_ICON
static remove_grenade_icon(index)
{
message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0, 0, 0}, index)
write_byte(0)
write_string(grenade_icons[index])
message_end()
}
#endif
stock set_user_takedamage(index, damage)
{
if(!is_user_alive(index))
return
new vec[3]
FVecIVec(get_target_origin_f(index), vec)
message_begin(MSG_ONE, get_user_msgid("Damage"), _, index)
write_byte(0)
write_byte(damage)
write_long(DMG_CRUSH)
write_coord(vec[0])
write_coord(vec[1])
write_coord(vec[2])
message_end()
if(pev(index, pev_health) - 20.0 <= 0)
ExecuteHamB(Ham_Killed, index, index, 1)
else ExecuteHamB(Ham_TakeDamage, index, 0, index, float(damage), DMG_BLAST)
}
stock AmmoPickup(index)
{
message_begin(MSG_ONE, get_user_msgid("AmmoPickup"), _, index)
write_byte(13)
write_byte(1)
message_end()
}
stock Float:get_target_origin_f(index)
{
new Float:orig[3]
pev(index, pev_origin, orig)
if(index > get_maxplayers())
{
new Float:mins[3], Float:maxs[3]
pev(index, pev_mins, mins)
pev(index, pev_maxs, maxs)
if(!mins[2]) orig[2] += maxs[2] / 2
}
return orig
}
stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
new_velocity[0] = origin2[0] - origin1[0]
new_velocity[1] = origin2[1] - origin1[1]
new_velocity[2] = origin2[2] - origin1[2]
new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
new_velocity[0] *= num
new_velocity[1] *= num
new_velocity[2] *= num
return 1
}
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
new Float:RenderColor[3]
RenderColor[0] = float(r)
RenderColor[1] = float(g)
RenderColor[2] = float(b)
set_pev(entity, pev_renderfx, fx)
set_pev(entity, pev_rendercolor, RenderColor)
set_pev(entity, pev_rendermode, render)
set_pev(entity, pev_renderamt, float(amount))
return 1
}
stock fm_give_item(index, const item[])
{
if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5))
return 0
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item))
if (!pev_valid(ent))
return 0
new Float:origin[3]
pev(index, pev_origin, origin)
set_pev(ent, pev_origin, origin)
set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN)
dllfunc(DLLFunc_Spawn, ent)
new save = pev(ent, pev_solid)
dllfunc(DLLFunc_Touch, ent, index)
if (pev(ent, pev_solid) != save)
return ent
engfunc(EngFunc_RemoveEntity, ent)
return -1
}
stock ham_strip_weapon(index, weapon[])
{
if(!equal(weapon, "weapon_", 7))
return 0
new wId = get_weaponid(weapon)
if(!wId) return 0
new wEnt
while((wEnt = engfunc(EngFunc_FindEntityByString, wEnt, "classname", weapon)) && pev(wEnt,pev_owner) != index) {}
if(!wEnt)
return 0
if(get_user_weapon(index) == wId)
ExecuteHamB(Ham_Weapon_RetireWeapon,wEnt)
if(!ExecuteHamB(Ham_RemovePlayerItem, index, wEnt))
return 0
ExecuteHamB(Ham_Item_Kill, wEnt)
set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<wId))
return 1
}
CONSUSSION Grenade:
Code: Select all
/*
[ZP] Extra Item: Concussion Grenade
Copyright (C) 2009 by NiHiLaNTh
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
In addition, as a special exception, the author gives permission to
link the code of this program with the Half-Life Game Engine ("HL
Engine") and Modified Game Libraries ("MODs") developed by Valve,
L.L.C ("Valve"). You must obey the GNU General Public License in all
respects for all of the code used other than the HL Engine and MODs
from Valve. If you modify this file, you may extend this exception
to your version of the file, but you are not obligated to do so. If
you do not wish to do so, delete this exception statement from your
version.
--- Introduction ---
This plugin adds new weapon to zombie plague - concussion grenade.I took
this idead from Team Fortress Classic.When grenade explodes it doesn't
do any damage, but it starts to make hallucinations to players, such as
screen shake, screen fade, recoil changes.
--- CVARs ---
zp_conc_nade_radius 500 -- Explosion radius
zp_conc_nade_duration 7 -- Duration of hallucinations
--- Credits ---
NiHiLaNTh - Plugin
dels/Shalun - Grenade model
MeRcyLeZZ - Some useful code parts
xPaw / Xellath - Code optimization
--- Changelog ---
v1.0 - Initial release
v1.1 - Optimized code ( Thanks xPaw and Xellath )
v1.2 - Fixed bug when after explosion player were not affected
v1.3 - Added p_ and w_ model support
- Fixed run-time error
- Made some minor improvements ( MeTaLiCroSS )
v1.4 - Players are able to carry multiple grenades at the same time
*/
#include < amxmodx >
#include < fakemeta >
#include < hamsandwich >
#include < fun >
#include < zombieplague >
// Plugin version
#define VERSION "1.4"
// Defines
#define MAXPLAYERS 32
#define FCVAR_FLAGS ( FCVAR_SERVER | FCVAR_SPONLY | FCVAR_UNLOGGED )
#define OFFSET_PLAYER 41
#define OFFSET_ACTIVE 373
#define LINUX_DIFF 5
#define NADE_TYPE_CONC 7000
#define FFADE_IN 0x0000
#define REPEAT 0.2 // Time when next screen fade/shake message is being sent
#define TASK_AFFECT 666
#define ID_AFFECT ( taskid - TASK_AFFECT )
#define OFFSET_FLAMMO 387
// Grenade cost
#define GRENADE_COST 15
// Grenade models
new const grenade_model_p [ ] = "models/p_grenade_conc.mdl"
new const grenade_model [ ] = "models/v_grenade_conc.mdl"
new const grenade_model_w [ ] = "models/w_grenade_conc.mdl"
// Sounds
new const explosion_sound [ ] = "zombie_plague/concgren_blast1.wav"
new const purchase_sound [ ] = "items/gunpickup2.wav"
new const purchase_sound2 [ ] = "items/9mmclip1.wav"
// Cached sprite indexes
new m_iTrail, m_iRing
// Item ID
new g_conc
// Player variables
new g_NadeCount [ MAXPLAYERS+1 ]
// Message ID's
new g_msgScreenFade, g_msgScreenShake, g_msgAmmoPickup
// CVAR pointers
new cvar_nade_radius, cvar_duration
// Precache
public plugin_precache ( )
{
// Precache grenade models
precache_model ( grenade_model_p )
precache_model ( grenade_model )
precache_model ( grenade_model_w )
// Precache sounds
precache_sound ( explosion_sound )
precache_sound ( purchase_sound )
precache_sound ( purchase_sound2 )
// Precache sprites
m_iRing = precache_model ( "sprites/shockwave.spr" )
m_iTrail = precache_model ( "sprites/laserbeam.spr" )
}
// Plugin initialization
public plugin_init ( )
{
// New plugin
register_plugin ( "[ZP] Extra Item: Concussion Grenade", VERSION, "NiHiLaNTh" )
// Add cvar to detect servers with this plugin
register_cvar ( "zp_concgren_version", VERSION, FCVAR_FLAGS )
// New extra item
g_conc = zp_register_extra_item ( "Concussion Grenade", GRENADE_COST, ZP_TEAM_ZOMBIE )
// Events
register_event ( "HLTV", "Event_NewRound", "a", "1=0", "2=0" )
register_event ( "DeathMsg", "Event_DeathMsg", "a" )
register_event ( "CurWeapon", "Event_CurrentWeapon", "be", "1=1", "2=25" )
// Forwards
register_forward ( FM_SetModel, "fw_SetModel" )
RegisterHam ( Ham_Think, "grenade", "fw_ThinkGrenade" )
register_forward ( FM_CmdStart, "fw_CmdStart" )
// CVARs
cvar_nade_radius = register_cvar ( "zp_conc_nade_radius", "500" )
cvar_duration = register_cvar ( "zp_conc_nade_duration", "7" )
// Messages
g_msgScreenShake = get_user_msgid ( "ScreenShake" )
g_msgScreenFade = get_user_msgid ( "ScreenFade" )
g_msgAmmoPickup = get_user_msgid ( "AmmoPickup" )
}
// Someone decided to buy our an extra item
public zp_extra_item_selected ( Player, Item )
{
// This is our grenade
if ( Item == g_conc )
{
// Player already have it
if ( g_NadeCount [ Player ] >= 1 )
{
// Increase nade count
g_NadeCount [ Player ]++
// Increase bp ammo
set_pdata_int ( Player, OFFSET_FLAMMO, get_pdata_int ( Player, OFFSET_FLAMMO, LINUX_DIFF )+1, LINUX_DIFF )
// Ammo pickup
message_begin ( MSG_ONE, g_msgAmmoPickup, _, Player )
write_byte ( 11 ) // Ammo ID
write_byte ( 1 ) // Ammo amount
message_end ( )
// Emit sound
emit_sound ( Player, CHAN_WEAPON, purchase_sound2, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
}
else // 0 grenades
{
// Increase nade count
g_NadeCount [ Player ] = 1
// Give him flashbang
give_item ( Player, "weapon_flashbang" )
// Play purchase sound
client_cmd ( Player, "spk %s", purchase_sound )
}
}
return PLUGIN_CONTINUE
}
// Someone was infected
public zp_user_infected_post ( Player, Infector )
{
// We were affected by concussion grenade
if ( task_exists ( Player+TASK_AFFECT ) )
remove_task ( Player+TASK_AFFECT )
}
// Someone were turned back to human
public zp_user_humanized_post ( Player, Survivor )
{
// We dont' have nade anymore
if ( g_NadeCount [ Player ] )
{
g_NadeCount [ Player ] = 0
}
}
// New round started
public Event_NewRound ( )
{
// Reset nade count
arrayset ( g_NadeCount, false, 33 )
// And they aren't affected by conc.grenade
remove_task ( TASK_AFFECT )
}
// Someone died
public Event_DeathMsg ( )
{
// Get victim
new victim = read_data ( 2 )
// Some people had error without this check
if ( !is_user_connected ( victim ) )
return
// Remove hallucinations
remove_task ( victim+TASK_AFFECT )
// Reset nade count
g_NadeCount [ victim ] = 0
}
// Current weapon player is holding
public Event_CurrentWeapon ( Player )
{
// Dead or not zombie or don't have conc. grenade
if ( !is_user_alive ( Player ) || !zp_get_user_zombie ( Player ) || g_NadeCount [ Player ] <= 0 )
return PLUGIN_CONTINUE
// Replace flashbang model with our ones
set_pev ( Player, pev_viewmodel2, grenade_model )
set_pev ( Player, pev_weaponmodel2, grenade_model_p )
return PLUGIN_CONTINUE
}
// Set model
public fw_SetModel ( Entity, const Model [ ] )
{
// Prevent invalid ent messages
if ( !pev_valid ( Entity ) )
return FMRES_IGNORED
// Grenade not thrown yet
if ( pev ( Entity, pev_dmgtime ) == 0.0 )
return FMRES_IGNORED
// We are throwing concussion grenade
if ( g_NadeCount [ pev ( Entity, pev_owner ) ] >= 1 && equal ( Model [7 ], "w_fl", 4 ) )
{
//Draw trail
message_begin ( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte ( TE_BEAMFOLLOW ) // Temp entity ID
write_short ( Entity ) // Entity to follow
write_short ( m_iTrail ) // Sprite index
write_byte ( 10 ) // Life
write_byte ( 10 ) // Line width
write_byte ( 255 ) // Red amount
write_byte ( 255 ) // Blue amount
write_byte ( 0 ) // Blue amount
write_byte ( 255 ) // Alpha
message_end ( )
// Set grenade entity
set_pev ( Entity, pev_flTimeStepSound, NADE_TYPE_CONC )
// Decrease nade count
g_NadeCount [ pev ( Entity, pev_owner ) ]--
// Set world model
engfunc ( EngFunc_SetModel, Entity, grenade_model_w )
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
// Grenade is getting to explode
public fw_ThinkGrenade ( Entity )
{
// Prevent invalid ent messages
if ( !pev_valid ( Entity ) )
return HAM_IGNORED
// Get damage time
static Float:dmg_time
pev ( Entity, pev_dmgtime, dmg_time )
// maybe it is time to go off
if ( dmg_time > get_gametime ( ) )
return HAM_IGNORED
// Our grenade
if ( pev ( Entity, pev_flTimeStepSound ) == NADE_TYPE_CONC )
{
// Force to explode
concussion_explode ( Entity )
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
// Command start
public fw_CmdStart ( Player, UC_Handle, Seed )
{
// Dead, zombie or not affected
if ( !is_user_alive ( Player ) || zp_get_user_zombie ( Player ) || !task_exists ( Player+TASK_AFFECT ) )
return FMRES_IGNORED
// Get buttons
new buttons = get_uc ( UC_Handle, UC_Buttons )
// We are firing
if ( buttons & IN_ATTACK )
{
// We are holding an active weapon
if ( get_pdata_cbase ( Player, OFFSET_ACTIVE, LINUX_DIFF ) )
{
// New recoil
set_pev ( Player, pev_punchangle, Float:{3.0, 3.0, 4.0} )
}
}
return FMRES_HANDLED
}
// Grenade explode
public concussion_explode ( Entity )
{
// Invalid entity ?
if ( !pev_valid ( Entity ) )
return
// Get entities origin
static Float:origin [ 3 ]
pev ( Entity, pev_origin, origin )
// Draw ring
UTIL_DrawRing (origin )
// Explosion sound
emit_sound ( Entity, CHAN_WEAPON, explosion_sound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM )
// Collisions
static victim
victim = -1
// Find radius
static Float:radius
radius = get_pcvar_float ( cvar_nade_radius )
// Find all players in a radius
while ( ( victim = engfunc ( EngFunc_FindEntityInSphere, victim, origin, radius ) ) != 0 )
{
// Dead or zombie
if ( !is_user_alive ( victim ) || zp_get_user_zombie ( victim ) )
continue
// Victim isn't affected yet
if ( !task_exists ( victim+TASK_AFFECT ) )
{
// Get duration
new duration = get_pcvar_num ( cvar_duration )
// Calculate affect times
new affect_count = floatround ( duration / REPEAT )
// Continiously affect them
set_task ( REPEAT, "affect_victim", victim+TASK_AFFECT, _, _, "a", affect_count )
}
}
// Remove entity from ground
engfunc ( EngFunc_RemoveEntity, Entity )
}
// We are going to affect you
public affect_victim ( taskid )
{
// Dead
if ( !is_user_alive ( ID_AFFECT ) )
return
// Make a screen fade
message_begin ( MSG_ONE_UNRELIABLE, g_msgScreenFade, {0,0,0}, ID_AFFECT )
write_short ( 1<<13 ) // Duration
write_short ( 1<<14 ) // Hold Time
write_short ( FFADE_IN ) // Fade type
write_byte ( random_num ( 50, 200 ) ) // Red amount
write_byte ( random_num ( 50, 200 ) ) // Green amount
write_byte ( random_num ( 50, 200 ) ) // Blue amount
write_byte ( random_num ( 50, 200 ) ) // Alpha
message_end ( )
// Make a screen shake
message_begin ( MSG_ONE_UNRELIABLE, g_msgScreenShake, {0,0,0}, ID_AFFECT )
write_short ( 0xFFFF ) // Amplitude
write_short ( 1<<13 ) // Duration
write_short ( 0xFFFF ) // Frequency
message_end ( )
// Remove task after all
remove_task ( ID_AFFECT )
}
// Draw explosion ring ( from zombie_plague40.sma )
stock UTIL_DrawRing ( const Float:origin [ 3 ] )
{
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, origin[0]) // x
engfunc(EngFunc_WriteCoord, origin[1]) // y
engfunc(EngFunc_WriteCoord, origin[2]) // z
engfunc(EngFunc_WriteCoord, origin[0]) // x axis
engfunc(EngFunc_WriteCoord, origin[1]) // y axis
engfunc(EngFunc_WriteCoord, origin[2]+555.0) // z axis
write_short( m_iRing ) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(60) // width
write_byte(0) // noise
write_byte(200) // red
write_byte(200) // green
write_byte(200) // blue
write_byte(200) // brightness
write_byte(0) // speed
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 }
*/