using the nide config approach but actually works i guess

This commit is contained in:
jenz 2026-05-05 11:38:07 +02:00
parent 6acdc80767
commit 0866d58b59

View File

@ -10,7 +10,9 @@ ArrayList g_hClanNames;
int g_iBaseLatency[MAXPLAYERS + 1];
int g_iLatency[MAXPLAYERS + 1];
int g_iFakesCount;
int g_iPlayerCount;
bool g_bMapended;
Database g_hDatabase;
Database g_hDatabase_hlstats;
@ -23,7 +25,7 @@ public Plugin myinfo =
name = "fakes",
author = "Neon + Dogan + Botox",
description = "Handle Hitboxes via Plugin",
version = "5.3.1",
version = "5.4.1",
url = "https://steamcommunity.com/id/n3ontm"
};
@ -42,9 +44,12 @@ public void OnPluginStart()
CreateTimer(GetRandomFloat(20.0, 40.0), RunPopulationCheck, _, TIMER_REPEAT);
CreateTimer(3.0, RandomizePing, _, TIMER_REPEAT);
CreateTimer(600.0, RandomizeNames, _, TIMER_REPEAT);
CreateTimer(80.0, CheckPopulation_interval, _, TIMER_REPEAT);
HookUserMessage(GetUserMessageId("SayText2"), UserMessage_SayText2, true);
g_bMapended = false;
if (!g_hDatabase)
{
Database.Connect(SQL_OnDatabaseConnect, "racetimercss");
@ -53,28 +58,7 @@ public void OnPluginStart()
{
Database.Connect(SQL_OnDatabaseConnect_hlstats, "hlstatsx");
}
HookEvent("round_start", Event_roundStart, EventHookMode_Pre);
g_iFakesCount = 0;
}
public void Event_roundStart(Handle event, const char[] name, bool dontBroadcast)
{
int TimeLeft;
if (GetMapTimeLeft(TimeLeft) && TimeLeft < 0)
{
return;
}
g_iFakesCount = 0;
for(int i = 1; i <= MaxClients; i++)
{
if (IsClientConnected(i) && IsClientInGame(i) && IsClientAuthorized(i))
{
if (IsFakeClient(i) && !IsClientSourceTV(i))
{
g_iFakesCount++;
}
}
}
g_iPlayerCount = 0;
}
public void SQL_OnDatabaseConnect_hlstats(Database db, const char[] error, any data)
@ -157,15 +141,21 @@ public void SQL_OnQueryCompleted(Database db, DBResultSet results, const char[]
delete results;
}
public void OnMapEnd()
{
g_bMapended = true;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnMapStart()
{
KeyValues kv = CreateKeyValues("ints_used_already");
for (float i = 0.0; i < g_iFakesCount;)
int fakes_needed = getFakesNeeded();
for (float i = 0.0; i < fakes_needed;)
{
int num = GetRandomInt(5, 150);
int num = GetRandomInt(5, 45);
char strnum[16];
IntToString(num, strnum, sizeof(strnum));
int found = kv.GetNum(strnum, -1);
@ -181,11 +171,53 @@ public void OnMapStart()
delete kv;
}
public int getFakesNeeded()
{
//copied from nide fakeclients plugin.
char sPath[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sPath, sizeof(sPath), "configs/fakeclients_tiers.cfg");
KeyValues kv = new KeyValues("FakeClientsTiers");
if (!kv.ImportFromFile(sPath))
{
LogError("configs/fakeclients_tiers.cfg not found — falling back to sm_fakeclients_players");
delete kv;
return 0;
}
if (!kv.GotoFirstSubKey(false))
{
LogError("configs/fakeclients_tiers.cfg is empty or malformed");
delete kv;
return 0;
}
int prev_bots = 0;
do
{
char sKey[16], sVal[16];
kv.GetSectionName(sKey, sizeof(sKey));
kv.GetString(NULL_STRING, sVal, sizeof(sVal), "-1");
int bots = StringToInt(sVal);
int players = StringToInt(sKey);
if (players > g_iPlayerCount)
{
break;
}
prev_bots = bots;
} while (kv.GotoNextKey(false));
delete kv;
//LogMessage("prev_bots: %i", prev_bots);
return prev_bots;
}
public Action addfakes(Handle timer)
{
int limit = getFakesNeeded();
int fakes = 0;
int spectators = 0;
int inTeam = 0;
for(int i = 1; i <= MaxClients; i++)
{
if (IsClientConnected(i) && IsClientInGame(i) && IsClientAuthorized(i))
@ -194,32 +226,48 @@ public Action addfakes(Handle timer)
{
fakes++;
}
if (GetClientTeam(i) <= CS_TEAM_SPECTATOR)
{
spectators++;
}
else
{
inTeam++;
}
}
}
int limit = 16;
}
if (nightTime())
{
limit /= 2;
}
if (fakes < limit)
{
CreateFake();
if (spectators > limit || inTeam + 2 < spectators)
{
SetFakeToTeam();
}
}
return Plugin_Continue;
}
public Action CheckPopulation_interval(Handle timer)
{
int TimeLeft;
if (GetMapTimeLeft(TimeLeft) && TimeLeft < 0)
{
return Plugin_Continue;
}
if (g_bMapended)
{
g_bMapended = false;
return Plugin_Continue;
}
g_iPlayerCount = 0;
for(int i = 1; i <= MaxClients; i++)
{
if (IsClientConnected(i) && IsClientInGame(i) && IsClientAuthorized(i))
{
if (!IsFakeClient(i) && !IsClientSourceTV(i))
{
g_iPlayerCount++;
}
}
}
return Plugin_Handled;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
@ -333,7 +381,7 @@ public Action Command_DebugFakes(int client, int argc)
{
continue;
}
if (IsFakeClient(i) || IsClientSourceTV(i))
if (IsFakeClient(i) && !IsClientSourceTV(i))
{
iFakes++;
iPlayers--;
@ -398,121 +446,33 @@ public void OnClientDisconnect(int client)
//----------------------------------------------------------------------------------------------------
public void CheckPopulation()
{
int iPlayersSpectate = 0;
int iPlayersInTeam = 0;
int iFakesSpectate = 0;
int iFakesInTeam = 0;
for(int i = 1; i <= MaxClients; i++)
{
if (IsClientConnected(i) && IsClientInGame(i) && IsClientAuthorized(i))
{
if (!IsFakeClient(i) && !IsClientSourceTV(i))
{
if (GetClientTeam(i) > CS_TEAM_SPECTATOR)
{
iPlayersInTeam++;
}
else
{
iPlayersSpectate++;
}
}
else
{
if (GetClientTeam(i) > CS_TEAM_SPECTATOR)
{
iFakesInTeam++;
}
else
{
iFakesSpectate++;
}
}
}
}
int iPlayers = iPlayersInTeam + iPlayersSpectate + iFakesInTeam + iFakesSpectate;
if (iPlayers >= 55)
{
KickFakes();
}
else if (iPlayers < 48)
{
ManageFakes(iPlayersSpectate, iPlayersInTeam, iFakesInTeam, iFakesSpectate);
}
}
public void KickFakes()
{
int fake_in_spec = 0;
int fake_in_team = 0;
int last_in_team = 0;
int last_in_spec = 0;
int fakes = 0;
int last_fake = 0;
for(int i = 1; i <= MaxClients; i++)
{
if (IsClientConnected(i) && IsClientInGame(i) && IsClientAuthorized(i))
{
if (IsFakeClient(i) && !IsClientSourceTV(i))
{
if (GetClientTeam(i) <= CS_TEAM_SPECTATOR)
{
fake_in_spec++;
last_in_spec = i;
}
else
{
fake_in_team++;
last_in_team = i;
}
fakes++;
last_fake = i;
}
}
}
if (fake_in_spec > fake_in_team && last_in_spec != 0)
{
g_iLatency[last_in_spec] = 0;
KickClient(last_in_spec, "Disconnect by user.");
}
else if (last_in_team != 0)
{
g_iLatency[last_in_team] = 0;
KickClient(last_in_team, "Disconnect by user.");
}
}
public void ManageFakes(int iPlayersSpectate, int iPlayersInTeam, int iFakesInTeam, int iFakesSpectate)
{
int limit = 16;
}
int fakes_needed = getFakesNeeded();
if (nightTime())
{
limit /= 2;
fakes_needed /= 2;
}
if (iPlayersSpectate + iPlayersInTeam + 4 < iFakesSpectate + iFakesInTeam || iFakesSpectate + iFakesInTeam > limit)
if (fakes > fakes_needed && last_fake != 0)
{
KickFakes();
g_iLatency[last_fake] = 0;
KickClient(last_fake, "Disconnect by user.");
}
else if (iPlayersSpectate + iPlayersInTeam > iFakesSpectate + iFakesInTeam && iFakesSpectate + iFakesInTeam < limit)
else if (fakes < fakes_needed)
{
CreateFake();
if (iPlayersSpectate + iFakesSpectate > limit || iPlayersInTeam + iFakesInTeam + 2 < iPlayersSpectate + iFakesSpectate)
{
SetFakeToTeam();
}
}
}
public void SetFakeToTeam()
{
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientConnected(i) && IsFakeClient(i) && !IsClientSourceTV(i) && GetClientTeam(i) <= CS_TEAM_SPECTATOR)
{
ChangeClientTeam(i, CS_TEAM_CT);
FakeClientCommandEx(i, "joinclass");
break;
}
}
}
@ -522,8 +482,8 @@ public bool nightTime()
FormatTime(sTime, sizeof(sTime), "%H%M");
int CurTime = StringToInt(sTime);
int MinTime = 2000;
int MaxTime = 500;
int MinTime = 100;
int MaxTime = 400;
//Wrap around.
CurTime = (CurTime <= MinTime) ? CurTime + 2400 : CurTime;
@ -537,6 +497,21 @@ public bool nightTime()
return false;
}
//not used anymore
public void SetFakeToTeam()
{
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientConnected(i) && IsFakeClient(i) && !IsClientSourceTV(i) && GetClientTeam(i) <= CS_TEAM_SPECTATOR)
{
ChangeClientTeam(i, CS_TEAM_CT);
FakeClientCommandEx(i, "joinclass");
break;
}
}
}
public void CreateFake()
{
if (g_hNames.Length == 0 || g_hClanNames.Length == 0)