Discord sunucumuz açılmıştır, hepinizi bekleriz

https://discord.gg/43gGDQe6tS

Yasaklı Kod Hatası

Eklenti sorunlarınız ve özel eklenti istekleriniz

Moderatör: Moderatörler

Kullanıcı avatarı

Konu Sahibi
Xau
Mesajlar: 202
Kayıt: Çrş Oca 23, 2019 10:03 pm
Server Ip/DNS: 213.238.173.12
Clan İsmi: Nostalji Gamers
İletişim:

Yasaklı Kod Hatası

Mesaj gönderen Xau »

Kod: Tümünü seç

#include <amxmodx>
#include <fakemeta_util>
#include <hamsandwich>
#include <beam>
#include <zombieplague>

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

#pragma ctrlchar '\'
#pragma compress 1//Protection From Decompiler

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

//#define WPNLIST	

// Main
#define WEAPON_KEY				87349
#define WEAPON_NAME 				"weapon_gungnir"

#define WEAPON_REFERANCE			"weapon_aug"
#define WEAPON_MAX_CLIP				50
#define WEAPON_DEFAULT_AMMO			200

#define WEAPON_TIME_NEXT_IDLE 			5.0
#define WEAPON_TIME_NEXT_ATTACK 		0.15
#define WEAPON_TIME_DELAY_DEPLOY 		1.0
#define WEAPON_TIME_DELAY_RELOAD 		2.0

#define WEAPON_DAMAGE_HIT			random_float(70.0,220.0)
#define WEAPON_RADIUS_HIT			400.0

#define WEAPON_BALL_DAMAGE_EXP			random_float(500.0, 600.0)
#define WEAPON_BALL_RADIUS_EXP			250.0
#define WEAPON_BALL_EXP_KNOCKBACK		20.0

#define WEAPON_MISSILE_DAMAGE_EXP		random_float(500.0, 600.0)
#define WEAPON_MISSILE_RADIUS_EXP		100.0

#define WEAPON_MISSILE_DAMAGE2			random_float(500.0, 600.0)
#define WEAPON_MISSILE_RADIUS2			100.0

#define WEAPON_MISSILE_DAMAGE_TOUCH		random_float(300.0, 400.0)
#define WEAPON_MISSILE_KNOCKBACK_TOUCH		50.0

#define WEAPON_DAMAGE_LINE			random_float(10.0, 50.0)

#define ZP_ITEM_NAME				"GunGnir" 
#define ZP_ITEM_COST				0

// Models
#define MODEL_WORLD				"models/w_gungnir.mdl"
#define MODEL_VIEW				"models/v_gungnir_v3.mdl"
#define MODEL_PLAYER_A				"models/p_gungnira.mdl"
#define MODEL_PLAYER_B				"models/p_gungnirb.mdl"
#define MODEL_MISSILE				"models/gungnir_missile.mdl"

// Sounds
#define SOUND_SHOOT_B				"weapons/gungnir_shoot_b.wav"
#define SOUND_SHOOT_B_EXP			"weapons/gungnir_shoot_b_exp.wav"
#define SOUND_SHOOT_END				"weapons/gungnir_shoot_end.wav"
#define SOUND_LOOP				"weapons/gungnir_shoot_loop.wav"

#define SOUND_CHARGE_EXP			"weapons/gungnir_charge_shoot_exp.wav"
#define SOUND_CHARGE_EXP2			"weapons/gungnir_charge_shoot_exp2.wav"
#define SOUND_CHARGE_SHOOT			"weapons/gungnir_charge_shoot1.wav"
#define SOUND_CHARGE_SHOOT2			"weapons/gungnir_charge_shoot2.wav"

// Sprites
#define WEAPON_HUD_TXT				"sprites/weapon_gungnir.txt"
#define WEAPON_HUD_SPR_1			"sprites/640hud185.spr"
#define WEAPON_HUD_SPR_2			"sprites/640hud36.spr"

#define WEAPON_SPRITE_HIT_EXP			"sprites/ef_gungnir_aexplo.spr"
#define WEAPON_SPRITE_MODE_EXP			"sprites/ef_gungnir_bexplo.spr"
#define WEAPON_SPRITE_CHARGE_EXP		"sprites/ef_gungnir_chargeexplo2.spr"
#define WEAPON_SPRITE_LINE			"sprites/ef_gungnir_lightline1.spr"
#define WEAPON_SPRITE_LINE3			"sprites/ef_gungnir_xbeam.spr"
#define WEAPON_SPRITE_MISSILE			"sprites/ef_gungnir_missile.spr"
#define WEAPON_SPRITE_MUZZLE			"sprites/muzzleflash81.spr"

// Animation
#define ANIM_EXTENSION				"m249"

// Animation sequences
enum
{	
	ANIM_IDLE,
	
	ANIM_RELOAD,

	ANIM_DRAW,
	
	ANIM_SHOOT_START,
	ANIM_SHOOT_LOOP,
	ANIM_SHOOT_END,
	
	ANIM_SHOOT_B,
	ANIM_CHANGE_B,
	
	ANIM_SHOOT_CHARGE,
	ANIM_CHARGE_IDLE,
};

//**********************************************
//* 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_fInReload			54
#define m_iChargeReady			55
#define m_flAccuracy 			62
#define m_fWeaponState			74
#define m_iLastZoom 			109

// CBaseMonster
#define m_flNextAttack			83

// CBasePlayer
#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 INSTANCE(%0)			((%0 == -1) ? 0 : %0)

#define MUZZLE_CLASSNAME		"iMuzzGungnir"

#define MISSILE_CLASSNAME		"GunGnirMissile"
#define BALL_CLASSNAME			"GunGnirBall"

#define BEAM_CLASSNAME			"szBeamGunGnir"
#define BEAM_CLASSNAME2			"szBeamGunGnir2"

#define BEAM_LIFE 			0.16
#define BEAM_COLOR 			{255.0, 255.0, 255.0}
#define BEAM_BRIGHTNESS			250.0
#define BEAM_SCROLLRATE			20.0
#define BEAM_NOISE			0
#define BEAM_WEIGHT			200.0

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

new iBlood[7];

Weapon_OnPrecache()
{
	PRECACHE_MODEL(MODEL_WORLD);
	PRECACHE_MODEL(MODEL_VIEW);
	PRECACHE_MODEL(MODEL_PLAYER_A);
	PRECACHE_MODEL(MODEL_PLAYER_B);
	PRECACHE_MODEL(MODEL_MISSILE);
	
	PRECACHE_SOUND(SOUND_SHOOT_B);
	PRECACHE_SOUND(SOUND_SHOOT_B_EXP);
	PRECACHE_SOUND(SOUND_SHOOT_END);
	PRECACHE_SOUND(SOUND_LOOP);
	
	PRECACHE_SOUND(SOUND_CHARGE_EXP);
	PRECACHE_SOUND(SOUND_CHARGE_EXP2);
	PRECACHE_SOUND(SOUND_CHARGE_SHOOT);
	PRECACHE_SOUND(SOUND_CHARGE_SHOOT2);

	PRECACHE_SOUNDS_FROM_MODEL(MODEL_VIEW);
	
	iBlood[2] = PRECACHE_MODEL(WEAPON_SPRITE_HIT_EXP);
	iBlood[3] = PRECACHE_MODEL(WEAPON_SPRITE_MODE_EXP);
	iBlood[6] = PRECACHE_MODEL(WEAPON_SPRITE_CHARGE_EXP);

	iBlood[4] = PRECACHE_MODEL(WEAPON_SPRITE_LINE);
	
	PRECACHE_MODEL(WEAPON_SPRITE_LINE3);
	PRECACHE_MODEL(WEAPON_SPRITE_MISSILE);
	PRECACHE_MODEL(WEAPON_SPRITE_MUZZLE);
	
	#if defined WPNLIST
	PRECACHE_GENERIC(WEAPON_HUD_TXT);
	PRECACHE_GENERIC(WEAPON_HUD_SPR_1);
	PRECACHE_GENERIC(WEAPON_HUD_SPR_2);
	#endif
	
	iBlood[0] = PRECACHE_MODEL("sprites/bloodspray.spr");
	iBlood[1] = PRECACHE_MODEL("sprites/blood.spr");
}

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

Weapon_OnDeploy(const iItem, const iPlayer, const iClip, const iChargeReady, const iAmmoPrimary)
{
	#pragma unused iClip, iAmmoPrimary, iChargeReady
		
	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_A)))
	{
		set_pev_string(iPlayer, pev_weaponmodel2, iszPlayerModel);
	}
	
	set_pdata_int(iItem, m_fInReload, 0, extra_offset_weapon);
	set_pdata_int(iItem, m_iChargeReady, 0, 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_A, ANIM_DRAW, ANIM_EXTENSION);
}

Weapon_OnHolster(const iItem, const iPlayer, const iClip, const iChargeReady, const iAmmoPrimary)
{
	#pragma unused iPlayer, iClip, iAmmoPrimary, iChargeReady
	
	Weapon_ChargeEnd(iItem, iPlayer);

	set_pdata_int(iItem, m_fInReload, 0, extra_offset_weapon);
	
	engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_LOOP, 0.0, 0.0, SND_STOP, PITCH_NORM);
	
	set_pdata_int(iItem, m_fInSuperBullets, 0, extra_offset_weapon);
	set_pev(iItem, pev_fuser1, 0.0);
}

Weapon_OnIdle(const iItem, const iPlayer, const iClip, const iChargeReady, const iAmmoPrimary)
{
	#pragma unused iClip, iAmmoPrimary
	
	if (get_pdata_float(iItem, m_flNextSecondaryAttack, extra_offset_weapon) > 0.0)
	{
		return;
	}
	
	if (get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon) == 3)
	{
		Weapon_ShootLaser(iItem, iPlayer, iClip);
	}

	if (get_pdata_float(iItem, m_flTimeWeaponIdle, extra_offset_weapon) > 0.0)
	{
		return;
	}
	
	if(iChargeReady > 0)
	{
		Weapon_ChargeEnd(iItem, iPlayer);
		return;
	}
	
	set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_TIME_NEXT_IDLE, extra_offset_weapon);
	
	Weapon_SendAnim(iPlayer, get_pdata_int(iItem,m_fInSuperBullets,extra_offset_weapon) == 2 ? ANIM_CHARGE_IDLE : ANIM_IDLE);
}

Weapon_OnReload(const iItem, const iPlayer, const iClip, const iChargeReady, const iAmmoPrimary)
{
	#pragma unused iAmmoPrimary
	
	if (min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary) <= 0)
	{
		return;
	}
	
	if(iChargeReady > 0)
	{
		Weapon_ChargeEnd(iItem, iPlayer);
		return;
	}
	
	set_pdata_int(iItem, m_iClip, 0, extra_offset_weapon);
	
	ExecuteHam(Ham_Weapon_Reload, iItem);
	
	set_pdata_int(iItem, m_iClip, iClip, extra_offset_weapon);
	
	set_pdata_float(iPlayer, m_flNextAttack, WEAPON_TIME_DELAY_RELOAD, extra_offset_player);
	set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_TIME_DELAY_RELOAD, extra_offset_weapon);
	
	Weapon_SendAnim(iPlayer, ANIM_RELOAD);
}

Weapon_OnPrimaryAttack(const iItem, const iPlayer, const iClip, const iChargeReady, const iAmmoPrimary)
{
	#pragma unused iAmmoPrimary
	
	if (get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon))
	{
		return;
	}

	if(iClip <= 0 || pev(iPlayer, pev_waterlevel) == 3)
	{
		if(iChargeReady > 0)
		{
			Weapon_ChargeEnd(iItem, iPlayer);
		}
		return;
	}
	
	switch(iChargeReady)
	{
		case 0:
		{
			Weapon_SendAnim(iPlayer, ANIM_SHOOT_START);
			
			set_pdata_int(iItem, m_iChargeReady, 1, extra_offset_weapon);
			
			set_pdata_float(iItem, m_flTimeWeaponIdle, 0.16, extra_offset_weapon);
			set_pdata_float(iItem, m_flNextPrimaryAttack, 0.2, extra_offset_weapon);
			set_pdata_float(iItem, m_flNextSecondaryAttack, 0.2, extra_offset_weapon);
			
			return;
		}
		case 1:
		{
			static iFlags, iAnimDesired; 
			static szAnimation[64];iFlags = pev(iPlayer, pev_flags);
			
			if (pev(iItem, pev_fuser1) < get_gametime())
			{
				engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_LOOP, 0.9, ATTN_NORM, 0, PITCH_NORM);
				set_pev(iItem, pev_fuser1, get_gametime() + 1.85);
			}
			
			Weapon_SendAnim(iPlayer, ANIM_SHOOT_LOOP);
					
			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, extra_offset_weapon);
			
			set_pdata_int(iItem, m_iClip, iClip-1, extra_offset_weapon);
			
			Weapon_MuzzleFlash(iPlayer, WEAPON_SPRITE_MUZZLE, 0.1, 10.0, Float:{0.0, 0.0, 0.0}, 250.0);
			
			static Float:VecEnd[3];Get_Position(iPlayer, 100.0, 0.0, 0.0, VecEnd);
			CreateExplosion(VecEnd, 10.0, iBlood[2], 1, 50, TE_EXPLFLAG_NOSOUND | TE_EXPLFLAG_NOPARTICLES | TE_EXPLFLAG_NODLIGHTS);
			Weapon_DrawBeam2(iPlayer, VecEnd);
			
			static Float:vecEnd[3];
			static Float:vecOrigin[3];pev(iPlayer, pev_origin, vecOrigin);
			static iVictim;iVictim = FM_NULLENT;
				
			while(((iVictim = fm_find_ent_in_sphere(iVictim, vecOrigin, WEAPON_RADIUS_HIT)) != 0))
			{
				if(is_user_connected(iVictim) && is_user_alive(iVictim) && IsValidPev(iVictim))
				{
					pev(iVictim, pev_origin, vecEnd);
					if(iVictim == iPlayer)continue;
					if(!zp_get_user_zombie(iVictim))continue;	
					if(IsWallBetweenPoints(vecOrigin, vecEnd, iPlayer))continue;	
					if(!fm_is_in_viewcone(iPlayer, vecEnd))continue;				
					
					CreateExplosion(vecEnd, 10.0, iBlood[2], random_num(2,3), 30, TE_EXPLFLAG_NOSOUND | TE_EXPLFLAG_NOPARTICLES | TE_EXPLFLAG_NODLIGHTS);
										
					ExecuteHamB(Ham_TakeDamage, iVictim, iPlayer, iPlayer, WEAPON_DAMAGE_HIT, DMG_BURN);
	
					Weapon_DrawBeam(iPlayer, vecEnd, VecEnd);
				}
			}
		}
	}
}

Weapon_OnSecondaryAttack(const iItem, const iPlayer, const iClip, const iChargeReady, const iAmmoPrimary)
{
	#pragma unused iAmmoPrimary, iChargeReady, iClip
	
	static iChargeReady;iChargeReady = get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon);
	
	if(iClip <= 0 || pev(iPlayer, pev_waterlevel) == 3)
	{
		if(iChargeReady > 0)
		{
			Weapon_ChargeEnd(iItem, iPlayer);
		}
		return;
	}
	
	switch(iChargeReady)
	{
		case 0:
		{
			set_pdata_int(iItem, m_fInSuperBullets, 1, extra_offset_weapon);

			set_pdata_float(iItem, m_flTimeWeaponIdle, 0.5, extra_offset_weapon);
			set_pdata_float(iItem, m_flNextPrimaryAttack, 0.5, extra_offset_weapon);
			set_pdata_float(iItem, m_flNextSecondaryAttack, 0.5, extra_offset_weapon);
	
			return; 
		}
		case 1:
		{
			Weapon_SendAnim(iPlayer, ANIM_CHANGE_B);
				
			set_pdata_int(iItem, m_fInSuperBullets, 2, extra_offset_weapon);
				
			set_pdata_float(iItem, m_flTimeWeaponIdle, 2.1, extra_offset_weapon);
			set_pdata_float(iItem, m_flNextPrimaryAttack, 2.1, extra_offset_weapon);
			set_pdata_float(iItem, m_flNextSecondaryAttack, 2.1, extra_offset_weapon);
	
			return; 
		}
		case 2:
		{	
			Weapon_SendAnim(iPlayer, ANIM_CHARGE_IDLE);
			
			set_pdata_int(iItem, m_fInSuperBullets, 3, extra_offset_weapon);
			set_pdata_float(iItem, m_flTimeWeaponIdle, 1.0, extra_offset_weapon);
			set_pdata_float(iItem, m_flNextPrimaryAttack, 1.0, extra_offset_weapon);

			static iszPlayerModel;
			if (iszPlayerModel || (iszPlayerModel = engfunc(EngFunc_AllocString, MODEL_PLAYER_B)))
			{
				set_pev_string(iPlayer, pev_weaponmodel2, iszPlayerModel);
			}
			
			return;
		}
	}
}

Weapon_ShootLaser(const iItem, const iPlayer, const iClip)
{
	Weapon_SendAnim(iPlayer, ANIM_SHOOT_CHARGE);
	
	set_pdata_float(iItem, m_flTimeWeaponIdle, 3.0, extra_offset_weapon);
	set_pdata_float(iItem, m_flNextPrimaryAttack, 3.0, extra_offset_weapon);
	set_pdata_float(iItem, m_flNextSecondaryAttack, 3.0, extra_offset_weapon);
	
	set_pdata_int(iItem, m_iClip, max(iClip-5, 0), extra_offset_weapon);
	
	set_pdata_int(iItem, m_fInSuperBullets, 0, extra_offset_weapon);

	CreateMissile(iPlayer);
	
	static iszPlayerModel;
	if (iszPlayerModel || (iszPlayerModel = engfunc(EngFunc_AllocString, MODEL_PLAYER_A)))
	{
		set_pev_string(iPlayer, pev_weaponmodel2, iszPlayerModel);
	}
	
	engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_CHARGE_SHOOT, 0.9, ATTN_NORM, 0, PITCH_NORM);
}

Weapon_ChargeEnd(const iItem, const iPlayer)
{
	Weapon_SendAnim(iPlayer, ANIM_SHOOT_END);
	
	set_pdata_float(iItem, m_flTimeWeaponIdle, 0.28, extra_offset_weapon);
	set_pdata_float(iItem, m_flNextPrimaryAttack, 0.3, extra_offset_weapon);
	set_pdata_float(iItem, m_flNextSecondaryAttack, 0.3, extra_offset_weapon);
	
	set_pdata_int(iItem, m_iChargeReady, 0, extra_offset_weapon);
	
	engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_LOOP, 0.0, 0.0, SND_STOP, PITCH_NORM);
	engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_SHOOT_END, 0.9, ATTN_NORM, 0, PITCH_NORM);

	set_pev(iItem, pev_fuser1, 0.0);
}
	
//*********************************************************************
//*           Don't modify the code below this line unless            *
//*          	 you know _exactly_ what you are doing!!!             *
//*********************************************************************

#define MSGID_WEAPONLIST 78

new g_iszMuzzleKey;
new g_iszBeamKey;
new g_iszBeamKey2;

new g_iItemID;

#define IsCustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
#define IsCustomBeam(%0) (pev(%0, pev_impulse) == g_iszBeamKey)
#define IsCustomBeam2(%0) (pev(%0, pev_impulse) == g_iszBeamKey2)
#define IsCustomMuzzle(%0) (pev(%0, pev_impulse) == g_iszMuzzleKey)

public plugin_precache()
{
	Weapon_OnPrecache();
	
	g_iszBeamKey = engfunc(EngFunc_AllocString, BEAM_CLASSNAME);
	g_iszBeamKey2 = engfunc(EngFunc_AllocString, BEAM_CLASSNAME2);
	g_iszMuzzleKey = engfunc(EngFunc_AllocString, MUZZLE_CLASSNAME);

	#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_SetModel,					"FakeMeta_SetModel",		 false);
	register_forward(FM_UpdateClientData,				"FakeMeta_UpdateClientData_Post",true);
	register_forward(FM_Touch, 					"FakeMeta_Touch",		 false);
	
	RegisterHam(Ham_Think, 			"beam",			"HamHook_Think_Post", true);
	RegisterHam(Ham_Think, 			"info_target",		"HamHook_Think", false);
	RegisterHam(Ham_Think, 			"env_sprite",		"HamHook_Sprite_Think", false);
	
	// Weaponbox
	RegisterHam(Ham_Spawn, 			"weaponbox", 		"HamHook_Weaponbox_Spawn_Post", true);
	
	// Item (weapon) hooks
	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);
	RegisterHam(Ham_Weapon_SecondaryAttack,	WEAPON_REFERANCE, 	"HamHook_Item_SecondaryAttack",	false);
	
	//g_iItemID = zp_register_extra_item(ZP_ITEM_NAME, ZP_ITEM_COST, ZP_TEAM_HUMAN);
}

public zp_extra_item_selected(iPlayer, iItemid)
{
	if (iItemid == g_iItemID)
	{
		Weapon_Give(iPlayer);
	}
}

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

public NativeGiveWeapon(iPlayer)
{
	Weapon_Give(iPlayer);
}
		
//**********************************************
//* 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 iEntity, const iOther)
{
	if(!pev_valid(iEntity))
	{
		return FMRES_IGNORED;
	}
	
	static Classname[32];pev(iEntity, pev_classname, Classname, 31);
	static iAttacker; iAttacker = pev(iEntity, pev_owner);
	static Float:Origin[3];pev(iEntity, pev_origin, Origin);
	new pNull = FM_NULLENT;	
	
	if (equal(Classname, BALL_CLASSNAME))
	{
		if (engfunc(EngFunc_PointContents, Origin) == CONTENTS_SKY || engfunc(EngFunc_PointContents, Origin) == CONTENTS_WATER)
		{
			set_pev(iEntity, pev_flags, pev(iEntity, pev_flags) | FL_KILLME);
			return FMRES_SUPERCEDE;
		}
			
		if (!is_user_connected(iAttacker))
		{
			set_pev(iEntity, pev_flags, pev(iEntity, pev_flags) | FL_KILLME);
			return FMRES_IGNORED;
		}

		CreateExplosion(Origin, 10.0, iBlood[3], 10, 19, TE_EXPLFLAG_NOPARTICLES|TE_EXPLFLAG_NOSOUND);
		
		if(pev_valid(iOther) && !is_user_connected(iOther))
		{
			static szClassname[32];pev(iOther, pev_classname, szClassname, 31);
			if(equal(szClassname, "func_breakable") && (pev(iOther, pev_solid) != SOLID_NOT))
			{
				MDLL_USE(iOther, iEntity);
			}
		}

		while((pNull = fm_find_ent_in_sphere(pNull, Origin, WEAPON_BALL_RADIUS_EXP)) != 0)
		{
			if(IsValidPev(pNull) && pev(pNull, pev_takedamage) != DAMAGE_NO && pev(pNull, pev_solid) != SOLID_NOT)
			{
				if(is_user_connected(pNull)  && zp_get_user_zombie(pNull))
				{
					static Float:originV[3], Float:dist, Float:damage;
					pev(pNull, pev_origin, originV);
					
					message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
					write_byte(TE_BLOODSPRITE)
					WRITE_COORD(originV[0])
					WRITE_COORD(originV[1])
					WRITE_COORD(originV[2])
					write_short(iBlood[0])
					write_short(iBlood[1])
					write_byte(76)
					write_byte(15)
					message_end()
					
					new Float:vecViewAngle[3];pev(iAttacker, pev_v_angle, vecViewAngle);
					new Float:vecForward[3];angle_vector(vecViewAngle, ANGLEVECTOR_FORWARD, vecForward);
					CreateKnockBack(pNull, vecForward, WEAPON_BALL_EXP_KNOCKBACK);
					
					dist = get_distance_f(Origin, originV);
					damage = WEAPON_BALL_DAMAGE_EXP - (WEAPON_BALL_DAMAGE_EXP/WEAPON_BALL_DAMAGE_EXP) * dist;
					if(damage > 0.0)
					{
						ExecuteHamB(Ham_TakeDamage, pNull, iAttacker, iAttacker, damage, DMG_BURN);
					}
				}
			}
		}
	
		engfunc(EngFunc_EmitSound, iEntity, CHAN_WEAPON, SOUND_SHOOT_B_EXP, 0.9, ATTN_NORM, 0, PITCH_NORM);
	
		set_pev(iEntity, pev_flags, pev(iEntity, pev_flags) | FL_KILLME);
	}
	else if (equal(Classname, MISSILE_CLASSNAME))
	{
		if (is_user_alive(iOther))
		{
			if (zp_get_user_zombie(iOther) /*&& !RoundEend*/)
			{
				static Float:vOrigin[3];pev(iOther, 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(15)
				message_end()
				
				new Float:vecViewAngle[3];pev(iAttacker, pev_v_angle, vecViewAngle);
				new Float:vecForward[3];angle_vector(vecViewAngle, ANGLEVECTOR_FORWARD, vecForward);
				CreateKnockBack(iOther, vecForward, WEAPON_MISSILE_KNOCKBACK_TOUCH);
				
				ExecuteHamB(Ham_TakeDamage, iOther, iEntity, iAttacker, WEAPON_MISSILE_DAMAGE_TOUCH, DMG_BURN);
			}
		}
		else 
		{
			CreateExplosion(Origin, - 10.0, iBlood[6], 10, 18, TE_EXPLFLAG_NOPARTICLES|TE_EXPLFLAG_NOSOUND);
			
			if(pev_valid(iOther) && !is_user_connected(iOther))
			{
				static szClassname[32];pev(iOther, pev_classname, szClassname, 31);
				if(equal(szClassname, "func_breakable") && (pev(iOther, pev_solid) != SOLID_NOT))
				{
					MDLL_USE(iOther, iEntity);
				}
			}

			while((pNull = fm_find_ent_in_sphere(pNull, Origin, WEAPON_MISSILE_RADIUS_EXP)) != 0)
			{
				if(IsValidPev(pNull) && pev(pNull, pev_takedamage) != DAMAGE_NO && pev(pNull, pev_solid) != SOLID_NOT)
				{
					if(is_user_connected(pNull)  && zp_get_user_zombie(pNull))
					{
						static Float:originV[3], Float:dist, Float:damage;
						pev(pNull, pev_origin, originV);
						
						message_begin(MSG_BROADCAST, SVC_TEMPENTITY) 
						write_byte(TE_BLOODSPRITE)
						WRITE_COORD(originV[0])
						WRITE_COORD(originV[1])
						WRITE_COORD(originV[2])
						write_short(iBlood[0])
						write_short(iBlood[1])
						write_byte(76)
						write_byte(15)
						message_end()

						dist = get_distance_f(Origin, originV);
						damage = WEAPON_MISSILE_DAMAGE_EXP - (WEAPON_MISSILE_DAMAGE_EXP/WEAPON_MISSILE_DAMAGE_EXP) * dist;
						if(damage > 0.0)
						{
							ExecuteHamB(Ham_TakeDamage, pNull, iAttacker, iAttacker, damage, DMG_BURN);
						}
					}
				}
			}
			
			engfunc(EngFunc_EmitSound, iEntity, CHAN_WEAPON, SOUND_CHARGE_EXP, 0.9, ATTN_NORM, 0, PITCH_NORM);
			
			set_pev(iEntity, pev_movetype, MOVETYPE_NONE);
			set_pev(iEntity, pev_solid, SOLID_NOT);
			set_pev(iEntity, pev_iuser3, 0);
			set_pev(iEntity, pev_fuser2, get_gametime() + 3.0);
		}
	}
	
	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),	\
		get_pdata_int(%1, m_iChargeReady, extra_offset_weapon), \
		GetAmmoInventory(%2, PrimaryAmmoIndex(%1))		\
	) 

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_SecondaryAttack(const iItem)
{
	static iPlayer; 
	
	if (!CheckItem(iItem, iPlayer))
	{
		return HAM_IGNORED;
	}
	
	_call.SecondaryAttack(iItem, iPlayer);
	return HAM_SUPERCEDE;
}

public HamHook_Item_PostFrame(const iItem)
{
	static iPlayer;
	static iClip;
	
	if (!CheckItem(iItem, iPlayer))
	{
		return HAM_IGNORED;
	}
	
	iClip = get_pdata_int(iItem, m_iClip, extra_offset_weapon); 
	
	if (get_pdata_int(iItem, m_fInReload, extra_offset_weapon))
	{
		new iPrimaryAmmoIndex	= PrimaryAmmoIndex(iItem);
		new iAmmoPrimary	= GetAmmoInventory(iPlayer, iPrimaryAmmoIndex);
		new iAmount		= min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary);
		
		set_pdata_int(iItem, m_iClip, iClip + iAmount, extra_offset_weapon);
		set_pdata_int(iItem, m_fInReload, false, extra_offset_weapon);

		SetAmmoInventory(iPlayer, iPrimaryAmmoIndex, iAmmoPrimary - iAmount);
	}
	
	if (!(pev(iPlayer, pev_button) & IN_ATTACK2) && get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon) == 1)
	{	
		Weapon_SendAnim(iPlayer, ANIM_SHOOT_B);
			
		set_pdata_float(iItem, m_flTimeWeaponIdle, 0.6, extra_offset_weapon);
		set_pdata_float(iItem, m_flNextPrimaryAttack, 0.6, extra_offset_weapon);
		set_pdata_float(iItem, m_flNextSecondaryAttack, 0.6, extra_offset_weapon);
			
		engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_SHOOT_B, 0.9, ATTN_NORM, 0, PITCH_NORM);
		
		set_pdata_int(iItem, m_fInSuperBullets, 0, extra_offset_weapon);	

		set_pdata_int(iItem, m_iClip, max(iClip-5, 0), extra_offset_weapon);
		
		CreateBall(iPlayer);
	}
	
	if (!(pev(iPlayer, pev_button) & IN_ATTACK2) && get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon) == 2)
	{
		set_pdata_int(iItem, m_fInSuperBullets, get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon)+1, extra_offset_weapon);
	}

	return HAM_IGNORED;
}

public HamHook_Think_Post(const iBeam)
{
	if (IsValidPev(iBeam) && IsCustomBeam(iBeam) || IsCustomBeam2(iBeam))
	{
		set_pev(iBeam, pev_flags, FL_KILLME);
	}

	return HAM_IGNORED;
}	

public HamHook_Think(const iEntity)
{
	if(!pev_valid(iEntity))
	{
		return HAM_IGNORED;
	}
	
	static Classname[32];pev(iEntity, pev_classname, Classname, sizeof(Classname));
	
	if (equal(Classname, BALL_CLASSNAME))
	{
		static Float:iFrame;pev(iEntity, pev_frame, iFrame);
		
		if (iFrame >= 10.0)iFrame=0.0;
		
		iFrame += 0.75;
		
		set_pev(iEntity, pev_frame, iFrame);
		
		set_pev(iEntity, pev_nextthink, get_gametime() + 0.050);
	}
	else if (equal(Classname, MISSILE_CLASSNAME))
	{
		static Float:iAngles[3];pev(iEntity, pev_angles, iAngles);iAngles[2] = random_float(0.0, -180.0);set_pev(iEntity, pev_angles, iAngles);
		static Float:vAngle[3];pev(iEntity, pev_vuser2, vAngle);
		static Float:iStart[3];pev(iEntity, pev_vuser1, iStart);
		static Float:iEnd[3];pev(iEntity, pev_origin, iEnd);
		static pevVictim;pevVictim = -1
		
		CreateLine(iEntity, vAngle);
	
		if (pev(iEntity, pev_fuser2) && pev(iEntity, pev_fuser2) < get_gametime())
		{
			while((pevVictim = engfunc(EngFunc_FindEntityInSphere, pevVictim, iEnd, WEAPON_MISSILE_RADIUS2)) != 0 )
			{
				if (is_user_alive(pevVictim))
				{
					if (zp_get_user_zombie(pevVictim))
					{
						//if (iRound)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(14)
						message_end()
					
						ExecuteHamB(Ham_TakeDamage, pevVictim, iEntity, pev(iEntity, pev_owner), WEAPON_MISSILE_DAMAGE2, DMG_BURN);
					}
				}
			}
			
			engfunc(EngFunc_EmitSound, iEntity, CHAN_WEAPON, SOUND_CHARGE_EXP2, 0.9, ATTN_NORM, 0, PITCH_NORM);
			set_pev(iEntity, pev_iuser2, 1);
			set_pev(iEntity, pev_flags, FL_KILLME);
		}
		
		engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, iStart, 0);
		write_byte(TE_BEAMPOINTS);
		WRITE_COORD(iEnd[0]);
		WRITE_COORD(iEnd[1]);
		WRITE_COORD(iEnd[2]);
		WRITE_COORD(iStart[0]);
		WRITE_COORD(iStart[1]);
		WRITE_COORD(iStart[2]);
		write_short(iBlood[4]);
		write_byte(0);		// byte (starting frame) 
		write_byte(50);		// byte (frame rate in 0.1's) 
		write_byte(pev(iEntity, pev_iuser2) ? 25:1);		// byte (life in 0.1's) 
		write_byte(pev(iEntity, pev_iuser2) ? 200:100);		// byte (line width in 0.1's) 
		write_byte(0);		// byte (noise amplitude in 0.01's) 
		write_byte(200);		// byte,byte,byte (color) (R)
		write_byte(200);		// (G)
		write_byte(200);		// (B)
		write_byte(250);		// byte (brightness)
		write_byte(80);		// byte (scroll speed in 0.1's)
		message_end();

		set_pev(iEntity, pev_nextthink, get_gametime() + 0.090);
	}
	
	return HAM_IGNORED;
}

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_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();
}

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

#define Sprite_SetScale(%0,%1) set_pev(%0, pev_scale, %1)
#define Sprite_SetFramerate(%0,%1) set_pev(%0, pev_framerate, %1)

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 Weapon_MuzzleFlash(const iPlayer, const szMuzzleSprite[], const Float: flScale, const Float: flFramerate, const Float: vecColor[3], const Float: flBrightness)
{
	if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
	{
		return FM_NULLENT;
	}
	
	static iSprite, iszAllocStringCached;
	if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "env_sprite")))
	{
		iSprite = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
	}
	
	if (!IsValidPev(iSprite))
	{
		return FM_NULLENT;
	}
	
	set_pev(iSprite, pev_model, szMuzzleSprite);
	set_pev(iSprite, pev_spawnflags, SF_SPRITE_ONCE);
	
	set_pev(iSprite, pev_classname, MUZZLE_CLASSNAME);
	set_pev(iSprite, pev_impulse, g_iszMuzzleKey);
	set_pev(iSprite, pev_owner, iPlayer);

	set_pev(iSprite, pev_aiment, iPlayer);
	set_pev(iSprite, pev_body, 1);
	
	Sprite_SetTransparency(iSprite, kRenderTransAdd, vecColor, flBrightness);
	Sprite_SetFramerate(iSprite, flFramerate);
	Sprite_SetScale(iSprite, flScale);
	
	MDLL_Spawn(iSprite);

	return iSprite;
}

public HamHook_Sprite_Think(const iSprite)
{
	static Float:flFrame;
	
	if (!IsValidPev(iSprite) || !IsCustomMuzzle(iSprite))
	{
		return HAM_IGNORED;
	}
	
	if (pev(iSprite, pev_frame, flFrame) && ++flFrame - 1.0 < get_pdata_float(iSprite, 35, extra_offset_weapon))
	{
		set_pev(iSprite, pev_frame, flFrame);
		
		set_pev(iSprite, pev_nextthink, get_gametime() + 0.020);
		
		return HAM_SUPERCEDE;
	}

	set_pev(iSprite, pev_flags, FL_KILLME);
	return HAM_SUPERCEDE;
}


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 Weapon_DrawBeam(const iPlayer, const Float:vecStart[3], const Float:vecEnd[3])
{
	if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
	{
		return FM_NULLENT;
	}
	
	static iBeam; iBeam = Beam_Create(WEAPON_SPRITE_LINE3, BEAM_WEIGHT);

	if (!IsValidPev(iBeam))
	{
		return FM_NULLENT;
	}
	
	Beam_PointsInit(iBeam, vecStart, vecEnd);
	Beam_SetBrightness(iBeam, BEAM_BRIGHTNESS);
	Beam_SetScrollRate(iBeam, BEAM_SCROLLRATE);
	Beam_SetColor(iBeam, BEAM_COLOR);
	Beam_SetNoise(iBeam, BEAM_NOISE);
	
	set_pev(iBeam, pev_nextthink, get_gametime() + BEAM_LIFE);
	set_pev(iBeam, pev_classname, BEAM_CLASSNAME);
	set_pev(iBeam, pev_impulse, g_iszBeamKey);
	set_pev(iBeam, pev_owner, iPlayer);
	
	return iBeam;
}

stock Weapon_DrawBeam2(const iPlayer, const Float: vecEnd[3])
{
	if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
	{
		return FM_NULLENT;
	}
	
	static iBeam; iBeam = Beam_Create(WEAPON_SPRITE_LINE3, BEAM_WEIGHT);

	if (!IsValidPev(iBeam))
	{
		return FM_NULLENT;
	}
	
	Beam_PointEntInit(iBeam, vecEnd, iPlayer);
	Beam_SetEndAttachment(iBeam, 1);
	Beam_SetBrightness(iBeam, BEAM_BRIGHTNESS);
	Beam_SetScrollRate(iBeam, BEAM_SCROLLRATE);
	Beam_SetColor(iBeam, BEAM_COLOR);
	Beam_SetNoise(iBeam, BEAM_NOISE);
	
	set_pev(iBeam, pev_nextthink, get_gametime() + BEAM_LIFE);
	set_pev(iBeam, pev_classname, BEAM_CLASSNAME2);
	set_pev(iBeam, pev_impulse, g_iszBeamKey2);
	set_pev(iBeam, pev_owner, iPlayer);
	
	return iBeam;
}

stock CreateMissile(const iPlayer)
{
	if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
	{
		return;
	}
	
	static iszAllocStringCached;
	static pEntity;
	
	static Float:Origin[3];Get_Position(iPlayer, 15.0, 0.0, 0.0, Origin);
	static Float:VecEnd[3];Get_Position(iPlayer, 8096.0, 0.0, 0.0, VecEnd);
	
	static Float:vAngle[3];pev(iPlayer,pev_v_angle,vAngle);
	static Float:Angles[3];
	
	static Float:vecMins[3];vecMins[0] = -1.0;vecMins[1] = -1.0;vecMins[2] = -1.0;
	static Float:vecMaxs[3];vecMaxs[0] = 1.0;vecMaxs[1] = 1.0;vecMaxs[2] = 1.0;
	
	Angles[0] = 360.0 - vAngle[0];
	Angles[1] = vAngle[1];
	Angles[2] = vAngle[2];
	
	if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "info_target")))
	{
		pEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
	}
		
	if (pev_valid(pEntity))
	{
		set_pev(pEntity, pev_movetype, MOVETYPE_TOSS);
		set_pev(pEntity, pev_owner, iPlayer);
			
		SET_MODEL(pEntity, MODEL_MISSILE)
		SET_ORIGIN(pEntity, Origin)
	
		set_pev(pEntity, pev_classname, MISSILE_CLASSNAME);
		set_pev(pEntity, pev_solid, SOLID_TRIGGER);
		set_pev(pEntity, pev_angles, Angles);
		set_pev(pEntity, pev_gravity, 0.01);
		set_pev(pEntity, pev_vuser1, Origin);
		set_pev(pEntity, pev_vuser2, vAngle);
		set_pev(pEntity, pev_iuser2, 0);
		set_pev(pEntity, pev_iuser3, 1);
		engfunc(EngFunc_SetSize, pEntity, vecMins, vecMaxs); 
		set_pev(pEntity, pev_nextthink, get_gametime() + 0.01);
	
		static Float:Velocity[3];Get_Speed_Vector(Origin, VecEnd, 2000.0, Velocity);
		set_pev(pEntity, pev_velocity, Velocity);
	}
}

stock FindHullIntersection(const Float: vecSrc[3], &iTrace, const Float: vecMins[3], const Float: vecMaxs[3], const iEntity)
{
	new iTempTrace;
	
	new Float: flFraction;
	new Float: flThisDistance;
	
	new Float: vecEnd[3];
	new Float: vecEndPos[3];
	new Float: vecHullEnd[3];
	new Float: vecMinMaxs[2][3];
	
	new Float: flDistance = 999999.0;
	
	xs_vec_copy(vecMins, vecMinMaxs[0]);
	xs_vec_copy(vecMaxs, vecMinMaxs[1]);
	
	get_tr2(iTrace, TR_vecEndPos, vecHullEnd);
	
	xs_vec_sub(vecHullEnd, vecSrc, vecHullEnd);
	xs_vec_mul_scalar(vecHullEnd, 2.0, vecHullEnd);
	xs_vec_add(vecHullEnd, vecSrc, vecHullEnd);
	
	engfunc(EngFunc_TraceLine, vecSrc, vecHullEnd, DONT_IGNORE_MONSTERS, iEntity, (iTempTrace = create_tr2()));
	get_tr2(iTempTrace, TR_flFraction, flFraction);
	
	if (flFraction < 1.0)
	{
		free_tr2(iTrace);
		
		iTrace = iTempTrace;
		return;
	}
	
	for (new j, k, i = 0; i < 2; i++)
	{
		for (j = 0; j < 2; j++)
		{
			for (k = 0; k < 2; k++)
			{
				vecEnd[0] = vecHullEnd[0] + vecMinMaxs[i][0];
				vecEnd[1] = vecHullEnd[1] + vecMinMaxs[j][1];
				vecEnd[2] = vecHullEnd[2] + vecMinMaxs[k][2];
				
				engfunc(EngFunc_TraceLine, vecSrc, vecEnd, DONT_IGNORE_MONSTERS, iEntity, iTempTrace);
				get_tr2(iTempTrace, TR_flFraction, flFraction);
				
				if (flFraction < 1.0)
				{
					get_tr2(iTempTrace, TR_vecEndPos, vecEndPos);
					xs_vec_sub(vecEndPos, vecSrc, vecEndPos);
					
					if ((flThisDistance = xs_vec_len(vecEndPos)) < flDistance)
					{
						free_tr2(iTrace);
						
						iTrace = iTempTrace;
						flDistance = flThisDistance;
					}
				}
			}
		}
	}
}

stock CreateBall(const iPlayer)
{
	if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
	{
		return;
	}
	
	static iszAllocStringCached;
	static pEntity;
	static Float:iAngle[3];
	static Float:Origin[3];Get_Position(iPlayer, 15.0, 0.0, 0.0, Origin);
	static Float:VecEnd[3];Get_Position(iPlayer, 1024.0, 0.0, 0.0, VecEnd);
	
	if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "info_target")))
	{
		pEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
	}
		
	if (pev_valid(pEntity))
	{
		iAngle[2] = random_float(0.0, 360.0);

		set_pev(pEntity, pev_movetype, MOVETYPE_FLYMISSILE);
		set_pev(pEntity, pev_owner, iPlayer);
			
		SET_MODEL(pEntity, WEAPON_SPRITE_MISSILE)
		SET_ORIGIN(pEntity, Origin)
	
		set_pev(pEntity, pev_classname, BALL_CLASSNAME);
		set_pev(pEntity, pev_scale, 0.08);
		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_angles, iAngle);
		set_pev(pEntity, pev_nextthink, get_gametime() + 0.01);
	
		static Float:Velocity[3];
		Get_Speed_Vector(Origin, VecEnd, 2000.0, Velocity);
		set_pev(pEntity, pev_velocity, Velocity);
				
		Sprite_SetTransparency(pEntity, kRenderTransAdd, Float:{255.0,255.0,255.0}, 200.0);
	}
}

stock CreateLine(const iEntity, const Float:vAngle[3])
{
	static Float:iVec[2][3];pev(iEntity, pev_vuser1, iVec[1]);pev(iEntity, pev_origin, iVec[0]);
	static pevVictim;pevVictim=-1
	
	if (get_distance_f(iVec[0], iVec[1]) > 50.0)
	{
		static Float:iVec2[3];
		engfunc(EngFunc_MakeVectors, vAngle);
		global_get(glb_v_forward, vAngle);
		xs_vec_mul_scalar(vAngle, 25.0, iVec2);
			
		new iCount = floatround(get_distance_f(iVec[0], iVec[1]) / 20.0);
		
		while (iCount)
		{
			xs_vec_add(iVec[1], iVec2, iVec[1]);

			while((pevVictim = engfunc(EngFunc_FindEntityInSphere, pevVictim, iVec[1], 2.0)) != 0 )
			{
				if (is_user_alive(pevVictim))
				{
					if (zp_get_user_zombie(pevVictim))
					{
						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(13)
						message_end()
					
						ExecuteHamB(Ham_TakeDamage, pevVictim, iEntity, pev(iEntity, pev_owner), WEAPON_DAMAGE_LINE, DMG_BURN);
					}
				}
			}
			
			iCount--;
		}
	}
}

stock IsWallBetweenPoints(const Float: vecStart[3], const Float: vecEnd[3], PlayerEnt)
{
	static iTrace;iTrace = create_tr2();
	static Float: vecEndPos[3];
	engfunc(EngFunc_TraceLine, vecStart, vecEnd, IGNORE_MONSTERS, PlayerEnt, iTrace);
	get_tr2(iTrace, TR_vecEndPos, vecEndPos);
	free_tr2(iTrace);
	return floatround(get_distance_f(vecEnd, vecEndPos));
} 

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
}

stock CreateKnockBack(iPlayer, Float: vecDirection[3], Float:flKnockBack)
{
	static Float:vecVelocity[3]; pev(iPlayer, pev_velocity, vecVelocity);
	if(pev(iPlayer, pev_flags) & FL_DUCKING) flKnockBack *= 0.7;
	vecVelocity[0] = vecDirection[0] * 50.0 * flKnockBack;
	vecVelocity[1] = vecDirection[1] * 50.0 * flKnockBack;
	vecVelocity[2] = 50.0;
	set_pev(iPlayer, pev_velocity, vecVelocity);
}

stock CreateExplosion(const Float:Origin[3], const Float:CordZ = 0.0, const iModel, const iScale, const iFramerate, const iFlag)
{
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY); 
	write_byte(TE_EXPLOSION); 
	WRITE_COORD(Origin[0]); 
	WRITE_COORD(Origin[1]); 
	WRITE_COORD(Origin[2] - CordZ); 
	write_short(iModel);
	write_byte(iScale); 
	write_byte(iFramerate); 
	write_byte(iFlag); 
	message_end();
}

#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.                        *
//**********************************************

public Cmd_WeaponSelect(const iPlayer)
{
	engclient_cmd(iPlayer, WEAPON_REFERANCE);
	return PLUGIN_HANDLED;
}

public HamHook_Item_AddToPlayer(const iItem, const iPlayer)
{
	switch(pev(iItem, pev_impulse))
	{
		case 0: 
		{
			#if defined WPNLIST
			MsgHook_WeaponList(MSGID_WEAPONLIST, iItem, iPlayer);
			#endif
		}
		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();
	}
}

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

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

PRECACHE_SOUNDS_FROM_MODEL(const szModelPath[])
{
	new iFile;
	
	if ((iFile = fopen(szModelPath, "rt")))
	{
		new szSoundPath[64];
		
		new iNumSeq, iSeqIndex;
		new iEvent, iNumEvents, iEventIndex;
		
		fseek(iFile, 164, SEEK_SET);
		fread(iFile, iNumSeq, BLOCK_INT);
		fread(iFile, iSeqIndex, BLOCK_INT);
		
		for (new k, i = 0; i < iNumSeq; i++)
		{
			fseek(iFile, iSeqIndex + 48 + 176 * i, SEEK_SET);
			fread(iFile, iNumEvents, BLOCK_INT);
			fread(iFile, iEventIndex, BLOCK_INT);
			fseek(iFile, iEventIndex + 176 * i, SEEK_SET);

			for (k = 0; k < iNumEvents; k++)
			{
				fseek(iFile, iEventIndex + 4 + 76 * k, SEEK_SET);
				fread(iFile, iEvent, BLOCK_INT);
				fseek(iFile, 4, SEEK_CUR);
				
				if (iEvent != 5004)
				{
					continue;
				}

				fread_blocks(iFile, szSoundPath, 64, BLOCK_CHAR);
				
				if (strlen(szSoundPath))
				{
					strtolower(szSoundPath);
					PRECACHE_SOUND(szSoundPath);
				}
			}
		}
	}
	
	fclose(iFile);
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/

Link:
Linklerini gizle
Linki Kopyala