Raised This Month: $ Target: $400
 0% 

Help with plugin crossbow


  
 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
Author Message
Kopcha
New Member
Join Date: Apr 2013
Old 04-13-2013 , 16:18   Help with plugin crossbow
Reply With Quote #1

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 }
*/

Last edited by Kopcha; 04-13-2013 at 16:18.
Kopcha is offline
 



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 10:53.


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