Raised This Month: $ Target: $400
 0% 

Suggestion / Subplugin Request [HOW?] Different weapon for special class


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
ZPhugeFan
Senior Member
Join Date: Jul 2013
Location: Bulgaria
Old 09-08-2013 , 06:49   [HOW?] Different weapon for special class
Reply With Quote #1

I'm playing zp50 where its very easy to create new special classes like survivor, sniper and nemesis... I created new survivor and i want to put new weapon for him not w_249, but i keep failing. I messed something in the code. sniper is easy- he uses default gun like awp. I want to put new weapon on my new survivor class. This is the weapon that i want to put him:

http://forums.alliedmods.net/showthread.php?p=971960
ZPhugeFan is offline
Catastrophe
Veteran Member
Join Date: Jul 2012
Location: somewhere between narnia
Old 09-18-2013 , 01:49   Re: [HOW?] Different weapon for special class
Reply With Quote #2

Plzz post your survivor code and crossbow in PHP form i'm too lazy but it's easy i think..
__________________
You will find everything u need :-
Catastrophe is offline
ZPhugeFan
Senior Member
Join Date: Jul 2013
Location: Bulgaria
Old 09-20-2013 , 06:35   Re: [HOW?] Different weapon for special class
Reply With Quote #3

I'll put normal survivor code cuz i deleted my custom survivor but it doesn't matter cuz they were only different in names so ok here it is:
PHP Code:
/*================================================================================
    
    ----------------------------
    -*- [ZP] Class: Survivor -*-
    ----------------------------
    
    This plugin is part of Zombie Plague Mod and is distributed under the
    terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
    
================================================================================*/

#include <amxmodx>
#include <fun>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
#include <amx_settings_api>
#include <cs_maxspeed_api>
#include <cs_player_models_api>
#include <cs_weap_models_api>
#include <cs_ham_bots_api>
#include <zp50_core>

// Settings file
new const ZP_SETTINGS_FILE[] = "zombieplague.ini"

// Default models
new const models_survivor_player[][] = { "leet""sas" }

new Array:
g_models_survivor_player

#define PLAYERMODEL_MAX_LENGTH 32
#define MODEL_MAX_LENGTH 64

new g_models_survivor_weapon[MODEL_MAX_LENGTH] = "models/v_m249.mdl"

#define TASK_AURA 100
#define ID_AURA (taskid - TASK_AURA)

#define flag_get(%1,%2) (%1 & (1 << (%2 & 31)))
#define flag_get_boolean(%1,%2) (flag_get(%1,%2) ? true : false)
#define flag_set(%1,%2) %1 |= (1 << (%2 & 31))
#define flag_unset(%1,%2) %1 &= ~(1 << (%2 & 31))

// CS Player CBase Offsets (win32)
const PDATA_SAFE 2
const OFFSET_ACTIVE_ITEM 373

// Weapon bitsums
const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
const 
SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)
const 
GRENADES_WEAPONS_BIT_SUM = (1<<CSW_HEGRENADE)|(1<<CSW_FLASHBANG)|(1<<CSW_SMOKEGRENADE)

// Ammo Type Names for weapons
new const AMMOTYPE[][] = { """357sig""""762nato""""buckshot""""45acp""556nato""""9mm""57mm""45acp",
            
"556nato""556nato""556nato""45acp""9mm""338magnum""9mm""556natobox""buckshot",
            
"556nato""9mm""762nato""""50ae""556nato""762nato""""57mm" }

// Max BP ammo for weapons
new const MAXBPAMMO[] = { -152, -1901321100901120100100909090100120,
            
301202003290120902359090, -1100 }

#define PRIMARY_ONLY 1
#define SECONDARY_ONLY 2
#define GRENADES_ONLY 4

new g_MaxPlayers
new g_IsSurvivor

new cvar_survivor_healthcvar_survivor_base_healthcvar_survivor_speedcvar_survivor_gravity
new cvar_survivor_glow
new cvar_survivor_auracvar_survivor_aura_color_Rcvar_survivor_aura_color_Gcvar_survivor_aura_color_B
new cvar_survivor_weaponcvar_survivor_weapon_block

public plugin_init()
{
    
register_plugin("[ZP] Class: Survivor"ZP_VERSION_STRING"ZP Dev Team")
    
    
register_clcmd("drop""clcmd_drop")
    
RegisterHam(Ham_Touch"weaponbox""fw_TouchWeapon")
    
RegisterHam(Ham_Touch"armoury_entity""fw_TouchWeapon")
    
RegisterHam(Ham_Touch"weapon_shield""fw_TouchWeapon")
    
RegisterHam(Ham_Killed"player""fw_PlayerKilled")
    
RegisterHamBots(Ham_Killed"fw_PlayerKilled")
    
    
g_MaxPlayers get_maxplayers()
    
    
cvar_survivor_health register_cvar("zp_survivor_health""0")
    
cvar_survivor_base_health register_cvar("zp_survivor_base_health""100")
    
cvar_survivor_speed register_cvar("zp_survivor_speed""0.95")
    
cvar_survivor_gravity register_cvar("zp_survivor_gravity""1.25")
    
cvar_survivor_glow register_cvar("zp_survivor_glow""1")
    
cvar_survivor_aura register_cvar("zp_survivor_aura""1")
    
cvar_survivor_aura_color_R register_cvar("zp_survivor_aura_color_R""0")
    
cvar_survivor_aura_color_G register_cvar("zp_survivor_aura_color_G""0")
    
cvar_survivor_aura_color_B register_cvar("zp_survivor_aura_color_B""150")
    
cvar_survivor_weapon register_cvar("zp_survivor_weapon""weapon_m249")
    
cvar_survivor_weapon_block register_cvar("zp_survivor_weapon_block""1")
}

public 
plugin_precache()
{
    
// Initialize arrays
    
g_models_survivor_player ArrayCreate(PLAYERMODEL_MAX_LENGTH1)
    
    
// Load from external file
    
amx_load_setting_string_arr(ZP_SETTINGS_FILE"Player Models""SURVIVOR"g_models_survivor_player)
    
    
// If we couldn't load from file, use and save default ones
    
new index
    
if (ArraySize(g_models_survivor_player) == 0)
    {
        for (
index 0index sizeof models_survivor_playerindex++)
            
ArrayPushString(g_models_survivor_playermodels_survivor_player[index])
        
        
// Save to external file
        
amx_save_setting_string_arr(ZP_SETTINGS_FILE"Player Models""SURVIVOR"g_models_survivor_player)
    }
    
    
// Load from external file, save if not found
    
if (!amx_load_setting_string(ZP_SETTINGS_FILE"Weapon Models""V_WEAPON SURVIVOR"g_models_survivor_weaponcharsmax(g_models_survivor_weapon)))
        
amx_save_setting_string(ZP_SETTINGS_FILE"Weapon Models""V_WEAPON SURVIVOR"g_models_survivor_weapon)
    
    
    
// Precache models
    
new player_model[PLAYERMODEL_MAX_LENGTH], model_path[128]
    for (
index 0index ArraySize(g_models_survivor_player); index++)
    {
        
ArrayGetString(g_models_survivor_playerindexplayer_modelcharsmax(player_model))
        
formatex(model_pathcharsmax(model_path), "models/player/%s/%s.mdl"player_modelplayer_model)
        
precache_model(model_path)
        
// Support modelT.mdl files
        
formatex(model_pathcharsmax(model_path), "models/player/%s/%sT.mdl"player_modelplayer_model)
        if (
file_exists(model_path)) precache_model(model_path)
    }
    
    
precache_model(g_models_survivor_weapon)
}

public 
plugin_natives()
{
    
register_library("zp50_class_survivor")
    
register_native("zp_class_survivor_get""native_class_survivor_get")
    
register_native("zp_class_survivor_set""native_class_survivor_set")
    
register_native("zp_class_survivor_get_count""native_class_survivor_get_count")
}

public 
client_disconnect(id)
{
    
flag_unset(g_IsSurvivorid)
    
remove_task(id+TASK_AURA)
}

public 
clcmd_drop(id)
{
    
// Should survivor stick to his weapon?
    
if (flag_get(g_IsSurvivorid) && get_pcvar_num(cvar_survivor_weapon_block))
        return 
PLUGIN_HANDLED;
    
    return 
PLUGIN_CONTINUE;
}

// Ham Weapon Touch Forward
public fw_TouchWeapon(weaponid)
{
    
// Should survivor stick to his weapon?
    
if (get_pcvar_num(cvar_survivor_weapon_block) && is_user_alive(id) && flag_get(g_IsSurvivorid))
        return 
HAM_SUPERCEDE;
    
    return 
HAM_IGNORED;
}

// Ham Player Killed Forward
public fw_PlayerKilled(victimattackershouldgib)
{
    if (
flag_get(g_IsSurvivorvictim))
    {
        
// Remove survivor aura
        
if (get_pcvar_num(cvar_survivor_aura))
            
remove_task(victim+TASK_AURA)
    }
}

public 
zp_fw_core_spawn_post(id)
{
    if (
flag_get(g_IsSurvivorid))
    {
        
// Remove survivor glow
        
if (get_pcvar_num(cvar_survivor_glow))
            
set_user_rendering(id)
        
        
// Remove survivor aura
        
if (get_pcvar_num(cvar_survivor_aura))
            
remove_task(id+TASK_AURA)
        
        
// Remove survivor weapon model
        
new weapon_name[32]
        
get_pcvar_string(cvar_survivor_weaponweapon_namecharsmax(weapon_name))
        new 
weapon_id get_weaponid(weapon_name)
        
cs_reset_player_view_model(idweapon_id)
        
        
// Remove survivor flag
        
flag_unset(g_IsSurvivorid)
    }
}

public 
zp_fw_core_infect(idattacker)
{
    if (
flag_get(g_IsSurvivorid))
    {
        
// Remove survivor glow
        
if (get_pcvar_num(cvar_survivor_glow))
            
set_user_rendering(id)
        
        
// Remove survivor aura
        
if (get_pcvar_num(cvar_survivor_aura))
            
remove_task(id+TASK_AURA)
        
        
// Remove survivor weapon model
        
new weapon_name[32]
        
get_pcvar_string(cvar_survivor_weaponweapon_namecharsmax(weapon_name))
        new 
weapon_id get_weaponid(weapon_name)
        
cs_reset_player_view_model(idweapon_id)
        
        
// Remove survivor flag
        
flag_unset(g_IsSurvivorid)
    }
}

public 
zp_fw_core_cure_post(idattacker)
{
    
// Apply Survivor attributes?
    
if (!flag_get(g_IsSurvivorid))
        return;
    
    
// Health
    
if (get_pcvar_num(cvar_survivor_health) == 0)
        
set_user_health(idget_pcvar_num(cvar_survivor_base_health) * GetAliveCount())
    else
        
set_user_health(idget_pcvar_num(cvar_survivor_health))
    
    
// Gravity
    
set_user_gravity(idget_pcvar_float(cvar_survivor_gravity))
    
    
// Speed (if value between 0 and 10, consider it a multiplier)
    
cs_set_player_maxspeed_auto(idget_pcvar_float(cvar_survivor_speed))
    
    
// Apply survivor player model
    
new player_model[PLAYERMODEL_MAX_LENGTH]
    
ArrayGetString(g_models_survivor_playerrandom_num(0ArraySize(g_models_survivor_player) - 1), player_modelcharsmax(player_model))
    
cs_set_player_model(idplayer_model)
    
    
// Apply survivor weapon model
    
new weapon_name[32]
    
get_pcvar_string(cvar_survivor_weaponweapon_namecharsmax(weapon_name))
    new 
weapon_id get_weaponid(weapon_name)
    
cs_set_player_view_model(idweapon_idg_models_survivor_weapon)
    
    
// Survivor glow
    
if (get_pcvar_num(cvar_survivor_glow))
        
set_user_rendering(idkRenderFxGlowShell00255kRenderNormal25)
    
    
// Survivor aura task
    
if (get_pcvar_num(cvar_survivor_aura))
        
set_task(0.1"survivor_aura"id+TASK_AURA__"b")
    
    
// Strip current weapons and give survivor weapon
    
strip_weapons(idPRIMARY_ONLY)
    
strip_weapons(idSECONDARY_ONLY)
    
strip_weapons(idGRENADES_ONLY)
    
give_item(idweapon_name)
    
ExecuteHamB(Ham_GiveAmmoidMAXBPAMMO[weapon_id], AMMOTYPE[weapon_id], MAXBPAMMO[weapon_id])
}

public 
native_class_survivor_get(plugin_idnum_params)
{
    new 
id get_param(1)
    
    if (!
is_user_connected(id))
    {
        
log_error(AMX_ERR_NATIVE"[ZP] Invalid Player (%d)"id)
        return -
1;
    }
    
    return 
flag_get_boolean(g_IsSurvivorid);
}

public 
native_class_survivor_set(plugin_idnum_params)
{
    new 
id get_param(1)
    
    if (!
is_user_alive(id))
    {
        
log_error(AMX_ERR_NATIVE"[ZP] Invalid Player (%d)"id)
        return 
false;
    }
    
    if (
flag_get(g_IsSurvivorid))
    {
        
log_error(AMX_ERR_NATIVE"[ZP] Player already a survivor (%d)"id)
        return 
false;
    }
    
    
flag_set(g_IsSurvivorid)
    
zp_core_force_cure(id)
    return 
true;
}

public 
native_class_survivor_get_count(plugin_idnum_params)
{
    return 
GetSurvivorCount();
}

// Survivor aura task
public survivor_aura(taskid)
{
    
// Get player's origin
    
static origin[3]
    
get_user_origin(ID_AURAorigin)
    
    
// Colored Aura
    
message_begin(MSG_PVSSVC_TEMPENTITYorigin)
    
write_byte(TE_DLIGHT// TE id
    
write_coord(origin[0]) // x
    
write_coord(origin[1]) // y
    
write_coord(origin[2]) // z
    
write_byte(50// radius
    
write_byte(get_pcvar_num(cvar_survivor_aura_color_R)) // r
    
write_byte(get_pcvar_num(cvar_survivor_aura_color_G)) // g
    
write_byte(get_pcvar_num(cvar_survivor_aura_color_B)) // b
    
write_byte(2// life
    
write_byte(0// decay rate
    
message_end()
}

// Get Alive Count -returns alive players number-
GetAliveCount()
{
    new 
iAliveid
    
    
for (id 1id <= g_MaxPlayersid++)
    {
        if (
is_user_alive(id))
            
iAlive++
    }
    
    return 
iAlive;
}

// Get Survivor Count -returns alive survivors number-
GetSurvivorCount()
{
    new 
iSurvivorsid
    
    
for (id 1id <= g_MaxPlayersid++)
    {
        if (
is_user_alive(id) && flag_get(g_IsSurvivorid))
            
iSurvivors++
    }
    
    return 
iSurvivors;
}

// Strip primary/secondary/grenades
stock strip_weapons(idstripwhat)
{
    
// Get user weapons
    
new weapons[32], num_weaponsindexweaponid
    get_user_weapons
(idweaponsnum_weapons)
    
    
// Loop through them and drop primaries or secondaries
    
for (index 0index num_weaponsindex++)
    {
        
// Prevent re-indexing the array
        
weaponid weapons[index]
        
        if ((
stripwhat == PRIMARY_ONLY && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
        || (
stripwhat == SECONDARY_ONLY && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM))
        || (
stripwhat == GRENADES_ONLY && ((1<<weaponid) & GRENADES_WEAPONS_BIT_SUM)))
        {
            
// Get weapon name
            
new wname[32]
            
get_weaponname(weaponidwnamecharsmax(wname))
            
            
// Strip weapon and remove bpammo
            
ham_strip_weapon(idwname)
            
cs_set_user_bpammo(idweaponid0)
        }
    }
}

stock ham_strip_weapon(index, const weapon[])
{
    
// Get weapon id
    
new weaponid get_weaponid(weapon)
    if (!
weaponid)
        return 
false;
    
    
// Get weapon entity
    
new weapon_ent fm_find_ent_by_owner(-1weaponindex)
    if (!
weapon_ent)
        return 
false;
    
    
// If it's the current weapon, retire first
    
new current_weapon_ent fm_cs_get_current_weapon_ent(index)
    new 
current_weapon pev_valid(current_weapon_ent) ? cs_get_weapon_id(current_weapon_ent) : -1
    
if (current_weapon == weaponid)
        
ExecuteHamB(Ham_Weapon_RetireWeaponweapon_ent)
    
    
// Remove weapon from player
    
if (!ExecuteHamB(Ham_RemovePlayerItemindexweapon_ent))
        return 
false;
    
    
// Kill weapon entity and fix pev_weapons bitsum
    
ExecuteHamB(Ham_Item_Killweapon_ent)
    
set_pev(indexpev_weaponspev(indexpev_weapons) & ~(1<<weaponid))
    return 
true;
}

// Find entity by its owner (from fakemeta_util)
stock fm_find_ent_by_owner(entity, const classname[], owner)
{
    while ((
entity engfunc(EngFunc_FindEntityByStringentity"classname"classname)) && pev(entitypev_owner) != owner) { /* keep looping */ }
    return 
entity;
}

// Get User Current Weapon Entity
stock fm_cs_get_current_weapon_ent(id)
{
    
// Prevent server crash if entity's private data not initalized
    
if (pev_valid(id) != PDATA_SAFE)
        return -
1;
    
    return 
get_pdata_cbase(idOFFSET_ACTIVE_ITEM);

and crossbow:
PHP Code:
/*
     Copyright © 2009, NiHiLaNTh

    Crossbow plugin is free software;
    you can redistribute it and/or modify it under the terms of the
    GNU General Public License as published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with HeadShot Detection; if not, write to the
    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.

    --- Intro ---
       This is Crossbow from HL.It costs 25 Ammo packs(default).To attack press attack1
    button, to use zoom press attack2.If you shoot while zooming crossbow just hit enemy/
    wall, but if you are shooting without zoom bolt will explode and do more damage.
    You have 10 bolts in a clip and 25 in a back pack.
    
    --- Credits ---
    NiHiLaNTh - Plugin
    VEN - Finding weapon entities
    Arkshine - Ham_Item_Deploy/getting fov/weapon animation/Ammo
    meTaLiCroSS - Weapon touch/Weapon drop after death
    Scorpieo - Alternative crossbow model
    
    --- CVARs --- 
    zp_crossbow_damage 175 Damage done by explosion
    zp_crossbow_damage2 1300 Damage done by bolt
    zp_crossbow_radius 175 Explosion radius
    zp_crossbow_one_round 1 // 1 - one round; 0 - until player got infected/killed
    zp_crossbow_knockback 10 // Knockback power
    
    --- Changelog ---
    v1.0 - First release
    v1.1 - Fixed bug where ammo was not updated correctly
         - Optimized bolt flight
         - Fixed crap runtime error
    v1.2 - Fixed some little bugs(ammo on zooming was not updated)
    v1.3 - Fixed bug with drop
    v1.4 - Fixed bug where player could reload infinite times
         - Fixed bug with score info
         - Added knockback from explosion
    v1.5 - Fixed bug where player were damaged and knockbacked, even he were not in radius     
         - Fixed bug where player with godmode still could get damage
         - Fixed bug where player could reload with full clip
         - Fixed bug where player couldn't purchase crossbow after using antidote
         - Added bleed stuff
         - Added alternative model
         - Fixed bug where player could shoot while reloading
    v1.6 - Improved damage calculation system for exploding bolt
         - Added CVAR for crossbow one-round-only keeping
         - Improved damage detection system for normal bolt
         - Fixed bug with crossbow drop after death
         - Some minor optimizations/changes
    v1.7 - Added knockback CVAR
         - Improved knockback from explosion
         - Fixed bug with score info
         - Optimized code a bit
         
    Any suggestions/improvements are welcome!!!
    
    If you find any bug - report it on Crossbow thread, which can be found here
            http://forums.alliedmods.net/showthread.php?t=101379
        
    --- Good Luck & Have Fun ;) ---
*/    

#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#include <zombieplague>

// Uncomment following if you want to see alternative model
//#define ALTERNATIVE_MODEL

// Plugin info
new const PLUGIN[] = "[ZP] Extra Item: Crossbow"
new const VERSION[] = "1.7"
new const AUTHOR[] = "NiHiLaNTh"

// Crossbow/Bolt models
#if defined ALTERNATIVE_MODEL
new const P_MODEL[] = "models/p_crossbow.mdl"
new const V_MODEL[] = "models/v_crossbow.mdl"
new const W_MODEL[] = "models/w_crossbow.mdl"
#else
new const P_MODEL[] = "models/p_crossbow.mdl"
new const V_MODEL[] = "models/v_crossbow.mdl"
new const W_MODEL[] = "models/w_crossbow.mdl"
#endif
new const BOLT_MODEL[] = "models/crossbow_bolt.mdl"

// Some sounds
new const XBOW_SHOOT[] = "weapons/xbow_fire1.wav"
new const XBOW_HITWALL[] = "weapons/xbow_hit1.wav"
new const XBOW_HITSTAB[] = "weapons/xbow_hitbod1.wav"
new const XBOW_RELOAD[] = "weapons/xbow_reload1.wav"

// Sprites
new const EXPLO_SPRITE[] = "sprites/zerogxplode.spr"
new const BLOOD_SPRITE[] = "sprites/blood.spr"
new const BLOODSPRAY_SPRITE[] = "sprites/bloodspray.spr"

// Cached sprite indexes
new sExplosBloodsBlood2

// CVAR pointers
new pDamagepDamage2pRadiuspOneRoundpKnockback

// Item ID
new g_crossbow

// Player variables
new g_hasXbow[33// whether player has Crossbow
new Float:g_last_shot_time[33// Last time Crossbow used
new g_FullClip[33// whether player has Full Clip
new g_bInReload[33]

// Max players
new g_maxplayers

// Global vars
new g_restarted

// Message ID's
new g_msgCurWeapong_msgAmmoXg_msgScoreInfo

// Weapon animation sequences
enum
{
    
crossbow_idle1,
    
crossbow_idle2,
    
crossbow_fidget1,
    
crossbow_fidget2,
    
crossbow_fire1,
    
crossbow_fire2,
    
crossbow_fire3,
    
crossbow_reload,
    
crossbow_draw1,
    
crossbow_draw2,
    
crossbow_holster1,
    
crossbow_holster2
}

// Item Cost
#define COST 25

// Precache
public plugin_precache()
{
    
// Models
    
precache_model(P_MODEL)
    
precache_model(V_MODEL)
    
precache_model(W_MODEL)
    
precache_model(BOLT_MODEL)

    
// Sounds
    
precache_sound(XBOW_SHOOT)
    
precache_sound(XBOW_HITWALL)
    
precache_sound(XBOW_HITSTAB)
    
precache_sound(XBOW_RELOAD)
    
precache_sound("weapons/357_cock1.wav")
    
    
// Sprites
    
sExplo precache_model(EXPLO_SPRITE)
    
sBlood precache_model(BLOOD_SPRITE)
    
sBlood2 precache_model(BLOODSPRAY_SPRITE)
}

// Init
public plugin_init()
{
    
// New plugin
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_cvar("zp_xbow_version"VERSIONFCVAR_SERVER|FCVAR_SPONLY)
    
    
// New extra item
    
g_crossbow zp_register_extra_item("Crossbow"COSTZP_TEAM_HUMAN)

    
// Events
    
register_event("HLTV""Event_NewRound""a""1=0""2=0");
    
register_event("TextMsg""Event_GameRestart""a""2=#Game_Commencing""2=#Game_will_restart_in");
    
    
// Log Event
    
register_logevent("LogEvent_RoundEnd"2"1=Round_End")
    
    
// Forwards
    
register_forward(FM_CmdStart"fw_CmdStart")
    
register_forward(FM_SetModel"fw_SetModel")
    
RegisterHam(Ham_Item_Deploy"weapon_awp""fw_CrossbowDeploy"1)
    
register_forward(FM_UpdateClientData"fw_UpdateClientData_Post"1)
    
register_forward(FM_Touch"fw_Touch")
    
RegisterHam(Ham_Killed"player""fw_PlayerKilled")
    
RegisterHam(Ham_Weapon_Reload"weapon_awp""fw_WeaponReload"1)
    
    
// Touches
    
register_touch("xbow_bolt""*""bolt_touch")
    
register_touch("xbow_bolt_xplode""*""bolt_touch2")
    
register_touch("drop_crossbow""player""crossbow_touch")
    
    
// CVARs
    
pDamage register_cvar("zp_crossbow_damage""175"// Damage done by expl
    
pDamage2 register_cvar("zp_crossbow_damage2""1000"// Damage done by bolt
    
pRadius register_cvar("zp_crossbow_radius""175")
    
pOneRound register_cvar("zp_crossbow_one_round""1")
    
pKnockback register_cvar("zp_crossbow_knockback""10")
    
    
// Store maxplayers in a global variable
    
g_maxplayers get_maxplayers()

    
// Messages
    
g_msgCurWeapon get_user_msgid("CurWeapon")
    
g_msgAmmoX get_user_msgid("AmmoX")
    
g_msgScoreInfo get_user_msgid("ScoreInfo")
}

// When client connected, he cant have our weapon
public client_connect(id)
{
    
g_hasXbow[id] = false
    g_FullClip
[id] = false
    g_bInReload
[id] = false
}

// Someone wants to buy our extra item
public zp_extra_item_selected(iditemid)
{
    if (
itemid == g_crossbow)
    {
        
// Already have it
        
if (g_hasXbow[id])
        {
            
// Warn player
            
client_print(idprint_center"Already have Crossbow!")
            return 
ZP_PLUGIN_HANDLED
        
}
        
// Otherwise you can buy it
        
else
        {
            
// Notice
            
client_print(idprint_chat"[ZP] You bought crossbow")
    
            
// Drop primary weapons if have
            
if (cs_get_user_hasprim(id))
                
engclient_cmd(id"drop")
    
            
// Give him awp
            
give_item(id"weapon_awp")
            
            
// Get weapon id
            
new weapon_id find_ent_by_owner(-1"weapon_awp"id)
            
            if (
weapon_id)
            {
                
// Set clip ammo
                
cs_set_weapon_ammo(weapon_id10)
            }
            
            
// Set bp ammo
            
cs_set_user_bpammo(idCSW_AWP50)
            
            
//client_print(id, print_chat, "BP AMMO: %d", cs_get_user_bpammo(id, CSW_AWP))
            
            // Change models
            
ChangeModels(id)
            
            
// Animation(bugfix)
            
UTIL_PlayWeaponAnimation(idcrossbow_draw1)
            
            
// Reset
            
g_hasXbow[id] = true
            g_FullClip
[id] = true
            g_bInReload
[id] = false
        
            
// Update HUD
            
UpdateHud(id)
        }
    }
    return 
PLUGIN_CONTINUE
}

// Target who have our weapon was infected - reset vars
public zp_user_infected_post(idinfectornemesis)
{
    if (
g_hasXbow[id])
    {
        
g_hasXbow[id] = false
        g_FullClip
[id] = false
        g_bInReload
[id] = false
        UpdateHud
(id)
        
        
UpdateScore(infectorid001)
        
        
// Bugfix
        
touch_fix(id)
    }
}

// New round started
public Event_NewRound()
{
    if (
g_restarted)
    {
        
// Strip from Crossnow if game have been restarted
        
for (new 1<= get_maxplayers(); i++)
        {
            if (
g_hasXbow[i])
            {
                
g_hasXbow[i] = false
                g_FullClip
[i] = false
                g_bInReload
[i] = false
            
}
        }
        
g_restarted false
    
}
}

// Restart
public Event_GameRestart()
{
    
g_restarted true
}

// Remove any dropped crossbows
public LogEvent_RoundEnd()
{
    if (
get_pcvar_num(pOneRound) == 1)
    {
        for (new 
1g_maxplayersi++)
        {
            
fm_strip_user_gun(iCSW_AWP)
            
g_hasXbow[i] = false
        
}
    }
    
    
// Find and remove all dropped crossbows
    
new ent find_ent_by_class(-1"drop_crossbow")
    if (
ent)
        
remove_entity(ent)
}

// Called when player start a command(shoot, jump etc.)
public fw_CmdStart(iduc_handleseed)
{
    
// Ignore dead zombies/nemesis/those who haven't our weapons
    
if (!is_user_alive(id) || zp_get_user_zombie(id) || zp_get_user_nemesis(id) || !g_hasXbow[id])
        return 
FMRES_IGNORED

    
// Get amo, clip, and weapon    
    
new ammoclipweapon get_user_weapon(idclipammo)
    
    
// Not AWP
    
if (weapon != CSW_AWP)
        return 
FMRES_IGNORED
        
    
// Buttons    
    
new buttons get_uc(uc_handleUC_Buttons)
    
    new 
ent find_ent_by_owner(-1"weapon_awp"id)
    
    
// Attack1 button was pressed
    
if (buttons IN_ATTACK)
    {
        
// We have enough ammo
        
if (clip>= && !g_bInReload[id])
        {
            
// Next shot time has come
            
if (get_gametime() - g_last_shot_time[id] > 2.0)
            {
                
// Get FOV(Arkshine)
                
new fovfov pev(idpev_fov)
                
                
// Default FOV
                
if (fov == 90)
                {
                    
FireCrossbow(id0)
                }
                
// Is zooming?
                
else
                    
FireCrossbow(id1)
                    
                
g_FullClip[id] = false    
                
                
// Decrease ammo
                
cs_set_weapon_ammo(entcs_get_weapon_ammo(get_pdata_cbase(id373)) - 1)
                    
                
// Update HUD
                
UpdateHud(id)
                
                
// Remember last shot time
                
g_last_shot_time[id] = get_gametime()
            }
        }
        
// If out of ammo
        
else if (clip <= || ammo <= 1)
        {
            
// Play empty sound
            
emit_sound(idCHAN_WEAPON"weapons/357_cock1.wav"VOL_NORMATTN_NORM0PITCH_NORM)
        }
        
        
// Remove attack button from their buttons mask
        
buttons &= ~IN_ATTACK
        set_uc
(uc_handleUC_Buttonsbuttons)
    }
    
    
// Attack2 button was pressed
    
if (buttons IN_ATTACK2)
    {
        
// Update HUD(bugfix)
        
UpdateHud(id)
    }
    
    return 
FMRES_HANDLED
}

// Usually called after player dropped weapons
public fw_SetModel(ent, const model[])
{
    
// Prevent invalid entity messages
    
if (!pev_valid(ent))
        return 
FMRES_IGNORED
        
    
// Not required model
    
if(!equali(model"models/w_awp.mdl")) 
        return 
FMRES_IGNORED
    
    
// Get owner and classname
    
new owner pev(entpev_owner)
    new 
classname[33]; pev(entpev_classnameclassnamecharsmax(classname))
    
    
// Entity classname is a weaponbox
    
if(equal(classname"weaponbox"))
    {
        
// The weapon owner has a crossbow
        
if(g_hasXbow[owner])
        {
            
// Strip from crossbow
            
g_hasXbow[owner] = false
            
            
// Set world model
            
engfunc(EngFunc_SetModelentW_MODEL)
            
            
// Update HUD
            
UpdateHud(owner)
            
            
// Touch fix
            
set_task(0.1"touch_fix"owner)
            
            return 
FMRES_SUPERCEDE
        
}
    }
    
    return 
FMRES_IGNORED
    
}

// Called when player is holding this weapon
public fw_CrossbowDeploy(iEnt)
{
    
// Get ID
    
new id get_pdata_cbase(iEnt415)
    
    if (
g_hasXbow[id])
    {
        
// Change models
        
ChangeModels(id)
        
        
// Play animation
        
UTIL_PlayWeaponAnimation(idcrossbow_draw1)
        
        
// Update HUD
        
UpdateHud(id)
        
        
g_bInReload[id] = false
        
        
// Start to reload if clip less than 0(bugfix)
        
new awpclip get_pdata_int(iEnt515)
        if (
awpclip <= 0)
            
fw_WeaponReload(iEnt)
    }
}

// Update client data
public fw_UpdateClientData_Post(idswcd_handle)
{
    
// Ignore dead zombies/nemesis/those who haven't our weapons
    
if (!is_user_alive(id) || zp_get_user_zombie(id) || zp_get_user_nemesis(id) || !g_hasXbow[id])
        return 
FMRES_IGNORED
    
    
// Get ammo, clip and weapon
    
new ammoclipweapon get_user_weapon(idclipammo)
    
    
// Not AWP
    
if (weapon != CSW_AWP)
        return 
FMRES_IGNORED
    
    
// Block default sounds
    //set_cd(cd_handle, CD_ID, 0)
    
set_cd(cd_handleCD_flNextAttackhalflife_time() + 0,001)
    return 
FMRES_HANDLED
}

// Called when player touch something
public fw_Touch(ptrptd)
{
    
// Invalid ent/toucher
    
if(!pev_valid(ptr) || !pev_valid(ptd))
        return 
FMRES_IGNORED;
    
    
// Get model, toucherclass, entityclass
    
new model[33], toucherclass[33], entityclass[33]
    
pev(ptrpev_modelmodelcharsmax(model))
    
pev(ptrpev_classnameentityclasscharsmax(entityclass))
    
pev(ptdpev_classnametoucherclasscharsmax(toucherclass))
    
    
// TOucher isn't player and entity isn't weapon
    
if (!equali(toucherclass"player") || !equali(entityclass"weaponbox"))
        return 
FMRES_IGNORED
    
    
// Our world model
    
if(equali(modelW_MODEL))
    {
        
// If allowed to touch
        
if(allowed_toucher(ptd))
        {
            
// Pick up weapon
            
g_hasXbow[ptd] = true
        
}
    }
            
    return 
FMRES_IGNORED;
}

// Called when player died
public fw_PlayerKilled(victimattackershouldgib)
{
    if (
g_hasXbow[victim])
    {
        
g_hasXbow[victim] = false
        
        
// Drop crossbow
        
crossbow_drop(victim)
    }
}

// Called on reload
public fw_WeaponReload(iEnt)
{
    
// Get ID 
    
new id get_pdata_cbase(iEnt415)

    
// Has crossbow 
    
if (g_hasXbow[id] && !g_FullClip[id])
    {
        
set_pdata_int(iEnt5414)
        
        
// Set animation
        
UTIL_PlayWeaponAnimation(idcrossbow_reload)
        
        
// Emit sound
        
emit_sound(idCHAN_WEAPONXBOW_RELOADVOL_NORMATTN_NORM0PITCH_NORM)
    
        
// Update HUD
        
UpdateHud(id)
        
        
g_FullClip[id] = true
        g_bInReload
[id] = true
        
        
// Remove reload task
        
set_task(4.0"no_reload"id)
    }
}    

// Fire crossbow
public FireCrossbow(idtype)
{
    
// Play animation
    
UTIL_PlayWeaponAnimation(idcrossbow_fire1)
    
    
// Get origin, angle, and velocity
    
new Float:fOrigin[3], Float:fAngle[3], Float:fVelocity[3]
    
pev(idpev_originfOrigin)
    
pev(idpev_v_anglefAngle)
    
    
// New ent
    
new ent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"));
    
    
// Not ent
    
if (!ent) return PLUGIN_HANDLED
    
    
// If player shot while zooming...
    
if (type == 1)
    {
        
// Set classnames
        
entity_set_string(entEV_SZ_classname"xbow_bolt")
    }
    else
    {
        
entity_set_string(entEV_SZ_classname"xbow_bolt_xplode")
    }
    
    
// Set bolt model
    
entity_set_model(entBOLT_MODEL)
    
    
// Size
    
new Float:mins[3] = {-1.0, -1.0, -1.0}
    new 
Float:maxs[3] = {1.01.01.0}
    
entity_set_size(entminsmaxs)
    
    
// Movetype
    
entity_set_int(entEV_INT_movetypeMOVETYPE_FLY)
    
    
// Interaction
    
entity_set_int(entEV_INT_solidSOLID_TRIGGER)
    
    
// Owner
    
entity_set_edict(entEV_ENT_ownerid)
    
    new 
Float:origin[3];
    
    
// Velocity
    
velocity_by_aim(id64fVelocity);
    
pev(idpev_originorigin);
    
    
fOrigin[0] += fVelocity[0];
    
fOrigin[1] += fVelocity[1];
    
    
// Set origin
    
engfunc(EngFunc_SetOriginentfOrigin)
    
    
// Set bolt velocity
    
new Float:velocity[3]
    
velocity_by_aim(id2000velocity);
    
set_pev(entpev_velocityvelocity);
    
//set_pev(ent, pev_speed, 300.0)
    
    // Correct bolt flight
    
vector_to_angle(velocityfAngle);
    
    
// Set angle
    
set_pev(entpev_anglesfAngle);
    
    
// Play sound
    
emit_sound(idCHAN_WEAPONXBOW_SHOOTVOL_NORMATTN_NORM0PITCH_NORM)
    
    return 
PLUGIN_CONTINUE
}

// Normal bolt touched something
public bolt_touch(boltent)
{
    
// Invalid ent
    
if (!pev_valid(bolt))
    {
        
//client_print(0, print_chat, "Error! Invalid entity %d", bolt)
        
return
    }
    
    
// GEt owner and classname    
    
new owner pev(boltpev_owner);
    new 
classname[32]; pev(entpev_classnameclassname31)
    
    
// Get it's origin
    
new Float:originF[3], aimvec[3], tidbody
    pev
(boltpev_originoriginF)
    
get_user_origin(owneraimvec3)
    
get_user_aiming(ownertidbody)
    
    if (
equal(classname"player"))
    {
        
// Alive...
        
if (is_user_alive(tid) == && get_user_godmode(tid) == 0)
        {
            
// Zombie/Nemesis
            
if (zp_get_user_zombie(tid) || zp_get_user_nemesis(tid))
            {    
                
// Get origina and distance
                
new Float:VictimOrigin[3]
                
pev(tidpev_originVictimOrigin)
                    
                
// We hit them
                
emit_sound(tidCHAN_WEAPONXBOW_HITSTABVOL_NORMATTN_NORM0PITCH_NORM)
                
                
// Do fake damage
                
fakedamage(tid"crossbow"0.0DMG_PARALYZE)
                    
                
// Health/Damage
                
new health get_user_health(tid)
                new 
damage get_pcvar_num(pDamage2)
                        
                if (
health damage >= 1)
                {
                    
set_user_health(tidhealth  damage)
                        
                    
// Create blood
                    
ShowSomeBlood(VictimOrigin)
                    
                    
//client_print(owner, print_chat, "===>DAMADE %d<===", damage)
                
}
                else
                {
                    
// Kill them
                    //user_silentkill(tid)
                        
                    // Log this
                    
log_kill(ownertid"crossbow"0)
                    
                    
// Set new Ammo Packs
                    
zp_set_user_ammo_packs(ownerzp_get_user_ammo_packs(owner) + 1)
                }
                
            }
            
// Destroy ent
            
set_pev(boltpev_flagsFL_KILLME)
        }
    }
    
// Not a player(wall etc.)
    
if (!equal(classname"player"))
    {
        
// Play sound
        
emit_sound(boltCHAN_WEAPONXBOW_HITWALLVOL_NORMATTN_NORM0PITCH_NORM)
        
        
// Destroy ent
        
set_pev(boltpev_flagsFL_KILLME)
    }
}
    
// Exploding bolt touched something
public bolt_touch2(bolt2ent)
{
    
// Invalid ent
    
if (!pev_valid(bolt2))
        return
    
    
// GEt owner and classname
    
new owner pev(bolt2pev_owner);
    new 
classname[32]; pev(entpev_classnameclassname31)
    
    
// Get it's origin
    
new Float:originV[3]
    
pev(bolt2pev_originoriginV)
    
    
// Draw explosion
    
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
    
write_byte(TE_EXPLOSION)
    
engfunc(EngFunc_WriteCoordoriginV[0])
    
engfunc(EngFunc_WriteCoordoriginV[1])
    
engfunc(EngFunc_WriteCoordoriginV[2])
    
write_short(sExplo)
    
write_byte(15)
    
write_byte(15)
    
write_byte(0)
    
message_end()
    
    
// Loop through all players
    
for(new 1g_maxplayersi++)
    {
        
// Alive...
        
if (is_user_alive(i) == && get_user_godmode(i) == 0)
        {
            
// Zombie/Nemesis
            
if (zp_get_user_zombie(i) || zp_get_user_nemesis(i))
            {
                
// Get origina and distance
                
new Float:VictimOrigin[3], Float:distance_fdistance
                pev
(ipev_originVictimOrigin)
                
distance_f get_distance_f(originVVictimOrigin)
                
distance floatround(distance_f)
                
                if (
distance <= get_pcvar_float(pRadius))
                {
                    
// Fake damage
                    
fakedamage(i"crossbow"0.0DMG_BLAST)
                    
                    
// Get health/dmg/damage ratio
                    
new Float:dratiodamage
                    dratio 
floatdiv(float(distance),float(get_pcvar_num(pRadius)))
                    
damage get_pcvar_num(pDamage) - floatround(floatmul(float(get_pcvar_num(pDamage)), dratio))
                    new 
health get_user_health(i)
                    
                    
// Make some knockback
                    
new Float:knockback get_pcvar_float(pKnockback)
                    
make_knockback(ioriginVknockback*damage)    
                    
                    if (
health damage >= 1)
                    {
                        
set_user_health(ihealth damage)
                        
                        
// Create blood
                        
ShowSomeBlood(VictimOrigin)
                        
                        
//client_print(owner, print_chat, "===>DAMADE %d<===", damage)
                    
}
                    else
                    {
                        
// Silently kill
                        //user_silentkill(i)
                        
                        // Log this
                        
log_kill(owneri"crossbow"0)
                        
                        
// Set ammo packs
                        
zp_set_user_ammo_packs(ownerzp_get_user_ammo_packs(owner) + 1)
                    }
                }
            }
            
set_pev(bolt2pev_flagsFL_KILLME)
        }
    }
}    

// Crossbow dropped
public crossbow_drop(id)
{
    
// Get aimvec and origin
    
static Float:flAim[3], Float:flOrigin[3]
    
VelocityByAim(id64flAim)
    
entity_get_vector(idEV_VEC_originflOrigin)
    
    
// Change them a bit
    
flOrigin[0] += flAim[0]
    
flOrigin[1] += flAim[1]
    
    
// New ent
    
new iEnt create_entity("info_target")
    
    
// Classname
    
entity_set_string(iEntEV_SZ_classname"drop_crossbow")
    
    
// Origin
    
entity_set_origin(iEntflOrigin)
    
    
// Model
    
entity_set_model(iEntW_MODEL)
    
    
// Size
    
new Float:mins[3] = {-1.0, -1.0, -1.0}
    new 
Float:maxs[3] = {1.01.01.0}
    
entity_set_vector(iEntEV_VEC_minsmins)
    
entity_set_vector(iEntEV_VEC_maxsmaxs)
    
    
// Interaction
    
entity_set_int(iEntEV_INT_solidSOLID_TRIGGER)
    
    
// Movetype
    
entity_set_int(iEntEV_INT_movetypeMOVETYPE_TOSS)
    
    
// Vars
    
g_hasXbow[id] = false
    g_FullClip
[id]  = false
    g_bInReload
[id] = false    
}

// Touch
public crossbow_touch(xbowid)
{
    
// Prevent invalid ent messages
    
if (!is_valid_ent(xbow) || !is_valid_ent(id))
        return 
PLUGIN_CONTINUE
        
    
// Not allowed to touch    
    
if (zp_get_user_zombie(id) || zp_get_user_nemesis(id) || g_hasXbow[id])
        return 
PLUGIN_CONTINUE
        
    
// Reset vars
    
g_hasXbow[id]  = true
    g_bInReload
[id] = false
    
    
// Give awp
    
give_item(id"weapon_awp")
    
    
// Change models
    
ChangeModels(id)
    
    
// Set ammo
    
cs_set_user_bpammo(idCSW_AWP20)
    
    
// Remove crossbow on ground
    
remove_entity(xbow)
    
    return 
PLUGIN_CONTINUE
}
        
// Touch fix
public touch_fix(id)
{
    if (
g_hasXbow[id])
        
g_hasXbow[id] = false
        
    UpdateHud
(id)    
}

// Change models
stock ChangeModels(id)
{
    
set_pev(idpev_viewmodel2V_MODEL);
    
set_pev(idpev_weaponmodel2P_MODEL);
}

// Play animation(Arkshine)
stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
    
set_pev(Playerpev_weaponanimSequence);
    
    
message_begin(MSG_ONE_UNRELIABLESVC_WEAPONANIM, .player Player);
    
write_byte(Sequence);
    
write_byte(pev(Playerpev_body));
    
message_end();
}

// Update HUD(Arkshine)
stock UpdateHud(Player)
{
    
// This set clip ammo
    
message_begin(MSG_ONE_UNRELIABLEg_msgCurWeapon, .player Player);
    
write_byte(true);
    
write_byte(CSW_AWP);
    
write_byte(cs_get_weapon_ammo(get_pdata_cbase(Player373)))
    
message_end()
    
    
// This set BP ammo
    
message_begin(MSG_ONE_UNRELIABLEg_msgAmmoX, .player Player);
    
write_byte(CSW_AWP);
    
write_byte(cs_get_user_bpammo(PlayerCSW_AWP));
    
message_end();    
}

// Log kill
stock log_kill(killervictimweapon[],headshot
{
    
set_msg_block(get_user_msgid("DeathMsg"), BLOCK_SET)
    
ExecuteHamB(Ham_Killedvictimkiller2)
    
set_msg_block(get_user_msgid("DeathMsg"), BLOCK_NOT)
    
    
message_begin(MSG_ALLget_user_msgid("DeathMsg"), {0,0,0}, 0)
    
write_byte(killer)
    
write_byte(victim)
    
write_byte(headshot)
    
write_string(weapon)
    
message_end()
    
    
//if(zp_get_user_zombie(victim) || zp_get_user_nemesis(victim))
    //{
    //    new frags  = get_user_frags(killer)
    //    set_pev(killer, pev_frags, float(pev(killer, pev_frags) + 1))
    //}
    
    
new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10]
    
    
get_user_name(killerkname31)
    
get_user_team(killerkteam9)
    
get_user_authid(killerkauthid31)
    
    
get_user_name(victimvname31)
    
get_user_team(victimvteam9)
    
get_user_authid(victimvauthid31)
    
    
log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^""
    
knameget_user_userid(killer), kauthidkteam
    
vnameget_user_userid(victim), vauthidvteamweapon)
    
    
UpdateScore(killervictim0,01)
    
    return 
PLUGIN_CONTINUE
}

// Allowed toucher
stock allowed_toucher(player)
{
    
// Already has it
    
if (g_hasXbow[player] || zp_get_user_zombie(player) || zp_get_user_nemesis(player))
        return 
false
    
    
return true
}    

// From WeaponMod
stock make_knockback(victimFloat:origin[3], Float:maxspeed)
{
    
// Get and set velocity
    
new Float:fVelocity[3];
    
kickback(victimoriginmaxspeedfVelocity)
    
entity_set_vector(victimEV_VEC_velocityfVelocity);

    return (
1);
}

// Blood!!!
stock ShowSomeBlood(const Float:origin[3])
{
    
message_begin(MSG_BROADCASTSVC_TEMPENTITY
    
write_byte(TE_BLOODSPRITE// Spr ID
    
write_coord(floatround(origin[0]+random_num(-20,20))) // Positions X...
    
write_coord(floatround(origin[1]+random_num(-20,20))) // Y
    
write_coord(floatround(origin[2]+random_num(-20,20))) // Z
    
write_short(sBlood// 
    
write_short(sBlood2)
    
write_byte(248// Color
    
write_byte(5// Amount
    
message_end()
}

// Remove reloading
public no_reload(id)
{
    if (
g_bInReload[id])
        
g_bInReload[id] = false
}

// From fakemeta_util.inc(VEN)
stock bool:fm_strip_user_gun(indexwid 0, const wname[] = ""
{
    if (!
is_user_alive(index) || !is_user_connected(index))
        return 
false
    
    
new ent_class[32];
    if (!
wid && wname[0])
        
copy(ent_classsizeof ent_class 1wname);
    else 
    {
        new 
weapon widclipammo;
        if (!
weapon && !(weapon get_user_weapon(indexclipammo)))
            return 
false;
        
        
get_weaponname(weaponent_classsizeof ent_class 1);
    }

    new 
ent_weap find_ent_by_owner(-1ent_classindex);
    if (!
ent_weap)
        return 
false;

    
engclient_cmd(index"drop"ent_class);

    new 
ent_box pev(ent_weappev_owner);
    if (!
ent_box || ent_box == index)
        return 
false;

    
dllfunc(DLLFunc_Thinkent_box);

    return 
true;
}

// Extra calulation for knockback
stock kickback(entFloat:fOrigin[3], Float:fSpeedFloat:fVelocity[3])
{
    
// Find origin
    
new Float:fEntOrigin[3];
    
entity_get_vectorentEV_VEC_originfEntOrigin );

    
// Do some calculations
    
new Float:fDistance[3];
    
fDistance[0] = fEntOrigin[0] - fOrigin[0];
    
fDistance[1] = fEntOrigin[1] - fOrigin[1];
    
fDistance[2] = fEntOrigin[2] - fOrigin[2];
    new 
Float:fTime = (vector_distancefEntOrigin,fOrigin ) / fSpeed);
    
fVelocity[0] = fDistance[0] / fTime;
    
fVelocity[1] = fDistance[1] / fTime;
    
fVelocity[2] = fDistance[2] / fTime;

    return (
fVelocity[0] && fVelocity[1] && fVelocity[2]);
}

// Update score (bugfix)
stock UpdateScore(attackervictimfragsdeathsscoreboard)
{
    
set_pev(attackerpev_fragsfloat(pev(attackerpev_frags) + frags))
    
    
cs_set_user_deaths(victimcs_get_user_deaths(victim) + deaths)
    
    if (
scoreboard)
    {
        
message_begin(MSG_BROADCASTg_msgScoreInfo)
        
write_byte(attacker// id
        
write_short(pev(attackerpev_frags)) // frags
        
write_short(cs_get_user_deaths(attacker)) // deaths
        
write_short(0// class?
        
write_short(get_user_team(attacker)) // team
        
message_end()
        
        
message_begin(MSG_BROADCASTg_msgScoreInfo)
        
write_byte(victim// id
        
write_short(pev(victimpev_frags)) // frags
        
write_short(cs_get_user_deaths(victim)) // deaths
        
write_short(0// class?
        
write_short(get_user_team(victim)) // team
        
message_end()
    }
}


/*stock fm_get_weapon_id(index, const weapon[])
{
    new ent = -1;
 
    while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", weapon)) != 0)
    {
        if(index == pev(ent, pev_owner))
        return ent;
    }
    return 1;
}

stock give_weapon(id, wpnID, ammo, bpammo) 
{
    new weapon[32]
    get_weaponname(wpnID, weapon, 31)
    
    give_item(id, weapon)
    cs_set_weapon_ammo(fm_get_weapon_id(id, weapon), ammo);
    cs_set_user_bpammo(id, wpnID, cs_get_user_bpammo(id, wpnID) + bpammo)
}*/ 
ZPhugeFan is offline
Catastrophe
Veteran Member
Join Date: Jul 2012
Location: somewhere between narnia
Old 09-20-2013 , 11:00   Re: [HOW?] Different weapon for special class
Reply With Quote #4

Try this :-

PHP Code:
/*
     Copyright © 2009, NiHiLaNTh

    Crossbow plugin is free software;
    you can redistribute it and/or modify it under the terms of the
    GNU General Public License as published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with HeadShot Detection; if not, write to the
    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.

    --- Intro ---
       This is Crossbow from HL.It costs 25 Ammo packs(default).To attack press attack1
    button, to use zoom press attack2.If you shoot while zooming crossbow just hit enemy/
    wall, but if you are shooting without zoom bolt will explode and do more damage.
    You have 10 bolts in a clip and 25 in a back pack.
    
    --- Credits ---
    NiHiLaNTh - Plugin
    VEN - Finding weapon entities
    Arkshine - Ham_Item_Deploy/getting fov/weapon animation/Ammo
    meTaLiCroSS - Weapon touch/Weapon drop after death
    Scorpieo - Alternative crossbow model
    
    --- CVARs --- 
    zp_crossbow_damage 175 Damage done by explosion
    zp_crossbow_damage2 1300 Damage done by bolt
    zp_crossbow_radius 175 Explosion radius
    zp_crossbow_one_round 1 // 1 - one round; 0 - until player got infected/killed
    zp_crossbow_knockback 10 // Knockback power
    
    --- Changelog ---
    v1.0 - First release
    v1.1 - Fixed bug where ammo was not updated correctly
         - Optimized bolt flight
         - Fixed crap runtime error
    v1.2 - Fixed some little bugs(ammo on zooming was not updated)
    v1.3 - Fixed bug with drop
    v1.4 - Fixed bug where player could reload infinite times
         - Fixed bug with score info
         - Added knockback from explosion
    v1.5 - Fixed bug where player were damaged and knockbacked, even he were not in radius     
         - Fixed bug where player with godmode still could get damage
         - Fixed bug where player could reload with full clip
         - Fixed bug where player couldn't purchase crossbow after using antidote
         - Added bleed stuff
         - Added alternative model
         - Fixed bug where player could shoot while reloading
    v1.6 - Improved damage calculation system for exploding bolt
         - Added CVAR for crossbow one-round-only keeping
         - Improved damage detection system for normal bolt
         - Fixed bug with crossbow drop after death
         - Some minor optimizations/changes
    v1.7 - Added knockback CVAR
         - Improved knockback from explosion
         - Fixed bug with score info
         - Optimized code a bit
         
    Any suggestions/improvements are welcome!!!
    
    If you find any bug - report it on Crossbow thread, which can be found here
            http://forums.alliedmods.net/showthread.php?t=101379
        
    --- Good Luck & Have Fun ;) ---
*/    

#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#include <zombieplague>
#include <zp50_core>

// Uncomment following if you want to see alternative model
//#define ALTERNATIVE_MODEL

// Plugin info
new const PLUGIN[] = "[ZP] Extra Item: Crossbow"
new const VERSION[] = "1.7"
new const AUTHOR[] = "NiHiLaNTh"

// Crossbow/Bolt models
#if defined ALTERNATIVE_MODEL
new const P_MODEL[] = "models/p_crossbow.mdl"
new const V_MODEL[] = "models/v_crossbow.mdl"
new const W_MODEL[] = "models/w_crossbow.mdl"
#else
new const P_MODEL[] = "models/p_crossbow.mdl"
new const V_MODEL[] = "models/v_crossbow.mdl"
new const W_MODEL[] = "models/w_crossbow.mdl"
#endif
new const BOLT_MODEL[] = "models/crossbow_bolt.mdl"

// Some sounds
new const XBOW_SHOOT[] = "weapons/xbow_fire1.wav"
new const XBOW_HITWALL[] = "weapons/xbow_hit1.wav"
new const XBOW_HITSTAB[] = "weapons/xbow_hitbod1.wav"
new const XBOW_RELOAD[] = "weapons/xbow_reload1.wav"

// Sprites
new const EXPLO_SPRITE[] = "sprites/zerogxplode.spr"
new const BLOOD_SPRITE[] = "sprites/blood.spr"
new const BLOODSPRAY_SPRITE[] = "sprites/bloodspray.spr"

// Cached sprite indexes
new sExplosBloodsBlood2

// CVAR pointers
new pDamagepDamage2pRadiuspOneRoundpKnockback

// Item ID
new g_crossbow

// Player variables
new g_hasXbow[33// whether player has Crossbow
new Float:g_last_shot_time[33// Last time Crossbow used
new g_FullClip[33// whether player has Full Clip
new g_bInReload[33]

// Max players
new g_maxplayers

// Global vars
new g_restarted

// Message ID's
new g_msgCurWeapong_msgAmmoXg_msgScoreInfo

// Weapon animation sequences
enum
{
    
crossbow_idle1,
    
crossbow_idle2,
    
crossbow_fidget1,
    
crossbow_fidget2,
    
crossbow_fire1,
    
crossbow_fire2,
    
crossbow_fire3,
    
crossbow_reload,
    
crossbow_draw1,
    
crossbow_draw2,
    
crossbow_holster1,
    
crossbow_holster2
}

// Item Cost
#define COST 25

// Precache
public plugin_precache()
{
    
// Models
    
precache_model(P_MODEL)
    
precache_model(V_MODEL)
    
precache_model(W_MODEL)
    
precache_model(BOLT_MODEL)

    
// Sounds
    
precache_sound(XBOW_SHOOT)
    
precache_sound(XBOW_HITWALL)
    
precache_sound(XBOW_HITSTAB)
    
precache_sound(XBOW_RELOAD)
    
precache_sound("weapons/357_cock1.wav")
    
    
// Sprites
    
sExplo precache_model(EXPLO_SPRITE)
    
sBlood precache_model(BLOOD_SPRITE)
    
sBlood2 precache_model(BLOODSPRAY_SPRITE)
}

// Init
public plugin_init()
{
    
// New plugin
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_cvar("zp_xbow_version"VERSIONFCVAR_SERVER|FCVAR_SPONLY)
    
    
// New extra item
    
g_crossbow zp_register_extra_item("Crossbow"COSTZP_TEAM_HUMAN)

    
// Events
    
register_event("HLTV""Event_NewRound""a""1=0""2=0");
    
register_event("TextMsg""Event_GameRestart""a""2=#Game_Commencing""2=#Game_will_restart_in");
    
    
// Log Event
    
register_logevent("LogEvent_RoundEnd"2"1=Round_End")
    
    
// Forwards
    
register_forward(FM_CmdStart"fw_CmdStart")
    
register_forward(FM_SetModel"fw_SetModel")
    
RegisterHam(Ham_Item_Deploy"weapon_awp""fw_CrossbowDeploy"1)
    
register_forward(FM_UpdateClientData"fw_UpdateClientData_Post"1)
    
register_forward(FM_Touch"fw_Touch")
    
RegisterHam(Ham_Killed"player""fw_PlayerKilled")
    
RegisterHam(Ham_Weapon_Reload"weapon_awp""fw_WeaponReload"1)
    
    
// Touches
    
register_touch("xbow_bolt""*""bolt_touch")
    
register_touch("xbow_bolt_xplode""*""bolt_touch2")
    
register_touch("drop_crossbow""player""crossbow_touch")
    
    
// CVARs
    
pDamage register_cvar("zp_crossbow_damage""175"// Damage done by expl
    
pDamage2 register_cvar("zp_crossbow_damage2""1000"// Damage done by bolt
    
pRadius register_cvar("zp_crossbow_radius""175")
    
pOneRound register_cvar("zp_crossbow_one_round""1")
    
pKnockback register_cvar("zp_crossbow_knockback""10")
    
    
// Store maxplayers in a global variable
    
g_maxplayers get_maxplayers()

    
// Messages
    
g_msgCurWeapon get_user_msgid("CurWeapon")
    
g_msgAmmoX get_user_msgid("AmmoX")
    
g_msgScoreInfo get_user_msgid("ScoreInfo")
}

// When client connected, he cant have our weapon
public client_connect(id)
{
    
g_hasXbow[id] = false
    g_FullClip
[id] = false
    g_bInReload
[id] = false
}

// Someone wants to buy our extra item
public zp_extra_item_selected(iditemid)
{
    if (
itemid == g_crossbow)
    {
        
// Already have it
        
if (g_hasXbow[id])
        {
            
// Warn player
            
client_print(idprint_center"Already have Crossbow!")
            return 
ZP_PLUGIN_HANDLED
        
}
        
// Otherwise you can buy it
        
else
        {
            
// Notice
            
client_print(idprint_chat"[ZP] You bought crossbow")
    
            
// Drop primary weapons if have
            
if (cs_get_user_hasprim(id))
                
engclient_cmd(id"drop")
    
            
// Give him awp
            
give_item(id"weapon_awp")
            
            
// Get weapon id
            
new weapon_id find_ent_by_owner(-1"weapon_awp"id)
            
            if (
weapon_id)
            {
                
// Set clip ammo
                
cs_set_weapon_ammo(weapon_id10)
            }
            
            
// Set bp ammo
            
cs_set_user_bpammo(idCSW_AWP50)
            
            
//client_print(id, print_chat, "BP AMMO: %d", cs_get_user_bpammo(id, CSW_AWP))
            
            // Change models
            
ChangeModels(id)
            
            
// Animation(bugfix)
            
UTIL_PlayWeaponAnimation(idcrossbow_draw1)
            
            
// Reset
            
g_hasXbow[id] = true
            g_FullClip
[id] = true
            g_bInReload
[id] = false
        
            
// Update HUD
            
UpdateHud(id)
        }
    }
    return 
PLUGIN_CONTINUE
}

// Target who have our weapon was infected - reset vars
public zp_user_infected_post(idinfectornemesis)
{
    if (
g_hasXbow[id])
    {
        
g_hasXbow[id] = false
        g_FullClip
[id] = false
        g_bInReload
[id] = false
        UpdateHud
(id)
        
        
UpdateScore(infectorid001)
        
        
// Bugfix
        
touch_fix(id)
    }
}

// New round started
public Event_NewRound()
{
    if (
g_restarted)
    {
        
// Strip from Crossnow if game have been restarted
        
for (new 1<= get_maxplayers(); i++)
        {
            if (
g_hasXbow[i])
            {
                
g_hasXbow[i] = false
                g_FullClip
[i] = false
                g_bInReload
[i] = false
            
}
        }
        
g_restarted false
    
}
}
 
public 
zp_fw_core_cure_post(id)
{
       if(
zp_class_survivor_get(id))
       {

            if (
cs_get_user_hasprim(id))
            
engclient_cmd(id"drop")
    
            
give_item(id"weapon_awp")
           
            new 
weapon_id find_ent_by_owner(-1"weapon_awp"id)
            
            if (
weapon_id)
            {
                
cs_set_weapon_ammo(weapon_id10)
            }
            
            
cs_set_user_bpammo(idCSW_AWP50)
            
            
ChangeModels(id)
            
            
UTIL_PlayWeaponAnimation(idcrossbow_draw1)
            
            
g_hasXbow[id] = true
            g_FullClip
[id] = true
            g_bInReload
[id] = false
        
            UpdateHud
(id)

       }
}

// Restart
public Event_GameRestart()
{
    
g_restarted true
}

// Remove any dropped crossbows
public LogEvent_RoundEnd()
{
    if (
get_pcvar_num(pOneRound) == 1)
    {
        for (new 
1g_maxplayersi++)
        {
            
fm_strip_user_gun(iCSW_AWP)
            
g_hasXbow[i] = false
        
}
    }
    
    
// Find and remove all dropped crossbows
    
new ent find_ent_by_class(-1"drop_crossbow")
    if (
ent)
        
remove_entity(ent)
}

// Called when player start a command(shoot, jump etc.)
public fw_CmdStart(iduc_handleseed)
{
    
// Ignore dead zombies/nemesis/those who haven't our weapons
    
if (!is_user_alive(id) || zp_get_user_zombie(id) || zp_get_user_nemesis(id) || !g_hasXbow[id])
        return 
FMRES_IGNORED

    
// Get amo, clip, and weapon    
    
new ammoclipweapon get_user_weapon(idclipammo)
    
    
// Not AWP
    
if (weapon != CSW_AWP)
        return 
FMRES_IGNORED
        
    
// Buttons    
    
new buttons get_uc(uc_handleUC_Buttons)
    
    new 
ent find_ent_by_owner(-1"weapon_awp"id)
    
    
// Attack1 button was pressed
    
if (buttons IN_ATTACK)
    {
        
// We have enough ammo
        
if (clip>= && !g_bInReload[id])
        {
            
// Next shot time has come
            
if (get_gametime() - g_last_shot_time[id] > 2.0)
            {
                
// Get FOV(Arkshine)
                
new fovfov pev(idpev_fov)
                
                
// Default FOV
                
if (fov == 90)
                {
                    
FireCrossbow(id0)
                }
                
// Is zooming?
                
else
                    
FireCrossbow(id1)
                    
                
g_FullClip[id] = false    
                
                
// Decrease ammo
                
cs_set_weapon_ammo(entcs_get_weapon_ammo(get_pdata_cbase(id373)) - 1)
                    
                
// Update HUD
                
UpdateHud(id)
                
                
// Remember last shot time
                
g_last_shot_time[id] = get_gametime()
            }
        }
        
// If out of ammo
        
else if (clip <= || ammo <= 1)
        {
            
// Play empty sound
            
emit_sound(idCHAN_WEAPON"weapons/357_cock1.wav"VOL_NORMATTN_NORM0PITCH_NORM)
        }
        
        
// Remove attack button from their buttons mask
        
buttons &= ~IN_ATTACK
        set_uc
(uc_handleUC_Buttonsbuttons)
    }
    
    
// Attack2 button was pressed
    
if (buttons IN_ATTACK2)
    {
        
// Update HUD(bugfix)
        
UpdateHud(id)
    }
    
    return 
FMRES_HANDLED
}

// Usually called after player dropped weapons
public fw_SetModel(ent, const model[])
{
    
// Prevent invalid entity messages
    
if (!pev_valid(ent))
        return 
FMRES_IGNORED
        
    
// Not required model
    
if(!equali(model"models/w_awp.mdl")) 
        return 
FMRES_IGNORED
    
    
// Get owner and classname
    
new owner pev(entpev_owner)
    new 
classname[33]; pev(entpev_classnameclassnamecharsmax(classname))
    
    
// Entity classname is a weaponbox
    
if(equal(classname"weaponbox"))
    {
        
// The weapon owner has a crossbow
        
if(g_hasXbow[owner])
        {
            
// Strip from crossbow
            
g_hasXbow[owner] = false
            
            
// Set world model
            
engfunc(EngFunc_SetModelentW_MODEL)
            
            
// Update HUD
            
UpdateHud(owner)
            
            
// Touch fix
            
set_task(0.1"touch_fix"owner)
            
            return 
FMRES_SUPERCEDE
        
}
    }
    
    return 
FMRES_IGNORED
    
}

// Called when player is holding this weapon
public fw_CrossbowDeploy(iEnt)
{
    
// Get ID
    
new id get_pdata_cbase(iEnt415)
    
    if (
g_hasXbow[id])
    {
        
// Change models
        
ChangeModels(id)
        
        
// Play animation
        
UTIL_PlayWeaponAnimation(idcrossbow_draw1)
        
        
// Update HUD
        
UpdateHud(id)
        
        
g_bInReload[id] = false
        
        
// Start to reload if clip less than 0(bugfix)
        
new awpclip get_pdata_int(iEnt515)
        if (
awpclip <= 0)
            
fw_WeaponReload(iEnt)
    }
}

// Update client data
public fw_UpdateClientData_Post(idswcd_handle)
{
    
// Ignore dead zombies/nemesis/those who haven't our weapons
    
if (!is_user_alive(id) || zp_get_user_zombie(id) || zp_get_user_nemesis(id) || !g_hasXbow[id])
        return 
FMRES_IGNORED
    
    
// Get ammo, clip and weapon
    
new ammoclipweapon get_user_weapon(idclipammo)
    
    
// Not AWP
    
if (weapon != CSW_AWP)
        return 
FMRES_IGNORED
    
    
// Block default sounds
    //set_cd(cd_handle, CD_ID, 0)
    
set_cd(cd_handleCD_flNextAttackhalflife_time() + 0,001)
    return 
FMRES_HANDLED
}

// Called when player touch something
public fw_Touch(ptrptd)
{
    
// Invalid ent/toucher
    
if(!pev_valid(ptr) || !pev_valid(ptd))
        return 
FMRES_IGNORED;
    
    
// Get model, toucherclass, entityclass
    
new model[33], toucherclass[33], entityclass[33]
    
pev(ptrpev_modelmodelcharsmax(model))
    
pev(ptrpev_classnameentityclasscharsmax(entityclass))
    
pev(ptdpev_classnametoucherclasscharsmax(toucherclass))
    
    
// TOucher isn't player and entity isn't weapon
    
if (!equali(toucherclass"player") || !equali(entityclass"weaponbox"))
        return 
FMRES_IGNORED
    
    
// Our world model
    
if(equali(modelW_MODEL))
    {
        
// If allowed to touch
        
if(allowed_toucher(ptd))
        {
            
// Pick up weapon
            
g_hasXbow[ptd] = true
        
}
    }
            
    return 
FMRES_IGNORED;
}

// Called when player died
public fw_PlayerKilled(victimattackershouldgib)
{
    if (
g_hasXbow[victim])
    {
        
g_hasXbow[victim] = false
        
        
// Drop crossbow
        
crossbow_drop(victim)
    }
}

// Called on reload
public fw_WeaponReload(iEnt)
{
    
// Get ID 
    
new id get_pdata_cbase(iEnt415)

    
// Has crossbow 
    
if (g_hasXbow[id] && !g_FullClip[id])
    {
        
set_pdata_int(iEnt5414)
        
        
// Set animation
        
UTIL_PlayWeaponAnimation(idcrossbow_reload)
        
        
// Emit sound
        
emit_sound(idCHAN_WEAPONXBOW_RELOADVOL_NORMATTN_NORM0PITCH_NORM)
    
        
// Update HUD
        
UpdateHud(id)
        
        
g_FullClip[id] = true
        g_bInReload
[id] = true
        
        
// Remove reload task
        
set_task(4.0"no_reload"id)
    }
}    

// Fire crossbow
public FireCrossbow(idtype)
{
    
// Play animation
    
UTIL_PlayWeaponAnimation(idcrossbow_fire1)
    
    
// Get origin, angle, and velocity
    
new Float:fOrigin[3], Float:fAngle[3], Float:fVelocity[3]
    
pev(idpev_originfOrigin)
    
pev(idpev_v_anglefAngle)
    
    
// New ent
    
new ent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"));
    
    
// Not ent
    
if (!ent) return PLUGIN_HANDLED
    
    
// If player shot while zooming...
    
if (type == 1)
    {
        
// Set classnames
        
entity_set_string(entEV_SZ_classname"xbow_bolt")
    }
    else
    {
        
entity_set_string(entEV_SZ_classname"xbow_bolt_xplode")
    }
    
    
// Set bolt model
    
entity_set_model(entBOLT_MODEL)
    
    
// Size
    
new Float:mins[3] = {-1.0, -1.0, -1.0}
    new 
Float:maxs[3] = {1.01.01.0}
    
entity_set_size(entminsmaxs)
    
    
// Movetype
    
entity_set_int(entEV_INT_movetypeMOVETYPE_FLY)
    
    
// Interaction
    
entity_set_int(entEV_INT_solidSOLID_TRIGGER)
    
    
// Owner
    
entity_set_edict(entEV_ENT_ownerid)
    
    new 
Float:origin[3];
    
    
// Velocity
    
velocity_by_aim(id64fVelocity);
    
pev(idpev_originorigin);
    
    
fOrigin[0] += fVelocity[0];
    
fOrigin[1] += fVelocity[1];
    
    
// Set origin
    
engfunc(EngFunc_SetOriginentfOrigin)
    
    
// Set bolt velocity
    
new Float:velocity[3]
    
velocity_by_aim(id2000velocity);
    
set_pev(entpev_velocityvelocity);
    
//set_pev(ent, pev_speed, 300.0)
    
    // Correct bolt flight
    
vector_to_angle(velocityfAngle);
    
    
// Set angle
    
set_pev(entpev_anglesfAngle);
    
    
// Play sound
    
emit_sound(idCHAN_WEAPONXBOW_SHOOTVOL_NORMATTN_NORM0PITCH_NORM)
    
    return 
PLUGIN_CONTINUE
}

// Normal bolt touched something
public bolt_touch(boltent)
{
    
// Invalid ent
    
if (!pev_valid(bolt))
    {
        
//client_print(0, print_chat, "Error! Invalid entity %d", bolt)
        
return
    }
    
    
// GEt owner and classname    
    
new owner pev(boltpev_owner);
    new 
classname[32]; pev(entpev_classnameclassname31)
    
    
// Get it's origin
    
new Float:originF[3], aimvec[3], tidbody
    pev
(boltpev_originoriginF)
    
get_user_origin(owneraimvec3)
    
get_user_aiming(ownertidbody)
    
    if (
equal(classname"player"))
    {
        
// Alive...
        
if (is_user_alive(tid) == && get_user_godmode(tid) == 0)
        {
            
// Zombie/Nemesis
            
if (zp_get_user_zombie(tid) || zp_get_user_nemesis(tid))
            {    
                
// Get origina and distance
                
new Float:VictimOrigin[3]
                
pev(tidpev_originVictimOrigin)
                    
                
// We hit them
                
emit_sound(tidCHAN_WEAPONXBOW_HITSTABVOL_NORMATTN_NORM0PITCH_NORM)
                
                
// Do fake damage
                
fakedamage(tid"crossbow"0.0DMG_PARALYZE)
                    
                
// Health/Damage
                
new health get_user_health(tid)
                new 
damage get_pcvar_num(pDamage2)
                        
                if (
health damage >= 1)
                {
                    
set_user_health(tidhealth  damage)
                        
                    
// Create blood
                    
ShowSomeBlood(VictimOrigin)
                    
                    
//client_print(owner, print_chat, "===>DAMADE %d<===", damage)
                
}
                else
                {
                    
// Kill them
                    //user_silentkill(tid)
                        
                    // Log this
                    
log_kill(ownertid"crossbow"0)
                    
                    
// Set new Ammo Packs
                    
zp_set_user_ammo_packs(ownerzp_get_user_ammo_packs(owner) + 1)
                }
                
            }
            
// Destroy ent
            
set_pev(boltpev_flagsFL_KILLME)
        }
    }
    
// Not a player(wall etc.)
    
if (!equal(classname"player"))
    {
        
// Play sound
        
emit_sound(boltCHAN_WEAPONXBOW_HITWALLVOL_NORMATTN_NORM0PITCH_NORM)
        
        
// Destroy ent
        
set_pev(boltpev_flagsFL_KILLME)
    }
}
    
// Exploding bolt touched something
public bolt_touch2(bolt2ent)
{
    
// Invalid ent
    
if (!pev_valid(bolt2))
        return
    
    
// GEt owner and classname
    
new owner pev(bolt2pev_owner);
    new 
classname[32]; pev(entpev_classnameclassname31)
    
    
// Get it's origin
    
new Float:originV[3]
    
pev(bolt2pev_originoriginV)
    
    
// Draw explosion
    
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
    
write_byte(TE_EXPLOSION)
    
engfunc(EngFunc_WriteCoordoriginV[0])
    
engfunc(EngFunc_WriteCoordoriginV[1])
    
engfunc(EngFunc_WriteCoordoriginV[2])
    
write_short(sExplo)
    
write_byte(15)
    
write_byte(15)
    
write_byte(0)
    
message_end()
    
    
// Loop through all players
    
for(new 1g_maxplayersi++)
    {
        
// Alive...
        
if (is_user_alive(i) == && get_user_godmode(i) == 0)
        {
            
// Zombie/Nemesis
            
if (zp_get_user_zombie(i) || zp_get_user_nemesis(i))
            {
                
// Get origina and distance
                
new Float:VictimOrigin[3], Float:distance_fdistance
                pev
(ipev_originVictimOrigin)
                
distance_f get_distance_f(originVVictimOrigin)
                
distance floatround(distance_f)
                
                if (
distance <= get_pcvar_float(pRadius))
                {
                    
// Fake damage
                    
fakedamage(i"crossbow"0.0DMG_BLAST)
                    
                    
// Get health/dmg/damage ratio
                    
new Float:dratiodamage
                    dratio 
floatdiv(float(distance),float(get_pcvar_num(pRadius)))
                    
damage get_pcvar_num(pDamage) - floatround(floatmul(float(get_pcvar_num(pDamage)), dratio))
                    new 
health get_user_health(i)
                    
                    
// Make some knockback
                    
new Float:knockback get_pcvar_float(pKnockback)
                    
make_knockback(ioriginVknockback*damage)    
                    
                    if (
health damage >= 1)
                    {
                        
set_user_health(ihealth damage)
                        
                        
// Create blood
                        
ShowSomeBlood(VictimOrigin)
                        
                        
//client_print(owner, print_chat, "===>DAMADE %d<===", damage)
                    
}
                    else
                    {
                        
// Silently kill
                        //user_silentkill(i)
                        
                        // Log this
                        
log_kill(owneri"crossbow"0)
                        
                        
// Set ammo packs
                        
zp_set_user_ammo_packs(ownerzp_get_user_ammo_packs(owner) + 1)
                    }
                }
            }
            
set_pev(bolt2pev_flagsFL_KILLME)
        }
    }
}    

// Crossbow dropped
public crossbow_drop(id)
{
    
// Get aimvec and origin
    
static Float:flAim[3], Float:flOrigin[3]
    
VelocityByAim(id64flAim)
    
entity_get_vector(idEV_VEC_originflOrigin)
    
    
// Change them a bit
    
flOrigin[0] += flAim[0]
    
flOrigin[1] += flAim[1]
    
    
// New ent
    
new iEnt create_entity("info_target")
    
    
// Classname
    
entity_set_string(iEntEV_SZ_classname"drop_crossbow")
    
    
// Origin
    
entity_set_origin(iEntflOrigin)
    
    
// Model
    
entity_set_model(iEntW_MODEL)
    
    
// Size
    
new Float:mins[3] = {-1.0, -1.0, -1.0}
    new 
Float:maxs[3] = {1.01.01.0}
    
entity_set_vector(iEntEV_VEC_minsmins)
    
entity_set_vector(iEntEV_VEC_maxsmaxs)
    
    
// Interaction
    
entity_set_int(iEntEV_INT_solidSOLID_TRIGGER)
    
    
// Movetype
    
entity_set_int(iEntEV_INT_movetypeMOVETYPE_TOSS)
    
    
// Vars
    
g_hasXbow[id] = false
    g_FullClip
[id]  = false
    g_bInReload
[id] = false    
}

// Touch
public crossbow_touch(xbowid)
{
    
// Prevent invalid ent messages
    
if (!is_valid_ent(xbow) || !is_valid_ent(id))
        return 
PLUGIN_CONTINUE
        
    
// Not allowed to touch    
    
if (zp_get_user_zombie(id) || zp_get_user_nemesis(id) || g_hasXbow[id])
        return 
PLUGIN_CONTINUE
        
    
// Reset vars
    
g_hasXbow[id]  = true
    g_bInReload
[id] = false
    
    
// Give awp
    
give_item(id"weapon_awp")
    
    
// Change models
    
ChangeModels(id)
    
    
// Set ammo
    
cs_set_user_bpammo(idCSW_AWP20)
    
    
// Remove crossbow on ground
    
remove_entity(xbow)
    
    return 
PLUGIN_CONTINUE
}
        
// Touch fix
public touch_fix(id)
{
    if (
g_hasXbow[id])
        
g_hasXbow[id] = false
        
    UpdateHud
(id)    
}

// Change models
stock ChangeModels(id)
{
    
set_pev(idpev_viewmodel2V_MODEL);
    
set_pev(idpev_weaponmodel2P_MODEL);
}

// Play animation(Arkshine)
stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
    
set_pev(Playerpev_weaponanimSequence);
    
    
message_begin(MSG_ONE_UNRELIABLESVC_WEAPONANIM, .player Player);
    
write_byte(Sequence);
    
write_byte(pev(Playerpev_body));
    
message_end();
}

// Update HUD(Arkshine)
stock UpdateHud(Player)
{
    
// This set clip ammo
    
message_begin(MSG_ONE_UNRELIABLEg_msgCurWeapon, .player Player);
    
write_byte(true);
    
write_byte(CSW_AWP);
    
write_byte(cs_get_weapon_ammo(get_pdata_cbase(Player373)))
    
message_end()
    
    
// This set BP ammo
    
message_begin(MSG_ONE_UNRELIABLEg_msgAmmoX, .player Player);
    
write_byte(CSW_AWP);
    
write_byte(cs_get_user_bpammo(PlayerCSW_AWP));
    
message_end();    
}

// Log kill
stock log_kill(killervictimweapon[],headshot
{
    
set_msg_block(get_user_msgid("DeathMsg"), BLOCK_SET)
    
ExecuteHamB(Ham_Killedvictimkiller2)
    
set_msg_block(get_user_msgid("DeathMsg"), BLOCK_NOT)
    
    
message_begin(MSG_ALLget_user_msgid("DeathMsg"), {0,0,0}, 0)
    
write_byte(killer)
    
write_byte(victim)
    
write_byte(headshot)
    
write_string(weapon)
    
message_end()
    
    
//if(zp_get_user_zombie(victim) || zp_get_user_nemesis(victim))
    //{
    //    new frags  = get_user_frags(killer)
    //    set_pev(killer, pev_frags, float(pev(killer, pev_frags) + 1))
    //}
    
    
new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10]
    
    
get_user_name(killerkname31)
    
get_user_team(killerkteam9)
    
get_user_authid(killerkauthid31)
    
    
get_user_name(victimvname31)
    
get_user_team(victimvteam9)
    
get_user_authid(victimvauthid31)
    
    
log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^""
    
knameget_user_userid(killer), kauthidkteam
    
vnameget_user_userid(victim), vauthidvteamweapon)
    
    
UpdateScore(killervictim0,01)
    
    return 
PLUGIN_CONTINUE
}

// Allowed toucher
stock allowed_toucher(player)
{
    
// Already has it
    
if (g_hasXbow[player] || zp_get_user_zombie(player) || zp_get_user_nemesis(player))
        return 
false
    
    
return true
}    

// From WeaponMod
stock make_knockback(victimFloat:origin[3], Float:maxspeed)
{
    
// Get and set velocity
    
new Float:fVelocity[3];
    
kickback(victimoriginmaxspeedfVelocity)
    
entity_set_vector(victimEV_VEC_velocityfVelocity);

    return (
1);
}

// Blood!!!
stock ShowSomeBlood(const Float:origin[3])
{
    
message_begin(MSG_BROADCASTSVC_TEMPENTITY
    
write_byte(TE_BLOODSPRITE// Spr ID
    
write_coord(floatround(origin[0]+random_num(-20,20))) // Positions X...
    
write_coord(floatround(origin[1]+random_num(-20,20))) // Y
    
write_coord(floatround(origin[2]+random_num(-20,20))) // Z
    
write_short(sBlood// 
    
write_short(sBlood2)
    
write_byte(248// Color
    
write_byte(5// Amount
    
message_end()
}

// Remove reloading
public no_reload(id)
{
    if (
g_bInReload[id])
        
g_bInReload[id] = false
}

// From fakemeta_util.inc(VEN)
stock bool:fm_strip_user_gun(indexwid 0, const wname[] = ""
{
    if (!
is_user_alive(index) || !is_user_connected(index))
        return 
false
    
    
new ent_class[32];
    if (!
wid && wname[0])
        
copy(ent_classsizeof ent_class 1wname);
    else 
    {
        new 
weapon widclipammo;
        if (!
weapon && !(weapon get_user_weapon(indexclipammo)))
            return 
false;
        
        
get_weaponname(weaponent_classsizeof ent_class 1);
    }

    new 
ent_weap find_ent_by_owner(-1ent_classindex);
    if (!
ent_weap)
        return 
false;

    
engclient_cmd(index"drop"ent_class);

    new 
ent_box pev(ent_weappev_owner);
    if (!
ent_box || ent_box == index)
        return 
false;

    
dllfunc(DLLFunc_Thinkent_box);

    return 
true;
}

// Extra calulation for knockback
stock kickback(entFloat:fOrigin[3], Float:fSpeedFloat:fVelocity[3])
{
    
// Find origin
    
new Float:fEntOrigin[3];
    
entity_get_vectorentEV_VEC_originfEntOrigin );

    
// Do some calculations
    
new Float:fDistance[3];
    
fDistance[0] = fEntOrigin[0] - fOrigin[0];
    
fDistance[1] = fEntOrigin[1] - fOrigin[1];
    
fDistance[2] = fEntOrigin[2] - fOrigin[2];
    new 
Float:fTime = (vector_distancefEntOrigin,fOrigin ) / fSpeed);
    
fVelocity[0] = fDistance[0] / fTime;
    
fVelocity[1] = fDistance[1] / fTime;
    
fVelocity[2] = fDistance[2] / fTime;

    return (
fVelocity[0] && fVelocity[1] && fVelocity[2]);
}

// Update score (bugfix)
stock UpdateScore(attackervictimfragsdeathsscoreboard)
{
    
set_pev(attackerpev_fragsfloat(pev(attackerpev_frags) + frags))
    
    
cs_set_user_deaths(victimcs_get_user_deaths(victim) + deaths)
    
    if (
scoreboard)
    {
        
message_begin(MSG_BROADCASTg_msgScoreInfo)
        
write_byte(attacker// id
        
write_short(pev(attackerpev_frags)) // frags
        
write_short(cs_get_user_deaths(attacker)) // deaths
        
write_short(0// class?
        
write_short(get_user_team(attacker)) // team
        
message_end()
        
        
message_begin(MSG_BROADCASTg_msgScoreInfo)
        
write_byte(victim// id
        
write_short(pev(victimpev_frags)) // frags
        
write_short(cs_get_user_deaths(victim)) // deaths
        
write_short(0// class?
        
write_short(get_user_team(victim)) // team
        
message_end()
    }
}


/*stock fm_get_weapon_id(index, const weapon[])
{
    new ent = -1;
 
    while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", weapon)) != 0)
    {
        if(index == pev(ent, pev_owner))
        return ent;
    }
    return 1;
}

stock give_weapon(id, wpnID, ammo, bpammo) 
{
    new weapon[32]
    get_weaponname(wpnID, weapon, 31)
    
    give_item(id, weapon)
    cs_set_weapon_ammo(fm_get_weapon_id(id, weapon), ammo);
    cs_set_user_bpammo(id, wpnID, cs_get_user_bpammo(id, wpnID) + bpammo)
}*/ 
__________________
You will find everything u need :-
Catastrophe is offline
ZPhugeFan
Senior Member
Join Date: Jul 2013
Location: Bulgaria
Old 09-23-2013 , 03:22   Re: [HOW?] Different weapon for special class
Reply With Quote #5

what do i have to write on this line my custom survivor code to put him that weapon?

cvar_slayer_weapon = register_cvar("zp_slayer_weapon", "???")

also in ini file of main plugin should i put crossbow plugin in category "Gameplay / Other"?

Last edited by ZPhugeFan; 09-23-2013 at 03:23.
ZPhugeFan is offline
Catastrophe
Veteran Member
Join Date: Jul 2012
Location: somewhere between narnia
Old 09-23-2013 , 05:17   Re: [HOW?] Different weapon for special class
Reply With Quote #6

It does not matter what do u write in
Quote:
cvar_slayer_weapon = register_cvar("zp_slayer_weapon", "???")
and put the crossbow anywhere in the ini file just make sure that u put it correct...
__________________
You will find everything u need :-
Catastrophe is offline
ZPhugeFan
Senior Member
Join Date: Jul 2013
Location: Bulgaria
Old 09-23-2013 , 06:43   Re: [HOW?] Different weapon for special class
Reply With Quote #7

if it doesn't matter why when the mode is started the bot who is this class doesn't have the crossbow?
ZPhugeFan is offline
Catastrophe
Veteran Member
Join Date: Jul 2012
Location: somewhere between narnia
Old 09-23-2013 , 10:36   Re: [HOW?] Different weapon for special class
Reply With Quote #8

Mostly cuz it dus not have bot support....... u shud try it on live sv, or try with you and one more bot ..... or u cud just make yourself a survivor..... -,-

Or try this :-

PHP Code:
/*
     Copyright © 2009, NiHiLaNTh

    Crossbow plugin is free software;
    you can redistribute it and/or modify it under the terms of the
    GNU General Public License as published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with HeadShot Detection; if not, write to the
    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.

    --- Intro ---
       This is Crossbow from HL.It costs 25 Ammo packs(default).To attack press attack1
    button, to use zoom press attack2.If you shoot while zooming crossbow just hit enemy/
    wall, but if you are shooting without zoom bolt will explode and do more damage.
    You have 10 bolts in a clip and 25 in a back pack.
    
    --- Credits ---
    NiHiLaNTh - Plugin
    VEN - Finding weapon entities
    Arkshine - Ham_Item_Deploy/getting fov/weapon animation/Ammo
    meTaLiCroSS - Weapon touch/Weapon drop after death
    Scorpieo - Alternative crossbow model
    
    --- CVARs --- 
    zp_crossbow_damage 175 Damage done by explosion
    zp_crossbow_damage2 1300 Damage done by bolt
    zp_crossbow_radius 175 Explosion radius
    zp_crossbow_one_round 1 // 1 - one round; 0 - until player got infected/killed
    zp_crossbow_knockback 10 // Knockback power
    
    --- Changelog ---
    v1.0 - First release
    v1.1 - Fixed bug where ammo was not updated correctly
         - Optimized bolt flight
         - Fixed crap runtime error
    v1.2 - Fixed some little bugs(ammo on zooming was not updated)
    v1.3 - Fixed bug with drop
    v1.4 - Fixed bug where player could reload infinite times
         - Fixed bug with score info
         - Added knockback from explosion
    v1.5 - Fixed bug where player were damaged and knockbacked, even he were not in radius     
         - Fixed bug where player with godmode still could get damage
         - Fixed bug where player could reload with full clip
         - Fixed bug where player couldn't purchase crossbow after using antidote
         - Added bleed stuff
         - Added alternative model
         - Fixed bug where player could shoot while reloading
    v1.6 - Improved damage calculation system for exploding bolt
         - Added CVAR for crossbow one-round-only keeping
         - Improved damage detection system for normal bolt
         - Fixed bug with crossbow drop after death
         - Some minor optimizations/changes
    v1.7 - Added knockback CVAR
         - Improved knockback from explosion
         - Fixed bug with score info
         - Optimized code a bit
         
    Any suggestions/improvements are welcome!!!
    
    If you find any bug - report it on Crossbow thread, which can be found here
            http://forums.alliedmods.net/showthread.php?t=101379
        
    --- Good Luck & Have Fun ;) ---
*/    

#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#include <zombieplague>


// Uncomment following if you want to see alternative model
//#define ALTERNATIVE_MODEL

// Plugin info
new const PLUGIN[] = "[ZP] Extra Item: Crossbow"
new const VERSION[] = "1.7"
new const AUTHOR[] = "NiHiLaNTh"

// Crossbow/Bolt models
#if defined ALTERNATIVE_MODEL
new const P_MODEL[] = "models/p_crossbow.mdl"
new const V_MODEL[] = "models/v_crossbow.mdl"
new const W_MODEL[] = "models/w_crossbow.mdl"
#else
new const P_MODEL[] = "models/p_crossbow.mdl"
new const V_MODEL[] = "models/v_crossbow.mdl"
new const W_MODEL[] = "models/w_crossbow.mdl"
#endif
new const BOLT_MODEL[] = "models/crossbow_bolt.mdl"

// Some sounds
new const XBOW_SHOOT[] = "weapons/xbow_fire1.wav"
new const XBOW_HITWALL[] = "weapons/xbow_hit1.wav"
new const XBOW_HITSTAB[] = "weapons/xbow_hitbod1.wav"
new const XBOW_RELOAD[] = "weapons/xbow_reload1.wav"

// Sprites
new const EXPLO_SPRITE[] = "sprites/zerogxplode.spr"
new const BLOOD_SPRITE[] = "sprites/blood.spr"
new const BLOODSPRAY_SPRITE[] = "sprites/bloodspray.spr"

// Cached sprite indexes
new sExplosBloodsBlood2

// CVAR pointers
new pDamagepDamage2pRadiuspOneRoundpKnockback

// Item ID
new g_crossbow

// Player variables
new g_hasXbow[33// whether player has Crossbow
new Float:g_last_shot_time[33// Last time Crossbow used
new g_FullClip[33// whether player has Full Clip
new g_bInReload[33]

// Max players
new g_maxplayers

// Global vars
new g_restarted

// Message ID's
new g_msgCurWeapong_msgAmmoXg_msgScoreInfo

// Weapon animation sequences
enum
{
    
crossbow_idle1,
    
crossbow_idle2,
    
crossbow_fidget1,
    
crossbow_fidget2,
    
crossbow_fire1,
    
crossbow_fire2,
    
crossbow_fire3,
    
crossbow_reload,
    
crossbow_draw1,
    
crossbow_draw2,
    
crossbow_holster1,
    
crossbow_holster2
}

// Item Cost
#define COST 25

// Precache
public plugin_precache()
{
    
// Models
    
precache_model(P_MODEL)
    
precache_model(V_MODEL)
    
precache_model(W_MODEL)
    
precache_model(BOLT_MODEL)

    
// Sounds
    
precache_sound(XBOW_SHOOT)
    
precache_sound(XBOW_HITWALL)
    
precache_sound(XBOW_HITSTAB)
    
precache_sound(XBOW_RELOAD)
    
precache_sound("weapons/357_cock1.wav")
    
    
// Sprites
    
sExplo precache_model(EXPLO_SPRITE)
    
sBlood precache_model(BLOOD_SPRITE)
    
sBlood2 precache_model(BLOODSPRAY_SPRITE)
}

// Init
public plugin_init()
{
    
// New plugin
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_cvar("zp_xbow_version"VERSIONFCVAR_SERVER|FCVAR_SPONLY)
    
    
// New extra item
    
g_crossbow zp_register_extra_item("Crossbow"COSTZP_TEAM_HUMAN)

    
// Events
    
register_event("HLTV""Event_NewRound""a""1=0""2=0");
    
register_event("TextMsg""Event_GameRestart""a""2=#Game_Commencing""2=#Game_will_restart_in");
    
    
// Log Event
    
register_logevent("LogEvent_RoundEnd"2"1=Round_End")
    
    
// Forwards
    
register_forward(FM_CmdStart"fw_CmdStart")
    
register_forward(FM_SetModel"fw_SetModel")
    
RegisterHam(Ham_Item_Deploy"weapon_awp""fw_CrossbowDeploy"1)
    
register_forward(FM_UpdateClientData"fw_UpdateClientData_Post"1)
    
register_forward(FM_Touch"fw_Touch")
    
RegisterHam(Ham_Killed"player""fw_PlayerKilled")
    
RegisterHam(Ham_Weapon_Reload"weapon_awp""fw_WeaponReload"1)
    
    
// Touches
    
register_touch("xbow_bolt""*""bolt_touch")
    
register_touch("xbow_bolt_xplode""*""bolt_touch2")
    
register_touch("drop_crossbow""player""crossbow_touch")
    
    
// CVARs
    
pDamage register_cvar("zp_crossbow_damage""175"// Damage done by expl
    
pDamage2 register_cvar("zp_crossbow_damage2""1000"// Damage done by bolt
    
pRadius register_cvar("zp_crossbow_radius""175")
    
pOneRound register_cvar("zp_crossbow_one_round""1")
    
pKnockback register_cvar("zp_crossbow_knockback""10")
    
    
// Store maxplayers in a global variable
    
g_maxplayers get_maxplayers()

    
// Messages
    
g_msgCurWeapon get_user_msgid("CurWeapon")
    
g_msgAmmoX get_user_msgid("AmmoX")
    
g_msgScoreInfo get_user_msgid("ScoreInfo")
}

// When client connected, he cant have our weapon
public client_connect(id)
{
    
g_hasXbow[id] = false
    g_FullClip
[id] = false
    g_bInReload
[id] = false
}

// Someone wants to buy our extra item
public zp_extra_item_selected(iditemid)
{
    if (
itemid == g_crossbow)
    {
        
// Already have it
        
if (g_hasXbow[id])
        {
            
// Warn player
            
client_print(idprint_center"Already have Crossbow!")
            return 
ZP_PLUGIN_HANDLED
        
}
        
// Otherwise you can buy it
        
else
        {
            
// Notice
            
client_print(idprint_chat"[ZP] You bought crossbow")
    
            
// Drop primary weapons if have
            
if (cs_get_user_hasprim(id))
                
engclient_cmd(id"drop")
    
            
// Give him awp
            
give_item(id"weapon_awp")
            
            
// Get weapon id
            
new weapon_id find_ent_by_owner(-1"weapon_awp"id)
            
            if (
weapon_id)
            {
                
// Set clip ammo
                
cs_set_weapon_ammo(weapon_id10)
            }
            
            
// Set bp ammo
            
cs_set_user_bpammo(idCSW_AWP50)
            
            
//client_print(id, print_chat, "BP AMMO: %d", cs_get_user_bpammo(id, CSW_AWP))
            
            // Change models
            
ChangeModels(id)
            
            
// Animation(bugfix)
            
UTIL_PlayWeaponAnimation(idcrossbow_draw1)
            
            
// Reset
            
g_hasXbow[id] = true
            g_FullClip
[id] = true
            g_bInReload
[id] = false
        
            
// Update HUD
            
UpdateHud(id)
        }
    }
    return 
PLUGIN_CONTINUE
}

// Target who have our weapon was infected - reset vars
public zp_user_infected_post(idinfectornemesis)
{
    if (
g_hasXbow[id])
    {
        
g_hasXbow[id] = false
        g_FullClip
[id] = false
        g_bInReload
[id] = false
        UpdateHud
(id)
        
        
UpdateScore(infectorid001)
        
        
// Bugfix
        
touch_fix(id)
    }
}

// New round started
public Event_NewRound()
{
    if (
g_restarted)
    {
        
// Strip from Crossnow if game have been restarted
        
for (new 1<= get_maxplayers(); i++)
        {
            if (
g_hasXbow[i])
            {
                
g_hasXbow[i] = false
                g_FullClip
[i] = false
                g_bInReload
[i] = false
            
}
        }
        
g_restarted false
    
}
}
 
public 
zp_user_humanized_post(idsurvivor)
{
       if(
zp_get_user_survivor(id))
       {

            if (
cs_get_user_hasprim(id))
            
engclient_cmd(id"drop")
    
            
give_item(id"weapon_awp")
           
            new 
weapon_id find_ent_by_owner(-1"weapon_awp"id)
            
            if (
weapon_id)
            {
                
cs_set_weapon_ammo(weapon_id10)
            }
            
            
cs_set_user_bpammo(idCSW_AWP50)
            
            
ChangeModels(id)
            
            
UTIL_PlayWeaponAnimation(idcrossbow_draw1)
            
            
g_hasXbow[id] = true
            g_FullClip
[id] = true
            g_bInReload
[id] = false
        
            UpdateHud
(id)

       }
}

// Restart
public Event_GameRestart()
{
    
g_restarted true
}

// Remove any dropped crossbows
public LogEvent_RoundEnd()
{
    if (
get_pcvar_num(pOneRound) == 1)
    {
        for (new 
1g_maxplayersi++)
        {
            
fm_strip_user_gun(iCSW_AWP)
            
g_hasXbow[i] = false
        
}
    }
    
    
// Find and remove all dropped crossbows
    
new ent find_ent_by_class(-1"drop_crossbow")
    if (
ent)
        
remove_entity(ent)
}

// Called when player start a command(shoot, jump etc.)
public fw_CmdStart(iduc_handleseed)
{
    
// Ignore dead zombies/nemesis/those who haven't our weapons
    
if (!is_user_alive(id) || zp_get_user_zombie(id) || zp_get_user_nemesis(id) || !g_hasXbow[id])
        return 
FMRES_IGNORED

    
// Get amo, clip, and weapon    
    
new ammoclipweapon get_user_weapon(idclipammo)
    
    
// Not AWP
    
if (weapon != CSW_AWP)
        return 
FMRES_IGNORED
        
    
// Buttons    
    
new buttons get_uc(uc_handleUC_Buttons)
    
    new 
ent find_ent_by_owner(-1"weapon_awp"id)
    
    
// Attack1 button was pressed
    
if (buttons IN_ATTACK)
    {
        
// We have enough ammo
        
if (clip>= && !g_bInReload[id])
        {
            
// Next shot time has come
            
if (get_gametime() - g_last_shot_time[id] > 2.0)
            {
                
// Get FOV(Arkshine)
                
new fovfov pev(idpev_fov)
                
                
// Default FOV
                
if (fov == 90)
                {
                    
FireCrossbow(id0)
                }
                
// Is zooming?
                
else
                    
FireCrossbow(id1)
                    
                
g_FullClip[id] = false    
                
                
// Decrease ammo
                
cs_set_weapon_ammo(entcs_get_weapon_ammo(get_pdata_cbase(id373)) - 1)
                    
                
// Update HUD
                
UpdateHud(id)
                
                
// Remember last shot time
                
g_last_shot_time[id] = get_gametime()
            }
        }
        
// If out of ammo
        
else if (clip <= || ammo <= 1)
        {
            
// Play empty sound
            
emit_sound(idCHAN_WEAPON"weapons/357_cock1.wav"VOL_NORMATTN_NORM0PITCH_NORM)
        }
        
        
// Remove attack button from their buttons mask
        
buttons &= ~IN_ATTACK
        set_uc
(uc_handleUC_Buttonsbuttons)
    }
    
    
// Attack2 button was pressed
    
if (buttons IN_ATTACK2)
    {
        
// Update HUD(bugfix)
        
UpdateHud(id)
    }
    
    return 
FMRES_HANDLED
}

// Usually called after player dropped weapons
public fw_SetModel(ent, const model[])
{
    
// Prevent invalid entity messages
    
if (!pev_valid(ent))
        return 
FMRES_IGNORED
        
    
// Not required model
    
if(!equali(model"models/w_awp.mdl")) 
        return 
FMRES_IGNORED
    
    
// Get owner and classname
    
new owner pev(entpev_owner)
    new 
classname[33]; pev(entpev_classnameclassnamecharsmax(classname))
    
    
// Entity classname is a weaponbox
    
if(equal(classname"weaponbox"))
    {
        
// The weapon owner has a crossbow
        
if(g_hasXbow[owner])
        {
            
// Strip from crossbow
            
g_hasXbow[owner] = false
            
            
// Set world model
            
engfunc(EngFunc_SetModelentW_MODEL)
            
            
// Update HUD
            
UpdateHud(owner)
            
            
// Touch fix
            
set_task(0.1"touch_fix"owner)
            
            return 
FMRES_SUPERCEDE
        
}
    }
    
    return 
FMRES_IGNORED
    
}

// Called when player is holding this weapon
public fw_CrossbowDeploy(iEnt)
{
    
// Get ID
    
new id get_pdata_cbase(iEnt415)
    
    if (
g_hasXbow[id])
    {
        
// Change models
        
ChangeModels(id)
        
        
// Play animation
        
UTIL_PlayWeaponAnimation(idcrossbow_draw1)
        
        
// Update HUD
        
UpdateHud(id)
        
        
g_bInReload[id] = false
        
        
// Start to reload if clip less than 0(bugfix)
        
new awpclip get_pdata_int(iEnt515)
        if (
awpclip <= 0)
            
fw_WeaponReload(iEnt)
    }
}

// Update client data
public fw_UpdateClientData_Post(idswcd_handle)
{
    
// Ignore dead zombies/nemesis/those who haven't our weapons
    
if (!is_user_alive(id) || zp_get_user_zombie(id) || zp_get_user_nemesis(id) || !g_hasXbow[id])
        return 
FMRES_IGNORED
    
    
// Get ammo, clip and weapon
    
new ammoclipweapon get_user_weapon(idclipammo)
    
    
// Not AWP
    
if (weapon != CSW_AWP)
        return 
FMRES_IGNORED
    
    
// Block default sounds
    //set_cd(cd_handle, CD_ID, 0)
    
set_cd(cd_handleCD_flNextAttackhalflife_time() + 0,001)
    return 
FMRES_HANDLED
}

// Called when player touch something
public fw_Touch(ptrptd)
{
    
// Invalid ent/toucher
    
if(!pev_valid(ptr) || !pev_valid(ptd))
        return 
FMRES_IGNORED;
    
    
// Get model, toucherclass, entityclass
    
new model[33], toucherclass[33], entityclass[33]
    
pev(ptrpev_modelmodelcharsmax(model))
    
pev(ptrpev_classnameentityclasscharsmax(entityclass))
    
pev(ptdpev_classnametoucherclasscharsmax(toucherclass))
    
    
// TOucher isn't player and entity isn't weapon
    
if (!equali(toucherclass"player") || !equali(entityclass"weaponbox"))
        return 
FMRES_IGNORED
    
    
// Our world model
    
if(equali(modelW_MODEL))
    {
        
// If allowed to touch
        
if(allowed_toucher(ptd))
        {
            
// Pick up weapon
            
g_hasXbow[ptd] = true
        
}
    }
            
    return 
FMRES_IGNORED;
}

// Called when player died
public fw_PlayerKilled(victimattackershouldgib)
{
    if (
g_hasXbow[victim])
    {
        
g_hasXbow[victim] = false
        
        
// Drop crossbow
        
crossbow_drop(victim)
    }
}

// Called on reload
public fw_WeaponReload(iEnt)
{
    
// Get ID 
    
new id get_pdata_cbase(iEnt415)

    
// Has crossbow 
    
if (g_hasXbow[id] && !g_FullClip[id])
    {
        
set_pdata_int(iEnt5414)
        
        
// Set animation
        
UTIL_PlayWeaponAnimation(idcrossbow_reload)
        
        
// Emit sound
        
emit_sound(idCHAN_WEAPONXBOW_RELOADVOL_NORMATTN_NORM0PITCH_NORM)
    
        
// Update HUD
        
UpdateHud(id)
        
        
g_FullClip[id] = true
        g_bInReload
[id] = true
        
        
// Remove reload task
        
set_task(4.0"no_reload"id)
    }
}    

// Fire crossbow
public FireCrossbow(idtype)
{
    
// Play animation
    
UTIL_PlayWeaponAnimation(idcrossbow_fire1)
    
    
// Get origin, angle, and velocity
    
new Float:fOrigin[3], Float:fAngle[3], Float:fVelocity[3]
    
pev(idpev_originfOrigin)
    
pev(idpev_v_anglefAngle)
    
    
// New ent
    
new ent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"));
    
    
// Not ent
    
if (!ent) return PLUGIN_HANDLED
    
    
// If player shot while zooming...
    
if (type == 1)
    {
        
// Set classnames
        
entity_set_string(entEV_SZ_classname"xbow_bolt")
    }
    else
    {
        
entity_set_string(entEV_SZ_classname"xbow_bolt_xplode")
    }
    
    
// Set bolt model
    
entity_set_model(entBOLT_MODEL)
    
    
// Size
    
new Float:mins[3] = {-1.0, -1.0, -1.0}
    new 
Float:maxs[3] = {1.01.01.0}
    
entity_set_size(entminsmaxs)
    
    
// Movetype
    
entity_set_int(entEV_INT_movetypeMOVETYPE_FLY)
    
    
// Interaction
    
entity_set_int(entEV_INT_solidSOLID_TRIGGER)
    
    
// Owner
    
entity_set_edict(entEV_ENT_ownerid)
    
    new 
Float:origin[3];
    
    
// Velocity
    
velocity_by_aim(id64fVelocity);
    
pev(idpev_originorigin);
    
    
fOrigin[0] += fVelocity[0];
    
fOrigin[1] += fVelocity[1];
    
    
// Set origin
    
engfunc(EngFunc_SetOriginentfOrigin)
    
    
// Set bolt velocity
    
new Float:velocity[3]
    
velocity_by_aim(id2000velocity);
    
set_pev(entpev_velocityvelocity);
    
//set_pev(ent, pev_speed, 300.0)
    
    // Correct bolt flight
    
vector_to_angle(velocityfAngle);
    
    
// Set angle
    
set_pev(entpev_anglesfAngle);
    
    
// Play sound
    
emit_sound(idCHAN_WEAPONXBOW_SHOOTVOL_NORMATTN_NORM0PITCH_NORM)
    
    return 
PLUGIN_CONTINUE
}

// Normal bolt touched something
public bolt_touch(boltent)
{
    
// Invalid ent
    
if (!pev_valid(bolt))
    {
        
//client_print(0, print_chat, "Error! Invalid entity %d", bolt)
        
return
    }
    
    
// GEt owner and classname    
    
new owner pev(boltpev_owner);
    new 
classname[32]; pev(entpev_classnameclassname31)
    
    
// Get it's origin
    
new Float:originF[3], aimvec[3], tidbody
    pev
(boltpev_originoriginF)
    
get_user_origin(owneraimvec3)
    
get_user_aiming(ownertidbody)
    
    if (
equal(classname"player"))
    {
        
// Alive...
        
if (is_user_alive(tid) == && get_user_godmode(tid) == 0)
        {
            
// Zombie/Nemesis
            
if (zp_get_user_zombie(tid) || zp_get_user_nemesis(tid))
            {    
                
// Get origina and distance
                
new Float:VictimOrigin[3]
                
pev(tidpev_originVictimOrigin)
                    
                
// We hit them
                
emit_sound(tidCHAN_WEAPONXBOW_HITSTABVOL_NORMATTN_NORM0PITCH_NORM)
                
                
// Do fake damage
                
fakedamage(tid"crossbow"0.0DMG_PARALYZE)
                    
                
// Health/Damage
                
new health get_user_health(tid)
                new 
damage get_pcvar_num(pDamage2)
                        
                if (
health damage >= 1)
                {
                    
set_user_health(tidhealth  damage)
                        
                    
// Create blood
                    
ShowSomeBlood(VictimOrigin)
                    
                    
//client_print(owner, print_chat, "===>DAMADE %d<===", damage)
                
}
                else
                {
                    
// Kill them
                    //user_silentkill(tid)
                        
                    // Log this
                    
log_kill(ownertid"crossbow"0)
                    
                    
// Set new Ammo Packs
                    
zp_set_user_ammo_packs(ownerzp_get_user_ammo_packs(owner) + 1)
                }
                
            }
            
// Destroy ent
            
set_pev(boltpev_flagsFL_KILLME)
        }
    }
    
// Not a player(wall etc.)
    
if (!equal(classname"player"))
    {
        
// Play sound
        
emit_sound(boltCHAN_WEAPONXBOW_HITWALLVOL_NORMATTN_NORM0PITCH_NORM)
        
        
// Destroy ent
        
set_pev(boltpev_flagsFL_KILLME)
    }
}
    
// Exploding bolt touched something
public bolt_touch2(bolt2ent)
{
    
// Invalid ent
    
if (!pev_valid(bolt2))
        return
    
    
// GEt owner and classname
    
new owner pev(bolt2pev_owner);
    new 
classname[32]; pev(entpev_classnameclassname31)
    
    
// Get it's origin
    
new Float:originV[3]
    
pev(bolt2pev_originoriginV)
    
    
// Draw explosion
    
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
    
write_byte(TE_EXPLOSION)
    
engfunc(EngFunc_WriteCoordoriginV[0])
    
engfunc(EngFunc_WriteCoordoriginV[1])
    
engfunc(EngFunc_WriteCoordoriginV[2])
    
write_short(sExplo)
    
write_byte(15)
    
write_byte(15)
    
write_byte(0)
    
message_end()
    
    
// Loop through all players
    
for(new 1g_maxplayersi++)
    {
        
// Alive...
        
if (is_user_alive(i) == && get_user_godmode(i) == 0)
        {
            
// Zombie/Nemesis
            
if (zp_get_user_zombie(i) || zp_get_user_nemesis(i))
            {
                
// Get origina and distance
                
new Float:VictimOrigin[3], Float:distance_fdistance
                pev
(ipev_originVictimOrigin)
                
distance_f get_distance_f(originVVictimOrigin)
                
distance floatround(distance_f)
                
                if (
distance <= get_pcvar_float(pRadius))
                {
                    
// Fake damage
                    
fakedamage(i"crossbow"0.0DMG_BLAST)
                    
                    
// Get health/dmg/damage ratio
                    
new Float:dratiodamage
                    dratio 
floatdiv(float(distance),float(get_pcvar_num(pRadius)))
                    
damage get_pcvar_num(pDamage) - floatround(floatmul(float(get_pcvar_num(pDamage)), dratio))
                    new 
health get_user_health(i)
                    
                    
// Make some knockback
                    
new Float:knockback get_pcvar_float(pKnockback)
                    
make_knockback(ioriginVknockback*damage)    
                    
                    if (
health damage >= 1)
                    {
                        
set_user_health(ihealth damage)
                        
                        
// Create blood
                        
ShowSomeBlood(VictimOrigin)
                        
                        
//client_print(owner, print_chat, "===>DAMADE %d<===", damage)
                    
}
                    else
                    {
                        
// Silently kill
                        //user_silentkill(i)
                        
                        // Log this
                        
log_kill(owneri"crossbow"0)
                        
                        
// Set ammo packs
                        
zp_set_user_ammo_packs(ownerzp_get_user_ammo_packs(owner) + 1)
                    }
                }
            }
            
set_pev(bolt2pev_flagsFL_KILLME)
        }
    }
}    

// Crossbow dropped
public crossbow_drop(id)
{
    
// Get aimvec and origin
    
static Float:flAim[3], Float:flOrigin[3]
    
VelocityByAim(id64flAim)
    
entity_get_vector(idEV_VEC_originflOrigin)
    
    
// Change them a bit
    
flOrigin[0] += flAim[0]
    
flOrigin[1] += flAim[1]
    
    
// New ent
    
new iEnt create_entity("info_target")
    
    
// Classname
    
entity_set_string(iEntEV_SZ_classname"drop_crossbow")
    
    
// Origin
    
entity_set_origin(iEntflOrigin)
    
    
// Model
    
entity_set_model(iEntW_MODEL)
    
    
// Size
    
new Float:mins[3] = {-1.0, -1.0, -1.0}
    new 
Float:maxs[3] = {1.01.01.0}
    
entity_set_vector(iEntEV_VEC_minsmins)
    
entity_set_vector(iEntEV_VEC_maxsmaxs)
    
    
// Interaction
    
entity_set_int(iEntEV_INT_solidSOLID_TRIGGER)
    
    
// Movetype
    
entity_set_int(iEntEV_INT_movetypeMOVETYPE_TOSS)
    
    
// Vars
    
g_hasXbow[id] = false
    g_FullClip
[id]  = false
    g_bInReload
[id] = false    
}

// Touch
public crossbow_touch(xbowid)
{
    
// Prevent invalid ent messages
    
if (!is_valid_ent(xbow) || !is_valid_ent(id))
        return 
PLUGIN_CONTINUE
        
    
// Not allowed to touch    
    
if (zp_get_user_zombie(id) || zp_get_user_nemesis(id) || g_hasXbow[id])
        return 
PLUGIN_CONTINUE
        
    
// Reset vars
    
g_hasXbow[id]  = true
    g_bInReload
[id] = false
    
    
// Give awp
    
give_item(id"weapon_awp")
    
    
// Change models
    
ChangeModels(id)
    
    
// Set ammo
    
cs_set_user_bpammo(idCSW_AWP20)
    
    
// Remove crossbow on ground
    
remove_entity(xbow)
    
    return 
PLUGIN_CONTINUE
}
        
// Touch fix
public touch_fix(id)
{
    if (
g_hasXbow[id])
        
g_hasXbow[id] = false
        
    UpdateHud
(id)    
}

// Change models
stock ChangeModels(id)
{
    
set_pev(idpev_viewmodel2V_MODEL);
    
set_pev(idpev_weaponmodel2P_MODEL);
}

// Play animation(Arkshine)
stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
    
set_pev(Playerpev_weaponanimSequence);
    
    
message_begin(MSG_ONE_UNRELIABLESVC_WEAPONANIM, .player Player);
    
write_byte(Sequence);
    
write_byte(pev(Playerpev_body));
    
message_end();
}

// Update HUD(Arkshine)
stock UpdateHud(Player)
{
    
// This set clip ammo
    
message_begin(MSG_ONE_UNRELIABLEg_msgCurWeapon, .player Player);
    
write_byte(true);
    
write_byte(CSW_AWP);
    
write_byte(cs_get_weapon_ammo(get_pdata_cbase(Player373)))
    
message_end()
    
    
// This set BP ammo
    
message_begin(MSG_ONE_UNRELIABLEg_msgAmmoX, .player Player);
    
write_byte(CSW_AWP);
    
write_byte(cs_get_user_bpammo(PlayerCSW_AWP));
    
message_end();    
}

// Log kill
stock log_kill(killervictimweapon[],headshot
{
    
set_msg_block(get_user_msgid("DeathMsg"), BLOCK_SET)
    
ExecuteHamB(Ham_Killedvictimkiller2)
    
set_msg_block(get_user_msgid("DeathMsg"), BLOCK_NOT)
    
    
message_begin(MSG_ALLget_user_msgid("DeathMsg"), {0,0,0}, 0)
    
write_byte(killer)
    
write_byte(victim)
    
write_byte(headshot)
    
write_string(weapon)
    
message_end()
    
    
//if(zp_get_user_zombie(victim) || zp_get_user_nemesis(victim))
    //{
    //    new frags  = get_user_frags(killer)
    //    set_pev(killer, pev_frags, float(pev(killer, pev_frags) + 1))
    //}
    
    
new kname[32], vname[32], kauthid[32], vauthid[32], kteam[10], vteam[10]
    
    
get_user_name(killerkname31)
    
get_user_team(killerkteam9)
    
get_user_authid(killerkauthid31)
    
    
get_user_name(victimvname31)
    
get_user_team(victimvteam9)
    
get_user_authid(victimvauthid31)
    
    
log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^""
    
knameget_user_userid(killer), kauthidkteam
    
vnameget_user_userid(victim), vauthidvteamweapon)
    
    
UpdateScore(killervictim0,01)
    
    return 
PLUGIN_CONTINUE
}

// Allowed toucher
stock allowed_toucher(player)
{
    
// Already has it
    
if (g_hasXbow[player] || zp_get_user_zombie(player) || zp_get_user_nemesis(player))
        return 
false
    
    
return true
}    

// From WeaponMod
stock make_knockback(victimFloat:origin[3], Float:maxspeed)
{
    
// Get and set velocity
    
new Float:fVelocity[3];
    
kickback(victimoriginmaxspeedfVelocity)
    
entity_set_vector(victimEV_VEC_velocityfVelocity);

    return (
1);
}

// Blood!!!
stock ShowSomeBlood(const Float:origin[3])
{
    
message_begin(MSG_BROADCASTSVC_TEMPENTITY
    
write_byte(TE_BLOODSPRITE// Spr ID
    
write_coord(floatround(origin[0]+random_num(-20,20))) // Positions X...
    
write_coord(floatround(origin[1]+random_num(-20,20))) // Y
    
write_coord(floatround(origin[2]+random_num(-20,20))) // Z
    
write_short(sBlood// 
    
write_short(sBlood2)
    
write_byte(248// Color
    
write_byte(5// Amount
    
message_end()
}

// Remove reloading
public no_reload(id)
{
    if (
g_bInReload[id])
        
g_bInReload[id] = false
}

// From fakemeta_util.inc(VEN)
stock bool:fm_strip_user_gun(indexwid 0, const wname[] = ""
{
    if (!
is_user_alive(index) || !is_user_connected(index))
        return 
false
    
    
new ent_class[32];
    if (!
wid && wname[0])
        
copy(ent_classsizeof ent_class 1wname);
    else 
    {
        new 
weapon widclipammo;
        if (!
weapon && !(weapon get_user_weapon(indexclipammo)))
            return 
false;
        
        
get_weaponname(weaponent_classsizeof ent_class 1);
    }

    new 
ent_weap find_ent_by_owner(-1ent_classindex);
    if (!
ent_weap)
        return 
false;

    
engclient_cmd(index"drop"ent_class);

    new 
ent_box pev(ent_weappev_owner);
    if (!
ent_box || ent_box == index)
        return 
false;

    
dllfunc(DLLFunc_Thinkent_box);

    return 
true;
}

// Extra calulation for knockback
stock kickback(entFloat:fOrigin[3], Float:fSpeedFloat:fVelocity[3])
{
    
// Find origin
    
new Float:fEntOrigin[3];
    
entity_get_vectorentEV_VEC_originfEntOrigin );

    
// Do some calculations
    
new Float:fDistance[3];
    
fDistance[0] = fEntOrigin[0] - fOrigin[0];
    
fDistance[1] = fEntOrigin[1] - fOrigin[1];
    
fDistance[2] = fEntOrigin[2] - fOrigin[2];
    new 
Float:fTime = (vector_distancefEntOrigin,fOrigin ) / fSpeed);
    
fVelocity[0] = fDistance[0] / fTime;
    
fVelocity[1] = fDistance[1] / fTime;
    
fVelocity[2] = fDistance[2] / fTime;

    return (
fVelocity[0] && fVelocity[1] && fVelocity[2]);
}

// Update score (bugfix)
stock UpdateScore(attackervictimfragsdeathsscoreboard)
{
    
set_pev(attackerpev_fragsfloat(pev(attackerpev_frags) + frags))
    
    
cs_set_user_deaths(victimcs_get_user_deaths(victim) + deaths)
    
    if (
scoreboard)
    {
        
message_begin(MSG_BROADCASTg_msgScoreInfo)
        
write_byte(attacker// id
        
write_short(pev(attackerpev_frags)) // frags
        
write_short(cs_get_user_deaths(attacker)) // deaths
        
write_short(0// class?
        
write_short(get_user_team(attacker)) // team
        
message_end()
        
        
message_begin(MSG_BROADCASTg_msgScoreInfo)
        
write_byte(victim// id
        
write_short(pev(victimpev_frags)) // frags
        
write_short(cs_get_user_deaths(victim)) // deaths
        
write_short(0// class?
        
write_short(get_user_team(victim)) // team
        
message_end()
    }
}

__________________
You will find everything u need :-

Last edited by Catastrophe; 09-23-2013 at 10:40.
Catastrophe is offline
ZPhugeFan
Senior Member
Join Date: Jul 2013
Location: Bulgaria
Old 09-23-2013 , 11:23   Re: [HOW?] Different weapon for special class
Reply With Quote #9

Quote:
Originally Posted by Catastrophe View Post
Mostly cuz it dus not have bot support
! No bot support? I prefer playing with bots and if this weapon does not support bots can anybody give link to some cool weapon which supports bots to put on my custom class?

i will try the new code from you Catastrophe. Haven't scrolled through it so i don't know what's different.
ZPhugeFan is offline
Catastrophe
Veteran Member
Join Date: Jul 2012
Location: somewhere between narnia
Old 09-23-2013 , 11:28   Re: [HOW?] Different weapon for special class
Reply With Quote #10

U can add bot support to any weapon...... and i just replaced the zp50 forwards that i used with zp43 (realised that the entire code was for zp43 im so fucking dumb)..

For bot support just add this smwhere in plugin_init() "RegisterHamBots(Ham_Killed, "fw_PlayerKilled")"

And this in the includes #include <cs_ham_bots_api>
__________________
You will find everything u need :-

Last edited by Catastrophe; 09-23-2013 at 11:30.
Catastrophe is offline
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 16:31.


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