public void OnMapStart()
{
	PrecacheModel("models/error.mdl", true);
	g_iBeam = PrecacheModel("materials/sprites/physbeam.vmt");

	AddFileToDownloadsTable("sound/unl1/disco.wav");
	PrecacheSound("unl1/disco.wav");

	AddFileToDownloadsTable("sound/unl1/steamedyes.mp3");
	PrecacheSound("unl1/steamedyes.mp3");

	GetCurrentMap(g_sMapName, sizeof(g_sMapName));
	LowerString(g_sMapName, sizeof(g_sMapName));

	RestartTimers();
	ClearMapInfo();
	CheckDirectories();

	if (g_hDatabase != null)
	{
		LoadMapInfo();
	}

}

public void OnConfigsExecuted()
{
	g_bLasers = g_hCvarLasers.BoolValue;
}

public void OnLazorsChange(ConVar convar, char[] oldValue, char[] newValue)
{
	g_bLasers = g_hCvarLasers.BoolValue;
}

public void OnClientPostAdminCheck(int client)
{
	if (isValidClient(client))
	{
		ClearPlayerCache(client);
		GetPlayerInfo(client);
	}
}

public void OnClientDisconnect(int client)
{
	if (client == g_iEditor)
	{
		g_iEditor = -1;
		g_bEditorComesFromMenu = false;
	}
}

public void Event_RoundStart(Handle event, char[] name, bool dontBroadcast)
{
	for (int i = 0; i <= 1; i++)
	{
		CreateTrigger(i);
	}
	for (int i = 0; i <= MAXPLAYERS; i++)
	{
		g_iActivity[i] = -1;
	}
}

/*public Action CS_OnTerminateRound(float& delay, CSRoundEndReason& reason)
{

}*/

public void Event_PlayerDeath(Handle event, char[] name, bool dontBroadcast)
{
	int client = GetClientOfUserId(GetEventInt(event, "userid"));
	g_iActivity[client] = -1;
}

void CheckDirectories()
{
	char path[PLATFORM_MAX_PATH];
	BuildPath(Path_SM, path, sizeof(path), REPLAYS_PATH);

	if (!DirExists(path))
		CreateDirectory(path, 711);

	BuildPath(Path_SM, path, sizeof(path), "%s/%s", REPLAYS_PATH, g_sMapName);

	if (!DirExists(path))
		CreateDirectory(path, 711);

}

public void RestartTimers()
{
	delete g_hDrawFullZone;
	delete g_hDrawZone;
	delete g_hHudLoop;
	delete g_hSideHudLoop;

	g_hDrawFullZone = CreateTimer(0.2, DrawFullZoneTimer, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
	g_hDrawZone = CreateTimer(1.0, DrawZoneTimer, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
	g_hHudLoop = CreateTimer(0.2, HudLoop, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
	g_hSideHudLoop = CreateTimer(1.0, SideHudLoop, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}

public void ClearMapInfo()
{
	for (int i = 0; i <= 1; i++)
	{
		g_iTriggerEnt[i] = -1;
		for (int f = 0; f <= 2; f++)
		{
			g_fStartOrigins[i][f] = 0.0;
			g_fEndOrigins[i][f] = 0.0;
		}
	}
	g_iTier = 1;
	g_iMapID = -1;
	g_bActive = false;
	g_iEditor = -1;
	g_bEditorComesFromMenu = false;
	g_iSnapToClient = -1;
	g_fWrTime = -1.0;

	Format(g_sWrHolder, sizeof(g_sWrHolder), "\0");
}

public void ProcessFinish(int client)
{
	float fTime, fTimeToWR;
	char name[MAX_NAME_LENGTH], cTime[16], cTimeToWR[16];

	GetClientName(client, name, sizeof(name));
	fTime = GetEngineTime() - g_fStartTime[client];
	fTimeToWR = fTime - g_fWrTime;
	TimerFormat(fTime, cTime, sizeof(cTime), true, false);

	if (fTimeToWR == fTime)
		Format(cTimeToWR, sizeof(cTimeToWR), "WR");

	else
		TimerFormat(fTimeToWR, cTimeToWR, sizeof(cTimeToWR), true, true);

	if (g_fMapTime[client] > fTime)
	{
		float fTimeDif;
		char cTimeDif[16];

		fTimeDif = g_fMapTime[client] - fTime;
		g_fMapTime[client] = fTime;
		TimerFormat(fTimeDif, cTimeDif, sizeof(cTimeDif), true, false);

		TimerPrintToChat(client, true, "%T", "FinishedImproved", LANG_SERVER, name, cTime, cTimeToWR, cTimeDif);
		UpdateTime(client);

		if (fTimeToWR < 0.0)
				UpdateWR(client, fTime, name);
	}
	else
	{
		TimerPrintToChat(client, true, "%T", "Finished", LANG_SERVER, name, cTime, cTimeToWR);

		if (g_fMapTime[client] == 0.0)
		{
			g_fMapTime[client] = fTime;

			UpdateTime(client);
			if (fTimeToWR < 0.0 || g_fWrTime == 0.0)
			{
				UpdateWR(client, fTime, name);
			}

		}
		else
		{
			AddCompletion(client);
		}
	}
}

public void UpdateWR(int client, float time, char[] name)
{
	if (g_fWrTime == -1.0)
	{
		LogError("WR never loaded, reload map");
		return;
	}

	if (g_fWrTime < time && g_fWrTime != 0.0)
	{
		LogError("Time submitted is not faster");
		return;
	}

	SaveRecord(client);

	g_fWrTime = time;

	strcopy(g_sWrHolder, sizeof(g_sWrHolder), name);
}

public void ProcessRankMessage(int client, int rank, int total)
{
	char name[MAX_NAME_LENGTH];
	GetClientName(client, name, sizeof(name));
	if (rank > 10)
		TimerPrintToChat(client, false, "%T", "Rank", LANG_SERVER, name, rank, total);

	else if (rank <= 10 && rank != 1)
	{
		TimerPrintToChat(client, true, "%T", "RankTop10", LANG_SERVER, name, rank, total);
		EmitSoundToAll("unl1/steamedyes.mp3");
	}

	else if (rank == 1)
	{
		TimerPrintToChat(client, true, "%T", "RankWR", LANG_SERVER, name, rank, total);
		EmitSoundToAll("unl1/disco.wav");
	}
}