Available new gun

Unpaid Requests, Public Plugins
Post Reply
czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

new gun

#1

Post by czirimbolo » 5 years ago

I am testing new guns in our mod, please can someone help to convert this gun?

Code: Select all

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <engine>
#include <hamsandwich>
#include <xs> 

#define PLUGIN "M249 Phoenix"
#define VERSION "1.0"
#define AUTHOR "Bim Bim Cay"

// Models
#define v_model "models/v_buffm249.mdl"
#define p_model "models/p_buffm249.mdl"
#define w_model "models/w_buffm249.mdl"

// Sounds
new const BuffM249_Sounds[4][] =
{
	"weapons/buffm249-1.wav",
	"weapons/buffm249-2.wav",
	"weapons/buffm249_scream.wav",
	"weapons/buffm249_loop.wav"
}

// Sprites
#define muzzleflash "sprites/muzzleflash43.spr"
#define lasersprite "sprites/smoke.spr"

// Animations 
#define ANIM_IDLE	0
#define ANIM_SHOOT1	1
#define ANIM_SHOOT2	2
#define ANIM_RELOAD 	3
#define ANIM_DRAW	4

#define ANIM_EXTENSION 	"m249"

// Entity Classname
#define MUZZLEFLASH_CLASSNAME "Muzzle_M249Phoenix"

// Configs
#define WEAPON_NAME 		"weapon_buffm249"
#define WEAPON_BASE		"weapon_sg552"

#define WEAPON_MAX_CLIP		100
#define WEAPON_DEFAULT_AMMO	200

#define WEAPON_SHOOT_DAMAGE	150.0
#define WEAPON_SHOOT_DAMAGEZ	400.0

#define WEAPON_TIME_NEXT_ATTACK	0.1
#define WEAPON_TIME_NEXT_ATTACKZ 0.75

#define WEAPON_SHOOT_ACCURACY 94.0

// MACROS
#define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
#define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
#define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))

#define INSTANCE(%0) ((%0 == -1) ? 0 : %0)
#define IsValidPev(%0) (pev_valid(%0) == 2)
#define IsObserver(%0) pev(%0,pev_iuser1)
#define MUZZLE_INTOLERANCE 100
#define OBS_IN_EYE 4

// Shell
#define MODEL_SHELL "models/rshell.mdl"

new g_iszWeaponKey
new g_iForwardDecalIndex
new iShellModelIndex
new g_SprTrail

// Safety
new g_HamBot
new g_IsConnected, g_IsAlive

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	// Safety
	Register_SafetyFunc()
	
	// Forward
	register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
	register_forward(FM_TraceLine, "fw_TraceLine_Post", 1)
	register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
	register_forward(FM_SetModel, "fw_SetModel")
	
	unregister_forward(FM_DecalIndex, g_iForwardDecalIndex, 1)
	
	// Think
	register_think(MUZZLEFLASH_CLASSNAME, "fw_MuzzleFlash_Think") 
	
	// Ham
	RegisterHam(Ham_Spawn, "weaponbox", "fw_Weaponbox_Spawn_Post", 1)
	
	RegisterHam(Ham_Item_Deploy, WEAPON_BASE, "fw_Item_Deploy_Post", 1)
	RegisterHam(Ham_Item_PostFrame, WEAPON_BASE, "fw_Item_PostFrame")
	RegisterHam(Ham_Weapon_Reload, WEAPON_BASE, "fw_Weapon_Reload")
	RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_BASE, "fw_Weapon_WeaponIdle")
	RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_BASE, "fw_Weapon_PrimaryAttack")
	
	RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_Entity")
	RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack_Entity")
	RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Entity")
	
	register_clcmd("say /get", "Get_MyWeapon")
}

public plugin_precache()
{
	precache_model(v_model)
	precache_model(p_model)
	precache_model(w_model)

	precache_model(muzzleflash)
	
	for(new i = 0; i < sizeof(BuffM249_Sounds); i++)
		precache_sound(BuffM249_Sounds[i])
	
	iShellModelIndex = precache_model(MODEL_SHELL)
	g_SprTrail = precache_model(lasersprite)
	
	g_iszWeaponKey = engfunc(EngFunc_AllocString, WEAPON_NAME)
	g_iForwardDecalIndex = register_forward(FM_DecalIndex, "fw_DecalIndex_Post", 1)	
}

public client_putinserver(iPlayer)
{
	Safety_Connected(iPlayer)
	
	if(!g_HamBot && is_user_bot(iPlayer))
	{
		g_HamBot = 1
		set_task(0.1, "Register_HamBot", iPlayer)
	}
}
 
public Register_HamBot(iPlayer)
{
	Register_SafetyFuncBot(iPlayer)
	RegisterHamFromEntity(Ham_TraceAttack, iPlayer, "fw_TraceAttack_Entity")	
}

public client_disconnect(iPlayer)
{
	Safety_Disconnected(iPlayer)
}

public Get_MyWeapon(iPlayer)
{
	Weapon_Give(iPlayer)
} 

//**********************************************
//* Forward Hooking                            *
//********************************************** 
public fw_UpdateClientData_Post(iPlayer, sendweapons, CD_Handle)
{
	enum
	{
		SPEC_MODE,
		SPEC_TARGET,
		SPEC_END
	}
	 
	static aSpecInfo[33][SPEC_END]
	
	static iTarget
	static iSpecMode 
	static iActiveItem
	
	iTarget = (iSpecMode = IsObserver(iPlayer)) ? pev(iPlayer, pev_iuser2) : iPlayer
	
	if(!is_alive(iTarget))
		return FMRES_IGNORED
	
	iActiveItem = get_pdata_cbase(iTarget, 373, 5)
	
	if(!IsValidPev(iActiveItem) || !IsCustomItem(iActiveItem))
		return FMRES_IGNORED
	
	if(iSpecMode)
	{
		if(aSpecInfo[iPlayer][SPEC_MODE] != iSpecMode)
		{
			aSpecInfo[iPlayer][SPEC_MODE] = iSpecMode
			aSpecInfo[iPlayer][SPEC_TARGET] = 0
		}
		
		if(iSpecMode == OBS_IN_EYE && aSpecInfo[iPlayer][SPEC_TARGET] != iTarget)
		{
			aSpecInfo[iPlayer][SPEC_TARGET] = iTarget
			
			Weapon_SendAnim(iPlayer, iActiveItem, ANIM_IDLE)
		}
	}
	
	set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001)
	
	return FMRES_HANDLED
}

public fw_TraceLine_Post(Float:TraceStart[3], Float:TraceEnd[3], fNoMonsters, iEntToSkip, iTrace) <FireBullets: Enabled>
{
	static Float:vecEndPos[3]
	
	get_tr2(iTrace, TR_vecEndPos, vecEndPos)
	engfunc(EngFunc_TraceLine, vecEndPos, TraceStart, fNoMonsters, iEntToSkip, 0)
	
	UTIL_GunshotDecalTrace(0)
	UTIL_GunshotDecalTrace(iTrace, true)
}

public fw_TraceLine_Post() </* Empty statement */>
{
	/* Fallback */
}

public fw_TraceLine_Post() <FireBullets: Disabled>	
{
	/* Do notning */
}

public fw_PlaybackEvent() <FireBullets: Enabled>
{
	return FMRES_SUPERCEDE
}

public fw_PlaybackEvent() </* Empty statement */>		
{ 
	return FMRES_IGNORED 
}

public fw_PlaybackEvent() <FireBullets: Disabled>		
{ 
	return FMRES_IGNORED 
}

//**********************************************
//* Weaponbox world model.                     *
//**********************************************
public fw_SetModel(iEntity) <WeaponBox: Enabled>
{
	state WeaponBox: Disabled
	
	if(!IsValidPev(iEntity))
		return FMRES_IGNORED
	
	#define MAX_ITEM_TYPES	6
	for(new i, iItem; i < MAX_ITEM_TYPES; i++)
	{
		iItem = get_pdata_cbase(iEntity, 34 + i, 4)
		
		if(IsValidPev(iItem) && IsCustomItem(iItem))
		{
			engfunc(EngFunc_SetModel, iEntity, w_model)
			return FMRES_SUPERCEDE
		}
	}
	
	return FMRES_IGNORED
}

public fw_SetModel() </* Empty statement */>	
{ 
	/*  Fallback  */ 
	return FMRES_IGNORED 
}
public fw_SetModel() <WeaponBox: Disabled>	
{ 
	/* Do nothing */ 
	return FMRES_IGNORED 
}

public fw_Weaponbox_Spawn_Post(iWeaponBox)
{
	if(IsValidPev(iWeaponBox))
	{
		state (IsValidPev(pev(iWeaponBox, pev_owner))) WeaponBox: Enabled
	}
	
	return HAM_IGNORED
}

//**********************************************
//* Weapon's codes.                    	       *
//**********************************************
public fw_Item_Deploy_Post(iItem)
{
	if(!IsCustomItem(iItem))
		return
		
	static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)	
	
	set_pev(iPlayer, pev_viewmodel2, v_model)
	set_pev(iPlayer, pev_weaponmodel2, p_model)
	
	Weapon_SendAnim(iPlayer, iItem, ANIM_DRAW)
	
	set_pdata_string(iPlayer, (492) * 4, ANIM_EXTENSION, -1 , 20)
}

public fw_Item_PostFrame(iItem)
{
	if(!IsCustomItem(iItem))
		return HAM_IGNORED
	
	static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
	
	if(get_pdata_int(iItem, 54, 4))
	{
		static iClip; iClip = get_pdata_int(iItem, 51, 4)
		static iPrimaryAmmoIndex; iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem)
		static iAmmoPrimary; iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex)
		static iAmount; iAmount = min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary)
		
		set_pdata_int(iItem, 51, iClip + iAmount, 4)
		SetAmmoInventory(iPlayer, iPrimaryAmmoIndex, iAmmoPrimary - iAmount)
		
		set_pdata_int(iItem, 54, 0, 4)
	}	
	
	static Float:flLastEventCheck; flLastEventCheck = get_pdata_float(iItem, 38, 4)
	
	if(flLastEventCheck < get_gametime())
	{
		flLastEventCheck = get_gametime() + 2.0
		set_pdata_float(iItem, 38, flLastEventCheck, 4)
		
		emit_sound(iPlayer, CHAN_ITEM, BuffM249_Sounds[3], 1.0, 0.4, 0, 94 + random_num(0, 15))
	}
	
	return HAM_IGNORED
}

public fw_Weapon_Reload(iItem)
{
	if(!IsCustomItem(iItem))
		return HAM_IGNORED
		
	static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)	
	
	static iClip; iClip = get_pdata_int(iItem, 51, 4)
	static iPrimaryAmmoIndex; iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem)
	static iAmmoPrimary; iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex)
	
	if(min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary) <= 0)
		return HAM_SUPERCEDE
	
	set_pdata_int(iItem, 51, 0, 4)
	
	ExecuteHam(Ham_Weapon_Reload, iItem)
	
	set_pdata_int(iItem, 51, iClip, 4)
	
	set_pdata_float(iPlayer, 83, 4.53, 5)
	set_pdata_float(iItem, 48, 4.53, 4)
	
	Weapon_SendAnim(iPlayer, iItem, ANIM_RELOAD)
	
	return HAM_SUPERCEDE	
}

public fw_Weapon_WeaponIdle(iItem)
{
	if(!IsCustomItem(iItem))
		return HAM_IGNORED
		
	static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)	
	
	ExecuteHamB(Ham_Weapon_ResetEmptySound, iItem)

	if(get_pdata_float(iItem, 48, 4) > 0.0)
		return HAM_SUPERCEDE
	
	set_pdata_float(iItem, 48, 10.0, 4)
	
	Weapon_SendAnim(iPlayer, iItem, ANIM_IDLE)
	
	return HAM_SUPERCEDE
}

public fw_Weapon_PrimaryAttack(iItem)
{
	if(!IsCustomItem(iItem))
		return HAM_IGNORED
		
	static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)	
	static iClip; iClip = get_pdata_int(iItem, 51, 4)
	
	if(iClip <= 0)
	{
		// No ammo, play empty sound and cancel
		if(get_pdata_int(iItem, 45, 4))
		{
			ExecuteHamB(Ham_Weapon_PlayEmptySound, iItem)
			set_pdata_float(iItem, 46, 0.2, 4)
		}
	
		return HAM_SUPERCEDE
	}
	
	CallOriginalFireBullets(iItem, iPlayer)
	
	static iFlags
	static szAnimation[64], Float:Velocity[3]

	iFlags = pev(iPlayer, pev_flags)
	
	if(iFlags & FL_DUCKING)
	{
		formatex(szAnimation, charsmax(szAnimation), "crouch_shoot_%s", ANIM_EXTENSION)
	}
	else
	{
		formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION)
	}
	
	Player_SetAnimation(iPlayer, szAnimation)
	
	set_pdata_float(iItem, 48, 1.0, 4)
	Weapon_SendAnim(iPlayer, iItem, random_num(ANIM_SHOOT1, ANIM_SHOOT2))
	
	pev(iPlayer, pev_velocity, Velocity)
		
	if(xs_vec_len(Velocity) > 0)
	{
		Weapon_KickBack(iItem, iPlayer, 0.5, 0.275, 0.2, 0.03, 3.0, 2.0, 10)
	}
	else if(!(iFlags & FL_ONGROUND))
	{
		Weapon_KickBack(iItem, iPlayer, 0.9, 0.475, 0.35, 0.0425, 5.0, 3.0, 6)
	}
	else if(iFlags & FL_DUCKING)
	{
		Weapon_KickBack(iItem, iPlayer, 0.225, 0.15, 0.1, 0.015, 2.0, 1.0, 10)
	}
	else
	{
		Weapon_KickBack(iItem, iPlayer, 0.25, 0.175, 0.125, 0.02, 2.25, 1.25, 10)
	}
		
	static Float:Accuracy
	Accuracy = ((100.0 - WEAPON_SHOOT_ACCURACY) * 1.5) / 100.0
	set_pdata_float(iItem, 62, Accuracy, 4)
	
	Make_MuzzleFlash(iPlayer)
	
	EjectBrass(iPlayer, iShellModelIndex, 1, .flForwardScale = 8.0)
	
	if(pev(iPlayer, pev_fov) == 90)
	{
		set_pdata_float(iItem, 46, WEAPON_TIME_NEXT_ATTACK, 4)
		set_pdata_float(iItem, 47, WEAPON_TIME_NEXT_ATTACK, 4)
		
		emit_sound(iPlayer, CHAN_WEAPON, BuffM249_Sounds[0], 1.0, 0.4, 0, 94 + random_num(0, 15))
	}
	else
	{
		set_pdata_float(iItem, 46, WEAPON_TIME_NEXT_ATTACKZ, 4)
		set_pdata_float(iItem, 47, WEAPON_TIME_NEXT_ATTACKZ, 4)
		
		emit_sound(iPlayer, CHAN_WEAPON, BuffM249_Sounds[1], 1.0, 0.4, 0, 94 + random_num(0, 15))
		
		Create_LaserEffect(iPlayer)
	}
	
	if(--iClip <= 0) emit_sound(iPlayer, CHAN_VOICE, BuffM249_Sounds[2], 1.0, 0.4, 0, 94 + random_num(0, 15))
	
	return HAM_SUPERCEDE
}

public fw_TraceAttack_Entity(iEntity, iAttacker, Float: flDamage) <FireBullets: Enabled>
{
	if(pev(iAttacker, pev_fov) == 90)
	{
		SetHamParamFloat(3, WEAPON_SHOOT_DAMAGE)
	}
	else
	{
		SetHamParamFloat(3, WEAPON_SHOOT_DAMAGEZ)
	}
}

public fw_TraceAttack_Entity() </* Empty statement */>		
{ 
	/* Fallback */ 
}

public fw_TraceAttack_Entity() <FireBullets: Disabled>		
{ 
	/* Do notning */ 
}

//**********************************************
//* Effects                                    *
//**********************************************
Make_MuzzleFlash(iPlayer)
{
	if(global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < MUZZLE_INTOLERANCE)
		return 
	
	static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))

	set_pev(Ent, pev_classname, MUZZLEFLASH_CLASSNAME)
	
	set_pev(Ent, pev_owner, iPlayer)
	set_pev(Ent, pev_body, 1)
	set_pev(Ent, pev_skin, iPlayer)
	set_pev(Ent, pev_movetype, MOVETYPE_FLY)
	
	engfunc(EngFunc_SetModel, Ent,  muzzleflash)
	
	set_pev(Ent, pev_scale, 0.05)
	set_pev(Ent, pev_frame, 0.0)
	set_pev(Ent, pev_rendermode, kRenderTransAdd)
	set_pev(Ent, pev_renderamt, 255.0)
	
	static Float:Angles[3]
	Angles[2] = random_float(-180.0, 180.0)
	set_pev(Ent, pev_angles, Angles)
	
	new Float:Origin[3]
	pev(iPlayer, pev_origin, Origin)
	set_pev(Ent, pev_origin, Origin)
	
	set_pev(Ent, pev_nextthink, get_gametime() + 0.03)
}

public fw_MuzzleFlash_Think(Ent)
{
	if(!pev_valid(Ent))
		return
	
	set_pev(Ent, pev_flags, FL_KILLME)
}

Create_LaserEffect(iPlayer)
{
	static Float:StartOrigin[3], Float:EndOrigin[3]
	
	Get_Position(iPlayer, 40.0, !get_cvar_num("cl_righthand") ? -6.0 : 6.0, -7.0, StartOrigin)
	fm_get_aim_origin(iPlayer, EndOrigin)
	
	for(new i = 0; i < 6; i++)
	{
		Create_BeamPoints(StartOrigin, EndOrigin, g_SprTrail, 0, 0, 6 - i, 20, 0, 241, 175, 0, 100 - i * 15, 0)
	}
}

//**********************************************
//* Safety Functions        		       *
//**********************************************
public Register_SafetyFunc()
{
	RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
	RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
}

public Register_SafetyFuncBot(iPlayer)
{
	RegisterHamFromEntity(Ham_Spawn, iPlayer, "fw_Safety_Spawn_Post", 1)
	RegisterHamFromEntity(Ham_Killed, iPlayer, "fw_Safety_Killed_Post", 1)
}

public Safety_Connected(iPlayer)
{
	Set_BitVar(g_IsConnected, iPlayer)
	UnSet_BitVar(g_IsAlive, iPlayer)
}

public Safety_Disconnected(iPlayer)
{
	UnSet_BitVar(g_IsConnected, iPlayer)
	UnSet_BitVar(g_IsAlive, iPlayer)
}

public fw_Safety_Spawn_Post(iPlayer)
{
	if(!is_user_alive(iPlayer))
		return
		
	Set_BitVar(g_IsAlive, iPlayer)
}

public fw_Safety_Killed_Post(iPlayer)
{
	UnSet_BitVar(g_IsAlive, iPlayer)
}

public is_connected(iPlayer)
{
	if(!(1 <= iPlayer <= 32))
		return 0
	if(!Get_BitVar(g_IsConnected, iPlayer))
		return 0

	return 1
}

public is_alive(iPlayer)
{
	if(!is_connected(iPlayer))
		return 0
	if(!Get_BitVar(g_IsAlive, iPlayer))
		return 0
		
	return 1
}

//**********************************************
//* Create and check our custom weapon.        *
//**********************************************
IsCustomItem(iItem)
{
	return (pev(iItem, pev_impulse) == g_iszWeaponKey)
}

Weapon_Create(Float: Origin[3] = {0.0, 0.0, 0.0}, Float: Angles[3] = {0.0, 0.0, 0.0})
{
	new iWeapon

	static iszAllocStringCached
	if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_BASE)))
	{
		iWeapon = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
	}
	
	if(!IsValidPev(iWeapon))
		return FM_NULLENT
	
	dllfunc(DLLFunc_Spawn, iWeapon)
	set_pev(iWeapon, pev_origin, Origin)

	set_pdata_int(iWeapon, 51, WEAPON_MAX_CLIP, 4)
	
	set_pev(iWeapon, pev_impulse, g_iszWeaponKey)
	set_pev(iWeapon, pev_angles, Angles)
	
	engfunc(EngFunc_SetModel, iWeapon, w_model)

	return iWeapon
}

Weapon_Give(iPlayer)
{
	if(!IsValidPev(iPlayer))
	{
		return FM_NULLENT
	}
	
	new iWeapon, Float: vecOrigin[3]
	pev(iPlayer, pev_origin, vecOrigin)
	
	if((iWeapon = Weapon_Create(vecOrigin)) != FM_NULLENT)
	{
		Player_DropWeapons(iPlayer, ExecuteHamB(Ham_Item_ItemSlot, iWeapon))
		
		set_pev(iWeapon, pev_spawnflags, pev(iWeapon, pev_spawnflags) | SF_NORESPAWN)
		dllfunc(DLLFunc_Touch, iWeapon, iPlayer)
		
		SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iWeapon), WEAPON_DEFAULT_AMMO)
		
		return iWeapon
	}
	
	return FM_NULLENT
}

Player_DropWeapons(iPlayer, iSlot)
{
	new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, 367 + iSlot, 5)

	while(IsValidPev(iItem))
	{
		pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName))
		engclient_cmd(iPlayer, "drop", szWeaponName)

		iItem = get_pdata_cbase(iItem, 42, 4)
	}
}

//**********************************************
//* Ammo Inventory.                            *
//**********************************************
PrimaryAmmoIndex(iItem)
{
	return get_pdata_int(iItem, 49, 4)
}

GetAmmoInventory(iPlayer, iAmmoIndex)
{
	if(iAmmoIndex == -1)
		return -1
	
	return get_pdata_int(iPlayer, 376 + iAmmoIndex, 5)
}

SetAmmoInventory(iPlayer, iAmmoIndex, iAmount)
{
	if(iAmmoIndex == -1)
		return 0
	
	set_pdata_int(iPlayer, 376 + iAmmoIndex, iAmount, 5)
	
	return 1
}

//**********************************************
//* Fire Bullets.                              *
//**********************************************
CallOriginalFireBullets(iItem, iPlayer)
{
	state FireBullets: Enabled
	static Float:g_Recoil[3]

	pev(iPlayer, pev_punchangle, g_Recoil)
	ExecuteHam(Ham_Weapon_PrimaryAttack, iItem)
	set_pev(iPlayer, pev_punchangle, g_Recoil)
	
	state FireBullets: Disabled
}

//**********************************************
//* Decals.                                    *
//**********************************************
new Array: g_hDecals

public fw_DecalIndex_Post()
{
	if(!g_hDecals)
	{
		g_hDecals = ArrayCreate(1, 1)
	}
	
	ArrayPushCell(g_hDecals, get_orig_retval())
}

UTIL_GunshotDecalTrace(iTrace, bool: bIsGunshot = false)
{
	static iHit
	static iMessage
	static iDecalIndex
	
	static Float:flFraction 
	static Float:vecEndPos[3]
	
	iHit = INSTANCE(get_tr2(iTrace, TR_pHit))
	
	if(iHit && !IsValidPev(iHit) || (pev(iHit, pev_flags) & FL_KILLME))
		return
	
	if(pev(iHit, pev_solid) != SOLID_BSP && pev(iHit, pev_movetype) != MOVETYPE_PUSHSTEP)
		return
	
	iDecalIndex = ExecuteHamB(Ham_DamageDecal, iHit, 0)
	
	if(iDecalIndex < 0 || iDecalIndex >=  ArraySize(g_hDecals))
		return
	
	iDecalIndex = ArrayGetCell(g_hDecals, iDecalIndex)
	
	get_tr2(iTrace, TR_flFraction, flFraction)
	get_tr2(iTrace, TR_vecEndPos, vecEndPos)
	
	if(iDecalIndex < 0 || flFraction >= 1.0)
		return
	
	if(bIsGunshot)
	{
		iMessage = TE_GUNSHOTDECAL
	}
	else
	{
		iMessage = TE_DECAL
		
		if(iHit != 0)
		{
			if(iDecalIndex > 255)
			{
				iMessage = TE_DECALHIGH
				iDecalIndex -= 256
			}
		}
		else
		{
			iMessage = TE_WORLDDECAL
			
			if(iDecalIndex > 255)
			{
				iMessage = TE_WORLDDECALHIGH
				iDecalIndex -= 256
			}
		}
	}
	
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEndPos, 0)
	write_byte(iMessage)
	engfunc(EngFunc_WriteCoord, vecEndPos[0])
	engfunc(EngFunc_WriteCoord, vecEndPos[1])
	engfunc(EngFunc_WriteCoord, vecEndPos[2])

	if(bIsGunshot)
	{
		write_short(iHit)
		write_byte(iDecalIndex)
	}
	else 
	{
		write_byte(iDecalIndex)
		
		if(iHit)
		{
			write_short(iHit)
		}
	}
    
	message_end()
}

//**********************************************
//* Set Animations.                            *
//**********************************************
stock Weapon_SendAnim(iPlayer, iItem, iAnim)
{
	static i, iCount, iSpectator, aSpectators[32]
	
	set_pev(iPlayer, pev_weaponanim, iAnim)

	message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iPlayer)
	write_byte(iAnim)
	write_byte(pev(iItem, pev_body))
	message_end()
	
	if(IsObserver(iPlayer))
		return
	
	get_players(aSpectators, iCount, "bch")

	for(i = 0; i < iCount; i++)
	{
		iSpectator = aSpectators[i]
		
		if(IsObserver(iSpectator) != OBS_IN_EYE || pev(iSpectator, pev_iuser2) != iPlayer)
			continue
		
		set_pev(iSpectator, pev_weaponanim, iAnim)

		message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iSpectator)
		write_byte(iAnim)
		write_byte(pev(iItem, pev_body))
		message_end()
	}
}

stock Player_SetAnimation(iPlayer, szAnim[])
{
	#define ACT_RANGE_ATTACK1   28
   
	// Linux extra offsets
	#define extra_offset_animating   4
	#define extra_offset_player 5
   
	// CBaseAnimating
	#define m_flFrameRate      36
	#define m_flGroundSpeed      37
	#define m_flLastEventCheck   38
	#define m_fSequenceFinished   39
	#define m_fSequenceLoops   40
   
	// CBaseMonster
	#define m_Activity      73
	#define m_IdealActivity      74
   
	// CBasePlayer
	#define m_flLastAttackTime   220
   
	new iAnimDesired, Float:flFrameRate, Float:flGroundSpeed, bool:bLoops
      
	if((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
	{
		iAnimDesired = 0
	}
   
	static Float:flGametime; flGametime = get_gametime()

	set_pev(iPlayer, pev_frame, 0.0)
	set_pev(iPlayer, pev_framerate, 1.0)
	set_pev(iPlayer, pev_animtime, flGametime)
	set_pev(iPlayer, pev_sequence, iAnimDesired)
   
	set_pdata_int(iPlayer, m_fSequenceLoops, bLoops, extra_offset_animating)
	set_pdata_int(iPlayer, m_fSequenceFinished, 0, extra_offset_animating)
   
	set_pdata_float(iPlayer, m_flFrameRate, flFrameRate, extra_offset_animating)
	set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, extra_offset_animating)
	set_pdata_float(iPlayer, m_flLastEventCheck, flGametime , extra_offset_animating)
   
	set_pdata_int(iPlayer, m_Activity, ACT_RANGE_ATTACK1, extra_offset_player)
	set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, extra_offset_player)  
	set_pdata_float(iPlayer, m_flLastAttackTime, flGametime , extra_offset_player)
}

//**********************************************
//* Kick back.                                 *
//**********************************************
Weapon_KickBack(iItem, iPlayer, Float:upBase, Float:lateralBase, Float:upMod, Float:lateralMod, Float:upMax, Float:lateralMax, directionChange)
{
	static iDirection
	static iShotsFired 
	
	static Float: Punchangle[3]
	pev(iPlayer, pev_punchangle, Punchangle)
	
	if((iShotsFired = get_pdata_int(iItem, 64, 4)) != 1)
	{
		upBase += iShotsFired * upMod
		lateralBase += iShotsFired * lateralMod
	}
	
	upMax *= -1.0
	Punchangle[0] -= upBase
 
	if(upMax >= Punchangle[0])
	{
		Punchangle[0] = upMax
	}
	
	if((iDirection = get_pdata_int(iItem, 60, 4)))
	{
		Punchangle[1] += lateralBase
		
		if(lateralMax < Punchangle[1])
		{
			Punchangle[1] = lateralMax
		}
	}
	else
	{
		lateralMax *= -1.0;
		Punchangle[1] -= lateralBase
		
		if(lateralMax > Punchangle[1])
		{
			Punchangle[1] = lateralMax
		}
	}
	
	if(!random_num(0, directionChange))
	{
		set_pdata_int(iItem, 60, !iDirection, 4)
	}
	
	set_pev(iPlayer, pev_punchangle, Punchangle)
}

//**********************************************
//* Brass ejection.                            *
//**********************************************
EjectBrass(iPlayer, iModelIndex, iBounce, Float:flUpScale = -9.0, Float:flForwardScale = 16.0, Float:flRightScale = 0.0)
{
	static i, msgBrass
	
	static Float: vecUp[3]
	static Float: vecRight[3]
	static Float: vecForward[3]
	
	static Float: vecAngle[3]
	static Float: vecOrigin[3]
	static Float: vecViewOfs[3]
	static Float: vecVelocity[3]
	
	pev(iPlayer, pev_v_angle, vecAngle)
	pev(iPlayer, pev_punchangle, vecOrigin)
	
	xs_vec_add(vecAngle, vecOrigin, vecOrigin)
	engfunc(EngFunc_MakeVectors, vecOrigin)
	
	pev(iPlayer, pev_origin, vecOrigin)
	pev(iPlayer, pev_view_ofs, vecViewOfs)
	pev(iPlayer, pev_velocity, vecVelocity)
	
	global_get(glb_v_up, vecUp)
	global_get(glb_v_right, vecRight)
	global_get(glb_v_forward, vecForward)
	
	for(i = 0; i < 3; i++)
	{
		vecOrigin[i] = vecOrigin[i] + vecViewOfs[i] + vecForward[i] * flForwardScale + vecUp[i] * flUpScale + vecRight[i] * flRightScale
		vecVelocity[i] = vecVelocity[i] + vecForward[i] * 25.0 + vecUp[i] * random_float(100.0, 150.0) + vecRight[i] * random_float(50.0, 70.0)
	}
	
	if(msgBrass || (msgBrass = get_user_msgid("Brass")))
	{
		engfunc(EngFunc_MessageBegin, MSG_PVS, msgBrass, vecOrigin, 0)
		write_byte(0 /* dummy */)
		engfunc(EngFunc_WriteCoord, vecOrigin[0])
		engfunc(EngFunc_WriteCoord, vecOrigin[1])
		engfunc(EngFunc_WriteCoord, vecOrigin[2])
		engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
		engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
		engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
		engfunc(EngFunc_WriteCoord, vecVelocity[0])
		engfunc(EngFunc_WriteCoord, vecVelocity[1])
		engfunc(EngFunc_WriteCoord, vecVelocity[2])
		engfunc(EngFunc_WriteAngle, vecAngle[1])
		write_short(iModelIndex)
		write_byte(iBounce)
		write_byte(0 /* dummy */)
		write_byte(iPlayer)
		message_end()
	}
}

stock Get_Position(iPlayer, Float:forw, Float:right, Float:up, Float:vStart[])
{
	new Float:Origin[3], Float:Angles[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
	
	pev(iPlayer, pev_origin, Origin)
	pev(iPlayer, pev_view_ofs,vUp) //for player
	xs_vec_add(Origin, vUp, Origin)
	pev(iPlayer, pev_v_angle, Angles) // if normal entity ,use pev_angles
	
	angle_vector(Angles, ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
	angle_vector(Angles, ANGLEVECTOR_RIGHT, vRight)
	angle_vector(Angles, ANGLEVECTOR_UP, vUp)
	
	vStart[0] = Origin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
	vStart[1] = Origin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
	vStart[2] = Origin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
}

stock get_speed_vector(Float:Origin1[3], Float:Origin2[3], Float:Speed, Float:NewVelocity[3])
{
	NewVelocity[0] = Origin2[0] - Origin1[0]
	NewVelocity[1] = Origin2[1] - Origin1[1]
	NewVelocity[2] = Origin2[2] - Origin1[2]
	new Float:num = floatsqroot(Speed*Speed / (NewVelocity[0]*NewVelocity[0] + NewVelocity[1]*NewVelocity[1] + NewVelocity[2]*NewVelocity[2]))
	NewVelocity[0] *= num
	NewVelocity[1] *= num
	NewVelocity[2] *= num
	
	return 1
}

stock Create_BeamPoints(Float:StartPosition[3], Float:TargetPosition[3], SpritesID, StartFrame, Framerate, Life, LineWidth, Amplitude, Red, Green, Blue, Brightness, Speed)
{
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_BEAMPOINTS)
	engfunc(EngFunc_WriteCoord, StartPosition[0])
	engfunc(EngFunc_WriteCoord, StartPosition[1])
	engfunc(EngFunc_WriteCoord, StartPosition[2])
	engfunc(EngFunc_WriteCoord, TargetPosition[0])
	engfunc(EngFunc_WriteCoord, TargetPosition[1])
	engfunc(EngFunc_WriteCoord, TargetPosition[2])
	write_short(SpritesID)
	write_byte(StartFrame)
	write_byte(Framerate)
	write_byte(Life)
	write_byte(LineWidth)
	write_byte(Amplitude)
	write_byte(Red)
	write_byte(Green)
	write_byte(Blue)
	write_byte(Brightness)
	write_byte(Speed)
	message_end()
}
This gun have /get command. Please can you remove it and make it showing in item menu. Many thanks
Image

User avatar
Night Fury
Mod Developer
Mod Developer
Posts: 677
Joined: 7 years ago
Contact:

#2

Post by Night Fury » 5 years ago

  1. /* Plugin generated by AMXX-Studio */
  2.  
  3. #include <zombie_escape>
  4. #include <fakemeta_util>
  5. #include <engine>
  6. #include <xs>
  7.  
  8. #define PLUGIN "M249 Phoenix"
  9. #define VERSION "1.0"
  10. #define AUTHOR "Bim Bim Cay"
  11.  
  12. // Models
  13. #define v_model "models/v_buffm249.mdl"
  14. #define p_model "models/p_buffm249.mdl"
  15. #define w_model "models/w_buffm249.mdl"
  16.  
  17. // Sounds
  18. new const BuffM249_Sounds[4][] =
  19. {
  20.     "weapons/buffm249-1.wav",
  21.     "weapons/buffm249-2.wav",
  22.     "weapons/buffm249_scream.wav",
  23.     "weapons/buffm249_loop.wav"
  24. }
  25.  
  26. // Sprites
  27. #define muzzleflash "sprites/muzzleflash43.spr"
  28. #define lasersprite "sprites/smoke.spr"
  29.  
  30. // Animations
  31. #define ANIM_IDLE   0
  32. #define ANIM_SHOOT1 1
  33. #define ANIM_SHOOT2 2
  34. #define ANIM_RELOAD     3
  35. #define ANIM_DRAW   4
  36.  
  37. #define ANIM_EXTENSION  "m249"
  38.  
  39. // Entity Classname
  40. #define MUZZLEFLASH_CLASSNAME "Muzzle_M249Phoenix"
  41.  
  42. // Configs
  43. #define WEAPON_NAME         "weapon_buffm249"
  44. #define WEAPON_BASE     "weapon_sg552"
  45.  
  46. #define WEAPON_MAX_CLIP     100
  47. #define WEAPON_DEFAULT_AMMO 200
  48.  
  49. #define WEAPON_SHOOT_DAMAGE 150.0
  50. #define WEAPON_SHOOT_DAMAGEZ    400.0
  51.  
  52. #define WEAPON_TIME_NEXT_ATTACK 0.1
  53. #define WEAPON_TIME_NEXT_ATTACKZ 0.75
  54.  
  55. #define WEAPON_SHOOT_ACCURACY 94.0
  56.  
  57. // MACROS
  58. #define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
  59. #define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
  60. #define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))
  61.  
  62. #define INSTANCE(%0) ((%0 == -1) ? 0 : %0)
  63. #define IsValidPev(%0) (pev_valid(%0) == 2)
  64. #define IsObserver(%0) pev(%0,pev_iuser1)
  65. #define MUZZLE_INTOLERANCE 100
  66. #define OBS_IN_EYE 4
  67.  
  68. // Shell
  69. #define MODEL_SHELL "models/rshell.mdl"
  70.  
  71. new g_iszWeaponKey
  72. new g_iForwardDecalIndex
  73. new iShellModelIndex
  74. new g_SprTrail
  75.  
  76. // Safety
  77. new g_HamBot
  78. new g_IsConnected, g_IsAlive
  79. new g_iItemId
  80.  
  81. public plugin_init()
  82. {
  83.     register_plugin(PLUGIN, VERSION, AUTHOR)
  84.    
  85.     // Safety
  86.     Register_SafetyFunc()
  87.    
  88.     // Forward
  89.     register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
  90.     register_forward(FM_TraceLine, "fw_TraceLine_Post", 1)
  91.     register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
  92.     register_forward(FM_SetModel, "fw_SetModel")
  93.    
  94.     unregister_forward(FM_DecalIndex, g_iForwardDecalIndex, 1)
  95.    
  96.     // Think
  97.     register_think(MUZZLEFLASH_CLASSNAME, "fw_MuzzleFlash_Think")
  98.    
  99.     // Ham
  100.     RegisterHam(Ham_Spawn, "weaponbox", "fw_Weaponbox_Spawn_Post", 1)
  101.    
  102.     RegisterHam(Ham_Item_Deploy, WEAPON_BASE, "fw_Item_Deploy_Post", 1)
  103.     RegisterHam(Ham_Item_PostFrame, WEAPON_BASE, "fw_Item_PostFrame")
  104.     RegisterHam(Ham_Weapon_Reload, WEAPON_BASE, "fw_Weapon_Reload")
  105.     RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_BASE, "fw_Weapon_WeaponIdle")
  106.     RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_BASE, "fw_Weapon_PrimaryAttack")
  107.    
  108.     RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_Entity")
  109.     RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack_Entity")
  110.     RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Entity")
  111.    
  112.     g_iItemId = ze_register_item("M249 Phoenix", 0, 0)
  113. }
  114.  
  115. public ze_select_item_pre(id, itemid)
  116. {
  117.     if (itemid != g_iItemId)
  118.         return ZE_ITEM_AVAILABLE
  119.  
  120.     if (ze_is_user_zombie(id))
  121.         return ZE_ITEM_DONT_SHOW
  122.  
  123.     return ZE_ITEM_AVAILABLE
  124. }
  125.  
  126. public ze_select_item_post(id, itemid)
  127. {
  128.     if (itemid != g_iItemId)
  129.         return
  130.  
  131.     Get_MyWeapon(id)
  132. }
  133.  
  134. public plugin_precache()
  135. {
  136.     precache_model(v_model)
  137.     precache_model(p_model)
  138.     precache_model(w_model)
  139.  
  140.     precache_model(muzzleflash)
  141.    
  142.     for(new i = 0; i < sizeof(BuffM249_Sounds); i++)
  143.         precache_sound(BuffM249_Sounds[i])
  144.    
  145.     iShellModelIndex = precache_model(MODEL_SHELL)
  146.     g_SprTrail = precache_model(lasersprite)
  147.    
  148.     g_iszWeaponKey = engfunc(EngFunc_AllocString, WEAPON_NAME)
  149.     g_iForwardDecalIndex = register_forward(FM_DecalIndex, "fw_DecalIndex_Post", 1)
  150. }
  151.  
  152. public client_putinserver(iPlayer)
  153. {
  154.     Safety_Connected(iPlayer)
  155.    
  156.     if(!g_HamBot && is_user_bot(iPlayer))
  157.     {
  158.         g_HamBot = 1
  159.         set_task(0.1, "Register_HamBot", iPlayer)
  160.     }
  161. }
  162.  
  163. public Register_HamBot(iPlayer)
  164. {
  165.     Register_SafetyFuncBot(iPlayer)
  166.     RegisterHamFromEntity(Ham_TraceAttack, iPlayer, "fw_TraceAttack_Entity")   
  167. }
  168.  
  169. public client_disconnect(iPlayer)
  170. {
  171.     Safety_Disconnected(iPlayer)
  172. }
  173.  
  174. public Get_MyWeapon(iPlayer)
  175. {
  176.     Weapon_Give(iPlayer)
  177. }
  178.  
  179. //**********************************************
  180. //* Forward Hooking                            *
  181. //**********************************************
  182. public fw_UpdateClientData_Post(iPlayer, sendweapons, CD_Handle)
  183. {
  184.     enum
  185.     {
  186.         SPEC_MODE,
  187.         SPEC_TARGET,
  188.         SPEC_END
  189.     }
  190.      
  191.     static aSpecInfo[33][SPEC_END]
  192.    
  193.     static iTarget
  194.     static iSpecMode
  195.     static iActiveItem
  196.    
  197.     iTarget = (iSpecMode = IsObserver(iPlayer)) ? pev(iPlayer, pev_iuser2) : iPlayer
  198.    
  199.     if(!is_alive(iTarget))
  200.         return FMRES_IGNORED
  201.    
  202.     iActiveItem = get_pdata_cbase(iTarget, 373, 5)
  203.    
  204.     if(!IsValidPev(iActiveItem) || !IsCustomItem(iActiveItem))
  205.         return FMRES_IGNORED
  206.    
  207.     if(iSpecMode)
  208.     {
  209.         if(aSpecInfo[iPlayer][SPEC_MODE] != iSpecMode)
  210.         {
  211.             aSpecInfo[iPlayer][SPEC_MODE] = iSpecMode
  212.             aSpecInfo[iPlayer][SPEC_TARGET] = 0
  213.         }
  214.        
  215.         if(iSpecMode == OBS_IN_EYE && aSpecInfo[iPlayer][SPEC_TARGET] != iTarget)
  216.         {
  217.             aSpecInfo[iPlayer][SPEC_TARGET] = iTarget
  218.            
  219.             Weapon_SendAnim(iPlayer, iActiveItem, ANIM_IDLE)
  220.         }
  221.     }
  222.    
  223.     set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001)
  224.    
  225.     return FMRES_HANDLED
  226. }
  227.  
  228. public fw_TraceLine_Post(Float:TraceStart[3], Float:TraceEnd[3], fNoMonsters, iEntToSkip, iTrace) <FireBullets: Enabled>
  229. {
  230.     static Float:vecEndPos[3]
  231.    
  232.     get_tr2(iTrace, TR_vecEndPos, vecEndPos)
  233.     engfunc(EngFunc_TraceLine, vecEndPos, TraceStart, fNoMonsters, iEntToSkip, 0)
  234.    
  235.     UTIL_GunshotDecalTrace(0)
  236.     UTIL_GunshotDecalTrace(iTrace, true)
  237. }
  238.  
  239. public fw_TraceLine_Post() </* Empty statement */>
  240. {
  241.     /* Fallback */
  242. }
  243.  
  244. public fw_TraceLine_Post() <FireBullets: Disabled> 
  245. {
  246.     /* Do notning */
  247. }
  248.  
  249. public fw_PlaybackEvent() <FireBullets: Enabled>
  250. {
  251.     return FMRES_SUPERCEDE
  252. }
  253.  
  254. public fw_PlaybackEvent() </* Empty statement */>      
  255. {
  256.     return FMRES_IGNORED
  257. }
  258.  
  259. public fw_PlaybackEvent() <FireBullets: Disabled>      
  260. {
  261.     return FMRES_IGNORED
  262. }
  263.  
  264. //**********************************************
  265. //* Weaponbox world model.                     *
  266. //**********************************************
  267. public fw_SetModel(iEntity) <WeaponBox: Enabled>
  268. {
  269.     state WeaponBox: Disabled
  270.    
  271.     if(!IsValidPev(iEntity))
  272.         return FMRES_IGNORED
  273.    
  274.     #define MAX_ITEM_TYPES  6
  275.     for(new i, iItem; i < MAX_ITEM_TYPES; i++)
  276.     {
  277.         iItem = get_pdata_cbase(iEntity, 34 + i, 4)
  278.        
  279.         if(IsValidPev(iItem) && IsCustomItem(iItem))
  280.         {
  281.             engfunc(EngFunc_SetModel, iEntity, w_model)
  282.             return FMRES_SUPERCEDE
  283.         }
  284.     }
  285.    
  286.     return FMRES_IGNORED
  287. }
  288.  
  289. public fw_SetModel() </* Empty statement */>   
  290. {
  291.     /*  Fallback  */
  292.     return FMRES_IGNORED
  293. }
  294. public fw_SetModel() <WeaponBox: Disabled> 
  295. {
  296.     /* Do nothing */
  297.     return FMRES_IGNORED
  298. }
  299.  
  300. public fw_Weaponbox_Spawn_Post(iWeaponBox)
  301. {
  302.     if(IsValidPev(iWeaponBox))
  303.     {
  304.         state (IsValidPev(pev(iWeaponBox, pev_owner))) WeaponBox: Enabled
  305.     }
  306.    
  307.     return HAM_IGNORED
  308. }
  309.  
  310. //**********************************************
  311. //* Weapon's codes.                            *
  312. //**********************************************
  313. public fw_Item_Deploy_Post(iItem)
  314. {
  315.     if(!IsCustomItem(iItem))
  316.         return
  317.        
  318.     static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
  319.    
  320.     set_pev(iPlayer, pev_viewmodel2, v_model)
  321.     set_pev(iPlayer, pev_weaponmodel2, p_model)
  322.    
  323.     Weapon_SendAnim(iPlayer, iItem, ANIM_DRAW)
  324.    
  325.     set_pdata_string(iPlayer, (492) * 4, ANIM_EXTENSION, -1 , 20)
  326. }
  327.  
  328. public fw_Item_PostFrame(iItem)
  329. {
  330.     if(!IsCustomItem(iItem))
  331.         return HAM_IGNORED
  332.    
  333.     static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
  334.    
  335.     if(get_pdata_int(iItem, 54, 4))
  336.     {
  337.         static iClip; iClip = get_pdata_int(iItem, 51, 4)
  338.         static iPrimaryAmmoIndex; iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem)
  339.         static iAmmoPrimary; iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex)
  340.         static iAmount; iAmount = min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary)
  341.        
  342.         set_pdata_int(iItem, 51, iClip + iAmount, 4)
  343.         SetAmmoInventory(iPlayer, iPrimaryAmmoIndex, iAmmoPrimary - iAmount)
  344.        
  345.         set_pdata_int(iItem, 54, 0, 4)
  346.     }  
  347.    
  348.     static Float:flLastEventCheck; flLastEventCheck = get_pdata_float(iItem, 38, 4)
  349.    
  350.     if(flLastEventCheck < get_gametime())
  351.     {
  352.         flLastEventCheck = get_gametime() + 2.0
  353.         set_pdata_float(iItem, 38, flLastEventCheck, 4)
  354.        
  355.         emit_sound(iPlayer, CHAN_ITEM, BuffM249_Sounds[3], 1.0, 0.4, 0, 94 + random_num(0, 15))
  356.     }
  357.    
  358.     return HAM_IGNORED
  359. }
  360.  
  361. public fw_Weapon_Reload(iItem)
  362. {
  363.     if(!IsCustomItem(iItem))
  364.         return HAM_IGNORED
  365.        
  366.     static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
  367.    
  368.     static iClip; iClip = get_pdata_int(iItem, 51, 4)
  369.     static iPrimaryAmmoIndex; iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem)
  370.     static iAmmoPrimary; iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex)
  371.    
  372.     if(min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary) <= 0)
  373.         return HAM_SUPERCEDE
  374.    
  375.     set_pdata_int(iItem, 51, 0, 4)
  376.    
  377.     ExecuteHam(Ham_Weapon_Reload, iItem)
  378.    
  379.     set_pdata_int(iItem, 51, iClip, 4)
  380.    
  381.     set_pdata_float(iPlayer, 83, 4.53, 5)
  382.     set_pdata_float(iItem, 48, 4.53, 4)
  383.    
  384.     Weapon_SendAnim(iPlayer, iItem, ANIM_RELOAD)
  385.    
  386.     return HAM_SUPERCEDE   
  387. }
  388.  
  389. public fw_Weapon_WeaponIdle(iItem)
  390. {
  391.     if(!IsCustomItem(iItem))
  392.         return HAM_IGNORED
  393.        
  394.     static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
  395.    
  396.     ExecuteHamB(Ham_Weapon_ResetEmptySound, iItem)
  397.  
  398.     if(get_pdata_float(iItem, 48, 4) > 0.0)
  399.         return HAM_SUPERCEDE
  400.    
  401.     set_pdata_float(iItem, 48, 10.0, 4)
  402.    
  403.     Weapon_SendAnim(iPlayer, iItem, ANIM_IDLE)
  404.    
  405.     return HAM_SUPERCEDE
  406. }
  407.  
  408. public fw_Weapon_PrimaryAttack(iItem)
  409. {
  410.     if(!IsCustomItem(iItem))
  411.         return HAM_IGNORED
  412.        
  413.     static iPlayer; iPlayer = get_pdata_cbase(iItem, 41, 4)
  414.     static iClip; iClip = get_pdata_int(iItem, 51, 4)
  415.    
  416.     if(iClip <= 0)
  417.     {
  418.         // No ammo, play empty sound and cancel
  419.         if(get_pdata_int(iItem, 45, 4))
  420.         {
  421.             ExecuteHamB(Ham_Weapon_PlayEmptySound, iItem)
  422.             set_pdata_float(iItem, 46, 0.2, 4)
  423.         }
  424.    
  425.         return HAM_SUPERCEDE
  426.     }
  427.    
  428.     CallOriginalFireBullets(iItem, iPlayer)
  429.    
  430.     static iFlags
  431.     static szAnimation[64], Float:Velocity[3]
  432.  
  433.     iFlags = pev(iPlayer, pev_flags)
  434.    
  435.     if(iFlags & FL_DUCKING)
  436.     {
  437.         formatex(szAnimation, charsmax(szAnimation), "crouch_shoot_%s", ANIM_EXTENSION)
  438.     }
  439.     else
  440.     {
  441.         formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION)
  442.     }
  443.    
  444.     Player_SetAnimation(iPlayer, szAnimation)
  445.    
  446.     set_pdata_float(iItem, 48, 1.0, 4)
  447.     Weapon_SendAnim(iPlayer, iItem, random_num(ANIM_SHOOT1, ANIM_SHOOT2))
  448.    
  449.     pev(iPlayer, pev_velocity, Velocity)
  450.        
  451.     if(xs_vec_len(Velocity) > 0)
  452.     {
  453.         Weapon_KickBack(iItem, iPlayer, 0.5, 0.275, 0.2, 0.03, 3.0, 2.0, 10)
  454.     }
  455.     else if(!(iFlags & FL_ONGROUND))
  456.     {
  457.         Weapon_KickBack(iItem, iPlayer, 0.9, 0.475, 0.35, 0.0425, 5.0, 3.0, 6)
  458.     }
  459.     else if(iFlags & FL_DUCKING)
  460.     {
  461.         Weapon_KickBack(iItem, iPlayer, 0.225, 0.15, 0.1, 0.015, 2.0, 1.0, 10)
  462.     }
  463.     else
  464.     {
  465.         Weapon_KickBack(iItem, iPlayer, 0.25, 0.175, 0.125, 0.02, 2.25, 1.25, 10)
  466.     }
  467.        
  468.     static Float:Accuracy
  469.     Accuracy = ((100.0 - WEAPON_SHOOT_ACCURACY) * 1.5) / 100.0
  470.     set_pdata_float(iItem, 62, Accuracy, 4)
  471.    
  472.     Make_MuzzleFlash(iPlayer)
  473.    
  474.     EjectBrass(iPlayer, iShellModelIndex, 1, .flForwardScale = 8.0)
  475.    
  476.     if(pev(iPlayer, pev_fov) == 90)
  477.     {
  478.         set_pdata_float(iItem, 46, WEAPON_TIME_NEXT_ATTACK, 4)
  479.         set_pdata_float(iItem, 47, WEAPON_TIME_NEXT_ATTACK, 4)
  480.        
  481.         emit_sound(iPlayer, CHAN_WEAPON, BuffM249_Sounds[0], 1.0, 0.4, 0, 94 + random_num(0, 15))
  482.     }
  483.     else
  484.     {
  485.         set_pdata_float(iItem, 46, WEAPON_TIME_NEXT_ATTACKZ, 4)
  486.         set_pdata_float(iItem, 47, WEAPON_TIME_NEXT_ATTACKZ, 4)
  487.        
  488.         emit_sound(iPlayer, CHAN_WEAPON, BuffM249_Sounds[1], 1.0, 0.4, 0, 94 + random_num(0, 15))
  489.        
  490.         Create_LaserEffect(iPlayer)
  491.     }
  492.    
  493.     if(--iClip <= 0) emit_sound(iPlayer, CHAN_VOICE, BuffM249_Sounds[2], 1.0, 0.4, 0, 94 + random_num(0, 15))
  494.    
  495.     return HAM_SUPERCEDE
  496. }
  497.  
  498. public fw_TraceAttack_Entity(iEntity, iAttacker, Float: flDamage) <FireBullets: Enabled>
  499. {
  500.     if(pev(iAttacker, pev_fov) == 90)
  501.     {
  502.         SetHamParamFloat(3, WEAPON_SHOOT_DAMAGE)
  503.     }
  504.     else
  505.     {
  506.         SetHamParamFloat(3, WEAPON_SHOOT_DAMAGEZ)
  507.     }
  508. }
  509.  
  510. public fw_TraceAttack_Entity() </* Empty statement */>     
  511. {
  512.     /* Fallback */
  513. }
  514.  
  515. public fw_TraceAttack_Entity() <FireBullets: Disabled>     
  516. {
  517.     /* Do notning */
  518. }
  519.  
  520. //**********************************************
  521. //* Effects                                    *
  522. //**********************************************
  523. Make_MuzzleFlash(iPlayer)
  524. {
  525.     if(global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < MUZZLE_INTOLERANCE)
  526.         return
  527.    
  528.     static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  529.  
  530.     set_pev(Ent, pev_classname, MUZZLEFLASH_CLASSNAME)
  531.    
  532.     set_pev(Ent, pev_owner, iPlayer)
  533.     set_pev(Ent, pev_body, 1)
  534.     set_pev(Ent, pev_skin, iPlayer)
  535.     set_pev(Ent, pev_movetype, MOVETYPE_FLY)
  536.    
  537.     engfunc(EngFunc_SetModel, Ent,  muzzleflash)
  538.    
  539.     set_pev(Ent, pev_scale, 0.05)
  540.     set_pev(Ent, pev_frame, 0.0)
  541.     set_pev(Ent, pev_rendermode, kRenderTransAdd)
  542.     set_pev(Ent, pev_renderamt, 255.0)
  543.    
  544.     static Float:Angles[3]
  545.     Angles[2] = random_float(-180.0, 180.0)
  546.     set_pev(Ent, pev_angles, Angles)
  547.    
  548.     new Float:Origin[3]
  549.     pev(iPlayer, pev_origin, Origin)
  550.     set_pev(Ent, pev_origin, Origin)
  551.    
  552.     set_pev(Ent, pev_nextthink, get_gametime() + 0.03)
  553. }
  554.  
  555. public fw_MuzzleFlash_Think(Ent)
  556. {
  557.     if(!pev_valid(Ent))
  558.         return
  559.    
  560.     set_pev(Ent, pev_flags, FL_KILLME)
  561. }
  562.  
  563. Create_LaserEffect(iPlayer)
  564. {
  565.     static Float:StartOrigin[3], Float:EndOrigin[3]
  566.    
  567.     Get_Position(iPlayer, 40.0, !get_cvar_num("cl_righthand") ? -6.0 : 6.0, -7.0, StartOrigin)
  568.     fm_get_aim_origin(iPlayer, EndOrigin)
  569.    
  570.     for(new i = 0; i < 6; i++)
  571.     {
  572.         Create_BeamPoints(StartOrigin, EndOrigin, g_SprTrail, 0, 0, 6 - i, 20, 0, 241, 175, 0, 100 - i * 15, 0)
  573.     }
  574. }
  575.  
  576. //**********************************************
  577. //* Safety Functions                       *
  578. //**********************************************
  579. public Register_SafetyFunc()
  580. {
  581.     RegisterHam(Ham_Spawn, "player", "fw_Safety_Spawn_Post", 1)
  582.     RegisterHam(Ham_Killed, "player", "fw_Safety_Killed_Post", 1)
  583. }
  584.  
  585. public Register_SafetyFuncBot(iPlayer)
  586. {
  587.     RegisterHamFromEntity(Ham_Spawn, iPlayer, "fw_Safety_Spawn_Post", 1)
  588.     RegisterHamFromEntity(Ham_Killed, iPlayer, "fw_Safety_Killed_Post", 1)
  589. }
  590.  
  591. public Safety_Connected(iPlayer)
  592. {
  593.     Set_BitVar(g_IsConnected, iPlayer)
  594.     UnSet_BitVar(g_IsAlive, iPlayer)
  595. }
  596.  
  597. public Safety_Disconnected(iPlayer)
  598. {
  599.     UnSet_BitVar(g_IsConnected, iPlayer)
  600.     UnSet_BitVar(g_IsAlive, iPlayer)
  601. }
  602.  
  603. public fw_Safety_Spawn_Post(iPlayer)
  604. {
  605.     if(!is_user_alive(iPlayer))
  606.         return
  607.        
  608.     Set_BitVar(g_IsAlive, iPlayer)
  609. }
  610.  
  611. public fw_Safety_Killed_Post(iPlayer)
  612. {
  613.     UnSet_BitVar(g_IsAlive, iPlayer)
  614. }
  615.  
  616. public is_connected(iPlayer)
  617. {
  618.     if(!(1 <= iPlayer <= 32))
  619.         return 0
  620.     if(!Get_BitVar(g_IsConnected, iPlayer))
  621.         return 0
  622.  
  623.     return 1
  624. }
  625.  
  626. public is_alive(iPlayer)
  627. {
  628.     if(!is_connected(iPlayer))
  629.         return 0
  630.     if(!Get_BitVar(g_IsAlive, iPlayer))
  631.         return 0
  632.        
  633.     return 1
  634. }
  635.  
  636. //**********************************************
  637. //* Create and check our custom weapon.        *
  638. //**********************************************
  639. IsCustomItem(iItem)
  640. {
  641.     return (pev(iItem, pev_impulse) == g_iszWeaponKey)
  642. }
  643.  
  644. Weapon_Create(Float: Origin[3] = {0.0, 0.0, 0.0}, Float: Angles[3] = {0.0, 0.0, 0.0})
  645. {
  646.     new iWeapon
  647.  
  648.     static iszAllocStringCached
  649.     if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_BASE)))
  650.     {
  651.         iWeapon = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
  652.     }
  653.    
  654.     if(!IsValidPev(iWeapon))
  655.         return FM_NULLENT
  656.    
  657.     dllfunc(DLLFunc_Spawn, iWeapon)
  658.     set_pev(iWeapon, pev_origin, Origin)
  659.  
  660.     set_pdata_int(iWeapon, 51, WEAPON_MAX_CLIP, 4)
  661.    
  662.     set_pev(iWeapon, pev_impulse, g_iszWeaponKey)
  663.     set_pev(iWeapon, pev_angles, Angles)
  664.    
  665.     engfunc(EngFunc_SetModel, iWeapon, w_model)
  666.  
  667.     return iWeapon
  668. }
  669.  
  670. Weapon_Give(iPlayer)
  671. {
  672.     if(!IsValidPev(iPlayer))
  673.     {
  674.         return FM_NULLENT
  675.     }
  676.    
  677.     new iWeapon, Float: vecOrigin[3]
  678.     pev(iPlayer, pev_origin, vecOrigin)
  679.    
  680.     if((iWeapon = Weapon_Create(vecOrigin)) != FM_NULLENT)
  681.     {
  682.         Player_DropWeapons(iPlayer, ExecuteHamB(Ham_Item_ItemSlot, iWeapon))
  683.        
  684.         set_pev(iWeapon, pev_spawnflags, pev(iWeapon, pev_spawnflags) | SF_NORESPAWN)
  685.         dllfunc(DLLFunc_Touch, iWeapon, iPlayer)
  686.        
  687.         SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iWeapon), WEAPON_DEFAULT_AMMO)
  688.        
  689.         return iWeapon
  690.     }
  691.    
  692.     return FM_NULLENT
  693. }
  694.  
  695. Player_DropWeapons(iPlayer, iSlot)
  696. {
  697.     new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, 367 + iSlot, 5)
  698.  
  699.     while(IsValidPev(iItem))
  700.     {
  701.         pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName))
  702.         engclient_cmd(iPlayer, "drop", szWeaponName)
  703.  
  704.         iItem = get_pdata_cbase(iItem, 42, 4)
  705.     }
  706. }
  707.  
  708. //**********************************************
  709. //* Ammo Inventory.                            *
  710. //**********************************************
  711. PrimaryAmmoIndex(iItem)
  712. {
  713.     return get_pdata_int(iItem, 49, 4)
  714. }
  715.  
  716. GetAmmoInventory(iPlayer, iAmmoIndex)
  717. {
  718.     if(iAmmoIndex == -1)
  719.         return -1
  720.    
  721.     return get_pdata_int(iPlayer, 376 + iAmmoIndex, 5)
  722. }
  723.  
  724. SetAmmoInventory(iPlayer, iAmmoIndex, iAmount)
  725. {
  726.     if(iAmmoIndex == -1)
  727.         return 0
  728.    
  729.     set_pdata_int(iPlayer, 376 + iAmmoIndex, iAmount, 5)
  730.    
  731.     return 1
  732. }
  733.  
  734. //**********************************************
  735. //* Fire Bullets.                              *
  736. //**********************************************
  737. CallOriginalFireBullets(iItem, iPlayer)
  738. {
  739.     state FireBullets: Enabled
  740.     static Float:g_Recoil[3]
  741.  
  742.     pev(iPlayer, pev_punchangle, g_Recoil)
  743.     ExecuteHam(Ham_Weapon_PrimaryAttack, iItem)
  744.     set_pev(iPlayer, pev_punchangle, g_Recoil)
  745.    
  746.     state FireBullets: Disabled
  747. }
  748.  
  749. //**********************************************
  750. //* Decals.                                    *
  751. //**********************************************
  752. new Array: g_hDecals
  753.  
  754. public fw_DecalIndex_Post()
  755. {
  756.     if(!g_hDecals)
  757.     {
  758.         g_hDecals = ArrayCreate(1, 1)
  759.     }
  760.    
  761.     ArrayPushCell(g_hDecals, get_orig_retval())
  762. }
  763.  
  764. UTIL_GunshotDecalTrace(iTrace, bool: bIsGunshot = false)
  765. {
  766.     static iHit
  767.     static iMessage
  768.     static iDecalIndex
  769.    
  770.     static Float:flFraction
  771.     static Float:vecEndPos[3]
  772.    
  773.     iHit = INSTANCE(get_tr2(iTrace, TR_pHit))
  774.    
  775.     if(iHit && !IsValidPev(iHit) || (pev(iHit, pev_flags) & FL_KILLME))
  776.         return
  777.    
  778.     if(pev(iHit, pev_solid) != SOLID_BSP && pev(iHit, pev_movetype) != MOVETYPE_PUSHSTEP)
  779.         return
  780.    
  781.     iDecalIndex = ExecuteHamB(Ham_DamageDecal, iHit, 0)
  782.    
  783.     if(iDecalIndex < 0 || iDecalIndex >=  ArraySize(g_hDecals))
  784.         return
  785.    
  786.     iDecalIndex = ArrayGetCell(g_hDecals, iDecalIndex)
  787.    
  788.     get_tr2(iTrace, TR_flFraction, flFraction)
  789.     get_tr2(iTrace, TR_vecEndPos, vecEndPos)
  790.    
  791.     if(iDecalIndex < 0 || flFraction >= 1.0)
  792.         return
  793.    
  794.     if(bIsGunshot)
  795.     {
  796.         iMessage = TE_GUNSHOTDECAL
  797.     }
  798.     else
  799.     {
  800.         iMessage = TE_DECAL
  801.        
  802.         if(iHit != 0)
  803.         {
  804.             if(iDecalIndex > 255)
  805.             {
  806.                 iMessage = TE_DECALHIGH
  807.                 iDecalIndex -= 256
  808.             }
  809.         }
  810.         else
  811.         {
  812.             iMessage = TE_WORLDDECAL
  813.            
  814.             if(iDecalIndex > 255)
  815.             {
  816.                 iMessage = TE_WORLDDECALHIGH
  817.                 iDecalIndex -= 256
  818.             }
  819.         }
  820.     }
  821.    
  822.     engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEndPos, 0)
  823.     write_byte(iMessage)
  824.     engfunc(EngFunc_WriteCoord, vecEndPos[0])
  825.     engfunc(EngFunc_WriteCoord, vecEndPos[1])
  826.     engfunc(EngFunc_WriteCoord, vecEndPos[2])
  827.  
  828.     if(bIsGunshot)
  829.     {
  830.         write_short(iHit)
  831.         write_byte(iDecalIndex)
  832.     }
  833.     else
  834.     {
  835.         write_byte(iDecalIndex)
  836.        
  837.         if(iHit)
  838.         {
  839.             write_short(iHit)
  840.         }
  841.     }
  842.    
  843.     message_end()
  844. }
  845.  
  846. //**********************************************
  847. //* Set Animations.                            *
  848. //**********************************************
  849. stock Weapon_SendAnim(iPlayer, iItem, iAnim)
  850. {
  851.     static i, iCount, iSpectator, aSpectators[32]
  852.    
  853.     set_pev(iPlayer, pev_weaponanim, iAnim)
  854.  
  855.     message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iPlayer)
  856.     write_byte(iAnim)
  857.     write_byte(pev(iItem, pev_body))
  858.     message_end()
  859.    
  860.     if(IsObserver(iPlayer))
  861.         return
  862.    
  863.     get_players(aSpectators, iCount, "bch")
  864.  
  865.     for(i = 0; i < iCount; i++)
  866.     {
  867.         iSpectator = aSpectators[i]
  868.        
  869.         if(IsObserver(iSpectator) != OBS_IN_EYE || pev(iSpectator, pev_iuser2) != iPlayer)
  870.             continue
  871.        
  872.         set_pev(iSpectator, pev_weaponanim, iAnim)
  873.  
  874.         message_begin(MSG_ONE, SVC_WEAPONANIM, .player = iSpectator)
  875.         write_byte(iAnim)
  876.         write_byte(pev(iItem, pev_body))
  877.         message_end()
  878.     }
  879. }
  880.  
  881. stock Player_SetAnimation(iPlayer, szAnim[])
  882. {
  883.     #define ACT_RANGE_ATTACK1   28
  884.    
  885.     // Linux extra offsets
  886.     #define extra_offset_animating   4
  887.     #define extra_offset_player 5
  888.    
  889.     // CBaseAnimating
  890.     #define m_flFrameRate      36
  891.     #define m_flGroundSpeed      37
  892.     #define m_flLastEventCheck   38
  893.     #define m_fSequenceFinished   39
  894.     #define m_fSequenceLoops   40
  895.    
  896.     // CBaseMonster
  897.     #define m_Activity      73
  898.     #define m_IdealActivity      74
  899.    
  900.     // CBasePlayer
  901.     #define m_flLastAttackTime   220
  902.    
  903.     new iAnimDesired, Float:flFrameRate, Float:flGroundSpeed, bool:bLoops
  904.      
  905.     if((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
  906.     {
  907.         iAnimDesired = 0
  908.     }
  909.    
  910.     static Float:flGametime; flGametime = get_gametime()
  911.  
  912.     set_pev(iPlayer, pev_frame, 0.0)
  913.     set_pev(iPlayer, pev_framerate, 1.0)
  914.     set_pev(iPlayer, pev_animtime, flGametime)
  915.     set_pev(iPlayer, pev_sequence, iAnimDesired)
  916.    
  917.     set_pdata_int(iPlayer, m_fSequenceLoops, bLoops, extra_offset_animating)
  918.     set_pdata_int(iPlayer, m_fSequenceFinished, 0, extra_offset_animating)
  919.    
  920.     set_pdata_float(iPlayer, m_flFrameRate, flFrameRate, extra_offset_animating)
  921.     set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, extra_offset_animating)
  922.     set_pdata_float(iPlayer, m_flLastEventCheck, flGametime , extra_offset_animating)
  923.    
  924.     set_pdata_int(iPlayer, m_Activity, ACT_RANGE_ATTACK1, extra_offset_player)
  925.     set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, extra_offset_player)  
  926.     set_pdata_float(iPlayer, m_flLastAttackTime, flGametime , extra_offset_player)
  927. }
  928.  
  929. //**********************************************
  930. //* Kick back.                                 *
  931. //**********************************************
  932. Weapon_KickBack(iItem, iPlayer, Float:upBase, Float:lateralBase, Float:upMod, Float:lateralMod, Float:upMax, Float:lateralMax, directionChange)
  933. {
  934.     static iDirection
  935.     static iShotsFired
  936.    
  937.     static Float: Punchangle[3]
  938.     pev(iPlayer, pev_punchangle, Punchangle)
  939.    
  940.     if((iShotsFired = get_pdata_int(iItem, 64, 4)) != 1)
  941.     {
  942.         upBase += iShotsFired * upMod
  943.         lateralBase += iShotsFired * lateralMod
  944.     }
  945.    
  946.     upMax *= -1.0
  947.     Punchangle[0] -= upBase
  948.  
  949.     if(upMax >= Punchangle[0])
  950.     {
  951.         Punchangle[0] = upMax
  952.     }
  953.    
  954.     if((iDirection = get_pdata_int(iItem, 60, 4)))
  955.     {
  956.         Punchangle[1] += lateralBase
  957.        
  958.         if(lateralMax < Punchangle[1])
  959.         {
  960.             Punchangle[1] = lateralMax
  961.         }
  962.     }
  963.     else
  964.     {
  965.         lateralMax *= -1.0;
  966.         Punchangle[1] -= lateralBase
  967.        
  968.         if(lateralMax > Punchangle[1])
  969.         {
  970.             Punchangle[1] = lateralMax
  971.         }
  972.     }
  973.    
  974.     if(!random_num(0, directionChange))
  975.     {
  976.         set_pdata_int(iItem, 60, !iDirection, 4)
  977.     }
  978.    
  979.     set_pev(iPlayer, pev_punchangle, Punchangle)
  980. }
  981.  
  982. //**********************************************
  983. //* Brass ejection.                            *
  984. //**********************************************
  985. EjectBrass(iPlayer, iModelIndex, iBounce, Float:flUpScale = -9.0, Float:flForwardScale = 16.0, Float:flRightScale = 0.0)
  986. {
  987.     static i, msgBrass
  988.    
  989.     static Float: vecUp[3]
  990.     static Float: vecRight[3]
  991.     static Float: vecForward[3]
  992.    
  993.     static Float: vecAngle[3]
  994.     static Float: vecOrigin[3]
  995.     static Float: vecViewOfs[3]
  996.     static Float: vecVelocity[3]
  997.    
  998.     pev(iPlayer, pev_v_angle, vecAngle)
  999.     pev(iPlayer, pev_punchangle, vecOrigin)
  1000.    
  1001.     xs_vec_add(vecAngle, vecOrigin, vecOrigin)
  1002.     engfunc(EngFunc_MakeVectors, vecOrigin)
  1003.    
  1004.     pev(iPlayer, pev_origin, vecOrigin)
  1005.     pev(iPlayer, pev_view_ofs, vecViewOfs)
  1006.     pev(iPlayer, pev_velocity, vecVelocity)
  1007.    
  1008.     global_get(glb_v_up, vecUp)
  1009.     global_get(glb_v_right, vecRight)
  1010.     global_get(glb_v_forward, vecForward)
  1011.    
  1012.     for(i = 0; i < 3; i++)
  1013.     {
  1014.         vecOrigin[i] = vecOrigin[i] + vecViewOfs[i] + vecForward[i] * flForwardScale + vecUp[i] * flUpScale + vecRight[i] * flRightScale
  1015.         vecVelocity[i] = vecVelocity[i] + vecForward[i] * 25.0 + vecUp[i] * random_float(100.0, 150.0) + vecRight[i] * random_float(50.0, 70.0)
  1016.     }
  1017.    
  1018.     if(msgBrass || (msgBrass = get_user_msgid("Brass")))
  1019.     {
  1020.         engfunc(EngFunc_MessageBegin, MSG_PVS, msgBrass, vecOrigin, 0)
  1021.         write_byte(0 /* dummy */)
  1022.         engfunc(EngFunc_WriteCoord, vecOrigin[0])
  1023.         engfunc(EngFunc_WriteCoord, vecOrigin[1])
  1024.         engfunc(EngFunc_WriteCoord, vecOrigin[2])
  1025.         engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
  1026.         engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
  1027.         engfunc(EngFunc_WriteCoord, 0.0 /* dummy */)
  1028.         engfunc(EngFunc_WriteCoord, vecVelocity[0])
  1029.         engfunc(EngFunc_WriteCoord, vecVelocity[1])
  1030.         engfunc(EngFunc_WriteCoord, vecVelocity[2])
  1031.         engfunc(EngFunc_WriteAngle, vecAngle[1])
  1032.         write_short(iModelIndex)
  1033.         write_byte(iBounce)
  1034.         write_byte(0 /* dummy */)
  1035.         write_byte(iPlayer)
  1036.         message_end()
  1037.     }
  1038. }
  1039.  
  1040. stock Get_Position(iPlayer, Float:forw, Float:right, Float:up, Float:vStart[])
  1041. {
  1042.     new Float:Origin[3], Float:Angles[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
  1043.    
  1044.     pev(iPlayer, pev_origin, Origin)
  1045.     pev(iPlayer, pev_view_ofs,vUp) //for player
  1046.     xs_vec_add(Origin, vUp, Origin)
  1047.     pev(iPlayer, pev_v_angle, Angles) // if normal entity ,use pev_angles
  1048.    
  1049.     angle_vector(Angles, ANGLEVECTOR_FORWARD, vForward) //or use EngFunc_AngleVectors
  1050.     angle_vector(Angles, ANGLEVECTOR_RIGHT, vRight)
  1051.     angle_vector(Angles, ANGLEVECTOR_UP, vUp)
  1052.    
  1053.     vStart[0] = Origin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up
  1054.     vStart[1] = Origin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up
  1055.     vStart[2] = Origin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up
  1056. }
  1057.  
  1058. stock get_speed_vector(Float:Origin1[3], Float:Origin2[3], Float:Speed, Float:NewVelocity[3])
  1059. {
  1060.     NewVelocity[0] = Origin2[0] - Origin1[0]
  1061.     NewVelocity[1] = Origin2[1] - Origin1[1]
  1062.     NewVelocity[2] = Origin2[2] - Origin1[2]
  1063.     new Float:num = floatsqroot(Speed*Speed / (NewVelocity[0]*NewVelocity[0] + NewVelocity[1]*NewVelocity[1] + NewVelocity[2]*NewVelocity[2]))
  1064.     NewVelocity[0] *= num
  1065.     NewVelocity[1] *= num
  1066.     NewVelocity[2] *= num
  1067.    
  1068.     return 1
  1069. }
  1070.  
  1071. stock Create_BeamPoints(Float:StartPosition[3], Float:TargetPosition[3], SpritesID, StartFrame, Framerate, Life, LineWidth, Amplitude, Red, Green, Blue, Brightness, Speed)
  1072. {
  1073.     message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  1074.     write_byte(TE_BEAMPOINTS)
  1075.     engfunc(EngFunc_WriteCoord, StartPosition[0])
  1076.     engfunc(EngFunc_WriteCoord, StartPosition[1])
  1077.     engfunc(EngFunc_WriteCoord, StartPosition[2])
  1078.     engfunc(EngFunc_WriteCoord, TargetPosition[0])
  1079.     engfunc(EngFunc_WriteCoord, TargetPosition[1])
  1080.     engfunc(EngFunc_WriteCoord, TargetPosition[2])
  1081.     write_short(SpritesID)
  1082.     write_byte(StartFrame)
  1083.     write_byte(Framerate)
  1084.     write_byte(Life)
  1085.     write_byte(LineWidth)
  1086.     write_byte(Amplitude)
  1087.     write_byte(Red)
  1088.     write_byte(Green)
  1089.     write_byte(Blue)
  1090.     write_byte(Brightness)
  1091.     write_byte(Speed)
  1092.     message_end()
  1093. }
Want your own mod edition? PM me.
Accepting private projects.
Discord: Fury#7469
Image

czirimbolo
Veteran Member
Veteran Member
Poland
Posts: 598
Joined: 7 years ago
Contact:

#3

Post by czirimbolo » 5 years ago

Working great, thanks.
Image

Post Reply

Create an account or sign in to join the discussion

You need to be a member in order to post a reply

Create an account

Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute

Register

Sign in

Who is online

Users browsing this forum: No registered users and 3 guests