include
#include
#include
#include
#include
#include
#include
// Plugin info
new const PLUGIN[] = "Bow"
new const VERSION[] = "1.1"
new const AUTHOR[] = "Atrocraz" // Thanks to SISA for his M79
// Weapon/Arrow models
new const P_MODEL[] = "models/p_Shina_by_Oxigen.mdl"
new const V_MODEL[] = "models/v_Shina_by_Oxigen.mdl"
new const W_MODEL[] = "models/w_Shina_by_Oxigen.mdl"
new const ARROW_MODEL[] = "models/arrow.mdl"
#define BURN_CLASSNAME "flame"
#define BURN_MODEL "sprites/flame_burn01.spr"
#define POISON_MODEL "sprites/poison.spr"
// Settings
#define BASE_SPEED 1200
#define BONUS_SPEED 600
#define BURN_LIFE 10.0
#define BURN_PERIOD 2.0
#define BURN_DAMAGE 10.0
#define POISON_TIME 5.0
#define POISON_PERIOD 1.0
#define POISON_DAMAGE 5.0
#define SPEED_LOW_POISON 0.8
#define SLOW_POISON_TIME 3.0
#define NORMAL_DMG 45.0
#define SPEED_LOW_ICE 0.5
#define SLOW_ICE_TIME 7.0
#define EXPLODE_DAMAGE 90.0
#define EXPLODE_HITRADIUS 400
// Base number of arrows
#define NORMAL_AMMO 20
#define FIRE_AMMO 15
#define ICE_AMMO 10
#define POISON_AMMO 7
#define EXPLODE_AMMO 3
//Number of extra arrows
#define NORMAL_AMMO_BUY 5
#define FIRE_AMMO_BUY 4
#define ICE_AMMO_BUY 3
#define POISON_AMMO_BUY 2
#define EXPLODE_AMMO_BUY 1
// Cost of extra arrows
#define AMMO_COST 1000
#define NEXT_SHOT_TIME 0.97
// Fire sound
new const ARROW_SHOOT[] = "crossbow_shoot1.wav"
new g_exp_sprid
new Float:g_start_time[33], Float:g_finish_time[33]
new Float:g_Burn[33], Float:g_Poisoned[33]
new g_slowed[33], g_pressed[33], Float:g_old_speed[33]
// Ammo
new g_ammo[33], g_normal_ammo[33], g_fire_ammo[33], g_ice_ammo[33], g_poison_ammo[33], g_explode_ammo[33]
// Player variables
new g_HasBow[33] // whether player has bow
new bool:draw_wpn[33]
new g_bow_mode[33], g_dmg_mode[33]
new g_MaxPlayers
// Render effects debug
new g_FrozenRenderingFx[33]
new Float:g_FrozenRenderingColor[33][3]
new g_FrozenRenderingRender[33]
new Float:g_FrozenRenderingAmount[33]
// Message ID's
new g_MsgDamage, g_msgBarTime
enum {
anim_idle,
anim_shot1,
anim_shot2,
anim_reload,
anim_draw
}
enum
{
NORMAL_MODE = 1,
FIRE_MODE = 2,
ICE_MODE = 3,
POISON_MODE = 4,
EXPLODE_MODE = 5
}
enum
{
dmg_fire = 1,
dmg_poison = 2
}
// Plugin precache
public plugin_precache()
{
// Models
precache_model(P_MODEL)
precache_model(V_MODEL)
precache_model(W_MODEL)
precache_model(ARROW_MODEL)
precache_model(BURN_MODEL)
precache_model(POISON_MODEL)
// Sounds
precache_sound(ARROW_SHOOT)
//precache_sound(GRENADE_DRAW)
precache_sound("weapons/357_cock1.wav")
g_exp_sprid = engfunc(EngFunc_PrecacheModel, "sprites/zerogxplode.spr")
}
// Plugin init
public plugin_init()
{
// Register plugin
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar("zp_m79_version", VERSION, FCVAR_SERVER)
// Events
register_event("CurWeapon", "Event_CurrentWeapon", "be", "1=1")
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
// Forwards
RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_scout", "fw_bow_PrimaryAttack")
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_scout", "fw_bow_SecondaryAttack")
RegisterHam(Ham_Weapon_Reload, "weapon_scout", "fw_bow_Reload")
RegisterHam(Ham_Item_Deploy, "weapon_scout", "fw_bow_Deploy_Post", 1)
register_think(BURN_CLASSNAME, "BurnThink")
register_forward(FM_CmdStart, "fw_CmdStart")
register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
register_forward(FM_Touch, "fw_touch")
register_clcmd("drop","dropcmd")
// Messages
g_MsgDamage = get_user_msgid("Damage")
g_msgBarTime = get_user_msgid("BarTime")
register_clcmd("say /test", "give_bow")
register_clcmd("say /money", "money")
register_clcmd("say /health", "health")
register_clcmd("buyammo1", "buy_ammo")
g_MaxPlayers = get_maxplayers()
}
public money(id)
{
cs_set_user_money(id, 16000)
}
public health(id)
{
set_user_health(id, 255)
}
public Event_NewRound()
{
for (new i = 0; i < get_maxplayers(); i++)
{
set_user_rendering(i, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 25)
g_Poisoned[i]=0.0
g_Burn[i]=0.0
g_slowed[i] = false
}
}
public dropcmd(id) {
if(g_HasBow[id] && get_user_weapon(id) == CSW_SCOUT) {
new Float:Aim[3],Float:origin[3]
VelocityByAim(id, 64, Aim)
entity_get_vector(id,EV_VEC_origin,origin)
origin[0] += Aim[0]
origin[1] += Aim[1]
new bow = create_entity("info_target")
entity_set_string(bow,EV_SZ_classname,"bow")
entity_set_model(bow,W_MODEL)
entity_set_size(bow,Float:{-2.0,-2.0,-2.0},Float:{5.0,5.0,5.0})
entity_set_int(bow,EV_INT_solid,1)
entity_set_int(bow,EV_INT_movetype,6)
entity_set_vector(bow,EV_VEC_origin,origin)
g_HasBow[id] = false
remowegun(id)
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
// remove gun and save all guns
public remowegun(id) {
new wpnList[32]
new number
get_user_weapons(id,wpnList,number)
for (new i = 0;i < number ;i++) {
if (wpnList[i] == CSW_SCOUT) {
fm_strip_user_gun(id, wpnList[i])
}
}
}
public buy_ammo(id)
{
if(!g_HasBow[id])
return PLUGIN_CONTINUE
if(cs_get_user_buyzone(id))
{
give_ammo(id)
return PLUGIN_HANDLED
}
if(cs_get_user_money(id) <= AMMO_COST)
{
client_print(id, print_chat, "НедоŃтаточно денег")
return PLUGIN_CONTINUE
}
give_ammo(id)
return PLUGIN_HANDLED
}
public give_ammo(id)
{
if(g_normal_ammo[id] == NORMAL_AMMO && g_fire_ammo[id] == FIRE_AMMO && g_ice_ammo[id] == ICE_AMMO && g_poison_ammo[id] == POISON_AMMO && g_explode_ammo[id] == EXPLODE_AMMO)
return PLUGIN_CONTINUE
cs_set_user_money(id, cs_get_user_money(id) - AMMO_COST)
g_normal_ammo[id] += NORMAL_AMMO_BUY
g_fire_ammo[id] += FIRE_AMMO_BUY
g_ice_ammo[id] += ICE_AMMO_BUY
g_poison_ammo[id] += POISON_AMMO_BUY
g_explode_ammo[id] += EXPLODE_AMMO_BUY
if(g_normal_ammo[id] > NORMAL_AMMO) g_normal_ammo[id] = NORMAL_AMMO
if(g_fire_ammo[id] > FIRE_AMMO) g_fire_ammo[id] = FIRE_AMMO
if(g_ice_ammo[id] > ICE_AMMO) g_ice_ammo[id] = ICE_AMMO
if(g_poison_ammo[id] > POISON_AMMO) g_poison_ammo[id] = POISON_AMMO
if(g_explode_ammo[id] > EXPLODE_AMMO) g_explode_ammo[id] = EXPLODE_AMMO
update_ammo(id)
return PLUGIN_CONTINUE
}
//play anim
public playanim(player,anim)
{
set_pev(player, pev_weaponanim, anim)
message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, player)
write_byte(anim)
write_byte(pev(player, pev_body))
message_end()
}
// Client connected
public client_connect(id)
{
// Reset all
g_HasBow[id] = false
g_finish_time[id] = 0.0
}
// Current weapon player is holding
public Event_CurrentWeapon(id)
{
if (is_user_bot(id))
return
if(!is_user_connected(id))
return
// Read weapon ID
new weaponID = read_data(2)
if (weaponID == CSW_SCOUT)
{
if (g_HasBow[id])
{
if(!draw_wpn[id])
{
playanim(id, anim_draw)
update_ammo(id)
//emit_sound(id, CHAN_WEAPON, GRENADE_DRAW, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
// View model
entity_set_string(id, EV_SZ_viewmodel, V_MODEL)
// Player model
entity_set_string(id, EV_SZ_weaponmodel, P_MODEL)
draw_wpn[id] = true
}
}
else
{
// View model
entity_set_string(id, EV_SZ_viewmodel, "models/v_scout.mdl")
// Player model
entity_set_string(id, EV_SZ_weaponmodel, "models/p_scout.mdl")
}
}
else
{
draw_wpn[id] = false
}
}
public remove_bow() {
new nextitem = find_ent_by_class(-1, "bow")
while ((nextitem = find_ent_by_class(-1, "bow")) != 0) {
remove_entity(nextitem)
}
return PLUGIN_CONTINUE
}
// Player killed
public fw_PlayerKilled(victim, attacker, shouldgib)
{
if (g_HasBow[victim])
{
// Reset all
g_HasBow[victim] = false
set_user_rendering(victim, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 25)
// Remove screen's bar
message_begin(MSG_ONE, g_msgBarTime, _, victim)
write_byte(0) // time
write_byte(0) // unknown
message_end()
remowegun(victim)
}
}
public give_bow(id)
{
give_weapon(id)
g_bow_mode[id] = NORMAL_MODE
g_normal_ammo[id] = NORMAL_AMMO
g_fire_ammo[id] = FIRE_AMMO
g_ice_ammo[id] = ICE_AMMO
g_poison_ammo[id] = POISON_AMMO
g_explode_ammo[id] = EXPLODE_AMMO
}
//give wpn
public give_weapon(id){
g_HasBow[id] = true
give_item(id,"weapon_scout")
update_ammo(id)
}
public fw_bow_PrimaryAttack(Weapon)
{
new Player = get_pdata_cbase(Weapon, 41, 4)
if (g_HasBow[Player])
return HAM_SUPERCEDE
return HAM_IGNORED
}
public fw_bow_SecondaryAttack(Weapon)
{
new Player = get_pdata_cbase(Weapon, 41, 4)
if (g_HasBow[Player])
return HAM_SUPERCEDE
return HAM_IGNORED
}
public fw_bow_Reload(Weapon)
{
new Player = get_pdata_cbase(Weapon, 41, 4)
if (g_HasBow[Player])
return HAM_SUPERCEDE
return HAM_IGNORED
}
public fw_bow_Deploy_Post(Weapon)
{
new Player = get_pdata_cbase(Weapon, 41, 4)
update_ammo(Player)
}
// Command start
public fw_CmdStart(id, uc_handle, seed)
{
if(!g_HasBow[id])
return FMRES_IGNORED
static CurButton, OldButton
CurButton = get_uc(uc_handle, UC_Buttons)
OldButton = (pev(id, pev_oldbuttons) & IN_ATTACK)
if(get_gametime() - g_finish_time[id] > NEXT_SHOT_TIME)
{
// Attack1 button pressed
if(CurButton & IN_ATTACK && !OldButton)
{
if(get_user_weapon(id) != CSW_SCOUT)
return FMRES_IGNORED
if((g_bow_mode[id] == NORMAL_MODE && g_normal_ammo[id] <= 0) || (g_bow_mode[id] == FIRE_MODE && g_fire_ammo[id] <= 0) || (g_bow_mode[id] == ICE_MODE && g_ice_ammo[id] <= 0) || (g_bow_mode[id] == POISON_MODE && g_poison_ammo[id] <= 0) || (g_bow_mode[id] == EXPLODE_MODE && g_explode_ammo[id] <= 0))
return FMRES_IGNORED
g_start_time[id] = get_gametime()
// A bar appears in his screen
message_begin(MSG_ONE_UNRELIABLE, g_msgBarTime, _, id)
write_byte(3) // time
write_byte(0) // unknown
message_end()
g_pressed[id] = true
}
if(CurButton & IN_ATTACK && OldButton)
{
if((g_bow_mode[id] == NORMAL_MODE && g_normal_ammo[id] <= 0) || (g_bow_mode[id] == FIRE_MODE && g_fire_ammo[id] <= 0) || (g_bow_mode[id] == ICE_MODE && g_ice_ammo[id] <= 0) || (g_bow_mode[id] == POISON_MODE && g_poison_ammo[id] <= 0) || (g_bow_mode[id] == EXPLODE_MODE && g_explode_ammo[id] <= 0))
return FMRES_IGNORED
if(!g_pressed[id])
return FMRES_IGNORED
if(get_user_weapon(id) != CSW_SCOUT)
{
g_finish_time[id] = get_gametime()
FireArrow(id)
// Remove screen's bar
message_begin(MSG_ONE, g_msgBarTime, _, id)
write_byte(0) // time
write_byte(0) // unknown
message_end()
g_pressed[id] = false
}
}
if(!(CurButton & IN_ATTACK) && OldButton)
{
if(get_user_weapon(id) != CSW_SCOUT)
return FMRES_IGNORED
if((g_bow_mode[id] == NORMAL_MODE && g_normal_ammo[id] <= 0) || (g_bow_mode[id] == FIRE_MODE && g_fire_ammo[id] <= 0) || (g_bow_mode[id] == ICE_MODE && g_ice_ammo[id] <= 0) || (g_bow_mode[id] == POISON_MODE && g_poison_ammo[id] <= 0) || (g_bow_mode[id] == EXPLODE_MODE && g_explode_ammo[id] <= 0))
return FMRES_IGNORED
if(!g_pressed[id])
return FMRES_IGNORED
g_finish_time[id] = get_gametime()
FireArrow(id)
// Remove screen's bar
message_begin(MSG_ONE, g_msgBarTime, _, id)
write_byte(0) // time
write_byte(0) // unknown
message_end()
g_pressed[id] = false
}
}
if((CurButton & IN_ATTACK2) && !(pev(id, pev_oldbuttons) & IN_ATTACK2))
{
if(get_user_weapon(id) != CSW_SCOUT)
return FMRES_IGNORED
if(!g_pressed[id])
{
cmdMenu(id)
}
}
return FMRES_HANDLED
}
//block anim standard wpn
public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
if (!is_user_alive(id))
return FMRES_IGNORED
// Block default sounds
if (get_user_weapon(id) == CSW_SCOUT && g_HasBow[id])
{
set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001 );
}
return FMRES_HANDLED
}
// Fire gremade
public FireArrow(id)
{
// Set animation
playanim(id, anim_shot1)
// Get origin. angle and velocity
new velocity[33]
new Float:fAngle[3], Float:fVelocity[3]
pev(id, pev_v_angle, fAngle)
// Create ent
new arrow = create_entity("info_target")
// Not grenade
if (!arrow) return PLUGIN_HANDLED
// Classname
entity_set_string(arrow, EV_SZ_classname, "bow_arrow")
// Model
entity_set_model(arrow, ARROW_MODEL)
if(g_bow_mode[id] == NORMAL_MODE)
{
set_rendering(arrow, kRenderFxGlowShell, 255, 255, 255, kRenderNormal, 25)
g_normal_ammo[id]--
}
else if(g_bow_mode[id] == FIRE_MODE)
{
set_rendering(arrow, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25)
g_fire_ammo[id]--
}
else if(g_bow_mode[id] == ICE_MODE)
{
set_rendering(arrow, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
g_ice_ammo[id]--
}
else if(g_bow_mode[id] == POISON_MODE)
{
set_rendering(arrow, kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 25)
g_poison_ammo[id]--
}
else if(g_bow_mode[id] == EXPLODE_MODE)
{
set_rendering(arrow, kRenderFxGlowShell, 150, 105, 0, kRenderNormal, 25)
g_explode_ammo[id]--
}
update_ammo(id)
new Float:vOrigin[3],Float:vUp[3]
pev(id, pev_origin, vOrigin)
global_get(glb_v_up, vUp)
new up = 17
vOrigin[0] = vOrigin[0] + vUp[0] * up
vOrigin[1] = vOrigin[1] + vUp[1] * up
vOrigin[2] = vOrigin[2] + vUp[2] * up
// Origin
entity_set_origin(arrow, vOrigin)
// Angles
entity_set_vector(arrow, EV_VEC_angles, fAngle)
// Size
new Float:MinBox[3] = {-1.0, -1.0, -1.0}
new Float:MaxBox[3] = {1.0, 1.0, 1.0}
entity_set_vector(arrow, EV_VEC_mins, MinBox)
entity_set_vector(arrow, EV_VEC_maxs, MaxBox)
// Interaction
entity_set_int(arrow, EV_INT_solid, SOLID_SLIDEBOX)
// Movetype
entity_set_int(arrow, EV_INT_movetype, MOVETYPE_TOSS)
// Owner
entity_set_edict(arrow, EV_ENT_owner, id)
// Velocity
new Float: holdtime[33]
new Float: mnoji[33]
holdtime[id] = g_finish_time[id] - g_start_time[id]
if(holdtime[id] < 1.0) holdtime[id] = 1.0
if(holdtime[id] > 3.0) holdtime[id] = 3.0
mnoji[id] = BASE_SPEED + holdtime[id] * BONUS_SPEED
velocity[id] = floatround(mnoji[id],floatround_round)
VelocityByAim(id, velocity[id], fVelocity)
entity_set_vector(arrow, EV_VEC_velocity, fVelocity)
// Launch sound
emit_sound(arrow, CHAN_WEAPON, ARROW_SHOOT, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
return PLUGIN_CONTINUE
}
// We hit something!!!
public pfn_touch(ptr, ptd)
{
// If ent is valid
if (pev_valid(ptr))
{
// Get classnames
static classname[32], classnameptd[32]
pev(ptr, pev_classname, classname, 31)
// Our ent
if(equal(classname, "bow_arrow"))
{
// Get it's origin
new Float:Origin[3]
pev(ptr, pev_origin, Origin)
new owner = pev(ptr, pev_owner)
if(g_bow_mode[owner] == EXPLODE_MODE)
{
// Explosion
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, Origin, 0)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2])
write_short(g_exp_sprid)
write_byte(40)
write_byte(30)
write_byte(0)
message_end()
check_radius_damage(ptr, owner)
}
if(is_user_alive(ptd))
{
if(cs_get_user_team(ptd) != cs_get_user_team(owner))
{
g_old_speed[ptd] = get_user_maxspeed(ptd)
if(g_bow_mode[owner] == NORMAL_MODE)
{
ExecuteHamB(Ham_TakeDamage, ptd, ptr, owner, NORMAL_DMG, DMG_BULLET)
}
else if(g_bow_mode[owner] == FIRE_MODE)
{
g_dmg_mode[ptd] = dmg_fire
CreateBurn(ptd, owner)
}
else if(g_bow_mode[owner] == ICE_MODE)
{
if(!g_slowed[ptd] && !g_Burn[ptd])
{
g_FrozenRenderingFx[ptd] = pev(ptd, pev_renderfx)
pev(ptd, pev_rendercolor, g_FrozenRenderingColor[ptd])
g_FrozenRenderingRender[ptd] = pev(ptd, pev_rendermode)
pev(ptd, pev_renderamt, g_FrozenRenderingAmount[ptd])
set_user_rendering(ptd, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
set_user_maxspeed(ptd, get_user_maxspeed(ptd) * SPEED_LOW_ICE)
g_slowed[ptd] = true
set_task(SLOW_ICE_TIME, "make_speed", ptd, _, _, "a", 1)
message_begin(MSG_ONE_UNRELIABLE, g_MsgDamage, _, ptd)
write_byte(0) // damage save
write_byte(0) // damage take
write_long(DMG_DROWN) // damage type - DMG_FREEZE
write_coord(0) // x
write_coord(0) // y
write_coord(0) // z
message_end()
}
}
else if(g_bow_mode[owner] == POISON_MODE)
{
if(!g_slowed[ptd])
{
set_user_maxspeed(ptd, get_user_maxspeed(ptd) * SPEED_LOW_POISON)
g_slowed[ptd] = true
set_task(SLOW_POISON_TIME, "make_speed", ptd, _, _, "a", 1)
g_dmg_mode[ptd] = dmg_poison
CreateBurn(ptd, owner)
}
}
}
}
// We hit breakable
if(pev_valid(ptd))
{
pev(ptd, pev_classname, classnameptd, 31)
if (equali(classnameptd, "func_breakable"))
{
// Destroy it
force_use(ptr,ptd)
}
}
set_pev(ptr, pev_flags, FL_KILLME)
}
}
if(is_valid_ent(ptr))
{
new classname[32]
entity_get_string(ptr,EV_SZ_classname,classname,31)
if(equal(classname, "bow"))
{
if(is_valid_ent(ptd))
{
new id = ptd
if(id > 0 && id < 34)
{
if(allowed_toucher(id))
{
// Pick up weapon
give_weapon(id)
remove_entity(ptr)
}
}
}
}
}
}
public CreateBurn(id, attacker)
{
if(g_Burn[id] || g_Poisoned[id])
return
if(g_dmg_mode[id] == dmg_fire)
{
new ent=CreateAnimationSprite(attacker, BURN_CLASSNAME, BURN_MODEL, 1.0, 10.0)
set_pev(ent, pev_solid, SOLID_NOT)
set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
set_pev(ent, pev_aiment, id)
set_pev(ent, pev_fuser2, get_gametime()+BURN_LIFE)
g_Burn[id]=get_gametime()+BURN_PERIOD
}
if(g_dmg_mode[id] == dmg_poison)
{
new ent=CreateAnimationSprite(attacker, BURN_CLASSNAME, POISON_MODEL, 1.0, 10.0)
set_pev(ent, pev_solid, SOLID_NOT)
set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
set_pev(ent, pev_aiment, id)
set_pev(ent, pev_fuser2, get_gametime()+POISON_TIME)
g_Poisoned[id]=get_gametime()+POISON_PERIOD
}
}
public BurnThink(ent)
{
if(!pev_valid(ent))
return
static Float:life, aim_ent
pev(ent,pev_fuser2, life)
aim_ent=pev(ent, pev_aiment)
if(g_dmg_mode[aim_ent] == dmg_fire)
{
if(get_gametime()>life||!is_user_alive(aim_ent)/*||!zp_get_user_zombie(aim_ent)*/)
{
g_Burn[aim_ent]=0.0
fm_remove_entity(ent)
return
}
if(get_gametime()>g_Burn[aim_ent])
{
ExecuteHamB(Ham_TakeDamage, aim_ent , ent ,pev(ent, pev_owner), BURN_DAMAGE, DMG_BURN)
g_Burn[aim_ent]=get_gametime()+BURN_PERIOD
}
}
if(g_dmg_mode[aim_ent] == dmg_poison)
{
if(get_gametime()>life||!is_user_alive(aim_ent)/*||!zp_get_user_zombie(aim_ent)*/)
{
g_Poisoned[aim_ent]=0.0
fm_remove_entity(ent)
return
}
if(get_gametime()>g_Poisoned[aim_ent])
{
ExecuteHamB(Ham_TakeDamage, aim_ent , ent ,pev(ent, pev_owner), POISON_DAMAGE, DMG_ACID)
g_Poisoned[aim_ent]=get_gametime()+POISON_PERIOD
}
}
}
public make_speed(id)
{
if(is_user_alive(id) && g_slowed[id])
{
g_slowed[id] = false
set_user_maxspeed(id, g_old_speed[id])
fm_set_rendering_float(id, g_FrozenRenderingFx[id], g_FrozenRenderingColor[id], g_FrozenRenderingRender[id], g_FrozenRenderingAmount[id])
}
}
public check_radius_damage(ent, attacker)
{
for(new i = 0; i < g_MaxPlayers; i++)
{
if(!is_user_alive(i))
continue
if(cs_get_user_team(attacker) == cs_get_user_team(i))
continue
if(entity_range(ent, i) > EXPLODE_HITRADIUS)
continue
Do_TakeDamage(ent, i, attacker, can_see_fm(ent, i))
}
}
public Do_TakeDamage(Ent, Victim, Attacker, can_see)
{
static Float:Damage, Float:CurrentDis
CurrentDis = entity_range(Ent, Victim)
Damage = EXPLODE_DAMAGE - ((CurrentDis / EXPLODE_HITRADIUS) * EXPLODE_DAMAGE)
if(Damage > 0)
{
static WeaponEnt
WeaponEnt = fm_get_user_weapon_entity(Attacker, CSW_HEGRENADE)
if(!pev_valid(WeaponEnt))
WeaponEnt = 0
if(!can_see)
Damage /= 2
ExecuteHamB(Ham_TakeDamage, Victim, WeaponEnt, Attacker, Damage, DMG_BULLET)
}
}
public update_ammo(id)
{
if(!is_user_alive(id))
return
if(g_bow_mode[id] == NORMAL_MODE)
{
g_ammo[id] = g_normal_ammo[id]
}
else if(g_bow_mode[id] == FIRE_MODE)
{
g_ammo[id] = g_fire_ammo[id]
}
else if(g_bow_mode[id] == ICE_MODE)
{
g_ammo[id] = g_ice_ammo[id]
}
else if(g_bow_mode[id] == POISON_MODE)
{
g_ammo[id] = g_poison_ammo[id]
}
else if(g_bow_mode[id] == EXPLODE_MODE)
{
g_ammo[id] = g_explode_ammo[id]
}
static weapon_ent; weapon_ent = fm_find_ent_by_owner(-1, "weapon_scout", id)
if(pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent, 1)
cs_set_user_bpammo(id, CSW_SCOUT, g_ammo[id])
engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, get_user_msgid("CurWeapon"), {0, 0, 0}, id)
write_byte(1)
write_byte(CSW_SCOUT)
write_byte(-1)
message_end()
set_task(0.1, "hud_debug", id)
}
public hud_debug(id)
{
engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, get_user_msgid("CurWeapon"), {0, 0, 0}, id)
write_byte(1)
write_byte(CSW_SCOUT)
write_byte(-1)
message_end()
}
public cmdMenu(id) {
new i_Menu = menu_create("\rВыбор Ńтрел", "menu_handler");
menu_additem(i_Menu, "\wОбычные", "1", 0);
menu_additem(i_Menu, "\wОгненные", "2", 0);
menu_additem(i_Menu, "\wЛедяные", "3", 0);
menu_additem(i_Menu, "\wОтравленные", "4", 0);
menu_additem(i_Menu, "\wВзрывные", "5", 0);
menu_setprop(i_Menu, MPROP_EXITNAME, "Выход");
menu_display(id, i_Menu, 0)
}
public menu_handler(id, menu, item) {
if( item < 0 ) return PLUGIN_CONTINUE;
new cmd[3], access, callback;
menu_item_getinfo(menu, item, access, cmd,2,_,_, callback);
new Choise = str_to_num(cmd)
switch (Choise) {
case 1: {
g_bow_mode[id] = NORMAL_MODE
update_ammo(id)
}
case 2: {
g_bow_mode[id] = FIRE_MODE
update_ammo(id)
}
case 3: {
g_bow_mode[id] = ICE_MODE
update_ammo(id)
}
case 4: {
g_bow_mode[id] = POISON_MODE
update_ammo(id)
}
case 5: {
g_bow_mode[id] = EXPLODE_MODE
update_ammo(id)
}
}
return PLUGIN_HANDLED;
}
// Allowed toucher
stock allowed_toucher(player)
{
if (g_HasBow[player])
return false
return true
}
stock print(const id, const input[], any:...)
{
new iCount = 1, iPlayers[32]
static szMsg[191]
vformat(szMsg, charsmax(szMsg), input, 3)
replace_all(szMsg, 190, "^x04", "^4") // green txt
replace_all(szMsg, 190, "^x01", "^1") // orange txt
replace_all(szMsg, 190, "^x03", "^3") // team txt
replace_all(szMsg, 190, "^x00", "^0") // team txt
if(id) iPlayers[0] = id
else get_players(iPlayers, iCount, "ch")
for (new i = 0; i < iCount; i++)
{
if (is_user_connected(iPlayers[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, iPlayers[i])
write_byte(iPlayers[i])
write_string(szMsg)
message_end()
}
}
}
stock CreateAnimationSprite(owner, const classname[], const model[], Float:scale, Float:framerate)
{
new ent=fm_create_entity("env_sprite")
set_pev(ent, pev_framerate, framerate)
set_pev(ent, pev_model, model)
dllfunc(DLLFunc_Spawn, ent)
set_pev(ent, pev_classname, classname)
set_pev(ent, pev_owner, owner)
fm_entity_set_model(ent, model)
fm_set_rendering(ent, kRenderFxNoDissipation, 255, 255, 255, kRenderGlow, 255)
set_pev(ent, pev_framerate, framerate)
set_pev(ent, pev_scale, scale)
return ent
}
public can_see_fm(entindex1, entindex2)
{
if (!entindex1 || !entindex2)
return false
if (pev_valid(entindex1) && pev_valid(entindex1))
{
new flags = pev(entindex1, pev_flags)
if (flags & EF_NODRAW || flags & FL_NOTARGET)
{
return 0
}
new Float:lookerOrig[3]
new Float:targetBaseOrig[3]
new Float:targetOrig[3]
new Float:temp[3]
pev(entindex1, pev_origin, lookerOrig)
pev(entindex1, pev_view_ofs, temp)
lookerOrig[0] += temp[0]
lookerOrig[1] += temp[1]
lookerOrig[2] += temp[2]
pev(entindex2, pev_origin, targetBaseOrig)
pev(entindex2, pev_view_ofs, temp)
targetOrig[0] = targetBaseOrig [0] + temp[0]
targetOrig[1] = targetBaseOrig [1] + temp[1]
targetOrig[2] = targetBaseOrig [2] + temp[2]
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the had of seen player
if (get_tr2(0, TraceResult:TR_InOpen) && get_tr2(0, TraceResult:TR_InWater))
{
return 0
}
else
{
new Float:flFraction
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return 1
}
else
{
targetOrig[0] = targetBaseOrig [0]
targetOrig[1] = targetBaseOrig [1]
targetOrig[2] = targetBaseOrig [2]
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the body of seen player
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return 1
}
else
{
targetOrig[0] = targetBaseOrig [0]
targetOrig[1] = targetBaseOrig [1]
targetOrig[2] = targetBaseOrig [2] - 17.0
engfunc(EngFunc_TraceLine, lookerOrig, targetOrig, 0, entindex1, 0) // checks the legs of seen player
get_tr2(0, TraceResult:TR_flFraction, flFraction)
if (flFraction == 1.0 || (get_tr2(0, TraceResult:TR_pHit) == entindex2))
{
return 1
}
}
}
}
}
return 0
}
stock fm_set_rendering_float(entity, fx = kRenderFxNone, Float:color[3], render = kRenderNormal, Float:amount = 16.0)
{
set_pev(entity, pev_renderfx, fx)
set_pev(entity, pev_rendercolor, color)
set_pev(entity, pev_rendermode, render)
set_pev(entity, pev_renderamt, amount)
}