mirror of
https://github.com/D1GQ/BetterAmongUs.git
synced 2026-10-20 01:46:19 +00:00
Add new flags
This commit is contained in:
1 parent
3466fd0c7e
commit
569ef39a35
8 files changed
+296
-209
No files matched your search
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in new issue
Block a user