bug fixes, hopefully the last one needed

This commit is contained in:
jenz 2022-08-15 01:47:05 +02:00
parent 470a5199c4
commit 23cd40963c

View File

@ -23,6 +23,7 @@ static char g_sConfigzones[PLATFORM_MAX_PATH];
float g_fStartTime[MAXPLAYERS + 1]; float g_fStartTime[MAXPLAYERS + 1];
char g_csTime_record[MAXPLAYERS + 1][65]; char g_csTime_record[MAXPLAYERS + 1][65];
float g_fClientVectors[MAXPLAYERS + 1][3]; float g_fClientVectors[MAXPLAYERS + 1][3];
float g_fClient_End_time[MAXPLAYERS + 1];
int g_iClientFrames[MAXPLAYERS + 1]; int g_iClientFrames[MAXPLAYERS + 1];
int g_iClientSpeedInterval[MAXPLAYERS + 1]; int g_iClientSpeedInterval[MAXPLAYERS + 1];
int g_iClientChecking[MAXPLAYERS + 1]; int g_iClientChecking[MAXPLAYERS + 1];
@ -30,8 +31,8 @@ bool g_bDisplaySpecial;
bool g_bHumansAllowedTime[MAXPLAYERS + 1]; bool g_bHumansAllowedTime[MAXPLAYERS + 1];
bool g_bhumans_finished[MAXPLAYERS + 1]; bool g_bhumans_finished[MAXPLAYERS + 1];
bool g_bHideTimer[MAXPLAYERS + 1]; bool g_bHideTimer[MAXPLAYERS + 1];
int g_bAllowToLeave[MAXPLAYERS + 1];
bool g_bEventBool = false; bool g_bEventBool = false;
bool g_bClient_allowed_to_leave_again[MAXPLAYERS + 1];
Handle g_hClientCookie = INVALID_HANDLE; Handle g_hClientCookie = INVALID_HANDLE;
Database g_dDatabase; Database g_dDatabase;
Handle hText; Handle hText;
@ -86,6 +87,13 @@ public void OnPluginStart()
g_bDisplaySpecial = unloze_gBSpecialMapDisplay(); g_bDisplaySpecial = unloze_gBSpecialMapDisplay();
} }
public Action allow_leaving_again(Handle hTimer, int client)
{
if (IsValidClient(client))
{
g_bClient_allowed_to_leave_again[client] = true;
}
}
public Action Timer_alter_tables(Handle hTimer) public Action Timer_alter_tables(Handle hTimer)
{ {
if (!g_dDatabase) if (!g_dDatabase)
@ -105,12 +113,12 @@ public void trigger_teleport(const char[] output, int entity_index, int client,
//if its surf maps there most likely are needed teleports //if its surf maps there most likely are needed teleports
if (StrContains(g_cMapname, "surf", false) == -1) if (StrContains(g_cMapname, "surf", false) == -1)
{ {
g_bHumansAllowedTime[client] = false; g_bHumansAllowedTime[client] = false;
resetClientVectors(client); g_bhumans_finished[client] = false;
if (GetClientTeam(client) == 3) resetClientVectors(client);
{ g_bClient_allowed_to_leave_again[client] = false;
PrintToChat(client, "Disabled timer due to potential teleport abuse"); PrintToChat(client, "Disabled timer due to potential teleport abuse, type 1.");
} CreateTimer(1.0, allow_leaving_again, client);
} }
} }
} }
@ -122,13 +130,15 @@ public void Trigger_Multiple(const char[] output, int entity_index, int client,
if (StrContains(g_cMapname, "surf", false) == -1) if (StrContains(g_cMapname, "surf", false) == -1)
{ {
g_bHumansAllowedTime[client] = false; g_bHumansAllowedTime[client] = false;
g_bhumans_finished[client] = false;
resetClientVectors(client); resetClientVectors(client);
PrintToChat(client, "Disabled timer due to potential teleport abuse"); g_bClient_allowed_to_leave_again[client] = false;
PrintToChat(client, "Disabled timer due to potential teleport abuse, type 1.");
CreateTimer(1.0, allow_leaving_again, client);
} }
} }
} }
public bool origin_command_check(int entity_index) public bool origin_command_check(int entity_index)
{ {
int count_trigger = GetOutputCount(entity_index, "m_OnTrigger"); int count_trigger = GetOutputCount(entity_index, "m_OnTrigger");
@ -198,7 +208,6 @@ public void MYSQLCheckMapEntry()
int l_iRaceCount; int l_iRaceCount;
int l_iZoneCount = unloze_zoneCount(); int l_iZoneCount = unloze_zoneCount();
char sQuery[g_dLength]; char sQuery[g_dLength];
char l_cZoneIndexName[g_dIndex][g_dLength];
if (l_iZoneCount == 1) if (l_iZoneCount == 1)
{ {
Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table_new` ADD COLUMN IF NOT EXISTS `%s` REAL DEFAULT 0.000 NOT NULL", g_cMapname); Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table_new` ADD COLUMN IF NOT EXISTS `%s` REAL DEFAULT 0.000 NOT NULL", g_cMapname);
@ -210,7 +219,9 @@ public void MYSQLCheckMapEntry()
{ {
for (int iterator = 0; iterator <= l_iZoneCount; iterator++) for (int iterator = 0; iterator <= l_iZoneCount; iterator++)
{ {
if (IsCorrectZone(iterator, l_cZoneIndexName[iterator][g_dLength -1], "ZONE_PREFIX_RACE")) char zoneIndexName[512];
ZoneNameBasedOnIndex(iterator, zoneIndexName);
if (StrContains(zoneIndexName, "ZONE_PREFIX_RACE") > -1)
{ {
l_iRaceCount++; l_iRaceCount++;
Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table_new` ADD COLUMN IF NOT EXISTS `%sS%i` REAL DEFAULT 0.000 NOT NULL", g_cMapname, l_iRaceCount); Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table_new` ADD COLUMN IF NOT EXISTS `%sS%i` REAL DEFAULT 0.000 NOT NULL", g_cMapname, l_iRaceCount);
@ -370,17 +381,18 @@ public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast
if (IsValidClient(i) && !IsFakeClient(i)) if (IsValidClient(i) && !IsFakeClient(i))
{ {
g_bhumans_finished[i] = false; g_bhumans_finished[i] = false;
g_fClient_End_time[i] = 0.0;
resetClientVectors(i); resetClientVectors(i);
g_bAllowToLeave[i] = 0;
char first_zone[512]; char first_zone[512];
ZoneNameBasedOnIndex(0, first_zone); ZoneNameBasedOnIndex(0, first_zone);
g_bClient_allowed_to_leave_again[i] = true;
if (race_zone_count != 1) if (race_zone_count != 1)
g_bHumansAllowedTime[i] = false; g_bHumansAllowedTime[i] = false;
else if (StrContains(first_zone, "ZONE_PREFIX_RACE") > -1) //ensures only one zone in total and that its the actual end zone else if (StrContains(first_zone, "ZONE_PREFIX_RACE") > -1) //ensures only one zone in total and that its the actual end zone
{ {
mysql_get_player_time(i, 0);
g_bHumansAllowedTime[i] = true; g_bHumansAllowedTime[i] = true;
g_fStartTime[i] = GetEngineTime(); g_fStartTime[i] = GetEngineTime();
mysql_get_player_time(i, 0);
} }
else else
{ {
@ -421,8 +433,9 @@ public void resetClient(int client)
{ {
g_iClientChecking[client] = 0; g_iClientChecking[client] = 0;
g_bHumansAllowedTime[client] = false; g_bHumansAllowedTime[client] = false;
g_bAllowToLeave[client] = 0;
g_bhumans_finished[client] = false; g_bhumans_finished[client] = false;
g_fClient_End_time[client] = 0.0;
g_bClient_allowed_to_leave_again[client] = false;
resetClientVectors(client); resetClientVectors(client);
g_fStartTime[client] = 0.0; g_fStartTime[client] = 0.0;
player_stage[client] = 0; player_stage[client] = 0;
@ -444,29 +457,36 @@ public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float
g_bHumansAllowedTime[client] = false; g_bHumansAllowedTime[client] = false;
return; return;
} }
if (GetClientTeam(client) == CS_TEAM_CT && IsPlayerAlive(client)) if (!IsPlayerAlive(client))
{ {
g_bHumansAllowedTime[client] = false;
g_bhumans_finished[client] = false;
resetClientVectors(client);
PrintToChat(client, "Disabled timer due to dying.");
return;
}
if (GetClientTeam(client) == CS_TEAM_CT)
{
float clientVectors[3];
GetClientAbsOrigin(client, clientVectors);
if (checkClientOrigin(g_fClientVectors[client], clientVectors, client))
{
g_bHumansAllowedTime[client] = false;
g_bhumans_finished[client] = false;
resetClientVectors(client);
g_bClient_allowed_to_leave_again[client] = false;
PrintToChat(client, "Disabled timer due to potential teleport abuse, type 2.");
CreateTimer(1.0, allow_leaving_again, client);
return;
}
int frameCap = 11; int frameCap = 11;
if (g_bhumans_finished[client]) if (g_bhumans_finished[client])
g_iClientFrames[client] = 11; g_iClientFrames[client] = 11;
if (g_iClientFrames[client] >= frameCap) if (g_iClientFrames[client] >= frameCap)
{ {
g_iClientFrames[client] = 0; g_iClientFrames[client] = 0;
float clientVectors[3];
GetClientAbsOrigin(client, clientVectors);
if (checkClientOrigin(g_fClientVectors[client], clientVectors, client))
{
g_bHumansAllowedTime[client] = false;
g_bhumans_finished[client] = false;
//called if teleported to some place far away or teleported from inside start zone to end zone
CreateTimer(1.0, reset_permissions_for_leave, client);
resetClientVectors(client);
PrintToChat(client, "Disabled timer due to potential teleport abuse");
return;
}
if (g_bhumans_finished[client]) if (g_bhumans_finished[client])
{ {
CreateTimer(1.0, reset_permissions_for_leave, client);
resetClientVectors(client); resetClientVectors(client);
g_bhumans_finished[client] = false; g_bhumans_finished[client] = false;
g_bHumansAllowedTime[client] = false; g_bHumansAllowedTime[client] = false;
@ -525,6 +545,16 @@ public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float
} }
g_iClientFrames[client]++; g_iClientFrames[client]++;
} }
else
{
//is zm
g_bHumansAllowedTime[client] = false;
g_bhumans_finished[client] = false;
//called if teleported to some place far away or teleported from inside start zone to end zone
resetClientVectors(client);
PrintToChat(client, "Disabled timer due to ZM infection.");
return;
}
return; return;
} }
@ -557,7 +587,6 @@ public bool checkClientOrigin(float oldVals[3], float newVals[3], int client)
float teleport_range = 1090450.0; float teleport_range = 1090450.0;
int velocityCap = 625; int velocityCap = 625;
float distance = GetVectorDistance(oldVals, newVals, true); float distance = GetVectorDistance(oldVals, newVals, true);
//PrintToChatAll("distance: %f", distance);
bool bInAir = (GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") == -1); bool bInAir = (GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") == -1);
if (distance > teleport_range) if (distance > teleport_range)
{ {
@ -592,32 +621,13 @@ public void unloze_zoneEntry(int client, char[] zone)
player_stage[client] = 0; player_stage[client] = 0;
if (player_stage[client] == (zoneIndex / 2) || l_iZoneCount < 2) if (player_stage[client] == (zoneIndex / 2) || l_iZoneCount < 2)
{ {
g_bAllowToLeave[client] = 1;
g_bhumans_finished[client] = true; g_bhumans_finished[client] = true;
g_fClient_End_time[client] = client_current_race_time(client);
} }
} }
} }
} }
public Action reset_permissions_for_leave(Handle timer, int i)
{
if (IsValidClient(i))
{
//if you start the timer and run inside the start zone again there are 3 options:
//you leave the zone normally by running out of it which is fine
//you get teleported out of the zone to a certain distance away by something like afk teleport, in that case your timer gets disabled
//due to detected teleport abuse
//Third option is you get teleported out of spawn zone to a end zone which after triggering Entry forward triggers Leave forward again
//Therefore we need a cooldown when teleporting from inside of start zone to an entry zone as Leave forward is called right after again
//which is a errornous way of starting the timer from the end zone, by having a second delay we ensure its not a problem when teleported from spawn
//to a random place thats not an entry zone as this is handled seemingly correctly by the teleport abuse detection. Meanwhile to stop the timer from
//starting when teleported from spawn to an Entry zone we need a cooldown
g_bAllowToLeave[i] = 0;
}
return Plugin_Continue;
}
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
// Purpose: // Purpose:
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
@ -625,13 +635,11 @@ public void unloze_zoneLeave(int client, char[] zone)
{ {
//only maps with multiple zones need ZONE_PREFIX_START //only maps with multiple zones need ZONE_PREFIX_START
int race_zone_count = GetTotalRaceZones(); int race_zone_count = GetTotalRaceZones();
//if zone has special name like in mako dont return despite g_bAllowToLeave being false or there being no normally named zone if (!(StrEqual(zone, g_cSpecialMapStart)) && !race_zone_count)
if (!(StrEqual(zone, g_cSpecialMapStart)) && (!race_zone_count || g_bAllowToLeave[client]))
return; return;
if (GetClientTeam(client) == CS_TEAM_CT) if (GetClientTeam(client) == CS_TEAM_CT)
{ {
//PrintToChatAll("Equal: %i", StrEqual(zone, g_cSpecialMapStart));
if ((StrContains(zone, "ZONE_PREFIX_START") > -1) || StrEqual(zone, g_cSpecialMapStart)) if ((StrContains(zone, "ZONE_PREFIX_START") > -1) || StrEqual(zone, g_cSpecialMapStart))
{ {
char sAuthID[32]; char sAuthID[32];
@ -641,13 +649,17 @@ public void unloze_zoneLeave(int client, char[] zone)
PrintToChat(client, "Not starting timer due to being listed as nosteamer"); PrintToChat(client, "Not starting timer due to being listed as nosteamer");
return; return;
} }
if (!g_bClient_allowed_to_leave_again[client])
{
return;
}
g_fStartTime[client] = GetEngineTime(); g_fStartTime[client] = GetEngineTime();
float notRounded = float(RetrieveZoneIndex(zone)); float notRounded = float(RetrieveZoneIndex(zone));
player_stage[client] = RoundToCeil(notRounded / 2); player_stage[client] = RoundToCeil(notRounded / 2);
mysql_get_player_time(client, player_stage[client]);
g_bHumansAllowedTime[client] = true;
CPrintToChat(client, "Timer started for Course: %i", player_stage[client]); CPrintToChat(client, "Timer started for Course: %i", player_stage[client]);
g_bHumansAllowedTime[client] = true;
mysql_get_player_time(client, player_stage[client]);
} }
} }
} }
@ -706,7 +718,7 @@ public void FinishedStageRaceZone(int client)
} }
int l_iZoneCount = unloze_zoneCount(); int l_iZoneCount = unloze_zoneCount();
float client_time = client_current_race_time(client); float client_time = g_fClient_End_time[client];
if (client_time == -1.0) if (client_time == -1.0)
{ {
//if client disconnected we dont want to cary timer over to other client //if client disconnected we dont want to cary timer over to other client
@ -898,7 +910,6 @@ public void mysql_select_lowest_ordered(int client, int index, int length_increa
public void CheckTop(int client, int index, int autismstate) public void CheckTop(int client, int index, int autismstate)
{ {
int l_iZoneCount = unloze_zoneCount(); int l_iZoneCount = unloze_zoneCount();
//PrintToChatAll("checktop l_iZoneCount: %i", l_iZoneCount);
if (l_iZoneCount < 1) if (l_iZoneCount < 1)
{ {
PrintToChat(client, "No zones active on this map"); PrintToChat(client, "No zones active on this map");
@ -1023,52 +1034,51 @@ public Action cmd_timerCheckStage(int client, int args)
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
public void CheckStagesOnMap(int client, int state) public void CheckStagesOnMap(int client, int state)
{ {
int l_iCount; int l_iCount;
int l_iZoneCount = unloze_zoneCount(); int l_iZoneCount = unloze_zoneCount();
Menu StageMenu = CreateMenu(Stage_menu); Menu StageMenu = CreateMenu(Stage_menu);
char l_cZoneIndexName[g_dIndex][g_dLength]; char l_cMenuContent[g_dLength];
char l_cMenuContent[g_dLength]; if (!l_iZoneCount)
if (!l_iZoneCount) {
{ CPrintToChat(client, "[UNLOZE] Map does not support racestage timer");
CPrintToChat(client, "[UNLOZE] Map does not support racestage timer"); return;
return; }
} //state 0 == toptime, state 1 == own time
//state 0 == toptime, state 1 == own time g_iClientChecking[client] = state;
g_iClientChecking[client] = state; StageMenu.SetTitle("Stages on: %s", g_cMapname);
StageMenu.SetTitle("Stages on: %s", g_cMapname); if (g_bDisplaySpecial)
if (g_bDisplaySpecial) {
{ l_iCount++;
l_iCount++; Format(l_cMenuContent, sizeof(l_cMenuContent), "Stage: %i", l_iCount);
Format(l_cMenuContent, sizeof(l_cMenuContent), "Stage: %i", l_iCount); StageMenu.AddItem("", l_cMenuContent);
StageMenu.AddItem("", l_cMenuContent); }
} else
else {
{ int zone_reached = 0;
for (int Iterator = 0; Iterator <= l_iZoneCount; Iterator++) for (int Iterator = 0; Iterator <= l_iZoneCount; Iterator++)
{ {
if (IsCorrectZone(Iterator, l_cZoneIndexName[Iterator][g_dLength -1], "ZONE_PREFIX_RACE")) char zoneIndexName[512];
{ ZoneNameBasedOnIndex(Iterator, zoneIndexName);
l_iCount++; if (StrContains(zoneIndexName, "ZONE_PREFIX_RACE") > -1)
Format(l_cMenuContent, sizeof(l_cMenuContent), "Stage: %i", l_iCount); {
StageMenu.AddItem("", l_cMenuContent); char local_c[g_dLength];
} Format(local_c, sizeof(local_c), "%s", zoneIndexName[strlen("ZONE_PREFIX_RACE") + 1]);
} int prev = zone_reached;
} zone_reached = StringToInt(local_c);
StageMenu.ExitButton = true; if (zone_reached == prev)
StageMenu.Display(client, 0); {
} continue;
//---------------------------------------------------------------------------------------------------- }
// Purpose: l_iCount++;
//---------------------------------------------------------------------------------------------------- Format(l_cMenuContent, sizeof(l_cMenuContent), "Stage: %i", l_iCount);
public bool IsCorrectZone(int index, char[] zoneIndexName, char[] zone_prefix) StageMenu.AddItem("", l_cMenuContent);
{ }
ZoneNameBasedOnIndex(index, zoneIndexName); }
if (StrContains(zoneIndexName, zone_prefix) > -1) }
{ StageMenu.ExitButton = true;
return true; StageMenu.Display(client, 0);
}
return false;
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
// Purpose: // Purpose:
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
@ -1119,25 +1129,25 @@ public void deleteClientTime(char[] steam2, int stage)
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
public void Checkself(int client) public void Checkself(int client)
{ {
int l_iZoneCount = unloze_zoneCount(); int l_iZoneCount = unloze_zoneCount();
char l_cQuery[g_dLength]; char l_cQuery[g_dLength];
char l_cSID[g_dIndex]; char l_cSID[g_dIndex];
GetClientAuthId(client, AuthId_Steam2, l_cSID, sizeof(l_cSID)); GetClientAuthId(client, AuthId_Steam2, l_cSID, sizeof(l_cSID));
if (l_iZoneCount < 1) if (l_iZoneCount < 1)
{ {
PrintToChat(client, "No zones active on this map"); PrintToChat(client, "No zones active on this map");
return; return;
} }
if (l_iZoneCount < 2) if (l_iZoneCount < 2)
{ {
Format(l_cQuery, sizeof(l_cQuery), "SELECT name, `%s` FROM `zetimer_table_new` WHERE steam_auth = '%s'", g_cMapname, l_cSID); Format(l_cQuery, sizeof(l_cQuery), "SELECT name, `%s` FROM `zetimer_table_new` WHERE steam_auth = '%s'", g_cMapname, l_cSID);
DataPack hDataPack = new DataPack(); DataPack hDataPack = new DataPack();
hDataPack.WriteCell(GetClientSerial(client)); hDataPack.WriteCell(GetClientSerial(client));
hDataPack.WriteString(l_cQuery); hDataPack.WriteString(l_cQuery);
g_dDatabase.Query(SQL_CheckSelf, l_cQuery, hDataPack); g_dDatabase.Query(SQL_CheckSelf, l_cQuery, hDataPack);
} }
else else
CheckStagesOnMap(client, 1); CheckStagesOnMap(client, 1);
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
// Purpose: // Purpose: