//assault rifles
#include "arifl/weapon_ins2akm"
#include "arifl/weapon_ins2m16a4"
#include "arifl/weapon_ins2stg44"
#include "arifl/weapon_ins2galil"
#include "arifl/weapon_ins2asval"
#include "arifl/weapon_ins2ak12"
#include "arifl/weapon_ins2f2000"
#include "arifl/weapon_ins2l85a2"
#include "arifl/weapon_ins2ak74"
#include "arifl/weapon_ins2m16a1"
//battle rifles
#include "brifl/weapon_ins2fnfal"
#include "brifl/weapon_ins2g3a3"
#include "brifl/weapon_ins2m14ebr"
#include "brifl/weapon_ins2fg42"
#include "brifl/weapon_ins2scarh"
//rifles
#include "rifle/weapon_ins2garand"
#include "rifle/weapon_ins2kar98k"
#include "rifle/weapon_ins2enfield"
//handguns
#include "handg/weapon_ins2usp"
#include "handg/weapon_ins2beretta"
//#include "handg/weapon_ins2c96"
#include "handg/weapon_ins2m29"
#include "handg/weapon_ins2deagle"
#include "handg/weapon_ins2m1911"
#include "handg/weapon_ins2glock17"
#include "handg/weapon_ins2makarov"
#include "handg/weapon_ins2webley"
#include "handg/weapon_ins2python"
//lmgs
#include "lmg/weapon_ins2rpk"
#include "lmg/weapon_ins2m249"
#include "lmg/weapon_ins2mg42"
#include "lmg/weapon_ins2lewis"
#include "lmg/weapon_ins2m60"
//explosives/launchers
#include "explo/weapon_ins2mk2"
#include "explo/weapon_ins2rpg7"
#include "explo/weapon_ins2law"
//#include "explo/weapon_ins2m2"
#include "explo/weapon_ins2stick"
#include "explo/weapon_ins2pzfaust"
#include "explo/weapon_ins2m79"
#include "explo/weapon_ins2pzschreck"
#include "explo/weapon_ins2at4"
#include "explo/weapon_ins2rgo"
//shotguns
#include "shotg/weapon_ins2m590"
#include "shotg/weapon_ins2m1014"
#include "shotg/weapon_ins2coach"
#include "shotg/weapon_ins2ithaca"
//#include "shotg/weapon_ins2ithacabot"
#include "shotg/weapon_ins2saiga12"
//smgs
#include "smg/weapon_ins2mp5k"
#include "smg/weapon_ins2ump45"
#include "smg/weapon_ins2mp40"
#include "smg/weapon_ins2ppsh41"
//#include "smg/weapon_ins2l2a3"
#include "smg/weapon_ins2m1928"
//#include "smg/weapon_ins2m1928BOT"
#include "smg/weapon_ins2mp7"
//#include "smg/weapon_ins2mp18"
#include "smg/weapon_ins2greasegun"
#include "smg/weapon_ins2mp5sd"
//carbines
#include "carbn/weapon_ins2sks"
#include "carbn/weapon_ins2m4a1"
#include "carbn/weapon_ins2mk18"
#include "carbn/weapon_ins2aks74u"
//#include "carbn/weapon_ins2c96carb"
#include "carbn/weapon_ins2m1a1para"
#include "carbn/weapon_ins2g36c"
//melees
//#include "melee/weapon_ins2kabar"
//#include "melee/weapon_ins2knuckles"
//#include "melee/weapon_ins2kukri"
//sniper rifles
#include "srifl/weapon_ins2dragunov"
#include "srifl/weapon_ins2mosin"
#include "srifl/weapon_ins2m40a1"
#include "srifl/weapon_ins2g43"
//ETC
#include "etc/weapon_hlmp5"
#include "etc/weapon_hlmp5c"
#include "etc/weapon_hlglock"
//#include "etc/weapon_hlshotgun"
//#include "etc/weapon_cofsyringe"
#include "etc/weapon_ofm249"
//#include "etc/weapon_ofsniperrifle"
//#include "etc/weapon_hlpython"
#include "etc/weapon_ofknife"
//#include "etc/weapon_hegrenade"
#include "etc/weapon_ofeagle"
#include "etc/weapon_asscan"
//#include "etc/item_ins2cash"
//#include "etc/item_cash5"
//#include "etc/item_cash10"
//#include "etc/item_cash20"
//#include "etc/item_cash30"
//#include "etc/item_cash40"
//#include "etc/item_cash50"
//#include "etc/item_cash100"
//#include "etc/item_cash1000"
//#include "etc/item_cash10000"
//#include "etc/item_cash16000"
#include "etc/weapon_tf2minigun"

void RegisterAll()
{
	//assault rifles
	INS2_AKM::Register();
	INS2_M16A4::Register();
	INS2_STG44::Register();
	INS2_GALIL::Register();
	INS2_ASVAL::Register();
	INS2_AK12::Register();
	INS2_F2000::Register();
	INS2_L85A2::Register();
	INS2_AK74::Register();
	INS2_M16A1::Register();
	//battle rifles
	INS2_FNFAL::Register();
	INS2_G3A3::Register();
	INS2_M14EBR::Register();
	INS2_FG42::Register();
	INS2_SCARH::Register();
	//rifles
	INS2_M1GARAND::Register();
	INS2_K98K::Register();
	INS2_ENFIELD::Register();
	//handguns
	INS2_USP::Register();
	INS2_M9BERETTA::Register();
	//INS2_C96::Register();
	INS2_M29::Register();
	INS2_DEAGLE::Register();
	INS2_M1911::Register();
	INS2_GLOCK17::Register();
	INS2_MAKAROV::Register();
	INS2_WEBLEY::Register();
	INS2_PYTHON::Register();
	//lmgs
	INS2_RPK::Register();
	INS2_M249::Register();
	INS2_MG42::Register();
	INS2_LEWIS::Register();
	INS2_M60::Register();
	//explosives/launchers
	INS2_MK2GRENADE::Register();
	INS2_RPG7::Register();
	INS2_LAW::Register();
	//INS2_M2FLAMETHROWER::Register();
	INS2_M24GRENADE::Register();
	INS2_PZFAUST::Register();
	INS2_M79::Register();
	INS2_PZSCHRECK::Register();
	INS2_AT4::Register();
	INS2_RGOGRENADE::Register();
	//shotguns
	INS2_M590::Register();
	INS2_M1014::Register();
	INS2_COACH::Register();
	INS2_ITHACA::Register();
	//INS2_ITHACABOT::Register();
	INS2_SAIGA12::Register();
	//smgs
	INS2_MP5K::Register();
	INS2_UMP45::Register();
	INS2_MP40::Register();
	INS2_PPSH41::Register();
	//INS2_STERLING::Register();
	INS2_MP7::Register();
	INS2_M1928::Register();
	//INS2_M1928BOT::Register();
	//INS2_MP18::Register();
	INS2_GREASEGUN::Register();
	INS2_MP5SD::Register();
	//carbines
	//INS2_C96CARBINE::Register();
	INS2_SKS::Register();
	INS2_M4A1::Register();
	INS2_MK18::Register();
	INS2_AKS74U::Register();
	INS2_M1A1PARA::Register();
	INS2_G36C::Register();
	//melees
	//INS2_KABAR::Register();
	//INS2_KNUCKLES::Register();
	//INS2_KUKRI::Register();
	//sniper rifles
	INS2_SVD::Register();
	INS2_MOSIN::Register();
	INS2_M40A1::Register();
	INS2_G43::Register();
	//ETC
	HLWanted_Gattlinggun::Register();
	//ITEM_INS2CASH::Register();
	//ITEM_MONEY5::Register();
	//ITEM_MONEY10::Register();
	//ITEM_MONEY20::Register();
	//ITEM_MONEY30::Register();
	//ITEM_MONEY40::Register();
	//ITEM_MONEY50::Register();
	//ITEM_MONEY100::Register();
	//ITEM_MONEY1000::Register();
	//ITEM_MONEY10000::Register();
	//ITEM_MONEY16000::Register();
	TF2Minigun::Register();
	RegisterHLMP5();
	RegisterHLMP5C();
	RegisterHLGLOCK();
	//RegisterHLShotgun();
	//RegisterCoFSYRINGE();
	RegisterOFM249();
	//RegisterOFSniper();
	//RegisterHLPYTHON();
	CEagle::Register();
	RegisterKnife();
	//CS16_HEGRENADE::Register();
}

class CBaseCustomWeapon : ScriptBasePlayerWeaponEntity
{
	// Possible workaround for the SendWeaponAnim() access violation crash.
	// According to R4to0 this seems to provide at least some improvement.
	// GeckoN: TODO: Remove this once the core issue is addressed.
	protected CBasePlayer@ m_pPlayer
	{
		get const { return cast<CBasePlayer@>( self.m_hPlayer.GetEntity() ); }
		set { self.m_hPlayer = EHandle( @value ); }
	}

	protected bool m_fDropped;
	CBasePlayerItem@ DropItem()
	{
		m_fDropped = true;
		return self;
	}

	void GetDefaultShellInfo( CBasePlayer@ pPlayer, Vector& out ShellVelocity,
		Vector& out ShellOrigin, float forwardScale, float rightScale, float upScale )
	{
		Vector vecForward, vecRight, vecUp;

		g_EngineFuncs.AngleVectors( pPlayer.pev.v_angle, vecForward, vecRight, vecUp );

		const float fR = Math.RandomFloat( 50, 70 );
		const float fU = Math.RandomFloat( 100, 150 );

		for( int i = 0; i < 3; ++i )
		{
			ShellVelocity[i] = pPlayer.pev.velocity[i] + vecRight[i] * fR + vecUp[i] * fU + vecForward[i] * 25;
			ShellOrigin[i]   = pPlayer.pev.origin[i] + pPlayer.pev.view_ofs[i] + vecUp[i] * upScale + vecForward[i] * forwardScale + vecRight[i] * rightScale;
		}
	}
}

void CS16GetDefaultShellInfo( CBasePlayer@ pPlayer, Vector& out ShellVelocity, Vector& out ShellOrigin, float forwardScale, float rightScale, float upScale, bool leftShell, bool downShell )
{  
	Vector vecForward, vecRight, vecUp;

	float fR;
	float fU;
	
	g_EngineFuncs.AngleVectors( pPlayer.pev.v_angle, vecForward, vecRight, vecUp );
	
	( leftShell == true ) ? fR = Math.RandomFloat( -70, -50 ) : fR = Math.RandomFloat( 50, 70 );
	( downShell == true ) ? fU = Math.RandomFloat( -150, -100 ) : fU = Math.RandomFloat( 100, 150 );
 
	for( int i = 0; i < 3; ++i )
	{
		ShellVelocity[i] = pPlayer.pev.velocity[i] + vecRight[i] * fR + vecUp[i] * fU + vecForward[i] * 25;
		ShellOrigin[i]   = pPlayer.pev.origin[i] + pPlayer.pev.view_ofs[i] + vecUp[i] * upScale + vecForward[i] * forwardScale + vecRight[i] * rightScale;
	}
}

void WW2DynamicTracer( Vector start, Vector end, NetworkMessageDest msgType = MSG_PVS, edict_t@ dest = null )
{
	NetworkMessage WW2DT( msgType, NetworkMessages::SVC_TEMPENTITY, dest );
		WW2DT.WriteByte( TE_TRACER );
		WW2DT.WriteCoord( start.x );
		WW2DT.WriteCoord( start.y );
		WW2DT.WriteCoord( start.z );
		WW2DT.WriteCoord( end.x );
		WW2DT.WriteCoord( end.y );
		WW2DT.WriteCoord( end.z );
	WW2DT.End();
}

void WW2DynamicLight( Vector vecPos, int radius, int r, int g, int b, int8 life, int decay )
{
	NetworkMessage WW2DL( MSG_PVS, NetworkMessages::SVC_TEMPENTITY );
		WW2DL.WriteByte( TE_DLIGHT );
		WW2DL.WriteCoord( vecPos.x );
		WW2DL.WriteCoord( vecPos.y );
		WW2DL.WriteCoord( vecPos.z );
		WW2DL.WriteByte( radius );
		WW2DL.WriteByte( int(r) );
		WW2DL.WriteByte( int(g) );
		WW2DL.WriteByte( int(b) );
		WW2DL.WriteByte( life );
		WW2DL.WriteByte( decay );
	WW2DL.End();
}