Multiple bonuses (#982)

* cleanup GetTrackName()

* a few more changes to change mod_zone_bonus & add Track_Bonus_Last

* fix undefined symbol sTrack

* fixup !bwr for multiple bonuses

* fix GetTrackName() after I broke it

* add bonus number param to help text of sm_bwr

* fix !wr after I broke it adding !bwr [bonus number]

* ignore checkpoint zones for now because nothing is ready for them

* update points for bonus #2 through #8 at same time

so instead of something like `9 (track count) * 22 (style count)` queries, it'll do `3 (main, bonus1, rest of bonuses) * 22 (style count)` queries and the rest of the bonuses on the recalc all in the same query
This commit is contained in:
Joe 2020-11-30 16:40:45 +00:00 committed by GitHub
parent 080c64f8b9
commit a1e60b39fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 117 additions and 149 deletions

View File

@ -114,6 +114,7 @@ enum
{
Track_Main,
Track_Bonus,
Track_Bonus_Last = 8,
TRACKS_SIZE
};
@ -452,6 +453,16 @@ stock bool GuessBestMapName(ArrayList maps, const char[] input, char[] output, i
return false;
}
stock void GetTrackName(int client, int track, char[] output, int size)
{
if (track == Track_Main)
FormatEx(output, size, "%T", "Track_Main", client, track);
else if (track >= Track_Bonus)
FormatEx(output, size, "%T", "Track_Bonus", client, track);
else //if (track < Track_Main)
FormatEx(output, size, "%T", "Track_Unknown", client);
}
/**
* Called before shavit-core processes the client's usercmd.
* Before this is called, safety checks (fake/dead clients) happen.

View File

@ -562,9 +562,23 @@ public Action Command_StartTimer(int client, int args)
int track = Track_Main;
if(StrContains(sCommand, "sm_b", false) == 0)
{
if (args < 1)
{
track = Shavit_GetClientTrack(client);
}
else
{
char arg[6];
GetCmdArg(1, arg, sizeof(arg));
track = StringToInt(arg);
}
if (track < Track_Bonus || track > Track_Bonus_Last)
{
track = Track_Bonus;
}
}
if(gCV_AllowTimerWithoutZone.BoolValue || (gB_Zones && (Shavit_ZoneExists(Zone_Start, track) || gB_KZMap)))
{
@ -608,9 +622,23 @@ public Action Command_TeleportEnd(int client, int args)
int track = Track_Main;
if(StrContains(sCommand, "sm_b", false) == 0)
{
if (args < 1)
{
track = Shavit_GetClientTrack(client);
}
else
{
char arg[6];
GetCmdArg(1, arg, sizeof(arg));
track = StringToInt(arg);
}
if (track < Track_Bonus || track > Track_Bonus_Last)
{
track = Track_Bonus;
}
}
if(gB_Zones && (Shavit_ZoneExists(Zone_End, track) || gB_KZMap))
{
@ -1126,7 +1154,7 @@ public Action Command_Style(int client, int args)
char sWR[8];
strcopy(sWR, 8, "WR");
if(gA_Timers[client].iTrack == Track_Bonus)
if(gA_Timers[client].iTrack >= Track_Bonus)
{
strcopy(sWR, 8, "BWR");
}
@ -3528,17 +3556,3 @@ void UpdateStyleSettings(int client)
SetEntityGravity(client, view_as<float>(gA_StyleSettings[gA_Timers[client].iStyle].fGravityMultiplier));
}
void GetTrackName(int client, int track, char[] output, int size)
{
if(track < 0 || track >= TRACKS_SIZE)
{
FormatEx(output, size, "%T", "Track_Unknown", client);
return;
}
static char sTrack[16];
FormatEx(sTrack, 16, "Track_%d", track);
FormatEx(output, size, "%T", sTrack, client);
}

View File

@ -1923,20 +1923,6 @@ public int Native_GetHUDSettings(Handle handler, int numParams)
return gI_HUDSettings[client];
}
void GetTrackName(int client, int track, char[] output, int size)
{
if(track < 0 || track >= TRACKS_SIZE)
{
FormatEx(output, size, "%T", "Track_Unknown", client);
return;
}
static char sTrack[16];
FormatEx(sTrack, 16, "Track_%d", track);
FormatEx(output, size, "%T", sTrack, client);
}
void PrintCSGOHUDText(int client, const char[] format, any ...)
{
char buff[MAX_HINT_SIZE];

View File

@ -968,11 +968,15 @@ void UpdateClanTag(int client)
}
int track = Shavit_GetClientTrack(client);
char sTrack[3];
char sTrack[4];
if(track != Track_Main)
{
GetTrackName(client, track, sTrack, 3);
sTrack[0] = 'B';
if (track > Track_Bonus)
{
FormatEx(sTrack, sizeof(sTrack), "B%d", track);
}
}
char sRank[8];
@ -2854,20 +2858,6 @@ public Action Shavit_OnStart(int client)
return Plugin_Continue;
}
void GetTrackName(int client, int track, char[] output, int size)
{
if(track < 0 || track >= TRACKS_SIZE)
{
FormatEx(output, size, "%T", "Track_Unknown", client);
return;
}
static char sTrack[16];
FormatEx(sTrack, 16, "Track_%d", track);
FormatEx(output, size, "%T", sTrack, client);
}
public void Shavit_OnWorldRecord(int client, int style, float time, int jumps, int strafes, float sync, int track)
{
char sUpperCase[64];

View File

@ -86,8 +86,6 @@ Handle gH_Forwards_OnRankAssigned = null;
chatstrings_t gS_ChatStrings;
int gI_Styles = 0;
stylesettings_t gA_StyleSettings[STYLE_LIMIT];
char gS_StyleNames[STYLE_LIMIT][64];
char gS_TrackNames[TRACKS_SIZE][32];
public Plugin myinfo =
{
@ -159,11 +157,6 @@ public void OnPluginStart()
Shavit_OnChatConfigLoaded();
}
for(int i = 0; i < TRACKS_SIZE; i++)
{
GetTrackName(LANG_SERVER, i, gS_TrackNames[i], 32);
}
SQL_DBConnect();
}
@ -187,7 +180,6 @@ public void Shavit_OnStyleConfigLoaded(int styles)
for(int i = 0; i < gI_Styles; i++)
{
Shavit_GetStyleSettings(i, gA_StyleSettings[i]);
Shavit_GetStyleStrings(i, sStyleName, gS_StyleNames[i], 64);
}
}
@ -645,7 +637,7 @@ void RecalculateAll(const char[] map)
LogError("DEBUG: 5 (RecalculateAll)");
#endif
for(int i = 0; i < TRACKS_SIZE; i++)
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < gI_Styles; j++)
{
@ -654,7 +646,7 @@ void RecalculateAll(const char[] map)
continue;
}
RecalculateMap(map, i, j);
RecalculateMap(map, i, j, (i > Track_Bonus));
}
}
}
@ -664,15 +656,23 @@ public void Shavit_OnFinish_Post(int client, int style, float time, int jumps, i
RecalculateMap(gS_Map, track, style);
}
void RecalculateMap(const char[] map, const int track, const int style)
void RecalculateMap(const char[] map, const int track, const int style, bool restOfTheBonuses=false)
{
#if defined DEBUG
PrintToServer("Recalculating points. (%s, %d, %d)", map, track, style);
#endif
char sQuery[256];
if (restOfTheBonuses)
{
FormatEx(sQuery, 256, "UPDATE %splayertimes SET points = GetRecordPoints(%d, track, time, '%s', %.1f, %.3f) WHERE style = %d AND track > 1 AND map = '%s';",
gS_MySQLPrefix, style, map, gCV_PointsPerTier.FloatValue, gA_StyleSettings[style].fRankingMultiplier, style, map);
}
else
{
FormatEx(sQuery, 256, "UPDATE %splayertimes SET points = GetRecordPoints(%d, %d, time, '%s', %.1f, %.3f) WHERE style = %d AND track = %d AND map = '%s';",
gS_MySQLPrefix, style, track, map, gCV_PointsPerTier.FloatValue, gA_StyleSettings[style].fRankingMultiplier, style, track, map);
}
gH_SQL.Query(SQL_Recalculate_Callback, sQuery, 0, DBPrio_High);
@ -872,20 +872,6 @@ public void SQL_UpdateTop100_Callback(Database db, DBResultSet results, const ch
gH_Top100Menu.ExitButton = true;
}
void GetTrackName(int client, int track, char[] output, int size)
{
if(track < 0 || track >= TRACKS_SIZE)
{
FormatEx(output, size, "%T", "Track_Unknown", client);
return;
}
static char sTrack[16];
FormatEx(sTrack, 16, "Track_%d", track);
FormatEx(output, size, "%T", sTrack, client);
}
public int Native_GetMapTier(Handle handler, int numParams)
{
int tier = 0;

View File

@ -718,7 +718,7 @@ public any Native_GetReplayTime(Handle handler, int numParams)
int style = GetNativeCell(1);
int track = GetNativeCell(2);
if(style < 0 || track < 0)
if(style < 0 || track < 0 || track >= TRACKS_SIZE)
{
return ThrowNativeError(200, "Style/Track out of range");
}
@ -2782,20 +2782,6 @@ int GetSpectatorTarget(int client)
return target;
}
void GetTrackName(int client, int track, char[] output, int size)
{
if(track < 0 || track >= TRACKS_SIZE)
{
FormatEx(output, size, "%T", "Track_Unknown", client);
return;
}
static char sTrack[16];
FormatEx(sTrack, 16, "Track_%d", track);
FormatEx(output, size, "%T", sTrack, client);
}
float GetReplayLength(int style, int track)
{
if(gA_FrameCache[style][track].iFrameCount == 0)

View File

@ -935,17 +935,3 @@ public int Native_GetWRCount(Handle handler, int numParams)
{
return gI_WRAmount[GetNativeCell(1)];
}
void GetTrackName(int client, int track, char[] output, int size)
{
if(track < 0 || track >= TRACKS_SIZE)
{
FormatEx(output, size, "%T", "Track_Unknown", client);
return;
}
static char sTrack[16];
FormatEx(sTrack, 16, "Track_%d", track);
FormatEx(output, size, "%T", sTrack, client);
}

View File

@ -144,9 +144,9 @@ public void OnPluginStart()
RegConsoleCmd("sm_wr", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_wr [map]");
RegConsoleCmd("sm_worldrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_worldrecord [map]");
RegConsoleCmd("sm_bwr", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bwr [map]");
RegConsoleCmd("sm_bworldrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bworldrecord [map]");
RegConsoleCmd("sm_bonusworldrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bonusworldrecord [map]");
RegConsoleCmd("sm_bwr", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bwr [map] [bonus number]");
RegConsoleCmd("sm_bworldrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bworldrecord [map] [bonus number]");
RegConsoleCmd("sm_bonusworldrecord", Command_WorldRecord, "View the leaderboard of a map. Usage: sm_bonusworldrecord [map] [bonus number]");
RegConsoleCmd("sm_recent", Command_RecentRecords, "View the recent #1 times set.");
RegConsoleCmd("sm_recentrecords", Command_RecentRecords, "View the recent #1 times set.");
@ -1315,14 +1315,46 @@ public Action Command_WorldRecord(int client, int args)
return Plugin_Handled;
}
if(args == 0)
char sCommand[16];
GetCmdArg(0, sCommand, 16);
int track = Track_Main;
bool havemap = false;
if(StrContains(sCommand, "sm_b", false) == 0)
{
if (args >= 1)
{
char arg[6];
GetCmdArg((args > 1) ? 2 : 1, arg, sizeof(arg));
track = StringToInt(arg);
// if the track doesn't fit in the bonus track range then assume it's a map name
if (args > 1 || (track < Track_Bonus || track > Track_Bonus_Last))
{
havemap = true;
}
}
if (track < Track_Bonus || track > Track_Bonus_Last)
{
track = Track_Bonus;
}
}
else
{
havemap = (args >= 1);
}
if(!havemap)
{
strcopy(gA_WRCache[client].sClientMap, 128, gS_Map);
}
else
{
GetCmdArgString(gA_WRCache[client].sClientMap, 128);
GetCmdArg(1, gA_WRCache[client].sClientMap, 128);
if (!GuessBestMapName(gA_ValidMaps, gA_WRCache[client].sClientMap, gA_WRCache[client].sClientMap, 128))
{
Shavit_PrintToChat(client, "%t", "Map was not found", gA_WRCache[client].sClientMap);
@ -1330,16 +1362,6 @@ public Action Command_WorldRecord(int client, int args)
}
}
char sCommand[16];
GetCmdArg(0, sCommand, 16);
int track = Track_Main;
if(StrContains(sCommand, "sm_b", false) == 0)
{
track = Track_Bonus;
}
return ShowWRStyleMenu(client, track);
}
@ -2265,17 +2287,3 @@ int GetRankForTime(int style, float time, int track)
return (iRecords + 1);
}
void GetTrackName(int client, int track, char[] output, int size)
{
if(track < 0 || track >= TRACKS_SIZE)
{
FormatEx(output, size, "%T", "Track_Unknown", client);
return;
}
static char sTrack[16];
FormatEx(sTrack, 16, "Track_%d", track);
FormatEx(output, size, "%T", sTrack, client);
}

View File

@ -802,6 +802,11 @@ public void Frame_HookTrigger(any data)
return;
}
if (StrContains(sName, "checkpoint") != -1)
{
return; // TODO
}
int zone = -1;
int track = Track_Main;
@ -817,7 +822,16 @@ public void Frame_HookTrigger(any data)
if(StrContains(sName, "bonus") != -1)
{
track = Track_Bonus;
// Parse out the X in mod_zone_bonus_X_start and mod_zone_bonus_X_end
char sections[8][8];
ExplodeString(sName, "_", sections, 8, 8, false);
track = StringToInt(sections[3]); // 0 on failure to parse. 0 is less than Track_Bonus
if (track < Track_Bonus || track > Track_Bonus_Last)
{
// Just ignore because there's either too many bonuses or X can be 0 and nobody told me
return;
}
}
if(zone != -1)
@ -2197,20 +2211,6 @@ public Action OnClientSayCommand(int client, const char[] command, const char[]
return Plugin_Continue;
}
void GetTrackName(int client, int track, char[] output, int size)
{
if(track < 0 || track >= TRACKS_SIZE)
{
FormatEx(output, size, "%T", "Track_Unknown", client);
return;
}
static char sTrack[16];
FormatEx(sTrack, 16, "Track_%d", track);
FormatEx(output, size, "%T", sTrack, client);
}
void UpdateTeleportZone(int client)
{
float vTeleport[3];

View File

@ -9,13 +9,14 @@
{
"en" "UNKNOWN TRACK"
}
"Track_0"
"Track_Main"
{
"en" "Main"
}
"Track_1"
"Track_Bonus"
{
"en" "Bonus"
"#format" "{1:d}"
"en" "Bonus #{1}"
}
// ---------- Commands ---------- //
"NoCommandAccess"