809 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			809 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #pragma semicolon 1
 | |
| #pragma newdecls required
 | |
| #define DEBUG
 | |
| 
 | |
| #define PLUGIN_AUTHOR "jenz"
 | |
| #define PLUGIN_VERSION "6.20"
 | |
| #define ZONE_PREFIX_RACE "ZONE_PREFIX_RACE"
 | |
| 
 | |
| #include <sourcemod>
 | |
| #include <sdktools>
 | |
| #include <sdkhooks>
 | |
| #include <unloze_zones>
 | |
| #include <colorvariables>
 | |
| #include <regex>
 | |
| #include <zombiereloaded>
 | |
| 
 | |
| bool g_bMessage[MAXPLAYERS];
 | |
| bool g_bStopTimer[MAXPLAYERS];
 | |
| bool g_bRoundend;
 | |
| bool g_bSmap;
 | |
| bool g_bRmap;
 | |
| char g_cMapname[512];
 | |
| float g_fEngineRoundtimeSurf[MAXPLAYERS];
 | |
| float g_fEngineSecondsSurf[MAXPLAYERS];
 | |
| float g_fPlayertimes[MAXPLAYERS];
 | |
| float g_fEngineRoundtime;
 | |
| float g_fEngineSeconds;
 | |
| int g_iEngine_minutesSurf[MAXPLAYERS];
 | |
| int g_iCurrentS[MAXPLAYERS];
 | |
| int g_iSurf[MAXPLAYERS];
 | |
| int g_iEngine_minutes;
 | |
| Handle g_hSurfTimer[MAXPLAYERS];
 | |
| 
 | |
| public Plugin myinfo = 
 | |
| {
 | |
| 	name = "Unloze Map Timer",
 | |
| 	author = PLUGIN_AUTHOR,
 | |
| 	description = "Timers for Race Maps",
 | |
| 	version = PLUGIN_VERSION,
 | |
| 	url = ""
 | |
| };
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: Pluginstart/mapstart
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| 
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	SQL_StartConnection();
 | |
| 	RegConsoleCmd("sm_toptime", cmd_timerCheck, "checking");
 | |
| 	
 | |
| 	RegConsoleCmd("sm_s1", cmd_timerCheckS1, "checking");
 | |
| 	RegConsoleCmd("sm_s2", cmd_timerCheckS2, "checking 2");
 | |
| 	RegConsoleCmd("sm_s3", cmd_timerCheckS3, "checking 3");
 | |
| 	RegConsoleCmd("sm_s4", cmd_timerCheckS4, "checking 4");
 | |
| 	RegConsoleCmd("sm_s5", cmd_timerCheckS5, "checking 5");
 | |
| 	RegConsoleCmd("sm_s6", cmd_timerCheckS6, "checking 6");
 | |
| 	RegConsoleCmd("sm_s7", cmd_timerCheckS7, "checking 7");
 | |
| 	RegConsoleCmd("sm_s8", cmd_timerCheckS8, "checking 8");
 | |
| 	RegConsoleCmd("sm_s9", cmd_timerCheckS9, "checking 9");
 | |
| 	RegConsoleCmd("sm_s10", cmd_timerCheckS010, "checking 10");
 | |
| 	HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
 | |
| 	HookEvent("round_end", Event_RoundEnd);
 | |
| }
 | |
| 
 | |
| public void OnMapStart()
 | |
| {
 | |
| 	GetCurrentMap(g_cMapname, sizeof(g_cMapname));
 | |
| 	g_bSmap = false;
 | |
| 	g_bRmap = false;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: mysql queries/callbacks
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| 
 | |
| public void SQL_SelectTop_Callback(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		//LogError("[SS] Selecting players error. Reason: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	int client = GetClientFromSerial(data);
 | |
| 	if (client == 0)
 | |
| 	{
 | |
| 		LogError("[SS] Client is not valid. Reason: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	Menu menu = new Menu(MenuHandler1);
 | |
| 	if (g_iSurf[client] != 0)
 | |
| 	{
 | |
| 		menu.SetTitle("Maptimer: %s_S%i", g_cMapname, g_iSurf[client]);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		menu.SetTitle("Maptimer: %s", g_cMapname);
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	int iS_Count = 0;
 | |
| 	char gS_MenuContent[524];
 | |
| 	
 | |
| 	while (results.FetchRow())
 | |
| 	{
 | |
| 		float oldTime = 0.0;
 | |
| 		int engine_cMin = 0;
 | |
| 		float engine_cSec = 0.0;
 | |
| 		iS_Count++;
 | |
| 		
 | |
| 		//Player Name
 | |
| 		char[] gS_PlayerName = new char[MAX_NAME_LENGTH];
 | |
| 		results.FetchString(0, gS_PlayerName, MAX_NAME_LENGTH);
 | |
| 		oldTime = results.FetchFloat(1);
 | |
| 		engine_cMin = RoundToFloor(oldTime / 60);
 | |
| 		engine_cSec = oldTime - (engine_cMin * 60);
 | |
| 		
 | |
| 		Format(gS_MenuContent, sizeof(gS_MenuContent), "Position: %i Time: %i:%f - %s", iS_Count, engine_cMin, engine_cSec, gS_PlayerName);
 | |
| 		
 | |
| 		menu.AddItem("-1", gS_MenuContent, ITEMDRAW_DISABLED);
 | |
| 	}
 | |
| 	
 | |
| 	if (!iS_Count)
 | |
| 	{
 | |
| 		menu.AddItem("-1", "No results.", ITEMDRAW_DISABLED);
 | |
| 	}
 | |
| 	
 | |
| 	//menu.AddItem("no", "No", ITEMDRAW_DISABLED);
 | |
| 	menu.ExitButton = true;
 | |
| 	menu.Display(client, 20);
 | |
| 	
 | |
| 	
 | |
| //////message//////
 | |
| 	
 | |
| 	char sQuery[564];
 | |
| 	char sSID[64];
 | |
| 	GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | |
| 	
 | |
| 	if (g_iSurf[client] != 0)
 | |
| 	{
 | |
| 		Format(sQuery, sizeof(sQuery), "SELECT name, `%sS%i` FROM `zetimer_tableSurf` WHERE steam_auth = '%s'", g_cMapname, g_iSurf[client], sSID);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		Format(sQuery, sizeof(sQuery), "SELECT name, `%s` FROM `zetimer_table` WHERE steam_auth = '%s'", g_cMapname, sSID);
 | |
| 	}
 | |
| 	DBResultSet rs;
 | |
| 	
 | |
| 	if ((rs = SQL_Query(db, sQuery)) == null)
 | |
| 	{
 | |
| 		delete db;
 | |
| 		delete rs;
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	char gS_MessageContent[524];
 | |
| 	if (rs.FetchRow())
 | |
| 	{
 | |
| 		float oldTime = 0.0;
 | |
| 		int engine_cMin = 0;
 | |
| 		float engine_cSec = 0.0;
 | |
| 		
 | |
| 		//Player Name
 | |
| 		char[] gS_PlayerName = new char[MAX_NAME_LENGTH];
 | |
| 		rs.FetchString(0, gS_PlayerName, MAX_NAME_LENGTH);
 | |
| 		oldTime = rs.FetchFloat(1);
 | |
| 		engine_cMin = RoundToFloor(oldTime / 60);
 | |
| 		engine_cSec = oldTime - (engine_cMin * 60);
 | |
| 		
 | |
| 		Format(gS_MessageContent, sizeof(gS_MessageContent), "%i:%f - %s", engine_cMin, engine_cSec, gS_PlayerName);
 | |
| 		if (g_iSurf[client] != 0)
 | |
| 		{
 | |
| 			CPrintToChat(client, "Your best time Stage %i: %s", g_iSurf[client], gS_MessageContent);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			CPrintToChat(client, "Your best time: %s", gS_MessageContent);
 | |
| 		}
 | |
| 	}
 | |
| 	delete db;
 | |
| 	delete rs;
 | |
| }
 | |
| 
 | |
| public float receiveMYSQL(int client, float f_playerTime)
 | |
| {
 | |
| 	//variables
 | |
| 	float iCollected;
 | |
| 	char sQuery[255];
 | |
| 	char sSID[64];
 | |
| 	char error[255];
 | |
| 	DBResultSet rs;
 | |
| 	Database db;
 | |
| 	
 | |
| 	if (SQL_CheckConfig("zetimer"))
 | |
| 	{
 | |
| 		db = SQL_Connect("zetimer", true, error, sizeof(error));
 | |
| 	}
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Unloze] Error! Could not connect to MYSQL-DB!");
 | |
| 		delete db;
 | |
| 	}
 | |
| 	GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | |
| 	Format(sQuery, sizeof(sQuery), "SELECT `%s` FROM `zetimer_table` WHERE steam_auth = '%s'", g_cMapname, sSID);
 | |
| 	//PrintToChatAll("receiveMYSQL sQuery: %s", sQuery);
 | |
| 	if ((rs = SQL_Query(db, sQuery)) == null)
 | |
| 	{
 | |
| 		delete db;
 | |
| 		delete rs;
 | |
| 		return 0.0;
 | |
| 	}
 | |
| 	
 | |
| 	if(SQL_FetchRow(rs))
 | |
| 	{
 | |
| 		iCollected = SQL_FetchFloat(rs, 0);
 | |
| 	}
 | |
| 	
 | |
| 	delete rs;
 | |
| 	delete db;
 | |
| 	return iCollected;
 | |
| }
 | |
| 
 | |
| public void sendMYSQLSurf(int client, float f_playerTime, int Entry)
 | |
| {
 | |
| 	char error[255];
 | |
| 	Database db;
 | |
| 	if (SQL_CheckConfig("zetimer"))
 | |
| 	{
 | |
| 		db = SQL_Connect("zetimer", true, error, sizeof(error));
 | |
| 	}
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Unloze] Error! Could not connect to MYSQL-DB!");
 | |
| 		delete db;
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	char sSID[64];
 | |
| 	GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | |
| 	char sQuery[255];
 | |
| 	//Format(sQuery, sizeof(sQuery), "SELECT `%sS1` FROM `zetimer_tableSurf` LIMIT 10", g_cMapname);
 | |
| 	Format(sQuery, sizeof(sQuery), "SELECT `%sS%i` FROM `zetimer_tableSurf` LIMIT 10", g_cMapname, Entry);
 | |
| 	//PrintToChatAll("sendMYSQLSurf sQuery: %s", sQuery);
 | |
| 	DBResultSet rs;
 | |
| 	if ((rs = SQL_Query(db, sQuery)) == null)
 | |
| 	{
 | |
| 		Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_tableSurf` ADD COLUMN `%sS%i` DECIMAL(13,3) NOT NULL", g_cMapname, Entry);
 | |
| 		SQL_TQuery(db, DummyCallbackSimple, sQuery);
 | |
| 		PrintToChat(client, "Sorry but the time was not counted since the Table had to be created first EKSDEE- jenz");
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		char l_cName[256];
 | |
| 		SQL_FetchClientName(client, db, l_cName, sizeof(l_cName));
 | |
| 		Format(sQuery, sizeof(sQuery), "INSERT INTO `zetimer_tableSurf` (`steam_auth`, `name`, `%sS%i`) VALUES ('%s', '%s', '%f') ON DUPLICATE KEY UPDATE `name` = '%s', `%sS%i` = '%f'", g_cMapname, Entry, sSID, l_cName, f_playerTime, l_cName, g_cMapname, Entry, f_playerTime);
 | |
| 		SQL_TQuery(db, DummyCallbackSimple, sQuery);
 | |
| 	}
 | |
| 	delete db;
 | |
| 	delete rs;
 | |
| 	//CPrintToChatAll("reaching end, query is: %s", sQuery);
 | |
| }
 | |
| 
 | |
| public void sendMYSQL(int client, float f_playerTime)
 | |
| {
 | |
| 	char error[255];
 | |
| 	Database db;
 | |
| 	if (SQL_CheckConfig("zetimer"))
 | |
| 	{
 | |
| 		db = SQL_Connect("zetimer", true, error, sizeof(error));
 | |
| 	}
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Unloze] Error! Could not connect to MYSQL-DB!");
 | |
| 		delete db;
 | |
| 	}
 | |
| 	
 | |
| 	char sSID[64];
 | |
| 	GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | |
| 	char sQuery[255];
 | |
| 	Format(sQuery, sizeof(sQuery), "SELECT `%s` FROM `zetimer_table` LIMIT 10", g_cMapname);
 | |
| 	
 | |
| 	DBResultSet rs;
 | |
| 	if ((rs = SQL_Query(db, sQuery)) == null)
 | |
| 	{
 | |
| 		Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table` ADD COLUMN `%s` DECIMAL(13,3) NOT NULL", g_cMapname);
 | |
| 		SQL_TQuery(db, DummyCallbackSimple, sQuery);
 | |
| 		PrintToChat(client, "Sorry but the time was not counted since the Table had to be created first EKSDEE- jenz");
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		Format(sQuery, sizeof(sQuery), "INSERT INTO `zetimer_table` (`steam_auth`, `name`, `%s`) VALUES ('%s', '%N', '%f') ON DUPLICATE KEY UPDATE `name` = '%N', `%s` = '%f'", g_cMapname, sSID, client, f_playerTime, client, g_cMapname, f_playerTime);
 | |
| 		SQL_TQuery(db, DummyCallbackSimple, sQuery);
 | |
| 	}
 | |
| 	
 | |
| 	delete db;
 | |
| 	delete rs;
 | |
| 	//CPrintToChatAll("reaching end, query is: %s", sQuery);
 | |
| }
 | |
| 
 | |
| public void SQL_StartConnection()
 | |
| {
 | |
| 	char error[255];
 | |
| 	Database db;
 | |
| 	if (SQL_CheckConfig("zetimer")) 
 | |
| 	{
 | |
| 		db = SQL_Connect("zetimer", true, error, sizeof(error));
 | |
| 	}
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!");
 | |
| 		delete db;
 | |
| 	}
 | |
| 	
 | |
| 	//create tables
 | |
| 	char sQuery[255];
 | |
| 	Format(sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS `zetimer_table` (`steam_auth` VARCHAR(254) NOT NULL, `name` VARCHAR(254) NOT NULL, PRIMARY KEY (`steam_auth`))");
 | |
| 	SQL_TQuery(db, DummyCallbackSimple, sQuery);
 | |
| 	Format(sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS `zetimer_tableSurf` (`steam_auth` VARCHAR(254) NOT NULL, `name` VARCHAR(254) NOT NULL, PRIMARY KEY (`steam_auth`))");
 | |
| 	SQL_TQuery(db, DummyCallbackSimple, sQuery);
 | |
| 	delete db;
 | |
| }
 | |
| 
 | |
| public float receiveMYSQLSurf(int client, float f_playerTime, int i_zoneEndIndex)
 | |
| {
 | |
| 	//variables
 | |
| 	float iCollected;
 | |
| 	char sQuery[255];
 | |
| 	char sSID[64];
 | |
| 	char error[255];
 | |
| 	DBResultSet rs;
 | |
| 	Database db;
 | |
| 	
 | |
| 	if (SQL_CheckConfig("zetimer"))
 | |
| 	{
 | |
| 		db = SQL_Connect("zetimer", true, error, sizeof(error));
 | |
| 	}
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Unloze] Error! Could not connect to MYSQL-DB!");
 | |
| 		delete db;
 | |
| 	}
 | |
| 	GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | |
| 	Format(sQuery, sizeof(sQuery), "SELECT `%sS%i` FROM `zetimer_tableSurf` WHERE steam_auth = '%s'", g_cMapname, i_zoneEndIndex, sSID);
 | |
| 	//PrintToChatAll("receiveMYSQLSurf sQuery: %s", sQuery);
 | |
| 	if ((rs = SQL_Query(db, sQuery)) == null)
 | |
| 	{
 | |
| 		delete db;
 | |
| 		delete rs;
 | |
| 		return 0.0;
 | |
| 	}
 | |
| 	
 | |
| 	if (SQL_FetchRow(rs))
 | |
| 	{
 | |
| 		iCollected = SQL_FetchFloat(rs, 0);
 | |
| 	}
 | |
| 	
 | |
| 	delete rs;
 | |
| 	delete db;
 | |
| 	return iCollected;
 | |
| }
 | |
| 
 | |
| public void mysqlLoadNames(int client)
 | |
| {
 | |
| 	char error[255];
 | |
| 	char sQuery[255];
 | |
| 	char sSID[64];
 | |
| 	Database db;
 | |
| 	DBResultSet rs;
 | |
| 	
 | |
| 	if (SQL_CheckConfig("zetimer")) 
 | |
| 	{
 | |
| 		db = SQL_Connect("zetimer", true, error, sizeof(error));
 | |
| 	}
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!");
 | |
| 		delete db;
 | |
| 	}
 | |
| 	
 | |
| 	char cClient[250];
 | |
| 	Format(cClient, sizeof(cClient), "%N", client);
 | |
| 	
 | |
| 	if (StrContains(cClient, "'") >= 0)
 | |
| 	{
 | |
| 		ReplaceString(cClient, sizeof(cClient), "'", "", false);
 | |
| 	}
 | |
| 	
 | |
| 	GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | |
| 	Format(sQuery, sizeof(sQuery), "UPDATE `zetimer_table` SET `name`= '%s' WHERE `steam_auth` = '%s'", cClient, sSID);
 | |
| 	SQL_TQuery(db, DummyCallbackSimple, sQuery);
 | |
| 	Format(sQuery, sizeof(sQuery), "UPDATE `zetimer_tableSurf` SET `name`= '%s' WHERE `steam_auth` = '%s'", cClient, sSID);
 | |
| 	SQL_TQuery(db, DummyCallbackSimple, sQuery);
 | |
| 	delete rs;
 | |
| 	delete db;
 | |
| }
 | |
| 
 | |
| public Action MysqlCheckSurfStage(int client, int count)
 | |
| {
 | |
| 	if (g_bSmap == false)
 | |
| 	{
 | |
| 		CPrintToChat(client, "[UNLOZE] Does not support Surf zones");
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 	
 | |
| 	Database db;
 | |
| 	char sQuery[512];
 | |
| 	char error[255];
 | |
| 	
 | |
| 	if (SQL_CheckConfig("zetimer"))
 | |
| 	{
 | |
| 		db = SQL_Connect("zetimer", true, error, sizeof(error));
 | |
| 	}
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Unloze] Error! Could not connect to MYSQL-DB!");
 | |
| 		delete db;
 | |
| 	}
 | |
| 	Format(sQuery, sizeof(sQuery), "SELECT name, %sS%i FROM `zetimer_tableSurf` WHERE %sS%i > 0.000 ORDER BY %sS%i ASC LIMIT 10", g_cMapname, count, g_cMapname, count, g_cMapname, count);
 | |
| 	db.Query(SQL_SelectTop_Callback, sQuery, GetClientSerial(client), DBPrio_Normal);
 | |
| 	//CPrintToChat(client, " ");
 | |
| 	delete db;
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: Chat Command for Race timer
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| 
 | |
| public Action cmd_timerCheck(int client, int args)
 | |
| {	
 | |
| 	if (g_bRmap == false)
 | |
| 	{
 | |
| 		CPrintToChat(client, "[UNLOZE] Does not support race zones");
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 	Database db;
 | |
| 	char sQuery[512];
 | |
| 	char error[555];
 | |
| 	
 | |
| 	if (SQL_CheckConfig("zetimer"))
 | |
| 	{
 | |
| 		db = SQL_Connect("zetimer", true, error, sizeof(error));
 | |
| 	}
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		CPrintToChatAll("{green}[Unloze] Error! Could not connect to MYSQL-DB!");
 | |
| 		delete db;
 | |
| 	}
 | |
| 	g_iSurf[client] = 0;
 | |
| 	Format(sQuery, sizeof(sQuery), "SELECT name, %s FROM `zetimer_table` WHERE %s > 0.000 ORDER BY %s ASC LIMIT 10", g_cMapname, g_cMapname, g_cMapname);
 | |
| 	db.Query(SQL_SelectTop_Callback, sQuery, GetClientSerial(client), DBPrio_Normal);
 | |
| 	
 | |
| 	delete db;
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: Chat Command for Surf timer
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| 
 | |
| public Action cmd_timerCheckS1(int client, int args)
 | |
| {
 | |
| 	g_iSurf[client] = 1;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action cmd_timerCheckS2(int client, int args)
 | |
| {		
 | |
| 	g_iSurf[client] = 2;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action cmd_timerCheckS3(int client, int args)
 | |
| {		
 | |
| 	g_iSurf[client] = 3;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action cmd_timerCheckS4(int client, int args)
 | |
| {		
 | |
| 	g_iSurf[client] = 4;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action cmd_timerCheckS5(int client, int args)
 | |
| {		
 | |
| 	g_iSurf[client] = 5;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action cmd_timerCheckS6(int client, int args)
 | |
| {		
 | |
| 	g_iSurf[client] = 6;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action cmd_timerCheckS7(int client, int args)
 | |
| {		
 | |
| 	g_iSurf[client] = 7;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action cmd_timerCheckS8(int client, int args)
 | |
| {		
 | |
| 	g_iSurf[client] = 8;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action cmd_timerCheckS9(int client, int args)
 | |
| {		
 | |
| 	g_iSurf[client] = 9;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action cmd_timerCheckS010(int client, int args)
 | |
| {		
 | |
| 	g_iSurf[client] = 10;
 | |
| 	MysqlCheckSurfStage(client, g_iSurf[client]);
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: Menus
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public int MenuHandler1(Menu menu, MenuAction action, int param1, int param2)
 | |
| {
 | |
| 	
 | |
| 	/* If the menu was cancelled, print a message to the server about it. */
 | |
| 	if (action == MenuAction_Cancel)
 | |
| 	{
 | |
| 		PrintToServer("Client %d's menu was cancelled.  Reason: %d", param1, param2);
 | |
| 	}
 | |
| 	/* If the menu has ended, destroy it */
 | |
| 	else if (action == MenuAction_End)
 | |
| 	{
 | |
| 		delete menu;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: Roundstart/roundend, Postadmincheck, disconnect
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| 
 | |
| public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast)
 | |
| {
 | |
| 	for (int i = 1; i < MaxClients; i++)
 | |
| 	{
 | |
| 		if (IsValidClient(i))
 | |
| 		{
 | |
| 			g_fPlayertimes[i] = 0.0;
 | |
| 			g_bMessage[i] = false;
 | |
| 			g_fEngineRoundtimeSurf[i] = 0.0;
 | |
| 			g_fEngineSecondsSurf[i] = 0.0;
 | |
| 			g_iEngine_minutesSurf[i] = 0;
 | |
| 			
 | |
| 			g_iCurrentS[i] = -1;
 | |
| 			g_iSurf[i] = 0;
 | |
| 		}
 | |
| 	}
 | |
| 	g_fEngineRoundtime = 0.0;
 | |
| 	g_iEngine_minutes = 0;
 | |
| 	g_fEngineSeconds = 0.0;
 | |
| 	CreateTimer(0.1, Timer_CountdownRace, _, TIMER_REPEAT);
 | |
| 	g_bRoundend = false;
 | |
| }
 | |
| 
 | |
| public void Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast)
 | |
| {
 | |
| 	g_bRoundend = true;
 | |
| }
 | |
| public void OnClientDisconnect(int client)
 | |
| {
 | |
| 	//disconnect is triggered on each map switch
 | |
| 	g_bMessage[client] = false;
 | |
| 	g_fPlayertimes[client] = 0.0;
 | |
| 	g_fEngineRoundtimeSurf[client] = 0.0;
 | |
| 	g_fEngineSecondsSurf[client] = 0.0;
 | |
| 	g_iEngine_minutesSurf[client] = 0;
 | |
| 	g_iCurrentS[client] = 0;
 | |
| 	g_iSurf[client] = 0;
 | |
| 	g_bStopTimer[client] = false;
 | |
| }
 | |
| 
 | |
| public void OnClientPostAdminCheck(int client)
 | |
| {
 | |
| 	g_bMessage[client] = false;
 | |
| 	g_fPlayertimes[client] = 0.0;
 | |
| 	g_fEngineRoundtimeSurf[client] = 0.0;
 | |
| 	g_fEngineSecondsSurf[client] = 0.0;
 | |
| 	g_iEngine_minutesSurf[client] = 0;
 | |
| 	g_iCurrentS[client] = 0;
 | |
| 	g_iSurf[client] = 0;
 | |
| 	g_bStopTimer[client] = true;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: Counting maptime functions
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| 
 | |
| //Callback for timer
 | |
| public Action Timer_CountdownRace(Handle timer, any data)
 | |
| {	
 | |
| 	if (g_bRoundend)
 | |
| 	{
 | |
| 		return Plugin_Stop;
 | |
| 	}
 | |
| 	
 | |
| 	g_fEngineRoundtime += 0.1;
 | |
| 	g_fEngineSeconds += 0.1;
 | |
| 	if (g_fEngineSeconds >= 60.0)
 | |
| 	{
 | |
| 		g_iEngine_minutes += 1;
 | |
| 		g_fEngineSeconds = 0.0;
 | |
| 	}
 | |
| 	
 | |
| 	return Plugin_Changed;
 | |
| }
 | |
| 
 | |
| 
 | |
| public Action Timer_CountdownSurf(Handle timer, int client)
 | |
| {	
 | |
| 	if (g_iCurrentS[client] == -1 || !g_bStopTimer[client])
 | |
| 	{
 | |
| 		if (g_hSurfTimer[client] != INVALID_HANDLE)
 | |
| 		{
 | |
| 			delete g_hSurfTimer[client];	
 | |
| 		}
 | |
| 		return Plugin_Stop;
 | |
| 	}
 | |
| 	//PrintToChatAll("g_fEngineRoundtimeSurf: %f", g_fEngineRoundtimeSurf[client]);
 | |
| 	//PrintToChatAll("g_fEngineSecondsSurf: %f", g_fEngineSecondsSurf[client]);
 | |
| 	g_fEngineRoundtimeSurf[client] += 0.1;
 | |
| 	g_fEngineSecondsSurf[client] += 0.1;
 | |
| 	if (g_fEngineSecondsSurf[client] >= 60.0)
 | |
| 	{
 | |
| 		g_iEngine_minutesSurf[client] += 1;
 | |
| 		g_fEngineSecondsSurf[client] = 0.0;
 | |
| 	}
 | |
| 	
 | |
| 	return Plugin_Changed;
 | |
| }
 | |
| 
 | |
| public void ZR_OnClientInfected(int client, int attacker, bool motherInfect, bool respawnOverride, bool respawn)
 | |
| {
 | |
| 	g_iCurrentS[client] = -1;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: zone forwards
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void unloze_zoneLeave(int client, char [] zone)
 | |
| {	
 | |
| 	if (IsValidClient(client) && GetClientTeam(client) == 3 && StrContains(zone, "ZONE_PREFIX_SURF_S", false) >= 0)
 | |
| 	{
 | |
| 		//PrintToChatAll("unloze_zoneLeave succesfull: %s", zone);
 | |
| 		g_fEngineRoundtimeSurf[client] = 0.0;
 | |
| 		g_fEngineSecondsSurf[client] = 0.0;
 | |
| 		g_iEngine_minutesSurf[client] = 0;
 | |
| 		g_iCurrentS[client] = -1;
 | |
| 		
 | |
| 		//createtime only one per player
 | |
| 		g_hSurfTimer[client] = CreateTimer(0.1, Timer_CountdownSurf, client, TIMER_REPEAT);
 | |
| 		g_iCurrentS[client] = 0;
 | |
| 	}
 | |
| }
 | |
| public void unloze_zoneEntry(int client, char[] zone)
 | |
| {	
 | |
| 	float oldTime[MAXPLAYERS];
 | |
| 	//ZONE_PREFIX_RACE
 | |
| 	
 | |
| 	if (IsValidClient(client) && GetClientTeam(client) == 3 && StrContains(zone, ZONE_PREFIX_RACE, false) >= 0)
 | |
| 	{
 | |
| 		g_bRmap = true;
 | |
| 	
 | |
| 		g_fPlayertimes[client] = g_fEngineRoundtime;
 | |
| 		
 | |
| 		if (g_bMessage[client] == true)
 | |
| 		{
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		CPrintToChat(client, "{green}[Unloze] Client: %N \nTime: %i:%f", client, g_iEngine_minutes, g_fEngineSeconds);
 | |
| 		oldTime[client] = receiveMYSQL(client, g_fPlayertimes[client]);
 | |
| 	
 | |
| 		int engine_cMin = 0;
 | |
| 		float engine_cSec = 0.0;
 | |
| 		engine_cMin = RoundToFloor(oldTime[client] / 60);
 | |
| 		engine_cSec = oldTime[client] - (engine_cMin * 60);
 | |
| 		CPrintToChat(client, "Your record: 0%i:%f \n Command: !toptime", engine_cMin, engine_cSec);
 | |
| 		
 | |
| 		if (g_fPlayertimes[client] < oldTime[client] || oldTime[client] == -1.000000 || oldTime[client] == 0.000000)
 | |
| 		{	
 | |
| 			sendMYSQL(client, g_fPlayertimes[client]);
 | |
| 			CPrintToChat(client, "Updated timer");
 | |
| 		}
 | |
| 		g_bMessage[client] = true;
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	//everything below here is only for ZONE_PREFIX_SURF
 | |
| 	
 | |
| 	if (StrContains(zone, "ZONE_PREFIX_SURF_S", false) >= 0)
 | |
| 	{
 | |
| 		//When the first client enters the surf gets unlocked
 | |
| 		//else do nothing with surf start zoneEntry
 | |
| 		g_bSmap = true;
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (StrContains(zone, "ZONE_PREFIX_SURF_E", false) < 0)
 | |
| 	{
 | |
| 		//if client entered non surf end zone stop
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	char out[64];
 | |
| 	//stops timer unsafe?
 | |
| 	g_iCurrentS[client] = -1;
 | |
| 	
 | |
| 	
 | |
| 	if (StrContains(zone, "10", false) < 0)
 | |
| 	{
 | |
| 		Regexmatcher(zone, out, sizeof(out));
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		Format(out, sizeof(out), "10");
 | |
| 	}
 | |
| 	if (GetClientTeam(client) != 3)
 | |
| 	{
 | |
| 		return;
 | |
| 	}
 | |
| 	int i_zoneEndIndex;
 | |
| 	int engine_cMinS1 = 0;
 | |
| 	float engine_cSecS1 = 0.0;
 | |
| 	//PrintToChatAll("zone: %s", zone);
 | |
| 	//PrintToChatAll("out: %s", out);
 | |
| 	i_zoneEndIndex = StringToInt(out);
 | |
| 	
 | |
| 	
 | |
| 	g_fPlayertimes[client] = g_fEngineRoundtimeSurf[client];
 | |
| 	oldTime[client] = receiveMYSQLSurf(client, g_fPlayertimes[client], i_zoneEndIndex);
 | |
| 	//CPrintToChat(client, "oldTime[%N] ZONE_PREFIX_SURF: %f", client, oldTime[client]);
 | |
| 	
 | |
| 	CPrintToChat(client, "{green}[UNLOZE] Client: %N \nTime: %i:%f", client, g_iEngine_minutesSurf[client], g_fEngineSecondsSurf[client]);
 | |
| 	
 | |
| 	engine_cMinS1 = RoundToFloor(oldTime[client] / 60);
 | |
| 	engine_cSecS1 = oldTime[client] - (engine_cMinS1 * 60);
 | |
| 	
 | |
| 	CPrintToChat(client, "Your record Stage %i: 0%i:%f \n Command: !s%i", i_zoneEndIndex, engine_cMinS1, engine_cSecS1, i_zoneEndIndex);		
 | |
| 	
 | |
| 	if (g_fPlayertimes[client] < oldTime[client] || oldTime[client] <= 0.000000)
 | |
| 	{
 | |
| 		sendMYSQLSurf(client, g_fPlayertimes[client], i_zoneEndIndex);
 | |
| 		CPrintToChat(client, "Updated surftimer");
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: stocks
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| stock bool IsValidClient(int client)
 | |
| {
 | |
|     if (client > 0 && client <= MaxClients && IsClientInGame(client) && !IsFakeClient(client) && IsPlayerAlive(client))
 | |
|     {
 | |
|         return true;
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| stock void Regexmatcher(const char[] message, char[] out, int maxlen)
 | |
| {
 | |
|         Regex regex = CompileRegex("[0-9]");
 | |
|         //the match is needed for getsubstring apperently
 | |
|         regex.Match(message);
 | |
|         regex.GetSubString(0, out, maxlen);
 | |
| }
 | |
| 
 | |
| public void DummyCallbackSimple(Handle hOwner, Handle hChild, const char[] err, DataPack pack1)
 | |
| {
 | |
| 	if (hOwner == null || hChild == null)
 | |
| 	{
 | |
| 		LogError("Query error. (%s)", err);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| stock void SQL_FetchClientName(int client, Database database, char[] buffer, int size)
 | |
| {
 | |
| 	char sName[MAX_NAME_LENGTH];
 | |
| 	GetClientName(client, sName, sizeof(sName));
 | |
| 
 | |
| 	int size2 = 2 * strlen(sName) + 1;
 | |
| 	char[] sEscapedName = new char[size2 + 1];
 | |
| 	SQL_EscapeString(database, sName, sEscapedName, size2 + 1);
 | |
| 
 | |
| 	strcopy(buffer, size, sEscapedName);
 | |
| } |