Raised This Month: $32 Target: $400
 8% 

API Scripting Help Bow v 1.2 bug/issue


Post New Thread Reply   
 
Thread Tools Display Modes
LearninG
Senior Member
Join Date: Apr 2019
Location: Iran
Old 07-06-2019 , 01:06   Re: Bow v 1.2 bug/issue
Reply With Quote #11

Quote:
Originally Posted by Krtola View Post
check and block mode changing before bow hit something.
PHP Code:
// We hit something!!!
public pfn_touch(ptrptd)
{
    
// If ent is valid
    
if (pev_valid(ptr))
    {    
        
// Get classnames
        
static classname[32], classnameptd[32]
        
pev(ptrpev_classnameclassname31)
        
        
// Our ent
        
if(equal(classname"bow_arrow"))
        {
            
// Get it's origin
            
new Float:Origin[3]
            
pev(ptrpev_originOrigin)

            new 
owner pev(ptrpev_owner)

            if(
g_bow_mode[owner] == EXPLODE_MODE)
            {
                
// Explosion
                
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYOrigin0)
                
write_byte(TE_EXPLOSION)
                
engfunc(EngFunc_WriteCoordOrigin[0])
                
engfunc(EngFunc_WriteCoordOrigin[1])
                
engfunc(EngFunc_WriteCoordOrigin[2])
                
write_short(g_exp_sprid)
                
write_byte(40)
                
write_byte(30)
                
write_byte(0)
                
message_end()

                
check_radius_damage(ptrowner)
            }

            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_TakeDamageptdptrownerNORMAL_DMGDMG_BULLET)
                    }
                    else if(
g_bow_mode[owner] == FIRE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {
                                                                
g_dmg_mode[ptd] = dmg_fire
                                 CreateBurn
(ptdowner)
                            }
                        
                    }
                    else if(
g_bow_mode[owner] == ICE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {

                            
g_FrozenRenderingFx[ptd] = pev(ptdpev_renderfx)
                            
pev(ptdpev_rendercolorg_FrozenRenderingColor[ptd])
                            
g_FrozenRenderingRender[ptd] = pev(ptdpev_rendermode)
                            
pev(ptdpev_renderamtg_FrozenRenderingAmount[ptd])

                            
set_user_rendering(ptdkRenderFxGlowShell0100200kRenderNormal25)
                            
set_user_maxspeed(ptdget_user_maxspeed(ptd) * SPEED_LOW_ICE)
                            
g_slowed[ptd] = true
                            set_task
(SLOW_ICE_TIME"make_speed"ptd__"a"1)
                
                            
message_begin(MSG_ONE_UNRELIABLEg_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()
                        }
                                             }
                }
            }
            
// We hit breakable
            
if(pev_valid(ptd))
            {
                
pev(ptdpev_classnameclassnameptd31)
                if (
equali(classnameptd"func_breakable"))
                {
                    
// Destroy it
                    //force_use(ptr,ptd)
                
}
            }
            
set_pev(ptrpev_flagsFL_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 && id 34
                {
                    if(
allowed_toucher(id))
                    {
                        
// Pick up weapon
                        //give_weapon(id)
                        
remove_entity(ptr)
                    }
                }
            }
        }
    }

I need to check that function and add it here :
PHP Code:
if((CurButton IN_ATTACK2) && !(pev(idpev_oldbuttons) & IN_ATTACK2))
    {        
        if(
get_user_weapon(id) != CSW_SCOUT)
            return 
FMRES_IGNORED
            
        
if ( get_gametime ( ) - lastSwitchTime id ] < SWITCH_TIME || (OldButton IN_ATTACK2)) return

        if(!
g_pressed[id])
        {
            if (
is_user_alive(id))

            switch(
g_bow_mode[id])
            {
                case 
1:
                {
                    
g_bow_mode[id]= 4
                    client_print
(id,print_center,"Fire Mode")
                    
update_ammo(id)
                    
                }
                case 
2:
                {
                    
g_bow_mode[id]= 1
                    client_print
(id,print_center,"Normal Mode")
                    
update_ammo(id)
                    
                    
                }
                case 
3:
                {
                    
g_bow_mode[id]= 2
                    client_print
(id,print_center,"Explode Mode")
                    
update_ammo(id)
                    
                }
                case 
4:
                {
                    
g_bow_mode[id]= 3
                    client_print
(id,print_center,"Ice Mode")
                    
update_ammo(id)
                }
            }
            
lastSwitchTime id ] = get_gametime ( )
        }
    }        

can you tell me exactly how do i check that here ?
LearninG is offline
Krtola
Veteran Member
Join Date: Oct 2013
Location: Serbia
Old 07-06-2019 , 05:18   Re: Bow v 1.2 bug/issue
Reply With Quote #12

Post latest code of this plugin here,so I can add all u need.
__________________
Check my original plugins for cs 1.6 and subscribe on channel
Look at the video below to see blind grenade for zombies

https://www.youtube.com/watch?v=ORC7ZmoaipQ

Look at the video below to see Zombie Hide And Seek mode

https://www.youtube.com/watch?v=xpyYb65EgGs
Krtola is offline
Send a message via Skype™ to Krtola
LearninG
Senior Member
Join Date: Apr 2019
Location: Iran
Old 07-06-2019 , 06:26   Re: Bow v 1.2 bug/issue
Reply With Quote #13

Quote:
Originally Posted by Krtola View Post
Post latest code of this plugin here,so I can add all u need.
CODE :
PHP Code:
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <zombieplague>

#if AMXX_VERSION_NUM < 183
#include <colorchat>
#define Red print_team_red
#define Blue print_team_blue
#define Grey print_team_grey
#define DontChange print_team_default
#endif




// Weapon/Arrow models
new const P_MODEL[] = "models/bow/p_Shina_by_Oxigen.mdl"
new const V_MODEL[] = "models/bow/v_Shina_by_Oxigen.mdl"
new const W_MODEL[] = "models/bow/w_Shina_by_Oxigen.mdl"
new const ARROW_MODEL[] = "models/bow/arrow.mdl"



#define BURN_CLASSNAME "flame"
#define BURN_MODEL "sprites/bow/flame_burn01.spr"
#define POISON_MODEL "sprites/bow/poison.spr"

#define m_rpgPlayerItems_Slot0 367 
#define m_iId 43

// Settings
#define SWITCH_TIME    0.5

#define BASE_SPEED 400
#define BONUS_SPEED 500

#define BURN_LIFE 10.0
#define BURN_PERIOD 2.0
#define BURN_DAMAGE 100.0


#define NORMAL_DMG 250.0

#define SPEED_LOW_ICE 0.5
#define SLOW_ICE_TIME 5.0

#define EXPLODE_DAMAGE 1500
#define EXPLODE_HITRADIUS 600

// Base number of arrows
#define NORMAL_AMMO 20
#define FIRE_AMMO 15
#define ICE_AMMO 10
#define EXPLODE_AMMO 3

//Number of extra arrows
#define NORMAL_AMMO_BUY 5
#define FIRE_AMMO_BUY 4
#define ICE_AMMO_BUY 3
#define EXPLODE_AMMO_BUY 1

// Cost of extra arrows
#define AMMO_COST 10
#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_explode_ammo[33]

// Player variables
new g_HasBow[33// whether player has bow
new bool:draw_wpn[33
new 
Float:lastSwitchTime[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_MsgDamageg_msgBarTime

enum 
{
    
anim_idle,
    
anim_shot1,
    
anim_shot2,
    
anim_reload,
    
anim_draw
}

enum
{
    
NORMAL_MODE 1,
    
FIRE_MODE 4,
    
ICE_MODE 3,
    
EXPLODE_MODE 2
}

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")
}

// ITEM
new g_itemid
//


// Plugin init
public plugin_init()
{
    
// Register plugin
    
register_plugin("PLUGIN""VERSION""AUTHOR")
    
    
// 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")

    
g_itemid zp_register_extra_item("Magical Bow",6ZP_TEAM_HUMAN)

    
g_MaxPlayers get_maxplayers()
}

public 
zp_extra_item_selected(playeritemid)
{
    if (
itemid == g_itemid || is_user_alive(player))
    {
        
give_bow(player)
    }
    return 
PLUGIN_CONTINUE
}

public 
Event_NewRound()
{
    for (new 
0get_maxplayers(); i++)
        {
        
set_user_rendering(ikRenderFxGlowShell000kRenderNormal25)
        
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(id64Aim)
        
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 
0;number ;i++) { 
        if (
wpnList[i] == CSW_SCOUT) {
            
fm_strip_user_gun(idwpnList[i])
        }
    }


//play anim
public playanim(player,anim)
{
    
set_pev(playerpev_weaponanimanim)
    
message_begin(MSG_ONESVC_WEAPONANIM, {000}, player)
    
write_byte(anim)
    
write_byte(pev(playerpev_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(idanim_draw)
                
update_ammo(id)
                
//emit_sound(id, CHAN_WEAPON, GRENADE_DRAW, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
                // View model
                
entity_set_string(idEV_SZ_viewmodelV_MODEL)
                
                
// Player model
                
entity_set_string(idEV_SZ_weaponmodelP_MODEL)
                
draw_wpn[id] = true
            
}
        }
        else
        {
            
// View model
            
entity_set_string(idEV_SZ_viewmodel"models/v_scout.mdl")
            
            
// Player model
            
entity_set_string(idEV_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(victimattackershouldgib)
{
    if (
g_HasBow[victim])        
    {
        
// Reset all
        
g_HasBow[victim] = false
        set_user_rendering
(victimkRenderFxGlowShell000kRenderNormal25)

        
// Remove screen's bar
        
message_begin(MSG_ONEg_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_explode_ammo
[id] = EXPLODE_AMMO
}

//give weapon
public give_weapon(id){
    
g_HasBow[id] = true
    
//DropWeaponSlot(id, 1)
    
give_item(id"weapon_scout")
    
update_ammo(id)
}

public 
fw_bow_PrimaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_SecondaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Reload(Weapon
{
         new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Deploy_Post(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    
update_ammo(Player)
}

// Command start
public fw_CmdStart(idUC_HandleSeed
{
    if(!
g_HasBow[id] || !is_user_alive(id))
        return 
FMRES_IGNORED

    
static CurButtonOldButton
    
    CurButton 
get_uc(UC_HandleUC_Buttons)
    
OldButton = (pev(idpev_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] == 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_UNRELIABLEg_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] == 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_ONEg_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] == 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_ONEg_msgBarTime_id)
            
write_byte(0// time
            
write_byte(0// unknown
            
message_end()

            
g_pressed[id] = false
        
}
    }

    if((
CurButton IN_ATTACK2) && !(pev(idpev_oldbuttons) & IN_ATTACK2))
    {        
        if(
get_user_weapon(id) != CSW_SCOUT)
            return 
FMRES_IGNORED
            
        
if ( get_gametime ( ) - lastSwitchTime id ] < SWITCH_TIME || (OldButton IN_ATTACK2)) return

        if(!
g_pressed[id])
        {
            if (
is_user_alive(id))

            switch(
g_bow_mode[id])
            {
                case 
1:
                {
                    
g_bow_mode[id]= 4
                    client_print
(id,print_center,"Fire Mode")
                    
update_ammo(id)
                    
                }
                case 
2:
                {
                    
g_bow_mode[id]= 1
                    client_print
(id,print_center,"Normal Mode")
                    
update_ammo(id)
                    
                    
                }
                case 
3:
                {
                    
g_bow_mode[id]= 2
                    client_print
(id,print_center,"Explode Mode")
                    
update_ammo(id)
                    
                }
                case 
4:
                {
                    
g_bow_mode[id]= 3
                    client_print
(id,print_center,"Ice Mode")
                    
update_ammo(id)
                }
            }
            
lastSwitchTime id ] = get_gametime ( )
        }
    }        
}

//block anim standart wpn 
public fw_UpdateClientData_Post(idsendweaponscd_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_handleCD_flNextAttackhalflife_time() + 0.001 ); 
    }

    return 
FMRES_HANDLED
}

// Fire gremade
public FireArrow(id)
{
    
// Set animation
    
playanim(idanim_shot1)

    
// Get origin. angle and velocity
    
new velocity[33]
    new 
Float:fAngle[3], Float:fVelocity[3]
    
pev(idpev_v_anglefAngle)
    
    
// Create ent
    
new arrow create_entity("info_target")
    
    
// Not grenade
    
if (!arrow) return PLUGIN_HANDLED

    
// Classname
    
entity_set_string(arrowEV_SZ_classname"bow_arrow")
    
    
// Model
    
entity_set_model(arrowARROW_MODEL)

    if(
g_bow_mode[id] == NORMAL_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell255255255kRenderNormal50)
        
g_normal_ammo[id]--
    }
    else if(
g_bow_mode[id] == FIRE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell25500kRenderNormal50)
        
g_fire_ammo[id]--
    }
    else if(
g_bow_mode[id] == ICE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell00255kRenderNormal50)
        
g_ice_ammo[id]--
    }
    else if(
g_bow_mode[id] == EXPLODE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell1501050kRenderNormal50)
        
g_explode_ammo[id]--
    }

    
update_ammo(id)

    new 
Float:vOrigin[3],Float:vUp[3]
    
pev(idpev_originvOrigin)
    
    
global_get(glb_v_upvUp)
    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(arrowvOrigin)
    
    
// Angles
    
entity_set_vector(arrowEV_VEC_anglesfAngle)
    
    
// Size
    
new Float:MinBox[3] = {-1.0, -1.0, -1.0}
    new 
Float:MaxBox[3] = {1.01.01.0}
    
entity_set_vector(arrowEV_VEC_minsMinBox)
    
entity_set_vector(arrowEV_VEC_maxsMaxBox)
    
    
// Interaction
    
entity_set_int(arrowEV_INT_solidSOLID_SLIDEBOX)
    
    
// Movetype
    
entity_set_int(arrowEV_INT_movetypeMOVETYPE_TOSS)
    
    
// Owner
    
entity_set_edict(arrowEV_ENT_ownerid)
    
    
// Velocity
    
new Floatholdtime[33
    new 
Floatmnoji[33]

    
holdtime[id] = g_finish_time[id] - g_start_time[id]

    if(
holdtime[id] < 1.0holdtime[id] = 1.0
    
if(holdtime[id] > 3.0holdtime[id] = 3.0

    
    mnoji
[id] = BASE_SPEED holdtime[id] * BONUS_SPEED
    velocity
[id] = floatround(mnoji[id],floatround_round)
    
VelocityByAim(idvelocity[id], fVelocity)
    
    
entity_set_vector(arrowEV_VEC_velocityfVelocity)
    
    
// Launch sound
    
emit_sound(arrowCHAN_WEAPONARROW_SHOOTVOL_NORMATTN_NORM0PITCH_NORM)

    return 
PLUGIN_CONTINUE
}    

// We hit something!!!
public pfn_touch(ptrptd)
{
    
// If ent is valid
    
if (pev_valid(ptr))
    {    
        
// Get classnames
        
static classname[32], classnameptd[32]
        
pev(ptrpev_classnameclassname31)
        
        
// Our ent
        
if(equal(classname"bow_arrow"))
        {
            
// Get it's origin
            
new Float:Origin[3]
            
pev(ptrpev_originOrigin)

            new 
owner pev(ptrpev_owner)

            if(
g_bow_mode[owner] == EXPLODE_MODE)
            {
                
// Explosion
                
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYOrigin0)
                
write_byte(TE_EXPLOSION)
                
engfunc(EngFunc_WriteCoordOrigin[0])
                
engfunc(EngFunc_WriteCoordOrigin[1])
                
engfunc(EngFunc_WriteCoordOrigin[2])
                
write_short(g_exp_sprid)
                
write_byte(40)
                
write_byte(30)
                
write_byte(0)
                
message_end()

                
check_radius_damage(ptrowner)
            }

            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_TakeDamageptdptrownerNORMAL_DMGDMG_BULLET)
                    }
                    else if(
g_bow_mode[owner] == FIRE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {
                                                                
g_dmg_mode[ptd] = dmg_fire
                                 CreateBurn
(ptdowner)
                            }
                        
                    }
                    else if(
g_bow_mode[owner] == ICE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {

                            
g_FrozenRenderingFx[ptd] = pev(ptdpev_renderfx)
                            
pev(ptdpev_rendercolorg_FrozenRenderingColor[ptd])
                            
g_FrozenRenderingRender[ptd] = pev(ptdpev_rendermode)
                            
pev(ptdpev_renderamtg_FrozenRenderingAmount[ptd])

                            
set_user_rendering(ptdkRenderFxGlowShell0100200kRenderNormal25)
                            
set_user_maxspeed(ptdget_user_maxspeed(ptd) * SPEED_LOW_ICE)
                            
g_slowed[ptd] = true
                            set_task
(SLOW_ICE_TIME"make_speed"ptd__"a"1)
                
                            
message_begin(MSG_ONE_UNRELIABLEg_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()
                        }
                                             }
                }
            }
            
// We hit breakable
            
if(pev_valid(ptd))
            {
                
pev(ptdpev_classnameclassnameptd31)
                if (
equali(classnameptd"func_breakable"))
                {
                    
// Destroy it
                    //force_use(ptr,ptd)
                
}
            }
            
set_pev(ptrpev_flagsFL_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 && id 34
                {
                    if(
allowed_toucher(id))
                    {
                        
// Pick up weapon
                        //give_weapon(id)
                        
remove_entity(ptr)
                    }
                }
            }
        }
    }
}    

public 
CreateBurn(idattacker)
{
    if(
g_Burn[id])
        return

    if(
g_dmg_mode[id] == dmg_fire)
    {
        new 
ent=CreateAnimationSprite(attackerBURN_CLASSNAMEBURN_MODEL1.010.0)
    
        
set_pev(entpev_solidSOLID_NOT)
        
set_pev(entpev_movetypeMOVETYPE_FOLLOW)
    
        
set_pev(entpev_aimentid)
    
        
set_pev(entpev_fuser2get_gametime()+BURN_LIFE)
    
        
g_Burn[id]=get_gametime()+BURN_PERIOD
    
}
}

public 
BurnThink(ent)
{
    if(!
pev_valid(ent))
        return
        
    static 
Float:lifeaim_ent
    
    pev
(ent,pev_fuser2life)
    
    
aim_ent=pev(entpev_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_TakeDamageaim_ent ent ,pev(entpev_owner), BURN_DAMAGEDMG_BURN)
        
            
g_Burn[aim_ent]=get_gametime()+BURN_PERIOD
        
}
    }
}


public 
make_speed(id)
{
    if(
is_user_alive(id) && g_slowed[id])
    {
        
g_slowed[id] = false
        set_user_maxspeed
(idg_old_speed[id])
        
fm_set_rendering_float(idg_FrozenRenderingFx[id], g_FrozenRenderingColor[id], g_FrozenRenderingRender[id], g_FrozenRenderingAmount[id])
    }
}

public 
check_radius_damage(entattacker)
{
    for(new 
0g_MaxPlayersi++)
    {
        if(!
is_user_alive(i))
            continue
        if(
cs_get_user_team(attacker) == cs_get_user_team(i))
            continue
        if(
entity_range(enti) > EXPLODE_HITRADIUS)
            continue
            
        
Do_TakeDamage(entiattackercan_see_fm(enti))
    }
}

public 
Do_TakeDamage(EntVictimAttackercan_see)
{
    static 
Float:DamageFloat:CurrentDis
    
    CurrentDis 
entity_range(EntVictim)
    
Damage EXPLODE_DAMAGE - ((CurrentDis EXPLODE_HITRADIUS) * EXPLODE_DAMAGE)
    
    if(
Damage 0)
    {
        static 
WeaponEnt
        WeaponEnt 
fm_get_user_weapon_entity(AttackerCSW_HEGRENADE)
        
        if(!
pev_valid(WeaponEnt))
            
WeaponEnt 0

        
if(!can_see)
            
Damage /= 2
            
        ExecuteHamB
(Ham_TakeDamageVictimWeaponEntAttackerDamageDMG_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] == EXPLODE_MODE)
    {
        
g_ammo[id] = g_explode_ammo[id]
    }
    
    static 
weapon_entweapon_ent fm_find_ent_by_owner(-1"weapon_scout"id)
    if(
pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent1)    
    
    
cs_set_user_bpammo(idCSW_SCOUTg_ammo[id])
    
    
engfunc(EngFunc_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, 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_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, id)
    
write_byte(1)
    
write_byte(CSW_SCOUT)
    
write_byte(-1)
    
message_end()
}

// Allowed toucher
stock allowed_toucher(player)
{
    if (
g_HasBow[player])
        return 
false
    
    
return true
}
 

stock CreateAnimationSprite(owner, const classname[], const model[], Float:scaleFloat:framerate)
{
    new 
ent=fm_create_entity("env_sprite")

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_modelmodel)

    
dllfunc(DLLFunc_Spawnent)

    
set_pev(entpev_classnameclassname)
    
set_pev(entpev_ownerowner)

    
fm_entity_set_model(entmodel)
    
fm_set_rendering(entkRenderFxNoDissipation255255255kRenderGlow255)

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_scalescale)

    return 
ent
}

public 
can_see_fm(entindex1entindex2)
{
    if (!
entindex1 || !entindex2)
        return 
false

    
if (pev_valid(entindex1) && pev_valid(entindex1))
    {
        new 
flags pev(entindex1pev_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(entindex1pev_originlookerOrig)
        
pev(entindex1pev_view_ofstemp)
        
lookerOrig[0] += temp[0]
        
lookerOrig[1] += temp[1]
        
lookerOrig[2] += temp[2]

        
pev(entindex2pev_origintargetBaseOrig)
        
pev(entindex2pev_view_ofstemp)
        
targetOrig[0] = targetBaseOrig [0] + temp[0]
        
targetOrig[1] = targetBaseOrig [1] + temp[1]
        
targetOrig[2] = targetBaseOrig [2] + temp[2]

        
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the had of seen player
        
if (get_tr2(0TraceResult:TR_InOpen) && get_tr2(0TraceResult:TR_InWater))
        {
            return 
0
        

        else 
        {
            new 
Float:flFraction
            get_tr2
(0TraceResult:TR_flFractionflFraction)
            if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
            {
                return 
1
            
}
            else
            {
                
targetOrig[0] = targetBaseOrig [0]
                
targetOrig[1] = targetBaseOrig [1]
                
targetOrig[2] = targetBaseOrig [2]
                
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the body of seen player
                
get_tr2(0TraceResult:TR_flFractionflFraction)
                if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                {
                    return 
1
                
}
                else
                {
                    
targetOrig[0] = targetBaseOrig [0]
                    
targetOrig[1] = targetBaseOrig [1]
                    
targetOrig[2] = targetBaseOrig [2] - 17.0
                    engfunc
(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the legs of seen player
                    
get_tr2(0TraceResult:TR_flFractionflFraction)
                    if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                    {
                        return 
1
                    
}
                }
            }
        }
    }
    return 
0
}

stock fm_set_rendering_float(entityfx kRenderFxNoneFloat:color[3], render kRenderNormalFloat:amount 16.0)
{
    
set_pev(entitypev_renderfxfx)
    
set_pev(entitypev_rendercolorcolor)
    
set_pev(entitypev_rendermoderender)
    
set_pev(entitypev_renderamtamount)
}

stock DropWeaponSlotiPlayeriSlot 

    new 
iWeaponEntity GetWeaponFromSlotiPlayeriSlot ); 
    if( 
iWeaponEntity 
    { 
        new 
iWeaponID get_pdata_cbaseiWeaponEntitym_iId); 
         
        new 
szWeaponName32 ]; 
        
get_weaponnameiWeaponIDszWeaponNamecharsmaxszWeaponName ) ); 
         
        
engclient_cmdiPlayer"drop"szWeaponName ); 
    } 


stock GetWeaponFromSlotiPlayeriSlot 

    return ( 
<= iSlot <= ) ? get_pdata_cbaseiPlayerm_rpgPlayerItems_Slot0 iSlot) : -1

Attached Files
File Type: sma Get Plugin or Get Source (bow_v1.2.sma - 167 views - 23.4 KB)

Last edited by LearninG; 07-06-2019 at 06:27.
LearninG is offline
Krtola
Veteran Member
Join Date: Oct 2013
Location: Serbia
Old 07-06-2019 , 07:56   Re: Bow v 1.2 bug/issue
Reply With Quote #14

Test this, and tell me how work now. To see what I add search
PHP Code:
//Krtola Stuff 
in code.
PHP Code:
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <zombieplague>

#if AMXX_VERSION_NUM < 183
#include <colorchat>
#define Red print_team_red
#define Blue print_team_blue
#define Grey print_team_grey
#define DontChange print_team_default
#endif

// Weapon/Arrow models
new const P_MODEL[] = "models/bow/p_Shina_by_Oxigen.mdl"
new const V_MODEL[] = "models/bow/v_Shina_by_Oxigen.mdl"
new const W_MODEL[] = "models/bow/w_Shina_by_Oxigen.mdl"
new const ARROW_MODEL[] = "models/bow/arrow.mdl"

#define BURN_CLASSNAME "flame"
#define BURN_MODEL "sprites/bow/flame_burn01.spr"
#define POISON_MODEL "sprites/bow/poison.spr"

#define m_rpgPlayerItems_Slot0 367 
#define m_iId 43

// Settings
#define SWITCH_TIME    0.5

#define BASE_SPEED 400
#define BONUS_SPEED 500

#define BURN_LIFE 10.0
#define BURN_PERIOD 2.0
#define BURN_DAMAGE 100.0


#define NORMAL_DMG 250.0

#define SPEED_LOW_ICE 0.5
#define SLOW_ICE_TIME 5.0

#define EXPLODE_DAMAGE 1500
#define EXPLODE_HITRADIUS 600

// Base number of arrows
#define NORMAL_AMMO 20
#define FIRE_AMMO 15
#define ICE_AMMO 10
#define EXPLODE_AMMO 3

//Number of extra arrows
#define NORMAL_AMMO_BUY 5
#define FIRE_AMMO_BUY 4
#define ICE_AMMO_BUY 3
#define EXPLODE_AMMO_BUY 1

// Cost of extra arrows
#define AMMO_COST 10
#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_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_MsgDamageg_msgBarTime

enum 
{
    
anim_idle,
    
anim_shot1,
    
anim_shot2,
    
anim_reload,
    
anim_draw
}

enum
{
    
NORMAL_MODE 1,
    
FIRE_MODE 4,
    
ICE_MODE 3,
    
EXPLODE_MODE 2
}

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")
}

// ITEM
new g_itemid

//Krtola Stuff
const Floatg_fCooldown 3.0
new Floatg_fLastDamage[33]
#define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
#define WEAPON_KEY 5444552332
#define WEAPON_OLD "weapon_scout"
#define m_rgpPlayerItems_CWeaponBox 34
#define WEAPON_BODY 0
new g_AllocString_E

public plugin_init()
{
    
// Register plugin
    
register_plugin("PLUGIN""VERSION""AUTHOR")
    
    
// 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")

    
g_itemid zp_register_extra_item("Magical Bow",6ZP_TEAM_HUMAN)

    
g_MaxPlayers get_maxplayers()

        
//Krtola Stuff
        
RegisterHam(Ham_Item_AddToPlayerWEAPON_OLD"fw_Item_AddToPlayer_Post"1)
        
register_forward(FM_SetModel"fw_SetModel")
        
g_AllocString_E engfunc(EngFunc_AllocStringWEAPON_OLD)
}

//Krtola Stuff
public fw_Item_AddToPlayer_Post(iItemiPlayer
{
    switch(
pev(iItempev_impulse)) 
        {
        case 
WEAPON_KEYg_HasBow[iPlayer] = 1
                                 

        
case 0g_HasBow[iPlayer] = 0
    
}    
}

public 
fw_SetModel(iEnt
{
    static 
iszClassname[32], iItem
    
pev(iEntpev_classnameszClassname31);
    if(!
equal(szClassname"weaponbox")) return FMRES_IGNORED;
    for(
06i++) {
        
iItem get_pdata_cbase(iEntm_rgpPlayerItems_CWeaponBox i4);
        if(
iItem && CustomItem(iItem)) {
            
            
set_pev(iEntpev_bodyWEAPON_BODY)
                        
g_HasBow[i] = 0
            
return FMRES_SUPERCEDE;
        }
    }
    return 
FMRES_IGNORED;
}

public 
zp_user_infected_post(id)
{
    if(
g_HasBow[id])
    {
                
g_HasBow[id] = 0
    
}
}
//End of Krtola Stuff

public zp_extra_item_selected(playeritemid)
{
    if (
itemid == g_itemid || is_user_alive(player))
    {
        
give_bow(player)
    }
    return 
PLUGIN_CONTINUE
}

public 
Event_NewRound()
{
    for (new 
0get_maxplayers(); i++)
        {
        
set_user_rendering(ikRenderFxGlowShell000kRenderNormal25)
        
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(id64Aim)
        
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 
0;number ;i++) { 
        if (
wpnList[i] == CSW_SCOUT) {
            
fm_strip_user_gun(idwpnList[i])
        }
    }


//play anim
public playanim(player,anim)
{
    
set_pev(playerpev_weaponanimanim)
    
message_begin(MSG_ONESVC_WEAPONANIM, {000}, player)
    
write_byte(anim)
    
write_byte(pev(playerpev_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 (!
g_HasBow[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(idanim_draw)
                
update_ammo(id)
                
//emit_sound(id, CHAN_WEAPON, GRENADE_DRAW, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
                // View model
                
entity_set_string(idEV_SZ_viewmodelV_MODEL)
                
                
// Player model
                
entity_set_string(idEV_SZ_weaponmodelP_MODEL)
                
draw_wpn[id] = true
            
}
        }
        else
        {
            
// View model
            
entity_set_string(idEV_SZ_viewmodel"models/v_scout.mdl")
            
            
// Player model
            
entity_set_string(idEV_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(victimattackershouldgib)
{
    if (
g_HasBow[victim])        
    {
        
// Reset all
        
g_HasBow[victim] = false
        set_user_rendering
(victimkRenderFxGlowShell000kRenderNormal25)

        
// Remove screen's bar
        
message_begin(MSG_ONEg_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_explode_ammo
[id] = EXPLODE_AMMO
}

//give weapon
public give_weapon(id){
    
g_HasBow[id] = true
    
//DropWeaponSlot(id, 1)
    
give_item(id"weapon_scout")
    
update_ammo(id)

        
//Krtola Stuff
        
static iEntiEnt engfunc(EngFunc_CreateNamedEntityg_AllocString_E);
    if(
iEnt <= 0) return 0;
    
set_pev(iEntpev_spawnflagsSF_NORESPAWN);
    
set_pev(iEntpev_impulseWEAPON_KEY);
    
ExecuteHam(Ham_SpawniEnt)
        
DropWeaponSlot(id1)

        if(!
ExecuteHamB(Ham_AddPlayerItemidiEnt)) 
        {
        
engfunc(EngFunc_RemoveEntityiEnt);
        return 
0
    
}
        
ExecuteHamB(Ham_Item_AttachToPlayeriEntid)
        return 
1    
}

public 
fw_bow_PrimaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_SecondaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Reload(Weapon
{
         new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Deploy_Post(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    
update_ammo(Player)
}

// Command start
public fw_CmdStart(idUC_HandleSeed
{
    if(!
g_HasBow[id] || !is_user_alive(id))
        return 
FMRES_IGNORED

    
static CurButtonOldButton
    
    CurButton 
get_uc(UC_HandleUC_Buttons)
    
OldButton = (pev(idpev_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] == 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_UNRELIABLEg_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] == 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_ONEg_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] == 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_ONEg_msgBarTime_id)
            
write_byte(0// time
            
write_byte(0// unknown
            
message_end()

            
g_pressed[id] = false
        
}
    }

    if((
CurButton IN_ATTACK2) && !(pev(idpev_oldbuttons) & IN_ATTACK2))
    {        
        if(
get_user_weapon(id) != CSW_SCOUT)
        return 
FMRES_IGNORED
            
if(g_fLastDamage[id] < get_gametime() - g_fCooldown)
        {                    

        if(!
g_pressed[id])
        {
                if(
is_user_alive(id))

            switch(
g_bow_mode[id])
            {
                case 
1:
                {
                    
g_bow_mode[id]= 4
                    client_print
(id,print_center,"Fire Mode")
                    
update_ammo(id)
                    
                }
                case 
2:
                {
                    
g_bow_mode[id]= 1
                    client_print
(id,print_center,"Normal Mode")
                    
update_ammo(id)
                    
                    
                }
                case 
3:
                {
                    
g_bow_mode[id]= 2
                    client_print
(id,print_center,"Explode Mode")
                    
update_ammo(id)
                    
                }
                case 
4:
                {
                    
g_bow_mode[id]= 3
                    client_print
(id,print_center,"Ice Mode")
                    
update_ammo(id)
                }
                                
            }
                        
g_fLastDamage[id] = get_gametime()
        }
            }
    } 
        return 
FMRES_IGNORED       
}

//block anim standart wpn 
public fw_UpdateClientData_Post(idsendweaponscd_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_handleCD_flNextAttackhalflife_time() + 0.001 ); 
    }

    return 
FMRES_HANDLED
}

// Fire gremade
public FireArrow(id)
{
    
// Set animation
    
playanim(idanim_shot1)

    
// Get origin. angle and velocity
    
new velocity[33]
    new 
Float:fAngle[3], Float:fVelocity[3]
    
pev(idpev_v_anglefAngle)
    
    
// Create ent
    
new arrow create_entity("info_target")
    
    
// Not grenade
    
if (!arrow) return PLUGIN_HANDLED

    
// Classname
    
entity_set_string(arrowEV_SZ_classname"bow_arrow")
    
    
// Model
    
entity_set_model(arrowARROW_MODEL)

    if(
g_bow_mode[id] == NORMAL_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell255255255kRenderNormal50)
        
g_normal_ammo[id]--
    }
    else if(
g_bow_mode[id] == FIRE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell25500kRenderNormal50)
        
g_fire_ammo[id]--
    }
    else if(
g_bow_mode[id] == ICE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell00255kRenderNormal50)
        
g_ice_ammo[id]--
    }
    else if(
g_bow_mode[id] == EXPLODE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell1501050kRenderNormal50)
        
g_explode_ammo[id]--
    }

    
update_ammo(id)

    new 
Float:vOrigin[3],Float:vUp[3]
    
pev(idpev_originvOrigin)
    
    
global_get(glb_v_upvUp)
    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(arrowvOrigin)
    
    
// Angles
    
entity_set_vector(arrowEV_VEC_anglesfAngle)
    
    
// Size
    
new Float:MinBox[3] = {-1.0, -1.0, -1.0}
    new 
Float:MaxBox[3] = {1.01.01.0}
    
entity_set_vector(arrowEV_VEC_minsMinBox)
    
entity_set_vector(arrowEV_VEC_maxsMaxBox)
    
    
// Interaction
    
entity_set_int(arrowEV_INT_solidSOLID_SLIDEBOX)
    
    
// Movetype
    
entity_set_int(arrowEV_INT_movetypeMOVETYPE_TOSS)
    
    
// Owner
    
entity_set_edict(arrowEV_ENT_ownerid)
    
    
// Velocity
    
new Floatholdtime[33
    new 
Floatmnoji[33]

    
holdtime[id] = g_finish_time[id] - g_start_time[id]

    if(
holdtime[id] < 1.0holdtime[id] = 1.0
    
if(holdtime[id] > 3.0holdtime[id] = 3.0

    
    mnoji
[id] = BASE_SPEED holdtime[id] * BONUS_SPEED
    velocity
[id] = floatround(mnoji[id],floatround_round)
    
VelocityByAim(idvelocity[id], fVelocity)
    
    
entity_set_vector(arrowEV_VEC_velocityfVelocity)
    
    
// Launch sound
    
emit_sound(arrowCHAN_WEAPONARROW_SHOOTVOL_NORMATTN_NORM0PITCH_NORM)

    return 
PLUGIN_CONTINUE
}    

// We hit something!!!
public pfn_touch(ptrptd)
{
    
// If ent is valid
    
if (pev_valid(ptr))
    {    
        
// Get classnames
        
static classname[32], classnameptd[32]
        
pev(ptrpev_classnameclassname31)
        
        
// Our ent
        
if(equal(classname"bow_arrow"))
        {
            
// Get it's origin
            
new Float:Origin[3]
            
pev(ptrpev_originOrigin)

            new 
owner pev(ptrpev_owner)

            if(
g_bow_mode[owner] == EXPLODE_MODE)
            {
                
// Explosion
                
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYOrigin0)
                
write_byte(TE_EXPLOSION)
                
engfunc(EngFunc_WriteCoordOrigin[0])
                
engfunc(EngFunc_WriteCoordOrigin[1])
                
engfunc(EngFunc_WriteCoordOrigin[2])
                
write_short(g_exp_sprid)
                
write_byte(40)
                
write_byte(30)
                
write_byte(0)
                
message_end()

                
check_radius_damage(ptrowner)
            }

            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_TakeDamageptdptrownerNORMAL_DMGDMG_BULLET)
                    }
                    else if(
g_bow_mode[owner] == FIRE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {
                                                                
g_dmg_mode[ptd] = dmg_fire
                                 CreateBurn
(ptdowner)
                            }
                        
                    }
                    else if(
g_bow_mode[owner] == ICE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {

                            
g_FrozenRenderingFx[ptd] = pev(ptdpev_renderfx)
                            
pev(ptdpev_rendercolorg_FrozenRenderingColor[ptd])
                            
g_FrozenRenderingRender[ptd] = pev(ptdpev_rendermode)
                            
pev(ptdpev_renderamtg_FrozenRenderingAmount[ptd])

                            
set_user_rendering(ptdkRenderFxGlowShell0100200kRenderNormal25)
                            
set_user_maxspeed(ptdget_user_maxspeed(ptd) * SPEED_LOW_ICE)
                            
g_slowed[ptd] = true
                            set_task
(SLOW_ICE_TIME"make_speed"ptd__"a"1)
                
                            
message_begin(MSG_ONE_UNRELIABLEg_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()
                        }
                                             }
                }
            }
            
// We hit breakable
            
if(pev_valid(ptd))
            {
                
pev(ptdpev_classnameclassnameptd31)
                if (
equali(classnameptd"func_breakable"))
                {
                    
// Destroy it
                    //force_use(ptr,ptd)
                
}
            }
            
set_pev(ptrpev_flagsFL_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 && id 34
                {
                    if(
allowed_toucher(id))
                    {
                        
// Pick up weapon
                        //give_weapon(id)
                        
remove_entity(ptr)
                    }
                }
            }
        }
    }
}    

public 
CreateBurn(idattacker)
{
    if(
g_Burn[id])
        return

    if(
g_dmg_mode[id] == dmg_fire)
    {
        new 
ent=CreateAnimationSprite(attackerBURN_CLASSNAMEBURN_MODEL1.010.0)
    
        
set_pev(entpev_solidSOLID_NOT)
        
set_pev(entpev_movetypeMOVETYPE_FOLLOW)
    
        
set_pev(entpev_aimentid)
    
        
set_pev(entpev_fuser2get_gametime()+BURN_LIFE)
    
        
g_Burn[id]=get_gametime()+BURN_PERIOD
    
}
}

public 
BurnThink(ent)
{
    if(!
pev_valid(ent))
        return
        
    static 
Float:lifeaim_ent
    
    pev
(ent,pev_fuser2life)
    
    
aim_ent=pev(entpev_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_TakeDamageaim_ent ent ,pev(entpev_owner), BURN_DAMAGEDMG_BURN)
        
            
g_Burn[aim_ent]=get_gametime()+BURN_PERIOD
        
}
    }
}


public 
make_speed(id)
{
    if(
is_user_alive(id) && g_slowed[id])
    {
        
g_slowed[id] = false
        set_user_maxspeed
(idg_old_speed[id])
        
fm_set_rendering_float(idg_FrozenRenderingFx[id], g_FrozenRenderingColor[id], g_FrozenRenderingRender[id], g_FrozenRenderingAmount[id])
    }
}

public 
check_radius_damage(entattacker)
{
    for(new 
0g_MaxPlayersi++)
    {
        if(!
is_user_alive(i))
            continue
        if(
cs_get_user_team(attacker) == cs_get_user_team(i))
            continue
        if(
entity_range(enti) > EXPLODE_HITRADIUS)
            continue
            
        
Do_TakeDamage(entiattackercan_see_fm(enti))
    }
}

public 
Do_TakeDamage(EntVictimAttackercan_see)
{
    static 
Float:DamageFloat:CurrentDis
    
    CurrentDis 
entity_range(EntVictim)
    
Damage EXPLODE_DAMAGE - ((CurrentDis EXPLODE_HITRADIUS) * EXPLODE_DAMAGE)
    
    if(
Damage 0)
    {
        static 
WeaponEnt
        WeaponEnt 
fm_get_user_weapon_entity(AttackerCSW_HEGRENADE)
        
        if(!
pev_valid(WeaponEnt))
            
WeaponEnt 0

        
if(!can_see)
            
Damage /= 2
            
        ExecuteHamB
(Ham_TakeDamageVictimWeaponEntAttackerDamageDMG_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] == EXPLODE_MODE)
    {
        
g_ammo[id] = g_explode_ammo[id]
    }
    
    static 
weapon_entweapon_ent fm_find_ent_by_owner(-1"weapon_scout"id)
    if(
pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent1)    
    
    
cs_set_user_bpammo(idCSW_SCOUTg_ammo[id])
    
    
engfunc(EngFunc_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, 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_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, id)
    
write_byte(1)
    
write_byte(CSW_SCOUT)
    
write_byte(-1)
    
message_end()
}

// Allowed toucher
stock allowed_toucher(player)
{
    if (
g_HasBow[player])
        return 
false
    
    
return true
}
 

stock CreateAnimationSprite(owner, const classname[], const model[], Float:scaleFloat:framerate)
{
    new 
ent=fm_create_entity("env_sprite")

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_modelmodel)

    
dllfunc(DLLFunc_Spawnent)

    
set_pev(entpev_classnameclassname)
    
set_pev(entpev_ownerowner)

    
fm_entity_set_model(entmodel)
    
fm_set_rendering(entkRenderFxNoDissipation255255255kRenderGlow255)

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_scalescale)

    return 
ent
}

public 
can_see_fm(entindex1entindex2)
{
    if (!
entindex1 || !entindex2)
        return 
false

    
if (pev_valid(entindex1) && pev_valid(entindex1))
    {
        new 
flags pev(entindex1pev_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(entindex1pev_originlookerOrig)
        
pev(entindex1pev_view_ofstemp)
        
lookerOrig[0] += temp[0]
        
lookerOrig[1] += temp[1]
        
lookerOrig[2] += temp[2]

        
pev(entindex2pev_origintargetBaseOrig)
        
pev(entindex2pev_view_ofstemp)
        
targetOrig[0] = targetBaseOrig [0] + temp[0]
        
targetOrig[1] = targetBaseOrig [1] + temp[1]
        
targetOrig[2] = targetBaseOrig [2] + temp[2]

        
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the had of seen player
        
if (get_tr2(0TraceResult:TR_InOpen) && get_tr2(0TraceResult:TR_InWater))
        {
            return 
0
        

        else 
        {
            new 
Float:flFraction
            get_tr2
(0TraceResult:TR_flFractionflFraction)
            if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
            {
                return 
1
            
}
            else
            {
                
targetOrig[0] = targetBaseOrig [0]
                
targetOrig[1] = targetBaseOrig [1]
                
targetOrig[2] = targetBaseOrig [2]
                
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the body of seen player
                
get_tr2(0TraceResult:TR_flFractionflFraction)
                if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                {
                    return 
1
                
}
                else
                {
                    
targetOrig[0] = targetBaseOrig [0]
                    
targetOrig[1] = targetBaseOrig [1]
                    
targetOrig[2] = targetBaseOrig [2] - 17.0
                    engfunc
(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the legs of seen player
                    
get_tr2(0TraceResult:TR_flFractionflFraction)
                    if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                    {
                        return 
1
                    
}
                }
            }
        }
    }
    return 
0
}

stock fm_set_rendering_float(entityfx kRenderFxNoneFloat:color[3], render kRenderNormalFloat:amount 16.0)
{
    
set_pev(entitypev_renderfxfx)
    
set_pev(entitypev_rendercolorcolor)
    
set_pev(entitypev_rendermoderender)
    
set_pev(entitypev_renderamtamount)
}

stock DropWeaponSlotiPlayeriSlot 

    new 
iWeaponEntity GetWeaponFromSlotiPlayeriSlot ); 
    if( 
iWeaponEntity 
    { 
        new 
iWeaponID get_pdata_cbaseiWeaponEntitym_iId); 
         
        new 
szWeaponName32 ]; 
        
get_weaponnameiWeaponIDszWeaponNamecharsmaxszWeaponName ) ); 
         
        
engclient_cmdiPlayer"drop"szWeaponName ); 
    } 


stock GetWeaponFromSlotiPlayeriSlot 

    return ( 
<= iSlot <= ) ? get_pdata_cbaseiPlayerm_rpgPlayerItems_Slot0 iSlot) : -1
}

/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ fbidis\\ ansi\\ ansicpg1252\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset0 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ ltrpar\\ lang1065\\ f0\\ fs16 \n\\ par }
*/ 
__________________
Check my original plugins for cs 1.6 and subscribe on channel
Look at the video below to see blind grenade for zombies

https://www.youtube.com/watch?v=ORC7ZmoaipQ

Look at the video below to see Zombie Hide And Seek mode

https://www.youtube.com/watch?v=xpyYb65EgGs

Last edited by Krtola; 07-06-2019 at 08:26.
Krtola is offline
Send a message via Skype™ to Krtola
LearninG
Senior Member
Join Date: Apr 2019
Location: Iran
Old 07-06-2019 , 08:09   Re: Bow v 1.2 bug/issue
Reply With Quote #15

Quote:
Originally Posted by Krtola View Post
Test this, and tell me how work now. To see what I add search
PHP Code:
//Krtola Stuff 
in code.
PHP Code:
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <zombieplague>

#if AMXX_VERSION_NUM < 183
#include <colorchat>
#define Red print_team_red
#define Blue print_team_blue
#define Grey print_team_grey
#define DontChange print_team_default
#endif

// Weapon/Arrow models
new const P_MODEL[] = "models/bow/p_Shina_by_Oxigen.mdl"
new const V_MODEL[] = "models/bow/v_Shina_by_Oxigen.mdl"
new const W_MODEL[] = "models/bow/w_Shina_by_Oxigen.mdl"
new const ARROW_MODEL[] = "models/bow/arrow.mdl"

#define BURN_CLASSNAME "flame"
#define BURN_MODEL "sprites/bow/flame_burn01.spr"
#define POISON_MODEL "sprites/bow/poison.spr"

#define m_rpgPlayerItems_Slot0 367 
#define m_iId 43

// Settings
#define SWITCH_TIME    0.5

#define BASE_SPEED 400
#define BONUS_SPEED 500

#define BURN_LIFE 10.0
#define BURN_PERIOD 2.0
#define BURN_DAMAGE 100.0


#define NORMAL_DMG 250.0

#define SPEED_LOW_ICE 0.5
#define SLOW_ICE_TIME 5.0

#define EXPLODE_DAMAGE 1500
#define EXPLODE_HITRADIUS 600

// Base number of arrows
#define NORMAL_AMMO 20
#define FIRE_AMMO 15
#define ICE_AMMO 10
#define EXPLODE_AMMO 3

//Number of extra arrows
#define NORMAL_AMMO_BUY 5
#define FIRE_AMMO_BUY 4
#define ICE_AMMO_BUY 3
#define EXPLODE_AMMO_BUY 1

// Cost of extra arrows
#define AMMO_COST 10
#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_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_MsgDamageg_msgBarTime

enum 
{
    
anim_idle,
    
anim_shot1,
    
anim_shot2,
    
anim_reload,
    
anim_draw
}

enum
{
    
NORMAL_MODE 1,
    
FIRE_MODE 4,
    
ICE_MODE 3,
    
EXPLODE_MODE 2
}

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")
}

// ITEM
new g_itemid

//Krtola Stuff
const Floatg_fCooldown 3.0
new Floatg_fLastDamage[33]
#define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
#define WEAPON_KEY 5444552332
#define WEAPON_OLD "weapon_scout"
#define m_rgpPlayerItems_CWeaponBox 34
#define WEAPON_BODY 0
new g_AllocString_E

public plugin_init()
{
    
// Register plugin
    
register_plugin("PLUGIN""VERSION""AUTHOR")
    
    
// 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")

    
g_itemid zp_register_extra_item("Magical Bow",6ZP_TEAM_HUMAN)

    
g_MaxPlayers get_maxplayers()

        
//Krtola Stuff
        
RegisterHam(Ham_Item_AddToPlayerWEAPON_OLD"fw_Item_AddToPlayer_Post"1)
        
register_forward(FM_SetModel"fw_SetModel")
        
g_AllocString_E engfunc(EngFunc_AllocStringWEAPON_OLD)
}

//Krtola Stuff
public fw_Item_AddToPlayer_Post(iItemiPlayer
{
    switch(
pev(iItempev_impulse)) 
        {
        case 
WEAPON_KEYg_HasBow[iPlayer] = 1
                                 

        
case 0g_HasBow[iPlayer] = 0
    
}    
}

public 
fw_SetModel(iEnt
{
    static 
iszClassname[32], iItem
    
pev(iEntpev_classnameszClassname31);
    if(!
equal(szClassname"weaponbox")) return FMRES_IGNORED;
    for(
06i++) {
        
iItem get_pdata_cbase(iEntm_rgpPlayerItems_CWeaponBox i4);
        if(
iItem && CustomItem(iItem)) {
            
            
set_pev(iEntpev_bodyWEAPON_BODY)
                        
g_HasBow[i] = 0
            
return FMRES_SUPERCEDE;
        }
    }
    return 
FMRES_IGNORED;
}

public 
zp_user_infected_post(id)
{
    if(
g_HasBow[id])
    {
                
g_HasBow[id] = 0
    
}
}
//End of Krtola Stuff

public zp_extra_item_selected(playeritemid)
{
    if (
itemid == g_itemid || is_user_alive(player))
    {
        
give_bow(player)
    }
    return 
PLUGIN_CONTINUE
}

public 
Event_NewRound()
{
    for (new 
0get_maxplayers(); i++)
        {
        
set_user_rendering(ikRenderFxGlowShell000kRenderNormal25)
        
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(id64Aim)
        
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 
0;number ;i++) { 
        if (
wpnList[i] == CSW_SCOUT) {
            
fm_strip_user_gun(idwpnList[i])
        }
    }


//play anim
public playanim(player,anim)
{
    
set_pev(playerpev_weaponanimanim)
    
message_begin(MSG_ONESVC_WEAPONANIM, {000}, player)
    
write_byte(anim)
    
write_byte(pev(playerpev_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 (!
g_HasBow[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(idanim_draw)
                
update_ammo(id)
                
//emit_sound(id, CHAN_WEAPON, GRENADE_DRAW, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
                // View model
                
entity_set_string(idEV_SZ_viewmodelV_MODEL)
                
                
// Player model
                
entity_set_string(idEV_SZ_weaponmodelP_MODEL)
                
draw_wpn[id] = true
            
}
        }
        else
        {
            
// View model
            
entity_set_string(idEV_SZ_viewmodel"models/v_scout.mdl")
            
            
// Player model
            
entity_set_string(idEV_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(victimattackershouldgib)
{
    if (
g_HasBow[victim])        
    {
        
// Reset all
        
g_HasBow[victim] = false
        set_user_rendering
(victimkRenderFxGlowShell000kRenderNormal25)

        
// Remove screen's bar
        
message_begin(MSG_ONEg_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_explode_ammo
[id] = EXPLODE_AMMO
}

//give weapon
public give_weapon(id){
    
g_HasBow[id] = true
    
//DropWeaponSlot(id, 1)
    
give_item(id"weapon_scout")
    
update_ammo(id)

        
//Krtola Stuff
        
static iEntiEnt engfunc(EngFunc_CreateNamedEntityg_AllocString_E);
    
set_pev(iEntpev_impulseWEAPON_KEY);
    
}

public 
fw_bow_PrimaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_SecondaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Reload(Weapon
{
         new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Deploy_Post(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    
update_ammo(Player)
}

// Command start
public fw_CmdStart(idUC_HandleSeed
{
    if(!
g_HasBow[id] || !is_user_alive(id))
        return 
FMRES_IGNORED

    
static CurButtonOldButton
    
    CurButton 
get_uc(UC_HandleUC_Buttons)
    
OldButton = (pev(idpev_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] == 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_UNRELIABLEg_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] == 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_ONEg_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] == 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_ONEg_msgBarTime_id)
            
write_byte(0// time
            
write_byte(0// unknown
            
message_end()

            
g_pressed[id] = false
        
}
    }

    if((
CurButton IN_ATTACK2) && !(pev(idpev_oldbuttons) & IN_ATTACK2))
    {        
        if(
get_user_weapon(id) != CSW_SCOUT)
        return 
FMRES_IGNORED
            
if(g_fLastDamage[id] < get_gametime() - g_fCooldown)
        {                    

        if(!
g_pressed[id])
        {
                if(
is_user_alive(id))

            switch(
g_bow_mode[id])
            {
                case 
1:
                {
                    
g_bow_mode[id]= 4
                    client_print
(id,print_center,"Fire Mode")
                    
update_ammo(id)
                    
                }
                case 
2:
                {
                    
g_bow_mode[id]= 1
                    client_print
(id,print_center,"Normal Mode")
                    
update_ammo(id)
                    
                    
                }
                case 
3:
                {
                    
g_bow_mode[id]= 2
                    client_print
(id,print_center,"Explode Mode")
                    
update_ammo(id)
                    
                }
                case 
4:
                {
                    
g_bow_mode[id]= 3
                    client_print
(id,print_center,"Ice Mode")
                    
update_ammo(id)
                }
                                
            }
                        
g_fLastDamage[id] = get_gametime()
        }
            }
    } 
        return 
FMRES_IGNORED       
}

//block anim standart wpn 
public fw_UpdateClientData_Post(idsendweaponscd_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_handleCD_flNextAttackhalflife_time() + 0.001 ); 
    }

    return 
FMRES_HANDLED
}

// Fire gremade
public FireArrow(id)
{
    
// Set animation
    
playanim(idanim_shot1)

    
// Get origin. angle and velocity
    
new velocity[33]
    new 
Float:fAngle[3], Float:fVelocity[3]
    
pev(idpev_v_anglefAngle)
    
    
// Create ent
    
new arrow create_entity("info_target")
    
    
// Not grenade
    
if (!arrow) return PLUGIN_HANDLED

    
// Classname
    
entity_set_string(arrowEV_SZ_classname"bow_arrow")
    
    
// Model
    
entity_set_model(arrowARROW_MODEL)

    if(
g_bow_mode[id] == NORMAL_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell255255255kRenderNormal50)
        
g_normal_ammo[id]--
    }
    else if(
g_bow_mode[id] == FIRE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell25500kRenderNormal50)
        
g_fire_ammo[id]--
    }
    else if(
g_bow_mode[id] == ICE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell00255kRenderNormal50)
        
g_ice_ammo[id]--
    }
    else if(
g_bow_mode[id] == EXPLODE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell1501050kRenderNormal50)
        
g_explode_ammo[id]--
    }

    
update_ammo(id)

    new 
Float:vOrigin[3],Float:vUp[3]
    
pev(idpev_originvOrigin)
    
    
global_get(glb_v_upvUp)
    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(arrowvOrigin)
    
    
// Angles
    
entity_set_vector(arrowEV_VEC_anglesfAngle)
    
    
// Size
    
new Float:MinBox[3] = {-1.0, -1.0, -1.0}
    new 
Float:MaxBox[3] = {1.01.01.0}
    
entity_set_vector(arrowEV_VEC_minsMinBox)
    
entity_set_vector(arrowEV_VEC_maxsMaxBox)
    
    
// Interaction
    
entity_set_int(arrowEV_INT_solidSOLID_SLIDEBOX)
    
    
// Movetype
    
entity_set_int(arrowEV_INT_movetypeMOVETYPE_TOSS)
    
    
// Owner
    
entity_set_edict(arrowEV_ENT_ownerid)
    
    
// Velocity
    
new Floatholdtime[33
    new 
Floatmnoji[33]

    
holdtime[id] = g_finish_time[id] - g_start_time[id]

    if(
holdtime[id] < 1.0holdtime[id] = 1.0
    
if(holdtime[id] > 3.0holdtime[id] = 3.0

    
    mnoji
[id] = BASE_SPEED holdtime[id] * BONUS_SPEED
    velocity
[id] = floatround(mnoji[id],floatround_round)
    
VelocityByAim(idvelocity[id], fVelocity)
    
    
entity_set_vector(arrowEV_VEC_velocityfVelocity)
    
    
// Launch sound
    
emit_sound(arrowCHAN_WEAPONARROW_SHOOTVOL_NORMATTN_NORM0PITCH_NORM)

    return 
PLUGIN_CONTINUE
}    

// We hit something!!!
public pfn_touch(ptrptd)
{
    
// If ent is valid
    
if (pev_valid(ptr))
    {    
        
// Get classnames
        
static classname[32], classnameptd[32]
        
pev(ptrpev_classnameclassname31)
        
        
// Our ent
        
if(equal(classname"bow_arrow"))
        {
            
// Get it's origin
            
new Float:Origin[3]
            
pev(ptrpev_originOrigin)

            new 
owner pev(ptrpev_owner)

            if(
g_bow_mode[owner] == EXPLODE_MODE)
            {
                
// Explosion
                
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYOrigin0)
                
write_byte(TE_EXPLOSION)
                
engfunc(EngFunc_WriteCoordOrigin[0])
                
engfunc(EngFunc_WriteCoordOrigin[1])
                
engfunc(EngFunc_WriteCoordOrigin[2])
                
write_short(g_exp_sprid)
                
write_byte(40)
                
write_byte(30)
                
write_byte(0)
                
message_end()

                
check_radius_damage(ptrowner)
            }

            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_TakeDamageptdptrownerNORMAL_DMGDMG_BULLET)
                    }
                    else if(
g_bow_mode[owner] == FIRE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {
                                                                
g_dmg_mode[ptd] = dmg_fire
                                 CreateBurn
(ptdowner)
                            }
                        
                    }
                    else if(
g_bow_mode[owner] == ICE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {

                            
g_FrozenRenderingFx[ptd] = pev(ptdpev_renderfx)
                            
pev(ptdpev_rendercolorg_FrozenRenderingColor[ptd])
                            
g_FrozenRenderingRender[ptd] = pev(ptdpev_rendermode)
                            
pev(ptdpev_renderamtg_FrozenRenderingAmount[ptd])

                            
set_user_rendering(ptdkRenderFxGlowShell0100200kRenderNormal25)
                            
set_user_maxspeed(ptdget_user_maxspeed(ptd) * SPEED_LOW_ICE)
                            
g_slowed[ptd] = true
                            set_task
(SLOW_ICE_TIME"make_speed"ptd__"a"1)
                
                            
message_begin(MSG_ONE_UNRELIABLEg_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()
                        }
                                             }
                }
            }
            
// We hit breakable
            
if(pev_valid(ptd))
            {
                
pev(ptdpev_classnameclassnameptd31)
                if (
equali(classnameptd"func_breakable"))
                {
                    
// Destroy it
                    //force_use(ptr,ptd)
                
}
            }
            
set_pev(ptrpev_flagsFL_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 && id 34
                {
                    if(
allowed_toucher(id))
                    {
                        
// Pick up weapon
                        //give_weapon(id)
                        
remove_entity(ptr)
                    }
                }
            }
        }
    }
}    

public 
CreateBurn(idattacker)
{
    if(
g_Burn[id])
        return

    if(
g_dmg_mode[id] == dmg_fire)
    {
        new 
ent=CreateAnimationSprite(attackerBURN_CLASSNAMEBURN_MODEL1.010.0)
    
        
set_pev(entpev_solidSOLID_NOT)
        
set_pev(entpev_movetypeMOVETYPE_FOLLOW)
    
        
set_pev(entpev_aimentid)
    
        
set_pev(entpev_fuser2get_gametime()+BURN_LIFE)
    
        
g_Burn[id]=get_gametime()+BURN_PERIOD
    
}
}

public 
BurnThink(ent)
{
    if(!
pev_valid(ent))
        return
        
    static 
Float:lifeaim_ent
    
    pev
(ent,pev_fuser2life)
    
    
aim_ent=pev(entpev_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_TakeDamageaim_ent ent ,pev(entpev_owner), BURN_DAMAGEDMG_BURN)
        
            
g_Burn[aim_ent]=get_gametime()+BURN_PERIOD
        
}
    }
}


public 
make_speed(id)
{
    if(
is_user_alive(id) && g_slowed[id])
    {
        
g_slowed[id] = false
        set_user_maxspeed
(idg_old_speed[id])
        
fm_set_rendering_float(idg_FrozenRenderingFx[id], g_FrozenRenderingColor[id], g_FrozenRenderingRender[id], g_FrozenRenderingAmount[id])
    }
}

public 
check_radius_damage(entattacker)
{
    for(new 
0g_MaxPlayersi++)
    {
        if(!
is_user_alive(i))
            continue
        if(
cs_get_user_team(attacker) == cs_get_user_team(i))
            continue
        if(
entity_range(enti) > EXPLODE_HITRADIUS)
            continue
            
        
Do_TakeDamage(entiattackercan_see_fm(enti))
    }
}

public 
Do_TakeDamage(EntVictimAttackercan_see)
{
    static 
Float:DamageFloat:CurrentDis
    
    CurrentDis 
entity_range(EntVictim)
    
Damage EXPLODE_DAMAGE - ((CurrentDis EXPLODE_HITRADIUS) * EXPLODE_DAMAGE)
    
    if(
Damage 0)
    {
        static 
WeaponEnt
        WeaponEnt 
fm_get_user_weapon_entity(AttackerCSW_HEGRENADE)
        
        if(!
pev_valid(WeaponEnt))
            
WeaponEnt 0

        
if(!can_see)
            
Damage /= 2
            
        ExecuteHamB
(Ham_TakeDamageVictimWeaponEntAttackerDamageDMG_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] == EXPLODE_MODE)
    {
        
g_ammo[id] = g_explode_ammo[id]
    }
    
    static 
weapon_entweapon_ent fm_find_ent_by_owner(-1"weapon_scout"id)
    if(
pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent1)    
    
    
cs_set_user_bpammo(idCSW_SCOUTg_ammo[id])
    
    
engfunc(EngFunc_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, 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_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, id)
    
write_byte(1)
    
write_byte(CSW_SCOUT)
    
write_byte(-1)
    
message_end()
}

// Allowed toucher
stock allowed_toucher(player)
{
    if (
g_HasBow[player])
        return 
false
    
    
return true
}
 

stock CreateAnimationSprite(owner, const classname[], const model[], Float:scaleFloat:framerate)
{
    new 
ent=fm_create_entity("env_sprite")

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_modelmodel)

    
dllfunc(DLLFunc_Spawnent)

    
set_pev(entpev_classnameclassname)
    
set_pev(entpev_ownerowner)

    
fm_entity_set_model(entmodel)
    
fm_set_rendering(entkRenderFxNoDissipation255255255kRenderGlow255)

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_scalescale)

    return 
ent
}

public 
can_see_fm(entindex1entindex2)
{
    if (!
entindex1 || !entindex2)
        return 
false

    
if (pev_valid(entindex1) && pev_valid(entindex1))
    {
        new 
flags pev(entindex1pev_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(entindex1pev_originlookerOrig)
        
pev(entindex1pev_view_ofstemp)
        
lookerOrig[0] += temp[0]
        
lookerOrig[1] += temp[1]
        
lookerOrig[2] += temp[2]

        
pev(entindex2pev_origintargetBaseOrig)
        
pev(entindex2pev_view_ofstemp)
        
targetOrig[0] = targetBaseOrig [0] + temp[0]
        
targetOrig[1] = targetBaseOrig [1] + temp[1]
        
targetOrig[2] = targetBaseOrig [2] + temp[2]

        
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the had of seen player
        
if (get_tr2(0TraceResult:TR_InOpen) && get_tr2(0TraceResult:TR_InWater))
        {
            return 
0
        

        else 
        {
            new 
Float:flFraction
            get_tr2
(0TraceResult:TR_flFractionflFraction)
            if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
            {
                return 
1
            
}
            else
            {
                
targetOrig[0] = targetBaseOrig [0]
                
targetOrig[1] = targetBaseOrig [1]
                
targetOrig[2] = targetBaseOrig [2]
                
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the body of seen player
                
get_tr2(0TraceResult:TR_flFractionflFraction)
                if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                {
                    return 
1
                
}
                else
                {
                    
targetOrig[0] = targetBaseOrig [0]
                    
targetOrig[1] = targetBaseOrig [1]
                    
targetOrig[2] = targetBaseOrig [2] - 17.0
                    engfunc
(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the legs of seen player
                    
get_tr2(0TraceResult:TR_flFractionflFraction)
                    if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                    {
                        return 
1
                    
}
                }
            }
        }
    }
    return 
0
}

stock fm_set_rendering_float(entityfx kRenderFxNoneFloat:color[3], render kRenderNormalFloat:amount 16.0)
{
    
set_pev(entitypev_renderfxfx)
    
set_pev(entitypev_rendercolorcolor)
    
set_pev(entitypev_rendermoderender)
    
set_pev(entitypev_renderamtamount)
}

stock DropWeaponSlotiPlayeriSlot 

    new 
iWeaponEntity GetWeaponFromSlotiPlayeriSlot ); 
    if( 
iWeaponEntity 
    { 
        new 
iWeaponID get_pdata_cbaseiWeaponEntitym_iId); 
         
        new 
szWeaponName32 ]; 
        
get_weaponnameiWeaponIDszWeaponNamecharsmaxszWeaponName ) ); 
         
        
engclient_cmdiPlayer"drop"szWeaponName ); 
    } 


stock GetWeaponFromSlotiPlayeriSlot 

    return ( 
<= iSlot <= ) ? get_pdata_cbaseiPlayerm_rpgPlayerItems_Slot0 iSlot) : -1
}

/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ fbidis\\ ansi\\ ansicpg1252\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset0 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ ltrpar\\ lang1065\\ f0\\ fs16 \n\\ par }
*/ 
when i'm buying BoW from extra items server crashes.
Fatal error-Dedicated server :
Spawned a NULL entity
also real scout weapon has 1 bullet.
LearninG is offline
Krtola
Veteran Member
Join Date: Oct 2013
Location: Serbia
Old 07-06-2019 , 08:27   Re: Bow v 1.2 bug/issue
Reply With Quote #16

Try now after update ( copy code from my past post ).
__________________
Check my original plugins for cs 1.6 and subscribe on channel
Look at the video below to see blind grenade for zombies

https://www.youtube.com/watch?v=ORC7ZmoaipQ

Look at the video below to see Zombie Hide And Seek mode

https://www.youtube.com/watch?v=xpyYb65EgGs
Krtola is offline
Send a message via Skype™ to Krtola
LearninG
Senior Member
Join Date: Apr 2019
Location: Iran
Old 07-06-2019 , 08:32   Re: Bow v 1.2 bug/issue
Reply With Quote #17

Quote:
Originally Posted by Krtola View Post
Try now after update ( copy code from my past post ).
same error and 1 bullet scout
LearninG is offline
Krtola
Veteran Member
Join Date: Oct 2013
Location: Serbia
Old 07-06-2019 , 08:54   Re: Bow v 1.2 bug/issue
Reply With Quote #18

Thsi will work Im sure

PHP Code:
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <zombieplague>

#if AMXX_VERSION_NUM < 183
#include <colorchat>
#define Red print_team_red
#define Blue print_team_blue
#define Grey print_team_grey
#define DontChange print_team_default
#endif

// Weapon/Arrow models
new const P_MODEL[] = "models/bow/p_Shina_by_Oxigen.mdl"
new const V_MODEL[] = "models/bow/v_Shina_by_Oxigen.mdl"
new const W_MODEL[] = "models/bow/w_Shina_by_Oxigen.mdl"
new const ARROW_MODEL[] = "models/bow/arrow.mdl"

#define BURN_CLASSNAME "flame"
#define BURN_MODEL "sprites/bow/flame_burn01.spr"
#define POISON_MODEL "sprites/bow/poison.spr"

#define m_rpgPlayerItems_Slot0 367 
#define m_iId 43

// Settings
#define SWITCH_TIME    0.5

#define BASE_SPEED 400
#define BONUS_SPEED 500

#define BURN_LIFE 10.0
#define BURN_PERIOD 2.0
#define BURN_DAMAGE 100.0


#define NORMAL_DMG 250.0

#define SPEED_LOW_ICE 0.5
#define SLOW_ICE_TIME 5.0

#define EXPLODE_DAMAGE 1500
#define EXPLODE_HITRADIUS 600

// Base number of arrows
#define NORMAL_AMMO 20
#define FIRE_AMMO 15
#define ICE_AMMO 10
#define EXPLODE_AMMO 3

//Number of extra arrows
#define NORMAL_AMMO_BUY 5
#define FIRE_AMMO_BUY 4
#define ICE_AMMO_BUY 3
#define EXPLODE_AMMO_BUY 1

// Cost of extra arrows
#define AMMO_COST 10
#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_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_MsgDamageg_msgBarTime

enum 
{
    
anim_idle,
    
anim_shot1,
    
anim_shot2,
    
anim_reload,
    
anim_draw
}

enum
{
    
NORMAL_MODE 1,
    
FIRE_MODE 4,
    
ICE_MODE 3,
    
EXPLODE_MODE 2
}

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")
}

// ITEM
new g_itemid

//Krtola Stuff
const Floatg_fCooldown 3.0
new Floatg_fLastDamage[33]
#define BOW_WEAPONKEY 5444552332
#define WEAPON_OLD "weapon_scout"
#define EV_INT_WEAPONKEY EV_INT_impulse
#define ENG_NULLENT -1

public plugin_init()
{
    
// Register plugin
    
register_plugin("PLUGIN""VERSION""AUTHOR")
    
    
// 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")

    
g_itemid zp_register_extra_item("Magical Bow",6ZP_TEAM_HUMAN)

    
g_MaxPlayers get_maxplayers()

        
//Krtola Stuff
        
RegisterHam(Ham_Item_AddToPlayerWEAPON_OLD"fw_Item_AddToPlayer_Post"1)
        
register_forward(FM_SetModel"fw_SetModel")
}

//Krtola Stuff
public fw_Item_AddToPlayer_Post(iItemiPlayer
{
    if(!
is_valid_ent(iItem) || !is_user_connected(iPlayer))
        return 
HAM_IGNORED
    
    
if(entity_get_int(iItemEV_INT_WEAPONKEY) == BOW_WEAPONKEY)
    { 
                
g_HasBow[iPlayer] = true
        
        entity_set_int
(iItemEV_INT_WEAPONKEY0)

                return 
HAM_HANDLED
        
}
        return 
HAM_IGNORED
}

public 
fw_SetModel(entitymodel[])
{
    if(!
is_valid_ent(entity))
        return 
FMRES_IGNORED
    
    
static szClassName[33]
    
entity_get_string(entityEV_SZ_classnameszClassNamecharsmax(szClassName))
        
    if(!
equal(szClassName"weaponbox"))
        return 
FMRES_IGNORED
    
    
static iOwner
    
    iOwner 
entity_get_edict(entityEV_ENT_owner)
    
    if(
equal(model"models/w_scout.mdl"))
    {
        static 
iStoredAugID
        
        iStoredAugID 
find_ent_by_owner(ENG_NULLENT"weapon_scout"entity)
    
        if(!
is_valid_ent(iStoredAugID))
            return 
FMRES_IGNORED
    
        
if(g_HasBow[iOwner])
        {
            
entity_set_int(iStoredAugIDEV_INT_WEAPONKEYBOW_WEAPONKEY)
            
            
g_HasBow[iOwner] = false
            
            
            
            
return FMRES_SUPERCEDE
        
}
    }
    return 
FMRES_IGNORED
}

public 
zp_user_infected_post(id)
{
    if(
g_HasBow[id])
    {
                
g_HasBow[id] = 0
    
}
}
//End of Krtola Stuff

public zp_extra_item_selected(playeritemid)
{
    if (
itemid == g_itemid || is_user_alive(player))
    {
        
give_bow(player)
    }
    return 
PLUGIN_CONTINUE
}

public 
Event_NewRound()
{
    for (new 
0get_maxplayers(); i++)
        {
        
set_user_rendering(ikRenderFxGlowShell000kRenderNormal25)
        
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(id64Aim)
        
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 
0;number ;i++) { 
        if (
wpnList[i] == CSW_SCOUT) {
            
fm_strip_user_gun(idwpnList[i])
        }
    }


//play anim
public playanim(player,anim)
{
    
set_pev(playerpev_weaponanimanim)
    
message_begin(MSG_ONESVC_WEAPONANIM, {000}, player)
    
write_byte(anim)
    
write_byte(pev(playerpev_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 (!
g_HasBow[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(idanim_draw)
                
update_ammo(id)
                
//emit_sound(id, CHAN_WEAPON, GRENADE_DRAW, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
                // View model
                
entity_set_string(idEV_SZ_viewmodelV_MODEL)
                
                
// Player model
                
entity_set_string(idEV_SZ_weaponmodelP_MODEL)
                
draw_wpn[id] = true
            
}
        }
        else
        {
            
// View model
            
entity_set_string(idEV_SZ_viewmodel"models/v_scout.mdl")
            
            
// Player model
            
entity_set_string(idEV_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(victimattackershouldgib)
{
    if (
g_HasBow[victim])        
    {
        
// Reset all
        
g_HasBow[victim] = false
        set_user_rendering
(victimkRenderFxGlowShell000kRenderNormal25)

        
// Remove screen's bar
        
message_begin(MSG_ONEg_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_explode_ammo
[id] = EXPLODE_AMMO
}

//give weapon
public give_weapon(id){
    
g_HasBow[id] = true
    
//DropWeaponSlot(id, 1)
    
give_item(id"weapon_scout")
    
update_ammo(id)
}

public 
fw_bow_PrimaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_SecondaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Reload(Weapon
{
         new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Deploy_Post(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    
update_ammo(Player)
}

// Command start
public fw_CmdStart(idUC_HandleSeed
{
    if(!
g_HasBow[id] || !is_user_alive(id))
        return 
FMRES_IGNORED

    
static CurButtonOldButton
    
    CurButton 
get_uc(UC_HandleUC_Buttons)
    
OldButton = (pev(idpev_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] == 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_UNRELIABLEg_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] == 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_ONEg_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] == 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_ONEg_msgBarTime_id)
            
write_byte(0// time
            
write_byte(0// unknown
            
message_end()

            
g_pressed[id] = false
        
}
    }

    if((
CurButton IN_ATTACK2) && !(pev(idpev_oldbuttons) & IN_ATTACK2))
    {        
        if(
get_user_weapon(id) != CSW_SCOUT)
        return 
FMRES_IGNORED
            
if(g_fLastDamage[id] < get_gametime() - g_fCooldown)
        {                    

        if(!
g_pressed[id])
        {
                if(
is_user_alive(id))

            switch(
g_bow_mode[id])
            {
                case 
1:
                {
                    
g_bow_mode[id]= 4
                    client_print
(id,print_center,"Fire Mode")
                    
update_ammo(id)
                    
                }
                case 
2:
                {
                    
g_bow_mode[id]= 1
                    client_print
(id,print_center,"Normal Mode")
                    
update_ammo(id)
                    
                    
                }
                case 
3:
                {
                    
g_bow_mode[id]= 2
                    client_print
(id,print_center,"Explode Mode")
                    
update_ammo(id)
                    
                }
                case 
4:
                {
                    
g_bow_mode[id]= 3
                    client_print
(id,print_center,"Ice Mode")
                    
update_ammo(id)
                }
                                
            }
                        
g_fLastDamage[id] = get_gametime()
        }
            }
    } 
        return 
FMRES_IGNORED       
}

//block anim standart wpn 
public fw_UpdateClientData_Post(idsendweaponscd_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_handleCD_flNextAttackhalflife_time() + 0.001 ); 
    }

    return 
FMRES_HANDLED
}

// Fire gremade
public FireArrow(id)
{
    
// Set animation
    
playanim(idanim_shot1)

    
// Get origin. angle and velocity
    
new velocity[33]
    new 
Float:fAngle[3], Float:fVelocity[3]
    
pev(idpev_v_anglefAngle)
    
    
// Create ent
    
new arrow create_entity("info_target")
    
    
// Not grenade
    
if (!arrow) return PLUGIN_HANDLED

    
// Classname
    
entity_set_string(arrowEV_SZ_classname"bow_arrow")
    
    
// Model
    
entity_set_model(arrowARROW_MODEL)

    if(
g_bow_mode[id] == NORMAL_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell255255255kRenderNormal50)
        
g_normal_ammo[id]--
    }
    else if(
g_bow_mode[id] == FIRE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell25500kRenderNormal50)
        
g_fire_ammo[id]--
    }
    else if(
g_bow_mode[id] == ICE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell00255kRenderNormal50)
        
g_ice_ammo[id]--
    }
    else if(
g_bow_mode[id] == EXPLODE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell1501050kRenderNormal50)
        
g_explode_ammo[id]--
    }

    
update_ammo(id)

    new 
Float:vOrigin[3],Float:vUp[3]
    
pev(idpev_originvOrigin)
    
    
global_get(glb_v_upvUp)
    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(arrowvOrigin)
    
    
// Angles
    
entity_set_vector(arrowEV_VEC_anglesfAngle)
    
    
// Size
    
new Float:MinBox[3] = {-1.0, -1.0, -1.0}
    new 
Float:MaxBox[3] = {1.01.01.0}
    
entity_set_vector(arrowEV_VEC_minsMinBox)
    
entity_set_vector(arrowEV_VEC_maxsMaxBox)
    
    
// Interaction
    
entity_set_int(arrowEV_INT_solidSOLID_SLIDEBOX)
    
    
// Movetype
    
entity_set_int(arrowEV_INT_movetypeMOVETYPE_TOSS)
    
    
// Owner
    
entity_set_edict(arrowEV_ENT_ownerid)
    
    
// Velocity
    
new Floatholdtime[33
    new 
Floatmnoji[33]

    
holdtime[id] = g_finish_time[id] - g_start_time[id]

    if(
holdtime[id] < 1.0holdtime[id] = 1.0
    
if(holdtime[id] > 3.0holdtime[id] = 3.0

    
    mnoji
[id] = BASE_SPEED holdtime[id] * BONUS_SPEED
    velocity
[id] = floatround(mnoji[id],floatround_round)
    
VelocityByAim(idvelocity[id], fVelocity)
    
    
entity_set_vector(arrowEV_VEC_velocityfVelocity)
    
    
// Launch sound
    
emit_sound(arrowCHAN_WEAPONARROW_SHOOTVOL_NORMATTN_NORM0PITCH_NORM)

    return 
PLUGIN_CONTINUE
}    

// We hit something!!!
public pfn_touch(ptrptd)
{
    
// If ent is valid
    
if (pev_valid(ptr))
    {    
        
// Get classnames
        
static classname[32], classnameptd[32]
        
pev(ptrpev_classnameclassname31)
        
        
// Our ent
        
if(equal(classname"bow_arrow"))
        {
            
// Get it's origin
            
new Float:Origin[3]
            
pev(ptrpev_originOrigin)

            new 
owner pev(ptrpev_owner)

            if(
g_bow_mode[owner] == EXPLODE_MODE)
            {
                
// Explosion
                
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYOrigin0)
                
write_byte(TE_EXPLOSION)
                
engfunc(EngFunc_WriteCoordOrigin[0])
                
engfunc(EngFunc_WriteCoordOrigin[1])
                
engfunc(EngFunc_WriteCoordOrigin[2])
                
write_short(g_exp_sprid)
                
write_byte(40)
                
write_byte(30)
                
write_byte(0)
                
message_end()

                
check_radius_damage(ptrowner)
            }

            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_TakeDamageptdptrownerNORMAL_DMGDMG_BULLET)
                    }
                    else if(
g_bow_mode[owner] == FIRE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {
                                                                
g_dmg_mode[ptd] = dmg_fire
                                 CreateBurn
(ptdowner)
                            }
                        
                    }
                    else if(
g_bow_mode[owner] == ICE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {

                            
g_FrozenRenderingFx[ptd] = pev(ptdpev_renderfx)
                            
pev(ptdpev_rendercolorg_FrozenRenderingColor[ptd])
                            
g_FrozenRenderingRender[ptd] = pev(ptdpev_rendermode)
                            
pev(ptdpev_renderamtg_FrozenRenderingAmount[ptd])

                            
set_user_rendering(ptdkRenderFxGlowShell0100200kRenderNormal25)
                            
set_user_maxspeed(ptdget_user_maxspeed(ptd) * SPEED_LOW_ICE)
                            
g_slowed[ptd] = true
                            set_task
(SLOW_ICE_TIME"make_speed"ptd__"a"1)
                
                            
message_begin(MSG_ONE_UNRELIABLEg_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()
                        }
                                             }
                }
            }
            
// We hit breakable
            
if(pev_valid(ptd))
            {
                
pev(ptdpev_classnameclassnameptd31)
                if (
equali(classnameptd"func_breakable"))
                {
                    
// Destroy it
                    //force_use(ptr,ptd)
                
}
            }
            
set_pev(ptrpev_flagsFL_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 && id 34
                {
                    if(
allowed_toucher(id))
                    {
                        
// Pick up weapon
                        //give_weapon(id)
                        
remove_entity(ptr)
                    }
                }
            }
        }
    }
}    

public 
CreateBurn(idattacker)
{
    if(
g_Burn[id])
        return

    if(
g_dmg_mode[id] == dmg_fire)
    {
        new 
ent=CreateAnimationSprite(attackerBURN_CLASSNAMEBURN_MODEL1.010.0)
    
        
set_pev(entpev_solidSOLID_NOT)
        
set_pev(entpev_movetypeMOVETYPE_FOLLOW)
    
        
set_pev(entpev_aimentid)
    
        
set_pev(entpev_fuser2get_gametime()+BURN_LIFE)
    
        
g_Burn[id]=get_gametime()+BURN_PERIOD
    
}
}

public 
BurnThink(ent)
{
    if(!
pev_valid(ent))
        return
        
    static 
Float:lifeaim_ent
    
    pev
(ent,pev_fuser2life)
    
    
aim_ent=pev(entpev_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_TakeDamageaim_ent ent ,pev(entpev_owner), BURN_DAMAGEDMG_BURN)
        
            
g_Burn[aim_ent]=get_gametime()+BURN_PERIOD
        
}
    }
}


public 
make_speed(id)
{
    if(
is_user_alive(id) && g_slowed[id])
    {
        
g_slowed[id] = false
        set_user_maxspeed
(idg_old_speed[id])
        
fm_set_rendering_float(idg_FrozenRenderingFx[id], g_FrozenRenderingColor[id], g_FrozenRenderingRender[id], g_FrozenRenderingAmount[id])
    }
}

public 
check_radius_damage(entattacker)
{
    for(new 
0g_MaxPlayersi++)
    {
        if(!
is_user_alive(i))
            continue
        if(
cs_get_user_team(attacker) == cs_get_user_team(i))
            continue
        if(
entity_range(enti) > EXPLODE_HITRADIUS)
            continue
            
        
Do_TakeDamage(entiattackercan_see_fm(enti))
    }
}

public 
Do_TakeDamage(EntVictimAttackercan_see)
{
    static 
Float:DamageFloat:CurrentDis
    
    CurrentDis 
entity_range(EntVictim)
    
Damage EXPLODE_DAMAGE - ((CurrentDis EXPLODE_HITRADIUS) * EXPLODE_DAMAGE)
    
    if(
Damage 0)
    {
        static 
WeaponEnt
        WeaponEnt 
fm_get_user_weapon_entity(AttackerCSW_HEGRENADE)
        
        if(!
pev_valid(WeaponEnt))
            
WeaponEnt 0

        
if(!can_see)
            
Damage /= 2
            
        ExecuteHamB
(Ham_TakeDamageVictimWeaponEntAttackerDamageDMG_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] == EXPLODE_MODE)
    {
        
g_ammo[id] = g_explode_ammo[id]
    }
    
    static 
weapon_entweapon_ent fm_find_ent_by_owner(-1"weapon_scout"id)
    if(
pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent1)    
    
    
cs_set_user_bpammo(idCSW_SCOUTg_ammo[id])
    
    
engfunc(EngFunc_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, 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_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, id)
    
write_byte(1)
    
write_byte(CSW_SCOUT)
    
write_byte(-1)
    
message_end()
}

// Allowed toucher
stock allowed_toucher(player)
{
    if (
g_HasBow[player])
        return 
false
    
    
return true
}
 

stock CreateAnimationSprite(owner, const classname[], const model[], Float:scaleFloat:framerate)
{
    new 
ent=fm_create_entity("env_sprite")

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_modelmodel)

    
dllfunc(DLLFunc_Spawnent)

    
set_pev(entpev_classnameclassname)
    
set_pev(entpev_ownerowner)

    
fm_entity_set_model(entmodel)
    
fm_set_rendering(entkRenderFxNoDissipation255255255kRenderGlow255)

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_scalescale)

    return 
ent
}

public 
can_see_fm(entindex1entindex2)
{
    if (!
entindex1 || !entindex2)
        return 
false

    
if (pev_valid(entindex1) && pev_valid(entindex1))
    {
        new 
flags pev(entindex1pev_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(entindex1pev_originlookerOrig)
        
pev(entindex1pev_view_ofstemp)
        
lookerOrig[0] += temp[0]
        
lookerOrig[1] += temp[1]
        
lookerOrig[2] += temp[2]

        
pev(entindex2pev_origintargetBaseOrig)
        
pev(entindex2pev_view_ofstemp)
        
targetOrig[0] = targetBaseOrig [0] + temp[0]
        
targetOrig[1] = targetBaseOrig [1] + temp[1]
        
targetOrig[2] = targetBaseOrig [2] + temp[2]

        
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the had of seen player
        
if (get_tr2(0TraceResult:TR_InOpen) && get_tr2(0TraceResult:TR_InWater))
        {
            return 
0
        

        else 
        {
            new 
Float:flFraction
            get_tr2
(0TraceResult:TR_flFractionflFraction)
            if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
            {
                return 
1
            
}
            else
            {
                
targetOrig[0] = targetBaseOrig [0]
                
targetOrig[1] = targetBaseOrig [1]
                
targetOrig[2] = targetBaseOrig [2]
                
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the body of seen player
                
get_tr2(0TraceResult:TR_flFractionflFraction)
                if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                {
                    return 
1
                
}
                else
                {
                    
targetOrig[0] = targetBaseOrig [0]
                    
targetOrig[1] = targetBaseOrig [1]
                    
targetOrig[2] = targetBaseOrig [2] - 17.0
                    engfunc
(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the legs of seen player
                    
get_tr2(0TraceResult:TR_flFractionflFraction)
                    if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                    {
                        return 
1
                    
}
                }
            }
        }
    }
    return 
0
}

stock fm_set_rendering_float(entityfx kRenderFxNoneFloat:color[3], render kRenderNormalFloat:amount 16.0)
{
    
set_pev(entitypev_renderfxfx)
    
set_pev(entitypev_rendercolorcolor)
    
set_pev(entitypev_rendermoderender)
    
set_pev(entitypev_renderamtamount)
}

stock DropWeaponSlotiPlayeriSlot 

    new 
iWeaponEntity GetWeaponFromSlotiPlayeriSlot ); 
    if( 
iWeaponEntity 
    { 
        new 
iWeaponID get_pdata_cbaseiWeaponEntitym_iId); 
         
        new 
szWeaponName32 ]; 
        
get_weaponnameiWeaponIDszWeaponNamecharsmaxszWeaponName ) ); 
         
        
engclient_cmdiPlayer"drop"szWeaponName ); 
    } 


stock GetWeaponFromSlotiPlayeriSlot 

    return ( 
<= iSlot <= ) ? get_pdata_cbaseiPlayerm_rpgPlayerItems_Slot0 iSlot) : -1
}

/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ fbidis\\ ansi\\ ansicpg1252\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset0 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ ltrpar\\ lang1065\\ f0\\ fs16 \n\\ par }
*/ 
__________________
Check my original plugins for cs 1.6 and subscribe on channel
Look at the video below to see blind grenade for zombies

https://www.youtube.com/watch?v=ORC7ZmoaipQ

Look at the video below to see Zombie Hide And Seek mode

https://www.youtube.com/watch?v=xpyYb65EgGs
Krtola is offline
Send a message via Skype™ to Krtola
LearninG
Senior Member
Join Date: Apr 2019
Location: Iran
Old 07-06-2019 , 09:04   Re: Bow v 1.2 bug/issue
Reply With Quote #19

Quote:
Originally Posted by Krtola View Post
Thsi will work Im sure

PHP Code:
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <fun>
#include <hamsandwich>
#include <xs>
#include <zombieplague>

#if AMXX_VERSION_NUM < 183
#include <colorchat>
#define Red print_team_red
#define Blue print_team_blue
#define Grey print_team_grey
#define DontChange print_team_default
#endif

// Weapon/Arrow models
new const P_MODEL[] = "models/bow/p_Shina_by_Oxigen.mdl"
new const V_MODEL[] = "models/bow/v_Shina_by_Oxigen.mdl"
new const W_MODEL[] = "models/bow/w_Shina_by_Oxigen.mdl"
new const ARROW_MODEL[] = "models/bow/arrow.mdl"

#define BURN_CLASSNAME "flame"
#define BURN_MODEL "sprites/bow/flame_burn01.spr"
#define POISON_MODEL "sprites/bow/poison.spr"

#define m_rpgPlayerItems_Slot0 367 
#define m_iId 43

// Settings
#define SWITCH_TIME    0.5

#define BASE_SPEED 400
#define BONUS_SPEED 500

#define BURN_LIFE 10.0
#define BURN_PERIOD 2.0
#define BURN_DAMAGE 100.0


#define NORMAL_DMG 250.0

#define SPEED_LOW_ICE 0.5
#define SLOW_ICE_TIME 5.0

#define EXPLODE_DAMAGE 1500
#define EXPLODE_HITRADIUS 600

// Base number of arrows
#define NORMAL_AMMO 20
#define FIRE_AMMO 15
#define ICE_AMMO 10
#define EXPLODE_AMMO 3

//Number of extra arrows
#define NORMAL_AMMO_BUY 5
#define FIRE_AMMO_BUY 4
#define ICE_AMMO_BUY 3
#define EXPLODE_AMMO_BUY 1

// Cost of extra arrows
#define AMMO_COST 10
#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_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_MsgDamageg_msgBarTime

enum 
{
    
anim_idle,
    
anim_shot1,
    
anim_shot2,
    
anim_reload,
    
anim_draw
}

enum
{
    
NORMAL_MODE 1,
    
FIRE_MODE 4,
    
ICE_MODE 3,
    
EXPLODE_MODE 2
}

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")
}

// ITEM
new g_itemid

//Krtola Stuff
const Floatg_fCooldown 3.0
new Floatg_fLastDamage[33]
#define BOW_WEAPONKEY 5444552332
#define WEAPON_OLD "weapon_scout"
#define EV_INT_WEAPONKEY EV_INT_impulse
#define ENG_NULLENT -1

public plugin_init()
{
    
// Register plugin
    
register_plugin("PLUGIN""VERSION""AUTHOR")
    
    
// 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")

    
g_itemid zp_register_extra_item("Magical Bow",6ZP_TEAM_HUMAN)

    
g_MaxPlayers get_maxplayers()

        
//Krtola Stuff
        
RegisterHam(Ham_Item_AddToPlayerWEAPON_OLD"fw_Item_AddToPlayer_Post"1)
        
register_forward(FM_SetModel"fw_SetModel")
}

//Krtola Stuff
public fw_Item_AddToPlayer_Post(iItemiPlayer
{
    if(!
is_valid_ent(iItem) || !is_user_connected(iPlayer))
        return 
HAM_IGNORED
    
    
if(entity_get_int(iItemEV_INT_WEAPONKEY) == BOW_WEAPONKEY)
    { 
                
g_HasBow[iPlayer] = true
        
        entity_set_int
(iItemEV_INT_WEAPONKEY0)

                return 
HAM_HANDLED
        
}
        return 
HAM_IGNORED
}

public 
fw_SetModel(entitymodel[])
{
    if(!
is_valid_ent(entity))
        return 
FMRES_IGNORED
    
    
static szClassName[33]
    
entity_get_string(entityEV_SZ_classnameszClassNamecharsmax(szClassName))
        
    if(!
equal(szClassName"weaponbox"))
        return 
FMRES_IGNORED
    
    
static iOwner
    
    iOwner 
entity_get_edict(entityEV_ENT_owner)
    
    if(
equal(model"models/w_scout.mdl"))
    {
        static 
iStoredAugID
        
        iStoredAugID 
find_ent_by_owner(ENG_NULLENT"weapon_scout"entity)
    
        if(!
is_valid_ent(iStoredAugID))
            return 
FMRES_IGNORED
    
        
if(g_HasBow[iOwner])
        {
            
entity_set_int(iStoredAugIDEV_INT_WEAPONKEYBOW_WEAPONKEY)
            
            
g_HasBow[iOwner] = false
            
            
            
            
return FMRES_SUPERCEDE
        
}
    }
    return 
FMRES_IGNORED
}

public 
zp_user_infected_post(id)
{
    if(
g_HasBow[id])
    {
                
g_HasBow[id] = 0
    
}
}
//End of Krtola Stuff

public zp_extra_item_selected(playeritemid)
{
    if (
itemid == g_itemid || is_user_alive(player))
    {
        
give_bow(player)
    }
    return 
PLUGIN_CONTINUE
}

public 
Event_NewRound()
{
    for (new 
0get_maxplayers(); i++)
        {
        
set_user_rendering(ikRenderFxGlowShell000kRenderNormal25)
        
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(id64Aim)
        
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 
0;number ;i++) { 
        if (
wpnList[i] == CSW_SCOUT) {
            
fm_strip_user_gun(idwpnList[i])
        }
    }


//play anim
public playanim(player,anim)
{
    
set_pev(playerpev_weaponanimanim)
    
message_begin(MSG_ONESVC_WEAPONANIM, {000}, player)
    
write_byte(anim)
    
write_byte(pev(playerpev_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 (!
g_HasBow[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(idanim_draw)
                
update_ammo(id)
                
//emit_sound(id, CHAN_WEAPON, GRENADE_DRAW, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
                // View model
                
entity_set_string(idEV_SZ_viewmodelV_MODEL)
                
                
// Player model
                
entity_set_string(idEV_SZ_weaponmodelP_MODEL)
                
draw_wpn[id] = true
            
}
        }
        else
        {
            
// View model
            
entity_set_string(idEV_SZ_viewmodel"models/v_scout.mdl")
            
            
// Player model
            
entity_set_string(idEV_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(victimattackershouldgib)
{
    if (
g_HasBow[victim])        
    {
        
// Reset all
        
g_HasBow[victim] = false
        set_user_rendering
(victimkRenderFxGlowShell000kRenderNormal25)

        
// Remove screen's bar
        
message_begin(MSG_ONEg_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_explode_ammo
[id] = EXPLODE_AMMO
}

//give weapon
public give_weapon(id){
    
g_HasBow[id] = true
    
//DropWeaponSlot(id, 1)
    
give_item(id"weapon_scout")
    
update_ammo(id)
}

public 
fw_bow_PrimaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_SecondaryAttack(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Reload(Weapon
{
         new 
Player get_pdata_cbase(Weapon414)
    
    if (
g_HasBow[Player])
    return 
HAM_SUPERCEDE

    
return HAM_IGNORED
}

public 
fw_bow_Deploy_Post(Weapon)
{
    new 
Player get_pdata_cbase(Weapon414)
    
    
update_ammo(Player)
}

// Command start
public fw_CmdStart(idUC_HandleSeed
{
    if(!
g_HasBow[id] || !is_user_alive(id))
        return 
FMRES_IGNORED

    
static CurButtonOldButton
    
    CurButton 
get_uc(UC_HandleUC_Buttons)
    
OldButton = (pev(idpev_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] == 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_UNRELIABLEg_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] == 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_ONEg_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] == 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_ONEg_msgBarTime_id)
            
write_byte(0// time
            
write_byte(0// unknown
            
message_end()

            
g_pressed[id] = false
        
}
    }

    if((
CurButton IN_ATTACK2) && !(pev(idpev_oldbuttons) & IN_ATTACK2))
    {        
        if(
get_user_weapon(id) != CSW_SCOUT)
        return 
FMRES_IGNORED
            
if(g_fLastDamage[id] < get_gametime() - g_fCooldown)
        {                    

        if(!
g_pressed[id])
        {
                if(
is_user_alive(id))

            switch(
g_bow_mode[id])
            {
                case 
1:
                {
                    
g_bow_mode[id]= 4
                    client_print
(id,print_center,"Fire Mode")
                    
update_ammo(id)
                    
                }
                case 
2:
                {
                    
g_bow_mode[id]= 1
                    client_print
(id,print_center,"Normal Mode")
                    
update_ammo(id)
                    
                    
                }
                case 
3:
                {
                    
g_bow_mode[id]= 2
                    client_print
(id,print_center,"Explode Mode")
                    
update_ammo(id)
                    
                }
                case 
4:
                {
                    
g_bow_mode[id]= 3
                    client_print
(id,print_center,"Ice Mode")
                    
update_ammo(id)
                }
                                
            }
                        
g_fLastDamage[id] = get_gametime()
        }
            }
    } 
        return 
FMRES_IGNORED       
}

//block anim standart wpn 
public fw_UpdateClientData_Post(idsendweaponscd_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_handleCD_flNextAttackhalflife_time() + 0.001 ); 
    }

    return 
FMRES_HANDLED
}

// Fire gremade
public FireArrow(id)
{
    
// Set animation
    
playanim(idanim_shot1)

    
// Get origin. angle and velocity
    
new velocity[33]
    new 
Float:fAngle[3], Float:fVelocity[3]
    
pev(idpev_v_anglefAngle)
    
    
// Create ent
    
new arrow create_entity("info_target")
    
    
// Not grenade
    
if (!arrow) return PLUGIN_HANDLED

    
// Classname
    
entity_set_string(arrowEV_SZ_classname"bow_arrow")
    
    
// Model
    
entity_set_model(arrowARROW_MODEL)

    if(
g_bow_mode[id] == NORMAL_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell255255255kRenderNormal50)
        
g_normal_ammo[id]--
    }
    else if(
g_bow_mode[id] == FIRE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell25500kRenderNormal50)
        
g_fire_ammo[id]--
    }
    else if(
g_bow_mode[id] == ICE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell00255kRenderNormal50)
        
g_ice_ammo[id]--
    }
    else if(
g_bow_mode[id] == EXPLODE_MODE)
    {
        
set_rendering(arrowkRenderFxGlowShell1501050kRenderNormal50)
        
g_explode_ammo[id]--
    }

    
update_ammo(id)

    new 
Float:vOrigin[3],Float:vUp[3]
    
pev(idpev_originvOrigin)
    
    
global_get(glb_v_upvUp)
    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(arrowvOrigin)
    
    
// Angles
    
entity_set_vector(arrowEV_VEC_anglesfAngle)
    
    
// Size
    
new Float:MinBox[3] = {-1.0, -1.0, -1.0}
    new 
Float:MaxBox[3] = {1.01.01.0}
    
entity_set_vector(arrowEV_VEC_minsMinBox)
    
entity_set_vector(arrowEV_VEC_maxsMaxBox)
    
    
// Interaction
    
entity_set_int(arrowEV_INT_solidSOLID_SLIDEBOX)
    
    
// Movetype
    
entity_set_int(arrowEV_INT_movetypeMOVETYPE_TOSS)
    
    
// Owner
    
entity_set_edict(arrowEV_ENT_ownerid)
    
    
// Velocity
    
new Floatholdtime[33
    new 
Floatmnoji[33]

    
holdtime[id] = g_finish_time[id] - g_start_time[id]

    if(
holdtime[id] < 1.0holdtime[id] = 1.0
    
if(holdtime[id] > 3.0holdtime[id] = 3.0

    
    mnoji
[id] = BASE_SPEED holdtime[id] * BONUS_SPEED
    velocity
[id] = floatround(mnoji[id],floatround_round)
    
VelocityByAim(idvelocity[id], fVelocity)
    
    
entity_set_vector(arrowEV_VEC_velocityfVelocity)
    
    
// Launch sound
    
emit_sound(arrowCHAN_WEAPONARROW_SHOOTVOL_NORMATTN_NORM0PITCH_NORM)

    return 
PLUGIN_CONTINUE
}    

// We hit something!!!
public pfn_touch(ptrptd)
{
    
// If ent is valid
    
if (pev_valid(ptr))
    {    
        
// Get classnames
        
static classname[32], classnameptd[32]
        
pev(ptrpev_classnameclassname31)
        
        
// Our ent
        
if(equal(classname"bow_arrow"))
        {
            
// Get it's origin
            
new Float:Origin[3]
            
pev(ptrpev_originOrigin)

            new 
owner pev(ptrpev_owner)

            if(
g_bow_mode[owner] == EXPLODE_MODE)
            {
                
// Explosion
                
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYOrigin0)
                
write_byte(TE_EXPLOSION)
                
engfunc(EngFunc_WriteCoordOrigin[0])
                
engfunc(EngFunc_WriteCoordOrigin[1])
                
engfunc(EngFunc_WriteCoordOrigin[2])
                
write_short(g_exp_sprid)
                
write_byte(40)
                
write_byte(30)
                
write_byte(0)
                
message_end()

                
check_radius_damage(ptrowner)
            }

            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_TakeDamageptdptrownerNORMAL_DMGDMG_BULLET)
                    }
                    else if(
g_bow_mode[owner] == FIRE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {
                                                                
g_dmg_mode[ptd] = dmg_fire
                                 CreateBurn
(ptdowner)
                            }
                        
                    }
                    else if(
g_bow_mode[owner] == ICE_MODE)
                    {
                        if (!
g_slowed[ptd] || !g_Burn[ptd] || g_slowed[ptd] || g_Burn[ptd])
                        {

                            
g_FrozenRenderingFx[ptd] = pev(ptdpev_renderfx)
                            
pev(ptdpev_rendercolorg_FrozenRenderingColor[ptd])
                            
g_FrozenRenderingRender[ptd] = pev(ptdpev_rendermode)
                            
pev(ptdpev_renderamtg_FrozenRenderingAmount[ptd])

                            
set_user_rendering(ptdkRenderFxGlowShell0100200kRenderNormal25)
                            
set_user_maxspeed(ptdget_user_maxspeed(ptd) * SPEED_LOW_ICE)
                            
g_slowed[ptd] = true
                            set_task
(SLOW_ICE_TIME"make_speed"ptd__"a"1)
                
                            
message_begin(MSG_ONE_UNRELIABLEg_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()
                        }
                                             }
                }
            }
            
// We hit breakable
            
if(pev_valid(ptd))
            {
                
pev(ptdpev_classnameclassnameptd31)
                if (
equali(classnameptd"func_breakable"))
                {
                    
// Destroy it
                    //force_use(ptr,ptd)
                
}
            }
            
set_pev(ptrpev_flagsFL_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 && id 34
                {
                    if(
allowed_toucher(id))
                    {
                        
// Pick up weapon
                        //give_weapon(id)
                        
remove_entity(ptr)
                    }
                }
            }
        }
    }
}    

public 
CreateBurn(idattacker)
{
    if(
g_Burn[id])
        return

    if(
g_dmg_mode[id] == dmg_fire)
    {
        new 
ent=CreateAnimationSprite(attackerBURN_CLASSNAMEBURN_MODEL1.010.0)
    
        
set_pev(entpev_solidSOLID_NOT)
        
set_pev(entpev_movetypeMOVETYPE_FOLLOW)
    
        
set_pev(entpev_aimentid)
    
        
set_pev(entpev_fuser2get_gametime()+BURN_LIFE)
    
        
g_Burn[id]=get_gametime()+BURN_PERIOD
    
}
}

public 
BurnThink(ent)
{
    if(!
pev_valid(ent))
        return
        
    static 
Float:lifeaim_ent
    
    pev
(ent,pev_fuser2life)
    
    
aim_ent=pev(entpev_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_TakeDamageaim_ent ent ,pev(entpev_owner), BURN_DAMAGEDMG_BURN)
        
            
g_Burn[aim_ent]=get_gametime()+BURN_PERIOD
        
}
    }
}


public 
make_speed(id)
{
    if(
is_user_alive(id) && g_slowed[id])
    {
        
g_slowed[id] = false
        set_user_maxspeed
(idg_old_speed[id])
        
fm_set_rendering_float(idg_FrozenRenderingFx[id], g_FrozenRenderingColor[id], g_FrozenRenderingRender[id], g_FrozenRenderingAmount[id])
    }
}

public 
check_radius_damage(entattacker)
{
    for(new 
0g_MaxPlayersi++)
    {
        if(!
is_user_alive(i))
            continue
        if(
cs_get_user_team(attacker) == cs_get_user_team(i))
            continue
        if(
entity_range(enti) > EXPLODE_HITRADIUS)
            continue
            
        
Do_TakeDamage(entiattackercan_see_fm(enti))
    }
}

public 
Do_TakeDamage(EntVictimAttackercan_see)
{
    static 
Float:DamageFloat:CurrentDis
    
    CurrentDis 
entity_range(EntVictim)
    
Damage EXPLODE_DAMAGE - ((CurrentDis EXPLODE_HITRADIUS) * EXPLODE_DAMAGE)
    
    if(
Damage 0)
    {
        static 
WeaponEnt
        WeaponEnt 
fm_get_user_weapon_entity(AttackerCSW_HEGRENADE)
        
        if(!
pev_valid(WeaponEnt))
            
WeaponEnt 0

        
if(!can_see)
            
Damage /= 2
            
        ExecuteHamB
(Ham_TakeDamageVictimWeaponEntAttackerDamageDMG_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] == EXPLODE_MODE)
    {
        
g_ammo[id] = g_explode_ammo[id]
    }
    
    static 
weapon_entweapon_ent fm_find_ent_by_owner(-1"weapon_scout"id)
    if(
pev_valid(weapon_ent)) cs_set_weapon_ammo(weapon_ent1)    
    
    
cs_set_user_bpammo(idCSW_SCOUTg_ammo[id])
    
    
engfunc(EngFunc_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, 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_MessageBeginMSG_ONE_UNRELIABLEget_user_msgid("CurWeapon"), {000}, id)
    
write_byte(1)
    
write_byte(CSW_SCOUT)
    
write_byte(-1)
    
message_end()
}

// Allowed toucher
stock allowed_toucher(player)
{
    if (
g_HasBow[player])
        return 
false
    
    
return true
}
 

stock CreateAnimationSprite(owner, const classname[], const model[], Float:scaleFloat:framerate)
{
    new 
ent=fm_create_entity("env_sprite")

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_modelmodel)

    
dllfunc(DLLFunc_Spawnent)

    
set_pev(entpev_classnameclassname)
    
set_pev(entpev_ownerowner)

    
fm_entity_set_model(entmodel)
    
fm_set_rendering(entkRenderFxNoDissipation255255255kRenderGlow255)

    
set_pev(entpev_framerateframerate)
    
set_pev(entpev_scalescale)

    return 
ent
}

public 
can_see_fm(entindex1entindex2)
{
    if (!
entindex1 || !entindex2)
        return 
false

    
if (pev_valid(entindex1) && pev_valid(entindex1))
    {
        new 
flags pev(entindex1pev_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(entindex1pev_originlookerOrig)
        
pev(entindex1pev_view_ofstemp)
        
lookerOrig[0] += temp[0]
        
lookerOrig[1] += temp[1]
        
lookerOrig[2] += temp[2]

        
pev(entindex2pev_origintargetBaseOrig)
        
pev(entindex2pev_view_ofstemp)
        
targetOrig[0] = targetBaseOrig [0] + temp[0]
        
targetOrig[1] = targetBaseOrig [1] + temp[1]
        
targetOrig[2] = targetBaseOrig [2] + temp[2]

        
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the had of seen player
        
if (get_tr2(0TraceResult:TR_InOpen) && get_tr2(0TraceResult:TR_InWater))
        {
            return 
0
        

        else 
        {
            new 
Float:flFraction
            get_tr2
(0TraceResult:TR_flFractionflFraction)
            if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
            {
                return 
1
            
}
            else
            {
                
targetOrig[0] = targetBaseOrig [0]
                
targetOrig[1] = targetBaseOrig [1]
                
targetOrig[2] = targetBaseOrig [2]
                
engfunc(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the body of seen player
                
get_tr2(0TraceResult:TR_flFractionflFraction)
                if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                {
                    return 
1
                
}
                else
                {
                    
targetOrig[0] = targetBaseOrig [0]
                    
targetOrig[1] = targetBaseOrig [1]
                    
targetOrig[2] = targetBaseOrig [2] - 17.0
                    engfunc
(EngFunc_TraceLinelookerOrigtargetOrig0entindex10//  checks the legs of seen player
                    
get_tr2(0TraceResult:TR_flFractionflFraction)
                    if (
flFraction == 1.0 || (get_tr2(0TraceResult:TR_pHit) == entindex2))
                    {
                        return 
1
                    
}
                }
            }
        }
    }
    return 
0
}

stock fm_set_rendering_float(entityfx kRenderFxNoneFloat:color[3], render kRenderNormalFloat:amount 16.0)
{
    
set_pev(entitypev_renderfxfx)
    
set_pev(entitypev_rendercolorcolor)
    
set_pev(entitypev_rendermoderender)
    
set_pev(entitypev_renderamtamount)
}

stock DropWeaponSlotiPlayeriSlot 

    new 
iWeaponEntity GetWeaponFromSlotiPlayeriSlot ); 
    if( 
iWeaponEntity 
    { 
        new 
iWeaponID get_pdata_cbaseiWeaponEntitym_iId); 
         
        new 
szWeaponName32 ]; 
        
get_weaponnameiWeaponIDszWeaponNamecharsmaxszWeaponName ) ); 
         
        
engclient_cmdiPlayer"drop"szWeaponName ); 
    } 


stock GetWeaponFromSlotiPlayeriSlot 

    return ( 
<= iSlot <= ) ? get_pdata_cbaseiPlayerm_rpgPlayerItems_Slot0 iSlot) : -1
}

/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ fbidis\\ ansi\\ ansicpg1252\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset0 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ ltrpar\\ lang1065\\ f0\\ fs16 \n\\ par }
*/ 
Thanks a lot!! scout bug fixed , but isn't better to check if the bow hit something then user is allow to change the mode , because it still can be bugged.
LearninG is offline
Krtola
Veteran Member
Join Date: Oct 2013
Location: Serbia
Old 07-06-2019 , 09:10   Re: Bow v 1.2 bug/issue
Reply With Quote #20

That is true,we need to check when bow hit something and then allow mode changing.
I will try that now.
__________________
Check my original plugins for cs 1.6 and subscribe on channel
Look at the video below to see blind grenade for zombies

https://www.youtube.com/watch?v=ORC7ZmoaipQ

Look at the video below to see Zombie Hide And Seek mode

https://www.youtube.com/watch?v=xpyYb65EgGs
Krtola is offline
Send a message via Skype™ to Krtola
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 22:31.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode