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

tag mismatch


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
m3t3hann
Junior Member
Join Date: Dec 2020
Old 06-07-2023 , 05:56   tag mismatch
Reply With Quote #1

Hello,when I am trying to compile Hidenseek by Exolent plugin

I got this problem:
HTML Code:
hidensekk.sma(3009) : warning 213: tag mismatch
Can someone solve this problem please ?
Attached Files
File Type: sma Get Plugin or Get Source (hidensekk.sma - 72 views - 84.9 KB)
m3t3hann is offline
lexzor
Veteran Member
Join Date: Nov 2020
Old 06-07-2023 , 06:34   Re: tag mismatch
Reply With Quote #2

this is not a problem, it's a warning

Code:
/*

	HideNSeek
	Version 2.8
	By Exolent
	
	Information about this plugin can be found at:
	http://forums.alliedmods.net/showthread.php?t=65370

*/

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <fakemeta_util>

/* YAY! No <cstrike> <csx> <fun> or <engine>!! =D */


#define PLUGIN_NAME	"HideNSeek"
#define PLUGIN_VERSION	"2.8"
#define PLUGIN_AUTHOR	"Exolent"


#pragma semicolon 1


/* save memory */
new const g_sBlank[] = "";
new const g_sA[] = "a";
new const g_sB[] = "b";
new const g_sS[] = "s";
new const g_sKnifeModel_v[] = "models/v_knife.mdl";
new const g_sKnifeModel_w[] = "models/w_knife.mdl";
new const g_sModel[] = "model";
new const g_sLightsNormal[] = "m";
new const g_sClassBreakable[] = "func_breakable";
new const g_sClassDoor[] = "func_door";
new const g_sClassDoorRotating[] = "func_door_rotating";

/* end of save memory globals */

#define OFFSET_ARMORTYPE		112
#define OFFSET_TEAM			114
#define OFFSET_MONEY			115
#define OFFSET_INTERNALMODEL		126
#define OFFSET_AWP_AMMO			377 
#define OFFSET_SCOUT_AMMO		378
#define OFFSET_PARA_AMMO		379
#define OFFSET_FAMAS_AMMO		380
#define OFFSET_M3_AMMO			381
#define OFFSET_USP_AMMO			382
#define OFFSET_FIVESEVEN_AMMO		383
#define OFFSET_DEAGLE_AMMO		384
#define OFFSET_P228_AMMO		385
#define OFFSET_GLOCK_AMMO		386
#define OFFSET_FLASHBANG_AMMO		387
#define OFFSET_HEGRENADE_AMMO		388
#define OFFSET_SMOKEGRENADE_AMMO	389
#define OFFSET_C4_AMMO			390

#define cs_set_user_bpammo(%1,%2,%3) set_pdata_int(%1, __get_ammo_offset(%2), %3)
#define cs_set_user_model(%1,%2) engfunc(EngFunc_SetClientKeyValue, %1, engfunc(EngFunc_GetInfoKeyBuffer, %1), g_sModel, %2)
#define cs_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), g_sModel, %2, %3)

/* END OF CSTRIKE TO FAKEMETA CONVERSION */


#define HIDE_MONEY		(1<<5)

new const CsTeams:HNS_TEAM_HIDER = CS_TEAM_T;
new const CsTeams:HNS_TEAM_SEEKER = CS_TEAM_CT;

new const CsInternalModel:HNS_MODEL_HIDER = CS_T_LEET;
new const CsInternalModel:HNS_MODEL_SEEKER = CS_CT_GIGN;

enum
{
	SCRIM_NONE = 0,
	SCRIM_ROUNDS,
	SCRIM_POINTS,
	
	SCRIM_TYPES
};

new const g_sBuyCommands[][] =
{
	"usp", "glock", "deagle", "p228", "elites",
	"fn57", "m3", "xm1014", "mp5", "tmp", "p90",
	"mac10", "ump45", "ak47", "galil", "famas",
	"sg552", "m4a1", "aug", "scout", "awp", "g3sg1",
	"sg550", "m249", "vest", "vesthelm", "flash",
	"hegren", "sgren", "defuser", "nvgs", "shield",
	"primammo", "secammo", "km45", "9x19mm", "nighthawk",
	"228compact", "fiveseven", "12gauge", "autoshotgun",
	"mp", "c90", "cv47", "defender", "clarion", "krieg552",
	"bullpup", "magnum", "d3au1", "krieg550"
};
new const MAX_BUY_COMMANDS = sizeof(g_sBuyCommands);
new const g_sRemoveEntities[][] =
{
	"func_bomb_target",
	"info_bomb_target",
	"hostage_entity",
	"monster_scientist",
	"func_hostage_rescue",
	"info_hostage_rescue",
	"info_vip_start",
	"func_vip_safetyzone",
	"func_escapezone",
	"armoury_entity"
};
new const MAX_REMOVED_ENTITIES = sizeof(g_sRemoveEntities);
new const g_sAllModels[CsTeams][][] =
{
	{"", "", "", ""},
	{"terror", "arctic", "leet", "guerilla"},
	{"gign", "gsg9", "sas", "urban"},
	{"", "", "", ""}
};
new const g_sDefaultModels[CsTeams][] =
{
	"",
	"leet",
	"gign",
	""
};
new const g_sTeamInfo[CsTeams][] =
{
	"UNASSIGNED",
	"TERRORIST",
	"CT",
	"SPECTATOR"
};
new const g_sTeamNames[CsTeams][] =
{
	"Spectator",
	"Terrorist",
	"Counter-Terrorist",
	"Spectator"
};

enum (+= 1000)
{
	TASK_ID_STRIPWEAPONS = 1000,
	TASK_ID_GIVEWEAPONS,
	TASK_ID_GIVEKNIFE,
	TASK_ID_CHECKMODEL,
	TASK_ID_HIDETIMER,
	TASK_ID_SWAPTEAMS,
	TASK_ID_SETLIGHTS,
	TASK_ID_SHOWPLUGININFO,
	TASK_ID_SCRIMVOTE
};

new const g_PlayerTasks[] =
{
	TASK_ID_STRIPWEAPONS,
	TASK_ID_GIVEWEAPONS,
	TASK_ID_GIVEKNIFE,
	TASK_ID_CHECKMODEL,
	TASK_ID_SHOWPLUGININFO
};
new const MAX_PLAYER_TASKS = sizeof(g_PlayerTasks);

new bool:g_bHnsOn = true;
new bool:g_bScrimOn;
new bool:g_bWarmup;

new g_ScrimVoteTimer;
new g_ScrimVoteCount[SCRIM_TYPES];
new bool:g_bScrimVoted[33];

new g_ScrimType;
new CsTeams:g_ScrimWinner;
new g_ScrimSaveWins;
new g_ScrimRounds[CsTeams];
new g_ScrimLosses[CsTeams];
new g_ScrimMaxRounds;
new g_ScrimMaxLosses;
new bool:g_bScrimIsDraw;
new CsTeams:g_ScrimTeams[3];
new g_ScrimTeamNums[CsTeams];
new g_ScrimScores[CsTeams];

new g_PointsKnife;
new g_PointsHeadshot;
new g_PointsGrenade;
new g_PointsKill;
new g_PointsSuicide;
new g_PointsTeamKill;
new g_PointsRoundWin;
new g_PointsRoundLose;

new bool:g_bRestartRound;

new bool:g_bConnected[33];
new bool:g_bAlive[33];
new bool:g_bFirstSpawn[33];
new CsTeams:g_Team[33];

new bool:g_bSolid[33];
new bool:g_bRestoreSolid[33];

new bool:g_bWeaponsGiven;

new g_sHelpMotd[43];
new g_sScrimMotd[49];

new Float:g_fKillMsgDelay[33];

new g_RoundsLost;
new g_RoundsEnded;

new bool:g_bDisableSlash = true;

new g_HideTimer;

new g_OldMoney;

new g_sLights[16];

new bool:g_bNonSpawnEvent[33];
new g_FwdClientCommand_post;

new bool:g_bRemovedBreakables;
new bool:g_bRemovedDoors;
new bool:g_bRemovedDoorsRotating;

new Float:g_fBoostPunishDelay[33];
new Float:g_fBoostMessageDelay[33];

new g_BoostHud;

new hns_footsteps;
new hns_money;
new hns_nubslash;
new hns_disablebuy;
new hns_hiders_knife;
new hns_grenades[CsTeams];
new hns_grenades_percent[CsTeams];
new hns_flashbangs[CsTeams];
new hns_flashbangs_percent[CsTeams];
new hns_smokegren[CsTeams];
new hns_smokegren_percent[CsTeams];
new hns_armor[CsTeams];
new hns_hidetime;
new hns_timersounds;
new hns_noslowdown;
new hns_teamchange;
new hns_disablekill;
new hns_blindcolors;
new hns_hudcolors;
new hns_hiders_alivefrags;
new hns_lights;
new hns_visiblecommands;
new hns_chooseteam;
new hns_semiclip;
new hns_semiclip_alpha;
new hns_gametype;
new hns_prefix;
new hns_removebreakables;
new hns_noflash;
new hns_removedoors;
new hns_noboosting;
new hns_noboosting_damage;
new hns_noboosting_punish;
new hns_noboosting_interval;
new hns_warmup_godmode;
new hns_warmup_respawn;

new hnss_prefix;
new hnss_vote_timer;
new hnss_rounds_wins;
new hnss_rounds_losses;
new hnss_rounds_savewins;
new hnss_points_knife;
new hnss_points_headshot;
new hnss_points_grenade;
new hnss_points_kill;
new hnss_points_suicide;
new hnss_points_teamkill;
new hnss_points_roundwin;
new hnss_points_roundlose;
new hnss_points_rounds;

new amx_vote_answers;
new sv_restart;

new g_msgSayText;
new g_msgHideWeapon;
new g_msgScreenFade;
new g_msgTeamInfo;
new g_msgMoney;
new g_msgArmorType;

new g_MaxPlayers;
new g_MaxEntities;

new g_HostageEnt;

public plugin_precache()
{
	register_forward(FM_Spawn, "fwdSpawn", 0);
	
	new allocHostageEntity = engfunc(EngFunc_AllocString, "hostage_entity");
	do
	{
		g_HostageEnt = engfunc(EngFunc_CreateNamedEntity, allocHostageEntity);
	}
	while( !pev_valid(g_HostageEnt) );
	
	engfunc(EngFunc_SetOrigin, g_HostageEnt, Float:{0.0, 0.0, -55000.0});
	engfunc(EngFunc_SetSize, g_HostageEnt, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 1.0});
	dllfunc(DLLFunc_Spawn, g_HostageEnt);
	
	return PLUGIN_CONTINUE;
}

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	
	register_cvar(PLUGIN_NAME, PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY, 0.0);
	
	new sBuyHandle[] = "cmdBuy";
	register_clcmd("buy", sBuyHandle, -1, g_sBlank);
	register_clcmd("buyammo1", sBuyHandle, -1, g_sBlank);
	register_clcmd("buyammo2", sBuyHandle, -1, g_sBlank);
	register_clcmd("buyequip", sBuyHandle, -1, g_sBlank);
	register_clcmd("cl_autobuy", sBuyHandle, -1, g_sBlank);
	register_clcmd("cl_rebuy", sBuyHandle, -1, g_sBlank);
	register_clcmd("cl_setautobuy", sBuyHandle, -1, g_sBlank);
	register_clcmd("cl_setrebuy", sBuyHandle, -1, g_sBlank);
	
	register_concmd("hns_status", "cmdHnsStatus", ADMIN_KICK, "<0|1> -- 0=HNS OFF   1=HNS ON");
	register_concmd("hns_scrim", "cmdScrim", ADMIN_KICK, "<0|1> -- 0=STOP SCRIM   1=START SCRIM");
	register_concmd("hns_scrimtype", "cmdScrimType", ADMIN_KICK, "<0|1|2> -- 0=VOTE TYPE   1=WIN ROUNDS   2=POINT SYSTEM");
	register_concmd("hns_captains", "cmdCaptains", ADMIN_KICK, "-- chooses two (2) random players to be captains for a pug");
	register_concmd("hns_warmup", "cmdWarmup", ADMIN_KICK, "<0|1> -- 0=STOP WARMUP   1=START WARMUP");
	
	new sPointsHandle[] = "cmdPoints";
	register_say_command("hnshelp", "cmdHelp", -1, g_sBlank);
	register_say_command("scrimhelp", "cmdScrimHelp", -1, g_sBlank);
	register_say_command("points", sPointsHandle, -1, g_sBlank);
	register_say_command("scores", sPointsHandle, -1, g_sBlank);
	register_say_command("wins", sPointsHandle, -1, g_sBlank);
	register_say_command("rounds", "cmdRounds", -1, g_sBlank);
	register_say_command("team", "cmdTeam", -1, g_sBlank);
	
	register_forward(FM_Touch, "fwdTouch", 0);
	register_forward(FM_CmdStart, "fwdCmdStart", 0);
	register_forward(FM_SetModel, "fwdSetModel", 0);
	register_forward(FM_ClientKill, "fwdClientKill", 0);
	register_forward(FM_PlayerPreThink, "fwdPlayerPreThink", 0);
	register_forward(FM_PlayerPostThink, "fwdPlayerPostThink", 0);
	register_forward(FM_AddToFullPack, "fwdAddToFullPackPost", 1);
	//register_forward(FM_GetGameDescription, "fwdGetGameDescription", 0);
	register_forward(FM_Voice_SetClientListening, "fwdSetVoice", 0);
	
	register_event("TextMsg", "eventRestartAttempt", g_sA, "2&#Game_w");
	register_clcmd("fullupdate", "cmdFullupdate", -1, g_sBlank);
	
	hns_footsteps = register_cvar("hns_footsteps", "1", 0, 0.0);
	hns_money = register_cvar("hns_money", "0", 0, 0.0);
	hns_nubslash = register_cvar("hns_nubslash", "3", 0, 0.0);
	hns_disablebuy = register_cvar("hns_disablebuy", "1", 0, 0.0);
	hns_hiders_knife = register_cvar("hns_hiders_knife", "1", 0, 0.0);
	hns_grenades[HNS_TEAM_HIDER] = register_cvar("hns_hiders_grenades", "1", 0, 0.0);
	hns_grenades_percent[HNS_TEAM_HIDER] = register_cvar("hns_hiders_grenades_percent", "100", 0, 0.0);
	hns_flashbangs[HNS_TEAM_HIDER] = register_cvar("hns_hiders_flashbangs", "2", 0, 0.0);
	hns_flashbangs_percent[HNS_TEAM_HIDER] = register_cvar("hns_hiders_flashbangs_percent", "100", 0, 0.0);
	hns_smokegren[HNS_TEAM_HIDER] = register_cvar("hns_hiders_smokegren", "1", 0, 0.0);
	hns_smokegren_percent[HNS_TEAM_HIDER] = register_cvar("hns_hiders_smokegren_percent", "100", 0, 0.0);
	hns_armor[HNS_TEAM_HIDER] = register_cvar("hns_hiders_armor", "100", 0, 0.0);
	hns_grenades[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_grenades", "0", 0, 0.0);
	hns_grenades_percent[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_grenades_percent", "0", 0, 0.0);
	hns_flashbangs[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_flashbangs", "0", 0, 0.0);
	hns_flashbangs_percent[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_flashbangs_percent", "0", 0, 0.0);
	hns_smokegren[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_smokegren", "0", 0, 0.0);
	hns_smokegren_percent[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_smokegren_percent", "0", 0, 0.0);
	hns_armor[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_armor", "100", 0, 0.0);
	hns_hidetime = register_cvar("hns_hidetime", "10", 0, 0.0);
	hns_timersounds = register_cvar("hns_timersounds", "1", 0, 0.0);
	hns_noslowdown = register_cvar("hns_noslowdown", "0", 0, 0.0);
	hns_teamchange = register_cvar("hns_teamchange", "0", 0, 0.0);
	hns_disablekill = register_cvar("hns_disablekill", "1", 0, 0.0);
	hns_blindcolors = register_cvar("hns_blindcolors", "0 0 0 255", 0, 0.0);
	hns_hudcolors = register_cvar("hns_hudcolors", "0 255 0", 0, 0.0);
	hns_hiders_alivefrags = register_cvar("hns_hiders_alivefrags", "1", 0, 0.0);
	hns_lights = register_cvar("hns_lights", g_sLightsNormal, 0, 0.0);
	hns_visiblecommands = register_cvar("hns_visiblecommands", "0", 0, 0.0);
	hns_chooseteam = register_cvar("hns_chooseteam", "0", 0, 0.0);
	hns_semiclip = register_cvar("hns_semiclip", "1", 0, 0.0);
	hns_semiclip_alpha = register_cvar("hns_semiclip_alpha", "127", 0, 0.0);
	hns_prefix = register_cvar("hns_prefix", "[HNS]", 0, 0.0);
	hns_removebreakables = register_cvar("hns_removebreakables", "1", 0, 0.0);
	hns_noflash = register_cvar("hns_noflash", "1", 0, 0.0);
	hns_removedoors = register_cvar("hns_removedoors", "1", 0, 0.0);
	hns_noboosting = register_cvar("hns_noboosting", "1", 0, 0.0);
	hns_noboosting_damage = register_cvar("hns_noboosting_damage", "25", 0, 0.0);
	hns_noboosting_punish = register_cvar("hns_noboosting_punish", "3", 0, 0.0);
	hns_noboosting_interval = register_cvar("hns_noboosting_interval", "1.0", 0, 0.0);
	hns_warmup_godmode = register_cvar("hns_warmup_godmode", "1", 0, 0.0);
	hns_warmup_respawn = register_cvar("hns_warmup_respawn", "1", 0, 0.0);
	
	new sHideNSeek[32];
	formatex(sHideNSeek, 31, "HideNSeek v%s", PLUGIN_VERSION);
	hns_gametype = register_cvar("hns_gametype", sHideNSeek, 0, 0.0);
	
	hnss_prefix = register_cvar("hnss_prefix", "[HNS-SCRIM]", 0, 0.0);
	hnss_vote_timer = register_cvar("hnss_vote_timer", "30", 0, 0.0);
	hnss_rounds_wins = register_cvar("hnss_rounds_wins", "3", 0, 0.0);
	hnss_rounds_losses = register_cvar("hnss_rounds_losses", "5", 0, 0.0);
	hnss_rounds_savewins = register_cvar("hnss_rounds_savewins", "0", 0, 0.0);
	hnss_points_knife = register_cvar("hnss_points_knife", "1", 0, 0.0);
	hnss_points_headshot = register_cvar("hnss_points_headshot", "1", 0, 0.0);
	hnss_points_grenade = register_cvar("hnss_points_grenade", "2", 0, 0.0);
	hnss_points_kill = register_cvar("hnss_points_kill", "1", 0, 0.0);
	hnss_points_suicide = register_cvar("hnss_points_suicide", "1", 0, 0.0);
	hnss_points_teamkill = register_cvar("hnss_points_teamkill", "2", 0, 0.0);
	hnss_points_roundwin = register_cvar("hnss_points_roundwin", "1", 0, 0.0);
	hnss_points_roundlose = register_cvar("hnss_points_roundlose", "1", 0, 0.0);
	hnss_points_rounds = register_cvar("hnss_points_rounds", "10", 0, 0.0);
	
	g_BoostHud = CreateHudSyncObj();
	
	amx_vote_answers = get_cvar_pointer("amx_vote_answers");
	sv_restart = get_cvar_pointer("sv_restart");
	
	g_msgSayText = get_user_msgid("SayText");
	g_msgHideWeapon = get_user_msgid("HideWeapon");
	g_msgScreenFade = get_user_msgid("ScreenFade");
	g_msgTeamInfo = get_user_msgid("TeamInfo");
	g_msgMoney = get_user_msgid("Money");
	g_msgArmorType = get_user_msgid("ArmorType");
	
	register_message(g_msgHideWeapon, "messageHideWeapon");
	register_message(g_msgScreenFade, "messageScreenFade");
	
	register_event("ResetHUD", "eventResetHUD", g_sB);
	register_event("Money", "eventMoney", g_sB);
	register_event("HLTV", "eventNewRound", g_sA, "1=0", "2=0");
	register_event("SendAudio", "eventTerrWin", g_sA, "2=%!MRAD_terwin");
	register_event("TextMsg", "eventRestartRound", g_sA, "2&#Game_C", "2&#Game_w");
	register_event("CurWeapon", "eventCurWeapon", g_sB, "1=1");
	register_event("DeathMsg", "eventDeathMsg", g_sA, "2!0");
	
	register_logevent("logeventRoundStart", 2, "1=Round_Start");
	register_logevent("logeventRoundEnd", 2, "1=Round_End");
	
	g_MaxPlayers = global_get(glb_maxClients);
	g_MaxEntities = global_get(glb_maxEntities);
	
	copy(g_sLights, 15, g_sLightsNormal);
	set_task(1.0, "taskSetLights", TASK_ID_SETLIGHTS, g_sBlank, 0, g_sB, 0);
	
	new dir[23];
	get_configsdir(dir, 22);
	
	formatex(g_sHelpMotd, 42, "%s/hidenseek_help.txt", dir);
	formatex(g_sScrimMotd, 48, "%s/hidenseek_scrim_help.txt", dir);
	
	set_task(1.0, "taskExecuteConfig");
	
	return PLUGIN_CONTINUE;
}

public plugin_natives()
{
	register_library("hidenseek");
	register_native("hns_get_status", "_GetHnsStatus");
	register_native("hnss_get_status", "_GetScrimStatus");
	
	return PLUGIN_CONTINUE;
}

public bool:_GetHnsStatus(plugin, params)
{
	return g_bHnsOn;
}

public bool:_GetScrimStatus(plugin, params)
{
	return g_bScrimOn;
}

public client_putinserver(plr)
{
	g_bConnected[plr] = true;
	g_bAlive[plr] = false;
	g_bFirstSpawn[plr] = false;
	
	return PLUGIN_CONTINUE;
}

public client_disconnected(plr)
{
	g_bConnected[plr] = false;
	
	for( new i = 0; i < MAX_PLAYER_TASKS; i++ )
	{
		remove_task(plr + g_PlayerTasks[i], 0);
	}
	
	if( g_ScrimVoteTimer > 0 && !g_bScrimVoted[plr] )
	{
		g_bScrimVoted[plr] = true;
	
		if( check_last_vote(plr) )
		{
			g_ScrimVoteTimer = 1;
		}
	}
	
	return PLUGIN_CONTINUE;
}

public client_command(plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	new sArg[13];
	if( read_argv(0, sArg, 12) > 11 )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( equali(sArg, "chooseteam") && (CS_TEAM_UNASSIGNED < cs_get_user_team(plr) < CS_TEAM_SPECTATOR) )
	{
		new CsTeams:team = cs_get_user_team(plr);
		new chooseteam = get_pcvar_num(hns_chooseteam);
		
		if( team != HNS_TEAM_HIDER && team != HNS_TEAM_SEEKER
		|| chooseteam == 1
		|| chooseteam == 2 && is_user_admin(plr) )
		{
			return PLUGIN_CONTINUE;
		}
		
		return PLUGIN_HANDLED;
	}
	
	if( !get_pcvar_num(hns_disablebuy) )
	{
		return PLUGIN_CONTINUE;
	}
	
	for( new i = 0; i < MAX_BUY_COMMANDS; i++ )
	{
		if( equali(g_sBuyCommands[i], sArg, 0) )
		{
			return PLUGIN_HANDLED;
		}
	}
	
	return PLUGIN_CONTINUE;
}

public cmdBuy(plr)
{
	return (g_bHnsOn && get_pcvar_num(hns_disablebuy)) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
}

public cmdFullupdate(plr)
{
	g_bNonSpawnEvent[plr] = true;
	
	g_FwdClientCommand_post = register_forward(FM_ClientCommand, "fwdClientCommandPost", 1);
	
	return PLUGIN_CONTINUE;
}

public cmdHnsStatus(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 2) )
	{
		return PLUGIN_HANDLED;
	}
	
	new sArg[16];
	read_argv(1, sArg, 15);
	
	new bool:bOn = bool:clamp(str_to_num(sArg), 0, 1);
	
	if( bOn == g_bHnsOn )
	{
		new sPrefix[16];
		get_pcvar_string(hns_prefix, sPrefix, 15);
		
		console_print(plr, "%s HideNSeek is already o%s!", sPrefix, g_bHnsOn ? "n" : "ff");
		return PLUGIN_HANDLED;
	}
	
	g_bHnsOn = bOn;
	set_pcvar_num(sv_restart, 1);
	
	new sName[64]; /* server hostnames can be longer than player names */
	get_user_name(plr, sName, 63);
	
	hns_print(0, "^x03%s :^x01  st%sed HideNSeek!", sName, bOn ? "art" : "opp");
	
	return PLUGIN_HANDLED;
}

public cmdScrim(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 2) )
	{
		return PLUGIN_HANDLED;
	}
	
	new sArg[2];
	read_argv(1, sArg, 1);
	new bool:bScrim = bool:clamp(str_to_num(sArg), 0, 1);
	
	if( bScrim == g_bScrimOn )
	{
		console_print(plr, "[HNS] Scrim mod is already %s!", g_bScrimOn ? "on" : "off");
		return PLUGIN_HANDLED;
	}
	
	if( bScrim && !g_bHnsOn )
	{
		console_print(plr, "[HNS] HideNSeek must be on to start a scrim!");
		return PLUGIN_HANDLED;
	}
	
	new sName[64]; /* server hostnames can be long */
	get_user_name(plr, sName, 63);
	scrim_print(0, "^x03%s^x01 :  %s the HideNSeek scrim!", sName, bScrim ? "started" : "stopped");
	
	if( bScrim )
	{
		if( g_ScrimType == SCRIM_NONE )
		{
			show_scrim_vote();
		}
		else
		{
			if( g_ScrimType == SCRIM_POINTS )
			{
				/* in case of an odd number, we need to round it up one */
				g_ScrimMaxRounds = floatround(get_pcvar_float(hnss_points_rounds) / 2.0, floatround_ceil) * 2;
				
				g_PointsKnife = get_pcvar_num(hnss_points_knife);
				g_PointsHeadshot = get_pcvar_num(hnss_points_headshot);
				g_PointsGrenade = get_pcvar_num(hnss_points_grenade);
				g_PointsKill = get_pcvar_num(hnss_points_kill);
				g_PointsSuicide = get_pcvar_num(hnss_points_suicide);
				g_PointsTeamKill = get_pcvar_num(hnss_points_teamkill);
				g_PointsRoundWin = get_pcvar_num(hnss_points_roundwin);
				g_PointsRoundLose = get_pcvar_num(hnss_points_roundlose);
			}
			else if( g_ScrimType == SCRIM_ROUNDS )
			{
				g_ScrimMaxRounds = get_pcvar_num(hnss_rounds_wins);
				g_ScrimMaxLosses = get_pcvar_num(hnss_rounds_losses);
				g_ScrimSaveWins = get_pcvar_num(hnss_rounds_savewins);
			}
			
			g_ScrimWinner = CS_TEAM_UNASSIGNED;
			g_ScrimRounds[HNS_TEAM_HIDER] = 0;
			g_ScrimRounds[HNS_TEAM_SEEKER] = 0;
			g_bScrimIsDraw = false;
			g_ScrimTeams[1] = HNS_TEAM_HIDER;
			g_ScrimTeams[2] = HNS_TEAM_SEEKER;
			g_ScrimTeamNums[HNS_TEAM_HIDER] = 1;
			g_ScrimTeamNums[HNS_TEAM_SEEKER] = 2;
			g_ScrimScores[HNS_TEAM_HIDER] = 0;
			g_ScrimScores[HNS_TEAM_SEEKER] = 0;
			
			g_bScrimOn = true;
			set_pcvar_num(sv_restart, 1);
		}
	}
	else
	{
		g_bScrimOn = false;
		g_ScrimType = SCRIM_NONE;
		set_pcvar_num(sv_restart, 1);
	}
	
	return PLUGIN_HANDLED;
}

public cmdScrimType(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 2) )
	{
		return PLUGIN_HANDLED;
	}
	
	if( !g_bHnsOn )
	{
		console_print(plr, "[HNS] HideNSeek must be on to set the scrim type!");
		return PLUGIN_HANDLED;
	}
	
	if( g_bScrimOn )
	{
		console_print(plr, "[HNS] You cannot change the scrim type during a scrim!");
		return PLUGIN_HANDLED;
	}
	
	if( task_exists(TASK_ID_SCRIMVOTE, 0) )
	{
		console_print(plr, "[HNS] A vote is already determining the scrim type!");
		return PLUGIN_HANDLED;
	}
	
	new sArg[2];
	read_argv(1, sArg, 1);
	new type = str_to_num(sArg);
	
	if( g_ScrimType == type )
	{
		console_print(plr, "[HNS] This is already the scrim type!");
		return PLUGIN_HANDLED;
	}
	
	new sName[64]; /* server hostnames can be long */
	get_user_name(plr, sName, 63);
	switch( type )
	{
		case SCRIM_ROUNDS: scrim_print(0, "^x03%s^x01 :  set the scrim type to Win %i Rounds!", sName, get_pcvar_num(hnss_rounds_wins));
		case SCRIM_POINTS: scrim_print(0, "^x03%s^x01 :  set the scrim type to Point System!", sName);
		default:
		{
			type = SCRIM_NONE;
			scrim_print(0, "^x03%s^x01 :  set the scrim type to none!", sName);
		}
	}
	
	g_ScrimType = type;
	
	return PLUGIN_HANDLED;
}

public cmdCaptains(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 1) )
	{
		return PLUGIN_HANDLED;
	}
	
	new players[32], pnum;
	for( new i = 1; i <= g_MaxPlayers; i++ )
	{
		if( g_bConnected[i] )
		{
			players[pnum++] = i;
		}
	}
	
	new rand = random(pnum);
	new captain1 = players[rand];
	
	for( new i = rand; i < pnum; i++ )
	{
		if( (i + 1) == pnum )
		{
			continue;
		}
		
		players[i] = players[i + 1];
	}
	
	new captain2 = (pnum > 0) ? players[random(--pnum)] : 0;
	
	new sName1[32], sName2[32];
	get_user_name(captain1, sName1, 31);
	if( captain2 )	get_user_name(captain2, sName2, 31);
	else		copy(sName2, 31, "Player Not Available");
	
	scrim_print(0, "Captains will be:^x03 %s^x01 and^x03 %s", sName1, sName2);
	
	return PLUGIN_HANDLED;
}

public cmdWarmup(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 2) )
	{
		return PLUGIN_HANDLED;
	}
	
	new sArg[2];
	read_argv(1, sArg, 1);
	new bool:bWarmup = bool:clamp(str_to_num(sArg), 0, 1);
	
	if( bWarmup == g_bWarmup )
	{
		console_print(plr, "[HNS] Warmup is already %s!", g_bWarmup ? "on" : "off");
		return PLUGIN_HANDLED;
	}
	
	if( bWarmup && !g_bHnsOn )
	{
		console_print(plr, "[HNS] HideNSeek must be on to start warmup!");
		return PLUGIN_HANDLED;
	}
	
	new sName[64]; /* server hostnames can be long */
	get_user_name(plr, sName, 63);
	hns_print(0, "^x03%s^x01 :  %s the HideNSeek warmup!", sName, bWarmup ? "started" : "stopped");
	
	set_pcvar_num(sv_restart, 1);
	
	return PLUGIN_HANDLED;
}

public cmdHelp(plr)
{
	if( file_exists(g_sHelpMotd) )
	{
		new sText[2500];
		
		new f = fopen(g_sHelpMotd, "rt"), sData[512];
		while( !feof(f) )
		{
			fgets(f, sData, 511);
			add(sText, 2499, sData, 0);
		}
		fclose(f);
		
		new sTeamChange[64];
		copy(sTeamChange, 63, "The teams will switch ");
		new info = get_pcvar_num(hns_teamchange);
		if( info > 0 )
		{
			format(sTeamChange, 63, "%safter %i rounds have ended", sTeamChange, info);
		}
		else
		{
			add(sTeamChange, 63, "when Seekers win the round");
		}
		
		new sHiderEquipment[512];
		if( get_pcvar_num(hns_hiders_knife) == 2 )
		{
			copy(sHiderEquipment, 511, "Broken knife<br>");
		}
		info = get_pcvar_num(hns_grenades[HNS_TEAM_HIDER]);
		new percent = get_pcvar_num(hns_grenades_percent[HNS_TEAM_HIDER]);
		if( info > 0 && percent > 0 )
		{
			format(sHiderEquipment, 511, "%s%i HE Grenade%s", sHiderEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sHiderEquipment, 511, "%s (%i%% chance per grenade)<br>", sHiderEquipment, percent);
			}
			else
			{
				add(sHiderEquipment, 511, "<br>", 0);
			}
		}
		info = get_pcvar_num(hns_flashbangs[HNS_TEAM_HIDER]);
		percent = get_pcvar_num(hns_flashbangs_percent[HNS_TEAM_HIDER]);
		if( info > 0 && percent > 0 )
		{
			format(sHiderEquipment, 511, "%s%i Flashbang%s", sHiderEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sHiderEquipment, 511, "%s (%i%% chance per flashbang)<br>", sHiderEquipment, percent);
			}
			else
			{
				add(sHiderEquipment, 511, "<br>", 0);
			}
		}
		info = get_pcvar_num(hns_smokegren[HNS_TEAM_HIDER]);
		percent = get_pcvar_num(hns_smokegren_percent[HNS_TEAM_HIDER]);
		if( info > 0 && percent > 0 )
		{
			format(sHiderEquipment, 511, "%s%i Smoke Grenade%s", sHiderEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sHiderEquipment, 511, "%s (%i%% chance per smoke grenade)<br>", sHiderEquipment, percent);
			}
			else
			{
				add(sHiderEquipment, 511, "<br>", 0);
			}
		}
		info = get_pcvar_num(hns_armor[HNS_TEAM_HIDER]);
		format(sHiderEquipment, 511, "%sArmor: %i", sHiderEquipment, info);
		
		new sSeekerEquipment[512];
		copy(sSeekerEquipment, 511, "A Knife");
		info = get_pcvar_num(hns_grenades[HNS_TEAM_SEEKER]);
		percent = get_pcvar_num(hns_grenades_percent[HNS_TEAM_SEEKER]);
		if( info > 0 && percent > 0 )
		{
			format(sSeekerEquipment, 511, "%s<br>%i HE Grenade%s", sSeekerEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sSeekerEquipment, 511, "%s (%i%% chance per grenade)", sSeekerEquipment, percent);
			}
		}
		info = get_pcvar_num(hns_flashbangs[HNS_TEAM_SEEKER]);
		percent = get_pcvar_num(hns_flashbangs_percent[HNS_TEAM_SEEKER]);
		if( info > 0 && percent > 0 )
		{
			format(sSeekerEquipment, 511, "%s<br>%i Flashbang%s", sSeekerEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sSeekerEquipment, 511, "%s (%i%% chance per flashbang)", sSeekerEquipment, percent);
			}
		}
		info = get_pcvar_num(hns_smokegren[HNS_TEAM_SEEKER]);
		percent = get_pcvar_num(hns_smokegren_percent[HNS_TEAM_SEEKER]);
		if( info > 0 && percent > 0 )
		{
			format(sSeekerEquipment, 511, "%s<br>%i Smoke Grenade%s", sSeekerEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sSeekerEquipment, 511, "%s (%i%% chance per smoke grenade)", sSeekerEquipment, percent);
			}
		}
		info = get_pcvar_num(hns_armor[HNS_TEAM_SEEKER]);
		format(sSeekerEquipment, 511, "%s<br>Armor: %i", sSeekerEquipment, info);
		
		
		format(sText, 2499, sText, PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR, PLUGIN_NAME, g_sTeamNames[HNS_TEAM_HIDER], g_sTeamNames[HNS_TEAM_SEEKER], sTeamChange, sHiderEquipment, sSeekerEquipment);
		show_motd(plr, sText, "HideNSeek Help");
	}
	else
	{
		hns_print(plr, "^x03HideNSeek Help^x01 does not exist for this server.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public cmdScrimHelp(plr)
{
	if( file_exists(g_sScrimMotd) )
	{
		new sText[3000];
		
		new f = fopen(g_sScrimMotd, "rt"), sData[512];
		while( !feof(f) )
		{
			fgets(f, sData, 511);
			add(sText, 2999, sData, 0);
		}
		fclose(f);
		
		new rounds = get_pcvar_num(hnss_rounds_wins);
		
		new sRounds[32];
		formatex(sRounds, 31, "%i round%s", rounds, (rounds != 1) ? "s in a row" : g_sBlank);
		
		new sSave[96];
		if( get_pcvar_num(hnss_rounds_savewins) && rounds > 1 )
		{
			copy(sSave,95, "<br>However, the amount of rounds you won will stay with you if you become hiders again!");
		}
		else
		{
			copy(sSave,95, "<br>The amount of rounds you won will reset and you will start over next time you are a hider!");
		}
		
		new losses = get_pcvar_num(hnss_rounds_losses), sLosses[96];
		if( losses )
		{
			formatex(sLosses, 95, "<br>After the teams switch %i time%s, the scrim will end in a draw.", losses, (losses != 1) ? g_sS : g_sBlank);
		}
		
		new sPoints[512], len;
		
		new points = get_pcvar_num(hnss_points_knife);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i point%s for killing with a knife<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_headshot);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i extra point%s for your kill if you get a headshot!<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_grenade);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i point%s for killing with a grenade or frostgrenade!<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_kill);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i point%s for killing with some else that was already described<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_suicide);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Lose %i point%s for killing yourself<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_teamkill);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Lose %i point%s for killing your teammate!<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_roundwin);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i point%s for winning the round!<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_roundlose);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Lose %i point%s for losing the round<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		new ps_rounds = get_pcvar_num(hnss_points_rounds);
		
		format(sText, 2999, sText, rounds, (rounds != 1) ? g_sS : g_sBlank, sRounds, sRounds, sSave, sLosses, sPoints, ps_rounds, (ps_rounds != 1) ? g_sS : g_sBlank, ps_rounds, (ps_rounds != 1) ? g_sS : g_sBlank);
		
		show_motd(plr, sText, "HideNSeek Scrim Help");
	}
	else
	{
		scrim_print(plr, "^x03HideNSeek Scrim Help^x01 does not exist for this server.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public cmdPoints(plr)
{
	if( g_bScrimOn )
	{
		switch( g_ScrimType )
		{
			case SCRIM_POINTS:
			{
				scrim_print(0, "Scrim scores:^x03 Team 1 [%i]^x01 ::^x03 Team 2 [%i]", g_ScrimScores[g_ScrimTeams[1]], g_ScrimScores[g_ScrimTeams[2]]);
			}
			case SCRIM_ROUNDS:
			{
				scrim_print(0, "Hiders have won^x03 %i / %i^x01 rounds!", g_ScrimRounds[HNS_TEAM_HIDER], g_ScrimMaxRounds);
			}
		}
	}
	else
	{
		scrim_print(plr, "There is no scrim taking place.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public cmdRounds(plr)
{
	if( g_bScrimOn )
	{
		switch( g_ScrimType )
		{
			case SCRIM_POINTS:
			{
				new half = (g_ScrimMaxRounds / 2), rounds;
				if( g_ScrimRounds[HNS_TEAM_HIDER] < half )
				{
					rounds = half - g_ScrimRounds[HNS_TEAM_HIDER];
				}
				else
				{
					rounds = g_ScrimMaxRounds - g_ScrimRounds[HNS_TEAM_HIDER];
				}
				
				scrim_print(0, "There %s^x03 %i round%s^x01 left in the^x03 half.", (rounds != 1) ? "are" : "is", rounds, (rounds != 1) ? g_sS : g_sBlank);
				
				rounds = g_ScrimMaxRounds - g_ScrimRounds[HNS_TEAM_HIDER];
				scrim_print(0, "There %s^x03 %i round%s^x01 left in the^x03 scrim.", (rounds != 1) ? "are" : "is", rounds, (rounds != 1) ? g_sS : g_sBlank);
			}
			case SCRIM_ROUNDS:
			{
				new rounds = g_ScrimMaxRounds - g_ScrimRounds[HNS_TEAM_HIDER];
				scrim_print(0, "Hiders need^x03 %i round%s^x01 to win the scrim!", rounds, (rounds != 1) ? g_sS : g_sBlank);
			}
		}
	}
	else
	{
		scrim_print(plr, "There is no scrim taking place.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public cmdTeam(plr)
{
	if( g_bScrimOn )
	{
		switch( g_ScrimType )
		{
			case SCRIM_POINTS:
			{
				scrim_print(plr, "You are on^x03 Team %i^x01!", g_ScrimTeamNums[cs_get_user_team(plr)]);
			}
			case SCRIM_ROUNDS:
			{
				new CsTeams:team = cs_get_user_team(plr);
				if( team == HNS_TEAM_HIDER )
				{
					scrim_print(plr, "You are on the^x03 Hiding^x01 team!");
				}
				else if( team == HNS_TEAM_SEEKER )
				{
					scrim_print(plr, "You are on the^x03 Seeking^x01 team!");
				}
				else
				{
					scrim_print(plr, "You are not on a scrim team!");
				}
			}
		}
	}
	else
	{
		scrim_print(plr, "There is no scrim taking place.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public fwdClientCommandPost(plr)
{
	unregister_forward(FM_ClientCommand, g_FwdClientCommand_post, 1);
	
	g_bNonSpawnEvent[plr] = false;
	
	return FMRES_HANDLED;
}

public fwdSpawn(ent)
{
	if( !pev_valid(ent) || ent == g_HostageEnt )
	{
		return FMRES_IGNORED;
	}
	
	new sClass[32];
	pev(ent, pev_classname, sClass, 31);
	
	for( new i = 0; i < MAX_REMOVED_ENTITIES; i++ )
	{
		if( equal(sClass, g_sRemoveEntities[i]) )
		{
			engfunc(EngFunc_RemoveEntity, ent);
			return FMRES_SUPERCEDE;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdTouch(booster, plr)
{
	if( !g_bHnsOn
	|| !pev_valid(booster) || !pev_valid(plr)
	|| !(0 < booster <= g_MaxPlayers) || !(0 < plr <= g_MaxPlayers)
	|| !g_bAlive[booster] || !g_bAlive[plr] )
	{
		return FMRES_IGNORED;
	}
	
	new boosting = get_pcvar_num(hns_noboosting);
	
	if( boosting == get_pcvar_num(hns_semiclip)
	|| boosting != 2 && !(boosting == 1 && cs_get_user_team(booster) == cs_get_user_team(plr)) )
	{
		return FMRES_IGNORED;
	}
	
	new Float:vBoosterOrigin[3], Float:vPlrOrigin[3];
	pev(booster, pev_origin, vBoosterOrigin);
	pev(plr, pev_origin, vPlrOrigin);
	
	if( !(49.0 < (vPlrOrigin[2] - vBoosterOrigin[2]) < 73.0) )
	{
		return FMRES_IGNORED;
	}
	
	switch( get_pcvar_num(hns_noboosting_punish) )
	{
		case 3:
		{
			handle_booster(booster);
			handle_booster(plr);
		}
		case 2:
		{
			handle_booster(booster);
		}
		case 1:
		{
			handle_booster(plr);
		}
	}
	
	return FMRES_IGNORED;
}

public fwdCmdStart(plr, ucHandle, seed)
{
	if( !g_bHnsOn || !g_bAlive[plr] )
	{
		return FMRES_IGNORED;
	}
	
	static clip, ammo;
	if( get_user_weapon(plr, clip, ammo) != CSW_KNIFE )
	{
		return FMRES_IGNORED;
	}
	
	new CsTeams:team = cs_get_user_team(plr);
	
	if( team == HNS_TEAM_HIDER )
	{
		new button = get_uc(ucHandle, UC_Buttons);
		
		if( button&IN_ATTACK )
		{
			button &= ~IN_ATTACK;
		}
		if( button&IN_ATTACK2 )
		{
			button &= ~IN_ATTACK2;
		}
		
		set_uc(ucHandle, UC_Buttons, button);
		
		return FMRES_SUPERCEDE;
	}
	else if( team == HNS_TEAM_SEEKER )
	{
		if( g_bDisableSlash )
		{
			new button = get_uc(ucHandle, UC_Buttons);
			
			if( button&IN_ATTACK )
			{
				button &= ~IN_ATTACK;
				button |= IN_ATTACK2;
			}
			
			set_uc(ucHandle, UC_Buttons, button);
			
			return FMRES_SUPERCEDE;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdSetModel(ent, sModel[])
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	if( !pev_valid(ent) || !equal(sModel, "models/w_", 9) || equal(sModel, "models/w_weaponbox.mdl", 0) )
	{
		return FMRES_IGNORED;
	}
	
	new owner = pev(ent, pev_owner);
	if( !(0 < owner <= g_MaxPlayers) )
	{
		return FMRES_IGNORED;
	}
	
	new sClass[32];
	pev(ent, pev_classname, sClass, 31);
	
	if( equal(sClass, "weapon_shield", 0) )
	{
		set_pev(ent, pev_effects, EF_NODRAW);
		set_task(0.1, "taskRemoveShield", ent);
		
		return FMRES_IGNORED;
	}
	
	if( !equal(sClass, "weaponbox", 0) )
	{
		return FMRES_IGNORED;
	}
	
	for( new i = g_MaxPlayers + 1; i <= g_MaxEntities; i++ )
	{
		if( !pev_valid(i) )
		{
			continue;
		}
		
		if( pev(i, pev_owner) == ent )
		{
			dllfunc(DLLFunc_Think, ent);
			break;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdClientKill(plr)
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	if( get_pcvar_num(hns_disablekill) )
	{
		new Float:fGametime = get_gametime();
		if( fGametime >= g_fKillMsgDelay[plr] )
		{
			g_fKillMsgDelay[plr] = fGametime + 1.0;
			
			hns_print(plr, "You cannot kill yourself during HideNSeek!");
		}
		
		return FMRES_SUPERCEDE;
	}
	
	return FMRES_IGNORED;
}

public fwdPlayerPreThink(plr)
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	new semiclip = get_pcvar_num(hns_semiclip);
	
	if( g_bAlive[plr] )
	{
		new CsTeams:team = cs_get_user_team(plr);
		if( g_HideTimer > 0 && team == HNS_TEAM_SEEKER )
		{
			set_pev(plr, pev_maxspeed, -1.0);
			set_pev(plr, pev_velocity, Float:{0.0, 0.0, 0.0});
			//set_pev(plr, pev_flags, pev(plr, pev_flags) | FL_FROZEN);
		}
		
		new footsteps = get_pcvar_num(hns_footsteps);
		if( footsteps && (footsteps == 3 || footsteps == _:team) )
		{
			set_pev(plr, pev_flTimeStepSound, 999);
		}
		
		if( get_pcvar_num(hns_noslowdown) )
		{
			set_pev(plr, pev_fuser2, 0.0);
		}
		
		if( g_bWarmup && get_pcvar_num(hns_warmup_godmode) )
		{
			fm_set_user_godmode(plr, 1);
		}
		
		if( semiclip )
		{
			// thanks Jon for code
			
			new target, body;
			get_user_aiming(plr, target, body, 9999);
			
			if( 0 < target <= g_MaxPlayers && g_bAlive[target] )
			{
				new CsTeams:targetTeam = cs_get_user_team(target);
				if( semiclip == 2 || targetTeam == team )
				{
					new sName[32];
					get_user_name(target, sName, 31);
					
					new sMessage[64];
					if( targetTeam == team )
					{
						formatex(sMessage, 63, "Friend: %s^nHealth: %i", sName, get_user_health(target));
					}
					else
					{
						formatex(sMessage, 63, "Enemy: %s", sName);
					}
					
					if( targetTeam == CS_TEAM_CT )
					{
						set_hudmessage(0, 63, 127, -1.0, -1.0, 0, 0.0, 0.1, 0.0, 0.0, -1);
					}
					else if( targetTeam == CS_TEAM_T )
					{
						set_hudmessage(127, 0, 0, -1.0, -1.0, 0, 0.0, 0.1, 0.0, 0.0, -1);
					}
					
					show_hudmessage(plr, "%s", sMessage);
				}
			}
		}
	}
	
	static LastThink, i;
	
	if( plr < LastThink ) // player think loop started again
	{
		for( i = 1; i <= g_MaxPlayers; i++ )
		{
			if( !g_bConnected[i] || !g_bAlive[i] )
			{
				g_bSolid[i] = false;
				continue;
			}
			
			g_Team[i] = cs_get_user_team(i);
			g_bSolid[i] = bool:(pev(i, pev_solid) == SOLID_SLIDEBOX);
		}
	}
	
	LastThink = plr;
	
	if( !g_bSolid[plr] || !semiclip )
	{
		return FMRES_IGNORED;
	}
	
	for( i = 1; i <= g_MaxPlayers; i++ )
	{
		if( !g_bSolid[i] || g_bRestoreSolid[i] || i == plr )
		{
			continue;
		}
		
		if( semiclip == 2 || g_Team[plr] == g_Team[i] )
		{
			set_pev(i, pev_solid, SOLID_NOT);
			g_bRestoreSolid[i] = true;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdPlayerPostThink(plr)
{
	static i;
	
	for( i = 1; i <= g_MaxPlayers; i++ )
	{
		if( g_bRestoreSolid[i] )
		{
			set_pev(i, pev_solid, SOLID_SLIDEBOX);
			g_bRestoreSolid[i] = false;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdAddToFullPackPost(es, e, ent, host, hostflags, player, pSet)
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	if( player )
	{
		if( g_bSolid[host] && g_bSolid[ent] )
		{
			new semiclip = get_pcvar_num(hns_semiclip);
			if( semiclip == 2 || g_Team[host] == g_Team[ent] )
			{
				set_es(es, ES_Solid, SOLID_NOT);
				
				static Float:fOldAlpha;
				
				new Float:fAlpha = get_pcvar_float(hns_semiclip_alpha);
				if( fAlpha < 255.0 )
				{
					set_es(es, ES_RenderMode, kRenderTransAlpha);
					set_es(es, ES_RenderAmt, fAlpha);
				}
				else if( fOldAlpha < 255.0 )
				{
					set_es(es, ES_RenderMode, kRenderNormal);
					set_es(es, ES_RenderAmt, 16.0);
				}
				
				fOldAlpha = fAlpha;
			}
		}
	}
	
	return FMRES_IGNORED;
}

public fwdGetGameDescription()
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	new sGameType[32];
	get_pcvar_string(hns_gametype, sGameType, 31);
	
	if( !strlen(sGameType) || had_older_version(sGameType) )
	{
		formatex(sGameType, 31, "HideNSeek v%s", PLUGIN_VERSION);
		
		set_pcvar_string(hns_gametype, sGameType);
	}
	
	forward_return(FMV_STRING, sGameType);
	return FMRES_SUPERCEDE;
}

public fwdPlayerSpawn(plr)
{
	g_bAlive[plr] = true;
	
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	new CsTeams:team = cs_get_user_team(plr);
	if( team != HNS_TEAM_SEEKER && team != HNS_TEAM_HIDER )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( !g_bFirstSpawn[plr] )
	{
		show_plugin_info(plr);
		
		set_task(360.0, "taskShowPluginInfo", TASK_ID_SHOWPLUGININFO + plr, g_sBlank, 0, g_sB, 0);
		
		g_bFirstSpawn[plr] = true;
	}
	
	set_task(0.3, "taskStripWeapons", plr + TASK_ID_STRIPWEAPONS, g_sBlank, 0, g_sBlank, 0);
	
	new param[2];
	param[0] = _:team;
	set_task(0.6, "taskGiveKnife", plr + TASK_ID_GIVEKNIFE, param, 2, g_sBlank, 0);
	set_task(0.9, "taskCheckModel", plr + TASK_ID_CHECKMODEL, param, 2, g_sBlank, 0);
	
	if( g_bWeaponsGiven )
	{
		set_task(0.6, "taskGiveWeapons", plr + TASK_ID_GIVEWEAPONS, param, 2, g_sBlank, 0);
	}
	
	if( g_bScrimOn && g_ScrimType == SCRIM_POINTS )
	{
		new CsTeams:team1 = g_ScrimTeams[1];
		new CsTeams:team2 = g_ScrimTeams[2];
		
		scrim_print(plr, "You are on^x03 Team %i^x01!", g_ScrimTeamNums[cs_get_user_team(plr)]);
		scrim_print(plr, "Scrim scores:^x03 Team 1 [%i]^x01 ::^x03 Team 2 [%i]", g_ScrimScores[team1], g_ScrimScores[team2]);
	}
	
	return PLUGIN_CONTINUE;
}

public fwdSetVoice(receiver, sender, bool:bListen)
{
	if( !g_bConnected[receiver]
	|| !g_bConnected[sender]
	|| receiver == sender
	|| !g_bScrimOn )
	{
		return FMRES_IGNORED;
	}
	
	if( cs_get_user_team(receiver) == cs_get_user_team(sender) )
	{
		engfunc(EngFunc_SetClientListening, receiver, sender, 1);
	}
	else
	{
		engfunc(EngFunc_SetClientListening, receiver, sender, 0);
	}
	
	return FMRES_SUPERCEDE;
}

public messageHideWeapon(msgid, dest, plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( get_pcvar_num(hns_money) == 0 )
	{
		set_msg_arg_int(1, ARG_BYTE, get_msg_arg_int(1)|HIDE_MONEY);
	}
	
	return PLUGIN_CONTINUE;
}

public messageScreenFade(msgid, dest, plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	new noflash = get_pcvar_num(hns_noflash);
	if( !noflash )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( get_msg_arg_int(4) == 255 && get_msg_arg_int(5) == 255 && get_msg_arg_int(6) == 255 )
	{
		// flashbang
		
		if( noflash == _:cs_get_user_team(plr) )
		{
			return PLUGIN_HANDLED;
		}
	}
	
	return PLUGIN_CONTINUE;
}

public eventRestartAttempt()
{
	new players[32], pnum;
	get_players(players, pnum, g_sA);
	
	for( new i = 0; i < pnum; i++ )
	{
		g_bNonSpawnEvent[players[i]] = true;
	}
	
	return PLUGIN_CONTINUE;
}

public eventResetHUD(plr)
{
	if( g_bHnsOn && get_pcvar_num(hns_money) == 0 )
	{
		make_HideWeapon(plr, HIDE_MONEY);
	}
	
	if( is_user_alive(plr) )
	{
		if( g_bNonSpawnEvent[plr] )
		{
			g_bNonSpawnEvent[plr] = false;
		}
		else
		{
			fwdPlayerSpawn(plr);
		}
	}
	
	return PLUGIN_CONTINUE;
}

public eventMoney(plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	new money = get_pcvar_num(hns_money);
	money = clamp(money, -1, 16000);
	
	if( money >= 0 )
	{
		cs_set_user_money(plr, money, 0);
	}
	if( money == 0 && g_OldMoney != 0 )
	{
		make_HideWeapon(plr, HIDE_MONEY);
	}
	
	g_OldMoney = money;
	
	return PLUGIN_HANDLED;
}

public eventNewRound()
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( g_bDisableSlash )
	{
		new rounds = get_pcvar_num(hns_nubslash);
		if( rounds > 0 && g_RoundsLost >= rounds )
		{
			hns_print(0, "Seekers can now use nubslash after losing %i round%s!",\
				rounds, (rounds == 1) ? g_sBlank : "s in a row");
			
			g_bDisableSlash = false;
		}
	}
	
	g_HideTimer = get_pcvar_num(hns_hidetime);
	
	return PLUGIN_CONTINUE;
}

public eventTerrWin()
{
	if( g_bDisableSlash )
	{
		g_RoundsLost++;
	}
	
	return PLUGIN_CONTINUE;
}

public eventRestartRound()
{
	g_RoundsLost = 0;
	g_RoundsEnded = 0;
	g_bDisableSlash = true;
	
	g_bWeaponsGiven = false;
	
	g_HideTimer = -1;
	
	if( !g_bScrimOn
	|| g_ScrimType != SCRIM_ROUNDS
	|| !g_ScrimSaveWins )
	{
		g_ScrimRounds[HNS_TEAM_HIDER] = 0;
	}
	
	return PLUGIN_CONTINUE;
}

public eventCurWeapon(plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( cs_get_user_team(plr) == HNS_TEAM_HIDER && get_pcvar_num(hns_hiders_knife) == 1 )
	{
		new sModel[32];
		
		pev(plr, pev_viewmodel2, sModel, 31);
		if( equali(sModel, g_sKnifeModel_v, 0) )
		{
			set_pev(plr, pev_viewmodel2, g_sBlank);
		}
		
		pev(plr, pev_weaponmodel2, sModel, 31);
		if( equali(sModel, g_sKnifeModel_w, 0) )
		{
			set_pev(plr, pev_weaponmodel2, g_sBlank);
		}
	}
	
	return PLUGIN_CONTINUE;
}

public TaskRespawn(plr)
{
	// thanks GHW_Chronic & MeRcyLeZZ
	set_pev(plr, pev_deadflag, DEAD_RESPAWNABLE);
	dllfunc(DLLFunc_Think, plr);
}

public eventDeathMsg()
{
	new victim = read_data(2);
	g_bAlive[victim] = false;
	
	if( g_bWarmup && get_pcvar_num(hns_warmup_respawn) )
	{
		set_task(1.0, "TaskRespawn", victim);
	}
	
	if( !g_bScrimOn
	|| g_ScrimType != SCRIM_POINTS )
	{
		return PLUGIN_CONTINUE;
	}
	
	new sNameVictim[32];
	get_user_name(victim, sNameVictim, 31);
	
	new CsTeams:vTeam = cs_get_user_team(victim);
	
	new killer = read_data(1);
	if( !killer || killer == victim )
	{
		g_ScrimScores[vTeam] -= g_PointsSuicide;
		
		scrim_print(0, "^x03%s^x01 lost^x03 %i point%s^x01 from their^x03 team's score^x01 for^x03 suiciding^x01!", sNameVictim, g_PointsSuicide, g_PointsSuicide == 1 ? "" : "s");
		
		return PLUGIN_CONTINUE;
	}
	
	new sNameKiller[32];
	get_user_name(killer, sNameKiller, 31);
	
	new CsTeams:kTeam = cs_get_user_team(killer);
	
	if( kTeam == vTeam )
	{
		g_ScrimScores[vTeam] -= g_PointsTeamKill;
		
		scrim_print(0, "^x03%s^x01 lost^x03 %i point%s^x01 from their^x03 team's score^x01 for^x03 killing a teammate^x01!", sNameKiller, g_PointsTeamKill, g_PointsKill == 1 ? "" : "s");
		
		return PLUGIN_CONTINUE;
	}
	
	new sWeapon[32];
	read_data(4, sWeapon, 31);
	
	if( equali(sWeapon, "grenade", 0) || equali(sWeapon, "frostgrenade", 0) )
	{
		g_ScrimScores[kTeam] += g_PointsGrenade;
		
		new sMessage[192]; /* vformat() only allows 3 arguments max ... lame */
		formatex(sMessage, 191, "^x03%s^x01 gained^x03 %i point%s^x01 for their^x03 team's score^x01 for^x03 killing %s with a %s^x01!", sNameKiller, g_PointsGrenade, g_PointsGrenade == 1 ? "" : "s", sNameVictim, sWeapon);
		scrim_print(0, "%s", sMessage);
		
		return PLUGIN_CONTINUE;
	}
	
	if( equali(sWeapon, "knife", 0) )
	{
		g_ScrimScores[kTeam] += g_PointsKnife;
		
		new sMessage[192];
		formatex(sMessage, 191, "^x03%s^x01 gained^x03 %i point%s^x01 for their^x03 team's score^x01 for^x03 killing %s with a knife!", sNameKiller, g_PointsKnife, g_PointsKnife == 1 ? "" : "s", sNameVictim);
		scrim_print(0, "%s", sMessage);
	}
	else
	{
		g_ScrimScores[kTeam] += g_PointsKill;
		
		new sMessage[192]; /* vformat() only allows 3 arguments max ... lame */
		formatex(sMessage, 191, "^x03%s^x01 gained^x03 %i point%s^x01 for their^x03 team's score^x01 for^x03 killing %s^x01!", sNameKiller, g_PointsKill, g_PointsKill == 1 ? "s" : "", sNameVictim);
		scrim_print(0, "%s", sMessage);
	}
	
	if( read_data(3) )
	{
		g_ScrimScores[kTeam] += g_PointsHeadshot;
		
		scrim_print(0, "^x03%s^x01 gained^x03 %d extra point%s^x01 for getting a^x03 headshot^x01!", sNameKiller, g_PointsHeadshot, g_PointsHeadshot == 1 ? "" : "s");
	}
	
	return PLUGIN_CONTINUE;
}

public logeventRoundStart()
{
	if( !g_bHnsOn )
	{
		if( g_bRemovedBreakables )
		{
			g_bRemovedBreakables = restore_entities(g_sClassBreakable);
		}
		
		return PLUGIN_CONTINUE;
	}
	
	if( get_pcvar_num(hns_removebreakables) )
	{
		g_bRemovedBreakables = remove_entities(g_sClassBreakable);
	}
	else if( g_bRemovedBreakables )
	{
		g_bRemovedBreakables = restore_entities(g_sClassBreakable);
	}
	
	if( get_pcvar_num(hns_removedoors) )
	{
		g_bRemovedDoors = remove_entities(g_sClassDoor);
		g_bRemovedDoorsRotating = remove_entities(g_sClassDoorRotating);
	}
	else
	{
		if( g_bRemovedDoors )
		{
			g_bRemovedDoors = restore_entities(g_sClassDoor);
		}
		
		if( g_bRemovedDoorsRotating )
		{
			g_bRemovedDoorsRotating = restore_entities(g_sClassDoorRotating);
		}
	}
	
	remove_task(TASK_ID_HIDETIMER, 0);
	set_task(0.0, "taskHideTimer", TASK_ID_HIDETIMER, g_sBlank, 0, g_sBlank, 0);
	
	if( !g_bScrimOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	switch( g_ScrimType )
	{
		case SCRIM_ROUNDS:
		{
			if( g_ScrimWinner )
			{
				/* switch() statement gave me an error */
				if( g_ScrimWinner == HNS_TEAM_HIDER )
				{
					scrim_print(0, "^x03Hiders^x01 lost^x03 %i / %i^x01 rounds!", g_ScrimLosses[HNS_TEAM_SEEKER], g_ScrimMaxLosses);
					scrim_print(0, "The scrim is a draw!");
				}
				else if( g_ScrimWinner == HNS_TEAM_SEEKER )
				{
					scrim_print(0, "^x03Hiding team^x01 has won^x03 %i / %i^x01 rounds!", g_ScrimRounds[HNS_TEAM_HIDER], g_ScrimMaxRounds);
					scrim_print(0, "Hiding team has won!");
				}
				
				scrim_print(0, "^x03Turning off scrim mod.");
				
				g_bScrimOn = false;
				g_ScrimType = SCRIM_NONE;
				set_pcvar_num(sv_restart, 1);
			}
			else if( g_bRestartRound )
			{
				g_bRestartRound = false;
				set_pcvar_num(sv_restart, 1);
			}	
		}
		case SCRIM_POINTS:
		{
			if( g_ScrimWinner )
			{
				new CsTeams:team1 = g_ScrimTeams[1];
				new CsTeams:team2 = g_ScrimTeams[2];
				
				scrim_print(0, "Final scrim scores:^x03 Team 1 [%i]^x01 ::^x03 Team 2 [%i]", g_ScrimScores[team1], g_ScrimScores[team2]);
				scrim_print(0, "^x03Team %i^x01 has won!", g_ScrimTeamNums[g_ScrimWinner]);
				
				g_bScrimOn = false;
				g_ScrimType = SCRIM_NONE;
				set_pcvar_num(sv_restart, 1);
			}
			else if( g_bScrimIsDraw )
			{
				new CsTeams:team1 = g_ScrimTeams[1];
				new CsTeams:team2 = g_ScrimTeams[2];
				
				scrim_print(0, "Final scrim scores:^x03 Team 1 [%i]^x01 ::^x03 Team 2 [%i]", g_ScrimScores[team1], g_ScrimScores[team2]);
				scrim_print(0, "The scrim results in a tie!");
				
				g_bScrimOn = false;
				g_ScrimType = SCRIM_NONE;
				set_pcvar_num(sv_restart, 1);
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public logeventRoundEnd()
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	remove_task(TASK_ID_HIDETIMER, 0);
	
	new sMessage[192];
	new CsTeams:winner = HNS_TEAM_SEEKER;
	
	new hider, seeker, hider_alive;
	get_hider_and_seeker(hider, seeker, hider_alive);
	
	if( hider_alive )
	{
		winner = HNS_TEAM_HIDER;
	}
	
	if( !hider || !seeker )
	{
		return PLUGIN_CONTINUE;
	}
	
	static const sTaskSwapTeams[] = "taskSwapTeams";
	
	++g_RoundsEnded;
	
	new teamchange = get_pcvar_num(hns_teamchange);
	if( teamchange && teamchange == g_RoundsEnded && !g_bScrimOn )
	{
		hns_print(0, "%i rounds have ended. Switching teams.", g_RoundsEnded);
		
		set_task(0.5, sTaskSwapTeams, TASK_ID_SWAPTEAMS, g_sBlank, 0, g_sBlank, 0);
	}
	
	static const sNoTeamChange[] = "^nNo Team Change";
	if( winner == HNS_TEAM_SEEKER )
	{
		copy(sMessage, 191, "Seekers Won Round");
		
		if( !teamchange && (!g_bScrimOn || g_ScrimType == SCRIM_ROUNDS) )
		{
			add(sMessage, 191, "^nSwitching Teams", 0);
			
			set_task(0.5, sTaskSwapTeams, TASK_ID_SWAPTEAMS, g_sBlank, 0, g_sBlank, 0);
		}
	}
	else if( winner == HNS_TEAM_HIDER )
	{
		copy(sMessage, 191, "Hiders Won Round");
		
		new frags = get_pcvar_num(hns_hiders_alivefrags);
		
		if( frags )
		{
			static Float:fFrags;
			for( new plr = 1; plr <= g_MaxPlayers; plr++ )
			{
				if( g_bConnected[plr] && g_bAlive[plr] && cs_get_user_team(plr) == HNS_TEAM_HIDER )
				{
					pev(plr, pev_frags, fFrags);
					set_pev(plr, pev_frags, fFrags + float(frags));
					
					hns_print(plr, "You earned %i frag%s for surviving the round!",\
						frags, (frags == 1) ? g_sBlank : g_sS);
				}
			}
		}
		
		if( !teamchange )
		{
			add(sMessage, 191, sNoTeamChange, 0);
		}
	}
	
	static red, green, blue;
	get_hud_colors(red, green, blue);
	set_hudmessage(red, green, blue, -1.0, -1.0, 0, 0.0, 5.0, 0.1, 0.2, 1);
	show_hudmessage(0, "%s", sMessage);
	
	g_bWeaponsGiven = false;
	
	if( !g_bScrimOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	switch( g_ScrimType )
	{
		case SCRIM_ROUNDS:
		{
			/* switch() statement gave me an error */
			if( winner == HNS_TEAM_HIDER )
			{
				++g_ScrimRounds[HNS_TEAM_HIDER];
				
				if( g_ScrimMaxRounds )
				{
					scrim_print(0, "^x03Hiders^x01 have won^x03 %i / %i^x01 rounds!", g_ScrimRounds[HNS_TEAM_HIDER], g_ScrimMaxRounds);
					
					if( g_ScrimRounds[HNS_TEAM_HIDER] == g_ScrimMaxRounds )
					{
						g_ScrimWinner = HNS_TEAM_SEEKER;
					}
				}
			}
			else if( winner == HNS_TEAM_SEEKER && g_ScrimMaxLosses )
			{
				++g_ScrimLosses[HNS_TEAM_HIDER];
				
				scrim_print(0, "^x03Hiders^x01 have lost^x03 %i / %i^x01 rounds!", g_ScrimLosses[HNS_TEAM_HIDER], g_ScrimMaxLosses);
				
				scrim_print(0, "^x03Seekers^x01 won the round");
				scrim_print(0, "Switching teams.");
				
				g_bRestartRound = true;
				
				if( g_ScrimLosses[HNS_TEAM_HIDER] == g_ScrimMaxLosses )
				{
					g_ScrimWinner = HNS_TEAM_HIDER; /* seeking team won, but they will be hiders next round (team switching) */
				}
			}
		}
		case SCRIM_POINTS:
		{
			++g_ScrimRounds[HNS_TEAM_HIDER];
			
			new CsTeams:loser;
			if( winner == HNS_TEAM_HIDER )
			{
				loser = HNS_TEAM_SEEKER;
			}
			else if( winner == HNS_TEAM_SEEKER )
			{
				loser = HNS_TEAM_HIDER;
			}
			
			g_ScrimScores[loser] -= g_PointsRoundLose;
			g_ScrimScores[winner] += g_PointsRoundWin;
			
			new sTeam[CsTeams][16];
			formatex(sTeam[HNS_TEAM_HIDER], 15, "Team %i", g_ScrimTeamNums[HNS_TEAM_HIDER]);
			formatex(sTeam[HNS_TEAM_SEEKER], 15, "Team %i", g_ScrimTeamNums[HNS_TEAM_SEEKER]);
			
			new sMessageLose[192];
			formatex(sMessageLose, 191, "^x03%s^x01 lost^x03 %i point%s^x01 for^x03 losing^x01 the round!", "%s", g_ScrimTeamNums[loser], g_PointsRoundLose, g_PointsRoundLose == 1 ? "" : "s");
			
			new sMessageWin[192];
			formatex(sMessageWin, 191, "^x03%s^x01 gained^x03 %i point%s^x01 for^x03 winning^x01 the round!", "%s", g_ScrimTeamNums[winner], g_PointsRoundWin, g_PointsRoundWin == 1 ? "" : "s");
			
			new CsTeams:team;
			for( new plr = 1; plr <= g_MaxPlayers; plr++ )
			{
				if( !g_bConnected[plr] )
				{
					continue;
				}
				
				team = cs_get_user_team(plr);
				if( team == winner )
				{
					scrim_print(plr, sMessageWin, "Your team");
					scrim_print(plr, sMessageLose, sTeam[loser]);
				}
				else if( team == loser )
				{
					scrim_print(plr, sMessageWin, sTeam[winner]);
					scrim_print(plr, sMessageLose, "Your team");
				}
			}
			
			if( g_ScrimRounds[HNS_TEAM_HIDER] == g_ScrimMaxRounds )
			{
				if( g_ScrimScores[HNS_TEAM_HIDER] > g_ScrimScores[HNS_TEAM_SEEKER] )
				{
					g_ScrimWinner = HNS_TEAM_HIDER;
				}
				else if( g_ScrimScores[HNS_TEAM_SEEKER] > g_ScrimScores[HNS_TEAM_HIDER] )
				{
					g_ScrimWinner = HNS_TEAM_SEEKER;
				}
				else /* not one is greater than the other, so they are equal */
				{
					g_bScrimIsDraw = true;
				}
			}
			else if( g_ScrimRounds[HNS_TEAM_HIDER] == (g_ScrimMaxRounds / 2) ) /* half of the scrim has gone by, so swap the teams */
			{
				set_task(0.5, "taskSwapTeams", TASK_ID_SWAPTEAMS, "", 0, "", 0);
				
				scrim_print(0, "^x03Half^x01 of the scrim is over,^x03 switching teams^x01.");
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public mnuScrimType(plr, menu, item)
{
	if( item == MENU_EXIT
	|| g_ScrimVoteTimer == 0 )
	{
		return PLUGIN_HANDLED;
	}
	
	new sInfo[2], _access, callback;
	menu_item_getinfo(menu, item, _access, sInfo, 1, "", 0, callback);
	
	new type = str_to_num(sInfo);
	g_ScrimVoteCount[type]++;
	
	if( get_pcvar_num(amx_vote_answers) )
	{
		new sName[32];
		get_user_name(plr, sName, 31);
		
		switch( type )
		{
			case SCRIM_ROUNDS: scrim_print(0, "^x03%s^x01 voted for^x03 Win %i Rounds", sName, get_pcvar_num(hnss_rounds_wins));
			case SCRIM_POINTS: scrim_print(0, "^x03%s^x01 voted for^x03 Point System", sName);
		}
	}
	
	g_bScrimVoted[plr] = true;
	
	if( check_last_vote(plr) )
	{
		g_ScrimVoteTimer = 1;
	}
	
	return PLUGIN_HANDLED;
}

public taskRemoveShield(ent)
{
	dllfunc(DLLFunc_Think, ent);
	
	return PLUGIN_CONTINUE;
}

public taskHideTimer()
{
	new seeker, hider;
	
	if( g_HideTimer <= 0 )
	{
		seeker = 1;
		hider = 1;
	}
	else
	{
		get_hider_and_seeker(hider, seeker);
	}
	
	static const sTaskHideTimer[] = "taskHideTimer";
	if( !hider || !seeker )
	{
		g_HideTimer = 0;
		set_task(0.0, sTaskHideTimer, TASK_ID_HIDETIMER, g_sBlank, 0, g_sBlank, 0);
		
		return PLUGIN_CONTINUE;
	}
	
	static CsTeams:team;
	
	if( g_HideTimer > 0 )
	{
		new sounds = get_pcvar_num(hns_timersounds);
		
		new sSound[16];
		num_to_word(g_HideTimer, sSound, 15);
		
		static blind_red, blind_green, blind_blue, blind_alpha;
		get_blind_colors(blind_red, blind_green, blind_blue, blind_alpha);
		
		static hud_red, hud_green, hud_blue;
		get_hud_colors(hud_red, hud_green, hud_blue);
		
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bConnected[plr] )
			{
				continue;
			}
			
			team = cs_get_user_team(plr);
			if( team == HNS_TEAM_SEEKER || team == HNS_TEAM_HIDER )
			{
				if( team == HNS_TEAM_SEEKER && g_bAlive[plr] )
				{
					//make_ScreenFade(plr, 1.5, 1.5, blind_red, blind_green, blind_blue, blind_alpha);
					
					/*set_pev(plr, pev_flags, pev(plr, pev_flags) | FL_FROZEN);
					set_pev(plr, pev_maxspeed, -1.0);*/
				}
				
				set_hudmessage(hud_red, hud_green, hud_blue, -1.0, 0.35, 0, 0.90, 0.35, 0.1, 0.1, 1);
				show_hudmessage(plr, "%i", g_HideTimer);
				
				if( sounds )
				{
					client_cmd(plr, "spk vox/%s.wav", sSound);
				}
			}
		}
		
		g_HideTimer--;
		set_task(1.0, sTaskHideTimer, TASK_ID_HIDETIMER, g_sBlank, 0, g_sBlank, 0);
	}
	else if( g_HideTimer == 0 )
	{
		static hud_red, hud_green, hud_blue;
		get_hud_colors(hud_red, hud_green, hud_blue);
		
		static param[2];
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bConnected[plr] )
			{
				continue;
			}
			
			team = cs_get_user_team(plr);
			if( team == HNS_TEAM_SEEKER || team == HNS_TEAM_HIDER )
			{
				if( team == HNS_TEAM_SEEKER && g_bAlive[plr] )
				{
					make_ScreenFade(plr, 0.0, 0.0, 0, 0, 0, 255);
					
					cs_reset_user_maxspeed(plr);
					//set_pev(plr, pev_flags, pev(plr, pev_flags) & ~FL_FROZEN);
				}
				
				set_hudmessage(hud_red, hud_green, hud_blue, -1.0, -1.0, 0, 0.0, 3.0, 0.1, 0.1, 1);
				show_hudmessage(plr, "");
				
				param[0] = _:team;
				taskGiveWeapons(param, plr + TASK_ID_GIVEWEAPONS);
			}
		}
		
		g_bWeaponsGiven = true;
		
		g_HideTimer--;
		set_task(1.0, sTaskHideTimer, TASK_ID_HIDETIMER, g_sBlank, 0, g_sBlank, 0);
	}
	else
	{
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bConnected[plr] )
			{
				continue;
			}
			
			if( g_bAlive[plr] && cs_get_user_team(plr) == HNS_TEAM_SEEKER )
			{
				make_ScreenFade(plr, 0.0, 0.0, 0, 0, 0, 255);
				
				cs_reset_user_maxspeed(plr);
				//set_pev(plr, pev_flags, pev(plr, pev_flags) & ~FL_FROZEN);
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskStripWeapons(plr)
{
	plr -= TASK_ID_STRIPWEAPONS;
	
	fm_strip_user_weapons(plr);
	
	return PLUGIN_CONTINUE;
}

public taskGiveKnife(param[], plr)
{
	plr -= TASK_ID_GIVEKNIFE;
	
	new CsTeams:team = CsTeams:param[0];
	
	if( team != HNS_TEAM_HIDER || get_pcvar_num(hns_hiders_knife))
	{
		fm_give_item(plr, "weapon_knife");
	}
	
	return PLUGIN_CONTINUE;
}

public taskGiveWeapons(param[], plr)
{
	plr -= TASK_ID_GIVEWEAPONS;
	
	new CsTeams:team = CsTeams:param[0];
	if( team != HNS_TEAM_HIDER && team != HNS_TEAM_SEEKER )
	{
		return PLUGIN_CONTINUE;
	}
	
	chance(plr, get_pcvar_num(hns_grenades[team]), get_pcvar_num(hns_grenades_percent[team]),"weapon_hegrenade", CSW_HEGRENADE, "HE Grenade");
	chance(plr, get_pcvar_num(hns_flashbangs[team]), get_pcvar_num(hns_flashbangs_percent[team]), "weapon_flashbang", CSW_FLASHBANG, "Flashbang");
	chance(plr, get_pcvar_num(hns_smokegren[team]), get_pcvar_num(hns_smokegren_percent[team]), "weapon_smokegrenade", CSW_SMOKEGRENADE, "Smoke Grenade");
	
	new num = get_pcvar_num(hns_armor[team]);
	num = clamp(num, 0, 100);
	
	switch( num )
	{
		case 0:
		{
			cs_set_user_armor(plr, 0, CS_ARMOR_NONE);
		}
		case 1..99:
		{
			cs_set_user_armor(plr, num, CS_ARMOR_KEVLAR);
		}
		case 100:
		{
			cs_set_user_armor(plr, num, CS_ARMOR_VESTHELM);
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskCheckModel(param[], plr)
{
	plr -= TASK_ID_CHECKMODEL;
	
	new CsTeams:team = CsTeams:param[0];
	
	if( team == HNS_TEAM_SEEKER || team == HNS_TEAM_HIDER )
	{
		new CsTeams:otherteam = (team == HNS_TEAM_HIDER) ? HNS_TEAM_SEEKER : HNS_TEAM_HIDER;
		
		new sModel[32];
		cs_get_user_model(plr, sModel, 31);
		
		for( new i = 0; i < 4; i++ )
		{
			if( equal(sModel, g_sAllModels[otherteam][i], 0) )
			{
				cs_set_user_model(plr, g_sDefaultModels[team]);
				break;
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskSwapTeams(taskid)
{
	static CsTeams:team;
	
	if( g_bScrimOn )
	{
		static temp;
		
		if( g_ScrimType == SCRIM_POINTS )
		{
			temp = g_ScrimScores[HNS_TEAM_HIDER];
			g_ScrimScores[HNS_TEAM_HIDER] = g_ScrimScores[HNS_TEAM_SEEKER];
			g_ScrimScores[HNS_TEAM_SEEKER] = temp;
			
			temp = g_ScrimTeamNums[HNS_TEAM_HIDER];
			g_ScrimTeamNums[HNS_TEAM_HIDER] = g_ScrimTeamNums[HNS_TEAM_SEEKER];
			g_ScrimTeamNums[HNS_TEAM_SEEKER] = temp;
			
			team = g_ScrimTeams[1];
			g_ScrimTeams[1] = g_ScrimTeams[2];
			g_ScrimTeams[2] = team;
		}
		else if( g_ScrimType == SCRIM_ROUNDS )
		{
			if( !g_ScrimSaveWins )
			{
				g_ScrimRounds[HNS_TEAM_HIDER] = 0;
				g_ScrimRounds[HNS_TEAM_SEEKER] = 0;
			}
			else
			{
				temp = g_ScrimRounds[HNS_TEAM_HIDER];
				g_ScrimRounds[HNS_TEAM_HIDER] = g_ScrimRounds[HNS_TEAM_SEEKER];
				g_ScrimRounds[HNS_TEAM_SEEKER] = temp;
			}
		}
	}
	
	for( new plr = 1; plr <= g_MaxPlayers; plr++ )
	{
		if( !g_bConnected[plr] )
		{
			continue;
		}
		
		team = cs_get_user_team(plr);
		if( team == HNS_TEAM_HIDER )
		{
			cs_set_user_team(plr, HNS_TEAM_SEEKER, HNS_MODEL_SEEKER);
			
			emake_TeamInfo(plr, g_sTeamInfo[HNS_TEAM_SEEKER]); /* let other plugins know that the player changed teams */
		}
		else if( team == HNS_TEAM_SEEKER )
		{
			cs_set_user_team(plr, HNS_TEAM_HIDER, HNS_MODEL_HIDER);
			
			emake_TeamInfo(plr, g_sTeamInfo[HNS_TEAM_HIDER]); /* let other plugins know that the player changed teams */
		}
	}
	
	g_RoundsLost = 0;
	g_RoundsEnded = 0;
	g_bDisableSlash = true;
	
	return 1;
}

public taskSetLights()
{
	if( !g_bHnsOn )
	{
		if( !equali(g_sLights, g_sLightsNormal) )
		{
			set_lights(g_sLightsNormal);
		}
	}
	else
	{
		new sLights[16];
		get_pcvar_string(hns_lights, sLights, 15);
		
		if( !equali(g_sLights, sLights) )
		{
			if( !strlen(sLights) )
			{
				set_lights(g_sLightsNormal);
				set_pcvar_string(hns_lights, g_sLightsNormal);
			}
			else
			{
				set_lights(sLights);
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskShowPluginInfo(plr)
{
	if( g_bHnsOn )
	{
		show_plugin_info(plr - TASK_ID_SHOWPLUGININFO);
	}
	
	return PLUGIN_CONTINUE;
}

public taskScrimVote(aMenu[])
{
	if( !--g_ScrimVoteTimer )
	{
		remove_task(TASK_ID_SCRIMVOTE, 0);
		
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bScrimVoted[plr] )
			{
				menu_cancel(plr); /* block any more menu key pressing */
				
				client_cmd(plr, "slot1"); /* remove menu from player's screen */
			}
		}
		
		menu_destroy(aMenu[0]);
		
		new rounds = get_pcvar_num(hnss_rounds_wins);
		scrim_print(0, "Vote result:^x03 Win %i Rounds^x01 [^x03%i^x01] -^x03 Point System^x01 [^x03%i^x01]", rounds, g_ScrimVoteCount[SCRIM_ROUNDS], g_ScrimVoteCount[SCRIM_POINTS]);
		
		new best;
		
		if( g_ScrimVoteCount[SCRIM_ROUNDS] > g_ScrimVoteCount[SCRIM_POINTS] )
		{
			best = SCRIM_ROUNDS;
			scrim_print(0, "The scrim type will be^x03 Win %i Rounds^x01!", rounds);
		}
		else if( g_ScrimVoteCount[SCRIM_POINTS] > g_ScrimVoteCount[SCRIM_ROUNDS] )
		{
			best = SCRIM_POINTS;
			scrim_print(0, "The scrim type will be^x03 Point System^x01!");
		}
		else /* not one is greater than the other, so they are equal */
		{
			best = random_num(1, SCRIM_TYPES-1);
			
			new sWinner[16];
			switch( best )
			{
				case SCRIM_ROUNDS: formatex(sWinner, 15, "Win %i Rounds", rounds);
				case SCRIM_POINTS: copy(sWinner, 15, "Point System");
			}
			
			scrim_print(0, "^x03The votes are a tie!^x01 The random generator chooses^x03 %s^x01!", sWinner);
		}
		
		if( best == SCRIM_POINTS )
		{
			/* in case of an odd number, we need to round it up one */
			g_ScrimMaxRounds = floatround(get_pcvar_float(hnss_points_rounds) / 2.0, floatround_ceil) * 2;
			
			g_PointsKnife = get_pcvar_num(hnss_points_knife);
			g_PointsHeadshot = get_pcvar_num(hnss_points_headshot);
			g_PointsGrenade = get_pcvar_num(hnss_points_grenade);
			g_PointsKill = get_pcvar_num(hnss_points_kill);
			g_PointsSuicide = get_pcvar_num(hnss_points_suicide);
			g_PointsTeamKill = get_pcvar_num(hnss_points_teamkill);
			g_PointsRoundWin = get_pcvar_num(hnss_points_roundwin);
			g_PointsRoundLose = get_pcvar_num(hnss_points_roundlose);
		}
		else if( best == SCRIM_ROUNDS )
		{
			g_ScrimMaxRounds = rounds;
			g_ScrimMaxLosses = get_pcvar_num(hnss_rounds_losses);
			g_ScrimSaveWins = get_pcvar_num(hnss_rounds_savewins);
		}
		
		g_ScrimType = best;
		g_ScrimWinner = CS_TEAM_UNASSIGNED;
		g_ScrimRounds[HNS_TEAM_HIDER] = 0;
		g_ScrimRounds[HNS_TEAM_SEEKER] = 0;
		g_bScrimIsDraw = false;
		g_ScrimTeams[1] = HNS_TEAM_HIDER;
		g_ScrimTeams[2] = HNS_TEAM_SEEKER;
		g_ScrimTeamNums[HNS_TEAM_HIDER] = 1;
		g_ScrimTeamNums[HNS_TEAM_SEEKER] = 2;
		g_ScrimScores[HNS_TEAM_HIDER] = 0;
		g_ScrimScores[HNS_TEAM_SEEKER] = 0;
		
		g_bScrimOn = true;
		set_pcvar_num(sv_restart, 1);
	}
	else
	{
		new sTitle[32];
		formatex(sTitle, 31, "Choose a scrim type \r[\w%i\r]", g_ScrimVoteTimer);
		
		new menu = aMenu[0];
		menu_setprop(menu, MPROP_TITLE, sTitle);
		
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bScrimVoted[plr] )
			{
				menu_display(plr, menu, 0);
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskExecuteConfig()
{
	new sConfig[64];
	get_configsdir(sConfig, 63);
	add(sConfig, 63, "/hidenseek.cfg", 0);
	
	if( file_exists(sConfig) )
	{
		server_cmd("exec %s", sConfig);
		server_exec();
		
		set_task(1.0, "TaskCheckOldVersion");
	}
	else
	{
		make_config(sConfig, true);
		
		register_forward(FM_GetGameDescription, "fwdGetGameDescription", 0);
	}
}

public TaskCheckOldVersion()
{
	new sValue[32];
	get_pcvar_string(hns_gametype, sValue, 31);
	
	if( had_older_version(sValue) || is_config_old() )
	{
		formatex(sValue, 31, "HideNSeek v%s", PLUGIN_VERSION);
		set_pcvar_string(hns_gametype, sValue);
		
		set_task(1.0, "TaskResetConfig");
	}
	else
	{
		register_forward(FM_GetGameDescription, "fwdGetGameDescription", 0);
	}
}

public TaskResetConfig()
{
	new sConfig[64];
	get_configsdir(sConfig, 63);
	add(sConfig, 63, "/hidenseek.cfg", 0);
	
	//delete_file(sConfig);
	make_config(sConfig, false);
	
	register_forward(FM_GetGameDescription, "fwdGetGameDescription", 0);
}

bool:had_older_version(const sGameType[])
{
	new bool:bOld = false;
	
	new sTemp[32];
	formatex(sTemp, 31, "HideNSeek v%s", PLUGIN_VERSION);
	
	if( !equali(sTemp, sGameType) )
	{
		new Float:version = str_to_float(PLUGIN_VERSION);
		for( new Float:i = 2.0; i < version; i += 0.1 )
		{
			formatex(sTemp, 31, "HideNSeek v%.1f", i);
			
			if( equali(sTemp, sGameType) )
			{
				bOld = true;
				break;
			}
		}
	}
	
	return bOld;
}

bool:is_config_old()
{
	new sConfig[64];
	get_configsdir(sConfig, 63);
	add(sConfig, 63, "/hidenseek.cfg", 0);
	
	new f = fopen(sConfig, "rt");
	new data[128];
	
	while( !feof(f) )
	{
		fgets(f, data, sizeof(data) - 1);
		
		if( containi(data, "hns_warmup") != -1 )
		{
			fclose(f);
			
			return false;
		}
	}
	
	fclose(f);
	
	return true;
}

make_config(const sConfig[], bool:bCheckVersion)
{
	new f = fopen(sConfig, "wt");
	
	fputs(f, "// This is where all the cvars go for HideNSeek^n// Information about the cvars can be found at: http://forums.alliedmods.net/showthread.php?t=65370^n^n");
	
	new sValue[32]; // any string needed from a cvar
	
	fprintf(f, "hns_footsteps %i^n", get_pcvar_num(hns_footsteps));
	fprintf(f, "hns_money %i^n", get_pcvar_num(hns_money));
	fprintf(f, "hns_nubslash %i^n", get_pcvar_num(hns_nubslash));
	fprintf(f, "hns_disablebuy %i^n", get_pcvar_num(hns_disablebuy));
	fprintf(f, "hns_hidetime %i^n", get_pcvar_num(hns_hidetime));
	fprintf(f, "hns_timersounds %i^n", get_pcvar_num(hns_timersounds));
	fprintf(f, "hns_noslowdown %i^n", get_pcvar_num(hns_noslowdown));
	fprintf(f, "hns_teamchange %i^n", get_pcvar_num(hns_teamchange));
	fprintf(f, "hns_disablekill %i^n", get_pcvar_num(hns_disablekill));
	fprintf(f, "hns_chooseteam %i^n", get_pcvar_num(hns_chooseteam));
	fprintf(f, "hns_semiclip %i^n", get_pcvar_num(hns_semiclip));
	fprintf(f, "hns_semiclip_alpha %i^n", get_pcvar_num(hns_semiclip_alpha));
	fprintf(f, "hns_noflash %i^n", get_pcvar_num(hns_noflash));
	fprintf(f, "hns_removebreakables %i^n", get_pcvar_num(hns_removebreakables));
	fprintf(f, "hns_removedoors %i^n", get_pcvar_num(hns_removedoors));
	fprintf(f, "hns_visiblecommands %i^n", get_pcvar_num(hns_visiblecommands));
	fprintf(f, "hns_noboosting %i^n", get_pcvar_num(hns_noboosting));
	fprintf(f, "hns_noboosting_punish %i^n", get_pcvar_num(hns_noboosting_punish));
	fprintf(f, "hns_noboosting_damage %i^n", get_pcvar_num(hns_noboosting_damage));
	fprintf(f, "hns_noboosting_interval %.4f^n", get_pcvar_float(hns_noboosting_interval));
	get_pcvar_string(hns_blindcolors, sValue, 31);
	fprintf(f, "hns_blindcolors ^"%s^"^n", sValue);
	get_pcvar_string(hns_hudcolors, sValue, 31);
	fprintf(f, "hns_hudcolors ^"%s^"^n", sValue);
	get_pcvar_string(hns_lights, sValue, 31);
	fprintf(f, "hns_lights ^"%s^"^n", sValue);
	
	get_pcvar_string(hns_gametype, sValue, 31);
	if( bCheckVersion )
	{
		if( had_older_version(sValue) )
		{
			formatex(sValue, 31, "HideNSeek v%s", PLUGIN_VERSION);
		}
	}
	fprintf(f, "hns_gametype ^"%s^"^n", sValue);
	
	get_pcvar_string(hns_prefix, sValue, 31);
	fprintf(f, "hns_prefix ^"%s^"^n", sValue);
	fprintf(f, "hns_warmup_godmode %i^n", get_pcvar_num(hns_warmup_godmode));
	fprintf(f, "hns_warmup_respawn %i^n^n", get_pcvar_num(hns_warmup_respawn));
	
	new sTeams[CsTeams][16];
	copy(sTeams[HNS_TEAM_HIDER], 15, "hiders");
	copy(sTeams[HNS_TEAM_SEEKER], 15, "seekers");
	fprintf(f, "hns_hiders_knife %i^n", get_pcvar_num(hns_hiders_knife));
	fprintf(f, "hns_hiders_alivefrags %i^n", get_pcvar_num(hns_hiders_alivefrags));
	for( new CsTeams:team = HNS_TEAM_HIDER; team < CS_TEAM_SPECTATOR; team++ )
	{
		fprintf(f, "hns_%s_grenades %i^n", sTeams[team], get_pcvar_num(hns_grenades[team]));
		fprintf(f, "hns_%s_grenades_percent %i^n", sTeams[team], get_pcvar_num(hns_grenades_percent[team]));
		fprintf(f, "hns_%s_flashbangs %i^n", sTeams[team], get_pcvar_num(hns_flashbangs[team]));
		fprintf(f, "hns_%s_flashbangs_percent %i^n", sTeams[team], get_pcvar_num(hns_flashbangs_percent[team]));
		fprintf(f, "hns_%s_smokegren %i^n", sTeams[team], get_pcvar_num(hns_smokegren[team]));
		fprintf(f, "hns_%s_smokegren_percent %i^n", sTeams[team], get_pcvar_num(hns_smokegren_percent[team]));
		fprintf(f, "hns_%s_armor %i^n^n", sTeams[team], get_pcvar_num(hns_armor[team]));
	}
	
	get_pcvar_string(hnss_prefix, sValue, 31);
	fprintf(f, "hnss_prefix ^"%s^"^n", sValue);
	fprintf(f, "hnss_vote_timer %i^n^n", get_pcvar_num(hnss_vote_timer));
	
	fprintf(f, "hnss_rounds_wins %i^n", get_pcvar_num(hnss_rounds_wins));
	fprintf(f, "hnss_rounds_losses %i^n", get_pcvar_num(hnss_rounds_losses));
	fprintf(f, "hnss_rounds_savewins %i^n^n", get_pcvar_num(hnss_rounds_savewins));
	
	fprintf(f, "hnss_points_knife %i^n", get_pcvar_num(hnss_points_knife));
	fprintf(f, "hnss_points_headshot %i^n", get_pcvar_num(hnss_points_headshot));
	fprintf(f, "hnss_points_grenade %i^n", get_pcvar_num(hnss_points_grenade));
	fprintf(f, "hnss_points_kill %i^n", get_pcvar_num(hnss_points_kill));
	fprintf(f, "hnss_points_suicide %i^n", get_pcvar_num(hnss_points_suicide));
	fprintf(f, "hnss_points_teamkill %i^n", get_pcvar_num(hnss_points_teamkill));
	fprintf(f, "hnss_points_roundwin %i^n", get_pcvar_num(hnss_points_roundwin));
	fprintf(f, "hnss_points_roundwin %i^n", get_pcvar_num(hnss_points_roundwin));
	fprintf(f, "hnss_points_rounds %i", get_pcvar_num(hnss_points_rounds));
	
	fclose(f);
}

register_say_command(const sCommand[], const sHandle[], const flags=-1, const sDescription[]="", const FlagManager=-1)
{
	new sTemp[64];
	
	formatex(sTemp, 63, "say /%s", sCommand);
	register_clcmd(sTemp, sHandle, flags, sDescription, FlagManager);
	
	formatex(sTemp, 63, "say .%s", sCommand);
	register_clcmd(sTemp, sHandle, flags, sDescription, FlagManager);
	
	formatex(sTemp, 63, "say_team /%s", sCommand);
	register_clcmd(sTemp, sHandle, flags, sDescription, FlagManager);
	
	formatex(sTemp, 63, "say_team .%s", sCommand);
	register_clcmd(sTemp, sHandle, flags, sDescription, FlagManager);
}

handle_booster(plr)
{
	new sPrefix[16];
	new Float:fGametime = get_gametime();
	new Float:fInterval = get_pcvar_float(hns_noboosting_interval);
	get_pcvar_string(hns_prefix, sPrefix, 15);
	
	if( fGametime >= g_fBoostPunishDelay[plr] )
	{
		punish_booster(plr);
		g_fBoostPunishDelay[plr] = fGametime + fInterval;
	}
	
	if( fGametime >= g_fBoostMessageDelay[plr] )
	{
		set_hudmessage(255, 50, 50, -1.0, 0.6, 1, 3.0, 3.0, 0.1, 0.1, -1);
		ShowSyncHudMsg(plr, g_BoostHud, "%s No Boosting Allowed!", sPrefix);
		
		g_fBoostMessageDelay[plr] = fGametime + 2.8;
	}
}

punish_booster(plr)
{
	new damage = get_pcvar_num(hns_noboosting_damage);
	
	if( damage >= get_user_health(plr) )
	{
		fm_fakedamage(plr, "anti-boost system", float(damage), DMG_CRUSH);
	}
	else
	{
		user_slap(plr, damage, 1);
		user_slap(plr, 0, 1);
	}
}

get_hider_and_seeker(&hider = 0, &seeker = 0, &hider_alive = 0)
{
	static CsTeams:team;
	for( new plr = 1; plr <= g_MaxPlayers; plr++ )
	{
		if( !g_bConnected[plr] )
		{
			continue;
		}
		
		team = cs_get_user_team(plr);
		if( team == HNS_TEAM_SEEKER && !seeker )
		{
			seeker = plr;
			
			if( hider && hider_alive )
			{
				break;
			}
		}
		else if( team == HNS_TEAM_HIDER )
		{
			if( !hider )
			{
				hider = plr;
			}
			if( !hider_alive && g_bAlive[plr] )
			{
				hider_alive = plr;
				
				if( seeker && hider )
				{
					break;
				}
			}
		}
	}
}

bool:remove_entities(const class[])
{
	new bool:remove = false;
	
	new ent = g_MaxPlayers, properties[32], Float:amt;
	while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", class)) )
	{
		pev(ent, pev_renderamt, amt);
		formatex(properties, 31, "^"%i^" ^"%f^" ^"%i^"", pev(ent, pev_rendermode), amt, pev(ent, pev_solid));
		
		set_pev(ent, pev_message, properties);
		set_pev(ent, pev_rendermode, kRenderTransAlpha);
		set_pev(ent, pev_renderamt, 0.0);
		set_pev(ent, pev_solid, SOLID_NOT);
		
		remove = true;
	}
	
	return remove;
}

bool:restore_entities(const class[])
{
	new bool:remove = true;
	
	new ent = g_MaxPlayers, properties[32], rendermode[4], amt[16], solid[4];
	while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", class)) )
	{
		pev(ent, pev_message, properties, 31);
		parse(properties, rendermode, 3, amt, 15, solid, 3);
		
		set_pev(ent, pev_rendermode, str_to_num(rendermode));
		set_pev(ent, pev_renderamt, str_to_float(amt));
		set_pev(ent, pev_solid, str_to_num(solid));
		set_pev(ent, pev_message, g_sBlank);
		
		remove = false;
	}
	
	return remove;
}

show_scrim_vote()
{
	new menu = menu_create("", "mnuScrimType");
	
	new sItem[32];
	formatex(sItem, 31, "Win %i Rounds", get_pcvar_num(hnss_rounds_wins));
	
	menu_additem(menu, sItem, "1", 0, -1);
	menu_additem(menu, "Point System", "2", 0, -1);
	
	menu_setprop(menu, MPROP_PERPAGE, 0);
	
	for( new plr = 1; plr <= g_MaxPlayers; plr++ )
	{
		if( g_bConnected[plr] )
		{
			g_bScrimVoted[plr] = false;
		}
		else
		{
			g_bScrimVoted[plr] = true;
		}
	}
	
	g_ScrimVoteTimer = get_pcvar_num(hnss_vote_timer) + 1;
	g_ScrimVoteCount[SCRIM_ROUNDS] = 0;
	g_ScrimVoteCount[SCRIM_POINTS] = 0;
	
	new aMenu[2];
	aMenu[0] = menu;
	set_task(1.0, "taskScrimVote", TASK_ID_SCRIMVOTE, aMenu, 2, "b", 0);
	
	return 1;
}

bool:check_last_vote(plr_to_skip)
{
	for( new i = 1; i <= g_MaxPlayers; i++ )
	{
		if( !g_bConnected[i]
		|| i == plr_to_skip )
		{
			continue;
		}
		
		if( !g_bScrimVoted[i] )
		{
			return false;
		}
	}
	
	return true;
}

show_plugin_info(plr)
{
	hns_print(plr, "^x01*********stediginiz bir map var ise^x03 /maps ^x01, yazarak istediginiz mapi oylamaya ekleyebilirsiniz..", PLUGIN_VERSION);
	hns_print(plr, "");
	
	return 1;
}

cs_reset_user_maxspeed(plr)
{
	static Float:fMaxSpeed;
	
	static clip, ammo;
	switch( get_user_weapon(plr, clip, ammo) )
	{
		case CSW_SG550, CSW_AWP, CSW_G3SG1:
		{
			fMaxSpeed = 210.0;
		}
		case CSW_M249:
		{
			fMaxSpeed = 220.0;
		}
		case CSW_AK47:
		{
			fMaxSpeed = 221.0;
		}
		case CSW_M3, CSW_M4A1:
		{
			fMaxSpeed = 230.0;
		}
		case CSW_SG552:
		{
			fMaxSpeed = 235.0;
		}
		case CSW_XM1014, CSW_AUG, CSW_GALIL, CSW_FAMAS:
		{
			fMaxSpeed = 240.0;
		}
		case CSW_P90:
		{
			fMaxSpeed = 245.0;
		}
		case CSW_SCOUT:
		{
			fMaxSpeed = 260.0;
		}
		default:
		{
			fMaxSpeed = 250.0;
		}
	}
	
	engfunc(EngFunc_SetClientMaxspeed, plr, fMaxSpeed);
	set_pev(plr, pev_maxspeed, fMaxSpeed);
	
	return 1;
}

chance(plr, maxcount, percent, sClass[], CSW_type=0, sName[]="")
{
	if( !maxcount || !percent )
	{
		return 0;
	}
	
	new count;
	for( new i = 0; i < maxcount; i++ )
	{
		if( random_num(1, 100) <= percent )
		{
			if( count == 0 )
			{
				fm_give_item(plr, sClass);
			}
			
			count++;
		}
	}
	
	if( count && CSW_type )
	{
		if( percent < 100 )
		{
			hns_print(plr, "You received %i %s%s! (%i%% chance)", count, sName, (count == 1) ? g_sBlank : g_sS, percent);
		}
		
		cs_set_user_bpammo(plr, CSW_type, count);
	}
	
	return 1;
}

get_blind_colors(&red, &green, &blue, &alpha)
{
	new sColors[20];
	get_pcvar_string(hns_blindcolors, sColors, 19);
	
	static sRed[5], sGreen[5], sBlue[5], sAlpha[5];
	if( parse(sColors, sRed, 4, sGreen, 4, sBlue, 4, sAlpha, 4) < 4 )
	{
		red = 0;
		green = 0;
		blue = 0;
		alpha = 255;
		
		formatex(sColors, 19, "%i %i %i %i", red, green, blue, alpha);
		set_pcvar_string(hns_blindcolors, sColors);
		
		return 0;
	}
	
	red =	equali(sRed, "rand", 0) ?	random(256) : clamp(str_to_num(sRed), 0, 255);
	green =	equali(sGreen, "rand", 0) ?	random(256) : clamp(str_to_num(sGreen), 0, 255);
	blue =	equali(sBlue, "rand", 0) ?	random(256) : clamp(str_to_num(sBlue), 0, 255);
	alpha =	equali(sAlpha, "rand", 0) ?	random(256) : clamp(str_to_num(sAlpha), 0, 255);
	
	return 1;
}

get_hud_colors(&red, &green, &blue)
{
	new sColors[20];
	get_pcvar_string(hns_hudcolors, sColors, 19);
	
	static sRed[5], sGreen[5], sBlue[5];
	if( parse(sColors, sRed, 4, sGreen, 4, sBlue, 4) < 3 )
	{
		red = 255;
		green = 255;
		blue = 255;
		
		formatex(sColors, 19, "%i %i %i", red, green, blue);
		set_pcvar_string(hns_blindcolors, sColors);
		
		return 0;
	}
	
	red =	equali(sRed, "rand", 0) ?	random(256) : clamp(str_to_num(sRed), 0, 255);
	green =	equali(sGreen, "rand", 0) ?	random(256) : clamp(str_to_num(sGreen), 0, 255);
	blue =	equali(sBlue, "rand", 0) ?	random(256) : clamp(str_to_num(sBlue), 0, 255);
	
	return 1;
}

set_lights(const sLights[])
{
	engfunc(EngFunc_LightStyle, 0, sLights);
	copy(g_sLights, 16, sLights);
	
	return 1;
}

make_HideWeapon(plr, flags)
{
	static i; i = plr ? plr : get_player();
	if( !i )
	{
		return 0;
	}
	
	message_begin(plr ? MSG_ONE : MSG_ALL, g_msgHideWeapon, {0, 0, 0}, plr);
	write_byte(flags);
	message_end();
	
	return 1;
}

make_ScreenFade(plr, Float:fDuration, Float:fHoldtime, red, green, blue, alpha)
{
	static i; i = plr ? plr : get_player();
	if( !i )
	{
		return 0;
	}
	
	message_begin(plr ? MSG_ONE : MSG_ALL, g_msgScreenFade, {0, 0, 0}, plr);
	write_short(floatround(4096.0 * fDuration, floatround_round));
	write_short(floatround(4096.0 * fHoldtime, floatround_round));
	write_short(4096);
	write_byte(red);
	write_byte(green);
	write_byte(blue);
	write_byte(alpha);
	message_end();
	
	return 1;
}

emake_TeamInfo(plr, sTeam[])
{
	if( !plr )
	{
		return 0;
	}
	
	emessage_begin(MSG_ALL, g_msgTeamInfo, {0, 0, 0}, 0);
	ewrite_byte(plr);
	ewrite_string(sTeam);
	emessage_end();
	
	return 1;
}

make_TeamInfo(plr, sTeam[])
{
	if( !plr )
	{
		return 0;
	}
	
	message_begin(MSG_ALL, g_msgTeamInfo, {0, 0, 0}, 0);
	write_byte(plr);
	write_string(sTeam);
	message_end();
	
	return 1;
}

make_Money(plr, money, flash)
{
	if( !plr )
	{
		return 0;
	}
	
	message_begin(MSG_ONE, g_msgMoney, {0, 0, 0}, plr);
	write_long(money);
	write_byte(flash ? 1 : 0);
	message_end();
	
	return 1;
}

make_ArmorType(plr, helmet)
{
	if( !plr )
	{
		return 0;
	}
	
	message_begin(MSG_ONE, g_msgArmorType, {0, 0, 0}, plr);
	write_byte(helmet);
	message_end();
	
	return 1;
}

make_SayText(receiver, sender, sMessage[])
{
	if( !sender )
	{
		return 0;
	}
	
	message_begin(receiver ? MSG_ONE : MSG_ALL, g_msgSayText, {0, 0, 0}, receiver);
	write_byte(sender);
	write_string(sMessage);
	message_end();
	
	return 1;
}

hns_print(plr, const sFormat[], any:...)
{
	static i; i = plr ? plr : get_player();
	if( !i )
	{
		return 0;
	}
	
	new sPrefix[16];
	get_pcvar_string(hns_prefix, sPrefix, 15);
	
	new sMessage[256];
	new len = formatex(sMessage, 255, "^x04%s^x01 ", sPrefix);
	vformat(sMessage[len], 255-len, sFormat, 3);
	sMessage[192] = '^0';
	
	make_SayText(plr, i, sMessage);
	
	return 1;
}

scrim_print(plr, const sFmt[], any:...)
{
	new i = plr ? plr : get_player();
	if( !i )
	{
		return 0;
	}
	
	new sPrefix[16];
	get_pcvar_string(hnss_prefix, sPrefix, 15);
	
	new sMessage[256];
	new len = formatex(sMessage, 255, "^x04%s^x01 ", sPrefix);
	vformat(sMessage[len], 255-len, sFmt, 3);
	sMessage[192] = '^0';
	
	make_SayText(plr, i, sMessage);
	
	return 1;
}

get_player()
{
	for( new plr = 1; plr <= g_MaxPlayers; plr++ )
	{
		if( g_bConnected[plr] )
		{
			return plr;
		}
	}
	
	return 0;
}

/* cstrike -> fakemeta stocks */
CsTeams:cs_get_user_team(plr, &{CsInternalModel,_}:model=CS_DONTCHANGE)
{
	model = CsInternalModel:get_pdata_int(plr, OFFSET_INTERNALMODEL);
	
	return CsTeams:get_pdata_int(plr, OFFSET_TEAM);
}

cs_set_user_team(plr, {CsTeams,_}:team, {CsInternalModel,_}:model=CS_DONTCHANGE)
{
	set_pdata_int(plr, OFFSET_TEAM, _:team);
	if( model )
	{
		set_pdata_int(plr, OFFSET_INTERNALMODEL, _:model);
	}
	
	dllfunc(DLLFunc_ClientUserInfoChanged, plr);
	
	make_TeamInfo(plr, g_sTeamInfo[team]);
	
	return 1;
}

cs_set_user_money(plr, money, flash=1)
{
	set_pdata_int(plr, OFFSET_MONEY, money);
	
	make_Money(plr, money, flash);
	
	return 1;
}

cs_set_user_armor(plr, amount, CsArmorType:type)
{
	set_pdata_int(plr, OFFSET_ARMORTYPE, _:type);
	set_pev(plr, pev_armorvalue, float(amount));
	
	if( type != CS_ARMOR_NONE )
	{
		make_ArmorType(plr, (type == CS_ARMOR_VESTHELM) ? 1 : 0);
	}
	
	return 1;
}

__get_ammo_offset(weapon)
{
	static offset;
	
	switch( weapon )
	{
		case CSW_AWP:
		{
			offset = OFFSET_AWP_AMMO;
		}
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1:
		{
			offset = OFFSET_SCOUT_AMMO;
		}
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALIL, CSW_SG552:
		{
			offset = OFFSET_FAMAS_AMMO;
		}
		case CSW_M3, CSW_XM1014:
		{
			offset = OFFSET_M3_AMMO;
		}
		case CSW_USP, CSW_UMP45, CSW_MAC10:
		{
			offset = OFFSET_USP_AMMO;
		}
		case CSW_FIVESEVEN, CSW_P90:
		{
			offset = OFFSET_FIVESEVEN_AMMO;
		}
		case CSW_DEAGLE:
		{
			offset = OFFSET_DEAGLE_AMMO;
		}
		case CSW_P228:
		{
			offset = OFFSET_P228_AMMO;
		}
		case CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP, CSW_ELITE:
		{
			offset = OFFSET_GLOCK_AMMO;
		}
		case CSW_FLASHBANG:
		{
			offset = OFFSET_FLASHBANG_AMMO;
		}
		case CSW_HEGRENADE:
		{
			offset = OFFSET_HEGRENADE_AMMO;
		}
		case CSW_SMOKEGRENADE:
		{
			offset = OFFSET_SMOKEGRENADE_AMMO;
		}
		case CSW_C4:
		{
			offset = OFFSET_C4_AMMO;
		}
		default:
		{
			return 0;
		}
	}
	
	return offset;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1055\\ f0\\ fs16 \n\\ par }
*/

Last edited by lexzor; 06-07-2023 at 09:57.
lexzor is offline
m3t3hann
Junior Member
Join Date: Dec 2020
Old 06-07-2023 , 09:16   Re: tag mismatch
Reply With Quote #3

Quote:
Originally Posted by lexzor View Post
this is not a problem, it's a warning

Code:
/*

	HideNSeek
	Version 2.8
	By Exolent
	
	Information about this plugin can be found at:
	http://forums.alliedmods.net/showthread.php?t=65370

*/

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <fakemeta_util>

/* YAY! No <cstrike> <csx> <fun> or <engine>!! =D */


#define PLUGIN_NAME	"HideNSeek"
#define PLUGIN_VERSION	"2.8"
#define PLUGIN_AUTHOR	"Exolent"


#pragma semicolon 1


/* save memory */
new const g_sBlank[] = "";
new const g_sA[] = "a";
new const g_sB[] = "b";
new const g_sS[] = "s";
new const g_sKnifeModel_v[] = "models/v_knife.mdl";
new const g_sKnifeModel_w[] = "models/w_knife.mdl";
new const g_sModel[] = "model";
new const g_sLightsNormal[] = "m";
new const g_sClassBreakable[] = "func_breakable";
new const g_sClassDoor[] = "func_door";
new const g_sClassDoorRotating[] = "func_door_rotating";

/* end of save memory globals */

/* CONVERT CSTRIKE TO FAKEMETA */

enum CsTeams
{
	CS_TEAM_UNASSIGNED = 0,
	CS_TEAM_T,
	CS_TEAM_CT,
	CS_TEAM_SPECTATOR
};
enum CsInternalModel
{
	CS_DONTCHANGE = 0,
	CS_CT_URBAN,
	CS_T_TERROR,
	CS_T_LEET,
	CS_T_ARCTIC,
	CS_CT_GSG9,
	CS_CT_GIGN,
	CS_CT_SAS,
	CS_T_GUERILLA,
	CS_CT_VIP,
	CZ_T_MILITIA,
	CZ_CT_SPETSNAZ
};
enum CsArmorType
{
	CS_ARMOR_NONE = 0,
	CS_ARMOR_KEVLAR,
	CS_ARMOR_VESTHELM
};

#define OFFSET_ARMORTYPE		112
#define OFFSET_TEAM			114
#define OFFSET_MONEY			115
#define OFFSET_INTERNALMODEL		126
#define OFFSET_AWP_AMMO			377 
#define OFFSET_SCOUT_AMMO		378
#define OFFSET_PARA_AMMO		379
#define OFFSET_FAMAS_AMMO		380
#define OFFSET_M3_AMMO			381
#define OFFSET_USP_AMMO			382
#define OFFSET_FIVESEVEN_AMMO		383
#define OFFSET_DEAGLE_AMMO		384
#define OFFSET_P228_AMMO		385
#define OFFSET_GLOCK_AMMO		386
#define OFFSET_FLASHBANG_AMMO		387
#define OFFSET_HEGRENADE_AMMO		388
#define OFFSET_SMOKEGRENADE_AMMO	389
#define OFFSET_C4_AMMO			390

#define cs_set_user_bpammo(%1,%2,%3) set_pdata_int(%1, __get_ammo_offset(%2), %3)
#define cs_set_user_model(%1,%2) engfunc(EngFunc_SetClientKeyValue, %1, engfunc(EngFunc_GetInfoKeyBuffer, %1), g_sModel, %2)
#define cs_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), g_sModel, %2, %3)

/* END OF CSTRIKE TO FAKEMETA CONVERSION */


#define HIDE_MONEY		(1<<5)

new const CsTeams:HNS_TEAM_HIDER = CS_TEAM_T;
new const CsTeams:HNS_TEAM_SEEKER = CS_TEAM_CT;

new const CsInternalModel:HNS_MODEL_HIDER = CS_T_LEET;
new const CsInternalModel:HNS_MODEL_SEEKER = CS_CT_GIGN;

enum
{
	SCRIM_NONE = 0,
	SCRIM_ROUNDS,
	SCRIM_POINTS,
	
	SCRIM_TYPES
};

new const g_sBuyCommands[][] =
{
	"usp", "glock", "deagle", "p228", "elites",
	"fn57", "m3", "xm1014", "mp5", "tmp", "p90",
	"mac10", "ump45", "ak47", "galil", "famas",
	"sg552", "m4a1", "aug", "scout", "awp", "g3sg1",
	"sg550", "m249", "vest", "vesthelm", "flash",
	"hegren", "sgren", "defuser", "nvgs", "shield",
	"primammo", "secammo", "km45", "9x19mm", "nighthawk",
	"228compact", "fiveseven", "12gauge", "autoshotgun",
	"mp", "c90", "cv47", "defender", "clarion", "krieg552",
	"bullpup", "magnum", "d3au1", "krieg550"
};
new const MAX_BUY_COMMANDS = sizeof(g_sBuyCommands);
new const g_sRemoveEntities[][] =
{
	"func_bomb_target",
	"info_bomb_target",
	"hostage_entity",
	"monster_scientist",
	"func_hostage_rescue",
	"info_hostage_rescue",
	"info_vip_start",
	"func_vip_safetyzone",
	"func_escapezone",
	"armoury_entity"
};
new const MAX_REMOVED_ENTITIES = sizeof(g_sRemoveEntities);
new const g_sAllModels[CsTeams][][] =
{
	{"", "", "", ""},
	{"terror", "arctic", "leet", "guerilla"},
	{"gign", "gsg9", "sas", "urban"},
	{"", "", "", ""}
};
new const g_sDefaultModels[CsTeams][] =
{
	"",
	"leet",
	"gign",
	""
};
new const g_sTeamInfo[CsTeams][] =
{
	"UNASSIGNED",
	"TERRORIST",
	"CT",
	"SPECTATOR"
};
new const g_sTeamNames[CsTeams][] =
{
	"Spectator",
	"Terrorist",
	"Counter-Terrorist",
	"Spectator"
};

enum (+= 1000)
{
	TASK_ID_STRIPWEAPONS = 1000,
	TASK_ID_GIVEWEAPONS,
	TASK_ID_GIVEKNIFE,
	TASK_ID_CHECKMODEL,
	TASK_ID_HIDETIMER,
	TASK_ID_SWAPTEAMS,
	TASK_ID_SETLIGHTS,
	TASK_ID_SHOWPLUGININFO,
	TASK_ID_SCRIMVOTE
};

new const g_PlayerTasks[] =
{
	TASK_ID_STRIPWEAPONS,
	TASK_ID_GIVEWEAPONS,
	TASK_ID_GIVEKNIFE,
	TASK_ID_CHECKMODEL,
	TASK_ID_SHOWPLUGININFO
};
new const MAX_PLAYER_TASKS = sizeof(g_PlayerTasks);

new bool:g_bHnsOn = true;
new bool:g_bScrimOn;
new bool:g_bWarmup;

new g_ScrimVoteTimer;
new g_ScrimVoteCount[SCRIM_TYPES];
new bool:g_bScrimVoted[33];

new g_ScrimType;
new CsTeams:g_ScrimWinner;
new g_ScrimSaveWins;
new g_ScrimRounds[CsTeams];
new g_ScrimLosses[CsTeams];
new g_ScrimMaxRounds;
new g_ScrimMaxLosses;
new bool:g_bScrimIsDraw;
new CsTeams:g_ScrimTeams[3];
new g_ScrimTeamNums[CsTeams];
new g_ScrimScores[CsTeams];

new g_PointsKnife;
new g_PointsHeadshot;
new g_PointsGrenade;
new g_PointsKill;
new g_PointsSuicide;
new g_PointsTeamKill;
new g_PointsRoundWin;
new g_PointsRoundLose;

new bool:g_bRestartRound;

new bool:g_bConnected[33];
new bool:g_bAlive[33];
new bool:g_bFirstSpawn[33];
new CsTeams:g_Team[33];

new bool:g_bSolid[33];
new bool:g_bRestoreSolid[33];

new bool:g_bWeaponsGiven;

new g_sHelpMotd[43];
new g_sScrimMotd[49];

new Float:g_fKillMsgDelay[33];

new g_RoundsLost;
new g_RoundsEnded;

new bool:g_bDisableSlash = true;

new g_HideTimer;

new g_OldMoney;

new g_sLights[16];

new bool:g_bNonSpawnEvent[33];
new g_FwdClientCommand_post;

new bool:g_bRemovedBreakables;
new bool:g_bRemovedDoors;
new bool:g_bRemovedDoorsRotating;

new Float:g_fBoostPunishDelay[33];
new Float:g_fBoostMessageDelay[33];

new g_BoostHud;

new hns_footsteps;
new hns_money;
new hns_nubslash;
new hns_disablebuy;
new hns_hiders_knife;
new hns_grenades[CsTeams];
new hns_grenades_percent[CsTeams];
new hns_flashbangs[CsTeams];
new hns_flashbangs_percent[CsTeams];
new hns_smokegren[CsTeams];
new hns_smokegren_percent[CsTeams];
new hns_armor[CsTeams];
new hns_hidetime;
new hns_timersounds;
new hns_noslowdown;
new hns_teamchange;
new hns_disablekill;
new hns_blindcolors;
new hns_hudcolors;
new hns_hiders_alivefrags;
new hns_lights;
new hns_visiblecommands;
new hns_chooseteam;
new hns_semiclip;
new hns_semiclip_alpha;
new hns_gametype;
new hns_prefix;
new hns_removebreakables;
new hns_noflash;
new hns_removedoors;
new hns_noboosting;
new hns_noboosting_damage;
new hns_noboosting_punish;
new hns_noboosting_interval;
new hns_warmup_godmode;
new hns_warmup_respawn;

new hnss_prefix;
new hnss_vote_timer;
new hnss_rounds_wins;
new hnss_rounds_losses;
new hnss_rounds_savewins;
new hnss_points_knife;
new hnss_points_headshot;
new hnss_points_grenade;
new hnss_points_kill;
new hnss_points_suicide;
new hnss_points_teamkill;
new hnss_points_roundwin;
new hnss_points_roundlose;
new hnss_points_rounds;

new amx_vote_answers;
new sv_restart;

new g_msgSayText;
new g_msgHideWeapon;
new g_msgScreenFade;
new g_msgTeamInfo;
new g_msgMoney;
new g_msgArmorType;

new g_MaxPlayers;
new g_MaxEntities;

new g_HostageEnt;

public plugin_precache()
{
	register_forward(FM_Spawn, "fwdSpawn", 0);
	
	new allocHostageEntity = engfunc(EngFunc_AllocString, "hostage_entity");
	do
	{
		g_HostageEnt = engfunc(EngFunc_CreateNamedEntity, allocHostageEntity);
	}
	while( !pev_valid(g_HostageEnt) );
	
	engfunc(EngFunc_SetOrigin, g_HostageEnt, Float:{0.0, 0.0, -55000.0});
	engfunc(EngFunc_SetSize, g_HostageEnt, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 1.0});
	dllfunc(DLLFunc_Spawn, g_HostageEnt);
	
	return PLUGIN_CONTINUE;
}

public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	
	register_cvar(PLUGIN_NAME, PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY, 0.0);
	
	new sBuyHandle[] = "cmdBuy";
	register_clcmd("buy", sBuyHandle, -1, g_sBlank);
	register_clcmd("buyammo1", sBuyHandle, -1, g_sBlank);
	register_clcmd("buyammo2", sBuyHandle, -1, g_sBlank);
	register_clcmd("buyequip", sBuyHandle, -1, g_sBlank);
	register_clcmd("cl_autobuy", sBuyHandle, -1, g_sBlank);
	register_clcmd("cl_rebuy", sBuyHandle, -1, g_sBlank);
	register_clcmd("cl_setautobuy", sBuyHandle, -1, g_sBlank);
	register_clcmd("cl_setrebuy", sBuyHandle, -1, g_sBlank);
	
	register_concmd("hns_status", "cmdHnsStatus", ADMIN_KICK, "<0|1> -- 0=HNS OFF   1=HNS ON");
	register_concmd("hns_scrim", "cmdScrim", ADMIN_KICK, "<0|1> -- 0=STOP SCRIM   1=START SCRIM");
	register_concmd("hns_scrimtype", "cmdScrimType", ADMIN_KICK, "<0|1|2> -- 0=VOTE TYPE   1=WIN ROUNDS   2=POINT SYSTEM");
	register_concmd("hns_captains", "cmdCaptains", ADMIN_KICK, "-- chooses two (2) random players to be captains for a pug");
	register_concmd("hns_warmup", "cmdWarmup", ADMIN_KICK, "<0|1> -- 0=STOP WARMUP   1=START WARMUP");
	
	new sPointsHandle[] = "cmdPoints";
	register_say_command("hnshelp", "cmdHelp", -1, g_sBlank);
	register_say_command("scrimhelp", "cmdScrimHelp", -1, g_sBlank);
	register_say_command("points", sPointsHandle, -1, g_sBlank);
	register_say_command("scores", sPointsHandle, -1, g_sBlank);
	register_say_command("wins", sPointsHandle, -1, g_sBlank);
	register_say_command("rounds", "cmdRounds", -1, g_sBlank);
	register_say_command("team", "cmdTeam", -1, g_sBlank);
	
	register_forward(FM_Touch, "fwdTouch", 0);
	register_forward(FM_CmdStart, "fwdCmdStart", 0);
	register_forward(FM_SetModel, "fwdSetModel", 0);
	register_forward(FM_ClientKill, "fwdClientKill", 0);
	register_forward(FM_PlayerPreThink, "fwdPlayerPreThink", 0);
	register_forward(FM_PlayerPostThink, "fwdPlayerPostThink", 0);
	register_forward(FM_AddToFullPack, "fwdAddToFullPackPost", 1);
	//register_forward(FM_GetGameDescription, "fwdGetGameDescription", 0);
	register_forward(FM_Voice_SetClientListening, "fwdSetVoice", 0);
	
	register_event("TextMsg", "eventRestartAttempt", g_sA, "2&#Game_w");
	register_clcmd("fullupdate", "cmdFullupdate", -1, g_sBlank);
	
	hns_footsteps = register_cvar("hns_footsteps", "1", 0, 0.0);
	hns_money = register_cvar("hns_money", "0", 0, 0.0);
	hns_nubslash = register_cvar("hns_nubslash", "3", 0, 0.0);
	hns_disablebuy = register_cvar("hns_disablebuy", "1", 0, 0.0);
	hns_hiders_knife = register_cvar("hns_hiders_knife", "1", 0, 0.0);
	hns_grenades[HNS_TEAM_HIDER] = register_cvar("hns_hiders_grenades", "1", 0, 0.0);
	hns_grenades_percent[HNS_TEAM_HIDER] = register_cvar("hns_hiders_grenades_percent", "100", 0, 0.0);
	hns_flashbangs[HNS_TEAM_HIDER] = register_cvar("hns_hiders_flashbangs", "2", 0, 0.0);
	hns_flashbangs_percent[HNS_TEAM_HIDER] = register_cvar("hns_hiders_flashbangs_percent", "100", 0, 0.0);
	hns_smokegren[HNS_TEAM_HIDER] = register_cvar("hns_hiders_smokegren", "1", 0, 0.0);
	hns_smokegren_percent[HNS_TEAM_HIDER] = register_cvar("hns_hiders_smokegren_percent", "100", 0, 0.0);
	hns_armor[HNS_TEAM_HIDER] = register_cvar("hns_hiders_armor", "100", 0, 0.0);
	hns_grenades[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_grenades", "0", 0, 0.0);
	hns_grenades_percent[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_grenades_percent", "0", 0, 0.0);
	hns_flashbangs[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_flashbangs", "0", 0, 0.0);
	hns_flashbangs_percent[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_flashbangs_percent", "0", 0, 0.0);
	hns_smokegren[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_smokegren", "0", 0, 0.0);
	hns_smokegren_percent[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_smokegren_percent", "0", 0, 0.0);
	hns_armor[HNS_TEAM_SEEKER] = register_cvar("hns_seekers_armor", "100", 0, 0.0);
	hns_hidetime = register_cvar("hns_hidetime", "10", 0, 0.0);
	hns_timersounds = register_cvar("hns_timersounds", "1", 0, 0.0);
	hns_noslowdown = register_cvar("hns_noslowdown", "0", 0, 0.0);
	hns_teamchange = register_cvar("hns_teamchange", "0", 0, 0.0);
	hns_disablekill = register_cvar("hns_disablekill", "1", 0, 0.0);
	hns_blindcolors = register_cvar("hns_blindcolors", "0 0 0 255", 0, 0.0);
	hns_hudcolors = register_cvar("hns_hudcolors", "0 255 0", 0, 0.0);
	hns_hiders_alivefrags = register_cvar("hns_hiders_alivefrags", "1", 0, 0.0);
	hns_lights = register_cvar("hns_lights", g_sLightsNormal, 0, 0.0);
	hns_visiblecommands = register_cvar("hns_visiblecommands", "0", 0, 0.0);
	hns_chooseteam = register_cvar("hns_chooseteam", "0", 0, 0.0);
	hns_semiclip = register_cvar("hns_semiclip", "1", 0, 0.0);
	hns_semiclip_alpha = register_cvar("hns_semiclip_alpha", "127", 0, 0.0);
	hns_prefix = register_cvar("hns_prefix", "[HNS]", 0, 0.0);
	hns_removebreakables = register_cvar("hns_removebreakables", "1", 0, 0.0);
	hns_noflash = register_cvar("hns_noflash", "1", 0, 0.0);
	hns_removedoors = register_cvar("hns_removedoors", "1", 0, 0.0);
	hns_noboosting = register_cvar("hns_noboosting", "1", 0, 0.0);
	hns_noboosting_damage = register_cvar("hns_noboosting_damage", "25", 0, 0.0);
	hns_noboosting_punish = register_cvar("hns_noboosting_punish", "3", 0, 0.0);
	hns_noboosting_interval = register_cvar("hns_noboosting_interval", "1.0", 0, 0.0);
	hns_warmup_godmode = register_cvar("hns_warmup_godmode", "1", 0, 0.0);
	hns_warmup_respawn = register_cvar("hns_warmup_respawn", "1", 0, 0.0);
	
	new sHideNSeek[32];
	formatex(sHideNSeek, 31, "HideNSeek v%s", PLUGIN_VERSION);
	hns_gametype = register_cvar("hns_gametype", sHideNSeek, 0, 0.0);
	
	hnss_prefix = register_cvar("hnss_prefix", "[HNS-SCRIM]", 0, 0.0);
	hnss_vote_timer = register_cvar("hnss_vote_timer", "30", 0, 0.0);
	hnss_rounds_wins = register_cvar("hnss_rounds_wins", "3", 0, 0.0);
	hnss_rounds_losses = register_cvar("hnss_rounds_losses", "5", 0, 0.0);
	hnss_rounds_savewins = register_cvar("hnss_rounds_savewins", "0", 0, 0.0);
	hnss_points_knife = register_cvar("hnss_points_knife", "1", 0, 0.0);
	hnss_points_headshot = register_cvar("hnss_points_headshot", "1", 0, 0.0);
	hnss_points_grenade = register_cvar("hnss_points_grenade", "2", 0, 0.0);
	hnss_points_kill = register_cvar("hnss_points_kill", "1", 0, 0.0);
	hnss_points_suicide = register_cvar("hnss_points_suicide", "1", 0, 0.0);
	hnss_points_teamkill = register_cvar("hnss_points_teamkill", "2", 0, 0.0);
	hnss_points_roundwin = register_cvar("hnss_points_roundwin", "1", 0, 0.0);
	hnss_points_roundlose = register_cvar("hnss_points_roundlose", "1", 0, 0.0);
	hnss_points_rounds = register_cvar("hnss_points_rounds", "10", 0, 0.0);
	
	g_BoostHud = CreateHudSyncObj();
	
	amx_vote_answers = get_cvar_pointer("amx_vote_answers");
	sv_restart = get_cvar_pointer("sv_restart");
	
	g_msgSayText = get_user_msgid("SayText");
	g_msgHideWeapon = get_user_msgid("HideWeapon");
	g_msgScreenFade = get_user_msgid("ScreenFade");
	g_msgTeamInfo = get_user_msgid("TeamInfo");
	g_msgMoney = get_user_msgid("Money");
	g_msgArmorType = get_user_msgid("ArmorType");
	
	register_message(g_msgHideWeapon, "messageHideWeapon");
	register_message(g_msgScreenFade, "messageScreenFade");
	
	register_event("ResetHUD", "eventResetHUD", g_sB);
	register_event("Money", "eventMoney", g_sB);
	register_event("HLTV", "eventNewRound", g_sA, "1=0", "2=0");
	register_event("SendAudio", "eventTerrWin", g_sA, "2=%!MRAD_terwin");
	register_event("TextMsg", "eventRestartRound", g_sA, "2&#Game_C", "2&#Game_w");
	register_event("CurWeapon", "eventCurWeapon", g_sB, "1=1");
	register_event("DeathMsg", "eventDeathMsg", g_sA, "2!0");
	
	register_logevent("logeventRoundStart", 2, "1=Round_Start");
	register_logevent("logeventRoundEnd", 2, "1=Round_End");
	
	g_MaxPlayers = global_get(glb_maxClients);
	g_MaxEntities = global_get(glb_maxEntities);
	
	copy(g_sLights, 15, g_sLightsNormal);
	set_task(1.0, "taskSetLights", TASK_ID_SETLIGHTS, g_sBlank, 0, g_sB, 0);
	
	new dir[23];
	get_configsdir(dir, 22);
	
	formatex(g_sHelpMotd, 42, "%s/hidenseek_help.txt", dir);
	formatex(g_sScrimMotd, 48, "%s/hidenseek_scrim_help.txt", dir);
	
	set_task(1.0, "taskExecuteConfig");
	
	return PLUGIN_CONTINUE;
}

public plugin_natives()
{
	register_library("hidenseek");
	register_native("hns_get_status", "_GetHnsStatus");
	register_native("hnss_get_status", "_GetScrimStatus");
	
	return PLUGIN_CONTINUE;
}

public bool:_GetHnsStatus(plugin, params)
{
	return g_bHnsOn;
}

public bool:_GetScrimStatus(plugin, params)
{
	return g_bScrimOn;
}

public client_putinserver(plr)
{
	g_bConnected[plr] = true;
	g_bAlive[plr] = false;
	g_bFirstSpawn[plr] = false;
	
	return PLUGIN_CONTINUE;
}

public client_disconnected(plr)
{
	g_bConnected[plr] = false;
	
	for( new i = 0; i < MAX_PLAYER_TASKS; i++ )
	{
		remove_task(plr + g_PlayerTasks[i], 0);
	}
	
	if( g_ScrimVoteTimer > 0 && !g_bScrimVoted[plr] )
	{
		g_bScrimVoted[plr] = true;
	
		if( check_last_vote(plr) )
		{
			g_ScrimVoteTimer = 1;
		}
	}
	
	return PLUGIN_CONTINUE;
}

public client_command(plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	new sArg[13];
	if( read_argv(0, sArg, 12) > 11 )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( equali(sArg, "chooseteam") && (CS_TEAM_UNASSIGNED < cs_get_user_team(plr) < CS_TEAM_SPECTATOR) )
	{
		new CsTeams:team = cs_get_user_team(plr);
		new chooseteam = get_pcvar_num(hns_chooseteam);
		
		if( team != HNS_TEAM_HIDER && team != HNS_TEAM_SEEKER
		|| chooseteam == 1
		|| chooseteam == 2 && is_user_admin(plr) )
		{
			return PLUGIN_CONTINUE;
		}
		
		return PLUGIN_HANDLED;
	}
	
	if( !get_pcvar_num(hns_disablebuy) )
	{
		return PLUGIN_CONTINUE;
	}
	
	for( new i = 0; i < MAX_BUY_COMMANDS; i++ )
	{
		if( equali(g_sBuyCommands[i], sArg, 0) )
		{
			return PLUGIN_HANDLED;
		}
	}
	
	return PLUGIN_CONTINUE;
}

public cmdBuy(plr)
{
	return (g_bHnsOn && get_pcvar_num(hns_disablebuy)) ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
}

public cmdFullupdate(plr)
{
	g_bNonSpawnEvent[plr] = true;
	
	g_FwdClientCommand_post = register_forward(FM_ClientCommand, "fwdClientCommandPost", 1);
	
	return PLUGIN_CONTINUE;
}

public cmdHnsStatus(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 2) )
	{
		return PLUGIN_HANDLED;
	}
	
	new sArg[16];
	read_argv(1, sArg, 15);
	
	new bool:bOn = bool:clamp(str_to_num(sArg), 0, 1);
	
	if( bOn == g_bHnsOn )
	{
		new sPrefix[16];
		get_pcvar_string(hns_prefix, sPrefix, 15);
		
		console_print(plr, "%s HideNSeek is already o%s!", sPrefix, g_bHnsOn ? "n" : "ff");
		return PLUGIN_HANDLED;
	}
	
	g_bHnsOn = bOn;
	set_pcvar_num(sv_restart, 1);
	
	new sName[64]; /* server hostnames can be longer than player names */
	get_user_name(plr, sName, 63);
	
	hns_print(0, "^x03%s :^x01  st%sed HideNSeek!", sName, bOn ? "art" : "opp");
	
	return PLUGIN_HANDLED;
}

public cmdScrim(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 2) )
	{
		return PLUGIN_HANDLED;
	}
	
	new sArg[2];
	read_argv(1, sArg, 1);
	new bool:bScrim = bool:clamp(str_to_num(sArg), 0, 1);
	
	if( bScrim == g_bScrimOn )
	{
		console_print(plr, "[HNS] Scrim mod is already %s!", g_bScrimOn ? "on" : "off");
		return PLUGIN_HANDLED;
	}
	
	if( bScrim && !g_bHnsOn )
	{
		console_print(plr, "[HNS] HideNSeek must be on to start a scrim!");
		return PLUGIN_HANDLED;
	}
	
	new sName[64]; /* server hostnames can be long */
	get_user_name(plr, sName, 63);
	scrim_print(0, "^x03%s^x01 :  %s the HideNSeek scrim!", sName, bScrim ? "started" : "stopped");
	
	if( bScrim )
	{
		if( g_ScrimType == SCRIM_NONE )
		{
			show_scrim_vote();
		}
		else
		{
			if( g_ScrimType == SCRIM_POINTS )
			{
				/* in case of an odd number, we need to round it up one */
				g_ScrimMaxRounds = floatround(get_pcvar_float(hnss_points_rounds) / 2.0, floatround_ceil) * 2;
				
				g_PointsKnife = get_pcvar_num(hnss_points_knife);
				g_PointsHeadshot = get_pcvar_num(hnss_points_headshot);
				g_PointsGrenade = get_pcvar_num(hnss_points_grenade);
				g_PointsKill = get_pcvar_num(hnss_points_kill);
				g_PointsSuicide = get_pcvar_num(hnss_points_suicide);
				g_PointsTeamKill = get_pcvar_num(hnss_points_teamkill);
				g_PointsRoundWin = get_pcvar_num(hnss_points_roundwin);
				g_PointsRoundLose = get_pcvar_num(hnss_points_roundlose);
			}
			else if( g_ScrimType == SCRIM_ROUNDS )
			{
				g_ScrimMaxRounds = get_pcvar_num(hnss_rounds_wins);
				g_ScrimMaxLosses = get_pcvar_num(hnss_rounds_losses);
				g_ScrimSaveWins = get_pcvar_num(hnss_rounds_savewins);
			}
			
			g_ScrimWinner = CS_TEAM_UNASSIGNED;
			g_ScrimRounds[HNS_TEAM_HIDER] = 0;
			g_ScrimRounds[HNS_TEAM_SEEKER] = 0;
			g_bScrimIsDraw = false;
			g_ScrimTeams[1] = HNS_TEAM_HIDER;
			g_ScrimTeams[2] = HNS_TEAM_SEEKER;
			g_ScrimTeamNums[HNS_TEAM_HIDER] = 1;
			g_ScrimTeamNums[HNS_TEAM_SEEKER] = 2;
			g_ScrimScores[HNS_TEAM_HIDER] = 0;
			g_ScrimScores[HNS_TEAM_SEEKER] = 0;
			
			g_bScrimOn = true;
			set_pcvar_num(sv_restart, 1);
		}
	}
	else
	{
		g_bScrimOn = false;
		g_ScrimType = SCRIM_NONE;
		set_pcvar_num(sv_restart, 1);
	}
	
	return PLUGIN_HANDLED;
}

public cmdScrimType(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 2) )
	{
		return PLUGIN_HANDLED;
	}
	
	if( !g_bHnsOn )
	{
		console_print(plr, "[HNS] HideNSeek must be on to set the scrim type!");
		return PLUGIN_HANDLED;
	}
	
	if( g_bScrimOn )
	{
		console_print(plr, "[HNS] You cannot change the scrim type during a scrim!");
		return PLUGIN_HANDLED;
	}
	
	if( task_exists(TASK_ID_SCRIMVOTE, 0) )
	{
		console_print(plr, "[HNS] A vote is already determining the scrim type!");
		return PLUGIN_HANDLED;
	}
	
	new sArg[2];
	read_argv(1, sArg, 1);
	new type = str_to_num(sArg);
	
	if( g_ScrimType == type )
	{
		console_print(plr, "[HNS] This is already the scrim type!");
		return PLUGIN_HANDLED;
	}
	
	new sName[64]; /* server hostnames can be long */
	get_user_name(plr, sName, 63);
	switch( type )
	{
		case SCRIM_ROUNDS: scrim_print(0, "^x03%s^x01 :  set the scrim type to Win %i Rounds!", sName, get_pcvar_num(hnss_rounds_wins));
		case SCRIM_POINTS: scrim_print(0, "^x03%s^x01 :  set the scrim type to Point System!", sName);
		default:
		{
			type = SCRIM_NONE;
			scrim_print(0, "^x03%s^x01 :  set the scrim type to none!", sName);
		}
	}
	
	g_ScrimType = type;
	
	return PLUGIN_HANDLED;
}

public cmdCaptains(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 1) )
	{
		return PLUGIN_HANDLED;
	}
	
	new players[32], pnum;
	for( new i = 1; i <= g_MaxPlayers; i++ )
	{
		if( g_bConnected[i] )
		{
			players[pnum++] = i;
		}
	}
	
	new rand = random(pnum);
	new captain1 = players[rand];
	
	for( new i = rand; i < pnum; i++ )
	{
		if( (i + 1) == pnum )
		{
			continue;
		}
		
		players[i] = players[i + 1];
	}
	
	new captain2 = (pnum > 0) ? players[random(--pnum)] : 0;
	
	new sName1[32], sName2[32];
	get_user_name(captain1, sName1, 31);
	if( captain2 )	get_user_name(captain2, sName2, 31);
	else		copy(sName2, 31, "Player Not Available");
	
	scrim_print(0, "Captains will be:^x03 %s^x01 and^x03 %s", sName1, sName2);
	
	return PLUGIN_HANDLED;
}

public cmdWarmup(plr, level, cid)
{
	if( !cmd_access(plr, level, cid, 2) )
	{
		return PLUGIN_HANDLED;
	}
	
	new sArg[2];
	read_argv(1, sArg, 1);
	new bool:bWarmup = bool:clamp(str_to_num(sArg), 0, 1);
	
	if( bWarmup == g_bWarmup )
	{
		console_print(plr, "[HNS] Warmup is already %s!", g_bWarmup ? "on" : "off");
		return PLUGIN_HANDLED;
	}
	
	if( bWarmup && !g_bHnsOn )
	{
		console_print(plr, "[HNS] HideNSeek must be on to start warmup!");
		return PLUGIN_HANDLED;
	}
	
	new sName[64]; /* server hostnames can be long */
	get_user_name(plr, sName, 63);
	hns_print(0, "^x03%s^x01 :  %s the HideNSeek warmup!", sName, bWarmup ? "started" : "stopped");
	
	set_pcvar_num(sv_restart, 1);
	
	return PLUGIN_HANDLED;
}

public cmdHelp(plr)
{
	if( file_exists(g_sHelpMotd) )
	{
		new sText[2500];
		
		new f = fopen(g_sHelpMotd, "rt"), sData[512];
		while( !feof(f) )
		{
			fgets(f, sData, 511);
			add(sText, 2499, sData, 0);
		}
		fclose(f);
		
		new sTeamChange[64];
		copy(sTeamChange, 63, "The teams will switch ");
		new info = get_pcvar_num(hns_teamchange);
		if( info > 0 )
		{
			format(sTeamChange, 63, "%safter %i rounds have ended", sTeamChange, info);
		}
		else
		{
			add(sTeamChange, 63, "when Seekers win the round");
		}
		
		new sHiderEquipment[512];
		if( get_pcvar_num(hns_hiders_knife) == 2 )
		{
			copy(sHiderEquipment, 511, "Broken knife<br>");
		}
		info = get_pcvar_num(hns_grenades[HNS_TEAM_HIDER]);
		new percent = get_pcvar_num(hns_grenades_percent[HNS_TEAM_HIDER]);
		if( info > 0 && percent > 0 )
		{
			format(sHiderEquipment, 511, "%s%i HE Grenade%s", sHiderEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sHiderEquipment, 511, "%s (%i%% chance per grenade)<br>", sHiderEquipment, percent);
			}
			else
			{
				add(sHiderEquipment, 511, "<br>", 0);
			}
		}
		info = get_pcvar_num(hns_flashbangs[HNS_TEAM_HIDER]);
		percent = get_pcvar_num(hns_flashbangs_percent[HNS_TEAM_HIDER]);
		if( info > 0 && percent > 0 )
		{
			format(sHiderEquipment, 511, "%s%i Flashbang%s", sHiderEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sHiderEquipment, 511, "%s (%i%% chance per flashbang)<br>", sHiderEquipment, percent);
			}
			else
			{
				add(sHiderEquipment, 511, "<br>", 0);
			}
		}
		info = get_pcvar_num(hns_smokegren[HNS_TEAM_HIDER]);
		percent = get_pcvar_num(hns_smokegren_percent[HNS_TEAM_HIDER]);
		if( info > 0 && percent > 0 )
		{
			format(sHiderEquipment, 511, "%s%i Smoke Grenade%s", sHiderEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sHiderEquipment, 511, "%s (%i%% chance per smoke grenade)<br>", sHiderEquipment, percent);
			}
			else
			{
				add(sHiderEquipment, 511, "<br>", 0);
			}
		}
		info = get_pcvar_num(hns_armor[HNS_TEAM_HIDER]);
		format(sHiderEquipment, 511, "%sArmor: %i", sHiderEquipment, info);
		
		new sSeekerEquipment[512];
		copy(sSeekerEquipment, 511, "A Knife");
		info = get_pcvar_num(hns_grenades[HNS_TEAM_SEEKER]);
		percent = get_pcvar_num(hns_grenades_percent[HNS_TEAM_SEEKER]);
		if( info > 0 && percent > 0 )
		{
			format(sSeekerEquipment, 511, "%s<br>%i HE Grenade%s", sSeekerEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sSeekerEquipment, 511, "%s (%i%% chance per grenade)", sSeekerEquipment, percent);
			}
		}
		info = get_pcvar_num(hns_flashbangs[HNS_TEAM_SEEKER]);
		percent = get_pcvar_num(hns_flashbangs_percent[HNS_TEAM_SEEKER]);
		if( info > 0 && percent > 0 )
		{
			format(sSeekerEquipment, 511, "%s<br>%i Flashbang%s", sSeekerEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sSeekerEquipment, 511, "%s (%i%% chance per flashbang)", sSeekerEquipment, percent);
			}
		}
		info = get_pcvar_num(hns_smokegren[HNS_TEAM_SEEKER]);
		percent = get_pcvar_num(hns_smokegren_percent[HNS_TEAM_SEEKER]);
		if( info > 0 && percent > 0 )
		{
			format(sSeekerEquipment, 511, "%s<br>%i Smoke Grenade%s", sSeekerEquipment, info, info == 1 ? g_sBlank : g_sS);
			if( percent < 100 )
			{
				format(sSeekerEquipment, 511, "%s (%i%% chance per smoke grenade)", sSeekerEquipment, percent);
			}
		}
		info = get_pcvar_num(hns_armor[HNS_TEAM_SEEKER]);
		format(sSeekerEquipment, 511, "%s<br>Armor: %i", sSeekerEquipment, info);
		
		
		format(sText, 2499, sText, PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR, PLUGIN_NAME, g_sTeamNames[HNS_TEAM_HIDER], g_sTeamNames[HNS_TEAM_SEEKER], sTeamChange, sHiderEquipment, sSeekerEquipment);
		show_motd(plr, sText, "HideNSeek Help");
	}
	else
	{
		hns_print(plr, "^x03HideNSeek Help^x01 does not exist for this server.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public cmdScrimHelp(plr)
{
	if( file_exists(g_sScrimMotd) )
	{
		new sText[3000];
		
		new f = fopen(g_sScrimMotd, "rt"), sData[512];
		while( !feof(f) )
		{
			fgets(f, sData, 511);
			add(sText, 2999, sData, 0);
		}
		fclose(f);
		
		new rounds = get_pcvar_num(hnss_rounds_wins);
		
		new sRounds[32];
		formatex(sRounds, 31, "%i round%s", rounds, (rounds != 1) ? "s in a row" : g_sBlank);
		
		new sSave[96];
		if( get_pcvar_num(hnss_rounds_savewins) && rounds > 1 )
		{
			copy(sSave,95, "<br>However, the amount of rounds you won will stay with you if you become hiders again!");
		}
		else
		{
			copy(sSave,95, "<br>The amount of rounds you won will reset and you will start over next time you are a hider!");
		}
		
		new losses = get_pcvar_num(hnss_rounds_losses), sLosses[96];
		if( losses )
		{
			formatex(sLosses, 95, "<br>After the teams switch %i time%s, the scrim will end in a draw.", losses, (losses != 1) ? g_sS : g_sBlank);
		}
		
		new sPoints[512], len;
		
		new points = get_pcvar_num(hnss_points_knife);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i point%s for killing with a knife<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_headshot);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i extra point%s for your kill if you get a headshot!<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_grenade);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i point%s for killing with a grenade or frostgrenade!<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_kill);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i point%s for killing with some else that was already described<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_suicide);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Lose %i point%s for killing yourself<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_teamkill);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Lose %i point%s for killing your teammate!<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_roundwin);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Earn %i point%s for winning the round!<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		points = get_pcvar_num(hnss_points_roundlose);
		if( points )
		{
			len += format(sPoints[len], 511-len, "Lose %i point%s for losing the round<br>", points, (points != 1) ? g_sS : g_sBlank);
		}
		
		new ps_rounds = get_pcvar_num(hnss_points_rounds);
		
		format(sText, 2999, sText, rounds, (rounds != 1) ? g_sS : g_sBlank, sRounds, sRounds, sSave, sLosses, sPoints, ps_rounds, (ps_rounds != 1) ? g_sS : g_sBlank, ps_rounds, (ps_rounds != 1) ? g_sS : g_sBlank);
		
		show_motd(plr, sText, "HideNSeek Scrim Help");
	}
	else
	{
		scrim_print(plr, "^x03HideNSeek Scrim Help^x01 does not exist for this server.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public cmdPoints(plr)
{
	if( g_bScrimOn )
	{
		switch( g_ScrimType )
		{
			case SCRIM_POINTS:
			{
				scrim_print(0, "Scrim scores:^x03 Team 1 [%i]^x01 ::^x03 Team 2 [%i]", g_ScrimScores[g_ScrimTeams[1]], g_ScrimScores[g_ScrimTeams[2]]);
			}
			case SCRIM_ROUNDS:
			{
				scrim_print(0, "Hiders have won^x03 %i / %i^x01 rounds!", g_ScrimRounds[HNS_TEAM_HIDER], g_ScrimMaxRounds);
			}
		}
	}
	else
	{
		scrim_print(plr, "There is no scrim taking place.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public cmdRounds(plr)
{
	if( g_bScrimOn )
	{
		switch( g_ScrimType )
		{
			case SCRIM_POINTS:
			{
				new half = (g_ScrimMaxRounds / 2), rounds;
				if( g_ScrimRounds[HNS_TEAM_HIDER] < half )
				{
					rounds = half - g_ScrimRounds[HNS_TEAM_HIDER];
				}
				else
				{
					rounds = g_ScrimMaxRounds - g_ScrimRounds[HNS_TEAM_HIDER];
				}
				
				scrim_print(0, "There %s^x03 %i round%s^x01 left in the^x03 half.", (rounds != 1) ? "are" : "is", rounds, (rounds != 1) ? g_sS : g_sBlank);
				
				rounds = g_ScrimMaxRounds - g_ScrimRounds[HNS_TEAM_HIDER];
				scrim_print(0, "There %s^x03 %i round%s^x01 left in the^x03 scrim.", (rounds != 1) ? "are" : "is", rounds, (rounds != 1) ? g_sS : g_sBlank);
			}
			case SCRIM_ROUNDS:
			{
				new rounds = g_ScrimMaxRounds - g_ScrimRounds[HNS_TEAM_HIDER];
				scrim_print(0, "Hiders need^x03 %i round%s^x01 to win the scrim!", rounds, (rounds != 1) ? g_sS : g_sBlank);
			}
		}
	}
	else
	{
		scrim_print(plr, "There is no scrim taking place.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public cmdTeam(plr)
{
	if( g_bScrimOn )
	{
		switch( g_ScrimType )
		{
			case SCRIM_POINTS:
			{
				scrim_print(plr, "You are on^x03 Team %i^x01!", g_ScrimTeamNums[cs_get_user_team(plr)]);
			}
			case SCRIM_ROUNDS:
			{
				new CsTeams:team = cs_get_user_team(plr);
				if( team == HNS_TEAM_HIDER )
				{
					scrim_print(plr, "You are on the^x03 Hiding^x01 team!");
				}
				else if( team == HNS_TEAM_SEEKER )
				{
					scrim_print(plr, "You are on the^x03 Seeking^x01 team!");
				}
				else
				{
					scrim_print(plr, "You are not on a scrim team!");
				}
			}
		}
	}
	else
	{
		scrim_print(plr, "There is no scrim taking place.");
	}
	
	return get_pcvar_num(hns_visiblecommands) ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
}

public fwdClientCommandPost(plr)
{
	unregister_forward(FM_ClientCommand, g_FwdClientCommand_post, 1);
	
	g_bNonSpawnEvent[plr] = false;
	
	return FMRES_HANDLED;
}

public fwdSpawn(ent)
{
	if( !pev_valid(ent) || ent == g_HostageEnt )
	{
		return FMRES_IGNORED;
	}
	
	new sClass[32];
	pev(ent, pev_classname, sClass, 31);
	
	for( new i = 0; i < MAX_REMOVED_ENTITIES; i++ )
	{
		if( equal(sClass, g_sRemoveEntities[i]) )
		{
			engfunc(EngFunc_RemoveEntity, ent);
			return FMRES_SUPERCEDE;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdTouch(booster, plr)
{
	if( !g_bHnsOn
	|| !pev_valid(booster) || !pev_valid(plr)
	|| !(0 < booster <= g_MaxPlayers) || !(0 < plr <= g_MaxPlayers)
	|| !g_bAlive[booster] || !g_bAlive[plr] )
	{
		return FMRES_IGNORED;
	}
	
	new boosting = get_pcvar_num(hns_noboosting);
	
	if( boosting == get_pcvar_num(hns_semiclip)
	|| boosting != 2 && !(boosting == 1 && cs_get_user_team(booster) == cs_get_user_team(plr)) )
	{
		return FMRES_IGNORED;
	}
	
	new Float:vBoosterOrigin[3], Float:vPlrOrigin[3];
	pev(booster, pev_origin, vBoosterOrigin);
	pev(plr, pev_origin, vPlrOrigin);
	
	if( !(49.0 < (vPlrOrigin[2] - vBoosterOrigin[2]) < 73.0) )
	{
		return FMRES_IGNORED;
	}
	
	switch( get_pcvar_num(hns_noboosting_punish) )
	{
		case 3:
		{
			handle_booster(booster);
			handle_booster(plr);
		}
		case 2:
		{
			handle_booster(booster);
		}
		case 1:
		{
			handle_booster(plr);
		}
	}
	
	return FMRES_IGNORED;
}

public fwdCmdStart(plr, ucHandle, seed)
{
	if( !g_bHnsOn || !g_bAlive[plr] )
	{
		return FMRES_IGNORED;
	}
	
	static clip, ammo;
	if( get_user_weapon(plr, clip, ammo) != CSW_KNIFE )
	{
		return FMRES_IGNORED;
	}
	
	new CsTeams:team = cs_get_user_team(plr);
	
	if( team == HNS_TEAM_HIDER )
	{
		new button = get_uc(ucHandle, UC_Buttons);
		
		if( button&IN_ATTACK )
		{
			button &= ~IN_ATTACK;
		}
		if( button&IN_ATTACK2 )
		{
			button &= ~IN_ATTACK2;
		}
		
		set_uc(ucHandle, UC_Buttons, button);
		
		return FMRES_SUPERCEDE;
	}
	else if( team == HNS_TEAM_SEEKER )
	{
		if( g_bDisableSlash )
		{
			new button = get_uc(ucHandle, UC_Buttons);
			
			if( button&IN_ATTACK )
			{
				button &= ~IN_ATTACK;
				button |= IN_ATTACK2;
			}
			
			set_uc(ucHandle, UC_Buttons, button);
			
			return FMRES_SUPERCEDE;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdSetModel(ent, sModel[])
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	if( !pev_valid(ent) || !equal(sModel, "models/w_", 9) || equal(sModel, "models/w_weaponbox.mdl", 0) )
	{
		return FMRES_IGNORED;
	}
	
	new owner = pev(ent, pev_owner);
	if( !(0 < owner <= g_MaxPlayers) )
	{
		return FMRES_IGNORED;
	}
	
	new sClass[32];
	pev(ent, pev_classname, sClass, 31);
	
	if( equal(sClass, "weapon_shield", 0) )
	{
		set_pev(ent, pev_effects, EF_NODRAW);
		set_task(0.1, "taskRemoveShield", ent);
		
		return FMRES_IGNORED;
	}
	
	if( !equal(sClass, "weaponbox", 0) )
	{
		return FMRES_IGNORED;
	}
	
	for( new i = g_MaxPlayers + 1; i <= g_MaxEntities; i++ )
	{
		if( !pev_valid(i) )
		{
			continue;
		}
		
		if( pev(i, pev_owner) == ent )
		{
			dllfunc(DLLFunc_Think, ent);
			break;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdClientKill(plr)
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	if( get_pcvar_num(hns_disablekill) )
	{
		new Float:fGametime = get_gametime();
		if( fGametime >= g_fKillMsgDelay[plr] )
		{
			g_fKillMsgDelay[plr] = fGametime + 1.0;
			
			hns_print(plr, "You cannot kill yourself during HideNSeek!");
		}
		
		return FMRES_SUPERCEDE;
	}
	
	return FMRES_IGNORED;
}

public fwdPlayerPreThink(plr)
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	new semiclip = get_pcvar_num(hns_semiclip);
	
	if( g_bAlive[plr] )
	{
		new CsTeams:team = cs_get_user_team(plr);
		if( g_HideTimer > 0 && team == HNS_TEAM_SEEKER )
		{
			set_pev(plr, pev_maxspeed, -1.0);
			set_pev(plr, pev_velocity, Float:{0.0, 0.0, 0.0});
			//set_pev(plr, pev_flags, pev(plr, pev_flags) | FL_FROZEN);
		}
		
		new footsteps = get_pcvar_num(hns_footsteps);
		if( footsteps && (footsteps == 3 || footsteps == _:team) )
		{
			set_pev(plr, pev_flTimeStepSound, 999);
		}
		
		if( get_pcvar_num(hns_noslowdown) )
		{
			set_pev(plr, pev_fuser2, 0.0);
		}
		
		if( g_bWarmup && get_pcvar_num(hns_warmup_godmode) )
		{
			fm_set_user_godmode(plr, 1);
		}
		
		if( semiclip )
		{
			// thanks Jon for code
			
			new target, body;
			get_user_aiming(plr, target, body, 9999);
			
			if( 0 < target <= g_MaxPlayers && g_bAlive[target] )
			{
				new CsTeams:targetTeam = cs_get_user_team(target);
				if( semiclip == 2 || targetTeam == team )
				{
					new sName[32];
					get_user_name(target, sName, 31);
					
					new sMessage[64];
					if( targetTeam == team )
					{
						formatex(sMessage, 63, "Friend: %s^nHealth: %i", sName, get_user_health(target));
					}
					else
					{
						formatex(sMessage, 63, "Enemy: %s", sName);
					}
					
					if( targetTeam == CS_TEAM_CT )
					{
						set_hudmessage(0, 63, 127, -1.0, -1.0, 0, 0.0, 0.1, 0.0, 0.0, -1);
					}
					else if( targetTeam == CS_TEAM_T )
					{
						set_hudmessage(127, 0, 0, -1.0, -1.0, 0, 0.0, 0.1, 0.0, 0.0, -1);
					}
					
					show_hudmessage(plr, "%s", sMessage);
				}
			}
		}
	}
	
	static LastThink, i;
	
	if( plr < LastThink ) // player think loop started again
	{
		for( i = 1; i <= g_MaxPlayers; i++ )
		{
			if( !g_bConnected[i] || !g_bAlive[i] )
			{
				g_bSolid[i] = false;
				continue;
			}
			
			g_Team[i] = cs_get_user_team(i);
			g_bSolid[i] = bool:(pev(i, pev_solid) == SOLID_SLIDEBOX);
		}
	}
	
	LastThink = plr;
	
	if( !g_bSolid[plr] || !semiclip )
	{
		return FMRES_IGNORED;
	}
	
	for( i = 1; i <= g_MaxPlayers; i++ )
	{
		if( !g_bSolid[i] || g_bRestoreSolid[i] || i == plr )
		{
			continue;
		}
		
		if( semiclip == 2 || g_Team[plr] == g_Team[i] )
		{
			set_pev(i, pev_solid, SOLID_NOT);
			g_bRestoreSolid[i] = true;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdPlayerPostThink(plr)
{
	static i;
	
	for( i = 1; i <= g_MaxPlayers; i++ )
	{
		if( g_bRestoreSolid[i] )
		{
			set_pev(i, pev_solid, SOLID_SLIDEBOX);
			g_bRestoreSolid[i] = false;
		}
	}
	
	return FMRES_IGNORED;
}

public fwdAddToFullPackPost(es, e, ent, host, hostflags, player, pSet)
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	if( player )
	{
		if( g_bSolid[host] && g_bSolid[ent] )
		{
			new semiclip = get_pcvar_num(hns_semiclip);
			if( semiclip == 2 || g_Team[host] == g_Team[ent] )
			{
				set_es(es, ES_Solid, SOLID_NOT);
				
				static Float:fOldAlpha;
				
				new Float:fAlpha = get_pcvar_float(hns_semiclip_alpha);
				if( fAlpha < 255.0 )
				{
					set_es(es, ES_RenderMode, kRenderTransAlpha);
					set_es(es, ES_RenderAmt, fAlpha);
				}
				else if( fOldAlpha < 255.0 )
				{
					set_es(es, ES_RenderMode, kRenderNormal);
					set_es(es, ES_RenderAmt, 16.0);
				}
				
				fOldAlpha = fAlpha;
			}
		}
	}
	
	return FMRES_IGNORED;
}

public fwdGetGameDescription()
{
	if( !g_bHnsOn )
	{
		return FMRES_IGNORED;
	}
	
	new sGameType[32];
	get_pcvar_string(hns_gametype, sGameType, 31);
	
	if( !strlen(sGameType) || had_older_version(sGameType) )
	{
		formatex(sGameType, 31, "HideNSeek v%s", PLUGIN_VERSION);
		
		set_pcvar_string(hns_gametype, sGameType);
	}
	
	forward_return(FMV_STRING, sGameType);
	return FMRES_SUPERCEDE;
}

public fwdPlayerSpawn(plr)
{
	g_bAlive[plr] = true;
	
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	new CsTeams:team = cs_get_user_team(plr);
	if( team != HNS_TEAM_SEEKER && team != HNS_TEAM_HIDER )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( !g_bFirstSpawn[plr] )
	{
		show_plugin_info(plr);
		
		set_task(360.0, "taskShowPluginInfo", TASK_ID_SHOWPLUGININFO + plr, g_sBlank, 0, g_sB, 0);
		
		g_bFirstSpawn[plr] = true;
	}
	
	set_task(0.3, "taskStripWeapons", plr + TASK_ID_STRIPWEAPONS, g_sBlank, 0, g_sBlank, 0);
	
	new param[2];
	param[0] = _:team;
	set_task(0.6, "taskGiveKnife", plr + TASK_ID_GIVEKNIFE, param, 2, g_sBlank, 0);
	set_task(0.9, "taskCheckModel", plr + TASK_ID_CHECKMODEL, param, 2, g_sBlank, 0);
	
	if( g_bWeaponsGiven )
	{
		set_task(0.6, "taskGiveWeapons", plr + TASK_ID_GIVEWEAPONS, param, 2, g_sBlank, 0);
	}
	
	if( g_bScrimOn && g_ScrimType == SCRIM_POINTS )
	{
		new CsTeams:team1 = g_ScrimTeams[1];
		new CsTeams:team2 = g_ScrimTeams[2];
		
		scrim_print(plr, "You are on^x03 Team %i^x01!", g_ScrimTeamNums[cs_get_user_team(plr)]);
		scrim_print(plr, "Scrim scores:^x03 Team 1 [%i]^x01 ::^x03 Team 2 [%i]", g_ScrimScores[team1], g_ScrimScores[team2]);
	}
	
	return PLUGIN_CONTINUE;
}

public fwdSetVoice(receiver, sender, bool:bListen)
{
	if( !g_bConnected[receiver]
	|| !g_bConnected[sender]
	|| receiver == sender
	|| !g_bScrimOn )
	{
		return FMRES_IGNORED;
	}
	
	if( cs_get_user_team(receiver) == cs_get_user_team(sender) )
	{
		engfunc(EngFunc_SetClientListening, receiver, sender, 1);
	}
	else
	{
		engfunc(EngFunc_SetClientListening, receiver, sender, 0);
	}
	
	return FMRES_SUPERCEDE;
}

public messageHideWeapon(msgid, dest, plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( get_pcvar_num(hns_money) == 0 )
	{
		set_msg_arg_int(1, ARG_BYTE, get_msg_arg_int(1)|HIDE_MONEY);
	}
	
	return PLUGIN_CONTINUE;
}

public messageScreenFade(msgid, dest, plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	new noflash = get_pcvar_num(hns_noflash);
	if( !noflash )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( get_msg_arg_int(4) == 255 && get_msg_arg_int(5) == 255 && get_msg_arg_int(6) == 255 )
	{
		// flashbang
		
		if( noflash == _:cs_get_user_team(plr) )
		{
			return PLUGIN_HANDLED;
		}
	}
	
	return PLUGIN_CONTINUE;
}

public eventRestartAttempt()
{
	new players[32], pnum;
	get_players(players, pnum, g_sA);
	
	for( new i = 0; i < pnum; i++ )
	{
		g_bNonSpawnEvent[players[i]] = true;
	}
	
	return PLUGIN_CONTINUE;
}

public eventResetHUD(plr)
{
	if( g_bHnsOn && get_pcvar_num(hns_money) == 0 )
	{
		make_HideWeapon(plr, HIDE_MONEY);
	}
	
	if( is_user_alive(plr) )
	{
		if( g_bNonSpawnEvent[plr] )
		{
			g_bNonSpawnEvent[plr] = false;
		}
		else
		{
			fwdPlayerSpawn(plr);
		}
	}
	
	return PLUGIN_CONTINUE;
}

public eventMoney(plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	new money = get_pcvar_num(hns_money);
	money = clamp(money, -1, 16000);
	
	if( money >= 0 )
	{
		cs_set_user_money(plr, money, 0);
	}
	if( money == 0 && g_OldMoney != 0 )
	{
		make_HideWeapon(plr, HIDE_MONEY);
	}
	
	g_OldMoney = money;
	
	return PLUGIN_HANDLED;
}

public eventNewRound()
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( g_bDisableSlash )
	{
		new rounds = get_pcvar_num(hns_nubslash);
		if( rounds > 0 && g_RoundsLost >= rounds )
		{
			hns_print(0, "Seekers can now use nubslash after losing %i round%s!",\
				rounds, (rounds == 1) ? g_sBlank : "s in a row");
			
			g_bDisableSlash = false;
		}
	}
	
	g_HideTimer = get_pcvar_num(hns_hidetime);
	
	return PLUGIN_CONTINUE;
}

public eventTerrWin()
{
	if( g_bDisableSlash )
	{
		g_RoundsLost++;
	}
	
	return PLUGIN_CONTINUE;
}

public eventRestartRound()
{
	g_RoundsLost = 0;
	g_RoundsEnded = 0;
	g_bDisableSlash = true;
	
	g_bWeaponsGiven = false;
	
	g_HideTimer = -1;
	
	if( !g_bScrimOn
	|| g_ScrimType != SCRIM_ROUNDS
	|| !g_ScrimSaveWins )
	{
		g_ScrimRounds[HNS_TEAM_HIDER] = 0;
	}
	
	return PLUGIN_CONTINUE;
}

public eventCurWeapon(plr)
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	if( cs_get_user_team(plr) == HNS_TEAM_HIDER && get_pcvar_num(hns_hiders_knife) == 1 )
	{
		new sModel[32];
		
		pev(plr, pev_viewmodel2, sModel, 31);
		if( equali(sModel, g_sKnifeModel_v, 0) )
		{
			set_pev(plr, pev_viewmodel2, g_sBlank);
		}
		
		pev(plr, pev_weaponmodel2, sModel, 31);
		if( equali(sModel, g_sKnifeModel_w, 0) )
		{
			set_pev(plr, pev_weaponmodel2, g_sBlank);
		}
	}
	
	return PLUGIN_CONTINUE;
}

public TaskRespawn(plr)
{
	// thanks GHW_Chronic & MeRcyLeZZ
	set_pev(plr, pev_deadflag, DEAD_RESPAWNABLE);
	dllfunc(DLLFunc_Think, plr);
}

public eventDeathMsg()
{
	new victim = read_data(2);
	g_bAlive[victim] = false;
	
	if( g_bWarmup && get_pcvar_num(hns_warmup_respawn) )
	{
		set_task(1.0, "TaskRespawn", victim);
	}
	
	if( !g_bScrimOn
	|| g_ScrimType != SCRIM_POINTS )
	{
		return PLUGIN_CONTINUE;
	}
	
	new sNameVictim[32];
	get_user_name(victim, sNameVictim, 31);
	
	new CsTeams:vTeam = cs_get_user_team(victim);
	
	new killer = read_data(1);
	if( !killer || killer == victim )
	{
		g_ScrimScores[vTeam] -= g_PointsSuicide;
		
		scrim_print(0, "^x03%s^x01 lost^x03 %i point%s^x01 from their^x03 team's score^x01 for^x03 suiciding^x01!", sNameVictim, g_PointsSuicide, g_PointsSuicide == 1 ? "" : "s");
		
		return PLUGIN_CONTINUE;
	}
	
	new sNameKiller[32];
	get_user_name(killer, sNameKiller, 31);
	
	new CsTeams:kTeam = cs_get_user_team(killer);
	
	if( kTeam == vTeam )
	{
		g_ScrimScores[vTeam] -= g_PointsTeamKill;
		
		scrim_print(0, "^x03%s^x01 lost^x03 %i point%s^x01 from their^x03 team's score^x01 for^x03 killing a teammate^x01!", sNameKiller, g_PointsTeamKill, g_PointsKill == 1 ? "" : "s");
		
		return PLUGIN_CONTINUE;
	}
	
	new sWeapon[32];
	read_data(4, sWeapon, 31);
	
	if( equali(sWeapon, "grenade", 0) || equali(sWeapon, "frostgrenade", 0) )
	{
		g_ScrimScores[kTeam] += g_PointsGrenade;
		
		new sMessage[192]; /* vformat() only allows 3 arguments max ... lame */
		formatex(sMessage, 191, "^x03%s^x01 gained^x03 %i point%s^x01 for their^x03 team's score^x01 for^x03 killing %s with a %s^x01!", sNameKiller, g_PointsGrenade, g_PointsGrenade == 1 ? "" : "s", sNameVictim, sWeapon);
		scrim_print(0, "%s", sMessage);
		
		return PLUGIN_CONTINUE;
	}
	
	if( equali(sWeapon, "knife", 0) )
	{
		g_ScrimScores[kTeam] += g_PointsKnife;
		
		new sMessage[192];
		formatex(sMessage, 191, "^x03%s^x01 gained^x03 %i point%s^x01 for their^x03 team's score^x01 for^x03 killing %s with a knife!", sNameKiller, g_PointsKnife, g_PointsKnife == 1 ? "" : "s", sNameVictim);
		scrim_print(0, "%s", sMessage);
	}
	else
	{
		g_ScrimScores[kTeam] += g_PointsKill;
		
		new sMessage[192]; /* vformat() only allows 3 arguments max ... lame */
		formatex(sMessage, 191, "^x03%s^x01 gained^x03 %i point%s^x01 for their^x03 team's score^x01 for^x03 killing %s^x01!", sNameKiller, g_PointsKill, g_PointsKill == 1 ? "s" : "", sNameVictim);
		scrim_print(0, "%s", sMessage);
	}
	
	if( read_data(3) )
	{
		g_ScrimScores[kTeam] += g_PointsHeadshot;
		
		scrim_print(0, "^x03%s^x01 gained^x03 %d extra point%s^x01 for getting a^x03 headshot^x01!", sNameKiller, g_PointsHeadshot, g_PointsHeadshot == 1 ? "" : "s");
	}
	
	return PLUGIN_CONTINUE;
}

public logeventRoundStart()
{
	if( !g_bHnsOn )
	{
		if( g_bRemovedBreakables )
		{
			g_bRemovedBreakables = restore_entities(g_sClassBreakable);
		}
		
		return PLUGIN_CONTINUE;
	}
	
	if( get_pcvar_num(hns_removebreakables) )
	{
		g_bRemovedBreakables = remove_entities(g_sClassBreakable);
	}
	else if( g_bRemovedBreakables )
	{
		g_bRemovedBreakables = restore_entities(g_sClassBreakable);
	}
	
	if( get_pcvar_num(hns_removedoors) )
	{
		g_bRemovedDoors = remove_entities(g_sClassDoor);
		g_bRemovedDoorsRotating = remove_entities(g_sClassDoorRotating);
	}
	else
	{
		if( g_bRemovedDoors )
		{
			g_bRemovedDoors = restore_entities(g_sClassDoor);
		}
		
		if( g_bRemovedDoorsRotating )
		{
			g_bRemovedDoorsRotating = restore_entities(g_sClassDoorRotating);
		}
	}
	
	remove_task(TASK_ID_HIDETIMER, 0);
	set_task(0.0, "taskHideTimer", TASK_ID_HIDETIMER, g_sBlank, 0, g_sBlank, 0);
	
	if( !g_bScrimOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	switch( g_ScrimType )
	{
		case SCRIM_ROUNDS:
		{
			if( g_ScrimWinner )
			{
				/* switch() statement gave me an error */
				if( g_ScrimWinner == HNS_TEAM_HIDER )
				{
					scrim_print(0, "^x03Hiders^x01 lost^x03 %i / %i^x01 rounds!", g_ScrimLosses[HNS_TEAM_SEEKER], g_ScrimMaxLosses);
					scrim_print(0, "The scrim is a draw!");
				}
				else if( g_ScrimWinner == HNS_TEAM_SEEKER )
				{
					scrim_print(0, "^x03Hiding team^x01 has won^x03 %i / %i^x01 rounds!", g_ScrimRounds[HNS_TEAM_HIDER], g_ScrimMaxRounds);
					scrim_print(0, "Hiding team has won!");
				}
				
				scrim_print(0, "^x03Turning off scrim mod.");
				
				g_bScrimOn = false;
				g_ScrimType = SCRIM_NONE;
				set_pcvar_num(sv_restart, 1);
			}
			else if( g_bRestartRound )
			{
				g_bRestartRound = false;
				set_pcvar_num(sv_restart, 1);
			}	
		}
		case SCRIM_POINTS:
		{
			if( g_ScrimWinner )
			{
				new CsTeams:team1 = g_ScrimTeams[1];
				new CsTeams:team2 = g_ScrimTeams[2];
				
				scrim_print(0, "Final scrim scores:^x03 Team 1 [%i]^x01 ::^x03 Team 2 [%i]", g_ScrimScores[team1], g_ScrimScores[team2]);
				scrim_print(0, "^x03Team %i^x01 has won!", g_ScrimTeamNums[g_ScrimWinner]);
				
				g_bScrimOn = false;
				g_ScrimType = SCRIM_NONE;
				set_pcvar_num(sv_restart, 1);
			}
			else if( g_bScrimIsDraw )
			{
				new CsTeams:team1 = g_ScrimTeams[1];
				new CsTeams:team2 = g_ScrimTeams[2];
				
				scrim_print(0, "Final scrim scores:^x03 Team 1 [%i]^x01 ::^x03 Team 2 [%i]", g_ScrimScores[team1], g_ScrimScores[team2]);
				scrim_print(0, "The scrim results in a tie!");
				
				g_bScrimOn = false;
				g_ScrimType = SCRIM_NONE;
				set_pcvar_num(sv_restart, 1);
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public logeventRoundEnd()
{
	if( !g_bHnsOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	remove_task(TASK_ID_HIDETIMER, 0);
	
	new sMessage[192];
	new CsTeams:winner = HNS_TEAM_SEEKER;
	
	new hider, seeker, hider_alive;
	get_hider_and_seeker(hider, seeker, hider_alive);
	
	if( hider_alive )
	{
		winner = HNS_TEAM_HIDER;
	}
	
	if( !hider || !seeker )
	{
		return PLUGIN_CONTINUE;
	}
	
	static const sTaskSwapTeams[] = "taskSwapTeams";
	
	++g_RoundsEnded;
	
	new teamchange = get_pcvar_num(hns_teamchange);
	if( teamchange && teamchange == g_RoundsEnded && !g_bScrimOn )
	{
		hns_print(0, "%i rounds have ended. Switching teams.", g_RoundsEnded);
		
		set_task(0.5, sTaskSwapTeams, TASK_ID_SWAPTEAMS, g_sBlank, 0, g_sBlank, 0);
	}
	
	static const sNoTeamChange[] = "^nNo Team Change";
	if( winner == HNS_TEAM_SEEKER )
	{
		copy(sMessage, 191, "Seekers Won Round");
		
		if( !teamchange && (!g_bScrimOn || g_ScrimType == SCRIM_ROUNDS) )
		{
			add(sMessage, 191, "^nSwitching Teams", 0);
			
			set_task(0.5, sTaskSwapTeams, TASK_ID_SWAPTEAMS, g_sBlank, 0, g_sBlank, 0);
		}
	}
	else if( winner == HNS_TEAM_HIDER )
	{
		copy(sMessage, 191, "Hiders Won Round");
		
		new frags = get_pcvar_num(hns_hiders_alivefrags);
		
		if( frags )
		{
			static Float:fFrags;
			for( new plr = 1; plr <= g_MaxPlayers; plr++ )
			{
				if( g_bConnected[plr] && g_bAlive[plr] && cs_get_user_team(plr) == HNS_TEAM_HIDER )
				{
					pev(plr, pev_frags, fFrags);
					set_pev(plr, pev_frags, fFrags + float(frags));
					
					hns_print(plr, "You earned %i frag%s for surviving the round!",\
						frags, (frags == 1) ? g_sBlank : g_sS);
				}
			}
		}
		
		if( !teamchange )
		{
			add(sMessage, 191, sNoTeamChange, 0);
		}
	}
	
	static red, green, blue;
	get_hud_colors(red, green, blue);
	set_hudmessage(red, green, blue, -1.0, -1.0, 0, 0.0, 5.0, 0.1, 0.2, 1);
	show_hudmessage(0, "%s", sMessage);
	
	g_bWeaponsGiven = false;
	
	if( !g_bScrimOn )
	{
		return PLUGIN_CONTINUE;
	}
	
	switch( g_ScrimType )
	{
		case SCRIM_ROUNDS:
		{
			/* switch() statement gave me an error */
			if( winner == HNS_TEAM_HIDER )
			{
				++g_ScrimRounds[HNS_TEAM_HIDER];
				
				if( g_ScrimMaxRounds )
				{
					scrim_print(0, "^x03Hiders^x01 have won^x03 %i / %i^x01 rounds!", g_ScrimRounds[HNS_TEAM_HIDER], g_ScrimMaxRounds);
					
					if( g_ScrimRounds[HNS_TEAM_HIDER] == g_ScrimMaxRounds )
					{
						g_ScrimWinner = HNS_TEAM_SEEKER;
					}
				}
			}
			else if( winner == HNS_TEAM_SEEKER && g_ScrimMaxLosses )
			{
				++g_ScrimLosses[HNS_TEAM_HIDER];
				
				scrim_print(0, "^x03Hiders^x01 have lost^x03 %i / %i^x01 rounds!", g_ScrimLosses[HNS_TEAM_HIDER], g_ScrimMaxLosses);
				
				scrim_print(0, "^x03Seekers^x01 won the round");
				scrim_print(0, "Switching teams.");
				
				g_bRestartRound = true;
				
				if( g_ScrimLosses[HNS_TEAM_HIDER] == g_ScrimMaxLosses )
				{
					g_ScrimWinner = HNS_TEAM_HIDER; /* seeking team won, but they will be hiders next round (team switching) */
				}
			}
		}
		case SCRIM_POINTS:
		{
			++g_ScrimRounds[HNS_TEAM_HIDER];
			
			new CsTeams:loser;
			if( winner == HNS_TEAM_HIDER )
			{
				loser = HNS_TEAM_SEEKER;
			}
			else if( winner == HNS_TEAM_SEEKER )
			{
				loser = HNS_TEAM_HIDER;
			}
			
			g_ScrimScores[loser] -= g_PointsRoundLose;
			g_ScrimScores[winner] += g_PointsRoundWin;
			
			new sTeam[CsTeams][16];
			formatex(sTeam[HNS_TEAM_HIDER], 15, "Team %i", g_ScrimTeamNums[HNS_TEAM_HIDER]);
			formatex(sTeam[HNS_TEAM_SEEKER], 15, "Team %i", g_ScrimTeamNums[HNS_TEAM_SEEKER]);
			
			new sMessageLose[192];
			formatex(sMessageLose, 191, "^x03%s^x01 lost^x03 %i point%s^x01 for^x03 losing^x01 the round!", "%s", g_ScrimTeamNums[loser], g_PointsRoundLose, g_PointsRoundLose == 1 ? "" : "s");
			
			new sMessageWin[192];
			formatex(sMessageWin, 191, "^x03%s^x01 gained^x03 %i point%s^x01 for^x03 winning^x01 the round!", "%s", g_ScrimTeamNums[winner], g_PointsRoundWin, g_PointsRoundWin == 1 ? "" : "s");
			
			new CsTeams:team;
			for( new plr = 1; plr <= g_MaxPlayers; plr++ )
			{
				if( !g_bConnected[plr] )
				{
					continue;
				}
				
				team = cs_get_user_team(plr);
				if( team == winner )
				{
					scrim_print(plr, sMessageWin, "Your team");
					scrim_print(plr, sMessageLose, sTeam[loser]);
				}
				else if( team == loser )
				{
					scrim_print(plr, sMessageWin, sTeam[winner]);
					scrim_print(plr, sMessageLose, "Your team");
				}
			}
			
			if( g_ScrimRounds[HNS_TEAM_HIDER] == g_ScrimMaxRounds )
			{
				if( g_ScrimScores[HNS_TEAM_HIDER] > g_ScrimScores[HNS_TEAM_SEEKER] )
				{
					g_ScrimWinner = HNS_TEAM_HIDER;
				}
				else if( g_ScrimScores[HNS_TEAM_SEEKER] > g_ScrimScores[HNS_TEAM_HIDER] )
				{
					g_ScrimWinner = HNS_TEAM_SEEKER;
				}
				else /* not one is greater than the other, so they are equal */
				{
					g_bScrimIsDraw = true;
				}
			}
			else if( g_ScrimRounds[HNS_TEAM_HIDER] == (g_ScrimMaxRounds / 2) ) /* half of the scrim has gone by, so swap the teams */
			{
				set_task(0.5, "taskSwapTeams", TASK_ID_SWAPTEAMS, "", 0, "", 0);
				
				scrim_print(0, "^x03Half^x01 of the scrim is over,^x03 switching teams^x01.");
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public mnuScrimType(plr, menu, item)
{
	if( item == MENU_EXIT
	|| g_ScrimVoteTimer == 0 )
	{
		return PLUGIN_HANDLED;
	}
	
	new sInfo[2], _access, callback;
	menu_item_getinfo(menu, item, _access, sInfo, 1, "", 0, callback);
	
	new type = str_to_num(sInfo);
	g_ScrimVoteCount[type]++;
	
	if( get_pcvar_num(amx_vote_answers) )
	{
		new sName[32];
		get_user_name(plr, sName, 31);
		
		switch( type )
		{
			case SCRIM_ROUNDS: scrim_print(0, "^x03%s^x01 voted for^x03 Win %i Rounds", sName, get_pcvar_num(hnss_rounds_wins));
			case SCRIM_POINTS: scrim_print(0, "^x03%s^x01 voted for^x03 Point System", sName);
		}
	}
	
	g_bScrimVoted[plr] = true;
	
	if( check_last_vote(plr) )
	{
		g_ScrimVoteTimer = 1;
	}
	
	return PLUGIN_HANDLED;
}

public taskRemoveShield(ent)
{
	dllfunc(DLLFunc_Think, ent);
	
	return PLUGIN_CONTINUE;
}

public taskHideTimer()
{
	new seeker, hider;
	
	if( g_HideTimer <= 0 )
	{
		seeker = 1;
		hider = 1;
	}
	else
	{
		get_hider_and_seeker(hider, seeker);
	}
	
	static const sTaskHideTimer[] = "taskHideTimer";
	if( !hider || !seeker )
	{
		g_HideTimer = 0;
		set_task(0.0, sTaskHideTimer, TASK_ID_HIDETIMER, g_sBlank, 0, g_sBlank, 0);
		
		return PLUGIN_CONTINUE;
	}
	
	static CsTeams:team;
	
	if( g_HideTimer > 0 )
	{
		new sounds = get_pcvar_num(hns_timersounds);
		
		new sSound[16];
		num_to_word(g_HideTimer, sSound, 15);
		
		static blind_red, blind_green, blind_blue, blind_alpha;
		get_blind_colors(blind_red, blind_green, blind_blue, blind_alpha);
		
		static hud_red, hud_green, hud_blue;
		get_hud_colors(hud_red, hud_green, hud_blue);
		
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bConnected[plr] )
			{
				continue;
			}
			
			team = cs_get_user_team(plr);
			if( team == HNS_TEAM_SEEKER || team == HNS_TEAM_HIDER )
			{
				if( team == HNS_TEAM_SEEKER && g_bAlive[plr] )
				{
					//make_ScreenFade(plr, 1.5, 1.5, blind_red, blind_green, blind_blue, blind_alpha);
					
					/*set_pev(plr, pev_flags, pev(plr, pev_flags) | FL_FROZEN);
					set_pev(plr, pev_maxspeed, -1.0);*/
				}
				
				set_hudmessage(hud_red, hud_green, hud_blue, -1.0, 0.35, 0, 0.90, 0.35, 0.1, 0.1, 1);
				show_hudmessage(plr, "%i", g_HideTimer);
				
				if( sounds )
				{
					client_cmd(plr, "spk vox/%s.wav", sSound);
				}
			}
		}
		
		g_HideTimer--;
		set_task(1.0, sTaskHideTimer, TASK_ID_HIDETIMER, g_sBlank, 0, g_sBlank, 0);
	}
	else if( g_HideTimer == 0 )
	{
		static hud_red, hud_green, hud_blue;
		get_hud_colors(hud_red, hud_green, hud_blue);
		
		static param[2];
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bConnected[plr] )
			{
				continue;
			}
			
			team = cs_get_user_team(plr);
			if( team == HNS_TEAM_SEEKER || team == HNS_TEAM_HIDER )
			{
				if( team == HNS_TEAM_SEEKER && g_bAlive[plr] )
				{
					make_ScreenFade(plr, 0.0, 0.0, 0, 0, 0, 255);
					
					cs_reset_user_maxspeed(plr);
					//set_pev(plr, pev_flags, pev(plr, pev_flags) & ~FL_FROZEN);
				}
				
				set_hudmessage(hud_red, hud_green, hud_blue, -1.0, -1.0, 0, 0.0, 3.0, 0.1, 0.1, 1);
				show_hudmessage(plr, "");
				
				param[0] = _:team;
				taskGiveWeapons(param, plr + TASK_ID_GIVEWEAPONS);
			}
		}
		
		g_bWeaponsGiven = true;
		
		g_HideTimer--;
		set_task(1.0, sTaskHideTimer, TASK_ID_HIDETIMER, g_sBlank, 0, g_sBlank, 0);
	}
	else
	{
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bConnected[plr] )
			{
				continue;
			}
			
			if( g_bAlive[plr] && cs_get_user_team(plr) == HNS_TEAM_SEEKER )
			{
				make_ScreenFade(plr, 0.0, 0.0, 0, 0, 0, 255);
				
				cs_reset_user_maxspeed(plr);
				//set_pev(plr, pev_flags, pev(plr, pev_flags) & ~FL_FROZEN);
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskStripWeapons(plr)
{
	plr -= TASK_ID_STRIPWEAPONS;
	
	fm_strip_user_weapons(plr);
	
	return PLUGIN_CONTINUE;
}

public taskGiveKnife(param[], plr)
{
	plr -= TASK_ID_GIVEKNIFE;
	
	new CsTeams:team = CsTeams:param[0];
	
	if( team != HNS_TEAM_HIDER || get_pcvar_num(hns_hiders_knife))
	{
		fm_give_item(plr, "weapon_knife");
	}
	
	return PLUGIN_CONTINUE;
}

public taskGiveWeapons(param[], plr)
{
	plr -= TASK_ID_GIVEWEAPONS;
	
	new CsTeams:team = CsTeams:param[0];
	if( team != HNS_TEAM_HIDER && team != HNS_TEAM_SEEKER )
	{
		return PLUGIN_CONTINUE;
	}
	
	chance(plr, get_pcvar_num(hns_grenades[team]), get_pcvar_num(hns_grenades_percent[team]),"weapon_hegrenade", CSW_HEGRENADE, "HE Grenade");
	chance(plr, get_pcvar_num(hns_flashbangs[team]), get_pcvar_num(hns_flashbangs_percent[team]), "weapon_flashbang", CSW_FLASHBANG, "Flashbang");
	chance(plr, get_pcvar_num(hns_smokegren[team]), get_pcvar_num(hns_smokegren_percent[team]), "weapon_smokegrenade", CSW_SMOKEGRENADE, "Smoke Grenade");
	
	new num = get_pcvar_num(hns_armor[team]);
	num = clamp(num, 0, 100);
	
	switch( num )
	{
		case 0:
		{
			cs_set_user_armor(plr, 0, CS_ARMOR_NONE);
		}
		case 1..99:
		{
			cs_set_user_armor(plr, num, CS_ARMOR_KEVLAR);
		}
		case 100:
		{
			cs_set_user_armor(plr, num, CS_ARMOR_VESTHELM);
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskCheckModel(param[], plr)
{
	plr -= TASK_ID_CHECKMODEL;
	
	new CsTeams:team = CsTeams:param[0];
	
	if( team == HNS_TEAM_SEEKER || team == HNS_TEAM_HIDER )
	{
		new CsTeams:otherteam = (team == HNS_TEAM_HIDER) ? HNS_TEAM_SEEKER : HNS_TEAM_HIDER;
		
		new sModel[32];
		cs_get_user_model(plr, sModel, 31);
		
		for( new i = 0; i < 4; i++ )
		{
			if( equal(sModel, g_sAllModels[otherteam][i], 0) )
			{
				cs_set_user_model(plr, g_sDefaultModels[team]);
				break;
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskSwapTeams(taskid)
{
	static CsTeams:team;
	
	if( g_bScrimOn )
	{
		static temp;
		
		if( g_ScrimType == SCRIM_POINTS )
		{
			temp = g_ScrimScores[HNS_TEAM_HIDER];
			g_ScrimScores[HNS_TEAM_HIDER] = g_ScrimScores[HNS_TEAM_SEEKER];
			g_ScrimScores[HNS_TEAM_SEEKER] = temp;
			
			temp = g_ScrimTeamNums[HNS_TEAM_HIDER];
			g_ScrimTeamNums[HNS_TEAM_HIDER] = g_ScrimTeamNums[HNS_TEAM_SEEKER];
			g_ScrimTeamNums[HNS_TEAM_SEEKER] = temp;
			
			team = g_ScrimTeams[1];
			g_ScrimTeams[1] = g_ScrimTeams[2];
			g_ScrimTeams[2] = team;
		}
		else if( g_ScrimType == SCRIM_ROUNDS )
		{
			if( !g_ScrimSaveWins )
			{
				g_ScrimRounds[HNS_TEAM_HIDER] = 0;
				g_ScrimRounds[HNS_TEAM_SEEKER] = 0;
			}
			else
			{
				temp = g_ScrimRounds[HNS_TEAM_HIDER];
				g_ScrimRounds[HNS_TEAM_HIDER] = g_ScrimRounds[HNS_TEAM_SEEKER];
				g_ScrimRounds[HNS_TEAM_SEEKER] = temp;
			}
		}
	}
	
	for( new plr = 1; plr <= g_MaxPlayers; plr++ )
	{
		if( !g_bConnected[plr] )
		{
			continue;
		}
		
		team = cs_get_user_team(plr);
		if( team == HNS_TEAM_HIDER )
		{
			cs_set_user_team(plr, HNS_TEAM_SEEKER, HNS_MODEL_SEEKER);
			
			emake_TeamInfo(plr, g_sTeamInfo[HNS_TEAM_SEEKER]); /* let other plugins know that the player changed teams */
		}
		else if( team == HNS_TEAM_SEEKER )
		{
			cs_set_user_team(plr, HNS_TEAM_HIDER, HNS_MODEL_HIDER);
			
			emake_TeamInfo(plr, g_sTeamInfo[HNS_TEAM_HIDER]); /* let other plugins know that the player changed teams */
		}
	}
	
	g_RoundsLost = 0;
	g_RoundsEnded = 0;
	g_bDisableSlash = true;
	
	return 1;
}

public taskSetLights()
{
	if( !g_bHnsOn )
	{
		if( !equali(g_sLights, g_sLightsNormal) )
		{
			set_lights(g_sLightsNormal);
		}
	}
	else
	{
		new sLights[16];
		get_pcvar_string(hns_lights, sLights, 15);
		
		if( !equali(g_sLights, sLights) )
		{
			if( !strlen(sLights) )
			{
				set_lights(g_sLightsNormal);
				set_pcvar_string(hns_lights, g_sLightsNormal);
			}
			else
			{
				set_lights(sLights);
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskShowPluginInfo(plr)
{
	if( g_bHnsOn )
	{
		show_plugin_info(plr - TASK_ID_SHOWPLUGININFO);
	}
	
	return PLUGIN_CONTINUE;
}

public taskScrimVote(aMenu[])
{
	if( !--g_ScrimVoteTimer )
	{
		remove_task(TASK_ID_SCRIMVOTE, 0);
		
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bScrimVoted[plr] )
			{
				menu_cancel(plr); /* block any more menu key pressing */
				
				client_cmd(plr, "slot1"); /* remove menu from player's screen */
			}
		}
		
		menu_destroy(aMenu[0]);
		
		new rounds = get_pcvar_num(hnss_rounds_wins);
		scrim_print(0, "Vote result:^x03 Win %i Rounds^x01 [^x03%i^x01] -^x03 Point System^x01 [^x03%i^x01]", rounds, g_ScrimVoteCount[SCRIM_ROUNDS], g_ScrimVoteCount[SCRIM_POINTS]);
		
		new best;
		
		if( g_ScrimVoteCount[SCRIM_ROUNDS] > g_ScrimVoteCount[SCRIM_POINTS] )
		{
			best = SCRIM_ROUNDS;
			scrim_print(0, "The scrim type will be^x03 Win %i Rounds^x01!", rounds);
		}
		else if( g_ScrimVoteCount[SCRIM_POINTS] > g_ScrimVoteCount[SCRIM_ROUNDS] )
		{
			best = SCRIM_POINTS;
			scrim_print(0, "The scrim type will be^x03 Point System^x01!");
		}
		else /* not one is greater than the other, so they are equal */
		{
			best = random_num(1, SCRIM_TYPES-1);
			
			new sWinner[16];
			switch( best )
			{
				case SCRIM_ROUNDS: formatex(sWinner, 15, "Win %i Rounds", rounds);
				case SCRIM_POINTS: copy(sWinner, 15, "Point System");
			}
			
			scrim_print(0, "^x03The votes are a tie!^x01 The random generator chooses^x03 %s^x01!", sWinner);
		}
		
		if( best == SCRIM_POINTS )
		{
			/* in case of an odd number, we need to round it up one */
			g_ScrimMaxRounds = floatround(get_pcvar_float(hnss_points_rounds) / 2.0, floatround_ceil) * 2;
			
			g_PointsKnife = get_pcvar_num(hnss_points_knife);
			g_PointsHeadshot = get_pcvar_num(hnss_points_headshot);
			g_PointsGrenade = get_pcvar_num(hnss_points_grenade);
			g_PointsKill = get_pcvar_num(hnss_points_kill);
			g_PointsSuicide = get_pcvar_num(hnss_points_suicide);
			g_PointsTeamKill = get_pcvar_num(hnss_points_teamkill);
			g_PointsRoundWin = get_pcvar_num(hnss_points_roundwin);
			g_PointsRoundLose = get_pcvar_num(hnss_points_roundlose);
		}
		else if( best == SCRIM_ROUNDS )
		{
			g_ScrimMaxRounds = rounds;
			g_ScrimMaxLosses = get_pcvar_num(hnss_rounds_losses);
			g_ScrimSaveWins = get_pcvar_num(hnss_rounds_savewins);
		}
		
		g_ScrimType = best;
		g_ScrimWinner = CS_TEAM_UNASSIGNED;
		g_ScrimRounds[HNS_TEAM_HIDER] = 0;
		g_ScrimRounds[HNS_TEAM_SEEKER] = 0;
		g_bScrimIsDraw = false;
		g_ScrimTeams[1] = HNS_TEAM_HIDER;
		g_ScrimTeams[2] = HNS_TEAM_SEEKER;
		g_ScrimTeamNums[HNS_TEAM_HIDER] = 1;
		g_ScrimTeamNums[HNS_TEAM_SEEKER] = 2;
		g_ScrimScores[HNS_TEAM_HIDER] = 0;
		g_ScrimScores[HNS_TEAM_SEEKER] = 0;
		
		g_bScrimOn = true;
		set_pcvar_num(sv_restart, 1);
	}
	else
	{
		new sTitle[32];
		formatex(sTitle, 31, "Choose a scrim type \r[\w%i\r]", g_ScrimVoteTimer);
		
		new menu = aMenu[0];
		menu_setprop(menu, MPROP_TITLE, sTitle);
		
		for( new plr = 1; plr <= g_MaxPlayers; plr++ )
		{
			if( !g_bScrimVoted[plr] )
			{
				menu_display(plr, menu, 0);
			}
		}
	}
	
	return PLUGIN_CONTINUE;
}

public taskExecuteConfig()
{
	new sConfig[64];
	get_configsdir(sConfig, 63);
	add(sConfig, 63, "/hidenseek.cfg", 0);
	
	if( file_exists(sConfig) )
	{
		server_cmd("exec %s", sConfig);
		server_exec();
		
		set_task(1.0, "TaskCheckOldVersion");
	}
	else
	{
		make_config(sConfig, true);
		
		register_forward(FM_GetGameDescription, "fwdGetGameDescription", 0);
	}
}

public TaskCheckOldVersion()
{
	new sValue[32];
	get_pcvar_string(hns_gametype, sValue, 31);
	
	if( had_older_version(sValue) || is_config_old() )
	{
		formatex(sValue, 31, "HideNSeek v%s", PLUGIN_VERSION);
		set_pcvar_string(hns_gametype, sValue);
		
		set_task(1.0, "TaskResetConfig");
	}
	else
	{
		register_forward(FM_GetGameDescription, "fwdGetGameDescription", 0);
	}
}

public TaskResetConfig()
{
	new sConfig[64];
	get_configsdir(sConfig, 63);
	add(sConfig, 63, "/hidenseek.cfg", 0);
	
	//delete_file(sConfig);
	make_config(sConfig, false);
	
	register_forward(FM_GetGameDescription, "fwdGetGameDescription", 0);
}

bool:had_older_version(const sGameType[])
{
	new bool:bOld = false;
	
	new sTemp[32];
	formatex(sTemp, 31, "HideNSeek v%s", PLUGIN_VERSION);
	
	if( !equali(sTemp, sGameType) )
	{
		new Float:version = str_to_float(PLUGIN_VERSION);
		for( new Float:i = 2.0; i < version; i += 0.1 )
		{
			formatex(sTemp, 31, "HideNSeek v%.1f", i);
			
			if( equali(sTemp, sGameType) )
			{
				bOld = true;
				break;
			}
		}
	}
	
	return bOld;
}

bool:is_config_old()
{
	new sConfig[64];
	get_configsdir(sConfig, 63);
	add(sConfig, 63, "/hidenseek.cfg", 0);
	
	new f = fopen(sConfig, "rt");
	new data[128];
	
	while( !feof(f) )
	{
		fgets(f, data, sizeof(data) - 1);
		
		if( containi(data, "hns_warmup") != -1 )
		{
			fclose(f);
			
			return false;
		}
	}
	
	fclose(f);
	
	return true;
}

make_config(const sConfig[], bool:bCheckVersion)
{
	new f = fopen(sConfig, "wt");
	
	fputs(f, "// This is where all the cvars go for HideNSeek^n// Information about the cvars can be found at: http://forums.alliedmods.net/showthread.php?t=65370^n^n");
	
	new sValue[32]; // any string needed from a cvar
	
	fprintf(f, "hns_footsteps %i^n", get_pcvar_num(hns_footsteps));
	fprintf(f, "hns_money %i^n", get_pcvar_num(hns_money));
	fprintf(f, "hns_nubslash %i^n", get_pcvar_num(hns_nubslash));
	fprintf(f, "hns_disablebuy %i^n", get_pcvar_num(hns_disablebuy));
	fprintf(f, "hns_hidetime %i^n", get_pcvar_num(hns_hidetime));
	fprintf(f, "hns_timersounds %i^n", get_pcvar_num(hns_timersounds));
	fprintf(f, "hns_noslowdown %i^n", get_pcvar_num(hns_noslowdown));
	fprintf(f, "hns_teamchange %i^n", get_pcvar_num(hns_teamchange));
	fprintf(f, "hns_disablekill %i^n", get_pcvar_num(hns_disablekill));
	fprintf(f, "hns_chooseteam %i^n", get_pcvar_num(hns_chooseteam));
	fprintf(f, "hns_semiclip %i^n", get_pcvar_num(hns_semiclip));
	fprintf(f, "hns_semiclip_alpha %i^n", get_pcvar_num(hns_semiclip_alpha));
	fprintf(f, "hns_noflash %i^n", get_pcvar_num(hns_noflash));
	fprintf(f, "hns_removebreakables %i^n", get_pcvar_num(hns_removebreakables));
	fprintf(f, "hns_removedoors %i^n", get_pcvar_num(hns_removedoors));
	fprintf(f, "hns_visiblecommands %i^n", get_pcvar_num(hns_visiblecommands));
	fprintf(f, "hns_noboosting %i^n", get_pcvar_num(hns_noboosting));
	fprintf(f, "hns_noboosting_punish %i^n", get_pcvar_num(hns_noboosting_punish));
	fprintf(f, "hns_noboosting_damage %i^n", get_pcvar_num(hns_noboosting_damage));
	fprintf(f, "hns_noboosting_interval %.4f^n", get_pcvar_float(hns_noboosting_interval));
	get_pcvar_string(hns_blindcolors, sValue, 31);
	fprintf(f, "hns_blindcolors ^"%s^"^n", sValue);
	get_pcvar_string(hns_hudcolors, sValue, 31);
	fprintf(f, "hns_hudcolors ^"%s^"^n", sValue);
	get_pcvar_string(hns_lights, sValue, 31);
	fprintf(f, "hns_lights ^"%s^"^n", sValue);
	
	get_pcvar_string(hns_gametype, sValue, 31);
	if( bCheckVersion )
	{
		if( had_older_version(sValue) )
		{
			formatex(sValue, 31, "HideNSeek v%s", PLUGIN_VERSION);
		}
	}
	fprintf(f, "hns_gametype ^"%s^"^n", sValue);
	
	get_pcvar_string(hns_prefix, sValue, 31);
	fprintf(f, "hns_prefix ^"%s^"^n", sValue);
	fprintf(f, "hns_warmup_godmode %i^n", get_pcvar_num(hns_warmup_godmode));
	fprintf(f, "hns_warmup_respawn %i^n^n", get_pcvar_num(hns_warmup_respawn));
	
	new sTeams[CsTeams][16];
	copy(sTeams[HNS_TEAM_HIDER], 15, "hiders");
	copy(sTeams[HNS_TEAM_SEEKER], 15, "seekers");
	fprintf(f, "hns_hiders_knife %i^n", get_pcvar_num(hns_hiders_knife));
	fprintf(f, "hns_hiders_alivefrags %i^n", get_pcvar_num(hns_hiders_alivefrags));
	for( new CsTeams:team = HNS_TEAM_HIDER; team < CS_TEAM_SPECTATOR; team++ )
	{
		fprintf(f, "hns_%s_grenades %i^n", sTeams[team], get_pcvar_num(hns_grenades[team]));
		fprintf(f, "hns_%s_grenades_percent %i^n", sTeams[team], get_pcvar_num(hns_grenades_percent[team]));
		fprintf(f, "hns_%s_flashbangs %i^n", sTeams[team], get_pcvar_num(hns_flashbangs[team]));
		fprintf(f, "hns_%s_flashbangs_percent %i^n", sTeams[team], get_pcvar_num(hns_flashbangs_percent[team]));
		fprintf(f, "hns_%s_smokegren %i^n", sTeams[team], get_pcvar_num(hns_smokegren[team]));
		fprintf(f, "hns_%s_smokegren_percent %i^n", sTeams[team], get_pcvar_num(hns_smokegren_percent[team]));
		fprintf(f, "hns_%s_armor %i^n^n", sTeams[team], get_pcvar_num(hns_armor[team]));
	}
	
	get_pcvar_string(hnss_prefix, sValue, 31);
	fprintf(f, "hnss_prefix ^"%s^"^n", sValue);
	fprintf(f, "hnss_vote_timer %i^n^n", get_pcvar_num(hnss_vote_timer));
	
	fprintf(f, "hnss_rounds_wins %i^n", get_pcvar_num(hnss_rounds_wins));
	fprintf(f, "hnss_rounds_losses %i^n", get_pcvar_num(hnss_rounds_losses));
	fprintf(f, "hnss_rounds_savewins %i^n^n", get_pcvar_num(hnss_rounds_savewins));
	
	fprintf(f, "hnss_points_knife %i^n", get_pcvar_num(hnss_points_knife));
	fprintf(f, "hnss_points_headshot %i^n", get_pcvar_num(hnss_points_headshot));
	fprintf(f, "hnss_points_grenade %i^n", get_pcvar_num(hnss_points_grenade));
	fprintf(f, "hnss_points_kill %i^n", get_pcvar_num(hnss_points_kill));
	fprintf(f, "hnss_points_suicide %i^n", get_pcvar_num(hnss_points_suicide));
	fprintf(f, "hnss_points_teamkill %i^n", get_pcvar_num(hnss_points_teamkill));
	fprintf(f, "hnss_points_roundwin %i^n", get_pcvar_num(hnss_points_roundwin));
	fprintf(f, "hnss_points_roundwin %i^n", get_pcvar_num(hnss_points_roundwin));
	fprintf(f, "hnss_points_rounds %i", get_pcvar_num(hnss_points_rounds));
	
	fclose(f);
}

register_say_command(const sCommand[], const sHandle[], const flags=-1, const sDescription[]="", const FlagManager=-1)
{
	new sTemp[64];
	
	formatex(sTemp, 63, "say /%s", sCommand);
	register_clcmd(sTemp, sHandle, flags, sDescription, FlagManager);
	
	formatex(sTemp, 63, "say .%s", sCommand);
	register_clcmd(sTemp, sHandle, flags, sDescription, FlagManager);
	
	formatex(sTemp, 63, "say_team /%s", sCommand);
	register_clcmd(sTemp, sHandle, flags, sDescription, FlagManager);
	
	formatex(sTemp, 63, "say_team .%s", sCommand);
	register_clcmd(sTemp, sHandle, flags, sDescription, FlagManager);
}

handle_booster(plr)
{
	new sPrefix[16];
	new Float:fGametime = get_gametime();
	new Float:fInterval = get_pcvar_float(hns_noboosting_interval);
	get_pcvar_string(hns_prefix, sPrefix, 15);
	
	if( fGametime >= g_fBoostPunishDelay[plr] )
	{
		punish_booster(plr);
		g_fBoostPunishDelay[plr] = fGametime + fInterval;
	}
	
	if( fGametime >= g_fBoostMessageDelay[plr] )
	{
		set_hudmessage(255, 50, 50, -1.0, 0.6, 1, 3.0, 3.0, 0.1, 0.1, -1);
		ShowSyncHudMsg(plr, g_BoostHud, "%s No Boosting Allowed!", sPrefix);
		
		g_fBoostMessageDelay[plr] = fGametime + 2.8;
	}
}

punish_booster(plr)
{
	new damage = get_pcvar_num(hns_noboosting_damage);
	
	if( damage >= get_user_health(plr) )
	{
		fm_fakedamage(plr, "anti-boost system", float(damage), DMG_CRUSH);
	}
	else
	{
		user_slap(plr, damage, 1);
		user_slap(plr, 0, 1);
	}
}

get_hider_and_seeker(&hider = 0, &seeker = 0, &hider_alive = 0)
{
	static CsTeams:team;
	for( new plr = 1; plr <= g_MaxPlayers; plr++ )
	{
		if( !g_bConnected[plr] )
		{
			continue;
		}
		
		team = cs_get_user_team(plr);
		if( team == HNS_TEAM_SEEKER && !seeker )
		{
			seeker = plr;
			
			if( hider && hider_alive )
			{
				break;
			}
		}
		else if( team == HNS_TEAM_HIDER )
		{
			if( !hider )
			{
				hider = plr;
			}
			if( !hider_alive && g_bAlive[plr] )
			{
				hider_alive = plr;
				
				if( seeker && hider )
				{
					break;
				}
			}
		}
	}
}

bool:remove_entities(const class[])
{
	new bool:remove = false;
	
	new ent = g_MaxPlayers, properties[32], Float:amt;
	while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", class)) )
	{
		pev(ent, pev_renderamt, amt);
		formatex(properties, 31, "^"%i^" ^"%f^" ^"%i^"", pev(ent, pev_rendermode), amt, pev(ent, pev_solid));
		
		set_pev(ent, pev_message, properties);
		set_pev(ent, pev_rendermode, kRenderTransAlpha);
		set_pev(ent, pev_renderamt, 0.0);
		set_pev(ent, pev_solid, SOLID_NOT);
		
		remove = true;
	}
	
	return remove;
}

bool:restore_entities(const class[])
{
	new bool:remove = true;
	
	new ent = g_MaxPlayers, properties[32], rendermode[4], amt[16], solid[4];
	while( (ent = engfunc(EngFunc_FindEntityByString, ent, "classname", class)) )
	{
		pev(ent, pev_message, properties, 31);
		parse(properties, rendermode, 3, amt, 15, solid, 3);
		
		set_pev(ent, pev_rendermode, str_to_num(rendermode));
		set_pev(ent, pev_renderamt, str_to_float(amt));
		set_pev(ent, pev_solid, str_to_num(solid));
		set_pev(ent, pev_message, g_sBlank);
		
		remove = false;
	}
	
	return remove;
}

show_scrim_vote()
{
	new menu = menu_create("", "mnuScrimType");
	
	new sItem[32];
	formatex(sItem, 31, "Win %i Rounds", get_pcvar_num(hnss_rounds_wins));
	
	menu_additem(menu, sItem, "1", 0, -1);
	menu_additem(menu, "Point System", "2", 0, -1);
	
	menu_setprop(menu, MPROP_PERPAGE, 0);
	
	for( new plr = 1; plr <= g_MaxPlayers; plr++ )
	{
		if( g_bConnected[plr] )
		{
			g_bScrimVoted[plr] = false;
		}
		else
		{
			g_bScrimVoted[plr] = true;
		}
	}
	
	g_ScrimVoteTimer = get_pcvar_num(hnss_vote_timer) + 1;
	g_ScrimVoteCount[SCRIM_ROUNDS] = 0;
	g_ScrimVoteCount[SCRIM_POINTS] = 0;
	
	new aMenu[2];
	aMenu[0] = menu;
	set_task(1.0, "taskScrimVote", TASK_ID_SCRIMVOTE, aMenu, 2, "b", 0);
	
	return 1;
}

bool:check_last_vote(plr_to_skip)
{
	for( new i = 1; i <= g_MaxPlayers; i++ )
	{
		if( !g_bConnected[i]
		|| i == plr_to_skip )
		{
			continue;
		}
		
		if( !g_bScrimVoted[i] )
		{
			return false;
		}
	}
	
	return true;
}

show_plugin_info(plr)
{
	hns_print(plr, "^x01*********stediginiz bir map var ise^x03 /maps ^x01, yazarak istediginiz mapi oylamaya ekleyebilirsiniz..", PLUGIN_VERSION);
	hns_print(plr, "");
	
	return 1;
}

cs_reset_user_maxspeed(plr)
{
	static Float:fMaxSpeed;
	
	static clip, ammo;
	switch( get_user_weapon(plr, clip, ammo) )
	{
		case CSW_SG550, CSW_AWP, CSW_G3SG1:
		{
			fMaxSpeed = 210.0;
		}
		case CSW_M249:
		{
			fMaxSpeed = 220.0;
		}
		case CSW_AK47:
		{
			fMaxSpeed = 221.0;
		}
		case CSW_M3, CSW_M4A1:
		{
			fMaxSpeed = 230.0;
		}
		case CSW_SG552:
		{
			fMaxSpeed = 235.0;
		}
		case CSW_XM1014, CSW_AUG, CSW_GALIL, CSW_FAMAS:
		{
			fMaxSpeed = 240.0;
		}
		case CSW_P90:
		{
			fMaxSpeed = 245.0;
		}
		case CSW_SCOUT:
		{
			fMaxSpeed = 260.0;
		}
		default:
		{
			fMaxSpeed = 250.0;
		}
	}
	
	engfunc(EngFunc_SetClientMaxspeed, plr, fMaxSpeed);
	set_pev(plr, pev_maxspeed, fMaxSpeed);
	
	return 1;
}

chance(plr, maxcount, percent, sClass[], CSW_type=0, sName[]="")
{
	if( !maxcount || !percent )
	{
		return 0;
	}
	
	new count;
	for( new i = 0; i < maxcount; i++ )
	{
		if( random_num(1, 100) <= percent )
		{
			if( count == 0 )
			{
				fm_give_item(plr, sClass);
			}
			
			count++;
		}
	}
	
	if( count && CSW_type )
	{
		if( percent < 100 )
		{
			hns_print(plr, "You received %i %s%s! (%i%% chance)", count, sName, (count == 1) ? g_sBlank : g_sS, percent);
		}
		
		cs_set_user_bpammo(plr, CSW_type, count);
	}
	
	return 1;
}

get_blind_colors(&red, &green, &blue, &alpha)
{
	new sColors[20];
	get_pcvar_string(hns_blindcolors, sColors, 19);
	
	static sRed[5], sGreen[5], sBlue[5], sAlpha[5];
	if( parse(sColors, sRed, 4, sGreen, 4, sBlue, 4, sAlpha, 4) < 4 )
	{
		red = 0;
		green = 0;
		blue = 0;
		alpha = 255;
		
		formatex(sColors, 19, "%i %i %i %i", red, green, blue, alpha);
		set_pcvar_string(hns_blindcolors, sColors);
		
		return 0;
	}
	
	red =	equali(sRed, "rand", 0) ?	random(256) : clamp(str_to_num(sRed), 0, 255);
	green =	equali(sGreen, "rand", 0) ?	random(256) : clamp(str_to_num(sGreen), 0, 255);
	blue =	equali(sBlue, "rand", 0) ?	random(256) : clamp(str_to_num(sBlue), 0, 255);
	alpha =	equali(sAlpha, "rand", 0) ?	random(256) : clamp(str_to_num(sAlpha), 0, 255);
	
	return 1;
}

get_hud_colors(&red, &green, &blue)
{
	new sColors[20];
	get_pcvar_string(hns_hudcolors, sColors, 19);
	
	static sRed[5], sGreen[5], sBlue[5];
	if( parse(sColors, sRed, 4, sGreen, 4, sBlue, 4) < 3 )
	{
		red = 255;
		green = 255;
		blue = 255;
		
		formatex(sColors, 19, "%i %i %i", red, green, blue);
		set_pcvar_string(hns_blindcolors, sColors);
		
		return 0;
	}
	
	red =	equali(sRed, "rand", 0) ?	random(256) : clamp(str_to_num(sRed), 0, 255);
	green =	equali(sGreen, "rand", 0) ?	random(256) : clamp(str_to_num(sGreen), 0, 255);
	blue =	equali(sBlue, "rand", 0) ?	random(256) : clamp(str_to_num(sBlue), 0, 255);
	
	return 1;
}

set_lights(const sLights[])
{
	engfunc(EngFunc_LightStyle, 0, sLights);
	copy(g_sLights, 16, sLights);
	
	return 1;
}

make_HideWeapon(plr, flags)
{
	static i; i = plr ? plr : get_player();
	if( !i )
	{
		return 0;
	}
	
	message_begin(plr ? MSG_ONE : MSG_ALL, g_msgHideWeapon, {0, 0, 0}, plr);
	write_byte(flags);
	message_end();
	
	return 1;
}

make_ScreenFade(plr, Float:fDuration, Float:fHoldtime, red, green, blue, alpha)
{
	static i; i = plr ? plr : get_player();
	if( !i )
	{
		return 0;
	}
	
	message_begin(plr ? MSG_ONE : MSG_ALL, g_msgScreenFade, {0, 0, 0}, plr);
	write_short(floatround(4096.0 * fDuration, floatround_round));
	write_short(floatround(4096.0 * fHoldtime, floatround_round));
	write_short(4096);
	write_byte(red);
	write_byte(green);
	write_byte(blue);
	write_byte(alpha);
	message_end();
	
	return 1;
}

emake_TeamInfo(plr, sTeam[])
{
	if( !plr )
	{
		return 0;
	}
	
	emessage_begin(MSG_ALL, g_msgTeamInfo, {0, 0, 0}, 0);
	ewrite_byte(plr);
	ewrite_string(sTeam);
	emessage_end();
	
	return 1;
}

make_TeamInfo(plr, sTeam[])
{
	if( !plr )
	{
		return 0;
	}
	
	message_begin(MSG_ALL, g_msgTeamInfo, {0, 0, 0}, 0);
	write_byte(plr);
	write_string(sTeam);
	message_end();
	
	return 1;
}

make_Money(plr, money, flash)
{
	if( !plr )
	{
		return 0;
	}
	
	message_begin(MSG_ONE, g_msgMoney, {0, 0, 0}, plr);
	write_long(money);
	write_byte(flash ? 1 : 0);
	message_end();
	
	return 1;
}

make_ArmorType(plr, helmet)
{
	if( !plr )
	{
		return 0;
	}
	
	message_begin(MSG_ONE, g_msgArmorType, {0, 0, 0}, plr);
	write_byte(helmet);
	message_end();
	
	return 1;
}

make_SayText(receiver, sender, sMessage[])
{
	if( !sender )
	{
		return 0;
	}
	
	message_begin(receiver ? MSG_ONE : MSG_ALL, g_msgSayText, {0, 0, 0}, receiver);
	write_byte(sender);
	write_string(sMessage);
	message_end();
	
	return 1;
}

hns_print(plr, const sFormat[], any:...)
{
	static i; i = plr ? plr : get_player();
	if( !i )
	{
		return 0;
	}
	
	new sPrefix[16];
	get_pcvar_string(hns_prefix, sPrefix, 15);
	
	new sMessage[256];
	new len = formatex(sMessage, 255, "^x04%s^x01 ", sPrefix);
	vformat(sMessage[len], 255-len, sFormat, 3);
	sMessage[192] = '^0';
	
	make_SayText(plr, i, sMessage);
	
	return 1;
}

scrim_print(plr, const sFmt[], any:...)
{
	new i = plr ? plr : get_player();
	if( !i )
	{
		return 0;
	}
	
	new sPrefix[16];
	get_pcvar_string(hnss_prefix, sPrefix, 15);
	
	new sMessage[256];
	new len = formatex(sMessage, 255, "^x04%s^x01 ", sPrefix);
	vformat(sMessage[len], 255-len, sFmt, 3);
	sMessage[192] = '^0';
	
	make_SayText(plr, i, sMessage);
	
	return 1;
}

get_player()
{
	for( new plr = 1; plr <= g_MaxPlayers; plr++ )
	{
		if( g_bConnected[plr] )
		{
			return plr;
		}
	}
	
	return 0;
}

/* cstrike -> fakemeta stocks */
CsTeams:cs_get_user_team(plr, &{CsInternalModel,_}:model=CS_DONTCHANGE)
{
	model = CsInternalModel:get_pdata_int(plr, OFFSET_INTERNALMODEL);
	
	return CsTeams:get_pdata_int(plr, OFFSET_TEAM);
}

cs_set_user_team(plr, {CsTeams,_}:team, {CsInternalModel,_}:model=CS_DONTCHANGE)
{
	set_pdata_int(plr, OFFSET_TEAM, _:team);
	if( model )
	{
		set_pdata_int(plr, OFFSET_INTERNALMODEL, _:model);
	}
	
	dllfunc(DLLFunc_ClientUserInfoChanged, plr);
	
	make_TeamInfo(plr, g_sTeamInfo[team]);
	
	return 1;
}

cs_set_user_money(plr, money, flash=1)
{
	set_pdata_int(plr, OFFSET_MONEY, money);
	
	make_Money(plr, money, flash);
	
	return 1;
}

cs_set_user_armor(plr, amount, CsArmorType:type)
{
	set_pdata_int(plr, OFFSET_ARMORTYPE, _:type);
	set_pev(plr, pev_armorvalue, float(amount));
	
	if( type != CS_ARMOR_NONE )
	{
		make_ArmorType(plr, (type == CS_ARMOR_VESTHELM) ? 1 : 0);
	}
	
	return 1;
}

__get_ammo_offset(weapon)
{
	static offset;
	
	switch( weapon )
	{
		case CSW_AWP:
		{
			offset = OFFSET_AWP_AMMO;
		}
		case CSW_SCOUT, CSW_AK47, CSW_G3SG1:
		{
			offset = OFFSET_SCOUT_AMMO;
		}
		case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALIL, CSW_SG552:
		{
			offset = OFFSET_FAMAS_AMMO;
		}
		case CSW_M3, CSW_XM1014:
		{
			offset = OFFSET_M3_AMMO;
		}
		case CSW_USP, CSW_UMP45, CSW_MAC10:
		{
			offset = OFFSET_USP_AMMO;
		}
		case CSW_FIVESEVEN, CSW_P90:
		{
			offset = OFFSET_FIVESEVEN_AMMO;
		}
		case CSW_DEAGLE:
		{
			offset = OFFSET_DEAGLE_AMMO;
		}
		case CSW_P228:
		{
			offset = OFFSET_P228_AMMO;
		}
		case CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP, CSW_ELITE:
		{
			offset = OFFSET_GLOCK_AMMO;
		}
		case CSW_FLASHBANG:
		{
			offset = OFFSET_FLASHBANG_AMMO;
		}
		case CSW_HEGRENADE:
		{
			offset = OFFSET_HEGRENADE_AMMO;
		}
		case CSW_SMOKEGRENADE:
		{
			offset = OFFSET_SMOKEGRENADE_AMMO;
		}
		case CSW_C4:
		{
			offset = OFFSET_C4_AMMO;
		}
		default:
		{
			return 0;
		}
	}
	
	return offset;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1055\\ f0\\ fs16 \n\\ par }
*/
Now I got these warnings.Can you fix these too ?

Code:
hidensekk.sma(46) : warning 201: redefinition of constant/macro (symbol "CsTeams")
hidensekk.sma(53) : warning 201: redefinition of constant/macro (symbol "CsInternalModel")
hidensekk.sma(68) : warning 201: redefinition of constant/macro (symbol "CsArmorType")
m3t3hann is offline
fysiks
Veteran Member
Join Date: Sep 2007
Location: Flatland, USA
Old 06-07-2023 , 23:32   Re: tag mismatch
Reply With Quote #4

Quote:
Originally Posted by m3t3hann View Post
Hello,when I am trying to compile Hidenseek by Exolent plugin

I got this problem:
HTML Code:
hidensekk.sma(3009) : warning 213: tag mismatch
Can someone solve this problem please ?
There is no tag mismatch on line 3009 so I'm not sure how you are getting that warning. I compiled with both 1.8.2 and 1.9.0.

Quote:
Originally Posted by lexzor View Post
this is not a problem, it's a warning
Not all warnings are "not a problem", you should say that "this" warning is not a problem if it's truely not a problem. People should not learn that they can always be ignored.

Ironically, there is no tag mismatch on line 3009 so I'm not sure why he's seeing that. The change you made on that line doesn't change anything, it's literally the same value and same tag (aka tagless).

Quote:
Originally Posted by m3t3hann View Post
Now I got these warnings.Can you fix these too ?

Code:
hidensekk.sma(46) : warning 201: redefinition of constant/macro (symbol "CsTeams")
hidensekk.sma(53) : warning 201: redefinition of constant/macro (symbol "CsInternalModel")
hidensekk.sma(68) : warning 201: redefinition of constant/macro (symbol "CsArmorType")
This does not occur when compiled with 1.8.2 but it does when compiled with 1.9.0. However, the definition, for the values that are used, are the same so these warnings can be ignored.
__________________
fysiks is offline
lexzor
Veteran Member
Join Date: Nov 2020
Old 06-08-2023 , 04:40   Re: tag mismatch
Reply With Quote #5

Quote:
Originally Posted by fysiks View Post
There is no tag mismatch on line 3009 so I'm not sure how you are getting that warning. I compiled with both 1.8.2 and 1.9.0.



Not all warnings are "not a problem", you should say that "this" warning is not a problem if it's truely not a problem. People should not learn that they can always be ignored.
i should express myself better. in this situation it was not a problem


Quote:
Originally Posted by fysiks View Post
Ironically, there is no tag mismatch on line 3009 so I'm not sure why he's seeing that. The change you made on that line doesn't change anything, it's literally the same value and same tag (aka tagless).
i think the problem was "ml" parameter which in older amxmodx version is boolean
lexzor is offline
fysiks
Veteran Member
Join Date: Sep 2007
Location: Flatland, USA
Old 06-09-2023 , 00:14   Re: tag mismatch
Reply With Quote #6

Quote:
Originally Posted by lexzor View Post
i think the problem was "ml" parameter which in older amxmodx version is boolean
No. It hasn't been changed change since it was first added 16 years ago according to the git history (this would be circa version 1.8.0).
__________________
fysiks is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 07:23.


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