trim out some unnecessary point recalculations

This commit is contained in:
rtldg 2022-01-19 00:40:31 +00:00
parent aef89e9bb4
commit b3b7de37e2

View File

@ -75,7 +75,6 @@ bool gB_HasSQLRANK = false; // whether the sql driver supports RANK()
bool gB_Stats = false; bool gB_Stats = false;
bool gB_Late = false; bool gB_Late = false;
bool gB_TierQueried = false; bool gB_TierQueried = false;
bool gB_TierRetrieved = false;
int gI_Tier = 1; // No floating numbers for tiers, sorry. int gI_Tier = 1; // No floating numbers for tiers, sorry.
@ -106,7 +105,6 @@ Handle gH_Forwards_OnRankAssigned = null;
chatstrings_t gS_ChatStrings; chatstrings_t gS_ChatStrings;
int gI_Styles = 0; int gI_Styles = 0;
bool gB_InitialRecalcStarted = false;
bool gB_WorldRecordsCached = false; bool gB_WorldRecordsCached = false;
bool gB_WRHolderTablesMade = false; bool gB_WRHolderTablesMade = false;
bool gB_WRHoldersRefreshed = false; bool gB_WRHoldersRefreshed = false;
@ -187,7 +185,6 @@ public void OnPluginStart()
{ {
Shavit_OnChatConfigLoaded(); Shavit_OnChatConfigLoaded();
Shavit_OnDatabaseLoaded(); Shavit_OnDatabaseLoaded();
UpdateAllPoints();
} }
if (gEV_Type != Engine_TF2) if (gEV_Type != Engine_TF2)
@ -384,6 +381,11 @@ public void OnMapStart()
return; return;
} }
if (gH_Top100Menu == null)
{
UpdateTop100();
}
// Default tier. // Default tier.
// I won't repeat the same mistake blacky has done with tier 3 being default.. // I won't repeat the same mistake blacky has done with tier 3 being default..
gI_Tier = gCV_DefaultTier.IntValue; gI_Tier = gCV_DefaultTier.IntValue;
@ -424,18 +426,7 @@ public void SQL_FillTierCache_Callback(Database db, DBResultSet results, const c
Call_Finish(); Call_Finish();
} }
gB_TierRetrieved = true; if (!gA_MapTiers.GetValue(gS_Map, gI_Tier))
if (gA_MapTiers.GetValue(gS_Map, gI_Tier))
{
if (gB_WorldRecordsCached && !gB_InitialRecalcStarted)
{
gB_InitialRecalcStarted = true;
RecalculateCurrentMap();
UpdateAllPoints();
}
}
else
{ {
Call_StartForward(gH_Forwards_OnTierAssigned); Call_StartForward(gH_Forwards_OnTierAssigned);
Call_PushString(gS_Map); Call_PushString(gS_Map);
@ -445,15 +436,12 @@ public void SQL_FillTierCache_Callback(Database db, DBResultSet results, const c
char sQuery[512]; char sQuery[512];
FormatEx(sQuery, sizeof(sQuery), "REPLACE INTO %smaptiers (map, tier) VALUES ('%s', %d);", gS_MySQLPrefix, gS_Map, gI_Tier); FormatEx(sQuery, sizeof(sQuery), "REPLACE INTO %smaptiers (map, tier) VALUES ('%s', %d);", gS_MySQLPrefix, gS_Map, gI_Tier);
gH_SQL.Query2(SQL_SetMapTier_Callback, sQuery, 0, DBPrio_High); gH_SQL.Query2(SQL_SetMapTier_Callback, sQuery, 0, DBPrio_High);
UpdateAllPoints();
} }
} }
public void OnMapEnd() public void OnMapEnd()
{ {
gB_InitialRecalcStarted = false;
gB_TierQueried = false; gB_TierQueried = false;
gB_TierRetrieved = false;
gB_WRHoldersRefreshed = false; gB_WRHoldersRefreshed = false;
gB_WRHoldersRefreshedTimer = false; gB_WRHoldersRefreshedTimer = false;
gB_WorldRecordsCached = false; gB_WorldRecordsCached = false;
@ -471,19 +459,12 @@ public void Shavit_OnWRDeleted(int style, int id, int track, int accountid, cons
FormatRecalculate(true, track, style, sQuery, sizeof(sQuery)); FormatRecalculate(true, track, style, sQuery, sizeof(sQuery));
gH_SQL.Query2(SQL_Recalculate_Callback, sQuery, (style << 8) | track, DBPrio_High); gH_SQL.Query2(SQL_Recalculate_Callback, sQuery, (style << 8) | track, DBPrio_High);
UpdateAllPoints(); UpdateAllPoints(true);
} }
public void Shavit_OnWorldRecordsCached() public void Shavit_OnWorldRecordsCached()
{ {
gB_WorldRecordsCached = true; gB_WorldRecordsCached = true;
if (gB_TierRetrieved && !gB_InitialRecalcStarted)
{
gB_InitialRecalcStarted = true;
RecalculateCurrentMap();
UpdateAllPoints();
}
} }
public Action Timer_MVPs(Handle timer) public Action Timer_MVPs(Handle timer)
@ -731,23 +712,25 @@ public void SQL_SetMapTier_Callback(Database db, DBResultSet results, const char
return; return;
} }
int client; if (data == null)
char map[PLATFORM_MAX_PATH];
if (data != null)
{ {
data.Reset(); return;
client = data.ReadCell();
data.ReadString(map, sizeof(map));
} }
if (data == null || StrEqual(map, gS_Map)) int serial;
char map[PLATFORM_MAX_PATH];
data.Reset();
serial = data.ReadCell();
data.ReadString(map, sizeof(map));
if (StrEqual(map, gS_Map))
{ {
ReallyRecalculateCurrentMap(); ReallyRecalculateCurrentMap();
} }
else else
{ {
RecalculateSpecificMap(map, client); RecalculateSpecificMap(map, serial);
} }
delete data; delete data;
@ -756,7 +739,6 @@ public void SQL_SetMapTier_Callback(Database db, DBResultSet results, const char
public Action Command_RecalcMap(int client, int args) public Action Command_RecalcMap(int client, int args)
{ {
ReallyRecalculateCurrentMap(); ReallyRecalculateCurrentMap();
UpdateAllPoints(true);
ReplyToCommand(client, "Recalc started."); ReplyToCommand(client, "Recalc started.");
@ -908,16 +890,6 @@ public void Trans_OnRecalcSuccess(Database db, any data, int numQueries, DBResul
ReplyToCommand(client, "- Finished recalculating all points. Recalculating user points, top 100 and user cache."); ReplyToCommand(client, "- Finished recalculating all points. Recalculating user points, top 100 and user cache.");
UpdateAllPoints(true); UpdateAllPoints(true);
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && IsClientAuthorized(i))
{
UpdatePlayerRank(i, false);
}
}
ReplyToCommand(client, "- Done.");
} }
public void Trans_OnRecalcFail(Database db, any data, int numQueries, const char[] error, int failIndex, any[] queryData) public void Trans_OnRecalcFail(Database db, any data, int numQueries, const char[] error, int failIndex, any[] queryData)
@ -925,7 +897,7 @@ public void Trans_OnRecalcFail(Database db, any data, int numQueries, const char
LogError("Timer (rankings) error! Recalculation failed. Reason: %s", error); LogError("Timer (rankings) error! Recalculation failed. Reason: %s", error);
} }
void RecalculateSpecificMap(const char[] map, int client) void RecalculateSpecificMap(const char[] map, int serial)
{ {
Transaction2 trans = new Transaction2(); Transaction2 trans = new Transaction2();
char sQuery[1024]; char sQuery[1024];
@ -943,7 +915,7 @@ void RecalculateSpecificMap(const char[] map, int client)
} }
} }
gH_SQL.Execute(trans, Trans_OnRecalcSuccess, Trans_OnRecalcFail, client); gH_SQL.Execute(trans, Trans_OnRecalcSuccess, Trans_OnRecalcFail, serial);
} }
void ReallyRecalculateCurrentMap() void ReallyRecalculateCurrentMap()
@ -974,6 +946,7 @@ void ReallyRecalculateCurrentMap()
public void Trans_OnReallyRecalcSuccess(Database db, any data, int numQueries, DBResultSet[] results, any[] queryData) public void Trans_OnReallyRecalcSuccess(Database db, any data, int numQueries, DBResultSet[] results, any[] queryData)
{ {
UpdateAllPoints(true, gS_Map);
} }
public void Trans_OnReallyRecalcFail(Database db, any data, int numQueries, const char[] error, int failIndex, any[] queryData) public void Trans_OnReallyRecalcFail(Database db, any data, int numQueries, const char[] error, int failIndex, any[] queryData)
@ -981,35 +954,16 @@ public void Trans_OnReallyRecalcFail(Database db, any data, int numQueries, cons
LogError("Timer (rankings) error! ReallyRecalculateCurrentMap failed. Reason: %s", error); LogError("Timer (rankings) error! ReallyRecalculateCurrentMap failed. Reason: %s", error);
} }
void RecalculateCurrentMap()
{
#if defined DEBUG
LogError("DEBUG: 5 (RecalculateCurrentMap)");
#endif
char sQuery[1024];
for(int i = 0; i < gI_Styles; i++)
{
if (!Shavit_GetStyleSettingBool(i, "unranked") && Shavit_GetStyleSettingFloat(i, "rankingmultiplier") != 0.0)
{
FormatRecalculate(true, Track_Main, i, sQuery, sizeof(sQuery));
gH_SQL.Query2(SQL_Recalculate_Callback, sQuery, (i << 8) | 0, DBPrio_High);
FormatRecalculate(true, Track_Bonus, i, sQuery, sizeof(sQuery));
gH_SQL.Query2(SQL_Recalculate_Callback, sQuery, (i << 8) | 1, DBPrio_High);
}
}
}
public void Shavit_OnFinish_Post(int client, int style, float time, int jumps, int strafes, float sync, int rank, int overwrite, int track) public void Shavit_OnFinish_Post(int client, int style, float time, int jumps, int strafes, float sync, int rank, int overwrite, int track)
{ {
if (rank != 1) if (Shavit_GetStyleSettingBool(style, "unranked") || Shavit_GetStyleSettingFloat(style, "rankingmultiplier") == 0.0)
{ {
return; return;
} }
if (Shavit_GetStyleSettingBool(style, "unranked") || Shavit_GetStyleSettingFloat(style, "rankingmultiplier") == 0.0) if (rank != 1)
{ {
UpdatePointsForSinglePlayer(client);
return; return;
} }
@ -1021,6 +975,7 @@ public void Shavit_OnFinish_Post(int client, int style, float time, int jumps, i
FormatRecalculate(true, track, style, sQuery, sizeof(sQuery)); FormatRecalculate(true, track, style, sQuery, sizeof(sQuery));
gH_SQL.Query2(SQL_Recalculate_Callback, sQuery, (style << 8) | track, DBPrio_High); gH_SQL.Query2(SQL_Recalculate_Callback, sQuery, (style << 8) | track, DBPrio_High);
UpdateAllPoints(true, gS_Map, track);
} }
public void SQL_Recalculate_Callback(Database db, DBResultSet results, const char[] error, any data) public void SQL_Recalculate_Callback(Database db, DBResultSet results, const char[] error, any data)
@ -1040,13 +995,35 @@ public void SQL_Recalculate_Callback(Database db, DBResultSet results, const cha
#endif #endif
} }
void UpdateAllPoints(bool recalcall = false) void UpdatePointsForSinglePlayer(int client)
{
int auth = GetSteamAccountID(client);
char sQuery[1024];
if (gCV_WeightingMultiplier.FloatValue == 1.0)
{
FormatEx(sQuery, sizeof(sQuery),
"UPDATE %susers SET points = (SELECT SUM(points) FROM %splayertimes WHERE auth = %d) WHERE auth = %d;",
gS_MySQLPrefix, gS_MySQLPrefix, auth, auth);
}
else
{
FormatEx(sQuery, sizeof(sQuery),
"UPDATE %susers SET points = GetWeightedPoints(auth) WHERE auth = %d;",
gS_MySQLPrefix, auth);
}
gH_SQL.Query2(SQL_UpdateAllPoints_Callback, sQuery, GetClientSerial(client));
}
void UpdateAllPoints(bool recalcall=false, char[] map="", int track=-1)
{ {
#if defined DEBUG #if defined DEBUG
LogError("DEBUG: 6 (UpdateAllPoints)"); LogError("DEBUG: 6 (UpdateAllPoints)");
#endif #endif
char sQuery[512]; char sQuery[1024];
char sLastLogin[256]; char sLastLogin[256];
if (!recalcall && gCV_LastLoginRecalculate.IntValue > 0) if (!recalcall && gCV_LastLoginRecalculate.IntValue > 0)
@ -1063,11 +1040,29 @@ void UpdateAllPoints(bool recalcall = false)
} }
else else
{ {
char sMapWhere[512];
if (map[0])
{
FormatEx(sMapWhere, sizeof(sMapWhere), "map = '%s'", map);
}
char sTrackWhere[64];
if (track != -1)
{
FormatEx(sTrackWhere, sizeof(sTrackWhere), "track = %d", track);
}
FormatEx(sQuery, sizeof(sQuery), FormatEx(sQuery, sizeof(sQuery),
"UPDATE %susers SET points = GetWeightedPoints(auth) WHERE %s %s auth IN (SELECT DISTINCT auth FROM %splayertimes);", "UPDATE %susers SET points = GetWeightedPoints(auth) WHERE %s %s auth IN (SELECT DISTINCT auth FROM %splayertimes %s %s %s %s);",
gS_MySQLPrefix, gS_MySQLPrefix,
sLastLogin, (sLastLogin[0] != 0) ? "AND" : "", sLastLogin, (sLastLogin[0] != 0) ? "AND" : "",
gS_MySQLPrefix); gS_MySQLPrefix,
(sMapWhere[0] || sTrackWhere[0]) ? "WHERE" : "",
sMapWhere,
(sMapWhere[0] && sTrackWhere[0]) ? "AND" : "",
sTrackWhere);
} }
gH_SQL.Query2(SQL_UpdateAllPoints_Callback, sQuery); gH_SQL.Query2(SQL_UpdateAllPoints_Callback, sQuery);
@ -1082,14 +1077,19 @@ public void SQL_UpdateAllPoints_Callback(Database db, DBResultSet results, const
return; return;
} }
UpdateRankedPlayers(); UpdateTop100();
for (int i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i) && IsClientAuthorized(i))
{
UpdatePlayerRank(i, false);
}
}
} }
void UpdatePlayerRank(int client, bool first) void UpdatePlayerRank(int client, bool first)
{ {
gA_Rankings[client].iRank = 0;
gA_Rankings[client].fPoints = 0.0;
int iSteamID = 0; int iSteamID = 0;
if((iSteamID = GetSteamAccountID(client)) != 0) if((iSteamID = GetSteamAccountID(client)) != 0)
@ -1145,37 +1145,16 @@ public void SQL_UpdatePlayerRank_Callback(Database db, DBResultSet results, cons
} }
} }
void UpdateRankedPlayers()
{
char sQuery[512];
FormatEx(sQuery, 512, "SELECT COUNT(*) count FROM %susers WHERE points > 0.0;",
gS_MySQLPrefix);
gH_SQL.Query2(SQL_UpdateRankedPlayers_Callback, sQuery, 0, DBPrio_High);
}
public void SQL_UpdateRankedPlayers_Callback(Database db, DBResultSet results, const char[] error, any data)
{
if(results == null)
{
LogError("Timer (rankings, update ranked players) error! Reason: %s", error);
return;
}
if(results.FetchRow())
{
gI_RankedPlayers = results.FetchInt(0);
UpdateTop100();
}
}
void UpdateTop100() void UpdateTop100()
{ {
char sQuery[512]; char sQuery[512];
FormatEx(sQuery, 512, "SELECT auth, name, FORMAT(points, 2) FROM %susers WHERE points > 0.0 ORDER BY points DESC LIMIT 100;", gS_MySQLPrefix); FormatEx(sQuery, sizeof(sQuery),
gH_SQL.Query2(SQL_UpdateTop100_Callback, sQuery, 0, DBPrio_Low); "SELECT * FROM (SELECT COUNT(*) as c, 0 as auth, '' as name, '' as p FROM %susers WHERE points > 0) a \
UNION ALL \
SELECT * FROM (SELECT -1 as c, auth, name, points FROM %susers WHERE points > 0 ORDER BY points DESC LIMIT 100) b;",
gS_MySQLPrefix, gS_MySQLPrefix);
gH_SQL.Query2(SQL_UpdateTop100_Callback, sQuery, 0, DBPrio_High);
} }
public void SQL_UpdateTop100_Callback(Database db, DBResultSet results, const char[] error, any data) public void SQL_UpdateTop100_Callback(Database db, DBResultSet results, const char[] error, any data)
@ -1187,33 +1166,31 @@ public void SQL_UpdateTop100_Callback(Database db, DBResultSet results, const ch
return; return;
} }
if(gH_Top100Menu != null) if (!results.FetchRow())
{ {
delete gH_Top100Menu; LogError("Timer (rankings, update top 100 b) error! Reason: failed to fetch first row");
return;
} }
gI_RankedPlayers = results.FetchInt(0);
delete gH_Top100Menu;
gH_Top100Menu = new Menu(MenuHandler_Top); gH_Top100Menu = new Menu(MenuHandler_Top);
int row = 0; int row = 0;
while(results.FetchRow()) while(results.FetchRow())
{ {
if(row > 100)
{
break;
}
char sSteamID[32]; char sSteamID[32];
results.FetchString(0, sSteamID, 32); results.FetchString(1, sSteamID, 32);
char sName[MAX_NAME_LENGTH]; char sName[32+1];
results.FetchString(1, sName, MAX_NAME_LENGTH); results.FetchString(2, sName, sizeof(sName));
char sPoints[16]; float fPoints = results.FetchFloat(3);
results.FetchString(2, sPoints, 16);
char sDisplay[96]; char sDisplay[96];
FormatEx(sDisplay, 96, "#%d - %s (%s)", (++row), sName, sPoints); FormatEx(sDisplay, 96, "#%d - %s (%.2f)", (++row), sName, fPoints);
gH_Top100Menu.AddItem(sSteamID, sDisplay); gH_Top100Menu.AddItem(sSteamID, sDisplay);
} }
@ -1585,6 +1562,5 @@ public void SQL_DeleteMap_Callback(Database db, DBResultSet results, const char[
gI_Tier = gCV_DefaultTier.IntValue; gI_Tier = gCV_DefaultTier.IntValue;
UpdateAllPoints(true); UpdateAllPoints(true);
UpdateRankedPlayers();
} }
} }