bug fixes, hopefully the last one needed
This commit is contained in:
parent
470a5199c4
commit
23cd40963c
@ -23,6 +23,7 @@ static char g_sConfigzones[PLATFORM_MAX_PATH];
|
||||
float g_fStartTime[MAXPLAYERS + 1];
|
||||
char g_csTime_record[MAXPLAYERS + 1][65];
|
||||
float g_fClientVectors[MAXPLAYERS + 1][3];
|
||||
float g_fClient_End_time[MAXPLAYERS + 1];
|
||||
int g_iClientFrames[MAXPLAYERS + 1];
|
||||
int g_iClientSpeedInterval[MAXPLAYERS + 1];
|
||||
int g_iClientChecking[MAXPLAYERS + 1];
|
||||
@ -30,8 +31,8 @@ bool g_bDisplaySpecial;
|
||||
bool g_bHumansAllowedTime[MAXPLAYERS + 1];
|
||||
bool g_bhumans_finished[MAXPLAYERS + 1];
|
||||
bool g_bHideTimer[MAXPLAYERS + 1];
|
||||
int g_bAllowToLeave[MAXPLAYERS + 1];
|
||||
bool g_bEventBool = false;
|
||||
bool g_bClient_allowed_to_leave_again[MAXPLAYERS + 1];
|
||||
Handle g_hClientCookie = INVALID_HANDLE;
|
||||
Database g_dDatabase;
|
||||
Handle hText;
|
||||
@ -86,6 +87,13 @@ public void OnPluginStart()
|
||||
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)
|
||||
{
|
||||
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 (StrContains(g_cMapname, "surf", false) == -1)
|
||||
{
|
||||
g_bHumansAllowedTime[client] = false;
|
||||
resetClientVectors(client);
|
||||
if (GetClientTeam(client) == 3)
|
||||
{
|
||||
PrintToChat(client, "Disabled timer due to potential teleport abuse");
|
||||
}
|
||||
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 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)
|
||||
{
|
||||
g_bHumansAllowedTime[client] = false;
|
||||
g_bhumans_finished[client] = false;
|
||||
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)
|
||||
{
|
||||
int count_trigger = GetOutputCount(entity_index, "m_OnTrigger");
|
||||
@ -198,7 +208,6 @@ public void MYSQLCheckMapEntry()
|
||||
int l_iRaceCount;
|
||||
int l_iZoneCount = unloze_zoneCount();
|
||||
char sQuery[g_dLength];
|
||||
char l_cZoneIndexName[g_dIndex][g_dLength];
|
||||
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);
|
||||
@ -210,7 +219,9 @@ public void MYSQLCheckMapEntry()
|
||||
{
|
||||
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++;
|
||||
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))
|
||||
{
|
||||
g_bhumans_finished[i] = false;
|
||||
g_fClient_End_time[i] = 0.0;
|
||||
resetClientVectors(i);
|
||||
g_bAllowToLeave[i] = 0;
|
||||
char first_zone[512];
|
||||
ZoneNameBasedOnIndex(0, first_zone);
|
||||
g_bClient_allowed_to_leave_again[i] = true;
|
||||
if (race_zone_count != 1)
|
||||
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
|
||||
{
|
||||
mysql_get_player_time(i, 0);
|
||||
g_bHumansAllowedTime[i] = true;
|
||||
g_fStartTime[i] = GetEngineTime();
|
||||
mysql_get_player_time(i, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -421,8 +433,9 @@ public void resetClient(int client)
|
||||
{
|
||||
g_iClientChecking[client] = 0;
|
||||
g_bHumansAllowedTime[client] = false;
|
||||
g_bAllowToLeave[client] = 0;
|
||||
g_bhumans_finished[client] = false;
|
||||
g_fClient_End_time[client] = 0.0;
|
||||
g_bClient_allowed_to_leave_again[client] = false;
|
||||
resetClientVectors(client);
|
||||
g_fStartTime[client] = 0.0;
|
||||
player_stage[client] = 0;
|
||||
@ -444,29 +457,36 @@ public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float
|
||||
g_bHumansAllowedTime[client] = false;
|
||||
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;
|
||||
if (g_bhumans_finished[client])
|
||||
g_iClientFrames[client] = 11;
|
||||
if (g_iClientFrames[client] >= frameCap)
|
||||
{
|
||||
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])
|
||||
{
|
||||
CreateTimer(1.0, reset_permissions_for_leave, client);
|
||||
resetClientVectors(client);
|
||||
g_bhumans_finished[client] = false;
|
||||
g_bHumansAllowedTime[client] = false;
|
||||
@ -525,6 +545,16 @@ public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
@ -557,7 +587,6 @@ public bool checkClientOrigin(float oldVals[3], float newVals[3], int client)
|
||||
float teleport_range = 1090450.0;
|
||||
int velocityCap = 625;
|
||||
float distance = GetVectorDistance(oldVals, newVals, true);
|
||||
//PrintToChatAll("distance: %f", distance);
|
||||
bool bInAir = (GetEntPropEnt(client, Prop_Send, "m_hGroundEntity") == -1);
|
||||
if (distance > teleport_range)
|
||||
{
|
||||
@ -592,32 +621,13 @@ public void unloze_zoneEntry(int client, char[] zone)
|
||||
player_stage[client] = 0;
|
||||
if (player_stage[client] == (zoneIndex / 2) || l_iZoneCount < 2)
|
||||
{
|
||||
g_bAllowToLeave[client] = 1;
|
||||
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:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
@ -625,13 +635,11 @@ public void unloze_zoneLeave(int client, char[] zone)
|
||||
{
|
||||
//only maps with multiple zones need ZONE_PREFIX_START
|
||||
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 || g_bAllowToLeave[client]))
|
||||
if (!(StrEqual(zone, g_cSpecialMapStart)) && !race_zone_count)
|
||||
return;
|
||||
|
||||
if (GetClientTeam(client) == CS_TEAM_CT)
|
||||
{
|
||||
//PrintToChatAll("Equal: %i", StrEqual(zone, g_cSpecialMapStart));
|
||||
if ((StrContains(zone, "ZONE_PREFIX_START") > -1) || StrEqual(zone, g_cSpecialMapStart))
|
||||
{
|
||||
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");
|
||||
return;
|
||||
}
|
||||
if (!g_bClient_allowed_to_leave_again[client])
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
g_fStartTime[client] = GetEngineTime();
|
||||
float notRounded = float(RetrieveZoneIndex(zone));
|
||||
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]);
|
||||
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();
|
||||
float client_time = client_current_race_time(client);
|
||||
float client_time = g_fClient_End_time[client];
|
||||
if (client_time == -1.0)
|
||||
{
|
||||
//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)
|
||||
{
|
||||
int l_iZoneCount = unloze_zoneCount();
|
||||
//PrintToChatAll("checktop l_iZoneCount: %i", l_iZoneCount);
|
||||
if (l_iZoneCount < 1)
|
||||
{
|
||||
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)
|
||||
{
|
||||
int l_iCount;
|
||||
int l_iZoneCount = unloze_zoneCount();
|
||||
Menu StageMenu = CreateMenu(Stage_menu);
|
||||
char l_cZoneIndexName[g_dIndex][g_dLength];
|
||||
char l_cMenuContent[g_dLength];
|
||||
if (!l_iZoneCount)
|
||||
{
|
||||
CPrintToChat(client, "[UNLOZE] Map does not support racestage timer");
|
||||
return;
|
||||
}
|
||||
//state 0 == toptime, state 1 == own time
|
||||
g_iClientChecking[client] = 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 Iterator = 0; Iterator <= l_iZoneCount; Iterator++)
|
||||
{
|
||||
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);
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public bool IsCorrectZone(int index, char[] zoneIndexName, char[] zone_prefix)
|
||||
{
|
||||
ZoneNameBasedOnIndex(index, zoneIndexName);
|
||||
if (StrContains(zoneIndexName, zone_prefix) > -1)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
int l_iCount;
|
||||
int l_iZoneCount = unloze_zoneCount();
|
||||
Menu StageMenu = CreateMenu(Stage_menu);
|
||||
char l_cMenuContent[g_dLength];
|
||||
if (!l_iZoneCount)
|
||||
{
|
||||
CPrintToChat(client, "[UNLOZE] Map does not support racestage timer");
|
||||
return;
|
||||
}
|
||||
//state 0 == toptime, state 1 == own time
|
||||
g_iClientChecking[client] = 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
|
||||
{
|
||||
int zone_reached = 0;
|
||||
for (int Iterator = 0; Iterator <= l_iZoneCount; Iterator++)
|
||||
{
|
||||
char zoneIndexName[512];
|
||||
ZoneNameBasedOnIndex(Iterator, zoneIndexName);
|
||||
if (StrContains(zoneIndexName, "ZONE_PREFIX_RACE") > -1)
|
||||
{
|
||||
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);
|
||||
if (zone_reached == prev)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
l_iCount++;
|
||||
Format(l_cMenuContent, sizeof(l_cMenuContent), "Stage: %i", l_iCount);
|
||||
StageMenu.AddItem("", l_cMenuContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
StageMenu.ExitButton = true;
|
||||
StageMenu.Display(client, 0);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
@ -1119,25 +1129,25 @@ public void deleteClientTime(char[] steam2, int stage)
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public void Checkself(int client)
|
||||
{
|
||||
int l_iZoneCount = unloze_zoneCount();
|
||||
char l_cQuery[g_dLength];
|
||||
char l_cSID[g_dIndex];
|
||||
GetClientAuthId(client, AuthId_Steam2, l_cSID, sizeof(l_cSID));
|
||||
if (l_iZoneCount < 1)
|
||||
{
|
||||
PrintToChat(client, "No zones active on this map");
|
||||
return;
|
||||
}
|
||||
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);
|
||||
DataPack hDataPack = new DataPack();
|
||||
hDataPack.WriteCell(GetClientSerial(client));
|
||||
hDataPack.WriteString(l_cQuery);
|
||||
g_dDatabase.Query(SQL_CheckSelf, l_cQuery, hDataPack);
|
||||
}
|
||||
else
|
||||
CheckStagesOnMap(client, 1);
|
||||
int l_iZoneCount = unloze_zoneCount();
|
||||
char l_cQuery[g_dLength];
|
||||
char l_cSID[g_dIndex];
|
||||
GetClientAuthId(client, AuthId_Steam2, l_cSID, sizeof(l_cSID));
|
||||
if (l_iZoneCount < 1)
|
||||
{
|
||||
PrintToChat(client, "No zones active on this map");
|
||||
return;
|
||||
}
|
||||
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);
|
||||
DataPack hDataPack = new DataPack();
|
||||
hDataPack.WriteCell(GetClientSerial(client));
|
||||
hDataPack.WriteString(l_cQuery);
|
||||
g_dDatabase.Query(SQL_CheckSelf, l_cQuery, hDataPack);
|
||||
}
|
||||
else
|
||||
CheckStagesOnMap(client, 1);
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
|
Loading…
Reference in New Issue
Block a user