From 7439a6b7eb65408d0fcad046cc1bfca49c6f0f55 Mon Sep 17 00:00:00 2001 From: jenzur Date: Tue, 23 Jul 2019 20:53:06 +0200 Subject: [PATCH] updating some stuff, adding a hud, making some checks against admin abuse and afk teleports --- RaceTimer/scripting/unloze_racetimer_redux.sp | 523 +++++++++--------- .../scripting/unloze_racetimer_specialmaps.sp | 2 +- 2 files changed, 257 insertions(+), 268 deletions(-) diff --git a/RaceTimer/scripting/unloze_racetimer_redux.sp b/RaceTimer/scripting/unloze_racetimer_redux.sp index 42bb682b..84107871 100644 --- a/RaceTimer/scripting/unloze_racetimer_redux.sp +++ b/RaceTimer/scripting/unloze_racetimer_redux.sp @@ -1,7 +1,7 @@ #pragma semicolon 1 #define DEBUG #define PLUGIN_AUTHOR "jenz" -#define PLUGIN_VERSION "1.4" +#define PLUGIN_VERSION "1.5" #define g_dLength 256 #define g_dIndex 65 #include @@ -16,22 +16,23 @@ char g_cMapname[g_dLength]; char g_cSpecialMapStart[g_dLength]; char g_cSpecialMapEnd[g_dLength]; static char g_sConfigzones[PLATFORM_MAX_PATH]; -float g_fRoundMinutes; +int g_iRoundMinutes; float g_fRoundSeconds; -float g_fMinutesIndividual[MAXPLAYERS + 1]; +int g_iMinutesIndividual[MAXPLAYERS + 1]; float g_fSecondsIndividual[MAXPLAYERS + 1]; float g_fRecordSeconds[g_dIndex + 1][100]; +float g_fClientVectors[MAXPLAYERS + 1][3]; int g_iRecordMinutes[g_dIndex + 1][100]; +int g_iClientFrames[MAXPLAYERS + 1]; +int g_iClientSpeedInterval[MAXPLAYERS + 1]; //100 because we have a total of 53 race zones right now -int g_iRaceCount[MAXPLAYERS + 1]; -int g_iTableCountID; //testing int g_iClientStage[MAXPLAYERS + 1]; int g_iClientChecking[MAXPLAYERS + 1]; -bool g_bMessage[g_dIndex + 1][MAXPLAYERS + 1]; bool g_bDisplaySpecial; -bool g_bRecentTimes[MAXPLAYERS + 1]; +bool g_bHumansAllowedTime[MAXPLAYERS + 1]; Database g_dDatabase; +Handle hText; public Plugin myinfo = { name = "UNLOZE_racetimer_css", @@ -49,10 +50,11 @@ public void OnPluginStart() RegConsoleCmd("sm_toptime", cmd_timerCheckTop, "checking top 10"); RegConsoleCmd("sm_mytime", cmd_timerCheckSelf, "checking your personal time"); RegConsoleCmd("sm_stages", cmd_timerCheckStage, "Checking race stages"); - RegAdminCmd("sm_threadtestresult", cmd_threadtest, ADMFLAG_BAN); //hooks HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy); -} + //HUD + hText = CreateHudSynchronizer(); +} //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- @@ -68,6 +70,13 @@ public void OnMapStart() //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- +public void OnPluginEnd() +{ + CloseHandle(hText); +} +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void startTimer() { char line[g_dLength]; @@ -95,7 +104,7 @@ public Action Timer_CountdownRace(Handle timer, any data) g_fRoundSeconds += 0.1; if (g_fRoundSeconds >= 60.0) { - g_fRoundMinutes += 1.0; + g_iRoundMinutes += 1; g_fRoundSeconds = 0.0; } } @@ -104,17 +113,14 @@ public Action Timer_CountdownRace(Handle timer, any data) //---------------------------------------------------------------------------------------------------- public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast) { - g_fRoundMinutes = 0.0; + g_iRoundMinutes = 0; g_fRoundSeconds = 0.0; - int l_iRaceZoneCount = GetTotalRaceZones(); for (int i = 1; i <= MaxClients; i++) if (IsValidClient(i)) { MYSQLCheckRecord(i); - for (int j = 0; j <= l_iRaceZoneCount; j++) - g_bMessage[i][j] = false; - } - + g_bHumansAllowedTime[i] = false; + } } //---------------------------------------------------------------------------------------------------- // Purpose: @@ -123,6 +129,7 @@ public void OnClientPostAdminCheck(int client) { resetClient(client); MYSQLCheckRecord(client); + g_bHumansAllowedTime[client] = false; } //---------------------------------------------------------------------------------------------------- // Purpose: @@ -136,60 +143,144 @@ public void OnClientDisconnect(int client) //---------------------------------------------------------------------------------------------------- public void resetClient(int client) { - int l_iRaceZoneCount = GetTotalRaceZones(); - for (int j = 0; j <= l_iRaceZoneCount; j++) - g_bMessage[client][j] = false; - g_bRecentTimes[client] = false; g_fSecondsIndividual[client] = 0.0; - g_fMinutesIndividual[client] = 0.0; + g_iMinutesIndividual[client] = 0; g_iClientChecking[client] = 0; g_iClientStage[client] = 0; - for (int i = 0; i < 100; i++) + g_bHumansAllowedTime[client] = false; + resetClientVectors(client); + for (int iterator = 0; iterator < 100; iterator++) { - g_iRecordMinutes[client][i] = 0; - g_fRecordSeconds[client][i] = 0.0; + g_iRecordMinutes[client][iterator] = 0; + g_fRecordSeconds[client][iterator] = 0.0; } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- +public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2]) +{ + if (g_bHumansAllowedTime[client] && (GetClientTeam(client) == CS_TEAM_CT)) + { + int frameCap = 11; + if (g_iClientFrames[client] >= frameCap) + { + g_iClientFrames[client] = 0; + float clientVectors[3]; + GetClientAbsOrigin(client, clientVectors); + if (checkClientOrigin(g_fClientVectors[client], clientVectors, client, vel)) + { + g_bHumansAllowedTime[client] = false; + resetClientVectors(client); + PrintToChat(client, "Disabled timer due to potential teleport abuse"); + return Plugin_Continue; + } + int speedCheckerCap = 10; + if (g_iClientSpeedInterval[client] > speedCheckerCap) + { + g_iClientSpeedInterval[client] = 0; + bool bNoclip = (GetEntityMoveType(client) == MOVETYPE_NOCLIP); + if (bNoclip) + { + g_bHumansAllowedTime[client] = false; + resetClientVectors(client); + PrintToChat(client, "Disabled timer due to Noclip"); + return Plugin_Continue; + } + float speed = GetEntPropFloat(client, Prop_Data, "m_flLaggedMovementValue"); + if (speed > 1.0) + { + g_bHumansAllowedTime[client] = false; + resetClientVectors(client); + PrintToChat(client, "Disabled timer due to modified run speed"); + return Plugin_Continue; + } + float client_gravity = GetEntityGravity(client); + ConVar gravity = FindConVar("sv_gravity"); + float gravityFloat = gravity.FloatValue; + int minimalPermitedGravity = 650; + //PrintToChat(client, "client_gravity: %f\ngravityFloat: %f", client_gravity, gravityFloat); + if (!(client_gravity == 1.0 || client_gravity == 0.0000) || gravityFloat < minimalPermitedGravity) + { + g_bHumansAllowedTime[client] = false; + resetClientVectors(client); + PrintToChat(client, "Disabled timer due to modified gravity"); + return Plugin_Continue; + } + } + g_fClientVectors[client] = clientVectors; + { + if (hText != INVALID_HANDLE) + { + SetHudTextParams(0.35, 0.7, 0.1, 125, 255, 255, 85); + int l_iCalculateMins = CalculateValuesMinutes(client); + float l_fCalculateSecs = CalculateValues(client); + ShowSyncHudText(client, hText, "%N Time: 0%i:%.1f\nRecord: 0%i:%.1f\nMap: %s\nStage: %i", client, l_iCalculateMins, + l_fCalculateSecs, g_iRecordMinutes[client][g_iClientStage[client]], g_fRecordSeconds[client][g_iClientStage[client]], + g_cMapname, g_iClientStage[client]); + } + } + g_iClientSpeedInterval[client]++; + } + g_iClientFrames[client]++; + } + return Plugin_Continue; +} +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void resetClientVectors(int client) +{ + g_fClientVectors[client][0] = 0.000000; + g_fClientVectors[client][1] = 0.000000; + g_fClientVectors[client][2] = 0.000000; +} +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public bool checkClientOrigin(float oldVals[3], float newVals[3], int client, float vel[3]) +{ + float zero = 0.000000; + int velocityCap = 600; + if ((oldVals[0] == zero && oldVals[1] == zero && oldVals[2] == zero) || (newVals[0] == zero && newVals[1] == zero && newVals[2] == zero)) + { + return false; + } + float teleport_range = 50000.0; + float distance = GetVectorDistance(oldVals, newVals, true); + //PrintToChatAll("distance: %f", distance); + bool bInAir = (GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") == -1); + if (distance > teleport_range) + { + //PrintToChat(client, "distance: %f", distance); + //PrintToChat(client, "vel[0] %f \nvel[1] %f \nvel[2] %f", vel[0], vel[1], vel[2]); + if (StrContains(g_cMapname, "surf", false) != -1) + return false; + if ((vel[0] > velocityCap || vel[1] > velocityCap || vel[2] > velocityCap) && bInAir) + return false; + return true; + } + return false; +} +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- public void unloze_zoneEntry(int client, char[] zone) { - int l_iZoneIndex = RetrieveZoneIndex(zone); + int zoneIndex = RetrieveZoneIndex(zone); int l_iZoneCount = unloze_zoneCount(); - if (((GetClientTeam(client) == CS_TEAM_CT) && StrContains(zone, "ZONE_PREFIX_RACE") > -1) || StrEqual(zone, g_cSpecialMapEnd)) + if (((GetClientTeam(client) == CS_TEAM_CT && g_bHumansAllowedTime[client]) && StrContains(zone, "ZONE_PREFIX_RACE") > -1) || StrEqual(zone, g_cSpecialMapEnd)) { - /* - PrintToChatAll("g_bMessage: %i", g_bMessage[client][g_iClientStage[client]]); - PrintToChatAll("g_iClientStage[client]: %i", g_iClientStage[client]); - PrintToChatAll("(l_iZoneIndex / 2 )-1: %i", (l_iZoneIndex / 2) -1); - */ - if (l_iZoneCount < 2 && !g_bMessage[client][0]) + if (l_iZoneCount < 2) { g_iClientStage[client] = 0; - MYSQLCheckRecord(client); - FinishedStageRaceZone(client); } - else if (g_iClientStage[client] == ((l_iZoneIndex / 2 ) -1) && !g_bMessage[client][g_iClientStage[client]]) + if (g_iClientStage[client] == (zoneIndex / 2) || l_iZoneCount < 2) { - MYSQLCheckRecord(client); FinishedStageRaceZone(client); } + g_bHumansAllowedTime[client] = false; } - /* - * COMMENTS - * forward checks if isValidClient - * - * individual seconds and minutes are zero if the client never left a zone with the name ZONE_PREFIX_START - * - * assuming each zone indexes one up RetrieveZoneIndex should match well since there has to be some kind - * of structure for this, minimum is 2 for RetrieveZoneIndex so -1 works - * - * the else return statement means for example ZONE_PREFIX_START_1 but reached ZONE_PREFIX_RACE_3 - * or ZONE_PREFIX_START_2 but ZONE_PREFIX_RACE_1 where it would need to be 3 - * - * l_iZoneIndex / 2 is stage zones, the only possible entries here are 2, 4, 6 etc etc - */ } //---------------------------------------------------------------------------------------------------- // Purpose: @@ -199,13 +290,13 @@ public void unloze_zoneLeave(int client, char[] zone) //only maps with multiple zones need ZONE_PREFIX_START if (((GetClientTeam(client) == CS_TEAM_CT) && StrContains(zone, "ZONE_PREFIX_START") > -1) || StrEqual(zone, g_cSpecialMapStart)) { + resetClientVectors(client); g_fSecondsIndividual[client] = g_fRoundSeconds; - g_fMinutesIndividual[client] = g_fRoundMinutes; - /** - * /2 is to ensure 1 + 1 / 2 = 1, 3 + 1 / 2 = 2, 5 + 1 / 2 = 3 - * - 1 for starting index at 0 and +1 for int parameter stage when inserting time to row since they start as stage 1 not stage 0 - */ - g_iClientStage[client] = ((RetrieveZoneIndex(zone) + 1) / 2) - 1; + g_iMinutesIndividual[client] = g_iRoundMinutes; + float notRounded = float(RetrieveZoneIndex(zone)); + g_iClientStage[client] = RoundToCeil(notRounded / 2); + g_bHumansAllowedTime[client] = true; + CPrintToChat(client, "Timer started for stage: %i", g_iClientStage[client]); } } //---------------------------------------------------------------------------------------------------- @@ -232,7 +323,7 @@ public void CheckifAntiZones(int client, bool reset) { //adds 30 mins and 30 seconds to a client because thats simple and very effective g_fSecondsIndividual[client] = 30.0; - g_fMinutesIndividual[client] = 30.0; + g_iMinutesIndividual[client] = 30; } } //---------------------------------------------------------------------------------------------------- @@ -241,107 +332,109 @@ public void CheckifAntiZones(int client, bool reset) public int RetrieveZoneIndex(char[] zone) { //if you leave zone_2 you want the corresponding racezone to be zone_3 - int i = strlen(zone) - 1; + int iterator = strlen(zone) - 1; char l_sZone[g_dIndex]; Format(l_sZone, sizeof(l_sZone), zone); - while (IsCharNumeric(l_sZone[i])) - i--; - i++; - strcopy(l_sZone, sizeof(l_sZone), l_sZone[i]); - return StringToInt(l_sZone[i]); + while (IsCharNumeric(l_sZone[iterator])) + iterator--; + iterator++; + strcopy(l_sZone, sizeof(l_sZone), l_sZone[iterator]); + return StringToInt(l_sZone[iterator]); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void FinishedStageRaceZone(int client) { - /* - PrintToChatAll("g_iClientStage[client]: %i", g_iClientStage[client]); - PrintToChatAll("g_iRecordMinutes[client][g_iClientStage[client]]: %i", g_iRecordMinutes[client][g_iClientStage[client]]); - PrintToChatAll("g_fRecordSeconds[client][g_iClientStage[client]]: %f", g_fRecordSeconds[client][g_iClientStage[client]]); - */ int l_iZoneCount = unloze_zoneCount(); - float l_fCalculateMins; + int l_iCalculateMins; float l_fCalculateSecs; if (g_iRecordMinutes[client][g_iClientStage[client]] > 0 || g_fRecordSeconds[client][g_iClientStage[client]] > 0.0) CPrintToChat(client, "Your record: 0%i:%.1f \nCommand: !toptime !mytime !stages", g_iRecordMinutes[client][g_iClientStage[client]], g_fRecordSeconds[client][g_iClientStage[client]]); else { if (l_iZoneCount < 2) - sendMYSQL(client, g_fRoundMinutes, g_fRoundSeconds, 0, 0.0, g_iClientStage[client]); + sendMYSQL(client, g_iRoundMinutes, g_fRoundSeconds, 0, 0.0, g_iClientStage[client]); else { - l_fCalculateMins = CalculateValues(client, 0); - l_fCalculateSecs = CalculateValues(client, 1); - sendMYSQL(client, l_fCalculateMins, l_fCalculateSecs, 0, 0.0, g_iClientStage[client]); + l_iCalculateMins = CalculateValuesMinutes(client); + l_fCalculateSecs = CalculateValues(client); + sendMYSQL(client, l_iCalculateMins, l_fCalculateSecs, 0, 0.0, g_iClientStage[client]); } CPrintToChat(client, "Updated timer"); } if (l_iZoneCount < 2) { //no start zone, we use round time - CPrintToChat(client, "{green}[UNLOZE] Client: %N Time: 0%i:%.1f", client, RoundToFloor(g_fRoundMinutes), g_fRoundSeconds); - if ((g_fRoundMinutes < g_iRecordMinutes[client][g_iClientStage[client]]) - || (g_fRoundMinutes == g_iRecordMinutes[client][g_iClientStage[client]] && g_fRoundSeconds < g_fRecordSeconds[client][g_iClientStage[client]])) + CPrintToChat(client, "{green}[UNLOZE] Client: %N Time: 0%i:%.1f", client, g_iRoundMinutes, g_fRoundSeconds); + if ((g_iRoundMinutes < g_iRecordMinutes[client][g_iClientStage[client]]) + || (g_iRoundMinutes == g_iRecordMinutes[client][g_iClientStage[client]] && g_fRoundSeconds < g_fRecordSeconds[client][g_iClientStage[client]])) { - sendMYSQL(client, g_fRoundMinutes, g_fRoundSeconds, g_iRecordMinutes[client][g_iClientStage[client]], g_fRecordSeconds[client][g_iClientStage[client]], g_iClientStage[client]); + sendMYSQL(client, g_iRoundMinutes, g_fRoundSeconds, g_iRecordMinutes[client][g_iClientStage[client]], g_fRecordSeconds[client][g_iClientStage[client]], g_iClientStage[client]); CPrintToChat(client, "Updated timer"); } } else { //uses start zone, we use time when leaving start zone - l_fCalculateMins = CalculateValues(client, 0); - l_fCalculateSecs = CalculateValues(client, 1); + l_iCalculateMins = CalculateValuesMinutes(client); + l_fCalculateSecs = CalculateValues(client); //tricking ppl !hehe - CPrintToChat(client, "{green}[UNLOZE] Stage: %i", g_iClientStage[client] + 1); - CPrintToChat(client, "{green}[UNLOZE] Client: %N Time: 0%i:%.1f", client, RoundToFloor(l_fCalculateMins), l_fCalculateSecs); - if ((RoundToFloor(l_fCalculateMins) < g_iRecordMinutes[client][g_iClientStage[client]]) - || (RoundToFloor(l_fCalculateMins) == g_iRecordMinutes[client][g_iClientStage[client]] && l_fCalculateSecs < g_fRecordSeconds[client][g_iClientStage[client]])) + CPrintToChat(client, "{green}[UNLOZE] Stage: %i", g_iClientStage[client]); + CPrintToChat(client, "{green}[UNLOZE] Client: %N Time: 0%i:%.1f", client, l_iCalculateMins, l_fCalculateSecs); + if ((l_iCalculateMins < g_iRecordMinutes[client][g_iClientStage[client]]) + || (l_iCalculateMins == g_iRecordMinutes[client][g_iClientStage[client]] && l_fCalculateSecs < g_fRecordSeconds[client][g_iClientStage[client]])) { - sendMYSQL(client, l_fCalculateMins, l_fCalculateSecs, g_iRecordMinutes[client][g_iClientStage[client]], g_fRecordSeconds[client][g_iClientStage[client]], g_iClientStage[client]); + sendMYSQL(client, l_iCalculateMins, l_fCalculateSecs, g_iRecordMinutes[client][g_iClientStage[client]], g_fRecordSeconds[client][g_iClientStage[client]], g_iClientStage[client]); CPrintToChat(client, "Updated timer"); } } //matching the message MYSQLCheckRecord(client); - g_bMessage[client][g_iClientStage[client]] = true; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public float CalculateValues(int client, int state) +public int CalculateValuesMinutes(int client) +{ + float l_fRoundSeconds = g_fRoundSeconds; + float l_fRoundSecondsIndividual = g_fSecondsIndividual[client]; + int l_iRoundMinutes = g_iRoundMinutes; + int l_iRoundMinutesIndividual = g_iMinutesIndividual[client]; + if (l_iRoundMinutesIndividual > l_iRoundMinutes) + return 0; + l_iRoundMinutes = l_iRoundMinutes - l_iRoundMinutesIndividual; + if (l_fRoundSeconds < l_fRoundSecondsIndividual) + l_iRoundMinutes--; + return l_iRoundMinutes; +} +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public float CalculateValues(int client) { // 2:24 enter with roundtime 5:29 = 3:05 // 3:01 enter with roundtime 3:59 = 58 sec //example roundtime is 5 mins 40 seconds, client entered at 4 mins and 50 seconds, so 50 sec race - float l_fRoundMinutes = g_fRoundMinutes; - float l_fRoundMinutesIndividual = g_fMinutesIndividual[client]; float l_fRoundSeconds = g_fRoundSeconds; float l_fRoundSecondsIndividual = g_fSecondsIndividual[client]; float l_fSecAdd; - if (l_fRoundMinutesIndividual > l_fRoundMinutes) - return 0.0; - if (!state) + if (l_fRoundSeconds < l_fRoundSecondsIndividual) { - l_fRoundMinutes = l_fRoundMinutes - l_fRoundMinutesIndividual; - if (l_fRoundSeconds < l_fRoundSecondsIndividual) - l_fRoundMinutes--; - return l_fRoundMinutes; + while (l_fRoundSecondsIndividual < 60) + { + l_fRoundSecondsIndividual++; + l_fSecAdd++; + } + float returnvalue = l_fSecAdd + l_fRoundSeconds; + //PrintToChat(client, "returnvalue float: %f", returnvalue); + return returnvalue; } else { - if (l_fRoundSeconds < l_fRoundSecondsIndividual) - { - while (l_fRoundSecondsIndividual < 60) - { - l_fRoundSecondsIndividual++; - l_fSecAdd++; - } - return l_fSecAdd + l_fRoundSeconds; - } - else - return l_fRoundSeconds - l_fRoundSecondsIndividual; + float returnvalueminus = l_fRoundSeconds - l_fRoundSecondsIndividual; + //PrintToChat(client, "returnvalueminus float: %f", returnvalueminus); + return returnvalueminus; } } //---------------------------------------------------------------------------------------------------- @@ -359,9 +452,9 @@ public void MYSQLCheckMapEntry() SQL_TQuery(g_dDatabase, TqueryThreadCallback, sQuery); } else - for (int i = 0; i <= l_iZoneCount; i++) + for (int iterator = 0; iterator <= l_iZoneCount; iterator++) { - if (IsCorrectZone(i, l_cZoneIndexName[i][g_dLength -1], "ZONE_PREFIX_RACE")) + if (IsCorrectZone(iterator, l_cZoneIndexName[iterator][g_dLength -1], "ZONE_PREFIX_RACE")) { l_iRaceCount++; Format(sQuery, sizeof(sQuery), "SELECT `%sS%i` FROM `zetimer_table` LIMIT 1", g_cMapname, l_iRaceCount); @@ -372,50 +465,10 @@ public void MYSQLCheckMapEntry() //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public void TqueryThreadRecentCheckStageSteamID(Handle owner, Handle rs, const char[] error, any data) -{ - int client = 0; - if (!(client = GetClientOfUserId(data))) - return; - g_bRecentTimes[client] = false; - if (SQL_GetRowCount(rs) > 0 && SQL_FetchRow(rs)) - { - g_bRecentTimes[client] = true; - g_iTableCountID = SQL_FetchInt(rs, 0); - } -} -//---------------------------------------------------------------------------------------------------- -// Purpose: we define the last 500 updated times as "recently", this indicates that recent times will display 500 and not more -//--------------------------------------------------------------------------------------------------- -public void TqueryThreadRecentTimesCount(Handle owner, Handle rs, const char[] error, any data) -{ - if (SQL_GetRowCount(rs) > 0 && SQL_FetchRow(rs)) - { - int l_isize = SQL_GetRowCount(rs); - if (l_isize >= 500) - g_iTableCountID = 1; - else - g_iTableCountID = 0; - } -} -//---------------------------------------------------------------------------------------------------- -// Purpose: -//---------------------------------------------------------------------------------------------------- -public void TqueryThreadRecentCount(Handle owner, Handle rs, const char[] error, any data) -{ - if (SQL_GetRowCount(rs) > 0 && SQL_FetchRow(rs)) - { - g_iTableCountID = SQL_FetchInt(rs, 0); - } -} -//---------------------------------------------------------------------------------------------------- -// Purpose: -//---------------------------------------------------------------------------------------------------- public void TqueryThreadCallback(Handle owner, Handle rs, const char[] error, any data) { int l_iRaceCount; int l_iZoneCount = unloze_zoneCount(); - int l_iCountFix = GetTotalRaceZones(); int client = 0; float l_fRecordTotal; char sQuery[g_dLength]; @@ -433,9 +486,9 @@ public void TqueryThreadCallback(Handle owner, Handle rs, const char[] error, an else { //this might seem repetitive but one null check adds all required coloumns - for (int i = 0; i <= l_iZoneCount; i++) + for (int iterator = 0; iterator <= l_iZoneCount; iterator++) { - if (IsCorrectZone(i, l_cZoneIndexName[i][g_dLength -1], "ZONE_PREFIX_RACE")) + if (IsCorrectZone(iterator, l_cZoneIndexName[iterator][g_dLength -1], "ZONE_PREFIX_RACE")) { l_iRaceCount++; Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table` ADD COLUMN `%sS%i` DECIMAL(13,3) NOT NULL", g_cMapname, l_iRaceCount); @@ -447,22 +500,29 @@ public void TqueryThreadCallback(Handle owner, Handle rs, const char[] error, an } if (!(client = GetClientOfUserId(data))) return; - if (l_iCountFix < g_iRaceCount[client]) + int rowsize = SQL_GetRowCount(rs); + if (rowsize > 0 && SQL_FetchRow(rs)) { - g_iRaceCount[client] = 0; - } - if (SQL_GetRowCount(rs) > 0 && SQL_FetchRow(rs)) - { - l_fRecordTotal = SQL_FetchFloat(rs, 0); - g_iRecordMinutes[client][g_iRaceCount[client]] = (RoundToFloor(l_fRecordTotal)); - g_fRecordSeconds[client][g_iRaceCount[client]] = (l_fRecordTotal - g_iRecordMinutes[client][g_iRaceCount[client]]) * 100; + g_iClientStage[client] = 0; + int fieldSize = SQL_GetFieldCount(rs); + for (int iterate = 0; iterate < fieldSize; iterate++) + { + l_fRecordTotal = SQL_FetchFloat(rs, iterate); + g_iClientStage[client]++; + g_iRecordMinutes[client][g_iClientStage[client]] = (RoundToFloor(l_fRecordTotal)); + g_fRecordSeconds[client][g_iClientStage[client]] = (l_fRecordTotal - g_iRecordMinutes[client][g_iClientStage[client]]) * 100; + /* + PrintToChat(client, "g_iRecordMinutes[client][g_iClientStage[client]]: %i\ng_fRecordSeconds[client][g_iClientStage[client]] %f", + g_iRecordMinutes[client][g_iClientStage[client]], g_fRecordSeconds[client][g_iClientStage[client]]); + PrintToChat(client, "g_iClientStage[client]: %i", g_iClientStage[client]); + */ + } } else { - g_iRecordMinutes[client][g_iRaceCount[client]] = 0; - g_fRecordSeconds[client][g_iRaceCount[client]] = 0.0; + g_iRecordMinutes[client][g_iClientStage[client]] = 0; + g_fRecordSeconds[client][g_iClientStage[client]] = 0.0; } - g_iRaceCount[client]++; } //---------------------------------------------------------------------------------------------------- // Purpose: TODO implement if needed @@ -472,10 +532,10 @@ public int GetTotalRaceZones() int l_iZoneCount = unloze_zoneCount(); char l_cIndexName[g_dLength]; int l_iCountRace; - for (int i = 0; i < l_iZoneCount; i++) + for (int iterator = 0; iterator < l_iZoneCount; iterator++) { - ZoneNameBasedOnIndex(i, l_cIndexName[i]); - if (StrContains(l_cIndexName[i], "ZONE_PREFIX_RACE") > -1) + ZoneNameBasedOnIndex(iterator, l_cIndexName[iterator]); + if (StrContains(l_cIndexName[iterator], "ZONE_PREFIX_RACE") > -1) l_iCountRace++; } return l_iCountRace; @@ -483,17 +543,16 @@ public int GetTotalRaceZones() //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public void sendMYSQL(int client, float minutes, float seconds, int oldminutes, float oldseconds, int stage) +public void sendMYSQL(int client, int minutes, float seconds, int oldminutes, float oldseconds, int stage) { int l_iZoneCount = unloze_zoneCount(); - float l_fPlayerTime; + float l_fPlayerTime = float(minutes); float l_fPlayerTimeOld; char sSID[g_dIndex]; char l_cClientName[g_dIndex]; char l_cStage[90]; char sQuery[g_dLength]; char sName[MAX_NAME_LENGTH]; - stage++; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); GetClientName(client, sName, sizeof(sName)); int size2 = 2 * strlen(sName) + 1; @@ -501,9 +560,8 @@ public void sendMYSQL(int client, float minutes, float seconds, int oldminutes, SQL_EscapeString(g_dDatabase, sName, sEscapedName, size2 + 1); Format(l_cClientName, sizeof(l_cClientName), sEscapedName); //STEAM_ID_STOP_IGNORING_RETVALS might be considered exploit? - if (StrEqual(sSID, "STEAM_ID_STOP_IGNORING_RETVALS")) + if (StrEqual(sSID, "STEAM_ID_STOP_IGNORING_RETVALS") || StrEqual(sSID, "STEAM_ID_PENDING")) return; - l_fPlayerTime = minutes; l_fPlayerTime = l_fPlayerTime + (seconds / 100); if (oldminutes != 0 || oldseconds != 0.0) { @@ -513,13 +571,13 @@ public void sendMYSQL(int client, float minutes, float seconds, int oldminutes, Format(l_cStage, sizeof(l_cStage), "%sS%i", g_cMapname, stage); else Format(l_cStage, sizeof(l_cStage), "%s", g_cMapname); - MYSQLSafeTime(client, l_cStage, l_fPlayerTimeOld); } if (l_iZoneCount < 2) Format(sQuery, sizeof(sQuery), "INSERT INTO `zetimer_table` (`steam_auth`, `name`, `%s`) VALUES ('%s', '%s', '%f') ON DUPLICATE KEY UPDATE `name` = '%s', `%s` = '%f'", g_cMapname, sSID, l_cClientName, l_fPlayerTime, l_cClientName, g_cMapname, l_fPlayerTime); else Format(sQuery, sizeof(sQuery), "INSERT INTO `zetimer_table` (`steam_auth`, `name`, `%sS%i`) VALUES ('%s', '%s', '%f') ON DUPLICATE KEY UPDATE `name` = '%s', `%sS%i` = '%f'", g_cMapname, stage, sSID, l_cClientName, l_fPlayerTime, l_cClientName, g_cMapname, stage, l_fPlayerTime); SQL_TQuery(g_dDatabase, DummyCallbackSimple, sQuery); + //PrintToChatAll("SEND MYSQL sQuery: %s", sQuery); } //---------------------------------------------------------------------------------------------------- // Purpose: @@ -537,86 +595,36 @@ public void SQL_StartConnection() char sQuery[g_dLength]; 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(g_dDatabase, DummyCallbackSimple, sQuery); - Format(sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS `unloze_racetimer_css`.`recenttimes_table` (`ID` INT NOT NULL AUTO_INCREMENT, `Steam_auth` VARCHAR(45) NOT NULL, `Stage` VARCHAR(90) NOT NULL, `Oldtime` VARCHAR(45) NOT NULL, PRIMARY KEY (`ID`)) ENGINE = InnoDB;"); - SQL_TQuery(g_dDatabase, DummyCallbackSimple, sQuery); - Format(sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS `unloze_racetimer_css`.`recenttimes_tableCount` (`ID` INT NOT NULL, PRIMARY KEY (`ID`)) ENGINE = InnoDB;"); - SQL_TQuery(g_dDatabase, DummyCallbackSimple, sQuery); -} -//---------------------------------------------------------------------------------------------------- -// Purpose: -//---------------------------------------------------------------------------------------------------- -public void MYSQLSafeTime(int client, char[] stage, float oldtime) -{ - char sSID[g_dIndex]; - char sQuery[g_dLength]; - GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); - //maybe %f is questionable here - //check if same steam ID on same Stage is present - Format(sQuery, sizeof(sQuery), "SELECT * FROM `recenttimes_table` WHERE `Steam_auth` = '%s' AND `Stage` = '%s'", sSID, stage); - SQL_TQuery(g_dDatabase, TqueryThreadRecentCheckStageSteamID, sQuery, client); - if (g_bRecentTimes[client]) - { - Format(sQuery, sizeof(sQuery), "UPDATE `recenttimes_table` SET `Steam_auth` = '%s', `Stage` = '%s', `Oldtime` = '%f' WHERE `ID`='%i'", sSID, stage, oldtime, g_iTableCountID); - SQL_TQuery(g_dDatabase, DummyCallbackSimple, sQuery); - } - else - { - Format(sQuery, sizeof(sQuery), "SELECT * FROM `recenttimes_table`"); - SQL_TQuery(g_dDatabase, TqueryThreadRecentTimesCount, sQuery); - if (!g_iTableCountID) - { - Format(sQuery, sizeof(sQuery), "INSERT INTO `recenttimes_table` (`ID`,`Steam_auth`,`Stage`,`Oldtime`) VALUES (NULL,'%s','%s','%f')", sSID, stage, oldtime); - SQL_TQuery(g_dDatabase, DummyCallbackSimple, sQuery); - } - else - { - Format(sQuery, sizeof(sQuery), "SELECT * FROM `recenttimes_tableCount`"); - SQL_TQuery(g_dDatabase, TqueryThreadRecentCount, sQuery); - if (g_iTableCountID <= 500) - { - Format(sQuery, sizeof(sQuery), "UPDATE `recenttimes_tableCount` SET `ID` = '%i'", g_iTableCountID + 1); - SQL_TQuery(g_dDatabase, DummyCallbackSimple, sQuery); - } - else - { - Format(sQuery, sizeof(sQuery), "UPDATE `recenttimes_tableCount` SET `ID` = '1'"); - SQL_TQuery(g_dDatabase, DummyCallbackSimple, sQuery); - g_iTableCountID = 1; - } - Format(sQuery, sizeof(sQuery), "UPDATE `recenttimes_table` SET `Steam_auth` = '%s', `Stage` = '%s', `Oldtime` = '%f' WHERE `ID`='%i'", sSID, stage, oldtime, g_iTableCountID); - SQL_TQuery(g_dDatabase, DummyCallbackSimple, sQuery); - } - } + MYSQLCheckMapEntry(); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void MYSQLCheckRecord(int client) { - g_iRaceCount[client] = 0; - int l_iZoneCount = unloze_zoneCount(); - int l_iRaceCount; char sSID[g_dIndex]; char sQuery[g_dLength]; - char l_cZoneIndexName[g_dIndex][g_dLength]; + int l_iZoneCount = unloze_zoneCount(); + //PrintToChat(client, "l_iZoneCount: %i", l_iZoneCount); GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); - if (l_iZoneCount < 2) + StrCat(sQuery, sizeof(sQuery), "SELECT "); + if (l_iZoneCount > 1) { - Format(sQuery, sizeof(sQuery), "SELECT `%s` FROM `zetimer_table` WHERE steam_auth = '%s'", g_cMapname, sSID); - SQL_TQuery(g_dDatabase, TqueryThreadCallback, sQuery, GetClientUserId(client)); - } - else - { - for (int i = 0; i <= l_iZoneCount; i++) + for (int iterator = 0; iterator < l_iZoneCount / 2; iterator++) { - if (IsCorrectZone(i, l_cZoneIndexName[i][g_dLength -1], "ZONE_PREFIX_RACE")) + if (iterator > 0) { - l_iRaceCount++; - Format(sQuery, sizeof(sQuery), "SELECT `%sS%i` FROM `zetimer_table` WHERE steam_auth = '%s'", g_cMapname, l_iRaceCount, sSID); - SQL_TQuery(g_dDatabase, TqueryThreadCallback, sQuery, GetClientUserId(client)); + StrCat(sQuery, sizeof(sQuery), ","); } + char mapstage[g_dLength]; + Format(mapstage, sizeof(mapstage), "%sS%i", g_cMapname, iterator + 1); + StrCat(sQuery, sizeof(sQuery), mapstage); } - } + } else { StrCat(sQuery, sizeof(sQuery), g_cMapname); } + char endQuery[g_dLength]; + Format(endQuery, sizeof(endQuery), " FROM `zetimer_table` WHERE steam_auth = '%s'", sSID); + StrCat(sQuery, sizeof(sQuery), endQuery); + SQL_TQuery(g_dDatabase, TqueryThreadCallback, sQuery, GetClientUserId(client)); } //---------------------------------------------------------------------------------------------------- // Purpose: @@ -625,7 +633,6 @@ public void DummyCallbackSimple(Handle hOwner, Handle hChild, const char[] err, { if (hOwner == null || hChild == null) LogError("Query error. (%s)", err); - MYSQLCheckMapEntry(); } //---------------------------------------------------------------------------------------------------- // Purpose: @@ -642,16 +649,18 @@ public void CheckTop(int client, int index, int autismstate) { int l_iZoneCount = unloze_zoneCount(); char sQuery[g_dLength]; - if (!l_iZoneCount) + //PrintToChatAll("checktop l_iZoneCount: %i", l_iZoneCount); + if (l_iZoneCount < 1) { - CPrintToChat(client, "[UNLOZE] Map does not support race timer"); + PrintToChat(client, "No zones active on this map"); return; } - if (l_iZoneCount > 1 && !autismstate) + if (!autismstate) { CheckStagesOnMap(client, 0); return; } + //we have index now from menu selection if (l_iZoneCount < 2) 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); else @@ -715,29 +724,6 @@ public Action cmd_timerCheckStage(int client, int args) //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public Action cmd_threadtest(int client, int args) -{ - g_iRaceCount[client] = 0; - int l_iRaceCount; - int l_iZoneCount = unloze_zoneCount(); - char sQuery[g_dLength]; - char l_cZoneIndexName[g_dIndex][g_dLength]; - char sSID[g_dIndex]; - GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); - for (int i = 0; i <= l_iZoneCount; i++) - { - if (IsCorrectZone(i, l_cZoneIndexName[i][g_dLength -1], "ZONE_PREFIX_RACE")) - { - l_iRaceCount++; - Format(sQuery, sizeof(sQuery), "SELECT `%sS%i` FROM `zetimer_table` WHERE steam_auth = '%s'", g_cMapname, l_iRaceCount, sSID); - SQL_TQuery(g_dDatabase, TqueryThreadCallback, sQuery, GetClientUserId(client)); - } - } - return Plugin_Handled; -} -//---------------------------------------------------------------------------------------------------- -// Purpose: -//---------------------------------------------------------------------------------------------------- public void CheckStagesOnMap(int client, int state) { int l_iCount; @@ -755,19 +741,22 @@ public void CheckStagesOnMap(int client, int state) StageMenu.SetTitle("Stages on: %s", g_cMapname); if (g_bDisplaySpecial) { + l_iCount++; Format(l_cMenuContent, sizeof(l_cMenuContent), "Stage: %i", l_iCount); StageMenu.AddItem("", l_cMenuContent); } else - for (int i = 0; i <= l_iZoneCount; i++) + { + for (int Iterator = 0; Iterator <= l_iZoneCount; Iterator++) { - if (IsCorrectZone(i, l_cZoneIndexName[i][g_dLength -1], "ZONE_PREFIX_RACE")) + if (IsCorrectZone(Iterator, l_cZoneIndexName[Iterator][g_dLength -1], "ZONE_PREFIX_RACE")) { l_iCount++; Format(l_cMenuContent, sizeof(l_cMenuContent), "Stage: %i", l_iCount); StageMenu.AddItem("", l_cMenuContent); } } + } StageMenu.ExitButton = true; StageMenu.Display(client, 0); } @@ -822,9 +811,9 @@ public void Checkself(int client) char l_cQuery[g_dLength]; char l_cSID[g_dIndex]; GetClientAuthId(client, AuthId_Steam2, l_cSID, sizeof(l_cSID)); - if (!l_iZoneCount) + if (l_iZoneCount < 1) { - CPrintToChat(client, "[UNLOZE] Map does not support race timer"); + PrintToChat(client, "No zones active on this map"); return; } if (l_iZoneCount < 2) diff --git a/RaceTimer/scripting/unloze_racetimer_specialmaps.sp b/RaceTimer/scripting/unloze_racetimer_specialmaps.sp index 11d25566..39a83999 100644 --- a/RaceTimer/scripting/unloze_racetimer_specialmaps.sp +++ b/RaceTimer/scripting/unloze_racetimer_specialmaps.sp @@ -36,7 +36,7 @@ public int Native_Isspecialmap(Handle handler, int numParams) { CreateTimer(10.0, Timer_CheckStage, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); GetCurrentMap(g_cMapname, sizeof(g_cMapname)); - if (StrEqual(g_cMapname, "ze_FFVII_Mako_Reactor_v5_3")) + if (StrEqual(g_cMapname, "ze_FFVII_Mako_Reactor_v5_3", false)) { g_bSpecialMap = true; return view_as(1);