diff --git a/CHANGELOG.md b/CHANGELOG.md
index 801186aa1..2ca0b17ec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,8 +8,19 @@ Whenever you update your Get5 plugin, remember to **always** update the `transla
Please see the [installation instructions](https://splewis.github.io/get5/latest/installation/#installation) for
details.
+# 0.14.1
+
+#### 2023-04-08
+
+Hotfix of stuff that should have been in 0.14.0.
+
+1. Fixed "create match with current teams" from the `!get5` menu.
+2. Add option to disable formatting known map names via [`get5_format_map_names`](https://splewis.github.io/get5/latest/configuration/#get5_format_map_names).
+
# 0.14.0
+*Note: Removed from releases. Please use 0.14.1 instead.*
+
#### 2023-04-08
### Breaking Changes ðŸ›
diff --git a/documentation/docs/configuration.md b/documentation/docs/configuration.md
index cf58f0528..677c88059 100644
--- a/documentation/docs/configuration.md
+++ b/documentation/docs/configuration.md
@@ -551,6 +551,9 @@ value will be used for your [backup upload HTTP request](#get5_remote_backup_url
## Formats & Paths
+####`get5_format_map_names`
+: Whether to format known map names in chat and menus, i.e. `de_mirage` becomes `Mirage`.
**`Default: 1`**
+
####`get5_time_format`
: Date and time format string. This determines the [`{TIME}`](#tag-time) tag.
**`Default: "%Y-%m-%d_%H-%M-%S"`**
diff --git a/scripting/get5.sp b/scripting/get5.sp
index 513167737..8ee1902fd 100644
--- a/scripting/get5.sp
+++ b/scripting/get5.sp
@@ -63,6 +63,7 @@ ConVar g_DamagePrintExcessCvar;
ConVar g_DamagePrintFormatCvar;
ConVar g_DemoNameFormatCvar;
ConVar g_DisplayGotvVetoCvar;
+ConVar g_FormatMapNamesCvar;
ConVar g_EventLogFormatCvar;
ConVar g_EventLogRemoteURLCvar;
ConVar g_EventLogRemoteHeaderKeyCvar;
@@ -483,6 +484,7 @@ public void OnPluginStart() {
g_MuteAllChatDuringMapSelectionCvar = CreateConVar("get5_mute_allchat_during_map_selection", "1", "If enabled, only the team captains can type in all-chat during map selection.");
g_PauseOnVetoCvar = CreateConVar("get5_pause_on_veto", "1", "Whether the game pauses during map selection.");
g_DisplayGotvVetoCvar = CreateConVar("get5_display_gotv_veto", "0", "Whether to wait for map selection to be broadcast to GOTV before changing map.");
+ g_FormatMapNamesCvar = CreateConVar("get5_format_map_names", "1", "Whether to format known map names.");
// Server config
g_AutoLoadConfigCvar = CreateConVar("get5_autoload_config", "", "The path/name of a match config file to automatically load when the server loads or when the first player joins.");
@@ -1576,7 +1578,7 @@ static Action Event_MatchOver(Event event, const char[] name, bool dontBroadcast
// state immediately while waiting for the restartDelay, we set it here also.
g_MapChangePending = true;
char nextMapFormatted[PLATFORM_MAX_PATH];
- FormatMapName(nextMap, nextMapFormatted, sizeof(nextMapFormatted), true, true);
+ FormatMapName(nextMap, nextMapFormatted, sizeof(nextMapFormatted), g_FormatMapNamesCvar.BoolValue, true);
Get5_MessageToAll("%t", "NextSeriesMapInfoMessage", nextMapFormatted, timeToMapChangeFormatted);
ChangeState(Get5State_PostGame);
// Subtracting 4 seconds makes the map change 1 second before the timer expires, as there is a 3
diff --git a/scripting/get5/get5menu.sp b/scripting/get5/get5menu.sp
index 39de9b999..a6deb1021 100644
--- a/scripting/get5/get5menu.sp
+++ b/scripting/get5/get5menu.sp
@@ -303,8 +303,8 @@ static int SetupMenuHandler(Menu menu, MenuAction action, int client, int param2
return 0;
} else if (StrEqual(infoString, SETUP_MENU_START_MATCH, true)) {
if (g_SetupMenuTeamSelection == Get5SetupMenu_TeamSelectionMode_Current &&
- (GetTeamPlayerCount(Get5Team_1) != g_SetupMenuPlayersPerTeam ||
- GetTeamPlayerCount(Get5Team_2) != g_SetupMenuPlayersPerTeam)) {
+ (GetSidePlayerCount(Get5Side_CT) != g_SetupMenuPlayersPerTeam ||
+ GetSidePlayerCount(Get5Side_T) != g_SetupMenuPlayersPerTeam)) {
Get5_Message(client, "Both teams must have %d player(s) when using current teams.", g_SetupMenuPlayersPerTeam);
} else if (g_SetupMenuTeamSelection == Get5SetupMenu_TeamSelectionMode_Fixed &&
(strlen(g_SetupMenuTeamForTeam1) == 0 || strlen(g_SetupMenuTeamForTeam2) == 0)) {
@@ -337,6 +337,16 @@ static int SetupMenuHandler(Menu menu, MenuAction action, int client, int param2
return 0;
}
+static int GetSidePlayerCount(Get5Side side) {
+ int playerCount = 0;
+ LOOP_CLIENTS(i) {
+ if (IsPlayer(i) && view_as(GetClientTeam(i)) == side) {
+ playerCount++;
+ }
+ }
+ return playerCount;
+}
+
static void ShowSelectTeamsMenu(int client) {
Menu menu = new Menu(SelectTeamsMenuHandler);
menu.SetTitle("Select Teams");
@@ -555,14 +565,19 @@ static void ShowSelectMapMenu(int client) {
sortedMaps.PushString(mapName);
}
- // Sorts maps based on their formatted name.
- sortedMaps.SortCustom(SortMapsBasedOnFormattedName);
+ bool formatMapNames = g_FormatMapNamesCvar.BoolValue;
+ if (formatMapNames) {
+ // Sorts maps based on their formatted name.
+ sortedMaps.SortCustom(SortMapsBasedOnFormattedName);
+ } else {
+ sortedMaps.Sort(Sort_Ascending, Sort_String);
+ }
char formattedMapName[PLATFORM_MAX_PATH];
l = sortedMaps.Length;
for (int i = 0; i < l; i++) {
sortedMaps.GetString(i, mapName, sizeof(mapName));
- FormatMapName(mapName, formattedMapName, sizeof(formattedMapName), true);
+ FormatMapName(mapName, formattedMapName, sizeof(formattedMapName), formatMapNames);
menu.AddItem(mapName, formattedMapName);
}
delete sortedMaps;
@@ -882,8 +897,8 @@ static void CreateMatch(int client) {
if (g_SetupMenuTeamSelection == Get5SetupMenu_TeamSelectionMode_Current) {
- match.SetObject("team1", GetTeamObjectFromCurrentPlayers(Get5Team_1, g_SetupMenuTeam1Captain));
- match.SetObject("team2", GetTeamObjectFromCurrentPlayers(Get5Team_2, g_SetupMenuTeam2Captain));
+ match.SetObject("team1", GetTeamObjectFromCurrentPlayers(Get5Side_CT, g_SetupMenuTeam1Captain));
+ match.SetObject("team2", GetTeamObjectFromCurrentPlayers(Get5Side_T, g_SetupMenuTeam2Captain));
} else if (g_SetupMenuTeamSelection == Get5SetupMenu_TeamSelectionMode_Fixed) {
@@ -897,7 +912,7 @@ static void CreateMatch(int client) {
match.SetObject("team1", g_SetupMenuAvailableTeams.GetObject(g_SetupMenuTeamForTeam1).DeepCopy());
}
- JSON_Object spectators = GetTeamObjectFromCurrentPlayers(Get5Team_Spec);
+ JSON_Object spectators = GetTeamObjectFromCurrentPlayers(Get5Side_Spec);
if (view_as(spectators.GetObject("players")).Length > 0) {
match.SetObject("spectators", spectators);
} else {
diff --git a/scripting/get5/maps.sp b/scripting/get5/maps.sp
index 7f28a43b7..9f8037d39 100644
--- a/scripting/get5/maps.sp
+++ b/scripting/get5/maps.sp
@@ -1,6 +1,6 @@
void ChangeMap(const char[] map, float delay = 3.0) {
char formattedMapName[64];
- FormatMapName(map, formattedMapName, sizeof(formattedMapName), true, true);
+ FormatMapName(map, formattedMapName, sizeof(formattedMapName), g_FormatMapNamesCvar.BoolValue, true);
Get5_MessageToAll("%t", "ChangingMapInfoMessage", formattedMapName);
// pass the "true" name to a timer to changelevel
diff --git a/scripting/get5/mapveto.sp b/scripting/get5/mapveto.sp
index 6f68843f0..8068aef9d 100644
--- a/scripting/get5/mapveto.sp
+++ b/scripting/get5/mapveto.sp
@@ -82,10 +82,11 @@ static void FinishVeto() {
// If a team has a map advantage, don't print that map.
int mapNumber = Get5_GetMapNumber();
+ bool formatMapNames = g_FormatMapNamesCvar.BoolValue;
for (int i = mapNumber; i < g_MapsToPlay.Length; i++) {
char map[PLATFORM_MAX_PATH];
g_MapsToPlay.GetString(i, map, sizeof(map));
- FormatMapName(map, map, sizeof(map), true, true);
+ FormatMapName(map, map, sizeof(map), formatMapNames, true);
Get5_MessageToAll("%t", "MapIsInfoMessage", i + 1 - mapNumber, map);
}
@@ -309,7 +310,7 @@ static void PromptForSideSelectionInChat(const Get5Team team) {
char mapName[PLATFORM_MAX_PATH];
g_MapsToPlay.GetString(g_MapsToPlay.Length - 1, mapName, sizeof(mapName));
char formattedMapName[PLATFORM_MAX_PATH];
- FormatMapName(mapName, formattedMapName, sizeof(formattedMapName), true, true);
+ FormatMapName(mapName, formattedMapName, sizeof(formattedMapName), g_FormatMapNamesCvar.BoolValue, true);
Get5_MessageToAll("%t", "MapSelectionPickSide", g_FormattedTeamNames[team], formattedMapName);
int client = g_VetoCaptains[team];
@@ -325,9 +326,10 @@ static void PromptForSideSelectionInChat(const Get5Team team) {
void ImplodeMapArrayToString(const ArrayList mapPool, char[] buffer, const int bufferSize, bool sort) {
char[][] mapsArray = new char[mapPool.Length][PLATFORM_MAX_PATH];
+ bool formatMapNames = g_FormatMapNamesCvar.BoolValue;
for (int i = 0; i < mapPool.Length; i++) {
mapPool.GetString(i, mapsArray[i], PLATFORM_MAX_PATH);
- FormatMapName(mapsArray[i], mapsArray[i], PLATFORM_MAX_PATH, true, false);
+ FormatMapName(mapsArray[i], mapsArray[i], PLATFORM_MAX_PATH, formatMapNames, false);
}
// Sort alphabetically.
if (sort) {
@@ -345,7 +347,7 @@ static bool BanMap(const char[] mapName, const Get5Team team) {
return false;
}
char mapNameFormatted[PLATFORM_MAX_PATH];
- FormatMapName(mapNameFromArray, mapNameFormatted, sizeof(mapNameFormatted), true, false);
+ FormatMapName(mapNameFromArray, mapNameFormatted, sizeof(mapNameFormatted), g_FormatMapNamesCvar.BoolValue, false);
// Add color here as FormatMapName would make the color green.
Format(mapNameFormatted, sizeof(mapNameFormatted), "{LIGHT_RED}%s{NORMAL}", mapNameFormatted);
Get5_MessageToAll("%t", "TeamBannedMap", g_FormattedTeamNames[team], mapNameFormatted);
@@ -372,7 +374,7 @@ static bool PickMap(const char[] mapName, const Get5Team team) {
}
if (team != Get5Team_None) {
char mapNameFormatted[PLATFORM_MAX_PATH];
- FormatMapName(mapNameFromArray, mapNameFormatted, sizeof(mapNameFormatted), true, true);
+ FormatMapName(mapNameFromArray, mapNameFormatted, sizeof(mapNameFormatted), g_FormatMapNamesCvar.BoolValue, true);
Get5_MessageToAll("%t", "TeamPickedMap", g_FormattedTeamNames[team], mapNameFormatted, g_MapsToPlay.Length + 1);
}
@@ -404,7 +406,7 @@ static void PickSide(const Get5Side side, const Get5Team team) {
char mapName[PLATFORM_MAX_PATH];
g_MapsToPlay.GetString(mapNumber, mapName, sizeof(mapName));
char mapNameFormatted[PLATFORM_MAX_PATH];
- FormatMapName(mapName, mapNameFormatted, sizeof(mapNameFormatted), true, true);
+ FormatMapName(mapName, mapNameFormatted, sizeof(mapNameFormatted), g_FormatMapNamesCvar.BoolValue, true);
char sideFormatted[32];
FormatEx(sideFormatted, sizeof(sideFormatted), "{GREEN}%s{NORMAL}", side == Get5Side_CT ? "CT" : "T");
diff --git a/scripting/get5/matchconfig.sp b/scripting/get5/matchconfig.sp
index 4e0a87011..5f2050b61 100644
--- a/scripting/get5/matchconfig.sp
+++ b/scripting/get5/matchconfig.sp
@@ -1829,8 +1829,8 @@ Action Command_CreateMatch(int client, int args) {
// If neither team is provided, use current teams.
if (!hasTeam1 && !hasTeam2) {
- JSON_Object team1 = GetTeamObjectFromCurrentPlayers(Get5Team_1);
- JSON_Object team2 = GetTeamObjectFromCurrentPlayers(Get5Team_2);
+ JSON_Object team1 = GetTeamObjectFromCurrentPlayers(Get5Side_CT);
+ JSON_Object team2 = GetTeamObjectFromCurrentPlayers(Get5Side_T);
int team1PlayerLength = view_as(team1.GetObject("players")).Length;
int team2PlayerLength = view_as(team2.GetObject("players")).Length;
matchConfig.SetObject("team1", team1);
@@ -2038,7 +2038,7 @@ Action Command_Ringer(int client, int args) {
return Plugin_Handled;
}
-JSON_Object GetTeamObjectFromCurrentPlayers(const Get5Team team, int forcedCaptainClient = 0) {
+JSON_Object GetTeamObjectFromCurrentPlayers(const Get5Side side, int forcedCaptainClient = 0) {
JSON_Object teamObject = new JSON_Object();
JSON_Array players = new JSON_Array();
@@ -2050,7 +2050,7 @@ JSON_Object GetTeamObjectFromCurrentPlayers(const Get5Team team, int forcedCapta
if (forcedCaptainClient > 0) {
LOOP_CLIENTS(i) {
if (i == forcedCaptainClient) {
- if (CheckIfClientIsOnTeam(i, team, false) && GetAuth(i, auth, sizeof(auth))) {
+ if (CheckIfClientIsOnSide(i, side, false) && GetAuth(i, auth, sizeof(auth))) {
SetTeamNameFromClient(i, teamName, sizeof(teamName));
players.PushString(auth);
first = false;
@@ -2064,9 +2064,9 @@ JSON_Object GetTeamObjectFromCurrentPlayers(const Get5Team team, int forcedCapta
// Already added above.
continue;
}
- if (CheckIfClientIsOnTeam(i, team, false) && GetAuth(i, auth, sizeof(auth))) {
+ if (CheckIfClientIsOnSide(i, side, false) && GetAuth(i, auth, sizeof(auth))) {
players.PushString(auth);
- if (first && team != Get5Team_Spec) {
+ if (first && side != Get5Side_Spec) {
SetTeamNameFromClient(i, teamName, sizeof(teamName));
}
first = false;
@@ -2076,15 +2076,17 @@ JSON_Object GetTeamObjectFromCurrentPlayers(const Get5Team team, int forcedCapta
teamObject.SetString("name", teamName);
}
teamObject.SetObject("players", players);
- AddCoachesToAuthJSON(teamObject, team);
+ if (side != Get5Side_Spec) {
+ AddCoachesToAuthJSON(teamObject, side);
+ }
return teamObject;
}
-void AddCoachesToAuthJSON(const JSON_Object json, const Get5Team team) {
+static void AddCoachesToAuthJSON(const JSON_Object json, const Get5Side side) {
JSON_Array coaches;
char auth[AUTH_LENGTH];
LOOP_CLIENTS(i) {
- if (CheckIfClientIsOnTeam(i, team, true) && GetAuth(i, auth, sizeof(auth))) {
+ if (CheckIfClientIsOnSide(i, side, true) && GetAuth(i, auth, sizeof(auth))) {
if (coaches == null) {
coaches = new JSON_Array();
}
@@ -2100,17 +2102,12 @@ static void SetTeamNameFromClient(const int client, char[] teamName, const int t
FormatEx(teamName, teamNameLength, "team_%N", client);
}
-static bool CheckIfClientIsOnTeam(const int client, const Get5Team team, const bool coaching) {
+static bool CheckIfClientIsOnSide(const int client, const Get5Side side, const bool coaching) {
if (!IsAuthedPlayer(client)) {
return false;
}
- Get5Side side = coaching ? GetClientCoachingSide(client) : view_as(GetClientTeam(client));
- if (team == Get5Team_1 && side == Get5Side_CT) {
- return true;
- } else if (team == Get5Team_2 && side == Get5Side_T) {
- return true;
- }
- return false;
+ Get5Side currentSide = coaching ? GetClientCoachingSide(client) : view_as(GetClientTeam(client));
+ return currentSide == side;
}
// Adds the team logos to the download table.
diff --git a/scripting/get5/version.sp b/scripting/get5/version.sp
index 2cfcf6d6f..9c3a6dbe7 100644
--- a/scripting/get5/version.sp
+++ b/scripting/get5/version.sp
@@ -1,4 +1,4 @@
-#define PLUGIN_VERSION "0.14.0-dev"
+#define PLUGIN_VERSION "0.14.1-dev"
// This MUST be the latest version in x.y.z semver format followed by -dev.
// If this is not consistently applied, the update-checker might malfunction.
// In official releases, the CI flow will remove the -dev suffix when compiling the plugin.