#include "weapons"
#include "CBaseDriveWeapon"
#include "agrunt"
#include "agruntf"
#include "pitdrone"
#include "strooper"
#include "hgrunt"
#include "gonome"
#include "fassn"
#include "enforcer"
#include "payne"
#include "kingpin"
#include "hwgrunt"
#include "hgrunt_opfor"
#include "garg"
#include "babygarg"
#include "bullsquid"
#include "bigmomma"
#include "islave"
#include "zombie"
#include "houndeye"
#include "securityguard"
#include "agruntf_classic"
//#include "levelchange_antirush"
//#include "miniondata"
//#include "monster_protector"
CCVar@ g_BotWeaponSpawnMode;
//dictionary g_PlayerMinions;
int m_iAgruntMuzzleFlash;
int m_iClassicShell;
int m_iShotgunShell;
int m_iShellNew;
int m_iShellSAW;
int m_iShockMuzzleFlash;
int m_iHornetPuff;
int m_iHornetTrail;
int m_iSquidSpitSprite;

array<string> Maps =
{
    "asmap00",
    "asmap00b",
    "asmap00c",
    "asmap00d",
    "asmap01",
    "asmap01b",
    "asmap01c",
    "asmap02",
    "asmap02b",
    "asmap02c",
    "asmap02d",
    "asmap03",
    "asmap03a",
    "asmap03b",
    "asmap03c",
    "asmap03d",
    "asmap03e",
    "asmap04",
    "asmap04b",
    "asmap04c",
    "asmap05",
    "asmap05b",
    "asmap05c",
    "asmap06",
    "asmap06b",
    "asmap06c",
    "asmap07",
    "asmap07b",
    "asmap07c",
    "asmap07y",
    "asmap08",
    "asmap08b",
    "asmap08c",
    "asmap08d",
    "asmap09",
    "asmap09b",
    "asmap09c",
    "asmap09d",
    "asmap09e",
    "asmap10",
    "asmap10b",
    "asmap10c",
    "asmap11",
    "asmap11b",
    "asmap11c",
    "sl_c01_a1",
    "sl_c01_a2",
    "sl_c02_a1",
    "sl_c02_a2",
    "sl_c03",
    "sl_c04",
    "sl_c05_a1",
    "sl_c05_a2",
    "sl_c05_a3",
    "sl_c06",
    "sl_c07_a1",
    "sl_c07_a2",
    "sl_c08_a1",
    "sl_c08_a2",
    "sl_c09",
    "sl_c10",
    "sl_c11_a1",
    "sl_c11_a2",
    "sl_c11_a3",
    "sl_c11_a4",
    "sl_c11_a5",
    "sl_c12",
    "sl_c13_a1",
    "sl_c13_a2",
    "sl_c13_a3",
    "sl_c13_a4",
    "sl_c14",
    "sl_c15",
    "sl_c16_a1",
    "sl_c16_a2",
    "sl_c16_a3",
    "sl_c16_a4",
    "sl_c17",
    "sl_c18",
    "th_after_event_v4_custom",
    "dy_accident1",
    "dy_accident2",
    "dy_alien",
    "dy_dampen",
    "dy_dorms",
    "dy_focus",
    "dy_fubar",
    "dy_hazard",
    "dy_lasers",
    "dy_outro",
    "dy_signal",
    "dy_uplink",
    "escape_series",
    "escape_series_1a",
    "escape_series_1b",
    "escape_series_2a",
    "escape_series_2b",
    "escape_series_2c",
    "escape_series_2d",
    "escape_series_2e",
    "escape_series_3a",
    "escape_series_3b",
    "escape_series_3c",
    "escape_series_3d",
    "escape_series_3e",
    "hl_c00",
    "hl_c01_a1",
    "hl_c01_a2",
    "hl_c02_a1",
    "hl_c02_a2",
    "hl_c03",
    "hl_c04",
    "hl_c05_a1",
    "hl_c05_a2",
    "hl_c05_a3",
    "hl_c06",
    "hl_c07_a1",
    "hl_c07_a2",
    "hl_c08_a1",
    "hl_c08_a2",
    "hl_c09",
    "hl_c10",
    "hl_c11_a1",
    "hl_c11_a2",
    "hl_c11_a3",
    "hl_c11_a4",
    "hl_c11_a5",
    "hl_c12",
    "hl_c13_a1",
    "hl_c13_a2",
    "hl_c13_a3",
    "hl_c13_a4",
    "hl_c14",
    "hl_c15",
    "hl_c16_a1",
    "hl_c16_a2",
    "hl_c16_a3",
    "hl_c16_a4",
    "hl_c17",
    "hl_c18",
    "of0a0",
    "of1a1",
    "of1a2",
    "of1a3",
    "of1a4",
    "of1a4b",
    "of1a5",
    "of1a5b",
    "of1a6",
    "of2a1",
    "of2a1b",
    "of2a2",
    "of2a3",
    "of2a4",
    "of2a5",
    "of2a6",
    "of3a1",
    "of3a1b",
    "of3a2",
    "of3a4",
    "of3a5",
    "of3a6",
    "of4a1",
    "of4a2",
    "of4a3",
    "of4a4",
    "of4a5",
    "of5a1",
    "of5a2",
    "of5a3",
    "of5a4",
    "of6a1",
    "of6a2",
    "of6a3",
    "of6a4",
    "of6a4b",
    "of6a5",
    "of7a0",
    "reo1_sw",
    "reco_v1d",
    "re1_sw",
    "th_ep1_00",
    "th_ep1_01",
    "th_ep1_02",
    "th_ep1_03",
    "th_ep1_04",
    "th_ep1_05",
    "th_ep2_00",
    "th_ep2_01",
    "th_ep2_02",
    "th_ep2_03",
    "th_ep2_04",
    "th_ep3_00",
    "th_ep3_01",
    "th_ep3_02",
    "th_ep3_03",
    "th_ep3_04",
    "th_ep3_05",
    "th_ep3_06",
    "th_ep3_07",
    "th_escape",
    "asmerged00",
    "asmerged01",
    "asmerged02",
    "asmerged03_1",
    "asmerged03_2",
    "asmerged03_3",
    "asmerged04_1",
    "asmerged04_2",
    "asmerged05_1",
    "asmerged05_2",
    "asmerged05_3",
    "asmerged06",
    "asmerged07",
    "asmerged08",
    "asmerged09",
    "asmerged10_1",
    "asmerged10_2",
    "asmerged11",
    "asmerged12",
    "aunit_1_sw",
    "aunit_2_sw",
    "aunit_3_sw",
    "aunit_4_sw",
    "aunit_5_sw",
    "echoes-0",
    "echoes-1",
    "echoes-10",
    "echoes-11",
    "echoes-12",
    "echoes-13",
    "echoes-14",
    "echoes-2",
    "echoes-3",
    "echoes-4",
    "echoes-5",
    "echoes-6_1",
    "echoes-7",
    "echoes-8",
    "echoes-9",
    "fi_c01_a1",
    "fi_c01_a2",
    "fi_c02_a1",
    "fi_c02_a2",
    "fi_c03_a1",
    "fi_c03_a2",
    "fi_c03_a3",
    "fi_c04_a1",
    "fi_c04_a2",
    "fi_c05_a1",
    "fi_c05_a2",
    "fi_c06_a1",
    "fi_c06_a2",
    "fi_c06_a3",
    "fi_c07_a1",
    "fi_c07_a2",
    "fi_c07_a3",
    "fi_c08_a1",
    "fi_c08_a2",
    "fi_c09_a1",
    "fi_c09_a2",
    "fi_c10_a1",
    "fi_c10_a2",
    "hr_dream10",
    "hr_dream11",
    "hr_dream2",
    "hr_dream3",
    "hr_dream4",
    "hr_dream5",
    "hr_dream6",
    "hr_dream7",
    "hr_dream8",
    "hr_dream9",
    "ns_escape_sw",
    "ops_club",
    "ops_credits",
    "ops_ctown",
    "ops_ep",
    "ops_escape",
    "ops_hq",
    "ops_industry",
    "ops_intro",
    "ops_jail",
    "ops_sewer",
    "ops_street",
    "ops_subway",
    "ops_wareh",
    "shl_0",
    "shl_1",
    "shl_2",
    "shl_3",
    "shl_4",
    "shl_5",
    "shl_6",
    "shl_7",
    "tb_mesa1r",
    "tb_mesa2",
    "tb_mesa3",
    "tb_mesa4",
    "tb_mesa5",
    "tb_mesa6",
    "urbicide_01",
    "urbicide_02",
    "urbicide_03",
    "urbicide_04",
    "urbicide_05",
    "urbicide_06",
    "urbicide_07",
    "urbicide_07b",
    "urbicide_08",
    "urbicide_09",
    "rede0",
    "rede1",
    "rede2",
    "rede3",
    "rede4",
    "rede5",
    "rede6",
    "rede6_1",
    "rede7",
    "rede8",
    "crimecity1d3",
    "crimecity2e1"
};

void PluginInit()
{
	g_Module.ScriptInfo.SetAuthor( "Sidewinder" );
	g_Module.ScriptInfo.SetContactInfo( "https://steamcommunity.com/id/tehsnek/" );
	@g_BotWeaponSpawnMode = CCVar( "bot_weapon", 0, "Modifies the weapon that RCBot respawns with", ConCommandFlag::AdminOnly );
	//g_Scheduler.SetInterval( "BroadcastMessage", 120.0, g_Scheduler.REPEAT_INFINITE_TIMES );
	g_Scheduler.SetInterval("RegenTickHP", 1.0, g_Scheduler.REPEAT_INFINITE_TIMES);
	g_Scheduler.SetInterval("RegenTickAP", 1.0, g_Scheduler.REPEAT_INFINITE_TIMES);
	g_Scheduler.SetInterval("RegenTickHPNPC", 3.0, g_Scheduler.REPEAT_INFINITE_TIMES);
	//g_Scheduler.SetInterval("RegenTickHealthKit", 1.0, g_Scheduler.REPEAT_INFINITE_TIMES);
	g_Scheduler.SetInterval("CheckPlayerMonsters", 1.0, g_Scheduler.REPEAT_INFINITE_TIMES);
	g_Scheduler.SetInterval("CheckPlayerWeapon", 0.5, g_Scheduler.REPEAT_INFINITE_TIMES);
	g_Scheduler.SetInterval("SetCvars2", 5.0, g_Scheduler.REPEAT_INFINITE_TIMES);
	//g_Scheduler.SetInterval("CheckTheSummons", 0.1f, g_Scheduler.REPEAT_INFINITE_TIMES);
	//g_Scheduler.SetInterval( "BroadcastMessage2", 180.0, g_Scheduler.REPEAT_INFINITE_TIMES );
}

void MapInit()
{
	m_iHornetPuff = g_Game.PrecacheModel( "sprites/muz1.spr" );
	m_iHornetTrail = g_Game.PrecacheModel( "sprites/laserbeam.spr" );
	m_iShellSAW = g_Game.PrecacheModel( "models/saw_shell.mdl" );
	m_iShellNew = g_Game.PrecacheModel( "models/shell.mdl" );
	m_iAgruntMuzzleFlash = g_Game.PrecacheModel( "sprites/muz4.spr" );
	m_iClassicShell = g_Game.PrecacheModel( "models/hlclassic/shell.mdl" );
	m_iShotgunShell = g_Game.PrecacheModel( "models/shotgunshell.mdl" );
	m_iShockMuzzleFlash = g_Game.PrecacheModel( "sprites/muzzle_shock.spr" );
	m_iSquidSpitSprite = g_Game.PrecacheModel( "sprites/tinyspit.spr" );
	g_Game.PrecacheModel( "models/npcspawner/kate_v2.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/kate_v3.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/agruntc.mdl" );	
	g_Game.PrecacheModel( "models/mapobjects/hivehornet.mdl" );
	g_Game.PrecacheModel( "sprites/npcspawner_new/640hud20.spr" );
	g_Game.PrecacheModel( "sprites/npcspawner_new/640hud21.spr" );
	g_Game.PrecacheModel( "models/hlclassic/bullsquid.mdl" );
	g_Game.PrecacheModel( "models/hivehand/p_hivehand.mdl" );
	g_Game.PrecacheModel( "models/hivehand/p_hivehandHD.mdl" );
	g_Game.PrecacheModel( "models/hivehand/v_hivehandNEW.mdl" );
	g_Game.PrecacheModel( "models/hivehand/v_hivehandHDv2.mdl" );
	g_Game.PrecacheModel( "models/hivehand/w_hivehand.mdl" );
	g_Game.PrecacheModel( "models/hivehand/w_hivehandHD.mdl" );
	g_Game.PrecacheModel( "models/hivehand/w_hivehandT.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/v_HGun.mdl" );
	g_Game.PrecacheGeneric( "sprites/hl_weapons/weapon_hivehand.txt" );
	g_Game.PrecacheGeneric( "sprites/hl_weapons/weapon_aghivehand.txt" );
	g_Game.PrecacheGeneric( "sprites/controlnpc/crosshairs.spr" );
	g_Game.PrecacheGeneric( "events/muzzle_hlmp5.txt" );
	g_Game.PrecacheGeneric( "events/muzzle_hlmp5c.txt" );
	g_Game.PrecacheGeneric( "events/muzzle_m727.txt" );
	g_Game.PrecacheModel( "models/hgruntf.mdl" );
	g_Game.PrecacheModel( "models/cnpc/pit_drone.mdl" );
	g_Game.PrecacheModel( "models/cnpc/hgrunt_medicf.mdl" );
	g_Game.PrecacheModel( "models/cnpc/hgrunt_torchf.mdl" );
	g_Game.PrecacheModel( "models/cnpc/cnpc_zombie_barney.mdl" );
	g_Game.PrecacheModel( "models/cnpc/cnpc_zombie_soldier.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/terrorist.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/l4d_zombie.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/tyrant.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/nemesis.mdl" );
	g_Game.PrecacheModel( "models/crimson/crimson.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/grunt.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/gruntf.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/hgruntf.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/opfor/ofgruntf.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/hgrunt_opfor.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/hgrunt.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/hgrunt_medic.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/gruntfT.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/gruntf01.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/gruntf02.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/gruntf03.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/gruntT.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/grunt01.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/grunt02.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/grunt03.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/hgrunt_opforT.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/hgruntT.mdl" );
	g_Game.PrecacheModel( "models/sandstone/ofhgrunte.mdl" );
	g_Game.PrecacheModel( "models/sandstone/rpggrunte.mdl" );
	g_Game.PrecacheModel( "models/sandstone/hwgrunte.mdl" );
	g_Game.PrecacheModel( "models/snd/medic_desert.mdl" );
	g_Game.PrecacheModel( "models/hwgruntf.mdl" );
	g_Game.PrecacheModel( "models/babygargf.mdl" );
	g_Game.PrecacheModel( "models/Torf.mdl" );
	g_Game.PrecacheModel( "models/hassassinf.mdl" );
	g_Game.PrecacheModel( "models/sentry.mdl" );
	g_Game.PrecacheModel( "models/fleshgibs.mdl" );
	g_Game.PrecacheModel( "models/kingpin.mdl" );
	g_Game.PrecacheModel( "models/chromegibs.mdl" );
	g_Game.PrecacheModel( "models/apachef.mdl" );
	g_Game.PrecacheModel( "models/ospreyf.mdl" );
	g_Game.PrecacheModel( "models/opfor/hgrunt_medicf.mdl" );
	g_Game.PrecacheModel( "models/opfor/barneyN.mdl" );
	g_Game.PrecacheModel( "models/crimecity/zombie.mdl" );
	g_Game.PrecacheGeneric( "models/crimecity/zombieT.mdl" );
	g_Game.PrecacheModel( "models/hgrunt_medicf.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/l4d_zombie.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/agrunt.mdl" );
	g_Game.PrecacheModel( "models/agruntf.mdl" );
	g_Game.PrecacheModel( "models/hassassinf.mdl" );
	g_Game.PrecacheModel( "models/fmassn.mdl" );
	g_Game.PrecacheModel( "models/fmassnv2.mdl" );
	g_Game.PrecacheModel( "models/fmassnf.mdl" );
	g_Game.PrecacheModel( "models/rgruntf.mdl" );
	g_Game.PrecacheModel( "models/massnf.mdl" );
	g_Game.PrecacheModel( "models/zombie_barney.mdl" );
	g_Game.PrecacheModel( "models/zombie_soldier.mdl" );
	g_Game.PrecacheModel( "models/opfor/gonome.mdl" );
	g_Game.PrecacheModel( "models/fortified/merkwurdig.mdl" );
	g_Game.PrecacheModel( "models/fortified/merkwurdig2.mdl" );
	g_Game.PrecacheModel( "models/fortified/merkwurdig3.mdl" );
	g_Game.PrecacheModel( "models/tu3sday/aa_alienmerc.mdl" );
	g_Game.PrecacheModel( "models/tu3sday/im_alienmerc.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/w_squeak.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/w_sqknest.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/w_sqknestt.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/w_squeakt.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/p_squeak.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/v_squeak.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/caution.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/sandbags.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/barrel_blue.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/barrel_metal.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/box.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/thewall.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/qk_moneybag.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/money.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/wallet.mdl" );
	g_Game.PrecacheModel( "models/player/RE_Hunk_Reworked_v2/RE_Hunk_Reworked_v2.mdl" );
	g_Game.PrecacheModel( "models/player/haydee/haydee.mdl" );
	g_Game.PrecacheModel( "models/player/nina/nina.mdl" );
	g_Game.PrecacheModel( "models/player/babewire_v2/babewire_v2.mdl" );
	g_Game.PrecacheModel( "models/player/babewire2/babewire2.mdl" );
	g_Game.PrecacheModel( "models/player/ultrakill_v1/ultrakill_v1.mdl" );
	g_Game.PrecacheModel( "models/player/ts_merc/ts_merc.mdl" );
	g_Game.PrecacheGeneric( "models/player/ts_merc/ts_merc.bmp" );
	g_Game.PrecacheModel( "models/player/ts_seal/ts_seal.mdl" );
	g_Game.PrecacheGeneric( "models/player/ts_seal/ts_seal.bmp" );
	g_Game.PrecacheModel( "models/player/ts_agent/ts_agent.mdl" );
	g_Game.PrecacheGeneric( "models/player/ts_agent/ts_agent.bmp" );
	g_Game.PrecacheModel( "models/player/ts_castor/ts_castor.mdl" );
	g_Game.PrecacheGeneric( "models/player/ts_castor/ts_castor.bmp" );
	g_Game.PrecacheModel( "models/player/ts_gordon/ts_gordon.mdl" );
	g_Game.PrecacheGeneric( "models/player/ts_gordon/ts_gordon.bmp" );
	g_Game.PrecacheModel( "models/player/ts_hitman/ts_hitman.mdl" );
	g_Game.PrecacheGeneric( "models/player/ts_hitman/ts_hitman.bmp" );
	g_Game.PrecacheModel( "models/player/ts_laurence/ts_laurence.mdl" );
	g_Game.PrecacheGeneric( "models/player/ts_laurence/ts_laurence.bmp" );
	g_Game.PrecacheModel( "models/player/STALKER_Bandit1/STALKER_Bandit1.mdl" );
	g_Game.PrecacheGeneric( "models/player/STALKER_Bandit1/STALKER_Bandit1.bmp" );
	g_Game.PrecacheModel( "models/player/STALKER_Bandit2/STALKER_Bandit2.mdl" );
	g_Game.PrecacheGeneric( "models/player/STALKER_Bandit2/STALKER_Bandit2.bmp" );
	g_Game.PrecacheModel( "models/player/gold_robo/gold_robo.mdl" );
	g_Game.PrecacheModel( "models/sandstone/backpack.mdl" );
	g_Game.PrecacheModel( "models/briefcase_money.mdl" );
	g_Game.PrecacheModel( "models/healthbot.mdl" );
	g_Game.PrecacheModel( "models/w_medkit.mdl" );
	g_Game.PrecacheModel( "models/snd/weaponbox.mdl" );
	g_Game.PrecacheModel( "models/opfor/ld/v_m40a1_new.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/p_m40a1.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/w_m40a1.mdl" );
	g_Game.PrecacheModel( "models/opfor/ld/v_357.mdl" );
	g_Game.PrecacheModel( "models/opfor/ld/v_hlshotgun.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/p_357.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/w_357.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/p_shotgun.mdl" );
	g_Game.PrecacheModel( "models/hlclassic/w_shotgun.mdl" );
	g_Game.PrecacheModel( "models/csripent/v_9mmar.mdl" );
	g_Game.PrecacheModel( "models/csripent/w_9mmar.mdl" );
	g_Game.PrecacheModel( "models/csripent/p_9mmar.mdl" );
	g_Game.PrecacheModel( "models/csripent/p_9mmhandgun.mdl" );
	g_Game.PrecacheModel( "models/csripent/v_9mmhandgun.mdl" );
	g_Game.PrecacheModel( "models/csripent/w_9mmhandgun.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/hassassin_uzi.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/hassassin_uziT.mdl" );
	g_Game.PrecacheModel( "models/player/islave/islave.mdl" );
	g_Game.PrecacheGeneric( "models/player/islave/islave.bmp" );
	g_Game.PrecacheGeneric( "models/player/nina/nina.bmp" );
	g_Game.PrecacheGeneric( "models/player/RE_Hunk_Reworked_v2/RE_Hunk_Reworked_v2.bmp" );
	g_Game.PrecacheGeneric( "models/player/babewire_v2/babewire_v2.bmp" );
	g_Game.PrecacheGeneric( "models/player/babewire2/babewire2.bmp" );
	g_Game.PrecacheGeneric( "models/player/ultrakill_v1/ultrakill_v1.bmp" );
	g_Game.PrecacheModel( "models/player/be_grunt_special_v2/be_grunt_special_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/be_grunt_special_v2/be_grunt_special_v2.bmp" );
	g_Game.PrecacheModel( "models/player/bodyguard_v2/bodyguard_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/bodyguard_v2/bodyguard_v2.bmp" );
	g_Game.PrecacheModel( "models/player/cl_suit_ld/cl_suit_ld.mdl" );
	g_Game.PrecacheGeneric( "models/player/cl_suit_ld/cl_suit_ld.bmp" );
	g_Game.PrecacheModel( "models/player/dr.carter_cool/dr.carter_cool.mdl" );
	g_Game.PrecacheModel( "models/player/gs_t45d_army/gs_t45d_army.mdl" );
	g_Game.PrecacheGeneric( "models/player/gs_t45d_army/gs_t45d_army.bmp" );
	g_Game.PrecacheModel( "models/player/hlhd_gruntf/hlhd_gruntf.mdl" );
	g_Game.PrecacheGeneric( "models/player/hlhd_gruntf/hlhd_gruntf.bmp" );
	g_Game.PrecacheModel( "models/player/hlhd_reconf/hlhd_reconf.mdl" );
	g_Game.PrecacheGeneric( "models/player/hlhd_reconf/hlhd_reconf.bmp" );
	g_Game.PrecacheModel( "models/player/hlhd_shotgunf/hlhd_shotgunf.mdl" );
	g_Game.PrecacheGeneric( "models/player/hlhd_shotgunf/hlhd_shotgunf.bmp" );
	g_Game.PrecacheModel( "models/player/opfor_balaclava2/opfor_balaclava2.mdl" );
	g_Game.PrecacheGeneric( "models/player/opfor_balaclava2/opfor_balaclava2.bmp" );
	g_Game.PrecacheModel( "models/player/opfor_grunt_v3/opfor_grunt_v3.mdl" );
	g_Game.PrecacheGeneric( "models/player/opfor_grunt_v3/opfor_grunt_v3.bmp" );
	g_Game.PrecacheModel( "models/player/opfor_major/opfor_major.mdl" );
	g_Game.PrecacheGeneric( "models/player/opfor_major/opfor_major.bmp" );
	g_Game.PrecacheModel( "models/player/opfor_medic_v3/opfor_medic_v3.mdl" );
	g_Game.PrecacheGeneric( "models/player/opfor_medic_v3/opfor_medic_v3.bmp" );
	g_Game.PrecacheModel( "models/player/opfor_saw_v3/opfor_saw_v3.mdl" );
	g_Game.PrecacheGeneric( "models/player/opfor_saw_v3/opfor_saw_v3.bmp" );
	g_Game.PrecacheModel( "models/player/opfor_torch_v3/opfor_torch_v3.mdl" );
	g_Game.PrecacheGeneric( "models/player/opfor_torch_v3/opfor_torch_v3.bmp" );
	g_Game.PrecacheModel( "models/player/rgrunt2_v2/rgrunt2_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/rgrunt2_v2/rgrunt2_v2.bmp" );
	g_Game.PrecacheModel( "models/player/opfor_hgrunt_v3/opfor_hgrunt_v3.mdl" );
	g_Game.PrecacheGeneric( "models/player/opfor_hgrunt_v3/opfor_hgrunt_v3.bmp" );
	g_Game.PrecacheModel( "models/player/robof/robof.mdl" );
	g_Game.PrecacheModel( "models/player/scientist_mad_01/scientist_mad_01.mdl" );
	g_Game.PrecacheGeneric( "models/player/scientist_mad_01/scientist_mad_01.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_captainf_v2/soldier_captainf_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_captainf_v2/soldier_captainf_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_commanderf2_v2/soldier_commanderf2_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_commanderf2_v2/soldier_commanderf2_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_hgruntf_v2/soldier_hgruntf_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_hgruntf_v2/soldier_hgruntf_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_hgruntf2_v2/soldier_hgruntf2_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_hgruntf2_v2/soldier_hgruntf2_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_majorf_v2/soldier_majorf_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_majorf_v2/soldier_majorf_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_medicf2_v2/soldier_medicf2_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_medicf2_v2/soldier_medicf2_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_mpf_v2/soldier_mpf_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_mpf_v2/soldier_mpf_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_reconf_v2/soldier_reconf_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_reconf_v2/soldier_reconf_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_regularf_v2/soldier_regularf_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_regularf_v2/soldier_regularf_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_robo_v2/soldier_robo_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_robo_v2/soldier_robo_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_sawf_v2/soldier_sawf_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_sawf_v2/soldier_sawf_v2.bmp" );
	g_Game.PrecacheModel( "models/player/opfor_hgrunt_v3/opfor_hgrunt_v3.mdl" );
	g_Game.PrecacheGeneric( "models/player/opfor_hgrunt_v3/opfor_hgrunt_v3.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_shotgunf2_v2/soldier_shotgunf2_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_shotgunf2_v2/soldier_shotgunf2_v2.bmp" );
	g_Game.PrecacheModel( "models/player/soldier_torchf_v2/soldier_torchf_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/soldier_torchf_v2/soldier_torchf_v2.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_alan/ahl_alan.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_alan/ahl_alan.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_algod/ahl_algod.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_algod/ahl_algod.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_angel/ahl_angel.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_angel/ahl_angel.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_arnie/ahl_arnie.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_arnie/ahl_arnie.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_benny/ahl_benny.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_benny/ahl_benny.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_chicken/ahl_chicken.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_chicken/ahl_chicken.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_chingamy/ahl_chingamy.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_chingamy/ahl_chingamy.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_costa/ahl_costa.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_costa/ahl_costa.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_dieter/ahl_dieter.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_dieter/ahl_dieter.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_drake/ahl_drake.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_drake/ahl_drake.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_drjones/ahl_drjones.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_drjones/ahl_drjones.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_eclipse/ahl_eclipse.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_eclipse/ahl_eclipse.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_ghostdog/ahl_ghostdog.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_ghostdog/ahl_ghostdog.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_hannie/ahl_hannie.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_hannie/ahl_hannie.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_harry/ahl_harry.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_harry/ahl_harry.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_henchman/ahl_henchman.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_henchman/ahl_henchman.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_HM/ahl_HM.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_HM/ahl_HM.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_hunter/ahl_hunter.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_hunter/ahl_hunter.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_ivan/ahl_ivan.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_ivan/ahl_ivan.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_jack/ahl_jack.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_jack/ahl_jack.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_jawb/ahl_jawb.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_jawb/ahl_jawb.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_jeff/ahl_jeff.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_jeff/ahl_jeff.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_junkie/ahl_junkie.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_junkie/ahl_junkie.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_kat/ahl_kat.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_kat/ahl_kat.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_kawada/ahl_kawada.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_kawada/ahl_kawada.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_ken/ahl_ken.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_ken/ahl_ken.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_killer/ahl_killer.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_killer/ahl_killer.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_knifer2k/ahl_knifer2k.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_knifer2k/ahl_knifer2k.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_knuckles/ahl_knuckles.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_knuckles/ahl_knuckles.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_ladydeath/ahl_ladydeath.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_ladydeath/ahl_ladydeath.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_laura/ahl_laura.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_laura/ahl_laura.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_liz/ahl_liz.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_liz/ahl_liz.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_loony/ahl_loony.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_loony/ahl_loony.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_luke/ahl_luke.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_luke/ahl_luke.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_maggie/ahl_maggie.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_maggie/ahl_maggie.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_malysa/ahl_malysa.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_malysa/ahl_malysa.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_mamimi/ahl_mamimi.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_mamimi/ahl_mamimi.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_master/ahl_master.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_master/ahl_master.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_mccauley/ahl_mccauley.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_mccauley/ahl_mccauley.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_mccauley2/ahl_mccauley2.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_mccauley2/ahl_mccauley2.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_mcclane/ahl_mcclane.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_mcclane/ahl_mcclane.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_meister/ahl_meister.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_meister/ahl_meister.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_misswong/ahl_misswong.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_misswong/ahl_misswong.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_natalie/ahl_natalie.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_natalie/ahl_natalie.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_noel/ahl_noel.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_noel/ahl_noel.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_nsi_swat/ahl_nsi_swat.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_nsi_swat/ahl_nsi_swat.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_o/ahl_o.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_o/ahl_o.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_o2/ahl_o2.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_o2/ahl_o2.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_pain/ahl_pain.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_pain/ahl_pain.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_pistolero/ahl_pistolero.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_pistolero/ahl_pistolero.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_resdog/ahl_resdog.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_resdog/ahl_resdog.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_roggesemmel/ahl_roggesemmel.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_roggesemmel/ahl_roggesemmel.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_saint/ahl_saint.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_saint/ahl_saint.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_sas/ahl_sas.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_sas/ahl_sas.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_shafted/ahl_shafted.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_shafted/ahl_shafted.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_snake/ahl_snake.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_snake/ahl_snake.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_stylez/ahl_stylez.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_stylez/ahl_stylez.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_suave/ahl_suave.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_suave/ahl_suave.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_susumu/ahl_susumu.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_susumu/ahl_susumu.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_t/ahl_t.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_t/ahl_t.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_tacteq/ahl_tacteq.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_tacteq/ahl_tacteq.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_tequila/ahl_tequila.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_tequila/ahl_tequila.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_the_fist/ahl_the_fist.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_the_fist/ahl_the_fist.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_the_one/ahl_the_one.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_the_one/ahl_the_one.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_tok/ahl_tok.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_tok/ahl_tok.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_vato/ahl_vato.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_vato/ahl_vato.bmp" );
	g_Game.PrecacheModel( "models/player/ahl_virii/ahl_virii.mdl" );
	g_Game.PrecacheGeneric( "models/player/ahl_virii/ahl_virii.bmp" );
	g_Game.PrecacheModel( "models/player/aniki_v2/aniki_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/aniki_v2/aniki_v2.bmp" );
	g_Game.PrecacheModel( "models/player/arctic/arctic.mdl" );
	g_Game.PrecacheGeneric( "models/player/arctic/arctic.bmp" );
	g_Game.PrecacheModel( "models/player/battery/battery.mdl" );
	g_Game.PrecacheGeneric( "models/player/battery/battery.bmp" );
	g_Game.PrecacheModel( "models/player/chair/chair.mdl" );
	g_Game.PrecacheGeneric( "models/player/chair/chair.bmp" );
	g_Game.PrecacheModel( "models/player/fassn7/fassn7.mdl" );
	g_Game.PrecacheGeneric( "models/player/fassn7/fassn7.bmp" );
	g_Game.PrecacheModel( "models/player/fassnf7/fassnf7.mdl" );
	g_Game.PrecacheGeneric( "models/player/fassnf7/fassnf7.bmp" );
	g_Game.PrecacheModel( "models/player/gign/gign.mdl" );
	g_Game.PrecacheGeneric( "models/player/gign/gign.bmp" );
	g_Game.PrecacheModel( "models/player/gsg9/gsg9.mdl" );
	g_Game.PrecacheGeneric( "models/player/gsg9/gsg9.bmp" );
	g_Game.PrecacheModel( "models/player/guerilla/guerilla.mdl" );
	g_Game.PrecacheGeneric( "models/player/guerilla/guerilla.bmp" );
	g_Game.PrecacheModel( "models/player/hitman_v2/hitman_v2.mdl" );
	g_Game.PrecacheGeneric( "models/player/hitman_v2/hitman_v2.bmp" );
	g_Game.PrecacheModel( "models/player/leet/leet.mdl" );
	g_Game.PrecacheGeneric( "models/player/leet/leet.bmp" );
	g_Game.PrecacheModel( "models/player/militia/militia.mdl" );
	g_Game.PrecacheGeneric( "models/player/militia/militia.bmp" );
	g_Game.PrecacheModel( "models/player/sas/sas.mdl" );
	g_Game.PrecacheGeneric( "models/player/sas/sas.bmp" );
	g_Game.PrecacheModel( "models/player/shephard_ld/shephard_ld.mdl" );
	g_Game.PrecacheGeneric( "models/player/shephard_ld/shephard_ld.bmp" );
	g_Game.PrecacheModel( "models/player/shephard_ld_grn/shephard_ld_grn.mdl" );
	g_Game.PrecacheGeneric( "models/player/shephard_ld_grn/shephard_ld_grn.bmp" );
	g_Game.PrecacheModel( "models/player/spetsnaz/spetsnaz.mdl" );
	g_Game.PrecacheGeneric( "models/player/spetsnaz/spetsnaz.bmp" );
	g_Game.PrecacheModel( "models/player/terror/terror.mdl" );
	g_Game.PrecacheGeneric( "models/player/terror/terror.bmp" );
	g_Game.PrecacheModel( "models/player/urban/urban.mdl" );
	g_Game.PrecacheGeneric( "models/player/urban/urban.bmp" );
	g_Game.PrecacheModel( "models/player/vip/vip.mdl" );
	g_Game.PrecacheGeneric( "models/player/vip/vip.bmp" );
	g_Game.PrecacheModel( "models/player/justislave_new/justislave_new.mdl" );
	g_Game.PrecacheGeneric( "models/player/justislave_new/justislave_new.bmp" );
	g_Game.PrecacheGeneric( "events/muzzle_m727.txt" );
	g_Game.PrecacheModel( "models/mapobjects/p_m727.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/w_m727.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/v_m727.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/p_g18-2.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/v_g18-2.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/p_g18.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/w_g18.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/v_g18.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/barney.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/otis.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/big_mom.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/bullsquid.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/garg.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/gonome.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/hgrunt.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/hgrunt_medic.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/hgrunt_opfor.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/islave.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/islavef.mdl" );
	g_Game.PrecacheModel( "models/npcspawner/strooper.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/otis01.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/otis02.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/otis03.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/hgrunt_opforT.mdl" );
	g_Game.PrecacheGeneric( "models/npcspawner/hgruntT.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/p_deagle.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/w_deagle.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/v_deagle.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/357anaconda/v_anaconda.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/357anaconda/w_anaconda.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/357anaconda/p_anaconda.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ak-101/p_ak101.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ak-101/w_ak101.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ak-101/v_ak101.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ak-101alt/p_ak101.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ak-101alt/w_ak101.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ak-101alt/v_ak101.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/benelli/p_benelli.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/benelli/w_benelli.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/benelli/v_benelli.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/cs16/p_m4.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/cs16/w_m4.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/cs16/v_m4_v2.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/cs16/p_m4m203.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/cs16/w_m4m203.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/cs16/v_m4m203.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/Eagle/p_deagle_black.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/Eagle/w_deagle_black.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/Eagle/v_deagle_black.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/Eagle/p_deagle_silver.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/Eagle/w_deagle_silver.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/Eagle/v_deagle_silver.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/glock18auto/p_g18.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/glock18auto/w_g18.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/glock18auto/v_g18_v2.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/hl2spas12/p_hl2shotgun.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/hl2spas12/w_hl2shotgun.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/hl2spas12/v_hl2shotgun.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m9bayonet/p_m9.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m9bayonet/w_m9.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m9bayonet/v_m9.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m9bayonetalt/p_m9.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m9bayonetalt/w_m9.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m9bayonetalt/v_m9.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m40a1/p_m40a1_new.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m40a1/w_m40a1_new.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m40a1/v_m40a1_new.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m40a1alt/p_m40a1_alt.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m40a1alt/w_m40a1_alt.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m40a1alt/v_m40a1_alt.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ragingbull/p_bull_black.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ragingbull/w_bull_black.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ragingbull/v_bull_black.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ragingbull/p_bull_silver.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ragingbull/w_bull_silver.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/ragingbull/v_bull_silver.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/remington/p_r870.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/remington/w_r870.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/remington/v_r870.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/r870/p_r870shotgun.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/r870/w_r870shotgun.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/r870/v_r870shotgun.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/sg552/p_sg.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/sg552/w_sg.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/sg552/v_sg.mdl" );
	g_Game.PrecacheGeneric( "models/mapobjects/weaponskins/sg552/w_sgt.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/tracker/p_tracker.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/tracker/w_tracker.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/tracker/v_tracker.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/usp/p_usp45.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/usp/w_usp45.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/usp/v_usp45.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/uspauto/p_uspauto.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/uspauto/w_uspauto.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/uspauto/v_uspauto_v2.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/p_beretta_camo.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/v_beretta_camo.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/w_beretta_camo.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/p_mp5_camo.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/v_mp5_camo.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/w_mp5_camo.mdl" );
	//g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/p_rlauncher_camo.mdl" );
	//g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/v_rlauncher_camo.mdl" );
	//g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/w_rlauncher_camo.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/p_spas_camo.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/v_spas_camo.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/camouflaged/w_spas_camo.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/gold/p_9mmAR_gold.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/gold/v_9mmAR_gold.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/gold/w_9mmAR_gold.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/gold/p_shotgun_gold.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/gold/v_shotgun_gold.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/gold/w_shotgun_gold.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/gold/p_m40a1_gold.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/gold/v_m40a1_gold.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/gold/w_m40a1_gold.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/spas12/p_shotgun_fstock.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/spas12/v_shotgun_fstock.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/spas12/w_shotgun_fstock.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/spas12/p_shotgun_nstock.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/spas12/v_shotgun_nstock.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/spas12/w_shotgun_nstock.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/spas12/p_shotgun_ustock.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/spas12/v_shotgun_ustock.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/spas12/w_shotgun_ustock.mdl" );
	g_Game.PrecacheModel( "models/opfor/v_desert_eagle.mdl" );
	g_Game.PrecacheModel( "models/v_hornetgun3.mdl" );
	g_Game.PrecacheModel( "models/p_hornetgun.mdl" );
	g_Game.PrecacheModel( "models/w_hornetgun.mdl" );
	g_Game.PrecacheModel( "models/adamr/weapons/gold357/v_gold357_op4.mdl" );
	g_Game.PrecacheModel( "models/adamr/weapons/gold357/p_gold357.mdl" );
	g_Game.PrecacheModel( "models/adamr/weapons/gold357/w_gold357.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/blaster/p_blaster.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/blaster/v_blaster.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/blaster/w_blaster.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/blaster/p_blaster2.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/blaster/v_blaster2.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/blaster/w_blaster2.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m4tactop/p_m4tactop.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m4tactop/v_m4tactop.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/m4tactop/w_m4tactop.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/g17/p_g17.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/g17/w_g17.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/g17/v_g17.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/g17/v_g17_v2.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/g17/p_g17s.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/g17/w_g17s.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/g17/v_g17s.mdl" );
	g_Game.PrecacheModel( "models/mapobjects/weaponskins/g17/v_g17s_v2.mdl" );

	g_SoundSystem.PrecacheSound( "hgrunt/gr_mgun2.wav" );
	g_SoundSystem.PrecacheSound( "weapons/generic_reload.wav" );
	g_SoundSystem.PrecacheSound( "misc/regen.wav" );
	g_SoundSystem.PrecacheSound( "ins2/purchase.wav" );
	g_SoundSystem.PrecacheSound( "weapons/de_clipin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/de_clipout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/de_deploy.wav" );
	g_SoundSystem.PrecacheSound( "weapons/de_sliderelease.wav" );
	g_SoundSystem.PrecacheSound( "weapons/deagle_magin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/deagle_magout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/deagle_slideforward.wav" );
	g_SoundSystem.PrecacheSound( "weapons/g18_akimbo_twirl.wav" );
	g_SoundSystem.PrecacheSound( "weapons/g18_grabmag.wav" );
	g_SoundSystem.PrecacheSound( "weapons/g18_magconnect.wav" );
	g_SoundSystem.PrecacheSound( "weapons/g18_magin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/g18_magout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/g18_slideback.wav" );
	g_SoundSystem.PrecacheSound( "weapons/g18_slideforward.wav" );
	g_SoundSystem.PrecacheSound( "weapons/g18_weapongrab.wav" );
	g_SoundSystem.PrecacheSound( "weapons/glock_magin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/glock_magout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/glock_slideforward.wav" );
	g_SoundSystem.PrecacheSound( "weapons/revolvers_bulletsin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/revolvers_rod.wav" );
	g_SoundSystem.PrecacheSound( "weapons/revolvers_wheelin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/revolvers_wheelout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sniper_boltback.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sniper_boltdown.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sniper_boltforward.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sniper_boltup.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sniper_deploy.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sniper_magin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sniper_maglock.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sniper_magout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sniper_magtap.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sti_draw.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sti_reloadempty.wav" );
	g_SoundSystem.PrecacheSound( "weapons/sti_reloadnotempty.wav" );
	g_SoundSystem.PrecacheSound( "weapons/ak-101/boltpull.wav" );
	g_SoundSystem.PrecacheSound( "weapons/ak-101/gp25_reload.wav" );
	g_SoundSystem.PrecacheSound( "weapons/ak-101/magin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/ak-101/magout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/CS_M4/m4a1_boltpull.wav" );
	g_SoundSystem.PrecacheSound( "weapons/CS_M4/m4a1_clipin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/CS_M4/m4a1_clipout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/CS_M4/m4a1_deploy.wav" );
	g_SoundSystem.PrecacheSound( "weapons/CS_M4/m4a1_draw.wav" );
	g_SoundSystem.PrecacheSound( "weapons/CS_M4/m16_charge.wav" );
	g_SoundSystem.PrecacheSound( "weapons/CS_M4/m16_draw.wav" );
	g_SoundSystem.PrecacheSound( "weapons/CS_M4/m16_magin_metallic.wav" );
	g_SoundSystem.PrecacheSound( "weapons/CS_M4/m16_magout_metallic.wav" );
	g_SoundSystem.PrecacheSound( "weapons/OTS-33/Magin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/OTS-33/Magout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/OTS-33/Slideback.wav" );
	g_SoundSystem.PrecacheSound( "weapons/OTS-33/Slideforward.wav" );
	g_SoundSystem.PrecacheSound( "hornet/ag_buzz1.wav" );
	g_SoundSystem.PrecacheSound( "hornet/ag_buzz2.wav" );
	g_SoundSystem.PrecacheSound( "hornet/ag_buzz3.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_idle1.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_idle2.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_idle3.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_idle4.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/claw_miss1.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/claw_miss2.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/claw_strike1.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/claw_strike2.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/claw_strike3.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_alert10.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_alert20.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_alert30.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_attack1.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_attack2.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_pain1.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_pain2.wav" );
	g_SoundSystem.PrecacheSound( "hunger/hungerzombie/zo_pain3.wav" );
	g_SoundSystem.PrecacheSound( "weapons/lmgg_clipout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/hg-deploy.wav" );
	g_SoundSystem.PrecacheSound( "weapons/lmgg_clipin.wav.wav" );
	g_SoundSystem.PrecacheSound( "weapons/lmgg_bolt.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m41a/boltpull.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m41a/magout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m41a/magin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m41a/boltpull.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m41a/pumpback.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m41a/pumpforth.wav" );
	g_SoundSystem.PrecacheSound( "weapons/radio_draw.wav" );
	g_SoundSystem.PrecacheSound( "weapons/radio_use.wav" );
	g_SoundSystem.PrecacheSound( "weapons/G17/magin1.wav" );
	g_SoundSystem.PrecacheSound( "weapons/G17/magout1.wav" );
	g_SoundSystem.PrecacheSound( "weapons/G17/slide_release1.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m4a1_boltpull.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m4a1_clipin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m4a1_clipout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/m4a1_deploy.wav" );
	g_SoundSystem.PrecacheSound( "weapons/draw.wav" );
	g_SoundSystem.PrecacheSound( "weapons/glock/clipout.wav" );
	g_SoundSystem.PrecacheSound( "weapons/glock/clipin.wav" );
	g_SoundSystem.PrecacheSound( "weapons/glock/slideback.wav" );

	//string szMapName = string(g_Engine.mapname);
	//if( szMapName == "snd" || szMapName == "desertcircle" || szMapName.Split( "_" )[0] == "th" )
	//{
		//AddToArray("ammo_357", "item_moneyrandom");
		//AddToArray("ammo_556", "item_moneyrandom");
		//AddToArray("ammo_762", "item_moneyrandom");
		//AddToArray("ammo_9mmAR", "item_moneyrandom");
		//AddToArray("ammo_9mmbox", "item_moneyrandom");
		//AddToArray("ammo_rpgclip", "item_moneyrandom");
		//AddToArray("ammo_9mmclip", "item_moneyrandom");
		//AddToArray("ammo_crossbow", "item_moneyrandom");
		//AddToArray("ammo_buckshot", "item_moneyrandom");
		//AddToArray("ammo_gaussclip", "item_moneyrandom");
		//AddToArray("ammo_sporeclip", "item_moneyrandom");
		//AddToArray("ammo_ARgrenades", "item_moneyrandom");
		//AddToArray("item_healthkit", "item_money10");
		//AddToArray("item_battery", "item_kevlar");

		//g_Hooks.RegisterHook( Hooks::Game::EntityCreated, @EntitySpawned );
	//}
	//else
	//{
	//	g_Hooks.RemoveHook( Hooks::Game::EntityCreated, @EntitySpawned );
	//}

	g_Hooks.RegisterHook( Hooks::Game::EntityCreated, @EntSpawned );
	//g_Hooks.RegisterHook( Hooks::Game::EntityCreated, @EntSpawned2 );
	g_Hooks.RegisterHook( Hooks::Player::ClientPutInServer, @CNPC::ClientPutInServer );
	g_Hooks.RegisterHook( Hooks::Player::PlayerKilled, @CNPC::PlayerKilled );
	g_Hooks.RegisterHook( Hooks::Player::PlayerTakeDamage, @CNPC::PlayerTakeDamage );
	g_Hooks.RegisterHook( Hooks::Player::PlayerSpawn, @PlayerSpawn2 );
	//g_Hooks.RegisterHook( Hooks::Game::MapChange, @MapChange );
	g_Hooks.RegisterHook( Hooks::Monster::MonsterTakeDamage, @MonsterTakeDamage );
	g_Hooks.RegisterHook( Hooks::PickupObject::Materialize, @PickupObjectMaterialize );
	g_Game.PrecacheOther( "monster_human_grunt_ally" );
	g_Game.PrecacheOther( "monster_human_medic_ally" );
	g_Game.PrecacheOther( "monster_alien_voltigore" );
	g_Game.PrecacheOther( "monster_alien_controller" );
	g_Game.PrecacheOther( "monster_human_assassin" );
	g_Game.PrecacheOther( "monster_male_assassin" );
	g_Game.PrecacheOther( "monster_babyheadcrab" );
	g_Game.PrecacheOther( "monster_shocktrooper" );
	g_Game.PrecacheOther( "monster_human_grunt" );
	g_Game.PrecacheOther( "monster_alien_slave" );
	g_Game.PrecacheOther( "monster_bullchicken" );
	g_Game.PrecacheOther( "monster_gargantua" );
	g_Game.PrecacheOther( "monster_robogrunt" );
	g_Game.PrecacheOther( "monster_bodyguard" );
	g_Game.PrecacheOther( "monster_alien_tor" );
	g_Game.PrecacheOther( "monster_bigmomma" );
	g_Game.PrecacheOther( "monster_pitdrone" );
	g_Game.PrecacheOther( "monster_babygarg" );
	g_Game.PrecacheOther( "monster_headcrab" );
	g_Game.PrecacheOther( "monster_houndeye" );
	g_Game.PrecacheOther( "monster_chumtoad" );
	g_Game.PrecacheOther( "monster_hwgrunt" );
	g_Game.PrecacheOther( "monster_kingpin" );
	g_Game.PrecacheOther( "monster_apache" );
	g_Game.PrecacheOther( "monster_gonome" );
	g_Game.PrecacheOther( "monster_barney" );
	g_Game.PrecacheOther( "monster_barniel" );
	g_Game.PrecacheOther( "monster_sentry" );
	g_Game.PrecacheOther( "monster_zombie" );
	g_Game.PrecacheOther( "monster_otis" );
	g_Game.PrecacheOther( "item_healthkit" );
	g_Game.PrecacheOther( "item_longjump" );
	g_Game.PrecacheOther( "hivehornetf2" );
	g_Game.PrecacheOther( "hivehornetf" );
	g_Game.PrecacheOther( "hivehornet" );

	cnpc_agrunt::Register();
	cnpc_agruntf::Register();
	cnpc_pitdrone::Register();
	cnpc_strooper::Register();
	cnpc_hgrunts::Register();
	cnpc_ofgrunt::Register();
	cnpc_fassn::Register();
	cnpc_kingpin::Register();
	cnpc_gonome::Register();
	cnpc_hwgrunt::Register();
	cnpc_enforcer::Register();
	cnpc_payne::Register();
	cnpc_garg::Register();
	cnpc_babygarg::Register();
	cnpc_bullsquid::Register();
	cnpc_bigmomma::Register();
	cnpc_islave::Register();
	cnpc_zombie::Register();
	cnpc_houndeye::Register();
	cnpc_securityguard::Register();
	cnpc_agruntfc::Register();
	RegisterHivehand();
	SetCvars2();
	//LEVELCHANGE_ANTIRUSH::Config();
	//MONSTERPROTECTOR::Activate( 3 );
	//g_Scheduler.SetInterval("SetCvars2", 5.0);
}

void MapStart()
{
	ReplaceEntites();

	CBaseEntity@ pChangeLevel;
	while( ( @pChangeLevel = g_EntityFuncs.FindEntityByClassname( pChangeLevel, "trigger_changelevel" ) ) !is null )
	{
		g_EntityFuncs.DispatchKeyValue( pChangeLevel.edict(), "keep_inventory", "1.0" );
	}
}

array<string> arrsCNPCWeapons =
{
	"weapon_headcrab",
	"weapon_houndeye",
	"weapon_pitdrone",
	"weapon_islave",
	"weapon_zombie",
	"weapon_bullsquid",
	"weapon_agrunt",
	"weapon_agruntf",
	"weapon_gonome",
	"weapon_strooper",
	"weapon_icky",
	"weapon_kingpin",
	"weapon_babygarg",
	"weapon_tentacle",
	"weapon_garg",
	"weapon_bigmomma",

	"weapon_gman",
	"weapon_fassn",
	"weapon_sentry",
	"weapon_mturret",
	"weapon_hgrunts",
	"weapon_ofgrunt",
	"weapon_rgrunt",
	"weapon_turret",
	"weapon_hwgrunt",
	"weapon_hwrgrunt",
	"weapon_apache",

	"weapon_scientist",
	"weapon_barney",
	"weapon_otis",
	"weapon_engineer",
	"weapon_houndeye",
	"weapon_securityguard",
	"weapon_agruntfc"
};

class arItems
{
	string SvenItems;
	string NewItems;
}

array<string> MaleModels =
{
	'ts_merc',
	'ts_seal',
	'ts_hitman',
	'ts_castor',
	'ts_laurence',
	'ts_gordon',
	'ts_agent',
	'STALKER_Bandit1',
	'STALKER_Bandit2'
};

array<string> MaleModelsExt =
{
	'player',
	'helmet',
	'gordon',
	'barney',
	'barney2',
	'scientist',
	'hevbarney',
	'hevbarney2',
	'hevscientist',
	'hevscientist2',
	'hevscientist3',
	'hevscientist4',
	'hevscientist5',
	'[USMC]1stLT_Helms',
	'[USMC]2ndLT_Wolfe',
	'[USMC]Capt_Bannon',
	'[USMC]Charms',
	'[USMC]Cpl_Eason',
	'[USMC]LCpl_Espinosa',
	'[USMC]LCpl_Hassan',
	'[USMC]LCpl_Kitagawa',
	'[USMC]LCpl_Kyle',
	'[USMC]LCpl_Massey',
	'[USMC]LCpl_Obrian',
	'[USMC]PFC_Fry',
	'[USMC]PFC_Montes',
	'[USMC]Sgt_Brady',
	'[USMC]SSgt_Nantz',
	'[USN]HM2_Wilkes',
	'[USN]HM3_Peterson',
	'HL_Construction',
	'HL_Grunt',
	'HL_Gus',
	'HL_Recon',
	'HL_Sarge',
	'HL_Shotgun',
	'ld_barney',
	'LD_barney2',
	'LD_gman',
	'ld_gordon',
	'LD_helmet',
	'LD_hevbarney',
	'LD_hevbarney2',
	'LD_hevscientist',
	'LD_hevscientist2',
	'LD_hevscientist3',
	'LD_hevscientist4',
	'LD_hevscientist5',
	'LD_hgrunt',
	'LD_HL_Construction',
	'LD_HL_Gus',
	'LD_OP4_Cigar',
	'LD_scientist',
	'LD_scientist2',
	'LD_scientist3',
	'LD_scientist4',
	'LD_scientist5',
	'LD_scientist6',
	'massn',
	'massn_black',
	'massn_blue',
	'massn_camo',
	'massn_green',
	'massn_grey',
	'massn_normal',
	'massn_nvg',
	'massn_red',
	'massn_yell',
	'OP4_Cigar',
	'OP4_Grunt',
	'OP4_Grunt2',
	'OP4_Heavy',
	'OP4_Lance',
	'OP4_Medic',
	'OP4_Medic2',
	'OP4_MP',
	'OP4_MP2',
	'OP4_MPG',
	'OP4_MPG2',
	'OP4_Recon',
	'OP4_Recon2',
	'OP4_Rocket',
	'OP4_Rocket2',
	'OP4_Scientist_Einstein',
	'OP4_Scientist_Luther',
	'OP4_Scientist_Slick',
	'OP4_Scientist_Walter',
	'OP4_Shephard',
	'OP4_Shotgun',
	'OP4_Shotgun2',
	'OP4_Sniper',
	'OP4_Sniper2',
	'OP4_Torch',
	'OP4_Torch2',
	'OP4_Tower',
	'OP4_Tower2',
	'otis',
	'otis_hev1',
	'RE_DEAD_Brad',
	'RE_HCF_Wesker',
	'RE_Outbreak_David',
	'RE_RPD_Leon',
	'RE_STARS_Barry',
	'RE_STARS_Brad',
	'RE_STARS_Chris',
	'RE_STARS_Enrico',
	'RE_STARS_Forrest',
	'RE_STARS_Joseph',
	'RE_STARS_Kenneth',
	'RE_STARS_Richard',
	'RE_STARS_Wesker',
	'RE_UBCS_Asian',
	'RE_UBCS_Black',
	'RE_UBCS_Hispanic',
	'RE_UBCS_Mikhail',
	'RE_UBCS_Militia',
	'RE_UBCS_Nicholai',
	'RE_UBCS_White',
	'RE_UMBRELLA_Alfred',
	'RE_UMBRELLA_Hunk',
	'th_cook',
	'th_dave',
	'th_einar',
	'th_einstein',
	'th_gangster',
	'th_host',
	'th_host_sd',
	'th_jack',
	'th_neil',
	'th_nypdcop',
	'th_orderly',
	'th_patient',
	'th_paul',
	'th_slick',
	'th_worker',
	'boris',
	'beret',
	'cannibal',
	'BS_Unarmored_Barney_1',
	'BS_Unarmored_Barney_2',
	'cap_BS_Unarmored_1',
	'cap_BS_Unarmored_2',
	'cap_HL_Construction',
	'cap_HL_Construction_2',
	'cap_HL_Gus',
	'cap_kate',
	'cap_OP4_Cigar',
	'cap_OP4_Grunt',
	'cap_OP4_Recon',
	'cap_OP4_Shephard',
	'cap_OP4_Shotgun',
	'cap_OP4_Tower',
	'cap_OP4_Walter',
	'cap_otis',
	'betagordon',
	'betagordonhd',
	'dm_barney',
	'dm_gordon',
	'dm_helmet',
	'duke',
	'gman',
	'gman_hd',
	'grunt',
	'Leon_S._Kennedy',
	'madscientist',
	'military_police',
	'militia',
	'punisher',
	'recon',
	'shephard',
	'shephard_ld',
	'Steel',
	'tower',
	'maggotusa',
	'supermanrage_v2',
	'th_protagonist',
	'th_grunt2',
	'etac',
	'kermit',
	'security_wheelchair',
	'sas',
	'urban',
	'gign',
	'gsg9',
	'spetsnaz',
	'leet',
	'guerilla',
	'terror',
	'militia',
	'vip'
};

array<string> FemaleModels =
{
	'gina',
	'barniel',
	'cap_barniel',
	'kate',
	'fassn',
	'[USMC]LCpl_Espinosa',
	'[USMC]Cpl_Berger',
	'[USMC]LCpl_Ikazaki',
	'[USMC]LCpl_Smith',
	'[USMC]Maj_Shepard',
	'[USMC]PFC_Soucy',
	'[USMC]Sgt_Caul',
	'RE_STARS_Jill',
	'RE_STARS_Rebecca',
	'codename_natasha',
	'colette',
	'haydee',
	'th_nurse',
	'OW_tracer',
	'selene',
	'selene2',
	'touhou_chen_v2',
	'babewire_v2',
	'babewire2',
	'nina',
	'fassn7',
	'fassnf7'
};

array<string> RobotModels =
{
	'robo',
	'gold_robo',
	'robof',
	'rgrunt2_v2',
	'rgrunt',
	'soldier_robo_v2',
	'ultrakill_v1',
	'battery'
};

//The variables
float m_flRemove;
array<EHandle> m_hMinions;
array<arItems@> g_ItemsReplacer; 
array<Vector> g_OldItemPos;
const float Frame2Delay = 2 / 30;
bool m_bIsActive = false;
bool m_bCanScramble = false;
const float flModelToGameSpeedModifier = 1.650124131504528; //gotten from player maxspeed (270) divided by player model speed (163.624054)

array<EHandle>@ GetMinions()
{
	return m_hMinions; 
}

void BroadcastMessage()
{
	g_PlayerFuncs.ClientPrintAll( HUD_PRINTTALK, "[Help] Say .help to view available commands.\n" );
}

void BroadcastMessage2()
{
	g_PlayerFuncs.ClientPrintAll( HUD_PRINTTALK, "[Event] Cash earned is doubled this weekend!\n" );
}

void SetCvars()
{
	g_EngineFuncs.CVarSetFloat( "sk_monster_head", 10 );
	g_EngineFuncs.CVarSetFloat( "sk_player_head", 1 );
	g_EngineFuncs.CVarSetFloat( "sk_player_chest", 1 );
	g_EngineFuncs.CVarSetFloat( "sk_player_stomach", 1 );
	g_EngineFuncs.CVarSetFloat( "sk_player_leg", 1 );
	g_EngineFuncs.CVarSetFloat( "sk_player_arm", 1 );
	g_EngineFuncs.CVarSetFloat( "mp_weapon_droprules", 0 );
	g_EngineFuncs.CVarSetFloat( "mp_ammo_droprules", 0 );
	g_EngineFuncs.CVarSetFloat( "mp_weaponfadedelay", 60 );

	/*if( g_EngineFuncs.CVarGetFloat( "sk_monster_head" ) != 10 )
	{
		g_EngineFuncs.CVarSetFloat( "sk_monster_head", 10 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "sk_player_head" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "sk_player_head", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "sk_player_chest" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "sk_player_chest", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "sk_player_leg" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "sk_player_leg", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "sk_player_arm" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "sk_player_arm", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_weapon_droprules" ) != 0 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_weapon_droprules", 0 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_ammo_droprules" ) != 0 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_ammo_droprules", 0 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_weaponfadedelay" ) != 60 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_weaponfadedelay", 60 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_item_respawndelay" ) != 10 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_item_respawndelay", 10 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_ammo_respawndelay" ) != 10 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_ammo_respawndelay", 10 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_weaponstay" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_weaponstay", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_npckill" ) != 2 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_npckill", 2 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_banana" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_banana", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_grapple_mode" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_grapple_mode", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_barnacle_paralyze" ) != 0 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_barnacle_paralyze", 0 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_flashlight" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_flashlight", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_timelimit" ) != 0 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_timelimit", 0 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_telefrag" ) != 0 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_telefrag", 0 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "skill" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "skill", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_disable_pcbalancing" ) != 1 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_disable_pcbalancing", 1 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_disable_medkit_points" ) != 0 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_disable_medkit_points", 0 );
	}
	else if( g_EngineFuncs.CVarGetFloat( "mp_disable_player_rappel" ) != 0 )
	{
		g_EngineFuncs.CVarSetFloat( "mp_disable_player_rappel", 0 );
	}*/
}

void SetCvars2()
{
	string szMapName = string(g_Engine.mapname);
	g_EngineFuncs.CVarSetFloat( "sk_monster_head", 4 );
	g_EngineFuncs.CVarSetFloat( "sk_player_head", 1 );
	g_EngineFuncs.CVarSetFloat( "sk_player_chest", 1 );
	g_EngineFuncs.CVarSetFloat( "sk_player_stomach", 1 );
	g_EngineFuncs.CVarSetFloat( "sk_player_leg", 1 );
	g_EngineFuncs.CVarSetFloat( "sk_player_arm", 1 );
	g_EngineFuncs.CVarSetFloat( "mp_weapon_droprules", 0 );
	g_EngineFuncs.CVarSetFloat( "mp_ammo_droprules", 0 );
	g_EngineFuncs.CVarSetFloat( "mp_weaponfadedelay", 60 );
	g_EngineFuncs.CVarSetFloat( "mp_item_respawndelay", 10 );
	g_EngineFuncs.CVarSetFloat( "mp_ammo_respawndelay", 10 );
	g_EngineFuncs.CVarSetFloat( "mp_allowmonsterinfo", 1 );
	g_EngineFuncs.CVarSetFloat( "mp_weaponstay", 1 );
	g_EngineFuncs.CVarSetFloat( "mp_npckill", 2 );
	g_EngineFuncs.CVarSetFloat( "mp_banana", 1 );
	g_EngineFuncs.CVarSetFloat( "mp_grapple_mode", 1 );
	g_EngineFuncs.CVarSetFloat( "mp_barnacle_paralyze", 0 );
	g_EngineFuncs.CVarSetFloat( "mp_flashlight", 1 );
	if( szMapName != "sc_decision_r3_sw" )
	{
		g_EngineFuncs.CVarSetFloat( "mp_timelimit", 0 );
	}
	g_EngineFuncs.CVarSetFloat( "mp_telefrag", 0 );
	g_EngineFuncs.CVarSetFloat( "skill", 1 );
	g_EngineFuncs.CVarSetFloat( "mp_disable_pcbalancing", 1 );
	g_EngineFuncs.CVarSetFloat( "mp_disable_medkit_points", 0 );
	g_EngineFuncs.CVarSetFloat( "mp_disable_player_rappel", 0 );

	/*string szMapName = string(g_Engine.mapname);
	if( szMapName != "ns_escape" || szMapName != "th_escape" || szMapName != "reo1" || szMapName != "re1" || szMapName.Split( "_" )[0] != "hl" || szMapName.Split( "_" )[0] != "sl" || szMapName.Split( "_" )[0] != "hr" 
	|| szMapName.Split( "_" )[0] != "th" 
	|| szMapName.Split( "_" )[0] != "cad" )
	{
		g_EngineFuncs.ServerCommand( "as_command npc_dropitems.drop_mode 1" );
	}
	else
	{
		g_EngineFuncs.ServerCommand( "as_command npc_dropitems.drop_mode 0" );
	}*/
}

void CheckPlayerHornets()
{
	const int iMaxPlayers = g_Engine.maxClients;
	for (int i = 1; i <= iMaxPlayers; ++i)
	{   
		CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
		if ( pPlayer !is null && pPlayer.IsAlive() )
		{
			if( pPlayer.m_rgAmmo( g_PlayerFuncs.GetAmmoIndex("hornets") ) > 7 )
			{
				pPlayer.m_rgAmmo( g_PlayerFuncs.GetAmmoIndex("hornets"), 7 );
			}
		}
	}
}

void CheckPlayerMonsters()
{
	//CBaseEntity@ pEntity = null;
	//while ( ( @pEntity = g_EntityFuncs.FindEntityByTargetname( pEntity, "summonedally" ) ) !is null )

	CBaseEntity@ pEntity;
	while( ( @pEntity = g_EntityFuncs.FindEntityByString( pEntity, "netname", "summonedally" ) ) !is null )
	{
		CBaseEntity@ pOwner = g_EntityFuncs.Instance( pEntity.pev.euser4 );

		if( pOwner !is null )
		{
			if( pEntity.pev.frags > 0 )
			{
				pOwner.pev.frags += 1;
				pEntity.pev.frags -= 1;
			}
		}
	}
	while( ( @pEntity = g_EntityFuncs.FindEntityByString( pEntity, "netname", "summonedallyt2" ) ) !is null )
	{
		CBaseEntity@ pOwner = g_EntityFuncs.Instance( pEntity.pev.euser4 );

		if( pOwner !is null )
		{
			if( pEntity.pev.frags > 0 )
			{
				pOwner.pev.frags += 1;
				pEntity.pev.frags -= 1;
			}
		}
	}
}

void RegenTickHP()
{   
	const int iMaxPlayers = g_Engine.maxClients;
	for (int i = 1; i <= iMaxPlayers; ++i)
	{   
		CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
		if ( pPlayer !is null && pPlayer.IsAlive() )
		{
			string szMapName = string(g_Engine.mapname);
			if( Maps.find( szMapName ) >= 0 )
			{
				return;
			}

			if( pPlayer.pev.health < pPlayer.pev.max_health && (pPlayer.pev.effects & EF_NODRAW) != EF_NODRAW )
			{
				pPlayer.pev.health += 1;
			}
		}
	}
}

void RegenTickAP()
{   
	const int iMaxPlayers = g_Engine.maxClients;
	for (int i = 1; i <= iMaxPlayers; ++i)
	{   
		CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
		if ( pPlayer !is null && pPlayer.IsAlive() )
		{
			if( pPlayer.pev.armortype > 9 && pPlayer.pev.armorvalue < 10 )
			{
				pPlayer.pev.armorvalue += 1;
			}
		}
	}
}

void RegenTickHPNPC()
{
	//CBaseEntity@ pEntity = null;
	//while ( ( @pEntity = g_EntityFuncs.FindEntityByTargetname( pEntity, "summonedally" ) ) !is null )

	CBaseEntity@ pEntity;
	while( ( @pEntity = g_EntityFuncs.FindEntityByString( pEntity, "netname", "summonedally" ) ) !is null )
	{
		if( pEntity !is null && pEntity.IsAlive() && pEntity.IsMonster() && pEntity.pev.health < pEntity.pev.max_health )
		{
			pEntity.pev.health += 25;
			if( pEntity.pev.health > pEntity.pev.max_health )
			{
				pEntity.pev.health = pEntity.pev.max_health;
			}

			g_SoundSystem.EmitSoundDyn( pEntity.edict(), CHAN_ITEM, "misc/regen.wav", 0.4, ATTN_NORM, 0, PITCH_NORM );
		}
	}
	while( ( @pEntity = g_EntityFuncs.FindEntityByString( pEntity, "netname", "summonedallyt2" ) ) !is null )
	{
		if( pEntity !is null && pEntity.IsAlive() && pEntity.IsMonster() && pEntity.pev.health < pEntity.pev.max_health )
		{
			pEntity.pev.health += 50;
			if( pEntity.pev.health > pEntity.pev.max_health )
			{
				pEntity.pev.health = pEntity.pev.max_health;
			}

			g_SoundSystem.EmitSoundDyn( pEntity.edict(), CHAN_ITEM, "misc/regen.wav", 0.4, ATTN_NORM, 0, PITCH_NORM );
		}
	}
}

void RegenTickHealthKit()
{   
	const int iMaxPlayers = g_Engine.maxClients;
	for (int i = 1; i <= iMaxPlayers; ++i)
	{   
		CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
		if ( pPlayer !is null && pPlayer.IsAlive() )
		{
			CBasePlayerWeapon@ pWeapon = cast<CBasePlayerWeapon@>( pPlayer.m_hActiveItem.GetEntity() );

			if( pWeapon !is null && pPlayer.m_hActiveItem.GetEntity().GetClassname() == "weapon_medkit" )
			{
				if( pPlayer.pev.health < pPlayer.pev.max_health )
				{
					pPlayer.pev.health += 1;
				}
			}
		}
	}
}

void CheckPlayerWeapon()
{
	string szMapName = string(g_Engine.mapname);
	const int iMaxPlayers = g_Engine.maxClients;
	for (int i = 1; i <= iMaxPlayers; ++i)
	{   
		CBasePlayer@ pPlayer = g_PlayerFuncs.FindPlayerByIndex(i);
		if ( pPlayer !is null && pPlayer.IsAlive() )
		{
			CBasePlayerWeapon@ pWeapon = cast<CBasePlayerWeapon@>( pPlayer.m_hActiveItem.GetEntity() );

			/*if( pWeapon !is null && pPlayer.m_hActiveItem.GetEntity().GetClassname() == "weapon_hornetgun" )
			{
				if ( pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) < 100 )
				{
					pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType, pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) + 1 );
				}
			}*/

			if( pWeapon !is null && pPlayer.m_hActiveItem.GetEntity().GetClassname() == "weapon_shockrifle" )
			{
				if ( pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) < 100 )
				{
					pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType, pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) + 2 );
				}

				if ( pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType ) > 100 )
				{
					pPlayer.m_rgAmmo( pWeapon.m_iPrimaryAmmoType, 100 );
				}
			}

			if( pWeapon !is null && pPlayer.m_hActiveItem.GetEntity().GetClassname() == "weapon_medkit" )
			{
				if( pPlayer.pev.health < pPlayer.pev.max_health )
				{
					pPlayer.pev.health += 1;
				}
			}

			if ( pWeapon !is null && pPlayer.HasNamedPlayerItem("weapon_action") is null && (pPlayer.pev.flags & FL_FAKECLIENT) == 0 )
			{
				pPlayer.SetItemPickupTimes( 0.0 );
				pPlayer.GiveNamedItem( "weapon_action" );
			}
		}
	}
}

void AddToArray(string SvenShit, string YourShit)
{
	arItems Items;
	arItems @pItems = cast<arItems>(Items);
	
	pItems.SvenItems = SvenShit;
	pItems.NewItems = YourShit;	
	
	g_ItemsReplacer.insertLast(pItems);
}

void ReplaceEntites()
{
	for (uint Index = 0; Index < g_ItemsReplacer.length(); Index++)
	{
		CBaseEntity@ Entity = null;
		arItems @pItems = cast<arItems>(g_ItemsReplacer[Index]);
		
		string SvenItemName = pItems.SvenItems;
		string NewItemName = pItems.NewItems;
	
		while( ( @Entity = g_EntityFuncs.FindEntityByClassname( Entity, SvenItemName ) ) !is null )	
		{
			Vector SvenEntityPos = Entity.pev.origin;
		
			//Check if the name matches first...
			if (Entity.pev.classname == SvenItemName)
			{
				//Remove that shit bruh
				g_EntityFuncs.Remove(Entity);
				//Add that shit mayne
				CBaseEntity@ NewShit = g_EntityFuncs.Create(NewItemName, SvenEntityPos, g_vecZero, false );
				g_EntityFuncs.DispatchKeyValue( NewShit.edict(), "m_flCustomRespawnTime", 180 );
				//NewShit.pev.spawnflags = 1024;
			}
			
		}
		
	}
}

string MatchEntityName(CBaseEntity@ pEntity)
{
	for (uint Index = 0; Index < g_ItemsReplacer.length(); Index++)
	{
		arItems @pItems = cast<arItems>(g_ItemsReplacer[Index]);
		
		if (pEntity.pev.classname == pItems.SvenItems)
			return pItems.NewItems;
	}

	return "";
}

void ReplaceEntityByPointer(EHandle Entity)
{  
	CBaseEntity@ pEntity = Entity.GetEntity(); 

	//Failsafe
	if ( pEntity is null )
		return;
		
	//The main variables...
	string MatchedName = MatchEntityName(pEntity);
	
	//Make sure we found a match first...
	if (MatchedName == "")
		return;

	//Else do the rest of the shit now...
	Vector SvenEntityPos = pEntity.pev.origin;
	g_OldItemPos.insertLast(SvenEntityPos);

	CBaseEntity@ pOwner = g_EntityFuncs.Instance( pEntity.pev.owner );
	//Remove that shit bruh and also allow ammo sharing among players
	if( pOwner is null && pEntity !is null )
	{
		g_EntityFuncs.Remove(pEntity);
	}
	
	//Check first for the old position before spawning in new shit. 
	for (uint Index = 0; Index < g_OldItemPos.length(); Index++)
	{		
		float Length = abs(SvenEntityPos.Length() - g_OldItemPos[Index].Length());

		//Be careful printing this shit out on maps with tons of spawned items
		//if (MatchedName != "")
		//	g_Log.PrintF("Item Name: " + pEntity.pev.classname + " Item Pos: " + Length + "\n");
		
		//if (Length > 0.0 and Length < 20)
		if (Length < 20)
			return;
	}

	//Add that shit mayne
	CBaseEntity@ SpawnedItem = g_EntityFuncs.Create(MatchedName, SvenEntityPos, g_vecZero, false);
	g_OldItemPos.insertLast(SpawnedItem.pev.origin);
		
		
}

//bool blRegisterMonsterTakeDamage =  g_Hooks.RegisterHook( Hooks::Monster::MonsterTakeDamage, MonsterNoGib );

HookReturnCode MapChange(const string& in szLevel)
{
	CBasePlayer@ pPlayer;
	DICT_PLAYER_LOADOUT[pPlayer.entindex()].deleteAll();
	//g_Scheduler.ClearTimerList(); //server will crash if timers arent cleared between map changes.
	return HOOK_CONTINUE;
}

HookReturnCode MonsterNoGib(DamageInfo@ pInfo)
{
    CBaseEntity@ pVictim = pInfo.pVictim;

    if( pVictim is null || !pVictim.IsPlayer() ) // Only monsters
        return HOOK_CONTINUE;
    // Victim took mortal damage - don't gib
    if( pVictim.pev.health - pInfo.flDamage < 0 )
        pVictim.pev.health = 0;

    return HOOK_CONTINUE;
}

HookReturnCode PickupObjectMaterialize( CBaseEntity@ pEntity ) 
{
	g_Scheduler.SetTimeout("ReplacePickup", 0.5, EHandle(pEntity));

	return HOOK_CONTINUE;
}

HookReturnCode EntSpawned2(CBaseEntity@ pEntity)
{
	g_Scheduler.SetTimeout("ReplacePickup2", 0.25, EHandle(pEntity));

	return HOOK_CONTINUE;
}

void ReplacePickup(EHandle Pickup)
{
	CBaseEntity@ pPickup = Pickup.GetEntity();

	if( pPickup is null )
		return;
		
	CBaseEntity@ pOwner = g_EntityFuncs.Instance( pPickup.pev.owner );

	Vector origin, angles, velocity;
	string targetname, target, netname;
	int spawnflags;
	string szMapName = string(g_Engine.mapname);
	//if( szMapName == "snd" || szMapName == "desertcircle" || szMapName.Split( "_" )[0] == "th" )

	/*if( pPickup.pev.ClassNameIs( "weapon_hornetgun" ) && pPickup.pev.netname != "replacement" )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "weapon_hornetgun";
		dictKeys = 
		{
			{ "iuser1", "models/hivehand/p_hivehandHD.mdl" },
			{ "iuser2", "models/w_hornetgun.mdl" },
			{ "iuser3", "models/v_hornetgun3.mdl" },
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }*/
	if( pPickup.pev.ClassNameIs( "weapon_colt1911" ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "weapon_ins2m1911";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pPickup.pev.ClassNameIs( "weapon_sawedoff" ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "weapon_ins2coach";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pPickup.pev.ClassNameIs( "weapon_m16a1" ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "weapon_ins2m16a1";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pPickup.pev.ClassNameIs( "weapon_tommygun" ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "weapon_ins2m1928";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pPickup.pev.ClassNameIs( "weapon_greasegun" ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "weapon_ins2greasegun";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pPickup.pev.ClassNameIs( "weapon_m14" ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "weapon_ins2garand";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pPickup.pev.ClassNameIs( "weapon_knife" ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "weapon_ofknife";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pPickup.pev.ClassNameIs( "weapon_357" ) and szMapName.Split( "_" )[0] == "th" )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "weapon_ins2python";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pPickup !is null && pOwner is null && ( pPickup.pev.ClassNameIs( "ammo_9mmbox" ) || pPickup.pev.ClassNameIs( "ammo_9mmclip" ) || pPickup.pev.ClassNameIs( "ammo_9mmAR" ) || pPickup.pev.ClassNameIs( "ammo_556" ) 
	|| pPickup.pev.ClassNameIs( "ammo_556clip" ) || pPickup.pev.ClassNameIs( "ammo_357" ) || pPickup.pev.ClassNameIs( "ammo_uziclip" ) || pPickup.pev.ClassNameIs( "ammo_buckshot" ) 
	|| pPickup.pev.ClassNameIs( "ammo_rpgclip" ) || pPickup.pev.ClassNameIs( "ammo_crossbow" ) || pPickup.pev.ClassNameIs( "ammo_sporeclip" ) || pPickup.pev.ClassNameIs( "ammo_gaussclip" ) 
	|| pPickup.pev.ClassNameIs( "ammo_ARgrenades" ) || pPickup.pev.ClassNameIs( "ammo_762" ) || pPickup.pev.ClassNameIs( "weaponbox" ) || pPickup.pev.ClassNameIs( "item_healthkit" ) || pPickup.pev.ClassNameIs( "item_battery" ) 
	|| pPickup.pev.ClassNameIs( "ammo_medkit" ) || pPickup.pev.ClassNameIs( "item_ammopack_generic" ) ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		//g_EntityFuncs.Remove( pPickup );

		if( ( szMapName == "snd" || szMapName == "desertcircle" ) && pPickup.pev.spawnflags == 1024 )
		{
			g_EntityFuncs.Remove( pPickup );
		}

		/*if( ( szMapName != "snd" || szMapName != "desertcircle" ) && pPickup.pev.spawnflags != 1024 )
		{
			szClassname = "item_moneyrandom";
			dictKeys = 
			{
				{ "netname", "replacement" }
			};

			CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
			pHornetgun.pev.origin = origin;
			pHornetgun.pev.angles = angles;
			pHornetgun.pev.target = target;
			pHornetgun.pev.targetname = targetname;
			pHornetgun.pev.spawnflags |= spawnflags;
			g_EntityFuncs.DispatchKeyValue(pHornetgun.edict(), "m_flCustomRespawnTime", "120");

			g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
		}*/
        }
	/*else if( pPickup.pev.ClassNameIs( "item_moneyrandom" ) && pPickup.pev.netname != "replacement" )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pPickup.pev.origin;
		angles = pPickup.pev.angles;
		targetname = pPickup.pev.targetname;
		target = pPickup.pev.target;
		netname = pPickup.pev.netname;
		spawnflags = pPickup.pev.spawnflags;

		g_EntityFuncs.Remove( pPickup );
		szClassname = "item_moneyrandom";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;
		g_EntityFuncs.DispatchKeyValue(pHornetgun.edict(), "m_flCustomRespawnTime", "120");

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( ( szMapName == "snd" || szMapName == "desertcircle" ) && ( pPickup.pev.ClassNameIs( "ammo_9mmbox" ) || pPickup.pev.ClassNameIs( "ammo_9mmclip" ) || pPickup.pev.ClassNameIs( "ammo_9mmAR" ) 
	|| pPickup.pev.ClassNameIs( "ammo_556" ) || pPickup.pev.ClassNameIs( "ammo_556clip" ) || pPickup.pev.ClassNameIs( "ammo_357" ) || pPickup.pev.ClassNameIs( "ammo_uziclip" ) || pPickup.pev.ClassNameIs( "ammo_buckshot" ) 
	|| pPickup.pev.ClassNameIs( "ammo_rpgclip" ) || pPickup.pev.ClassNameIs( "ammo_crossbow" ) || pPickup.pev.ClassNameIs( "ammo_sporeclip" ) || pPickup.pev.ClassNameIs( "ammo_gaussclip" ) 
	|| pPickup.pev.ClassNameIs( "ammo_ARgrenades" ) || pPickup.pev.ClassNameIs( "ammo_762" ) ) && pOwner is null )
	{
		g_EntityFuncs.Remove( pPickup );
	}*/
}

void ReplacePickup2(EHandle Entity)
{
	CBaseEntity@ pEntity = Entity.GetEntity();

	Vector origin, angles, velocity;
	string targetname, target, netname;
	int spawnflags;
	string szMapName = string(g_Engine.mapname);

	/*if( pEntity !is null && pEntity.pev.ClassNameIs( "weapon_hornetgun" ) && pEntity.pev.targetname != "replacement" )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "weapon_hornetgun";
		dictKeys = 
		{
			{ "iuser1", "models/hivehand/p_hivehandHD.mdl" },
			{ "iuser2", "models/w_hornetgun.mdl" },
			{ "iuser3", "models/v_hornetgun.mdl" },
			{ "targetname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.netname = netname;
		//pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }*/
	if( pEntity.pev.ClassNameIs( "weapon_colt1911" ) && ( pEntity.pev.spawnflags == 1024 || pEntity.pev.spawnflags == 7168 ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		velocity = pEntity.pev.velocity;
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "weapon_ins2m1911";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags = 7168;
		pHornetgun.pev.velocity = velocity;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pEntity.pev.ClassNameIs( "weapon_sawedoff" ) && ( pEntity.pev.spawnflags == 1024 || pEntity.pev.spawnflags == 7168 ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		velocity = pEntity.pev.velocity;
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "weapon_ins2coach";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags = 7168;
		pHornetgun.pev.velocity = velocity;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pEntity.pev.ClassNameIs( "weapon_m16a1" ) && ( pEntity.pev.spawnflags == 1024 || pEntity.pev.spawnflags == 7168 ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		velocity = pEntity.pev.velocity;
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "weapon_ins2m16a1";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags = 7168;
		pHornetgun.pev.velocity = velocity;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pEntity.pev.ClassNameIs( "weapon_tommygun" ) && ( pEntity.pev.spawnflags == 1024 || pEntity.pev.spawnflags == 7168 ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		velocity = pEntity.pev.velocity;
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "weapon_ins2m1928";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags = 7168;
		pHornetgun.pev.velocity = velocity;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pEntity.pev.ClassNameIs( "weapon_greasegun" ) && ( pEntity.pev.spawnflags == 1024 || pEntity.pev.spawnflags == 7168 ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		velocity = pEntity.pev.velocity;
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "weapon_ins2greasegun";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags = 7168;
		pHornetgun.pev.velocity = velocity;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pEntity.pev.ClassNameIs( "weapon_m14" ) && ( pEntity.pev.spawnflags == 1024 || pEntity.pev.spawnflags == 7168 ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		velocity = pEntity.pev.velocity;
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "weapon_ins2garand";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags = 7168;
		pHornetgun.pev.velocity = velocity;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pEntity.pev.ClassNameIs( "weapon_357" ) and szMapName.Split( "_" )[0] == "th" && ( pEntity.pev.spawnflags == 1024 || pEntity.pev.spawnflags == 7168 ) )
	{
		string szClassname;
		dictionary dictKeys = {};
		velocity = pEntity.pev.velocity;
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "weapon_ins2python";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags = 7168;
		pHornetgun.pev.velocity = velocity;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	/*else if( ( pEntity.pev.ClassNameIs( "item_healthkit" ) || pEntity.pev.ClassNameIs( "item_battery" ) ) && pEntity.pev.spawnflags != 1024 )
	{
		string szClassname;
		dictionary dictKeys = {};
		velocity = pEntity.pev.velocity;
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "item_moneyrandom";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }
	else if( pEntity.pev.ClassNameIs( "item_moneyrandom" ) && pEntity.pev.netname != "replacement" )
	{
		string szClassname;
		dictionary dictKeys = {};
		origin = pEntity.pev.origin;
		angles = pEntity.pev.angles;
		targetname = pEntity.pev.targetname;
		target = pEntity.pev.target;
		netname = pEntity.pev.netname;
		spawnflags = pEntity.pev.spawnflags;

		g_EntityFuncs.Remove( pEntity );
		szClassname = "item_moneyrandom";
		dictKeys = 
		{
			{ "netname", "replacement" }
		};

		CBaseEntity@ pHornetgun = g_EntityFuncs.CreateEntity( szClassname, dictKeys, true );
		pHornetgun.pev.origin = origin;
		pHornetgun.pev.angles = angles;
		pHornetgun.pev.target = target;
		pHornetgun.pev.targetname = targetname;
		pHornetgun.pev.spawnflags |= spawnflags;

		g_EntityFuncs.DispatchSpawn( pHornetgun.edict() );
        }*/
}

HookReturnCode MonsterTakeDamage(DamageInfo@ pInfo)
{
	CBaseEntity@ pVictim = pInfo.pVictim;
	CBaseEntity@ pAttacker = pInfo.pAttacker;
	//CBaseEntity@ pOwner = g_EntityFuncs.Instance( pInfo.pVictim.pev.euser4 );
	//CBasePlayer@ pPlayer = cast<CBasePlayer@>( pOwner );
	//CBaseEntity@ pAttacker2 = cast<CBaseEntity@>( pOwner );

	if( pAttacker !is null && pInfo.pVictim.IsMonster() && (pInfo.bitsDamageType & (DMG_BULLET | DMG_SNIPER)) != 0 && (pInfo.bitsDamageType & (DMG_ALWAYSGIB)) != 0 )
	{
		pInfo.bitsDamageType &= ~DMG_ALWAYSGIB;
		//pInfo.bitsDamageType |= DMG_NEVERGIB;
	}

	if( pVictim.IsMonster() && pVictim.pev.armorvalue == 25 )
	{
		pInfo.flDamage = pInfo.flDamage * 0.75;
	}

	if( pVictim.IsMonster() && pVictim.pev.armorvalue == 50 )
	{
		pInfo.flDamage = pInfo.flDamage * 0.5;
	}

	if( pVictim.IsMonster() && pVictim.pev.armorvalue == 75 )
	{
		pInfo.flDamage = pInfo.flDamage * 0.25;
	}

	if( pVictim.IsMonster() && pVictim.pev.armorvalue == 100 )
	{
		pInfo.flDamage = pInfo.flDamage / 2;
	}

	if( pAttacker !is null && pInfo.pAttacker.IsMonster() && pVictim.IsMonster() && pVictim.IsAlive() && pInfo.pInflictor.IRelationship( pInfo.pVictim ) != R_NO 
	&& ( pInfo.pInflictor.pev.classname == "hornet" || pInfo.pInflictor.pev.classname == "playerhornet" ) ) //gives score to Alien Grunt too!
	{
		pInfo.pAttacker.pev.frags += pInfo.pVictim.GetPointsForDamage( pInfo.flDamage );
	}
	else if( pAttacker !is null && pInfo.pAttacker.IsPlayer() && pVictim.IsMonster() && pVictim.IsAlive() && pInfo.pInflictor.IRelationship( pInfo.pVictim ) != R_NO 
	&& pInfo.pInflictor.pev.classname == "playerhornet" ) //buzzzz
	{
		pInfo.pAttacker.pev.frags += pInfo.pVictim.GetPointsForDamage( pInfo.flDamage );
	}
	else if( pAttacker !is null && pInfo.pAttacker.IsPlayer() && pVictim.IsMonster() && pVictim.IsAlive() && pInfo.pInflictor.IRelationship( pInfo.pVictim ) != R_NO
	&& pInfo.pInflictor.pev.classname == "monster_snark" ) //squeak!
	{
		pInfo.pAttacker.pev.frags += pInfo.pVictim.GetPointsForDamage( pInfo.flDamage );
	}
	else if( pAttacker !is null && pInfo.pAttacker.IsMonster() && pVictim.IsMonster() && pVictim.IsAlive() && !pVictim.IsPlayerAlly() && pVictim.pev.classname != "playerhornet" 
	&& pVictim.pev.classname != "monster_snark" && pVictim.pev.classname != "monster_human_assassin" && pInfo.pInflictor.pev.classname == "grenade" ) //score given to monsters when using grenade
	{
		pInfo.pAttacker.pev.frags += pInfo.pVictim.GetPointsForDamage( pInfo.flDamage );
	}
	else if( pAttacker !is null && pInfo.pAttacker.IsPlayer() && pVictim.IsMonster() && pVictim.IsAlive() && !pVictim.IsPlayerAlly() && pVictim.pev.classname != "playerhornet" 
	&& pVictim.pev.classname != "monster_snark" && pVictim.pev.classname != "monster_human_assassin" && pInfo.pInflictor.pev.classname == "grenade" ) //score given to players when using grenade
	{
		pInfo.pAttacker.pev.frags += pInfo.pVictim.GetPointsForDamage( pInfo.flDamage );
		//pInfo.pAttacker.pev.frags += Math.min( 4, (pInfo.flDamage / pInfo.pVictim.pev.max_health) * (4 * (pInfo.pVictim.pev.max_health / pInfo.pVictim.pev.max_health)) );
	}
	//else if( pAttacker !is null && pInfo.pAttacker.IsPlayer() && pVictim.IsMonster() && pVictim.IsAlive() && !pVictim.IsPlayerAlly() && (pInfo.bitsDamageType & (DMG_TIMEBASED)) != 0 )
	//{
		//pInfo.pAttacker.pev.frags += pInfo.pVictim.GetPointsForDamage( pInfo.flDamage );
		//pInfo.pAttacker.pev.frags += Math.min( 4, (pInfo.flDamage / pInfo.pVictim.pev.max_health) * (4 * (pInfo.pVictim.pev.max_health / pInfo.pVictim.pev.max_health)) );
	//}
	else
	{
		return HOOK_CONTINUE;
	}

	return HOOK_CONTINUE;
}

HookReturnCode EntitySpawned(CBaseEntity@ pEntity)
{
	g_Scheduler.SetTimeout("ReplaceEntityByPointer", 0.5, EHandle(pEntity));

	return HOOK_CONTINUE;
}

HookReturnCode EntSpawned(CBaseEntity@ pEntity)
{
	g_Scheduler.SetTimeout("RemoveSpawnedMonster", 1.5, EHandle(pEntity));

	return HOOK_CONTINUE;
}

HookReturnCode HornetSpawned(CBaseEntity@ pEntity)
{
	g_Scheduler.SetTimeout("SetHornetNotarget", 0.25, EHandle(pEntity));

	return HOOK_CONTINUE;
}

HookReturnCode PlayerSpawn2(CBasePlayer@ pPlayer)
{
	EHandle ePlayer = pPlayer;
	//g_Scheduler.SetTimeout("ThePlayerPostSpawn", 0.5f, ePlayer);
	g_Scheduler.SetTimeout("TheBotPostSpawn", 1.0f, ePlayer);

	return HOOK_CONTINUE;
}

void ThePlayerPostSpawn(EHandle ePlayer)
{
	if(ePlayer)
	{
		CBaseEntity@ pPlayer = ePlayer;
		GetAGun(cast<CBasePlayer@>(pPlayer));
	}
}

void TheBotPostSpawn(EHandle ePlayer)
{
	if(ePlayer)
	{
		CBaseEntity@ pPlayer = ePlayer;
		GetAGunBOT(cast<CBasePlayer@>(pPlayer));
	}
}

void RemoveSpawnedMonster(EHandle Entity)
{
	CBaseEntity@ pEntity = Entity.GetEntity();

	//Failsafe
	//if (pEntity is null)
		//return;

	//szMapName.Split( "_" )[0] == "th"
	string szMapName = string(g_Engine.mapname);
	if( szMapName == "toonrun3" )
	{
		ModifyEntityByClassname( "monster_scientist" );
	}

	if( szMapName == "justzombies_v2" )
	{
		ModifyEntityByClassname( "monster_headcrab" );
	}

	if( szMapName == "justislave_v2" )
	{
		ModifyEntityByClassname( "monster_apache" );
	}

	if( szMapName == "crystal" )
	{
		ModifyEntityByClassname( "monster_turret" );
	}

	if( szMapName == "quarter" )
	{
		ModifyEntityByClassname( "monster_miniturret" );
	}

	if( szMapName == "sc_commandandconquer" )
	{
		RemoveEntityByClassname( "monster_turret" );
	}

	if( szMapName == "sc_tetris5" )
	{
		ModifyEntityByClassname( "monster_bigmomma" );
	}

	if( szMapName == "osprey" || szMapName == "snd" )
	{
		RemoveEntityByClassname4( "monster_blkop_osprey" );
		RemoveEntityByClassname4( "monster_osprey" );
	}

	if( szMapName == "snd" || szMapName == "desertcircle" )
	{
		RemoveAmmoByClassname( "ammo_556" );
		RemoveAmmoByClassname( "ammo_357" );
		RemoveAmmoByClassname( "ammo_9mmAR" );
		RemoveAmmoByClassname( "ammo_medkit" );
		RemoveAmmoByClassname( "ammo_buckshot" );
	}

	//RemoveEntityByClassname3( "monster_blkop_osprey" );
	//RemoveEntityByClassname3( "monster_miniturret" );
	//RemoveEntityByClassname3( "monster_robogrunt" );
	//RemoveEntityByClassname3( "monster_osprey" );
	//RemoveEntityByClassname3( "monster_turret" );
	//RemoveEntityByClassname3( "monster_sentry" );
	//RemoveEntityByClassname3( "monster_apache" );
}

void RemoveAmmoByClassname( string & in strClassname )
{
	string szMapName = string(g_Engine.mapname);
	if( szMapName != "snd" || szMapName != "desertcircle" )
		return;

	if ( strClassname == "" )
		return;
	
	int iCount = 0;
	
	CBaseEntity@ pEntity = null;
	while ( ( @pEntity = g_EntityFuncs.FindEntityByClassname( pEntity, strClassname ) ) !is null )
	{
		g_EntityFuncs.Remove( pEntity );
		iCount++;
	}
}

void RemoveEntityByClassname( string & in strClassname )
{
	if ( strClassname == "" )
		return;
	
	int iCount = 0;
	
	CBaseEntity@ pEntity = null;
	while ( ( @pEntity = g_EntityFuncs.FindEntityByClassname( pEntity, strClassname ) ) !is null && pEntity.pev.health > 9000 )
	{
		g_EntityFuncs.Remove( pEntity );
		iCount++;
	}
}

void RemoveEntityByClassname2( string & in strClassname )
{
	if ( strClassname == "" )
		return;
	
	int iCount = 0;
	
	CBaseEntity@ pEntity = null;
	while ( ( @pEntity = g_EntityFuncs.FindEntityByClassname( pEntity, strClassname ) ) !is null && pEntity.pev.health > 90000 )
	{
		g_EntityFuncs.Remove( pEntity );
		iCount++;
	}
}

void RemoveEntityByClassname3( string & in strClassname )
{
	string szMapName = string(g_Engine.mapname);
	if( szMapName == "crimecity" )
		return;

	if ( strClassname == "" )
		return;
	
	int iCount = 0;
	
	CBaseEntity@ pEntity = null;
	while ( ( @pEntity = g_EntityFuncs.FindEntityByClassname( pEntity, strClassname ) ) !is null && !pEntity.IsPlayerAlly() && pEntity.Classify() != CLASS_ALIEN_MILITARY 
	&& pEntity.Classify() != CLASS_XRACE_SHOCK 
	&& pEntity.Classify() != CLASS_XRACE_PITDRONE )
	{
		//g_EntityFuncs.Remove( pEntity );
		pEntity.SetClassification(4);
		iCount++;
	}
}

void RemoveEntityByClassname4( string & in strClassname )
{
	string szMapName = string(g_Engine.mapname);
	if( szMapName == "snd" )
		return;

	if ( strClassname == "" )
		return;
	
	int iCount = 0;
	
	CBaseEntity@ pEntity = null;
	while ( ( @pEntity = g_EntityFuncs.FindEntityByClassname( pEntity, strClassname ) ) !is null && pEntity.pev.renderfx != 19 )
	{
		if( Math.RandomFloat( 0.0, 1.0 ) <= 0.5 )
		{
			pEntity.pev.health = 100000;
			pEntity.pev.max_health = 100000;
			pEntity.pev.renderfx = 19;
			pEntity.pev.rendercolor = Vector(200, 0, 0);
			pEntity.pev.rendermode = 0;
			pEntity.pev.renderamt = 1;
			cast<CBaseMonster@>(pEntity).m_FormattedName = "Legendary Osprey";
		}
		else
		{
			pEntity.pev.health = 60000;
			pEntity.pev.max_health = 60000;
			pEntity.pev.renderfx = 19;
			pEntity.pev.rendercolor = Vector(0, 0, 0);
			pEntity.pev.rendermode = 0;
			pEntity.pev.renderamt = 1;
		}
		iCount++;
	}
}

void ModifyHornet( string & in strClassname )
{
	if ( strClassname == "" )
		return;
	
	int iCount = 0;
	
	CBaseEntity@ pEntity = null;
	while ( ( @pEntity = g_EntityFuncs.FindEntityByClassname( pEntity, strClassname ) ) !is null && pEntity.pev.classname == "playerhornet" && ( pEntity.Classify() == CLASS_HUMAN_MILITARY || pEntity.Classify() == CLASS_XRACE_SHOCK
	|| pEntity.Classify() == CLASS_XRACE_PITDRONE ) )
	{
		//pEntity.SetClassification(3);
		pEntity.pev.flags |= FL_NOTARGET;
		iCount++;
	}
}

void ModifyEntityByClassname( string & in strClassname )
{
	if ( strClassname == "" )
		return;
	
	int iCount = 0;
	
	CBaseEntity@ pEntity = null;
	while ( ( @pEntity = g_EntityFuncs.FindEntityByClassname( pEntity, strClassname ) ) !is null && pEntity.pev.health > 90000 )
	{
		pEntity.pev.takedamage = 0;
		iCount++;
	}
}

void GetAGun(CBasePlayer@ pPlayer)
{
	NetworkMessage movespeedkey( MSG_ONE, NetworkMessages::SVC_STUFFTEXT, pPlayer.edict() );
		movespeedkey.WriteString( "cl_movespeedkey 0.3\n" );
	movespeedkey.End();

	if( pPlayer.pev.health > pPlayer.pev.max_health )
	{
		pPlayer.pev.health = pPlayer.pev.max_health;
	}

	if( (pPlayer.pev.flags & FL_FAKECLIENT) == 0 )
	{
		pPlayer.GiveNamedItem( "weapon_action" );
	}
}

bool RemoveSingleItem(CBasePlayer@ pTarget, string targetWeapon)
{
	//instantly fail if attempting to remove the afb's entmover
	if(targetWeapon == "weapon_entmover") return false;
		
	CBasePlayerItem@ pItem;
	CBasePlayerWeapon@ pWeapon;
	for(uint j = 0; j < MAX_ITEM_TYPES; j++)
	{
		@pItem = pTarget.m_rgpPlayerItems(j);
		while(pItem !is null)
		{
			@pWeapon = pItem.GetWeaponPtr();
				
			if(pWeapon.GetClassname() == targetWeapon)
			{
				pTarget.RemovePlayerItem(pItem);
				return true;
			}
				
			@pItem = cast<CBasePlayerItem@>(pItem.m_hNextItem.GetEntity());
		}
	}
		
	return false;
}

void GetAGunBOT(CBasePlayer@ pPlayer)
{
	if( (pPlayer.pev.flags & FL_FAKECLIENT) != 0 )
	{
		KeyValueBuffer@ pKeys = g_EngineFuncs.GetInfoKeyBuffer(pPlayer.edict());

		string szMapName = string(g_Engine.mapname);
		if( szMapName.Split( "_" )[0] == "pvp" )
		{
			if( pPlayer !is null && string(pKeys.GetValue("model")) == "helmet" )
			{
				g_EntityFuncs.DispatchKeyValue(pPlayer.edict(), "classify", 4);
			}

			if( pPlayer !is null && string(pKeys.GetValue("model")) == "hevscientist5" )
			{
				g_EntityFuncs.DispatchKeyValue(pPlayer.edict(), "classify", 5);
			}

			if( pPlayer !is null && string(pKeys.GetValue("model")) == "gina" )
			{
				g_EntityFuncs.DispatchKeyValue(pPlayer.edict(), "classify", 15);
			}
		}

		switch ( g_BotWeaponSpawnMode.GetInt() )
		{
			case 0:
			{
				pPlayer.GiveNamedItem( "weapon_ofknife" );
				pPlayer.GiveNamedItem( "weapon_ofeagle" );
				pPlayer.SelectItem( "weapon_ofeagle" );
			}
			break;
			case 1:
			{
				pPlayer.GiveNamedItem( "weapon_agruntf" );
				pPlayer.SelectItem( "weapon_agruntf" );
			}
			break;
			case 2:
			{
				pPlayer.GiveNamedItem( "weapon_hgrunts" );
				pPlayer.SelectItem( "weapon_hgrunts" );
			}
			break;
			case 3:
			{
				pPlayer.GiveNamedItem( "weapon_ofgrunt" );
				pPlayer.SelectItem( "weapon_ofgrunt" );
			}
			break;
			case 4:
			{
				switch ( Math.RandomLong( 1, 2 ) )
				{
					case 1:
					{
						pPlayer.GiveNamedItem( "weapon_agruntf" );
						pPlayer.SelectItem( "weapon_agruntf" );
					}
					break;
					case 2:
					{
						pPlayer.GiveNamedItem( "weapon_ofknife" );
						pPlayer.GiveNamedItem( "weapon_ofeagle" );
						pPlayer.SelectItem( "weapon_ofeagle" );
					}
					break;
				}
			}
			break;
			case 5:
			{
				switch ( Math.RandomLong( 1, 2 ) )
				{
					case 1:
					{
						pPlayer.GiveNamedItem( "weapon_hgrunts" );
						pPlayer.SelectItem( "weapon_hgrunts" );
					}
					break;
					case 2:
					{
						pPlayer.GiveNamedItem( "weapon_ofgrunt" );
						pPlayer.SelectItem( "weapon_ofgrunt" );
					}
					break;
				}
			}
			break;
			case 6:
			{
				switch ( Math.RandomLong( 1, 3 ) )
				{
					case 1:
					{
						pPlayer.GiveNamedItem( "weapon_agruntf" );
						pPlayer.SelectItem( "weapon_agruntf" );
					}
					break;
					case 2:
					{
						pPlayer.GiveNamedItem( "weapon_hgrunts" );
						pPlayer.SelectItem( "weapon_hgrunts" );
					}
					break;
					case 3:
					{
						pPlayer.GiveNamedItem( "weapon_ofgrunt" );
						pPlayer.SelectItem( "weapon_ofgrunt" );
					}
					break;
				}
			}
			break;
			case 7:
			{
				pPlayer.GiveNamedItem( "weapon_strooper" );
			}
			break;
			case 8:
			{
				pPlayer.GiveNamedItem( "weapon_knife" );
				pPlayer.GiveNamedItem( "weapon_hlmp5c" );
				pPlayer.SelectItem( "weapon_hlmp5c" );
			}
			break;
			case 9:
			{
				pPlayer.GiveNamedItem( "weapon_knife" );
				pPlayer.GiveNamedItem( "weapon_hlmp5" );
				pPlayer.SelectItem( "weapon_hlmp5" );
			}
			break;
			case 10:
			{
				pPlayer.GiveNamedItem( "weapon_agrunt" );
				pPlayer.SelectItem( "weapon_agrunt" );
			}
			break;
			case 11:
			{
				pPlayer.GiveNamedItem( "weapon_hwgrunt" );
				pPlayer.SelectItem( "weapon_hwgrunt" );
			}
			break;
			case 12:
			{
				switch ( Math.RandomLong( 1, 2 ) )
				{
					case 1:
					{
						pPlayer.GiveNamedItem( "weapon_hwgrunt" );
						pPlayer.SelectItem( "weapon_hwgrunt" );
					}
					break;
					case 2:
					{
						pPlayer.GiveNamedItem( "weapon_agruntf" );
						pPlayer.SelectItem( "weapon_agruntf" );
					}
					break;
				}
			}
			case 13:
			{
				switch ( Math.RandomLong( 1, 2 ) )
				{
					case 1:
					{
						pPlayer.GiveNamedItem( "weapon_hwgrunt" );
						pPlayer.SelectItem( "weapon_hwgrunt" );
					}
					break;
					case 2:
					{
						pPlayer.GiveNamedItem( "weapon_hgrunts" );
						pPlayer.SelectItem( "weapon_hgrunts" );
					}
					break;
				}
			}
			break;
			case 14:
			{
				switch ( Math.RandomLong( 1, 3 ) )
				{
					case 1:
					{
						pPlayer.GiveNamedItem( "weapon_hwgrunt" );
						pPlayer.SelectItem( "weapon_hwgrunt" );
					}
					break;
					case 2:
					{
						pPlayer.GiveNamedItem( "weapon_hgrunts" );
						pPlayer.SelectItem( "weapon_hgrunts" );
					}
					break;
					case 3:
					{
						pPlayer.GiveNamedItem( "weapon_ofgrunt" );
						pPlayer.SelectItem( "weapon_ofgrunt" );
					}
					break;
				}
			}
			break;
			case 15:
			{
				switch ( Math.RandomLong( 1, 4 ) )
				{
					case 1:
					{
						pPlayer.GiveNamedItem( "weapon_agruntf" );
						pPlayer.SelectItem( "weapon_agruntf" );
					}
					break;
					case 2:
					{
						pPlayer.GiveNamedItem( "weapon_hwgrunt" );
						pPlayer.SelectItem( "weapon_hwgrunt" );
					}
					break;
					case 3:
					{
						pPlayer.GiveNamedItem( "weapon_hgrunts" );
						pPlayer.SelectItem( "weapon_hgrunts" );
					}
					break;
					case 4:
					{
						pPlayer.GiveNamedItem( "weapon_ofgrunt" );
						pPlayer.SelectItem( "weapon_ofgrunt" );
					}
					break;
				}
			}
			break;
			case 16:
			{
				pPlayer.GiveNamedItem( "weapon_pipewrench" );
				pPlayer.GiveNamedItem( "weapon_aghivehand" );
				pPlayer.GiveNamedItem( "weapon_hlsnark" );
				pPlayer.SelectItem( "weapon_aghivehand" );
			}
			break;
			case 17:
			{
				pPlayer.GiveNamedItem( "weapon_pipewrench" );
				pPlayer.GiveNamedItem( "weapon_hivehand" );
				pPlayer.GiveNamedItem( "weapon_hlsnark" );
				pPlayer.SelectItem( "weapon_hivehand" );
			}
			break;
			case 18:
			{
				pPlayer.GiveNamedItem( "weapon_ofknife" );
				pPlayer.GiveNamedItem( "weapon_m4a1" );
				pPlayer.SelectItem( "weapon_m4a1" );
			}
			break;
			case 19:
			{
				pPlayer.GiveNamedItem( "weapon_agruntfc" );
				pPlayer.SelectItem( "weapon_agruntfc" );
			}
			break;
			case 20:
			{
				switch ( Math.RandomLong( 1, 4 ) )
				{
					case 1:
					{
						pPlayer.GiveNamedItem( "weapon_ins2m4a1" );
						pPlayer.SelectItem( "weapon_ins2m4a1" );
					}
					break;
					case 2:
					{
						pPlayer.GiveNamedItem( "weapon_ins2mk18" );
						pPlayer.SelectItem( "weapon_ins2mk18" );
					}
					break;
					case 3:
					{
						pPlayer.GiveNamedItem( "weapon_ins2g36c" );
						pPlayer.SelectItem( "weapon_ins2g36c" );
					}
					break;
					case 4:
					{
						pPlayer.GiveNamedItem( "weapon_ins2f2000" );
						pPlayer.SelectItem( "weapon_ins2f2000" );
					}
					break;
				}
			}
			break;
			case 21:
			{
				pPlayer.GiveNamedItem( "weapon_asscan" );
				pPlayer.SelectItem( "weapon_asscan" );
			}
			break;
		}
	}
}

namespace CNPC
{
float flNextPainTime2;
const string sCNPCKV = "$i_cnpc_iscontrollingnpc";
const string sCNPCKVPainTime = "$fl_cnpc_nextpaintime";
const float flModelToGameSpeedModifier = 1.650124131504528; //gotten from player maxspeed (270) divided by player model speed (163.624054)

enum cnpc_e
{
	CNPC_AGRUNT = 1,
	CNPC_AGRUNTF,
	CNPC_PITDRONE,
	CNPC_STROOPER,
	CNPC_HGRUNTS,
	CNPC_OTIS,
	CNPC_OFGRUNT,
	CNPC_GONOME,
	CNPC_ENFORCER,
	CNPC_PAYNE,
	CNPC_FASSN,
	CNPC_HWGRUNT,
	CNPC_KINGPIN,
	CNPC_GARG,
	CNPC_ISLAVE,
	CNPC_ZOMBIE,
	CNPC_BULLSQUID,
	CNPC_BABYGARG,
	CNPC_BIGMOMMA,
	CNPC_HOUNDEYE,
	CNPC_SECURITYGUARD,
	CNPC_AGRUNTFC
};

HookReturnCode ClientPutInServer( CBasePlayer@ pPlayer )
{
	CustomKeyvalues@ pCustom = pPlayer.GetCustomKeyvalues();
	pCustom.InitializeKeyvalueWithDefault( sCNPCKV );
	pCustom.InitializeKeyvalueWithDefault( sCNPCKVPainTime );
	flNextPainTime2 = 0.0;
	//flNextSoundPlayed = 0.0;

	return HOOK_CONTINUE;
}

HookReturnCode PlayerTakeDamage( DamageInfo@ pDamageInfo )
{
	CustomKeyvalues@ pCustom = pDamageInfo.pVictim.GetCustomKeyvalues();
	KeyValueBuffer@ pKeys = g_EngineFuncs.GetInfoKeyBuffer(pDamageInfo.pVictim.edict());
	string sName;
	float flVolume;
	float flAttenuation;

	/*if( pDamageInfo.pVictim.GetClassname() == "player" and pDamageInfo.pAttacker.GetClassname() == "player" and (pDamageInfo.bitsDamageType & DMG_CLUB) == 0 )
	{
		if( pDamageInfo.pVictim.Classify() == pDamageInfo.pAttacker.Classify() )
			return HOOK_CONTINUE;
	}*/
	
	if( pDamageInfo.pVictim !is null && pDamageInfo.pVictim.IsPlayer() )
		pDamageInfo.bitsDamageType &= ~DMG_SNIPER;

	if( pDamageInfo.pAttacker !is null && pDamageInfo.pAttacker.IsPlayer() && pDamageInfo.pAttacker.IRelationship( pDamageInfo.pVictim ) <= R_NO )
    		return HOOK_CONTINUE; // Ignore friendly fire from players. // && pDamageInfo.pInflictor !is pDamageInfo.pVictim

	if( pDamageInfo.pAttacker !is null && pDamageInfo.pAttacker.IsMonster() && pDamageInfo.pVictim.IsPlayer() && pDamageInfo.pVictim.IRelationship( pDamageInfo.pAttacker ) <= R_NO )
    		return HOOK_CONTINUE; // Ignore friendly fire from ally NPCs.

	if( !pDamageInfo.pVictim.IsAlive() )
		return HOOK_CONTINUE;

	if( pDamageInfo.flDamage <= 0 )
		return HOOK_CONTINUE;

	CBaseEntity@ victim = pDamageInfo.pVictim;

	if( victim is null )
		return HOOK_CONTINUE;

	CBasePlayer@ player = cast<CBasePlayer@>( victim );

	if( player is null )
		return HOOK_CONTINUE;

	if( pDamageInfo.pVictim.IsPlayer() && (pDamageInfo.pVictim.pev.effects & EF_NODRAW) == EF_NODRAW && (pDamageInfo.bitsDamageType & (DMG_LAUNCH)) != 0 )
	{
		pDamageInfo.bitsDamageType &= ~DMG_LAUNCH;
	}

	/*if( pDamageInfo.pVictim !is null && (pDamageInfo.pVictim.pev.effects & EF_NODRAW) != EF_NODRAW && pDamageInfo.pVictim.pev.waterlevel != WATERLEVEL_HEAD 
	&& flNextPainTime2 < g_Engine.time )
	{
		if( pDamageInfo.pVictim.pev.health > -30 ) //&& pDamageInfo.flDamage > 100.0f )
			return HOOK_CONTINUE;

		if( MaleModels.find( string(pKeys.GetValue("model")) ) >= 0 )
		{
			if ( pDamageInfo.pVictim.pev.health <= pDamageInfo.pVictim.pev.max_health * 0.25 )
				sName = "kingpin/male/pain25_" + string( Math.RandomLong(1, 2) ) + ".ogg";
			else if ( pDamageInfo.pVictim.pev.health <= pDamageInfo.pVictim.pev.max_health * 0.5 )
				sName = "kingpin/male/pain50_" + string( Math.RandomLong(1, 2) ) + ".ogg";
			else if ( pDamageInfo.pVictim.pev.health <= pDamageInfo.pVictim.pev.max_health * 0.75 )
				sName = "kingpin/male/pain75_" + string( Math.RandomLong(1, 2) ) + ".ogg";
			else
				sName = "kingpin/male/pain100_" + string( Math.RandomLong(1, 2) ) + ".ogg";
			flVolume = 0.75;
			flAttenuation = 0.6;

		}

		if( (pDamageInfo.pVictim.pev.flags & FL_FAKECLIENT) != 0 && FemaleModels.find( string(pKeys.GetValue("model")) ) >= 0 )
		{
			sName = "combatarms2/misc/HURTPAIN_A_FEMALE_" + string( Math.RandomLong(1, 3) ) + ".wav";
			flVolume = 0.75;
			flAttenuation = 1.25;
		}

		if( (pDamageInfo.pVictim.pev.flags & FL_FAKECLIENT) != 0 && MaleModelsExt.find( string(pKeys.GetValue("model")) ) >= 0 )
		{
			sName = "combatarms2/misc/HURTPAIN_A_MALE_" + string( Math.RandomLong(1, 3) ) + ".wav";
			flVolume = 0.75;
			flAttenuation = 1.25;
		}
		
		if( FemaleModels.find( string(pKeys.GetValue("model")) ) >= 0 )
		{
			sName = "combatarms/misc/HURTPAIN_A_FEMALE_" + string( Math.RandomLong(1, 3) ) + ".ogg";
			flVolume = 0.75;
			flAttenuation = 1.25;
		}

		if( MaleModelsExt.find( string(pKeys.GetValue("model")) ) >= 0 )
		{
			sName = "combatarms/misc/HURTPAIN_A_MALE_" + string( Math.RandomLong(1, 3) ) + ".ogg";
			flVolume = 0.75;
			flAttenuation = 1.25;
		}

		flNextPainTime2 = g_Engine.time + 1.0;
		g_SoundSystem.EmitSound( pDamageInfo.pVictim.edict(), CHAN_VOICE, sName, flVolume, flAttenuation );
	}*/

	switch( pCustom.GetKeyvalue(sCNPCKV).GetInteger() )
	{
		case CNPC_AGRUNT:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_agrunt::weapon_agrunt@ pWeapon = cast<cnpc_agrunt::weapon_agrunt@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.75;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_GARG:
		{
			//CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			//cnpc_agrunt::weapon_agrunt@ pWeapon = cast<cnpc_agrunt::weapon_agrunt@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			//pWeapon.PainSound();

			break;
		}

		case CNPC_FASSN:
		{
			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.75;
			}

			if ( ( pDamageInfo.bitsDamageType & (DMG_FALL) ) != 0 && pDamageInfo.flDamage <= 50.0 )
			{
				pDamageInfo.flDamage = 0.0;
			}

			break;
		}

		case CNPC_AGRUNTF:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_agruntf::weapon_agruntf@ pWeapon = cast<cnpc_agruntf::weapon_agruntf@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.75;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_AGRUNTFC:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_agruntfc::weapon_agruntfc@ pWeapon = cast<cnpc_agruntfc::weapon_agruntfc@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.75;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_ISLAVE:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_islave::weapon_islave@ pWeapon = cast<cnpc_islave::weapon_islave@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( (pDamageInfo.bitsDamageType & DMG_SHOCK) != 0 and ( pDamageInfo.pInflictor.pev.classname == "monster_alien_slave" || pDamageInfo.pInflictor.pev.classname == "monster_alien_slave_fi" ) )
			{
				pDamageInfo.flDamage = 0.0; //alien slaves can not harm eachother with shock beams
			}

			if( Math.RandomLong(0, 2) == 0 )
				pWeapon.PainSound();

			break;
		}

		case CNPC_ZOMBIE:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_zombie::weapon_zombie@ pWeapon = cast<cnpc_zombie::weapon_zombie@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			// Take 30% damage from bullets
			if( (pDamageInfo.bitsDamageType & DMG_BULLET) != 0 )
			{
				Vector vecDir = pDamageInfo.pVictim.pev.origin - (pDamageInfo.pInflictor.pev.absmin + pDamageInfo.pInflictor.pev.absmax) * 0.5;
				vecDir = vecDir.Normalize();
				float flForce = pDamageInfo.flDamage * ((32 * 32 * 72.0) / (pDamageInfo.pVictim.pev.size.x * pDamageInfo.pVictim.pev.size.y * pDamageInfo.pVictim.pev.size.z)) * 5;
				if( flForce > 1000.0) 
					flForce = 1000.0;

				pDamageInfo.pVictim.pev.velocity = pDamageInfo.pVictim.pev.velocity + vecDir * flForce;
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.7;
			}

			if( Math.RandomLong(0, 5) < 2 )
				pWeapon.PainSound();

			break;
		}

		case CNPC_BULLSQUID:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_bullsquid::weapon_bullsquid@ pWeapon = cast<cnpc_bullsquid::weapon_bullsquid@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.5;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_BABYGARG:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_babygarg::weapon_babygarg@ pWeapon = cast<cnpc_babygarg::weapon_babygarg@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + Math.RandomFloat(2.5, 4.0);
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.5;
			}

			if(( pDamageInfo.bitsDamageType & ( DMG_ENERGYBEAM | DMG_CRUSH | DMG_MORTAR | DMG_BLAST | DMG_BURN | DMG_SONIC | DMG_SHOCK_GLOW ) ) != 0 )
			{
				pWeapon.PainSound();
			}

			break;
		}

		case CNPC_PITDRONE:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_pitdrone::weapon_pitdrone@ pWeapon = cast<cnpc_pitdrone::weapon_pitdrone@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + Math.RandomFloat(0.6, 1.2);
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.5;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_STROOPER:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_strooper::weapon_strooper@ pWeapon = cast<cnpc_strooper::weapon_strooper@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.5;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_SECURITYGUARD:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_securityguard::weapon_securityguard@ pWeapon = cast<cnpc_securityguard::weapon_securityguard@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.75;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_HGRUNTS:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_hgrunts::weapon_hgrunts@ pWeapon = cast<cnpc_hgrunts::weapon_hgrunts@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.75;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_HWGRUNT:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_hwgrunt::weapon_hwgrunt@ pWeapon = cast<cnpc_hwgrunt::weapon_hwgrunt@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.5;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_OFGRUNT:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_ofgrunt::weapon_ofgrunt@ pWeapon = cast<cnpc_ofgrunt::weapon_ofgrunt@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.75;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_GONOME:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_gonome::weapon_gonome@ pWeapon = cast<cnpc_gonome::weapon_gonome@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + Math.RandomFloat(0.6, 1.2);
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.7;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_ENFORCER:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_enforcer::weapon_enforcer@ pWeapon = cast<cnpc_enforcer::weapon_enforcer@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			pWeapon.PainSound();

			break;
		}

		/*case CNPC_OTIS:
		{
			
			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			g_SoundSystem.EmitSoundDyn( pDamageInfo.pVictim.edict(), CHAN_VOICE, cnpc_otis::pPainSounds[Math.RandomLong(0,(cnpc_otis::pPainSounds.length() - 1))], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );

			break;
		}*/

		case CNPC_PAYNE:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_payne::weapon_payne@ pWeapon = cast<cnpc_payne::weapon_payne@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + 1.0;
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			pWeapon.PainSound();

			break;
		}

		case CNPC_BIGMOMMA:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_bigmomma::weapon_bigmomma@ pWeapon = cast<cnpc_bigmomma::weapon_bigmomma@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			// Don't take any acid damage -- BigMomma's mortar is acid
			if( (pDamageInfo.bitsDamageType & DMG_ACID) != 0 )
				pDamageInfo.flDamage = 0.0;

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + Math.RandomFloat(1.0, 3.0);
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			pWeapon.PainSound();

			break;
		}

		case CNPC_HOUNDEYE:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_houndeye::weapon_houndeye@ pWeapon = cast<cnpc_houndeye::weapon_houndeye@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + Math.RandomFloat(1.0, 3.0);
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			if (( pDamageInfo.bitsDamageType & (DMG_SNIPER | DMG_BULLET | DMG_SLASH | DMG_CLUB | DMG_BURN | DMG_ACID | DMG_ENERGYBEAM | DMG_SHOCK | DMG_BLAST | DMG_SONIC | DMG_POISON | DMG_CRUSH) ) != 0 )
			{
				pDamageInfo.flDamage = pDamageInfo.flDamage * 0.5;
			}

			pWeapon.PainSound();

			break;
		}

		case CNPC_KINGPIN:
		{
			CBasePlayer@ pPlayer = cast<CBasePlayer@>( pDamageInfo.pVictim );
			cnpc_kingpin::weapon_kingpin@ pWeapon = cast<cnpc_kingpin::weapon_kingpin@>( CastToScriptClass(pPlayer.m_hActiveItem.GetEntity()) );

			if( pWeapon !is null )
			{
				if( pWeapon.m_bShieldOn )
				{
					TraceResult tr = g_Utility.GetGlobalTrace();
					Vector vecDir = ( pDamageInfo.pAttacker.Center() - Vector(0, 0, 10) - pDamageInfo.pVictim.Center() ).Normalize();
					Vector vecOrigin = tr.vecEndPos - (vecDir * pDamageInfo.pVictim.pev.scale) * 0.0625;

					NetworkMessage m1( MSG_PVS, NetworkMessages::ShieldRic, vecOrigin );
						m1.WriteCoord( vecOrigin.x );
						m1.WriteCoord( vecOrigin.y );
						m1.WriteCoord( vecOrigin.z );
					m1.End();
				}

				float flDamage = pDamageInfo.flDamage;
				float flDamageMultiplier = 1.0; //??

				if( pWeapon.m_bShieldOn )
				{
					pWeapon.m_flShieldTime = g_Engine.time + 0.5;

					if( !pWeapon.m_bSomeBool )
					{
						pWeapon.ResolveRenderProps();
						flDamage = pDamageInfo.flDamage;
					}

					if( flDamage > 0.0 and pDamageInfo.bitsDamageType & (DMG_FREEZE | DMG_DROWN) == 0 ) //0x4020
					{
						if( (pDamageInfo.bitsDamageType & DMG_BLAST) != 0 ) //0x40
							flDamageMultiplier = 0.4;
						else
							flDamageMultiplier = 0.2;

						float flTemp = (flDamage - flDamage * 0.01) * flDamageMultiplier;
						float flRenderamt = pWeapon.m_flTargetRenderamt;

						if( flTemp > flRenderamt )
						{
							pWeapon.m_flTargetRenderamt = 0;
							pWeapon.ShieldOff();
							flDamage = flDamage - flRenderamt * (1.0 / flDamageMultiplier);;
						}
						else
						{
							flDamage = flDamage * 0.01;
							pWeapon.m_flTargetRenderamt = flRenderamt - flTemp;
						}

						if( pWeapon.m_bSomeBool )
							pWeapon.SetRenderAmount( pWeapon.m_flTargetRenderamt );
					}
				}

				pDamageInfo.flDamage = flDamage * 0.75;
			}

			if( pCustom.GetKeyvalue(sCNPCKVPainTime).GetFloat() > g_Engine.time )
				return HOOK_CONTINUE;

			float flNextPainTime = g_Engine.time + Math.RandomFloat(2.5, 4.0);
			pCustom.SetKeyvalue( sCNPCKVPainTime, flNextPainTime );

			pWeapon.PainSound();

			break;
		}

		default: break;
	}

	return HOOK_CONTINUE;
}

HookReturnCode PlayerKilled( CBasePlayer@ pPlayer, CBaseEntity@ pAttacker, int iGib )
{
	KeyValueBuffer@ pKeys = g_EngineFuncs.GetInfoKeyBuffer(pPlayer.edict());

	/*if( (pPlayer.pev.effects & EF_NODRAW) != EF_NODRAW )
	{
		if( pPlayer.pev.waterlevel == WATERLEVEL_HEAD && pPlayer.pev.health > -30 )
		{
			return HOOK_CONTINUE;
		}

		if( MaleModels.find( string(pKeys.GetValue("model")) ) >= 0 )
		{
			switch ( Math.RandomLong( 1, 4 ) )
			{
				case 1: g_SoundSystem.EmitSound( pPlayer.edict(), CHAN_VOICE, "kingpin_loc/death1.wav", 1.0, 0.6 ); break;
				case 2: g_SoundSystem.EmitSound( pPlayer.edict(), CHAN_VOICE, "kingpin_loc/death2.wav", 1.0, 0.6 ); break;
				case 3: g_SoundSystem.EmitSound( pPlayer.edict(), CHAN_VOICE, "kingpin_loc/death3.wav", 1.0, 0.6 ); break;
				case 4: g_SoundSystem.EmitSound( pPlayer.edict(), CHAN_VOICE, "kingpin_loc/death4.wav", 1.0, 0.6 ); break;
			}
		}
		else if( FemaleModels.find( string(pKeys.GetValue("model")) ) >= 0 )
		{
			switch ( Math.RandomLong( 1, 2 ) )
			{
				case 1: g_SoundSystem.EmitSound( pPlayer.edict(), CHAN_VOICE, "combatarms2/misc/FEMALE_DEATH1.wav", 1.0, 0.6 ); break;
				case 2: g_SoundSystem.EmitSound( pPlayer.edict(), CHAN_VOICE, "combatarms2/misc/FEMALE_DEATH2.wav", 1.0, 0.6 ); break;
			}
		}
		else if( (pPlayer.pev.flags & FL_FAKECLIENT) != 0 && FemaleModels.find( string(pKeys.GetValue("model")) ) >= 0 )
		{
			switch ( Math.RandomLong( 1, 2 ) )
			{
				case 1: g_SoundSystem.EmitSound( pPlayer.edict(), CHAN_VOICE, "combatarms2/misc/FEMALE_DEATH1.wav", 1.0, 0.6 ); break;
				case 2: g_SoundSystem.EmitSound( pPlayer.edict(), CHAN_VOICE, "combatarms2/misc/FEMALE_DEATH2.wav", 1.0, 0.6 ); break;
			}
		}
	}*/

	/*if( pPlayer.m_hActiveItem.GetEntity() !is null )
	{
		CBasePlayerWeapon@ pWeapon = cast<CBasePlayerWeapon@>( pPlayer.m_hActiveItem.GetEntity() );

		if( pWeapon.GetClassname() == "weapon_agrunt" or pWeapon.GetClassname() == "weapon_agruntf" or pWeapon.GetClassname() == "weapon_pitdrone" or pWeapon.GetClassname() == "weapon_strooper" or pWeapon.GetClassname() == "weapon_hgrunt" or pWeapon.GetClassname() == "weapon_enforcer" or pWeapon.GetClassname() == "weapon_otis" or pWeapon.GetClassname() == "weapon_payne" or pWeapon.GetClassname() == "weapon_ofgrunt" or pWeapon.GetClassname() == "weapon_srhgrunt" or pWeapon.GetClassname() == "weapon_gonome" )
			g_EntityFuncs.Remove( pWeapon );
	}*/

	if( pPlayer.m_hActiveItem.GetEntity() !is null )
	{
		CBasePlayerWeapon@ pWeapon = cast<CBasePlayerWeapon@>( pPlayer.m_hActiveItem.GetEntity() );

		if( arrsCNPCWeapons.find(pWeapon.GetClassname()) >= 0 )
		{
			g_EntityFuncs.Remove( pWeapon );
		}
	}

        g_SoundSystem.PlaySound(pPlayer.edict(),CHAN_STREAM,"will/null.wav",1.0f,0.3f,0,100,0,true,pPlayer.pev.origin);
        g_SoundSystem.PlaySound(pPlayer.edict(),CHAN_AUTO,"will/null.wav",1.0f,0.3f,0,100,0,true,pPlayer.pev.origin);
        g_SoundSystem.PlaySound(pPlayer.edict(),CHAN_STATIC,"will/null.wav",1.0f,0.3f,0,100,0,true,pPlayer.pev.origin);

	CustomKeyvalues@ pCustom = pPlayer.GetCustomKeyvalues();
	pCustom.SetKeyvalue( sCNPCKV, 0 );

	return HOOK_CONTINUE;
}

} //namespace CNPC END