Help with plugin crossbow
Hello, please help, I want to do that would be a weapon just bought admins and other players, it was closed! Such as the new administrator privileges
Code:
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#include < xs >
#include <zombieplague>
// Plugin info
new const PLUGIN[] = "[ZP] Extra Item: Crossbow"
new const VERSION[] = "1.7"
new const AUTHOR[] = "Kopcha =D"
new bool: g_has_grenade[33]
// Crossbow/Bolt models
new const P_MODEL[] = "models/zpdd/p_crossbow_cso.mdl"
new const V_MODEL[] = "models/zpdd/v_crossbow_cso.mdl"
new const W_MODEL[] = "models/zpdd/w_crossbow_cso.mdl"
new const BOLT_MODEL[] = "models/zpdd/crossbow_bolt.mdl"
// Grenade model
new const P_GRENADE[] = "models/zpdd/p_m24grenade.mdl"
new const V_GRENADE[] = "models/zpdd/v_m24grenadefix.mdl"
new const W_GRENADE[] = "models/zpdd/w_m24grenade.mdl"
// Some sounds
new const XBOW_SHOOT[] = "weapons/crossbow-1.wav"
#define CrossbowClip 50
#define CrossbowBpAmmo 200
#define CrossbowDamage 100.0 // Per shot
#define CrossbowReloadTime 3.7
#define GrenadeDmgMulti 6.0
// Item Cost
#define COST 55
// Item ID
new g_crossbow
// Player variables
new g_hasXbow[33] // whether player has Crossbow
new g_iGrenadeCount[33]
new g_iCurrentWeapon[33]
new Float:g_last_shot_time[33] // Last time Crossbow used
new g_FullClip[33] // whether player has Full Clip
new g_bInReload[33]
// Global vars
new g_restarted, gmsgAmmoPickup, g_grenade
const m_pPlayer = 41
const m_iId = 43
const m_fKnown = 44
const m_flNextPrimaryAttack = 46
const m_flNextSecondaryAttack = 47
const m_flTimeWeaponIdle = 48
const m_iPrimaryAmmoType = 49
const m_iClip = 51
const m_fInReload = 54
const m_fInSpecialReload = 55
const m_fSilent = 74
const m_flNextAttack = 83
const m_rgAmmo_player_Slot0 = 376
const DMG_HEGRENADE = ( 1 << 24 )
#define pev_weaponkey pev_impulse
#define CROSSBOW_WEAPONKEY 1966712
#define HoldCrossbow(%0) ( g_hasXbow[ %0 ] && g_iCurrentWeapon[ %0 ] == CSW_AWP )
// Weapon animation sequences
enum
{
crossbow_idle,
crossbow_shoot1,
crossbow_shoot2,
crossbow_reload,
crossbow_draw
}
const PRIMARY_WEAPONS_BITSUM = (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_BITSUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE)
// Precache
public plugin_precache()
{
// Models
precache_model(P_MODEL)
precache_model(V_MODEL)
precache_model(W_MODEL)
precache_model(BOLT_MODEL)
precache_model( P_GRENADE )
precache_model( V_GRENADE )
precache_model( W_GRENADE )
// Sounds
precache_sound(XBOW_SHOOT)
}
// Init
public plugin_init()
{
// New plugin
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar("zp_xbow_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY)
// New extra item
g_crossbow = zp_register_extra_item("Crossbow", COST , ZP_TEAM_HUMAN)
// Events
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
register_event( "CurWeapon", "EV_CurWeapon", "be", "1=1" )
register_event("TextMsg", "Event_GameRestart", "a", "2=#Game_Commencing", "2=#Game_will_restart_in");
register_forward( FM_SetModel, "fw_SetModel" )
register_forward( FM_CmdStart, "fw_CmdStart" )
register_forward( FM_UpdateClientData, "fw_UpdateClientaData_Post", 1 )
RegisterHam( Ham_Killed, "player", "fw_PlayerKilled" )
RegisterHam( Ham_Item_Deploy, "weapon_awp", "fw_CrossbowDeploy_Post", 1 )
RegisterHam( Ham_TakeDamage, "player", "fw_PlayerTakeDamage_Post" )
RegisterHam( Ham_Item_AddToPlayer, "weapon_awp", "fw_CrossbowAddToPlayer" )
RegisterHam( Ham_Item_PostFrame, "weapon_awp", "fw_CrossbowPostFrame" )
RegisterHam( Ham_Weapon_Reload, "weapon_awp", "fw_CrossbowReload_Post", 1 )
register_message( get_user_msgid( "DeathMsg" ), "fn_DeathMsg" )
gmsgAmmoPickup = get_user_msgid( "AmmoPickup" )
}
public zp_extra_item_selected( Player, Item )
{
if( Item == g_crossbow )
{
DropWeapons( Player, 1 )
g_hasXbow[ Player ] = true
give_item( Player, "weapon_awp" )
static iEnt
iEnt = find_ent_by_owner( -1, "weapon_awp", Player )
cs_set_weapon_ammo( iEnt, CrossbowClip )
cs_set_user_bpammo( Player, CSW_AWP, CrossbowBpAmmo )
}
if( Item == g_grenade )
{
if( user_has_weapon( Player, CSW_HEGRENADE ) && g_iGrenadeCount[ Player ] <= 0 )
{
g_iGrenadeCount[ Player ] = 1
emit_sound( Player, CHAN_WEAPON, "items/9mmclip1.wav", 1.0, 1.0, 0, 100 )
return PLUGIN_HANDLED
}
if( !g_iGrenadeCount[ Player ] )
{
g_iGrenadeCount[ Player ] = 1
give_item( Player, "weapon_hegrenade" )
}
else
{
g_iGrenadeCount[ Player ]++
cs_set_user_bpammo( Player, CSW_HEGRENADE, g_iGrenadeCount[ Player ] )
emit_sound( Player, CHAN_WEAPON, "items/9mmclip1.wav", 1.0, 1.0, 0, 100 )
message_begin( MSG_ONE, gmsgAmmoPickup, _, Player )
write_byte( 12 )
write_byte( 1 )
message_end( )
}
}
return PLUGIN_CONTINUE
}
public zp_user_infected_post( Player, Infector )
{
g_iGrenadeCount[ Player ] = 0
}
public zp_user_humanized_post( Player, Survivor )
{
g_iGrenadeCount[ Survivor ] = 0
}
public EV_CurWeapon( Player )
{
if( !is_user_alive( Player ) )
return PLUGIN_CONTINUE
g_iCurrentWeapon[ Player ] = read_data( 2 )
if( g_iCurrentWeapon[ Player ] == CSW_HEGRENADE )
{
if( g_iGrenadeCount[ Player ] >= 1 )
{
set_pev( Player, pev_viewmodel2, V_GRENADE )
set_pev( Player, pev_weaponmodel2, P_GRENADE )
}
}
return PLUGIN_CONTINUE
}
public fw_SetModel (iEnt, const szModel[ ] )
{
if( !pev_valid( iEnt ) )
return FMRES_IGNORED
static szClassname[ 32 ]
pev( iEnt, pev_classname, szClassname, 31 )
static iOwner, iWeaponID
iOwner = pev( iEnt, pev_owner )
if( equal( szModel[ 7 ], "w_he", 4 ) )
{
if( g_iGrenadeCount[ iOwner ] >= 1 )
{
g_has_grenade[iOwner] = true
g_iGrenadeCount[ iOwner ]--
set_task(3.0, "remove", iOwner)
set_pev( iEnt, pev_flTimeStepSound, 0 )
engfunc( EngFunc_SetModel, iEnt, W_GRENADE )
return FMRES_SUPERCEDE
}
}
if( !equal( szClassname, "weaponbox" ) )
return FMRES_IGNORED
if( equal( szModel[ 7 ], "w_aw", 4 ) )
{
iWeaponID = find_ent_by_owner( -1, "weapon_awp", iEnt )
if( g_hasXbow[ iOwner ] && is_valid_ent( iWeaponID ) )
{
set_pev( iWeaponID, pev_weaponkey, CROSSBOW_WEAPONKEY )
g_hasXbow[ iOwner ] = false
engfunc( EngFunc_SetModel, iEnt, W_MODEL )
return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}
public remove(id)
{
g_has_grenade[id] = false
}
public fw_CmdStart( Player, UC_Handle, Seed )
{
if( !is_user_alive( Player ) || zp_get_user_zombie( Player ))
return FMRES_IGNORED
if( HoldCrossbow( Player ) )
{
static afButtons
afButtons = get_uc( UC_Handle, UC_Buttons )
if( afButtons & IN_ATTACK )
{
afButtons &= ~IN_ATTACK
set_uc( UC_Handle, UC_Buttons, afButtons )
if( get_gametime( ) - g_last_shot_time[ Player ] < 0.13 )
return FMRES_IGNORED
static iEnt
iEnt = find_ent_by_owner( -1, "weapon_awp", Player )
if( get_pdata_int( iEnt, m_fInReload, 4 ) )
return FMRES_IGNORED
static iAmmo
iAmmo = cs_get_weapon_ammo( iEnt )
if( iAmmo <= 0 )
{
ExecuteHamB( Ham_Weapon_PlayEmptySound, iEnt )
return FMRES_IGNORED
}
FireBolt( Player )
cs_set_weapon_ammo( iEnt, --iAmmo )
g_last_shot_time[ Player ] = get_gametime( )
}
}
return FMRES_HANDLED
}
public fw_UpdateClientaData_Post( Player, SendWeapons, CD_Handle )
{
if( !is_user_alive( Player ) || zp_get_user_zombie( Player ))
return FMRES_IGNORED
if( HoldCrossbow( Player ) )
{
set_cd( CD_Handle, CD_flNextAttack, halflife_time( ) + 0.001 )
return FMRES_HANDLED
}
return FMRES_IGNORED
}
public fw_PlayerKilled( iVictim, iKiller, iGib )
{
g_iGrenadeCount[ iVictim ] = 0
}
public fw_PlayerTakeDamage_Post( iVictim, iInflictor, iAttacker, Float:flDamage, iDmgBits )
{
if( !is_user_connected( iAttacker ) )
return HAM_IGNORED
if( zp_get_user_zombie( iAttacker ) )
return HAM_IGNORED
if( iDmgBits & DMG_HEGRENADE )
{
if( !zp_get_user_zombie( iVictim ) )
return HAM_SUPERCEDE
if( g_has_grenade[iAttacker])
{
//client_print( 0, print_chat, "OLD DAMAGE: %f", flDamage )
flDamage *= GrenadeDmgMulti
SetHamParamFloat( 4, flDamage )
//client_print( 0, print_chat, "NEW DAMAFE: %f", flDamage )
}
}
return HAM_IGNORED
}
public fw_CrossbowDeploy_Post( iEnt )
{
static Player
Player = get_pdata_cbase( iEnt, 41, 4 )
if( g_hasXbow[ Player ] )
{
set_pev( Player, pev_viewmodel2, V_MODEL )
set_pev( Player, pev_weaponmodel2, P_MODEL )
UTIL_PlayWeaponAnimation( Player, crossbow_draw )
}
}
public fw_CrossbowAddToPlayer( iEnt, Player )
{
if( pev_valid( iEnt ) && is_user_connected( Player ) )
{
if( pev( iEnt, pev_weaponkey ) == CROSSBOW_WEAPONKEY )
{
g_hasXbow[ Player ] = true
}
return HAM_HANDLED
}
return HAM_IGNORED
}
public fw_CrossbowPostFrame( iEnt )
{
static Player
Player = get_pdata_cbase( iEnt, 41, 4 )
if( g_hasXbow[ Player ] )
{
static fInReload
fInReload = get_pdata_int( iEnt, m_fInReload, 4 )
static Float:flNextAttack
flNextAttack = get_pdata_float( Player, m_flNextAttack, 5 )
static iClip
iClip = get_pdata_int( iEnt, m_iClip, 4 )
static iBpAmmo
iBpAmmo = cs_get_user_bpammo( Player, CSW_AWP )
if( fInReload && flNextAttack <= 0.0 )
{
static j
j = min ( CrossbowClip - iClip, iBpAmmo )
set_pdata_int( iEnt, m_iClip, iClip + j, 4 )
cs_set_user_bpammo( Player, CSW_AWP, iBpAmmo - j )
set_pdata_int ( iEnt, m_fInReload, 0, 4 )
fInReload = 0
}
static iButton ; iButton = pev( Player, pev_button )
if( ( iButton & IN_ATTACK2 && get_pdata_float( iEnt, m_flNextSecondaryAttack, 4 ) <= 0.0)
|| ( iButton & IN_ATTACK && get_pdata_float( iEnt, m_flNextPrimaryAttack, 4 ) <= 0.0) )
{
return HAM_IGNORED
}
if( iButton & IN_RELOAD && !fInReload )
{
if( iClip >= CrossbowClip )
{
set_pev( Player, pev_button, iButton & ~IN_RELOAD )
return HAM_SUPERCEDE
}
else
{
if ( !iBpAmmo )
return HAM_IGNORED
cs_set_user_zoom( Player, CS_RESET_ZOOM, 1 )
set_pdata_float( Player, m_flNextAttack, CrossbowReloadTime + 0.5, 5 )
set_pdata_float( iEnt, m_flTimeWeaponIdle, CrossbowReloadTime + 1.0, 4 )
UTIL_PlayWeaponAnimation( Player, crossbow_reload )
set_pdata_int( iEnt, m_fInReload, 1, 4 )
}
}
}
return HAM_IGNORED
}
public fw_CrossbowReload_Post( iEnt )
{
static Player
Player = get_pdata_cbase( iEnt, 41, 4 )
if( g_hasXbow[ Player ] && get_pdata_int( iEnt, m_fInReload,4 ))
{
set_pdata_float( Player, m_flNextAttack, CrossbowReloadTime + 0.5, 5 )
set_pdata_float( iEnt, m_flTimeWeaponIdle, CrossbowReloadTime + 1.0, 4 )
UTIL_PlayWeaponAnimation( Player, crossbow_reload )
}
}
// When client connected, he cant have our weapon
public client_connect(id)
{
g_hasXbow[id] = false
g_FullClip[id] = false
g_bInReload[id] = false
g_iGrenadeCount[id ] = 0
}
// New round started
public Event_NewRound()
{
if( g_restarted )
{
arrayset( g_hasXbow, false, 33 )
}
arrayset( g_iGrenadeCount, 0, 33 )
g_restarted = false
}
// Restart
public Event_GameRestart()
{
g_restarted = true
}
// Fire crossbow
public FireBolt( Player )
{
static Float:plrViewAngles[ 3 ], Float:VecEnd[ 3 ], Float:VecDir[ 3 ], Float:PlrOrigin[ 3 ]
pev( Player, pev_v_angle, plrViewAngles )
static Float:VecSrc[ 3 ], Float:VecDst[ 3 ]
pev( Player, pev_origin, PlrOrigin )
pev( Player, pev_view_ofs, VecSrc )
xs_vec_add( VecSrc, PlrOrigin, VecSrc )
angle_vector( plrViewAngles, ANGLEVECTOR_FORWARD, VecDir )
xs_vec_mul_scalar( VecDir, 8192.0, VecDst )
xs_vec_add( VecDst, VecSrc, VecDst )
new hTrace = create_tr2( )
engfunc( EngFunc_TraceLine, VecSrc, VecDst, 0, Player, hTrace )
new hitEnt = get_tr2( hTrace, TR_pHit )
get_tr2( hTrace, TR_vecEndPos, VecEnd )
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( TE_WORLDDECAL )
engfunc( EngFunc_WriteCoord, VecEnd[ 0 ] )
engfunc( EngFunc_WriteCoord, VecEnd[ 1 ] )
engfunc( EngFunc_WriteCoord, VecEnd[ 2 ] )
write_byte( random_num( 41, 45 ) )
message_end( )
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( TE_GUNSHOTDECAL )
engfunc( EngFunc_WriteCoord, VecEnd[ 0 ] )
engfunc( EngFunc_WriteCoord, VecEnd[ 1 ] )
engfunc( EngFunc_WriteCoord, VecEnd[ 2 ] )
write_short( Player )
write_byte( random_num( 41, 45 ) )
message_end( )
if( pev_valid( hitEnt ) )
{
new Float:takeDamage
pev( hitEnt, pev_takedamage, takeDamage )
if( takeDamage != 0.0 )
{
new Float:flDamage
flDamage = CrossbowDamage
new hitGroup = get_tr2( hTrace, TR_iHitgroup )
switch( hitGroup )
{
case HIT_HEAD: { flDamage *= 7.0; }
case HIT_LEFTARM: { flDamage *= 5.0; }
case HIT_RIGHTARM: { flDamage *= 5.0; }
case HIT_LEFTLEG: { flDamage *= 4.9; }
case HIT_RIGHTLEG: { flDamage *= 4.9; }
}
if( is_user_connected( hitEnt ) )
{
ExecuteHamB( Ham_TakeDamage, hitEnt, Player, Player, flDamage, DMG_BULLET | DMG_NEVERGIB )
ExecuteHamB( Ham_TraceBleed, hitEnt, flDamage, VecDir, hTrace, DMG_BULLET | DMG_NEVERGIB )
//make_blood( VecEnd, flDamage, hitEnt )
}
else
{
static szClassName[ 32 ]
pev( hitEnt, pev_classname, szClassName, 31 )
if( equal( szClassName, "func_breakable" ) )
{
static Float:flhealth
flhealth = entity_get_float( hitEnt, EV_FL_health )
if( flhealth - CrossbowDamage >= 1 )
{
entity_set_float( hitEnt, EV_FL_health, flhealth - CrossbowDamage )
}
else
{
dllfunc( DLLFunc_Use, hitEnt, Player )
}
}
}
}
free_tr2( hTrace )
}
// Play sound
emit_sound( Player, CHAN_WEAPON, XBOW_SHOOT, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
UTIL_PlayWeaponAnimation( Player, crossbow_shoot1 )
set_pev( Player, pev_punchangle, Float:{ -2.5, 0.0, 0.0 } )
return PLUGIN_CONTINUE
}
public fn_DeathMsg( Player, Dest, iEntity )
{
static iVictim, iKiller
iKiller = get_msg_arg_int( 1 )
iVictim = get_msg_arg_int( 2 )
if( !is_user_connected( iVictim ) || iKiller == iVictim )
return PLUGIN_CONTINUE
static szWeapon[ 32 ]
get_msg_arg_string( 4, szWeapon, 31 )
if( g_hasXbow[ iKiller ] && equal( szWeapon, "awp" ) )
{
set_msg_arg_string( 4, "crossbow" )
}
return PLUGIN_CONTINUE
}
// Play animation(Arkshine)
stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
set_pev(Player, pev_weaponanim, Sequence);
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player);
write_byte(Sequence);
write_byte(pev(Player, pev_body));
message_end();
}
public DropWeapons( Player, iDropWhat )
{
static szWeapons[ 32 ], iNum, i, iWeaponID
iNum = 0
get_user_weapons( Player, szWeapons, iNum )
for( i = 0; i < iNum; i++ )
{
iWeaponID = szWeapons[ i ]
if( ( iDropWhat == 1 && ( ( 1 << iWeaponID ) & PRIMARY_WEAPONS_BITSUM ) ) || ( iDropWhat == 2 && ( ( 1<<iWeaponID ) & SECONDARY_WEAPONS_BITSUM ) ) )
{
static szWname[ 32 ], iEnt
get_weaponname( iWeaponID, szWname, charsmax( szWname ) )
iEnt = find_ent_by_owner( -1, szWname, Player )
set_pev( iEnt, pev_iuser2, 1 )
engclient_cmd( Player, "drop", szWname )
}
}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/
|