limit weapons
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
limit weapons
Hello,
I want a plugin with limiting weapon. For example, I have a powerful gun on the server and its too strong for zombies when every human can have it at the same time. So I want to make for example this gun for max. 4 players per round.
To sum up:
Four players bought powerful gun and after that gun is blocked in extra item menu and nobody can buy it
I want a plugin with limiting weapon. For example, I have a powerful gun on the server and its too strong for zombies when every human can have it at the same time. So I want to make for example this gun for max. 4 players per round.
To sum up:
Four players bought powerful gun and after that gun is blocked in extra item menu and nobody can buy it
- new bool:g_bCanUse
- if (!g_bCanUse || ze_get_humans_number() <= x) // where x is the number of humans that are need to be there so that the gun is auto limited!
- return ZE_ITEM_UNAVAILABLE
LOL
Need to check number of players have this item, and if they more than 4 alive then block buy in select item pre as rain said.
Rain,
Rain,
ze_get_humans_number()
will return alive players number, you need to count how many players have the item by make new boolean array (For every player variable) like g_bHasItem[33] and then check if there is more than 4 is true in this array if yes then block buy.- stock getTrueNumber(bool:g_bArray[])
- {
- new iTrueCount
- for(new i = 0; i <= charsmax(g_bArray[]); i++)
- {
- if (g_bArray[i])
- iTrueCount++
- }
- return iTrueCount
- }
He who fails to plan is planning to fail
oh thanks raheemRaheem wrote: ↑5 years ago Need to check number of players have this item, and if they more than 4 alive then block buy in select item pre as rain said.
Rain,ze_get_humans_number()
will return alive players number, you need to count how many players have the item by make new boolean array (For every player variable) like g_bHasItem[33] and then check if there is more than 4 is true in this array if yes then block buy.
stock getTrueNumber(bool:g_bArray[]) { new iTrueCount for(new i = 0; i <= charsmax(g_bArray); i++) { if (g_bArray[i]) iTrueCount++ } return iTrueCount }
LOL
Forget to say, you need to set for every player have the item g_bHaveItem[id] to ture. You may make task and check every x second if this player have this item or not.
He who fails to plan is planning to fail
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
Maybe you post an item and i'll show you example.
He who fails to plan is planning to fail
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
Code: Select all
/* Made with the information from HLSDK*/
#include <zombie_escape>
#include <fakemeta_util>
#include <engine>
#include <xs>
#define PLUGIN "Hornet Gun"
#define VERSION "1.0"
#define AUTHOR "Bim Bim Cay"
// Models
#define v_model "models/v_hgun.mdl"
#define p_model "models/p_hgun.mdl"
#define w_model "models/w_hgun.mdl"
#define hornet_model "models/hornet.mdl"
// Sounds
new const HornetGuns_Sounds[9][] =
{
"agrunt/ag_fire1.wav",
"agrunt/ag_fire2.wav",
"agrunt/ag_fire3.wav",
"hornet/ag_hornethit1.wav",
"hornet/ag_hornethit2.wav",
"hornet/ag_hornethit3.wav",
"hornet/ag_buzz1.wav",
"hornet/ag_buzz2.wav",
"hornet/ag_buzz3.wav"
}
// Sprites
#define spr_trail "sprites/laserbeam.spr"
// Animations
#define ANIM_IDLE1 0
#define ANIM_FIDGETSWAY 1
#define ANIM_FIDGETSHAKE 2
#define ANIM_DOWN 3
#define ANIM_UP 4
#define ANIM_SHOOT 5
#define ANIM_EXTENSION "m249"
// Entity Classname
#define HORNET_CLASSNAME "CSHivehand_Hornet"
// FireMode
#define FIREMODE_TRACK 1
#define FIREMODE_FAST 2
#define FIREMODE_DIE 3
// State
#define STATE_STARTTRACK 1
#define STATE_STARTDART 2
#define STATE_TRACKTARGET 3
#define STATE_REMOVEHORNET 4
// Configs
#define WEAPON_NAME "weapon_hgun"
#define WEAPON_BASE "weapon_famas"
#define HORNET_TYPE_RED 0
#define HORNET_TYPE_ORANGE 1
#define NOT_IN_WATER 0
#define HEAD_IN_WATER 3
#define HG_FLY_SPEED pev_fuser4
#define HG_FIRE_MODE pev_iuser2
#define HG_TYPE_COLOR pev_iuser3
#define HG_THINK_STEP pev_iuser4
#define HG_ENEMY_LKP pev_vuser4
#define HG_STOP_ATTACK pev_ltime
#define HIVEHAND_REFIRE_PRI 0.25 // Refire rate for primary attack
#define HIVEHAND_REFIRE_SEC 0.1 // Refire rate for secondary attack
#define HIVEHAND_AMMO 20 // Max hornets
#define HIVEGUN_REGEN_TIME 0.3 // Regenerate time
#define HORNET_RED_SPEED 600.0 // Red hornet speed
#define HORNET_ORANGE_SPEED 800.0 // Orage hornet speed
#define HORNET_BUZZ_VOLUME 0.8 // Buzz volume
#define HORNET_FOV 0.1 // hornet's field of vision | 0.9 = +- 25 degrees ( float ).
#define HORNET_SEARCH_RADIUS 1024.0 // How far should the hornets searh enemy? ( float ).
#define HORNET_DAMAGE 200.0 // Damage by hornet.
// MACROS
#define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
#define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
#define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
#define INSTANCE(%0) ((%0 == -1) ? 0 : %0)
#define IsValidPev(%0) (pev_valid(%0) == 2)
#define IsObserver(%0) pev(%0,pev_iuser1)
#define MUZZLE_INTOLERANCE 100
#define OBS_IN_EYE 4
#define VIP_FLAG "VIP_A"
new g_iszWeaponKey
new g_SprTrail
new g_MaxEntities
new g_FriendlyFire
// Safety
new g_HamBot
new g_IsConnected, g_IsAlive
new g_item
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
// Safety
Register_SafetyFunc()
// Forward
register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
register_forward(FM_SetModel, "fw_SetModel")
// Think
register_think(HORNET_CLASSNAME, "fw_Hornet_Think")
// Touch
register_touch(HORNET_CLASSNAME, "*", "fw_Hornet_Touch")
// Ham
RegisterHam(Ham_Spawn, "weaponbox", "fw_Weaponbox_Spawn_Post", 1)
RegisterHam(Ham_Item_Deploy, WEAPON_BASE, "fw_Item_Deploy_Post", 1)
RegisterHam(Ham_Item_Holster, WEAPON_BASE, "fw_Item_Holster_Post", 1)
RegisterHam(Ham_Item_PostFrame, WEAPON_BASE, "fw_Item_PostFrame")
RegisterHam(Ham_Weapon_Reload, WEAPON_BASE, "fw_Weapon_Reload")
RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_BASE, "fw_Weapon_WeaponIdle")
RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_BASE, "fw_Weapon_PrimaryAttack")
RegisterHam(Ham_Weapon_SecondaryAttack, WEAPON_BASE, "fw_Weapon_SecondaryAttack")
g_item = ze_register_item("Hornet Gun", 300, 0)
ze_set_item_vip(g_item, VIP_FLAG)
}
public plugin_precache()
{
precache_model(v_model)
precache_model(p_model)
precache_model(w_model)
precache_model(hornet_model)
g_SprTrail = precache_model(spr_trail)
for(new i = 0; i < sizeof(HornetGuns_Sounds); i++)
precache_sound(HornetGuns_Sounds[i])
g_iszWeaponKey = engfunc(EngFunc_AllocString, WEAPON_NAME)
}
public plugin_cfg()
{
g_MaxEntities = global_get(glb_maxEntities)
g_FriendlyFire = get_pcvar_num(get_cvar_pointer("mp_friendlyfire"))
}
public client_putinserver(iPlayer)
{
Safety_Connected(iPlayer)
if(!g_HamBot && is_user_bot(iPlayer))
{
g_HamBot = 1
set_task(0.1, "Register_HamBot", iPlayer)
}
}
public Register_HamBot(iPlayer)
{
Register_SafetyFuncBot(iPlayer)
}
public client_disconnected(iPlayer)
{
Safety_Disconnected(iPlayer)
}
public Get_MyWeapon(iPlayer)
{
Weapon_Give(iPlayer)
}
public ze_select_item_pre(id, itemid)
{
// Return Available and we will block it in Post, So it dosen't affect other plugins
if (itemid != g_item)
return ZE_ITEM_AVAILABLE
// Available for Humans only, So don't show it for zombies
if (ze_is_user_zombie(id))
return ZE_ITEM_DONT_SHOW
return ZE_ITEM_AVAILABLE
}
public ze_select_item_post(id, itemid)
{
// Here we just block buying the gun if it is not the gun the player is willing to buy so we just add return without values.
if (itemid != g_item)
return
Get_MyWeapon(id)
}
//**********************************************
//* Forward Hooking *
//**********************************************
public fw_UpdateClientData_Post(iPlayer, sendweapons, CD_Handle)
{
enum
{
SPEC_MODE,
SPEC_TARGET,
SPEC_END
}
static aSpecInfo[33][SPEC_END]
static iTarget
static iSpecMode
static iActiveItem
iTarget = (iSpecMode = IsObserver(iPlayer)) ? pev(iPlayer, pev_iuser2) : iPlayer
if(!is_alive(iTarget))
return FMRES_IGNORED
iActiveItem = get_pdata_cbase(iTarget, 373, 5)
if(!IsValidPev(iActiveItem) || !IsCustomItem(iActiveItem))
return FMRES_IGNORED
if(iSpecMode)
{
if(aSpecInfo[iPlayer][SPEC_MODE] != iSpecMode)
{
aSpecInfo[iPlayer][SPEC_MODE] = iSpecMode
aSpecInfo[iPlayer][SPEC_TARGET] = 0
}
if(iSpecMode == OBS_IN_EYE && aSpecInfo[iPlayer][SPEC_TARGET] != iTarget)
{
aSpecInfo[iPlayer][SPEC_TARGET] = iTarget
Weapon_SendAnim(iPlayer, iActiveItem, ANIM_IDLE1)
}
}
set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001)
return FMRES_HANDLED
}
//**********************************************
//* Weaponbox world model. *
//**********************************************
public fw_SetModel(iEntity) <WeaponBox: Enabled>
{
state WeaponBox: Disabled
if(!IsValidPev(iEntity))
return FMRES_IGNORED
#define MAX_ITEM_TYPES 6
for(new i, iItem; i < MAX_ITEM_TYPES; i++)
{
iItem = get_pdata_cbase(iEntity, 34 + i, 4)
if(IsValidPev(iItem) && IsCustomItem(iItem))
{
engfunc(EngFunc_SetModel, iEntity, w_model)
return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}
public fw_SetModel() </* Empty statement */>
{
/* Fallback */
return FMRES_IGNORED
}
public fw_SetModel() <WeaponBox: Disabled>
{
/* Do nothing */
return FMRES_IGNORED
}
public fw_Weaponbox_Spawn_Post(iWeaponBox)
{
if(IsValidPev(iWeaponBox))
{
state (IsValidPev(pev(iWeaponBox, pev_owner))) WeaponBox: Enabled
}
return HAM_IGNORED
}
//**********************************************
//* Weapon's codes. *
//**********************************************
public fw_Item_Deploy_Post(iItem)
{
if(!IsCustomItem(iItem))
return
static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
set_pev(iPlayer, pev_viewmodel2, v_model)
set_pev(iPlayer, pev_weaponmodel2, p_model)
Weapon_SendAnim(iPlayer, iItem, ANIM_UP)
set_pdata_string(iPlayer, (492) * 4, ANIM_EXTENSION, -1 , 20)
}
public fw_Item_Holster_Post(iItem)
{
if(!IsCustomItem(iItem))
return
//!!!HACKHACK - can't select hornetgun if it's empty! no way to get ammo for it, either.
if(get_pdata_int(iItem, 51, 4) <= 0)
{
set_pdata_int(iItem, 51, 1, 4)
}
}
public fw_Item_PostFrame(iItem)
{
if(!IsCustomItem(iItem))
return HAM_IGNORED
static Float:flLastEventCheck; flLastEventCheck = get_pdata_float(iItem, 38, 4)
if(flLastEventCheck < get_gametime())
{
flLastEventCheck = get_gametime() + HIVEGUN_REGEN_TIME
set_pdata_float(iItem, 38, flLastEventCheck, 4)
static iClip; iClip = get_pdata_int(iItem, 51, 4)
if(iClip < HIVEHAND_AMMO)
{
iClip++
set_pdata_int(iItem, 51, iClip, 4)
}
}
return HAM_IGNORED
}
public fw_Weapon_Reload(iItem)
{
if(!IsCustomItem(iItem))
return HAM_IGNORED
return HAM_SUPERCEDE
}
public fw_Weapon_WeaponIdle(iItem)
{
if(!IsCustomItem(iItem))
return HAM_IGNORED
static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
if(get_pdata_float(iItem, 48, 4) > 0.0)
return HAM_SUPERCEDE
static Float:f_Rand; f_Rand = random_float(0.0, 1.0)
if(f_Rand <= 0.75)
{
set_pdata_float(iItem, 48, 30.0 / 16.0 * 2.0, 4)
Weapon_SendAnim(iPlayer, iItem, ANIM_IDLE1)
}
else if (f_Rand <= 0.875)
{
set_pdata_float(iItem, 48, 40.0 / 16.0, 4)
Weapon_SendAnim(iPlayer, iItem, ANIM_FIDGETSWAY)
}
else
{
set_pdata_float(iItem, 48, 35.0 / 16.0, 4)
Weapon_SendAnim(iPlayer, iItem, ANIM_FIDGETSHAKE)
}
return HAM_SUPERCEDE
}
public fw_Weapon_PrimaryAttack(iItem)
{
if(!IsCustomItem(iItem))
return HAM_IGNORED
static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
static iClip; iClip = get_pdata_int(iItem, 51, 4)
if(iClip <= 0)
return HAM_SUPERCEDE
set_pdata_float(iItem, 38, get_gametime() + HIVEGUN_REGEN_TIME, 4)
iClip--
set_pdata_int(iItem, 51, iClip, 4)
static Float:Punchangle[3]
Punchangle[0] = float(random_num(0, 2))
set_pev(iPlayer, pev_punchangle, Punchangle)
set_pdata_float(iItem, 46, HIVEHAND_REFIRE_PRI, 4)
set_pdata_float(iItem, 47, HIVEHAND_REFIRE_PRI, 4)
set_pdata_float(iItem, 48, random_float(10.0, 15.0), 4)
static iFlags, szAnimation[64]
if(iFlags & FL_DUCKING)
{
formatex(szAnimation, charsmax(szAnimation), "crouch_shoot_%s", ANIM_EXTENSION)
}
else
{
formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION)
}
Weapon_SendAnim(iPlayer, iItem, ANIM_SHOOT)
switch(random_num(0, 2))
{
case 0: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
case 1: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
case 2: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
static Float:Origin[3]
Get_Position(iPlayer, 16.0, !get_cvar_num("cl_righthand") ? -8.0 : 8.0, -12.0, Origin)
static HornetEnt; HornetEnt = Hornet_Create(iPlayer, Origin)
if(HornetEnt > 0)
{
static Float:vAngle[3], Float:vForward[3], Float:Velocity[3]
pev(iPlayer, pev_v_angle, vAngle)
angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward)
xs_vec_mul_scalar(vForward, 300.0, Velocity)
set_pev(HornetEnt, pev_velocity, Velocity)
Hornet_Spawn(HornetEnt, FIREMODE_TRACK)
}
return HAM_SUPERCEDE
}
public fw_Weapon_SecondaryAttack(iItem)
{
if(!IsCustomItem(iItem))
return HAM_IGNORED
static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
static iClip; iClip = get_pdata_int(iItem, 51, 4)
if(iClip <= 0)
return HAM_SUPERCEDE
set_pdata_float(iItem, 38, get_gametime() + HIVEGUN_REGEN_TIME, 4)
iClip--
set_pdata_int(iItem, 51, iClip, 4)
static Float:Punchangle[3]
Punchangle[0] = float(random_num(0, 2))
set_pev(iPlayer, pev_punchangle, Punchangle)
set_pdata_float(iItem, 46, HIVEHAND_REFIRE_SEC, 4)
set_pdata_float(iItem, 47, HIVEHAND_REFIRE_SEC, 4)
set_pdata_float(iItem, 48, random_float(10.0, 15.0), 4)
static iFlags, szAnimation[64]
if(iFlags & FL_DUCKING)
{
formatex(szAnimation, charsmax(szAnimation), "crouch_shoot_%s", ANIM_EXTENSION)
}
else
{
formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION)
}
Weapon_SendAnim(iPlayer, iItem, ANIM_SHOOT)
switch(random_num(0, 2))
{
case 0: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
case 1: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
case 2: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
static Float:Right, Float:Up
static FirePhase; FirePhase = get_pdata_int(iItem, 30, 4)
FirePhase++
set_pdata_int(iItem, 30, FirePhase, 4)
switch(FirePhase)
{
case 1:
{
Up = 8.0
Right = 0.0
}
case 2:
{
Up = 8.0
Right = 8.0
}
case 3:
{
Up = 0.0
Right = 8.0
}
case 4:
{
Up = -8.0
Right = 8.0
}
case 5:
{
Up = -8.0
Right = 0.0
}
case 6:
{
Up = -8.0
Right = -8.0
}
case 7:
{
Up = 0.0
Right = -8.0
}
case 8:
{
Up = 8.0
Right = -8.0
set_pdata_int(iItem, 30, FirePhase, 4)
}
}
static Float:Origin[3]
Get_Position(iPlayer, 16.0, (!get_cvar_num("cl_righthand") ? -8.0 : 8.0) + Right, -12.0 + Up, Origin)
static HornetEnt; HornetEnt = Hornet_Create(iPlayer, Origin)
if(HornetEnt > 0)
{
static Float:vAngle[3], Float:vForward[3], Float:Velocity[3]
pev(iPlayer, pev_v_angle, vAngle)
angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward)
xs_vec_mul_scalar(vForward, 1200.0, Velocity)
set_pev(HornetEnt, pev_velocity, Velocity)
Hornet_Spawn(HornetEnt, FIREMODE_FAST)
}
return HAM_SUPERCEDE
}
Hornet_Create(iPlayer, Float:Origin[3])
{
static Float:Angles[3]
pev(iPlayer, pev_v_angle, Angles)
static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
if(!pev_valid(Ent))
return FM_NULLENT
set_pev(Ent, pev_classname, HORNET_CLASSNAME)
set_pev(Ent, pev_owner, iPlayer)
set_pev(Ent, pev_origin, Origin)
set_pev(Ent, pev_angles, Angles)
return Ent
}
Hornet_Spawn(HornetEnt, FireMode)
{
set_pev(HornetEnt, pev_movetype, MOVETYPE_FLY)
set_pev(HornetEnt, pev_solid, SOLID_BBOX)
set_pev(HornetEnt, pev_flags, pev(HornetEnt, pev_flags ) | FL_MONSTER)
set_pev(HornetEnt, pev_health, 1.0)
if(random_num (1, 5) <= 2)
{
set_pev(HornetEnt, HG_TYPE_COLOR, HORNET_TYPE_RED)
set_pev(HornetEnt, HG_FLY_SPEED, HORNET_RED_SPEED)
}
else
{
set_pev(HornetEnt, HG_TYPE_COLOR, HORNET_TYPE_ORANGE)
set_pev(HornetEnt, HG_FLY_SPEED, HORNET_ORANGE_SPEED)
}
if(FireMode == FIREMODE_TRACK)
{
set_pev(HornetEnt, HG_STOP_ATTACK, get_gametime() + 3.5)
}
engfunc(EngFunc_SetModel, HornetEnt, hornet_model)
engfunc(EngFunc_SetSize, HornetEnt, Float:{-4.0, -4.0, -4.0}, Float:{4.0, 4.0, 4.0})
set_pev(HornetEnt, HG_FIRE_MODE, FIREMODE_DIE)
set_pev(HornetEnt, HG_THINK_STEP, FireMode == FIREMODE_TRACK ? STATE_STARTTRACK : STATE_STARTDART)
set_pev(HornetEnt, pev_nextthink, get_gametime() + 0.1)
}
public fw_Hornet_Think(Ent)
{
if(!pev_valid(Ent))
return
switch(pev(Ent, HG_THINK_STEP))
{
case STATE_STARTTRACK:
{
IgniteTrail(Ent)
set_pev(Ent, HG_FIRE_MODE, FIREMODE_TRACK)
set_pev(Ent, HG_THINK_STEP, STATE_TRACKTARGET)
}
case STATE_STARTDART:
{
IgniteTrail(Ent)
set_pev(Ent, HG_FIRE_MODE, FIREMODE_FAST)
set_pev(Ent, HG_THINK_STEP, STATE_REMOVEHORNET)
set_pev(Ent, pev_nextthink, get_gametime() + 4.0)
return
}
case STATE_TRACKTARGET:
{
TrackingTarget(Ent)
}
case STATE_REMOVEHORNET:
{
RemovingHornet(Ent)
}
}
set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
}
public fw_Hornet_Touch(Ent, Touch)
{
if(!pev_valid(Ent))
return
switch(pev(Ent, HG_FIRE_MODE))
{
case FIREMODE_TRACK: TrackTouch(Ent, Touch)
case FIREMODE_FAST: DartTouch(Ent, Touch)
case FIREMODE_DIE: DieTouch(Ent, Touch)
}
}
RemovingHornet(Ent)
{
set_pev(Ent, pev_flags, FL_KILLME)
}
IgniteTrail(Ent)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(Ent)
write_short(g_SprTrail )
write_byte(10)
write_byte(2)
switch(pev(Ent, HG_TYPE_COLOR))
{
case HORNET_TYPE_RED:
{
write_byte(179)
write_byte(39)
write_byte(14)
}
case HORNET_TYPE_ORANGE:
{
write_byte(255)
write_byte(128)
write_byte(0)
}
}
write_byte(128)
message_end()
}
TrackingTarget(Ent)
{
if(IsHornetShouldDie(Ent))
{
set_pev(Ent, HG_FIRE_MODE, 0)
set_pev(Ent, HG_THINK_STEP, STATE_REMOVEHORNET)
set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
}
static Float:FlightDir[3], Float:DirToEnnemy[3]
static Float:EnemyLKP[3], Float:Velocity[3]
static Float:Origin[3], Float:Angles[3]
static Float:Delta, Float:FlySpeed, Enemy
pev(Ent, pev_velocity, Velocity)
pev(Ent, pev_origin, Origin)
Enemy = pev(Ent, pev_enemy)
if(!IsEnemyValid(Ent, Enemy))
{
set_pev(Ent, pev_enemy, 0)
Enemy = 0
}
if(!Enemy)
{
Enemy = BestVisibleEnemy(Ent, Origin)
}
if(Enemy != 0 && FVisible(Ent,Enemy))
{
pev(Enemy, pev_origin, EnemyLKP)
set_pev(Ent, HG_ENEMY_LKP, EnemyLKP)
}
else
{
pev(Ent, HG_FLY_SPEED, FlySpeed)
pev(Ent, HG_ENEMY_LKP, EnemyLKP)
VectorMA(EnemyLKP, FlySpeed * 0.1, Velocity)
set_pev(Ent, HG_ENEMY_LKP, EnemyLKP)
}
pev(Ent, pev_origin, Origin)
xs_vec_sub(EnemyLKP, Origin, Origin)
xs_vec_normalize(Origin, DirToEnnemy)
xs_vec_len(Velocity) < 0.1 ? xs_vec_copy(DirToEnnemy, FlightDir) : xs_vec_normalize(Velocity, FlightDir)
Delta = xs_vec_dot(FlightDir, DirToEnnemy)
if(Delta < 0.5)
{
switch(random_num(0, 2))
{
case 0: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[6], HORNET_BUZZ_VOLUME, ATTN_NORM, 0, PITCH_NORM)
case 1: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[7], HORNET_BUZZ_VOLUME, ATTN_NORM, 0, PITCH_NORM)
case 2: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[8], HORNET_BUZZ_VOLUME, ATTN_NORM, 0, PITCH_NORM)
}
}
if(Delta <= 0 && pev(Ent, HG_TYPE_COLOR) == HORNET_TYPE_RED)
{
Delta = 0.25
}
xs_vec_add(FlightDir, DirToEnnemy, DirToEnnemy)
xs_vec_normalize(DirToEnnemy, Velocity)
switch(pev(Ent, HG_TYPE_COLOR))
{
case HORNET_TYPE_RED:
{
pev(Ent, HG_FLY_SPEED, FlySpeed)
xs_vec_mul_scalar(Velocity, FlySpeed * Delta, Velocity)
set_pev(Ent, pev_velocity, Velocity)
set_pev(Ent, pev_nextthink, get_gametime() + random_float(0.1, 0.3))
}
case HORNET_TYPE_ORANGE:
{
pev(Ent, HG_FLY_SPEED, FlySpeed)
xs_vec_mul_scalar(Velocity, FlySpeed, Velocity)
set_pev(Ent, pev_velocity, Velocity)
set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
}
}
engfunc(EngFunc_VecToAngles, Velocity, Angles)
set_pev(Ent, pev_angles, Angles)
set_pev(Ent, pev_solid, SOLID_BBOX)
}
IsHornetShouldDie(Ent)
{
static Float:LifeTime; pev(Ent, HG_STOP_ATTACK, LifeTime)
if(get_gametime() > LifeTime)
return 1
return 0
}
IsEnemyValid(Ent, Enemy)
{
if(!pev_valid(Enemy))
return 0
static Flags; Flags = pev(Enemy, pev_flags)
if(Flags & (FL_CLIENT | FL_FAKECLIENT))
{
if(!is_alive(Enemy) || pev(Enemy, pev_deadflag) > DEAD_NO)
{
return 0
}
else if(!g_FriendlyFire && IsSameTeam(Enemy, pev(Ent, pev_owner)))
{
return 0
}
}
else if(Flags & FL_MONSTER)
{
static Float:Health; pev(Enemy, pev_health, Health)
if(Health <= 0)
return 0
}
return 1
}
BestVisibleEnemy(Ent, Float:Origin[3])
{
static Target, Flags
static Float:Mins[3], Float:Maxs[3]
static Float:Absmins[3], Float:Absmaxs[3]
xs_vec_sub(Origin, Float:{HORNET_SEARCH_RADIUS, HORNET_SEARCH_RADIUS, HORNET_SEARCH_RADIUS}, Mins)
xs_vec_add(Origin, Float:{HORNET_SEARCH_RADIUS, HORNET_SEARCH_RADIUS, HORNET_SEARCH_RADIUS}, Maxs)
for(Target = 1; Target < g_MaxEntities; Target++)
{
if(!pev_valid(Target))
continue
Flags = pev(Target, pev_flags)
if(!(Flags & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER)))
continue
if(Flags & FL_MONSTER)
{
if(IsHornet(Target))
continue
}
if(Target == Ent)
continue
pev(Target, pev_absmin, Absmins)
pev(Target, pev_absmax, Absmaxs)
if(Mins[0] > Absmaxs[0] || Mins[1] > Absmaxs[1] || Mins[2] > Absmaxs[2] || Maxs[0] < Absmins[0] || Maxs[1] < Absmins[1] || Maxs[2] < Absmins[2])
continue
if(IsEnemyValid(Ent, Target))
{
if(FInViewCone(Ent, Target) && !(Flags & FL_NOTARGET) && FVisible(Ent, Target))
{
set_pev(Ent, pev_enemy, Target)
return Target
}
}
}
return 0
}
FVisible(Hornet, Other)
{
if(!pev_valid(Hornet) || pev(Other, pev_flags) & FL_NOTARGET)
return 0
static LookerWLevel, TargetWLevel
LookerWLevel = pev(Hornet, pev_waterlevel)
TargetWLevel = pev(Other , pev_waterlevel)
if((LookerWLevel != HEAD_IN_WATER && TargetWLevel == HEAD_IN_WATER ) || (LookerWLevel == HEAD_IN_WATER && TargetWLevel == NOT_IN_WATER))
return 0
static Float:LookerOrigin[3], Float:TargetOrigin[3]
EyePosition(Hornet, LookerOrigin)
EyePosition(Other, TargetOrigin)
engfunc(EngFunc_TraceLine, LookerOrigin, TargetOrigin, IGNORE_MONSTERS, Hornet, 0)
static Float:Fraction
get_tr2(0, TR_flFraction, Fraction)
if(Fraction == 1.0)
return 1
return 0
}
EyePosition(Ent, Float:Origin[3])
{
static Float:ViewOfs[3];
pev(Ent, pev_origin, Origin)
pev(Ent, pev_view_ofs, ViewOfs)
xs_vec_add(Origin, ViewOfs, Origin)
}
VectorMA(Float:vOutput[], Float:Scale, Float:vMult[])
{
vOutput[0] = vOutput[0] + vMult[0] * Scale
vOutput[1] = vOutput[1] + vMult[1] * Scale
vOutput[2] = vOutput[2] + vMult[2] * Scale
}
IsSameTeam(FirstId, SecondId)
{
return (get_pdata_int(FirstId, 114, 5) == get_pdata_int(SecondId, 114, 5))
}
IsHornet(Ent)
{
if(!pev_valid(Ent))
return 0
static Classname[32]; pev(Ent, pev_classname, Classname, charsmax(Classname))
if(!equali(Classname, HORNET_CLASSNAME))
return 0
return 1
}
FInViewCone(Hornet, Other)
{
static Float:Angles[3], Float:Dot
static Float:HOrigin[3], Float:Origin[3]
pev(Hornet, pev_angles, Angles)
engfunc(EngFunc_MakeVectors, Angles)
global_get(glb_v_forward, Angles)
Angles[2] = 0.0
pev(Hornet, pev_origin, HOrigin)
pev(Other, pev_origin, Origin)
xs_vec_sub(Origin, HOrigin, Origin)
Origin[2] = 0.0
xs_vec_normalize(Origin, Origin)
Dot = xs_vec_dot(Origin, Angles)
if(Dot > HORNET_FOV)
return 1
return 0
}
DartTouch(Ent, Other)
{
DieTouch(Ent, Other)
}
TrackTouch(Ent, Other)
{
if(Other == pev(Ent, pev_owner))
{
set_pev(Ent, HG_FIRE_MODE, 0)
set_pev(Ent, pev_solid, SOLID_NOT)
return
}
if(!Other || IsHornet(Other))
{
static Float:Velocity[3]
static Float:Origin[3]
static Float:FlySpeed
pev(Ent, pev_velocity, Velocity)
xs_vec_normalize(Velocity, Velocity)
Velocity[0] *= -1.0
Velocity[1] *= -1.0
pev(Ent, pev_origin, Origin)
VectorMA(Origin, 4.0, Velocity)
if(xs_vec_len(Origin) > 0)
{
set_pev(Ent, pev_origin, Origin)
}
pev(Ent, HG_FLY_SPEED, FlySpeed)
xs_vec_mul_scalar(Velocity, FlySpeed, Velocity)
if(xs_vec_len(Velocity) > 0)
{
set_pev(Ent, pev_velocity, Velocity)
}
return
}
DieTouch(Ent, Other)
}
DieTouch(Ent, Other)
{
static FireMode; FireMode = pev(Ent, HG_FIRE_MODE)
if(FireMode == FIREMODE_TRACK)
{
if(CanTakeDamage(Other, FireMode))
{
switch(random_num(0, 2))
{
case 0: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
case 1: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
case 2: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
ExecuteHamB(Ham_TakeDamage, Other, Ent, pev(Ent, pev_owner), HORNET_DAMAGE, DMG_BULLET | DMG_NEVERGIB)
}
}
else
{
if(CanTakeDamage(Other, FireMode))
{
if(pev(Other, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER))
{
switch(random_num(0, 2))
{
case 0: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
case 1: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
case 2: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
}
ExecuteHamB(Ham_TakeDamage, Other, Ent, pev(Ent, pev_owner), HORNET_DAMAGE, DMG_BULLET | DMG_NEVERGIB)
}
}
set_pev(Ent, pev_modelindex, 0)
set_pev(Ent, pev_solid, SOLID_NOT)
set_pev(Ent, HG_THINK_STEP, STATE_REMOVEHORNET)
set_pev(Ent, pev_nextthink, get_gametime() + 1.0)
}
CanTakeDamage(Other, FireMode)
{
static Float:TakeDamage
pev(Other, pev_takedamage, TakeDamage)
if(FireMode == FIREMODE_TRACK)
{
if(pev(Other, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER) && TakeDamage != DAMAGE_NO)
return 1
}
else
{
if(TakeDamage != DAMAGE_NO)
return 1
}
return 0
}
//**********************************************
//* Safety Functions *
//**********************************************
public Register_SafetyFunc()
{
RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
}
public Register_SafetyFuncBot(iPlayer)
{
RegisterHamFromEntity(Ham_Spawn, iPlayer, "fw_Safety_Spawn_Post", 1)
RegisterHamFromEntity(Ham_Killed, iPlayer, "fw_Safety_Killed_Post", 1)
}
public Safety_Connected(iPlayer)
{
Set_BitVar(g_IsConnected, iPlayer)
UnSet_BitVar(g_IsAlive, iPlayer)
}
public Safety_Disconnected(iPlayer)
{
UnSet_BitVar(g_IsConnected, iPlayer)
UnSet_BitVar(g_IsAlive, iPlayer)
}
public fw_Safety_Spawn_Post(iPlayer)
{
if(!is_user_alive(iPlayer))
return
Set_BitVar(g_IsAlive, iPlayer)
}
public fw_Safety_Killed_Post(iPlayer)
{
UnSet_BitVar(g_IsAlive, iPlayer)
}
public is_connected(iPlayer)
{
if(!(1 <= iPlayer <= 32))
return 0
if(!Get_BitVar(g_IsConnected, iPlayer))
return 0
return 1
}
public is_alive(iPlayer)
{
if(!is_connected(iPlayer))
return 0
if(!Get_BitVar(g_IsAlive, iPlayer))
return 0
return 1
}
//**********************************************
//* Create and check our custom weapon. *
//**********************************************
IsCustomItem(iItem)
{
return (pev(iItem, pev_impulse) == g_iszWeaponKey)
}
Weapon_Create(Float: Origin[3] = {0.0, 0.0, 0.0}, Float: Angles[3] = {0.0, 0.0, 0.0})
{
new iWeapon
static iszAllocStringCached
if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_BASE)))
{
iWeapon = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
}
if(!IsValidPev(iWeapon))
return FM_NULLENT
dllfunc(DLLFunc_Spawn, iWeapon)
set_pev(iWeapon, pev_origin, Origin)
set_pdata_int(iWeapon, 51, HIVEHAND_AMMO, 4)
set_pdata_int(iWeapon, 30, 0, 4)
set_pev(iWeapon, pev_impulse, g_iszWeaponKey)
set_pev(iWeapon, pev_angles, Angles)
engfunc(EngFunc_SetModel, iWeapon, w_model)
return iWeapon
}
Weapon_Give(iPlayer)
{
if(!IsValidPev(iPlayer))
{
return FM_NULLENT
}
new iWeapon, Float: vecOrigin[3]
pev(iPlayer, pev_origin, vecOrigin)
if((iWeapon = Weapon_Create(vecOrigin)) != FM_NULLENT)
{
Player_DropWeapons(iPlayer, ExecuteHamB(Ham_Item_ItemSlot, iWeapon))
set_pev(iWeapon, pev_spawnflags, pev(iWeapon, pev_spawnflags) | SF_NORESPAWN)
dllfunc(DLLFunc_Touch, iWeapon, iPlayer)
return iWeapon
}
return FM_NULLENT
}
Player_DropWeapons(iPlayer, iSlot)
{
new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, 367 + iSlot, 5)
while(IsValidPev(iItem))
{
pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName))
engclient_cmd(iPlayer, "drop", szWeaponName)
iItem = get_pdata_cbase(iItem, 42, 4)
}
}
//**********************************************
//* Set Animations. *
//**********************************************
stock Weapon_SendAnim(iPlayer, iItem, iAnim)
{
static i, iCount, iSpectator, aSpectators[32]
set_pev(iPlayer, pev_weaponanim, iAnim)
message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iPlayer)
write_byte(iAnim)
write_byte(pev(iItem, pev_body))
message_end()
if(IsObserver(iPlayer))
return
get_players(aSpectators, iCount, "bch")
for(i = 0; i < iCount; i++)
{
iSpectator = aSpectators[i]
if(IsObserver(iSpectator) != OBS_IN_EYE || pev(iSpectator, pev_iuser2) != iPlayer)
continue
set_pev(iSpectator, pev_weaponanim, iAnim)
message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iSpectator)
write_byte(iAnim)
write_byte(pev(iItem, pev_body))
message_end()
}
}
stock Player_SetAnimation(iPlayer, szAnim[])
{
#define ACT_RANGE_ATTACK1 28
// Linux extra offsets
#define extra_offset_animating 4
#define extra_offset_player 5
// CBaseAnimating
#define m_flFrameRate 36
#define m_flGroundSpeed 37
#define m_flLastEventCheck 38
#define m_fSequenceFinished 39
#define m_fSequenceLoops 40
// CBaseMonster
#define m_Activity 73
#define m_IdealActivity 74
// CBasePlayer
#define m_flLastAttackTime 220
new iAnimDesired, Float:flFrameRate, Float:flGroundSpeed, bool:bLoops
if((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
{
iAnimDesired = 0
}
static Float:flGametime; flGametime = get_gametime()
set_pev(iPlayer, pev_frame, 0.0)
set_pev(iPlayer, pev_framerate, 1.0)
set_pev(iPlayer, pev_animtime, flGametime)
set_pev(iPlayer, pev_sequence, iAnimDesired)
set_pdata_int(iPlayer, m_fSequenceLoops, bLoops, extra_offset_animating)
set_pdata_int(iPlayer, m_fSequenceFinished, 0, extra_offset_animating)
set_pdata_float(iPlayer, m_flFrameRate, flFrameRate, extra_offset_animating)
set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, extra_offset_animating)
set_pdata_float(iPlayer, m_flLastEventCheck, flGametime , extra_offset_animating)
set_pdata_int(iPlayer, m_Activity, ACT_RANGE_ATTACK1, extra_offset_player)
set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, extra_offset_player)
set_pdata_float(iPlayer, m_flLastAttackTime, flGametime , extra_offset_player)
}
//**********************************************
//* Some useful stocks. *
//**********************************************
stock Get_Position(iPlayer, Float:forw, Float:right, Float:up, Float:vStart[])
{
new Float:Origin[3], Float:Angles[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
pev(iPlayer, pev_origin, Origin)
pev(iPlayer, pev_view_ofs,vUp) //for player
xs_vec_add(Origin, vUp, Origin)
pev(iPlayer, pev_v_angle, Angles) // if normal entity ,use pev_angles
angle_vector(Angles, ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
angle_vector(Angles, ANGLEVECTOR_RIGHT, vRight)
angle_vector(Angles, ANGLEVECTOR_UP, vUp)
vStart[0] = Origin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
vStart[1] = Origin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
vStart[2] = Origin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}
stock get_speed_vector(Float:Origin1[3], Float:Origin2[3], Float:Speed, Float:NewVelocity[3])
{
NewVelocity[0] = Origin2[0] - Origin1[0]
NewVelocity[1] = Origin2[1] - Origin1[1]
NewVelocity[2] = Origin2[2] - Origin1[2]
new Float:num = floatsqroot(Speed*Speed / (NewVelocity[0]*NewVelocity[0] + NewVelocity[1]*NewVelocity[1] + NewVelocity[2]*NewVelocity[2]))
NewVelocity[0] *= num
NewVelocity[1] *= num
NewVelocity[2] *= num
return 1
}
Try:
- /* Made with the information from HLSDK*/
- #include <zombie_escape>
- #include <fakemeta_util>
- #include <engine>
- #include <xs>
- #define PLUGIN "Hornet Gun"
- #define VERSION "1.0"
- #define AUTHOR "Bim Bim Cay"
- // Models
- #define v_model "models/v_hgun.mdl"
- #define p_model "models/p_hgun.mdl"
- #define w_model "models/w_hgun.mdl"
- #define hornet_model "models/hornet.mdl"
- // Sounds
- new const HornetGuns_Sounds[9][] =
- {
- "agrunt/ag_fire1.wav",
- "agrunt/ag_fire2.wav",
- "agrunt/ag_fire3.wav",
- "hornet/ag_hornethit1.wav",
- "hornet/ag_hornethit2.wav",
- "hornet/ag_hornethit3.wav",
- "hornet/ag_buzz1.wav",
- "hornet/ag_buzz2.wav",
- "hornet/ag_buzz3.wav"
- }
- // Sprites
- #define spr_trail "sprites/laserbeam.spr"
- // Animations
- #define ANIM_IDLE1 0
- #define ANIM_FIDGETSWAY 1
- #define ANIM_FIDGETSHAKE 2
- #define ANIM_DOWN 3
- #define ANIM_UP 4
- #define ANIM_SHOOT 5
- #define ANIM_EXTENSION "m249"
- // Entity Classname
- #define HORNET_CLASSNAME "CSHivehand_Hornet"
- // FireMode
- #define FIREMODE_TRACK 1
- #define FIREMODE_FAST 2
- #define FIREMODE_DIE 3
- // State
- #define STATE_STARTTRACK 1
- #define STATE_STARTDART 2
- #define STATE_TRACKTARGET 3
- #define STATE_REMOVEHORNET 4
- // Configs
- #define WEAPON_NAME "weapon_hgun"
- #define WEAPON_BASE "weapon_famas"
- #define HORNET_TYPE_RED 0
- #define HORNET_TYPE_ORANGE 1
- #define NOT_IN_WATER 0
- #define HEAD_IN_WATER 3
- #define HG_FLY_SPEED pev_fuser4
- #define HG_FIRE_MODE pev_iuser2
- #define HG_TYPE_COLOR pev_iuser3
- #define HG_THINK_STEP pev_iuser4
- #define HG_ENEMY_LKP pev_vuser4
- #define HG_STOP_ATTACK pev_ltime
- #define HIVEHAND_REFIRE_PRI 0.25 // Refire rate for primary attack
- #define HIVEHAND_REFIRE_SEC 0.1 // Refire rate for secondary attack
- #define HIVEHAND_AMMO 20 // Max hornets
- #define HIVEGUN_REGEN_TIME 0.3 // Regenerate time
- #define HORNET_RED_SPEED 600.0 // Red hornet speed
- #define HORNET_ORANGE_SPEED 800.0 // Orage hornet speed
- #define HORNET_BUZZ_VOLUME 0.8 // Buzz volume
- #define HORNET_FOV 0.1 // hornet's field of vision | 0.9 = +- 25 degrees ( float ).
- #define HORNET_SEARCH_RADIUS 1024.0 // How far should the hornets searh enemy? ( float ).
- #define HORNET_DAMAGE 200.0 // Damage by hornet.
- // MACROS
- #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
- #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
- #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
- #define INSTANCE(%0) ((%0 == -1) ? 0 : %0)
- #define IsValidPev(%0) (pev_valid(%0) == 2)
- #define IsObserver(%0) pev(%0,pev_iuser1)
- #define MUZZLE_INTOLERANCE 100
- #define OBS_IN_EYE 4
- #define VIP_FLAG "VIP_A"
- new g_iszWeaponKey
- new g_SprTrail
- new g_MaxEntities
- new g_FriendlyFire
- // Safety
- new g_HamBot
- new g_IsConnected, g_IsAlive
- new g_item
- new bool:g_bHaveItem[33]
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- // Safety
- Register_SafetyFunc()
- // Forward
- register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
- register_forward(FM_SetModel, "fw_SetModel")
- // Think
- register_think(HORNET_CLASSNAME, "fw_Hornet_Think")
- // Touch
- register_touch(HORNET_CLASSNAME, "*", "fw_Hornet_Touch")
- // Ham
- RegisterHam(Ham_Spawn, "weaponbox", "fw_Weaponbox_Spawn_Post", 1)
- RegisterHam(Ham_Item_Deploy, WEAPON_BASE, "fw_Item_Deploy_Post", 1)
- RegisterHam(Ham_Item_Holster, WEAPON_BASE, "fw_Item_Holster_Post", 1)
- RegisterHam(Ham_Item_PostFrame, WEAPON_BASE, "fw_Item_PostFrame")
- RegisterHam(Ham_Weapon_Reload, WEAPON_BASE, "fw_Weapon_Reload")
- RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_BASE, "fw_Weapon_WeaponIdle")
- RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_BASE, "fw_Weapon_PrimaryAttack")
- RegisterHam(Ham_Weapon_SecondaryAttack, WEAPON_BASE, "fw_Weapon_SecondaryAttack")
- g_item = ze_register_item("Hornet Gun", 300, 0)
- ze_set_item_vip(g_item, VIP_FLAG)
- }
- public plugin_precache()
- {
- precache_model(v_model)
- precache_model(p_model)
- precache_model(w_model)
- precache_model(hornet_model)
- g_SprTrail = precache_model(spr_trail)
- for(new i = 0; i < sizeof(HornetGuns_Sounds); i++)
- precache_sound(HornetGuns_Sounds[i])
- g_iszWeaponKey = engfunc(EngFunc_AllocString, WEAPON_NAME)
- }
- public plugin_cfg()
- {
- g_MaxEntities = global_get(glb_maxEntities)
- g_FriendlyFire = get_pcvar_num(get_cvar_pointer("mp_friendlyfire"))
- }
- public client_putinserver(iPlayer)
- {
- Safety_Connected(iPlayer)
- if(!g_HamBot && is_user_bot(iPlayer))
- {
- g_HamBot = 1
- set_task(0.1, "Register_HamBot", iPlayer)
- }
- }
- public Register_HamBot(iPlayer)
- {
- Register_SafetyFuncBot(iPlayer)
- }
- public client_disconnected(iPlayer)
- {
- Safety_Disconnected(iPlayer)
- }
- public Get_MyWeapon(iPlayer)
- {
- Weapon_Give(iPlayer)
- }
- public ze_select_item_pre(id, itemid)
- {
- // Return Available and we will block it in Post, So it dosen't affect other plugins
- if (itemid != g_item)
- return ZE_ITEM_AVAILABLE
- // Available for Humans only, So don't show it for zombies
- if (ze_is_user_zombie(id))
- return ZE_ITEM_DONT_SHOW
- if (get_true_number(g_bHaveItem) >= 4)
- return ZE_ITEM_UNAVAILABLE
- return ZE_ITEM_AVAILABLE
- }
- public ze_select_item_post(id, itemid)
- {
- // Here we just block buying the gun if it is not the gun the player is willing to buy so we just add return without values.
- if (itemid != g_item)
- return
- Get_MyWeapon(id)
- }
- //**********************************************
- //* Forward Hooking *
- //**********************************************
- public fw_UpdateClientData_Post(iPlayer, sendweapons, CD_Handle)
- {
- enum
- {
- SPEC_MODE,
- SPEC_TARGET,
- SPEC_END
- }
- static aSpecInfo[33][SPEC_END]
- static iTarget
- static iSpecMode
- static iActiveItem
- iTarget = (iSpecMode = IsObserver(iPlayer)) ? pev(iPlayer, pev_iuser2) : iPlayer
- if(!is_alive(iTarget))
- return FMRES_IGNORED
- iActiveItem = get_pdata_cbase(iTarget, 373, 5)
- if(!IsValidPev(iActiveItem) || !IsCustomItem(iActiveItem))
- return FMRES_IGNORED
- if(iSpecMode)
- {
- if(aSpecInfo[iPlayer][SPEC_MODE] != iSpecMode)
- {
- aSpecInfo[iPlayer][SPEC_MODE] = iSpecMode
- aSpecInfo[iPlayer][SPEC_TARGET] = 0
- }
- if(iSpecMode == OBS_IN_EYE && aSpecInfo[iPlayer][SPEC_TARGET] != iTarget)
- {
- aSpecInfo[iPlayer][SPEC_TARGET] = iTarget
- Weapon_SendAnim(iPlayer, iActiveItem, ANIM_IDLE1)
- }
- }
- set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001)
- return FMRES_HANDLED
- }
- //**********************************************
- //* Weaponbox world model. *
- //**********************************************
- public fw_SetModel(iEntity) <WeaponBox: Enabled>
- {
- state WeaponBox: Disabled
- if(!IsValidPev(iEntity))
- return FMRES_IGNORED
- #define MAX_ITEM_TYPES 6
- for(new i, iItem; i < MAX_ITEM_TYPES; i++)
- {
- iItem = get_pdata_cbase(iEntity, 34 + i, 4)
- if(IsValidPev(iItem) && IsCustomItem(iItem))
- {
- engfunc(EngFunc_SetModel, iEntity, w_model)
- return FMRES_SUPERCEDE
- }
- }
- return FMRES_IGNORED
- }
- public fw_SetModel() </* Empty statement */>
- {
- /* Fallback */
- return FMRES_IGNORED
- }
- public fw_SetModel() <WeaponBox: Disabled>
- {
- /* Do nothing */
- return FMRES_IGNORED
- }
- public fw_Weaponbox_Spawn_Post(iWeaponBox)
- {
- if(IsValidPev(iWeaponBox))
- {
- state (IsValidPev(pev(iWeaponBox, pev_owner))) WeaponBox: Enabled
- }
- return HAM_IGNORED
- }
- //**********************************************
- //* Weapon's codes. *
- //**********************************************
- public fw_Item_Deploy_Post(iItem)
- {
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- if(!IsCustomItem(iItem))
- {
- g_bHaveItem[iPlayer] = false
- return
- }
- g_bHaveItem[iPlayer] = true
- set_pev(iPlayer, pev_viewmodel2, v_model)
- set_pev(iPlayer, pev_weaponmodel2, p_model)
- Weapon_SendAnim(iPlayer, iItem, ANIM_UP)
- set_pdata_string(iPlayer, (492) * 4, ANIM_EXTENSION, -1 , 20)
- }
- public fw_Item_Holster_Post(iItem)
- {
- if(!IsCustomItem(iItem))
- return
- //!!!HACKHACK - can't select hornetgun if it's empty! no way to get ammo for it, either.
- if(get_pdata_int(iItem, 51, 4) <= 0)
- {
- set_pdata_int(iItem, 51, 1, 4)
- }
- }
- public fw_Item_PostFrame(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static Float:flLastEventCheck; flLastEventCheck = get_pdata_float(iItem, 38, 4)
- if(flLastEventCheck < get_gametime())
- {
- flLastEventCheck = get_gametime() + HIVEGUN_REGEN_TIME
- set_pdata_float(iItem, 38, flLastEventCheck, 4)
- static iClip; iClip = get_pdata_int(iItem, 51, 4)
- if(iClip < HIVEHAND_AMMO)
- {
- iClip++
- set_pdata_int(iItem, 51, iClip, 4)
- }
- }
- return HAM_IGNORED
- }
- public fw_Weapon_Reload(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- return HAM_SUPERCEDE
- }
- public fw_Weapon_WeaponIdle(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- if(get_pdata_float(iItem, 48, 4) > 0.0)
- return HAM_SUPERCEDE
- static Float:f_Rand; f_Rand = random_float(0.0, 1.0)
- if(f_Rand <= 0.75)
- {
- set_pdata_float(iItem, 48, 30.0 / 16.0 * 2.0, 4)
- Weapon_SendAnim(iPlayer, iItem, ANIM_IDLE1)
- }
- else if (f_Rand <= 0.875)
- {
- set_pdata_float(iItem, 48, 40.0 / 16.0, 4)
- Weapon_SendAnim(iPlayer, iItem, ANIM_FIDGETSWAY)
- }
- else
- {
- set_pdata_float(iItem, 48, 35.0 / 16.0, 4)
- Weapon_SendAnim(iPlayer, iItem, ANIM_FIDGETSHAKE)
- }
- return HAM_SUPERCEDE
- }
- public fw_Weapon_PrimaryAttack(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- static iClip; iClip = get_pdata_int(iItem, 51, 4)
- if(iClip <= 0)
- return HAM_SUPERCEDE
- set_pdata_float(iItem, 38, get_gametime() + HIVEGUN_REGEN_TIME, 4)
- iClip--
- set_pdata_int(iItem, 51, iClip, 4)
- static Float:Punchangle[3]
- Punchangle[0] = float(random_num(0, 2))
- set_pev(iPlayer, pev_punchangle, Punchangle)
- set_pdata_float(iItem, 46, HIVEHAND_REFIRE_PRI, 4)
- set_pdata_float(iItem, 47, HIVEHAND_REFIRE_PRI, 4)
- set_pdata_float(iItem, 48, random_float(10.0, 15.0), 4)
- static iFlags, szAnimation[64]
- if(iFlags & FL_DUCKING)
- {
- formatex(szAnimation, charsmax(szAnimation), "crouch_shoot_%s", ANIM_EXTENSION)
- }
- else
- {
- formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION)
- }
- Weapon_SendAnim(iPlayer, iItem, ANIM_SHOOT)
- switch(random_num(0, 2))
- {
- case 0: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- case 1: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- case 2: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- }
- static Float:Origin[3]
- Get_Position(iPlayer, 16.0, !get_cvar_num("cl_righthand") ? -8.0 : 8.0, -12.0, Origin)
- static HornetEnt; HornetEnt = Hornet_Create(iPlayer, Origin)
- if(HornetEnt > 0)
- {
- static Float:vAngle[3], Float:vForward[3], Float:Velocity[3]
- pev(iPlayer, pev_v_angle, vAngle)
- angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward)
- xs_vec_mul_scalar(vForward, 300.0, Velocity)
- set_pev(HornetEnt, pev_velocity, Velocity)
- Hornet_Spawn(HornetEnt, FIREMODE_TRACK)
- }
- return HAM_SUPERCEDE
- }
- public fw_Weapon_SecondaryAttack(iItem)
- {
- if(!IsCustomItem(iItem))
- return HAM_IGNORED
- static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
- static iClip; iClip = get_pdata_int(iItem, 51, 4)
- if(iClip <= 0)
- return HAM_SUPERCEDE
- set_pdata_float(iItem, 38, get_gametime() + HIVEGUN_REGEN_TIME, 4)
- iClip--
- set_pdata_int(iItem, 51, iClip, 4)
- static Float:Punchangle[3]
- Punchangle[0] = float(random_num(0, 2))
- set_pev(iPlayer, pev_punchangle, Punchangle)
- set_pdata_float(iItem, 46, HIVEHAND_REFIRE_SEC, 4)
- set_pdata_float(iItem, 47, HIVEHAND_REFIRE_SEC, 4)
- set_pdata_float(iItem, 48, random_float(10.0, 15.0), 4)
- static iFlags, szAnimation[64]
- if(iFlags & FL_DUCKING)
- {
- formatex(szAnimation, charsmax(szAnimation), "crouch_shoot_%s", ANIM_EXTENSION)
- }
- else
- {
- formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION)
- }
- Weapon_SendAnim(iPlayer, iItem, ANIM_SHOOT)
- switch(random_num(0, 2))
- {
- case 0: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- case 1: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- case 2: emit_sound(iPlayer, CHAN_WEAPON, HornetGuns_Sounds[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- }
- static Float:Right, Float:Up
- static FirePhase; FirePhase = get_pdata_int(iItem, 30, 4)
- FirePhase++
- set_pdata_int(iItem, 30, FirePhase, 4)
- switch(FirePhase)
- {
- case 1:
- {
- Up = 8.0
- Right = 0.0
- }
- case 2:
- {
- Up = 8.0
- Right = 8.0
- }
- case 3:
- {
- Up = 0.0
- Right = 8.0
- }
- case 4:
- {
- Up = -8.0
- Right = 8.0
- }
- case 5:
- {
- Up = -8.0
- Right = 0.0
- }
- case 6:
- {
- Up = -8.0
- Right = -8.0
- }
- case 7:
- {
- Up = 0.0
- Right = -8.0
- }
- case 8:
- {
- Up = 8.0
- Right = -8.0
- set_pdata_int(iItem, 30, FirePhase, 4)
- }
- }
- static Float:Origin[3]
- Get_Position(iPlayer, 16.0, (!get_cvar_num("cl_righthand") ? -8.0 : 8.0) + Right, -12.0 + Up, Origin)
- static HornetEnt; HornetEnt = Hornet_Create(iPlayer, Origin)
- if(HornetEnt > 0)
- {
- static Float:vAngle[3], Float:vForward[3], Float:Velocity[3]
- pev(iPlayer, pev_v_angle, vAngle)
- angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward)
- xs_vec_mul_scalar(vForward, 1200.0, Velocity)
- set_pev(HornetEnt, pev_velocity, Velocity)
- Hornet_Spawn(HornetEnt, FIREMODE_FAST)
- }
- return HAM_SUPERCEDE
- }
- Hornet_Create(iPlayer, Float:Origin[3])
- {
- static Float:Angles[3]
- pev(iPlayer, pev_v_angle, Angles)
- static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
- if(!pev_valid(Ent))
- return FM_NULLENT
- set_pev(Ent, pev_classname, HORNET_CLASSNAME)
- set_pev(Ent, pev_owner, iPlayer)
- set_pev(Ent, pev_origin, Origin)
- set_pev(Ent, pev_angles, Angles)
- return Ent
- }
- Hornet_Spawn(HornetEnt, FireMode)
- {
- set_pev(HornetEnt, pev_movetype, MOVETYPE_FLY)
- set_pev(HornetEnt, pev_solid, SOLID_BBOX)
- set_pev(HornetEnt, pev_flags, pev(HornetEnt, pev_flags ) | FL_MONSTER)
- set_pev(HornetEnt, pev_health, 1.0)
- if(random_num (1, 5) <= 2)
- {
- set_pev(HornetEnt, HG_TYPE_COLOR, HORNET_TYPE_RED)
- set_pev(HornetEnt, HG_FLY_SPEED, HORNET_RED_SPEED)
- }
- else
- {
- set_pev(HornetEnt, HG_TYPE_COLOR, HORNET_TYPE_ORANGE)
- set_pev(HornetEnt, HG_FLY_SPEED, HORNET_ORANGE_SPEED)
- }
- if(FireMode == FIREMODE_TRACK)
- {
- set_pev(HornetEnt, HG_STOP_ATTACK, get_gametime() + 3.5)
- }
- engfunc(EngFunc_SetModel, HornetEnt, hornet_model)
- engfunc(EngFunc_SetSize, HornetEnt, Float:{-4.0, -4.0, -4.0}, Float:{4.0, 4.0, 4.0})
- set_pev(HornetEnt, HG_FIRE_MODE, FIREMODE_DIE)
- set_pev(HornetEnt, HG_THINK_STEP, FireMode == FIREMODE_TRACK ? STATE_STARTTRACK : STATE_STARTDART)
- set_pev(HornetEnt, pev_nextthink, get_gametime() + 0.1)
- }
- public fw_Hornet_Think(Ent)
- {
- if(!pev_valid(Ent))
- return
- switch(pev(Ent, HG_THINK_STEP))
- {
- case STATE_STARTTRACK:
- {
- IgniteTrail(Ent)
- set_pev(Ent, HG_FIRE_MODE, FIREMODE_TRACK)
- set_pev(Ent, HG_THINK_STEP, STATE_TRACKTARGET)
- }
- case STATE_STARTDART:
- {
- IgniteTrail(Ent)
- set_pev(Ent, HG_FIRE_MODE, FIREMODE_FAST)
- set_pev(Ent, HG_THINK_STEP, STATE_REMOVEHORNET)
- set_pev(Ent, pev_nextthink, get_gametime() + 4.0)
- return
- }
- case STATE_TRACKTARGET:
- {
- TrackingTarget(Ent)
- }
- case STATE_REMOVEHORNET:
- {
- RemovingHornet(Ent)
- }
- }
- set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
- }
- public fw_Hornet_Touch(Ent, Touch)
- {
- if(!pev_valid(Ent))
- return
- switch(pev(Ent, HG_FIRE_MODE))
- {
- case FIREMODE_TRACK: TrackTouch(Ent, Touch)
- case FIREMODE_FAST: DartTouch(Ent, Touch)
- case FIREMODE_DIE: DieTouch(Ent, Touch)
- }
- }
- RemovingHornet(Ent)
- {
- set_pev(Ent, pev_flags, FL_KILLME)
- }
- IgniteTrail(Ent)
- {
- message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
- write_byte(TE_BEAMFOLLOW)
- write_short(Ent)
- write_short(g_SprTrail )
- write_byte(10)
- write_byte(2)
- switch(pev(Ent, HG_TYPE_COLOR))
- {
- case HORNET_TYPE_RED:
- {
- write_byte(179)
- write_byte(39)
- write_byte(14)
- }
- case HORNET_TYPE_ORANGE:
- {
- write_byte(255)
- write_byte(128)
- write_byte(0)
- }
- }
- write_byte(128)
- message_end()
- }
- TrackingTarget(Ent)
- {
- if(IsHornetShouldDie(Ent))
- {
- set_pev(Ent, HG_FIRE_MODE, 0)
- set_pev(Ent, HG_THINK_STEP, STATE_REMOVEHORNET)
- set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
- }
- static Float:FlightDir[3], Float:DirToEnnemy[3]
- static Float:EnemyLKP[3], Float:Velocity[3]
- static Float:Origin[3], Float:Angles[3]
- static Float:Delta, Float:FlySpeed, Enemy
- pev(Ent, pev_velocity, Velocity)
- pev(Ent, pev_origin, Origin)
- Enemy = pev(Ent, pev_enemy)
- if(!IsEnemyValid(Ent, Enemy))
- {
- set_pev(Ent, pev_enemy, 0)
- Enemy = 0
- }
- if(!Enemy)
- {
- Enemy = BestVisibleEnemy(Ent, Origin)
- }
- if(Enemy != 0 && FVisible(Ent,Enemy))
- {
- pev(Enemy, pev_origin, EnemyLKP)
- set_pev(Ent, HG_ENEMY_LKP, EnemyLKP)
- }
- else
- {
- pev(Ent, HG_FLY_SPEED, FlySpeed)
- pev(Ent, HG_ENEMY_LKP, EnemyLKP)
- VectorMA(EnemyLKP, FlySpeed * 0.1, Velocity)
- set_pev(Ent, HG_ENEMY_LKP, EnemyLKP)
- }
- pev(Ent, pev_origin, Origin)
- xs_vec_sub(EnemyLKP, Origin, Origin)
- xs_vec_normalize(Origin, DirToEnnemy)
- xs_vec_len(Velocity) < 0.1 ? xs_vec_copy(DirToEnnemy, FlightDir) : xs_vec_normalize(Velocity, FlightDir)
- Delta = xs_vec_dot(FlightDir, DirToEnnemy)
- if(Delta < 0.5)
- {
- switch(random_num(0, 2))
- {
- case 0: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[6], HORNET_BUZZ_VOLUME, ATTN_NORM, 0, PITCH_NORM)
- case 1: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[7], HORNET_BUZZ_VOLUME, ATTN_NORM, 0, PITCH_NORM)
- case 2: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[8], HORNET_BUZZ_VOLUME, ATTN_NORM, 0, PITCH_NORM)
- }
- }
- if(Delta <= 0 && pev(Ent, HG_TYPE_COLOR) == HORNET_TYPE_RED)
- {
- Delta = 0.25
- }
- xs_vec_add(FlightDir, DirToEnnemy, DirToEnnemy)
- xs_vec_normalize(DirToEnnemy, Velocity)
- switch(pev(Ent, HG_TYPE_COLOR))
- {
- case HORNET_TYPE_RED:
- {
- pev(Ent, HG_FLY_SPEED, FlySpeed)
- xs_vec_mul_scalar(Velocity, FlySpeed * Delta, Velocity)
- set_pev(Ent, pev_velocity, Velocity)
- set_pev(Ent, pev_nextthink, get_gametime() + random_float(0.1, 0.3))
- }
- case HORNET_TYPE_ORANGE:
- {
- pev(Ent, HG_FLY_SPEED, FlySpeed)
- xs_vec_mul_scalar(Velocity, FlySpeed, Velocity)
- set_pev(Ent, pev_velocity, Velocity)
- set_pev(Ent, pev_nextthink, get_gametime() + 0.1)
- }
- }
- engfunc(EngFunc_VecToAngles, Velocity, Angles)
- set_pev(Ent, pev_angles, Angles)
- set_pev(Ent, pev_solid, SOLID_BBOX)
- }
- IsHornetShouldDie(Ent)
- {
- static Float:LifeTime; pev(Ent, HG_STOP_ATTACK, LifeTime)
- if(get_gametime() > LifeTime)
- return 1
- return 0
- }
- IsEnemyValid(Ent, Enemy)
- {
- if(!pev_valid(Enemy))
- return 0
- static Flags; Flags = pev(Enemy, pev_flags)
- if(Flags & (FL_CLIENT | FL_FAKECLIENT))
- {
- if(!is_alive(Enemy) || pev(Enemy, pev_deadflag) > DEAD_NO)
- {
- return 0
- }
- else if(!g_FriendlyFire && IsSameTeam(Enemy, pev(Ent, pev_owner)))
- {
- return 0
- }
- }
- else if(Flags & FL_MONSTER)
- {
- static Float:Health; pev(Enemy, pev_health, Health)
- if(Health <= 0)
- return 0
- }
- return 1
- }
- BestVisibleEnemy(Ent, Float:Origin[3])
- {
- static Target, Flags
- static Float:Mins[3], Float:Maxs[3]
- static Float:Absmins[3], Float:Absmaxs[3]
- xs_vec_sub(Origin, Float:{HORNET_SEARCH_RADIUS, HORNET_SEARCH_RADIUS, HORNET_SEARCH_RADIUS}, Mins)
- xs_vec_add(Origin, Float:{HORNET_SEARCH_RADIUS, HORNET_SEARCH_RADIUS, HORNET_SEARCH_RADIUS}, Maxs)
- for(Target = 1; Target < g_MaxEntities; Target++)
- {
- if(!pev_valid(Target))
- continue
- Flags = pev(Target, pev_flags)
- if(!(Flags & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER)))
- continue
- if(Flags & FL_MONSTER)
- {
- if(IsHornet(Target))
- continue
- }
- if(Target == Ent)
- continue
- pev(Target, pev_absmin, Absmins)
- pev(Target, pev_absmax, Absmaxs)
- if(Mins[0] > Absmaxs[0] || Mins[1] > Absmaxs[1] || Mins[2] > Absmaxs[2] || Maxs[0] < Absmins[0] || Maxs[1] < Absmins[1] || Maxs[2] < Absmins[2])
- continue
- if(IsEnemyValid(Ent, Target))
- {
- if(FInViewCone(Ent, Target) && !(Flags & FL_NOTARGET) && FVisible(Ent, Target))
- {
- set_pev(Ent, pev_enemy, Target)
- return Target
- }
- }
- }
- return 0
- }
- FVisible(Hornet, Other)
- {
- if(!pev_valid(Hornet) || pev(Other, pev_flags) & FL_NOTARGET)
- return 0
- static LookerWLevel, TargetWLevel
- LookerWLevel = pev(Hornet, pev_waterlevel)
- TargetWLevel = pev(Other , pev_waterlevel)
- if((LookerWLevel != HEAD_IN_WATER && TargetWLevel == HEAD_IN_WATER ) || (LookerWLevel == HEAD_IN_WATER && TargetWLevel == NOT_IN_WATER))
- return 0
- static Float:LookerOrigin[3], Float:TargetOrigin[3]
- EyePosition(Hornet, LookerOrigin)
- EyePosition(Other, TargetOrigin)
- engfunc(EngFunc_TraceLine, LookerOrigin, TargetOrigin, IGNORE_MONSTERS, Hornet, 0)
- static Float:Fraction
- get_tr2(0, TR_flFraction, Fraction)
- if(Fraction == 1.0)
- return 1
- return 0
- }
- EyePosition(Ent, Float:Origin[3])
- {
- static Float:ViewOfs[3];
- pev(Ent, pev_origin, Origin)
- pev(Ent, pev_view_ofs, ViewOfs)
- xs_vec_add(Origin, ViewOfs, Origin)
- }
- VectorMA(Float:vOutput[], Float:Scale, Float:vMult[])
- {
- vOutput[0] = vOutput[0] + vMult[0] * Scale
- vOutput[1] = vOutput[1] + vMult[1] * Scale
- vOutput[2] = vOutput[2] + vMult[2] * Scale
- }
- IsSameTeam(FirstId, SecondId)
- {
- return (get_pdata_int(FirstId, 114, 5) == get_pdata_int(SecondId, 114, 5))
- }
- IsHornet(Ent)
- {
- if(!pev_valid(Ent))
- return 0
- static Classname[32]; pev(Ent, pev_classname, Classname, charsmax(Classname))
- if(!equali(Classname, HORNET_CLASSNAME))
- return 0
- return 1
- }
- FInViewCone(Hornet, Other)
- {
- static Float:Angles[3], Float:Dot
- static Float:HOrigin[3], Float:Origin[3]
- pev(Hornet, pev_angles, Angles)
- engfunc(EngFunc_MakeVectors, Angles)
- global_get(glb_v_forward, Angles)
- Angles[2] = 0.0
- pev(Hornet, pev_origin, HOrigin)
- pev(Other, pev_origin, Origin)
- xs_vec_sub(Origin, HOrigin, Origin)
- Origin[2] = 0.0
- xs_vec_normalize(Origin, Origin)
- Dot = xs_vec_dot(Origin, Angles)
- if(Dot > HORNET_FOV)
- return 1
- return 0
- }
- DartTouch(Ent, Other)
- {
- DieTouch(Ent, Other)
- }
- TrackTouch(Ent, Other)
- {
- if(Other == pev(Ent, pev_owner))
- {
- set_pev(Ent, HG_FIRE_MODE, 0)
- set_pev(Ent, pev_solid, SOLID_NOT)
- return
- }
- if(!Other || IsHornet(Other))
- {
- static Float:Velocity[3]
- static Float:Origin[3]
- static Float:FlySpeed
- pev(Ent, pev_velocity, Velocity)
- xs_vec_normalize(Velocity, Velocity)
- Velocity[0] *= -1.0
- Velocity[1] *= -1.0
- pev(Ent, pev_origin, Origin)
- VectorMA(Origin, 4.0, Velocity)
- if(xs_vec_len(Origin) > 0)
- {
- set_pev(Ent, pev_origin, Origin)
- }
- pev(Ent, HG_FLY_SPEED, FlySpeed)
- xs_vec_mul_scalar(Velocity, FlySpeed, Velocity)
- if(xs_vec_len(Velocity) > 0)
- {
- set_pev(Ent, pev_velocity, Velocity)
- }
- return
- }
- DieTouch(Ent, Other)
- }
- DieTouch(Ent, Other)
- {
- static FireMode; FireMode = pev(Ent, HG_FIRE_MODE)
- if(FireMode == FIREMODE_TRACK)
- {
- if(CanTakeDamage(Other, FireMode))
- {
- switch(random_num(0, 2))
- {
- case 0: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- case 1: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- case 2: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- }
- ExecuteHamB(Ham_TakeDamage, Other, Ent, pev(Ent, pev_owner), HORNET_DAMAGE, DMG_BULLET | DMG_NEVERGIB)
- }
- }
- else
- {
- if(CanTakeDamage(Other, FireMode))
- {
- if(pev(Other, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER))
- {
- switch(random_num(0, 2))
- {
- case 0: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- case 1: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- case 2: emit_sound(Ent, CHAN_VOICE, HornetGuns_Sounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
- }
- }
- ExecuteHamB(Ham_TakeDamage, Other, Ent, pev(Ent, pev_owner), HORNET_DAMAGE, DMG_BULLET | DMG_NEVERGIB)
- }
- }
- set_pev(Ent, pev_modelindex, 0)
- set_pev(Ent, pev_solid, SOLID_NOT)
- set_pev(Ent, HG_THINK_STEP, STATE_REMOVEHORNET)
- set_pev(Ent, pev_nextthink, get_gametime() + 1.0)
- }
- CanTakeDamage(Other, FireMode)
- {
- static Float:TakeDamage
- pev(Other, pev_takedamage, TakeDamage)
- if(FireMode == FIREMODE_TRACK)
- {
- if(pev(Other, pev_flags) & (FL_CLIENT | FL_FAKECLIENT | FL_MONSTER) && TakeDamage != DAMAGE_NO)
- return 1
- }
- else
- {
- if(TakeDamage != DAMAGE_NO)
- return 1
- }
- return 0
- }
- //**********************************************
- //* Safety Functions *
- //**********************************************
- public Register_SafetyFunc()
- {
- RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
- RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
- }
- public Register_SafetyFuncBot(iPlayer)
- {
- RegisterHamFromEntity(Ham_Spawn, iPlayer, "fw_Safety_Spawn_Post", 1)
- RegisterHamFromEntity(Ham_Killed, iPlayer, "fw_Safety_Killed_Post", 1)
- }
- public Safety_Connected(iPlayer)
- {
- Set_BitVar(g_IsConnected, iPlayer)
- UnSet_BitVar(g_IsAlive, iPlayer)
- }
- public Safety_Disconnected(iPlayer)
- {
- UnSet_BitVar(g_IsConnected, iPlayer)
- UnSet_BitVar(g_IsAlive, iPlayer)
- }
- public fw_Safety_Spawn_Post(iPlayer)
- {
- if(!is_user_alive(iPlayer))
- return
- Set_BitVar(g_IsAlive, iPlayer)
- }
- public fw_Safety_Killed_Post(iPlayer)
- {
- UnSet_BitVar(g_IsAlive, iPlayer)
- }
- public is_connected(iPlayer)
- {
- if(!(1 <= iPlayer <= 32))
- return 0
- if(!Get_BitVar(g_IsConnected, iPlayer))
- return 0
- return 1
- }
- public is_alive(iPlayer)
- {
- if(!is_connected(iPlayer))
- return 0
- if(!Get_BitVar(g_IsAlive, iPlayer))
- return 0
- return 1
- }
- //**********************************************
- //* Create and check our custom weapon. *
- //**********************************************
- IsCustomItem(iItem)
- {
- return (pev(iItem, pev_impulse) == g_iszWeaponKey)
- }
- Weapon_Create(Float: Origin[3] = {0.0, 0.0, 0.0}, Float: Angles[3] = {0.0, 0.0, 0.0})
- {
- new iWeapon
- static iszAllocStringCached
- if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_BASE)))
- {
- iWeapon = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
- }
- if(!IsValidPev(iWeapon))
- return FM_NULLENT
- dllfunc(DLLFunc_Spawn, iWeapon)
- set_pev(iWeapon, pev_origin, Origin)
- set_pdata_int(iWeapon, 51, HIVEHAND_AMMO, 4)
- set_pdata_int(iWeapon, 30, 0, 4)
- set_pev(iWeapon, pev_impulse, g_iszWeaponKey)
- set_pev(iWeapon, pev_angles, Angles)
- engfunc(EngFunc_SetModel, iWeapon, w_model)
- return iWeapon
- }
- Weapon_Give(iPlayer)
- {
- if(!IsValidPev(iPlayer))
- {
- return FM_NULLENT
- }
- new iWeapon, Float: vecOrigin[3]
- pev(iPlayer, pev_origin, vecOrigin)
- if((iWeapon = Weapon_Create(vecOrigin)) != FM_NULLENT)
- {
- Player_DropWeapons(iPlayer, ExecuteHamB(Ham_Item_ItemSlot, iWeapon))
- g_bHaveItem[iPlayer] = true
- set_pev(iWeapon, pev_spawnflags, pev(iWeapon, pev_spawnflags) | SF_NORESPAWN)
- dllfunc(DLLFunc_Touch, iWeapon, iPlayer)
- return iWeapon
- }
- return FM_NULLENT
- }
- Player_DropWeapons(iPlayer, iSlot)
- {
- new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, 367 + iSlot, 5)
- while(IsValidPev(iItem))
- {
- pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName))
- engclient_cmd(iPlayer, "drop", szWeaponName)
- iItem = get_pdata_cbase(iItem, 42, 4)
- }
- }
- //**********************************************
- //* Set Animations. *
- //**********************************************
- stock Weapon_SendAnim(iPlayer, iItem, iAnim)
- {
- static i, iCount, iSpectator, aSpectators[32]
- set_pev(iPlayer, pev_weaponanim, iAnim)
- message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iPlayer)
- write_byte(iAnim)
- write_byte(pev(iItem, pev_body))
- message_end()
- if(IsObserver(iPlayer))
- return
- get_players(aSpectators, iCount, "bch")
- for(i = 0; i < iCount; i++)
- {
- iSpectator = aSpectators[i]
- if(IsObserver(iSpectator) != OBS_IN_EYE || pev(iSpectator, pev_iuser2) != iPlayer)
- continue
- set_pev(iSpectator, pev_weaponanim, iAnim)
- message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iSpectator)
- write_byte(iAnim)
- write_byte(pev(iItem, pev_body))
- message_end()
- }
- }
- stock Player_SetAnimation(iPlayer, szAnim[])
- {
- #define ACT_RANGE_ATTACK1 28
- // Linux extra offsets
- #define extra_offset_animating 4
- #define extra_offset_player 5
- // CBaseAnimating
- #define m_flFrameRate 36
- #define m_flGroundSpeed 37
- #define m_flLastEventCheck 38
- #define m_fSequenceFinished 39
- #define m_fSequenceLoops 40
- // CBaseMonster
- #define m_Activity 73
- #define m_IdealActivity 74
- // CBasePlayer
- #define m_flLastAttackTime 220
- new iAnimDesired, Float:flFrameRate, Float:flGroundSpeed, bool:bLoops
- if((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
- {
- iAnimDesired = 0
- }
- static Float:flGametime; flGametime = get_gametime()
- set_pev(iPlayer, pev_frame, 0.0)
- set_pev(iPlayer, pev_framerate, 1.0)
- set_pev(iPlayer, pev_animtime, flGametime)
- set_pev(iPlayer, pev_sequence, iAnimDesired)
- set_pdata_int(iPlayer, m_fSequenceLoops, bLoops, extra_offset_animating)
- set_pdata_int(iPlayer, m_fSequenceFinished, 0, extra_offset_animating)
- set_pdata_float(iPlayer, m_flFrameRate, flFrameRate, extra_offset_animating)
- set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, extra_offset_animating)
- set_pdata_float(iPlayer, m_flLastEventCheck, flGametime , extra_offset_animating)
- set_pdata_int(iPlayer, m_Activity, ACT_RANGE_ATTACK1, extra_offset_player)
- set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, extra_offset_player)
- set_pdata_float(iPlayer, m_flLastAttackTime, flGametime , extra_offset_player)
- }
- //**********************************************
- //* Some useful stocks. *
- //**********************************************
- stock Get_Position(iPlayer, Float:forw, Float:right, Float:up, Float:vStart[])
- {
- new Float:Origin[3], Float:Angles[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
- pev(iPlayer, pev_origin, Origin)
- pev(iPlayer, pev_view_ofs,vUp) //for player
- xs_vec_add(Origin, vUp, Origin)
- pev(iPlayer, pev_v_angle, Angles) // if normal entity ,use pev_angles
- angle_vector(Angles, ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
- angle_vector(Angles, ANGLEVECTOR_RIGHT, vRight)
- angle_vector(Angles, ANGLEVECTOR_UP, vUp)
- vStart[0] = Origin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
- vStart[1] = Origin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
- vStart[2] = Origin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
- }
- stock get_speed_vector(Float:Origin1[3], Float:Origin2[3], Float:Speed, Float:NewVelocity[3])
- {
- NewVelocity[0] = Origin2[0] - Origin1[0]
- NewVelocity[1] = Origin2[1] - Origin1[1]
- NewVelocity[2] = Origin2[2] - Origin1[2]
- new Float:num = floatsqroot(Speed*Speed / (NewVelocity[0]*NewVelocity[0] + NewVelocity[1]*NewVelocity[1] + NewVelocity[2]*NewVelocity[2]))
- NewVelocity[0] *= num
- NewVelocity[1] *= num
- NewVelocity[2] *= num
- return 1
- }
- stock get_true_number(bool:g_bArray[])
- {
- new iTrueCount
- for(new i = 0; i <= charsmax(g_bArray[]); i++)
- {
- if (g_bArray[i])
- iTrueCount++
- }
- return iTrueCount
- }
He who fails to plan is planning to fail
Create an account or sign in to join the discussion
You need to be a member in order to post a reply
Create an account
Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute
Sign in
Who is online
Users browsing this forum: No registered users and 7 guests