Add new flags

This commit is contained in:
D1GQ committed 2026-01-31 18:02:29 -06:00
1 parent 3466fd0c7e
commit 569ef39a35
8 files changed
+296 -209

No files matched your search

+5 -5
View File
@@ -23,7 +23,7 @@ internal static class RoleHelper
/// </summary>
/// <param name="role">The role type to look up.</param>
/// <returns>The RoleBehaviour if found, null otherwise.</returns>
internal static RoleBehaviour? GetBehaviour(this RoleTypes role)
internal static RoleBehaviour? GetBehaviourPrefab(this RoleTypes role)
{
var lookup = roleLookup.Value;
return lookup.TryGetValue(role, out var behaviour) ? behaviour : null;
@@ -35,7 +35,7 @@ internal static class RoleHelper
/// <param name="role">The role type to check.</param>
/// <returns>True if the role is part of the impostor team, false otherwise.</returns>
internal static bool IsImpostorRole(RoleTypes role) =>
role.GetBehaviour().TeamType is RoleTeamTypes.Impostor;
role.GetBehaviourPrefab().TeamType is RoleTeamTypes.Impostor;
/// <summary>
/// Gets the display name of a role type.
@@ -46,14 +46,14 @@ internal static class RoleHelper
{
if (role is RoleTypes.ImpostorGhost)
{
return RoleTypes.Impostor.GetBehaviour()?.NiceName ?? "???";
return RoleTypes.Impostor.GetBehaviourPrefab()?.NiceName ?? "???";
}
else if (role is RoleTypes.CrewmateGhost)
{
return RoleTypes.Crewmate.GetBehaviour()?.NiceName ?? "???";
return RoleTypes.Crewmate.GetBehaviourPrefab()?.NiceName ?? "???";
}
return role.GetBehaviour()?.NiceName ?? "???";
return role.GetBehaviourPrefab()?.NiceName ?? "???";
}
/// <summary>
+2 -2
View File
@@ -31,7 +31,7 @@ public abstract class OptionItem
internal virtual bool Show => ShowCondition.Invoke();
internal virtual bool ShowChildren => Show;
internal Func<bool>? ShowCondition = () => { return true; };
internal bool Hide => !Show || GetParents().Any(opt => !opt.ShowChildren) || BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_GameSetting + Translation);
internal bool Hide => !Show || GetParents().Any(opt => !opt.ShowChildren) || BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_GameOption + Translation);
internal static OptionItem? GetOptionById(int id) => AllOptions.FirstOrDefault(opt => opt._id == id);
internal virtual void UpdateVisuals(bool updateTabVisuals = true) { }
public abstract string ValueAsString();
@@ -433,7 +433,7 @@ public abstract class OptionItem<T> : OptionItem
protected T? DefaultValue { get; set; } = default;
public virtual T? GetValue()
{
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_GameSetting + Translation))
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_GameOption + Translation))
{
return DefaultValue;
}
+64 -30
View File
@@ -14,104 +14,120 @@ namespace BetterAmongUs.Modules.Support;
public static class BAUModdedSupportFlags
{
// ============================================
// Client Features - General
// Client Features
// ============================================
/// <summary>
/// Flag to disable the Better Ping Tracker feature. When set by another mod, BetterAmongUs will not patch out the normal ping tracker.
/// Disables the enhanced ping display
/// When enabled by another mod, BetterAmongUs will not replace the default ping tracker.
/// </summary>
public static string Disable_BetterPingTracker = "client.disable.betterpingtracker";
/// <summary>
/// Flag to disable the Private Lobby feature. When set by another mod, BetterAmongUs will disable private only lobbies.
/// Disables private lobby functionality.
/// When enabled by another mod, BetterAmongUs will remove private only option when creating a lobby.
/// </summary>
public static string Disable_PrivateLobby = "client.disable.privatelobby";
/// <summary>
/// Flag to disable theme. When set by another mod, BetterAmongUs will disable its theming features.
/// Disables all theming and customization features.
/// When enabled by another mod, BetterAmongUs will use the default game appearance.
/// </summary>
public static string Disable_Theme = "client.disable.theme";
/// <summary>
/// Flag to disable custom mod stamp sprite. When set by another mod, BetterAmongUs will disable its custom mod stamp sprite.
/// Disables the custom mod badge/stamp.
/// When enabled by another mod, BetterAmongUs will use the default mod indicator.
/// </summary>
public static string Disable_CustomModStamp = "client.disable.custommodstamp";
/// <summary>
/// Flag to disable custom ServerDropDown. When set by another mod, BetterAmongUs will disable its custom ServerDropDown.
/// Disables the custom server region dropdown menu.
/// When enabled by another mod, BetterAmongUs will use the default server selection interface.
/// </summary>
public static string Disable_ServerDropDown = "client.disable.serverdropdown";
/// <summary>
/// Flag to disable custom DiscordRP. When set by another mod, BetterAmongUs will disable its custom DiscordRP for BAU.
/// Disables Discord Rich Presence integration.
/// When enabled by another mod, BetterAmongUs will not update Discord status.
/// </summary>
public static string Disable_DiscordRP = "client.disable.discordrp";
/// <summary>
/// Flag to disable custom BAU Http Header. When set by another mod, BetterAmongUs will disable its custom http header it sends when looking for games.
/// Disables the custom HTTP header that identifies BetterAmongUs clients to matchmaking servers.
/// When enabled by another mod, BetterAmongUs will use standard HTTP headers.
/// </summary>
public static string Disable_BAUHttpHeader = "client.disable.bauhttpheader";
// ============================================
// Anti-Cheat Features
// Anti-Cheat System
// ============================================
/// <summary>
/// Flag to disable the anticheat system. When set by another mod, BetterAmongUs will disable its anticheat features.
/// Completely disables the anti-cheat system.
/// When enabled by another mod, all anti-cheat features will be inactive.
/// </summary>
public static string Disable_Anticheat = "anticheat.disable";
/// <summary>
/// Flag prefix to disable specific RPC handlers or their specific handler flags.
/// The full flag should be "anticheat.disable.rpchandler=HandlerClassName" to disable the entire handler,
/// or "anticheat.disable.rpchandler=HandlerClassName:HandlerFlagName" to disable specific handling types.
/// When set by another mod, BetterAmongUs will disable the specified RPC handler or handler flag.
/// <seealso cref="AntiCheat.RPCHandler"/> for the base handler class that can be disabled.
/// <seealso cref="Enums.HandlerFlag"/> for the enum of handler flags that can be selectively disabled.
/// Prefix for disabling specific RPC handlers or handler flags.
/// Format: "anticheat.disable.rpchandler=HandlerClassName" to disable entire handler,
/// or "anticheat.disable.rpchandler=HandlerClassName:HandlerFlagName" for specific flags.
/// When enabled by another mod, BetterAmongUs will skip the specified RPC validations.
/// <seealso cref="AntiCheat.RPCHandler"/> for base handler class.
/// <seealso cref="Enums.HandlerFlag"/> for available handler flags.
/// </summary>
public static string Disable_RPCHandler = "anticheat.disable.rpchandler=";
// ============================================
// Client Features - Command System
// Command System
// ============================================
/// <summary>
/// Flag to disable command system. When set by another mod, BetterAmongUs will disable its command features.
/// Disables the entire command system.
/// When enabled by another mod, no BetterAmongUs commands will be available.
/// </summary>
public static string Disable_AllCommands = "command.disable.allcommands";
/// <summary>
/// Flag prefix to disable specific commands. The full flag should be "client.disable=COMMAND_NAME".
/// When set by another mod, BetterAmongUs will disable the specified command.
/// Prefix for disabling specific commands.
/// Format: "command.disable=COMMAND_NAME"
/// When enabled by another mod, the specified command will be unavailable.
/// <seealso cref="Commands.BaseCommand"/> for base command class.
/// </summary>
public static string Disable_Command = "command.disable=";
/// <summary>
/// Flag prefix for forcing the command prefix for BAU to be "bau:"
/// Forces all BetterAmongUs commands to use the "bau:" prefix.
/// When enabled by another mod, commands must be prefixed with "bau:" to work.
/// </summary>
public static string Force_BAU_Command_Prefix = "command.force.bau.prefix";
// ============================================
// Client Features - Game Settings
// Game Options & Settings
// ============================================
/// <summary>
/// Flag to disable game settings modifications. When set by another mod, BetterAmongUs will not modify game settings.
/// Disables all custom game option modifications.
/// When enabled by another mod, BetterAmongUs will use default game options.
/// </summary>
public static string Disable_AllGameSettings = "gamesetting.disable.allgamesettings";
public static string Disable_AllGameOptions = "gameoption.disable.allgameoptions";
/// <summary>
/// Flag prefix to disable specific game setting. The full flag should be "client.disable=TRANSLATION_NAME".
/// When set by another mod, BetterAmongUs will disable the specified game setting and uses default value.
/// Prefix for disabling specific game options.
/// Format: "gameoption.disable=TRANSLATION_NAME"
/// When enabled by another mod, the specified option will be hidden and use default values.
/// <seealso cref="OptionItems.OptionItem"/> for base option class.
/// </summary>
public static string Disable_GameSetting = "gamesetting.disable=";
public static string Disable_GameOption = "gameoption.disable=";
// ============================================
// Lobby Features
// ============================================
/// <summary>
/// Flag to disable cancel starting game. When set by another mod, BetterAmongUs will not patch start game button.
/// Disables the ability to cancel game start countdown.
/// When enabled by another mod, the start game button cannot be interrupted once clicked.
/// </summary>
public static string Disable_CancelStartingGame = "lobby.disable.cancelstartinggame";
@@ -120,15 +136,33 @@ public static class BAUModdedSupportFlags
// ============================================
/// <summary>
/// Flag to disable mod update button. When set by another mod, BetterAmongUs will not show update button in the main menu.
/// Disables the mod update notification button.
/// When enabled by another mod, update checks and prompts will not appear in the main menu.
/// </summary>
public static string Disable_ModUpdate = "mainmenu.disable.modupdate";
/// <summary>
/// Flag to disable the BetterAmongUs logo in the main menu. When set by another mod, BetterAmongUs will hide its logo.
/// Disables the BetterAmongUs logo/branding in the main menu.
/// When enabled by another mod, the BAU logo will be hidden.
/// </summary>
public static string Disable_BAULogo = "mainmenu.disable.baulogo";
// ============================================
// Gameplay Features
// ============================================
/// <summary>
/// Disables the enhanced role assignment algorithm.
/// When enabled by another mod, BetterAmongUs will use the default role distribution system.
/// </summary>
public static string Disable_BetterRoleAlgorithm = "gameplay.disable.betterrolealgorithm";
/// <summary>
/// Disables the detailed end-game summary screen.
/// When enabled by another mod, only the default end-game screen will be shown.
/// </summary>
public static string Disable_EndGameSummary = "gameplay.disable.endgamesummary";
private static readonly HashSet<string> _flags = [];
private static bool _initialized = false;
@@ -1,163 +0,0 @@
using BetterAmongUs.Helpers;
using BetterAmongUs.Modules;
using BetterAmongUs.Mono;
using HarmonyLib;
using System.Text;
using TMPro;
using UnityEngine;
namespace BetterAmongUs.Patches.Gameplay.Managers;
[HarmonyPatch]
internal static class EndGameManagerPatch
{
[HarmonyPatch(typeof(EndGameManager), nameof(EndGameManager.SetEverythingUp))]
[HarmonyPostfix]
private static void EndGameManager_SetEverythingUp_Postfix(EndGameManager __instance)
{
Logger_.LogHeader($"Game Has Ended - {Enum.GetName(typeof(MapNames), GameState.GetActiveMapId)}/{GameState.GetActiveMapId}", "GamePlayManager");
Logger_.LogHeader("Game Summary Start", "GameSummary");
GameObject SummaryObj = UnityEngine.Object.Instantiate(__instance.WinText.gameObject, __instance.WinText.transform.parent.transform);
SummaryObj.name = "SummaryObj (TMP)";
SummaryObj.transform.SetSiblingIndex(0);
Camera localCamera;
if (HudManager.InstanceExists)
{
localCamera = HudManager.Instance.GetComponentInChildren<Camera>();
}
else
{
localCamera = Camera.main;
}
SummaryObj.transform.position = AspectPosition.ComputeWorldPosition(localCamera, AspectPosition.EdgeAlignments.LeftTop, new Vector3(1f, 0.2f, -5f));
SummaryObj.transform.localScale = new Vector3(0.22f, 0.22f, 0.22f);
TextMeshPro SummaryText = SummaryObj.GetComponent<TextMeshPro>();
if (SummaryText != null)
{
SummaryText.autoSizeTextContainer = false;
SummaryText.enableAutoSizing = false;
SummaryText.lineSpacing = -25f;
SummaryText.alignment = TextAlignmentOptions.TopLeft;
SummaryText.color = Color.white;
NetworkedPlayerInfo[] playersData = GameData.Instance.AllPlayers
.ToArray()
.OrderBy(pd => pd.Disconnected) // Disconnected players last
.ThenBy(pd => pd.IsDead)
.ThenBy(pd => !pd.Role.IsImpostor)
.ToArray(); // Dead players after live players
string winTeam;
string winTag;
string winColor;
switch (EndGameResult.CachedGameOverReason)
{
case GameOverReason.CrewmatesByTask:
winTeam = Translator.GetString(StringNames.Crewmates);
winTag = Translator.GetString("Game.Summary.Result.TasksCompletion");
winColor = "#8cffff";
break;
case GameOverReason.CrewmatesByVote:
winTeam = Translator.GetString(StringNames.Crewmates);
winTag = Translator.GetString("Game.Summary.Result.ImpostersVotedOut");
winColor = "#8cffff";
break;
case GameOverReason.ImpostorDisconnect:
winTeam = Translator.GetString(StringNames.Crewmates);
winTag = Translator.GetString("Game.Summary.Result.ImpostorsDisconnected");
winColor = "#8cffff";
break;
case GameOverReason.ImpostorsByKill:
winTeam = Translator.GetString(StringNames.ImpostorsCategory);
winTag = Translator.GetString("Game.Summary.Result.CrewOutnumbered");
winColor = "#f00202";
break;
case GameOverReason.ImpostorsBySabotage:
winTeam = Translator.GetString(StringNames.ImpostorsCategory);
winTag = Translator.GetString("Game.Summary.Result.Sabotage");
winColor = "#f00202";
break;
case GameOverReason.ImpostorsByVote:
winTeam = Translator.GetString(StringNames.ImpostorsCategory);
winTag = Translator.GetString("Game.Summary.Result.CrewOutnumbered");
winColor = "#f00202";
break;
case GameOverReason.CrewmateDisconnect:
winTeam = Translator.GetString(StringNames.ImpostorsCategory);
winTag = Translator.GetString("Game.Summary.Result.CrematesDisconnected");
winColor = "#f00202";
break;
case GameOverReason.HideAndSeek_CrewmatesByTimer:
winTeam = Translator.GetString("Game.Summary.Hiders");
winTag = Translator.GetString("Game.Summary.Result.TimeOut");
winColor = "#8cffff";
break;
case GameOverReason.HideAndSeek_ImpostorsByKills:
winTeam = Translator.GetString("Game.Summary.Seekers");
winTag = Translator.GetString("Game.Summary.Result.NoSurvivors");
winColor = "#f00202";
break;
default:
winTeam = "Unknown";
winTag = "Unknown";
winColor = "#ffffff";
break;
}
Logger_.Log($"{winTeam}: {winTag}", "GameSummary");
string SummaryHeader = $"<align=\"center\"><size=150%> {Translator.GetString("GameSummary")}</size></align>";
SummaryHeader += $"\n\n<size=90%><color={winColor}>{winTeam} {Translator.GetString("Game.Summary.Won")}</color></size>" +
$"\n<size=60%>\n{Translator.GetString("Game.Summary.By")} {winTag}</size>";
StringBuilder sb = new StringBuilder();
foreach (var data in playersData)
{
var name = $"<color={Utils.Color32ToHex(Palette.PlayerColors[data.DefaultOutfit.ColorId])}>{data.BetterData().RealName}</color>";
string playerTheme(string text) => $"<color={Utils.GetTeamHexColor(data.Role.TeamType)}>{text}</color>";
string roleInfo;
if (data.Role.IsImpostor)
{
roleInfo = $"({playerTheme(data.RoleType.GetRoleName())}) → {playerTheme($"{Translator.GetString("Kills")}: {data.BetterData().RoleInfo.Kills}")}";
}
else
{
roleInfo = $"({playerTheme(data.RoleType.GetRoleName())}) → {playerTheme($"{Translator.GetString("Tasks")}: {data.Tasks.WhereIl2Cpp(task => task.Complete).Count}/{data.Tasks.Count}")}";
}
string deathReason;
if (data.Disconnected)
{
deathReason = $"『<color=#838383><b>{Translator.GetString("DC")}</b></color>』";
}
else if (!data.IsDead)
{
deathReason = $"『<color=#80ff00><b>{Translator.GetString("Alive")}</b></color>』";
}
else if (data.IsDead)
{
deathReason = $"『<color=#ff0600><b>{Translator.GetString("Dead")}</b></color>』";
}
else
{
deathReason = $"『<color=#838383<b>Unknown</b></color>』";
}
Logger_.Log($"{name} {roleInfo} {deathReason}", "GameSummary");
sb.AppendLine($"- {name} {roleInfo} {deathReason}\n");
}
SummaryText.text = $"{SummaryHeader}\n\n<size=58%>{sb}</size>";
Logger_.LogHeader("Game Summary End", "GameSummary");
}
}
}
@@ -1,6 +1,7 @@
using AmongUs.GameOptions;
using BetterAmongUs.Helpers;
using BetterAmongUs.Modules;
using BetterAmongUs.Modules.Support;
using BetterAmongUs.Mono;
using BetterAmongUs.Patches.Gameplay.UI.Settings;
using HarmonyLib;
@@ -37,6 +38,11 @@ internal static class RoleManagerPatch
[HarmonyPrefix]
private static bool RoleManager_SelectRoles_Prefix()
{
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_BetterRoleAlgorithm))
{
return true;
}
if (!GameState.IsHideNSeek)
{
RegularBetterRoleAssignment();
@@ -100,7 +106,7 @@ internal static class RoleManagerPatch
foreach (RoleTypes role in Roles)
{
if (IsImpostorRole(role))
if (role.GetBehaviourPrefab().IsImpostor)
ImpostorRoles[role] = GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(role);
else
CrewmateRoles[role] = GameOptionsManager.Instance.CurrentGameOptions.RoleOptions.GetNumPerGame(role);
@@ -344,8 +350,6 @@ internal static class RoleManagerPatch
return false;
}
private static bool IsImpostorRole(RoleTypes role) => role.GetBehaviour().IsImpostor;
internal static int RNG()
{
switch (BetterGameSettings.RoleRandomizer.GetStringValue())
+212
View File
@@ -0,0 +1,212 @@
using BetterAmongUs.Helpers;
using BetterAmongUs.Modules;
using BetterAmongUs.Modules.Support;
using BetterAmongUs.Mono;
using HarmonyLib;
using System.Text;
using TMPro;
using UnityEngine;
namespace BetterAmongUs.Patches.Gameplay.Managers;
[HarmonyPatch]
internal static class GameSummaryPatch
{
[HarmonyPatch(typeof(EndGameManager), nameof(EndGameManager.SetEverythingUp))]
[HarmonyPostfix]
private static void EndGameManager_SetEverythingUp_Postfix(EndGameManager __instance)
{
LogGameEnd();
if (!BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_EndGameSummary))
{
CreateGameSummary(__instance);
}
}
private static void LogGameEnd()
{
Logger_.LogHeader($"Game Has Ended - {Enum.GetName(typeof(MapNames), GameState.GetActiveMapId)}/{GameState.GetActiveMapId}", "GamePlayManager");
Logger_.LogHeader("Game Summary Start", "GameSummary");
}
private static void CreateGameSummary(EndGameManager endGameManager)
{
var summaryObject = CreateSummaryObject(endGameManager);
var summaryText = summaryObject.GetComponent<TextMeshPro>();
if (summaryText == null) return;
ConfigureSummaryText(summaryText);
var (winTeam, winTag, winColor) = GetWinInfo();
Logger_.Log($"{winTeam}: {winTag}", "GameSummary");
var summaryHeader = BuildSummaryHeader(winTeam, winTag, winColor);
var playerList = BuildPlayerList();
summaryText.text = $"{summaryHeader}\n\n<size=58%>{playerList}</size>";
Logger_.LogHeader("Game Summary End", "GameSummary");
}
private static GameObject CreateSummaryObject(EndGameManager endGameManager)
{
var summaryObject = UnityEngine.Object.Instantiate(
endGameManager.WinText.gameObject,
endGameManager.WinText.transform.parent
);
summaryObject.name = "SummaryObj (TMP)";
summaryObject.transform.SetSiblingIndex(0);
var camera = HudManager.InstanceExists
? HudManager.Instance.GetComponentInChildren<Camera>()
: Camera.main;
var position = AspectPosition.ComputeWorldPosition(
camera,
AspectPosition.EdgeAlignments.LeftTop,
new Vector3(1f, 0.2f, -5f)
);
summaryObject.transform.position = position;
summaryObject.transform.localScale = new Vector3(0.22f, 0.22f, 0.22f);
return summaryObject;
}
private static void ConfigureSummaryText(TextMeshPro text)
{
text.autoSizeTextContainer = false;
text.enableAutoSizing = false;
text.lineSpacing = -25f;
text.alignment = TextAlignmentOptions.TopLeft;
text.color = Color.white;
}
private static (string Team, string Tag, string Color) GetWinInfo()
{
return EndGameResult.CachedGameOverReason switch
{
GameOverReason.CrewmatesByTask => (
Translator.GetString(StringNames.Crewmates),
Translator.GetString("Game.Summary.Result.TasksCompletion"),
"#8cffff"
),
GameOverReason.CrewmatesByVote => (
Translator.GetString(StringNames.Crewmates),
Translator.GetString("Game.Summary.Result.ImpostersVotedOut"),
"#8cffff"
),
GameOverReason.ImpostorDisconnect => (
Translator.GetString(StringNames.Crewmates),
Translator.GetString("Game.Summary.Result.ImpostorsDisconnected"),
"#8cffff"
),
GameOverReason.ImpostorsByKill => (
Translator.GetString(StringNames.ImpostorsCategory),
Translator.GetString("Game.Summary.Result.CrewOutnumbered"),
"#f00202"
),
GameOverReason.ImpostorsBySabotage => (
Translator.GetString(StringNames.ImpostorsCategory),
Translator.GetString("Game.Summary.Result.Sabotage"),
"#f00202"
),
GameOverReason.ImpostorsByVote => (
Translator.GetString(StringNames.ImpostorsCategory),
Translator.GetString("Game.Summary.Result.CrewOutnumbered"),
"#f00202"
),
GameOverReason.CrewmateDisconnect => (
Translator.GetString(StringNames.ImpostorsCategory),
Translator.GetString("Game.Summary.Result.CrematesDisconnected"),
"#f00202"
),
GameOverReason.HideAndSeek_CrewmatesByTimer => (
Translator.GetString("Game.Summary.Hiders"),
Translator.GetString("Game.Summary.Result.TimeOut"),
"#8cffff"
),
GameOverReason.HideAndSeek_ImpostorsByKills => (
Translator.GetString("Game.Summary.Seekers"),
Translator.GetString("Game.Summary.Result.NoSurvivors"),
"#f00202"
),
_ => ("Unknown", "Unknown", "#ffffff")
};
}
private static string BuildSummaryHeader(string winTeam, string winTag, string winColor)
{
return $"<align=\"center\"><size=150%> {Translator.GetString("GameSummary")}</size></align>" +
$"\n\n<size=90%><color={winColor}>{winTeam} {Translator.GetString("Game.Summary.Won")}</color></size>" +
$"\n<size=60%>\n{Translator.GetString("Game.Summary.By")} {winTag}</size>";
}
private static NetworkedPlayerInfo[] GetSortedPlayers()
{
return GameData.Instance.AllPlayers
.ToArray()
.OrderBy(p => p.Disconnected)
.ThenBy(p => p.IsDead)
.ThenBy(p => !p.Role.IsImpostor)
.ToArray();
}
private static StringBuilder BuildPlayerList()
{
var playersData = GetSortedPlayers();
var stringBuilder = new StringBuilder();
foreach (var playerData in playersData)
{
var playerLine = BuildPlayerLine(playerData);
stringBuilder.AppendLine($"- {playerLine}\n");
Logger_.Log(playerLine.Replace("\n", " "), "GameSummary");
}
return stringBuilder;
}
private static string BuildPlayerLine(NetworkedPlayerInfo playerData)
{
var name = $"<color={Utils.Color32ToHex(Palette.PlayerColors[playerData.DefaultOutfit.ColorId])}>{playerData.BetterData().RealName}</color>";
var roleInfo = BuildRoleInfo(playerData);
var deathReason = BuildDeathReason(playerData);
return $"{name} {roleInfo} {deathReason}";
}
private static string BuildRoleInfo(NetworkedPlayerInfo playerData)
{
var themeColor = Utils.GetTeamHexColor(playerData.Role.TeamType);
var theme = (string text) => $"<color={themeColor}>{text}</color>";
var roleName = theme(playerData.RoleType.GetRoleName());
if (playerData.Role.IsImpostor)
{
var kills = playerData.BetterData().RoleInfo.Kills;
return $"({roleName}) → {theme($"{Translator.GetString("Kills")}: {kills}")}";
}
var completedTasks = playerData.Tasks.WhereIl2Cpp(task => task.Complete).Count;
var totalTasks = playerData.Tasks.Count;
return $"({roleName}) → {theme($"{Translator.GetString("Tasks")}: {completedTasks}/{totalTasks}")}";
}
private static string BuildDeathReason(NetworkedPlayerInfo playerData)
{
if (playerData.Disconnected)
return $"『<color=#838383><b>{Translator.GetString("DC")}</b></color>』";
if (!playerData.IsDead)
return $"『<color=#80ff00><b>{Translator.GetString("Alive")}</b></color>』";
if (playerData.IsDead)
return $"『<color=#ff0600><b>{Translator.GetString("Dead")}</b></color>』";
return $"『<color=#838383><b>Unknown</b></color>』";
}
}
@@ -128,7 +128,7 @@ internal static class GameSettingsPatch
[HarmonyPostfix]
private static void GameSettingMenu_Start_Postfix(GameSettingMenu __instance)
{
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameSettings)) return;
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameOptions)) return;
SetupSettings();
@@ -173,7 +173,7 @@ internal static class GameSettingsPatch
[HarmonyPrefix]
private static void GameSettingMenu_ChangeTab_Prefix(GameSettingMenu __instance, [HarmonyArgument(0)] int tabNum, [HarmonyArgument(1)] bool previewOnly)
{
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameSettings)) return;
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameOptions)) return;
if (BetterSettingsTab == null) return;
@@ -197,7 +197,7 @@ internal static class GameSettingsPatch
[HarmonyPrefix]
private static bool GameOptionsMenu_CreateSettings_Prefix(GameOptionsMenu __instance)
{
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameSettings)) return true;
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameOptions)) return true;
if (__instance == BetterSettingsTab.AUTab)
{
@@ -211,7 +211,7 @@ internal static class GameSettingsPatch
[HarmonyPrefix]
private static void OptionsConsole_CanUse_Prefix(OptionsConsole __instance)
{
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameSettings)) return;
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameOptions)) return;
__instance.HostOnly = false;
}
@@ -11,7 +11,7 @@ internal static class NumberOptionPatch
[HarmonyPrefix]
private static bool NumberOption_Increase_Prefix(NumberOption __instance)
{
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameSettings)) return true;
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameOptions)) return true;
int times = 1;
if (Input.GetKey(KeyCode.LeftShift))
@@ -37,7 +37,7 @@ internal static class NumberOptionPatch
[HarmonyPrefix]
private static bool NumberOption_Decrease_Prefix(NumberOption __instance)
{
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameSettings)) return true;
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_AllGameOptions)) return true;
int times = 1;
if (Input.GetKey(KeyCode.LeftShift))