Raised This Month: $12 Target: $400
 3% 

Help / Support Gun for admin!


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Connor31
New Member
Join Date: Oct 2021
Old 10-24-2021 , 17:16   Gun for admin!
Reply With Quote #1

Hello guys! please help! how to make this gun for admin only in zombie plague shop? not for vips! by flags!
Code:
#include <amxmodx>
#include <fakemeta_util>
#include <hamsandwich>
#include <zombieplague>

#define PLUGIN 					"[ZP] Extra: CSO Weapon Buff M3"
#define VERSION 				"1.0"
#define AUTHOR 					"KORD_12.7"


//**********************************************
//* Weapon Settings.                           *
//**********************************************

#define WPNLIST	

// Main
#define WEAPON_KEY				785442
#define WEAPON_NAME 				"weapon_m3dragon"

#define WEAPON_REFERANCE			"weapon_xm1014"
#define WEAPON_MAX_CLIP				8
#define WEAPON_DEFAULT_AMMO			32

#define WEAPON_TIME_NEXT_IDLE 			15.0
#define WEAPON_TIME_NEXT_ATTACK 		1.0
#define WEAPON_TIME_DELAY_DEPLOY 		1.0

#define WEAPON_MULTIPLIER_DAMAGE  	  	1.5

#define WEAPON_RADIUS_DRAGON_ATTACK		200.0
#define WEAPON_DRAGON_DAMAGE_ATTACK		random_float(400.0, 500.0)

#define WEAPON_BALL_RADIUS_EXP			150.0			
#define WEAPON_DAMAGE_BALL_EXP			random_float(150.0, 200.0)

#define ZP_ITEM_NAME				"buffm3" 
#define ZP_ITEM_COST				0

// Models
#define MODEL_WORLD				"models/w_m3dragon.mdl"
#define MODEL_VIEW				"models/v_m3dragon.mdl"
#define MODEL_PLAYER				"models/p_m3dragon.mdl"
#define MODEL_DRAGON				"models/m3dragon_effect.mdl"
#define MODEL_FIREBALL				"models/ef_fireball2.mdl"

// Sounds
#define SOUND_FIRE				"weapons/m3dragon_shoot1.wav"
#define SOUND_FIRE_B				"weapons/m3dragon_shoot2.wav"
#define SOUND_EXPLODE				"weapons/m3dragon_exp.wav"
#define SOUND_DRAGON				"weapons/m3dragon_dragon_fx.wav"

// Sprites
#define WEAPON_HUD_TXT				"sprites/weapon_m3dragon.txt"
#define WEAPON_HUD_SPR				"sprites/640hud18.spr"
#define WEAPON_HUD_SPR2				"sprites/640hud177.spr"
#define WEAPON_SPR_EXP				"sprites/fexplo.spr"
#define WEAPON_SPR_SMOKE			"sprites/steam1.spr"
#define WEAPON_MUZZLE				"sprites/m3dragon_flame.spr"
#define WEAPON_MUZZLE_B				"sprites/m3dragon_flame2.spr"

// Animation
#define ANIM_EXTENSION				"shotgun"

// Animation sequences
enum
{	
	ANIM_IDLE,
	ANIM_SHOOT,
	ANIM_SHOOT2,
	ANIM_INSERT,
	ANIM_AFTER_RELOAD,
	ANIM_BEFOR_RELOAD,
	ANIM_DRAW,

	ANIM_IDLE_B,
	ANIM_SHOOT_B,
	ANIM_INSERT_B,
	ANIM_AFTER_RELOAD_B,
	ANIM_BEFOR_RELOAD_B,
	ANIM_DRAW_B,
};
//**********************************************
//* Some macroses.                             *
//**********************************************

#define MDLL_Spawn(%0)				dllfunc(DLLFunc_Spawn, %0)
#define MDLL_Touch(%0,%1)			dllfunc(DLLFunc_Touch, %0, %1)
#define MDLL_USE(%0,%1)				dllfunc(DLLFunc_Use, %0, %1)

#define SET_MODEL(%0,%1)			engfunc(EngFunc_SetModel, %0, %1)
#define SET_ORIGIN(%0,%1)			engfunc(EngFunc_SetOrigin, %0, %1)

#define PRECACHE_MODEL(%0)			engfunc(EngFunc_PrecacheModel, %0)
#define PRECACHE_SOUND(%0)			engfunc(EngFunc_PrecacheSound, %0)
#define PRECACHE_GENERIC(%0)			engfunc(EngFunc_PrecacheGeneric, %0)

#define MESSAGE_BEGIN(%0,%1,%2,%3)		engfunc(EngFunc_MessageBegin, %0, %1, %2, %3)
#define MESSAGE_END()				message_end()

#define WRITE_ANGLE(%0)				engfunc(EngFunc_WriteAngle, %0)
#define WRITE_BYTE(%0)				write_byte(%0)
#define WRITE_COORD(%0)				engfunc(EngFunc_WriteCoord, %0)
#define WRITE_STRING(%0)			write_string(%0)
#define WRITE_SHORT(%0)				write_short(%0)

#define BitSet(%0,%1) 				(%0 |= (1 << (%1 - 1)))
#define BitClear(%0,%1) 			(%0 &= ~(1 << (%1 - 1)))
#define BitCheck(%0,%1) 			(%0 & (1 << (%1 - 1)))

//**********************************************
//* PvData Offsets.                            *
//**********************************************

// Linux extra offsets
#define extra_offset_weapon			4
#define extra_offset_player			5

new g_bitIsConnected;

#define m_rgpPlayerItems_CWeaponBox		34

// CBasePlayerItem
#define m_pPlayer				41
#define m_pNext					42
#define m_iId                        		43

// CBasePlayerWeapon
#define m_fInSuperBullets			30
#define m_flNextPrimaryAttack			46
#define m_flNextSecondaryAttack			47
#define m_flTimeWeaponIdle			48
#define m_iPrimaryAmmoType			49
#define m_iClip					51
#define m_fInSpecialReload  			55
#define m_fWeaponState				74
#define m_flNextAttack				83
#define m_iLastZoom 				109

// CBasePlayer
#define m_flVelocityModifier 			108 
#define m_fResumeZoom       			110
#define m_iFOV					363
#define m_rgpPlayerItems_CBasePlayer		367
#define m_pActiveItem				373
#define m_rgAmmo_CBasePlayer			376
#define m_szAnimExtention			492

#define IsValidPev(%0) 				(pev_valid(%0) == 2)

#define MUZZLE_CLASSNAME_LEFT			"MuzzleLeft"
#define MUZZLE_CLASSNAME_RIGHT			"MuzzleRight"
#define BALL_CLASSNAME				"FireBall"
#define DRAGON_CLASSNAME			"FireDragon"

//**********************************************
//* Let's code our weapon.                     *
//**********************************************

new iBlood[4];
new iSpriteleft[33];
new iSpriteright[33];

Weapon_OnPrecache()
{
	PRECACHE_MODEL(MODEL_WORLD);
	PRECACHE_MODEL(MODEL_VIEW);
	PRECACHE_MODEL(MODEL_PLAYER);
	PRECACHE_MODEL(MODEL_DRAGON);
	PRECACHE_MODEL(MODEL_FIREBALL);
	
	PRECACHE_SOUND(SOUND_FIRE);
	PRECACHE_SOUND(SOUND_FIRE_B);
	PRECACHE_SOUND(SOUND_EXPLODE);
	PRECACHE_SOUND(SOUND_DRAGON);
	precache_sound("weapons/m3dragon_secondary_draw.wav")
	precache_sound("weapons/m3dragon_reload_insert.wav")
	precache_sound("weapons/m3dragon_fire_loop.wav")
	precache_sound("weapons/m3dragon_after_reload.wav")
	
	#if defined WPNLIST
	PRECACHE_GENERIC(WEAPON_HUD_TXT);
	PRECACHE_GENERIC(WEAPON_HUD_SPR);
	PRECACHE_GENERIC(WEAPON_HUD_SPR2);
	#endif
	
	PRECACHE_MODEL(WEAPON_MUZZLE);
	PRECACHE_MODEL(WEAPON_MUZZLE_B);
	
	iBlood[0] = PRECACHE_MODEL("sprites/bloodspray.spr");
	iBlood[1] = PRECACHE_MODEL("sprites/blood.spr");
	iBlood[2] = PRECACHE_MODEL(WEAPON_SPR_EXP);
	iBlood[3] = PRECACHE_MODEL(WEAPON_SPR_SMOKE);
}

Weapon_OnSpawn(const iItem)
{
	// Setting world model.
	SET_MODEL(iItem, MODEL_WORLD);
}

Weapon_OnDeploy(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
	#pragma unused iClip, iAmmoPrimary, iReloadMode
	static iszViewModel;
	if (iszViewModel || (iszViewModel = engfunc(EngFunc_AllocString, MODEL_VIEW)))
	{
		set_pev_string(iPlayer, pev_viewmodel2, iszViewModel);
	}
	static iszPlayerModel;
	if (iszPlayerModel || (iszPlayerModel = engfunc(EngFunc_AllocString, MODEL_PLAYER)))
	{
		set_pev_string(iPlayer, pev_weaponmodel2, iszPlayerModel);
	}

	set_pdata_int(iItem, m_fInSpecialReload, false, extra_offset_weapon);

	set_pdata_string(iPlayer, m_szAnimExtention * 4, ANIM_EXTENSION, -1, extra_offset_player * 4);
	
	set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_TIME_DELAY_DEPLOY, extra_offset_weapon);
	set_pdata_float(iPlayer, m_flNextAttack, WEAPON_TIME_DELAY_DEPLOY, extra_offset_player);

	Weapon_DefaultDeploy(iPlayer, MODEL_VIEW, MODEL_PLAYER, iMode ? ANIM_DRAW_B:ANIM_DRAW, ANIM_EXTENSION);
	
	Update_HUD(iItem, iPlayer, 0);
	Update_HUD(iItem, iPlayer, 1);
	
	if (iMode)
	{
		MuzzleFlash_Left(iPlayer, WEAPON_MUZZLE, 0.08, 20.0);
		MuzzleFlash_Right(iPlayer, WEAPON_MUZZLE_B, 0.08, 20.0);
	}
}

Weapon_OnHolster(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
	#pragma unused iPlayer, iClip, iAmmoPrimary, iMode, iReloadMode
	
	set_pdata_int(iItem, m_fInSpecialReload, false, extra_offset_weapon);
	
	Update_HUD(iItem, iPlayer, 0);
	
	if (pev_valid(iSpriteleft[iPlayer]) && pev_valid(iSpriteright[iPlayer]))
	{
		set_pev(iSpriteleft[iPlayer], pev_fuser1, get_gametime() + 0.0);
		set_pev(iSpriteright[iPlayer], pev_fuser2, get_gametime() + 0.0);
	}
}

Weapon_OnReload(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
	if(iAmmoPrimary <= 0)
	{
		return HAM_IGNORED;
	}
	
	if (iClip >=WEAPON_MAX_CLIP)
	{
		return HAM_IGNORED;
	}

	switch(iReloadMode)
	{
		case 0:
		{
			Weapon_SendAnim(iPlayer, iMode ? ANIM_BEFOR_RELOAD_B:ANIM_BEFOR_RELOAD);
			
			set_pdata_float(iItem, m_flNextPrimaryAttack, 0.5, extra_offset_weapon);
			set_pdata_float(iItem, m_flTimeWeaponIdle, 0.5, extra_offset_weapon);
			
			set_pdata_int(iItem, m_fInSpecialReload, 1, extra_offset_weapon);
			
			return HAM_IGNORED;
		}
		case 1:
		{		
			if (get_pdata_int(iItem, m_flTimeWeaponIdle, extra_offset_weapon) > 0.0)
			{
				return HAM_IGNORED;
			}
				
			Weapon_SendAnim(iPlayer, iMode ? ANIM_INSERT_B : ANIM_INSERT);
					
			set_pdata_int(iItem, m_fInSpecialReload, 2, extra_offset_weapon);
			set_pdata_float(iItem, m_flTimeWeaponIdle, 0.5, extra_offset_weapon);
				
			static szAnimation[64];

			formatex(szAnimation, charsmax(szAnimation), "ref_reload_shotgun");
			Player_SetAnimation(iPlayer, szAnimation);
				
		}
		case 2:
		{
			set_pdata_int(iItem, m_iClip, iClip + 1, extra_offset_weapon);
			set_pdata_int(iPlayer, 381, iAmmoPrimary-1, extra_offset_player);
			set_pdata_int(iItem, m_fInSpecialReload, 1, extra_offset_weapon);
		}
	}
	
	switch(iReloadMode)
	{
		case 0:
		{
			Weapon_SendAnim(iPlayer, iMode ? ANIM_BEFOR_RELOAD_B : ANIM_BEFOR_RELOAD);
			
			set_pdata_float(iItem, m_flNextPrimaryAttack, 0.5, extra_offset_weapon);
			set_pdata_float(iItem, m_flTimeWeaponIdle, 0.5, extra_offset_weapon);
			
			set_pdata_int(iItem, m_fInSpecialReload, 1, extra_offset_weapon);
			
			return HAM_IGNORED;
		}
	}
	return HAM_IGNORED;
}


Weapon_OnIdle(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
	#pragma unused iClip, iAmmoPrimary
	
	ExecuteHamB(Ham_Weapon_ResetEmptySound, iItem);

	if(iClip == WEAPON_MAX_CLIP)
	{
		if(iReloadMode == 2)
		{
			Weapon_ReloadEnd(iItem, iPlayer, iMode);
			return;
		}
	}
	
	if(iAmmoPrimary <= 0)
	{
		if(iReloadMode == 2)
		{
			Weapon_ReloadEnd(iItem, iPlayer, iMode);
			return;
		}
	}

	switch(iReloadMode)
	{
		case 1:
		{		
			if (get_pdata_int(iItem, m_flTimeWeaponIdle, extra_offset_weapon) > 0.0)
			{
				return;
			}
			
			Weapon_SendAnim(iPlayer, iMode ? ANIM_INSERT_B: ANIM_INSERT);
				
			set_pdata_int(iItem, m_fInSpecialReload, 2, extra_offset_weapon);
			set_pdata_float(iItem, m_flTimeWeaponIdle, 0.5, extra_offset_weapon);
			
			static szAnimation[64];

			formatex(szAnimation, charsmax(szAnimation), "ref_reload_shotgun");
			Player_SetAnimation(iPlayer, szAnimation);
			
		}
		case 2:
		{
			set_pdata_int(iItem, m_iClip, iClip + 1, extra_offset_weapon);
			set_pdata_int(iPlayer, 381, iAmmoPrimary-1, extra_offset_player);
			set_pdata_int(iItem, m_fInSpecialReload, 1, extra_offset_weapon);
		}
	}
	
	if(!iReloadMode)
	{
		if (get_pdata_int(iItem, m_flTimeWeaponIdle, extra_offset_weapon) > 0.0)
		{
			return;
		}
	
		set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_TIME_NEXT_IDLE, extra_offset_weapon);
		Weapon_SendAnim(iPlayer, iMode ? ANIM_IDLE_B : ANIM_IDLE);
	}
}	

Weapon_OnPrimaryAttack(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
	#pragma unused iAmmoPrimary
	
	static iFlags, iAnimDesired; 
	static szAnimation[64];iFlags = pev(iPlayer, pev_flags);

	if(iReloadMode > 0 && iClip > 0)
	{
		Weapon_ReloadEnd(iItem, iPlayer, iMode);
		return;
	}
	
	CallOrigFireBullets3(iItem, iPlayer)

	if (iClip <= 0 || pev(iPlayer, pev_waterlevel) == 3)
	{
		return;
	}

	Punchangle(iPlayer, .iVecx = -2.0, .iVecy = 0.0, .iVecz = 0.0);

	Weapon_SendAnim(iPlayer, iMode ? ANIM_SHOOT_B:ANIM_SHOOT);
				
	formatex(szAnimation, charsmax(szAnimation), iFlags & FL_DUCKING ? "crouch_shoot_%s" : "ref_shoot_%s", ANIM_EXTENSION);
								
	if ((iAnimDesired = lookup_sequence(iPlayer, szAnimation)) == -1)
	{
		iAnimDesired = 0;
	}
					
	set_pev(iPlayer, pev_sequence, iAnimDesired);

	set_pdata_float(iItem, m_flNextPrimaryAttack, WEAPON_TIME_NEXT_ATTACK, extra_offset_weapon);
	set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_TIME_NEXT_ATTACK+1.0, extra_offset_weapon);
	
	engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_FIRE, 0.9, ATTN_NORM, 0, PITCH_NORM);
}

Weapon_OnSecondaryAttack(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode) 
{
	#pragma unused iAmmoPrimary

	if(iReloadMode > 0 && iClip > 0)
	{
		Weapon_ReloadEnd(iItem, iPlayer, iMode);
		return;
	}

	if (get_pdata_float(iItem, m_flNextSecondaryAttack, extra_offset_weapon) > 0.0)
	{
		return;
	}
	
	if (pev(iPlayer, pev_button) & IN_ATTACK2)
	{
		if (!iMode || pev(iPlayer, pev_waterlevel) == 3)
		{
			return;
		}
	
		static iFlags; 
		static iAnimDesired; 
		static szAnimation[64];iFlags = pev(iPlayer, pev_flags);
		static pEntity;
		static Float:fOrigin[3],Float:vecEnd[3];fm_get_aim_origin(iPlayer, vecEnd);Get_Position(iPlayer, 15.0, 0.0, -5.0, fOrigin);
		static iszAllocStringCached;

		Punchangle(iPlayer, .iVecx = -4.0, .iVecy = 0.0, .iVecz = 0.0);
		
		Weapon_SendAnim(iPlayer, ANIM_SHOOT2);

		engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_FIRE_B, 0.9, ATTN_NORM, 0, PITCH_NORM);
				
		formatex(szAnimation, charsmax(szAnimation), iFlags & FL_DUCKING ? "crouch_shoot_%s" : "ref_shoot_%s", ANIM_EXTENSION);
								
		if ((iAnimDesired = lookup_sequence(iPlayer, szAnimation)) == -1)
		{
			iAnimDesired = 0;
		}
					
		set_pev(iPlayer, pev_sequence, iAnimDesired);

		set_pdata_float(iItem, m_flNextSecondaryAttack, 2.0, extra_offset_weapon);
		set_pdata_float(iItem, m_flTimeWeaponIdle, 2.0, extra_offset_weapon);

		if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "info_target")))
		{
			pEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
		}
		
		if (pev_valid(pEntity))
		{
			set_pev(pEntity, pev_movetype, MOVETYPE_FLYMISSILE);
			set_pev(pEntity, pev_owner, iPlayer);
			
			SET_MODEL(pEntity,MODEL_FIREBALL)
			SET_ORIGIN(pEntity,fOrigin)
	
			set_pev(pEntity, pev_classname, BALL_CLASSNAME);
			set_pev(pEntity, pev_mins, Float:{-0.01, -0.01, -0.01});
			set_pev(pEntity, pev_maxs, Float:{0.01, 0.01, 0.01});
			set_pev(pEntity, pev_gravity, 0.01);
			set_pev(pEntity, pev_solid, SOLID_BBOX);
			set_pev(pEntity, pev_nextthink, get_gametime() + 0.1);
	
			static Float:Velocity[3];Get_Speed_Vector(fOrigin, vecEnd, 1000.0, Velocity);
			set_pev(pEntity, pev_velocity, Velocity);
				
			Sprite_SetTransparency(pEntity, kRenderTransAdd, Float:{255.255,255.0,255.0}, 150.0);
		}
		
		Update_HUD(iItem, iPlayer, 0);
		set_pdata_int(iItem, m_fWeaponState, 0, extra_offset_weapon);
		set_pdata_int(iItem, m_fInSuperBullets, 0, extra_offset_weapon);
		Update_HUD(iItem, iPlayer, 1);
		
		if (pev_valid(iSpriteleft[iPlayer]) && pev_valid(iSpriteright[iPlayer]))
		{
			set_pev(iSpriteleft[iPlayer], pev_fuser1, get_gametime() + 0.0);
			set_pev(iSpriteright[iPlayer], pev_fuser2, get_gametime() + 0.0);
		}
	}
}

Weapon_ReloadEnd(const iItem, const iPlayer, const iMode)
{
	Weapon_SendAnim(iPlayer, iMode ? ANIM_AFTER_RELOAD_B:ANIM_AFTER_RELOAD);
	
	set_pdata_float(iItem, m_flNextPrimaryAttack, 0.6, extra_offset_weapon);
	set_pdata_float(iItem, m_flTimeWeaponIdle, 1.4, extra_offset_weapon);
	
	set_pdata_int(iItem, m_fInSpecialReload, 0, extra_offset_weapon);
}

Update_HUD(const iItem, const iPlayer, UpdateMode)
{
	new iSprite[33];
	static iMode;iMode=get_pdata_int(iItem, m_fWeaponState, extra_offset_weapon);
	format(iSprite, charsmax(iSprite), "number_%d", iMode);

	if(UpdateMode && iMode > 0)
	{
		message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, iPlayer);
		write_byte(1);
		write_string(iSprite); 
		write_byte(30);
		write_byte(144); 
		write_byte(255);
		message_end();
	}
	else
	{
		message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, iPlayer);
		write_byte(0);
		write_string(iSprite); 
		write_byte(30);
		write_byte(144); 
		write_byte(255);
		message_end();
	}
}


//*********************************************************************
//*           Don't modify the code below this line unless            *
//*          	 you know _exactly_ what you are doing!!!             *
//*********************************************************************

#define MSGID_WEAPONLIST 78

new g_iItemID;
new RoundEend;

#define IsCustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)

public plugin_precache()
{
	Weapon_OnPrecache();
	#if defined WPNLIST
	register_clcmd(WEAPON_NAME, "Cmd_WeaponSelect");
	register_message(MSGID_WEAPONLIST, "MsgHook_WeaponList");
	#endif
}

public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR);
	
	register_forward(FM_PlaybackEvent,				"FakeMeta_PlaybackEvent",	 false);
	register_forward(FM_SetModel,					"FakeMeta_SetModel",		 false);
	register_forward(FM_UpdateClientData,				"FakeMeta_UpdateClientData_Post",true);
	register_forward(FM_Touch, 					"FakeMeta_Touch",		 false);
	register_forward(FM_Think, 					"FakeMeta_Think",		 false);
	
	RegisterHam(Ham_Spawn, 			"weaponbox", 		"HamHook_Weaponbox_Spawn_Post", true);

	RegisterHam(Ham_TraceAttack,		"func_breakable",	"HamHook_Entity_TraceAttack", 	false);
	RegisterHam(Ham_TraceAttack,		"info_target", 		"HamHook_Entity_TraceAttack", 	false);
	RegisterHam(Ham_TraceAttack,		"player", 		"HamHook_Entity_TraceAttack", 	false);

	RegisterHam(Ham_Item_Deploy,		WEAPON_REFERANCE, 	"HamHook_Item_Deploy_Post",	true);
	RegisterHam(Ham_Item_Holster,		WEAPON_REFERANCE, 	"HamHook_Item_Holster",		false);
	RegisterHam(Ham_Item_AddToPlayer,	WEAPON_REFERANCE, 	"HamHook_Item_AddToPlayer",	false);
	RegisterHam(Ham_Item_PostFrame,		WEAPON_REFERANCE, 	"HamHook_Item_PostFrame",	false);
	
	RegisterHam(Ham_Weapon_Reload,		WEAPON_REFERANCE, 	"HamHook_Item_Reload",		false);
	RegisterHam(Ham_Weapon_WeaponIdle,	WEAPON_REFERANCE, 	"HamHook_Item_WeaponIdle",	false);
	RegisterHam(Ham_Weapon_PrimaryAttack,	WEAPON_REFERANCE, 	"HamHook_Item_PrimaryAttack",	false);
	
	g_iItemID = zp_register_extra_item(ZP_ITEM_NAME, 		ZP_ITEM_COST, 			ZP_TEAM_HUMAN);
}
	
public zp_extra_item_selected(id, itemid)
{
	if (itemid == g_iItemID)
	{
		Weapon_Give(id);
	}
}

public zp_user_infected_post(iPlayer)
{
	if (pev_valid(iSpriteleft[iPlayer]) && pev_valid(iSpriteright[iPlayer]))
	{
		set_pev(iSpriteleft[iPlayer], pev_fuser1, get_gametime() + 0.0);
		set_pev(iSpriteright[iPlayer], pev_fuser2, get_gametime() + 0.0);
	}
}

public plugin_natives()
{ 
	register_native("geating_m3", "NativeGiveWeapon", true) 
}

public NativeGiveWeapon(iPlayer)
{
	Weapon_Give(iPlayer);
}

public StartRound()RoundEend=false;
public EndRound()RoundEend=true;

//**********************************************
//* Block client weapon.                       *
//**********************************************

public FakeMeta_UpdateClientData_Post(const iPlayer, const iSendWeapons, const CD_Handle)
{
	static iActiveItem;iActiveItem = get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);
	
	if (!IsValidPev(iActiveItem) || !IsCustomItem(iActiveItem))
	{
		return FMRES_IGNORED;
	}

	set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001);
	return FMRES_IGNORED;
}

public FakeMeta_Touch(const iEnt, const iOther)
{
	if(!pev_valid(iEnt))
	{
		return FMRES_IGNORED;
	}
	
	static Classname[32];pev(iEnt, pev_classname, Classname, sizeof(Classname));
	static Float:Origin[3];pev(iEnt, pev_origin, Origin);
	static iAttacker; iAttacker = pev(iEnt, pev_owner);
	static pevVictim; pevVictim = -1;
	static iEntity;
	static iszAllocStringCached2;
	
	if (!equal(Classname, BALL_CLASSNAME))
	{
		return FMRES_IGNORED;
	}

	if (engfunc(EngFunc_PointContents, Origin) == CONTENTS_SKY || engfunc(EngFunc_PointContents, Origin) == CONTENTS_WATER)
	{
		set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
		return FMRES_SUPERCEDE;
	}
	
	if (!is_user_connected(iAttacker))
	{
		set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
		return FMRES_IGNORED;
	}
	
	if (iszAllocStringCached2 || (iszAllocStringCached2 = engfunc(EngFunc_AllocString, "info_target")))
	{
		iEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached2);
	}
		
	if (pev_valid(iEntity))
	{	
		SET_MODEL(iEntity,MODEL_DRAGON)
		SET_ORIGIN(iEntity,Origin)
	
		set_pev(iEntity, pev_classname, DRAGON_CLASSNAME);
		set_pev(iEntity, pev_movetype, MOVETYPE_FLY);
		set_pev(iEntity, pev_solid, SOLID_NOT);
		set_pev(iEntity, pev_owner, iAttacker);
		set_pev(iEntity, pev_framerate, 0.9);
		set_pev(iEntity, pev_sequence, 0);
		set_pev(iEntity, pev_animtime, get_gametime());
		set_pev(iEntity, pev_fuser2, get_gametime() + 3.4);
		set_pev(iEntity, pev_nextthink, get_gametime() + 1.0);
		Sprite_SetTransparency(iEntity, kRenderTransAdd, Float:{255.255,255.0,255.0}, 200.0);
	}

	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, Origin, 0);
	write_byte(TE_EXPLOSION);
	WRITE_COORD(Origin[0]); 
	WRITE_COORD(Origin[1]);
	WRITE_COORD(Origin[2] + 10.0);
	write_short(iBlood[2]);
	write_byte(20);
	write_byte(15);
	write_byte(TE_EXPLFLAG_NOSOUND);
	message_end();
	
	engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, Origin, 0);
	write_byte(TE_SMOKE)
	WRITE_COORD(Origin[0]); 
	WRITE_COORD(Origin[1]); 
	WRITE_COORD(Origin[2] - 20.0); 
	write_short(iBlood[3]);
	write_byte(30);
	write_byte(5);
	message_end();
	
	engfunc(EngFunc_EmitSound, iEnt, CHAN_VOICE, SOUND_DRAGON, 0.9, ATTN_NORM, 0, PITCH_NORM);
	engfunc(EngFunc_EmitSound, iEnt, CHAN_ITEM, SOUND_EXPLODE, 0.9, ATTN_NORM, 0, PITCH_NORM);
			
	while((pevVictim = engfunc(EngFunc_FindEntityInSphere, pevVictim, Origin, WEAPON_BALL_RADIUS_EXP)) != 0 )
	{
		if (!is_user_alive(pevVictim))continue;
		if (!zp_get_user_zombie(pevVictim))continue;	
		if (RoundEend)continue;
		
		static Float:vOrigin[3];pev(pevVictim, pev_origin, vOrigin);

		message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
		write_byte(TE_BLOODSPRITE)
		WRITE_COORD(vOrigin[0])
		WRITE_COORD(vOrigin[1])
		WRITE_COORD(vOrigin[2])
		write_short(iBlood[0])
		write_short(iBlood[1])
		write_byte(76)
		write_byte(18)
		message_end()
		
		set_hudmessage(255, 0, 0, -1.0, 0.46, 0, 0.02, 0.05);
		show_hudmessage(iAttacker, " \     /^n^n/     \");
		
		ExecuteHamB(Ham_TakeDamage, pevVictim, iEnt, iAttacker, WEAPON_DAMAGE_BALL_EXP, DMG_SONIC);
	}
	
	set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
	
	return FMRES_IGNORED;
}

public FakeMeta_Think(const iSprite)
{
	if (!pev_valid(iSprite))
	{
		return FMRES_IGNORED;
	}
	
	static Classname[32];pev(iSprite, pev_classname, Classname, sizeof(Classname));

	static iAttacker; iAttacker = pev(iSprite, pev_owner);
	
	if (equal(Classname,  DRAGON_CLASSNAME))
	{
		static Float:Origin[3];pev(iSprite, pev_origin, Origin);
		static Float:iTime;pev(iSprite, pev_fuser2, iTime);
		static iVictim;iVictim = -1
		
		if (iTime <= get_gametime())
		{
			engfunc(EngFunc_RemoveEntity, iSprite);
			return FMRES_SUPERCEDE;
		}
		
		while((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, Origin, WEAPON_RADIUS_DRAGON_ATTACK)) != 0)
		{
			static Float:iVelo[3];pev(iVictim, pev_velocity, iVelo);
			
			if (!is_user_alive(iVictim))continue;
			if (!zp_get_user_zombie(iVictim))continue;	
			if (RoundEend)continue;
			
			iVelo[0] = 0.0;
			iVelo[1] = 0.0;
			iVelo[2] = 250.0;
			
			set_hudmessage(255, 0, 0, -1.0, 0.46, 0, 0.02, 0.05);
			show_hudmessage(iAttacker, " \     /^n^n/     \");
			
			ExecuteHamB(Ham_TakeDamage, iVictim, iSprite, iAttacker, WEAPON_DRAGON_DAMAGE_ATTACK, DMG_SONIC);
			
			set_pdata_float(iVictim, m_flVelocityModifier, 1.0,  extra_offset_player);
			set_pev(iVictim, pev_velocity, iVelo);
		}
	
		set_pev(iSprite, pev_nextthink, get_gametime() + 0.08);
	}
	
	if (equal(Classname, MUZZLE_CLASSNAME_LEFT))
	{	
		static Float:flFrame;
		static Float:iTime;pev(iSprite, pev_fuser1, iTime);
		
		flFrame+=1.0
		
		if (iTime <= get_gametime() || pev(iAttacker, pev_deadflag) == DAMAGE_YES)
		{
			set_pev(iSprite, pev_flags, pev(iSprite, pev_flags) | FL_KILLME);
			return FMRES_SUPERCEDE;
		}
	
		set_pev(iSprite, pev_frame, flFrame);	
		set_pev(iSprite, pev_nextthink, get_gametime() + 0.01);
	}
	
	if (equal(Classname, MUZZLE_CLASSNAME_RIGHT))
	{	
		static Float:flFrame;
		static Float:iTime2;pev(iSprite, pev_fuser2, iTime2);
		
		flFrame+=1.0
		
		if (iTime2 <= get_gametime() || pev(iAttacker, pev_deadflag) == DAMAGE_YES)
		{
			set_pev(iSprite, pev_flags, pev(iSprite, pev_flags) | FL_KILLME);
			return FMRES_SUPERCEDE;
		}
	
		set_pev(iSprite, pev_frame, flFrame);	
		set_pev(iSprite, pev_nextthink, get_gametime() + 0.01);
	}
	
	
	return FMRES_IGNORED;
}

//**********************************************
//* Item (weapon) hooks.                       *
//**********************************************

	#define _call.%0(%1,%2) \
									\
	Weapon_On%0							\
	(								\
		%1, 							\
		%2,							\
									\
		get_pdata_int(%1, m_iClip, extra_offset_weapon),	\
		GetAmmoInventory(%2, PrimaryAmmoIndex(%1)),		\
		get_pdata_int(%1, m_fWeaponState, extra_offset_weapon),	\
		get_pdata_int(%1, m_fInSpecialReload, extra_offset_weapon) \
	) 

public HamHook_Item_Deploy_Post(const iItem)
{
	new iPlayer; 
	
	if (!CheckItem(iItem, iPlayer))
	{
		return HAM_IGNORED;
	}
	
	_call.Deploy(iItem, iPlayer);
	return HAM_IGNORED;
}

public HamHook_Item_Holster(const iItem)
{
	new iPlayer; 
	
	if (!CheckItem(iItem, iPlayer))
	{
		return HAM_IGNORED;
	}
	
	set_pev(iPlayer, pev_viewmodel, 0);
	set_pev(iPlayer, pev_weaponmodel, 0);
	
	_call.Holster(iItem, iPlayer);
	return HAM_SUPERCEDE;
}

public HamHook_Item_WeaponIdle(const iItem)
{
	static iPlayer; 
	
	if (!CheckItem(iItem, iPlayer))
	{
		return HAM_IGNORED;
	}

	_call.Idle(iItem, iPlayer);
	return HAM_SUPERCEDE;
}

public HamHook_Item_Reload(const iItem)
{
	static iPlayer; 
	
	if (!CheckItem(iItem, iPlayer))
	{
		return HAM_IGNORED;
	}
	
	_call.Reload(iItem, iPlayer);
	return HAM_SUPERCEDE;
}

public HamHook_Item_PrimaryAttack(const iItem)
{
	static iPlayer; 
	
	if (!CheckItem(iItem, iPlayer))
	{
		return HAM_IGNORED;
	}
	
	_call.PrimaryAttack(iItem, iPlayer);
	return HAM_SUPERCEDE;
}

public HamHook_Item_PostFrame(const iItem)
{
	static iPlayer;
	
	if (!CheckItem(iItem, iPlayer))
	{
		return HAM_IGNORED;
	}
	
	if (get_pdata_float(iItem, m_flNextPrimaryAttack, extra_offset_weapon) <= 0.0 && get_pdata_int(iItem, m_fInSpecialReload, extra_offset_weapon) <= 0)
	{
		_call.SecondaryAttack(iItem, iPlayer);
	}
	
	return HAM_IGNORED;
}	

//**********************************************
//* Fire Bullets.                              *
//**********************************************

CallOrigFireBullets3(const iItem, const iPlayer)
{
	static FakeMetaTraceLine;FakeMetaTraceLine=register_forward(FM_TraceLine,"FakeMeta_TraceLine",true)
	state FireBullets: Enabled;
	static Float: vecPuncheAngle[3];pev(iPlayer, pev_punchangle, vecPuncheAngle);
	
	ExecuteHam(Ham_Weapon_PrimaryAttack, iItem);
	set_pev(iPlayer, pev_punchangle, vecPuncheAngle);
	
	state FireBullets: Disabled;
	unregister_forward(FM_TraceLine,FakeMetaTraceLine,true)
}

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

public FakeMeta_TraceLine(Float:vecStart[3], Float:vecEnd[3], iFlag, iIgnore, iTrase)
{
	if (iFlag & IGNORE_MONSTERS)
	{
		return FMRES_IGNORED;
	}
	
	static Float:vecfEnd[3],iHit,iDecal,glassdecal;
	
	if(!glassdecal)
	{	
		glassdecal=engfunc( EngFunc_DecalIndex, "{bproof1" )
	}
	
	iHit=get_tr2(iTrase,TR_pHit)
	
	if(iHit>0 && pev_valid(iHit))
		if(pev(iHit,pev_solid)!=SOLID_BSP)return FMRES_IGNORED
		else if(pev(iHit,pev_rendermode)!=0)iDecal=glassdecal
		else iDecal=random_num(41,45)
	else iDecal=random_num(41,45)

	get_tr2(iTrase, TR_vecEndPos, vecfEnd)
	
	engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecfEnd, 0)
	write_byte(TE_GUNSHOTDECAL)
	WRITE_COORD(vecfEnd[0])
	WRITE_COORD(vecfEnd[1])
	WRITE_COORD(vecfEnd[2])
	write_short(iHit > 0 ? iHit : 0)
	write_byte(iDecal)
	message_end()

	return FMRES_IGNORED
}

public HamHook_Entity_TraceAttack(const iEntity, const iAttacker, const Float: flDamage) <FireBullets: Enabled>
{
	static iItem;iItem = get_pdata_cbase(iAttacker, m_pActiveItem, extra_offset_player);

	if (!BitCheck(g_bitIsConnected, iAttacker) || !IsValidPev(iAttacker))
	{
		return;
	}
	
	if (!IsValidPev(iItem))
	{
		return;
	}
	
	if (get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon) == 31)
	{
		MuzzleFlash_Left(iAttacker, WEAPON_MUZZLE, 0.08, 20.0);
		MuzzleFlash_Right(iAttacker, WEAPON_MUZZLE_B, 0.08, 20.0);
		Update_HUD(iItem, iAttacker, 0);
		set_pdata_int(iItem, m_fWeaponState, 1, extra_offset_weapon);
		Update_HUD(iItem, iAttacker, 1);
	}
	
	if (is_user_alive(iEntity) && get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon) < 32 && zp_get_user_zombie(iEntity))
	{
		set_pdata_int(iItem, m_fInSuperBullets, (get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon)+1), extra_offset_weapon);
	}
	
	set_hudmessage(255, 0, 0, -1.0, 0.46, 0, 0.2, 0.05);
	show_hudmessage(iAttacker, " \     /^n^n/     \");
	
	SetHamParamFloat(3, flDamage * WEAPON_MULTIPLIER_DAMAGE);
}

public MsgHook_Death()			</* Empty statement */>		{ /* Fallback */ }
public MsgHook_Death()			<FireBullets: Disabled>		{ /* Do notning */ }

public FakeMeta_PlaybackEvent() 	</* Empty statement */>		{ return FMRES_IGNORED; }
public FakeMeta_PlaybackEvent() 	<FireBullets: Disabled>		{ return FMRES_IGNORED; }

public HamHook_Entity_TraceAttack() 	</* Empty statement */>		{ /* Fallback */ }
public HamHook_Entity_TraceAttack() 	<FireBullets: Disabled>		{ /* Do notning */ }


Weapon_Create(const Float: vecOrigin[3] = {0.0, 0.0, 0.0}, const Float: vecAngles[3] = {0.0, 0.0, 0.0})
{
	new iWeapon;

	static iszAllocStringCached;
	if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_REFERANCE)))
	{
		iWeapon = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
	}
	
	if (!IsValidPev(iWeapon))
	{
		return FM_NULLENT;
	}
	
	MDLL_Spawn(iWeapon);
	SET_ORIGIN(iWeapon, vecOrigin);
	
	set_pdata_int(iWeapon, m_iClip, WEAPON_MAX_CLIP, extra_offset_weapon);
	set_pdata_int(iWeapon, m_fWeaponState, 0, extra_offset_weapon);
	set_pdata_int(iWeapon, m_fInSuperBullets, 0, extra_offset_weapon);

	set_pev(iWeapon, pev_impulse, WEAPON_KEY);
	set_pev(iWeapon, pev_angles, vecAngles);
	
	Weapon_OnSpawn(iWeapon);
	
	return iWeapon;
}

Weapon_Give(const 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);
		MDLL_Touch(iWeapon, iPlayer);
		SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iWeapon), WEAPON_DEFAULT_AMMO);
		
		return iWeapon;
	}
	
	return FM_NULLENT;
}

Player_DropWeapons(const iPlayer, const iSlot)
{
	new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, m_rgpPlayerItems_CBasePlayer + iSlot, extra_offset_player);

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

		iItem = get_pdata_cbase(iItem, m_pNext, extra_offset_weapon);
	}
}

Weapon_SendAnim(const iPlayer, const iAnim)
{
	set_pev(iPlayer, pev_weaponanim, iAnim);

	MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0.0, 0.0, 0.0}, iPlayer);
	WRITE_BYTE(iAnim);
	WRITE_BYTE(0);
	MESSAGE_END();
}

stock Weapon_DefaultDeploy(const iPlayer, const szViewModel[], const szWeaponModel[], const iAnim, const szAnimExt[])
{
	set_pev(iPlayer, pev_viewmodel2, szViewModel);
	set_pev(iPlayer, pev_weaponmodel2, szWeaponModel);
	set_pev(iPlayer, pev_fov, 90.0);
	
	set_pdata_int(iPlayer, m_iFOV, 90, extra_offset_player);
	set_pdata_int(iPlayer, m_fResumeZoom, 0, extra_offset_player);
	set_pdata_int(iPlayer, m_iLastZoom, 90, extra_offset_player);
	
	set_pdata_string(iPlayer, m_szAnimExtention * 4, szAnimExt, -1, extra_offset_player * 4);
	
	Weapon_SendAnim(iPlayer, iAnim);
}

stock Punchangle(iPlayer, Float:iVecx = 0.0, Float:iVecy = 0.0, Float:iVecz = 0.0)
{
	static Float:iVec[3];pev(iPlayer, pev_punchangle,iVec);
	iVec[0] = iVecx;iVec[1] = iVecy;iVec[2] = iVecz
	set_pev(iPlayer, pev_punchangle, iVec);
}

stock Get_Position(id,Float:forw, Float:right, Float:up, Float:vStart[]) 
{
	static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3];
	
	pev(id, pev_origin, vOrigin);
	pev(id, pev_view_ofs, vUp);
	
	xs_vec_add(vOrigin, vUp, vOrigin);
	
	pev(id, pev_v_angle, vAngle);
	
	angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward);
	angle_vector(vAngle, ANGLEVECTOR_RIGHT, vRight);
	angle_vector(vAngle, ANGLEVECTOR_UP, vUp);
	
	vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up;
	vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up;
	vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up;
}

stock Get_Speed_Vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
	new_velocity[0] = origin2[0] - origin1[0]
	new_velocity[1] = origin2[1] - origin1[1]
	new_velocity[2] = origin2[2] - origin1[2]
	new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
	new_velocity[0] *= num
	new_velocity[1] *= num
	new_velocity[2] *= num
}

#define BitSet(%0,%1) (%0 |= (1 << (%1 - 1)))
#define BitClear(%0,%1) (%0 &= ~(1 << (%1 - 1)))
#define BitCheck(%0,%1) (%0 & (1 << (%1 - 1)))

public client_putinserver(id)
{
	BitSet(g_bitIsConnected, id);
}

public client_disconnect(id)
{
	BitClear(g_bitIsConnected, id);
}


bool: CheckItem(const iItem, &iPlayer)
{
	if (!IsValidPev(iItem) || !IsCustomItem(iItem))
	{
		return false;
	}
	
	iPlayer = get_pdata_cbase(iItem, m_pPlayer, extra_offset_weapon);
	
	if (!IsValidPev(iPlayer) || !BitCheck(g_bitIsConnected, iPlayer))
	{
		return false;
	}
	
	return true;
}

//**********************************************
//* Weapon list update.                        *
//**********************************************
#if defined WPNLIST
public Cmd_WeaponSelect(const iPlayer)
{
	engclient_cmd(iPlayer, WEAPON_REFERANCE);
	return PLUGIN_HANDLED;
}
#endif
public HamHook_Item_AddToPlayer(const iItem, const iPlayer)
{
	switch(pev(iItem, pev_impulse))
	{
		case 0: MsgHook_WeaponList(MSGID_WEAPONLIST, iItem, iPlayer);
		case WEAPON_KEY: 
		{
			#if defined WPNLIST
			MsgHook_WeaponList(MSGID_WEAPONLIST, iItem, iPlayer);
			#endif
			SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iItem), pev(iItem, pev_iuser2));
		}
	}
	
	return HAM_IGNORED;
}

public MsgHook_WeaponList(const iMsgID, const iMsgDest, const iMsgEntity)
{
	static arrWeaponListData[8];
	
	if (!iMsgEntity)
	{
		new szWeaponName[32];
		get_msg_arg_string(1, szWeaponName, charsmax(szWeaponName));
		
		if (!strcmp(szWeaponName, WEAPON_REFERANCE))
		{
			for (new i, a = sizeof arrWeaponListData; i < a; i++)
			{
				arrWeaponListData[i] = get_msg_arg_int(i + 2);
			}
		}
	}
	else
	{
		if (!IsCustomItem(iMsgDest) && pev(iMsgDest, pev_impulse))
		{
			return;
		}
		
		MESSAGE_BEGIN(MSG_ONE, iMsgID, {0.0, 0.0, 0.0}, iMsgEntity);
		WRITE_STRING(IsCustomItem(iMsgDest) ? WEAPON_NAME : WEAPON_REFERANCE);
		
		for (new i, a = sizeof arrWeaponListData; i < a; i++)
		{
			WRITE_BYTE(arrWeaponListData[i]);
		}
		
		MESSAGE_END();
	}
}

//**********************************************
//* Muzzleflash stuff.                *
//**********************************************

stock Sprite_SetTransparency(const iSprite, const iRendermode, const Float: vecColor[3], const Float: flAmt, const iFx = kRenderFxNone)
{
	set_pev(iSprite, pev_rendermode, iRendermode);
	set_pev(iSprite, pev_rendercolor, vecColor);
	set_pev(iSprite, pev_renderamt, flAmt);
	set_pev(iSprite, pev_renderfx, iFx);
}

stock MuzzleFlash_Right(const iPlayer, const szMuzzleSprite[], const Float: flScale, const Float: flFramerate)
{
	if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
	{
		return FM_NULLENT;
	}
	
	static iszAllocStringCached;
	if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "env_sprite")))
	{
		iSpriteright[iPlayer] = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
	}
	
	if (!IsValidPev(iSpriteright[iPlayer]))
	{
		
		return FM_NULLENT;
	}
	
	set_pev(iSpriteright[iPlayer], pev_model, szMuzzleSprite);
	
	set_pev(iSpriteright[iPlayer], pev_classname, MUZZLE_CLASSNAME_RIGHT);
	set_pev(iSpriteright[iPlayer], pev_owner, iPlayer);
	set_pev(iSpriteright[iPlayer], pev_aiment, iPlayer);
	set_pev(iSpriteright[iPlayer], pev_body, 4);
	set_pev(iSpriteright[iPlayer], pev_frame, 0.0);
	
	Sprite_SetTransparency(iSpriteright[iPlayer], kRenderTransAdd, Float:{0.0,0.0,0.0}, 255.0);
	
	set_pev(iSpriteright[iPlayer], pev_framerate, flFramerate);
	set_pev(iSpriteright[iPlayer], pev_scale, flScale);
	
	set_pev(iSpriteright[iPlayer], pev_fuser2, get_gametime() + 40.0);
	set_pev(iSpriteright[iPlayer], pev_nextthink, get_gametime() + 0.01);
	
	MDLL_Spawn(iSpriteright[iPlayer]);

	return iSpriteright[iPlayer];
}

stock MuzzleFlash_Left(const iPlayer, const szMuzzleSprite[], const Float: flScale, const Float: flFramerate)
{
	if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
	{
		return FM_NULLENT;
	}
	
	static iszAllocStringCached;
	if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "env_sprite")))
	{
		iSpriteleft[iPlayer] = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
	}
	
	if (!IsValidPev(iSpriteleft[iPlayer]))
	{
		
		return FM_NULLENT;
	}
	
	set_pev(iSpriteleft[iPlayer], pev_model, szMuzzleSprite);
	
	set_pev(iSpriteleft[iPlayer], pev_classname, MUZZLE_CLASSNAME_LEFT);
	set_pev(iSpriteleft[iPlayer], pev_owner, iPlayer);
	set_pev(iSpriteleft[iPlayer], pev_aiment, iPlayer);
	set_pev(iSpriteleft[iPlayer], pev_body, 3);
	set_pev(iSpriteleft[iPlayer], pev_frame, 0.0);
	
	Sprite_SetTransparency(iSpriteleft[iPlayer], kRenderTransAdd, Float:{0.0,0.0,0.0}, 255.0);
	
	set_pev(iSpriteleft[iPlayer], pev_framerate, flFramerate);
	set_pev(iSpriteleft[iPlayer], pev_scale, flScale);
	
	set_pev(iSpriteleft[iPlayer], pev_fuser1, get_gametime() + 40.0);
	set_pev(iSpriteleft[iPlayer], pev_nextthink, get_gametime() + 0.01);
	
	MDLL_Spawn(iSpriteleft[iPlayer]);

	return iSpriteleft[iPlayer];
}

//**********************************************
//* Weaponbox world model.                     *
//**********************************************

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

public FakeMeta_SetModel(const 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, m_rgpPlayerItems_CWeaponBox + i, extra_offset_weapon);
		
		if (IsValidPev(iItem) && IsCustomItem(iItem))
		{
			SET_MODEL(iEntity, MODEL_WORLD);	
			set_pev(iItem, pev_iuser2, GetAmmoInventory(pev(iEntity,pev_owner), PrimaryAmmoIndex(iItem)))
			return FMRES_SUPERCEDE;
		}
	}
	
	return FMRES_IGNORED;
}

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

//**********************************************
//* Ammo Inventory.                            *
//**********************************************

PrimaryAmmoIndex(const iItem)
{
	return get_pdata_int(iItem, m_iPrimaryAmmoType, extra_offset_weapon);
}

GetAmmoInventory(const iPlayer, const iAmmoIndex)
{
	if (iAmmoIndex == -1)
	{
		return -1;
	}

	return get_pdata_int(iPlayer, m_rgAmmo_CBasePlayer + iAmmoIndex, extra_offset_player);
}

SetAmmoInventory(const iPlayer, const iAmmoIndex, const iAmount)
{
	if (iAmmoIndex == -1)
	{
		return 0;
	}

	set_pdata_int(iPlayer, m_rgAmmo_CBasePlayer + iAmmoIndex, iAmount, extra_offset_player);
	return 1;
}
//vk.com/l.shvendik0
stock Player_SetAnimation(const iPlayer, const szAnim[])
{
	   if(!is_user_alive(iPlayer))return;
		
	   #define ACT_RANGE_ATTACK1   28
	   
	   // Linux extra offsets
	   #define extra_offset_animating   4
	   
	   // 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;
	   }
   
	   new Float: 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);
}
/* 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 Connor31; 10-24-2021 at 17:17. Reason: edit something
Connor31 is offline
TribalBlood
Member
Join Date: Oct 2020
Old 11-27-2021 , 21:39   Re: Gun for admin!
Reply With Quote #2

PHP Code:
#include <amxmodx>
#include <fakemeta_util>
#include <hamsandwich>
#include <zombieplague>

#define PLUGIN                  "[ZP] Extra: CSO Weapon Buff M3"
#define VERSION                 "1.0"
#define AUTHOR                  "KORD_12.7"


//**********************************************
//* Weapon Settings.                           *
//**********************************************

#define WPNLIST

// Main
#define WEAPON_KEY              785442
#define WEAPON_NAME                 "weapon_m3dragon"

#define WEAPON_REFERANCE            "weapon_xm1014"
#define WEAPON_MAX_CLIP             8
#define WEAPON_DEFAULT_AMMO         32

#define WEAPON_TIME_NEXT_IDLE           15.0
#define WEAPON_TIME_NEXT_ATTACK         1.0
#define WEAPON_TIME_DELAY_DEPLOY        1.0

#define WEAPON_MULTIPLIER_DAMAGE        1.5

#define WEAPON_RADIUS_DRAGON_ATTACK     200.0
#define WEAPON_DRAGON_DAMAGE_ATTACK     random_float(400.0, 500.0)

#define WEAPON_BALL_RADIUS_EXP          150.0
#define WEAPON_DAMAGE_BALL_EXP          random_float(150.0, 200.0)

#define ZP_ITEM_NAME                "buffm3"
#define ZP_ITEM_COST                0

// Models
#define MODEL_WORLD             "models/w_m3dragon.mdl"
#define MODEL_VIEW              "models/v_m3dragon.mdl"
#define MODEL_PLAYER                "models/p_m3dragon.mdl"
#define MODEL_DRAGON                "models/m3dragon_effect.mdl"
#define MODEL_FIREBALL              "models/ef_fireball2.mdl"

// Sounds
#define SOUND_FIRE              "weapons/m3dragon_shoot1.wav"
#define SOUND_FIRE_B                "weapons/m3dragon_shoot2.wav"
#define SOUND_EXPLODE               "weapons/m3dragon_exp.wav"
#define SOUND_DRAGON                "weapons/m3dragon_dragon_fx.wav"

// Sprites
#define WEAPON_HUD_TXT              "sprites/weapon_m3dragon.txt"
#define WEAPON_HUD_SPR              "sprites/640hud18.spr"
#define WEAPON_HUD_SPR2             "sprites/640hud177.spr"
#define WEAPON_SPR_EXP              "sprites/fexplo.spr"
#define WEAPON_SPR_SMOKE            "sprites/steam1.spr"
#define WEAPON_MUZZLE               "sprites/m3dragon_flame.spr"
#define WEAPON_MUZZLE_B             "sprites/m3dragon_flame2.spr"

// Animation
#define ANIM_EXTENSION              "shotgun"

// Animation sequences
enum
{
    
ANIM_IDLE,
    
ANIM_SHOOT,
    
ANIM_SHOOT2,
    
ANIM_INSERT,
    
ANIM_AFTER_RELOAD,
    
ANIM_BEFOR_RELOAD,
    
ANIM_DRAW,

    
ANIM_IDLE_B,
    
ANIM_SHOOT_B,
    
ANIM_INSERT_B,
    
ANIM_AFTER_RELOAD_B,
    
ANIM_BEFOR_RELOAD_B,
    
ANIM_DRAW_B,
};
//**********************************************
//* Some macroses.                             *
//**********************************************

#define MDLL_Spawn(%0)              dllfunc(DLLFunc_Spawn, %0)
#define MDLL_Touch(%0,%1)           dllfunc(DLLFunc_Touch, %0, %1)
#define MDLL_USE(%0,%1)             dllfunc(DLLFunc_Use, %0, %1)

#define SET_MODEL(%0,%1)            engfunc(EngFunc_SetModel, %0, %1)
#define SET_ORIGIN(%0,%1)           engfunc(EngFunc_SetOrigin, %0, %1)

#define PRECACHE_MODEL(%0)          engfunc(EngFunc_PrecacheModel, %0)
#define PRECACHE_SOUND(%0)          engfunc(EngFunc_PrecacheSound, %0)
#define PRECACHE_GENERIC(%0)            engfunc(EngFunc_PrecacheGeneric, %0)

#define MESSAGE_BEGIN(%0,%1,%2,%3)      engfunc(EngFunc_MessageBegin, %0, %1, %2, %3)
#define MESSAGE_END()               message_end()

#define WRITE_ANGLE(%0)             engfunc(EngFunc_WriteAngle, %0)
#define WRITE_BYTE(%0)              write_byte(%0)
#define WRITE_COORD(%0)             engfunc(EngFunc_WriteCoord, %0)
#define WRITE_STRING(%0)            write_string(%0)
#define WRITE_SHORT(%0)             write_short(%0)

#define BitSet(%0,%1)               (%0 |= (1 << (%1 - 1)))
#define BitClear(%0,%1)             (%0 &= ~(1 << (%1 - 1)))
#define BitCheck(%0,%1)             (%0 & (1 << (%1 - 1)))

//**********************************************
//* PvData Offsets.                            *
//**********************************************

// Linux extra offsets
#define extra_offset_weapon         4
#define extra_offset_player         5

new g_bitIsConnected;

#define m_rgpPlayerItems_CWeaponBox     34

// CBasePlayerItem
#define m_pPlayer               41
#define m_pNext                 42
#define m_iId                               43

// CBasePlayerWeapon
#define m_fInSuperBullets           30
#define m_flNextPrimaryAttack           46
#define m_flNextSecondaryAttack         47
#define m_flTimeWeaponIdle          48
#define m_iPrimaryAmmoType          49
#define m_iClip                 51
#define m_fInSpecialReload              55
#define m_fWeaponState              74
#define m_flNextAttack              83
#define m_iLastZoom                 109

// CBasePlayer
#define m_flVelocityModifier            108
#define m_fResumeZoom                   110
#define m_iFOV                  363
#define m_rgpPlayerItems_CBasePlayer        367
#define m_pActiveItem               373
#define m_rgAmmo_CBasePlayer            376
#define m_szAnimExtention           492

#define IsValidPev(%0)              (pev_valid(%0) == 2)

#define MUZZLE_CLASSNAME_LEFT           "MuzzleLeft"
#define MUZZLE_CLASSNAME_RIGHT          "MuzzleRight"
#define BALL_CLASSNAME              "FireBall"
#define DRAGON_CLASSNAME            "FireDragon"

//**********************************************
//* Let's code our weapon.                     *
//**********************************************

new iBlood[4];
new 
iSpriteleft[33];
new 
iSpriteright[33];

Weapon_OnPrecache()
{
    
PRECACHE_MODEL(MODEL_WORLD);
    
PRECACHE_MODEL(MODEL_VIEW);
    
PRECACHE_MODEL(MODEL_PLAYER);
    
PRECACHE_MODEL(MODEL_DRAGON);
    
PRECACHE_MODEL(MODEL_FIREBALL);

    
PRECACHE_SOUND(SOUND_FIRE);
    
PRECACHE_SOUND(SOUND_FIRE_B);
    
PRECACHE_SOUND(SOUND_EXPLODE);
    
PRECACHE_SOUND(SOUND_DRAGON);
    
precache_sound("weapons/m3dragon_secondary_draw.wav")
    
precache_sound("weapons/m3dragon_reload_insert.wav")
    
precache_sound("weapons/m3dragon_fire_loop.wav")
    
precache_sound("weapons/m3dragon_after_reload.wav")

    
#if defined WPNLIST
    
PRECACHE_GENERIC(WEAPON_HUD_TXT);
    
PRECACHE_GENERIC(WEAPON_HUD_SPR);
    
PRECACHE_GENERIC(WEAPON_HUD_SPR2);
    
#endif

    
PRECACHE_MODEL(WEAPON_MUZZLE);
    
PRECACHE_MODEL(WEAPON_MUZZLE_B);

    
iBlood[0] = PRECACHE_MODEL("sprites/bloodspray.spr");
    
iBlood[1] = PRECACHE_MODEL("sprites/blood.spr");
    
iBlood[2] = PRECACHE_MODEL(WEAPON_SPR_EXP);
    
iBlood[3] = PRECACHE_MODEL(WEAPON_SPR_SMOKE);
}

Weapon_OnSpawn(const iItem)
{
    
// Setting world model.
    
SET_MODEL(iItemMODEL_WORLD);
}

Weapon_OnDeploy(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
    
#pragma unused iClip, iAmmoPrimary, iReloadMode
    
static iszViewModel;
    if (
iszViewModel || (iszViewModel engfunc(EngFunc_AllocStringMODEL_VIEW)))
    {
        
set_pev_string(iPlayerpev_viewmodel2iszViewModel);
    }
    static 
iszPlayerModel;
    if (
iszPlayerModel || (iszPlayerModel engfunc(EngFunc_AllocStringMODEL_PLAYER)))
    {
        
set_pev_string(iPlayerpev_weaponmodel2iszPlayerModel);
    }

    
set_pdata_int(iItemm_fInSpecialReloadfalseextra_offset_weapon);

    
set_pdata_string(iPlayerm_szAnimExtention 4ANIM_EXTENSION, -1extra_offset_player 4);

    
set_pdata_float(iItemm_flTimeWeaponIdleWEAPON_TIME_DELAY_DEPLOYextra_offset_weapon);
    
set_pdata_float(iPlayerm_flNextAttackWEAPON_TIME_DELAY_DEPLOYextra_offset_player);

    
Weapon_DefaultDeploy(iPlayerMODEL_VIEWMODEL_PLAYERiMode ANIM_DRAW_B:ANIM_DRAWANIM_EXTENSION);

    
Update_HUD(iItemiPlayer0);
    
Update_HUD(iItemiPlayer1);

    if (
iMode)
    {
        
MuzzleFlash_Left(iPlayerWEAPON_MUZZLE0.0820.0);
        
MuzzleFlash_Right(iPlayerWEAPON_MUZZLE_B0.0820.0);
    }
}

Weapon_OnHolster(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
    
#pragma unused iPlayer, iClip, iAmmoPrimary, iMode, iReloadMode

    
set_pdata_int(iItemm_fInSpecialReloadfalseextra_offset_weapon);

    
Update_HUD(iItemiPlayer0);

    if (
pev_valid(iSpriteleft[iPlayer]) && pev_valid(iSpriteright[iPlayer]))
    {
        
set_pev(iSpriteleft[iPlayer], pev_fuser1get_gametime() + 0.0);
        
set_pev(iSpriteright[iPlayer], pev_fuser2get_gametime() + 0.0);
    }
}

Weapon_OnReload(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
    if(
iAmmoPrimary <= 0)
    {
        return 
HAM_IGNORED;
    }

    if (
iClip >=WEAPON_MAX_CLIP)
    {
        return 
HAM_IGNORED;
    }

    switch(
iReloadMode)
    {
        case 
0:
        {
            
Weapon_SendAnim(iPlayeriMode ANIM_BEFOR_RELOAD_B:ANIM_BEFOR_RELOAD);

            
set_pdata_float(iItemm_flNextPrimaryAttack0.5extra_offset_weapon);
            
set_pdata_float(iItemm_flTimeWeaponIdle0.5extra_offset_weapon);

            
set_pdata_int(iItemm_fInSpecialReload1extra_offset_weapon);

            return 
HAM_IGNORED;
        }
        case 
1:
        {
            if (
get_pdata_int(iItemm_flTimeWeaponIdleextra_offset_weapon) > 0.0)
            {
                return 
HAM_IGNORED;
            }

            
Weapon_SendAnim(iPlayeriMode ANIM_INSERT_B ANIM_INSERT);

            
set_pdata_int(iItemm_fInSpecialReload2extra_offset_weapon);
            
set_pdata_float(iItemm_flTimeWeaponIdle0.5extra_offset_weapon);

            static 
szAnimation[64];

            
formatex(szAnimationcharsmax(szAnimation), "ref_reload_shotgun");
            
Player_SetAnimation(iPlayerszAnimation);

        }
        case 
2:
        {
            
set_pdata_int(iItemm_iClipiClip 1extra_offset_weapon);
            
set_pdata_int(iPlayer381iAmmoPrimary-1extra_offset_player);
            
set_pdata_int(iItemm_fInSpecialReload1extra_offset_weapon);
        }
    }

    switch(
iReloadMode)
    {
        case 
0:
        {
            
Weapon_SendAnim(iPlayeriMode ANIM_BEFOR_RELOAD_B ANIM_BEFOR_RELOAD);

            
set_pdata_float(iItemm_flNextPrimaryAttack0.5extra_offset_weapon);
            
set_pdata_float(iItemm_flTimeWeaponIdle0.5extra_offset_weapon);

            
set_pdata_int(iItemm_fInSpecialReload1extra_offset_weapon);

            return 
HAM_IGNORED;
        }
    }
    return 
HAM_IGNORED;
}


Weapon_OnIdle(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
    
#pragma unused iClip, iAmmoPrimary

    
ExecuteHamB(Ham_Weapon_ResetEmptySoundiItem);

    if(
iClip == WEAPON_MAX_CLIP)
    {
        if(
iReloadMode == 2)
        {
            
Weapon_ReloadEnd(iItemiPlayeriMode);
            return;
        }
    }

    if(
iAmmoPrimary <= 0)
    {
        if(
iReloadMode == 2)
        {
            
Weapon_ReloadEnd(iItemiPlayeriMode);
            return;
        }
    }

    switch(
iReloadMode)
    {
        case 
1:
        {
            if (
get_pdata_int(iItemm_flTimeWeaponIdleextra_offset_weapon) > 0.0)
            {
                return;
            }

            
Weapon_SendAnim(iPlayeriMode ANIM_INSERT_BANIM_INSERT);

            
set_pdata_int(iItemm_fInSpecialReload2extra_offset_weapon);
            
set_pdata_float(iItemm_flTimeWeaponIdle0.5extra_offset_weapon);

            static 
szAnimation[64];

            
formatex(szAnimationcharsmax(szAnimation), "ref_reload_shotgun");
            
Player_SetAnimation(iPlayerszAnimation);

        }
        case 
2:
        {
            
set_pdata_int(iItemm_iClipiClip 1extra_offset_weapon);
            
set_pdata_int(iPlayer381iAmmoPrimary-1extra_offset_player);
            
set_pdata_int(iItemm_fInSpecialReload1extra_offset_weapon);
        }
    }

    if(!
iReloadMode)
    {
        if (
get_pdata_int(iItemm_flTimeWeaponIdleextra_offset_weapon) > 0.0)
        {
            return;
        }

        
set_pdata_float(iItemm_flTimeWeaponIdleWEAPON_TIME_NEXT_IDLEextra_offset_weapon);
        
Weapon_SendAnim(iPlayeriMode ANIM_IDLE_B ANIM_IDLE);
    }
}

Weapon_OnPrimaryAttack(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
    
#pragma unused iAmmoPrimary

    
static iFlagsiAnimDesired;
    static 
szAnimation[64];iFlags pev(iPlayerpev_flags);

    if(
iReloadMode && iClip 0)
    {
        
Weapon_ReloadEnd(iItemiPlayeriMode);
        return;
    }

    
CallOrigFireBullets3(iItemiPlayer)

    if (
iClip <= || pev(iPlayerpev_waterlevel) == 3)
    {
        return;
    }

    
Punchangle(iPlayer, .iVecx = -2.0, .iVecy 0.0, .iVecz 0.0);

    
Weapon_SendAnim(iPlayeriMode ANIM_SHOOT_B:ANIM_SHOOT);

    
formatex(szAnimationcharsmax(szAnimation), iFlags FL_DUCKING "crouch_shoot_%s" "ref_shoot_%s"ANIM_EXTENSION);

    if ((
iAnimDesired lookup_sequence(iPlayerszAnimation)) == -1)
    {
        
iAnimDesired 0;
    }

    
set_pev(iPlayerpev_sequenceiAnimDesired);

    
set_pdata_float(iItemm_flNextPrimaryAttackWEAPON_TIME_NEXT_ATTACKextra_offset_weapon);
    
set_pdata_float(iItemm_flTimeWeaponIdleWEAPON_TIME_NEXT_ATTACK+1.0extra_offset_weapon);

    
engfunc(EngFunc_EmitSoundiPlayerCHAN_WEAPONSOUND_FIRE0.9ATTN_NORM0PITCH_NORM);
}

Weapon_OnSecondaryAttack(const iItem, const iPlayer, const iClip, const iAmmoPrimary, const iMode, const iReloadMode)
{
    
#pragma unused iAmmoPrimary

    
if(iReloadMode && iClip 0)
    {
        
Weapon_ReloadEnd(iItemiPlayeriMode);
        return;
    }

    if (
get_pdata_float(iItemm_flNextSecondaryAttackextra_offset_weapon) > 0.0)
    {
        return;
    }

    if (
pev(iPlayerpev_button) & IN_ATTACK2)
    {
        if (!
iMode || pev(iPlayerpev_waterlevel) == 3)
        {
            return;
        }

        static 
iFlags;
        static 
iAnimDesired;
        static 
szAnimation[64];iFlags pev(iPlayerpev_flags);
        static 
pEntity;
        static 
Float:fOrigin[3],Float:vecEnd[3];fm_get_aim_origin(iPlayervecEnd);Get_Position(iPlayer15.00.0, -5.0fOrigin);
        static 
iszAllocStringCached;

        
Punchangle(iPlayer, .iVecx = -4.0, .iVecy 0.0, .iVecz 0.0);

        
Weapon_SendAnim(iPlayerANIM_SHOOT2);

        
engfunc(EngFunc_EmitSoundiPlayerCHAN_WEAPONSOUND_FIRE_B0.9ATTN_NORM0PITCH_NORM);

        
formatex(szAnimationcharsmax(szAnimation), iFlags FL_DUCKING "crouch_shoot_%s" "ref_shoot_%s"ANIM_EXTENSION);

        if ((
iAnimDesired lookup_sequence(iPlayerszAnimation)) == -1)
        {
            
iAnimDesired 0;
        }

        
set_pev(iPlayerpev_sequenceiAnimDesired);

        
set_pdata_float(iItemm_flNextSecondaryAttack2.0extra_offset_weapon);
        
set_pdata_float(iItemm_flTimeWeaponIdle2.0extra_offset_weapon);

        if (
iszAllocStringCached || (iszAllocStringCached engfunc(EngFunc_AllocString"info_target")))
        {
            
pEntity engfunc(EngFunc_CreateNamedEntityiszAllocStringCached);
        }

        if (
pev_valid(pEntity))
        {
            
set_pev(pEntitypev_movetypeMOVETYPE_FLYMISSILE);
            
set_pev(pEntitypev_owneriPlayer);

            
SET_MODEL(pEntity,MODEL_FIREBALL)
            
SET_ORIGIN(pEntity,fOrigin)

            
set_pev(pEntitypev_classnameBALL_CLASSNAME);
            
set_pev(pEntitypev_minsFloat:{-0.01, -0.01, -0.01});
            
set_pev(pEntitypev_maxsFloat:{0.010.010.01});
            
set_pev(pEntitypev_gravity0.01);
            
set_pev(pEntitypev_solidSOLID_BBOX);
            
set_pev(pEntitypev_nextthinkget_gametime() + 0.1);

            static 
Float:Velocity[3];Get_Speed_Vector(fOriginvecEnd1000.0Velocity);
            
set_pev(pEntitypev_velocityVelocity);

            
Sprite_SetTransparency(pEntitykRenderTransAddFloat:{255.255,255.0,255.0}, 150.0);
        }

        
Update_HUD(iItemiPlayer0);
        
set_pdata_int(iItemm_fWeaponState0extra_offset_weapon);
        
set_pdata_int(iItemm_fInSuperBullets0extra_offset_weapon);
        
Update_HUD(iItemiPlayer1);

        if (
pev_valid(iSpriteleft[iPlayer]) && pev_valid(iSpriteright[iPlayer]))
        {
            
set_pev(iSpriteleft[iPlayer], pev_fuser1get_gametime() + 0.0);
            
set_pev(iSpriteright[iPlayer], pev_fuser2get_gametime() + 0.0);
        }
    }
}

Weapon_ReloadEnd(const iItem, const iPlayer, const iMode)
{
    
Weapon_SendAnim(iPlayeriMode ANIM_AFTER_RELOAD_B:ANIM_AFTER_RELOAD);

    
set_pdata_float(iItemm_flNextPrimaryAttack0.6extra_offset_weapon);
    
set_pdata_float(iItemm_flTimeWeaponIdle1.4extra_offset_weapon);

    
set_pdata_int(iItemm_fInSpecialReload0extra_offset_weapon);
}

Update_HUD(const iItem, const iPlayerUpdateMode)
{
    new 
iSprite[33];
    static 
iMode;iMode=get_pdata_int(iItemm_fWeaponStateextra_offset_weapon);
    
format(iSpritecharsmax(iSprite), "number_%d"iMode);

    if(
UpdateMode && iMode 0)
    {
        
message_begin(MSG_ONEget_user_msgid("StatusIcon"), {0,0,0}, iPlayer);
        
write_byte(1);
        
write_string(iSprite);
        
write_byte(30);
        
write_byte(144);
        
write_byte(255);
        
message_end();
    }
    else
    {
        
message_begin(MSG_ONEget_user_msgid("StatusIcon"), {0,0,0}, iPlayer);
        
write_byte(0);
        
write_string(iSprite);
        
write_byte(30);
        
write_byte(144);
        
write_byte(255);
        
message_end();
    }
}


//*********************************************************************
//*           Don't modify the code below this line unless            *
//*              you know _exactly_ what you are doing!!!             *
//*********************************************************************

#define MSGID_WEAPONLIST 78

new g_iItemID;
new 
RoundEend;

#define IsCustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)

public plugin_precache()
{
    
Weapon_OnPrecache();
    
#if defined WPNLIST
    
register_clcmd(WEAPON_NAME"Cmd_WeaponSelect");
    
register_message(MSGID_WEAPONLIST"MsgHook_WeaponList");
    
#endif
}

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR);

    
register_forward(FM_PlaybackEvent,              "FakeMeta_PlaybackEvent",    false);
    
register_forward(FM_SetModel,                   "FakeMeta_SetModel",         false);
    
register_forward(FM_UpdateClientData,               "FakeMeta_UpdateClientData_Post",true);
    
register_forward(FM_Touch,                  "FakeMeta_Touch",        false);
    
register_forward(FM_Think,                  "FakeMeta_Think",        false);

    
RegisterHam(Ham_Spawn,          "weaponbox",        "HamHook_Weaponbox_Spawn_Post"true);

    
RegisterHam(Ham_TraceAttack,        "func_breakable",   "HamHook_Entity_TraceAttack",   false);
    
RegisterHam(Ham_TraceAttack,        "info_target",      "HamHook_Entity_TraceAttack",   false);
    
RegisterHam(Ham_TraceAttack,        "player",       "HamHook_Entity_TraceAttack",   false);

    
RegisterHam(Ham_Item_Deploy,        WEAPON_REFERANCE,   "HamHook_Item_Deploy_Post"true);
    
RegisterHam(Ham_Item_Holster,       WEAPON_REFERANCE,   "HamHook_Item_Holster",     false);
    
RegisterHam(Ham_Item_AddToPlayer,   WEAPON_REFERANCE,   "HamHook_Item_AddToPlayer"false);
    
RegisterHam(Ham_Item_PostFrame,     WEAPON_REFERANCE,   "HamHook_Item_PostFrame",   false);

    
RegisterHam(Ham_Weapon_Reload,      WEAPON_REFERANCE,   "HamHook_Item_Reload",      false);
    
RegisterHam(Ham_Weapon_WeaponIdle,  WEAPON_REFERANCE,   "HamHook_Item_WeaponIdle",  false);
    
RegisterHam(Ham_Weapon_PrimaryAttack,   WEAPON_REFERANCE,   "HamHook_Item_PrimaryAttack",   false);

    
g_iItemID zp_register_extra_item(ZP_ITEM_NAME,        ZP_ITEM_COST,           ZP_TEAM_HUMAN);
}

public 
zp_extra_item_selected(iditemid)
{
    if (
itemid == g_iItemID && get_user_flags(id) & ADMIN_BAN)
    {
        
Weapon_Give(id);
    }
    else
    {
        
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) + ZP_ITEM_COST)
    }
}

public 
zp_user_infected_post(iPlayer)
{
    if (
pev_valid(iSpriteleft[iPlayer]) && pev_valid(iSpriteright[iPlayer]))
    {
        
set_pev(iSpriteleft[iPlayer], pev_fuser1get_gametime() + 0.0);
        
set_pev(iSpriteright[iPlayer], pev_fuser2get_gametime() + 0.0);
    }
}

public 
plugin_natives()
{
    
register_native("geating_m3""NativeGiveWeapon"true)
}

public 
NativeGiveWeapon(iPlayer)
{
    
Weapon_Give(iPlayer);
}

public 
StartRound()RoundEend=false;
public 
EndRound()RoundEend=true;

//**********************************************
//* Block client weapon.                       *
//**********************************************

public FakeMeta_UpdateClientData_Post(const iPlayer, const iSendWeapons, const CD_Handle)
{
    static 
iActiveItem;iActiveItem get_pdata_cbase(iPlayerm_pActiveItemextra_offset_player);

    if (!
IsValidPev(iActiveItem) || !IsCustomItem(iActiveItem))
    {
        return 
FMRES_IGNORED;
    }

    
set_cd(CD_HandleCD_flNextAttackget_gametime() + 0.001);
    return 
FMRES_IGNORED;
}

public 
FakeMeta_Touch(const iEnt, const iOther)
{
    if(!
pev_valid(iEnt))
    {
        return 
FMRES_IGNORED;
    }

    static 
Classname[32];pev(iEntpev_classnameClassnamesizeof(Classname));
    static 
Float:Origin[3];pev(iEntpev_originOrigin);
    static 
iAttackeriAttacker pev(iEntpev_owner);
    static 
pevVictimpevVictim = -1;
    static 
iEntity;
    static 
iszAllocStringCached2;

    if (!
equal(ClassnameBALL_CLASSNAME))
    {
        return 
FMRES_IGNORED;
    }

    if (
engfunc(EngFunc_PointContentsOrigin) == CONTENTS_SKY || engfunc(EngFunc_PointContentsOrigin) == CONTENTS_WATER)
    {
        
set_pev(iEntpev_flagspev(iEntpev_flags) | FL_KILLME);
        return 
FMRES_SUPERCEDE;
    }

    if (!
is_user_connected(iAttacker))
    {
        
set_pev(iEntpev_flagspev(iEntpev_flags) | FL_KILLME);
        return 
FMRES_IGNORED;
    }

    if (
iszAllocStringCached2 || (iszAllocStringCached2 engfunc(EngFunc_AllocString"info_target")))
    {
        
iEntity engfunc(EngFunc_CreateNamedEntityiszAllocStringCached2);
    }

    if (
pev_valid(iEntity))
    {
        
SET_MODEL(iEntity,MODEL_DRAGON)
        
SET_ORIGIN(iEntity,Origin)

        
set_pev(iEntitypev_classnameDRAGON_CLASSNAME);
        
set_pev(iEntitypev_movetypeMOVETYPE_FLY);
        
set_pev(iEntitypev_solidSOLID_NOT);
        
set_pev(iEntitypev_owneriAttacker);
        
set_pev(iEntitypev_framerate0.9);
        
set_pev(iEntitypev_sequence0);
        
set_pev(iEntitypev_animtimeget_gametime());
        
set_pev(iEntitypev_fuser2get_gametime() + 3.4);
        
set_pev(iEntitypev_nextthinkget_gametime() + 1.0);
        
Sprite_SetTransparency(iEntitykRenderTransAddFloat:{255.255,255.0,255.0}, 200.0);
    }

    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYOrigin0);
    
write_byte(TE_EXPLOSION);
    
WRITE_COORD(Origin[0]);
    
WRITE_COORD(Origin[1]);
    
WRITE_COORD(Origin[2] + 10.0);
    
write_short(iBlood[2]);
    
write_byte(20);
    
write_byte(15);
    
write_byte(TE_EXPLFLAG_NOSOUND);
    
message_end();

    
engfunc(EngFunc_MessageBeginMSG_PVSSVC_TEMPENTITYOrigin0);
    
write_byte(TE_SMOKE)
    
WRITE_COORD(Origin[0]);
    
WRITE_COORD(Origin[1]);
    
WRITE_COORD(Origin[2] - 20.0);
    
write_short(iBlood[3]);
    
write_byte(30);
    
write_byte(5);
    
message_end();

    
engfunc(EngFunc_EmitSoundiEntCHAN_VOICESOUND_DRAGON0.9ATTN_NORM0PITCH_NORM);
    
engfunc(EngFunc_EmitSoundiEntCHAN_ITEMSOUND_EXPLODE0.9ATTN_NORM0PITCH_NORM);

    while((
pevVictim engfunc(EngFunc_FindEntityInSpherepevVictimOriginWEAPON_BALL_RADIUS_EXP)) != )
    {
        if (!
is_user_alive(pevVictim))continue;
        if (!
zp_get_user_zombie(pevVictim))continue;
        if (
RoundEend)continue;

        static 
Float:vOrigin[3];pev(pevVictimpev_originvOrigin);

        
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
        
write_byte(TE_BLOODSPRITE)
        
WRITE_COORD(vOrigin[0])
        
WRITE_COORD(vOrigin[1])
        
WRITE_COORD(vOrigin[2])
        
write_short(iBlood[0])
        
write_short(iBlood[1])
        
write_byte(76)
        
write_byte(18)
        
message_end()

        
set_hudmessage(25500, -1.00.4600.020.05);
        
show_hudmessage(iAttacker" \     /^n^n/     \");

        ExecuteHamB(Ham_TakeDamage, pevVictim, iEnt, iAttacker, WEAPON_DAMAGE_BALL_EXP, DMG_SONIC);
    }

    set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);

    return FMRES_IGNORED;
}

public FakeMeta_Think(const iSprite)
{
    if (!pev_valid(iSprite))
    {
        return FMRES_IGNORED;
    }

    static Classname[32];pev(iSprite, pev_classname, Classname, sizeof(Classname));

    static iAttacker; iAttacker = pev(iSprite, pev_owner);

    if (equal(Classname,  DRAGON_CLASSNAME))
    {
        static Float:Origin[3];pev(iSprite, pev_origin, Origin);
        static Float:iTime;pev(iSprite, pev_fuser2, iTime);
        static iVictim;iVictim = -1

        if (iTime <= get_gametime())
        {
            engfunc(EngFunc_RemoveEntity, iSprite);
            return FMRES_SUPERCEDE;
        }

        while((iVictim = engfunc(EngFunc_FindEntityInSphere, iVictim, Origin, WEAPON_RADIUS_DRAGON_ATTACK)) != 0)
        {
            static Float:iVelo[3];pev(iVictim, pev_velocity, iVelo);

            if (!is_user_alive(iVictim))continue;
            if (!zp_get_user_zombie(iVictim))continue;
            if (RoundEend)continue;

            iVelo[0] = 0.0;
            iVelo[1] = 0.0;
            iVelo[2] = 250.0;

            set_hudmessage(255, 0, 0, -1.0, 0.46, 0, 0.02, 0.05);
            show_hudmessage(iAttacker, " 
\     /^n^n/     \");

            ExecuteHamB(Ham_TakeDamage, iVictim, iSprite, iAttacker, WEAPON_DRAGON_DAMAGE_ATTACK, DMG_SONIC);

            set_pdata_float(iVictim, m_flVelocityModifier, 1.0,  extra_offset_player);
            set_pev(iVictim, pev_velocity, iVelo);
        }

        set_pev(iSprite, pev_nextthink, get_gametime() + 0.08);
    }

    if (equal(Classname, MUZZLE_CLASSNAME_LEFT))
    {
        static Float:flFrame;
        static Float:iTime;pev(iSprite, pev_fuser1, iTime);

        flFrame+=1.0

        if (iTime <= get_gametime() || pev(iAttacker, pev_deadflag) == DAMAGE_YES)
        {
            set_pev(iSprite, pev_flags, pev(iSprite, pev_flags) | FL_KILLME);
            return FMRES_SUPERCEDE;
        }

        set_pev(iSprite, pev_frame, flFrame);
        set_pev(iSprite, pev_nextthink, get_gametime() + 0.01);
    }

    if (equal(Classname, MUZZLE_CLASSNAME_RIGHT))
    {
        static Float:flFrame;
        static Float:iTime2;pev(iSprite, pev_fuser2, iTime2);

        flFrame+=1.0

        if (iTime2 <= get_gametime() || pev(iAttacker, pev_deadflag) == DAMAGE_YES)
        {
            set_pev(iSprite, pev_flags, pev(iSprite, pev_flags) | FL_KILLME);
            return FMRES_SUPERCEDE;
        }

        set_pev(iSprite, pev_frame, flFrame);
        set_pev(iSprite, pev_nextthink, get_gametime() + 0.01);
    }


    return FMRES_IGNORED;
}

//**********************************************
//* Item (weapon) hooks.                       *
//**********************************************

    #define _call.%0(%1,%2) \
                                    \
    Weapon_On%0                         \
    (                               \
        %1,                             \
        %2,                         \
                                    \
        get_pdata_int(%1, m_iClip, extra_offset_weapon),    \
        GetAmmoInventory(%2, PrimaryAmmoIndex(%1)),     \
        get_pdata_int(%1, m_fWeaponState, extra_offset_weapon), \
        get_pdata_int(%1, m_fInSpecialReload, extra_offset_weapon) \
    )

public HamHook_Item_Deploy_Post(const iItem)
{
    new iPlayer;

    if (!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }

    _call.Deploy(iItem, iPlayer);
    return HAM_IGNORED;
}

public HamHook_Item_Holster(const iItem)
{
    new iPlayer;

    if (!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }

    set_pev(iPlayer, pev_viewmodel, 0);
    set_pev(iPlayer, pev_weaponmodel, 0);

    _call.Holster(iItem, iPlayer);
    return HAM_SUPERCEDE;
}

public HamHook_Item_WeaponIdle(const iItem)
{
    static iPlayer;

    if (!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }

    _call.Idle(iItem, iPlayer);
    return HAM_SUPERCEDE;
}

public HamHook_Item_Reload(const iItem)
{
    static iPlayer;

    if (!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }

    _call.Reload(iItem, iPlayer);
    return HAM_SUPERCEDE;
}

public HamHook_Item_PrimaryAttack(const iItem)
{
    static iPlayer;

    if (!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }

    _call.PrimaryAttack(iItem, iPlayer);
    return HAM_SUPERCEDE;
}

public HamHook_Item_PostFrame(const iItem)
{
    static iPlayer;

    if (!CheckItem(iItem, iPlayer))
    {
        return HAM_IGNORED;
    }

    if (get_pdata_float(iItem, m_flNextPrimaryAttack, extra_offset_weapon) <= 0.0 && get_pdata_int(iItem, m_fInSpecialReload, extra_offset_weapon) <= 0)
    {
        _call.SecondaryAttack(iItem, iPlayer);
    }

    return HAM_IGNORED;
}

//**********************************************
//* Fire Bullets.                              *
//**********************************************

CallOrigFireBullets3(const iItem, const iPlayer)
{
    static FakeMetaTraceLine;FakeMetaTraceLine=register_forward(FM_TraceLine,"
FakeMeta_TraceLine",true)
    state FireBullets: Enabled;
    static Float: vecPuncheAngle[3];pev(iPlayer, pev_punchangle, vecPuncheAngle);

    ExecuteHam(Ham_Weapon_PrimaryAttack, iItem);
    set_pev(iPlayer, pev_punchangle, vecPuncheAngle);

    state FireBullets: Disabled;
    unregister_forward(FM_TraceLine,FakeMetaTraceLine,true)
}

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

public FakeMeta_TraceLine(Float:vecStart[3], Float:vecEnd[3], iFlag, iIgnore, iTrase)
{
    if (iFlag & IGNORE_MONSTERS)
    {
        return FMRES_IGNORED;
    }

    static Float:vecfEnd[3],iHit,iDecal,glassdecal;

    if(!glassdecal)
    {
        glassdecal=engfunc( EngFunc_DecalIndex, "
{bproof1" )
    }

    iHit=get_tr2(iTrase,TR_pHit)

    if(iHit>0 && pev_valid(iHit))
        if(pev(iHit,pev_solid)!=SOLID_BSP)return FMRES_IGNORED
        else if(pev(iHit,pev_rendermode)!=0)iDecal=glassdecal
        else iDecal=random_num(41,45)
    else iDecal=random_num(41,45)

    get_tr2(iTrase, TR_vecEndPos, vecfEnd)

    engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecfEnd, 0)
    write_byte(TE_GUNSHOTDECAL)
    WRITE_COORD(vecfEnd[0])
    WRITE_COORD(vecfEnd[1])
    WRITE_COORD(vecfEnd[2])
    write_short(iHit > 0 ? iHit : 0)
    write_byte(iDecal)
    message_end()

    return FMRES_IGNORED
}

public HamHook_Entity_TraceAttack(const iEntity, const iAttacker, const Float: flDamage) <FireBullets: Enabled>
{
    static iItem;iItem = get_pdata_cbase(iAttacker, m_pActiveItem, extra_offset_player);

    if (!BitCheck(g_bitIsConnected, iAttacker) || !IsValidPev(iAttacker))
    {
        return;
    }

    if (!IsValidPev(iItem))
    {
        return;
    }

    if (get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon) == 31)
    {
        MuzzleFlash_Left(iAttacker, WEAPON_MUZZLE, 0.08, 20.0);
        MuzzleFlash_Right(iAttacker, WEAPON_MUZZLE_B, 0.08, 20.0);
        Update_HUD(iItem, iAttacker, 0);
        set_pdata_int(iItem, m_fWeaponState, 1, extra_offset_weapon);
        Update_HUD(iItem, iAttacker, 1);
    }

    if (is_user_alive(iEntity) && get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon) < 32 && zp_get_user_zombie(iEntity))
    {
        set_pdata_int(iItem, m_fInSuperBullets, (get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon)+1), extra_offset_weapon);
    }

    set_hudmessage(255, 0, 0, -1.0, 0.46, 0, 0.2, 0.05);
    show_hudmessage(iAttacker, " 
\     /^n^n/     \");

    SetHamParamFloat(3, flDamage * WEAPON_MULTIPLIER_DAMAGE);
}

public MsgHook_Death()          </* Empty statement */>     { /* Fallback */ }
public MsgHook_Death()          <FireBullets: Disabled>     { /* Do notning */ }

public FakeMeta_PlaybackEvent()     </* Empty statement */>     { return FMRES_IGNORED; }
public FakeMeta_PlaybackEvent()     <FireBullets: Disabled>     { return FMRES_IGNORED; }

public HamHook_Entity_TraceAttack()     </* Empty statement */>     { /* Fallback */ }
public HamHook_Entity_TraceAttack()     <FireBullets: Disabled>     { /* Do notning */ }


Weapon_Create(const Float: vecOrigin[3] = {0.0, 0.0, 0.0}, const Float: vecAngles[3] = {0.0, 0.0, 0.0})
{
    new iWeapon;

    static iszAllocStringCached;
    if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_REFERANCE)))
    {
        iWeapon = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
    }

    if (!IsValidPev(iWeapon))
    {
        return FM_NULLENT;
    }

    MDLL_Spawn(iWeapon);
    SET_ORIGIN(iWeapon, vecOrigin);

    set_pdata_int(iWeapon, m_iClip, WEAPON_MAX_CLIP, extra_offset_weapon);
    set_pdata_int(iWeapon, m_fWeaponState, 0, extra_offset_weapon);
    set_pdata_int(iWeapon, m_fInSuperBullets, 0, extra_offset_weapon);

    set_pev(iWeapon, pev_impulse, WEAPON_KEY);
    set_pev(iWeapon, pev_angles, vecAngles);

    Weapon_OnSpawn(iWeapon);

    return iWeapon;
}

Weapon_Give(const 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);
        MDLL_Touch(iWeapon, iPlayer);
        SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iWeapon), WEAPON_DEFAULT_AMMO);

        return iWeapon;
    }

    return FM_NULLENT;
}

Player_DropWeapons(const iPlayer, const iSlot)
{
    new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, m_rgpPlayerItems_CBasePlayer + iSlot, extra_offset_player);

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

        iItem = get_pdata_cbase(iItem, m_pNext, extra_offset_weapon);
    }
}

Weapon_SendAnim(const iPlayer, const iAnim)
{
    set_pev(iPlayer, pev_weaponanim, iAnim);

    MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0.0, 0.0, 0.0}, iPlayer);
    WRITE_BYTE(iAnim);
    WRITE_BYTE(0);
    MESSAGE_END();
}

stock Weapon_DefaultDeploy(const iPlayer, const szViewModel[], const szWeaponModel[], const iAnim, const szAnimExt[])
{
    set_pev(iPlayer, pev_viewmodel2, szViewModel);
    set_pev(iPlayer, pev_weaponmodel2, szWeaponModel);
    set_pev(iPlayer, pev_fov, 90.0);

    set_pdata_int(iPlayer, m_iFOV, 90, extra_offset_player);
    set_pdata_int(iPlayer, m_fResumeZoom, 0, extra_offset_player);
    set_pdata_int(iPlayer, m_iLastZoom, 90, extra_offset_player);

    set_pdata_string(iPlayer, m_szAnimExtention * 4, szAnimExt, -1, extra_offset_player * 4);

    Weapon_SendAnim(iPlayer, iAnim);
}

stock Punchangle(iPlayer, Float:iVecx = 0.0, Float:iVecy = 0.0, Float:iVecz = 0.0)
{
    static Float:iVec[3];pev(iPlayer, pev_punchangle,iVec);
    iVec[0] = iVecx;iVec[1] = iVecy;iVec[2] = iVecz
    set_pev(iPlayer, pev_punchangle, iVec);
}

stock Get_Position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
    static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3];

    pev(id, pev_origin, vOrigin);
    pev(id, pev_view_ofs, vUp);

    xs_vec_add(vOrigin, vUp, vOrigin);

    pev(id, pev_v_angle, vAngle);

    angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward);
    angle_vector(vAngle, ANGLEVECTOR_RIGHT, vRight);
    angle_vector(vAngle, ANGLEVECTOR_UP, vUp);

    vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up;
    vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up;
    vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up;
}

stock Get_Speed_Vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
    new_velocity[0] = origin2[0] - origin1[0]
    new_velocity[1] = origin2[1] - origin1[1]
    new_velocity[2] = origin2[2] - origin1[2]
    new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
    new_velocity[0] *= num
    new_velocity[1] *= num
    new_velocity[2] *= num
}

#define BitSet(%0,%1) (%0 |= (1 << (%1 - 1)))
#define BitClear(%0,%1) (%0 &= ~(1 << (%1 - 1)))
#define BitCheck(%0,%1) (%0 & (1 << (%1 - 1)))

public client_putinserver(id)
{
    BitSet(g_bitIsConnected, id);
}

public client_disconnect(id)
{
    BitClear(g_bitIsConnected, id);
}


bool: CheckItem(const iItem, &iPlayer)
{
    if (!IsValidPev(iItem) || !IsCustomItem(iItem))
    {
        return false;
    }

    iPlayer = get_pdata_cbase(iItem, m_pPlayer, extra_offset_weapon);

    if (!IsValidPev(iPlayer) || !BitCheck(g_bitIsConnected, iPlayer))
    {
        return false;
    }

    return true;
}

//**********************************************
//* Weapon list update.                        *
//**********************************************
#if defined WPNLIST
public Cmd_WeaponSelect(const iPlayer)
{
    engclient_cmd(iPlayer, WEAPON_REFERANCE);
    return PLUGIN_HANDLED;
}
#endif
public HamHook_Item_AddToPlayer(const iItem, const iPlayer)
{
    switch(pev(iItem, pev_impulse))
    {
        case 0: MsgHook_WeaponList(MSGID_WEAPONLIST, iItem, iPlayer);
        case WEAPON_KEY:
        {
            #if defined WPNLIST
            MsgHook_WeaponList(MSGID_WEAPONLIST, iItem, iPlayer);
            #endif
            SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iItem), pev(iItem, pev_iuser2));
        }
    }

    return HAM_IGNORED;
}

public MsgHook_WeaponList(const iMsgID, const iMsgDest, const iMsgEntity)
{
    static arrWeaponListData[8];

    if (!iMsgEntity)
    {
        new szWeaponName[32];
        get_msg_arg_string(1, szWeaponName, charsmax(szWeaponName));

        if (!strcmp(szWeaponName, WEAPON_REFERANCE))
        {
            for (new i, a = sizeof arrWeaponListData; i < a; i++)
            {
                arrWeaponListData[i] = get_msg_arg_int(i + 2);
            }
        }
    }
    else
    {
        if (!IsCustomItem(iMsgDest) && pev(iMsgDest, pev_impulse))
        {
            return;
        }

        MESSAGE_BEGIN(MSG_ONE, iMsgID, {0.0, 0.0, 0.0}, iMsgEntity);
        WRITE_STRING(IsCustomItem(iMsgDest) ? WEAPON_NAME : WEAPON_REFERANCE);

        for (new i, a = sizeof arrWeaponListData; i < a; i++)
        {
            WRITE_BYTE(arrWeaponListData[i]);
        }

        MESSAGE_END();
    }
}

//**********************************************
//* Muzzleflash stuff.                *
//**********************************************

stock Sprite_SetTransparency(const iSprite, const iRendermode, const Float: vecColor[3], const Float: flAmt, const iFx = kRenderFxNone)
{
    set_pev(iSprite, pev_rendermode, iRendermode);
    set_pev(iSprite, pev_rendercolor, vecColor);
    set_pev(iSprite, pev_renderamt, flAmt);
    set_pev(iSprite, pev_renderfx, iFx);
}

stock MuzzleFlash_Right(const iPlayer, const szMuzzleSprite[], const Float: flScale, const Float: flFramerate)
{
    if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
    {
        return FM_NULLENT;
    }

    static iszAllocStringCached;
    if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "
env_sprite")))
    {
        iSpriteright[iPlayer] = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
    }

    if (!IsValidPev(iSpriteright[iPlayer]))
    {

        return FM_NULLENT;
    }

    set_pev(iSpriteright[iPlayer], pev_model, szMuzzleSprite);

    set_pev(iSpriteright[iPlayer], pev_classname, MUZZLE_CLASSNAME_RIGHT);
    set_pev(iSpriteright[iPlayer], pev_owner, iPlayer);
    set_pev(iSpriteright[iPlayer], pev_aiment, iPlayer);
    set_pev(iSpriteright[iPlayer], pev_body, 4);
    set_pev(iSpriteright[iPlayer], pev_frame, 0.0);

    Sprite_SetTransparency(iSpriteright[iPlayer], kRenderTransAdd, Float:{0.0,0.0,0.0}, 255.0);

    set_pev(iSpriteright[iPlayer], pev_framerate, flFramerate);
    set_pev(iSpriteright[iPlayer], pev_scale, flScale);

    set_pev(iSpriteright[iPlayer], pev_fuser2, get_gametime() + 40.0);
    set_pev(iSpriteright[iPlayer], pev_nextthink, get_gametime() + 0.01);

    MDLL_Spawn(iSpriteright[iPlayer]);

    return iSpriteright[iPlayer];
}

stock MuzzleFlash_Left(const iPlayer, const szMuzzleSprite[], const Float: flScale, const Float: flFramerate)
{
    if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
    {
        return FM_NULLENT;
    }

    static iszAllocStringCached;
    if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "
env_sprite")))
    {
        iSpriteleft[iPlayer] = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
    }

    if (!IsValidPev(iSpriteleft[iPlayer]))
    {

        return FM_NULLENT;
    }

    set_pev(iSpriteleft[iPlayer], pev_model, szMuzzleSprite);

    set_pev(iSpriteleft[iPlayer], pev_classname, MUZZLE_CLASSNAME_LEFT);
    set_pev(iSpriteleft[iPlayer], pev_owner, iPlayer);
    set_pev(iSpriteleft[iPlayer], pev_aiment, iPlayer);
    set_pev(iSpriteleft[iPlayer], pev_body, 3);
    set_pev(iSpriteleft[iPlayer], pev_frame, 0.0);

    Sprite_SetTransparency(iSpriteleft[iPlayer], kRenderTransAdd, Float:{0.0,0.0,0.0}, 255.0);

    set_pev(iSpriteleft[iPlayer], pev_framerate, flFramerate);
    set_pev(iSpriteleft[iPlayer], pev_scale, flScale);

    set_pev(iSpriteleft[iPlayer], pev_fuser1, get_gametime() + 40.0);
    set_pev(iSpriteleft[iPlayer], pev_nextthink, get_gametime() + 0.01);

    MDLL_Spawn(iSpriteleft[iPlayer]);

    return iSpriteleft[iPlayer];
}

//**********************************************
//* Weaponbox world model.                     *
//**********************************************

public HamHook_Weaponbox_Spawn_Post(const iWeaponBox)
{
    if (IsValidPev(iWeaponBox))
    {
        state (IsValidPev(pev(iWeaponBox, pev_owner))) WeaponBox: Enabled;
    }

    return HAM_IGNORED;
}

public FakeMeta_SetModel(const 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, m_rgpPlayerItems_CWeaponBox + i, extra_offset_weapon);

        if (IsValidPev(iItem) && IsCustomItem(iItem))
        {
            SET_MODEL(iEntity, MODEL_WORLD);
            set_pev(iItem, pev_iuser2, GetAmmoInventory(pev(iEntity,pev_owner), PrimaryAmmoIndex(iItem)))
            return FMRES_SUPERCEDE;
        }
    }

    return FMRES_IGNORED;
}

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

//**********************************************
//* Ammo Inventory.                            *
//**********************************************

PrimaryAmmoIndex(const iItem)
{
    return get_pdata_int(iItem, m_iPrimaryAmmoType, extra_offset_weapon);
}

GetAmmoInventory(const iPlayer, const iAmmoIndex)
{
    if (iAmmoIndex == -1)
    {
        return -1;
    }

    return get_pdata_int(iPlayer, m_rgAmmo_CBasePlayer + iAmmoIndex, extra_offset_player);
}

SetAmmoInventory(const iPlayer, const iAmmoIndex, const iAmount)
{
    if (iAmmoIndex == -1)
    {
        return 0;
    }

    set_pdata_int(iPlayer, m_rgAmmo_CBasePlayer + iAmmoIndex, iAmount, extra_offset_player);
    return 1;
}
//vk.com/l.shvendik0
stock Player_SetAnimation(const iPlayer, const szAnim[])
{
       if(!is_user_alive(iPlayer))return;

       #define ACT_RANGE_ATTACK1   28

       // Linux extra offsets
       #define extra_offset_animating   4

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

       new Float: 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);
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/ 
__________________
My Steam Profile

- Online Rarely -
TribalBlood is offline
Reply


Thread Tools
Display Modes

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 13:54.


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