[REZOLVAT]Eroare server [Biohazard v3.1]

Discutii legate de instalarea, configurarea si modificarea unui server de Counter-Strike.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Post Reply
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

30 Jul 2014, 00:45

Salut tuturor.
Am luat si eu de pe acest forum addonsul Biohazard v3.1 creat de YONTU.
L-am instalat la mine pe server (corect cred eu) dar cand deschid consola imi apare eroarea asta:

Image

Cred ca eroarea vine de la:
[Biohazard 3.1] Nu detii o licenta valida pentru pluginul `Biohazard - Zombie Mod`.

Mai jos spune sa-l contactez pe yontu , dar el nu raspunde...

Acesta este sma de la Biohazard v3.1
| Afiseaza codul
[code]/* Biohazard - Zombie Mod, Classic Infection with new modes
 * Author: cheap_suit, CO-Author: The YONTU
 * Credits: sDs|Aragon* */

#define PLUGIN_NAME	"Biohazard - Zombie Mod"
#define PLUGIN_VERSION	"3.1"
#define PLUGIN_AUTHOR	"cheap_suit"

#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >
#include < xs >

native get_user_golds( id );
native is_user_vip( id );

static const ServerLicensedIp[  ] = "192.168.69.108";

// Aici eliminati/adaugati slash-urile(//) din fata linii daca vreti sa fie activate/dezactivate
#define ULTRA_BLOOD	// Sare mai mult sange cand infectezi
#define GRENADE_STATUS	// Cand tii o grenada in mana in stanga sus va aparea o imagine specifica grenadei

#define FOG_ENABLE  	     1
#define FOG_DENSITY	    "0.0025"
#define FOG_COLOR   	    "128 128 128"	//"127 170 255"

#define DEFAULT_PMODEL	    "models/player/bio30_zombie/bio30_zombie.mdl"	// Zombie Model
#define DEFAULT_WMODEL	    "models/player/bio30_zombie/claws_zombie.mdl"	// Zombie Hands

#define DEFAULT_HEALTH		400.0	// Health value
#define DEFAULT_SPEED		290.0	// Speed value
#define DEFAULT_GRAVITY		0.8	// Gravity multiplier
#define DEFAULT_ATTACK		2.0	// Zombie damage multiplier
#define DEFAULT_REGENDLY	0.18	// Regeneration delay value
#define DEFAULT_KNOCKBACK	1.0	// Knockback multiplier
#define DEFAULT_NOFLASH	1.0	// Set 1.0 for Zombie No flash
#define DEFAULT_ONLYVIP		0.0	// Set 1.0 for Zombie Class Only VIP

#define clamp_byte(%1)		( clamp( %1, 0, 255 ) )
#define pack_color(%1,%2,%3)	( %3 + ( %2 << 8 ) + ( %1 << 16 ) )

#define FFADE_IN			0x0000	// Just here so we don't pass 0 into the function
#define FFADE_OUT		0x0001	// Fade out (not in)
#define FFADE_MODULATE		0x0002	// Modulate (don't blend)
#define FFADE_STAYOUT		0x0004	// ignores the duration, stays faded out until new ScreenFade message received
#define UNIT_SECOND		(1<<12)

#define OFFSET_DEATH 		444
#define OFFSET_TEAM 		114
#define OFFSET_ARMOR 		112
#define OFFSET_NVG 		129
#define OFFSET_CSMONEY 		115
#define OFFSET_PRIMARYWEAPON 	116
#define OFFSET_WEAPONTYPE 	43
#define OFFSET_CLIPAMMO		51
#define EXTRAOFFSET_WEAPONS 	4

#define OFFSET_AMMO_338MAGNUM 	377
#define OFFSET_AMMO_762NATO 		378
#define OFFSET_AMMO_556NATOBOX 	379
#define OFFSET_AMMO_556NATO 		380
#define OFFSET_AMMO_BUCKSHOT 		381
#define OFFSET_AMMO_45ACP 		382
#define OFFSET_AMMO_57MM 		383
#define OFFSET_AMMO_50AE 		384
#define OFFSET_AMMO_357SIG 		385
#define OFFSET_AMMO_9MM 		386

#define OFFSET_LASTPRIM 	368
#define OFFSET_LASTSEC 		369
#define OFFSET_LASTKNI 		370

#define TASKID_COUNTDOWN		452
#define TASKID_STRIPNGIVE		698
#define TASKID_NEWROUND		641
#define TASKID_INITROUND 		222
#define TASKID_STARTROUND 		153
#define TASKID_BALANCETEAM 		375
#define TASKID_UPDATESCR 		264
#define TASKID_SPAWNDELAY 		786
#define TASKID_WEAPONSMENU 		564
#define TASKID_CHECKSPAWN 		423
#define TASKID_CZBOTPDATA 		312
#define TASK_GLOW_DIE			1212

#define EQUIP_PRI 	(1<<0)
#define EQUIP_SEC 	(1<<1)
#define EQUIP_GREN 	(1<<2)
#define EQUIP_ALL 	(1<<0 | 1<<1 | 1<<2)

#define HAS_NVG 	(1<<0)
#define ATTRIB_BOMB 	(1<<1)
#define DMG_HEGRENADE 	(1<<24)

#define MODEL_CLASSNAME 	"player_model"
#define IMPULSE_FLASHLIGHT 	100

#define MAX_SPAWNS 	128
#define MAX_CLASSES 	14
#define MAX_DATA 	13

#define DATA_HEALTH 	0
#define DATA_SPEED 	1
#define DATA_GRAVITY 	2
#define DATA_ATTACK 	3
#define DATA_REGENDLY 	4
#define DATA_KNOCKBACK 	5
#define DATA_NOFLASH 	6
#define DATA_ONLYVIP 	7

#define fm_get_user_team(%1) get_pdata_int(%1, OFFSET_TEAM)
#define fm_get_user_deaths(%1) get_pdata_int(%1, OFFSET_DEATH)
#define fm_set_user_deaths(%1,%2) set_pdata_int(%1, OFFSET_DEATH, %2)
#define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CSMONEY)
#define fm_get_user_armortype(%1) get_pdata_int(%1, OFFSET_ARMOR)
#define fm_set_user_armortype(%1,%2) set_pdata_int(%1, OFFSET_ARMOR, %2)
#define fm_get_weapon_id(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define fm_get_weapon_ammo(%1) get_pdata_int(%1, OFFSET_CLIPAMMO, EXTRAOFFSET_WEAPONS)
#define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
#define fm_reset_user_primary(%1) set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
#define fm_lastprimary(%1) get_pdata_cbase(id, OFFSET_LASTPRIM)
#define fm_lastsecondry(%1) get_pdata_cbase(id, OFFSET_LASTSEC)
#define fm_lastknife(%1) get_pdata_cbase(id, OFFSET_LASTKNI)
#define fm_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), "model", %2, %3) 

#define _random(%1) random_num(0, %1 - 1)
#define AMMOWP_NULL (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

enum
{
	MAX_CLIP = 0,
	MAX_AMMO
}

enum
{
	MENU_PRIMARY = 1,
	MENU_SECONDARY
}

enum
{
	CS_TEAM_UNASSIGNED = 0,
	CS_TEAM_T,
	CS_TEAM_CT,
	CS_TEAM_SPECTATOR
}

enum
{
	CS_ARMOR_NONE = 0,
	CS_ARMOR_KEVLAR,
	CS_ARMOR_VESTHELM
}

enum
{
	KBPOWER_357SIG = 0,
	KBPOWER_762NATO,
	KBPOWER_BUCKSHOT,
	KBPOWER_45ACP,
	KBPOWER_556NATO,
	KBPOWER_9MM,
	KBPOWER_57MM,
	KBPOWER_338MAGNUM,
	KBPOWER_556NATOBOX,
	KBPOWER_50AE
}

new g_zombie_weapname[] = "melee"
new g_infection_name[]  = "infection"

// primary weapons (menu|game)
new g_primaryweapons[][][] = 
{ 
	{ "M4A1 Carbine",     "weapon_m4a1"    },
	{ "AK-47 Kalashnikov",     "weapon_ak47"    },
	{ "Steyr AUG A1",      "weapon_aug"     },
	{ "SG-552 Commando",    "weapon_sg552"   },
	//{ "Galil",    "weapon_galil"   },
	{ "Famas",    "weapon_famas"   },
	{ "MP5 Navy", "weapon_mp5navy" },
	{ "XM1014 M4",   "weapon_xm1014"  },
	{ "M3 Super 90",       "weapon_m3"      },
	//{ "P90",      "weapon_p90"     },
	{ "M249 Para Machinegun",     "weapon_m249"    },
	{ "SG-550 Auto-Sniper",    "weapon_sg550"   },
	{ "G3SG1 Auto-Sniper",    "weapon_g3sg1"   },
	{ "AWP Magnum Sniper",    "weapon_awp"   }	
}

// secondary weapons (menu|game)
new g_secondaryweapons[][][] = 
{ 
	{ "Desert Eagle .50 AE",   "weapon_deagle"  },
	{ "USP .45 ACP Tactical",      "weapon_usp"     },
	{ "Dual Elite Berettas",    "weapon_elite"   },
	{ "Glock 18C",    "weapon_glock18"   }
}

// grenade loadout (game)
new g_grenades[][] = 
{ 
	"weapon_hegrenade",
	"weapon_flashbang",
	"weapon_smokegrenade"
}

new Float:g_knockbackpower[] =
{
	3.0,  // KBPOWER_357SIG
	4.0,  // KBPOWER_762NATO
	9.5,  // KBPOWER_BUCKSHOT
	3.0,  // KBPOWER_45ACP
	4.5,  // KBPOWER_556NATO
	3.0,  // KBPOWER_9MM
	3.5,  // KBPOWER_57MM
	12.0, // KBPOWER_338MAGNUM
	4.0,  // KBPOWER_556NATOBOX
	3.8   // KBPOWER_50AE
}

new g_appear_sounds[  ][  ] = {

	"Biohazard30/zombie_coming_1.wav",
	"Biohazard30/zombie_coming_2.wav",
	"Biohazard30/zombie_coming_3.wav",
	"Biohazard30/zombie_comeback.wav"
}

new g_survivor_win_sounds[][] =
{
	"Biohazard30/survivor_win1.wav",
	"Biohazard30/survivor_win2.wav",
	"Biohazard30/survivor_win3.wav"
}

new g_zombie_win_sounds[][] = 
{ 
	"Biohazard30/zombie_win1.wav",
	"Biohazard30/zombie_win2.wav",
	"Biohazard30/zombie_win3.wav"	
}

new g_scream_sounds[][] = 
{ 
	"Biohazard30/zombie_infec1.wav",
	"Biohazard30/zombie_infec2.wav",
	"Biohazard30/zombie_infec3.wav"
}

new g_zombie_miss_sounds[][] = 
{ 
	"zombie/claw_miss1.wav",
	"zombie/claw_miss2.wav"				
}

new g_zombie_hit_sounds[][] = 
{ 
	"zombie/claw_strike1.wav",
	"zombie/claw_strike2.wav",
	"zombie/claw_strike3.wav"
}

new g_zombie_die_sounds[][] = 
{
	"Biohazard30/zombie_die1.wav",
	"Biohazard30/zombie_die2.wav",
	"Biohazard30/zombie_die3.wav",
	"Biohazard30/zombie_die4.wav",
	"Biohazard30/zombie_die5.wav"
}

new CountDownSounds[][] = {

	"Biohazard30/Countdown/timer01.wav",
	"Biohazard30/Countdown/timer02.wav",
	"Biohazard30/Countdown/timer03.wav",
	"Biohazard30/Countdown/timer04.wav",
	"Biohazard30/Countdown/timer05.wav",
	"Biohazard30/Countdown/timer06.wav",
	"Biohazard30/Countdown/timer07.wav",
	"Biohazard30/Countdown/timer08.wav",
	"Biohazard30/Countdown/timer09.wav",
	"Biohazard30/Countdown/timer10.wav"
}

new const g_weapon_ammo[  ][  ] = {

	{ -1, -1 },	// NULL
	{ 13, 52 },	// CSW_P228
	{ -1, -1 },	// NULL
	{ 15, 75 },	// CSW_SCOUT
	{ -1, -1 },	// CSW_HEGRENADE
	{ 15, 30 },	// CSW_XM1014
	{ -1, -1 },	// CSW_C4
	{ 35, 140 },	// CSW_MAC10
	{ 40, 120 },	// CSW_AUG
	{ -1, -1 },	// CSW_SMOKEGRENADE
	{ 30, 150 },	// CSW_ELITE
	{ 20, 100 },	// CSW_FIVESEVEN
	{ 25, 100 },	// CSW_UMP45
	{ 40, 80 },	// CSW_SG550
	{ 40, 160 },	// CSW_GALIL
	{ 30, 120 },	// CSW_FAMAS
	{ 20, 160 },	// CSW_USP
	{ 20, 120 },	// CSW_GLOCK18
	{ 3, 30 },	// CSW_AWP
	{ 40, 120 },	// CSW_MP5NAVY
	{ 100, 200 },	// CSW_M249
	{ 13, 39 },	// CSW_M3
	{ 45, 90 },	// CSW_M4A1
	{ 30, 120 },	// CSW_TMP
	{ 20, 60 },	// CSW_G3SG1
	{ -1, -1 },	// CSW_FLASHBANG
	{ 15, 45 },	// CSW_DEAGLE
	{ 25, 125 },	// CSW_SG552
	{ 40, 120 },	// CSW_AK47
	{ -1, -1 },	// CSW_KNIFE
	{ 50, 130 }	// CSW_P90
}

new const g_weapon_knockback[] =
{
	-1, 
	KBPOWER_357SIG, 
	-1, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_BUCKSHOT, 
	-1, 
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	-1, 
	KBPOWER_9MM, 
	KBPOWER_57MM,
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_45ACP,
	KBPOWER_9MM, 
	KBPOWER_338MAGNUM,
	KBPOWER_9MM, 
	KBPOWER_556NATOBOX,
	KBPOWER_BUCKSHOT, 
	KBPOWER_556NATO, 
	KBPOWER_9MM, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_50AE, 
	KBPOWER_556NATO, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_57MM
}

new const CS_TEAM_NAMES[  ][  ] = {

	  "UNASSIGNED"
	, "TERRORIST"
	, "CT"
	, "SPECTATOR"
}

new const g_remove_entities[][] = 
{ 
	"func_bomb_target",    
	"info_bomb_target", 
	"hostage_entity",      
	"monster_scientist", 
	"func_hostage_rescue", 
	"info_hostage_rescue",
	"info_vip_start",      
	"func_vip_safetyzone", 
	"func_escapezone",     
	"func_buyzone"
}

new const g_dataname[][] = 
{ 
	"HEALTH", 
	"SPEED", 
	"GRAVITY", 
	"ATTACK", 
	"REGENDLY", 
	"KNOCKBACK",
	"NOFLASH",
	"ONLYVIP"
}

new const g_teaminfo[][] = 
{ 
	"UNASSIGNED", 
	"TERRORIST",
	"CT",
	"SPECTATOR" 
}

new SkyTermination[  ][  ] = {

	"bk",
	"dn",
	"ft",
	"lf",
	"rt",
	"up"
}

// Global Vars
new CountDownDelay;
new g_maxplayers;
new g_spawncount;
new g_buyzone;
new g_botclient_pdata;
new g_menuposition[33];
new g_player_weapons[33][2];

// Sync HUD
new g_sync_hpdisplay;
new g_sync_msgdisplay;

// Forwards
new g_fwd_spawn;
new g_fwd_result;
new g_fwd_infect;
new g_fwd_gamestart; 

// Messages
new g_msg_flashlight;
new g_msg_teaminfo;
new g_msg_scoreattrib;
new g_msg_money;
new g_msg_scoreinfo;
new g_msg_deathmsg;
new g_msg_screenfade;

new Float:g_buytime;
new Float:g_spawns[MAX_SPAWNS+1][9];
new Float:g_vecvel[3];
new Float:g_teams_targettime;
new g_switchingteam;

// Global Booleans without parametres
new bool:g_brestorevel;
new bool:g_infecting;
new bool:g_gamestarted;
new bool:g_roundstarted;
new bool:g_roundended;
new bool:g_czero;

// Global Booleans with parametres
new bool:g_disconnected[33];	// Is user Disconnected
new bool:g_blockmodel[33];	// Block Model ?
new bool:g_showmenu[33];	// Show menu ?
new bool:g_menufailsafe[33];	// Show menu fail ?
new bool:g_welcomemsg[33];	// Display welcom msg ?
new bool:g_suicide[33];	// Is user suicided ?

// Zombie Classes & Zombie Configuration
new bool:g_zombie[33];	// Is user Zombie ?
new bool:g_falling[33];	// Is user Touch floor ?
new bool:g_preinfect[33];	// Is user preinfect ?
new g_classcount;
new g_class_name[MAX_CLASSES+1][32];
new g_class_desc[MAX_CLASSES+1][32];
new g_class_pmodel[MAX_CLASSES+1][64];
new g_class_wmodel[MAX_CLASSES+1][64];
new Float:g_class_data[MAX_CLASSES+1][MAX_DATA];
new g_player_class[33];
new Float:g_regendelay[33];
//new Float:g_hitdelay[33];
new g_mutate[33];
new g_victim[33];
new g_modelent[33];

// Cvars
new cvar_randomspawn;
new cvar_skyname;
new cvar_autoteambalance[4];
new cvar_starttime;
new cvar_countdown;
new cvar_autonvg;
new cvar_winsounds;
new cvar_weaponsmenu;
new cvar_lights;
new cvar_killbonus;
new cvar_enabled;
new cvar_gamedescription;
new cvar_botquota;
new cvar_maxzombies;
new cvar_flashbang;
new cvar_buytime;
new cvar_respawnaszombie;
new cvar_punishsuicide;
new cvar_infectmoney;
new cvar_showtruehealth;
new cvar_obeyarmor;
new cvar_impactexplode;
new cvar_caphealthdisplay;
new cvar_zombie_hpmulti;
new cvar_randomclass;
new cvar_zombiemulti;
new cvar_ammo;
new cvar_killreward;
new cvar_painshockfree;
new cvar_zombie_class;
// Knock back system
new cvar_shootobjects;
new cvar_pushpwr_weapon;
new cvar_pushpwr_zombie;
new cvar_knockback_duck;
new cvar_knockback;
new cvar_knockback_dist;
new cvar_biohazard_icon;
new cvar_entrie_class_vip;
new cvar_zombie_appear_sound;

#if defined GRENADE_STATUS
// Cvars
new cvar_status;
new cvar_fire_icon;
new cvar_fire_color;
new cvar_frost_icon;
new cvar_frost_color;
new cvar_flare_icon;
new cvar_flare_color;
// Vars
new g_StatusIcon;
new g_GrenadeIcon[ 33 ][ 32 ];
#endif

public plugin_precache()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );
		register_cvar( "bh_version", PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER );
		set_cvar_string( "bh_version", PLUGIN_VERSION );
	
		cvar_enabled = register_cvar("bh_enabled", "1")

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_gamedescription = register_cvar("bh_gamedescription", "Biohazard v3.1b")
		cvar_skyname = register_cvar("bh_skyname", "siv2")
		cvar_lights = register_cvar("bh_lights", "d")
		cvar_starttime = register_cvar("bh_starttime", "15.0")
		cvar_countdown = register_cvar("bh_countdown", "1")
		cvar_buytime = register_cvar("bh_buytime", "0")
		cvar_randomspawn = register_cvar("bh_randomspawn", "1")
		cvar_punishsuicide = register_cvar("bh_punishsuicide", "1")
		cvar_winsounds = register_cvar("bh_winsounds", "1")
		cvar_autonvg = register_cvar("bh_autonvg", "1")
		cvar_respawnaszombie = register_cvar("bh_respawnaszombie", "1")
		cvar_painshockfree = register_cvar("bh_painshockfree", "1")
		cvar_knockback = register_cvar("bh_knockback", "1")
		cvar_knockback_duck = register_cvar("bh_knockback_duck", "1")
		cvar_knockback_dist = register_cvar("bh_knockback_dist", "280.0")
		cvar_obeyarmor = register_cvar("bh_obeyarmor", "0")
		cvar_infectmoney = register_cvar("bh_infectionmoney", "1000")
		cvar_biohazard_icon = register_cvar("bh_biohazard_icon", "1")
		cvar_caphealthdisplay = register_cvar("bh_caphealthdisplay", "1")
		cvar_weaponsmenu = register_cvar("bh_weaponsmenu", "1")
		cvar_ammo = register_cvar("bh_ammo", "1")
		cvar_maxzombies = register_cvar("bh_maxzombies", "31")
		cvar_flashbang = register_cvar("bh_flashbang", "1")
		cvar_impactexplode = register_cvar("bh_impactexplode", "1")
		cvar_showtruehealth = register_cvar("bh_showtruehealth", "1")
		cvar_zombiemulti = register_cvar("bh_zombie_countmulti", "0.15")
		cvar_zombie_hpmulti = register_cvar("bh_zombie_hpmulti", "10000.0")
		cvar_zombie_class = register_cvar("bh_zombie_class", "1")
		cvar_randomclass = register_cvar("bh_randomclass", "1")
		cvar_killbonus = register_cvar("bh_kill_bonus", "1")
		cvar_killreward = register_cvar("bh_kill_reward", "2")
		cvar_shootobjects = register_cvar("bh_shootobjects", "1")
		cvar_pushpwr_weapon = register_cvar("bh_pushpwr_weapon", "2.0")
		cvar_pushpwr_zombie = register_cvar("bh_pushpwr_zombie", "5.0")
		cvar_entrie_class_vip = register_cvar("bh_entrie_class_only_vip", "0")
		cvar_zombie_appear_sound = register_cvar( "bh_zombie_appear_sound", "2" );
	
		new file[64]
		get_configsdir(file, 63)
		format(file, 63, "%s/bh_cvars.cfg", file)
	
		if(file_exists(file)) 
			server_cmd( "exec %s", file)
	
		new mapname[32]
		get_mapname(mapname, 31)
		register_spawnpoints(mapname)
		
		register_zombieclasses("bh_zombieclass.ini")
		register_dictionary("biohazard.txt")
	
		precache_model(DEFAULT_PMODEL)
		precache_model(DEFAULT_WMODEL)
	
		new i
		for(i = 0; i < g_classcount; i++)
		{
			precache_model(g_class_pmodel)
			precache_model(g_class_wmodel)
		}

		for( i = 0; i < sizeof g_appear_sounds; i++ )
			precache_sound( g_appear_sounds[ i ] );
	
		for(i = 0; i < sizeof g_zombie_miss_sounds; i++)
			precache_sound(g_zombie_miss_sounds)
	
		for(i = 0; i < sizeof g_zombie_hit_sounds; i++) 
			precache_sound(g_zombie_hit_sounds)
	
		for(i = 0; i < sizeof g_scream_sounds; i++) 
			precache_sound(g_scream_sounds)
	
		for(i = 0; i < sizeof g_zombie_die_sounds; i++)
			precache_sound(g_zombie_die_sounds)
	
		for(i = 0; i < sizeof g_zombie_win_sounds; i++) 
			precache_sound(g_zombie_win_sounds)

		for(i = 0; i < sizeof CountDownSounds; i++)
			precache_sound(CountDownSounds)

		for(i = 0; i < sizeof g_survivor_win_sounds; i++)
			precache_sound(g_survivor_win_sounds)

		// Sky Changer
		new SkyName[ 32 ];
		get_pcvar_string( cvar_skyname, SkyName, 31 );
	
		if( strlen( SkyName ) > 0 )
			set_cvar_string( "sv_skyname", SkyName );

		for( i = 0; i < sizeof SkyTermination; ++i ) {

			new Sky[ 64 ];
			formatex( Sky, sizeof( Sky ) - 1, "gfx/env/%s%s.tga", SkyName, SkyTermination[ i ] );
			precache_generic( Sky );
		}
	
		g_fwd_spawn = register_forward(FM_Spawn, "fwd_spawn")
	
		g_buyzone = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"))
		if(g_buyzone) 
		{
			dllfunc(DLLFunc_Spawn, g_buyzone)
			set_pev(g_buyzone, pev_solid, SOLID_NOT)
		}
	
		new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_bomb_target"))
		if(ent) 
		{
			dllfunc(DLLFunc_Spawn, ent)
			set_pev(ent, pev_solid, SOLID_NOT)
		}

		#if FOG_ENABLE
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
		if(ent)
		{
			fm_set_kvd(ent, "density", FOG_DENSITY, "env_fog")
			fm_set_kvd(ent, "rendercolor", FOG_COLOR, "env_fog")
		}
		#endif
	}
}

public plugin_init()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_botquota = get_cvar_pointer("bot_quota")
		cvar_autoteambalance[0] = get_cvar_pointer("mp_autoteambalance")
		cvar_autoteambalance[1] = get_pcvar_num(cvar_autoteambalance[0])
		set_pcvar_num(cvar_autoteambalance[0], 0)

		register_clcmd("jointeam", "cmd_jointeam")
		register_clcmd("say /class", "cmd_classmenu")
		register_clcmd("say_team /class", "cmd_classmenu")
		register_clcmd("say /guns", "cmd_enablemenu")
		register_clcmd("say_team /guns", "cmd_enablemenu")
		register_clcmd("say /help", "cmd_helpmotd")
		register_clcmd("amx_infect", "cmd_infectuser", ADMIN_BAN, "<name or #userid>")
	
		register_menu("Equipment", 1023, "action_equip")
		register_menu("Primary", 1023, "action_prim")
		register_menu("Secondary", 1023, "action_sec")
	
		unregister_forward(FM_Spawn, g_fwd_spawn)
		register_forward(FM_CmdStart, "fwd_cmdstart")
		register_forward(FM_EmitSound, "fwd_emitsound")
		register_forward(FM_GetGameDescription, "fwd_gamedescription")
		register_forward(FM_CreateNamedEntity, "fwd_createnamedentity")
		register_forward(FM_ClientKill, "fwd_clientkill")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink_post", 1)
		register_forward(FM_PlayerPostThink, "fwd_player_postthink")
		register_forward(FM_SetClientKeyValue, "fwd_setclientkeyvalue")

		RegisterHam(Ham_TakeDamage, "player", "bacon_takedamage_player")
		RegisterHam(Ham_Killed, "player", "bacon_killed_player")
		RegisterHam(Ham_Spawn, "player", "bacon_spawn_player_post", 1)
		RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
		RegisterHam(Ham_TraceAttack, "func_pushable", "bacon_traceattack_pushable")
		RegisterHam(Ham_Use, "func_tank", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankmortar", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankrocket", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tanklaser", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_pushable", "bacon_use_pushable")
		RegisterHam(Ham_Touch, "func_pushable", "bacon_touch_pushable")
		RegisterHam(Ham_Touch, "weaponbox", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "armoury_entity", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "weapon_shield", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "grenade", "bacon_touch_grenade")
		RegisterHam(Ham_Item_Deploy , "weapon_knife", "bacon_claws_deploy_post", 1);

		register_message(get_user_msgid("Health"), "msg_health")
		register_message(get_user_msgid("TextMsg"), "msg_textmsg")
		register_message(get_user_msgid("SendAudio"), "msg_sendaudio")
		register_message(get_user_msgid("StatusIcon"), "msg_statusicon")
		register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
		register_message(get_user_msgid("DeathMsg"), "msg_deathmsg")
		register_message(get_user_msgid("ScreenFade"), "msg_screenfade")
		register_message(get_user_msgid("TeamInfo"), "msg_teaminfo")
		register_message(get_user_msgid("ClCorpse"), "msg_clcorpse")
		register_message(get_user_msgid("WeapPickup"), "msg_weaponpickup")
		register_message(get_user_msgid("AmmoPickup"), "msg_ammopickup")

		register_event("TextMsg", "event_textmsg", "a", "2=#Game_will_restart_in")
		register_event("HLTV", "event_newround", "a", "1=0", "2=0")
		register_event("CurWeapon", "event_curweapon", "be", "1=1")
		register_event("ArmorType", "event_armortype", "be")
		register_event("Damage", "event_damage", "be")
	
		register_logevent("logevent_round_start", 2, "1=Round_Start")
		register_logevent("logevent_round_end", 2, "1=Round_End")
	
		g_msg_flashlight = get_user_msgid("Flashlight")
		g_msg_teaminfo = get_user_msgid("TeamInfo")
		g_msg_scoreattrib = get_user_msgid("ScoreAttrib")
		g_msg_scoreinfo = get_user_msgid("ScoreInfo")
		g_msg_deathmsg = get_user_msgid("DeathMsg")
		g_msg_money = get_user_msgid("Money")
		g_msg_screenfade = get_user_msgid("ScreenFade")
	
		g_fwd_infect = CreateMultiForward("event_infect", ET_IGNORE, FP_CELL, FP_CELL)
		g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_IGNORE)

		g_sync_hpdisplay = CreateHudSyncObj()
		g_sync_msgdisplay = CreateHudSyncObj()
	
		g_maxplayers = get_maxplayers()
	
		new mod[3]
		get_modname(mod, 2)
		g_czero = (mod[0] == 'c' && mod[1] == 'z') ? true : false
	
		// Lights Map
		new lights[2]
		get_pcvar_string(cvar_lights, lights, 1)
	
		if(strlen(lights) > 0)
		{
			set_task(3.0, "task_lights", _, _, _, "b")
		
			set_cvar_num("sv_skycolor_r", 0)
			set_cvar_num("sv_skycolor_g", 0)
			set_cvar_num("sv_skycolor_b", 0)
		}
	
		// Show Details
		if(get_pcvar_num(cvar_showtruehealth))
			set_task(0.1, "task_showtruehealth", _, _, _, "b")

#if defined GRENADE_STATUS
		GrenadeStatus(  );
#endif

		server_print( "[Biohazard 3.1] Felicitari! Detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
	} else {

		server_print( "[Biohazard 3.1] Nu detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
		server_print( "[Biohazard 3.1] Pentru mai multe detalii contacteaza-ma la Y!M: [email protected] !" );

		pause( "ade" );
	}
}

public plugin_end()
	if(get_pcvar_num(cvar_enabled))
		set_pcvar_num(cvar_autoteambalance[0], cvar_autoteambalance[1])

public plugin_natives()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_library("biohazardf")
		register_native("preinfect_user", "native_preinfect_user", 1)
		register_native("infect_user", "native_infect_user", 1)
		register_native("cure_user", "native_cure_user", 1)
		register_native("register_class", "native_register_class", 1)
		register_native("get_class_id", "native_get_class_id", 1)
		register_native("set_class_pmodel", "native_set_class_pmodel", 1)
		register_native("set_class_wmodel", "native_set_class_wmodel", 1)
		register_native("set_class_data", "native_set_class_data", 1)
		register_native("get_class_data", "native_get_class_data", 1)
		register_native("game_started", "native_game_started", 1)
		register_native("is_user_zombie", "native_is_user_zombie", 1)
		register_native("is_user_infected", "native_is_user_infected", 1)
		register_native("get_user_class", "native_get_user_class",  1)
		register_native("get_humans", "native_get_humans", 1)
		register_native("get_zombies", "native_get_zombies", 1)
	}
}

public client_connect(id)
{
	g_showmenu[id] = true
	g_welcomemsg[id] = true
	g_blockmodel[id] = true
	g_zombie[id] = false
	g_preinfect[id] = false
	g_disconnected[id] = false
	g_falling[id] = false
	g_menufailsafe[id] = false
	g_victim[id] = 0
	g_mutate[id] = -1
	g_player_class[id] = 0
	g_player_weapons[id][0] = -1
	g_player_weapons[id][1] = -1
	g_regendelay[id] = 0.0

	remove_user_model(g_modelent[id])
}

public client_putinserver(id)
{
	if(!g_botclient_pdata && g_czero) 
	{
		static param[1]
		param[0] = id
		
		if(!task_exists(TASKID_CZBOTPDATA))
			set_task(1.0, "task_botclient_pdata", TASKID_CZBOTPDATA, param, 1)
	}

	if( get_pcvar_num( cvar_entrie_class_vip ) ) {

		if( g_classcount > 1 ) {
		
			new HaveClass = false;
		
			if( is_user_bot( id ) )
				return 1;

			for( new i = 0; i < g_classcount; i++ ) {

				if( g_class_data[ i ][ DATA_ONLYVIP ] == 0.0 && is_user_vip( id ) || g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 ) {

					g_player_class[ id ] = i;
					HaveClass = true;
				}
			}
		
			if( !HaveClass ) {
				
				if( get_pcvar_num( cvar_randomclass ) && g_classcount > 1 ) {
					
					g_player_class[ id ] = _random( g_classcount );
				}
			}
		}
	}

	return 0;
}

public client_disconnect(id)
{
	remove_task(TASKID_STRIPNGIVE + id)
	remove_task(TASKID_UPDATESCR + id)
	remove_task(TASKID_SPAWNDELAY + id)
	remove_task(TASKID_WEAPONSMENU + id)
	remove_task(TASKID_CHECKSPAWN + id)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );

	g_disconnected[id] = true
	remove_user_model(g_modelent[id])
}

public cmd_jointeam(id)
{
	if(is_user_alive(id) && g_zombie[id])
	{
		ColorChat( id, "%L", id, "CMD_TEAMCHANGE")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public cmd_classmenu( id ) {

	if( is_user_connected( id ) && g_classcount ) {
		
		new ClassMenuTitle[ 64 ];
		new ClassMenu;
		
		formatex( ClassMenuTitle, sizeof( ClassMenuTitle ) - 1, "\r%L", 0, "MENU_TITLE4" );
		ClassMenu = menu_create( ClassMenuTitle, "ClassCmd" );
		
		for( new i = 0; i < g_classcount; ++i ) {
			
			new ClassInfo[ 512 ];
			
			if( g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) )
				formatex( ClassInfo, sizeof( ClassInfo ) - 1,"\d%s (\d%s) - \rOnly VIP", g_class_name[ i ], g_class_desc[ i ] );
			else
				formatex( ClassInfo, sizeof( ClassInfo ) - 1, "\w%s \r(\y%s\r)", g_class_name[ i ], g_class_desc[ i ] );
			
			new Num[ 64 ];
			formatex( Num, sizeof( Num ) - 1, "%d", i );
			menu_additem( ClassMenu, ClassInfo, Num, 0 );
		}
		
		menu_setprop( ClassMenu, MPROP_EXIT, MEXIT_ALL );
		
		menu_display( id, ClassMenu, 0 );
	}
}

public cmd_enablemenu(id)
{	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		ColorChat( id, "%L", id, g_showmenu[id] == false ? "MENU_REENABLED" : "MENU_ALENABLED")
		g_showmenu[id] = true
	}
}

public cmd_helpmotd(id)
{
	static motd[2048]
	formatex(motd, 2047, "%L", id, "HELP_MOTD")
	replace(motd, 2047, "#Version#", PLUGIN_VERSION)
	
	show_motd(id, motd, "Biohazard Help")
}	

public cmd_infectuser(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED_MAIN
	
	static arg1[32]
	read_argv(1, arg1, 31)
	
	static target
	target = cmd_target(id, arg1, (CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF|CMDTARGET_ONLY_ALIVE))
	
	if(!is_user_connected(target) || g_zombie[target])
		return PLUGIN_HANDLED_MAIN
	
	if(!allow_infection())
	{
		console_print(id, "%L", id, "CMD_MAXZOMBIES")
		return PLUGIN_HANDLED_MAIN
	}
	
	if(!g_gamestarted)
	{
		console_print(id, "%L", id, "CMD_GAMENOTSTARTED")
		return PLUGIN_HANDLED_MAIN
	}
			
	static name[32] 
	get_user_name(target, name, 31)
	
	console_print(id, "%L", id, "CMD_INFECTED", name)
	infect_user(target, 0)
	
	return PLUGIN_HANDLED_MAIN
}

public msg_teaminfo(msgid, dest, id)
{
	if(!g_gamestarted)
		return PLUGIN_CONTINUE

	// Don't pick up our own TeamInfo messages for this player (bugfix)
	if (g_switchingteam)
		return PLUGIN_CONTINUE

	static team[2]
	get_msg_arg_string(2, team, 1)
	
	if(team[0] != 'U')
		return PLUGIN_CONTINUE

	id = get_msg_arg_int(1)
	if(is_user_alive(id) || !g_disconnected[id])
		return PLUGIN_CONTINUE

	g_disconnected[id] = false
	id = randomly_pick_zombie()
	if(id)
	{
		fm_set_user_team(id, g_zombie[id] ? CS_TEAM_CT : CS_TEAM_T, 0)
		set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)
	}
	return PLUGIN_CONTINUE
}

public msg_screenfade(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_flashbang))
		return PLUGIN_CONTINUE
	
	if(!g_zombie[id] || !is_user_alive(id) || g_class_data[g_player_class[id]][DATA_NOFLASH] > 0.0)
	{
		static data[4]
		data[0] = get_msg_arg_int(4)
		data[1] = get_msg_arg_int(5)
		data[2] = get_msg_arg_int(6)
		data[3] = get_msg_arg_int(7)
		
		if(data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] > 199)
			return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public msg_scoreattrib(msgid, dest, id)
{
	static attrib 
	attrib = get_msg_arg_int(2)
	
	if(attrib == ATTRIB_BOMB)
		set_msg_arg_int(2, ARG_BYTE, 0)
}

public msg_statusicon(msgid, dest, id)
{
	static icon[3]
	get_msg_arg_string(2, icon, 2)
	
	return (icon[0] == 'c' && icon[1] == '4') ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}

public msg_weaponpickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_ammopickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_deathmsg(msgid, dest, id) 
{
	static killer
	killer = get_msg_arg_int(1)

	if(is_user_connected(killer) && g_zombie[killer])
		set_msg_arg_string(4, g_zombie_weapname)
}

public msg_sendaudio(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_winsounds))
		return PLUGIN_CONTINUE
	
	static audiocode [22]
	get_msg_arg_string(2, audiocode, 21)
	
	if(equal(audiocode[7], "terwin"))
		set_msg_arg_string(2, g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
	else if(equal(audiocode[7], "ctwin"))
		set_msg_arg_string(2, g_survivor_win_sounds[_random(sizeof g_survivor_win_sounds)])
	
	return PLUGIN_CONTINUE
}

public msg_health(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_caphealthdisplay))
		return PLUGIN_CONTINUE
	
	static health
	health = get_msg_arg_int(1)
		
	if(health > 255) 
		set_msg_arg_int(1, ARG_BYTE, 255)
	
	return PLUGIN_CONTINUE
}

public msg_textmsg(msgid, dest, id)
{
	if(get_msg_arg_int(1) != 4)
		return PLUGIN_CONTINUE
	
	static txtmsg[25], winmsg[32]
	get_msg_arg_string(2, txtmsg, 24)
	
	if(equal(txtmsg[1], "Game_bomb_drop"))
		return PLUGIN_HANDLED

	else if(equal(txtmsg[1], "Terrorists_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_ZOMBIES")
		set_msg_arg_string(2, winmsg)
	}
	else if(equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_SURVIVORS")
		set_msg_arg_string(2, winmsg)
	}
	return PLUGIN_CONTINUE
}

public msg_clcorpse(msgid, dest, id)
{
	id = get_msg_arg_int(12)
	if(!g_zombie[id])
		return PLUGIN_CONTINUE
	
	static ent
	ent = fm_find_ent_by_owner(-1, MODEL_CLASSNAME, id)
	
	if(ent)
	{
		static model[64]
		pev(ent, pev_model, model, 63)
		
		set_msg_arg_string(1, model)
	}

	return PLUGIN_CONTINUE
}

public logevent_round_start()
{
	g_roundended = false
	g_roundstarted = true
	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public logevent_round_end()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	remove_task(TASKID_BALANCETEAM) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	set_task(0.1, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_textmsg()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	static seconds[5] 
	read_data(3, seconds, 4)
	
	static Float:tasktime 
	tasktime = float(str_to_num(seconds)) - 0.5
	
	remove_task(TASKID_BALANCETEAM)
	
	set_task(tasktime, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_newround()
{
	g_gamestarted = false
	
	static buytime 
	buytime = get_pcvar_num(cvar_buytime)
	
	if(buytime) 
		g_buytime = buytime + get_gametime()
	
	static id
	for(id = 0; id <= g_maxplayers; id++)
	{
		if(is_user_connected(id))
			g_blockmodel[id] = true
	}
	
	remove_task(TASKID_NEWROUND) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );
	
	set_task(0.1, "task_newround", TASKID_NEWROUND)
	set_task(get_pcvar_float(cvar_starttime), "task_initround", TASKID_INITROUND)

	if( get_pcvar_num( cvar_countdown ) ) {

		CountDownDelay = get_pcvar_num( cvar_starttime );
		set_task( 0.1, "TASK_CountDown", TASKID_COUNTDOWN );
	}
}

public event_curweapon(id)
{
	if(!is_user_alive(id))
		return PLUGIN_CONTINUE
	
	static weapon
	weapon = read_data(2)

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if( g_zombie[ id ] ) {

		if( weapon != CSW_KNIFE && weapon != CSW_FLASHBANG && !task_exists( TASKID_STRIPNGIVE + id ) )
			set_task( 0.1, "task_stripngive", TASKID_STRIPNGIVE + id );

		return PLUGIN_CONTINUE;
	}

	static ammotype
	ammotype = get_pcvar_num(cvar_ammo)
	
	if(!ammotype || (AMMOWP_NULL & (1<<weapon)))
		return PLUGIN_CONTINUE

	static maxammo
	switch(ammotype)
	{
		case 1: maxammo = g_weapon_ammo[weapon][MAX_AMMO]
		case 2: maxammo = g_weapon_ammo[weapon][MAX_CLIP]
	}

	if(!maxammo)
		return PLUGIN_CONTINUE
	
	switch(ammotype)
	{
		case 1:
		{
			static ammo
			ammo = fm_get_user_bpammo(id, weapon)
			
			if(ammo < 1) 
				fm_set_user_bpammo(id, weapon, maxammo)
		}
		case 2:
		{
			static clip; clip = read_data(3)
			if(clip < 1)
			{
				static weaponname[32]
				get_weaponname(weapon, weaponname, 31)
				
				static ent 
				ent = fm_find_ent_by_owner(-1, weaponname, id)
				
				fm_set_weapon_ammo(ent, maxammo)
			}
		}
	}

	return PLUGIN_CONTINUE
}

public event_armortype(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return PLUGIN_CONTINUE
	
	if(fm_get_user_armortype(id) != CS_ARMOR_NONE)
		fm_set_user_armortype(id, CS_ARMOR_NONE)
	
	return PLUGIN_CONTINUE
}

public event_damage(victim)
{
	if(!is_user_alive(victim) || !g_gamestarted)
		return PLUGIN_CONTINUE

	if(!g_zombie[victim])
	{
		static attacker
		attacker = get_user_attacker(victim)
		
		if(!is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
			return PLUGIN_CONTINUE
		
		if(g_victim[attacker] == victim)
		{
			g_infecting = true
			g_victim[attacker] = 0

			message_begin(MSG_ALL, g_msg_deathmsg)
			write_byte(attacker)
			write_byte(victim)
			write_byte(0)
			write_string(g_infection_name)
			message_end()
			
			message_begin(MSG_ALL, g_msg_scoreattrib)
			write_byte(victim)
			write_byte(0)
			message_end()
			
			infect_user(victim, attacker)
			
			static Float:frags, deaths
			pev(attacker, pev_frags, frags)
			deaths = fm_get_user_deaths(victim)
			
			set_pev(attacker, pev_frags, frags  + 1.0)
			fm_set_user_deaths(victim, deaths + 1)
			
			fm_set_user_money(attacker, get_pcvar_num(cvar_infectmoney))
		
			static params[2]
			params[0] = attacker 
			params[1] = victim
	
			set_task(0.3, "task_updatescore", TASKID_UPDATESCR, params, 2)
		}
		g_infecting = false
	}
	return PLUGIN_CONTINUE
}

public fwd_player_prethink(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static flags
	flags = pev(id, pev_flags)
	
	if(flags & FL_ONGROUND)
	{
		if(get_pcvar_num(cvar_painshockfree))
		{
			pev(id, pev_velocity, g_vecvel)
			g_brestorevel = true
		}
	}
	else
	{
		static Float:fallvelocity
		pev(id, pev_flFallVelocity, fallvelocity)
		
		g_falling[id] = fallvelocity >= 350.0 ? true : false
	}
		
	if(g_gamestarted)
	{	
		static Float:gametime
		gametime = get_gametime()
		
		static pclass
		pclass = g_player_class[id]

		static Float:health
		pev(id, pev_health, health)
		
		if(health < g_class_data[pclass][DATA_HEALTH] && g_regendelay[id] < gametime)
		{
			set_pev(id, pev_health, health + 1.0)
			g_regendelay[id] = gametime + g_class_data[pclass][DATA_REGENDLY]
		}
	}

	if( get_pcvar_num( cvar_biohazard_icon ) > 0 ) {

		if( is_user_alive( id ) ) {

			if( g_preinfect[ id ] && !g_zombie[ id ] ) set_biohazard_icon( id, 2, 255, 255, 0 );
			else if( g_zombie[ id ] ) set_biohazard_icon( id, 1, 255, 0, 0 );
			else if( !g_zombie[ id ] && !g_preinfect[ id ] ) set_biohazard_icon( id, 1, 125, 178, 255 );
		} else set_biohazard_icon( id, 0, 0, 0 ,0 );
	}

	return FMRES_IGNORED
}

public fwd_player_prethink_post(id)
{
	if(!g_brestorevel)
		return FMRES_IGNORED

	g_brestorevel = false
		
	static flag
	flag = pev(id, pev_flags)
	
	if(!(flag & FL_ONTRAIN))
	{
		static ent
		ent = pev(id, pev_groundentity)
		
		if(pev_valid(ent) && (flag & FL_CONVEYOR))
		{
			static Float:vectemp[3]
			pev(id, pev_basevelocity, vectemp)
			
			xs_vec_add(g_vecvel, vectemp, g_vecvel)
		}
	
		set_pev(id, pev_velocity, g_vecvel)
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public fwd_player_postthink(id)
{ 
	if(!is_user_alive(id))
		return FMRES_IGNORED
	
	if(g_zombie[id] && g_falling[id] && (pev(id, pev_flags) & FL_ONGROUND))
	{	
		set_pev(id, pev_watertype, CONTENTS_WATER)
		g_falling[id] = false
	}
	
	if(get_pcvar_num(cvar_buytime))
	{
		if(pev_valid(g_buyzone) && g_buytime > get_gametime())
			dllfunc(DLLFunc_Touch, g_buyzone, id)
	}

	return FMRES_IGNORED
}

public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch)
{	
	if(channel == CHAN_ITEM && sample[6] == 'n' && sample[7] == 'v' && sample[8] == 'g')
		return FMRES_SUPERCEDE	
	
	if(!is_user_connected(id) || !g_zombie[id])
		return FMRES_IGNORED	

	if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
	{
		if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
		{
			emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			return FMRES_SUPERCEDE
		}
		else if(sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't' || sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
		{
			if(sample[17] == 'w' && sample[18] == 'a' && sample[19] == 'l')
				emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			else
				emit_sound(id, channel, g_zombie_hit_sounds[_random(sizeof g_zombie_hit_sounds)], volume, attn, flag, pitch)
			
			return FMRES_SUPERCEDE
		}
	}			
	else if(sample[7] == 'd' && (sample[8] == 'i' && sample[9] == 'e' || sample[12] == '6'))
	{
		emit_sound(id, channel, g_zombie_die_sounds[_random(sizeof g_zombie_die_sounds)], volume, attn, flag, pitch)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_cmdstart(id, handle, seed)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static impulse
	impulse = get_uc(handle, UC_Impulse)
	
	if(impulse == IMPULSE_FLASHLIGHT)
	{
		set_uc(handle, UC_Impulse, 0)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_spawn(ent)
{
	if(!pev_valid(ent)) 
		return FMRES_IGNORED
	
	static classname[32]
	pev(ent, pev_classname, classname, 31)

	static i
	for(i = 0; i < sizeof g_remove_entities; ++i)
	{
		if(equal(classname, g_remove_entities))
		{
			engfunc(EngFunc_RemoveEntity, ent)
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public fwd_gamedescription() 
{ 
	static gamename[32]
	get_pcvar_string(cvar_gamedescription, gamename, 31)
	
	forward_return(FMV_STRING, gamename)
	
	return FMRES_SUPERCEDE
}  

public fwd_createnamedentity(entclassname)
{
	static classname[10]
	engfunc(EngFunc_SzFromIndex, entclassname, classname, 9)
	
	return (classname[7] == 'c' && classname[8] == '4') ? FMRES_SUPERCEDE : FMRES_IGNORED
}

public fwd_clientkill(id)
{
	if(get_pcvar_num(cvar_punishsuicide) && is_user_alive(id))
		g_suicide[id] = true
}

public fwd_setclientkeyvalue(id, infobuffer, const key[])
{
	if(!equal(key, "model") || !g_blockmodel[id])
		return FMRES_IGNORED
	
	static model[32]
	fm_get_user_model(id, model, 31)
	
	if(equal(model, "gordon"))
		return FMRES_IGNORED
	
	g_blockmodel[id] = false
	
	return FMRES_SUPERCEDE
}

public bacon_touch_weapon(ent, id)
	return (is_user_alive(id) && g_zombie[id]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_tank(ent, caller, activator, use_type, Float:value)
	return (is_user_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_pushable(ent, caller, activator, use_type, Float:value)
	return HAM_SUPERCEDE

public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!g_gamestarted) 
		return HAM_SUPERCEDE
	
	if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
		return HAM_IGNORED
	
	if(!is_user_connected(attacker) || !g_zombie[victim])
		return HAM_IGNORED
	
	static kbpower
	kbpower = g_weapon_knockback[get_user_weapon(attacker)]
	
	if(kbpower != -1) 
	{
		static flags
		flags = pev(victim, pev_flags)
		
		if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND)))
			return HAM_IGNORED
		
		static Float:origins[2][3]
		pev(victim, pev_origin, origins[0])
		pev(attacker, pev_origin, origins[1])
		
		if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
		{
			static Float:velocity[3]
			pev(victim, pev_velocity, velocity)
			
			static Float:tempvec
			tempvec = velocity[2]	
			
			xs_vec_mul_scalar(direction, damage, direction)
			xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
			xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)
			
			xs_vec_add(direction, velocity, velocity)
			velocity[2] = tempvec
			
			set_pev(victim, pev_velocity, velocity)
			
			return HAM_HANDLED
		}
	}
	return HAM_IGNORED
}

public bacon_touch_grenade(ent, world)
{
	if(!get_pcvar_num(cvar_impactexplode))
		return HAM_IGNORED
	
	static model[12]
	pev(ent, pev_model, model, 11)
	
	if(model[9] == 'h' && model[10] == 'e')
	{
		set_pev(ent, pev_dmgtime, 0.0)
		
		return HAM_HANDLED
	}
	return HAM_IGNORED
}

public bacon_takedamage_player(victim, inflictor, attacker, Float:damage, damagetype)
{
	if(damagetype & DMG_GENERIC || victim == attacker || !is_user_alive(victim) || !is_user_connected(attacker))
		return HAM_IGNORED

	if(!g_gamestarted || (!g_zombie[victim] && !g_zombie[attacker]) || ((damagetype & DMG_HEGRENADE) && g_zombie[attacker]))
		return HAM_SUPERCEDE

	if(g_zombie[attacker])
	{
		if(get_user_weapon(attacker) != CSW_KNIFE)
			return HAM_SUPERCEDE

		damage *= g_class_data[g_player_class[attacker]][DATA_ATTACK]
		
		static Float:armor
		pev(victim, pev_armorvalue, armor)
		
		if(get_pcvar_num(cvar_obeyarmor) && armor > 0.0)
		{
			armor -= damage
			
			if(armor < 0.0) 
				armor = 0.0
			
			set_pev(victim, pev_armorvalue, armor)
			SetHamParamFloat(4, 0.0)
		}
		else
		{
			static bool:infect
			infect = allow_infection()
			
			g_victim[attacker] = infect ? victim : 0
					
			if(!g_infecting)
				SetHamParamFloat(4, infect ? 0.0 : damage)
			else	
				SetHamParamFloat(4, 0.0)
		}
	}
	return HAM_HANDLED
}

public bacon_killed_player(victim, killer, shouldgib)
{
	if(!is_user_alive(killer) || g_zombie[killer] || !g_zombie[victim])
		return HAM_IGNORED

	static killbonus
	killbonus = get_pcvar_num(cvar_killbonus)
	
	if(killbonus)
		set_pev(killer, pev_frags, pev(killer, pev_frags) + float(killbonus))
	
	static killreward
	killreward = get_pcvar_num(cvar_killreward)
	
	if(!killreward) 
		return HAM_IGNORED
	
	static weapon, maxclip, ent, weaponname[32]
	switch(killreward)
	{
		case 1: 
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
		}
		case 2:
		{
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
		case 3:
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
				
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
	}
	return HAM_IGNORED
}

public bacon_spawn_player_post(id)
{	
	if(!is_user_alive(id))
		return HAM_IGNORED
	
	static team
	team = fm_get_user_team(id)
	
	if(team != CS_TEAM_T && team != CS_TEAM_CT)
		return HAM_IGNORED
	
	if(g_zombie[id])
	{
		if(get_pcvar_num(cvar_respawnaszombie) && !g_roundended)
		{
			set_zombie_attibutes(id)
			
			return HAM_IGNORED
		}
		else
			cure_user(id)
	}
	else if(pev(id, pev_rendermode) == kRenderTransTexture)
		reset_user_model(id)
	
	set_task(0.3, "task_spawned", TASKID_SPAWNDELAY + id)
	set_task(5.0, "task_checkspawn", TASKID_CHECKSPAWN + id)
	
	return HAM_IGNORED
}

public bacon_touch_pushable(ent, id)
{
	static movetype
	pev(id, pev_movetype)
	
	if(movetype == MOVETYPE_NOCLIP || movetype == MOVETYPE_NONE)
		return HAM_IGNORED	
	
	if(is_user_alive(id))
	{
		set_pev(id, pev_movetype, MOVETYPE_WALK)
		
		if(!(pev(id, pev_flags) & FL_ONGROUND))
			return HAM_SUPERCEDE
	}
	
	if(!get_pcvar_num(cvar_shootobjects))
		return HAM_IGNORED
	
	static Float:velocity[2][3]
	pev(ent, pev_velocity, velocity[0])
	
	if(vector_length(velocity[0]) > 0.0)
	{
		pev(id, pev_velocity, velocity[1])
		velocity[1][0] += velocity[0][0]
		velocity[1][1] += velocity[0][1]
		
		set_pev(id, pev_velocity, velocity[1])
	}
	return HAM_SUPERCEDE
}

public bacon_traceattack_pushable(ent, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!get_pcvar_num(cvar_shootobjects) || !is_user_alive(attacker))
		return HAM_IGNORED
	
	static Float:velocity[3]
	pev(ent, pev_velocity, velocity)
			
	static Float:tempvec
	tempvec = velocity[2]	
			
	xs_vec_mul_scalar(direction, damage, direction)
	xs_vec_mul_scalar(direction, g_zombie[attacker] ? 
	get_pcvar_float(cvar_pushpwr_zombie) : get_pcvar_float(cvar_pushpwr_weapon), direction)
	xs_vec_add(direction, velocity, velocity)
	velocity[2] = tempvec
	
	set_pev(ent, pev_velocity, velocity)
	
	return HAM_HANDLED
}

public bacon_claws_deploy_post( iEntity ) {

	static szOwner;
	szOwner = get_pdata_cbase( iEntity, 41, EXTRAOFFSET_WEAPONS );

	if( g_zombie[ szOwner ] ) {

		set_pev( szOwner, pev_viewmodel2, g_class_wmodel[ g_player_class[ szOwner ] ] );
		set_pev( szOwner, pev_weaponmodel2, "" );
	}
}

public TASK_CountDown(  ) {

	new Players[ 32 ];
	new PlayersNum;
	get_players( Players, PlayersNum, "a" );
	
	if( CountDownDelay > sizeof CountDownSounds + 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
	} else if( CountDownDelay > 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		emit_sound( 0, CHAN_VOICE, CountDownSounds[ CountDownDelay - 1 ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );

		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
		
		for( new i = 0 ; i < PlayersNum ; i++ ) {

			if( is_user_connected( Players[ i ] ) ) {

				new color[ 3 ];
				color[ 0 ] = 125;
				color[ 1 ] = 170;
				color[ 2 ] = 255;
				UTIL_ScreenFade( Players[ i ], color, 0.5, 0.5, 110 );

				new shock[ 3 ];
				shock[ 0 ] = 3;
				shock[ 1 ] = 2;
				shock[ 2 ] = 3;
				message_begin( MSG_ONE, get_user_msgid( "ScreenShake" ), _, Players[ i ] );
				write_short( ( 1<<12 ) * shock[ 0 ] );
				write_short( ( 1<<12 ) * shock[ 1 ] );
				write_short( ( 1<<12 ) * shock[ 2 ] );
				message_end(  );
			}
		}	
	} else if( CountDownDelay <= 1 )
		CountDownDelay = 0;
}

public task_spawned(taskid)
{
	static id
	id = taskid - TASKID_SPAWNDELAY
	
	if(is_user_alive(id))
	{
		if( !get_pcvar_num( cvar_weaponsmenu ) ) {

			for( new i = 0; i < sizeof g_grenades; ++i )
				bacon_give_weapon( id, g_grenades[ i ] );
		}

		if(g_welcomemsg[id])
		{
			g_welcomemsg[id] = false
			
			static message[192]
			formatex(message, 191, "%L", id, "WELCOME_TXT")
			replace(message, 191, "#Version#", PLUGIN_VERSION)
			
			ColorChat(id, message)
		}
		
		if(g_suicide[id])
		{
			g_suicide[id] = false
			
			user_silentkill(id)
			remove_task(TASKID_CHECKSPAWN + id)

			ColorChat(id, "%L", id, "SUICIDEPUNISH_TXT")
			
			return
		}
		
		if(get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
			is_user_bot(id) ? bot_weapons(id) : display_equipmenu(id)
		
		if(!g_gamestarted)
			ColorChat(id, "%L %L", id, "SCAN_RESULTS", id, g_preinfect[id] ? "SCAN_INFECTED" : "SCAN_CLEAN")
		else
		{
			static team
			team = fm_get_user_team(id)
			
			if(team == CS_TEAM_T)
				fm_set_user_team(id, CS_TEAM_CT)
		}

		if(get_pcvar_num(cvar_biohazard_icon) > 0) {
			if(g_preinfect[id] && !g_zombie[id])
				set_biohazard_icon(id, 2, 255, 255, 0)
			else if(g_zombie[id])
				set_biohazard_icon(id, 1, 255, 0, 0)
			else if(!g_zombie[id] && !g_preinfect[id])
				set_biohazard_icon(id, 1, 125, 178, 255)
		}
	}
}

public task_checkspawn(taskid)
{
	static id
	id = taskid - TASKID_CHECKSPAWN
	
	if(!is_user_connected(id) || is_user_alive(id) || g_roundended)
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
		ExecuteHamB(Ham_CS_RoundRespawn, id)
}
	
public task_showtruehealth()
{
	static id, Float:health, Float:gravity, Float:speed, class
	for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id) && !is_user_bot(id) && g_zombie[id])
	{
		pev( id, pev_health, health );
		pev( id, pev_gravity, gravity );
		pev( id, pev_maxspeed, speed );
		class = g_player_class[id]

		if(g_classcount > 1) {

			set_hudmessage(0, 255, 20, -1.0, 0.8, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Class: %s - Desc: %s^nHealth: %0.f^n^nSpeed: %0.1f^nGolds: %i", g_class_name[class], g_class_desc[class], health, speed, get_user_golds( id ) );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		} else {

			set_hudmessage(0, 230, 210, 0.01, 0.9, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Speed: %0.1f   Gravity: %0.1f", speed, gravity / 0.00125 );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		}
	}
}

public task_lights()
{
	static light[2]
	get_pcvar_string(cvar_lights, light, 1)
	
	engfunc(EngFunc_LightStyle, 0, light)
}

public task_updatescore(params[])
{
	if(!g_gamestarted) 
		return
	
	static attacker
	attacker = params[0]
	
	static victim
	victim = params[1]
	
	if(!is_user_connected(attacker))
		return

	static frags, deaths, team
	frags  = get_user_frags(attacker)
	deaths = fm_get_user_deaths(attacker)
	team   = get_user_team(attacker)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(attacker)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
	
	if(!is_user_connected(victim))
		return
	
	frags  = get_user_frags(victim)
	deaths = fm_get_user_deaths(victim)
	team   = get_user_team(victim)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(victim)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
}

public task_weaponsmenu(taskid)
{
	static id
	id = taskid - TASKID_WEAPONSMENU
	
	if(is_user_alive(id) && !g_zombie[id] && g_menufailsafe[id])
		display_equipmenu(id)
}

public task_stripngive(taskid)
{
	static id
	id = taskid - TASKID_STRIPNGIVE
	
	if(is_user_alive(id))
	{
		fm_strip_user_weapons(id)
		fm_reset_user_primary(id)
		bacon_give_weapon(id, "weapon_knife")
		
		set_pev(id, pev_weaponmodel2, "")
		set_pev(id, pev_viewmodel2, g_class_wmodel[g_player_class[id]])
		set_pev(id, pev_maxspeed, g_class_data[g_player_class[id]][DATA_SPEED])
	}
}

public task_newround()
{
	static players[32], num, zombies, i, id
	get_players(players, num, "a")

	if(num > 1)
	{
		for(i = 0; i < num; i++) 
			g_preinfect[players[i]] = false
		
		zombies = clamp(floatround(num * get_pcvar_float(cvar_zombiemulti)), 1, 31)
		
		i = 0
		while(i < zombies)
		{
			id = players[_random(num)]
			if(!g_preinfect[id])
			{
				g_preinfect[id] = true
				i++
			}
		}
	}
	
	if(!get_pcvar_num(cvar_randomspawn) || g_spawncount <= 0) 
		return
	
	static team
	for(i = 0; i < num; i++)
	{
		id = players[i]
		
		team = fm_get_user_team(id)
		if(team != CS_TEAM_T && team != CS_TEAM_CT || pev(id, pev_iuser1))
			continue
		
		static spawn_index
		spawn_index = _random(g_spawncount)
	
		static Float:spawndata[3]
		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		
		if(!fm_is_hull_vacant(spawndata, HULL_HUMAN))
		{
			static i
			for(i = spawn_index + 1; i != spawn_index; i++)
			{
				if(i >= g_spawncount) i = 0

				spawndata[0] = g_spawns[i][0]
				spawndata[1] = g_spawns[i][1]
				spawndata[2] = g_spawns[i][2]

				if(fm_is_hull_vacant(spawndata, HULL_HUMAN))
				{
					spawn_index = i
					break
				}
			}
		}

		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		engfunc(EngFunc_SetOrigin, id, spawndata)

		spawndata[0] = g_spawns[spawn_index][3]
		spawndata[1] = g_spawns[spawn_index][4]
		spawndata[2] = g_spawns[spawn_index][5]
		set_pev(id, pev_angles, spawndata)

		spawndata[0] = g_spawns[spawn_index][6]
		spawndata[1] = g_spawns[spawn_index][7]
		spawndata[2] = g_spawns[spawn_index][8]
		set_pev(id, pev_v_angle, spawndata)

		set_pev(id, pev_fixangle, 1)
	}
}

public task_initround()
{
	static zombiecount, newzombie
	zombiecount = 0
	newzombie = 0

	static players[32], num, i, id
	get_players(players, num, "a")

	for(i = 0; i < num; i++) if(g_preinfect[players[i]])
	{
		newzombie = players[i]
		zombiecount++
	}
	
	if(zombiecount > 1) 
		newzombie = 0
	else if(zombiecount < 1) 
		newzombie = players[_random(num)]
	
	for(i = 0; i < num; i++)
	{
		id = players[i]
		if(id == newzombie || g_preinfect[id])
			infect_user(id, 0)
		else
		{
			fm_set_user_team(id, CS_TEAM_CT, 0)
			add_delay(id, "update_team")
		}
	}
	
	set_hudmessage(_, _, _, _, _, 1)
	if(newzombie)
	{
		static name[32]
		get_user_name(newzombie, name, 31)
		
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD", name)
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT", name)
	}
	else
	{
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD2")
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT2")
	}
	
	set_task(0.51, "task_startround", TASKID_STARTROUND)

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 2 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

public task_startround()
{
	g_gamestarted = true
	ExecuteForward(g_fwd_gamestart, g_fwd_result)
}

public task_balanceteam()
{
	static players[3][32], count[3]
	get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
	
	count[CS_TEAM_T] = 0
	count[CS_TEAM_CT] = 0
	
	static i, id, team
	for(i = 0; i < count[CS_TEAM_UNASSIGNED]; i++)
	{
		id = players[CS_TEAM_UNASSIGNED][i] 
		team = fm_get_user_team(id)
		
		if(team == CS_TEAM_T || team == CS_TEAM_CT)
			players[team][count[team]++] = id
	}

	if(abs(count[CS_TEAM_T] - count[CS_TEAM_CT]) <= 1) 
		return

	static maxplayers
	maxplayers = (count[CS_TEAM_T] + count[CS_TEAM_CT]) / 2
	
	if(count[CS_TEAM_T] > maxplayers)
	{
		for(i = 0; i < (count[CS_TEAM_T] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT, 0)
	}
	else
	{
		for(i = 0; i < (count[CS_TEAM_CT] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T, 0)
	}
}

public task_botclient_pdata(id) 
{
	if(g_botclient_pdata || !is_user_connected(id))
		return
	
	if(get_pcvar_num(cvar_botquota) && is_user_bot(id))
	{
		RegisterHamFromEntity(Ham_TakeDamage, id, "bacon_takedamage_player")
		RegisterHamFromEntity(Ham_Killed, id, "bacon_killed_player")
		RegisterHamFromEntity(Ham_TraceAttack, id, "bacon_traceattack_player")
		RegisterHamFromEntity(Ham_Spawn, id, "bacon_spawn_player_post", 1)
		
		g_botclient_pdata = 1
	}
}

public bot_weapons(id)
{
	g_player_weapons[id][0] = _random(sizeof g_primaryweapons)
	g_player_weapons[id][1] = _random(sizeof g_secondaryweapons)
	
	equipweapon(id, EQUIP_ALL)
}

public update_team(id)
{
	if(!is_user_connected(id))
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
	{
		emessage_begin(MSG_ALL, g_msg_teaminfo)
		ewrite_byte(id)
		ewrite_string(g_teaminfo[team])
		emessage_end()
	}
}

public infect_user(victim, attacker)
{
	if(!is_user_alive(victim))
		return

	message_begin(MSG_ONE, g_msg_screenfade, _, victim)
	write_short(1<<10)
	write_short(1<<10)
	write_short(0)
	write_byte((g_mutate[victim] != -1) ? 255 : 100)
	write_byte(100)
	write_byte(100)
	write_byte(250)
	message_end()

	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenShake" ), _, victim )
	write_short( ( 1<<12 ) * 4 ) // amplitude
	write_short( ( 1<<12 ) * 2 ) // duration
	write_short( ( 1<<12 ) * 10 ) // frequency
	message_end(  )
		
	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "Damage" ), _, victim )
	write_byte( 0 ) // damage save
	write_byte( 0 ) // damage take
	write_long( DMG_NERVEGAS ) // damage type - DMG_RADIATION
	write_coord( 0 ) // x
	write_coord( 0 ) // y
	write_coord( 0 ) // z
	message_end(  )

	// Get player's origin
	new Origin[ 3 ]
	get_user_origin( victim, Origin )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_IMPLOSION ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 128 ) // radius
	write_byte( 20 ) // count
	write_byte( 3 ) // duration
	message_end(  )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_DLIGHT ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 20 ) // radius
	write_byte( 0 ) // r
	write_byte( 150 ) // g
	write_byte( 0 ) // b
	write_byte( 2 ) // life
	write_byte( 0 ) // decay rate
	message_end(  )

#if defined ULTRA_BLOOD
	static origin[3];
	get_user_origin(victim, origin)

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_PARTICLEBURST)
	write_coord(origin[0])
	write_coord(origin[1])
	write_coord(origin[2])
	write_short(50)
	write_byte(70)
	write_byte(3)
	message_end()
#endif
	
	if(g_mutate[victim] != -1)
	{
		g_player_class[victim] = g_mutate[victim]
		g_mutate[victim] = -1
		
		set_hudmessage(_, _, _, _, _, 1)
		ShowSyncHudMsg(victim, g_sync_msgdisplay, "%L", victim, "MUTATION_HUD", g_class_name[g_player_class[victim]])
	}
	
	fm_set_user_team(victim, CS_TEAM_T)
	set_zombie_attibutes(victim)
	
	emit_sound(victim, CHAN_STATIC, g_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
	ExecuteForward(g_fwd_infect, g_fwd_result, victim, attacker)
}

public cure_user(id)
{
	if(!is_user_alive(id)) 
		return

	g_zombie[id] = false
	g_falling[id] = false

	g_showmenu[id] = true;

	reset_user_model(id)
	fm_set_user_nvg(id, 0)
	set_pev(id, pev_gravity, 1.0)
	
	if( fm_get_user_team( id ) != CS_TEAM_CT ) { // need to change team?

		fm_set_user_team( id, CS_TEAM_CT );
		fm_user_team_update( id );
	}

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if(equal(viewmodel, g_class_wmodel[g_player_class[id]]))
	{
		static weapon 
		weapon = fm_lastknife(id)

		if(pev_valid(weapon))
			ExecuteHam(Ham_Item_Deploy, weapon)
	}

	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public display_equipmenu(id)
{
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L^n^n", id, "MENU_TITLE1")
	
	static bool:hasweap
	hasweap = ((g_player_weapons[id][0]) != -1 && (g_player_weapons[id][1] != -1)) ? true : false
	
	len += formatex(menubody[len], 511 - len,"\r1.\w %L^n", id, "MENU_NEWWEAPONS")
	len += formatex(menubody[len], 511 - len,"%s2.\w %L^n", hasweap ? "\r" : "\d", id, "MENU_PREVSETUP")
	len += formatex(menubody[len], 511 - len,"%s3.\w %L^n^n", hasweap ? "\r" : "\d", id, "MENU_DONTSHOW")
	len += formatex(menubody[len], 511 - len,"\r5.\w %L^n", id, "MENU_EXIT")
	
	static keys
	keys = (MENU_KEY_1|MENU_KEY_5)
	
	if(hasweap) 
		keys |= (MENU_KEY_2|MENU_KEY_3)
	
	show_menu(id, keys, menubody, -1, "Equipment")
}

public action_equip(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key)
	{
		case 0: display_weaponmenu(id, MENU_PRIMARY, g_menuposition[id] = 0)
		case 1: equipweapon(id, EQUIP_ALL)
		case 2:
		{
			g_showmenu[id] = false
			equipweapon(id, EQUIP_ALL)
			ColorChat(id, "%L", id, "MENU_CMDENABLE")
		}
	}
	
	if(key > 0)
	{
		g_menufailsafe[id] = false
		remove_task(TASKID_WEAPONSMENU + id)
	}
	return PLUGIN_HANDLED
}


public display_weaponmenu(id, menuid, pos)
{
	if(pos < 0 || menuid < 0)
		return
	
	static start
	start = pos * 8
	
	static maxitem
	maxitem = menuid == MENU_PRIMARY ? sizeof g_primaryweapons : sizeof g_secondaryweapons

  	if(start >= maxitem)
    		start = pos = g_menuposition[id]
	
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L\w^n^n", id, menuid == MENU_PRIMARY ? "MENU_TITLE2" : "MENU_TITLE3")

	static end
	end = start + 8
	if(end > maxitem)
    		end = maxitem
	
	static keys
	keys = MENU_KEY_0
	
	static a, b
	b = 0
	
  	for(a = start; a < end; ++a) 
	{
		keys |= (1<<b)
		len += formatex(menubody[len], 511 - len,"\r%d.\w %s^n", ++b, menuid == MENU_PRIMARY ? g_primaryweapons[a][0]: g_secondaryweapons[a][0])
  	}

  	if(end != maxitem)
	{
    		formatex(menubody[len], 511 - len, "^n\r9.\w %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
    		keys |= MENU_KEY_9
  	}
  	else	
		formatex(menubody[len], 511 - len, "^n\r0.\w %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
	
  	show_menu(id, keys, menubody, -1, menuid == MENU_PRIMARY ? "Primary" : "Secondary")
}

public action_prim(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED

	switch(key)
	{
    		case 8: display_weaponmenu(id, MENU_PRIMARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_PRIMARY, --g_menuposition[id])
    		default:
		{
			g_player_weapons[id][0] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_PRI)
			
			display_weaponmenu(id, MENU_SECONDARY, g_menuposition[id] = 0)
		}
	}
	return PLUGIN_HANDLED
}

public action_sec(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key) 
	{
    		case 8: display_weaponmenu(id, MENU_SECONDARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_SECONDARY, --g_menuposition[id])
    		default:
		{
			g_menufailsafe[id] = false
			remove_task(TASKID_WEAPONSMENU + id)
			
			g_player_weapons[id][1] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_SEC)
			equipweapon(id, EQUIP_GREN)
		}
	}
	return PLUGIN_HANDLED
}

public ClassCmd( id, szMenu, szItem ) {

	if( szItem == MENU_EXIT ) {

		menu_destroy( szMenu );
		return PLUGIN_HANDLED;
	}

	new szData[ 6 ], szName[ 64 ];
	new iAccess, iCallBack;

	menu_item_getinfo( szMenu, szItem, iAccess, szData, 5, szName, 63, iCallBack );
	new iKey = str_to_num( szData );

	if( g_class_data[ iKey ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) ) {

		ColorChat( id, "%L", id, "MENU_CLASSONLYVIP", g_class_name[ iKey ] );
		cmd_classmenu( id );
	}

	else {

		g_mutate[ id ] = iKey;
		ColorChat( id, "%L", id, "MENU_CHANGECLASS", g_class_name[ g_mutate[ id ] ] );
	}

	menu_destroy( szMenu );
	return PLUGIN_HANDLED;
}

public register_spawnpoints(const mapname[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new csdmfile[64], line[64], data[10][6]
	formatex(csdmfile, 63, "%s/csdm/%s.spawns.cfg", configdir, mapname)

	if(file_exists(csdmfile))
	{
		new file
		file = fopen(csdmfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 63)
			if(!line[0] || str_count(line,' ') < 2) 
				continue

			parse(line, data[0], 5, data[1], 5, data[2], 5, data[3], 5, data[4], 5, data[5], 5, data[6], 5, data[7], 5, data[8], 5, data[9], 5)

			g_spawns[g_spawncount][0] = floatstr(data[0]), g_spawns[g_spawncount][1] = floatstr(data[1])
			g_spawns[g_spawncount][2] = floatstr(data[2]), g_spawns[g_spawncount][3] = floatstr(data[3])
			g_spawns[g_spawncount][4] = floatstr(data[4]), g_spawns[g_spawncount][5] = floatstr(data[5])
			g_spawns[g_spawncount][6] = floatstr(data[7]), g_spawns[g_spawncount][7] = floatstr(data[8])
			g_spawns[g_spawncount][8] = floatstr(data[9])
			
			if(++g_spawncount >= MAX_SPAWNS) 
				break
		}
		if(file) 
			fclose(file)
	}
}

public register_zombieclasses(filename[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new configfile[64]
	formatex(configfile, 63, "%s/%s", configdir, filename)

	if(get_pcvar_num(cvar_zombie_class) && file_exists(configfile))
	{			
		new line[128], leftstr[32], rightstr[64],  classname[32], data[MAX_DATA], i
		
		new file
		file = fopen(configfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 127), trim(line)
			if(!line[0] || line[0] == ';') continue
			
			if(line[0] == '[' && line[strlen(line) - 1] == ']')
			{
				copy(classname, strlen(line) - 2, line[1])

				if(register_class(classname) == -1)
					break
				
				continue
			}
			strtok(line, leftstr, 31, rightstr, 63, '=', 1)
				
			if(equali(leftstr, "DESC"))
				copy(g_class_desc[g_classcount - 1], 31, rightstr)
			else if(equali(leftstr, "PMODEL"))
				copy(g_class_pmodel[g_classcount - 1], 63, rightstr)
			else if(equali(leftstr, "WMODEL"))
				copy(g_class_wmodel[g_classcount - 1], 63, rightstr)
				
			for(i = 0; i < MAX_DATA; i++)
				data[i] = equali(leftstr, g_dataname[i])
				
			for(i = 0; i < MAX_DATA; i++) if(data[i])
			{
				g_class_data[g_classcount - 1][i] = floatstr(rightstr)
				break
			}
		}
		if(file) fclose(file)
	} 
	else 
		register_class("default")
}

public register_class(classname[])
{
	if(g_classcount >= MAX_CLASSES)
		return -1
	
	copy(g_class_name[g_classcount], 31, classname)
	copy(g_class_pmodel[g_classcount], 63, DEFAULT_PMODEL)
	copy(g_class_wmodel[g_classcount], 63, DEFAULT_WMODEL)
		
	g_class_data[g_classcount][DATA_HEALTH] = DEFAULT_HEALTH
	g_class_data[g_classcount][DATA_SPEED] = DEFAULT_SPEED	
	g_class_data[g_classcount][DATA_GRAVITY] = DEFAULT_GRAVITY
	g_class_data[g_classcount][DATA_ATTACK] = DEFAULT_ATTACK
	g_class_data[g_classcount][DATA_REGENDLY] = DEFAULT_REGENDLY
	g_class_data[g_classcount][DATA_KNOCKBACK] = DEFAULT_KNOCKBACK
	g_class_data[g_classcount][DATA_NOFLASH] = DEFAULT_NOFLASH
	g_class_data[g_classcount][DATA_ONLYVIP] = DEFAULT_ONLYVIP
	g_classcount++
	
	return (g_classcount - 1)
}

public native_register_class(classname[], description[])
{
	param_convert(1)
	param_convert(2)
	
	static classid
	classid = register_class(classname)
	
	if(classid != -1)
		copy(g_class_desc[classid], 31, description)

	return classid
}

public native_set_class_pmodel(classid, player_model[])
{
	param_convert(2)
	copy(g_class_pmodel[classid], 63, player_model)
}

public native_set_class_wmodel(classid, weapon_model[])
{
	param_convert(2)
	copy(g_class_wmodel[classid], 63, weapon_model) 
}

public native_is_user_zombie(index)
	return g_zombie[index] == true ? 1 : 0

public native_get_user_class(index)
	return g_player_class[index]

public native_is_user_infected(index)
	return g_preinfect[index] == true ? 1 : 0

public native_game_started()
	return g_gamestarted

public native_preinfect_user(index, bool:yesno)
{
	if(is_user_alive(index) && !g_gamestarted)
		g_preinfect[index] = yesno
}

public native_infect_user(victim, attacker)
{
	if(allow_infection() && g_gamestarted)
		infect_user(victim, attacker)
}

public native_cure_user(index)
	cure_user(index)

public native_get_class_id(classname[])
{
	param_convert(1)
	
	static i
	for(i = 0; i < g_classcount; i++)
	{
		if(equali(classname, g_class_name[i]))
			return i
	}
	return -1
}

public Float:native_get_class_data(classid, dataid)
	return g_class_data[classid][dataid]

public native_set_class_data(classid, dataid, Float:value)
	g_class_data[classid][dataid] = value

public native_get_humans(  ) {

	static iHumans;
	iHumans = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && !g_zombie[ id ] ) 
			iHumans++;
	}

	return iHumans;
}

public native_get_zombies(  ) {

	static iZombies;
	iZombies = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && g_zombie[ id ] ) 
			iZombies++;
	}

	return iZombies;
}

stock bool:fm_is_hull_vacant(const Float:origin[3], hull)
{
	static tr
	tr = 0
	
	engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, tr)
	return (!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen)) ? true : false
}

stock fm_set_kvd(entity, const key[], const value[], const classname[] = "") 
{
	set_kvd(0, KV_ClassName, classname)
	set_kvd(0, KV_KeyName, key)
	set_kvd(0, KV_Value, value)
	set_kvd(0, KV_fHandled, 0)

	return dllfunc(DLLFunc_KeyValue, entity, 0)
}

stock fm_strip_user_weapons(index) 
{
	static stripent
	if(!pev_valid(stripent))
	{
		stripent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
		dllfunc(DLLFunc_Spawn, stripent), set_pev(stripent, pev_solid, SOLID_NOT)
	}
	dllfunc(DLLFunc_Use, stripent, index)
	
	return 1
}

stock fm_set_entity_visibility(index, visible = 1)
	set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)

stock fm_find_ent_by_owner(index, const classname[], owner) 
{
	static ent
	ent = index
	
	while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) && pev(ent, pev_owner) != owner) {}
	
	return ent
}

stock bacon_give_weapon(index, weapon[])
{
	if(!equal(weapon,"weapon_", 7))
		return 0

	static ent
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon))
	
	if(!pev_valid(ent)) 
		return 0
    
	set_pev(ent, pev_spawnflags, SF_NORESPAWN)
	dllfunc(DLLFunc_Spawn, ent)
   
	if(!ExecuteHamB(Ham_AddPlayerItem, index, ent))
	{
		if(pev_valid(ent)) set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
		return 0
	}
	ExecuteHamB(Ham_Item_AttachToPlayer, ent, index)

	return 1
}

stock bacon_strip_weapon(index, weapon[])
{
	if(!equal(weapon, "weapon_", 7)) 
		return 0

	static weaponid 
	weaponid = get_weaponid(weapon)
	
	if(!weaponid) 
		return 0

	static weaponent
	weaponent = fm_find_ent_by_owner(-1, weapon, index)
	
	if(!weaponent) 
		return 0

	if(get_user_weapon(index) == weaponid) 
		ExecuteHamB(Ham_Weapon_RetireWeapon, weaponent)

	if(!ExecuteHamB(Ham_RemovePlayerItem, index, weaponent)) 
		return 0
	
	ExecuteHamB(Ham_Item_Kill, weaponent)
	set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<weaponid))

	return 1
}

stock fm_set_user_team( index, team, update = 1 ) {

	set_pdata_int( index, OFFSET_TEAM, team );

	if( update ) {

		emessage_begin( MSG_ALL, g_msg_teaminfo );
		ewrite_byte( index );
		ewrite_string( g_teaminfo[ team ] );
		emessage_end(  );
	}
	return 1;
}

stock fm_get_user_bpammo(index, weapon)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	return offset ? get_pdata_int(index, offset) : 0
}

stock fm_set_user_bpammo(index, weapon, amount)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	
	if(offset) 
		set_pdata_int(index, offset, amount)
	
	return 1
}

stock fm_set_user_rendering( iEntity, fx = kRenderFxNone, Red = 255, Green = 255, Blue = 255, iRender = kRenderNormal, Amount = 16 ) {

	new Float:RenderColor[ 3 ];
	RenderColor[ 0 ] = float( Red );
	RenderColor[ 1 ] = float( Green );
	RenderColor[ 2 ] = float( Blue );

	set_pev( iEntity, pev_renderfx, fx );
	set_pev( iEntity, pev_rendercolor, RenderColor );
	set_pev( iEntity, pev_rendermode, iRender );
	set_pev( iEntity, pev_renderamt, float( Amount ) );

	return 1;
}

stock fm_set_user_nvg(index, onoff = 1)
{
	static nvg
	nvg = get_pdata_int(index, OFFSET_NVG)
	
	set_pdata_int(index, OFFSET_NVG, onoff == 1 ? nvg | HAS_NVG : nvg & ~HAS_NVG)
	return 1
}

stock fm_set_user_money(index, addmoney, update = 1)
{
	static money
	money = fm_get_user_money(index) + addmoney
	
	set_pdata_int(index, OFFSET_CSMONEY, money)
	
	if(update)
	{
		message_begin(MSG_ONE, g_msg_money, _, index)
		write_long(clamp(money, 0, 16000))
		write_byte(1)
		message_end()
	}
	return 1
}

stock fm_user_team_update(id)
{
	static Float:current_time
	current_time = get_gametime()
	
	if (current_time - g_teams_targettime >= 0.1)
	{
		set_task(0.1, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = current_time + 0.1
	}
	else
	{
		set_task((g_teams_targettime + 0.1) - current_time, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = g_teams_targettime + 0.1
	}
}

public fm_cs_set_user_team_msg(taskid)
{
	// Note to self: this next message can now be received by other plugins
	
	// Set the switching team flag
	g_switchingteam = true
	
	// Tell everyone my new team
	emessage_begin(MSG_ALL, g_msg_teaminfo )
	ewrite_byte(taskid - 1212) // player
	ewrite_string(CS_TEAM_NAMES[fm_get_user_team(taskid - 1212)]) // team
	emessage_end()
	
	// Done switching team
	g_switchingteam = false
}

stock str_count(str[], searchchar)
{
	static maxlen
	maxlen = strlen(str)
	
	static i, count
	count = 0
	
	for(i = 0; i <= maxlen; i++) if(str[i] == searchchar)
		count++

	return count
}

stock reset_user_model(index)
{
	set_pev(index, pev_rendermode, kRenderNormal)
	set_pev(index, pev_renderamt, 0.0)

	if(pev_valid(g_modelent[index]))
		fm_set_entity_visibility(g_modelent[index], 0)
}

stock remove_user_model(ent)
{
	static id
	id = pev(ent, pev_owner)
	
	if(pev_valid(ent)) 
		engfunc(EngFunc_RemoveEntity, ent)

	g_modelent[id] = 0
}

stock set_zombie_attibutes(index)
{
	if(!is_user_alive(index)) 
		return

	g_zombie[index] = true

	if(!task_exists(TASKID_STRIPNGIVE + index))
		set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + index)

	static Float:health
	health = g_class_data[g_player_class[index]][DATA_HEALTH]
	
	if(g_preinfect[index]) 
		health *= get_pcvar_float(cvar_zombie_hpmulti)
	
	set_pev(index, pev_health, health)
	set_pev(index, pev_gravity, g_class_data[g_player_class[index]][DATA_GRAVITY])
	set_pev(index, pev_body, 0)
	set_pev(index, pev_armorvalue, 0.0)
	set_pev(index, pev_renderamt, 0.0)
	set_pev(index, pev_rendermode, kRenderTransTexture)
	
	fm_set_user_armortype(index, CS_ARMOR_NONE)
	fm_set_user_nvg(index)
	
	if(get_pcvar_num(cvar_autonvg)) 
		engclient_cmd(index, "nightvision")
	
	if(!pev_valid(g_modelent[index]))
	{
		static ent
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		if(pev_valid(ent))
		{
			engfunc(EngFunc_SetModel, ent, g_class_pmodel[g_player_class[index]])
			set_pev(ent, pev_classname, MODEL_CLASSNAME)
			set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
			set_pev(ent, pev_aiment, index)
			set_pev(ent, pev_owner, index)
				
			g_modelent[index] = ent
		}
	}
	else
	{
		engfunc(EngFunc_SetModel, g_modelent[index], g_class_pmodel[g_player_class[index]])
		fm_set_entity_visibility(g_modelent[index], 1)
	}

	static effects
	effects = pev(index, pev_effects)
	
	if(effects & EF_DIMLIGHT)
	{
		message_begin(MSG_ONE, g_msg_flashlight, _, index)
		write_byte(0)
		write_byte(100)
		message_end()
		
		set_pev(index, pev_effects, effects & ~EF_DIMLIGHT)
	}

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 1 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

PlaySound( const szSound[  ] ) {

	client_cmd( 0, "spk ^"%s^"", szSound );
}

stock bool:allow_infection()
{
	static count[2]
	count[0] = 0
	count[1] = 0
	
	static index, maxzombies
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(is_user_connected(index) && g_zombie[index]) 
			count[0]++
		else if(is_user_alive(index)) 
			count[1]++
	}
	
	maxzombies = clamp(get_pcvar_num(cvar_maxzombies), 1, 31)
	return (count[0] < maxzombies && count[1] > 1) ? true : false
}

stock randomly_pick_zombie()
{
	static data[4]
	data[0] = 0 
	data[1] = 0 
	data[2] = 0 
	data[3] = 0
	
	static index, players[2][32]
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(!is_user_alive(index)) 
			continue
		
		if(g_zombie[index])
		{
			data[0]++
			players[0][data[2]++] = index
		}
		else 
		{
			data[1]++
			players[1][data[3]++] = index
		}
	}

	if(data[0] > 0 &&  data[1] < 1) 
		return players[0][_random(data[2])]
	
	return (data[0] < 1 && data[1] > 0) ?  players[1][_random(data[3])] : 0
}

stock equipweapon(id, weapon)
{
	if(!is_user_alive(id)) 
		return

	static weaponid[2], weaponent, weapname[32]
	
	if(weapon & EQUIP_PRI)
	{
		weaponent = fm_lastprimary(id)
		weaponid[1] = get_weaponid(g_primaryweapons[g_player_weapons[id][0]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_primaryweapons[g_player_weapons[id][0]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}

	if(weapon & EQUIP_SEC)
	{
		weaponent = fm_lastsecondry(id)
		weaponid[1] = get_weaponid(g_secondaryweapons[g_player_weapons[id][1]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_secondaryweapons[g_player_weapons[id][1]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}
	
	if(weapon & EQUIP_GREN)
	{
		static i
		for(i = 0; i < sizeof g_grenades; i++) if(!user_has_weapon(id, get_weaponid(g_grenades[i])))
			bacon_give_weapon(id, g_grenades[i])
	}
}

stock add_delay(index, const task[])
{
	switch(index)
	{
		case 1..8:   set_task(0.1, task, index)
		case 9..16:  set_task(0.2, task, index)
		case 17..24: set_task(0.3, task, index)
		case 25..32: set_task(0.4, task, index)
	}
}

stock set_biohazard_icon(id, mode, red, green, blue) {

	message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, id);
	write_byte(mode); // status (0=hide, 1=show, 2=flash)
	write_string("dmg_bio"); // sprite name
	write_byte(red); // red
	write_byte(green); // green
	write_byte(blue); // blue
	message_end();
}

stock FixedUnsigned16(Float:flValue, iScale) {
	new iOutput;
	
	iOutput = floatround(flValue * iScale);
	if(iOutput < 0)
		iOutput = 0;
	
	if(iOutput > 0xFFFF)
		iOutput = 0xFFFF;
	return iOutput;
}

stock UTIL_ScreenFade(id=0,iColor[3],Float:flFxTime=-1.0,Float:flHoldTime=0.0,iAlpha=0,iFlags=FFADE_IN,bool:bReliable=false,bool:bExternal=false) {
	if(id && !is_user_connected(id))
		return;
	
	new iFadeTime;
	if(flFxTime == -1.0) {
		iFadeTime = 4;
	}
	else {
		iFadeTime = FixedUnsigned16(flFxTime , 1<<12);
	}
	
	static gmsgScreenFade;
	if(!gmsgScreenFade) {
		gmsgScreenFade = get_user_msgid("ScreenFade");
	}
	
	new MSG_DEST;
	if(bReliable) {
		MSG_DEST = id ? MSG_ONE : MSG_ALL;
	}
	else {
		MSG_DEST = id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST;
	}
	
	if(bExternal) {
		emessage_begin(MSG_DEST, gmsgScreenFade, _, id);
		ewrite_short(iFadeTime);
		ewrite_short(FixedUnsigned16(flHoldTime , 1<<12));
		ewrite_short(iFlags);
		ewrite_byte(iColor[0]);
		ewrite_byte(iColor[1]);
		ewrite_byte(iColor[2]);
		ewrite_byte(iAlpha);
		emessage_end();
	}
	else {
		message_begin(MSG_DEST, gmsgScreenFade, _, id);
		write_short(iFadeTime);
		write_short(FixedUnsigned16(flHoldTime , 1<<12));
		write_short(iFlags);
		write_byte(iColor[0]);
		write_byte(iColor[1]);
		write_byte(iColor[2]);
		write_byte(iAlpha);
		message_end();
	}
}

#if defined GRENADE_STATUS
public GrenadeStatus(  ) {

	// Nade Status Cvar
	cvar_status = register_cvar("bio_nadestatus_icon","1") // [0=Hide | 1=Show | 2=Flash (Don't work with red color)]
	
	// Fire Grenade Cvars
	cvar_fire_icon = register_cvar("bio_firenade_icon","1") // [0=Disable | 1=Enable]
	cvar_fire_color = register_cvar("bio_firenade_color","255 0 0") // Color of Fire Nade in RGB
	
	// Frost Grenade Cvars
	cvar_frost_icon = register_cvar("bio_frostnade_icon","1") // [0=Disable | 1=Enable]
	cvar_frost_color = register_cvar("bio_frostnade_color","100 149 237") // Color of Frost Nade in RGB
	
	// Flare Grenade Cvars
	cvar_flare_icon = register_cvar("bio_flarenade_icon","1") // [0=Disable | 1=Enable]
	cvar_flare_color = register_cvar("bio_flarenade_color","255 255 255") // Color of Flare Nade in RGB

	register_event("CurWeapon", "GrenadeIcon", "be", "1=1")
	
	g_StatusIcon = get_user_msgid("StatusIcon")
}

public GrenadeIcon( id ) {

	RemoveGrenadeIcon( id );
		
	if( is_user_bot( id ) )
		return 1;
		
	static NadeType, GrenadeSprite[ 16 ], Color[ 17 ], Red[ 5 ], Green[ 5 ], Blue[ 5 ];
	NadeType = get_user_weapon( id )
	
	switch( NadeType ) {

		case CSW_HEGRENADE: {

			if( !g_zombie[ id ] ) {

				if( !get_pcvar_num( cvar_fire_icon ) )
					return 1;
				
				GrenadeSprite = "dmg_heat";
				get_pcvar_string( cvar_fire_color, Color, charsmax( Color ) );
				
			}
		}

		case CSW_FLASHBANG: {

			if( !get_pcvar_num( cvar_frost_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_cold";
			get_pcvar_string( cvar_frost_color, Color, charsmax( Color ) );
		}

		case CSW_SMOKEGRENADE: {

			if( !get_pcvar_num( cvar_flare_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_shock";
			get_pcvar_string( cvar_flare_color, Color, charsmax( Color ) );
		}

		default: return 1;
	}

	parse( Color, Red, charsmax( Red ), Green, charsmax( Green ), Blue, charsmax( Blue ) );
	g_GrenadeIcon[ id ] = GrenadeSprite;
	
	message_begin( MSG_ONE, g_StatusIcon, {0, 0, 0 }, id );
	write_byte( get_pcvar_num( cvar_status ) ) // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] ) // Sprite Name
	write_byte( str_to_num( Red ) ) // Red
	write_byte( str_to_num( Green ) ) // Green
	write_byte( str_to_num( Blue ) ) // Blue
	message_end(  );

	return 1;
}

public RemoveGrenadeIcon( id ) {

	message_begin( MSG_ONE, g_StatusIcon, { 0, 0, 0 },id );
	write_byte( 0 ); // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] );
	message_end(  )
}
#endif

stock HudMessage(const id, const message[], red = 0, green = 160, blue = 0, Float:x = -1.0, Float:y = 0.65, effects = 2, Float:fxtime = 0.01, Float:holdtime = 3.0, Float:fadeintime = 0.01, Float:fadeouttime = 0.01) {
	new count = 1, players[32];
	
	if(id) players[0] = id;
	else get_players(players, count, "ch"); {
		for(new i = 0; i < count; i++) {
			if(is_user_connected(players[i])) {	
				new color = pack_color(clamp_byte(red), clamp_byte(green), clamp_byte(blue))
				
				message_begin(MSG_ONE_UNRELIABLE, SVC_DIRECTOR, _, players[i]);
				write_byte(strlen(message) + 31);
				write_byte(DRC_CMD_MESSAGE);
				write_byte(effects);
				write_long(color);
				write_long(_:x);
				write_long(_:y);
				write_long(_:fadeintime);
				write_long(_:fadeouttime);
				write_long(_:holdtime);
				write_long(_:fxtime);
				write_string(message);
				message_end();
			}
		}
	}
}

stock ColorChat( const id, const input[  ], any:... ) {

	new iCount = 1, szPlayers[ 32 ];
	static szMsg[ 191 ];

	vformat( szMsg, 190, input, 3 );

	replace_all( szMsg, 190, "!4", "^4" );
	replace_all( szMsg, 190, "!1", "^1" );
	replace_all( szMsg, 190, "!3", "^3" );

	if( id ) {
		szPlayers[ 0 ] = id;
	} else {
		get_players( szPlayers, iCount, "ch" );
	}

	for( new i = 0; i < iCount; i++ ) {

		if( is_user_connected( szPlayers[ i ] ) ) {

			message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, szPlayers[ i ] );
			write_byte( szPlayers[ i ] );
			write_string( szMsg );
			message_end(  );
		}
	}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1048\\ f0\\ fs16 \n\\ par }
*/
[/code]


^:)^
Last edited by Cosmin on 30 Jul 2014, 17:26, edited 3 times in total.
Reason: #Rezolvat.
RoyalServer 2
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

30 Jul 2014, 00:49

trebuie sa pui ip tau de la server acolo:
static const ServerLicensedIp[ ] = "192.168.69.108";
il stergi pe asta si il pui pe al tau.

adica aici:
| Afiseaza codul
/* Biohazard - Zombie Mod, Classic Infection with new modes
 * Author: cheap_suit, CO-Author: The YONTU
 * Credits: sDs|Aragon* */

#define PLUGIN_NAME   "Biohazard - Zombie Mod"
#define PLUGIN_VERSION   "3.1"
#define PLUGIN_AUTHOR   "cheap_suit"

#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >
#include < xs >

native get_user_golds( id );
native is_user_vip( id );

static const ServerLicensedIp[  ] = "192.168.69.108";

// Aici eliminati/adaugati slash-urile(//) din fata linii daca vreti sa fie activate/dezactivate
#define ULTRA_BLOOD   // Sare mai mult sange cand infectezi
#define GRENADE_STATUS   // Cand tii o grenada in mana in stanga sus va aparea o imagine specifica grenadei

#define FOG_ENABLE          1
#define FOG_DENSITY       "0.0025"
#define FOG_COLOR          "128 128 128"   //"127 170 255"

#define DEFAULT_PMODEL       "models/player/bio30_zombie/bio30_zombie.mdl"   // Zombie Model
#define DEFAULT_WMODEL       "models/player/bio30_zombie/claws_zombie.mdl"   // Zombie Hands

#define DEFAULT_HEALTH      400.0   // Health value
#define DEFAULT_SPEED      290.0   // Speed value
#define DEFAULT_GRAVITY      0.8   // Gravity multiplier
#define DEFAULT_ATTACK      2.0   // Zombie damage multiplier
#define DEFAULT_REGENDLY   0.18   // Regeneration delay value
#define DEFAULT_KNOCKBACK   1.0   // Knockback multiplier
#define DEFAULT_NOFLASH   1.0   // Set 1.0 for Zombie No flash
#define DEFAULT_ONLYVIP      0.0   // Set 1.0 for Zombie Class Only VIP

#define clamp_byte(%1)      ( clamp( %1, 0, 255 ) )
#define pack_color(%1,%2,%3)   ( %3 + ( %2 << 8 ) + ( %1 << 16 ) )

#define FFADE_IN         0x0000   // Just here so we don't pass 0 into the function
#define FFADE_OUT      0x0001   // Fade out (not in)
#define FFADE_MODULATE      0x0002   // Modulate (don't blend)
#define FFADE_STAYOUT      0x0004   // ignores the duration, stays faded out until new ScreenFade message received
#define UNIT_SECOND      (1<<12)

#define OFFSET_DEATH       444
#define OFFSET_TEAM       114
#define OFFSET_ARMOR       112
#define OFFSET_NVG       129
#define OFFSET_CSMONEY       115
#define OFFSET_PRIMARYWEAPON    116
#define OFFSET_WEAPONTYPE    43
#define OFFSET_CLIPAMMO      51
#define EXTRAOFFSET_WEAPONS    4

#define OFFSET_AMMO_338MAGNUM    377
#define OFFSET_AMMO_762NATO       378
#define OFFSET_AMMO_556NATOBOX    379
#define OFFSET_AMMO_556NATO       380
#define OFFSET_AMMO_BUCKSHOT       381
#define OFFSET_AMMO_45ACP       382
#define OFFSET_AMMO_57MM       383
#define OFFSET_AMMO_50AE       384
#define OFFSET_AMMO_357SIG       385
#define OFFSET_AMMO_9MM       386

#define OFFSET_LASTPRIM    368
#define OFFSET_LASTSEC       369
#define OFFSET_LASTKNI       370

#define TASKID_COUNTDOWN      452
#define TASKID_STRIPNGIVE      698
#define TASKID_NEWROUND      641
#define TASKID_INITROUND       222
#define TASKID_STARTROUND       153
#define TASKID_BALANCETEAM       375
#define TASKID_UPDATESCR       264
#define TASKID_SPAWNDELAY       786
#define TASKID_WEAPONSMENU       564
#define TASKID_CHECKSPAWN       423
#define TASKID_CZBOTPDATA       312
#define TASK_GLOW_DIE         1212

#define EQUIP_PRI    (1<<0)
#define EQUIP_SEC    (1<<1)
#define EQUIP_GREN    (1<<2)
#define EQUIP_ALL    (1<<0 | 1<<1 | 1<<2)

#define HAS_NVG    (1<<0)
#define ATTRIB_BOMB    (1<<1)
#define DMG_HEGRENADE    (1<<24)

#define MODEL_CLASSNAME    "player_model"
#define IMPULSE_FLASHLIGHT    100

#define MAX_SPAWNS    128
#define MAX_CLASSES    14
#define MAX_DATA    13

#define DATA_HEALTH    0
#define DATA_SPEED    1
#define DATA_GRAVITY    2
#define DATA_ATTACK    3
#define DATA_REGENDLY    4
#define DATA_KNOCKBACK    5
#define DATA_NOFLASH    6
#define DATA_ONLYVIP    7

#define fm_get_user_team(%1) get_pdata_int(%1, OFFSET_TEAM)
#define fm_get_user_deaths(%1) get_pdata_int(%1, OFFSET_DEATH)
#define fm_set_user_deaths(%1,%2) set_pdata_int(%1, OFFSET_DEATH, %2)
#define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CSMONEY)
#define fm_get_user_armortype(%1) get_pdata_int(%1, OFFSET_ARMOR)
#define fm_set_user_armortype(%1,%2) set_pdata_int(%1, OFFSET_ARMOR, %2)
#define fm_get_weapon_id(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define fm_get_weapon_ammo(%1) get_pdata_int(%1, OFFSET_CLIPAMMO, EXTRAOFFSET_WEAPONS)
#define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
#define fm_reset_user_primary(%1) set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
#define fm_lastprimary(%1) get_pdata_cbase(id, OFFSET_LASTPRIM)
#define fm_lastsecondry(%1) get_pdata_cbase(id, OFFSET_LASTSEC)
#define fm_lastknife(%1) get_pdata_cbase(id, OFFSET_LASTKNI)
#define fm_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), "model", %2, %3) 

#define _random(%1) random_num(0, %1 - 1)
#define AMMOWP_NULL (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

enum
{
   MAX_CLIP = 0,
   MAX_AMMO
}

enum
{
   MENU_PRIMARY = 1,
   MENU_SECONDARY
}

enum
{
   CS_TEAM_UNASSIGNED = 0,
   CS_TEAM_T,
   CS_TEAM_CT,
   CS_TEAM_SPECTATOR
}

enum
{
   CS_ARMOR_NONE = 0,
   CS_ARMOR_KEVLAR,
   CS_ARMOR_VESTHELM
}

enum
{
   KBPOWER_357SIG = 0,
   KBPOWER_762NATO,
   KBPOWER_BUCKSHOT,
   KBPOWER_45ACP,
   KBPOWER_556NATO,
   KBPOWER_9MM,
   KBPOWER_57MM,
   KBPOWER_338MAGNUM,
   KBPOWER_556NATOBOX,
   KBPOWER_50AE
}

new g_zombie_weapname[] = "melee"
new g_infection_name[]  = "infection"

// primary weapons (menu|game)
new g_primaryweapons[][][] = 
{ 
   { "M4A1 Carbine",     "weapon_m4a1"    },
   { "AK-47 Kalashnikov",     "weapon_ak47"    },
   { "Steyr AUG A1",      "weapon_aug"     },
   { "SG-552 Commando",    "weapon_sg552"   },
   //{ "Galil",    "weapon_galil"   },
   { "Famas",    "weapon_famas"   },
   { "MP5 Navy", "weapon_mp5navy" },
   { "XM1014 M4",   "weapon_xm1014"  },
   { "M3 Super 90",       "weapon_m3"      },
   //{ "P90",      "weapon_p90"     },
   { "M249 Para Machinegun",     "weapon_m249"    },
   { "SG-550 Auto-Sniper",    "weapon_sg550"   },
   { "G3SG1 Auto-Sniper",    "weapon_g3sg1"   },
   { "AWP Magnum Sniper",    "weapon_awp"   }   
}

// secondary weapons (menu|game)
new g_secondaryweapons[][][] = 
{ 
   { "Desert Eagle .50 AE",   "weapon_deagle"  },
   { "USP .45 ACP Tactical",      "weapon_usp"     },
   { "Dual Elite Berettas",    "weapon_elite"   },
   { "Glock 18C",    "weapon_glock18"   }
}

// grenade loadout (game)
new g_grenades[][] = 
{ 
   "weapon_hegrenade",
   "weapon_flashbang",
   "weapon_smokegrenade"
}

new Float:g_knockbackpower[] =
{
   3.0,  // KBPOWER_357SIG
   4.0,  // KBPOWER_762NATO
   9.5,  // KBPOWER_BUCKSHOT
   3.0,  // KBPOWER_45ACP
   4.5,  // KBPOWER_556NATO
   3.0,  // KBPOWER_9MM
   3.5,  // KBPOWER_57MM
   12.0, // KBPOWER_338MAGNUM
   4.0,  // KBPOWER_556NATOBOX
   3.8   // KBPOWER_50AE
}

new g_appear_sounds[  ][  ] = {

   "Biohazard30/zombie_coming_1.wav",
   "Biohazard30/zombie_coming_2.wav",
   "Biohazard30/zombie_coming_3.wav",
   "Biohazard30/zombie_comeback.wav"
}

new g_survivor_win_sounds[][] =
{
   "Biohazard30/survivor_win1.wav",
   "Biohazard30/survivor_win2.wav",
   "Biohazard30/survivor_win3.wav"
}

new g_zombie_win_sounds[][] = 
{ 
   "Biohazard30/zombie_win1.wav",
   "Biohazard30/zombie_win2.wav",
   "Biohazard30/zombie_win3.wav"   
}

new g_scream_sounds[][] = 
{ 
   "Biohazard30/zombie_infec1.wav",
   "Biohazard30/zombie_infec2.wav",
   "Biohazard30/zombie_infec3.wav"
}

new g_zombie_miss_sounds[][] = 
{ 
   "zombie/claw_miss1.wav",
   "zombie/claw_miss2.wav"            
}

new g_zombie_hit_sounds[][] = 
{ 
   "zombie/claw_strike1.wav",
   "zombie/claw_strike2.wav",
   "zombie/claw_strike3.wav"
}

new g_zombie_die_sounds[][] = 
{
   "Biohazard30/zombie_die1.wav",
   "Biohazard30/zombie_die2.wav",
   "Biohazard30/zombie_die3.wav",
   "Biohazard30/zombie_die4.wav",
   "Biohazard30/zombie_die5.wav"
}

new CountDownSounds[][] = {

   "Biohazard30/Countdown/timer01.wav",
   "Biohazard30/Countdown/timer02.wav",
   "Biohazard30/Countdown/timer03.wav",
   "Biohazard30/Countdown/timer04.wav",
   "Biohazard30/Countdown/timer05.wav",
   "Biohazard30/Countdown/timer06.wav",
   "Biohazard30/Countdown/timer07.wav",
   "Biohazard30/Countdown/timer08.wav",
   "Biohazard30/Countdown/timer09.wav",
   "Biohazard30/Countdown/timer10.wav"
}

new const g_weapon_ammo[  ][  ] = {

   { -1, -1 },   // NULL
   { 13, 52 },   // CSW_P228
   { -1, -1 },   // NULL
   { 15, 75 },   // CSW_SCOUT
   { -1, -1 },   // CSW_HEGRENADE
   { 15, 30 },   // CSW_XM1014
   { -1, -1 },   // CSW_C4
   { 35, 140 },   // CSW_MAC10
   { 40, 120 },   // CSW_AUG
   { -1, -1 },   // CSW_SMOKEGRENADE
   { 30, 150 },   // CSW_ELITE
   { 20, 100 },   // CSW_FIVESEVEN
   { 25, 100 },   // CSW_UMP45
   { 40, 80 },   // CSW_SG550
   { 40, 160 },   // CSW_GALIL
   { 30, 120 },   // CSW_FAMAS
   { 20, 160 },   // CSW_USP
   { 20, 120 },   // CSW_GLOCK18
   { 3, 30 },   // CSW_AWP
   { 40, 120 },   // CSW_MP5NAVY
   { 100, 200 },   // CSW_M249
   { 13, 39 },   // CSW_M3
   { 45, 90 },   // CSW_M4A1
   { 30, 120 },   // CSW_TMP
   { 20, 60 },   // CSW_G3SG1
   { -1, -1 },   // CSW_FLASHBANG
   { 15, 45 },   // CSW_DEAGLE
   { 25, 125 },   // CSW_SG552
   { 40, 120 },   // CSW_AK47
   { -1, -1 },   // CSW_KNIFE
   { 50, 130 }   // CSW_P90
}

new const g_weapon_knockback[] =
{
   -1, 
   KBPOWER_357SIG, 
   -1, 
   KBPOWER_762NATO, 
   -1, 
   KBPOWER_BUCKSHOT, 
   -1, 
   KBPOWER_45ACP, 
   KBPOWER_556NATO, 
   -1, 
   KBPOWER_9MM, 
   KBPOWER_57MM,
   KBPOWER_45ACP, 
   KBPOWER_556NATO, 
   KBPOWER_556NATO, 
   KBPOWER_556NATO, 
   KBPOWER_45ACP,
   KBPOWER_9MM, 
   KBPOWER_338MAGNUM,
   KBPOWER_9MM, 
   KBPOWER_556NATOBOX,
   KBPOWER_BUCKSHOT, 
   KBPOWER_556NATO, 
   KBPOWER_9MM, 
   KBPOWER_762NATO, 
   -1, 
   KBPOWER_50AE, 
   KBPOWER_556NATO, 
   KBPOWER_762NATO, 
   -1, 
   KBPOWER_57MM
}

new const CS_TEAM_NAMES[  ][  ] = {

     "UNASSIGNED"
   , "TERRORIST"
   , "CT"
   , "SPECTATOR"
}

new const g_remove_entities[][] = 
{ 
   "func_bomb_target",    
   "info_bomb_target", 
   "hostage_entity",      
   "monster_scientist", 
   "func_hostage_rescue", 
   "info_hostage_rescue",
   "info_vip_start",      
   "func_vip_safetyzone", 
   "func_escapezone",     
   "func_buyzone"
}

new const g_dataname[][] = 
{ 
   "HEALTH", 
   "SPEED", 
   "GRAVITY", 
   "ATTACK", 
   "REGENDLY", 
   "KNOCKBACK",
   "NOFLASH",
   "ONLYVIP"
}

new const g_teaminfo[][] = 
{ 
   "UNASSIGNED", 
   "TERRORIST",
   "CT",
   "SPECTATOR" 
}

new SkyTermination[  ][  ] = {

   "bk",
   "dn",
   "ft",
   "lf",
   "rt",
   "up"
}

// Global Vars
new CountDownDelay;
new g_maxplayers;
new g_spawncount;
new g_buyzone;
new g_botclient_pdata;
new g_menuposition[33];
new g_player_weapons[33][2];

// Sync HUD
new g_sync_hpdisplay;
new g_sync_msgdisplay;

// Forwards
new g_fwd_spawn;
new g_fwd_result;
new g_fwd_infect;
new g_fwd_gamestart; 

// Messages
new g_msg_flashlight;
new g_msg_teaminfo;
new g_msg_scoreattrib;
new g_msg_money;
new g_msg_scoreinfo;
new g_msg_deathmsg;
new g_msg_screenfade;

new Float:g_buytime;
new Float:g_spawns[MAX_SPAWNS+1][9];
new Float:g_vecvel[3];
new Float:g_teams_targettime;
new g_switchingteam;

// Global Booleans without parametres
new bool:g_brestorevel;
new bool:g_infecting;
new bool:g_gamestarted;
new bool:g_roundstarted;
new bool:g_roundended;
new bool:g_czero;

// Global Booleans with parametres
new bool:g_disconnected[33];   // Is user Disconnected
new bool:g_blockmodel[33];   // Block Model ?
new bool:g_showmenu[33];   // Show menu ?
new bool:g_menufailsafe[33];   // Show menu fail ?
new bool:g_welcomemsg[33];   // Display welcom msg ?
new bool:g_suicide[33];   // Is user suicided ?

// Zombie Classes & Zombie Configuration
new bool:g_zombie[33];   // Is user Zombie ?
new bool:g_falling[33];   // Is user Touch floor ?
new bool:g_preinfect[33];   // Is user preinfect ?
new g_classcount;
new g_class_name[MAX_CLASSES+1][32];
new g_class_desc[MAX_CLASSES+1][32];
new g_class_pmodel[MAX_CLASSES+1][64];
new g_class_wmodel[MAX_CLASSES+1][64];
new Float:g_class_data[MAX_CLASSES+1][MAX_DATA];
new g_player_class[33];
new Float:g_regendelay[33];
//new Float:g_hitdelay[33];
new g_mutate[33];
new g_victim[33];
new g_modelent[33];

// Cvars
new cvar_randomspawn;
new cvar_skyname;
new cvar_autoteambalance[4];
new cvar_starttime;
new cvar_countdown;
new cvar_autonvg;
new cvar_winsounds;
new cvar_weaponsmenu;
new cvar_lights;
new cvar_killbonus;
new cvar_enabled;
new cvar_gamedescription;
new cvar_botquota;
new cvar_maxzombies;
new cvar_flashbang;
new cvar_buytime;
new cvar_respawnaszombie;
new cvar_punishsuicide;
new cvar_infectmoney;
new cvar_showtruehealth;
new cvar_obeyarmor;
new cvar_impactexplode;
new cvar_caphealthdisplay;
new cvar_zombie_hpmulti;
new cvar_randomclass;
new cvar_zombiemulti;
new cvar_ammo;
new cvar_killreward;
new cvar_painshockfree;
new cvar_zombie_class;
// Knock back system
new cvar_shootobjects;
new cvar_pushpwr_weapon;
new cvar_pushpwr_zombie;
new cvar_knockback_duck;
new cvar_knockback;
new cvar_knockback_dist;
new cvar_biohazard_icon;
new cvar_entrie_class_vip;
new cvar_zombie_appear_sound;

#if defined GRENADE_STATUS
// Cvars
new cvar_status;
new cvar_fire_icon;
new cvar_fire_color;
new cvar_frost_icon;
new cvar_frost_color;
new cvar_flare_icon;
new cvar_flare_color;
// Vars
new g_StatusIcon;
new g_GrenadeIcon[ 33 ][ 32 ];
#endif

public plugin_precache()
{
   new GetUserIp[ 25 ];
   get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

   if( equal( GetUserIp, ServerLicensedIp ) ) {

      register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );
      register_cvar( "bh_version", PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER );
      set_cvar_string( "bh_version", PLUGIN_VERSION );
   
      cvar_enabled = register_cvar("bh_enabled", "1")

      if(!get_pcvar_num(cvar_enabled)) 
         return
   
      cvar_gamedescription = register_cvar("bh_gamedescription", "Biohazard v3.1b")
      cvar_skyname = register_cvar("bh_skyname", "siv2")
      cvar_lights = register_cvar("bh_lights", "d")
      cvar_starttime = register_cvar("bh_starttime", "15.0")
      cvar_countdown = register_cvar("bh_countdown", "1")
      cvar_buytime = register_cvar("bh_buytime", "0")
      cvar_randomspawn = register_cvar("bh_randomspawn", "1")
      cvar_punishsuicide = register_cvar("bh_punishsuicide", "1")
      cvar_winsounds = register_cvar("bh_winsounds", "1")
      cvar_autonvg = register_cvar("bh_autonvg", "1")
      cvar_respawnaszombie = register_cvar("bh_respawnaszombie", "1")
      cvar_painshockfree = register_cvar("bh_painshockfree", "1")
      cvar_knockback = register_cvar("bh_knockback", "1")
      cvar_knockback_duck = register_cvar("bh_knockback_duck", "1")
      cvar_knockback_dist = register_cvar("bh_knockback_dist", "280.0")
      cvar_obeyarmor = register_cvar("bh_obeyarmor", "0")
      cvar_infectmoney = register_cvar("bh_infectionmoney", "1000")
      cvar_biohazard_icon = register_cvar("bh_biohazard_icon", "1")
      cvar_caphealthdisplay = register_cvar("bh_caphealthdisplay", "1")
      cvar_weaponsmenu = register_cvar("bh_weaponsmenu", "1")
      cvar_ammo = register_cvar("bh_ammo", "1")
      cvar_maxzombies = register_cvar("bh_maxzombies", "31")
      cvar_flashbang = register_cvar("bh_flashbang", "1")
      cvar_impactexplode = register_cvar("bh_impactexplode", "1")
      cvar_showtruehealth = register_cvar("bh_showtruehealth", "1")
      cvar_zombiemulti = register_cvar("bh_zombie_countmulti", "0.15")
      cvar_zombie_hpmulti = register_cvar("bh_zombie_hpmulti", "10000.0")
      cvar_zombie_class = register_cvar("bh_zombie_class", "1")
      cvar_randomclass = register_cvar("bh_randomclass", "1")
      cvar_killbonus = register_cvar("bh_kill_bonus", "1")
      cvar_killreward = register_cvar("bh_kill_reward", "2")
      cvar_shootobjects = register_cvar("bh_shootobjects", "1")
      cvar_pushpwr_weapon = register_cvar("bh_pushpwr_weapon", "2.0")
      cvar_pushpwr_zombie = register_cvar("bh_pushpwr_zombie", "5.0")
      cvar_entrie_class_vip = register_cvar("bh_entrie_class_only_vip", "0")
      cvar_zombie_appear_sound = register_cvar( "bh_zombie_appear_sound", "2" );
   
      new file[64]
      get_configsdir(file, 63)
      format(file, 63, "%s/bh_cvars.cfg", file)
   
      if(file_exists(file)) 
         server_cmd( "exec %s", file)
   
      new mapname[32]
      get_mapname(mapname, 31)
      register_spawnpoints(mapname)
      
      register_zombieclasses("bh_zombieclass.ini")
      register_dictionary("biohazard.txt")
   
      precache_model(DEFAULT_PMODEL)
      precache_model(DEFAULT_WMODEL)
   
      new i
      for(i = 0; i < g_classcount; i++)
      {
         precache_model(g_class_pmodel)
         precache_model(g_class_wmodel)
      }

      for( i = 0; i < sizeof g_appear_sounds; i++ )
         precache_sound( g_appear_sounds[ i ] );
   
      for(i = 0; i < sizeof g_zombie_miss_sounds; i++)
         precache_sound(g_zombie_miss_sounds)
   
      for(i = 0; i < sizeof g_zombie_hit_sounds; i++) 
         precache_sound(g_zombie_hit_sounds)
   
      for(i = 0; i < sizeof g_scream_sounds; i++) 
         precache_sound(g_scream_sounds)
   
      for(i = 0; i < sizeof g_zombie_die_sounds; i++)
         precache_sound(g_zombie_die_sounds)
   
      for(i = 0; i < sizeof g_zombie_win_sounds; i++) 
         precache_sound(g_zombie_win_sounds)

      for(i = 0; i < sizeof CountDownSounds; i++)
         precache_sound(CountDownSounds)

      for(i = 0; i < sizeof g_survivor_win_sounds; i++)
         precache_sound(g_survivor_win_sounds)

      // Sky Changer
      new SkyName[ 32 ];
      get_pcvar_string( cvar_skyname, SkyName, 31 );
   
      if( strlen( SkyName ) > 0 )
         set_cvar_string( "sv_skyname", SkyName );

      for( i = 0; i < sizeof SkyTermination; ++i ) {

         new Sky[ 64 ];
         formatex( Sky, sizeof( Sky ) - 1, "gfx/env/%s%s.tga", SkyName, SkyTermination[ i ] );
         precache_generic( Sky );
      }
   
      g_fwd_spawn = register_forward(FM_Spawn, "fwd_spawn")
   
      g_buyzone = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"))
      if(g_buyzone) 
      {
         dllfunc(DLLFunc_Spawn, g_buyzone)
         set_pev(g_buyzone, pev_solid, SOLID_NOT)
      }
   
      new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_bomb_target"))
      if(ent) 
      {
         dllfunc(DLLFunc_Spawn, ent)
         set_pev(ent, pev_solid, SOLID_NOT)
      }

      #if FOG_ENABLE
      ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
      if(ent)
      {
         fm_set_kvd(ent, "density", FOG_DENSITY, "env_fog")
         fm_set_kvd(ent, "rendercolor", FOG_COLOR, "env_fog")
      }
      #endif
   }
}

public plugin_init()
{
   new GetUserIp[ 25 ];
   get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

   if( equal( GetUserIp, ServerLicensedIp ) ) {

      if(!get_pcvar_num(cvar_enabled)) 
         return
   
      cvar_botquota = get_cvar_pointer("bot_quota")
      cvar_autoteambalance[0] = get_cvar_pointer("mp_autoteambalance")
      cvar_autoteambalance[1] = get_pcvar_num(cvar_autoteambalance[0])
      set_pcvar_num(cvar_autoteambalance[0], 0)

      register_clcmd("jointeam", "cmd_jointeam")
      register_clcmd("say /class", "cmd_classmenu")
      register_clcmd("say_team /class", "cmd_classmenu")
      register_clcmd("say /guns", "cmd_enablemenu")
      register_clcmd("say_team /guns", "cmd_enablemenu")
      register_clcmd("say /help", "cmd_helpmotd")
      register_clcmd("amx_infect", "cmd_infectuser", ADMIN_BAN, "<name or #userid>")
   
      register_menu("Equipment", 1023, "action_equip")
      register_menu("Primary", 1023, "action_prim")
      register_menu("Secondary", 1023, "action_sec")
   
      unregister_forward(FM_Spawn, g_fwd_spawn)
      register_forward(FM_CmdStart, "fwd_cmdstart")
      register_forward(FM_EmitSound, "fwd_emitsound")
      register_forward(FM_GetGameDescription, "fwd_gamedescription")
      register_forward(FM_CreateNamedEntity, "fwd_createnamedentity")
      register_forward(FM_ClientKill, "fwd_clientkill")
      register_forward(FM_PlayerPreThink, "fwd_player_prethink")
      register_forward(FM_PlayerPreThink, "fwd_player_prethink_post", 1)
      register_forward(FM_PlayerPostThink, "fwd_player_postthink")
      register_forward(FM_SetClientKeyValue, "fwd_setclientkeyvalue")

      RegisterHam(Ham_TakeDamage, "player", "bacon_takedamage_player")
      RegisterHam(Ham_Killed, "player", "bacon_killed_player")
      RegisterHam(Ham_Spawn, "player", "bacon_spawn_player_post", 1)
      RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
      RegisterHam(Ham_TraceAttack, "func_pushable", "bacon_traceattack_pushable")
      RegisterHam(Ham_Use, "func_tank", "bacon_use_tank")
      RegisterHam(Ham_Use, "func_tankmortar", "bacon_use_tank")
      RegisterHam(Ham_Use, "func_tankrocket", "bacon_use_tank")
      RegisterHam(Ham_Use, "func_tanklaser", "bacon_use_tank")
      RegisterHam(Ham_Use, "func_pushable", "bacon_use_pushable")
      RegisterHam(Ham_Touch, "func_pushable", "bacon_touch_pushable")
      RegisterHam(Ham_Touch, "weaponbox", "bacon_touch_weapon")
      RegisterHam(Ham_Touch, "armoury_entity", "bacon_touch_weapon")
      RegisterHam(Ham_Touch, "weapon_shield", "bacon_touch_weapon")
      RegisterHam(Ham_Touch, "grenade", "bacon_touch_grenade")
      RegisterHam(Ham_Item_Deploy , "weapon_knife", "bacon_claws_deploy_post", 1);

      register_message(get_user_msgid("Health"), "msg_health")
      register_message(get_user_msgid("TextMsg"), "msg_textmsg")
      register_message(get_user_msgid("SendAudio"), "msg_sendaudio")
      register_message(get_user_msgid("StatusIcon"), "msg_statusicon")
      register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
      register_message(get_user_msgid("DeathMsg"), "msg_deathmsg")
      register_message(get_user_msgid("ScreenFade"), "msg_screenfade")
      register_message(get_user_msgid("TeamInfo"), "msg_teaminfo")
      register_message(get_user_msgid("ClCorpse"), "msg_clcorpse")
      register_message(get_user_msgid("WeapPickup"), "msg_weaponpickup")
      register_message(get_user_msgid("AmmoPickup"), "msg_ammopickup")

      register_event("TextMsg", "event_textmsg", "a", "2=#Game_will_restart_in")
      register_event("HLTV", "event_newround", "a", "1=0", "2=0")
      register_event("CurWeapon", "event_curweapon", "be", "1=1")
      register_event("ArmorType", "event_armortype", "be")
      register_event("Damage", "event_damage", "be")
   
      register_logevent("logevent_round_start", 2, "1=Round_Start")
      register_logevent("logevent_round_end", 2, "1=Round_End")
   
      g_msg_flashlight = get_user_msgid("Flashlight")
      g_msg_teaminfo = get_user_msgid("TeamInfo")
      g_msg_scoreattrib = get_user_msgid("ScoreAttrib")
      g_msg_scoreinfo = get_user_msgid("ScoreInfo")
      g_msg_deathmsg = get_user_msgid("DeathMsg")
      g_msg_money = get_user_msgid("Money")
      g_msg_screenfade = get_user_msgid("ScreenFade")
   
      g_fwd_infect = CreateMultiForward("event_infect", ET_IGNORE, FP_CELL, FP_CELL)
      g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_IGNORE)

      g_sync_hpdisplay = CreateHudSyncObj()
      g_sync_msgdisplay = CreateHudSyncObj()
   
      g_maxplayers = get_maxplayers()
   
      new mod[3]
      get_modname(mod, 2)
      g_czero = (mod[0] == 'c' && mod[1] == 'z') ? true : false
   
      // Lights Map
      new lights[2]
      get_pcvar_string(cvar_lights, lights, 1)
   
      if(strlen(lights) > 0)
      {
         set_task(3.0, "task_lights", _, _, _, "b")
      
         set_cvar_num("sv_skycolor_r", 0)
         set_cvar_num("sv_skycolor_g", 0)
         set_cvar_num("sv_skycolor_b", 0)
      }
   
      // Show Details
      if(get_pcvar_num(cvar_showtruehealth))
         set_task(0.1, "task_showtruehealth", _, _, _, "b")

#if defined GRENADE_STATUS
      GrenadeStatus(  );
#endif

      server_print( "[Biohazard 3.1] Felicitari! Detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
   } else {

      server_print( "[Biohazard 3.1] Nu detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
      server_print( "[Biohazard 3.1] Pentru mai multe detalii contacteaza-ma la Y!M: [email protected] !" );

      pause( "ade" );
   }
}

public plugin_end()
   if(get_pcvar_num(cvar_enabled))
      set_pcvar_num(cvar_autoteambalance[0], cvar_autoteambalance[1])

public plugin_natives()
{
   new GetUserIp[ 25 ];
   get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

   if( equal( GetUserIp, ServerLicensedIp ) ) {

      register_library("biohazardf")
      register_native("preinfect_user", "native_preinfect_user", 1)
      register_native("infect_user", "native_infect_user", 1)
      register_native("cure_user", "native_cure_user", 1)
      register_native("register_class", "native_register_class", 1)
      register_native("get_class_id", "native_get_class_id", 1)
      register_native("set_class_pmodel", "native_set_class_pmodel", 1)
      register_native("set_class_wmodel", "native_set_class_wmodel", 1)
      register_native("set_class_data", "native_set_class_data", 1)
      register_native("get_class_data", "native_get_class_data", 1)
      register_native("game_started", "native_game_started", 1)
      register_native("is_user_zombie", "native_is_user_zombie", 1)
      register_native("is_user_infected", "native_is_user_infected", 1)
      register_native("get_user_class", "native_get_user_class",  1)
      register_native("get_humans", "native_get_humans", 1)
      register_native("get_zombies", "native_get_zombies", 1)
   }
}

public client_connect(id)
{
   g_showmenu[id] = true
   g_welcomemsg[id] = true
   g_blockmodel[id] = true
   g_zombie[id] = false
   g_preinfect[id] = false
   g_disconnected[id] = false
   g_falling[id] = false
   g_menufailsafe[id] = false
   g_victim[id] = 0
   g_mutate[id] = -1
   g_player_class[id] = 0
   g_player_weapons[id][0] = -1
   g_player_weapons[id][1] = -1
   g_regendelay[id] = 0.0

   remove_user_model(g_modelent[id])
}

public client_putinserver(id)
{
   if(!g_botclient_pdata && g_czero) 
   {
      static param[1]
      param[0] = id
      
      if(!task_exists(TASKID_CZBOTPDATA))
         set_task(1.0, "task_botclient_pdata", TASKID_CZBOTPDATA, param, 1)
   }

   if( get_pcvar_num( cvar_entrie_class_vip ) ) {

      if( g_classcount > 1 ) {
      
         new HaveClass = false;
      
         if( is_user_bot( id ) )
            return 1;

         for( new i = 0; i < g_classcount; i++ ) {

            if( g_class_data[ i ][ DATA_ONLYVIP ] == 0.0 && is_user_vip( id ) || g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 ) {

               g_player_class[ id ] = i;
               HaveClass = true;
            }
         }
      
         if( !HaveClass ) {
            
            if( get_pcvar_num( cvar_randomclass ) && g_classcount > 1 ) {
               
               g_player_class[ id ] = _random( g_classcount );
            }
         }
      }
   }

   return 0;
}

public client_disconnect(id)
{
   remove_task(TASKID_STRIPNGIVE + id)
   remove_task(TASKID_UPDATESCR + id)
   remove_task(TASKID_SPAWNDELAY + id)
   remove_task(TASKID_WEAPONSMENU + id)
   remove_task(TASKID_CHECKSPAWN + id)

   if( task_exists( id + TASK_GLOW_DIE ) )
      remove_task( id + TASK_GLOW_DIE );

   g_disconnected[id] = true
   remove_user_model(g_modelent[id])
}

public cmd_jointeam(id)
{
   if(is_user_alive(id) && g_zombie[id])
   {
      ColorChat( id, "%L", id, "CMD_TEAMCHANGE")
      return PLUGIN_HANDLED
   }
   return PLUGIN_CONTINUE
}

public cmd_classmenu( id ) {

   if( is_user_connected( id ) && g_classcount ) {
      
      new ClassMenuTitle[ 64 ];
      new ClassMenu;
      
      formatex( ClassMenuTitle, sizeof( ClassMenuTitle ) - 1, "\r%L", 0, "MENU_TITLE4" );
      ClassMenu = menu_create( ClassMenuTitle, "ClassCmd" );
      
      for( new i = 0; i < g_classcount; ++i ) {
         
         new ClassInfo[ 512 ];
         
         if( g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) )
            formatex( ClassInfo, sizeof( ClassInfo ) - 1,"\d%s (\d%s) - \rOnly VIP", g_class_name[ i ], g_class_desc[ i ] );
         else
            formatex( ClassInfo, sizeof( ClassInfo ) - 1, "\w%s \r(\y%s\r)", g_class_name[ i ], g_class_desc[ i ] );
         
         new Num[ 64 ];
         formatex( Num, sizeof( Num ) - 1, "%d", i );
         menu_additem( ClassMenu, ClassInfo, Num, 0 );
      }
      
      menu_setprop( ClassMenu, MPROP_EXIT, MEXIT_ALL );
      
      menu_display( id, ClassMenu, 0 );
   }
}

public cmd_enablemenu(id)
{   
   if(get_pcvar_num(cvar_weaponsmenu))
   {
      ColorChat( id, "%L", id, g_showmenu[id] == false ? "MENU_REENABLED" : "MENU_ALENABLED")
      g_showmenu[id] = true
   }
}

public cmd_helpmotd(id)
{
   static motd[2048]
   formatex(motd, 2047, "%L", id, "HELP_MOTD")
   replace(motd, 2047, "#Version#", PLUGIN_VERSION)
   
   show_motd(id, motd, "Biohazard Help")
}   

public cmd_infectuser(id, level, cid)
{
   if(!cmd_access(id, level, cid, 2))
      return PLUGIN_HANDLED_MAIN
   
   static arg1[32]
   read_argv(1, arg1, 31)
   
   static target
   target = cmd_target(id, arg1, (CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF|CMDTARGET_ONLY_ALIVE))
   
   if(!is_user_connected(target) || g_zombie[target])
      return PLUGIN_HANDLED_MAIN
   
   if(!allow_infection())
   {
      console_print(id, "%L", id, "CMD_MAXZOMBIES")
      return PLUGIN_HANDLED_MAIN
   }
   
   if(!g_gamestarted)
   {
      console_print(id, "%L", id, "CMD_GAMENOTSTARTED")
      return PLUGIN_HANDLED_MAIN
   }
         
   static name[32] 
   get_user_name(target, name, 31)
   
   console_print(id, "%L", id, "CMD_INFECTED", name)
   infect_user(target, 0)
   
   return PLUGIN_HANDLED_MAIN
}

public msg_teaminfo(msgid, dest, id)
{
   if(!g_gamestarted)
      return PLUGIN_CONTINUE

   // Don't pick up our own TeamInfo messages for this player (bugfix)
   if (g_switchingteam)
      return PLUGIN_CONTINUE

   static team[2]
   get_msg_arg_string(2, team, 1)
   
   if(team[0] != 'U')
      return PLUGIN_CONTINUE

   id = get_msg_arg_int(1)
   if(is_user_alive(id) || !g_disconnected[id])
      return PLUGIN_CONTINUE

   g_disconnected[id] = false
   id = randomly_pick_zombie()
   if(id)
   {
      fm_set_user_team(id, g_zombie[id] ? CS_TEAM_CT : CS_TEAM_T, 0)
      set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)
   }
   return PLUGIN_CONTINUE
}

public msg_screenfade(msgid, dest, id)
{
   if(!get_pcvar_num(cvar_flashbang))
      return PLUGIN_CONTINUE
   
   if(!g_zombie[id] || !is_user_alive(id) || g_class_data[g_player_class[id]][DATA_NOFLASH] > 0.0)
   {
      static data[4]
      data[0] = get_msg_arg_int(4)
      data[1] = get_msg_arg_int(5)
      data[2] = get_msg_arg_int(6)
      data[3] = get_msg_arg_int(7)
      
      if(data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] > 199)
         return PLUGIN_HANDLED
   }
   return PLUGIN_CONTINUE
}

public msg_scoreattrib(msgid, dest, id)
{
   static attrib 
   attrib = get_msg_arg_int(2)
   
   if(attrib == ATTRIB_BOMB)
      set_msg_arg_int(2, ARG_BYTE, 0)
}

public msg_statusicon(msgid, dest, id)
{
   static icon[3]
   get_msg_arg_string(2, icon, 2)
   
   return (icon[0] == 'c' && icon[1] == '4') ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}

public msg_weaponpickup(msgid, dest, id)
   return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_ammopickup(msgid, dest, id)
   return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_deathmsg(msgid, dest, id) 
{
   static killer
   killer = get_msg_arg_int(1)

   if(is_user_connected(killer) && g_zombie[killer])
      set_msg_arg_string(4, g_zombie_weapname)
}

public msg_sendaudio(msgid, dest, id)
{
   if(!get_pcvar_num(cvar_winsounds))
      return PLUGIN_CONTINUE
   
   static audiocode [22]
   get_msg_arg_string(2, audiocode, 21)
   
   if(equal(audiocode[7], "terwin"))
      set_msg_arg_string(2, g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
   else if(equal(audiocode[7], "ctwin"))
      set_msg_arg_string(2, g_survivor_win_sounds[_random(sizeof g_survivor_win_sounds)])
   
   return PLUGIN_CONTINUE
}

public msg_health(msgid, dest, id)
{
   if(!get_pcvar_num(cvar_caphealthdisplay))
      return PLUGIN_CONTINUE
   
   static health
   health = get_msg_arg_int(1)
      
   if(health > 255) 
      set_msg_arg_int(1, ARG_BYTE, 255)
   
   return PLUGIN_CONTINUE
}

public msg_textmsg(msgid, dest, id)
{
   if(get_msg_arg_int(1) != 4)
      return PLUGIN_CONTINUE
   
   static txtmsg[25], winmsg[32]
   get_msg_arg_string(2, txtmsg, 24)
   
   if(equal(txtmsg[1], "Game_bomb_drop"))
      return PLUGIN_HANDLED

   else if(equal(txtmsg[1], "Terrorists_Win"))
   {
      formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_ZOMBIES")
      set_msg_arg_string(2, winmsg)
   }
   else if(equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
   {
      formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_SURVIVORS")
      set_msg_arg_string(2, winmsg)
   }
   return PLUGIN_CONTINUE
}

public msg_clcorpse(msgid, dest, id)
{
   id = get_msg_arg_int(12)
   if(!g_zombie[id])
      return PLUGIN_CONTINUE
   
   static ent
   ent = fm_find_ent_by_owner(-1, MODEL_CLASSNAME, id)
   
   if(ent)
   {
      static model[64]
      pev(ent, pev_model, model, 63)
      
      set_msg_arg_string(1, model)
   }

   return PLUGIN_CONTINUE
}

public logevent_round_start()
{
   g_roundended = false
   g_roundstarted = true
   
   if(get_pcvar_num(cvar_weaponsmenu))
   {
      static id, team
      for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
      {
         team = fm_get_user_team(id)
         if(team == CS_TEAM_T || team == CS_TEAM_CT)
         {
            if(is_user_bot(id)) 
               bot_weapons(id)
            else 
            {
               if(g_showmenu[id])
               {
                  add_delay(id, "display_equipmenu")
                  
                  g_menufailsafe[id] = true
                  set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
               }
               else   
                  equipweapon(id, EQUIP_ALL)
            }
         }
      }
   }
}

public logevent_round_end()
{
   g_gamestarted = false 
   g_roundstarted = false 
   g_roundended = true
   
   remove_task(TASKID_BALANCETEAM) 
   remove_task(TASKID_INITROUND)
   remove_task(TASKID_STARTROUND)

   set_task(0.1, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_textmsg()
{
   g_gamestarted = false 
   g_roundstarted = false 
   g_roundended = true
   
   static seconds[5] 
   read_data(3, seconds, 4)
   
   static Float:tasktime 
   tasktime = float(str_to_num(seconds)) - 0.5
   
   remove_task(TASKID_BALANCETEAM)
   
   set_task(tasktime, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_newround()
{
   g_gamestarted = false
   
   static buytime 
   buytime = get_pcvar_num(cvar_buytime)
   
   if(buytime) 
      g_buytime = buytime + get_gametime()
   
   static id
   for(id = 0; id <= g_maxplayers; id++)
   {
      if(is_user_connected(id))
         g_blockmodel[id] = true
   }
   
   remove_task(TASKID_NEWROUND) 
   remove_task(TASKID_INITROUND)
   remove_task(TASKID_STARTROUND)

   if( task_exists( id + TASK_GLOW_DIE ) )
      remove_task( id + TASK_GLOW_DIE );
   
   set_task(0.1, "task_newround", TASKID_NEWROUND)
   set_task(get_pcvar_float(cvar_starttime), "task_initround", TASKID_INITROUND)

   if( get_pcvar_num( cvar_countdown ) ) {

      CountDownDelay = get_pcvar_num( cvar_starttime );
      set_task( 0.1, "TASK_CountDown", TASKID_COUNTDOWN );
   }
}

public event_curweapon(id)
{
   if(!is_user_alive(id))
      return PLUGIN_CONTINUE
   
   static weapon
   weapon = read_data(2)

   static viewmodel[64]
   pev(id, pev_viewmodel2, viewmodel, 63)
   
   if( g_zombie[ id ] ) {

      if( weapon != CSW_KNIFE && weapon != CSW_FLASHBANG && !task_exists( TASKID_STRIPNGIVE + id ) )
         set_task( 0.1, "task_stripngive", TASKID_STRIPNGIVE + id );

      return PLUGIN_CONTINUE;
   }

   static ammotype
   ammotype = get_pcvar_num(cvar_ammo)
   
   if(!ammotype || (AMMOWP_NULL & (1<<weapon)))
      return PLUGIN_CONTINUE

   static maxammo
   switch(ammotype)
   {
      case 1: maxammo = g_weapon_ammo[weapon][MAX_AMMO]
      case 2: maxammo = g_weapon_ammo[weapon][MAX_CLIP]
   }

   if(!maxammo)
      return PLUGIN_CONTINUE
   
   switch(ammotype)
   {
      case 1:
      {
         static ammo
         ammo = fm_get_user_bpammo(id, weapon)
         
         if(ammo < 1) 
            fm_set_user_bpammo(id, weapon, maxammo)
      }
      case 2:
      {
         static clip; clip = read_data(3)
         if(clip < 1)
         {
            static weaponname[32]
            get_weaponname(weapon, weaponname, 31)
            
            static ent 
            ent = fm_find_ent_by_owner(-1, weaponname, id)
            
            fm_set_weapon_ammo(ent, maxammo)
         }
      }
   }

   return PLUGIN_CONTINUE
}

public event_armortype(id)
{
   if(!is_user_alive(id) || !g_zombie[id])
      return PLUGIN_CONTINUE
   
   if(fm_get_user_armortype(id) != CS_ARMOR_NONE)
      fm_set_user_armortype(id, CS_ARMOR_NONE)
   
   return PLUGIN_CONTINUE
}

public event_damage(victim)
{
   if(!is_user_alive(victim) || !g_gamestarted)
      return PLUGIN_CONTINUE

   if(!g_zombie[victim])
   {
      static attacker
      attacker = get_user_attacker(victim)
      
      if(!is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
         return PLUGIN_CONTINUE
      
      if(g_victim[attacker] == victim)
      {
         g_infecting = true
         g_victim[attacker] = 0

         message_begin(MSG_ALL, g_msg_deathmsg)
         write_byte(attacker)
         write_byte(victim)
         write_byte(0)
         write_string(g_infection_name)
         message_end()
         
         message_begin(MSG_ALL, g_msg_scoreattrib)
         write_byte(victim)
         write_byte(0)
         message_end()
         
         infect_user(victim, attacker)
         
         static Float:frags, deaths
         pev(attacker, pev_frags, frags)
         deaths = fm_get_user_deaths(victim)
         
         set_pev(attacker, pev_frags, frags  + 1.0)
         fm_set_user_deaths(victim, deaths + 1)
         
         fm_set_user_money(attacker, get_pcvar_num(cvar_infectmoney))
      
         static params[2]
         params[0] = attacker 
         params[1] = victim
   
         set_task(0.3, "task_updatescore", TASKID_UPDATESCR, params, 2)
      }
      g_infecting = false
   }
   return PLUGIN_CONTINUE
}

public fwd_player_prethink(id)
{
   if(!is_user_alive(id) || !g_zombie[id])
      return FMRES_IGNORED
   
   static flags
   flags = pev(id, pev_flags)
   
   if(flags & FL_ONGROUND)
   {
      if(get_pcvar_num(cvar_painshockfree))
      {
         pev(id, pev_velocity, g_vecvel)
         g_brestorevel = true
      }
   }
   else
   {
      static Float:fallvelocity
      pev(id, pev_flFallVelocity, fallvelocity)
      
      g_falling[id] = fallvelocity >= 350.0 ? true : false
   }
      
   if(g_gamestarted)
   {   
      static Float:gametime
      gametime = get_gametime()
      
      static pclass
      pclass = g_player_class[id]

      static Float:health
      pev(id, pev_health, health)
      
      if(health < g_class_data[pclass][DATA_HEALTH] && g_regendelay[id] < gametime)
      {
         set_pev(id, pev_health, health + 1.0)
         g_regendelay[id] = gametime + g_class_data[pclass][DATA_REGENDLY]
      }
   }

   if( get_pcvar_num( cvar_biohazard_icon ) > 0 ) {

      if( is_user_alive( id ) ) {

         if( g_preinfect[ id ] && !g_zombie[ id ] ) set_biohazard_icon( id, 2, 255, 255, 0 );
         else if( g_zombie[ id ] ) set_biohazard_icon( id, 1, 255, 0, 0 );
         else if( !g_zombie[ id ] && !g_preinfect[ id ] ) set_biohazard_icon( id, 1, 125, 178, 255 );
      } else set_biohazard_icon( id, 0, 0, 0 ,0 );
   }

   return FMRES_IGNORED
}

public fwd_player_prethink_post(id)
{
   if(!g_brestorevel)
      return FMRES_IGNORED

   g_brestorevel = false
      
   static flag
   flag = pev(id, pev_flags)
   
   if(!(flag & FL_ONTRAIN))
   {
      static ent
      ent = pev(id, pev_groundentity)
      
      if(pev_valid(ent) && (flag & FL_CONVEYOR))
      {
         static Float:vectemp[3]
         pev(id, pev_basevelocity, vectemp)
         
         xs_vec_add(g_vecvel, vectemp, g_vecvel)
      }
   
      set_pev(id, pev_velocity, g_vecvel)
      return FMRES_HANDLED
   }
   return FMRES_IGNORED
}

public fwd_player_postthink(id)
{ 
   if(!is_user_alive(id))
      return FMRES_IGNORED
   
   if(g_zombie[id] && g_falling[id] && (pev(id, pev_flags) & FL_ONGROUND))
   {   
      set_pev(id, pev_watertype, CONTENTS_WATER)
      g_falling[id] = false
   }
   
   if(get_pcvar_num(cvar_buytime))
   {
      if(pev_valid(g_buyzone) && g_buytime > get_gametime())
         dllfunc(DLLFunc_Touch, g_buyzone, id)
   }

   return FMRES_IGNORED
}

public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch)
{   
   if(channel == CHAN_ITEM && sample[6] == 'n' && sample[7] == 'v' && sample[8] == 'g')
      return FMRES_SUPERCEDE   
   
   if(!is_user_connected(id) || !g_zombie[id])
      return FMRES_IGNORED   

   if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
   {
      if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
      {
         emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
         return FMRES_SUPERCEDE
      }
      else if(sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't' || sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
      {
         if(sample[17] == 'w' && sample[18] == 'a' && sample[19] == 'l')
            emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
         else
            emit_sound(id, channel, g_zombie_hit_sounds[_random(sizeof g_zombie_hit_sounds)], volume, attn, flag, pitch)
         
         return FMRES_SUPERCEDE
      }
   }         
   else if(sample[7] == 'd' && (sample[8] == 'i' && sample[9] == 'e' || sample[12] == '6'))
   {
      emit_sound(id, channel, g_zombie_die_sounds[_random(sizeof g_zombie_die_sounds)], volume, attn, flag, pitch)
      return FMRES_SUPERCEDE
   }
   return FMRES_IGNORED
}

public fwd_cmdstart(id, handle, seed)
{
   if(!is_user_alive(id) || !g_zombie[id])
      return FMRES_IGNORED
   
   static impulse
   impulse = get_uc(handle, UC_Impulse)
   
   if(impulse == IMPULSE_FLASHLIGHT)
   {
      set_uc(handle, UC_Impulse, 0)
      return FMRES_SUPERCEDE
   }
   return FMRES_IGNORED
}

public fwd_spawn(ent)
{
   if(!pev_valid(ent)) 
      return FMRES_IGNORED
   
   static classname[32]
   pev(ent, pev_classname, classname, 31)

   static i
   for(i = 0; i < sizeof g_remove_entities; ++i)
   {
      if(equal(classname, g_remove_entities))
      {
         engfunc(EngFunc_RemoveEntity, ent)
         return FMRES_SUPERCEDE
      }
   }
   return FMRES_IGNORED
}

public fwd_gamedescription() 
{ 
   static gamename[32]
   get_pcvar_string(cvar_gamedescription, gamename, 31)
   
   forward_return(FMV_STRING, gamename)
   
   return FMRES_SUPERCEDE
}  

public fwd_createnamedentity(entclassname)
{
   static classname[10]
   engfunc(EngFunc_SzFromIndex, entclassname, classname, 9)
   
   return (classname[7] == 'c' && classname[8] == '4') ? FMRES_SUPERCEDE : FMRES_IGNORED
}

public fwd_clientkill(id)
{
   if(get_pcvar_num(cvar_punishsuicide) && is_user_alive(id))
      g_suicide[id] = true
}

public fwd_setclientkeyvalue(id, infobuffer, const key[])
{
   if(!equal(key, "model") || !g_blockmodel[id])
      return FMRES_IGNORED
   
   static model[32]
   fm_get_user_model(id, model, 31)
   
   if(equal(model, "gordon"))
      return FMRES_IGNORED
   
   g_blockmodel[id] = false
   
   return FMRES_SUPERCEDE
}

public bacon_touch_weapon(ent, id)
   return (is_user_alive(id) && g_zombie[id]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_tank(ent, caller, activator, use_type, Float:value)
   return (is_user_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_pushable(ent, caller, activator, use_type, Float:value)
   return HAM_SUPERCEDE

public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
   if(!g_gamestarted) 
      return HAM_SUPERCEDE
   
   if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
      return HAM_IGNORED
   
   if(!is_user_connected(attacker) || !g_zombie[victim])
      return HAM_IGNORED
   
   static kbpower
   kbpower = g_weapon_knockback[get_user_weapon(attacker)]
   
   if(kbpower != -1) 
   {
      static flags
      flags = pev(victim, pev_flags)
      
      if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND)))
         return HAM_IGNORED
      
      static Float:origins[2][3]
      pev(victim, pev_origin, origins[0])
      pev(attacker, pev_origin, origins[1])
      
      if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
      {
         static Float:velocity[3]
         pev(victim, pev_velocity, velocity)
         
         static Float:tempvec
         tempvec = velocity[2]   
         
         xs_vec_mul_scalar(direction, damage, direction)
         xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
         xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)
         
         xs_vec_add(direction, velocity, velocity)
         velocity[2] = tempvec
         
         set_pev(victim, pev_velocity, velocity)
         
         return HAM_HANDLED
      }
   }
   return HAM_IGNORED
}

public bacon_touch_grenade(ent, world)
{
   if(!get_pcvar_num(cvar_impactexplode))
      return HAM_IGNORED
   
   static model[12]
   pev(ent, pev_model, model, 11)
   
   if(model[9] == 'h' && model[10] == 'e')
   {
      set_pev(ent, pev_dmgtime, 0.0)
      
      return HAM_HANDLED
   }
   return HAM_IGNORED
}

public bacon_takedamage_player(victim, inflictor, attacker, Float:damage, damagetype)
{
   if(damagetype & DMG_GENERIC || victim == attacker || !is_user_alive(victim) || !is_user_connected(attacker))
      return HAM_IGNORED

   if(!g_gamestarted || (!g_zombie[victim] && !g_zombie[attacker]) || ((damagetype & DMG_HEGRENADE) && g_zombie[attacker]))
      return HAM_SUPERCEDE

   if(g_zombie[attacker])
   {
      if(get_user_weapon(attacker) != CSW_KNIFE)
         return HAM_SUPERCEDE

      damage *= g_class_data[g_player_class[attacker]][DATA_ATTACK]
      
      static Float:armor
      pev(victim, pev_armorvalue, armor)
      
      if(get_pcvar_num(cvar_obeyarmor) && armor > 0.0)
      {
         armor -= damage
         
         if(armor < 0.0) 
            armor = 0.0
         
         set_pev(victim, pev_armorvalue, armor)
         SetHamParamFloat(4, 0.0)
      }
      else
      {
         static bool:infect
         infect = allow_infection()
         
         g_victim[attacker] = infect ? victim : 0
               
         if(!g_infecting)
            SetHamParamFloat(4, infect ? 0.0 : damage)
         else   
            SetHamParamFloat(4, 0.0)
      }
   }
   return HAM_HANDLED
}

public bacon_killed_player(victim, killer, shouldgib)
{
   if(!is_user_alive(killer) || g_zombie[killer] || !g_zombie[victim])
      return HAM_IGNORED

   static killbonus
   killbonus = get_pcvar_num(cvar_killbonus)
   
   if(killbonus)
      set_pev(killer, pev_frags, pev(killer, pev_frags) + float(killbonus))
   
   static killreward
   killreward = get_pcvar_num(cvar_killreward)
   
   if(!killreward) 
      return HAM_IGNORED
   
   static weapon, maxclip, ent, weaponname[32]
   switch(killreward)
   {
      case 1: 
      {
         weapon = get_user_weapon(killer)
         maxclip = g_weapon_ammo[weapon][MAX_CLIP]
         if(maxclip)
         {
            get_weaponname(weapon, weaponname, 31)
            ent = fm_find_ent_by_owner(-1, weaponname, killer)
               
            fm_set_weapon_ammo(ent, maxclip)
         }
      }
      case 2:
      {
         if(!user_has_weapon(killer, CSW_HEGRENADE))
            bacon_give_weapon(killer, "weapon_hegrenade")
         else
            fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
      }
      case 3:
      {
         weapon = get_user_weapon(killer)
         maxclip = g_weapon_ammo[weapon][MAX_CLIP]
         if(maxclip)
         {
            get_weaponname(weapon, weaponname, 31)
            ent = fm_find_ent_by_owner(-1, weaponname, killer)
               
            fm_set_weapon_ammo(ent, maxclip)
         }
            
         if(!user_has_weapon(killer, CSW_HEGRENADE))
            bacon_give_weapon(killer, "weapon_hegrenade")
         else
            fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
      }
   }
   return HAM_IGNORED
}

public bacon_spawn_player_post(id)
{   
   if(!is_user_alive(id))
      return HAM_IGNORED
   
   static team
   team = fm_get_user_team(id)
   
   if(team != CS_TEAM_T && team != CS_TEAM_CT)
      return HAM_IGNORED
   
   if(g_zombie[id])
   {
      if(get_pcvar_num(cvar_respawnaszombie) && !g_roundended)
      {
         set_zombie_attibutes(id)
         
         return HAM_IGNORED
      }
      else
         cure_user(id)
   }
   else if(pev(id, pev_rendermode) == kRenderTransTexture)
      reset_user_model(id)
   
   set_task(0.3, "task_spawned", TASKID_SPAWNDELAY + id)
   set_task(5.0, "task_checkspawn", TASKID_CHECKSPAWN + id)
   
   return HAM_IGNORED
}

public bacon_touch_pushable(ent, id)
{
   static movetype
   pev(id, pev_movetype)
   
   if(movetype == MOVETYPE_NOCLIP || movetype == MOVETYPE_NONE)
      return HAM_IGNORED   
   
   if(is_user_alive(id))
   {
      set_pev(id, pev_movetype, MOVETYPE_WALK)
      
      if(!(pev(id, pev_flags) & FL_ONGROUND))
         return HAM_SUPERCEDE
   }
   
   if(!get_pcvar_num(cvar_shootobjects))
      return HAM_IGNORED
   
   static Float:velocity[2][3]
   pev(ent, pev_velocity, velocity[0])
   
   if(vector_length(velocity[0]) > 0.0)
   {
      pev(id, pev_velocity, velocity[1])
      velocity[1][0] += velocity[0][0]
      velocity[1][1] += velocity[0][1]
      
      set_pev(id, pev_velocity, velocity[1])
   }
   return HAM_SUPERCEDE
}

public bacon_traceattack_pushable(ent, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
   if(!get_pcvar_num(cvar_shootobjects) || !is_user_alive(attacker))
      return HAM_IGNORED
   
   static Float:velocity[3]
   pev(ent, pev_velocity, velocity)
         
   static Float:tempvec
   tempvec = velocity[2]   
         
   xs_vec_mul_scalar(direction, damage, direction)
   xs_vec_mul_scalar(direction, g_zombie[attacker] ? 
   get_pcvar_float(cvar_pushpwr_zombie) : get_pcvar_float(cvar_pushpwr_weapon), direction)
   xs_vec_add(direction, velocity, velocity)
   velocity[2] = tempvec
   
   set_pev(ent, pev_velocity, velocity)
   
   return HAM_HANDLED
}

public bacon_claws_deploy_post( iEntity ) {

   static szOwner;
   szOwner = get_pdata_cbase( iEntity, 41, EXTRAOFFSET_WEAPONS );

   if( g_zombie[ szOwner ] ) {

      set_pev( szOwner, pev_viewmodel2, g_class_wmodel[ g_player_class[ szOwner ] ] );
      set_pev( szOwner, pev_weaponmodel2, "" );
   }
}

public TASK_CountDown(  ) {

   new Players[ 32 ];
   new PlayersNum;
   get_players( Players, PlayersNum, "a" );
   
   if( CountDownDelay > sizeof CountDownSounds + 1 ) {

      CountDownDelay--;

      new Message[ 64 ];
      formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
      
      HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
      set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
   } else if( CountDownDelay > 1 ) {

      CountDownDelay--;

      new Message[ 64 ];
      formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
      
      HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
      emit_sound( 0, CHAN_VOICE, CountDownSounds[ CountDownDelay - 1 ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );

      set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
      
      for( new i = 0 ; i < PlayersNum ; i++ ) {

         if( is_user_connected( Players[ i ] ) ) {

            new color[ 3 ];
            color[ 0 ] = 125;
            color[ 1 ] = 170;
            color[ 2 ] = 255;
            UTIL_ScreenFade( Players[ i ], color, 0.5, 0.5, 110 );

            new shock[ 3 ];
            shock[ 0 ] = 3;
            shock[ 1 ] = 2;
            shock[ 2 ] = 3;
            message_begin( MSG_ONE, get_user_msgid( "ScreenShake" ), _, Players[ i ] );
            write_short( ( 1<<12 ) * shock[ 0 ] );
            write_short( ( 1<<12 ) * shock[ 1 ] );
            write_short( ( 1<<12 ) * shock[ 2 ] );
            message_end(  );
         }
      }   
   } else if( CountDownDelay <= 1 )
      CountDownDelay = 0;
}

public task_spawned(taskid)
{
   static id
   id = taskid - TASKID_SPAWNDELAY
   
   if(is_user_alive(id))
   {
      if( !get_pcvar_num( cvar_weaponsmenu ) ) {

         for( new i = 0; i < sizeof g_grenades; ++i )
            bacon_give_weapon( id, g_grenades[ i ] );
      }

      if(g_welcomemsg[id])
      {
         g_welcomemsg[id] = false
         
         static message[192]
         formatex(message, 191, "%L", id, "WELCOME_TXT")
         replace(message, 191, "#Version#", PLUGIN_VERSION)
         
         ColorChat(id, message)
      }
      
      if(g_suicide[id])
      {
         g_suicide[id] = false
         
         user_silentkill(id)
         remove_task(TASKID_CHECKSPAWN + id)

         ColorChat(id, "%L", id, "SUICIDEPUNISH_TXT")
         
         return
      }
      
      if(get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
         is_user_bot(id) ? bot_weapons(id) : display_equipmenu(id)
      
      if(!g_gamestarted)
         ColorChat(id, "%L %L", id, "SCAN_RESULTS", id, g_preinfect[id] ? "SCAN_INFECTED" : "SCAN_CLEAN")
      else
      {
         static team
         team = fm_get_user_team(id)
         
         if(team == CS_TEAM_T)
            fm_set_user_team(id, CS_TEAM_CT)
      }

      if(get_pcvar_num(cvar_biohazard_icon) > 0) {
         if(g_preinfect[id] && !g_zombie[id])
            set_biohazard_icon(id, 2, 255, 255, 0)
         else if(g_zombie[id])
            set_biohazard_icon(id, 1, 255, 0, 0)
         else if(!g_zombie[id] && !g_preinfect[id])
            set_biohazard_icon(id, 1, 125, 178, 255)
      }
   }
}

public task_checkspawn(taskid)
{
   static id
   id = taskid - TASKID_CHECKSPAWN
   
   if(!is_user_connected(id) || is_user_alive(id) || g_roundended)
      return
   
   static team
   team = fm_get_user_team(id)
   
   if(team == CS_TEAM_T || team == CS_TEAM_CT)
      ExecuteHamB(Ham_CS_RoundRespawn, id)
}
   
public task_showtruehealth()
{
   static id, Float:health, Float:gravity, Float:speed, class
   for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id) && !is_user_bot(id) && g_zombie[id])
   {
      pev( id, pev_health, health );
      pev( id, pev_gravity, gravity );
      pev( id, pev_maxspeed, speed );
      class = g_player_class[id]

      if(g_classcount > 1) {

         set_hudmessage(0, 255, 20, -1.0, 0.8, _, 0.2, 0.2)
         ShowSyncHudMsg(id, g_sync_hpdisplay, "Class: %s - Desc: %s^nHealth: %0.f^n^nSpeed: %0.1f^nGolds: %i", g_class_name[class], g_class_desc[class], health, speed, get_user_golds( id ) );

         set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
      } else {

         set_hudmessage(0, 230, 210, 0.01, 0.9, _, 0.2, 0.2)
         ShowSyncHudMsg(id, g_sync_hpdisplay, "Speed: %0.1f   Gravity: %0.1f", speed, gravity / 0.00125 );

         set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
      }
   }
}

public task_lights()
{
   static light[2]
   get_pcvar_string(cvar_lights, light, 1)
   
   engfunc(EngFunc_LightStyle, 0, light)
}

public task_updatescore(params[])
{
   if(!g_gamestarted) 
      return
   
   static attacker
   attacker = params[0]
   
   static victim
   victim = params[1]
   
   if(!is_user_connected(attacker))
      return

   static frags, deaths, team
   frags  = get_user_frags(attacker)
   deaths = fm_get_user_deaths(attacker)
   team   = get_user_team(attacker)
   
   message_begin(MSG_BROADCAST, g_msg_scoreinfo)
   write_byte(attacker)
   write_short(frags)
   write_short(deaths)
   write_short(0)
   write_short(team)
   message_end()
   
   if(!is_user_connected(victim))
      return
   
   frags  = get_user_frags(victim)
   deaths = fm_get_user_deaths(victim)
   team   = get_user_team(victim)
   
   message_begin(MSG_BROADCAST, g_msg_scoreinfo)
   write_byte(victim)
   write_short(frags)
   write_short(deaths)
   write_short(0)
   write_short(team)
   message_end()
}

public task_weaponsmenu(taskid)
{
   static id
   id = taskid - TASKID_WEAPONSMENU
   
   if(is_user_alive(id) && !g_zombie[id] && g_menufailsafe[id])
      display_equipmenu(id)
}

public task_stripngive(taskid)
{
   static id
   id = taskid - TASKID_STRIPNGIVE
   
   if(is_user_alive(id))
   {
      fm_strip_user_weapons(id)
      fm_reset_user_primary(id)
      bacon_give_weapon(id, "weapon_knife")
      
      set_pev(id, pev_weaponmodel2, "")
      set_pev(id, pev_viewmodel2, g_class_wmodel[g_player_class[id]])
      set_pev(id, pev_maxspeed, g_class_data[g_player_class[id]][DATA_SPEED])
   }
}

public task_newround()
{
   static players[32], num, zombies, i, id
   get_players(players, num, "a")

   if(num > 1)
   {
      for(i = 0; i < num; i++) 
         g_preinfect[players[i]] = false
      
      zombies = clamp(floatround(num * get_pcvar_float(cvar_zombiemulti)), 1, 31)
      
      i = 0
      while(i < zombies)
      {
         id = players[_random(num)]
         if(!g_preinfect[id])
         {
            g_preinfect[id] = true
            i++
         }
      }
   }
   
   if(!get_pcvar_num(cvar_randomspawn) || g_spawncount <= 0) 
      return
   
   static team
   for(i = 0; i < num; i++)
   {
      id = players[i]
      
      team = fm_get_user_team(id)
      if(team != CS_TEAM_T && team != CS_TEAM_CT || pev(id, pev_iuser1))
         continue
      
      static spawn_index
      spawn_index = _random(g_spawncount)
   
      static Float:spawndata[3]
      spawndata[0] = g_spawns[spawn_index][0]
      spawndata[1] = g_spawns[spawn_index][1]
      spawndata[2] = g_spawns[spawn_index][2]
      
      if(!fm_is_hull_vacant(spawndata, HULL_HUMAN))
      {
         static i
         for(i = spawn_index + 1; i != spawn_index; i++)
         {
            if(i >= g_spawncount) i = 0

            spawndata[0] = g_spawns[i][0]
            spawndata[1] = g_spawns[i][1]
            spawndata[2] = g_spawns[i][2]

            if(fm_is_hull_vacant(spawndata, HULL_HUMAN))
            {
               spawn_index = i
               break
            }
         }
      }

      spawndata[0] = g_spawns[spawn_index][0]
      spawndata[1] = g_spawns[spawn_index][1]
      spawndata[2] = g_spawns[spawn_index][2]
      engfunc(EngFunc_SetOrigin, id, spawndata)

      spawndata[0] = g_spawns[spawn_index][3]
      spawndata[1] = g_spawns[spawn_index][4]
      spawndata[2] = g_spawns[spawn_index][5]
      set_pev(id, pev_angles, spawndata)

      spawndata[0] = g_spawns[spawn_index][6]
      spawndata[1] = g_spawns[spawn_index][7]
      spawndata[2] = g_spawns[spawn_index][8]
      set_pev(id, pev_v_angle, spawndata)

      set_pev(id, pev_fixangle, 1)
   }
}

public task_initround()
{
   static zombiecount, newzombie
   zombiecount = 0
   newzombie = 0

   static players[32], num, i, id
   get_players(players, num, "a")

   for(i = 0; i < num; i++) if(g_preinfect[players[i]])
   {
      newzombie = players[i]
      zombiecount++
   }
   
   if(zombiecount > 1) 
      newzombie = 0
   else if(zombiecount < 1) 
      newzombie = players[_random(num)]
   
   for(i = 0; i < num; i++)
   {
      id = players[i]
      if(id == newzombie || g_preinfect[id])
         infect_user(id, 0)
      else
      {
         fm_set_user_team(id, CS_TEAM_CT, 0)
         add_delay(id, "update_team")
      }
   }
   
   set_hudmessage(_, _, _, _, _, 1)
   if(newzombie)
   {
      static name[32]
      get_user_name(newzombie, name, 31)
      
      ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD", name)
      ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT", name)
   }
   else
   {
      ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD2")
      ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT2")
   }
   
   set_task(0.51, "task_startround", TASKID_STARTROUND)

   if( get_pcvar_num( cvar_zombie_appear_sound ) == 2 )
      PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

public task_startround()
{
   g_gamestarted = true
   ExecuteForward(g_fwd_gamestart, g_fwd_result)
}

public task_balanceteam()
{
   static players[3][32], count[3]
   get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
   
   count[CS_TEAM_T] = 0
   count[CS_TEAM_CT] = 0
   
   static i, id, team
   for(i = 0; i < count[CS_TEAM_UNASSIGNED]; i++)
   {
      id = players[CS_TEAM_UNASSIGNED][i] 
      team = fm_get_user_team(id)
      
      if(team == CS_TEAM_T || team == CS_TEAM_CT)
         players[team][count[team]++] = id
   }

   if(abs(count[CS_TEAM_T] - count[CS_TEAM_CT]) <= 1) 
      return

   static maxplayers
   maxplayers = (count[CS_TEAM_T] + count[CS_TEAM_CT]) / 2
   
   if(count[CS_TEAM_T] > maxplayers)
   {
      for(i = 0; i < (count[CS_TEAM_T] - maxplayers); i++)
         fm_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT, 0)
   }
   else
   {
      for(i = 0; i < (count[CS_TEAM_CT] - maxplayers); i++)
         fm_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T, 0)
   }
}

public task_botclient_pdata(id) 
{
   if(g_botclient_pdata || !is_user_connected(id))
      return
   
   if(get_pcvar_num(cvar_botquota) && is_user_bot(id))
   {
      RegisterHamFromEntity(Ham_TakeDamage, id, "bacon_takedamage_player")
      RegisterHamFromEntity(Ham_Killed, id, "bacon_killed_player")
      RegisterHamFromEntity(Ham_TraceAttack, id, "bacon_traceattack_player")
      RegisterHamFromEntity(Ham_Spawn, id, "bacon_spawn_player_post", 1)
      
      g_botclient_pdata = 1
   }
}

public bot_weapons(id)
{
   g_player_weapons[id][0] = _random(sizeof g_primaryweapons)
   g_player_weapons[id][1] = _random(sizeof g_secondaryweapons)
   
   equipweapon(id, EQUIP_ALL)
}

public update_team(id)
{
   if(!is_user_connected(id))
      return
   
   static team
   team = fm_get_user_team(id)
   
   if(team == CS_TEAM_T || team == CS_TEAM_CT)
   {
      emessage_begin(MSG_ALL, g_msg_teaminfo)
      ewrite_byte(id)
      ewrite_string(g_teaminfo[team])
      emessage_end()
   }
}

public infect_user(victim, attacker)
{
   if(!is_user_alive(victim))
      return

   message_begin(MSG_ONE, g_msg_screenfade, _, victim)
   write_short(1<<10)
   write_short(1<<10)
   write_short(0)
   write_byte((g_mutate[victim] != -1) ? 255 : 100)
   write_byte(100)
   write_byte(100)
   write_byte(250)
   message_end()

   message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenShake" ), _, victim )
   write_short( ( 1<<12 ) * 4 ) // amplitude
   write_short( ( 1<<12 ) * 2 ) // duration
   write_short( ( 1<<12 ) * 10 ) // frequency
   message_end(  )
      
   message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "Damage" ), _, victim )
   write_byte( 0 ) // damage save
   write_byte( 0 ) // damage take
   write_long( DMG_NERVEGAS ) // damage type - DMG_RADIATION
   write_coord( 0 ) // x
   write_coord( 0 ) // y
   write_coord( 0 ) // z
   message_end(  )

   // Get player's origin
   new Origin[ 3 ]
   get_user_origin( victim, Origin )
      
   message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
   write_byte( TE_IMPLOSION ) // TE id
   write_coord( Origin[ 0 ] ) // x
   write_coord( Origin[ 1 ] ) // y
   write_coord( Origin[ 2 ] ) // z
   write_byte( 128 ) // radius
   write_byte( 20 ) // count
   write_byte( 3 ) // duration
   message_end(  )
      
   message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
   write_byte( TE_DLIGHT ) // TE id
   write_coord( Origin[ 0 ] ) // x
   write_coord( Origin[ 1 ] ) // y
   write_coord( Origin[ 2 ] ) // z
   write_byte( 20 ) // radius
   write_byte( 0 ) // r
   write_byte( 150 ) // g
   write_byte( 0 ) // b
   write_byte( 2 ) // life
   write_byte( 0 ) // decay rate
   message_end(  )

#if defined ULTRA_BLOOD
   static origin[3];
   get_user_origin(victim, origin)

   message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
   write_byte(TE_PARTICLEBURST)
   write_coord(origin[0])
   write_coord(origin[1])
   write_coord(origin[2])
   write_short(50)
   write_byte(70)
   write_byte(3)
   message_end()
#endif
   
   if(g_mutate[victim] != -1)
   {
      g_player_class[victim] = g_mutate[victim]
      g_mutate[victim] = -1
      
      set_hudmessage(_, _, _, _, _, 1)
      ShowSyncHudMsg(victim, g_sync_msgdisplay, "%L", victim, "MUTATION_HUD", g_class_name[g_player_class[victim]])
   }
   
   fm_set_user_team(victim, CS_TEAM_T)
   set_zombie_attibutes(victim)
   
   emit_sound(victim, CHAN_STATIC, g_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
   ExecuteForward(g_fwd_infect, g_fwd_result, victim, attacker)
}

public cure_user(id)
{
   if(!is_user_alive(id)) 
      return

   g_zombie[id] = false
   g_falling[id] = false

   g_showmenu[id] = true;

   reset_user_model(id)
   fm_set_user_nvg(id, 0)
   set_pev(id, pev_gravity, 1.0)
   
   if( fm_get_user_team( id ) != CS_TEAM_CT ) { // need to change team?

      fm_set_user_team( id, CS_TEAM_CT );
      fm_user_team_update( id );
   }

   static viewmodel[64]
   pev(id, pev_viewmodel2, viewmodel, 63)
   
   if(equal(viewmodel, g_class_wmodel[g_player_class[id]]))
   {
      static weapon 
      weapon = fm_lastknife(id)

      if(pev_valid(weapon))
         ExecuteHam(Ham_Item_Deploy, weapon)
   }

   if(get_pcvar_num(cvar_weaponsmenu))
   {
      static id, team
      for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
      {
         team = fm_get_user_team(id)
         if(team == CS_TEAM_T || team == CS_TEAM_CT)
         {
            if(is_user_bot(id)) 
               bot_weapons(id)
            else 
            {
               if(g_showmenu[id])
               {
                  add_delay(id, "display_equipmenu")
                  
                  g_menufailsafe[id] = true
                  set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
               }
               else   
                  equipweapon(id, EQUIP_ALL)
            }
         }
      }
   }
}

public display_equipmenu(id)
{
   static menubody[512], len
     len = formatex(menubody, 511, "\r%L^n^n", id, "MENU_TITLE1")
   
   static bool:hasweap
   hasweap = ((g_player_weapons[id][0]) != -1 && (g_player_weapons[id][1] != -1)) ? true : false
   
   len += formatex(menubody[len], 511 - len,"\r1.\w %L^n", id, "MENU_NEWWEAPONS")
   len += formatex(menubody[len], 511 - len,"%s2.\w %L^n", hasweap ? "\r" : "\d", id, "MENU_PREVSETUP")
   len += formatex(menubody[len], 511 - len,"%s3.\w %L^n^n", hasweap ? "\r" : "\d", id, "MENU_DONTSHOW")
   len += formatex(menubody[len], 511 - len,"\r5.\w %L^n", id, "MENU_EXIT")
   
   static keys
   keys = (MENU_KEY_1|MENU_KEY_5)
   
   if(hasweap) 
      keys |= (MENU_KEY_2|MENU_KEY_3)
   
   show_menu(id, keys, menubody, -1, "Equipment")
}

public action_equip(id, key)
{
   if(!is_user_alive(id) || g_zombie[id])
      return PLUGIN_HANDLED
   
   switch(key)
   {
      case 0: display_weaponmenu(id, MENU_PRIMARY, g_menuposition[id] = 0)
      case 1: equipweapon(id, EQUIP_ALL)
      case 2:
      {
         g_showmenu[id] = false
         equipweapon(id, EQUIP_ALL)
         ColorChat(id, "%L", id, "MENU_CMDENABLE")
      }
   }
   
   if(key > 0)
   {
      g_menufailsafe[id] = false
      remove_task(TASKID_WEAPONSMENU + id)
   }
   return PLUGIN_HANDLED
}


public display_weaponmenu(id, menuid, pos)
{
   if(pos < 0 || menuid < 0)
      return
   
   static start
   start = pos * 8
   
   static maxitem
   maxitem = menuid == MENU_PRIMARY ? sizeof g_primaryweapons : sizeof g_secondaryweapons

     if(start >= maxitem)
          start = pos = g_menuposition[id]
   
   static menubody[512], len
     len = formatex(menubody, 511, "\r%L\w^n^n", id, menuid == MENU_PRIMARY ? "MENU_TITLE2" : "MENU_TITLE3")

   static end
   end = start + 8
   if(end > maxitem)
          end = maxitem
   
   static keys
   keys = MENU_KEY_0
   
   static a, b
   b = 0
   
     for(a = start; a < end; ++a) 
   {
      keys |= (1<<b)
      len += formatex(menubody[len], 511 - len,"\r%d.\w %s^n", ++b, menuid == MENU_PRIMARY ? g_primaryweapons[a][0]: g_secondaryweapons[a][0])
     }

     if(end != maxitem)
   {
          formatex(menubody[len], 511 - len, "^n\r9.\w %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
          keys |= MENU_KEY_9
     }
     else   
      formatex(menubody[len], 511 - len, "^n\r0.\w %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
   
     show_menu(id, keys, menubody, -1, menuid == MENU_PRIMARY ? "Primary" : "Secondary")
}

public action_prim(id, key)
{
   if(!is_user_alive(id) || g_zombie[id])
      return PLUGIN_HANDLED

   switch(key)
   {
          case 8: display_weaponmenu(id, MENU_PRIMARY, ++g_menuposition[id])
      case 9: display_weaponmenu(id, MENU_PRIMARY, --g_menuposition[id])
          default:
      {
         g_player_weapons[id][0] = g_menuposition[id] * 8 + key
         equipweapon(id, EQUIP_PRI)
         
         display_weaponmenu(id, MENU_SECONDARY, g_menuposition[id] = 0)
      }
   }
   return PLUGIN_HANDLED
}

public action_sec(id, key)
{
   if(!is_user_alive(id) || g_zombie[id])
      return PLUGIN_HANDLED
   
   switch(key) 
   {
          case 8: display_weaponmenu(id, MENU_SECONDARY, ++g_menuposition[id])
      case 9: display_weaponmenu(id, MENU_SECONDARY, --g_menuposition[id])
          default:
      {
         g_menufailsafe[id] = false
         remove_task(TASKID_WEAPONSMENU + id)
         
         g_player_weapons[id][1] = g_menuposition[id] * 8 + key
         equipweapon(id, EQUIP_SEC)
         equipweapon(id, EQUIP_GREN)
      }
   }
   return PLUGIN_HANDLED
}

public ClassCmd( id, szMenu, szItem ) {

   if( szItem == MENU_EXIT ) {

      menu_destroy( szMenu );
      return PLUGIN_HANDLED;
   }

   new szData[ 6 ], szName[ 64 ];
   new iAccess, iCallBack;

   menu_item_getinfo( szMenu, szItem, iAccess, szData, 5, szName, 63, iCallBack );
   new iKey = str_to_num( szData );

   if( g_class_data[ iKey ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) ) {

      ColorChat( id, "%L", id, "MENU_CLASSONLYVIP", g_class_name[ iKey ] );
      cmd_classmenu( id );
   }

   else {

      g_mutate[ id ] = iKey;
      ColorChat( id, "%L", id, "MENU_CHANGECLASS", g_class_name[ g_mutate[ id ] ] );
   }

   menu_destroy( szMenu );
   return PLUGIN_HANDLED;
}

public register_spawnpoints(const mapname[])
{
   new configdir[32]
   get_configsdir(configdir, 31)
   
   new csdmfile[64], line[64], data[10][6]
   formatex(csdmfile, 63, "%s/csdm/%s.spawns.cfg", configdir, mapname)

   if(file_exists(csdmfile))
   {
      new file
      file = fopen(csdmfile, "rt")
      
      while(file && !feof(file))
      {
         fgets(file, line, 63)
         if(!line[0] || str_count(line,' ') < 2) 
            continue

         parse(line, data[0], 5, data[1], 5, data[2], 5, data[3], 5, data[4], 5, data[5], 5, data[6], 5, data[7], 5, data[8], 5, data[9], 5)

         g_spawns[g_spawncount][0] = floatstr(data[0]), g_spawns[g_spawncount][1] = floatstr(data[1])
         g_spawns[g_spawncount][2] = floatstr(data[2]), g_spawns[g_spawncount][3] = floatstr(data[3])
         g_spawns[g_spawncount][4] = floatstr(data[4]), g_spawns[g_spawncount][5] = floatstr(data[5])
         g_spawns[g_spawncount][6] = floatstr(data[7]), g_spawns[g_spawncount][7] = floatstr(data[8])
         g_spawns[g_spawncount][8] = floatstr(data[9])
         
         if(++g_spawncount >= MAX_SPAWNS) 
            break
      }
      if(file) 
         fclose(file)
   }
}

public register_zombieclasses(filename[])
{
   new configdir[32]
   get_configsdir(configdir, 31)
   
   new configfile[64]
   formatex(configfile, 63, "%s/%s", configdir, filename)

   if(get_pcvar_num(cvar_zombie_class) && file_exists(configfile))
   {         
      new line[128], leftstr[32], rightstr[64],  classname[32], data[MAX_DATA], i
      
      new file
      file = fopen(configfile, "rt")
      
      while(file && !feof(file))
      {
         fgets(file, line, 127), trim(line)
         if(!line[0] || line[0] == ';') continue
         
         if(line[0] == '[' && line[strlen(line) - 1] == ']')
         {
            copy(classname, strlen(line) - 2, line[1])

            if(register_class(classname) == -1)
               break
            
            continue
         }
         strtok(line, leftstr, 31, rightstr, 63, '=', 1)
            
         if(equali(leftstr, "DESC"))
            copy(g_class_desc[g_classcount - 1], 31, rightstr)
         else if(equali(leftstr, "PMODEL"))
            copy(g_class_pmodel[g_classcount - 1], 63, rightstr)
         else if(equali(leftstr, "WMODEL"))
            copy(g_class_wmodel[g_classcount - 1], 63, rightstr)
            
         for(i = 0; i < MAX_DATA; i++)
            data[i] = equali(leftstr, g_dataname[i])
            
         for(i = 0; i < MAX_DATA; i++) if(data[i])
         {
            g_class_data[g_classcount - 1][i] = floatstr(rightstr)
            break
         }
      }
      if(file) fclose(file)
   } 
   else 
      register_class("default")
}

public register_class(classname[])
{
   if(g_classcount >= MAX_CLASSES)
      return -1
   
   copy(g_class_name[g_classcount], 31, classname)
   copy(g_class_pmodel[g_classcount], 63, DEFAULT_PMODEL)
   copy(g_class_wmodel[g_classcount], 63, DEFAULT_WMODEL)
      
   g_class_data[g_classcount][DATA_HEALTH] = DEFAULT_HEALTH
   g_class_data[g_classcount][DATA_SPEED] = DEFAULT_SPEED   
   g_class_data[g_classcount][DATA_GRAVITY] = DEFAULT_GRAVITY
   g_class_data[g_classcount][DATA_ATTACK] = DEFAULT_ATTACK
   g_class_data[g_classcount][DATA_REGENDLY] = DEFAULT_REGENDLY
   g_class_data[g_classcount][DATA_KNOCKBACK] = DEFAULT_KNOCKBACK
   g_class_data[g_classcount][DATA_NOFLASH] = DEFAULT_NOFLASH
   g_class_data[g_classcount][DATA_ONLYVIP] = DEFAULT_ONLYVIP
   g_classcount++
   
   return (g_classcount - 1)
}

public native_register_class(classname[], description[])
{
   param_convert(1)
   param_convert(2)
   
   static classid
   classid = register_class(classname)
   
   if(classid != -1)
      copy(g_class_desc[classid], 31, description)

   return classid
}

public native_set_class_pmodel(classid, player_model[])
{
   param_convert(2)
   copy(g_class_pmodel[classid], 63, player_model)
}

public native_set_class_wmodel(classid, weapon_model[])
{
   param_convert(2)
   copy(g_class_wmodel[classid], 63, weapon_model) 
}

public native_is_user_zombie(index)
   return g_zombie[index] == true ? 1 : 0

public native_get_user_class(index)
   return g_player_class[index]

public native_is_user_infected(index)
   return g_preinfect[index] == true ? 1 : 0

public native_game_started()
   return g_gamestarted

public native_preinfect_user(index, bool:yesno)
{
   if(is_user_alive(index) && !g_gamestarted)
      g_preinfect[index] = yesno
}

public native_infect_user(victim, attacker)
{
   if(allow_infection() && g_gamestarted)
      infect_user(victim, attacker)
}

public native_cure_user(index)
   cure_user(index)

public native_get_class_id(classname[])
{
   param_convert(1)
   
   static i
   for(i = 0; i < g_classcount; i++)
   {
      if(equali(classname, g_class_name[i]))
         return i
   }
   return -1
}

public Float:native_get_class_data(classid, dataid)
   return g_class_data[classid][dataid]

public native_set_class_data(classid, dataid, Float:value)
   g_class_data[classid][dataid] = value

public native_get_humans(  ) {

   static iHumans;
   iHumans = 0

   static id;
   for( id = 1; id <= get_maxplayers(  ); id++ ) {
      if( is_user_alive( id ) && !g_zombie[ id ] ) 
         iHumans++;
   }

   return iHumans;
}

public native_get_zombies(  ) {

   static iZombies;
   iZombies = 0

   static id;
   for( id = 1; id <= get_maxplayers(  ); id++ ) {
      if( is_user_alive( id ) && g_zombie[ id ] ) 
         iZombies++;
   }

   return iZombies;
}

stock bool:fm_is_hull_vacant(const Float:origin[3], hull)
{
   static tr
   tr = 0
   
   engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, tr)
   return (!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen)) ? true : false
}

stock fm_set_kvd(entity, const key[], const value[], const classname[] = "") 
{
   set_kvd(0, KV_ClassName, classname)
   set_kvd(0, KV_KeyName, key)
   set_kvd(0, KV_Value, value)
   set_kvd(0, KV_fHandled, 0)

   return dllfunc(DLLFunc_KeyValue, entity, 0)
}

stock fm_strip_user_weapons(index) 
{
   static stripent
   if(!pev_valid(stripent))
   {
      stripent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
      dllfunc(DLLFunc_Spawn, stripent), set_pev(stripent, pev_solid, SOLID_NOT)
   }
   dllfunc(DLLFunc_Use, stripent, index)
   
   return 1
}

stock fm_set_entity_visibility(index, visible = 1)
   set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)

stock fm_find_ent_by_owner(index, const classname[], owner) 
{
   static ent
   ent = index
   
   while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) && pev(ent, pev_owner) != owner) {}
   
   return ent
}

stock bacon_give_weapon(index, weapon[])
{
   if(!equal(weapon,"weapon_", 7))
      return 0

   static ent
   ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon))
   
   if(!pev_valid(ent)) 
      return 0
    
   set_pev(ent, pev_spawnflags, SF_NORESPAWN)
   dllfunc(DLLFunc_Spawn, ent)
   
   if(!ExecuteHamB(Ham_AddPlayerItem, index, ent))
   {
      if(pev_valid(ent)) set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
      return 0
   }
   ExecuteHamB(Ham_Item_AttachToPlayer, ent, index)

   return 1
}

stock bacon_strip_weapon(index, weapon[])
{
   if(!equal(weapon, "weapon_", 7)) 
      return 0

   static weaponid 
   weaponid = get_weaponid(weapon)
   
   if(!weaponid) 
      return 0

   static weaponent
   weaponent = fm_find_ent_by_owner(-1, weapon, index)
   
   if(!weaponent) 
      return 0

   if(get_user_weapon(index) == weaponid) 
      ExecuteHamB(Ham_Weapon_RetireWeapon, weaponent)

   if(!ExecuteHamB(Ham_RemovePlayerItem, index, weaponent)) 
      return 0
   
   ExecuteHamB(Ham_Item_Kill, weaponent)
   set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<weaponid))

   return 1
}

stock fm_set_user_team( index, team, update = 1 ) {

   set_pdata_int( index, OFFSET_TEAM, team );

   if( update ) {

      emessage_begin( MSG_ALL, g_msg_teaminfo );
      ewrite_byte( index );
      ewrite_string( g_teaminfo[ team ] );
      emessage_end(  );
   }
   return 1;
}

stock fm_get_user_bpammo(index, weapon)
{
   static offset
   switch(weapon)
   {
      case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
      case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
      case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
      case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
      case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
      case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
      case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
      case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
      case CSW_P228: offset = OFFSET_AMMO_357SIG
      case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
      default: offset = 0
   }
   return offset ? get_pdata_int(index, offset) : 0
}

stock fm_set_user_bpammo(index, weapon, amount)
{
   static offset
   switch(weapon)
   {
      case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
      case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
      case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
      case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
      case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
      case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
      case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
      case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
      case CSW_P228: offset = OFFSET_AMMO_357SIG
      case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
      default: offset = 0
   }
   
   if(offset) 
      set_pdata_int(index, offset, amount)
   
   return 1
}

stock fm_set_user_rendering( iEntity, fx = kRenderFxNone, Red = 255, Green = 255, Blue = 255, iRender = kRenderNormal, Amount = 16 ) {

   new Float:RenderColor[ 3 ];
   RenderColor[ 0 ] = float( Red );
   RenderColor[ 1 ] = float( Green );
   RenderColor[ 2 ] = float( Blue );

   set_pev( iEntity, pev_renderfx, fx );
   set_pev( iEntity, pev_rendercolor, RenderColor );
   set_pev( iEntity, pev_rendermode, iRender );
   set_pev( iEntity, pev_renderamt, float( Amount ) );

   return 1;
}

stock fm_set_user_nvg(index, onoff = 1)
{
   static nvg
   nvg = get_pdata_int(index, OFFSET_NVG)
   
   set_pdata_int(index, OFFSET_NVG, onoff == 1 ? nvg | HAS_NVG : nvg & ~HAS_NVG)
   return 1
}

stock fm_set_user_money(index, addmoney, update = 1)
{
   static money
   money = fm_get_user_money(index) + addmoney
   
   set_pdata_int(index, OFFSET_CSMONEY, money)
   
   if(update)
   {
      message_begin(MSG_ONE, g_msg_money, _, index)
      write_long(clamp(money, 0, 16000))
      write_byte(1)
      message_end()
   }
   return 1
}

stock fm_user_team_update(id)
{
   static Float:current_time
   current_time = get_gametime()
   
   if (current_time - g_teams_targettime >= 0.1)
   {
      set_task(0.1, "fm_cs_set_user_team_msg", id+1212)
      g_teams_targettime = current_time + 0.1
   }
   else
   {
      set_task((g_teams_targettime + 0.1) - current_time, "fm_cs_set_user_team_msg", id+1212)
      g_teams_targettime = g_teams_targettime + 0.1
   }
}

public fm_cs_set_user_team_msg(taskid)
{
   // Note to self: this next message can now be received by other plugins
   
   // Set the switching team flag
   g_switchingteam = true
   
   // Tell everyone my new team
   emessage_begin(MSG_ALL, g_msg_teaminfo )
   ewrite_byte(taskid - 1212) // player
   ewrite_string(CS_TEAM_NAMES[fm_get_user_team(taskid - 1212)]) // team
   emessage_end()
   
   // Done switching team
   g_switchingteam = false
}

stock str_count(str[], searchchar)
{
   static maxlen
   maxlen = strlen(str)
   
   static i, count
   count = 0
   
   for(i = 0; i <= maxlen; i++) if(str[i] == searchchar)
      count++

   return count
}

stock reset_user_model(index)
{
   set_pev(index, pev_rendermode, kRenderNormal)
   set_pev(index, pev_renderamt, 0.0)

   if(pev_valid(g_modelent[index]))
      fm_set_entity_visibility(g_modelent[index], 0)
}

stock remove_user_model(ent)
{
   static id
   id = pev(ent, pev_owner)
   
   if(pev_valid(ent)) 
      engfunc(EngFunc_RemoveEntity, ent)

   g_modelent[id] = 0
}

stock set_zombie_attibutes(index)
{
   if(!is_user_alive(index)) 
      return

   g_zombie[index] = true

   if(!task_exists(TASKID_STRIPNGIVE + index))
      set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + index)

   static Float:health
   health = g_class_data[g_player_class[index]][DATA_HEALTH]
   
   if(g_preinfect[index]) 
      health *= get_pcvar_float(cvar_zombie_hpmulti)
   
   set_pev(index, pev_health, health)
   set_pev(index, pev_gravity, g_class_data[g_player_class[index]][DATA_GRAVITY])
   set_pev(index, pev_body, 0)
   set_pev(index, pev_armorvalue, 0.0)
   set_pev(index, pev_renderamt, 0.0)
   set_pev(index, pev_rendermode, kRenderTransTexture)
   
   fm_set_user_armortype(index, CS_ARMOR_NONE)
   fm_set_user_nvg(index)
   
   if(get_pcvar_num(cvar_autonvg)) 
      engclient_cmd(index, "nightvision")
   
   if(!pev_valid(g_modelent[index]))
   {
      static ent
      ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
      if(pev_valid(ent))
      {
         engfunc(EngFunc_SetModel, ent, g_class_pmodel[g_player_class[index]])
         set_pev(ent, pev_classname, MODEL_CLASSNAME)
         set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
         set_pev(ent, pev_aiment, index)
         set_pev(ent, pev_owner, index)
            
         g_modelent[index] = ent
      }
   }
   else
   {
      engfunc(EngFunc_SetModel, g_modelent[index], g_class_pmodel[g_player_class[index]])
      fm_set_entity_visibility(g_modelent[index], 1)
   }

   static effects
   effects = pev(index, pev_effects)
   
   if(effects & EF_DIMLIGHT)
   {
      message_begin(MSG_ONE, g_msg_flashlight, _, index)
      write_byte(0)
      write_byte(100)
      message_end()
      
      set_pev(index, pev_effects, effects & ~EF_DIMLIGHT)
   }

   if( get_pcvar_num( cvar_zombie_appear_sound ) == 1 )
      PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

PlaySound( const szSound[  ] ) {

   client_cmd( 0, "spk ^"%s^"", szSound );
}

stock bool:allow_infection()
{
   static count[2]
   count[0] = 0
   count[1] = 0
   
   static index, maxzombies
   for(index = 1; index <= g_maxplayers; index++)
   {
      if(is_user_connected(index) && g_zombie[index]) 
         count[0]++
      else if(is_user_alive(index)) 
         count[1]++
   }
   
   maxzombies = clamp(get_pcvar_num(cvar_maxzombies), 1, 31)
   return (count[0] < maxzombies && count[1] > 1) ? true : false
}

stock randomly_pick_zombie()
{
   static data[4]
   data[0] = 0 
   data[1] = 0 
   data[2] = 0 
   data[3] = 0
   
   static index, players[2][32]
   for(index = 1; index <= g_maxplayers; index++)
   {
      if(!is_user_alive(index)) 
         continue
      
      if(g_zombie[index])
      {
         data[0]++
         players[0][data[2]++] = index
      }
      else 
      {
         data[1]++
         players[1][data[3]++] = index
      }
   }

   if(data[0] > 0 &&  data[1] < 1) 
      return players[0][_random(data[2])]
   
   return (data[0] < 1 && data[1] > 0) ?  players[1][_random(data[3])] : 0
}

stock equipweapon(id, weapon)
{
   if(!is_user_alive(id)) 
      return

   static weaponid[2], weaponent, weapname[32]
   
   if(weapon & EQUIP_PRI)
   {
      weaponent = fm_lastprimary(id)
      weaponid[1] = get_weaponid(g_primaryweapons[g_player_weapons[id][0]][1])
      
      if(pev_valid(weaponent))
      {
         weaponid[0] = fm_get_weapon_id(weaponent)
         if(weaponid[0] != weaponid[1])
         {
            get_weaponname(weaponid[0], weapname, 31)
            bacon_strip_weapon(id, weapname)
         }
      }
      else
         weaponid[0] = -1
      
      if(weaponid[0] != weaponid[1])
         bacon_give_weapon(id, g_primaryweapons[g_player_weapons[id][0]][1])
      
      fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
   }

   if(weapon & EQUIP_SEC)
   {
      weaponent = fm_lastsecondry(id)
      weaponid[1] = get_weaponid(g_secondaryweapons[g_player_weapons[id][1]][1])
      
      if(pev_valid(weaponent))
      {
         weaponid[0] = fm_get_weapon_id(weaponent)
         if(weaponid[0] != weaponid[1])
         {
            get_weaponname(weaponid[0], weapname, 31)
            bacon_strip_weapon(id, weapname)
         }
      }
      else
         weaponid[0] = -1
      
      if(weaponid[0] != weaponid[1])
         bacon_give_weapon(id, g_secondaryweapons[g_player_weapons[id][1]][1])
      
      fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
   }
   
   if(weapon & EQUIP_GREN)
   {
      static i
      for(i = 0; i < sizeof g_grenades; i++) if(!user_has_weapon(id, get_weaponid(g_grenades[i])))
         bacon_give_weapon(id, g_grenades[i])
   }
}

stock add_delay(index, const task[])
{
   switch(index)
   {
      case 1..8:   set_task(0.1, task, index)
      case 9..16:  set_task(0.2, task, index)
      case 17..24: set_task(0.3, task, index)
      case 25..32: set_task(0.4, task, index)
   }
}

stock set_biohazard_icon(id, mode, red, green, blue) {

   message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, id);
   write_byte(mode); // status (0=hide, 1=show, 2=flash)
   write_string("dmg_bio"); // sprite name
   write_byte(red); // red
   write_byte(green); // green
   write_byte(blue); // blue
   message_end();
}

stock FixedUnsigned16(Float:flValue, iScale) {
   new iOutput;
   
   iOutput = floatround(flValue * iScale);
   if(iOutput < 0)
      iOutput = 0;
   
   if(iOutput > 0xFFFF)
      iOutput = 0xFFFF;
   return iOutput;
}

stock UTIL_ScreenFade(id=0,iColor[3],Float:flFxTime=-1.0,Float:flHoldTime=0.0,iAlpha=0,iFlags=FFADE_IN,bool:bReliable=false,bool:bExternal=false) {
   if(id && !is_user_connected(id))
      return;
   
   new iFadeTime;
   if(flFxTime == -1.0) {
      iFadeTime = 4;
   }
   else {
      iFadeTime = FixedUnsigned16(flFxTime , 1<<12);
   }
   
   static gmsgScreenFade;
   if(!gmsgScreenFade) {
      gmsgScreenFade = get_user_msgid("ScreenFade");
   }
   
   new MSG_DEST;
   if(bReliable) {
      MSG_DEST = id ? MSG_ONE : MSG_ALL;
   }
   else {
      MSG_DEST = id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST;
   }
   
   if(bExternal) {
      emessage_begin(MSG_DEST, gmsgScreenFade, _, id);
      ewrite_short(iFadeTime);
      ewrite_short(FixedUnsigned16(flHoldTime , 1<<12));
      ewrite_short(iFlags);
      ewrite_byte(iColor[0]);
      ewrite_byte(iColor[1]);
      ewrite_byte(iColor[2]);
      ewrite_byte(iAlpha);
      emessage_end();
   }
   else {
      message_begin(MSG_DEST, gmsgScreenFade, _, id);
      write_short(iFadeTime);
      write_short(FixedUnsigned16(flHoldTime , 1<<12));
      write_short(iFlags);
      write_byte(iColor[0]);
      write_byte(iColor[1]);
      write_byte(iColor[2]);
      write_byte(iAlpha);
      message_end();
   }
}

#if defined GRENADE_STATUS
public GrenadeStatus(  ) {

   // Nade Status Cvar
   cvar_status = register_cvar("bio_nadestatus_icon","1") // [0=Hide | 1=Show | 2=Flash (Don't work with red color)]
   
   // Fire Grenade Cvars
   cvar_fire_icon = register_cvar("bio_firenade_icon","1") // [0=Disable | 1=Enable]
   cvar_fire_color = register_cvar("bio_firenade_color","255 0 0") // Color of Fire Nade in RGB
   
   // Frost Grenade Cvars
   cvar_frost_icon = register_cvar("bio_frostnade_icon","1") // [0=Disable | 1=Enable]
   cvar_frost_color = register_cvar("bio_frostnade_color","100 149 237") // Color of Frost Nade in RGB
   
   // Flare Grenade Cvars
   cvar_flare_icon = register_cvar("bio_flarenade_icon","1") // [0=Disable | 1=Enable]
   cvar_flare_color = register_cvar("bio_flarenade_color","255 255 255") // Color of Flare Nade in RGB

   register_event("CurWeapon", "GrenadeIcon", "be", "1=1")
   
   g_StatusIcon = get_user_msgid("StatusIcon")
}

public GrenadeIcon( id ) {

   RemoveGrenadeIcon( id );
      
   if( is_user_bot( id ) )
      return 1;
      
   static NadeType, GrenadeSprite[ 16 ], Color[ 17 ], Red[ 5 ], Green[ 5 ], Blue[ 5 ];
   NadeType = get_user_weapon( id )
   
   switch( NadeType ) {

      case CSW_HEGRENADE: {

         if( !g_zombie[ id ] ) {

            if( !get_pcvar_num( cvar_fire_icon ) )
               return 1;
            
            GrenadeSprite = "dmg_heat";
            get_pcvar_string( cvar_fire_color, Color, charsmax( Color ) );
            
         }
      }

      case CSW_FLASHBANG: {

         if( !get_pcvar_num( cvar_frost_icon ) )
            return 1;
         
         GrenadeSprite = "dmg_cold";
         get_pcvar_string( cvar_frost_color, Color, charsmax( Color ) );
      }

      case CSW_SMOKEGRENADE: {

         if( !get_pcvar_num( cvar_flare_icon ) )
            return 1;
         
         GrenadeSprite = "dmg_shock";
         get_pcvar_string( cvar_flare_color, Color, charsmax( Color ) );
      }

      default: return 1;
   }

   parse( Color, Red, charsmax( Red ), Green, charsmax( Green ), Blue, charsmax( Blue ) );
   g_GrenadeIcon[ id ] = GrenadeSprite;
   
   message_begin( MSG_ONE, g_StatusIcon, {0, 0, 0 }, id );
   write_byte( get_pcvar_num( cvar_status ) ) // Status [0=Hide, 1=Show, 2=Flash]
   write_string( g_GrenadeIcon[ id ] ) // Sprite Name
   write_byte( str_to_num( Red ) ) // Red
   write_byte( str_to_num( Green ) ) // Green
   write_byte( str_to_num( Blue ) ) // Blue
   message_end(  );

   return 1;
}

public RemoveGrenadeIcon( id ) {

   message_begin( MSG_ONE, g_StatusIcon, { 0, 0, 0 },id );
   write_byte( 0 ); // Status [0=Hide, 1=Show, 2=Flash]
   write_string( g_GrenadeIcon[ id ] );
   message_end(  )
}
#endif

stock HudMessage(const id, const message[], red = 0, green = 160, blue = 0, Float:x = -1.0, Float:y = 0.65, effects = 2, Float:fxtime = 0.01, Float:holdtime = 3.0, Float:fadeintime = 0.01, Float:fadeouttime = 0.01) {
   new count = 1, players[32];
   
   if(id) players[0] = id;
   else get_players(players, count, "ch"); {
      for(new i = 0; i < count; i++) {
         if(is_user_connected(players[i])) {   
            new color = pack_color(clamp_byte(red), clamp_byte(green), clamp_byte(blue))
            
            message_begin(MSG_ONE_UNRELIABLE, SVC_DIRECTOR, _, players[i]);
            write_byte(strlen(message) + 31);
            write_byte(DRC_CMD_MESSAGE);
            write_byte(effects);
            write_long(color);
            write_long(_:x);
            write_long(_:y);
            write_long(_:fadeintime);
            write_long(_:fadeouttime);
            write_long(_:holdtime);
            write_long(_:fxtime);
            write_string(message);
            message_end();
         }
      }
   }
}

stock ColorChat( const id, const input[  ], any:... ) {

   new iCount = 1, szPlayers[ 32 ];
   static szMsg[ 191 ];

   vformat( szMsg, 190, input, 3 );

   replace_all( szMsg, 190, "!4", "^4" );
   replace_all( szMsg, 190, "!1", "^1" );
   replace_all( szMsg, 190, "!3", "^3" );

   if( id ) {
      szPlayers[ 0 ] = id;
   } else {
      get_players( szPlayers, iCount, "ch" );
   }

   for( new i = 0; i < iCount; i++ ) {

      if( is_user_connected( szPlayers[ i ] ) ) {

         message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, szPlayers[ i ] );
         write_byte( szPlayers[ i ] );
         write_string( szMsg );
         message_end(  );
      }
   }
}
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

30 Jul 2014, 01:07

L-am sters si l-am pus pe al meu, dupa care l-am facut amxx si l-am adaugat in plugins.
Tot asa face...
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

30 Jul 2014, 01:09

cum sa faca tot asa cand tu ai pus ip'ul tau :)) ,totusi posteaza ce ai pus tu(pluginul,foloseste
| Afiseaza codul
) + erorile din consola.
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

30 Jul 2014, 01:26

Deci mi-am luat ip-ul de pe un site

Image

Dupa care am intrat in biohazard.sma si in locul ip-ului de acolo l-am adaugat pe al meu.
| Afiseaza codul
[code]/* Biohazard - Zombie Mod, Classic Infection with new modes
 * Author: cheap_suit, CO-Author: The YONTU
 * Credits: sDs|Aragon* */

#define PLUGIN_NAME	"Biohazard - Zombie Mod"
#define PLUGIN_VERSION	"3.1"
#define PLUGIN_AUTHOR	"cheap_suit"

#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >
#include < xs >

native get_user_golds( id );
native is_user_vip( id );

static const ServerLicensedIp[  ] = "84.117.38.30";

// Aici eliminati/adaugati slash-urile(//) din fata linii daca vreti sa fie activate/dezactivate
#define ULTRA_BLOOD	// Sare mai mult sange cand infectezi
#define GRENADE_STATUS	// Cand tii o grenada in mana in stanga sus va aparea o imagine specifica grenadei

#define FOG_ENABLE  	     1
#define FOG_DENSITY	    "0.0025"
#define FOG_COLOR   	    "128 128 128"	//"127 170 255"

#define DEFAULT_PMODEL	    "models/player/bio30_zombie/bio30_zombie.mdl"	// Zombie Model
#define DEFAULT_WMODEL	    "models/player/bio30_zombie/claws_zombie.mdl"	// Zombie Hands

#define DEFAULT_HEALTH		400.0	// Health value
#define DEFAULT_SPEED		290.0	// Speed value
#define DEFAULT_GRAVITY		0.8	// Gravity multiplier
#define DEFAULT_ATTACK		2.0	// Zombie damage multiplier
#define DEFAULT_REGENDLY	0.18	// Regeneration delay value
#define DEFAULT_KNOCKBACK	1.0	// Knockback multiplier
#define DEFAULT_NOFLASH	1.0	// Set 1.0 for Zombie No flash
#define DEFAULT_ONLYVIP		0.0	// Set 1.0 for Zombie Class Only VIP

#define clamp_byte(%1)		( clamp( %1, 0, 255 ) )
#define pack_color(%1,%2,%3)	( %3 + ( %2 << 8 ) + ( %1 << 16 ) )

#define FFADE_IN			0x0000	// Just here so we don't pass 0 into the function
#define FFADE_OUT		0x0001	// Fade out (not in)
#define FFADE_MODULATE		0x0002	// Modulate (don't blend)
#define FFADE_STAYOUT		0x0004	// ignores the duration, stays faded out until new ScreenFade message received
#define UNIT_SECOND		(1<<12)

#define OFFSET_DEATH 		444
#define OFFSET_TEAM 		114
#define OFFSET_ARMOR 		112
#define OFFSET_NVG 		129
#define OFFSET_CSMONEY 		115
#define OFFSET_PRIMARYWEAPON 	116
#define OFFSET_WEAPONTYPE 	43
#define OFFSET_CLIPAMMO		51
#define EXTRAOFFSET_WEAPONS 	4

#define OFFSET_AMMO_338MAGNUM 	377
#define OFFSET_AMMO_762NATO 		378
#define OFFSET_AMMO_556NATOBOX 	379
#define OFFSET_AMMO_556NATO 		380
#define OFFSET_AMMO_BUCKSHOT 		381
#define OFFSET_AMMO_45ACP 		382
#define OFFSET_AMMO_57MM 		383
#define OFFSET_AMMO_50AE 		384
#define OFFSET_AMMO_357SIG 		385
#define OFFSET_AMMO_9MM 		386

#define OFFSET_LASTPRIM 	368
#define OFFSET_LASTSEC 		369
#define OFFSET_LASTKNI 		370

#define TASKID_COUNTDOWN		452
#define TASKID_STRIPNGIVE		698
#define TASKID_NEWROUND		641
#define TASKID_INITROUND 		222
#define TASKID_STARTROUND 		153
#define TASKID_BALANCETEAM 		375
#define TASKID_UPDATESCR 		264
#define TASKID_SPAWNDELAY 		786
#define TASKID_WEAPONSMENU 		564
#define TASKID_CHECKSPAWN 		423
#define TASKID_CZBOTPDATA 		312
#define TASK_GLOW_DIE			1212

#define EQUIP_PRI 	(1<<0)
#define EQUIP_SEC 	(1<<1)
#define EQUIP_GREN 	(1<<2)
#define EQUIP_ALL 	(1<<0 | 1<<1 | 1<<2)

#define HAS_NVG 	(1<<0)
#define ATTRIB_BOMB 	(1<<1)
#define DMG_HEGRENADE 	(1<<24)

#define MODEL_CLASSNAME 	"player_model"
#define IMPULSE_FLASHLIGHT 	100

#define MAX_SPAWNS 	128
#define MAX_CLASSES 	14
#define MAX_DATA 	13

#define DATA_HEALTH 	0
#define DATA_SPEED 	1
#define DATA_GRAVITY 	2
#define DATA_ATTACK 	3
#define DATA_REGENDLY 	4
#define DATA_KNOCKBACK 	5
#define DATA_NOFLASH 	6
#define DATA_ONLYVIP 	7

#define fm_get_user_team(%1) get_pdata_int(%1, OFFSET_TEAM)
#define fm_get_user_deaths(%1) get_pdata_int(%1, OFFSET_DEATH)
#define fm_set_user_deaths(%1,%2) set_pdata_int(%1, OFFSET_DEATH, %2)
#define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CSMONEY)
#define fm_get_user_armortype(%1) get_pdata_int(%1, OFFSET_ARMOR)
#define fm_set_user_armortype(%1,%2) set_pdata_int(%1, OFFSET_ARMOR, %2)
#define fm_get_weapon_id(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define fm_get_weapon_ammo(%1) get_pdata_int(%1, OFFSET_CLIPAMMO, EXTRAOFFSET_WEAPONS)
#define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
#define fm_reset_user_primary(%1) set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
#define fm_lastprimary(%1) get_pdata_cbase(id, OFFSET_LASTPRIM)
#define fm_lastsecondry(%1) get_pdata_cbase(id, OFFSET_LASTSEC)
#define fm_lastknife(%1) get_pdata_cbase(id, OFFSET_LASTKNI)
#define fm_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), "model", %2, %3) 

#define _random(%1) random_num(0, %1 - 1)
#define AMMOWP_NULL (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

enum
{
	MAX_CLIP = 0,
	MAX_AMMO
}

enum
{
	MENU_PRIMARY = 1,
	MENU_SECONDARY
}

enum
{
	CS_TEAM_UNASSIGNED = 0,
	CS_TEAM_T,
	CS_TEAM_CT,
	CS_TEAM_SPECTATOR
}

enum
{
	CS_ARMOR_NONE = 0,
	CS_ARMOR_KEVLAR,
	CS_ARMOR_VESTHELM
}

enum
{
	KBPOWER_357SIG = 0,
	KBPOWER_762NATO,
	KBPOWER_BUCKSHOT,
	KBPOWER_45ACP,
	KBPOWER_556NATO,
	KBPOWER_9MM,
	KBPOWER_57MM,
	KBPOWER_338MAGNUM,
	KBPOWER_556NATOBOX,
	KBPOWER_50AE
}

new g_zombie_weapname[] = "melee"
new g_infection_name[]  = "infection"

// primary weapons (menu|game)
new g_primaryweapons[][][] = 
{ 
	{ "M4A1 Carbine",     "weapon_m4a1"    },
	{ "AK-47 Kalashnikov",     "weapon_ak47"    },
	{ "Steyr AUG A1",      "weapon_aug"     },
	{ "SG-552 Commando",    "weapon_sg552"   },
	//{ "Galil",    "weapon_galil"   },
	{ "Famas",    "weapon_famas"   },
	{ "MP5 Navy", "weapon_mp5navy" },
	{ "XM1014 M4",   "weapon_xm1014"  },
	{ "M3 Super 90",       "weapon_m3"      },
	//{ "P90",      "weapon_p90"     },
	{ "M249 Para Machinegun",     "weapon_m249"    },
	{ "SG-550 Auto-Sniper",    "weapon_sg550"   },
	{ "G3SG1 Auto-Sniper",    "weapon_g3sg1"   },
	{ "AWP Magnum Sniper",    "weapon_awp"   }	
}

// secondary weapons (menu|game)
new g_secondaryweapons[][][] = 
{ 
	{ "Desert Eagle .50 AE",   "weapon_deagle"  },
	{ "USP .45 ACP Tactical",      "weapon_usp"     },
	{ "Dual Elite Berettas",    "weapon_elite"   },
	{ "Glock 18C",    "weapon_glock18"   }
}

// grenade loadout (game)
new g_grenades[][] = 
{ 
	"weapon_hegrenade",
	"weapon_flashbang",
	"weapon_smokegrenade"
}

new Float:g_knockbackpower[] =
{
	3.0,  // KBPOWER_357SIG
	4.0,  // KBPOWER_762NATO
	9.5,  // KBPOWER_BUCKSHOT
	3.0,  // KBPOWER_45ACP
	4.5,  // KBPOWER_556NATO
	3.0,  // KBPOWER_9MM
	3.5,  // KBPOWER_57MM
	12.0, // KBPOWER_338MAGNUM
	4.0,  // KBPOWER_556NATOBOX
	3.8   // KBPOWER_50AE
}

new g_appear_sounds[  ][  ] = {

	"Biohazard30/zombie_coming_1.wav",
	"Biohazard30/zombie_coming_2.wav",
	"Biohazard30/zombie_coming_3.wav",
	"Biohazard30/zombie_comeback.wav"
}

new g_survivor_win_sounds[][] =
{
	"Biohazard30/survivor_win1.wav",
	"Biohazard30/survivor_win2.wav",
	"Biohazard30/survivor_win3.wav"
}

new g_zombie_win_sounds[][] = 
{ 
	"Biohazard30/zombie_win1.wav",
	"Biohazard30/zombie_win2.wav",
	"Biohazard30/zombie_win3.wav"	
}

new g_scream_sounds[][] = 
{ 
	"Biohazard30/zombie_infec1.wav",
	"Biohazard30/zombie_infec2.wav",
	"Biohazard30/zombie_infec3.wav"
}

new g_zombie_miss_sounds[][] = 
{ 
	"zombie/claw_miss1.wav",
	"zombie/claw_miss2.wav"				
}

new g_zombie_hit_sounds[][] = 
{ 
	"zombie/claw_strike1.wav",
	"zombie/claw_strike2.wav",
	"zombie/claw_strike3.wav"
}

new g_zombie_die_sounds[][] = 
{
	"Biohazard30/zombie_die1.wav",
	"Biohazard30/zombie_die2.wav",
	"Biohazard30/zombie_die3.wav",
	"Biohazard30/zombie_die4.wav",
	"Biohazard30/zombie_die5.wav"
}

new CountDownSounds[][] = {

	"Biohazard30/Countdown/timer01.wav",
	"Biohazard30/Countdown/timer02.wav",
	"Biohazard30/Countdown/timer03.wav",
	"Biohazard30/Countdown/timer04.wav",
	"Biohazard30/Countdown/timer05.wav",
	"Biohazard30/Countdown/timer06.wav",
	"Biohazard30/Countdown/timer07.wav",
	"Biohazard30/Countdown/timer08.wav",
	"Biohazard30/Countdown/timer09.wav",
	"Biohazard30/Countdown/timer10.wav"
}

new const g_weapon_ammo[  ][  ] = {

	{ -1, -1 },	// NULL
	{ 13, 52 },	// CSW_P228
	{ -1, -1 },	// NULL
	{ 15, 75 },	// CSW_SCOUT
	{ -1, -1 },	// CSW_HEGRENADE
	{ 15, 30 },	// CSW_XM1014
	{ -1, -1 },	// CSW_C4
	{ 35, 140 },	// CSW_MAC10
	{ 40, 120 },	// CSW_AUG
	{ -1, -1 },	// CSW_SMOKEGRENADE
	{ 30, 150 },	// CSW_ELITE
	{ 20, 100 },	// CSW_FIVESEVEN
	{ 25, 100 },	// CSW_UMP45
	{ 40, 80 },	// CSW_SG550
	{ 40, 160 },	// CSW_GALIL
	{ 30, 120 },	// CSW_FAMAS
	{ 20, 160 },	// CSW_USP
	{ 20, 120 },	// CSW_GLOCK18
	{ 3, 30 },	// CSW_AWP
	{ 40, 120 },	// CSW_MP5NAVY
	{ 100, 200 },	// CSW_M249
	{ 13, 39 },	// CSW_M3
	{ 45, 90 },	// CSW_M4A1
	{ 30, 120 },	// CSW_TMP
	{ 20, 60 },	// CSW_G3SG1
	{ -1, -1 },	// CSW_FLASHBANG
	{ 15, 45 },	// CSW_DEAGLE
	{ 25, 125 },	// CSW_SG552
	{ 40, 120 },	// CSW_AK47
	{ -1, -1 },	// CSW_KNIFE
	{ 50, 130 }	// CSW_P90
}

new const g_weapon_knockback[] =
{
	-1, 
	KBPOWER_357SIG, 
	-1, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_BUCKSHOT, 
	-1, 
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	-1, 
	KBPOWER_9MM, 
	KBPOWER_57MM,
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_45ACP,
	KBPOWER_9MM, 
	KBPOWER_338MAGNUM,
	KBPOWER_9MM, 
	KBPOWER_556NATOBOX,
	KBPOWER_BUCKSHOT, 
	KBPOWER_556NATO, 
	KBPOWER_9MM, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_50AE, 
	KBPOWER_556NATO, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_57MM
}

new const CS_TEAM_NAMES[  ][  ] = {

	  "UNASSIGNED"
	, "TERRORIST"
	, "CT"
	, "SPECTATOR"
}

new const g_remove_entities[][] = 
{ 
	"func_bomb_target",    
	"info_bomb_target", 
	"hostage_entity",      
	"monster_scientist", 
	"func_hostage_rescue", 
	"info_hostage_rescue",
	"info_vip_start",      
	"func_vip_safetyzone", 
	"func_escapezone",     
	"func_buyzone"
}

new const g_dataname[][] = 
{ 
	"HEALTH", 
	"SPEED", 
	"GRAVITY", 
	"ATTACK", 
	"REGENDLY", 
	"KNOCKBACK",
	"NOFLASH",
	"ONLYVIP"
}

new const g_teaminfo[][] = 
{ 
	"UNASSIGNED", 
	"TERRORIST",
	"CT",
	"SPECTATOR" 
}

new SkyTermination[  ][  ] = {

	"bk",
	"dn",
	"ft",
	"lf",
	"rt",
	"up"
}

// Global Vars
new CountDownDelay;
new g_maxplayers;
new g_spawncount;
new g_buyzone;
new g_botclient_pdata;
new g_menuposition[33];
new g_player_weapons[33][2];

// Sync HUD
new g_sync_hpdisplay;
new g_sync_msgdisplay;

// Forwards
new g_fwd_spawn;
new g_fwd_result;
new g_fwd_infect;
new g_fwd_gamestart; 

// Messages
new g_msg_flashlight;
new g_msg_teaminfo;
new g_msg_scoreattrib;
new g_msg_money;
new g_msg_scoreinfo;
new g_msg_deathmsg;
new g_msg_screenfade;

new Float:g_buytime;
new Float:g_spawns[MAX_SPAWNS+1][9];
new Float:g_vecvel[3];
new Float:g_teams_targettime;
new g_switchingteam;

// Global Booleans without parametres
new bool:g_brestorevel;
new bool:g_infecting;
new bool:g_gamestarted;
new bool:g_roundstarted;
new bool:g_roundended;
new bool:g_czero;

// Global Booleans with parametres
new bool:g_disconnected[33];	// Is user Disconnected
new bool:g_blockmodel[33];	// Block Model ?
new bool:g_showmenu[33];	// Show menu ?
new bool:g_menufailsafe[33];	// Show menu fail ?
new bool:g_welcomemsg[33];	// Display welcom msg ?
new bool:g_suicide[33];	// Is user suicided ?

// Zombie Classes & Zombie Configuration
new bool:g_zombie[33];	// Is user Zombie ?
new bool:g_falling[33];	// Is user Touch floor ?
new bool:g_preinfect[33];	// Is user preinfect ?
new g_classcount;
new g_class_name[MAX_CLASSES+1][32];
new g_class_desc[MAX_CLASSES+1][32];
new g_class_pmodel[MAX_CLASSES+1][64];
new g_class_wmodel[MAX_CLASSES+1][64];
new Float:g_class_data[MAX_CLASSES+1][MAX_DATA];
new g_player_class[33];
new Float:g_regendelay[33];
//new Float:g_hitdelay[33];
new g_mutate[33];
new g_victim[33];
new g_modelent[33];

// Cvars
new cvar_randomspawn;
new cvar_skyname;
new cvar_autoteambalance[4];
new cvar_starttime;
new cvar_countdown;
new cvar_autonvg;
new cvar_winsounds;
new cvar_weaponsmenu;
new cvar_lights;
new cvar_killbonus;
new cvar_enabled;
new cvar_gamedescription;
new cvar_botquota;
new cvar_maxzombies;
new cvar_flashbang;
new cvar_buytime;
new cvar_respawnaszombie;
new cvar_punishsuicide;
new cvar_infectmoney;
new cvar_showtruehealth;
new cvar_obeyarmor;
new cvar_impactexplode;
new cvar_caphealthdisplay;
new cvar_zombie_hpmulti;
new cvar_randomclass;
new cvar_zombiemulti;
new cvar_ammo;
new cvar_killreward;
new cvar_painshockfree;
new cvar_zombie_class;
// Knock back system
new cvar_shootobjects;
new cvar_pushpwr_weapon;
new cvar_pushpwr_zombie;
new cvar_knockback_duck;
new cvar_knockback;
new cvar_knockback_dist;
new cvar_biohazard_icon;
new cvar_entrie_class_vip;
new cvar_zombie_appear_sound;

#if defined GRENADE_STATUS
// Cvars
new cvar_status;
new cvar_fire_icon;
new cvar_fire_color;
new cvar_frost_icon;
new cvar_frost_color;
new cvar_flare_icon;
new cvar_flare_color;
// Vars
new g_StatusIcon;
new g_GrenadeIcon[ 33 ][ 32 ];
#endif

public plugin_precache()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );
		register_cvar( "bh_version", PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER );
		set_cvar_string( "bh_version", PLUGIN_VERSION );
	
		cvar_enabled = register_cvar("bh_enabled", "1")

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_gamedescription = register_cvar("bh_gamedescription", "Biohazard v3.1b")
		cvar_skyname = register_cvar("bh_skyname", "siv2")
		cvar_lights = register_cvar("bh_lights", "d")
		cvar_starttime = register_cvar("bh_starttime", "15.0")
		cvar_countdown = register_cvar("bh_countdown", "1")
		cvar_buytime = register_cvar("bh_buytime", "0")
		cvar_randomspawn = register_cvar("bh_randomspawn", "1")
		cvar_punishsuicide = register_cvar("bh_punishsuicide", "1")
		cvar_winsounds = register_cvar("bh_winsounds", "1")
		cvar_autonvg = register_cvar("bh_autonvg", "1")
		cvar_respawnaszombie = register_cvar("bh_respawnaszombie", "1")
		cvar_painshockfree = register_cvar("bh_painshockfree", "1")
		cvar_knockback = register_cvar("bh_knockback", "1")
		cvar_knockback_duck = register_cvar("bh_knockback_duck", "1")
		cvar_knockback_dist = register_cvar("bh_knockback_dist", "280.0")
		cvar_obeyarmor = register_cvar("bh_obeyarmor", "0")
		cvar_infectmoney = register_cvar("bh_infectionmoney", "1000")
		cvar_biohazard_icon = register_cvar("bh_biohazard_icon", "1")
		cvar_caphealthdisplay = register_cvar("bh_caphealthdisplay", "1")
		cvar_weaponsmenu = register_cvar("bh_weaponsmenu", "1")
		cvar_ammo = register_cvar("bh_ammo", "1")
		cvar_maxzombies = register_cvar("bh_maxzombies", "31")
		cvar_flashbang = register_cvar("bh_flashbang", "1")
		cvar_impactexplode = register_cvar("bh_impactexplode", "1")
		cvar_showtruehealth = register_cvar("bh_showtruehealth", "1")
		cvar_zombiemulti = register_cvar("bh_zombie_countmulti", "0.15")
		cvar_zombie_hpmulti = register_cvar("bh_zombie_hpmulti", "10000.0")
		cvar_zombie_class = register_cvar("bh_zombie_class", "1")
		cvar_randomclass = register_cvar("bh_randomclass", "1")
		cvar_killbonus = register_cvar("bh_kill_bonus", "1")
		cvar_killreward = register_cvar("bh_kill_reward", "2")
		cvar_shootobjects = register_cvar("bh_shootobjects", "1")
		cvar_pushpwr_weapon = register_cvar("bh_pushpwr_weapon", "2.0")
		cvar_pushpwr_zombie = register_cvar("bh_pushpwr_zombie", "5.0")
		cvar_entrie_class_vip = register_cvar("bh_entrie_class_only_vip", "0")
		cvar_zombie_appear_sound = register_cvar( "bh_zombie_appear_sound", "2" );
	
		new file[64]
		get_configsdir(file, 63)
		format(file, 63, "%s/bh_cvars.cfg", file)
	
		if(file_exists(file)) 
			server_cmd( "exec %s", file)
	
		new mapname[32]
		get_mapname(mapname, 31)
		register_spawnpoints(mapname)
		
		register_zombieclasses("bh_zombieclass.ini")
		register_dictionary("biohazard.txt")
	
		precache_model(DEFAULT_PMODEL)
		precache_model(DEFAULT_WMODEL)
	
		new i
		for(i = 0; i < g_classcount; i++)
		{
			precache_model(g_class_pmodel)
			precache_model(g_class_wmodel)
		}

		for( i = 0; i < sizeof g_appear_sounds; i++ )
			precache_sound( g_appear_sounds[ i ] );
	
		for(i = 0; i < sizeof g_zombie_miss_sounds; i++)
			precache_sound(g_zombie_miss_sounds)
	
		for(i = 0; i < sizeof g_zombie_hit_sounds; i++) 
			precache_sound(g_zombie_hit_sounds)
	
		for(i = 0; i < sizeof g_scream_sounds; i++) 
			precache_sound(g_scream_sounds)
	
		for(i = 0; i < sizeof g_zombie_die_sounds; i++)
			precache_sound(g_zombie_die_sounds)
	
		for(i = 0; i < sizeof g_zombie_win_sounds; i++) 
			precache_sound(g_zombie_win_sounds)

		for(i = 0; i < sizeof CountDownSounds; i++)
			precache_sound(CountDownSounds)

		for(i = 0; i < sizeof g_survivor_win_sounds; i++)
			precache_sound(g_survivor_win_sounds)

		// Sky Changer
		new SkyName[ 32 ];
		get_pcvar_string( cvar_skyname, SkyName, 31 );
	
		if( strlen( SkyName ) > 0 )
			set_cvar_string( "sv_skyname", SkyName );

		for( i = 0; i < sizeof SkyTermination; ++i ) {

			new Sky[ 64 ];
			formatex( Sky, sizeof( Sky ) - 1, "gfx/env/%s%s.tga", SkyName, SkyTermination[ i ] );
			precache_generic( Sky );
		}
	
		g_fwd_spawn = register_forward(FM_Spawn, "fwd_spawn")
	
		g_buyzone = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"))
		if(g_buyzone) 
		{
			dllfunc(DLLFunc_Spawn, g_buyzone)
			set_pev(g_buyzone, pev_solid, SOLID_NOT)
		}
	
		new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_bomb_target"))
		if(ent) 
		{
			dllfunc(DLLFunc_Spawn, ent)
			set_pev(ent, pev_solid, SOLID_NOT)
		}

		#if FOG_ENABLE
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
		if(ent)
		{
			fm_set_kvd(ent, "density", FOG_DENSITY, "env_fog")
			fm_set_kvd(ent, "rendercolor", FOG_COLOR, "env_fog")
		}
		#endif
	}
}

public plugin_init()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_botquota = get_cvar_pointer("bot_quota")
		cvar_autoteambalance[0] = get_cvar_pointer("mp_autoteambalance")
		cvar_autoteambalance[1] = get_pcvar_num(cvar_autoteambalance[0])
		set_pcvar_num(cvar_autoteambalance[0], 0)

		register_clcmd("jointeam", "cmd_jointeam")
		register_clcmd("say /class", "cmd_classmenu")
		register_clcmd("say_team /class", "cmd_classmenu")
		register_clcmd("say /guns", "cmd_enablemenu")
		register_clcmd("say_team /guns", "cmd_enablemenu")
		register_clcmd("say /help", "cmd_helpmotd")
		register_clcmd("amx_infect", "cmd_infectuser", ADMIN_BAN, "<name or #userid>")
	
		register_menu("Equipment", 1023, "action_equip")
		register_menu("Primary", 1023, "action_prim")
		register_menu("Secondary", 1023, "action_sec")
	
		unregister_forward(FM_Spawn, g_fwd_spawn)
		register_forward(FM_CmdStart, "fwd_cmdstart")
		register_forward(FM_EmitSound, "fwd_emitsound")
		register_forward(FM_GetGameDescription, "fwd_gamedescription")
		register_forward(FM_CreateNamedEntity, "fwd_createnamedentity")
		register_forward(FM_ClientKill, "fwd_clientkill")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink_post", 1)
		register_forward(FM_PlayerPostThink, "fwd_player_postthink")
		register_forward(FM_SetClientKeyValue, "fwd_setclientkeyvalue")

		RegisterHam(Ham_TakeDamage, "player", "bacon_takedamage_player")
		RegisterHam(Ham_Killed, "player", "bacon_killed_player")
		RegisterHam(Ham_Spawn, "player", "bacon_spawn_player_post", 1)
		RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
		RegisterHam(Ham_TraceAttack, "func_pushable", "bacon_traceattack_pushable")
		RegisterHam(Ham_Use, "func_tank", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankmortar", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankrocket", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tanklaser", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_pushable", "bacon_use_pushable")
		RegisterHam(Ham_Touch, "func_pushable", "bacon_touch_pushable")
		RegisterHam(Ham_Touch, "weaponbox", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "armoury_entity", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "weapon_shield", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "grenade", "bacon_touch_grenade")
		RegisterHam(Ham_Item_Deploy , "weapon_knife", "bacon_claws_deploy_post", 1);

		register_message(get_user_msgid("Health"), "msg_health")
		register_message(get_user_msgid("TextMsg"), "msg_textmsg")
		register_message(get_user_msgid("SendAudio"), "msg_sendaudio")
		register_message(get_user_msgid("StatusIcon"), "msg_statusicon")
		register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
		register_message(get_user_msgid("DeathMsg"), "msg_deathmsg")
		register_message(get_user_msgid("ScreenFade"), "msg_screenfade")
		register_message(get_user_msgid("TeamInfo"), "msg_teaminfo")
		register_message(get_user_msgid("ClCorpse"), "msg_clcorpse")
		register_message(get_user_msgid("WeapPickup"), "msg_weaponpickup")
		register_message(get_user_msgid("AmmoPickup"), "msg_ammopickup")

		register_event("TextMsg", "event_textmsg", "a", "2=#Game_will_restart_in")
		register_event("HLTV", "event_newround", "a", "1=0", "2=0")
		register_event("CurWeapon", "event_curweapon", "be", "1=1")
		register_event("ArmorType", "event_armortype", "be")
		register_event("Damage", "event_damage", "be")
	
		register_logevent("logevent_round_start", 2, "1=Round_Start")
		register_logevent("logevent_round_end", 2, "1=Round_End")
	
		g_msg_flashlight = get_user_msgid("Flashlight")
		g_msg_teaminfo = get_user_msgid("TeamInfo")
		g_msg_scoreattrib = get_user_msgid("ScoreAttrib")
		g_msg_scoreinfo = get_user_msgid("ScoreInfo")
		g_msg_deathmsg = get_user_msgid("DeathMsg")
		g_msg_money = get_user_msgid("Money")
		g_msg_screenfade = get_user_msgid("ScreenFade")
	
		g_fwd_infect = CreateMultiForward("event_infect", ET_IGNORE, FP_CELL, FP_CELL)
		g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_IGNORE)

		g_sync_hpdisplay = CreateHudSyncObj()
		g_sync_msgdisplay = CreateHudSyncObj()
	
		g_maxplayers = get_maxplayers()
	
		new mod[3]
		get_modname(mod, 2)
		g_czero = (mod[0] == 'c' && mod[1] == 'z') ? true : false
	
		// Lights Map
		new lights[2]
		get_pcvar_string(cvar_lights, lights, 1)
	
		if(strlen(lights) > 0)
		{
			set_task(3.0, "task_lights", _, _, _, "b")
		
			set_cvar_num("sv_skycolor_r", 0)
			set_cvar_num("sv_skycolor_g", 0)
			set_cvar_num("sv_skycolor_b", 0)
		}
	
		// Show Details
		if(get_pcvar_num(cvar_showtruehealth))
			set_task(0.1, "task_showtruehealth", _, _, _, "b")

#if defined GRENADE_STATUS
		GrenadeStatus(  );
#endif

		server_print( "[Biohazard 3.1] Felicitari! Detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
	} else {

		server_print( "[Biohazard 3.1] Nu detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
		server_print( "[Biohazard 3.1] Pentru mai multe detalii contacteaza-ma la Y!M: [email protected] !" );

		pause( "ade" );
	}
}

public plugin_end()
	if(get_pcvar_num(cvar_enabled))
		set_pcvar_num(cvar_autoteambalance[0], cvar_autoteambalance[1])

public plugin_natives()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_library("biohazardf")
		register_native("preinfect_user", "native_preinfect_user", 1)
		register_native("infect_user", "native_infect_user", 1)
		register_native("cure_user", "native_cure_user", 1)
		register_native("register_class", "native_register_class", 1)
		register_native("get_class_id", "native_get_class_id", 1)
		register_native("set_class_pmodel", "native_set_class_pmodel", 1)
		register_native("set_class_wmodel", "native_set_class_wmodel", 1)
		register_native("set_class_data", "native_set_class_data", 1)
		register_native("get_class_data", "native_get_class_data", 1)
		register_native("game_started", "native_game_started", 1)
		register_native("is_user_zombie", "native_is_user_zombie", 1)
		register_native("is_user_infected", "native_is_user_infected", 1)
		register_native("get_user_class", "native_get_user_class",  1)
		register_native("get_humans", "native_get_humans", 1)
		register_native("get_zombies", "native_get_zombies", 1)
	}
}

public client_connect(id)
{
	g_showmenu[id] = true
	g_welcomemsg[id] = true
	g_blockmodel[id] = true
	g_zombie[id] = false
	g_preinfect[id] = false
	g_disconnected[id] = false
	g_falling[id] = false
	g_menufailsafe[id] = false
	g_victim[id] = 0
	g_mutate[id] = -1
	g_player_class[id] = 0
	g_player_weapons[id][0] = -1
	g_player_weapons[id][1] = -1
	g_regendelay[id] = 0.0

	remove_user_model(g_modelent[id])
}

public client_putinserver(id)
{
	if(!g_botclient_pdata && g_czero) 
	{
		static param[1]
		param[0] = id
		
		if(!task_exists(TASKID_CZBOTPDATA))
			set_task(1.0, "task_botclient_pdata", TASKID_CZBOTPDATA, param, 1)
	}

	if( get_pcvar_num( cvar_entrie_class_vip ) ) {

		if( g_classcount > 1 ) {
		
			new HaveClass = false;
		
			if( is_user_bot( id ) )
				return 1;

			for( new i = 0; i < g_classcount; i++ ) {

				if( g_class_data[ i ][ DATA_ONLYVIP ] == 0.0 && is_user_vip( id ) || g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 ) {

					g_player_class[ id ] = i;
					HaveClass = true;
				}
			}
		
			if( !HaveClass ) {
				
				if( get_pcvar_num( cvar_randomclass ) && g_classcount > 1 ) {
					
					g_player_class[ id ] = _random( g_classcount );
				}
			}
		}
	}

	return 0;
}

public client_disconnect(id)
{
	remove_task(TASKID_STRIPNGIVE + id)
	remove_task(TASKID_UPDATESCR + id)
	remove_task(TASKID_SPAWNDELAY + id)
	remove_task(TASKID_WEAPONSMENU + id)
	remove_task(TASKID_CHECKSPAWN + id)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );

	g_disconnected[id] = true
	remove_user_model(g_modelent[id])
}

public cmd_jointeam(id)
{
	if(is_user_alive(id) && g_zombie[id])
	{
		ColorChat( id, "%L", id, "CMD_TEAMCHANGE")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public cmd_classmenu( id ) {

	if( is_user_connected( id ) && g_classcount ) {
		
		new ClassMenuTitle[ 64 ];
		new ClassMenu;
		
		formatex( ClassMenuTitle, sizeof( ClassMenuTitle ) - 1, "\r%L", 0, "MENU_TITLE4" );
		ClassMenu = menu_create( ClassMenuTitle, "ClassCmd" );
		
		for( new i = 0; i < g_classcount; ++i ) {
			
			new ClassInfo[ 512 ];
			
			if( g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) )
				formatex( ClassInfo, sizeof( ClassInfo ) - 1,"\d%s (\d%s) - \rOnly VIP", g_class_name[ i ], g_class_desc[ i ] );
			else
				formatex( ClassInfo, sizeof( ClassInfo ) - 1, "\w%s \r(\y%s\r)", g_class_name[ i ], g_class_desc[ i ] );
			
			new Num[ 64 ];
			formatex( Num, sizeof( Num ) - 1, "%d", i );
			menu_additem( ClassMenu, ClassInfo, Num, 0 );
		}
		
		menu_setprop( ClassMenu, MPROP_EXIT, MEXIT_ALL );
		
		menu_display( id, ClassMenu, 0 );
	}
}

public cmd_enablemenu(id)
{	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		ColorChat( id, "%L", id, g_showmenu[id] == false ? "MENU_REENABLED" : "MENU_ALENABLED")
		g_showmenu[id] = true
	}
}

public cmd_helpmotd(id)
{
	static motd[2048]
	formatex(motd, 2047, "%L", id, "HELP_MOTD")
	replace(motd, 2047, "#Version#", PLUGIN_VERSION)
	
	show_motd(id, motd, "Biohazard Help")
}	

public cmd_infectuser(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED_MAIN
	
	static arg1[32]
	read_argv(1, arg1, 31)
	
	static target
	target = cmd_target(id, arg1, (CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF|CMDTARGET_ONLY_ALIVE))
	
	if(!is_user_connected(target) || g_zombie[target])
		return PLUGIN_HANDLED_MAIN
	
	if(!allow_infection())
	{
		console_print(id, "%L", id, "CMD_MAXZOMBIES")
		return PLUGIN_HANDLED_MAIN
	}
	
	if(!g_gamestarted)
	{
		console_print(id, "%L", id, "CMD_GAMENOTSTARTED")
		return PLUGIN_HANDLED_MAIN
	}
			
	static name[32] 
	get_user_name(target, name, 31)
	
	console_print(id, "%L", id, "CMD_INFECTED", name)
	infect_user(target, 0)
	
	return PLUGIN_HANDLED_MAIN
}

public msg_teaminfo(msgid, dest, id)
{
	if(!g_gamestarted)
		return PLUGIN_CONTINUE

	// Don't pick up our own TeamInfo messages for this player (bugfix)
	if (g_switchingteam)
		return PLUGIN_CONTINUE

	static team[2]
	get_msg_arg_string(2, team, 1)
	
	if(team[0] != 'U')
		return PLUGIN_CONTINUE

	id = get_msg_arg_int(1)
	if(is_user_alive(id) || !g_disconnected[id])
		return PLUGIN_CONTINUE

	g_disconnected[id] = false
	id = randomly_pick_zombie()
	if(id)
	{
		fm_set_user_team(id, g_zombie[id] ? CS_TEAM_CT : CS_TEAM_T, 0)
		set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)
	}
	return PLUGIN_CONTINUE
}

public msg_screenfade(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_flashbang))
		return PLUGIN_CONTINUE
	
	if(!g_zombie[id] || !is_user_alive(id) || g_class_data[g_player_class[id]][DATA_NOFLASH] > 0.0)
	{
		static data[4]
		data[0] = get_msg_arg_int(4)
		data[1] = get_msg_arg_int(5)
		data[2] = get_msg_arg_int(6)
		data[3] = get_msg_arg_int(7)
		
		if(data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] > 199)
			return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public msg_scoreattrib(msgid, dest, id)
{
	static attrib 
	attrib = get_msg_arg_int(2)
	
	if(attrib == ATTRIB_BOMB)
		set_msg_arg_int(2, ARG_BYTE, 0)
}

public msg_statusicon(msgid, dest, id)
{
	static icon[3]
	get_msg_arg_string(2, icon, 2)
	
	return (icon[0] == 'c' && icon[1] == '4') ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}

public msg_weaponpickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_ammopickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_deathmsg(msgid, dest, id) 
{
	static killer
	killer = get_msg_arg_int(1)

	if(is_user_connected(killer) && g_zombie[killer])
		set_msg_arg_string(4, g_zombie_weapname)
}

public msg_sendaudio(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_winsounds))
		return PLUGIN_CONTINUE
	
	static audiocode [22]
	get_msg_arg_string(2, audiocode, 21)
	
	if(equal(audiocode[7], "terwin"))
		set_msg_arg_string(2, g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
	else if(equal(audiocode[7], "ctwin"))
		set_msg_arg_string(2, g_survivor_win_sounds[_random(sizeof g_survivor_win_sounds)])
	
	return PLUGIN_CONTINUE
}

public msg_health(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_caphealthdisplay))
		return PLUGIN_CONTINUE
	
	static health
	health = get_msg_arg_int(1)
		
	if(health > 255) 
		set_msg_arg_int(1, ARG_BYTE, 255)
	
	return PLUGIN_CONTINUE
}

public msg_textmsg(msgid, dest, id)
{
	if(get_msg_arg_int(1) != 4)
		return PLUGIN_CONTINUE
	
	static txtmsg[25], winmsg[32]
	get_msg_arg_string(2, txtmsg, 24)
	
	if(equal(txtmsg[1], "Game_bomb_drop"))
		return PLUGIN_HANDLED

	else if(equal(txtmsg[1], "Terrorists_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_ZOMBIES")
		set_msg_arg_string(2, winmsg)
	}
	else if(equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_SURVIVORS")
		set_msg_arg_string(2, winmsg)
	}
	return PLUGIN_CONTINUE
}

public msg_clcorpse(msgid, dest, id)
{
	id = get_msg_arg_int(12)
	if(!g_zombie[id])
		return PLUGIN_CONTINUE
	
	static ent
	ent = fm_find_ent_by_owner(-1, MODEL_CLASSNAME, id)
	
	if(ent)
	{
		static model[64]
		pev(ent, pev_model, model, 63)
		
		set_msg_arg_string(1, model)
	}

	return PLUGIN_CONTINUE
}

public logevent_round_start()
{
	g_roundended = false
	g_roundstarted = true
	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public logevent_round_end()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	remove_task(TASKID_BALANCETEAM) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	set_task(0.1, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_textmsg()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	static seconds[5] 
	read_data(3, seconds, 4)
	
	static Float:tasktime 
	tasktime = float(str_to_num(seconds)) - 0.5
	
	remove_task(TASKID_BALANCETEAM)
	
	set_task(tasktime, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_newround()
{
	g_gamestarted = false
	
	static buytime 
	buytime = get_pcvar_num(cvar_buytime)
	
	if(buytime) 
		g_buytime = buytime + get_gametime()
	
	static id
	for(id = 0; id <= g_maxplayers; id++)
	{
		if(is_user_connected(id))
			g_blockmodel[id] = true
	}
	
	remove_task(TASKID_NEWROUND) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );
	
	set_task(0.1, "task_newround", TASKID_NEWROUND)
	set_task(get_pcvar_float(cvar_starttime), "task_initround", TASKID_INITROUND)

	if( get_pcvar_num( cvar_countdown ) ) {

		CountDownDelay = get_pcvar_num( cvar_starttime );
		set_task( 0.1, "TASK_CountDown", TASKID_COUNTDOWN );
	}
}

public event_curweapon(id)
{
	if(!is_user_alive(id))
		return PLUGIN_CONTINUE
	
	static weapon
	weapon = read_data(2)

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if( g_zombie[ id ] ) {

		if( weapon != CSW_KNIFE && weapon != CSW_FLASHBANG && !task_exists( TASKID_STRIPNGIVE + id ) )
			set_task( 0.1, "task_stripngive", TASKID_STRIPNGIVE + id );

		return PLUGIN_CONTINUE;
	}

	static ammotype
	ammotype = get_pcvar_num(cvar_ammo)
	
	if(!ammotype || (AMMOWP_NULL & (1<<weapon)))
		return PLUGIN_CONTINUE

	static maxammo
	switch(ammotype)
	{
		case 1: maxammo = g_weapon_ammo[weapon][MAX_AMMO]
		case 2: maxammo = g_weapon_ammo[weapon][MAX_CLIP]
	}

	if(!maxammo)
		return PLUGIN_CONTINUE
	
	switch(ammotype)
	{
		case 1:
		{
			static ammo
			ammo = fm_get_user_bpammo(id, weapon)
			
			if(ammo < 1) 
				fm_set_user_bpammo(id, weapon, maxammo)
		}
		case 2:
		{
			static clip; clip = read_data(3)
			if(clip < 1)
			{
				static weaponname[32]
				get_weaponname(weapon, weaponname, 31)
				
				static ent 
				ent = fm_find_ent_by_owner(-1, weaponname, id)
				
				fm_set_weapon_ammo(ent, maxammo)
			}
		}
	}

	return PLUGIN_CONTINUE
}

public event_armortype(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return PLUGIN_CONTINUE
	
	if(fm_get_user_armortype(id) != CS_ARMOR_NONE)
		fm_set_user_armortype(id, CS_ARMOR_NONE)
	
	return PLUGIN_CONTINUE
}

public event_damage(victim)
{
	if(!is_user_alive(victim) || !g_gamestarted)
		return PLUGIN_CONTINUE

	if(!g_zombie[victim])
	{
		static attacker
		attacker = get_user_attacker(victim)
		
		if(!is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
			return PLUGIN_CONTINUE
		
		if(g_victim[attacker] == victim)
		{
			g_infecting = true
			g_victim[attacker] = 0

			message_begin(MSG_ALL, g_msg_deathmsg)
			write_byte(attacker)
			write_byte(victim)
			write_byte(0)
			write_string(g_infection_name)
			message_end()
			
			message_begin(MSG_ALL, g_msg_scoreattrib)
			write_byte(victim)
			write_byte(0)
			message_end()
			
			infect_user(victim, attacker)
			
			static Float:frags, deaths
			pev(attacker, pev_frags, frags)
			deaths = fm_get_user_deaths(victim)
			
			set_pev(attacker, pev_frags, frags  + 1.0)
			fm_set_user_deaths(victim, deaths + 1)
			
			fm_set_user_money(attacker, get_pcvar_num(cvar_infectmoney))
		
			static params[2]
			params[0] = attacker 
			params[1] = victim
	
			set_task(0.3, "task_updatescore", TASKID_UPDATESCR, params, 2)
		}
		g_infecting = false
	}
	return PLUGIN_CONTINUE
}

public fwd_player_prethink(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static flags
	flags = pev(id, pev_flags)
	
	if(flags & FL_ONGROUND)
	{
		if(get_pcvar_num(cvar_painshockfree))
		{
			pev(id, pev_velocity, g_vecvel)
			g_brestorevel = true
		}
	}
	else
	{
		static Float:fallvelocity
		pev(id, pev_flFallVelocity, fallvelocity)
		
		g_falling[id] = fallvelocity >= 350.0 ? true : false
	}
		
	if(g_gamestarted)
	{	
		static Float:gametime
		gametime = get_gametime()
		
		static pclass
		pclass = g_player_class[id]

		static Float:health
		pev(id, pev_health, health)
		
		if(health < g_class_data[pclass][DATA_HEALTH] && g_regendelay[id] < gametime)
		{
			set_pev(id, pev_health, health + 1.0)
			g_regendelay[id] = gametime + g_class_data[pclass][DATA_REGENDLY]
		}
	}

	if( get_pcvar_num( cvar_biohazard_icon ) > 0 ) {

		if( is_user_alive( id ) ) {

			if( g_preinfect[ id ] && !g_zombie[ id ] ) set_biohazard_icon( id, 2, 255, 255, 0 );
			else if( g_zombie[ id ] ) set_biohazard_icon( id, 1, 255, 0, 0 );
			else if( !g_zombie[ id ] && !g_preinfect[ id ] ) set_biohazard_icon( id, 1, 125, 178, 255 );
		} else set_biohazard_icon( id, 0, 0, 0 ,0 );
	}

	return FMRES_IGNORED
}

public fwd_player_prethink_post(id)
{
	if(!g_brestorevel)
		return FMRES_IGNORED

	g_brestorevel = false
		
	static flag
	flag = pev(id, pev_flags)
	
	if(!(flag & FL_ONTRAIN))
	{
		static ent
		ent = pev(id, pev_groundentity)
		
		if(pev_valid(ent) && (flag & FL_CONVEYOR))
		{
			static Float:vectemp[3]
			pev(id, pev_basevelocity, vectemp)
			
			xs_vec_add(g_vecvel, vectemp, g_vecvel)
		}
	
		set_pev(id, pev_velocity, g_vecvel)
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public fwd_player_postthink(id)
{ 
	if(!is_user_alive(id))
		return FMRES_IGNORED
	
	if(g_zombie[id] && g_falling[id] && (pev(id, pev_flags) & FL_ONGROUND))
	{	
		set_pev(id, pev_watertype, CONTENTS_WATER)
		g_falling[id] = false
	}
	
	if(get_pcvar_num(cvar_buytime))
	{
		if(pev_valid(g_buyzone) && g_buytime > get_gametime())
			dllfunc(DLLFunc_Touch, g_buyzone, id)
	}

	return FMRES_IGNORED
}

public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch)
{	
	if(channel == CHAN_ITEM && sample[6] == 'n' && sample[7] == 'v' && sample[8] == 'g')
		return FMRES_SUPERCEDE	
	
	if(!is_user_connected(id) || !g_zombie[id])
		return FMRES_IGNORED	

	if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
	{
		if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
		{
			emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			return FMRES_SUPERCEDE
		}
		else if(sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't' || sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
		{
			if(sample[17] == 'w' && sample[18] == 'a' && sample[19] == 'l')
				emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			else
				emit_sound(id, channel, g_zombie_hit_sounds[_random(sizeof g_zombie_hit_sounds)], volume, attn, flag, pitch)
			
			return FMRES_SUPERCEDE
		}
	}			
	else if(sample[7] == 'd' && (sample[8] == 'i' && sample[9] == 'e' || sample[12] == '6'))
	{
		emit_sound(id, channel, g_zombie_die_sounds[_random(sizeof g_zombie_die_sounds)], volume, attn, flag, pitch)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_cmdstart(id, handle, seed)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static impulse
	impulse = get_uc(handle, UC_Impulse)
	
	if(impulse == IMPULSE_FLASHLIGHT)
	{
		set_uc(handle, UC_Impulse, 0)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_spawn(ent)
{
	if(!pev_valid(ent)) 
		return FMRES_IGNORED
	
	static classname[32]
	pev(ent, pev_classname, classname, 31)

	static i
	for(i = 0; i < sizeof g_remove_entities; ++i)
	{
		if(equal(classname, g_remove_entities))
		{
			engfunc(EngFunc_RemoveEntity, ent)
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public fwd_gamedescription() 
{ 
	static gamename[32]
	get_pcvar_string(cvar_gamedescription, gamename, 31)
	
	forward_return(FMV_STRING, gamename)
	
	return FMRES_SUPERCEDE
}  

public fwd_createnamedentity(entclassname)
{
	static classname[10]
	engfunc(EngFunc_SzFromIndex, entclassname, classname, 9)
	
	return (classname[7] == 'c' && classname[8] == '4') ? FMRES_SUPERCEDE : FMRES_IGNORED
}

public fwd_clientkill(id)
{
	if(get_pcvar_num(cvar_punishsuicide) && is_user_alive(id))
		g_suicide[id] = true
}

public fwd_setclientkeyvalue(id, infobuffer, const key[])
{
	if(!equal(key, "model") || !g_blockmodel[id])
		return FMRES_IGNORED
	
	static model[32]
	fm_get_user_model(id, model, 31)
	
	if(equal(model, "gordon"))
		return FMRES_IGNORED
	
	g_blockmodel[id] = false
	
	return FMRES_SUPERCEDE
}

public bacon_touch_weapon(ent, id)
	return (is_user_alive(id) && g_zombie[id]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_tank(ent, caller, activator, use_type, Float:value)
	return (is_user_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_pushable(ent, caller, activator, use_type, Float:value)
	return HAM_SUPERCEDE

public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!g_gamestarted) 
		return HAM_SUPERCEDE
	
	if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
		return HAM_IGNORED
	
	if(!is_user_connected(attacker) || !g_zombie[victim])
		return HAM_IGNORED
	
	static kbpower
	kbpower = g_weapon_knockback[get_user_weapon(attacker)]
	
	if(kbpower != -1) 
	{
		static flags
		flags = pev(victim, pev_flags)
		
		if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND)))
			return HAM_IGNORED
		
		static Float:origins[2][3]
		pev(victim, pev_origin, origins[0])
		pev(attacker, pev_origin, origins[1])
		
		if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
		{
			static Float:velocity[3]
			pev(victim, pev_velocity, velocity)
			
			static Float:tempvec
			tempvec = velocity[2]	
			
			xs_vec_mul_scalar(direction, damage, direction)
			xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
			xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)
			
			xs_vec_add(direction, velocity, velocity)
			velocity[2] = tempvec
			
			set_pev(victim, pev_velocity, velocity)
			
			return HAM_HANDLED
		}
	}
	return HAM_IGNORED
}

public bacon_touch_grenade(ent, world)
{
	if(!get_pcvar_num(cvar_impactexplode))
		return HAM_IGNORED
	
	static model[12]
	pev(ent, pev_model, model, 11)
	
	if(model[9] == 'h' && model[10] == 'e')
	{
		set_pev(ent, pev_dmgtime, 0.0)
		
		return HAM_HANDLED
	}
	return HAM_IGNORED
}

public bacon_takedamage_player(victim, inflictor, attacker, Float:damage, damagetype)
{
	if(damagetype & DMG_GENERIC || victim == attacker || !is_user_alive(victim) || !is_user_connected(attacker))
		return HAM_IGNORED

	if(!g_gamestarted || (!g_zombie[victim] && !g_zombie[attacker]) || ((damagetype & DMG_HEGRENADE) && g_zombie[attacker]))
		return HAM_SUPERCEDE

	if(g_zombie[attacker])
	{
		if(get_user_weapon(attacker) != CSW_KNIFE)
			return HAM_SUPERCEDE

		damage *= g_class_data[g_player_class[attacker]][DATA_ATTACK]
		
		static Float:armor
		pev(victim, pev_armorvalue, armor)
		
		if(get_pcvar_num(cvar_obeyarmor) && armor > 0.0)
		{
			armor -= damage
			
			if(armor < 0.0) 
				armor = 0.0
			
			set_pev(victim, pev_armorvalue, armor)
			SetHamParamFloat(4, 0.0)
		}
		else
		{
			static bool:infect
			infect = allow_infection()
			
			g_victim[attacker] = infect ? victim : 0
					
			if(!g_infecting)
				SetHamParamFloat(4, infect ? 0.0 : damage)
			else	
				SetHamParamFloat(4, 0.0)
		}
	}
	return HAM_HANDLED
}

public bacon_killed_player(victim, killer, shouldgib)
{
	if(!is_user_alive(killer) || g_zombie[killer] || !g_zombie[victim])
		return HAM_IGNORED

	static killbonus
	killbonus = get_pcvar_num(cvar_killbonus)
	
	if(killbonus)
		set_pev(killer, pev_frags, pev(killer, pev_frags) + float(killbonus))
	
	static killreward
	killreward = get_pcvar_num(cvar_killreward)
	
	if(!killreward) 
		return HAM_IGNORED
	
	static weapon, maxclip, ent, weaponname[32]
	switch(killreward)
	{
		case 1: 
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
		}
		case 2:
		{
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
		case 3:
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
				
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
	}
	return HAM_IGNORED
}

public bacon_spawn_player_post(id)
{	
	if(!is_user_alive(id))
		return HAM_IGNORED
	
	static team
	team = fm_get_user_team(id)
	
	if(team != CS_TEAM_T && team != CS_TEAM_CT)
		return HAM_IGNORED
	
	if(g_zombie[id])
	{
		if(get_pcvar_num(cvar_respawnaszombie) && !g_roundended)
		{
			set_zombie_attibutes(id)
			
			return HAM_IGNORED
		}
		else
			cure_user(id)
	}
	else if(pev(id, pev_rendermode) == kRenderTransTexture)
		reset_user_model(id)
	
	set_task(0.3, "task_spawned", TASKID_SPAWNDELAY + id)
	set_task(5.0, "task_checkspawn", TASKID_CHECKSPAWN + id)
	
	return HAM_IGNORED
}

public bacon_touch_pushable(ent, id)
{
	static movetype
	pev(id, pev_movetype)
	
	if(movetype == MOVETYPE_NOCLIP || movetype == MOVETYPE_NONE)
		return HAM_IGNORED	
	
	if(is_user_alive(id))
	{
		set_pev(id, pev_movetype, MOVETYPE_WALK)
		
		if(!(pev(id, pev_flags) & FL_ONGROUND))
			return HAM_SUPERCEDE
	}
	
	if(!get_pcvar_num(cvar_shootobjects))
		return HAM_IGNORED
	
	static Float:velocity[2][3]
	pev(ent, pev_velocity, velocity[0])
	
	if(vector_length(velocity[0]) > 0.0)
	{
		pev(id, pev_velocity, velocity[1])
		velocity[1][0] += velocity[0][0]
		velocity[1][1] += velocity[0][1]
		
		set_pev(id, pev_velocity, velocity[1])
	}
	return HAM_SUPERCEDE
}

public bacon_traceattack_pushable(ent, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!get_pcvar_num(cvar_shootobjects) || !is_user_alive(attacker))
		return HAM_IGNORED
	
	static Float:velocity[3]
	pev(ent, pev_velocity, velocity)
			
	static Float:tempvec
	tempvec = velocity[2]	
			
	xs_vec_mul_scalar(direction, damage, direction)
	xs_vec_mul_scalar(direction, g_zombie[attacker] ? 
	get_pcvar_float(cvar_pushpwr_zombie) : get_pcvar_float(cvar_pushpwr_weapon), direction)
	xs_vec_add(direction, velocity, velocity)
	velocity[2] = tempvec
	
	set_pev(ent, pev_velocity, velocity)
	
	return HAM_HANDLED
}

public bacon_claws_deploy_post( iEntity ) {

	static szOwner;
	szOwner = get_pdata_cbase( iEntity, 41, EXTRAOFFSET_WEAPONS );

	if( g_zombie[ szOwner ] ) {

		set_pev( szOwner, pev_viewmodel2, g_class_wmodel[ g_player_class[ szOwner ] ] );
		set_pev( szOwner, pev_weaponmodel2, "" );
	}
}

public TASK_CountDown(  ) {

	new Players[ 32 ];
	new PlayersNum;
	get_players( Players, PlayersNum, "a" );
	
	if( CountDownDelay > sizeof CountDownSounds + 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
	} else if( CountDownDelay > 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		emit_sound( 0, CHAN_VOICE, CountDownSounds[ CountDownDelay - 1 ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );

		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
		
		for( new i = 0 ; i < PlayersNum ; i++ ) {

			if( is_user_connected( Players[ i ] ) ) {

				new color[ 3 ];
				color[ 0 ] = 125;
				color[ 1 ] = 170;
				color[ 2 ] = 255;
				UTIL_ScreenFade( Players[ i ], color, 0.5, 0.5, 110 );

				new shock[ 3 ];
				shock[ 0 ] = 3;
				shock[ 1 ] = 2;
				shock[ 2 ] = 3;
				message_begin( MSG_ONE, get_user_msgid( "ScreenShake" ), _, Players[ i ] );
				write_short( ( 1<<12 ) * shock[ 0 ] );
				write_short( ( 1<<12 ) * shock[ 1 ] );
				write_short( ( 1<<12 ) * shock[ 2 ] );
				message_end(  );
			}
		}	
	} else if( CountDownDelay <= 1 )
		CountDownDelay = 0;
}

public task_spawned(taskid)
{
	static id
	id = taskid - TASKID_SPAWNDELAY
	
	if(is_user_alive(id))
	{
		if( !get_pcvar_num( cvar_weaponsmenu ) ) {

			for( new i = 0; i < sizeof g_grenades; ++i )
				bacon_give_weapon( id, g_grenades[ i ] );
		}

		if(g_welcomemsg[id])
		{
			g_welcomemsg[id] = false
			
			static message[192]
			formatex(message, 191, "%L", id, "WELCOME_TXT")
			replace(message, 191, "#Version#", PLUGIN_VERSION)
			
			ColorChat(id, message)
		}
		
		if(g_suicide[id])
		{
			g_suicide[id] = false
			
			user_silentkill(id)
			remove_task(TASKID_CHECKSPAWN + id)

			ColorChat(id, "%L", id, "SUICIDEPUNISH_TXT")
			
			return
		}
		
		if(get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
			is_user_bot(id) ? bot_weapons(id) : display_equipmenu(id)
		
		if(!g_gamestarted)
			ColorChat(id, "%L %L", id, "SCAN_RESULTS", id, g_preinfect[id] ? "SCAN_INFECTED" : "SCAN_CLEAN")
		else
		{
			static team
			team = fm_get_user_team(id)
			
			if(team == CS_TEAM_T)
				fm_set_user_team(id, CS_TEAM_CT)
		}

		if(get_pcvar_num(cvar_biohazard_icon) > 0) {
			if(g_preinfect[id] && !g_zombie[id])
				set_biohazard_icon(id, 2, 255, 255, 0)
			else if(g_zombie[id])
				set_biohazard_icon(id, 1, 255, 0, 0)
			else if(!g_zombie[id] && !g_preinfect[id])
				set_biohazard_icon(id, 1, 125, 178, 255)
		}
	}
}

public task_checkspawn(taskid)
{
	static id
	id = taskid - TASKID_CHECKSPAWN
	
	if(!is_user_connected(id) || is_user_alive(id) || g_roundended)
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
		ExecuteHamB(Ham_CS_RoundRespawn, id)
}
	
public task_showtruehealth()
{
	static id, Float:health, Float:gravity, Float:speed, class
	for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id) && !is_user_bot(id) && g_zombie[id])
	{
		pev( id, pev_health, health );
		pev( id, pev_gravity, gravity );
		pev( id, pev_maxspeed, speed );
		class = g_player_class[id]

		if(g_classcount > 1) {

			set_hudmessage(0, 255, 20, -1.0, 0.8, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Class: %s - Desc: %s^nHealth: %0.f^n^nSpeed: %0.1f^nGolds: %i", g_class_name[class], g_class_desc[class], health, speed, get_user_golds( id ) );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		} else {

			set_hudmessage(0, 230, 210, 0.01, 0.9, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Speed: %0.1f   Gravity: %0.1f", speed, gravity / 0.00125 );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		}
	}
}

public task_lights()
{
	static light[2]
	get_pcvar_string(cvar_lights, light, 1)
	
	engfunc(EngFunc_LightStyle, 0, light)
}

public task_updatescore(params[])
{
	if(!g_gamestarted) 
		return
	
	static attacker
	attacker = params[0]
	
	static victim
	victim = params[1]
	
	if(!is_user_connected(attacker))
		return

	static frags, deaths, team
	frags  = get_user_frags(attacker)
	deaths = fm_get_user_deaths(attacker)
	team   = get_user_team(attacker)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(attacker)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
	
	if(!is_user_connected(victim))
		return
	
	frags  = get_user_frags(victim)
	deaths = fm_get_user_deaths(victim)
	team   = get_user_team(victim)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(victim)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
}

public task_weaponsmenu(taskid)
{
	static id
	id = taskid - TASKID_WEAPONSMENU
	
	if(is_user_alive(id) && !g_zombie[id] && g_menufailsafe[id])
		display_equipmenu(id)
}

public task_stripngive(taskid)
{
	static id
	id = taskid - TASKID_STRIPNGIVE
	
	if(is_user_alive(id))
	{
		fm_strip_user_weapons(id)
		fm_reset_user_primary(id)
		bacon_give_weapon(id, "weapon_knife")
		
		set_pev(id, pev_weaponmodel2, "")
		set_pev(id, pev_viewmodel2, g_class_wmodel[g_player_class[id]])
		set_pev(id, pev_maxspeed, g_class_data[g_player_class[id]][DATA_SPEED])
	}
}

public task_newround()
{
	static players[32], num, zombies, i, id
	get_players(players, num, "a")

	if(num > 1)
	{
		for(i = 0; i < num; i++) 
			g_preinfect[players[i]] = false
		
		zombies = clamp(floatround(num * get_pcvar_float(cvar_zombiemulti)), 1, 31)
		
		i = 0
		while(i < zombies)
		{
			id = players[_random(num)]
			if(!g_preinfect[id])
			{
				g_preinfect[id] = true
				i++
			}
		}
	}
	
	if(!get_pcvar_num(cvar_randomspawn) || g_spawncount <= 0) 
		return
	
	static team
	for(i = 0; i < num; i++)
	{
		id = players[i]
		
		team = fm_get_user_team(id)
		if(team != CS_TEAM_T && team != CS_TEAM_CT || pev(id, pev_iuser1))
			continue
		
		static spawn_index
		spawn_index = _random(g_spawncount)
	
		static Float:spawndata[3]
		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		
		if(!fm_is_hull_vacant(spawndata, HULL_HUMAN))
		{
			static i
			for(i = spawn_index + 1; i != spawn_index; i++)
			{
				if(i >= g_spawncount) i = 0

				spawndata[0] = g_spawns[i][0]
				spawndata[1] = g_spawns[i][1]
				spawndata[2] = g_spawns[i][2]

				if(fm_is_hull_vacant(spawndata, HULL_HUMAN))
				{
					spawn_index = i
					break
				}
			}
		}

		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		engfunc(EngFunc_SetOrigin, id, spawndata)

		spawndata[0] = g_spawns[spawn_index][3]
		spawndata[1] = g_spawns[spawn_index][4]
		spawndata[2] = g_spawns[spawn_index][5]
		set_pev(id, pev_angles, spawndata)

		spawndata[0] = g_spawns[spawn_index][6]
		spawndata[1] = g_spawns[spawn_index][7]
		spawndata[2] = g_spawns[spawn_index][8]
		set_pev(id, pev_v_angle, spawndata)

		set_pev(id, pev_fixangle, 1)
	}
}

public task_initround()
{
	static zombiecount, newzombie
	zombiecount = 0
	newzombie = 0

	static players[32], num, i, id
	get_players(players, num, "a")

	for(i = 0; i < num; i++) if(g_preinfect[players[i]])
	{
		newzombie = players[i]
		zombiecount++
	}
	
	if(zombiecount > 1) 
		newzombie = 0
	else if(zombiecount < 1) 
		newzombie = players[_random(num)]
	
	for(i = 0; i < num; i++)
	{
		id = players[i]
		if(id == newzombie || g_preinfect[id])
			infect_user(id, 0)
		else
		{
			fm_set_user_team(id, CS_TEAM_CT, 0)
			add_delay(id, "update_team")
		}
	}
	
	set_hudmessage(_, _, _, _, _, 1)
	if(newzombie)
	{
		static name[32]
		get_user_name(newzombie, name, 31)
		
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD", name)
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT", name)
	}
	else
	{
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD2")
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT2")
	}
	
	set_task(0.51, "task_startround", TASKID_STARTROUND)

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 2 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

public task_startround()
{
	g_gamestarted = true
	ExecuteForward(g_fwd_gamestart, g_fwd_result)
}

public task_balanceteam()
{
	static players[3][32], count[3]
	get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
	
	count[CS_TEAM_T] = 0
	count[CS_TEAM_CT] = 0
	
	static i, id, team
	for(i = 0; i < count[CS_TEAM_UNASSIGNED]; i++)
	{
		id = players[CS_TEAM_UNASSIGNED][i] 
		team = fm_get_user_team(id)
		
		if(team == CS_TEAM_T || team == CS_TEAM_CT)
			players[team][count[team]++] = id
	}

	if(abs(count[CS_TEAM_T] - count[CS_TEAM_CT]) <= 1) 
		return

	static maxplayers
	maxplayers = (count[CS_TEAM_T] + count[CS_TEAM_CT]) / 2
	
	if(count[CS_TEAM_T] > maxplayers)
	{
		for(i = 0; i < (count[CS_TEAM_T] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT, 0)
	}
	else
	{
		for(i = 0; i < (count[CS_TEAM_CT] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T, 0)
	}
}

public task_botclient_pdata(id) 
{
	if(g_botclient_pdata || !is_user_connected(id))
		return
	
	if(get_pcvar_num(cvar_botquota) && is_user_bot(id))
	{
		RegisterHamFromEntity(Ham_TakeDamage, id, "bacon_takedamage_player")
		RegisterHamFromEntity(Ham_Killed, id, "bacon_killed_player")
		RegisterHamFromEntity(Ham_TraceAttack, id, "bacon_traceattack_player")
		RegisterHamFromEntity(Ham_Spawn, id, "bacon_spawn_player_post", 1)
		
		g_botclient_pdata = 1
	}
}

public bot_weapons(id)
{
	g_player_weapons[id][0] = _random(sizeof g_primaryweapons)
	g_player_weapons[id][1] = _random(sizeof g_secondaryweapons)
	
	equipweapon(id, EQUIP_ALL)
}

public update_team(id)
{
	if(!is_user_connected(id))
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
	{
		emessage_begin(MSG_ALL, g_msg_teaminfo)
		ewrite_byte(id)
		ewrite_string(g_teaminfo[team])
		emessage_end()
	}
}

public infect_user(victim, attacker)
{
	if(!is_user_alive(victim))
		return

	message_begin(MSG_ONE, g_msg_screenfade, _, victim)
	write_short(1<<10)
	write_short(1<<10)
	write_short(0)
	write_byte((g_mutate[victim] != -1) ? 255 : 100)
	write_byte(100)
	write_byte(100)
	write_byte(250)
	message_end()

	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenShake" ), _, victim )
	write_short( ( 1<<12 ) * 4 ) // amplitude
	write_short( ( 1<<12 ) * 2 ) // duration
	write_short( ( 1<<12 ) * 10 ) // frequency
	message_end(  )
		
	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "Damage" ), _, victim )
	write_byte( 0 ) // damage save
	write_byte( 0 ) // damage take
	write_long( DMG_NERVEGAS ) // damage type - DMG_RADIATION
	write_coord( 0 ) // x
	write_coord( 0 ) // y
	write_coord( 0 ) // z
	message_end(  )

	// Get player's origin
	new Origin[ 3 ]
	get_user_origin( victim, Origin )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_IMPLOSION ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 128 ) // radius
	write_byte( 20 ) // count
	write_byte( 3 ) // duration
	message_end(  )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_DLIGHT ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 20 ) // radius
	write_byte( 0 ) // r
	write_byte( 150 ) // g
	write_byte( 0 ) // b
	write_byte( 2 ) // life
	write_byte( 0 ) // decay rate
	message_end(  )

#if defined ULTRA_BLOOD
	static origin[3];
	get_user_origin(victim, origin)

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_PARTICLEBURST)
	write_coord(origin[0])
	write_coord(origin[1])
	write_coord(origin[2])
	write_short(50)
	write_byte(70)
	write_byte(3)
	message_end()
#endif
	
	if(g_mutate[victim] != -1)
	{
		g_player_class[victim] = g_mutate[victim]
		g_mutate[victim] = -1
		
		set_hudmessage(_, _, _, _, _, 1)
		ShowSyncHudMsg(victim, g_sync_msgdisplay, "%L", victim, "MUTATION_HUD", g_class_name[g_player_class[victim]])
	}
	
	fm_set_user_team(victim, CS_TEAM_T)
	set_zombie_attibutes(victim)
	
	emit_sound(victim, CHAN_STATIC, g_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
	ExecuteForward(g_fwd_infect, g_fwd_result, victim, attacker)
}

public cure_user(id)
{
	if(!is_user_alive(id)) 
		return

	g_zombie[id] = false
	g_falling[id] = false

	g_showmenu[id] = true;

	reset_user_model(id)
	fm_set_user_nvg(id, 0)
	set_pev(id, pev_gravity, 1.0)
	
	if( fm_get_user_team( id ) != CS_TEAM_CT ) { // need to change team?

		fm_set_user_team( id, CS_TEAM_CT );
		fm_user_team_update( id );
	}

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if(equal(viewmodel, g_class_wmodel[g_player_class[id]]))
	{
		static weapon 
		weapon = fm_lastknife(id)

		if(pev_valid(weapon))
			ExecuteHam(Ham_Item_Deploy, weapon)
	}

	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public display_equipmenu(id)
{
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L^n^n", id, "MENU_TITLE1")
	
	static bool:hasweap
	hasweap = ((g_player_weapons[id][0]) != -1 && (g_player_weapons[id][1] != -1)) ? true : false
	
	len += formatex(menubody[len], 511 - len,"\r1.\w %L^n", id, "MENU_NEWWEAPONS")
	len += formatex(menubody[len], 511 - len,"%s2.\w %L^n", hasweap ? "\r" : "\d", id, "MENU_PREVSETUP")
	len += formatex(menubody[len], 511 - len,"%s3.\w %L^n^n", hasweap ? "\r" : "\d", id, "MENU_DONTSHOW")
	len += formatex(menubody[len], 511 - len,"\r5.\w %L^n", id, "MENU_EXIT")
	
	static keys
	keys = (MENU_KEY_1|MENU_KEY_5)
	
	if(hasweap) 
		keys |= (MENU_KEY_2|MENU_KEY_3)
	
	show_menu(id, keys, menubody, -1, "Equipment")
}

public action_equip(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key)
	{
		case 0: display_weaponmenu(id, MENU_PRIMARY, g_menuposition[id] = 0)
		case 1: equipweapon(id, EQUIP_ALL)
		case 2:
		{
			g_showmenu[id] = false
			equipweapon(id, EQUIP_ALL)
			ColorChat(id, "%L", id, "MENU_CMDENABLE")
		}
	}
	
	if(key > 0)
	{
		g_menufailsafe[id] = false
		remove_task(TASKID_WEAPONSMENU + id)
	}
	return PLUGIN_HANDLED
}


public display_weaponmenu(id, menuid, pos)
{
	if(pos < 0 || menuid < 0)
		return
	
	static start
	start = pos * 8
	
	static maxitem
	maxitem = menuid == MENU_PRIMARY ? sizeof g_primaryweapons : sizeof g_secondaryweapons

  	if(start >= maxitem)
    		start = pos = g_menuposition[id]
	
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L\w^n^n", id, menuid == MENU_PRIMARY ? "MENU_TITLE2" : "MENU_TITLE3")

	static end
	end = start + 8
	if(end > maxitem)
    		end = maxitem
	
	static keys
	keys = MENU_KEY_0
	
	static a, b
	b = 0
	
  	for(a = start; a < end; ++a) 
	{
		keys |= (1<<b)
		len += formatex(menubody[len], 511 - len,"\r%d.\w %s^n", ++b, menuid == MENU_PRIMARY ? g_primaryweapons[a][0]: g_secondaryweapons[a][0])
  	}

  	if(end != maxitem)
	{
    		formatex(menubody[len], 511 - len, "^n\r9.\w %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
    		keys |= MENU_KEY_9
  	}
  	else	
		formatex(menubody[len], 511 - len, "^n\r0.\w %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
	
  	show_menu(id, keys, menubody, -1, menuid == MENU_PRIMARY ? "Primary" : "Secondary")
}

public action_prim(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED

	switch(key)
	{
    		case 8: display_weaponmenu(id, MENU_PRIMARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_PRIMARY, --g_menuposition[id])
    		default:
		{
			g_player_weapons[id][0] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_PRI)
			
			display_weaponmenu(id, MENU_SECONDARY, g_menuposition[id] = 0)
		}
	}
	return PLUGIN_HANDLED
}

public action_sec(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key) 
	{
    		case 8: display_weaponmenu(id, MENU_SECONDARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_SECONDARY, --g_menuposition[id])
    		default:
		{
			g_menufailsafe[id] = false
			remove_task(TASKID_WEAPONSMENU + id)
			
			g_player_weapons[id][1] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_SEC)
			equipweapon(id, EQUIP_GREN)
		}
	}
	return PLUGIN_HANDLED
}

public ClassCmd( id, szMenu, szItem ) {

	if( szItem == MENU_EXIT ) {

		menu_destroy( szMenu );
		return PLUGIN_HANDLED;
	}

	new szData[ 6 ], szName[ 64 ];
	new iAccess, iCallBack;

	menu_item_getinfo( szMenu, szItem, iAccess, szData, 5, szName, 63, iCallBack );
	new iKey = str_to_num( szData );

	if( g_class_data[ iKey ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) ) {

		ColorChat( id, "%L", id, "MENU_CLASSONLYVIP", g_class_name[ iKey ] );
		cmd_classmenu( id );
	}

	else {

		g_mutate[ id ] = iKey;
		ColorChat( id, "%L", id, "MENU_CHANGECLASS", g_class_name[ g_mutate[ id ] ] );
	}

	menu_destroy( szMenu );
	return PLUGIN_HANDLED;
}

public register_spawnpoints(const mapname[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new csdmfile[64], line[64], data[10][6]
	formatex(csdmfile, 63, "%s/csdm/%s.spawns.cfg", configdir, mapname)

	if(file_exists(csdmfile))
	{
		new file
		file = fopen(csdmfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 63)
			if(!line[0] || str_count(line,' ') < 2) 
				continue

			parse(line, data[0], 5, data[1], 5, data[2], 5, data[3], 5, data[4], 5, data[5], 5, data[6], 5, data[7], 5, data[8], 5, data[9], 5)

			g_spawns[g_spawncount][0] = floatstr(data[0]), g_spawns[g_spawncount][1] = floatstr(data[1])
			g_spawns[g_spawncount][2] = floatstr(data[2]), g_spawns[g_spawncount][3] = floatstr(data[3])
			g_spawns[g_spawncount][4] = floatstr(data[4]), g_spawns[g_spawncount][5] = floatstr(data[5])
			g_spawns[g_spawncount][6] = floatstr(data[7]), g_spawns[g_spawncount][7] = floatstr(data[8])
			g_spawns[g_spawncount][8] = floatstr(data[9])
			
			if(++g_spawncount >= MAX_SPAWNS) 
				break
		}
		if(file) 
			fclose(file)
	}
}

public register_zombieclasses(filename[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new configfile[64]
	formatex(configfile, 63, "%s/%s", configdir, filename)

	if(get_pcvar_num(cvar_zombie_class) && file_exists(configfile))
	{			
		new line[128], leftstr[32], rightstr[64],  classname[32], data[MAX_DATA], i
		
		new file
		file = fopen(configfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 127), trim(line)
			if(!line[0] || line[0] == ';') continue
			
			if(line[0] == '[' && line[strlen(line) - 1] == ']')
			{
				copy(classname, strlen(line) - 2, line[1])

				if(register_class(classname) == -1)
					break
				
				continue
			}
			strtok(line, leftstr, 31, rightstr, 63, '=', 1)
				
			if(equali(leftstr, "DESC"))
				copy(g_class_desc[g_classcount - 1], 31, rightstr)
			else if(equali(leftstr, "PMODEL"))
				copy(g_class_pmodel[g_classcount - 1], 63, rightstr)
			else if(equali(leftstr, "WMODEL"))
				copy(g_class_wmodel[g_classcount - 1], 63, rightstr)
				
			for(i = 0; i < MAX_DATA; i++)
				data[i] = equali(leftstr, g_dataname[i])
				
			for(i = 0; i < MAX_DATA; i++) if(data[i])
			{
				g_class_data[g_classcount - 1][i] = floatstr(rightstr)
				break
			}
		}
		if(file) fclose(file)
	} 
	else 
		register_class("default")
}

public register_class(classname[])
{
	if(g_classcount >= MAX_CLASSES)
		return -1
	
	copy(g_class_name[g_classcount], 31, classname)
	copy(g_class_pmodel[g_classcount], 63, DEFAULT_PMODEL)
	copy(g_class_wmodel[g_classcount], 63, DEFAULT_WMODEL)
		
	g_class_data[g_classcount][DATA_HEALTH] = DEFAULT_HEALTH
	g_class_data[g_classcount][DATA_SPEED] = DEFAULT_SPEED	
	g_class_data[g_classcount][DATA_GRAVITY] = DEFAULT_GRAVITY
	g_class_data[g_classcount][DATA_ATTACK] = DEFAULT_ATTACK
	g_class_data[g_classcount][DATA_REGENDLY] = DEFAULT_REGENDLY
	g_class_data[g_classcount][DATA_KNOCKBACK] = DEFAULT_KNOCKBACK
	g_class_data[g_classcount][DATA_NOFLASH] = DEFAULT_NOFLASH
	g_class_data[g_classcount][DATA_ONLYVIP] = DEFAULT_ONLYVIP
	g_classcount++
	
	return (g_classcount - 1)
}

public native_register_class(classname[], description[])
{
	param_convert(1)
	param_convert(2)
	
	static classid
	classid = register_class(classname)
	
	if(classid != -1)
		copy(g_class_desc[classid], 31, description)

	return classid
}

public native_set_class_pmodel(classid, player_model[])
{
	param_convert(2)
	copy(g_class_pmodel[classid], 63, player_model)
}

public native_set_class_wmodel(classid, weapon_model[])
{
	param_convert(2)
	copy(g_class_wmodel[classid], 63, weapon_model) 
}

public native_is_user_zombie(index)
	return g_zombie[index] == true ? 1 : 0

public native_get_user_class(index)
	return g_player_class[index]

public native_is_user_infected(index)
	return g_preinfect[index] == true ? 1 : 0

public native_game_started()
	return g_gamestarted

public native_preinfect_user(index, bool:yesno)
{
	if(is_user_alive(index) && !g_gamestarted)
		g_preinfect[index] = yesno
}

public native_infect_user(victim, attacker)
{
	if(allow_infection() && g_gamestarted)
		infect_user(victim, attacker)
}

public native_cure_user(index)
	cure_user(index)

public native_get_class_id(classname[])
{
	param_convert(1)
	
	static i
	for(i = 0; i < g_classcount; i++)
	{
		if(equali(classname, g_class_name[i]))
			return i
	}
	return -1
}

public Float:native_get_class_data(classid, dataid)
	return g_class_data[classid][dataid]

public native_set_class_data(classid, dataid, Float:value)
	g_class_data[classid][dataid] = value

public native_get_humans(  ) {

	static iHumans;
	iHumans = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && !g_zombie[ id ] ) 
			iHumans++;
	}

	return iHumans;
}

public native_get_zombies(  ) {

	static iZombies;
	iZombies = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && g_zombie[ id ] ) 
			iZombies++;
	}

	return iZombies;
}

stock bool:fm_is_hull_vacant(const Float:origin[3], hull)
{
	static tr
	tr = 0
	
	engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, tr)
	return (!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen)) ? true : false
}

stock fm_set_kvd(entity, const key[], const value[], const classname[] = "") 
{
	set_kvd(0, KV_ClassName, classname)
	set_kvd(0, KV_KeyName, key)
	set_kvd(0, KV_Value, value)
	set_kvd(0, KV_fHandled, 0)

	return dllfunc(DLLFunc_KeyValue, entity, 0)
}

stock fm_strip_user_weapons(index) 
{
	static stripent
	if(!pev_valid(stripent))
	{
		stripent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
		dllfunc(DLLFunc_Spawn, stripent), set_pev(stripent, pev_solid, SOLID_NOT)
	}
	dllfunc(DLLFunc_Use, stripent, index)
	
	return 1
}

stock fm_set_entity_visibility(index, visible = 1)
	set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)

stock fm_find_ent_by_owner(index, const classname[], owner) 
{
	static ent
	ent = index
	
	while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) && pev(ent, pev_owner) != owner) {}
	
	return ent
}

stock bacon_give_weapon(index, weapon[])
{
	if(!equal(weapon,"weapon_", 7))
		return 0

	static ent
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon))
	
	if(!pev_valid(ent)) 
		return 0
    
	set_pev(ent, pev_spawnflags, SF_NORESPAWN)
	dllfunc(DLLFunc_Spawn, ent)
   
	if(!ExecuteHamB(Ham_AddPlayerItem, index, ent))
	{
		if(pev_valid(ent)) set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
		return 0
	}
	ExecuteHamB(Ham_Item_AttachToPlayer, ent, index)

	return 1
}

stock bacon_strip_weapon(index, weapon[])
{
	if(!equal(weapon, "weapon_", 7)) 
		return 0

	static weaponid 
	weaponid = get_weaponid(weapon)
	
	if(!weaponid) 
		return 0

	static weaponent
	weaponent = fm_find_ent_by_owner(-1, weapon, index)
	
	if(!weaponent) 
		return 0

	if(get_user_weapon(index) == weaponid) 
		ExecuteHamB(Ham_Weapon_RetireWeapon, weaponent)

	if(!ExecuteHamB(Ham_RemovePlayerItem, index, weaponent)) 
		return 0
	
	ExecuteHamB(Ham_Item_Kill, weaponent)
	set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<weaponid))

	return 1
}

stock fm_set_user_team( index, team, update = 1 ) {

	set_pdata_int( index, OFFSET_TEAM, team );

	if( update ) {

		emessage_begin( MSG_ALL, g_msg_teaminfo );
		ewrite_byte( index );
		ewrite_string( g_teaminfo[ team ] );
		emessage_end(  );
	}
	return 1;
}

stock fm_get_user_bpammo(index, weapon)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	return offset ? get_pdata_int(index, offset) : 0
}

stock fm_set_user_bpammo(index, weapon, amount)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	
	if(offset) 
		set_pdata_int(index, offset, amount)
	
	return 1
}

stock fm_set_user_rendering( iEntity, fx = kRenderFxNone, Red = 255, Green = 255, Blue = 255, iRender = kRenderNormal, Amount = 16 ) {

	new Float:RenderColor[ 3 ];
	RenderColor[ 0 ] = float( Red );
	RenderColor[ 1 ] = float( Green );
	RenderColor[ 2 ] = float( Blue );

	set_pev( iEntity, pev_renderfx, fx );
	set_pev( iEntity, pev_rendercolor, RenderColor );
	set_pev( iEntity, pev_rendermode, iRender );
	set_pev( iEntity, pev_renderamt, float( Amount ) );

	return 1;
}

stock fm_set_user_nvg(index, onoff = 1)
{
	static nvg
	nvg = get_pdata_int(index, OFFSET_NVG)
	
	set_pdata_int(index, OFFSET_NVG, onoff == 1 ? nvg | HAS_NVG : nvg & ~HAS_NVG)
	return 1
}

stock fm_set_user_money(index, addmoney, update = 1)
{
	static money
	money = fm_get_user_money(index) + addmoney
	
	set_pdata_int(index, OFFSET_CSMONEY, money)
	
	if(update)
	{
		message_begin(MSG_ONE, g_msg_money, _, index)
		write_long(clamp(money, 0, 16000))
		write_byte(1)
		message_end()
	}
	return 1
}

stock fm_user_team_update(id)
{
	static Float:current_time
	current_time = get_gametime()
	
	if (current_time - g_teams_targettime >= 0.1)
	{
		set_task(0.1, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = current_time + 0.1
	}
	else
	{
		set_task((g_teams_targettime + 0.1) - current_time, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = g_teams_targettime + 0.1
	}
}

public fm_cs_set_user_team_msg(taskid)
{
	// Note to self: this next message can now be received by other plugins
	
	// Set the switching team flag
	g_switchingteam = true
	
	// Tell everyone my new team
	emessage_begin(MSG_ALL, g_msg_teaminfo )
	ewrite_byte(taskid - 1212) // player
	ewrite_string(CS_TEAM_NAMES[fm_get_user_team(taskid - 1212)]) // team
	emessage_end()
	
	// Done switching team
	g_switchingteam = false
}

stock str_count(str[], searchchar)
{
	static maxlen
	maxlen = strlen(str)
	
	static i, count
	count = 0
	
	for(i = 0; i <= maxlen; i++) if(str[i] == searchchar)
		count++

	return count
}

stock reset_user_model(index)
{
	set_pev(index, pev_rendermode, kRenderNormal)
	set_pev(index, pev_renderamt, 0.0)

	if(pev_valid(g_modelent[index]))
		fm_set_entity_visibility(g_modelent[index], 0)
}

stock remove_user_model(ent)
{
	static id
	id = pev(ent, pev_owner)
	
	if(pev_valid(ent)) 
		engfunc(EngFunc_RemoveEntity, ent)

	g_modelent[id] = 0
}

stock set_zombie_attibutes(index)
{
	if(!is_user_alive(index)) 
		return

	g_zombie[index] = true

	if(!task_exists(TASKID_STRIPNGIVE + index))
		set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + index)

	static Float:health
	health = g_class_data[g_player_class[index]][DATA_HEALTH]
	
	if(g_preinfect[index]) 
		health *= get_pcvar_float(cvar_zombie_hpmulti)
	
	set_pev(index, pev_health, health)
	set_pev(index, pev_gravity, g_class_data[g_player_class[index]][DATA_GRAVITY])
	set_pev(index, pev_body, 0)
	set_pev(index, pev_armorvalue, 0.0)
	set_pev(index, pev_renderamt, 0.0)
	set_pev(index, pev_rendermode, kRenderTransTexture)
	
	fm_set_user_armortype(index, CS_ARMOR_NONE)
	fm_set_user_nvg(index)
	
	if(get_pcvar_num(cvar_autonvg)) 
		engclient_cmd(index, "nightvision")
	
	if(!pev_valid(g_modelent[index]))
	{
		static ent
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		if(pev_valid(ent))
		{
			engfunc(EngFunc_SetModel, ent, g_class_pmodel[g_player_class[index]])
			set_pev(ent, pev_classname, MODEL_CLASSNAME)
			set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
			set_pev(ent, pev_aiment, index)
			set_pev(ent, pev_owner, index)
				
			g_modelent[index] = ent
		}
	}
	else
	{
		engfunc(EngFunc_SetModel, g_modelent[index], g_class_pmodel[g_player_class[index]])
		fm_set_entity_visibility(g_modelent[index], 1)
	}

	static effects
	effects = pev(index, pev_effects)
	
	if(effects & EF_DIMLIGHT)
	{
		message_begin(MSG_ONE, g_msg_flashlight, _, index)
		write_byte(0)
		write_byte(100)
		message_end()
		
		set_pev(index, pev_effects, effects & ~EF_DIMLIGHT)
	}

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 1 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

PlaySound( const szSound[  ] ) {

	client_cmd( 0, "spk ^"%s^"", szSound );
}

stock bool:allow_infection()
{
	static count[2]
	count[0] = 0
	count[1] = 0
	
	static index, maxzombies
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(is_user_connected(index) && g_zombie[index]) 
			count[0]++
		else if(is_user_alive(index)) 
			count[1]++
	}
	
	maxzombies = clamp(get_pcvar_num(cvar_maxzombies), 1, 31)
	return (count[0] < maxzombies && count[1] > 1) ? true : false
}

stock randomly_pick_zombie()
{
	static data[4]
	data[0] = 0 
	data[1] = 0 
	data[2] = 0 
	data[3] = 0
	
	static index, players[2][32]
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(!is_user_alive(index)) 
			continue
		
		if(g_zombie[index])
		{
			data[0]++
			players[0][data[2]++] = index
		}
		else 
		{
			data[1]++
			players[1][data[3]++] = index
		}
	}

	if(data[0] > 0 &&  data[1] < 1) 
		return players[0][_random(data[2])]
	
	return (data[0] < 1 && data[1] > 0) ?  players[1][_random(data[3])] : 0
}

stock equipweapon(id, weapon)
{
	if(!is_user_alive(id)) 
		return

	static weaponid[2], weaponent, weapname[32]
	
	if(weapon & EQUIP_PRI)
	{
		weaponent = fm_lastprimary(id)
		weaponid[1] = get_weaponid(g_primaryweapons[g_player_weapons[id][0]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_primaryweapons[g_player_weapons[id][0]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}

	if(weapon & EQUIP_SEC)
	{
		weaponent = fm_lastsecondry(id)
		weaponid[1] = get_weaponid(g_secondaryweapons[g_player_weapons[id][1]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_secondaryweapons[g_player_weapons[id][1]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}
	
	if(weapon & EQUIP_GREN)
	{
		static i
		for(i = 0; i < sizeof g_grenades; i++) if(!user_has_weapon(id, get_weaponid(g_grenades[i])))
			bacon_give_weapon(id, g_grenades[i])
	}
}

stock add_delay(index, const task[])
{
	switch(index)
	{
		case 1..8:   set_task(0.1, task, index)
		case 9..16:  set_task(0.2, task, index)
		case 17..24: set_task(0.3, task, index)
		case 25..32: set_task(0.4, task, index)
	}
}

stock set_biohazard_icon(id, mode, red, green, blue) {

	message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, id);
	write_byte(mode); // status (0=hide, 1=show, 2=flash)
	write_string("dmg_bio"); // sprite name
	write_byte(red); // red
	write_byte(green); // green
	write_byte(blue); // blue
	message_end();
}

stock FixedUnsigned16(Float:flValue, iScale) {
	new iOutput;
	
	iOutput = floatround(flValue * iScale);
	if(iOutput < 0)
		iOutput = 0;
	
	if(iOutput > 0xFFFF)
		iOutput = 0xFFFF;
	return iOutput;
}

stock UTIL_ScreenFade(id=0,iColor[3],Float:flFxTime=-1.0,Float:flHoldTime=0.0,iAlpha=0,iFlags=FFADE_IN,bool:bReliable=false,bool:bExternal=false) {
	if(id && !is_user_connected(id))
		return;
	
	new iFadeTime;
	if(flFxTime == -1.0) {
		iFadeTime = 4;
	}
	else {
		iFadeTime = FixedUnsigned16(flFxTime , 1<<12);
	}
	
	static gmsgScreenFade;
	if(!gmsgScreenFade) {
		gmsgScreenFade = get_user_msgid("ScreenFade");
	}
	
	new MSG_DEST;
	if(bReliable) {
		MSG_DEST = id ? MSG_ONE : MSG_ALL;
	}
	else {
		MSG_DEST = id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST;
	}
	
	if(bExternal) {
		emessage_begin(MSG_DEST, gmsgScreenFade, _, id);
		ewrite_short(iFadeTime);
		ewrite_short(FixedUnsigned16(flHoldTime , 1<<12));
		ewrite_short(iFlags);
		ewrite_byte(iColor[0]);
		ewrite_byte(iColor[1]);
		ewrite_byte(iColor[2]);
		ewrite_byte(iAlpha);
		emessage_end();
	}
	else {
		message_begin(MSG_DEST, gmsgScreenFade, _, id);
		write_short(iFadeTime);
		write_short(FixedUnsigned16(flHoldTime , 1<<12));
		write_short(iFlags);
		write_byte(iColor[0]);
		write_byte(iColor[1]);
		write_byte(iColor[2]);
		write_byte(iAlpha);
		message_end();
	}
}

#if defined GRENADE_STATUS
public GrenadeStatus(  ) {

	// Nade Status Cvar
	cvar_status = register_cvar("bio_nadestatus_icon","1") // [0=Hide | 1=Show | 2=Flash (Don't work with red color)]
	
	// Fire Grenade Cvars
	cvar_fire_icon = register_cvar("bio_firenade_icon","1") // [0=Disable | 1=Enable]
	cvar_fire_color = register_cvar("bio_firenade_color","255 0 0") // Color of Fire Nade in RGB
	
	// Frost Grenade Cvars
	cvar_frost_icon = register_cvar("bio_frostnade_icon","1") // [0=Disable | 1=Enable]
	cvar_frost_color = register_cvar("bio_frostnade_color","100 149 237") // Color of Frost Nade in RGB
	
	// Flare Grenade Cvars
	cvar_flare_icon = register_cvar("bio_flarenade_icon","1") // [0=Disable | 1=Enable]
	cvar_flare_color = register_cvar("bio_flarenade_color","255 255 255") // Color of Flare Nade in RGB

	register_event("CurWeapon", "GrenadeIcon", "be", "1=1")
	
	g_StatusIcon = get_user_msgid("StatusIcon")
}

public GrenadeIcon( id ) {

	RemoveGrenadeIcon( id );
		
	if( is_user_bot( id ) )
		return 1;
		
	static NadeType, GrenadeSprite[ 16 ], Color[ 17 ], Red[ 5 ], Green[ 5 ], Blue[ 5 ];
	NadeType = get_user_weapon( id )
	
	switch( NadeType ) {

		case CSW_HEGRENADE: {

			if( !g_zombie[ id ] ) {

				if( !get_pcvar_num( cvar_fire_icon ) )
					return 1;
				
				GrenadeSprite = "dmg_heat";
				get_pcvar_string( cvar_fire_color, Color, charsmax( Color ) );
				
			}
		}

		case CSW_FLASHBANG: {

			if( !get_pcvar_num( cvar_frost_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_cold";
			get_pcvar_string( cvar_frost_color, Color, charsmax( Color ) );
		}

		case CSW_SMOKEGRENADE: {

			if( !get_pcvar_num( cvar_flare_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_shock";
			get_pcvar_string( cvar_flare_color, Color, charsmax( Color ) );
		}

		default: return 1;
	}

	parse( Color, Red, charsmax( Red ), Green, charsmax( Green ), Blue, charsmax( Blue ) );
	g_GrenadeIcon[ id ] = GrenadeSprite;
	
	message_begin( MSG_ONE, g_StatusIcon, {0, 0, 0 }, id );
	write_byte( get_pcvar_num( cvar_status ) ) // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] ) // Sprite Name
	write_byte( str_to_num( Red ) ) // Red
	write_byte( str_to_num( Green ) ) // Green
	write_byte( str_to_num( Blue ) ) // Blue
	message_end(  );

	return 1;
}

public RemoveGrenadeIcon( id ) {

	message_begin( MSG_ONE, g_StatusIcon, { 0, 0, 0 },id );
	write_byte( 0 ); // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] );
	message_end(  )
}
#endif

stock HudMessage(const id, const message[], red = 0, green = 160, blue = 0, Float:x = -1.0, Float:y = 0.65, effects = 2, Float:fxtime = 0.01, Float:holdtime = 3.0, Float:fadeintime = 0.01, Float:fadeouttime = 0.01) {
	new count = 1, players[32];
	
	if(id) players[0] = id;
	else get_players(players, count, "ch"); {
		for(new i = 0; i < count; i++) {
			if(is_user_connected(players[i])) {	
				new color = pack_color(clamp_byte(red), clamp_byte(green), clamp_byte(blue))
				
				message_begin(MSG_ONE_UNRELIABLE, SVC_DIRECTOR, _, players[i]);
				write_byte(strlen(message) + 31);
				write_byte(DRC_CMD_MESSAGE);
				write_byte(effects);
				write_long(color);
				write_long(_:x);
				write_long(_:y);
				write_long(_:fadeintime);
				write_long(_:fadeouttime);
				write_long(_:holdtime);
				write_long(_:fxtime);
				write_string(message);
				message_end();
			}
		}
	}
}

stock ColorChat( const id, const input[  ], any:... ) {

	new iCount = 1, szPlayers[ 32 ];
	static szMsg[ 191 ];

	vformat( szMsg, 190, input, 3 );

	replace_all( szMsg, 190, "!4", "^4" );
	replace_all( szMsg, 190, "!1", "^1" );
	replace_all( szMsg, 190, "!3", "^3" );

	if( id ) {
		szPlayers[ 0 ] = id;
	} else {
		get_players( szPlayers, iCount, "ch" );
	}

	for( new i = 0; i < iCount; i++ ) {

		if( is_user_connected( szPlayers[ i ] ) ) {

			message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, szPlayers[ i ] );
			write_byte( szPlayers[ i ] );
			write_string( szMsg );
			message_end(  );
		}
	}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1048\\ f0\\ fs16 \n\\ par }
*/
[/code]


Dupa care am intrat aici http://www.amxmodx.org/webcompiler.cgi si l-am compilat.

Cand pornesc serverul, imi arata la fel:

Image

Daca poti da-mi add pe y!m: lover_pro14 , si iti dau teamviewer , poate am gresit eu cu ceva la instelare..
User avatar
Doctor whO? <3
Membru, skill +3
Membru, skill +3
Posts: 1196
Joined: 21 Jun 2013, 12:40
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Reputatie: Fost Membru Club eXtreamCS (doua luni)
Has thanked: 109 times
Been thanked: 75 times
Contact:

30 Jul 2014, 03:41

prolover14 wrote:Deci mi-am luat ip-ul de pe un site

Image

Dupa care am intrat in biohazard.sma si in locul ip-ului de acolo l-am adaugat pe al meu.
| Afiseaza codul
[code]/* Biohazard - Zombie Mod, Classic Infection with new modes
 * Author: cheap_suit, CO-Author: The YONTU
 * Credits: sDs|Aragon* */

#define PLUGIN_NAME	"Biohazard - Zombie Mod"
#define PLUGIN_VERSION	"3.1"
#define PLUGIN_AUTHOR	"cheap_suit"

#include < amxmodx >
#include < amxmisc >
#include < fakemeta >
#include < hamsandwich >
#include < xs >

native get_user_golds( id );
native is_user_vip( id );

static const ServerLicensedIp[  ] = "84.117.38.30";

// Aici eliminati/adaugati slash-urile(//) din fata linii daca vreti sa fie activate/dezactivate
#define ULTRA_BLOOD	// Sare mai mult sange cand infectezi
#define GRENADE_STATUS	// Cand tii o grenada in mana in stanga sus va aparea o imagine specifica grenadei

#define FOG_ENABLE  	     1
#define FOG_DENSITY	    "0.0025"
#define FOG_COLOR   	    "128 128 128"	//"127 170 255"

#define DEFAULT_PMODEL	    "models/player/bio30_zombie/bio30_zombie.mdl"	// Zombie Model
#define DEFAULT_WMODEL	    "models/player/bio30_zombie/claws_zombie.mdl"	// Zombie Hands

#define DEFAULT_HEALTH		400.0	// Health value
#define DEFAULT_SPEED		290.0	// Speed value
#define DEFAULT_GRAVITY		0.8	// Gravity multiplier
#define DEFAULT_ATTACK		2.0	// Zombie damage multiplier
#define DEFAULT_REGENDLY	0.18	// Regeneration delay value
#define DEFAULT_KNOCKBACK	1.0	// Knockback multiplier
#define DEFAULT_NOFLASH	1.0	// Set 1.0 for Zombie No flash
#define DEFAULT_ONLYVIP		0.0	// Set 1.0 for Zombie Class Only VIP

#define clamp_byte(%1)		( clamp( %1, 0, 255 ) )
#define pack_color(%1,%2,%3)	( %3 + ( %2 << 8 ) + ( %1 << 16 ) )

#define FFADE_IN			0x0000	// Just here so we don't pass 0 into the function
#define FFADE_OUT		0x0001	// Fade out (not in)
#define FFADE_MODULATE		0x0002	// Modulate (don't blend)
#define FFADE_STAYOUT		0x0004	// ignores the duration, stays faded out until new ScreenFade message received
#define UNIT_SECOND		(1<<12)

#define OFFSET_DEATH 		444
#define OFFSET_TEAM 		114
#define OFFSET_ARMOR 		112
#define OFFSET_NVG 		129
#define OFFSET_CSMONEY 		115
#define OFFSET_PRIMARYWEAPON 	116
#define OFFSET_WEAPONTYPE 	43
#define OFFSET_CLIPAMMO		51
#define EXTRAOFFSET_WEAPONS 	4

#define OFFSET_AMMO_338MAGNUM 	377
#define OFFSET_AMMO_762NATO 		378
#define OFFSET_AMMO_556NATOBOX 	379
#define OFFSET_AMMO_556NATO 		380
#define OFFSET_AMMO_BUCKSHOT 		381
#define OFFSET_AMMO_45ACP 		382
#define OFFSET_AMMO_57MM 		383
#define OFFSET_AMMO_50AE 		384
#define OFFSET_AMMO_357SIG 		385
#define OFFSET_AMMO_9MM 		386

#define OFFSET_LASTPRIM 	368
#define OFFSET_LASTSEC 		369
#define OFFSET_LASTKNI 		370

#define TASKID_COUNTDOWN		452
#define TASKID_STRIPNGIVE		698
#define TASKID_NEWROUND		641
#define TASKID_INITROUND 		222
#define TASKID_STARTROUND 		153
#define TASKID_BALANCETEAM 		375
#define TASKID_UPDATESCR 		264
#define TASKID_SPAWNDELAY 		786
#define TASKID_WEAPONSMENU 		564
#define TASKID_CHECKSPAWN 		423
#define TASKID_CZBOTPDATA 		312
#define TASK_GLOW_DIE			1212

#define EQUIP_PRI 	(1<<0)
#define EQUIP_SEC 	(1<<1)
#define EQUIP_GREN 	(1<<2)
#define EQUIP_ALL 	(1<<0 | 1<<1 | 1<<2)

#define HAS_NVG 	(1<<0)
#define ATTRIB_BOMB 	(1<<1)
#define DMG_HEGRENADE 	(1<<24)

#define MODEL_CLASSNAME 	"player_model"
#define IMPULSE_FLASHLIGHT 	100

#define MAX_SPAWNS 	128
#define MAX_CLASSES 	14
#define MAX_DATA 	13

#define DATA_HEALTH 	0
#define DATA_SPEED 	1
#define DATA_GRAVITY 	2
#define DATA_ATTACK 	3
#define DATA_REGENDLY 	4
#define DATA_KNOCKBACK 	5
#define DATA_NOFLASH 	6
#define DATA_ONLYVIP 	7

#define fm_get_user_team(%1) get_pdata_int(%1, OFFSET_TEAM)
#define fm_get_user_deaths(%1) get_pdata_int(%1, OFFSET_DEATH)
#define fm_set_user_deaths(%1,%2) set_pdata_int(%1, OFFSET_DEATH, %2)
#define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CSMONEY)
#define fm_get_user_armortype(%1) get_pdata_int(%1, OFFSET_ARMOR)
#define fm_set_user_armortype(%1,%2) set_pdata_int(%1, OFFSET_ARMOR, %2)
#define fm_get_weapon_id(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define fm_get_weapon_ammo(%1) get_pdata_int(%1, OFFSET_CLIPAMMO, EXTRAOFFSET_WEAPONS)
#define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
#define fm_reset_user_primary(%1) set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
#define fm_lastprimary(%1) get_pdata_cbase(id, OFFSET_LASTPRIM)
#define fm_lastsecondry(%1) get_pdata_cbase(id, OFFSET_LASTSEC)
#define fm_lastknife(%1) get_pdata_cbase(id, OFFSET_LASTKNI)
#define fm_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), "model", %2, %3) 

#define _random(%1) random_num(0, %1 - 1)
#define AMMOWP_NULL (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)

enum
{
	MAX_CLIP = 0,
	MAX_AMMO
}

enum
{
	MENU_PRIMARY = 1,
	MENU_SECONDARY
}

enum
{
	CS_TEAM_UNASSIGNED = 0,
	CS_TEAM_T,
	CS_TEAM_CT,
	CS_TEAM_SPECTATOR
}

enum
{
	CS_ARMOR_NONE = 0,
	CS_ARMOR_KEVLAR,
	CS_ARMOR_VESTHELM
}

enum
{
	KBPOWER_357SIG = 0,
	KBPOWER_762NATO,
	KBPOWER_BUCKSHOT,
	KBPOWER_45ACP,
	KBPOWER_556NATO,
	KBPOWER_9MM,
	KBPOWER_57MM,
	KBPOWER_338MAGNUM,
	KBPOWER_556NATOBOX,
	KBPOWER_50AE
}

new g_zombie_weapname[] = "melee"
new g_infection_name[]  = "infection"

// primary weapons (menu|game)
new g_primaryweapons[][][] = 
{ 
	{ "M4A1 Carbine",     "weapon_m4a1"    },
	{ "AK-47 Kalashnikov",     "weapon_ak47"    },
	{ "Steyr AUG A1",      "weapon_aug"     },
	{ "SG-552 Commando",    "weapon_sg552"   },
	//{ "Galil",    "weapon_galil"   },
	{ "Famas",    "weapon_famas"   },
	{ "MP5 Navy", "weapon_mp5navy" },
	{ "XM1014 M4",   "weapon_xm1014"  },
	{ "M3 Super 90",       "weapon_m3"      },
	//{ "P90",      "weapon_p90"     },
	{ "M249 Para Machinegun",     "weapon_m249"    },
	{ "SG-550 Auto-Sniper",    "weapon_sg550"   },
	{ "G3SG1 Auto-Sniper",    "weapon_g3sg1"   },
	{ "AWP Magnum Sniper",    "weapon_awp"   }	
}

// secondary weapons (menu|game)
new g_secondaryweapons[][][] = 
{ 
	{ "Desert Eagle .50 AE",   "weapon_deagle"  },
	{ "USP .45 ACP Tactical",      "weapon_usp"     },
	{ "Dual Elite Berettas",    "weapon_elite"   },
	{ "Glock 18C",    "weapon_glock18"   }
}

// grenade loadout (game)
new g_grenades[][] = 
{ 
	"weapon_hegrenade",
	"weapon_flashbang",
	"weapon_smokegrenade"
}

new Float:g_knockbackpower[] =
{
	3.0,  // KBPOWER_357SIG
	4.0,  // KBPOWER_762NATO
	9.5,  // KBPOWER_BUCKSHOT
	3.0,  // KBPOWER_45ACP
	4.5,  // KBPOWER_556NATO
	3.0,  // KBPOWER_9MM
	3.5,  // KBPOWER_57MM
	12.0, // KBPOWER_338MAGNUM
	4.0,  // KBPOWER_556NATOBOX
	3.8   // KBPOWER_50AE
}

new g_appear_sounds[  ][  ] = {

	"Biohazard30/zombie_coming_1.wav",
	"Biohazard30/zombie_coming_2.wav",
	"Biohazard30/zombie_coming_3.wav",
	"Biohazard30/zombie_comeback.wav"
}

new g_survivor_win_sounds[][] =
{
	"Biohazard30/survivor_win1.wav",
	"Biohazard30/survivor_win2.wav",
	"Biohazard30/survivor_win3.wav"
}

new g_zombie_win_sounds[][] = 
{ 
	"Biohazard30/zombie_win1.wav",
	"Biohazard30/zombie_win2.wav",
	"Biohazard30/zombie_win3.wav"	
}

new g_scream_sounds[][] = 
{ 
	"Biohazard30/zombie_infec1.wav",
	"Biohazard30/zombie_infec2.wav",
	"Biohazard30/zombie_infec3.wav"
}

new g_zombie_miss_sounds[][] = 
{ 
	"zombie/claw_miss1.wav",
	"zombie/claw_miss2.wav"				
}

new g_zombie_hit_sounds[][] = 
{ 
	"zombie/claw_strike1.wav",
	"zombie/claw_strike2.wav",
	"zombie/claw_strike3.wav"
}

new g_zombie_die_sounds[][] = 
{
	"Biohazard30/zombie_die1.wav",
	"Biohazard30/zombie_die2.wav",
	"Biohazard30/zombie_die3.wav",
	"Biohazard30/zombie_die4.wav",
	"Biohazard30/zombie_die5.wav"
}

new CountDownSounds[][] = {

	"Biohazard30/Countdown/timer01.wav",
	"Biohazard30/Countdown/timer02.wav",
	"Biohazard30/Countdown/timer03.wav",
	"Biohazard30/Countdown/timer04.wav",
	"Biohazard30/Countdown/timer05.wav",
	"Biohazard30/Countdown/timer06.wav",
	"Biohazard30/Countdown/timer07.wav",
	"Biohazard30/Countdown/timer08.wav",
	"Biohazard30/Countdown/timer09.wav",
	"Biohazard30/Countdown/timer10.wav"
}

new const g_weapon_ammo[  ][  ] = {

	{ -1, -1 },	// NULL
	{ 13, 52 },	// CSW_P228
	{ -1, -1 },	// NULL
	{ 15, 75 },	// CSW_SCOUT
	{ -1, -1 },	// CSW_HEGRENADE
	{ 15, 30 },	// CSW_XM1014
	{ -1, -1 },	// CSW_C4
	{ 35, 140 },	// CSW_MAC10
	{ 40, 120 },	// CSW_AUG
	{ -1, -1 },	// CSW_SMOKEGRENADE
	{ 30, 150 },	// CSW_ELITE
	{ 20, 100 },	// CSW_FIVESEVEN
	{ 25, 100 },	// CSW_UMP45
	{ 40, 80 },	// CSW_SG550
	{ 40, 160 },	// CSW_GALIL
	{ 30, 120 },	// CSW_FAMAS
	{ 20, 160 },	// CSW_USP
	{ 20, 120 },	// CSW_GLOCK18
	{ 3, 30 },	// CSW_AWP
	{ 40, 120 },	// CSW_MP5NAVY
	{ 100, 200 },	// CSW_M249
	{ 13, 39 },	// CSW_M3
	{ 45, 90 },	// CSW_M4A1
	{ 30, 120 },	// CSW_TMP
	{ 20, 60 },	// CSW_G3SG1
	{ -1, -1 },	// CSW_FLASHBANG
	{ 15, 45 },	// CSW_DEAGLE
	{ 25, 125 },	// CSW_SG552
	{ 40, 120 },	// CSW_AK47
	{ -1, -1 },	// CSW_KNIFE
	{ 50, 130 }	// CSW_P90
}

new const g_weapon_knockback[] =
{
	-1, 
	KBPOWER_357SIG, 
	-1, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_BUCKSHOT, 
	-1, 
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	-1, 
	KBPOWER_9MM, 
	KBPOWER_57MM,
	KBPOWER_45ACP, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_556NATO, 
	KBPOWER_45ACP,
	KBPOWER_9MM, 
	KBPOWER_338MAGNUM,
	KBPOWER_9MM, 
	KBPOWER_556NATOBOX,
	KBPOWER_BUCKSHOT, 
	KBPOWER_556NATO, 
	KBPOWER_9MM, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_50AE, 
	KBPOWER_556NATO, 
	KBPOWER_762NATO, 
	-1, 
	KBPOWER_57MM
}

new const CS_TEAM_NAMES[  ][  ] = {

	  "UNASSIGNED"
	, "TERRORIST"
	, "CT"
	, "SPECTATOR"
}

new const g_remove_entities[][] = 
{ 
	"func_bomb_target",    
	"info_bomb_target", 
	"hostage_entity",      
	"monster_scientist", 
	"func_hostage_rescue", 
	"info_hostage_rescue",
	"info_vip_start",      
	"func_vip_safetyzone", 
	"func_escapezone",     
	"func_buyzone"
}

new const g_dataname[][] = 
{ 
	"HEALTH", 
	"SPEED", 
	"GRAVITY", 
	"ATTACK", 
	"REGENDLY", 
	"KNOCKBACK",
	"NOFLASH",
	"ONLYVIP"
}

new const g_teaminfo[][] = 
{ 
	"UNASSIGNED", 
	"TERRORIST",
	"CT",
	"SPECTATOR" 
}

new SkyTermination[  ][  ] = {

	"bk",
	"dn",
	"ft",
	"lf",
	"rt",
	"up"
}

// Global Vars
new CountDownDelay;
new g_maxplayers;
new g_spawncount;
new g_buyzone;
new g_botclient_pdata;
new g_menuposition[33];
new g_player_weapons[33][2];

// Sync HUD
new g_sync_hpdisplay;
new g_sync_msgdisplay;

// Forwards
new g_fwd_spawn;
new g_fwd_result;
new g_fwd_infect;
new g_fwd_gamestart; 

// Messages
new g_msg_flashlight;
new g_msg_teaminfo;
new g_msg_scoreattrib;
new g_msg_money;
new g_msg_scoreinfo;
new g_msg_deathmsg;
new g_msg_screenfade;

new Float:g_buytime;
new Float:g_spawns[MAX_SPAWNS+1][9];
new Float:g_vecvel[3];
new Float:g_teams_targettime;
new g_switchingteam;

// Global Booleans without parametres
new bool:g_brestorevel;
new bool:g_infecting;
new bool:g_gamestarted;
new bool:g_roundstarted;
new bool:g_roundended;
new bool:g_czero;

// Global Booleans with parametres
new bool:g_disconnected[33];	// Is user Disconnected
new bool:g_blockmodel[33];	// Block Model ?
new bool:g_showmenu[33];	// Show menu ?
new bool:g_menufailsafe[33];	// Show menu fail ?
new bool:g_welcomemsg[33];	// Display welcom msg ?
new bool:g_suicide[33];	// Is user suicided ?

// Zombie Classes & Zombie Configuration
new bool:g_zombie[33];	// Is user Zombie ?
new bool:g_falling[33];	// Is user Touch floor ?
new bool:g_preinfect[33];	// Is user preinfect ?
new g_classcount;
new g_class_name[MAX_CLASSES+1][32];
new g_class_desc[MAX_CLASSES+1][32];
new g_class_pmodel[MAX_CLASSES+1][64];
new g_class_wmodel[MAX_CLASSES+1][64];
new Float:g_class_data[MAX_CLASSES+1][MAX_DATA];
new g_player_class[33];
new Float:g_regendelay[33];
//new Float:g_hitdelay[33];
new g_mutate[33];
new g_victim[33];
new g_modelent[33];

// Cvars
new cvar_randomspawn;
new cvar_skyname;
new cvar_autoteambalance[4];
new cvar_starttime;
new cvar_countdown;
new cvar_autonvg;
new cvar_winsounds;
new cvar_weaponsmenu;
new cvar_lights;
new cvar_killbonus;
new cvar_enabled;
new cvar_gamedescription;
new cvar_botquota;
new cvar_maxzombies;
new cvar_flashbang;
new cvar_buytime;
new cvar_respawnaszombie;
new cvar_punishsuicide;
new cvar_infectmoney;
new cvar_showtruehealth;
new cvar_obeyarmor;
new cvar_impactexplode;
new cvar_caphealthdisplay;
new cvar_zombie_hpmulti;
new cvar_randomclass;
new cvar_zombiemulti;
new cvar_ammo;
new cvar_killreward;
new cvar_painshockfree;
new cvar_zombie_class;
// Knock back system
new cvar_shootobjects;
new cvar_pushpwr_weapon;
new cvar_pushpwr_zombie;
new cvar_knockback_duck;
new cvar_knockback;
new cvar_knockback_dist;
new cvar_biohazard_icon;
new cvar_entrie_class_vip;
new cvar_zombie_appear_sound;

#if defined GRENADE_STATUS
// Cvars
new cvar_status;
new cvar_fire_icon;
new cvar_fire_color;
new cvar_frost_icon;
new cvar_frost_color;
new cvar_flare_icon;
new cvar_flare_color;
// Vars
new g_StatusIcon;
new g_GrenadeIcon[ 33 ][ 32 ];
#endif

public plugin_precache()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_plugin( PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR );
		register_cvar( "bh_version", PLUGIN_VERSION, FCVAR_SPONLY|FCVAR_SERVER );
		set_cvar_string( "bh_version", PLUGIN_VERSION );
	
		cvar_enabled = register_cvar("bh_enabled", "1")

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_gamedescription = register_cvar("bh_gamedescription", "Biohazard v3.1b")
		cvar_skyname = register_cvar("bh_skyname", "siv2")
		cvar_lights = register_cvar("bh_lights", "d")
		cvar_starttime = register_cvar("bh_starttime", "15.0")
		cvar_countdown = register_cvar("bh_countdown", "1")
		cvar_buytime = register_cvar("bh_buytime", "0")
		cvar_randomspawn = register_cvar("bh_randomspawn", "1")
		cvar_punishsuicide = register_cvar("bh_punishsuicide", "1")
		cvar_winsounds = register_cvar("bh_winsounds", "1")
		cvar_autonvg = register_cvar("bh_autonvg", "1")
		cvar_respawnaszombie = register_cvar("bh_respawnaszombie", "1")
		cvar_painshockfree = register_cvar("bh_painshockfree", "1")
		cvar_knockback = register_cvar("bh_knockback", "1")
		cvar_knockback_duck = register_cvar("bh_knockback_duck", "1")
		cvar_knockback_dist = register_cvar("bh_knockback_dist", "280.0")
		cvar_obeyarmor = register_cvar("bh_obeyarmor", "0")
		cvar_infectmoney = register_cvar("bh_infectionmoney", "1000")
		cvar_biohazard_icon = register_cvar("bh_biohazard_icon", "1")
		cvar_caphealthdisplay = register_cvar("bh_caphealthdisplay", "1")
		cvar_weaponsmenu = register_cvar("bh_weaponsmenu", "1")
		cvar_ammo = register_cvar("bh_ammo", "1")
		cvar_maxzombies = register_cvar("bh_maxzombies", "31")
		cvar_flashbang = register_cvar("bh_flashbang", "1")
		cvar_impactexplode = register_cvar("bh_impactexplode", "1")
		cvar_showtruehealth = register_cvar("bh_showtruehealth", "1")
		cvar_zombiemulti = register_cvar("bh_zombie_countmulti", "0.15")
		cvar_zombie_hpmulti = register_cvar("bh_zombie_hpmulti", "10000.0")
		cvar_zombie_class = register_cvar("bh_zombie_class", "1")
		cvar_randomclass = register_cvar("bh_randomclass", "1")
		cvar_killbonus = register_cvar("bh_kill_bonus", "1")
		cvar_killreward = register_cvar("bh_kill_reward", "2")
		cvar_shootobjects = register_cvar("bh_shootobjects", "1")
		cvar_pushpwr_weapon = register_cvar("bh_pushpwr_weapon", "2.0")
		cvar_pushpwr_zombie = register_cvar("bh_pushpwr_zombie", "5.0")
		cvar_entrie_class_vip = register_cvar("bh_entrie_class_only_vip", "0")
		cvar_zombie_appear_sound = register_cvar( "bh_zombie_appear_sound", "2" );
	
		new file[64]
		get_configsdir(file, 63)
		format(file, 63, "%s/bh_cvars.cfg", file)
	
		if(file_exists(file)) 
			server_cmd( "exec %s", file)
	
		new mapname[32]
		get_mapname(mapname, 31)
		register_spawnpoints(mapname)
		
		register_zombieclasses("bh_zombieclass.ini")
		register_dictionary("biohazard.txt")
	
		precache_model(DEFAULT_PMODEL)
		precache_model(DEFAULT_WMODEL)
	
		new i
		for(i = 0; i < g_classcount; i++)
		{
			precache_model(g_class_pmodel)
			precache_model(g_class_wmodel)
		}

		for( i = 0; i < sizeof g_appear_sounds; i++ )
			precache_sound( g_appear_sounds[ i ] );
	
		for(i = 0; i < sizeof g_zombie_miss_sounds; i++)
			precache_sound(g_zombie_miss_sounds)
	
		for(i = 0; i < sizeof g_zombie_hit_sounds; i++) 
			precache_sound(g_zombie_hit_sounds)
	
		for(i = 0; i < sizeof g_scream_sounds; i++) 
			precache_sound(g_scream_sounds)
	
		for(i = 0; i < sizeof g_zombie_die_sounds; i++)
			precache_sound(g_zombie_die_sounds)
	
		for(i = 0; i < sizeof g_zombie_win_sounds; i++) 
			precache_sound(g_zombie_win_sounds)

		for(i = 0; i < sizeof CountDownSounds; i++)
			precache_sound(CountDownSounds)

		for(i = 0; i < sizeof g_survivor_win_sounds; i++)
			precache_sound(g_survivor_win_sounds)

		// Sky Changer
		new SkyName[ 32 ];
		get_pcvar_string( cvar_skyname, SkyName, 31 );
	
		if( strlen( SkyName ) > 0 )
			set_cvar_string( "sv_skyname", SkyName );

		for( i = 0; i < sizeof SkyTermination; ++i ) {

			new Sky[ 64 ];
			formatex( Sky, sizeof( Sky ) - 1, "gfx/env/%s%s.tga", SkyName, SkyTermination[ i ] );
			precache_generic( Sky );
		}
	
		g_fwd_spawn = register_forward(FM_Spawn, "fwd_spawn")
	
		g_buyzone = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"))
		if(g_buyzone) 
		{
			dllfunc(DLLFunc_Spawn, g_buyzone)
			set_pev(g_buyzone, pev_solid, SOLID_NOT)
		}
	
		new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_bomb_target"))
		if(ent) 
		{
			dllfunc(DLLFunc_Spawn, ent)
			set_pev(ent, pev_solid, SOLID_NOT)
		}

		#if FOG_ENABLE
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
		if(ent)
		{
			fm_set_kvd(ent, "density", FOG_DENSITY, "env_fog")
			fm_set_kvd(ent, "rendercolor", FOG_COLOR, "env_fog")
		}
		#endif
	}
}

public plugin_init()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		if(!get_pcvar_num(cvar_enabled)) 
			return
	
		cvar_botquota = get_cvar_pointer("bot_quota")
		cvar_autoteambalance[0] = get_cvar_pointer("mp_autoteambalance")
		cvar_autoteambalance[1] = get_pcvar_num(cvar_autoteambalance[0])
		set_pcvar_num(cvar_autoteambalance[0], 0)

		register_clcmd("jointeam", "cmd_jointeam")
		register_clcmd("say /class", "cmd_classmenu")
		register_clcmd("say_team /class", "cmd_classmenu")
		register_clcmd("say /guns", "cmd_enablemenu")
		register_clcmd("say_team /guns", "cmd_enablemenu")
		register_clcmd("say /help", "cmd_helpmotd")
		register_clcmd("amx_infect", "cmd_infectuser", ADMIN_BAN, "<name or #userid>")
	
		register_menu("Equipment", 1023, "action_equip")
		register_menu("Primary", 1023, "action_prim")
		register_menu("Secondary", 1023, "action_sec")
	
		unregister_forward(FM_Spawn, g_fwd_spawn)
		register_forward(FM_CmdStart, "fwd_cmdstart")
		register_forward(FM_EmitSound, "fwd_emitsound")
		register_forward(FM_GetGameDescription, "fwd_gamedescription")
		register_forward(FM_CreateNamedEntity, "fwd_createnamedentity")
		register_forward(FM_ClientKill, "fwd_clientkill")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink")
		register_forward(FM_PlayerPreThink, "fwd_player_prethink_post", 1)
		register_forward(FM_PlayerPostThink, "fwd_player_postthink")
		register_forward(FM_SetClientKeyValue, "fwd_setclientkeyvalue")

		RegisterHam(Ham_TakeDamage, "player", "bacon_takedamage_player")
		RegisterHam(Ham_Killed, "player", "bacon_killed_player")
		RegisterHam(Ham_Spawn, "player", "bacon_spawn_player_post", 1)
		RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
		RegisterHam(Ham_TraceAttack, "func_pushable", "bacon_traceattack_pushable")
		RegisterHam(Ham_Use, "func_tank", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankmortar", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tankrocket", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_tanklaser", "bacon_use_tank")
		RegisterHam(Ham_Use, "func_pushable", "bacon_use_pushable")
		RegisterHam(Ham_Touch, "func_pushable", "bacon_touch_pushable")
		RegisterHam(Ham_Touch, "weaponbox", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "armoury_entity", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "weapon_shield", "bacon_touch_weapon")
		RegisterHam(Ham_Touch, "grenade", "bacon_touch_grenade")
		RegisterHam(Ham_Item_Deploy , "weapon_knife", "bacon_claws_deploy_post", 1);

		register_message(get_user_msgid("Health"), "msg_health")
		register_message(get_user_msgid("TextMsg"), "msg_textmsg")
		register_message(get_user_msgid("SendAudio"), "msg_sendaudio")
		register_message(get_user_msgid("StatusIcon"), "msg_statusicon")
		register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
		register_message(get_user_msgid("DeathMsg"), "msg_deathmsg")
		register_message(get_user_msgid("ScreenFade"), "msg_screenfade")
		register_message(get_user_msgid("TeamInfo"), "msg_teaminfo")
		register_message(get_user_msgid("ClCorpse"), "msg_clcorpse")
		register_message(get_user_msgid("WeapPickup"), "msg_weaponpickup")
		register_message(get_user_msgid("AmmoPickup"), "msg_ammopickup")

		register_event("TextMsg", "event_textmsg", "a", "2=#Game_will_restart_in")
		register_event("HLTV", "event_newround", "a", "1=0", "2=0")
		register_event("CurWeapon", "event_curweapon", "be", "1=1")
		register_event("ArmorType", "event_armortype", "be")
		register_event("Damage", "event_damage", "be")
	
		register_logevent("logevent_round_start", 2, "1=Round_Start")
		register_logevent("logevent_round_end", 2, "1=Round_End")
	
		g_msg_flashlight = get_user_msgid("Flashlight")
		g_msg_teaminfo = get_user_msgid("TeamInfo")
		g_msg_scoreattrib = get_user_msgid("ScoreAttrib")
		g_msg_scoreinfo = get_user_msgid("ScoreInfo")
		g_msg_deathmsg = get_user_msgid("DeathMsg")
		g_msg_money = get_user_msgid("Money")
		g_msg_screenfade = get_user_msgid("ScreenFade")
	
		g_fwd_infect = CreateMultiForward("event_infect", ET_IGNORE, FP_CELL, FP_CELL)
		g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_IGNORE)

		g_sync_hpdisplay = CreateHudSyncObj()
		g_sync_msgdisplay = CreateHudSyncObj()
	
		g_maxplayers = get_maxplayers()
	
		new mod[3]
		get_modname(mod, 2)
		g_czero = (mod[0] == 'c' && mod[1] == 'z') ? true : false
	
		// Lights Map
		new lights[2]
		get_pcvar_string(cvar_lights, lights, 1)
	
		if(strlen(lights) > 0)
		{
			set_task(3.0, "task_lights", _, _, _, "b")
		
			set_cvar_num("sv_skycolor_r", 0)
			set_cvar_num("sv_skycolor_g", 0)
			set_cvar_num("sv_skycolor_b", 0)
		}
	
		// Show Details
		if(get_pcvar_num(cvar_showtruehealth))
			set_task(0.1, "task_showtruehealth", _, _, _, "b")

#if defined GRENADE_STATUS
		GrenadeStatus(  );
#endif

		server_print( "[Biohazard 3.1] Felicitari! Detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
	} else {

		server_print( "[Biohazard 3.1] Nu detii o licenta valida pentru pluginul '%s'.", PLUGIN_NAME );
		server_print( "[Biohazard 3.1] Pentru mai multe detalii contacteaza-ma la Y!M: [email protected] !" );

		pause( "ade" );
	}
}

public plugin_end()
	if(get_pcvar_num(cvar_enabled))
		set_pcvar_num(cvar_autoteambalance[0], cvar_autoteambalance[1])

public plugin_natives()
{
	new GetUserIp[ 25 ];
	get_user_ip( 0, GetUserIp, sizeof( GetUserIp ) - 1, 1 );

	if( equal( GetUserIp, ServerLicensedIp ) ) {

		register_library("biohazardf")
		register_native("preinfect_user", "native_preinfect_user", 1)
		register_native("infect_user", "native_infect_user", 1)
		register_native("cure_user", "native_cure_user", 1)
		register_native("register_class", "native_register_class", 1)
		register_native("get_class_id", "native_get_class_id", 1)
		register_native("set_class_pmodel", "native_set_class_pmodel", 1)
		register_native("set_class_wmodel", "native_set_class_wmodel", 1)
		register_native("set_class_data", "native_set_class_data", 1)
		register_native("get_class_data", "native_get_class_data", 1)
		register_native("game_started", "native_game_started", 1)
		register_native("is_user_zombie", "native_is_user_zombie", 1)
		register_native("is_user_infected", "native_is_user_infected", 1)
		register_native("get_user_class", "native_get_user_class",  1)
		register_native("get_humans", "native_get_humans", 1)
		register_native("get_zombies", "native_get_zombies", 1)
	}
}

public client_connect(id)
{
	g_showmenu[id] = true
	g_welcomemsg[id] = true
	g_blockmodel[id] = true
	g_zombie[id] = false
	g_preinfect[id] = false
	g_disconnected[id] = false
	g_falling[id] = false
	g_menufailsafe[id] = false
	g_victim[id] = 0
	g_mutate[id] = -1
	g_player_class[id] = 0
	g_player_weapons[id][0] = -1
	g_player_weapons[id][1] = -1
	g_regendelay[id] = 0.0

	remove_user_model(g_modelent[id])
}

public client_putinserver(id)
{
	if(!g_botclient_pdata && g_czero) 
	{
		static param[1]
		param[0] = id
		
		if(!task_exists(TASKID_CZBOTPDATA))
			set_task(1.0, "task_botclient_pdata", TASKID_CZBOTPDATA, param, 1)
	}

	if( get_pcvar_num( cvar_entrie_class_vip ) ) {

		if( g_classcount > 1 ) {
		
			new HaveClass = false;
		
			if( is_user_bot( id ) )
				return 1;

			for( new i = 0; i < g_classcount; i++ ) {

				if( g_class_data[ i ][ DATA_ONLYVIP ] == 0.0 && is_user_vip( id ) || g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 ) {

					g_player_class[ id ] = i;
					HaveClass = true;
				}
			}
		
			if( !HaveClass ) {
				
				if( get_pcvar_num( cvar_randomclass ) && g_classcount > 1 ) {
					
					g_player_class[ id ] = _random( g_classcount );
				}
			}
		}
	}

	return 0;
}

public client_disconnect(id)
{
	remove_task(TASKID_STRIPNGIVE + id)
	remove_task(TASKID_UPDATESCR + id)
	remove_task(TASKID_SPAWNDELAY + id)
	remove_task(TASKID_WEAPONSMENU + id)
	remove_task(TASKID_CHECKSPAWN + id)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );

	g_disconnected[id] = true
	remove_user_model(g_modelent[id])
}

public cmd_jointeam(id)
{
	if(is_user_alive(id) && g_zombie[id])
	{
		ColorChat( id, "%L", id, "CMD_TEAMCHANGE")
		return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public cmd_classmenu( id ) {

	if( is_user_connected( id ) && g_classcount ) {
		
		new ClassMenuTitle[ 64 ];
		new ClassMenu;
		
		formatex( ClassMenuTitle, sizeof( ClassMenuTitle ) - 1, "\r%L", 0, "MENU_TITLE4" );
		ClassMenu = menu_create( ClassMenuTitle, "ClassCmd" );
		
		for( new i = 0; i < g_classcount; ++i ) {
			
			new ClassInfo[ 512 ];
			
			if( g_class_data[ i ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) )
				formatex( ClassInfo, sizeof( ClassInfo ) - 1,"\d%s (\d%s) - \rOnly VIP", g_class_name[ i ], g_class_desc[ i ] );
			else
				formatex( ClassInfo, sizeof( ClassInfo ) - 1, "\w%s \r(\y%s\r)", g_class_name[ i ], g_class_desc[ i ] );
			
			new Num[ 64 ];
			formatex( Num, sizeof( Num ) - 1, "%d", i );
			menu_additem( ClassMenu, ClassInfo, Num, 0 );
		}
		
		menu_setprop( ClassMenu, MPROP_EXIT, MEXIT_ALL );
		
		menu_display( id, ClassMenu, 0 );
	}
}

public cmd_enablemenu(id)
{	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		ColorChat( id, "%L", id, g_showmenu[id] == false ? "MENU_REENABLED" : "MENU_ALENABLED")
		g_showmenu[id] = true
	}
}

public cmd_helpmotd(id)
{
	static motd[2048]
	formatex(motd, 2047, "%L", id, "HELP_MOTD")
	replace(motd, 2047, "#Version#", PLUGIN_VERSION)
	
	show_motd(id, motd, "Biohazard Help")
}	

public cmd_infectuser(id, level, cid)
{
	if(!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED_MAIN
	
	static arg1[32]
	read_argv(1, arg1, 31)
	
	static target
	target = cmd_target(id, arg1, (CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF|CMDTARGET_ONLY_ALIVE))
	
	if(!is_user_connected(target) || g_zombie[target])
		return PLUGIN_HANDLED_MAIN
	
	if(!allow_infection())
	{
		console_print(id, "%L", id, "CMD_MAXZOMBIES")
		return PLUGIN_HANDLED_MAIN
	}
	
	if(!g_gamestarted)
	{
		console_print(id, "%L", id, "CMD_GAMENOTSTARTED")
		return PLUGIN_HANDLED_MAIN
	}
			
	static name[32] 
	get_user_name(target, name, 31)
	
	console_print(id, "%L", id, "CMD_INFECTED", name)
	infect_user(target, 0)
	
	return PLUGIN_HANDLED_MAIN
}

public msg_teaminfo(msgid, dest, id)
{
	if(!g_gamestarted)
		return PLUGIN_CONTINUE

	// Don't pick up our own TeamInfo messages for this player (bugfix)
	if (g_switchingteam)
		return PLUGIN_CONTINUE

	static team[2]
	get_msg_arg_string(2, team, 1)
	
	if(team[0] != 'U')
		return PLUGIN_CONTINUE

	id = get_msg_arg_int(1)
	if(is_user_alive(id) || !g_disconnected[id])
		return PLUGIN_CONTINUE

	g_disconnected[id] = false
	id = randomly_pick_zombie()
	if(id)
	{
		fm_set_user_team(id, g_zombie[id] ? CS_TEAM_CT : CS_TEAM_T, 0)
		set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)
	}
	return PLUGIN_CONTINUE
}

public msg_screenfade(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_flashbang))
		return PLUGIN_CONTINUE
	
	if(!g_zombie[id] || !is_user_alive(id) || g_class_data[g_player_class[id]][DATA_NOFLASH] > 0.0)
	{
		static data[4]
		data[0] = get_msg_arg_int(4)
		data[1] = get_msg_arg_int(5)
		data[2] = get_msg_arg_int(6)
		data[3] = get_msg_arg_int(7)
		
		if(data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] > 199)
			return PLUGIN_HANDLED
	}
	return PLUGIN_CONTINUE
}

public msg_scoreattrib(msgid, dest, id)
{
	static attrib 
	attrib = get_msg_arg_int(2)
	
	if(attrib == ATTRIB_BOMB)
		set_msg_arg_int(2, ARG_BYTE, 0)
}

public msg_statusicon(msgid, dest, id)
{
	static icon[3]
	get_msg_arg_string(2, icon, 2)
	
	return (icon[0] == 'c' && icon[1] == '4') ? PLUGIN_HANDLED : PLUGIN_CONTINUE
}

public msg_weaponpickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_ammopickup(msgid, dest, id)
	return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE

public msg_deathmsg(msgid, dest, id) 
{
	static killer
	killer = get_msg_arg_int(1)

	if(is_user_connected(killer) && g_zombie[killer])
		set_msg_arg_string(4, g_zombie_weapname)
}

public msg_sendaudio(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_winsounds))
		return PLUGIN_CONTINUE
	
	static audiocode [22]
	get_msg_arg_string(2, audiocode, 21)
	
	if(equal(audiocode[7], "terwin"))
		set_msg_arg_string(2, g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
	else if(equal(audiocode[7], "ctwin"))
		set_msg_arg_string(2, g_survivor_win_sounds[_random(sizeof g_survivor_win_sounds)])
	
	return PLUGIN_CONTINUE
}

public msg_health(msgid, dest, id)
{
	if(!get_pcvar_num(cvar_caphealthdisplay))
		return PLUGIN_CONTINUE
	
	static health
	health = get_msg_arg_int(1)
		
	if(health > 255) 
		set_msg_arg_int(1, ARG_BYTE, 255)
	
	return PLUGIN_CONTINUE
}

public msg_textmsg(msgid, dest, id)
{
	if(get_msg_arg_int(1) != 4)
		return PLUGIN_CONTINUE
	
	static txtmsg[25], winmsg[32]
	get_msg_arg_string(2, txtmsg, 24)
	
	if(equal(txtmsg[1], "Game_bomb_drop"))
		return PLUGIN_HANDLED

	else if(equal(txtmsg[1], "Terrorists_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_ZOMBIES")
		set_msg_arg_string(2, winmsg)
	}
	else if(equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
	{
		formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_SURVIVORS")
		set_msg_arg_string(2, winmsg)
	}
	return PLUGIN_CONTINUE
}

public msg_clcorpse(msgid, dest, id)
{
	id = get_msg_arg_int(12)
	if(!g_zombie[id])
		return PLUGIN_CONTINUE
	
	static ent
	ent = fm_find_ent_by_owner(-1, MODEL_CLASSNAME, id)
	
	if(ent)
	{
		static model[64]
		pev(ent, pev_model, model, 63)
		
		set_msg_arg_string(1, model)
	}

	return PLUGIN_CONTINUE
}

public logevent_round_start()
{
	g_roundended = false
	g_roundstarted = true
	
	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public logevent_round_end()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	remove_task(TASKID_BALANCETEAM) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	set_task(0.1, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_textmsg()
{
	g_gamestarted = false 
	g_roundstarted = false 
	g_roundended = true
	
	static seconds[5] 
	read_data(3, seconds, 4)
	
	static Float:tasktime 
	tasktime = float(str_to_num(seconds)) - 0.5
	
	remove_task(TASKID_BALANCETEAM)
	
	set_task(tasktime, "task_balanceteam", TASKID_BALANCETEAM)
}

public event_newround()
{
	g_gamestarted = false
	
	static buytime 
	buytime = get_pcvar_num(cvar_buytime)
	
	if(buytime) 
		g_buytime = buytime + get_gametime()
	
	static id
	for(id = 0; id <= g_maxplayers; id++)
	{
		if(is_user_connected(id))
			g_blockmodel[id] = true
	}
	
	remove_task(TASKID_NEWROUND) 
	remove_task(TASKID_INITROUND)
	remove_task(TASKID_STARTROUND)

	if( task_exists( id + TASK_GLOW_DIE ) )
		remove_task( id + TASK_GLOW_DIE );
	
	set_task(0.1, "task_newround", TASKID_NEWROUND)
	set_task(get_pcvar_float(cvar_starttime), "task_initround", TASKID_INITROUND)

	if( get_pcvar_num( cvar_countdown ) ) {

		CountDownDelay = get_pcvar_num( cvar_starttime );
		set_task( 0.1, "TASK_CountDown", TASKID_COUNTDOWN );
	}
}

public event_curweapon(id)
{
	if(!is_user_alive(id))
		return PLUGIN_CONTINUE
	
	static weapon
	weapon = read_data(2)

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if( g_zombie[ id ] ) {

		if( weapon != CSW_KNIFE && weapon != CSW_FLASHBANG && !task_exists( TASKID_STRIPNGIVE + id ) )
			set_task( 0.1, "task_stripngive", TASKID_STRIPNGIVE + id );

		return PLUGIN_CONTINUE;
	}

	static ammotype
	ammotype = get_pcvar_num(cvar_ammo)
	
	if(!ammotype || (AMMOWP_NULL & (1<<weapon)))
		return PLUGIN_CONTINUE

	static maxammo
	switch(ammotype)
	{
		case 1: maxammo = g_weapon_ammo[weapon][MAX_AMMO]
		case 2: maxammo = g_weapon_ammo[weapon][MAX_CLIP]
	}

	if(!maxammo)
		return PLUGIN_CONTINUE
	
	switch(ammotype)
	{
		case 1:
		{
			static ammo
			ammo = fm_get_user_bpammo(id, weapon)
			
			if(ammo < 1) 
				fm_set_user_bpammo(id, weapon, maxammo)
		}
		case 2:
		{
			static clip; clip = read_data(3)
			if(clip < 1)
			{
				static weaponname[32]
				get_weaponname(weapon, weaponname, 31)
				
				static ent 
				ent = fm_find_ent_by_owner(-1, weaponname, id)
				
				fm_set_weapon_ammo(ent, maxammo)
			}
		}
	}

	return PLUGIN_CONTINUE
}

public event_armortype(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return PLUGIN_CONTINUE
	
	if(fm_get_user_armortype(id) != CS_ARMOR_NONE)
		fm_set_user_armortype(id, CS_ARMOR_NONE)
	
	return PLUGIN_CONTINUE
}

public event_damage(victim)
{
	if(!is_user_alive(victim) || !g_gamestarted)
		return PLUGIN_CONTINUE

	if(!g_zombie[victim])
	{
		static attacker
		attacker = get_user_attacker(victim)
		
		if(!is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
			return PLUGIN_CONTINUE
		
		if(g_victim[attacker] == victim)
		{
			g_infecting = true
			g_victim[attacker] = 0

			message_begin(MSG_ALL, g_msg_deathmsg)
			write_byte(attacker)
			write_byte(victim)
			write_byte(0)
			write_string(g_infection_name)
			message_end()
			
			message_begin(MSG_ALL, g_msg_scoreattrib)
			write_byte(victim)
			write_byte(0)
			message_end()
			
			infect_user(victim, attacker)
			
			static Float:frags, deaths
			pev(attacker, pev_frags, frags)
			deaths = fm_get_user_deaths(victim)
			
			set_pev(attacker, pev_frags, frags  + 1.0)
			fm_set_user_deaths(victim, deaths + 1)
			
			fm_set_user_money(attacker, get_pcvar_num(cvar_infectmoney))
		
			static params[2]
			params[0] = attacker 
			params[1] = victim
	
			set_task(0.3, "task_updatescore", TASKID_UPDATESCR, params, 2)
		}
		g_infecting = false
	}
	return PLUGIN_CONTINUE
}

public fwd_player_prethink(id)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static flags
	flags = pev(id, pev_flags)
	
	if(flags & FL_ONGROUND)
	{
		if(get_pcvar_num(cvar_painshockfree))
		{
			pev(id, pev_velocity, g_vecvel)
			g_brestorevel = true
		}
	}
	else
	{
		static Float:fallvelocity
		pev(id, pev_flFallVelocity, fallvelocity)
		
		g_falling[id] = fallvelocity >= 350.0 ? true : false
	}
		
	if(g_gamestarted)
	{	
		static Float:gametime
		gametime = get_gametime()
		
		static pclass
		pclass = g_player_class[id]

		static Float:health
		pev(id, pev_health, health)
		
		if(health < g_class_data[pclass][DATA_HEALTH] && g_regendelay[id] < gametime)
		{
			set_pev(id, pev_health, health + 1.0)
			g_regendelay[id] = gametime + g_class_data[pclass][DATA_REGENDLY]
		}
	}

	if( get_pcvar_num( cvar_biohazard_icon ) > 0 ) {

		if( is_user_alive( id ) ) {

			if( g_preinfect[ id ] && !g_zombie[ id ] ) set_biohazard_icon( id, 2, 255, 255, 0 );
			else if( g_zombie[ id ] ) set_biohazard_icon( id, 1, 255, 0, 0 );
			else if( !g_zombie[ id ] && !g_preinfect[ id ] ) set_biohazard_icon( id, 1, 125, 178, 255 );
		} else set_biohazard_icon( id, 0, 0, 0 ,0 );
	}

	return FMRES_IGNORED
}

public fwd_player_prethink_post(id)
{
	if(!g_brestorevel)
		return FMRES_IGNORED

	g_brestorevel = false
		
	static flag
	flag = pev(id, pev_flags)
	
	if(!(flag & FL_ONTRAIN))
	{
		static ent
		ent = pev(id, pev_groundentity)
		
		if(pev_valid(ent) && (flag & FL_CONVEYOR))
		{
			static Float:vectemp[3]
			pev(id, pev_basevelocity, vectemp)
			
			xs_vec_add(g_vecvel, vectemp, g_vecvel)
		}
	
		set_pev(id, pev_velocity, g_vecvel)
		return FMRES_HANDLED
	}
	return FMRES_IGNORED
}

public fwd_player_postthink(id)
{ 
	if(!is_user_alive(id))
		return FMRES_IGNORED
	
	if(g_zombie[id] && g_falling[id] && (pev(id, pev_flags) & FL_ONGROUND))
	{	
		set_pev(id, pev_watertype, CONTENTS_WATER)
		g_falling[id] = false
	}
	
	if(get_pcvar_num(cvar_buytime))
	{
		if(pev_valid(g_buyzone) && g_buytime > get_gametime())
			dllfunc(DLLFunc_Touch, g_buyzone, id)
	}

	return FMRES_IGNORED
}

public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch)
{	
	if(channel == CHAN_ITEM && sample[6] == 'n' && sample[7] == 'v' && sample[8] == 'g')
		return FMRES_SUPERCEDE	
	
	if(!is_user_connected(id) || !g_zombie[id])
		return FMRES_IGNORED	

	if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
	{
		if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
		{
			emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			return FMRES_SUPERCEDE
		}
		else if(sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't' || sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
		{
			if(sample[17] == 'w' && sample[18] == 'a' && sample[19] == 'l')
				emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
			else
				emit_sound(id, channel, g_zombie_hit_sounds[_random(sizeof g_zombie_hit_sounds)], volume, attn, flag, pitch)
			
			return FMRES_SUPERCEDE
		}
	}			
	else if(sample[7] == 'd' && (sample[8] == 'i' && sample[9] == 'e' || sample[12] == '6'))
	{
		emit_sound(id, channel, g_zombie_die_sounds[_random(sizeof g_zombie_die_sounds)], volume, attn, flag, pitch)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_cmdstart(id, handle, seed)
{
	if(!is_user_alive(id) || !g_zombie[id])
		return FMRES_IGNORED
	
	static impulse
	impulse = get_uc(handle, UC_Impulse)
	
	if(impulse == IMPULSE_FLASHLIGHT)
	{
		set_uc(handle, UC_Impulse, 0)
		return FMRES_SUPERCEDE
	}
	return FMRES_IGNORED
}

public fwd_spawn(ent)
{
	if(!pev_valid(ent)) 
		return FMRES_IGNORED
	
	static classname[32]
	pev(ent, pev_classname, classname, 31)

	static i
	for(i = 0; i < sizeof g_remove_entities; ++i)
	{
		if(equal(classname, g_remove_entities))
		{
			engfunc(EngFunc_RemoveEntity, ent)
			return FMRES_SUPERCEDE
		}
	}
	return FMRES_IGNORED
}

public fwd_gamedescription() 
{ 
	static gamename[32]
	get_pcvar_string(cvar_gamedescription, gamename, 31)
	
	forward_return(FMV_STRING, gamename)
	
	return FMRES_SUPERCEDE
}  

public fwd_createnamedentity(entclassname)
{
	static classname[10]
	engfunc(EngFunc_SzFromIndex, entclassname, classname, 9)
	
	return (classname[7] == 'c' && classname[8] == '4') ? FMRES_SUPERCEDE : FMRES_IGNORED
}

public fwd_clientkill(id)
{
	if(get_pcvar_num(cvar_punishsuicide) && is_user_alive(id))
		g_suicide[id] = true
}

public fwd_setclientkeyvalue(id, infobuffer, const key[])
{
	if(!equal(key, "model") || !g_blockmodel[id])
		return FMRES_IGNORED
	
	static model[32]
	fm_get_user_model(id, model, 31)
	
	if(equal(model, "gordon"))
		return FMRES_IGNORED
	
	g_blockmodel[id] = false
	
	return FMRES_SUPERCEDE
}

public bacon_touch_weapon(ent, id)
	return (is_user_alive(id) && g_zombie[id]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_tank(ent, caller, activator, use_type, Float:value)
	return (is_user_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE : HAM_IGNORED

public bacon_use_pushable(ent, caller, activator, use_type, Float:value)
	return HAM_SUPERCEDE

public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!g_gamestarted) 
		return HAM_SUPERCEDE
	
	if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
		return HAM_IGNORED
	
	if(!is_user_connected(attacker) || !g_zombie[victim])
		return HAM_IGNORED
	
	static kbpower
	kbpower = g_weapon_knockback[get_user_weapon(attacker)]
	
	if(kbpower != -1) 
	{
		static flags
		flags = pev(victim, pev_flags)
		
		if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND)))
			return HAM_IGNORED
		
		static Float:origins[2][3]
		pev(victim, pev_origin, origins[0])
		pev(attacker, pev_origin, origins[1])
		
		if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
		{
			static Float:velocity[3]
			pev(victim, pev_velocity, velocity)
			
			static Float:tempvec
			tempvec = velocity[2]	
			
			xs_vec_mul_scalar(direction, damage, direction)
			xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
			xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)
			
			xs_vec_add(direction, velocity, velocity)
			velocity[2] = tempvec
			
			set_pev(victim, pev_velocity, velocity)
			
			return HAM_HANDLED
		}
	}
	return HAM_IGNORED
}

public bacon_touch_grenade(ent, world)
{
	if(!get_pcvar_num(cvar_impactexplode))
		return HAM_IGNORED
	
	static model[12]
	pev(ent, pev_model, model, 11)
	
	if(model[9] == 'h' && model[10] == 'e')
	{
		set_pev(ent, pev_dmgtime, 0.0)
		
		return HAM_HANDLED
	}
	return HAM_IGNORED
}

public bacon_takedamage_player(victim, inflictor, attacker, Float:damage, damagetype)
{
	if(damagetype & DMG_GENERIC || victim == attacker || !is_user_alive(victim) || !is_user_connected(attacker))
		return HAM_IGNORED

	if(!g_gamestarted || (!g_zombie[victim] && !g_zombie[attacker]) || ((damagetype & DMG_HEGRENADE) && g_zombie[attacker]))
		return HAM_SUPERCEDE

	if(g_zombie[attacker])
	{
		if(get_user_weapon(attacker) != CSW_KNIFE)
			return HAM_SUPERCEDE

		damage *= g_class_data[g_player_class[attacker]][DATA_ATTACK]
		
		static Float:armor
		pev(victim, pev_armorvalue, armor)
		
		if(get_pcvar_num(cvar_obeyarmor) && armor > 0.0)
		{
			armor -= damage
			
			if(armor < 0.0) 
				armor = 0.0
			
			set_pev(victim, pev_armorvalue, armor)
			SetHamParamFloat(4, 0.0)
		}
		else
		{
			static bool:infect
			infect = allow_infection()
			
			g_victim[attacker] = infect ? victim : 0
					
			if(!g_infecting)
				SetHamParamFloat(4, infect ? 0.0 : damage)
			else	
				SetHamParamFloat(4, 0.0)
		}
	}
	return HAM_HANDLED
}

public bacon_killed_player(victim, killer, shouldgib)
{
	if(!is_user_alive(killer) || g_zombie[killer] || !g_zombie[victim])
		return HAM_IGNORED

	static killbonus
	killbonus = get_pcvar_num(cvar_killbonus)
	
	if(killbonus)
		set_pev(killer, pev_frags, pev(killer, pev_frags) + float(killbonus))
	
	static killreward
	killreward = get_pcvar_num(cvar_killreward)
	
	if(!killreward) 
		return HAM_IGNORED
	
	static weapon, maxclip, ent, weaponname[32]
	switch(killreward)
	{
		case 1: 
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
		}
		case 2:
		{
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
		case 3:
		{
			weapon = get_user_weapon(killer)
			maxclip = g_weapon_ammo[weapon][MAX_CLIP]
			if(maxclip)
			{
				get_weaponname(weapon, weaponname, 31)
				ent = fm_find_ent_by_owner(-1, weaponname, killer)
					
				fm_set_weapon_ammo(ent, maxclip)
			}
				
			if(!user_has_weapon(killer, CSW_HEGRENADE))
				bacon_give_weapon(killer, "weapon_hegrenade")
			else
				fm_set_user_bpammo( killer, CSW_HEGRENADE, fm_get_user_bpammo( killer, CSW_HEGRENADE ) + 1 );
		}
	}
	return HAM_IGNORED
}

public bacon_spawn_player_post(id)
{	
	if(!is_user_alive(id))
		return HAM_IGNORED
	
	static team
	team = fm_get_user_team(id)
	
	if(team != CS_TEAM_T && team != CS_TEAM_CT)
		return HAM_IGNORED
	
	if(g_zombie[id])
	{
		if(get_pcvar_num(cvar_respawnaszombie) && !g_roundended)
		{
			set_zombie_attibutes(id)
			
			return HAM_IGNORED
		}
		else
			cure_user(id)
	}
	else if(pev(id, pev_rendermode) == kRenderTransTexture)
		reset_user_model(id)
	
	set_task(0.3, "task_spawned", TASKID_SPAWNDELAY + id)
	set_task(5.0, "task_checkspawn", TASKID_CHECKSPAWN + id)
	
	return HAM_IGNORED
}

public bacon_touch_pushable(ent, id)
{
	static movetype
	pev(id, pev_movetype)
	
	if(movetype == MOVETYPE_NOCLIP || movetype == MOVETYPE_NONE)
		return HAM_IGNORED	
	
	if(is_user_alive(id))
	{
		set_pev(id, pev_movetype, MOVETYPE_WALK)
		
		if(!(pev(id, pev_flags) & FL_ONGROUND))
			return HAM_SUPERCEDE
	}
	
	if(!get_pcvar_num(cvar_shootobjects))
		return HAM_IGNORED
	
	static Float:velocity[2][3]
	pev(ent, pev_velocity, velocity[0])
	
	if(vector_length(velocity[0]) > 0.0)
	{
		pev(id, pev_velocity, velocity[1])
		velocity[1][0] += velocity[0][0]
		velocity[1][1] += velocity[0][1]
		
		set_pev(id, pev_velocity, velocity[1])
	}
	return HAM_SUPERCEDE
}

public bacon_traceattack_pushable(ent, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
{
	if(!get_pcvar_num(cvar_shootobjects) || !is_user_alive(attacker))
		return HAM_IGNORED
	
	static Float:velocity[3]
	pev(ent, pev_velocity, velocity)
			
	static Float:tempvec
	tempvec = velocity[2]	
			
	xs_vec_mul_scalar(direction, damage, direction)
	xs_vec_mul_scalar(direction, g_zombie[attacker] ? 
	get_pcvar_float(cvar_pushpwr_zombie) : get_pcvar_float(cvar_pushpwr_weapon), direction)
	xs_vec_add(direction, velocity, velocity)
	velocity[2] = tempvec
	
	set_pev(ent, pev_velocity, velocity)
	
	return HAM_HANDLED
}

public bacon_claws_deploy_post( iEntity ) {

	static szOwner;
	szOwner = get_pdata_cbase( iEntity, 41, EXTRAOFFSET_WEAPONS );

	if( g_zombie[ szOwner ] ) {

		set_pev( szOwner, pev_viewmodel2, g_class_wmodel[ g_player_class[ szOwner ] ] );
		set_pev( szOwner, pev_weaponmodel2, "" );
	}
}

public TASK_CountDown(  ) {

	new Players[ 32 ];
	new PlayersNum;
	get_players( Players, PlayersNum, "a" );
	
	if( CountDownDelay > sizeof CountDownSounds + 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
	} else if( CountDownDelay > 1 ) {

		CountDownDelay--;

		new Message[ 64 ];
		formatex( Message, sizeof( Message ) - 1, "%L", LANG_PLAYER, "COUNTDOWN_HUD", CountDownDelay, CountDownDelay == 1 ? "e" : "a" );
		
		HudMessage( 0, Message, 125, 170, 255, -1.0, 0.28, 2, 0.01, 0.8, 0.01, 0.1 );
		emit_sound( 0, CHAN_VOICE, CountDownSounds[ CountDownDelay - 1 ], VOL_NORM, ATTN_NORM, 0, PITCH_NORM );

		set_task( 1.0, "TASK_CountDown", TASKID_COUNTDOWN );
		
		for( new i = 0 ; i < PlayersNum ; i++ ) {

			if( is_user_connected( Players[ i ] ) ) {

				new color[ 3 ];
				color[ 0 ] = 125;
				color[ 1 ] = 170;
				color[ 2 ] = 255;
				UTIL_ScreenFade( Players[ i ], color, 0.5, 0.5, 110 );

				new shock[ 3 ];
				shock[ 0 ] = 3;
				shock[ 1 ] = 2;
				shock[ 2 ] = 3;
				message_begin( MSG_ONE, get_user_msgid( "ScreenShake" ), _, Players[ i ] );
				write_short( ( 1<<12 ) * shock[ 0 ] );
				write_short( ( 1<<12 ) * shock[ 1 ] );
				write_short( ( 1<<12 ) * shock[ 2 ] );
				message_end(  );
			}
		}	
	} else if( CountDownDelay <= 1 )
		CountDownDelay = 0;
}

public task_spawned(taskid)
{
	static id
	id = taskid - TASKID_SPAWNDELAY
	
	if(is_user_alive(id))
	{
		if( !get_pcvar_num( cvar_weaponsmenu ) ) {

			for( new i = 0; i < sizeof g_grenades; ++i )
				bacon_give_weapon( id, g_grenades[ i ] );
		}

		if(g_welcomemsg[id])
		{
			g_welcomemsg[id] = false
			
			static message[192]
			formatex(message, 191, "%L", id, "WELCOME_TXT")
			replace(message, 191, "#Version#", PLUGIN_VERSION)
			
			ColorChat(id, message)
		}
		
		if(g_suicide[id])
		{
			g_suicide[id] = false
			
			user_silentkill(id)
			remove_task(TASKID_CHECKSPAWN + id)

			ColorChat(id, "%L", id, "SUICIDEPUNISH_TXT")
			
			return
		}
		
		if(get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
			is_user_bot(id) ? bot_weapons(id) : display_equipmenu(id)
		
		if(!g_gamestarted)
			ColorChat(id, "%L %L", id, "SCAN_RESULTS", id, g_preinfect[id] ? "SCAN_INFECTED" : "SCAN_CLEAN")
		else
		{
			static team
			team = fm_get_user_team(id)
			
			if(team == CS_TEAM_T)
				fm_set_user_team(id, CS_TEAM_CT)
		}

		if(get_pcvar_num(cvar_biohazard_icon) > 0) {
			if(g_preinfect[id] && !g_zombie[id])
				set_biohazard_icon(id, 2, 255, 255, 0)
			else if(g_zombie[id])
				set_biohazard_icon(id, 1, 255, 0, 0)
			else if(!g_zombie[id] && !g_preinfect[id])
				set_biohazard_icon(id, 1, 125, 178, 255)
		}
	}
}

public task_checkspawn(taskid)
{
	static id
	id = taskid - TASKID_CHECKSPAWN
	
	if(!is_user_connected(id) || is_user_alive(id) || g_roundended)
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
		ExecuteHamB(Ham_CS_RoundRespawn, id)
}
	
public task_showtruehealth()
{
	static id, Float:health, Float:gravity, Float:speed, class
	for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id) && !is_user_bot(id) && g_zombie[id])
	{
		pev( id, pev_health, health );
		pev( id, pev_gravity, gravity );
		pev( id, pev_maxspeed, speed );
		class = g_player_class[id]

		if(g_classcount > 1) {

			set_hudmessage(0, 255, 20, -1.0, 0.8, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Class: %s - Desc: %s^nHealth: %0.f^n^nSpeed: %0.1f^nGolds: %i", g_class_name[class], g_class_desc[class], health, speed, get_user_golds( id ) );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		} else {

			set_hudmessage(0, 230, 210, 0.01, 0.9, _, 0.2, 0.2)
			ShowSyncHudMsg(id, g_sync_hpdisplay, "Speed: %0.1f   Gravity: %0.1f", speed, gravity / 0.00125 );

			set_pdata_int( id, 361, get_pdata_int( id, 361 ) | ( 1<<3 ) );
		}
	}
}

public task_lights()
{
	static light[2]
	get_pcvar_string(cvar_lights, light, 1)
	
	engfunc(EngFunc_LightStyle, 0, light)
}

public task_updatescore(params[])
{
	if(!g_gamestarted) 
		return
	
	static attacker
	attacker = params[0]
	
	static victim
	victim = params[1]
	
	if(!is_user_connected(attacker))
		return

	static frags, deaths, team
	frags  = get_user_frags(attacker)
	deaths = fm_get_user_deaths(attacker)
	team   = get_user_team(attacker)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(attacker)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
	
	if(!is_user_connected(victim))
		return
	
	frags  = get_user_frags(victim)
	deaths = fm_get_user_deaths(victim)
	team   = get_user_team(victim)
	
	message_begin(MSG_BROADCAST, g_msg_scoreinfo)
	write_byte(victim)
	write_short(frags)
	write_short(deaths)
	write_short(0)
	write_short(team)
	message_end()
}

public task_weaponsmenu(taskid)
{
	static id
	id = taskid - TASKID_WEAPONSMENU
	
	if(is_user_alive(id) && !g_zombie[id] && g_menufailsafe[id])
		display_equipmenu(id)
}

public task_stripngive(taskid)
{
	static id
	id = taskid - TASKID_STRIPNGIVE
	
	if(is_user_alive(id))
	{
		fm_strip_user_weapons(id)
		fm_reset_user_primary(id)
		bacon_give_weapon(id, "weapon_knife")
		
		set_pev(id, pev_weaponmodel2, "")
		set_pev(id, pev_viewmodel2, g_class_wmodel[g_player_class[id]])
		set_pev(id, pev_maxspeed, g_class_data[g_player_class[id]][DATA_SPEED])
	}
}

public task_newround()
{
	static players[32], num, zombies, i, id
	get_players(players, num, "a")

	if(num > 1)
	{
		for(i = 0; i < num; i++) 
			g_preinfect[players[i]] = false
		
		zombies = clamp(floatround(num * get_pcvar_float(cvar_zombiemulti)), 1, 31)
		
		i = 0
		while(i < zombies)
		{
			id = players[_random(num)]
			if(!g_preinfect[id])
			{
				g_preinfect[id] = true
				i++
			}
		}
	}
	
	if(!get_pcvar_num(cvar_randomspawn) || g_spawncount <= 0) 
		return
	
	static team
	for(i = 0; i < num; i++)
	{
		id = players[i]
		
		team = fm_get_user_team(id)
		if(team != CS_TEAM_T && team != CS_TEAM_CT || pev(id, pev_iuser1))
			continue
		
		static spawn_index
		spawn_index = _random(g_spawncount)
	
		static Float:spawndata[3]
		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		
		if(!fm_is_hull_vacant(spawndata, HULL_HUMAN))
		{
			static i
			for(i = spawn_index + 1; i != spawn_index; i++)
			{
				if(i >= g_spawncount) i = 0

				spawndata[0] = g_spawns[i][0]
				spawndata[1] = g_spawns[i][1]
				spawndata[2] = g_spawns[i][2]

				if(fm_is_hull_vacant(spawndata, HULL_HUMAN))
				{
					spawn_index = i
					break
				}
			}
		}

		spawndata[0] = g_spawns[spawn_index][0]
		spawndata[1] = g_spawns[spawn_index][1]
		spawndata[2] = g_spawns[spawn_index][2]
		engfunc(EngFunc_SetOrigin, id, spawndata)

		spawndata[0] = g_spawns[spawn_index][3]
		spawndata[1] = g_spawns[spawn_index][4]
		spawndata[2] = g_spawns[spawn_index][5]
		set_pev(id, pev_angles, spawndata)

		spawndata[0] = g_spawns[spawn_index][6]
		spawndata[1] = g_spawns[spawn_index][7]
		spawndata[2] = g_spawns[spawn_index][8]
		set_pev(id, pev_v_angle, spawndata)

		set_pev(id, pev_fixangle, 1)
	}
}

public task_initround()
{
	static zombiecount, newzombie
	zombiecount = 0
	newzombie = 0

	static players[32], num, i, id
	get_players(players, num, "a")

	for(i = 0; i < num; i++) if(g_preinfect[players[i]])
	{
		newzombie = players[i]
		zombiecount++
	}
	
	if(zombiecount > 1) 
		newzombie = 0
	else if(zombiecount < 1) 
		newzombie = players[_random(num)]
	
	for(i = 0; i < num; i++)
	{
		id = players[i]
		if(id == newzombie || g_preinfect[id])
			infect_user(id, 0)
		else
		{
			fm_set_user_team(id, CS_TEAM_CT, 0)
			add_delay(id, "update_team")
		}
	}
	
	set_hudmessage(_, _, _, _, _, 1)
	if(newzombie)
	{
		static name[32]
		get_user_name(newzombie, name, 31)
		
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD", name)
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT", name)
	}
	else
	{
		ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD2")
		ColorChat(id, "%L", LANG_PLAYER, "INFECTED_TXT2")
	}
	
	set_task(0.51, "task_startround", TASKID_STARTROUND)

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 2 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

public task_startround()
{
	g_gamestarted = true
	ExecuteForward(g_fwd_gamestart, g_fwd_result)
}

public task_balanceteam()
{
	static players[3][32], count[3]
	get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
	
	count[CS_TEAM_T] = 0
	count[CS_TEAM_CT] = 0
	
	static i, id, team
	for(i = 0; i < count[CS_TEAM_UNASSIGNED]; i++)
	{
		id = players[CS_TEAM_UNASSIGNED][i] 
		team = fm_get_user_team(id)
		
		if(team == CS_TEAM_T || team == CS_TEAM_CT)
			players[team][count[team]++] = id
	}

	if(abs(count[CS_TEAM_T] - count[CS_TEAM_CT]) <= 1) 
		return

	static maxplayers
	maxplayers = (count[CS_TEAM_T] + count[CS_TEAM_CT]) / 2
	
	if(count[CS_TEAM_T] > maxplayers)
	{
		for(i = 0; i < (count[CS_TEAM_T] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT, 0)
	}
	else
	{
		for(i = 0; i < (count[CS_TEAM_CT] - maxplayers); i++)
			fm_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T, 0)
	}
}

public task_botclient_pdata(id) 
{
	if(g_botclient_pdata || !is_user_connected(id))
		return
	
	if(get_pcvar_num(cvar_botquota) && is_user_bot(id))
	{
		RegisterHamFromEntity(Ham_TakeDamage, id, "bacon_takedamage_player")
		RegisterHamFromEntity(Ham_Killed, id, "bacon_killed_player")
		RegisterHamFromEntity(Ham_TraceAttack, id, "bacon_traceattack_player")
		RegisterHamFromEntity(Ham_Spawn, id, "bacon_spawn_player_post", 1)
		
		g_botclient_pdata = 1
	}
}

public bot_weapons(id)
{
	g_player_weapons[id][0] = _random(sizeof g_primaryweapons)
	g_player_weapons[id][1] = _random(sizeof g_secondaryweapons)
	
	equipweapon(id, EQUIP_ALL)
}

public update_team(id)
{
	if(!is_user_connected(id))
		return
	
	static team
	team = fm_get_user_team(id)
	
	if(team == CS_TEAM_T || team == CS_TEAM_CT)
	{
		emessage_begin(MSG_ALL, g_msg_teaminfo)
		ewrite_byte(id)
		ewrite_string(g_teaminfo[team])
		emessage_end()
	}
}

public infect_user(victim, attacker)
{
	if(!is_user_alive(victim))
		return

	message_begin(MSG_ONE, g_msg_screenfade, _, victim)
	write_short(1<<10)
	write_short(1<<10)
	write_short(0)
	write_byte((g_mutate[victim] != -1) ? 255 : 100)
	write_byte(100)
	write_byte(100)
	write_byte(250)
	message_end()

	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenShake" ), _, victim )
	write_short( ( 1<<12 ) * 4 ) // amplitude
	write_short( ( 1<<12 ) * 2 ) // duration
	write_short( ( 1<<12 ) * 10 ) // frequency
	message_end(  )
		
	message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "Damage" ), _, victim )
	write_byte( 0 ) // damage save
	write_byte( 0 ) // damage take
	write_long( DMG_NERVEGAS ) // damage type - DMG_RADIATION
	write_coord( 0 ) // x
	write_coord( 0 ) // y
	write_coord( 0 ) // z
	message_end(  )

	// Get player's origin
	new Origin[ 3 ]
	get_user_origin( victim, Origin )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_IMPLOSION ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 128 ) // radius
	write_byte( 20 ) // count
	write_byte( 3 ) // duration
	message_end(  )
		
	message_begin( MSG_PVS, SVC_TEMPENTITY, Origin )
	write_byte( TE_DLIGHT ) // TE id
	write_coord( Origin[ 0 ] ) // x
	write_coord( Origin[ 1 ] ) // y
	write_coord( Origin[ 2 ] ) // z
	write_byte( 20 ) // radius
	write_byte( 0 ) // r
	write_byte( 150 ) // g
	write_byte( 0 ) // b
	write_byte( 2 ) // life
	write_byte( 0 ) // decay rate
	message_end(  )

#if defined ULTRA_BLOOD
	static origin[3];
	get_user_origin(victim, origin)

	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_PARTICLEBURST)
	write_coord(origin[0])
	write_coord(origin[1])
	write_coord(origin[2])
	write_short(50)
	write_byte(70)
	write_byte(3)
	message_end()
#endif
	
	if(g_mutate[victim] != -1)
	{
		g_player_class[victim] = g_mutate[victim]
		g_mutate[victim] = -1
		
		set_hudmessage(_, _, _, _, _, 1)
		ShowSyncHudMsg(victim, g_sync_msgdisplay, "%L", victim, "MUTATION_HUD", g_class_name[g_player_class[victim]])
	}
	
	fm_set_user_team(victim, CS_TEAM_T)
	set_zombie_attibutes(victim)
	
	emit_sound(victim, CHAN_STATIC, g_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
	ExecuteForward(g_fwd_infect, g_fwd_result, victim, attacker)
}

public cure_user(id)
{
	if(!is_user_alive(id)) 
		return

	g_zombie[id] = false
	g_falling[id] = false

	g_showmenu[id] = true;

	reset_user_model(id)
	fm_set_user_nvg(id, 0)
	set_pev(id, pev_gravity, 1.0)
	
	if( fm_get_user_team( id ) != CS_TEAM_CT ) { // need to change team?

		fm_set_user_team( id, CS_TEAM_CT );
		fm_user_team_update( id );
	}

	static viewmodel[64]
	pev(id, pev_viewmodel2, viewmodel, 63)
	
	if(equal(viewmodel, g_class_wmodel[g_player_class[id]]))
	{
		static weapon 
		weapon = fm_lastknife(id)

		if(pev_valid(weapon))
			ExecuteHam(Ham_Item_Deploy, weapon)
	}

	if(get_pcvar_num(cvar_weaponsmenu))
	{
		static id, team
		for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
		{
			team = fm_get_user_team(id)
			if(team == CS_TEAM_T || team == CS_TEAM_CT)
			{
				if(is_user_bot(id)) 
					bot_weapons(id)
				else 
				{
					if(g_showmenu[id])
					{
						add_delay(id, "display_equipmenu")
						
						g_menufailsafe[id] = true
						set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
					}
					else	
						equipweapon(id, EQUIP_ALL)
				}
			}
		}
	}
}

public display_equipmenu(id)
{
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L^n^n", id, "MENU_TITLE1")
	
	static bool:hasweap
	hasweap = ((g_player_weapons[id][0]) != -1 && (g_player_weapons[id][1] != -1)) ? true : false
	
	len += formatex(menubody[len], 511 - len,"\r1.\w %L^n", id, "MENU_NEWWEAPONS")
	len += formatex(menubody[len], 511 - len,"%s2.\w %L^n", hasweap ? "\r" : "\d", id, "MENU_PREVSETUP")
	len += formatex(menubody[len], 511 - len,"%s3.\w %L^n^n", hasweap ? "\r" : "\d", id, "MENU_DONTSHOW")
	len += formatex(menubody[len], 511 - len,"\r5.\w %L^n", id, "MENU_EXIT")
	
	static keys
	keys = (MENU_KEY_1|MENU_KEY_5)
	
	if(hasweap) 
		keys |= (MENU_KEY_2|MENU_KEY_3)
	
	show_menu(id, keys, menubody, -1, "Equipment")
}

public action_equip(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key)
	{
		case 0: display_weaponmenu(id, MENU_PRIMARY, g_menuposition[id] = 0)
		case 1: equipweapon(id, EQUIP_ALL)
		case 2:
		{
			g_showmenu[id] = false
			equipweapon(id, EQUIP_ALL)
			ColorChat(id, "%L", id, "MENU_CMDENABLE")
		}
	}
	
	if(key > 0)
	{
		g_menufailsafe[id] = false
		remove_task(TASKID_WEAPONSMENU + id)
	}
	return PLUGIN_HANDLED
}


public display_weaponmenu(id, menuid, pos)
{
	if(pos < 0 || menuid < 0)
		return
	
	static start
	start = pos * 8
	
	static maxitem
	maxitem = menuid == MENU_PRIMARY ? sizeof g_primaryweapons : sizeof g_secondaryweapons

  	if(start >= maxitem)
    		start = pos = g_menuposition[id]
	
	static menubody[512], len
  	len = formatex(menubody, 511, "\r%L\w^n^n", id, menuid == MENU_PRIMARY ? "MENU_TITLE2" : "MENU_TITLE3")

	static end
	end = start + 8
	if(end > maxitem)
    		end = maxitem
	
	static keys
	keys = MENU_KEY_0
	
	static a, b
	b = 0
	
  	for(a = start; a < end; ++a) 
	{
		keys |= (1<<b)
		len += formatex(menubody[len], 511 - len,"\r%d.\w %s^n", ++b, menuid == MENU_PRIMARY ? g_primaryweapons[a][0]: g_secondaryweapons[a][0])
  	}

  	if(end != maxitem)
	{
    		formatex(menubody[len], 511 - len, "^n\r9.\w %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
    		keys |= MENU_KEY_9
  	}
  	else	
		formatex(menubody[len], 511 - len, "^n\r0.\w %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
	
  	show_menu(id, keys, menubody, -1, menuid == MENU_PRIMARY ? "Primary" : "Secondary")
}

public action_prim(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED

	switch(key)
	{
    		case 8: display_weaponmenu(id, MENU_PRIMARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_PRIMARY, --g_menuposition[id])
    		default:
		{
			g_player_weapons[id][0] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_PRI)
			
			display_weaponmenu(id, MENU_SECONDARY, g_menuposition[id] = 0)
		}
	}
	return PLUGIN_HANDLED
}

public action_sec(id, key)
{
	if(!is_user_alive(id) || g_zombie[id])
		return PLUGIN_HANDLED
	
	switch(key) 
	{
    		case 8: display_weaponmenu(id, MENU_SECONDARY, ++g_menuposition[id])
		case 9: display_weaponmenu(id, MENU_SECONDARY, --g_menuposition[id])
    		default:
		{
			g_menufailsafe[id] = false
			remove_task(TASKID_WEAPONSMENU + id)
			
			g_player_weapons[id][1] = g_menuposition[id] * 8 + key
			equipweapon(id, EQUIP_SEC)
			equipweapon(id, EQUIP_GREN)
		}
	}
	return PLUGIN_HANDLED
}

public ClassCmd( id, szMenu, szItem ) {

	if( szItem == MENU_EXIT ) {

		menu_destroy( szMenu );
		return PLUGIN_HANDLED;
	}

	new szData[ 6 ], szName[ 64 ];
	new iAccess, iCallBack;

	menu_item_getinfo( szMenu, szItem, iAccess, szData, 5, szName, 63, iCallBack );
	new iKey = str_to_num( szData );

	if( g_class_data[ iKey ][ DATA_ONLYVIP ] > 0.0 && !is_user_vip( id ) ) {

		ColorChat( id, "%L", id, "MENU_CLASSONLYVIP", g_class_name[ iKey ] );
		cmd_classmenu( id );
	}

	else {

		g_mutate[ id ] = iKey;
		ColorChat( id, "%L", id, "MENU_CHANGECLASS", g_class_name[ g_mutate[ id ] ] );
	}

	menu_destroy( szMenu );
	return PLUGIN_HANDLED;
}

public register_spawnpoints(const mapname[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new csdmfile[64], line[64], data[10][6]
	formatex(csdmfile, 63, "%s/csdm/%s.spawns.cfg", configdir, mapname)

	if(file_exists(csdmfile))
	{
		new file
		file = fopen(csdmfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 63)
			if(!line[0] || str_count(line,' ') < 2) 
				continue

			parse(line, data[0], 5, data[1], 5, data[2], 5, data[3], 5, data[4], 5, data[5], 5, data[6], 5, data[7], 5, data[8], 5, data[9], 5)

			g_spawns[g_spawncount][0] = floatstr(data[0]), g_spawns[g_spawncount][1] = floatstr(data[1])
			g_spawns[g_spawncount][2] = floatstr(data[2]), g_spawns[g_spawncount][3] = floatstr(data[3])
			g_spawns[g_spawncount][4] = floatstr(data[4]), g_spawns[g_spawncount][5] = floatstr(data[5])
			g_spawns[g_spawncount][6] = floatstr(data[7]), g_spawns[g_spawncount][7] = floatstr(data[8])
			g_spawns[g_spawncount][8] = floatstr(data[9])
			
			if(++g_spawncount >= MAX_SPAWNS) 
				break
		}
		if(file) 
			fclose(file)
	}
}

public register_zombieclasses(filename[])
{
	new configdir[32]
	get_configsdir(configdir, 31)
	
	new configfile[64]
	formatex(configfile, 63, "%s/%s", configdir, filename)

	if(get_pcvar_num(cvar_zombie_class) && file_exists(configfile))
	{			
		new line[128], leftstr[32], rightstr[64],  classname[32], data[MAX_DATA], i
		
		new file
		file = fopen(configfile, "rt")
		
		while(file && !feof(file))
		{
			fgets(file, line, 127), trim(line)
			if(!line[0] || line[0] == ';') continue
			
			if(line[0] == '[' && line[strlen(line) - 1] == ']')
			{
				copy(classname, strlen(line) - 2, line[1])

				if(register_class(classname) == -1)
					break
				
				continue
			}
			strtok(line, leftstr, 31, rightstr, 63, '=', 1)
				
			if(equali(leftstr, "DESC"))
				copy(g_class_desc[g_classcount - 1], 31, rightstr)
			else if(equali(leftstr, "PMODEL"))
				copy(g_class_pmodel[g_classcount - 1], 63, rightstr)
			else if(equali(leftstr, "WMODEL"))
				copy(g_class_wmodel[g_classcount - 1], 63, rightstr)
				
			for(i = 0; i < MAX_DATA; i++)
				data[i] = equali(leftstr, g_dataname[i])
				
			for(i = 0; i < MAX_DATA; i++) if(data[i])
			{
				g_class_data[g_classcount - 1][i] = floatstr(rightstr)
				break
			}
		}
		if(file) fclose(file)
	} 
	else 
		register_class("default")
}

public register_class(classname[])
{
	if(g_classcount >= MAX_CLASSES)
		return -1
	
	copy(g_class_name[g_classcount], 31, classname)
	copy(g_class_pmodel[g_classcount], 63, DEFAULT_PMODEL)
	copy(g_class_wmodel[g_classcount], 63, DEFAULT_WMODEL)
		
	g_class_data[g_classcount][DATA_HEALTH] = DEFAULT_HEALTH
	g_class_data[g_classcount][DATA_SPEED] = DEFAULT_SPEED	
	g_class_data[g_classcount][DATA_GRAVITY] = DEFAULT_GRAVITY
	g_class_data[g_classcount][DATA_ATTACK] = DEFAULT_ATTACK
	g_class_data[g_classcount][DATA_REGENDLY] = DEFAULT_REGENDLY
	g_class_data[g_classcount][DATA_KNOCKBACK] = DEFAULT_KNOCKBACK
	g_class_data[g_classcount][DATA_NOFLASH] = DEFAULT_NOFLASH
	g_class_data[g_classcount][DATA_ONLYVIP] = DEFAULT_ONLYVIP
	g_classcount++
	
	return (g_classcount - 1)
}

public native_register_class(classname[], description[])
{
	param_convert(1)
	param_convert(2)
	
	static classid
	classid = register_class(classname)
	
	if(classid != -1)
		copy(g_class_desc[classid], 31, description)

	return classid
}

public native_set_class_pmodel(classid, player_model[])
{
	param_convert(2)
	copy(g_class_pmodel[classid], 63, player_model)
}

public native_set_class_wmodel(classid, weapon_model[])
{
	param_convert(2)
	copy(g_class_wmodel[classid], 63, weapon_model) 
}

public native_is_user_zombie(index)
	return g_zombie[index] == true ? 1 : 0

public native_get_user_class(index)
	return g_player_class[index]

public native_is_user_infected(index)
	return g_preinfect[index] == true ? 1 : 0

public native_game_started()
	return g_gamestarted

public native_preinfect_user(index, bool:yesno)
{
	if(is_user_alive(index) && !g_gamestarted)
		g_preinfect[index] = yesno
}

public native_infect_user(victim, attacker)
{
	if(allow_infection() && g_gamestarted)
		infect_user(victim, attacker)
}

public native_cure_user(index)
	cure_user(index)

public native_get_class_id(classname[])
{
	param_convert(1)
	
	static i
	for(i = 0; i < g_classcount; i++)
	{
		if(equali(classname, g_class_name[i]))
			return i
	}
	return -1
}

public Float:native_get_class_data(classid, dataid)
	return g_class_data[classid][dataid]

public native_set_class_data(classid, dataid, Float:value)
	g_class_data[classid][dataid] = value

public native_get_humans(  ) {

	static iHumans;
	iHumans = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && !g_zombie[ id ] ) 
			iHumans++;
	}

	return iHumans;
}

public native_get_zombies(  ) {

	static iZombies;
	iZombies = 0

	static id;
	for( id = 1; id <= get_maxplayers(  ); id++ ) {
		if( is_user_alive( id ) && g_zombie[ id ] ) 
			iZombies++;
	}

	return iZombies;
}

stock bool:fm_is_hull_vacant(const Float:origin[3], hull)
{
	static tr
	tr = 0
	
	engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, tr)
	return (!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen)) ? true : false
}

stock fm_set_kvd(entity, const key[], const value[], const classname[] = "") 
{
	set_kvd(0, KV_ClassName, classname)
	set_kvd(0, KV_KeyName, key)
	set_kvd(0, KV_Value, value)
	set_kvd(0, KV_fHandled, 0)

	return dllfunc(DLLFunc_KeyValue, entity, 0)
}

stock fm_strip_user_weapons(index) 
{
	static stripent
	if(!pev_valid(stripent))
	{
		stripent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
		dllfunc(DLLFunc_Spawn, stripent), set_pev(stripent, pev_solid, SOLID_NOT)
	}
	dllfunc(DLLFunc_Use, stripent, index)
	
	return 1
}

stock fm_set_entity_visibility(index, visible = 1)
	set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)

stock fm_find_ent_by_owner(index, const classname[], owner) 
{
	static ent
	ent = index
	
	while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) && pev(ent, pev_owner) != owner) {}
	
	return ent
}

stock bacon_give_weapon(index, weapon[])
{
	if(!equal(weapon,"weapon_", 7))
		return 0

	static ent
	ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon))
	
	if(!pev_valid(ent)) 
		return 0
    
	set_pev(ent, pev_spawnflags, SF_NORESPAWN)
	dllfunc(DLLFunc_Spawn, ent)
   
	if(!ExecuteHamB(Ham_AddPlayerItem, index, ent))
	{
		if(pev_valid(ent)) set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
		return 0
	}
	ExecuteHamB(Ham_Item_AttachToPlayer, ent, index)

	return 1
}

stock bacon_strip_weapon(index, weapon[])
{
	if(!equal(weapon, "weapon_", 7)) 
		return 0

	static weaponid 
	weaponid = get_weaponid(weapon)
	
	if(!weaponid) 
		return 0

	static weaponent
	weaponent = fm_find_ent_by_owner(-1, weapon, index)
	
	if(!weaponent) 
		return 0

	if(get_user_weapon(index) == weaponid) 
		ExecuteHamB(Ham_Weapon_RetireWeapon, weaponent)

	if(!ExecuteHamB(Ham_RemovePlayerItem, index, weaponent)) 
		return 0
	
	ExecuteHamB(Ham_Item_Kill, weaponent)
	set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<weaponid))

	return 1
}

stock fm_set_user_team( index, team, update = 1 ) {

	set_pdata_int( index, OFFSET_TEAM, team );

	if( update ) {

		emessage_begin( MSG_ALL, g_msg_teaminfo );
		ewrite_byte( index );
		ewrite_string( g_teaminfo[ team ] );
		emessage_end(  );
	}
	return 1;
}

stock fm_get_user_bpammo(index, weapon)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	return offset ? get_pdata_int(index, offset) : 0
}

stock fm_set_user_bpammo(index, weapon, amount)
{
	static offset
	switch(weapon)
	{
		case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
		case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
		case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
		case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
		case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
		case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
		case CSW_P228: offset = OFFSET_AMMO_357SIG
		case CSW_GLOCK18, CSW_TMP, CSW_ELITE, CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
		default: offset = 0
	}
	
	if(offset) 
		set_pdata_int(index, offset, amount)
	
	return 1
}

stock fm_set_user_rendering( iEntity, fx = kRenderFxNone, Red = 255, Green = 255, Blue = 255, iRender = kRenderNormal, Amount = 16 ) {

	new Float:RenderColor[ 3 ];
	RenderColor[ 0 ] = float( Red );
	RenderColor[ 1 ] = float( Green );
	RenderColor[ 2 ] = float( Blue );

	set_pev( iEntity, pev_renderfx, fx );
	set_pev( iEntity, pev_rendercolor, RenderColor );
	set_pev( iEntity, pev_rendermode, iRender );
	set_pev( iEntity, pev_renderamt, float( Amount ) );

	return 1;
}

stock fm_set_user_nvg(index, onoff = 1)
{
	static nvg
	nvg = get_pdata_int(index, OFFSET_NVG)
	
	set_pdata_int(index, OFFSET_NVG, onoff == 1 ? nvg | HAS_NVG : nvg & ~HAS_NVG)
	return 1
}

stock fm_set_user_money(index, addmoney, update = 1)
{
	static money
	money = fm_get_user_money(index) + addmoney
	
	set_pdata_int(index, OFFSET_CSMONEY, money)
	
	if(update)
	{
		message_begin(MSG_ONE, g_msg_money, _, index)
		write_long(clamp(money, 0, 16000))
		write_byte(1)
		message_end()
	}
	return 1
}

stock fm_user_team_update(id)
{
	static Float:current_time
	current_time = get_gametime()
	
	if (current_time - g_teams_targettime >= 0.1)
	{
		set_task(0.1, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = current_time + 0.1
	}
	else
	{
		set_task((g_teams_targettime + 0.1) - current_time, "fm_cs_set_user_team_msg", id+1212)
		g_teams_targettime = g_teams_targettime + 0.1
	}
}

public fm_cs_set_user_team_msg(taskid)
{
	// Note to self: this next message can now be received by other plugins
	
	// Set the switching team flag
	g_switchingteam = true
	
	// Tell everyone my new team
	emessage_begin(MSG_ALL, g_msg_teaminfo )
	ewrite_byte(taskid - 1212) // player
	ewrite_string(CS_TEAM_NAMES[fm_get_user_team(taskid - 1212)]) // team
	emessage_end()
	
	// Done switching team
	g_switchingteam = false
}

stock str_count(str[], searchchar)
{
	static maxlen
	maxlen = strlen(str)
	
	static i, count
	count = 0
	
	for(i = 0; i <= maxlen; i++) if(str[i] == searchchar)
		count++

	return count
}

stock reset_user_model(index)
{
	set_pev(index, pev_rendermode, kRenderNormal)
	set_pev(index, pev_renderamt, 0.0)

	if(pev_valid(g_modelent[index]))
		fm_set_entity_visibility(g_modelent[index], 0)
}

stock remove_user_model(ent)
{
	static id
	id = pev(ent, pev_owner)
	
	if(pev_valid(ent)) 
		engfunc(EngFunc_RemoveEntity, ent)

	g_modelent[id] = 0
}

stock set_zombie_attibutes(index)
{
	if(!is_user_alive(index)) 
		return

	g_zombie[index] = true

	if(!task_exists(TASKID_STRIPNGIVE + index))
		set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + index)

	static Float:health
	health = g_class_data[g_player_class[index]][DATA_HEALTH]
	
	if(g_preinfect[index]) 
		health *= get_pcvar_float(cvar_zombie_hpmulti)
	
	set_pev(index, pev_health, health)
	set_pev(index, pev_gravity, g_class_data[g_player_class[index]][DATA_GRAVITY])
	set_pev(index, pev_body, 0)
	set_pev(index, pev_armorvalue, 0.0)
	set_pev(index, pev_renderamt, 0.0)
	set_pev(index, pev_rendermode, kRenderTransTexture)
	
	fm_set_user_armortype(index, CS_ARMOR_NONE)
	fm_set_user_nvg(index)
	
	if(get_pcvar_num(cvar_autonvg)) 
		engclient_cmd(index, "nightvision")
	
	if(!pev_valid(g_modelent[index]))
	{
		static ent
		ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
		if(pev_valid(ent))
		{
			engfunc(EngFunc_SetModel, ent, g_class_pmodel[g_player_class[index]])
			set_pev(ent, pev_classname, MODEL_CLASSNAME)
			set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
			set_pev(ent, pev_aiment, index)
			set_pev(ent, pev_owner, index)
				
			g_modelent[index] = ent
		}
	}
	else
	{
		engfunc(EngFunc_SetModel, g_modelent[index], g_class_pmodel[g_player_class[index]])
		fm_set_entity_visibility(g_modelent[index], 1)
	}

	static effects
	effects = pev(index, pev_effects)
	
	if(effects & EF_DIMLIGHT)
	{
		message_begin(MSG_ONE, g_msg_flashlight, _, index)
		write_byte(0)
		write_byte(100)
		message_end()
		
		set_pev(index, pev_effects, effects & ~EF_DIMLIGHT)
	}

	if( get_pcvar_num( cvar_zombie_appear_sound ) == 1 )
		PlaySound( g_appear_sounds[ random_num( 0, charsmax( g_appear_sounds ) ) ] );
}

PlaySound( const szSound[  ] ) {

	client_cmd( 0, "spk ^"%s^"", szSound );
}

stock bool:allow_infection()
{
	static count[2]
	count[0] = 0
	count[1] = 0
	
	static index, maxzombies
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(is_user_connected(index) && g_zombie[index]) 
			count[0]++
		else if(is_user_alive(index)) 
			count[1]++
	}
	
	maxzombies = clamp(get_pcvar_num(cvar_maxzombies), 1, 31)
	return (count[0] < maxzombies && count[1] > 1) ? true : false
}

stock randomly_pick_zombie()
{
	static data[4]
	data[0] = 0 
	data[1] = 0 
	data[2] = 0 
	data[3] = 0
	
	static index, players[2][32]
	for(index = 1; index <= g_maxplayers; index++)
	{
		if(!is_user_alive(index)) 
			continue
		
		if(g_zombie[index])
		{
			data[0]++
			players[0][data[2]++] = index
		}
		else 
		{
			data[1]++
			players[1][data[3]++] = index
		}
	}

	if(data[0] > 0 &&  data[1] < 1) 
		return players[0][_random(data[2])]
	
	return (data[0] < 1 && data[1] > 0) ?  players[1][_random(data[3])] : 0
}

stock equipweapon(id, weapon)
{
	if(!is_user_alive(id)) 
		return

	static weaponid[2], weaponent, weapname[32]
	
	if(weapon & EQUIP_PRI)
	{
		weaponent = fm_lastprimary(id)
		weaponid[1] = get_weaponid(g_primaryweapons[g_player_weapons[id][0]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_primaryweapons[g_player_weapons[id][0]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}

	if(weapon & EQUIP_SEC)
	{
		weaponent = fm_lastsecondry(id)
		weaponid[1] = get_weaponid(g_secondaryweapons[g_player_weapons[id][1]][1])
		
		if(pev_valid(weaponent))
		{
			weaponid[0] = fm_get_weapon_id(weaponent)
			if(weaponid[0] != weaponid[1])
			{
				get_weaponname(weaponid[0], weapname, 31)
				bacon_strip_weapon(id, weapname)
			}
		}
		else
			weaponid[0] = -1
		
		if(weaponid[0] != weaponid[1])
			bacon_give_weapon(id, g_secondaryweapons[g_player_weapons[id][1]][1])
		
		fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
	}
	
	if(weapon & EQUIP_GREN)
	{
		static i
		for(i = 0; i < sizeof g_grenades; i++) if(!user_has_weapon(id, get_weaponid(g_grenades[i])))
			bacon_give_weapon(id, g_grenades[i])
	}
}

stock add_delay(index, const task[])
{
	switch(index)
	{
		case 1..8:   set_task(0.1, task, index)
		case 9..16:  set_task(0.2, task, index)
		case 17..24: set_task(0.3, task, index)
		case 25..32: set_task(0.4, task, index)
	}
}

stock set_biohazard_icon(id, mode, red, green, blue) {

	message_begin(MSG_ONE, get_user_msgid("StatusIcon"), {0,0,0}, id);
	write_byte(mode); // status (0=hide, 1=show, 2=flash)
	write_string("dmg_bio"); // sprite name
	write_byte(red); // red
	write_byte(green); // green
	write_byte(blue); // blue
	message_end();
}

stock FixedUnsigned16(Float:flValue, iScale) {
	new iOutput;
	
	iOutput = floatround(flValue * iScale);
	if(iOutput < 0)
		iOutput = 0;
	
	if(iOutput > 0xFFFF)
		iOutput = 0xFFFF;
	return iOutput;
}

stock UTIL_ScreenFade(id=0,iColor[3],Float:flFxTime=-1.0,Float:flHoldTime=0.0,iAlpha=0,iFlags=FFADE_IN,bool:bReliable=false,bool:bExternal=false) {
	if(id && !is_user_connected(id))
		return;
	
	new iFadeTime;
	if(flFxTime == -1.0) {
		iFadeTime = 4;
	}
	else {
		iFadeTime = FixedUnsigned16(flFxTime , 1<<12);
	}
	
	static gmsgScreenFade;
	if(!gmsgScreenFade) {
		gmsgScreenFade = get_user_msgid("ScreenFade");
	}
	
	new MSG_DEST;
	if(bReliable) {
		MSG_DEST = id ? MSG_ONE : MSG_ALL;
	}
	else {
		MSG_DEST = id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST;
	}
	
	if(bExternal) {
		emessage_begin(MSG_DEST, gmsgScreenFade, _, id);
		ewrite_short(iFadeTime);
		ewrite_short(FixedUnsigned16(flHoldTime , 1<<12));
		ewrite_short(iFlags);
		ewrite_byte(iColor[0]);
		ewrite_byte(iColor[1]);
		ewrite_byte(iColor[2]);
		ewrite_byte(iAlpha);
		emessage_end();
	}
	else {
		message_begin(MSG_DEST, gmsgScreenFade, _, id);
		write_short(iFadeTime);
		write_short(FixedUnsigned16(flHoldTime , 1<<12));
		write_short(iFlags);
		write_byte(iColor[0]);
		write_byte(iColor[1]);
		write_byte(iColor[2]);
		write_byte(iAlpha);
		message_end();
	}
}

#if defined GRENADE_STATUS
public GrenadeStatus(  ) {

	// Nade Status Cvar
	cvar_status = register_cvar("bio_nadestatus_icon","1") // [0=Hide | 1=Show | 2=Flash (Don't work with red color)]
	
	// Fire Grenade Cvars
	cvar_fire_icon = register_cvar("bio_firenade_icon","1") // [0=Disable | 1=Enable]
	cvar_fire_color = register_cvar("bio_firenade_color","255 0 0") // Color of Fire Nade in RGB
	
	// Frost Grenade Cvars
	cvar_frost_icon = register_cvar("bio_frostnade_icon","1") // [0=Disable | 1=Enable]
	cvar_frost_color = register_cvar("bio_frostnade_color","100 149 237") // Color of Frost Nade in RGB
	
	// Flare Grenade Cvars
	cvar_flare_icon = register_cvar("bio_flarenade_icon","1") // [0=Disable | 1=Enable]
	cvar_flare_color = register_cvar("bio_flarenade_color","255 255 255") // Color of Flare Nade in RGB

	register_event("CurWeapon", "GrenadeIcon", "be", "1=1")
	
	g_StatusIcon = get_user_msgid("StatusIcon")
}

public GrenadeIcon( id ) {

	RemoveGrenadeIcon( id );
		
	if( is_user_bot( id ) )
		return 1;
		
	static NadeType, GrenadeSprite[ 16 ], Color[ 17 ], Red[ 5 ], Green[ 5 ], Blue[ 5 ];
	NadeType = get_user_weapon( id )
	
	switch( NadeType ) {

		case CSW_HEGRENADE: {

			if( !g_zombie[ id ] ) {

				if( !get_pcvar_num( cvar_fire_icon ) )
					return 1;
				
				GrenadeSprite = "dmg_heat";
				get_pcvar_string( cvar_fire_color, Color, charsmax( Color ) );
				
			}
		}

		case CSW_FLASHBANG: {

			if( !get_pcvar_num( cvar_frost_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_cold";
			get_pcvar_string( cvar_frost_color, Color, charsmax( Color ) );
		}

		case CSW_SMOKEGRENADE: {

			if( !get_pcvar_num( cvar_flare_icon ) )
				return 1;
			
			GrenadeSprite = "dmg_shock";
			get_pcvar_string( cvar_flare_color, Color, charsmax( Color ) );
		}

		default: return 1;
	}

	parse( Color, Red, charsmax( Red ), Green, charsmax( Green ), Blue, charsmax( Blue ) );
	g_GrenadeIcon[ id ] = GrenadeSprite;
	
	message_begin( MSG_ONE, g_StatusIcon, {0, 0, 0 }, id );
	write_byte( get_pcvar_num( cvar_status ) ) // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] ) // Sprite Name
	write_byte( str_to_num( Red ) ) // Red
	write_byte( str_to_num( Green ) ) // Green
	write_byte( str_to_num( Blue ) ) // Blue
	message_end(  );

	return 1;
}

public RemoveGrenadeIcon( id ) {

	message_begin( MSG_ONE, g_StatusIcon, { 0, 0, 0 },id );
	write_byte( 0 ); // Status [0=Hide, 1=Show, 2=Flash]
	write_string( g_GrenadeIcon[ id ] );
	message_end(  )
}
#endif

stock HudMessage(const id, const message[], red = 0, green = 160, blue = 0, Float:x = -1.0, Float:y = 0.65, effects = 2, Float:fxtime = 0.01, Float:holdtime = 3.0, Float:fadeintime = 0.01, Float:fadeouttime = 0.01) {
	new count = 1, players[32];
	
	if(id) players[0] = id;
	else get_players(players, count, "ch"); {
		for(new i = 0; i < count; i++) {
			if(is_user_connected(players[i])) {	
				new color = pack_color(clamp_byte(red), clamp_byte(green), clamp_byte(blue))
				
				message_begin(MSG_ONE_UNRELIABLE, SVC_DIRECTOR, _, players[i]);
				write_byte(strlen(message) + 31);
				write_byte(DRC_CMD_MESSAGE);
				write_byte(effects);
				write_long(color);
				write_long(_:x);
				write_long(_:y);
				write_long(_:fadeintime);
				write_long(_:fadeouttime);
				write_long(_:holdtime);
				write_long(_:fxtime);
				write_string(message);
				message_end();
			}
		}
	}
}

stock ColorChat( const id, const input[  ], any:... ) {

	new iCount = 1, szPlayers[ 32 ];
	static szMsg[ 191 ];

	vformat( szMsg, 190, input, 3 );

	replace_all( szMsg, 190, "!4", "^4" );
	replace_all( szMsg, 190, "!1", "^1" );
	replace_all( szMsg, 190, "!3", "^3" );

	if( id ) {
		szPlayers[ 0 ] = id;
	} else {
		get_players( szPlayers, iCount, "ch" );
	}

	for( new i = 0; i < iCount; i++ ) {

		if( is_user_connected( szPlayers[ i ] ) ) {

			message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "SayText" ), _, szPlayers[ i ] );
			write_byte( szPlayers[ i ] );
			write_string( szMsg );
			message_end(  );
		}
	}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1048\\ f0\\ fs16 \n\\ par }
*/
[/code]


Dupa care am intrat aici http://www.amxmodx.org/webcompiler.cgi si l-am compilat.

Cand pornesc serverul, imi arata la fel:

Image

Daca poti da-mi add pe y!m: lover_pro14 , si iti dau teamviewer , poate am gresit eu cu ceva la instelare..


Esti destept foc =)) tu nu vezi ce scrie la tine on consola?(la serverul de cs)
Server IP adress 192.168.0.10 ,asta il bagi in biohazard.sma la licentiere, nu ip-ul de pe net (my ip_
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

30 Jul 2014, 14:14

ia stai putin,tu ai serverul hostat ? daca da baga ip'ul de la host nu de la pc'ul tau :O cum a spus userul mai de mai sus
prolover14
Membru, skill 0
Membru, skill 0
Posts: 16
Joined: 28 Jul 2014, 00:18
Detinator Steam: Nu
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Has thanked: 2 times
Contact:

30 Jul 2014, 16:42

# Doctor whO? <3 - Ce sari asa frate ca nu am stiut.
# scosmynnnn - Multumesc pentru ajutor ai un multumesc :) poti da TC
Post Reply

Return to “Probleme la servere dedicate de Counter-Strike”

  • Information