From cb8d12b5ece6aa9370c0cb280c8a1f1644fae0fb Mon Sep 17 00:00:00 2001 From: mxyx Date: Sat, 27 Apr 2024 16:58:31 +0800 Subject: [PATCH] update --- README_ZH-CN.md | 4 +- Strings.xlsx | Bin 31206 -> 31140 bytes TheOtherRoles/Buttons.cs | 4 +- TheOtherRoles/CustomGameModes/HideNSeekGM.cs | 2 +- TheOtherRoles/CustomGameModes/PropHunt.cs | 18 ++++---- TheOtherRoles/CustomOptionHolder.cs | 3 ++ TheOtherRoles/GameHistory.cs | 5 +++ TheOtherRoles/Helper/Helpers.cs | 34 +++++++++++--- TheOtherRoles/Main.cs | 2 - TheOtherRoles/MapOptions.cs | 10 ++--- TheOtherRoles/Modules/ChatCommands.cs | 2 +- .../Modules/CustomHats/CustomHatManager.cs | 9 +--- TheOtherRoles/Modules/CustomOptions.cs | 20 ++++----- TheOtherRoles/Objects/Bomb.cs | 17 ++++--- TheOtherRoles/Objects/CustomButton.cs | 2 +- TheOtherRoles/Patches/CameraPatch.cs | 24 +++++----- TheOtherRoles/Patches/ClientOptionsPatch.cs | 22 ++++----- .../Patches/CreateOptionsPickerPatch.cs | 18 ++++---- TheOtherRoles/Patches/CredentialsPatch.cs | 4 +- TheOtherRoles/Patches/EndGamePatch.cs | 4 +- TheOtherRoles/Patches/ExileControllerPatch.cs | 18 ++++---- .../Patches/GameStartManagerPatch.cs | 14 +++--- .../Patches/HauntMenuMinigamePatch.cs | 4 +- TheOtherRoles/Patches/IntroPatch.cs | 8 ++-- TheOtherRoles/Patches/MainMenuPatch.cs | 10 ++--- TheOtherRoles/Patches/MapBehaviourPatch.cs | 2 +- TheOtherRoles/Patches/MedBayWalkPatch.cs | 4 +- TheOtherRoles/Patches/MeetingPatch.cs | 2 +- TheOtherRoles/Patches/PlayerControlPatch.cs | 42 +++++++++--------- TheOtherRoles/Patches/RoleAssignmentPatch.cs | 12 ++--- TheOtherRoles/Patches/ShipStatusPatch.cs | 4 +- TheOtherRoles/Patches/UpdatePatch.cs | 6 +-- TheOtherRoles/Patches/UsablesPatch.cs | 6 +-- TheOtherRoles/Patches/VitalsPatch.cs | 8 ++-- TheOtherRoles/RPC.cs | 5 +-- TheOtherRoles/Resources/stringData.json | 4 +- TheOtherRoles/RoleInfo.cs | 34 +++++++++----- TheOtherRoles/SoundEffectsManager.cs | 4 +- TheOtherRoles/TheOtherRoles.cs | 4 +- TheOtherRoles/Utilities/GithubUtils.cs | 24 ---------- TheOtherRoles/Utilities/HandleGuesser.cs | 2 +- 41 files changed, 216 insertions(+), 205 deletions(-) delete mode 100644 TheOtherRoles/Utilities/GithubUtils.cs diff --git a/README_ZH-CN.md b/README_ZH-CN.md index 3ad0bb7e..9989d43f 100644 --- a/README_ZH-CN.md +++ b/README_ZH-CN.md @@ -28,7 +28,9 @@ Even more roles are coming soon. - #### 新增内容: - 对所有按钮增加默认冷却为2.5s(给一部分无冷却技能增加提醒) - - 新增 “ 调整紧急破坏持续时间 ” 的选项(使用了SuperNewRoles的部分代码) + - 将模组设置中“在地图上显示管道”选项移动到游戏内预设中,并新增仅在会议中显示管道信息选项 + - 新增 “ 调整紧急破坏持续时间 ” 的选项(使用了[SuperNewRoles](https://github.com/SuperNewRoles/SuperNewRoles)的部分代码) + - 优化随机出生,现在分散不会有延迟了 - 为中国玩家在连接GitHub时自动替换链接为国内镜像源 - 法医:延长被保护的玩家被击杀时的闪光提醒时间(从0.5s增加到1.5s) - 魅魔:将真爱的任务从船员中移除 diff --git a/Strings.xlsx b/Strings.xlsx index 6ba22ff01b5938bb35563d3600a5e6fcdbfb18c6..b21f876a923d455cc7c5e50937700a14ae026e6f 100644 GIT binary patch delta 19885 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 delta 19904 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 3) map--; - if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek) + if (MapOptions.gameMode == CustomGamemodes.HideNSeek) if (CustomOptionHolder.hideNSeekMap.selection != map) CustomOptionHolder.hideNSeekMap.updateSelection(map); - if (TORMapOptions.gameMode == CustomGamemodes.PropHunt) + if (MapOptions.gameMode == CustomGamemodes.PropHunt) if (CustomOptionHolder.propHuntMap.selection != map) CustomOptionHolder.propHuntMap.updateSelection(map); } @@ -721,10 +721,10 @@ public static bool KillButtonClickPatch(KillButton __instance) [HarmonyPatch(typeof(MapBehaviour), nameof(MapBehaviour.Show))] [HarmonyPrefix] - public static void MapBehaviourShowPatch(MapBehaviour __instance, ref MapOptions opts) + public static void MapBehaviourShowPatch(MapBehaviour __instance, ref global::MapOptions opts) { if (!isPropHuntGM) return; - if (opts.Mode == MapOptions.Modes.Sabotage) opts.Mode = MapOptions.Modes.Normal; + if (opts.Mode == global::MapOptions.Modes.Sabotage) opts.Mode = global::MapOptions.Modes.Normal; } diff --git a/TheOtherRoles/CustomOptionHolder.cs b/TheOtherRoles/CustomOptionHolder.cs index 3250aced..a07a56e0 100644 --- a/TheOtherRoles/CustomOptionHolder.cs +++ b/TheOtherRoles/CustomOptionHolder.cs @@ -498,6 +498,7 @@ public class CustomOptionHolder public static CustomOption impostorSeeRoles; public static CustomOption transparentTasks; + public static CustomOption ShowVentsOnMap; public static CustomOption enableMapOptions; public static CustomOption randomGameStartPosition; public static CustomOption randomGameStartToVents; @@ -715,6 +716,8 @@ public static void Load() randomGameStartPosition = CustomOption.Create(50, Types.General, "随机出生点", false, enableMapOptions, true); randomGameStartToVents = CustomOption.Create(51, Types.General, "随机出生在通风口上", false, randomGameStartPosition); + ShowVentsOnMap = CustomOption.Create(211, Types.General, getString("ShowVentsOnMapText"), false, enableMapOptions, true); + enableMiraModify = CustomOption.Create(70, Types.General, cs(new Color(200f / 200f, 200f / 200f, 0, 1f), "Mira"), false, enableMapOptions, true); miraVitals = CustomOption.Create(71, Types.General, "添加生命检测装置", false, enableMiraModify); diff --git a/TheOtherRoles/GameHistory.cs b/TheOtherRoles/GameHistory.cs index d98be73e..04dd379d 100644 --- a/TheOtherRoles/GameHistory.cs +++ b/TheOtherRoles/GameHistory.cs @@ -21,6 +21,11 @@ public enum CustomDeathReason LoveStolen, Loneliness, Arson, + SheriffKill, + SheriffMisfire, + SheriffMisadventure, + Suicide, + BombVictim, } public CustomDeathReason deathReason; diff --git a/TheOtherRoles/Helper/Helpers.cs b/TheOtherRoles/Helper/Helpers.cs index 887182a7..b47bc6bf 100644 --- a/TheOtherRoles/Helper/Helpers.cs +++ b/TheOtherRoles/Helper/Helpers.cs @@ -177,7 +177,7 @@ public static bool isCommsActive() public static bool isCamoComms() { - return isCommsActive() && TORMapOptions.camoComms; + return isCommsActive() && MapOptions.camoComms; } public static bool isActiveCamoComms() @@ -606,7 +606,7 @@ public static bool canBeErased(this PlayerControl player) public static bool shouldShowGhostInfo() { return (CachedPlayer.LocalPlayer.PlayerControl != null && CachedPlayer.LocalPlayer.PlayerControl.Data.IsDead && - TORMapOptions.ghostsSeeInformation) || + MapOptions.ghostsSeeInformation) || AmongUsClient.Instance.GameState == InnerNetClient.GameStates.Ended; } @@ -660,6 +660,30 @@ public static bool isFungle() return GameOptionsManager.Instance.CurrentGameOptions.MapId == 5; } + + public static bool IsCN() + { + return (int)AmongUs.Data.DataManager.Settings.Language.CurrentLanguage == 13; + } + + public static string GithubUrl(this string url) + { + if (IsCN() && !url.Contains("github.moeyy.xyz")) + { + if (url.Contains("github.com")) + { + return url.Replace("https://github.com", "https://github.moeyy.xyz/https://github.com"); + } + + if (url.Contains("raw.githubusercontent.com")) + { + return url.Replace("https://raw.githubusercontent.com", "https://github.moeyy.xyz/https://raw.githubusercontent.com"); + } + } + Info("Rewrite URL" + url); + return url; + } + public static bool MushroomSabotageActive() { return CachedPlayer.LocalPlayer.PlayerControl.myTasks.ToArray() @@ -723,7 +747,7 @@ public static bool hidePlayerName(PlayerControl source, PlayerControl target) if (SurveillanceMinigamePatch.nightVisionIsActive) return true; if (Ninja.isInvisble && Ninja.ninja == target) return true; if (Swooper.isInvisable && Swooper.swooper == target) return true; - if (TORMapOptions.hideOutOfSightNametags && gameStarted && !source.Data.IsDead && GameOptionsManager.Instance.currentNormalGameOptions.MapId != 5 && + if (MapOptions.hideOutOfSightNametags && gameStarted && !source.Data.IsDead && GameOptionsManager.Instance.currentNormalGameOptions.MapId != 5 && PhysicsHelpers.AnythingBetween(localPlayer.GetTruePosition(), target.GetTruePosition(), Constants.ShadowMask, false)) return true; /* @@ -736,7 +760,7 @@ public static bool hidePlayerName(PlayerControl source, PlayerControl target) } } */ - if (!TORMapOptions.hidePlayerNames) return false; // All names are visible + if (!MapOptions.hidePlayerNames) return false; // All names are visible if (source == null || target == null) return true; if (source == target) return false; // Player sees his own name if (source.Data.Role.IsImpostor && (target.Data.Role.IsImpostor || target == Spy.spy || @@ -953,7 +977,7 @@ public static MurderAttemptResult checkMuderAttempt(PlayerControl killer, Player return MurderAttemptResult.PerformKill; // Handle first kill attempt - if (TORMapOptions.shieldFirstKill && TORMapOptions.firstKillPlayer == target) + if (MapOptions.shieldFirstKill && MapOptions.firstKillPlayer == target) return MurderAttemptResult.SuppressKill; // Handle blank shot diff --git a/TheOtherRoles/Main.cs b/TheOtherRoles/Main.cs index feeb1d9c..35a281f9 100644 --- a/TheOtherRoles/Main.cs +++ b/TheOtherRoles/Main.cs @@ -49,7 +49,6 @@ public class TheOtherRolesPlugin : BasePlugin public static ConfigEntry EnableSoundEffects { get; set; } public static ConfigEntry EnableHorseMode { get; set; } public static ConfigEntry ToggleCursor { get; set; } - public static ConfigEntry ShowVentsOnMap { get; set; } public static ConfigEntry enableDebugLogMode { get; set; } public static ConfigEntry Ip { get; set; } public static ConfigEntry Port { get; set; } @@ -107,7 +106,6 @@ public override void Load() EnableSoundEffects = Config.Bind("Custom", "Enable Sound Effects", true); EnableHorseMode = Config.Bind("Custom", "Enable Horse Mode", false); ShowPopUpVersion = Config.Bind("Custom", "Show PopUp", "0"); - ShowVentsOnMap = Config.Bind("Custom", "Show vent positions on minimap", true); enableDebugLogMode = Config.Bind("Custom", "Debug Log Mode", false); Ip = Config.Bind("Custom", "Custom Server IP", "127.0.0.1"); diff --git a/TheOtherRoles/MapOptions.cs b/TheOtherRoles/MapOptions.cs index 5df91fb7..fe6755c9 100644 --- a/TheOtherRoles/MapOptions.cs +++ b/TheOtherRoles/MapOptions.cs @@ -4,7 +4,7 @@ namespace TheOtherRoles; -internal static class TORMapOptions +internal static class MapOptions { // Set values public static int maxNumberOfMeetings = 10; @@ -26,8 +26,8 @@ internal static class TORMapOptions public static bool impostorSeeRoles; public static bool transparentTasks; public static bool hideOutOfSightNametags; - public static bool ShowVentsOnMap = true; - public static bool enableDebugLogMode = false; + public static bool ShowVentsOnMap; + public static bool enableDebugLogMode; public static bool disableMedscanWalking; public static int restrictDevices; @@ -116,8 +116,8 @@ public static void reloadPluginOptions() toggleCursor = TheOtherRolesPlugin.ToggleCursor.Value; enableSoundEffects = TheOtherRolesPlugin.EnableSoundEffects.Value; enableHorseMode = TheOtherRolesPlugin.EnableHorseMode.Value; - ShowVentsOnMap = TheOtherRolesPlugin.ShowVentsOnMap.Value; - ShowVentsOnMap = TheOtherRolesPlugin.enableDebugLogMode.Value; + ShowVentsOnMap = CustomOptionHolder.ShowVentsOnMap.getBool(); + enableDebugLogMode = TheOtherRolesPlugin.enableDebugLogMode.Value; //Patches.ShouldAlwaysHorseAround.isHorseMode = TheOtherRolesPlugin.EnableHorseMode.Value; } diff --git a/TheOtherRoles/Modules/ChatCommands.cs b/TheOtherRoles/Modules/ChatCommands.cs index c62b8d65..036a6bf4 100644 --- a/TheOtherRoles/Modules/ChatCommands.cs +++ b/TheOtherRoles/Modules/ChatCommands.cs @@ -179,7 +179,7 @@ public static void Postfix(HudManager __instance) __instance.Chat.SetVisible(true); if (Multitasker.multitasker.FindAll(x => x.PlayerId == CachedPlayer.LocalPlayer.PlayerId).Count > 0 || - TORMapOptions.transparentTasks) + MapOptions.transparentTasks) { if (PlayerControl.LocalPlayer.Data.IsDead || PlayerControl.LocalPlayer.Data.Disconnected) return; if (!Minigame.Instance) return; diff --git a/TheOtherRoles/Modules/CustomHats/CustomHatManager.cs b/TheOtherRoles/Modules/CustomHats/CustomHatManager.cs index 1cb11fd9..5e868679 100644 --- a/TheOtherRoles/Modules/CustomHats/CustomHatManager.cs +++ b/TheOtherRoles/Modules/CustomHats/CustomHatManager.cs @@ -16,14 +16,7 @@ public static class CustomHatManager public const string InnerslothPackageName = "Innersloth Hats"; public const string DeveloperPackageName = "Developer Hats"; - internal static string RepositoryUrl - { - get - { - var Url = $"https://raw.githubusercontent.com/TheOtherRolesAU/TheOtherHats/master".GithubUrl(); - return Url; - } - } + internal static string RepositoryUrl => $"https://raw.githubusercontent.com/TheOtherRolesAU/TheOtherHats/master".GithubUrl(); internal static readonly string ManifestFileName = "CustomHats.json"; diff --git a/TheOtherRoles/Modules/CustomOptions.cs b/TheOtherRoles/Modules/CustomOptions.cs index e762e9a8..40417b4a 100644 --- a/TheOtherRoles/Modules/CustomOptions.cs +++ b/TheOtherRoles/Modules/CustomOptions.cs @@ -331,7 +331,7 @@ internal class GameOptionsMenuStartPatch { public static void Postfix(GameOptionsMenu __instance) { - switch (TORMapOptions.gameMode) + switch (MapOptions.gameMode) { case CustomGamemodes.Classic: createClassicTabs(__instance); @@ -1143,24 +1143,24 @@ private static string buildOptionsOfType(CustomOptionType type, bool headerOnly) { var sb = new StringBuilder("\n"); var options = CustomOption.options.Where(o => o.type == type); - if (TORMapOptions.gameMode == CustomGamemodes.Guesser) + if (MapOptions.gameMode == CustomGamemodes.Guesser) { if (type == CustomOptionType.General) options = CustomOption.options.Where(o => o.type == type || o.type == CustomOptionType.Guesser); var remove = new List { 308, 310, 311, 312, 313, 314, 315, 316, 317, 318 }; options = options.Where(x => !remove.Contains(x.id)); } - else if (TORMapOptions.gameMode == CustomGamemodes.Classic) + else if (MapOptions.gameMode == CustomGamemodes.Classic) { options = options.Where(x => !(x.type == CustomOptionType.Guesser || x == CustomOptionHolder.crewmateRolesFill)); } - else if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek) + else if (MapOptions.gameMode == CustomGamemodes.HideNSeek) { options = options.Where(x => x.type == CustomOptionType.HideNSeekMain || x.type == CustomOptionType.HideNSeekRoles); } - else if (TORMapOptions.gameMode == CustomGamemodes.PropHunt) + else if (MapOptions.gameMode == CustomGamemodes.PropHunt) { options = options.Where(x => x.type == CustomOptionType.PropHunt); } @@ -1177,7 +1177,7 @@ private static string buildOptionsOfType(CustomOptionType type, bool headerOnly) if (option.id == 30170) //Deputy sb.AppendLine( $"- {Helpers.cs(Deputy.color, "捕快")}: {option.selections[option.selection].ToString()}"); - else if (option.id == 20136) //Sidekick + else if (option.id == 20135) //Sidekick sb.AppendLine( $"- {Helpers.cs(Sidekick.color, "跟班")}: {option.selections[option.selection].ToString()}"); else if (option.id == 20181) //Prosecutor @@ -1190,9 +1190,9 @@ private static string buildOptionsOfType(CustomOptionType type, bool headerOnly) foreach (var option in options) { - if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek && option.type != CustomOptionType.HideNSeekMain && + if (MapOptions.gameMode == CustomGamemodes.HideNSeek && option.type != CustomOptionType.HideNSeekMain && option.type != CustomOptionType.HideNSeekRoles) continue; - if (TORMapOptions.gameMode == CustomGamemodes.PropHunt && + if (MapOptions.gameMode == CustomGamemodes.PropHunt && option.type != CustomOptionType.PropHunt) continue; if (option.parent != null) { @@ -1284,7 +1284,7 @@ public static string buildAllOptions(string vanillaSettings = "", bool hideExtra ? Helpers.cs(DateTime.Now.Second % 2 == 0 ? Color.white : Color.red, "(如有必要,请使用滚轮)\n\n") : ""; - if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek) + if (MapOptions.gameMode == CustomGamemodes.HideNSeek) { if (TheOtherRolesPlugin.optionsPage > 1) TheOtherRolesPlugin.optionsPage = 0; maxPage = 2; @@ -1298,7 +1298,7 @@ public static string buildAllOptions(string vanillaSettings = "", bool hideExtra break; } } - else if (TORMapOptions.gameMode == CustomGamemodes.PropHunt) + else if (MapOptions.gameMode == CustomGamemodes.PropHunt) { maxPage = 1; switch (counter) diff --git a/TheOtherRoles/Objects/Bomb.cs b/TheOtherRoles/Objects/Bomb.cs index d8fac377..8aac8b19 100644 --- a/TheOtherRoles/Objects/Bomb.cs +++ b/TheOtherRoles/Objects/Bomb.cs @@ -85,18 +85,21 @@ public static Sprite getDefuseSprite() public static void explode(Bomb b) { - var local = CachedPlayer.LocalPlayer.PlayerControl; if (b == null) return; if (Terrorist.terrorist != null) { var position = b.bomb.transform.position; - var distance = - Vector2.Distance(position, - CachedPlayer.LocalPlayer.transform - .position); // every player only checks that for their own client (desynct with positions sucks) - if (distance < Terrorist.destructionRange && !CachedPlayer.LocalPlayer.Data.IsDead - || (Terrorist.selfExplosion && local != Terrorist.terrorist)) + // every player only checks that for their own client (desynct with positions sucks) + var distance = Vector2.Distance(position, CachedPlayer.LocalPlayer.transform.position); + + if (distance <= Terrorist.destructionRange && !CachedPlayer.LocalPlayer.Data.IsDead) { + if (Terrorist.selfExplosion && CachedPlayer.LocalPlayer.PlayerControl == Terrorist.terrorist) + { + Terrorist.clearBomb(); + return; + }; + Helpers.checkMurderAttemptAndKill(Terrorist.terrorist, CachedPlayer.LocalPlayer.PlayerControl, false, false, true, true); diff --git a/TheOtherRoles/Objects/CustomButton.cs b/TheOtherRoles/Objects/CustomButton.cs index f91f81db..e64502fd 100644 --- a/TheOtherRoles/Objects/CustomButton.cs +++ b/TheOtherRoles/Objects/CustomButton.cs @@ -71,7 +71,7 @@ public CustomButton(Action OnClick, Func HasButton, Func CouldUse, A button.OnClick.AddListener((UnityAction)onClickEvent); //开局按钮cd - Timer = CustomOptionHolder.resteButtonCooldown.getFloat() + 8.5f; + Timer = ResetButtonCooldown.killCooldown + 8.5f; setActive(false); } diff --git a/TheOtherRoles/Patches/CameraPatch.cs b/TheOtherRoles/Patches/CameraPatch.cs index 1521865e..06198511 100644 --- a/TheOtherRoles/Patches/CameraPatch.cs +++ b/TheOtherRoles/Patches/CameraPatch.cs @@ -23,7 +23,7 @@ public static void ResetData() private static void UseCameraTime() { // Don't waste network traffic if we're out of time. - if (TORMapOptions.restrictDevices > 0 && TORMapOptions.restrictCamerasTime > 0f && + if (MapOptions.restrictDevices > 0 && MapOptions.restrictCamerasTime > 0f && CachedPlayer.LocalPlayer.PlayerControl.isAlive() && CachedPlayer.LocalPlayer.PlayerControl != Hacker.hacker && CachedPlayer.LocalPlayer.PlayerControl != SecurityGuard.securityGuard) @@ -95,7 +95,7 @@ public static bool Prefix(SurveillanceMinigame __instance) if (cameraTimer > 0.1f) UseCameraTime(); - if (TORMapOptions.restrictDevices > 0) + if (MapOptions.restrictDevices > 0) { if (TimeRemaining == null) { @@ -108,13 +108,13 @@ public static bool Prefix(SurveillanceMinigame __instance) TimeRemaining.color = Palette.White; } - if (TORMapOptions.disableCamsRoundOne && TORMapOptions.isRoundOne) + if (MapOptions.disableCamsRoundOne && MapOptions.isRoundOne) { __instance.Close(); return false; } - if (TORMapOptions.restrictCamerasTime <= 0f && + if (MapOptions.restrictCamerasTime <= 0f && CachedPlayer.LocalPlayer.PlayerControl != Hacker.hacker && CachedPlayer.LocalPlayer.PlayerControl != SecurityGuard.securityGuard && !CachedPlayer.LocalPlayer.Data.IsDead) @@ -123,7 +123,7 @@ public static bool Prefix(SurveillanceMinigame __instance) return false; } - var timeString = TimeSpan.FromSeconds(TORMapOptions.restrictCamerasTime).ToString(@"mm\:ss\.ff"); + var timeString = TimeSpan.FromSeconds(MapOptions.restrictCamerasTime).ToString(@"mm\:ss\.ff"); TimeRemaining.text = $"Remaining: {timeString}"; TimeRemaining.gameObject.SetActive(true); } @@ -220,7 +220,7 @@ public static bool Prefix(PlanetSurveillanceMinigame __instance) if (cameraTimer > 0.1f) UseCameraTime(); - if (TORMapOptions.restrictDevices <= 0) return true; + if (MapOptions.restrictDevices <= 0) return true; if (TimeRemaining == null) { TimeRemaining = @@ -232,13 +232,13 @@ public static bool Prefix(PlanetSurveillanceMinigame __instance) TimeRemaining.color = Palette.White; } - if (TORMapOptions.disableCamsRoundOne && TORMapOptions.isRoundOne) + if (MapOptions.disableCamsRoundOne && MapOptions.isRoundOne) { __instance.Close(); return false; } - if (TORMapOptions.restrictCamerasTime <= 0f && + if (MapOptions.restrictCamerasTime <= 0f && CachedPlayer.LocalPlayer.PlayerControl != Hacker.hacker && CachedPlayer.LocalPlayer.PlayerControl != SecurityGuard.securityGuard && !CachedPlayer.LocalPlayer.Data.IsDead) @@ -247,7 +247,7 @@ public static bool Prefix(PlanetSurveillanceMinigame __instance) return false; } - var timeString = TimeSpan.FromSeconds(TORMapOptions.restrictCamerasTime).ToString(@"mm\:ss\.ff"); + var timeString = TimeSpan.FromSeconds(MapOptions.restrictCamerasTime).ToString(@"mm\:ss\.ff"); TimeRemaining.text = $"Remaining: {timeString}"; TimeRemaining.gameObject.SetActive(true); @@ -299,7 +299,7 @@ public static bool Prefix(SecurityLogGame __instance) if (cameraTimer > 0.1f) UseCameraTime(); - if (TORMapOptions.restrictDevices <= 0) return true; + if (MapOptions.restrictDevices <= 0) return true; if (TimeRemaining == null) { TimeRemaining = @@ -311,7 +311,7 @@ public static bool Prefix(SecurityLogGame __instance) TimeRemaining.color = Palette.White; } - if (TORMapOptions.restrictCamerasTime <= 0f && + if (MapOptions.restrictCamerasTime <= 0f && CachedPlayer.LocalPlayer.PlayerControl != Hacker.hacker && CachedPlayer.LocalPlayer.PlayerControl != SecurityGuard.securityGuard && !CachedPlayer.LocalPlayer.Data.IsDead) @@ -320,7 +320,7 @@ public static bool Prefix(SecurityLogGame __instance) return false; } - var timeString = TimeSpan.FromSeconds(TORMapOptions.restrictCamerasTime).ToString(@"mm\:ss\.ff"); + var timeString = TimeSpan.FromSeconds(MapOptions.restrictCamerasTime).ToString(@"mm\:ss\.ff"); TimeRemaining.text = string.Format("Remaining: {0}", timeString); TimeRemaining.gameObject.SetActive(true); diff --git a/TheOtherRoles/Patches/ClientOptionsPatch.cs b/TheOtherRoles/Patches/ClientOptionsPatch.cs index 0ee12575..184c3cd8 100644 --- a/TheOtherRoles/Patches/ClientOptionsPatch.cs +++ b/TheOtherRoles/Patches/ClientOptionsPatch.cs @@ -15,39 +15,35 @@ public static class ClientOptionsPatch private static readonly SelectionBehaviour[] AllOptions = [ new SelectionBehaviour(getString("GhostsSeeInformationText"), - () => TORMapOptions.ghostsSeeInformation = Main.GhostsSeeInformation.Value = + () => MapOptions.ghostsSeeInformation = Main.GhostsSeeInformation.Value = !Main.GhostsSeeInformation.Value, Main.GhostsSeeInformation.Value), new SelectionBehaviour(getString("GhostsSeeVotesText"), - () => TORMapOptions.ghostsSeeVotes = + () => MapOptions.ghostsSeeVotes = Main.GhostsSeeVotes.Value = !Main.GhostsSeeVotes.Value, Main.GhostsSeeVotes.Value), new SelectionBehaviour(getString("GhostsSeeRolesText"), - () => TORMapOptions.ghostsSeeRoles = + () => MapOptions.ghostsSeeRoles = Main.GhostsSeeRoles.Value = !Main.GhostsSeeRoles.Value, Main.GhostsSeeRoles.Value), new SelectionBehaviour(getString("GhostsSeeModifierText"), - () => TORMapOptions.ghostsSeeModifier = Main.GhostsSeeModifier.Value = + () => MapOptions.ghostsSeeModifier = Main.GhostsSeeModifier.Value = !Main.GhostsSeeModifier.Value, Main.GhostsSeeModifier.Value), new SelectionBehaviour(getString("ShowRoleSummaryText"), - () => TORMapOptions.showRoleSummary = + () => MapOptions.showRoleSummary = Main.ShowRoleSummary.Value = !Main.ShowRoleSummary.Value, Main.ShowRoleSummary.Value), new SelectionBehaviour(getString("ShowLighterDarkerText"), - () => TORMapOptions.showLighterDarker = Main.ShowLighterDarker.Value = + () => MapOptions.showLighterDarker = Main.ShowLighterDarker.Value = !Main.ShowLighterDarker.Value, Main.ShowLighterDarker.Value), new SelectionBehaviour(getString("ToggleCursorText"), - () => TORMapOptions.toggleCursor = + () => MapOptions.toggleCursor = Main.ToggleCursor.Value = !Main.ToggleCursor.Value, Main.ToggleCursor.Value), new SelectionBehaviour(getString("EnableSoundEffectsText"), - () => TORMapOptions.enableSoundEffects = Main.EnableSoundEffects.Value = + () => MapOptions.enableSoundEffects = Main.EnableSoundEffects.Value = !Main.EnableSoundEffects.Value, Main.EnableSoundEffects.Value), - new SelectionBehaviour(getString("ShowVentsOnMapText"), - () => TORMapOptions.ShowVentsOnMap = - Main.ShowVentsOnMap.Value = !Main.ShowVentsOnMap.Value, - Main.ShowVentsOnMap.Value), new SelectionBehaviour(getString("EnableDebugLogModeText"), - () => TORMapOptions.enableDebugLogMode = + () => MapOptions.enableDebugLogMode = Main.enableDebugLogMode.Value = !Main.enableDebugLogMode.Value, Main.enableDebugLogMode.Value) ]; diff --git a/TheOtherRoles/Patches/CreateOptionsPickerPatch.cs b/TheOtherRoles/Patches/CreateOptionsPickerPatch.cs index 678e6c37..a374e2d6 100644 --- a/TheOtherRoles/Patches/CreateOptionsPickerPatch.cs +++ b/TheOtherRoles/Patches/CreateOptionsPickerPatch.cs @@ -16,7 +16,7 @@ public static bool Prefix(CreateOptionsPicker __instance, ref GameModes mode) { if (mode <= GameModes.HideNSeek) { - TORMapOptions.gameMode = CustomGamemodes.Classic; + MapOptions.gameMode = CustomGamemodes.Classic; return true; } @@ -26,15 +26,15 @@ public static bool Prefix(CreateOptionsPicker __instance, ref GameModes mode) { case CustomGamemodes.Guesser: __instance.GameModeText.text = getString("isGuesserGm"); - TORMapOptions.gameMode = CustomGamemodes.Guesser; + MapOptions.gameMode = CustomGamemodes.Guesser; break; case CustomGamemodes.HideNSeek: __instance.GameModeText.text = getString("isHideNSeekGM"); - TORMapOptions.gameMode = CustomGamemodes.HideNSeek; + MapOptions.gameMode = CustomGamemodes.HideNSeek; break; case CustomGamemodes.PropHunt: __instance.GameModeText.text = getString("isPropHuntGM"); - TORMapOptions.gameMode = CustomGamemodes.PropHunt; + MapOptions.gameMode = CustomGamemodes.PropHunt; break; } @@ -45,7 +45,7 @@ public static bool Prefix(CreateOptionsPicker __instance, ref GameModes mode) [HarmonyPatch(typeof(CreateOptionsPicker), nameof(CreateOptionsPicker.Refresh))] public static void Postfix(CreateOptionsPicker __instance) { - __instance.GameModeText.text = TORMapOptions.gameMode switch + __instance.GameModeText.text = MapOptions.gameMode switch { CustomGamemodes.Guesser => getString("isGuesserGm"), CustomGamemodes.HideNSeek => getString("isHideNSeekGM"), @@ -89,11 +89,11 @@ public static bool Prefix(GameModeMenu __instance) chatLanguageButton.Button.OnClick.RemoveAllListeners(); chatLanguageButton.Button.OnClick.AddListener((Action)delegate { __instance.ChooseOption(entry); }); - var isCurrentMode = i <= 2 && TORMapOptions.gameMode == CustomGamemodes.Classic + var isCurrentMode = i <= 2 && MapOptions.gameMode == CustomGamemodes.Classic ? (long)entry == gameMode - : (i == 3 && TORMapOptions.gameMode == CustomGamemodes.Guesser) || - (i == 4 && TORMapOptions.gameMode == CustomGamemodes.HideNSeek) || - (i == 5 && TORMapOptions.gameMode == CustomGamemodes.PropHunt); + : (i == 3 && MapOptions.gameMode == CustomGamemodes.Guesser) || + (i == 4 && MapOptions.gameMode == CustomGamemodes.HideNSeek) || + (i == 5 && MapOptions.gameMode == CustomGamemodes.PropHunt); chatLanguageButton.SetSelected(isCurrentMode); __instance.controllerSelectable.Add(chatLanguageButton.Button); if (isCurrentMode) __instance.defaultButtonSelected = chatLanguageButton.Button; diff --git a/TheOtherRoles/Patches/CredentialsPatch.cs b/TheOtherRoles/Patches/CredentialsPatch.cs index 1b205a10..92753966 100644 --- a/TheOtherRoles/Patches/CredentialsPatch.cs +++ b/TheOtherRoles/Patches/CredentialsPatch.cs @@ -58,7 +58,7 @@ private static void Postfix(PingTracker __instance) } else { - var gameModeText = TORMapOptions.gameMode switch + var gameModeText = MapOptions.gameMode switch { CustomGamemodes.HideNSeek => getString("isHideNSeekGM"), CustomGamemodes.Guesser => getString("isGuesserGm"), @@ -152,7 +152,7 @@ public static void updateSprite() renderer.color = new Color(1, 1, 1, 1 - p); if (p == 1) { - renderer.sprite = TORMapOptions.enableHorseMode ? horseBannerSprite : bannerSprite; + renderer.sprite = MapOptions.enableHorseMode ? horseBannerSprite : bannerSprite; instance.StartCoroutine(Effects.Lerp(fadeDuration, new Action(p => { renderer.color = new Color(1, 1, 1, p); }))); } diff --git a/TheOtherRoles/Patches/EndGamePatch.cs b/TheOtherRoles/Patches/EndGamePatch.cs index d57e7220..be272b08 100644 --- a/TheOtherRoles/Patches/EndGamePatch.cs +++ b/TheOtherRoles/Patches/EndGamePatch.cs @@ -384,7 +384,7 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ref En .TotalMilliseconds / 1000; // Reset Settings - if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek) ShipStatusPatch.resetVanillaSettings(); + if (MapOptions.gameMode == CustomGamemodes.HideNSeek) ShipStatusPatch.resetVanillaSettings(); RPCProcedure.resetVariables(); EventUtility.gameEndsUpdate(); } @@ -542,7 +542,7 @@ public static void Postfix(EndGameManager __instance) break; } - if (TORMapOptions.showRoleSummary || HideNSeek.isHideNSeekGM || PropHunt.isPropHuntGM) + if (MapOptions.showRoleSummary || HideNSeek.isHideNSeekGM || PropHunt.isPropHuntGM) { if (Camera.main != null) { diff --git a/TheOtherRoles/Patches/ExileControllerPatch.cs b/TheOtherRoles/Patches/ExileControllerPatch.cs index d70f24aa..5fa886b8 100644 --- a/TheOtherRoles/Patches/ExileControllerPatch.cs +++ b/TheOtherRoles/Patches/ExileControllerPatch.cs @@ -129,16 +129,16 @@ public static void Prefix(ExileController __instance, [HarmonyArgument(0)] ref G // SecurityGuard vents and cameras var allCameras = MapUtilities.CachedShipStatus.AllCameras.ToList(); - TORMapOptions.camerasToAdd.ForEach(camera => + MapOptions.camerasToAdd.ForEach(camera => { camera.gameObject.SetActive(true); camera.gameObject.GetComponent().color = Color.white; allCameras.Add(camera); }); MapUtilities.CachedShipStatus.AllCameras = allCameras.ToArray(); - TORMapOptions.camerasToAdd = new List(); + MapOptions.camerasToAdd = new List(); - foreach (var vent in TORMapOptions.ventsToSeal) + foreach (var vent in MapOptions.ventsToSeal) { var animator = vent.GetComponent(); vent.EnterVentAnim = vent.ExitVentAnim = null; @@ -163,10 +163,10 @@ public static void Prefix(ExileController __instance, [HarmonyArgument(0)] ref G vent.name = "SealedVent_" + vent.name; } - TORMapOptions.ventsToSeal = new List(); + MapOptions.ventsToSeal = new List(); // 1 = reset per turn - if (TORMapOptions.restrictDevices == 1) - TORMapOptions.resetDeviceTimes(); + if (MapOptions.restrictDevices == 1) + MapOptions.resetDeviceTimes(); EventUtility.meetingEndsUpdate(); } @@ -278,14 +278,14 @@ private static void WrapUpPostfix(GameData.PlayerInfo exiled) var BottomLeft = newBottomLeft + new Vector3(-0.25f, -0.25f, 0); foreach (PlayerControl p in CachedPlayer.AllPlayers) { - if (!TORMapOptions.playerIcons.ContainsKey(p.PlayerId)) continue; + if (!MapOptions.playerIcons.ContainsKey(p.PlayerId)) continue; if (p.Data.IsDead || p.Data.Disconnected) { - TORMapOptions.playerIcons[p.PlayerId].gameObject.SetActive(false); + MapOptions.playerIcons[p.PlayerId].gameObject.SetActive(false); } else { - TORMapOptions.playerIcons[p.PlayerId].transform.localPosition = + MapOptions.playerIcons[p.PlayerId].transform.localPosition = newBottomLeft + (Vector3.right * visibleCounter * 0.35f); visibleCounter++; } diff --git a/TheOtherRoles/Patches/GameStartManagerPatch.cs b/TheOtherRoles/Patches/GameStartManagerPatch.cs index 48065b40..9887b87f 100644 --- a/TheOtherRoles/Patches/GameStartManagerPatch.cs +++ b/TheOtherRoles/Patches/GameStartManagerPatch.cs @@ -27,7 +27,7 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] Client { var writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer!.PlayerControl.NetId, (byte)CustomRPC.ShareGamemode, SendOption.Reliable); - writer.Write((byte)TORMapOptions.gameMode); + writer.Write((byte)MapOptions.gameMode); AmongUsClient.Instance.FinishRpcImmediately(writer); } @@ -51,7 +51,7 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] Client { var writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer!.PlayerControl.NetId, (byte)CustomRPC.ShareGamemode, SendOption.Reliable); - writer.Write((byte)TORMapOptions.gameMode); + writer.Write((byte)MapOptions.gameMode); AmongUsClient.Instance.FinishRpcImmediately(writer); } } @@ -306,9 +306,9 @@ void StopStartFunc() if (AmongUsClient.Instance.AmHost) { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGamemode, SendOption.Reliable, -1); - writer.Write((byte)TORMapOptions.gameMode); + writer.Write((byte)MapOptions.gameMode); AmongUsClient.Instance.FinishRpcImmediately(writer); - RPCProcedure.shareGameMode((byte)TORMapOptions.gameMode); + RPCProcedure.shareGameMode((byte)MapOptions.gameMode); } } } @@ -347,11 +347,11 @@ public static bool Prefix(GameStartManager __instance) } if (continueStart && - (TORMapOptions.gameMode == CustomGamemodes.HideNSeek || - TORMapOptions.gameMode == CustomGamemodes.PropHunt) && + (MapOptions.gameMode == CustomGamemodes.HideNSeek || + MapOptions.gameMode == CustomGamemodes.PropHunt) && GameOptionsManager.Instance.CurrentGameOptions.MapId != 6) { - byte mapId = TORMapOptions.gameMode switch + byte mapId = MapOptions.gameMode switch { CustomGamemodes.HideNSeek => (byte)CustomOptionHolder.hideNSeekMap.getSelection(), CustomGamemodes.PropHunt => (byte)CustomOptionHolder.propHuntMap.getSelection(), diff --git a/TheOtherRoles/Patches/HauntMenuMinigamePatch.cs b/TheOtherRoles/Patches/HauntMenuMinigamePatch.cs index b90f8540..b858433b 100644 --- a/TheOtherRoles/Patches/HauntMenuMinigamePatch.cs +++ b/TheOtherRoles/Patches/HauntMenuMinigamePatch.cs @@ -18,7 +18,7 @@ public static void Postfix(HauntMenuMinigame __instance) if (GameOptionsManager.Instance.currentGameOptions.GameMode != GameModes.Normal) return; var target = __instance.HauntTarget; var roleInfo = RoleInfo.getRoleInfoForPlayer(target, false); - var roleString = roleInfo.Count > 0 && TORMapOptions.ghostsSeeRoles ? roleInfo[0].name : ""; + var roleString = roleInfo.Count > 0 && MapOptions.ghostsSeeRoles ? roleInfo[0].name : ""; if (__instance.HauntTarget.Data.IsDead) { __instance.FilterText.text = roleString + " Ghost"; @@ -48,7 +48,7 @@ public static void MatchesFilterPostfix(HauntMenuMinigame __instance, PlayerCont public static bool StartPrefix(HauntMenuMinigame __instance) { if (GameOptionsManager.Instance.currentGameOptions.GameMode != GameModes.Normal || - !TORMapOptions.ghostsSeeRoles) return true; + !MapOptions.ghostsSeeRoles) return true; __instance.FilterButtons[0].gameObject.SetActive(true); var numActive = 0; var numButtons = __instance.FilterButtons.Count(s => s.isActiveAndEnabled); diff --git a/TheOtherRoles/Patches/IntroPatch.cs b/TheOtherRoles/Patches/IntroPatch.cs index 42aac379..214afbfd 100644 --- a/TheOtherRoles/Patches/IntroPatch.cs +++ b/TheOtherRoles/Patches/IntroPatch.cs @@ -47,7 +47,7 @@ public static void Prefix(IntroCutscene __instance) //PlayerControl.SetPetImage(data.DefaultOutfit.PetId, data.DefaultOutfit.ColorId, player.PetSlot); player.cosmetics.nameText.text = data.PlayerName; player.SetFlipX(true); - TORMapOptions.playerIcons[p.PlayerId] = player; + MapOptions.playerIcons[p.PlayerId] = player; player.gameObject.SetActive(false); if (CachedPlayer.LocalPlayer.PlayerControl == Arsonist.arsonist && p != Arsonist.arsonist) @@ -155,11 +155,11 @@ public static void Prefix(IntroCutscene __instance) } // First kill - if (AmongUsClient.Instance.AmHost && TORMapOptions.shieldFirstKill && TORMapOptions.firstKillName != "" && + if (AmongUsClient.Instance.AmHost && MapOptions.shieldFirstKill && MapOptions.firstKillName != "" && !HideNSeek.isHideNSeekGM && !PropHunt.isPropHuntGM) { var target = PlayerControl.AllPlayerControls.ToArray().ToList() - .FirstOrDefault(x => x.Data.PlayerName.Equals(TORMapOptions.firstKillName)); + .FirstOrDefault(x => x.Data.PlayerName.Equals(MapOptions.firstKillName)); if (target != null) { var writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, @@ -170,7 +170,7 @@ public static void Prefix(IntroCutscene __instance) } } - TORMapOptions.firstKillName = ""; + MapOptions.firstKillName = ""; EventUtility.gameStartsUpdate(); diff --git a/TheOtherRoles/Patches/MainMenuPatch.cs b/TheOtherRoles/Patches/MainMenuPatch.cs index 9fd3ffd2..62d57905 100644 --- a/TheOtherRoles/Patches/MainMenuPatch.cs +++ b/TheOtherRoles/Patches/MainMenuPatch.cs @@ -13,7 +13,7 @@ namespace TheOtherRoles.Modules; [HarmonyPatch(typeof(MainMenuManager), nameof(MainMenuManager.Start))] public class MainMenuPatch { - private static bool horseButtonState = TORMapOptions.enableHorseMode; + private static bool horseButtonState = MapOptions.enableHorseMode; //private static Sprite horseModeOffSprite = null; //private static Sprite horseModeOnSprite = null; @@ -134,7 +134,7 @@ public static void addSceneChangeCallbacks() SceneManager.add_sceneLoaded((Action)((scene, _) => { if (!scene.name.Equals("MatchMaking", StringComparison.Ordinal)) return; - TORMapOptions.gameMode = CustomGamemodes.Classic; + MapOptions.gameMode = CustomGamemodes.Classic; // Add buttons For Guesser Mode, Hide N Seek in this scene. // find "HostLocalGameButton" var template = Object.FindObjectOfType(); @@ -149,7 +149,7 @@ public static void addSceneChangeCallbacks() guesserButtonPassiveButton.OnClick = new Button.ButtonClickedEvent(); guesserButtonPassiveButton.OnClick.AddListener((Action)(() => { - TORMapOptions.gameMode = CustomGamemodes.Guesser; + MapOptions.gameMode = CustomGamemodes.Guesser; template.OnClick(); })); @@ -161,7 +161,7 @@ public static void addSceneChangeCallbacks() HideNSeekButtonPassiveButton.OnClick = new Button.ButtonClickedEvent(); HideNSeekButtonPassiveButton.OnClick.AddListener((Action)(() => { - TORMapOptions.gameMode = CustomGamemodes.HideNSeek; + MapOptions.gameMode = CustomGamemodes.HideNSeek; template.OnClick(); })); @@ -173,7 +173,7 @@ public static void addSceneChangeCallbacks() PropHuntButtonPassiveButton.OnClick = new Button.ButtonClickedEvent(); PropHuntButtonPassiveButton.OnClick.AddListener((Action)(() => { - TORMapOptions.gameMode = CustomGamemodes.PropHunt; + MapOptions.gameMode = CustomGamemodes.PropHunt; template.OnClick(); })); diff --git a/TheOtherRoles/Patches/MapBehaviourPatch.cs b/TheOtherRoles/Patches/MapBehaviourPatch.cs index 48458f49..068d9005 100644 --- a/TheOtherRoles/Patches/MapBehaviourPatch.cs +++ b/TheOtherRoles/Patches/MapBehaviourPatch.cs @@ -111,7 +111,7 @@ private static void Postfix(MapBehaviour __instance) PlayerControl.LocalPlayer.Data.IsDead)) continue; //for trickster vents - if (!Main.ShowVentsOnMap.Value) + if (!MapOptions.ShowVentsOnMap) { if (mapIcons.Count > 0) { diff --git a/TheOtherRoles/Patches/MedBayWalkPatch.cs b/TheOtherRoles/Patches/MedBayWalkPatch.cs index b4ba066b..4b79b8a3 100644 --- a/TheOtherRoles/Patches/MedBayWalkPatch.cs +++ b/TheOtherRoles/Patches/MedBayWalkPatch.cs @@ -7,7 +7,7 @@ internal class MedscanMiniGamePatchWTP { private static bool Prefix(MedScanMinigame._WalkToPad_d__16 __instance) { - if (TORMapOptions.disableMedscanWalking) + if (MapOptions.disableMedscanWalking) { var num = __instance.__1__state; var medScanMinigame = __instance.__4__this; @@ -41,7 +41,7 @@ internal class MedscanMiniGamePatchWTO { private static bool Prefix(MedScanMinigame._WalkToOffset_d__15 __instance) { - if (TORMapOptions.disableMedscanWalking) + if (MapOptions.disableMedscanWalking) { var num = __instance.__1__state; var medScanMinigame = __instance.__4__this; diff --git a/TheOtherRoles/Patches/MeetingPatch.cs b/TheOtherRoles/Patches/MeetingPatch.cs index 9d586661..dcbabe1b 100644 --- a/TheOtherRoles/Patches/MeetingPatch.cs +++ b/TheOtherRoles/Patches/MeetingPatch.cs @@ -10,7 +10,7 @@ using TMPro; using UnityEngine; using static TheOtherRoles.TheOtherRoles; -using static TheOtherRoles.TORMapOptions; +using static TheOtherRoles.MapOptions; using Object = UnityEngine.Object; using Random = System.Random; diff --git a/TheOtherRoles/Patches/PlayerControlPatch.cs b/TheOtherRoles/Patches/PlayerControlPatch.cs index c67f49b1..9a85d563 100644 --- a/TheOtherRoles/Patches/PlayerControlPatch.cs +++ b/TheOtherRoles/Patches/PlayerControlPatch.cs @@ -107,9 +107,9 @@ private static void setBasePlayerOutlines() } if (!Helpers.isCamoComms() && Camouflager.camouflageTimer <= 0f && !Helpers.MushroomSabotageActive() && - TORMapOptions.firstKillPlayer != null && TORMapOptions.shieldFirstKill && - ((target == TORMapOptions.firstKillPlayer && !isMorphedMorphling) || - (isMorphedMorphling && Morphling.morphTarget == TORMapOptions.firstKillPlayer))) + MapOptions.firstKillPlayer != null && MapOptions.shieldFirstKill && + ((target == MapOptions.firstKillPlayer && !isMorphedMorphling) || + (isMorphedMorphling && Morphling.morphTarget == MapOptions.firstKillPlayer))) { hasVisibleShield = true; color = Color.blue; @@ -767,7 +767,7 @@ public static void updatePlayerInfo() CachedPlayer.LocalPlayer.Data.IsDead || (CachedPlayer.LocalPlayer.PlayerControl == Slueth.slueth && Slueth.reported.Any(x => x.PlayerId == p.PlayerId)) || - (TORMapOptions.impostorSeeRoles && Spy.spy == null && CachedPlayer.LocalPlayer.Data.Role.IsImpostor && + (MapOptions.impostorSeeRoles && Spy.spy == null && CachedPlayer.LocalPlayer.Data.Role.IsImpostor && !CachedPlayer.LocalPlayer.Data.IsDead && p == (p.Data.Role.IsImpostor && !p.Data.IsDead)) || (CachedPlayer.LocalPlayer.PlayerControl == Poucher.poucher && Poucher.killed.Any(x => x.PlayerId == p.PlayerId))) @@ -806,12 +806,12 @@ public static void updatePlayerInfo() var (tasksCompleted, tasksTotal) = TasksHandler.taskInfo(p.Data); var roleNames = RoleInfo.GetRolesString(p, true, false); - var roleText = RoleInfo.GetRolesString(p, true, TORMapOptions.ghostsSeeModifier); + var roleText = RoleInfo.GetRolesString(p, true, MapOptions.ghostsSeeModifier); var taskInfo = tasksTotal > 0 ? $"({tasksCompleted}/{tasksTotal})" : ""; var playerInfoText = ""; var meetingInfoText = ""; - if (p == CachedPlayer.LocalPlayer.PlayerControl || (TORMapOptions.impostorSeeRoles && Spy.spy == null && + if (p == CachedPlayer.LocalPlayer.PlayerControl || (MapOptions.impostorSeeRoles && Spy.spy == null && CachedPlayer.LocalPlayer.Data.Role.IsImpostor && !CachedPlayer.LocalPlayer.Data.IsDead && p == (p.Data.Role.IsImpostor && !p.Data.IsDead))) @@ -829,17 +829,17 @@ public static void updatePlayerInfo() meetingInfoText = $"{roleNames} {taskInfo}".Trim(); } - else if (TORMapOptions.ghostsSeeRoles && TORMapOptions.ghostsSeeInformation) + else if (MapOptions.ghostsSeeRoles && MapOptions.ghostsSeeInformation) { playerInfoText = $"{roleText} {taskInfo}".Trim(); meetingInfoText = playerInfoText; } - else if (TORMapOptions.ghostsSeeInformation) + else if (MapOptions.ghostsSeeInformation) { playerInfoText = $"{taskInfo}".Trim(); meetingInfoText = playerInfoText; } - else if (TORMapOptions.ghostsSeeRoles || (Lawyer.lawyerKnowsRole && !Lawyer.isProsecutor && + else if (MapOptions.ghostsSeeRoles || (Lawyer.lawyerKnowsRole && !Lawyer.isProsecutor && CachedPlayer.LocalPlayer.PlayerControl == Lawyer.lawyer && p == Lawyer.target)) { @@ -1040,7 +1040,7 @@ private static void bountyHunterUpdate() Object.Destroy(BountyHunter.cooldownText.gameObject); BountyHunter.cooldownText = null; BountyHunter.bounty = null; - foreach (var p in TORMapOptions.playerIcons.Values) + foreach (var p in MapOptions.playerIcons.Values) if (p != null && p.gameObject != null) p.gameObject.SetActive(false); return; @@ -1077,17 +1077,17 @@ private static void bountyHunterUpdate() if (FastDestroyableSingleton.Instance != null && FastDestroyableSingleton.Instance.UseButton != null) { - foreach (var pp in TORMapOptions.playerIcons.Values) pp.gameObject.SetActive(false); - if (TORMapOptions.playerIcons.ContainsKey(BountyHunter.bounty.PlayerId) && - TORMapOptions.playerIcons[BountyHunter.bounty.PlayerId].gameObject != null) - TORMapOptions.playerIcons[BountyHunter.bounty.PlayerId].gameObject.SetActive(true); + foreach (var pp in MapOptions.playerIcons.Values) pp.gameObject.SetActive(false); + if (MapOptions.playerIcons.ContainsKey(BountyHunter.bounty.PlayerId) && + MapOptions.playerIcons[BountyHunter.bounty.PlayerId].gameObject != null) + MapOptions.playerIcons[BountyHunter.bounty.PlayerId].gameObject.SetActive(true); } } // Hide in meeting - if (MeetingHud.Instance && TORMapOptions.playerIcons.ContainsKey(BountyHunter.bounty.PlayerId) && - TORMapOptions.playerIcons[BountyHunter.bounty.PlayerId].gameObject != null) - TORMapOptions.playerIcons[BountyHunter.bounty.PlayerId].gameObject.SetActive(false); + if (MeetingHud.Instance && MapOptions.playerIcons.ContainsKey(BountyHunter.bounty.PlayerId) && + MapOptions.playerIcons[BountyHunter.bounty.PlayerId].gameObject != null) + MapOptions.playerIcons[BountyHunter.bounty.PlayerId].gameObject.SetActive(false); // Update Cooldown Text if (BountyHunter.cooldownText != null) @@ -2022,7 +2022,7 @@ public static void Postfix(PlayerControl __instance, [HarmonyArgument(0)] Player target.clearAllTasks(); // First kill (set before lover suicide) - if (TORMapOptions.firstKillName == "") TORMapOptions.firstKillName = target.Data.PlayerName; + if (MapOptions.firstKillName == "") MapOptions.firstKillName = target.Data.PlayerName; // Lover suicide trigger on murder if ((Lovers.lover1 != null && target == Lovers.lover1) || (Lovers.lover2 != null && target == Lovers.lover2)) @@ -2172,14 +2172,14 @@ public static void Postfix(PlayerControl __instance, [HarmonyArgument(0)] Player var bottomLeft = IntroCutsceneOnDestroyPatch.bottomLeft + new Vector3(-0.25f, -0.25f, 0); foreach (PlayerControl p in CachedPlayer.AllPlayers) { - if (!TORMapOptions.playerIcons.ContainsKey(p.PlayerId) || p.Data.Role.IsImpostor) continue; + if (!MapOptions.playerIcons.ContainsKey(p.PlayerId) || p.Data.Role.IsImpostor) continue; if (p.Data.IsDead || p.Data.Disconnected) { - TORMapOptions.playerIcons[p.PlayerId].gameObject.SetActive(false); + MapOptions.playerIcons[p.PlayerId].gameObject.SetActive(false); } else { - TORMapOptions.playerIcons[p.PlayerId].transform.localPosition = + MapOptions.playerIcons[p.PlayerId].transform.localPosition = bottomLeft + (Vector3.right * visibleCounter * 0.35f); visibleCounter++; } diff --git a/TheOtherRoles/Patches/RoleAssignmentPatch.cs b/TheOtherRoles/Patches/RoleAssignmentPatch.cs index 45607a03..f021cf68 100644 --- a/TheOtherRoles/Patches/RoleAssignmentPatch.cs +++ b/TheOtherRoles/Patches/RoleAssignmentPatch.cs @@ -27,9 +27,9 @@ internal class GameOptionsDataGetAdjustedNumImpostorsPatch { public static void Postfix(ref int __result) { - if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek || TORMapOptions.gameMode == CustomGamemodes.PropHunt) + if (MapOptions.gameMode == CustomGamemodes.HideNSeek || MapOptions.gameMode == CustomGamemodes.PropHunt) { - var impCount = TORMapOptions.gameMode == CustomGamemodes.HideNSeek + var impCount = MapOptions.gameMode == CustomGamemodes.HideNSeek ? Mathf.RoundToInt(CustomOptionHolder.hideNSeekHunterCount.getFloat()) : CustomOptionHolder.propHuntNumberOfHunters.getQuantity(); __result = impCount; @@ -48,9 +48,9 @@ internal class GameOptionsDataValidatePatch { public static void Postfix(GameOptionsData __instance) { - if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek || + if (MapOptions.gameMode == CustomGamemodes.HideNSeek || GameOptionsManager.Instance.CurrentGameOptions.GameMode != GameModes.Normal) return; - if (TORMapOptions.gameMode == CustomGamemodes.PropHunt) + if (MapOptions.gameMode == CustomGamemodes.PropHunt) __instance.NumImpostors = CustomOptionHolder.propHuntNumberOfHunters.getQuantity(); __instance.NumImpostors = GameOptionsManager.Instance.CurrentGameOptions.NumImpostors; } @@ -65,7 +65,7 @@ internal class RoleManagerSelectRolesPatch //private static bool isEvilGuesser; private static readonly List> playerRoleMap = new(); - public static bool isGuesserGamemode => TORMapOptions.gameMode == CustomGamemodes.Guesser; + public static bool isGuesserGamemode => MapOptions.gameMode == CustomGamemodes.Guesser; public static void Postfix() { @@ -73,7 +73,7 @@ public static void Postfix() (byte)CustomRPC.ResetVaribles, SendOption.Reliable); AmongUsClient.Instance.FinishRpcImmediately(writer); RPCProcedure.resetVariables(); - if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek || TORMapOptions.gameMode == CustomGamemodes.PropHunt || + if (MapOptions.gameMode == CustomGamemodes.HideNSeek || MapOptions.gameMode == CustomGamemodes.PropHunt || GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek) return; // Don't assign Roles in Hide N Seek if (CustomOptionHolder.activateRoles.getBool()) // Don't assign Roles in Tutorial or if deactivated diff --git a/TheOtherRoles/Patches/ShipStatusPatch.cs b/TheOtherRoles/Patches/ShipStatusPatch.cs index b513fc1e..7fa56b04 100644 --- a/TheOtherRoles/Patches/ShipStatusPatch.cs +++ b/TheOtherRoles/Patches/ShipStatusPatch.cs @@ -162,13 +162,13 @@ public static bool Prefix(ShipStatus __instance) originalNumShortTasksOption = GameOptionsManager.Instance.currentNormalGameOptions.NumShortTasks; originalNumLongTasksOption = GameOptionsManager.Instance.currentNormalGameOptions.NumLongTasks; - if (TORMapOptions.gameMode != CustomGamemodes.HideNSeek) + if (MapOptions.gameMode != CustomGamemodes.HideNSeek) { var commonTaskCount = __instance.CommonTasks.Count; var normalTaskCount = __instance.ShortTasks.Count; var longTaskCount = __instance.LongTasks.Count; - if (TORMapOptions.gameMode == CustomGamemodes.PropHunt) + if (MapOptions.gameMode == CustomGamemodes.PropHunt) commonTaskCount = normalTaskCount = longTaskCount = 0; diff --git a/TheOtherRoles/Patches/UpdatePatch.cs b/TheOtherRoles/Patches/UpdatePatch.cs index f5746e34..48e56607 100644 --- a/TheOtherRoles/Patches/UpdatePatch.cs +++ b/TheOtherRoles/Patches/UpdatePatch.cs @@ -341,7 +341,7 @@ private static void setNameTags() } // Display lighter / darker color for all alive players - if (CachedPlayer.LocalPlayer != null && MeetingHud.Instance != null && TORMapOptions.showLighterDarker) + if (CachedPlayer.LocalPlayer != null && MeetingHud.Instance != null && MapOptions.showLighterDarker) foreach (var player in MeetingHud.Instance.playerStates) { var target = Helpers.playerById(player.TargetPlayerId); @@ -459,8 +459,8 @@ private static void updateUseButton(HudManager __instance) private static void updateSabotageButton(HudManager __instance) { - if (MeetingHud.Instance || TORMapOptions.gameMode == CustomGamemodes.HideNSeek || - TORMapOptions.gameMode == CustomGamemodes.PropHunt) __instance.SabotageButton.Hide(); + if (MeetingHud.Instance || MapOptions.gameMode == CustomGamemodes.HideNSeek || + MapOptions.gameMode == CustomGamemodes.PropHunt) __instance.SabotageButton.Hide(); } private static void updateMapButton(HudManager __instance) diff --git a/TheOtherRoles/Patches/UsablesPatch.cs b/TheOtherRoles/Patches/UsablesPatch.cs index 187c4a26..3a8344e2 100644 --- a/TheOtherRoles/Patches/UsablesPatch.cs +++ b/TheOtherRoles/Patches/UsablesPatch.cs @@ -10,7 +10,7 @@ using UnityEngine; using static TheOtherRoles.GameHistory; using static TheOtherRoles.TheOtherRoles; -using static TheOtherRoles.TORMapOptions; +using static TheOtherRoles.MapOptions; using Object = UnityEngine.Object; using Random = UnityEngine.Random; @@ -367,9 +367,9 @@ public static bool Prefix(SabotageButton __instance) //MapOptionsTor.Mode = MapOptionsTor.Modes.Sabotage; //DestroyableSingleton.Instance.ToggleMapVisible(DestroyableSingleton.Instance.Modes.Sabotage); - DestroyableSingleton.Instance.ToggleMapVisible(new MapOptions + DestroyableSingleton.Instance.ToggleMapVisible(new global::MapOptions { - Mode = MapOptions.Modes.Sabotage + Mode = global::MapOptions.Modes.Sabotage }); return false; diff --git a/TheOtherRoles/Patches/VitalsPatch.cs b/TheOtherRoles/Patches/VitalsPatch.cs index b23233eb..c7cb48a6 100644 --- a/TheOtherRoles/Patches/VitalsPatch.cs +++ b/TheOtherRoles/Patches/VitalsPatch.cs @@ -30,7 +30,7 @@ public static void ResetData() private static void UseVitalsTime() { // Don't waste network traffic if we're out of time. - if (TORMapOptions.restrictDevices > 0 && TORMapOptions.restrictVitalsTime > 0f && + if (MapOptions.restrictDevices > 0 && MapOptions.restrictVitalsTime > 0f && CachedPlayer.LocalPlayer.PlayerControl.isAlive() && CachedPlayer.LocalPlayer.PlayerControl != Hacker.hacker) { var writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, @@ -75,7 +75,7 @@ private static bool Prefix(VitalsMinigame __instance) if (vitalsTimer > 0.1f) UseVitalsTime(); - if (TORMapOptions.restrictDevices > 0) + if (MapOptions.restrictDevices > 0) { if (TimeRemaining == null) { @@ -87,14 +87,14 @@ private static bool Prefix(VitalsMinigame __instance) TimeRemaining.color = Palette.White; } - if (TORMapOptions.restrictVitalsTime <= 0f && CachedPlayer.LocalPlayer.PlayerControl != Hacker.hacker && + if (MapOptions.restrictVitalsTime <= 0f && CachedPlayer.LocalPlayer.PlayerControl != Hacker.hacker && !CachedPlayer.LocalPlayer.Data.IsDead) { __instance.Close(); return false; } - var timeString = TimeSpan.FromSeconds(TORMapOptions.restrictVitalsTime).ToString(@"mm\:ss\.ff"); + var timeString = TimeSpan.FromSeconds(MapOptions.restrictVitalsTime).ToString(@"mm\:ss\.ff"); TimeRemaining.text = string.Format("Remaining: {0}", timeString); TimeRemaining.gameObject.SetActive(true); } diff --git a/TheOtherRoles/RPC.cs b/TheOtherRoles/RPC.cs index aedc6cd6..2d009320 100644 --- a/TheOtherRoles/RPC.cs +++ b/TheOtherRoles/RPC.cs @@ -19,7 +19,7 @@ using static TheOtherRoles.GameHistory; using static TheOtherRoles.HudManagerStartPatch; using static TheOtherRoles.TheOtherRoles; -using static TheOtherRoles.TORMapOptions; +using static TheOtherRoles.MapOptions; using Object = UnityEngine.Object; namespace TheOtherRoles; @@ -2871,8 +2871,7 @@ private static void GetRpcNames() private static void Postfix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader) { var packetId = (CustomRPC)callId; - if (RpcNames!.ContainsKey(packetId)) - return; + if (RpcNames!.ContainsKey(packetId)) return; if (enableDebugLogMode) Info($"接收 PlayerControl 原版Rpc RpcId{callId} Message Size {reader.Length}"); } diff --git a/TheOtherRoles/Resources/stringData.json b/TheOtherRoles/Resources/stringData.json index a760b525..d313ad2b 100644 --- a/TheOtherRoles/Resources/stringData.json +++ b/TheOtherRoles/Resources/stringData.json @@ -45,8 +45,8 @@ "13": " \u7279\u522b\u611f\u8c22\uff1a\u5584\u826f\u7684\u597d\u4eba & \u5929\u5bf8\u68a6\u521d & Imp11" }, "creditsString1": { - "0": "TheOtherUs-Edited Team:\nmxyx Huier-Huang haoren\nImp2 FangKuaiYa\n\nFormer TheOtherUs Team Members:\nSpexGH Xer FangKuaiYa mxyx Huier-Huang\n\nThanks to The Other Roles, The Other Roles CE, The Other Roles GM IA, Town of Us, Stellar Roles!\n\nThanks to miniduikboot & GD for hosting modded servers (and so much more)\n\n", - "13": "TheOtherUs-Edited \u5f00\u53d1\u8005:\n\u6cab\u590f\u60a0\u8f69 \u5929\u5bf8\u68a6\u521d \u5584\u826f\u7684\u597d\u4eba Imp11\n\n\u7f8e\u5de5:\n\u65b9\u5757\n\n\u7ffb\u8bd1:\nEN\uff1a\u4e5d\u5934\u86c7\nCN\uff1a\u6cab\u590f\u60a0\u8f69\n\nGitHub\u8d21\u732e\u8005:\n\u6cab\u590f\u60a0\u8f69 \u5929\u5bf8\u68a6\u521d Imp11\n\n\u524d TheOtherUs \u5f00\u53d1\u8005:\nSpexGH Xer \u65b9\u5757 \u6cab\u590f\u60a0\u8f69 \u5929\u5bf8\u68a6\u521d\n\n\n\u672c\u6a21\u7ec4\u4f7f\u7528\u4e86\u90e8\u5206[https://github.com/dabao40/TheOtherRolesGMIA]TheOtherRolesGMIA[]\u7684\u4ee3\u7801\uff0c\u611f\u8c22Imp11\u7684\u652f\u6301\uff01\n\nThanks to The Other Roles, The Other Roles CE, The Other Roles GM IA, Town of Us, Stellar Roles!\n\nThanks to miniduikboot & GD for hosting modded servers (and so much more)\n" + "0": "TheOtherUs-Edited Team:\nmxyx Huier-Huang haoren\nImp2 FangKuaiYa\n\nThanks to The Other Roles, The Other Roles CE, The Other Roles GM IA, Town of Us, Stellar Roles, SuperNewRoles!\n\nThanks to miniduikboot & GD for hosting modded servers (and so much more)\n\n", + "13": "TheOtherUs-Edited \u5f00\u53d1\u8005:\n\u6cab\u590f\u60a0\u8f69 \u5929\u5bf8\u68a6\u521d \u5584\u826f\u7684\u597d\u4eba Imp11\n\n\u7f8e\u5de5:\n\u65b9\u5757\n\n\u7ffb\u8bd1:\nEN\uff1a\u4e5d\u5934\u86c7\nCN\uff1a\u6cab\u590f\u60a0\u8f69\n\nGitHub\u8d21\u732e\u8005:\n\u6cab\u590f\u60a0\u8f69 \u5929\u5bf8\u68a6\u521d Imp11\n\n\u672c\u6a21\u7ec4\u4f7f\u7528\u4e86\u90e8\u5206[https://github.com/dabao40/TheOtherRolesGMIA]TheOtherRolesGMIA[]\u7684\u4ee3\u7801\uff0c\u611f\u8c22Imp11\u7684\u652f\u6301\uff01\n\nThanks to The Other Roles, The Other Roles CE, The Other Roles GM IA, Town of Us, Stellar Roles , SuperNewRoles!\n\nThanks to miniduikboot & GD for hosting modded servers (and so much more)\n" }, "TORMapOptionsButtonText": { "0": "Mod Options...", diff --git a/TheOtherRoles/RoleInfo.cs b/TheOtherRoles/RoleInfo.cs index 640921f5..f1a6de5c 100644 --- a/TheOtherRoles/RoleInfo.cs +++ b/TheOtherRoles/RoleInfo.cs @@ -348,13 +348,13 @@ public static List getRoleInfoForPlayer(PlayerControl p, bool showModi if (infos.Count == count) { if (p.Data.Role.IsImpostor) - infos.Add(TORMapOptions.gameMode == CustomGamemodes.HideNSeek || - TORMapOptions.gameMode == CustomGamemodes.PropHunt + infos.Add(MapOptions.gameMode == CustomGamemodes.HideNSeek || + MapOptions.gameMode == CustomGamemodes.PropHunt ? hunter : impostor); else - infos.Add(TORMapOptions.gameMode == CustomGamemodes.HideNSeek ? hunted : - TORMapOptions.gameMode == CustomGamemodes.PropHunt ? prop : crewmate); + infos.Add(MapOptions.gameMode == CustomGamemodes.HideNSeek ? hunted : + MapOptions.gameMode == CustomGamemodes.PropHunt ? prop : crewmate); } return infos; @@ -365,8 +365,7 @@ public static string GetRolesString(PlayerControl p, bool useColors, bool showMo { string roleName; roleName = string.Join(" ", - getRoleInfoForPlayer(p, showModifier).Select(x => useColors ? Helpers.cs(x.color, x.name) : x.name) - .ToArray()); + getRoleInfoForPlayer(p, showModifier).Select(x => useColors ? Helpers.cs(x.color, x.name) : x.name).ToArray()); if (Lawyer.target != null && p.PlayerId == Lawyer.target.PlayerId && CachedPlayer.LocalPlayer.PlayerControl != Lawyer.target) roleName += useColors ? Helpers.cs(Pursuer.color, " §") : " §"; @@ -378,10 +377,8 @@ public static string GetRolesString(PlayerControl p, bool useColors, bool showMo (CachedPlayer.LocalPlayer.PlayerControl == Shifter.shifter || Helpers.shouldShowGhostInfo()) && Shifter.futureShift != null) roleName += Helpers.cs(Color.yellow, " ← " + Shifter.futureShift.Data.PlayerName); - if (p == Vulture.vulture && (CachedPlayer.LocalPlayer.PlayerControl == Vulture.vulture || - Helpers.shouldShowGhostInfo())) - roleName = roleName + Helpers.cs(Vulture.color, - $" (剩余 {Vulture.vultureNumberToWin - Vulture.eatenBodies} )"); + if (p == Vulture.vulture && (CachedPlayer.LocalPlayer.PlayerControl == Vulture.vulture || Helpers.shouldShowGhostInfo())) + roleName += Helpers.cs(Vulture.color, $" (剩余 {Vulture.vultureNumberToWin - Vulture.eatenBodies} )"); if (Helpers.shouldShowGhostInfo()) { if (Eraser.futureErased.Contains(p)) @@ -406,7 +403,7 @@ public static string GetRolesString(PlayerControl p, bool useColors, bool showMo if (Arsonist.dousedPlayers.Contains(p)) roleName = Helpers.cs(Arsonist.color, "♨ ") + roleName; if (p == Arsonist.arsonist) - roleName = roleName + Helpers.cs(Arsonist.color, + roleName += Helpers.cs(Arsonist.color, $" (剩余 {CachedPlayer.AllPlayers.Count(x => { return x.PlayerControl != Arsonist.arsonist && !x.Data.IsDead && !x.Data.Disconnected && !Arsonist.dousedPlayers.Any(y => y.PlayerId == x.PlayerId); })} )"); if (p == Jackal.fakeSidekick) roleName = Helpers.cs(Sidekick.color, " (假跟班) ") + roleName; @@ -432,6 +429,21 @@ public static string GetRolesString(PlayerControl p, bool useColors, bool showMo case DeadPlayer.CustomDeathReason.Disconnect: deathReasonString = " - 断开连接"; break; + case DeadPlayer.CustomDeathReason.SheriffKill: + deathReasonString = $" - 出警 {Helpers.cs(killerColor, deadPlayer.killerIfExisting.Data.PlayerName)}"; + break; + case DeadPlayer.CustomDeathReason.SheriffMisfire: + deathReasonString = " - 走火"; + break; + case DeadPlayer.CustomDeathReason.SheriffMisadventure: + deathReasonString = $" - 被误杀于 {Helpers.cs(killerColor, deadPlayer.killerIfExisting.Data.PlayerName)}"; + break; + case DeadPlayer.CustomDeathReason.Suicide: + deathReasonString = " - 自杀"; + break; + case DeadPlayer.CustomDeathReason.BombVictim: + deathReasonString = " - 恐袭"; + break; case DeadPlayer.CustomDeathReason.Exile: deathReasonString = " - 被驱逐"; break; diff --git a/TheOtherRoles/SoundEffectsManager.cs b/TheOtherRoles/SoundEffectsManager.cs index 624a1684..6a960c74 100644 --- a/TheOtherRoles/SoundEffectsManager.cs +++ b/TheOtherRoles/SoundEffectsManager.cs @@ -34,7 +34,7 @@ public static AudioClip get(string path) public static void play(string path, float volume = 0.8f, bool loop = false) { - if (!TORMapOptions.enableSoundEffects) return; + if (!MapOptions.enableSoundEffects) return; var clipToPlay = get(path); stop(path); if (Constants.ShouldPlaySfx() && clipToPlay != null) @@ -47,7 +47,7 @@ public static void play(string path, float volume = 0.8f, bool loop = false) public static void playAtPosition(string path, Vector2 position, float maxDuration = 15f, float range = 5f, bool loop = false) { - if (!TORMapOptions.enableSoundEffects || !Constants.ShouldPlaySfx()) return; + if (!MapOptions.enableSoundEffects || !Constants.ShouldPlaySfx()) return; var clipToPlay = get(path); var source = SoundManager.Instance.PlaySound(clipToPlay, false); diff --git a/TheOtherRoles/TheOtherRoles.cs b/TheOtherRoles/TheOtherRoles.cs index 3cc5a63e..3923b67f 100644 --- a/TheOtherRoles/TheOtherRoles.cs +++ b/TheOtherRoles/TheOtherRoles.cs @@ -2151,7 +2151,7 @@ public static void clearAndReload() douseTarget = null; triggerArsonistWin = false; dousedPlayers = new List(); - foreach (var p in TORMapOptions.playerIcons.Values) + foreach (var p in MapOptions.playerIcons.Values) if (p != null && p.gameObject != null) p.gameObject.SetActive(false); cooldown = CustomOptionHolder.arsonistCooldown.getFloat(); @@ -2301,7 +2301,7 @@ public static void clearAndReload() arrow = null; if (cooldownText != null && cooldownText.gameObject != null) Object.Destroy(cooldownText.gameObject); cooldownText = null; - foreach (var p in TORMapOptions.playerIcons.Values) + foreach (var p in MapOptions.playerIcons.Values) if (p != null && p.gameObject != null) p.gameObject.SetActive(false); diff --git a/TheOtherRoles/Utilities/GithubUtils.cs b/TheOtherRoles/Utilities/GithubUtils.cs deleted file mode 100644 index 3cbad59c..00000000 --- a/TheOtherRoles/Utilities/GithubUtils.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace TheOtherRoles.Utilities; - -public static class GithubUtils -{ - public static bool IsCN() => (int)AmongUs.Data.DataManager.Settings.Language.CurrentLanguage == 13; - - public static string GithubUrl(this string url) - { - if (IsCN() && !url.Contains("github.moeyy.xyz")) - { - if (url.Contains("github.com")) - { - return url.Replace("https://github.com", "https://github.moeyy.xyz/https://github.com"); - } - - if (url.Contains("raw.githubusercontent.com")) - { - return url.Replace("https://raw.githubusercontent.com", "https://github.moeyy.xyz/https://raw.githubusercontent.com"); - } - } - Info("Rewrite URL" + url); - return url; - } -} \ No newline at end of file diff --git a/TheOtherRoles/Utilities/HandleGuesser.cs b/TheOtherRoles/Utilities/HandleGuesser.cs index cb582e88..26747a49 100644 --- a/TheOtherRoles/Utilities/HandleGuesser.cs +++ b/TheOtherRoles/Utilities/HandleGuesser.cs @@ -39,7 +39,7 @@ public static void clearAndReload() { Guesser.clearAndReload(); GuesserGM.clearAndReload(); - isGuesserGm = TORMapOptions.gameMode == CustomGamemodes.Guesser; + isGuesserGm = MapOptions.gameMode == CustomGamemodes.Guesser; if (isGuesserGm) { guesserCantGuessSnitch = CustomOptionHolder.guesserGamemodeCantGuessSnitchIfTaksDone.getBool();