From bcb61b187b545865a11cd64e26b99f50d7ad0ea6 Mon Sep 17 00:00:00 2001 From: mxyx0412 Date: Thu, 5 Dec 2024 01:19:27 +0800 Subject: [PATCH] Update v1.1.0.0 --- Strings.xlsx | Bin 82553 -> 83145 bytes TheOtherRoles/Buttons/Buttons.cs | 164 ++- TheOtherRoles/Buttons/CustomButton.cs | 5 +- TheOtherRoles/Helper/Helpers.cs | 69 +- TheOtherRoles/Modules/ChatCommands.cs | 4 +- TheOtherRoles/Options/CustomOptionHolder.cs | 16 +- TheOtherRoles/Options/CustomOptions.cs | 6 +- TheOtherRoles/Patches/EndGamePatch.cs | 47 +- TheOtherRoles/Patches/ExileControllerPatch.cs | 6 + .../Patches/HauntMenuMinigamePatch.cs | 27 +- TheOtherRoles/Patches/IntroPatch.cs | 10 +- TheOtherRoles/Patches/LobbyRoleList.cs | 92 +- TheOtherRoles/Patches/MeetingHudPatch.cs | 95 +- TheOtherRoles/Patches/PlayerControlPatch.cs | 244 ++--- TheOtherRoles/Patches/RoleAssignmentPatch.cs | 14 +- TheOtherRoles/Patches/UpdatePatch.cs | 48 +- TheOtherRoles/RPC.cs | 988 ++---------------- TheOtherRoles/Resources/BackButton.png | Bin 0 -> 30956 bytes TheOtherRoles/Resources/CreditsButton.png | Bin 37356 -> 0 bytes TheOtherRoles/Resources/ExitButton.png | Bin 0 -> 17089 bytes TheOtherRoles/Resources/LoversChat.png | Bin 17415 -> 0 bytes TheOtherRoles/Resources/TabIconGhost.png | Bin 0 -> 13778 bytes TheOtherRoles/Resources/stringData.json | 42 + TheOtherRoles/Roles/Crewmate/Deputy.cs | 6 +- TheOtherRoles/Roles/Crewmate/Medium.cs | 3 +- TheOtherRoles/Roles/Crewmate/Prophet.cs | 2 +- TheOtherRoles/Roles/Crewmate/Prosecutor.cs | 15 +- TheOtherRoles/Roles/Crewmate/Sheriff.cs | 10 +- TheOtherRoles/Roles/Ghost/Specter.cs | 325 ++++++ TheOtherRoles/Roles/Guesser.cs | 12 +- TheOtherRoles/Roles/Impostor/Camouflager.cs | 2 +- TheOtherRoles/Roles/Impostor/Mimic.cs | 160 +++ TheOtherRoles/Roles/Modifier/Aftermath.cs | 6 +- TheOtherRoles/Roles/Modifier/Chameleon.cs | 2 +- TheOtherRoles/Roles/Modifier/Lovers.cs | 2 +- TheOtherRoles/Roles/Modifier/Shifter.cs | 22 +- TheOtherRoles/Roles/Neutral/Amnisiac.cs | 480 ++++++++- TheOtherRoles/Roles/Neutral/Jackal.cs | 24 +- TheOtherRoles/Roles/Neutral/Sidekick.cs | 33 - TheOtherRoles/Roles/Neutral/Thief.cs | 120 ++- TheOtherRoles/Roles/Neutral/Witness.cs | 21 + TheOtherRoles/Roles/RoleHelpers.cs | 123 ++- TheOtherRoles/Roles/RoleInfo.cs | 27 +- TheOtherRoles/TasksHandler.cs | 4 +- TheOtherRoles/TheOtherRoles.csproj | 2 +- 45 files changed, 1899 insertions(+), 1379 deletions(-) create mode 100644 TheOtherRoles/Resources/BackButton.png delete mode 100644 TheOtherRoles/Resources/CreditsButton.png create mode 100644 TheOtherRoles/Resources/ExitButton.png delete mode 100644 TheOtherRoles/Resources/LoversChat.png create mode 100644 TheOtherRoles/Resources/TabIconGhost.png create mode 100644 TheOtherRoles/Roles/Ghost/Specter.cs delete mode 100644 TheOtherRoles/Roles/Neutral/Sidekick.cs create mode 100644 TheOtherRoles/Roles/Neutral/Witness.cs diff --git a/Strings.xlsx b/Strings.xlsx index e8ba7d53d170b9cadcf12c7ecb03ba9b956ad2d0..2a6c3a12bf910770c18cc45d38e26b37cd2f56ed 100644 GIT binary patch delta 66521 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 z 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 { - engineerRepairButton.Timer = 0f; - var usedRepairWriter = StartRPC(CachedPlayer.LocalPlayer.PlayerControl, CustomRPC.EngineerUsedRepair); - usedRepairWriter.EndRPC(); - RPCProcedure.engineerUsedRepair(); - SoundEffectsManager.play("engineerRepair"); foreach (var task in CachedPlayer.LocalPlayer.PlayerControl.myTasks.GetFastEnumerator()) if (task.TaskType == TaskTypes.FixLights) { - var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl.NetId, CustomRPC.EngineerFixLights); + var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl.NetId, CustomRPC.FixLights); writer.EndRPC(); RPCProcedure.FixLights(); } @@ -484,10 +481,13 @@ public static void createButtonsPostfix(HudManager __instance) } else if (SubmergedCompatibility.IsSubmerged && task.TaskType == SubmergedCompatibility.RetrieveOxygenMask) { - var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl, CustomRPC.EngineerFixSubmergedOxygen); + var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl, CustomRPC.FixSubmergedOxygen); writer.EndRPC(); RPCProcedure.FixSubmergedOxygen(); } + SoundEffectsManager.play("engineerRepair"); + Engineer.remainingFixes--; + engineerRepairButton.Timer = 0f; }, () => { @@ -496,14 +496,7 @@ public static void createButtonsPostfix(HudManager __instance) }, () => { - var sabotageActive = false; - foreach (var task in CachedPlayer.LocalPlayer.PlayerControl.myTasks.GetFastEnumerator()) - if (task.TaskType == TaskTypes.FixLights || task.TaskType == TaskTypes.RestoreOxy || - task.TaskType == TaskTypes.ResetReactor || task.TaskType == TaskTypes.ResetSeismic || - task.TaskType == TaskTypes.FixComms || task.TaskType == TaskTypes.StopCharles - || (SubmergedCompatibility.IsSubmerged && task.TaskType == SubmergedCompatibility.RetrieveOxygenMask)) - sabotageActive = true; - return sabotageActive && Engineer.remainingFixes > 0 && CachedPlayer.LocalPlayer.PlayerControl.CanMove; + return isSabotageActive() && Engineer.remainingFixes > 0 && CachedPlayer.LocalPlayer.PlayerControl.CanMove; }, () => { @@ -519,12 +512,10 @@ public static void createButtonsPostfix(HudManager __instance) ghostEngineerButton = new CustomButton( () => { - ghostEngineerButton.Timer = 0f; - SoundEffectsManager.play("engineerRepair"); foreach (var task in CachedPlayer.LocalPlayer.PlayerControl.myTasks.GetFastEnumerator()) if (task.TaskType == TaskTypes.FixLights) { - var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl, CustomRPC.EngineerFixLights); + var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl, CustomRPC.FixLights); writer.EndRPC(); RPCProcedure.FixLights(); } @@ -553,26 +544,22 @@ public static void createButtonsPostfix(HudManager __instance) } else if (SubmergedCompatibility.IsSubmerged && task.TaskType == SubmergedCompatibility.RetrieveOxygenMask) { - var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl, CustomRPC.EngineerFixSubmergedOxygen); + var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl, CustomRPC.FixSubmergedOxygen); writer.EndRPC(); RPCProcedure.FixSubmergedOxygen(); } + GhostEngineer.Fixes = true; + ghostEngineerButton.Timer = 0f; + SoundEffectsManager.play("engineerRepair"); }, () => { return GhostEngineer.player != null && GhostEngineer.player == CachedPlayer.LocalPlayer.PlayerControl && - !GhostEngineer.Fixes && CachedPlayer.LocalPlayer.Data.IsDead; + !GhostEngineer.Fixes && CachedPlayer.LocalPlayer.Data.IsDead && !GhostEngineer.Fixes; }, () => { - var sabotageActive = false; - foreach (var task in CachedPlayer.LocalPlayer.PlayerControl.myTasks.GetFastEnumerator()) - if (task.TaskType == TaskTypes.FixLights || task.TaskType == TaskTypes.RestoreOxy || - task.TaskType == TaskTypes.ResetReactor || task.TaskType == TaskTypes.ResetSeismic || - task.TaskType == TaskTypes.FixComms || task.TaskType == TaskTypes.StopCharles - || (SubmergedCompatibility.IsSubmerged && task.TaskType == SubmergedCompatibility.RetrieveOxygenMask)) - sabotageActive = true; - return sabotageActive && Engineer.remainingFixes > 0 && CachedPlayer.LocalPlayer.PlayerControl.CanMove; + return isSabotageActive() && GhostEngineer.Fixes && CachedPlayer.LocalPlayer.PlayerControl.CanMove; }, () => { }, Engineer.buttonSprite, @@ -1889,6 +1876,17 @@ public static void createButtonsPostfix(HudManager __instance) () => { if (checkAndDoVetKill(Jackal.currentTarget)) return; + var target = Jackal.currentTarget; + + if (Jackal.killFakeImpostor && target.Data.Role.IsImpostor) + { + //uncheckedMurderPlayer(Jackal.jackal.PlayerId, player.PlayerId, 1); + checkMurderAttemptAndKill(PlayerControl.LocalPlayer, target); + GameHistory.RpcOverrideDeathReasonAndKiller(target, CustomDeathReason.FakeSK, PlayerControl.LocalPlayer); + jackalSidekickButton.Timer = jackalSidekickButton.MaxTimer; + return; + } + var writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.JackalCreatesSidekick, SendOption.Reliable); writer.Write(Jackal.currentTarget.PlayerId); @@ -1900,12 +1898,12 @@ public static void createButtonsPostfix(HudManager __instance) }, () => { - return Jackal.canCreateSidekick && Jackal.jackal != null && - Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; + return Jackal.canCreateSidekick && Jackal.jackal.Any(x => x.IsAlive() && x == CachedPlayer.LocalPlayer.PlayerControl); }, () => { - showTargetNameOnButton(Jackal.currentTarget, jackalSidekickButton, GetString("jackalSidekickText")); // Show now text since the button already says sidekick + // Show now text since the button already says sidekick + showTargetNameOnButton(Jackal.currentTarget, jackalSidekickButton, GetString("jackalSidekickText")); return Jackal.canCreateSidekick && Jackal.currentTarget != null && CachedPlayer.LocalPlayer.PlayerControl.CanMove; }, @@ -1921,15 +1919,14 @@ public static void createButtonsPostfix(HudManager __instance) () => { if (checkAndDoVetKill(Jackal.currentTarget)) return; - if (checkMurderAttemptAndKill(Jackal.jackal, Jackal.currentTarget) == + if (checkMurderAttemptAndKill(CachedPlayer.LocalPlayer.PlayerControl, Jackal.currentTarget) == MurderAttemptResult.SuppressKill) return; jackalKillButton.Timer = jackalKillButton.MaxTimer; - Jackal.currentTarget = null; }, () => { - return Jackal.jackal != null && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl && + return Jackal.jackal != null && Jackal.jackal.Any(x => x == CachedPlayer.LocalPlayer.PlayerControl) && !CachedPlayer.LocalPlayer.Data.IsDead; }, () => @@ -1950,15 +1947,15 @@ public static void createButtonsPostfix(HudManager __instance) { /* On Use */ var invisibleWriter = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetJackalSwoop, SendOption.Reliable, -1); - invisibleWriter.Write(Jackal.jackal.PlayerId); + invisibleWriter.Write(CachedPlayer.LocalPlayer.PlayerControl.PlayerId); invisibleWriter.Write(byte.MinValue); AmongUsClient.Instance.FinishRpcImmediately(invisibleWriter); - RPCProcedure.setJackalSwoop(Jackal.jackal.PlayerId, byte.MinValue); + RPCProcedure.setJackalSwoop(CachedPlayer.LocalPlayer.PlayerControl.PlayerId, byte.MinValue); }, () => { /* Can See */ return Jackal.jackal != null && Jackal.canSwoop && - Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; + Jackal.jackal.Any(x => x == CachedPlayer.LocalPlayer.PlayerControl) && !CachedPlayer.LocalPlayer.Data.IsDead; }, () => { /* On Click */ @@ -1985,22 +1982,22 @@ public static void createButtonsPostfix(HudManager __instance) sidekickKillButton = new CustomButton( () => { - if (checkAndDoVetKill(Sidekick.currentTarget)) return; - if (checkMurderAttemptAndKill(Sidekick.sidekick, Sidekick.currentTarget) == + if (checkAndDoVetKill(Jackal.currentTarget2)) return; + if (checkMurderAttemptAndKill(Jackal.sidekick, Jackal.currentTarget2) == MurderAttemptResult.SuppressKill) return; sidekickKillButton.Timer = sidekickKillButton.MaxTimer; - Sidekick.currentTarget = null; + Jackal.currentTarget2 = null; }, () => { - return Sidekick.canKill && Sidekick.sidekick != null && - Sidekick.sidekick == CachedPlayer.LocalPlayer.PlayerControl && + return Jackal.sidekickCanKill && Jackal.sidekick != null && + Jackal.sidekick == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; }, () => { - showTargetNameOnButton(Sidekick.currentTarget, sidekickKillButton, GetString("killButtonText")); - return Sidekick.currentTarget && CachedPlayer.LocalPlayer.PlayerControl.CanMove; + showTargetNameOnButton(Jackal.currentTarget2, sidekickKillButton, GetString("killButtonText")); + return Jackal.currentTarget2 && CachedPlayer.LocalPlayer.PlayerControl.CanMove; }, () => { sidekickKillButton.Timer = sidekickKillButton.MaxTimer; }, __instance.KillButton.graphic.sprite, @@ -2170,7 +2167,7 @@ public static void createButtonsPostfix(HudManager __instance) writer.Write(0.01f); AmongUsClient.Instance.FinishRpcImmediately(writer); - RPCProcedure.Mine(id, Miner.miner, buff, 0.01f); + RPCProcedure.Mine(id, buff, 0.01f); }, () => { @@ -3217,7 +3214,7 @@ public static void createButtonsPostfix(HudManager __instance) SendOption.Reliable); writer.Write(playerInfo.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); - RPCProcedure.amnisiacTakeRole(playerInfo.PlayerId); + Amnisiac.TakeRole(playerInfo.PlayerId, PlayerControl.LocalPlayer.PlayerId); break; } } @@ -3225,7 +3222,7 @@ public static void createButtonsPostfix(HudManager __instance) }, () => { - return Amnisiac.amnisiac != null && Amnisiac.amnisiac == CachedPlayer.LocalPlayer.PlayerControl && + return Amnisiac.player != null && Amnisiac.player.Any(x => x == CachedPlayer.LocalPlayer.PlayerControl) && !CachedPlayer.LocalPlayer.Data.IsDead; }, () => @@ -3241,6 +3238,65 @@ public static void createButtonsPostfix(HudManager __instance) buttonText: GetString("RememberText") ); + specterRememberButton = new CustomButton( + () => { }, + () => + { + return Specter.player != null && Specter.player == CachedPlayer.LocalPlayer.PlayerControl && + CachedPlayer.LocalPlayer.Data.IsDead & Specter.remember; + }, + () => + { + var array = Physics2D.OverlapCircleAll(CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition(), + CachedPlayer.LocalPlayer.PlayerControl.MaxReportDistance * 0.36f, + Constants.PlayersOnlyMask).Where(collider => collider.tag == "DeadBody") + .Select(collider => collider.GetComponent()) + .Where(deadBody => deadBody != null); + + return array.Any(db => db.ParentId != CachedPlayer.LocalId) && PlayerControl.LocalPlayer.CanMove; + }, + () => + { + Specter.remember = true; + specterRememberButton.Timer = 10f; + }, + Amnisiac.buttonSprite, + ButtonPositions.upperRowCenter, + __instance, + abilityInput.keyCode, + true, + 2f, + () => + { + foreach (var collider2D in Physics2D.OverlapCircleAll(CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition(), + CachedPlayer.LocalPlayer.PlayerControl.MaxReportDistance, Constants.PlayersOnlyMask)) + if (collider2D.tag == "DeadBody") + { + var component = collider2D.GetComponent(); + if (component && !component.Reported) + { + var truePosition = CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition(); + var truePosition2 = component.TruePosition; + if (Vector2.Distance(truePosition2, truePosition) <= + CachedPlayer.LocalPlayer.PlayerControl.MaxReportDistance && + CachedPlayer.LocalPlayer.PlayerControl.CanMove && + !PhysicsHelpers.AnythingBetween(truePosition, truePosition2, + Constants.ShipAndObjectsMask, false)) + { + var playerInfo = GameData.Instance.GetPlayerById(component.ParentId); + PlayerControl.LocalPlayer.transform.position = component.transform.position; + var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl, CustomRPC.SpecterTakeRole); + writer.Write(playerInfo.PlayerId); + writer.EndRPC(); + Specter.TakeRole(playerInfo.PlayerId); + break; + } + } + } + }, + buttonText: GetString("SpecterButton") + ); + // Medium button mediumButton = new CustomButton( () => @@ -3901,12 +3957,11 @@ public static void createButtonsPostfix(HudManager __instance) if (Terrorist.selfExplosion) { var loacl = Terrorist.terrorist.PlayerId; - var writer1 = AmongUsClient.Instance.StartRpcImmediately(Terrorist.terrorist.NetId, - (byte)CustomRPC.UncheckedMurderPlayer, SendOption.Reliable); + var writer1 = StartRPC(Terrorist.terrorist, CustomRPC.UncheckedMurderPlayer); writer1.Write(loacl); writer1.Write(loacl); writer1.Write(byte.MaxValue); - AmongUsClient.Instance.FinishRpcImmediately(writer1); + writer1.EndRPC(); RPCProcedure.uncheckedMurderPlayer(loacl, loacl, byte.MaxValue); } @@ -4006,13 +4061,18 @@ public static void createButtonsPostfix(HudManager __instance) Thief.thief.clearAllTasks(); } + if (result is MurderAttemptResult.ReverseKill or MurderAttemptResult.BodyGuardKill) + { + checkMurderAttemptAndKill(CachedPlayer.LocalPlayer.PlayerControl, target); + } + // Steal role if survived. if (!Thief.thief.Data.IsDead && result == MurderAttemptResult.PerformKill) { var writer = StartRPC(CachedPlayer.LocalPlayer.PlayerControl.NetId, CustomRPC.ThiefStealsRole); writer.Write(target.PlayerId); writer.EndRPC(); - RPCProcedure.thiefStealsRole(target.PlayerId); + Thief.StealsRole(target.PlayerId); } // Kill the victim (after becoming their role - so that no win is triggered for other teams) diff --git a/TheOtherRoles/Buttons/CustomButton.cs b/TheOtherRoles/Buttons/CustomButton.cs index 32840d8f..156b0079 100644 --- a/TheOtherRoles/Buttons/CustomButton.cs +++ b/TheOtherRoles/Buttons/CustomButton.cs @@ -148,11 +148,10 @@ public static void ResetAllCooldowns(float Time = -1) Error($"NullReferenceException from MeetingEndedUpdate().HasButton(), if theres only one warning its fine\n{e}", "CustomButton"); } } + var time = Time == -1 ? ModOption.KillCooddown : Time; + CachedPlayer.LocalPlayer.PlayerControl.killTimer = time; } - ///

- /// һɱťcd - /// public static void resetKillButton(PlayerControl p, float time = -1) { if (p.IsDead()) return; diff --git a/TheOtherRoles/Helper/Helpers.cs b/TheOtherRoles/Helper/Helpers.cs index 5551aacd..b5e8a1d3 100644 --- a/TheOtherRoles/Helper/Helpers.cs +++ b/TheOtherRoles/Helper/Helpers.cs @@ -67,7 +67,6 @@ public enum LogLevel public static class Helpers { public static bool zoomOutStatus; - public static bool InGame => AmongUsClient.Instance != null && AmongUsClient.Instance.GameState == InnerNetClient.GameStates.Started; public static bool IsCountDown => GameStartManager.InstanceExists && GameStartManager.Instance.startState == GameStartManager.StartingStates.Countdown; public static bool InMeeting => InGame && MeetingHud.Instance; @@ -90,24 +89,25 @@ public static class Helpers /// public static bool hasFakeTasks(this PlayerControl player) { + if (player == Specter.player) return false; return player == Werewolf.werewolf || player == Doomsayer.doomsayer || player == Juggernaut.juggernaut || player == Jester.jester || player == Arsonist.arsonist || - player == Jackal.jackal || - player == Sidekick.sidekick || - player == Pavlovsdogs.pavlovsowner || + player == Witness.player || player == PartTimer.partTimer || player == Akujo.akujo || player == Swooper.swooper || player == Lawyer.lawyer || player == Executioner.executioner || player == Vulture.vulture || - Pursuer.pursuer.Contains(player) || - Survivor.survivor.Contains(player) || - Pavlovsdogs.pavlovsdogs.Contains(player) || - Jackal.formerJackals.Contains(player); + player == Jackal.sidekick || + player == Pavlovsdogs.pavlovsowner || + Jackal.jackal.Any(x => x == player) || + Pursuer.pursuer.Any(x => x == player) || + Survivor.survivor.Any(x => x == player) || + Pavlovsdogs.pavlovsdogs.Any(x => x == player); } /// @@ -136,10 +136,10 @@ public static bool killingCrewAlive() public static bool hasImpVision(GameData.PlayerInfo player) { return player.Role.IsImpostor - || (((Jackal.jackal != null && Jackal.jackal.PlayerId == player.PlayerId) || Jackal.formerJackals.Any(x => x.PlayerId == player.PlayerId)) && Jackal.hasImpostorVision) - || (Sidekick.sidekick != null && Sidekick.sidekick.PlayerId == player.PlayerId && Sidekick.hasImpostorVision) + || (Jackal.jackal.Any(p => p.PlayerId == player.PlayerId) && Jackal.hasImpostorVision) + || (Jackal.sidekick != null && Jackal.sidekick.PlayerId == player.PlayerId && Jackal.hasImpostorVision) || (Pavlovsdogs.pavlovsowner != null && Pavlovsdogs.pavlovsowner.PlayerId == player.PlayerId && Pavlovsdogs.hasImpostorVision) - || (Pavlovsdogs.pavlovsdogs != null && Pavlovsdogs.pavlovsdogs.Any(p => p.PlayerId == player.PlayerId) && Pavlovsdogs.hasImpostorVision) + || (Pavlovsdogs.pavlovsdogs.Any(p => p.PlayerId == player.PlayerId) && Pavlovsdogs.hasImpostorVision) || (Spy.spy != null && Spy.spy.PlayerId == player.PlayerId && Spy.hasImpostorVision) || (Juggernaut.juggernaut != null && Juggernaut.juggernaut.PlayerId == player.PlayerId && Juggernaut.hasImpostorVision) || (Jester.jester != null && Jester.jester.PlayerId == player.PlayerId && Jester.hasImpostorVision) @@ -174,11 +174,11 @@ public static bool roleCanUseVents(this PlayerControl player) { roleCouldUse = true; } - else if (Jackal.canUseVents && Jackal.jackal != null && Jackal.jackal == player) + else if (Jackal.canUseVents && Jackal.jackal != null && Jackal.jackal.Any(x => x == player)) { roleCouldUse = true; } - else if (Sidekick.canUseVents && Sidekick.sidekick != null && Sidekick.sidekick == player) + else if (Jackal.canUseVents && Jackal.sidekick != null && Jackal.sidekick == player) { roleCouldUse = true; } @@ -253,7 +253,7 @@ public static bool checkAndDoVetKill(PlayerControl target) public static bool isNeutral(PlayerControl player) { var roleInfo = RoleInfo.getRoleInfoForPlayer(player, false).FirstOrDefault(); - return roleInfo != null && roleInfo.roleTeam == RoleType.Neutral; + return roleInfo != null && roleInfo.roleType == RoleType.Neutral; } public static bool isKillerNeutral(PlayerControl player) @@ -263,17 +263,17 @@ public static bool isKillerNeutral(PlayerControl player) player == Werewolf.werewolf || player == Swooper.swooper || player == Arsonist.arsonist || - player == Jackal.jackal || - player == Sidekick.sidekick || + player == Jackal.sidekick || player == Pavlovsdogs.pavlovsowner || + Jackal.jackal.Contains(player) || Pavlovsdogs.pavlovsdogs.Contains(player)); } public static bool isEvilNeutral(PlayerControl player) { return isNeutral(player) && - player != Amnisiac.amnisiac && player != PartTimer.partTimer && + !Amnisiac.player.Contains(player) && !Pursuer.pursuer.Contains(player) && !Survivor.survivor.Contains(player); } @@ -345,7 +345,7 @@ public static bool roleCanSabotage(this PlayerControl player) { var roleCouldUse = false; if (ModOption.disableSabotage) return false; - if (Jackal.canSabotage && (player == Jackal.jackal || player == Sidekick.sidekick || Jackal.formerJackals.Contains(player)) && !ModOption.disableSabotage) + if (Jackal.canSabotage && (Jackal.jackal.Contains(player) || player == Jackal.sidekick) && !ModOption.disableSabotage) roleCouldUse = true; if (Pavlovsdogs.canSabotage && (player == Pavlovsdogs.pavlovsowner || Pavlovsdogs.pavlovsdogs.Any(p => p == player)) && !ModOption.disableSabotage) roleCouldUse = true; @@ -475,7 +475,7 @@ public static void showTargetNameOnButton(PlayerControl target, CustomButton but // set to morphed player else if (Morphling.morphling != null && Morphling.morphTarget != null && target == Morphling.morphling && Morphling.morphTimer > 0) text = Morphling.morphTarget.Data.PlayerName; else if (target == Swooper.swooper && Swooper.isInvisable) text = defaultText; - else if (target == Jackal.jackal && Jackal.isInvisable) text = defaultText; + else if (Jackal.jackal.Any(p => p == target) && Jackal.isInvisable) text = defaultText; //else if (target == PhantomRole.phantomRole) text = defaultText; else if (target == null) text = defaultText; // Set text to defaultText if no target else text = target.Data.PlayerName; // Set text to playername @@ -630,7 +630,7 @@ public static List allRoleInfos() var allRoleInfo = new List(); foreach (var role in RoleInfo.allRoleInfos) { - if (role.roleTeam == RoleType.Modifier) continue; + if (role.roleType is RoleType.Modifier or RoleType.GhostRole or RoleType.Special) continue; allRoleInfo.Add(role); } return allRoleInfo; @@ -639,7 +639,7 @@ public static List allRoleInfos() public static List onlineRoleInfos() { var role = new List(); - role.AddRange(CachedPlayer.AllPlayers.Select(n => RoleInfo.getRoleInfoForPlayer(n, false)).SelectMany(n => n)); + role.AddRange(CachedPlayer.AllPlayers.Select(n => RoleInfo.getRoleInfoForPlayer(n, false, false)).SelectMany(x => x)); return role; } @@ -651,12 +651,15 @@ public static PlayerControl playerById(byte id) return null; } - public static Dictionary allPlayersById() + public static bool isSabotageActive() { - var res = new Dictionary(); - foreach (PlayerControl player in CachedPlayer.AllPlayers) - res.Add(player.PlayerId, player); - return res; + foreach (var task in CachedPlayer.LocalPlayer.PlayerControl.myTasks.GetFastEnumerator()) + if (task.TaskType == TaskTypes.FixLights || task.TaskType == TaskTypes.RestoreOxy || + task.TaskType == TaskTypes.ResetReactor || task.TaskType == TaskTypes.ResetSeismic || + task.TaskType == TaskTypes.FixComms || task.TaskType == TaskTypes.StopCharles + || (SubmergedCompatibility.IsSubmerged && task.TaskType == SubmergedCompatibility.RetrieveOxygenMask)) + return true; + return false; } public static void handleVampireBiteOnBodyReport() @@ -755,7 +758,7 @@ public static Color getTeamColor(RoleType team) RoleType.Impostor => Palette.ImpostorRed, RoleType.Neutral => Color.gray, RoleType.Modifier => Color.yellow, - RoleType.Special => Palette.Purple, + RoleType.GhostRole => new Color32(159, 127, 209, byte.MaxValue), _ => Palette.White }; } @@ -939,7 +942,7 @@ public static bool hidePlayerName(PlayerControl source, PlayerControl target) return true; // No names are visible if (SurveillanceMinigamePatch.nightVisionIsActive) return true; if (Ninja.isInvisble && Ninja.ninja == target) return true; - if (Jackal.isInvisable && Jackal.jackal == target) return true; + if (Jackal.isInvisable && Jackal.jackal.Any(p => p == target)) return true; if (Swooper.isInvisable && Swooper.swooper == target) return true; if (ModOption.hideOutOfSightNametags && InGame && source.IsAlive() && !isFungle && PhysicsHelpers.AnythingBetween(localPlayer.GetTruePosition(), target.GetTruePosition(), Constants.ShadowMask, false)) @@ -948,15 +951,13 @@ public static bool hidePlayerName(PlayerControl source, PlayerControl target) if (!ModOption.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 || - (target == Sidekick.sidekick && Sidekick.wasTeamRed) || - (target == Jackal.jackal && Jackal.wasTeamRed))) + if (source.Data.Role.IsImpostor && (target.Data.Role.IsImpostor || target == Spy.spy)) return false; // Members of team Impostors see the names of Impostors/Spies if ((source == Lovers.lover1 || source == Lovers.lover2) && (target == Lovers.lover1 || target == Lovers.lover2)) return false; // Members of team Lovers see the names of each other - if ((source == Jackal.jackal || source == Sidekick.sidekick) - && (target == Jackal.jackal || target == Sidekick.sidekick)) + if ((Jackal.jackal.Any(p => p == source) || source == Jackal.sidekick) + && (Jackal.jackal.Any(p => p == target) || target == Jackal.sidekick)) return false; // Members of team Jackal see the names of each other if ((source == Pavlovsdogs.pavlovsowner || Pavlovsdogs.pavlovsdogs.Any(x => x == target)) && (target == Pavlovsdogs.pavlovsowner || Pavlovsdogs.pavlovsdogs.Any(x => x == target))) @@ -1289,7 +1290,7 @@ public static MurderAttemptResult checkMurderAttemptAndKill(PlayerControl killer CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.MimicMimicRole, SendOption.Reliable); writerMimic.Write(target.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writerMimic); - RPCProcedure.mimicMimicRole(target.PlayerId); + Mimic.MimicRole(target.PlayerId); } MurderPlayer(killer, target, showAnimation); diff --git a/TheOtherRoles/Modules/ChatCommands.cs b/TheOtherRoles/Modules/ChatCommands.cs index 086b4ea7..e8992f39 100644 --- a/TheOtherRoles/Modules/ChatCommands.cs +++ b/TheOtherRoles/Modules/ChatCommands.cs @@ -259,9 +259,7 @@ public static void Postfix(ChatBubble __instance, [HarmonyArgument(0)] string pl .FirstOrDefault(x => x.Data != null && x.Data.PlayerName.Equals(playerName, StringComparison.Ordinal)); if (CachedPlayer.LocalPlayer != null && CachedPlayer.LocalPlayer.Data.Role.IsImpostor && __instance != null - && ((Spy.spy != null && sourcePlayer.PlayerId == Spy.spy.PlayerId) - || (Sidekick.sidekick != null && Sidekick.wasTeamRed && sourcePlayer.PlayerId == Sidekick.sidekick.PlayerId) - || (Jackal.jackal != null && Jackal.wasTeamRed && sourcePlayer.PlayerId == Jackal.jackal.PlayerId))) + && (Spy.spy != null && sourcePlayer.PlayerId == Spy.spy.PlayerId)) { __instance.NameText.color = Palette.ImpostorRed; } diff --git a/TheOtherRoles/Options/CustomOptionHolder.cs b/TheOtherRoles/Options/CustomOptionHolder.cs index 48c0c583..2260fdab 100644 --- a/TheOtherRoles/Options/CustomOptionHolder.cs +++ b/TheOtherRoles/Options/CustomOptionHolder.cs @@ -1,3 +1,5 @@ +using TheOtherRoles.Roles.Ghost; +using TheOtherRoles.Roles.Neutral; using UnityEngine; using static TheOtherRoles.Options.CustomOption; using Types = TheOtherRoles.Options.CustomOption.CustomOptionType; @@ -124,7 +126,6 @@ public class CustomOptionHolder public static CustomOption jackalCanUseVents; public static CustomOption jackalCanUseSabo; public static CustomOption jackalCanCreateSidekick; - public static CustomOption jackalCanImpostorFindSidekick; public static CustomOption sidekickPromotesToJackal; public static CustomOption sidekickCanKill; public static CustomOption sidekickCanUseVents; @@ -228,6 +229,9 @@ public class CustomOptionHolder public static CustomOption ghostEngineerSpawnRate; + public static CustomOption specterSpawnRate; + public static CustomOption specterResetRole; + public static CustomOption sheriffSpawnRate; public static CustomOption sheriffMisfireKills; public static CustomOption sheriffCooldown; @@ -383,6 +387,8 @@ public class CustomOptionHolder public static CustomOption executionerPromotesToLawyer; public static CustomOption executionerOnTargetDead; + public static CustomOption witnessSpawnRate; + public static CustomOption balancerSpawnRate; public static CustomOption balancerCount; public static CustomOption balancerVoteTime; @@ -900,6 +906,9 @@ public static void Load() //-------------------------- Neutral Options 20000-29999 -------------------------- // + specterSpawnRate = Create(50020, Types.Neutral, cs(Specter.color, "SpecterOptions"), rates, null, true); + specterResetRole = Create(50021, Types.Neutral, "amnisiacResetRole", true, specterSpawnRate); + survivorSpawnRate = Create(20280, Types.Neutral, cs(Survivor.color, "Survivor"), rates, null, true); survivorVestEnable = Create(20281, Types.Neutral, "survivorVestEnable", true, survivorSpawnRate); survivorVestNumber = Create(20282, Types.Neutral, "survivorVestNumber", 5f, 1f, 20f, 1f, survivorVestEnable); @@ -930,7 +939,6 @@ public static void Load() jackalCanCreateSidekick = Create(20135, Types.Neutral, cs(Jackal.color, "jackalCanCreateSidekick"), false, jackalSpawnRate); jackalCreateSidekickCooldown = Create(20136, Types.Neutral, "jackalCreateSidekickCooldown", 25f, 10f, 60f, 2.5f, jackalCanCreateSidekick); jackalkillFakeImpostor = Create(20145, Types.Neutral, cs(Palette.ImpostorRed, "jackalkillFakeImpostor"), false, jackalCanCreateSidekick); - jackalCanImpostorFindSidekick = Create(20137, Types.Neutral, cs(Palette.ImpostorRed, "jackalCanImpostorFindSidekick"), true, jackalCanCreateSidekick); sidekickCanKill = Create(20138, Types.Neutral, "sidekickCanKill", true, jackalCanCreateSidekick); sidekickCanUseVents = Create(20139, Types.Neutral, "sidekickCanUseVents", true, jackalCanCreateSidekick); sidekickPromotesToJackal = Create(20140, Types.Neutral, "sidekickPromotesToJackal", false, jackalCanCreateSidekick); @@ -1001,6 +1009,8 @@ public static void Load() partTimerDeathTurn = Create(20292, Types.Neutral, "partTimerDeathTurn", 2, 1, 6, 1, partTimerSpawnRate); partTimerKnowsRole = Create(20293, Types.Neutral, "partTimerIsCheckTargetRole", true, partTimerSpawnRate); + witnessSpawnRate = Create(20301, Types.Neutral, cs(Witness.color, "Witness"), rates, null, true); + doomsayerSpawnRate = Create(20221, Types.Neutral, cs(Doomsayer.color, "Doomsayer"), rates, null, true); doomsayerCooldown = Create(20222, Types.Neutral, "doomsayerCooldown", 20f, 2.5f, 60f, 2.5f, doomsayerSpawnRate); doomsayerHasMultipleShotsPerMeeting = Create(20223, Types.Neutral, "doomsayerHasMultipleShotsPerMeeting", true, doomsayerSpawnRate); @@ -1029,7 +1039,7 @@ public static void Load() //-------------------------- Crewmate Options 30000-39999 -------------------------- // - ghostEngineerSpawnRate = Create(50010, Types.Crewmate, cs(GhostEngineer.color, "GhostEngineer"), rates, null, true); + ghostEngineerSpawnRate = Create(50010, Types.Crewmate, cs(GhostEngineer.color, "GhostEngineerOptions"), rates, null, true); guesserSpawnRate = Create(30100, Types.Crewmate, cs(Vigilante.color, "Vigilante"), rates, null, true); guesserNumberOfShots = Create(30101, Types.Crewmate, "guesserNumberOfShots", 3f, 1f, 15f, 1f, guesserSpawnRate); diff --git a/TheOtherRoles/Options/CustomOptions.cs b/TheOtherRoles/Options/CustomOptions.cs index 5c7817f1..e0ed2da9 100644 --- a/TheOtherRoles/Options/CustomOptions.cs +++ b/TheOtherRoles/Options/CustomOptions.cs @@ -366,7 +366,7 @@ public static void Postfix(GameOptionsMenu __instance) copyButton.transform.localPosition += Vector3.down * 0.8f; var copyButtonPassive = copyButton.GetComponent(); var copyButtonRenderer = copyButton.GetComponent(); - copyButtonRenderer.sprite = UnityHelper.loadSpriteFromResources("TheOtherRoles.Resources.CopyButton.png", 175f); + copyButtonRenderer.sprite = new ResourceSprite("TheOtherRoles.Resources.CopyButton.png", 175f); copyButtonPassive.OnClick.RemoveAllListeners(); copyButtonPassive.OnClick = new Button.ButtonClickedEvent(); copyButtonPassive.OnClick.AddListener((Action)(() => @@ -1151,9 +1151,9 @@ private static string buildOptionsOfType(CustomOptionType type, bool headerOnly) if (option.id == 30170) //Deputy sb.AppendLine($"- {cs(Deputy.color, "Deputy".Translate())}: {option.getString()}"); else if (option.id == 20142) - sb.AppendLine($"- {cs(Sidekick.color, "jackalSwoopChance".Translate())}: {option.getString()}"); + sb.AppendLine($"- {cs(Jackal.color, "jackalSwoopChance".Translate())}: {option.getString()}"); else if (option.id == 20135) //Sidekick - sb.AppendLine($"- {cs(Sidekick.color, "Sidekick".Translate())}: {option.getString()}"); + sb.AppendLine($"- {cs(Jackal.color, "Sidekick".Translate())}: {option.getString()}"); } if (headerOnly) return sb.ToString(); diff --git a/TheOtherRoles/Patches/EndGamePatch.cs b/TheOtherRoles/Patches/EndGamePatch.cs index 14c55f2b..33e5837e 100644 --- a/TheOtherRoles/Patches/EndGamePatch.cs +++ b/TheOtherRoles/Patches/EndGamePatch.cs @@ -104,8 +104,6 @@ public static void Prefix(AmongUsClient __instance, [HarmonyArgument(0)] ref End public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ref EndGameResult endGameResult) { - Message("游戏结束"); - AdditionalTempData.clear(); List killRole = [ @@ -148,15 +146,15 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ref En notWinners.AddRange(new[] { Jester.jester, - Sidekick.sidekick, - Amnisiac.amnisiac, - Jackal.jackal, + Jackal.sidekick, Arsonist.arsonist, Swooper.swooper, Vulture.vulture, Werewolf.werewolf, Lawyer.lawyer, Executioner.executioner, + Witness.player, + Specter.player, Thief.thief, Juggernaut.juggernaut, Doomsayer.doomsayer, @@ -165,8 +163,9 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ref En Pavlovsdogs.pavlovsowner, }.Where(p => p != null)); + notWinners.AddRange(Amnisiac.player.Where(p => p != null)); notWinners.AddRange(Pavlovsdogs.pavlovsdogs.Where(p => p != null)); - notWinners.AddRange(Jackal.formerJackals.Where(p => p != null)); + notWinners.AddRange(Jackal.jackal.Where(p => p != null)); notWinners.AddRange(Pursuer.pursuer.Where(p => p != null)); notWinners.AddRange(Survivor.survivor.Where(p => p != null)); if (Akujo.honmeiCannotFollowWin && Akujo.honmei != null) notWinners.Add(Akujo.honmei); @@ -190,7 +189,7 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ref En var loversWin = Lovers.existingAndAlive() && (gameOverReason == (GameOverReason)CustomGameOverReason.LoversWin || (GameManager.Instance.DidHumansWin(gameOverReason) && !Lovers.existingWithKiller())); var teamJackalWin = gameOverReason == (GameOverReason)CustomGameOverReason.TeamJackalWin && - (Jackal.jackal.IsAlive() || Sidekick.sidekick.IsAlive()); + (Jackal.jackal.Any(x => x.IsAlive()) || Jackal.sidekick.IsAlive()); var teamPavlovsWin = gameOverReason == (GameOverReason)CustomGameOverReason.TeamPavlovsWin && (Pavlovsdogs.pavlovsowner.IsAlive() || Pavlovsdogs.pavlovsdogs.Any(p => p.IsAlive())); var vultureWin = Vulture.vulture != null && gameOverReason == (GameOverReason)CustomGameOverReason.VultureWin; @@ -307,23 +306,19 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ref En // Jackal wins if nobody except jackal is alive AdditionalTempData.winCondition = WinCondition.JackalWin; TempData.winners = new Il2CppSystem.Collections.Generic.List(); - var wpd = new WinningPlayerData(Jackal.jackal.Data); - wpd.IsImpostor = false; - TempData.winners.Add(wpd); - // If there is a sidekick. The sidekick also wins - if (Sidekick.sidekick != null) - { - var wpdSidekick = new WinningPlayerData(Sidekick.sidekick.Data); - wpdSidekick.IsImpostor = false; - TempData.winners.Add(wpdSidekick); - } - - foreach (var player in Jackal.formerJackals) + foreach (var player in Jackal.jackal) { var wpdFormerJackal = new WinningPlayerData(player.Data); wpdFormerJackal.IsImpostor = false; TempData.winners.Add(wpdFormerJackal); } + // If there is a sidekick. The sidekick also wins + if (Jackal.sidekick != null) + { + var wpdSidekick = new WinningPlayerData(Jackal.sidekick.Data); + wpdSidekick.IsImpostor = false; + TempData.winners.Add(wpdSidekick); + } } else if (teamPavlovsWin) { @@ -498,6 +493,7 @@ public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)] ref En TempData.winners.Add(new WinningPlayerData(PartTimer.partTimer.Data)); AdditionalTempData.additionalWinConditions.Add(WinCondition.AdditionalPartTimerWin); } + Message($"游戏结束{AdditionalTempData.winCondition}"); // Reset Settings RPCProcedure.resetVariables(); } @@ -1091,6 +1087,15 @@ private static void EndGameForSabotage(ShipStatus __instance) } } +[HarmonyPatch(typeof(GameManager), nameof(GameManager.RpcEndGame))] +internal class RPCEndGamePatch +{ + public static void Postfix(ref GameOverReason endReason) + { + Message($"游戏结束{(CustomGameOverReason)endReason}"); + } +} + internal class PlayerStatistics { public PlayerStatistics(ShipStatus __instance) @@ -1157,13 +1162,13 @@ private void GetPlayerCounts() if (lover) impLover = true; } - if (Jackal.jackal != null && Jackal.jackal.PlayerId == playerInfo.PlayerId) + if (Jackal.jackal != null && Jackal.jackal.Any(x => x.PlayerId == playerInfo.PlayerId)) { numJackalAlive++; if (lover) jackalLover = true; } - if (Sidekick.sidekick != null && Sidekick.sidekick.PlayerId == playerInfo.PlayerId) + if (Jackal.sidekick != null && Jackal.sidekick.PlayerId == playerInfo.PlayerId) { numJackalAlive++; if (lover) jackalLover = true; diff --git a/TheOtherRoles/Patches/ExileControllerPatch.cs b/TheOtherRoles/Patches/ExileControllerPatch.cs index 2904433e..1cf85289 100644 --- a/TheOtherRoles/Patches/ExileControllerPatch.cs +++ b/TheOtherRoles/Patches/ExileControllerPatch.cs @@ -282,6 +282,7 @@ public static void Prefix(GameObject obj) private static void WrapUpPostfix(GameData.PlayerInfo exiled) { + if (CachedPlayer.LocalPlayer.IsDead && Specter.player != PlayerControl.LocalPlayer) CanSeeRoleInfo = true; // Prosecutor win condition if (exiled != null && Executioner.executioner != null && Executioner.target != null && Executioner.target.PlayerId == exiled.PlayerId && !Executioner.executioner.Data.IsDead) @@ -445,6 +446,11 @@ private static void WrapUpPostfix(GameData.PlayerInfo exiled) if (!Yoyo.markStaysOverMeeting) Silhouette.clearSilhouettes(); + + if (AmongUsClient.Instance.AmHost) + { + LastImpostor.promoteToLastImpostor(); + } } [HarmonyPatch(typeof(ExileController), nameof(ExileController.WrapUp))] diff --git a/TheOtherRoles/Patches/HauntMenuMinigamePatch.cs b/TheOtherRoles/Patches/HauntMenuMinigamePatch.cs index d8694ddd..508c238c 100644 --- a/TheOtherRoles/Patches/HauntMenuMinigamePatch.cs +++ b/TheOtherRoles/Patches/HauntMenuMinigamePatch.cs @@ -44,7 +44,7 @@ public static void MatchesFilterPostfix(HauntMenuMinigame __instance, PlayerCont if (__instance.filterMode == HauntMenuMinigame.HauntFilters.Impostor) { var info = RoleInfo.getRoleInfoForPlayer(pc, false); - __result = (pc.Data.Role.IsImpostor || info.Any(x => x.roleTeam == RoleType.Neutral)) && !pc.Data.IsDead; + __result = (pc.Data.Role.IsImpostor || info.Any(x => x.roleType == RoleType.Neutral)) && !pc.Data.IsDead; } } @@ -87,19 +87,26 @@ public static void UpdatePostfix(HauntMenuMinigame __instance) [HarmonyPatch(typeof(AbilityButton), nameof(AbilityButton.Update))] public static void showOrHideAbilityButtonPostfix(AbilityButton __instance) { - var isGameMode = GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek; - if (CachedPlayer.LocalPlayer.Data.IsDead && CanSeeRoleInfo && (CustomOptionHolder.finishTasksBeforeHauntingOrZoomingOut.GetBool() || isGameMode)) + var isHideNSeek = GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek; + + // player has haunt button. + var (playerCompleted, playerTotal) = TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data); + var numberOfLeftTasks = playerTotal - playerCompleted; + + if (!InGame || InMeeting || !CanSeeRoleInfo) { - // player has haunt button. - var (playerCompleted, playerTotal) = TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data); - var numberOfLeftTasks = playerTotal - playerCompleted; - if (numberOfLeftTasks <= 0 || isGameMode) - __instance.Show(); - else - __instance.Hide(); + HudManager.Instance.AbilityButton?.gameObject.SetActive(false); + return; } + else if (CustomOptionHolder.finishTasksBeforeHauntingOrZoomingOut.GetBool() && PlayerControl.LocalPlayer.isCrew() && numberOfLeftTasks > 0) + { + HudManager.Instance.AbilityButton.gameObject.SetActive(false); + return; + } + HudManager.Instance.AbilityButton.gameObject.SetActive(PlayerControl.LocalPlayer.IsDead() || isHideNSeek); } } + [HarmonyPatch(typeof(HauntMenuMinigame), nameof(HauntMenuMinigame.Start))] public static class AddNeutralHauntPatch { diff --git a/TheOtherRoles/Patches/IntroPatch.cs b/TheOtherRoles/Patches/IntroPatch.cs index 2808618d..1972a816 100644 --- a/TheOtherRoles/Patches/IntroPatch.cs +++ b/TheOtherRoles/Patches/IntroPatch.cs @@ -45,7 +45,7 @@ public static void Prefix(IntroCutscene __instance) player.gameObject.SetActive(false); //游戏开始时重置cd - CachedPlayer.LocalPlayer.PlayerControl.SetKillTimer(ModOption.ButtonCooldown); + CustomButton.ResetAllCooldowns(ModOption.ButtonCooldown); if (CachedPlayer.LocalPlayer.PlayerControl == Arsonist.arsonist && p != Arsonist.arsonist) { @@ -208,9 +208,9 @@ public static void setupIntroTeamIcons(IntroCutscene __instance, ref List yourTeam) { var infos = RoleInfo.getRoleInfoForPlayer(CachedPlayer.LocalPlayer.PlayerControl); - var roleInfo = infos.FirstOrDefault(info => info.roleTeam != RoleType.Modifier); + var roleInfo = infos.FirstOrDefault(info => info.roleType != RoleType.Modifier); if (roleInfo == null) return; - if (roleInfo.roleTeam == RoleType.Neutral) + if (roleInfo.roleType == RoleType.Neutral) { var neutralColor = new Color32(76, 84, 78, 255); __instance.BackgroundBar.material.color = roleInfo.color; @@ -264,8 +264,8 @@ public static void SetRoleTexts(IntroCutscene __instance) { // Don't override the intro of the vanilla roles var infos = RoleInfo.getRoleInfoForPlayer(CachedPlayer.LocalPlayer.PlayerControl); - var roleInfo = infos.FirstOrDefault(info => info.roleTeam != RoleType.Modifier); - var modifierInfo = infos.FirstOrDefault(info => info.roleTeam == RoleType.Modifier); + var roleInfo = infos.FirstOrDefault(info => info.roleType != RoleType.Modifier); + var modifierInfo = infos.FirstOrDefault(info => info.roleType == RoleType.Modifier); __instance.RoleBlurbText.text = ""; if (roleInfo != null) diff --git a/TheOtherRoles/Patches/LobbyRoleList.cs b/TheOtherRoles/Patches/LobbyRoleList.cs index e566eac4..697ff4df 100644 --- a/TheOtherRoles/Patches/LobbyRoleList.cs +++ b/TheOtherRoles/Patches/LobbyRoleList.cs @@ -55,6 +55,21 @@ public static void RoleSummaryOnClick() newtitle.transform.localPosition = new Vector3(1f, 0.17f, -2f); newtitle.transform.localScale = Vector3.one * 2.5f; + // 添加退出按钮 + Transform exitButtonTransform = Object.Instantiate(buttonTemplate, container.transform); + exitButtonTransform.name = "RolesSummaryUIExit"; + exitButtonTransform.GetComponent().size = new Vector2(1f, 1f); + exitButtonTransform.GetComponent().sprite = new ResourceSprite("ExitButton.png", 135f); + exitButtonTransform.localPosition = new Vector3(4.4f, 1.3f, -5); // 退出按钮的位置 + exitButtonTransform.localScale = new Vector3(1f, 1.05f, 1f); // 退出按钮的缩放 + + PassiveButton exitButton = exitButtonTransform.GetComponent(); + Button.ButtonClickedEvent exitOnClick = exitButton.OnClick = new Button.ButtonClickedEvent(); + exitOnClick.AddListener((Action)(() => + { + Object.Destroy(RolesSummaryUI); + })); + List buttons = new(); for (int i = 0; i < Teams.Count; i++) @@ -80,7 +95,7 @@ public static void RoleSummaryOnClick() teamid = RoleType.Modifier; break; case "GhostRole": - team = cs(new Color32(25, 68, 142, byte.MaxValue), GetString("GhostRoleText")); + team = cs(new Color32(159, 127, 209, byte.MaxValue), GetString("GhostRoleText")); teamid = RoleType.GhostRole; break; } @@ -137,20 +152,51 @@ public static void roleInfosOnclick(string team, RoleType teamId) TextMeshPro newtitle = Object.Instantiate(textTemplate, container.transform); newtitle.text = team; - newtitle.outlineWidth = 0.1f; + newtitle.outlineWidth = 0.01f; newtitle.transform.localPosition = new Vector3(0f, 2.8f, -2f); newtitle.transform.localScale = Vector3.one * 2.5f; + // 添加退出按钮 + Transform exitButtonTransform = Object.Instantiate(buttonTemplate, container.transform); + exitButtonTransform.name = "RoleListExit"; + exitButtonTransform.GetComponent().size = new Vector2(1f, 1f); + exitButtonTransform.GetComponent().sprite = new ResourceSprite("ExitButton.png", 135f); + exitButtonTransform.localPosition = new Vector3(5.8f, 0.5f, -5); + exitButtonTransform.localScale = new Vector3(1f, 1f, 1f); + + PassiveButton exitButton = exitButtonTransform.GetComponent(); + Button.ButtonClickedEvent exitOnClick = exitButton.OnClick = new Button.ButtonClickedEvent(); + exitOnClick.AddListener((Action)(() => + { + Object.Destroy(RolesSummaryUI); + })); + + // 添加返回按钮 + Transform backButtonTransform = Object.Instantiate(buttonTemplate, container.transform); + backButtonTransform.name = "RoleListBack"; + backButtonTransform.GetComponent().size = new Vector2(1f, 1f); + backButtonTransform.GetComponent().sprite = new ResourceSprite("BackButton.png", 135f); + backButtonTransform.localPosition = new Vector3(5.8f, 1.5f, -5); + backButtonTransform.localScale = new Vector3(1f, 1f, 1f); + + PassiveButton backButton = backButtonTransform.GetComponent(); + Button.ButtonClickedEvent backOnClick = backButton.OnClick = new Button.ButtonClickedEvent(); + backOnClick.AddListener((Action)(() => + { + Object.Destroy(container.gameObject); + _ = new LateTask(RoleSummaryOnClick, 0.05f); + })); + List buttons = new(); int count = 0; bool gameStarted = AmongUsClient.Instance.GameState == InnerNet.InnerNetClient.GameStates.Started; foreach (RoleInfo roleInfo in RoleInfo.allRoleInfos) { - if (roleInfo.roleTeam == RoleType.Modifier && teamId != RoleType.Modifier) continue; - else if (roleInfo.roleTeam == RoleType.Neutral && teamId != RoleType.Neutral) continue; - else if (roleInfo.roleTeam == RoleType.Impostor && teamId != RoleType.Impostor) continue; - else if (roleInfo.roleTeam == RoleType.Crewmate && teamId != RoleType.Crewmate) continue; - else if (roleInfo.roleTeam == RoleType.GhostRole && teamId != RoleType.GhostRole) continue; + if (roleInfo.roleType == RoleType.Modifier && teamId != RoleType.Modifier) continue; + else if (roleInfo.roleType == RoleType.Neutral && teamId != RoleType.Neutral) continue; + else if (roleInfo.roleType == RoleType.Impostor && teamId != RoleType.Impostor) continue; + else if (roleInfo.roleType == RoleType.Crewmate && teamId != RoleType.Crewmate) continue; + else if (roleInfo.roleType == RoleType.GhostRole && teamId != RoleType.GhostRole) continue; Transform buttonTransform = Object.Instantiate(buttonTemplate, container.transform); buttonTransform.name = cs(roleInfo.color, roleInfo.Name) + " Button"; @@ -192,6 +238,7 @@ private static void AddInfoCard(RoleInfo roleInfo) string roleSettingDescription = roleInfo.FullDescription != "" ? roleInfo.FullDescription : roleInfo.ShortDescription; string coloredHelp = cs(Color.white, roleSettingDescription); + Transform buttonTemplate = HudManager.Instance.SettingsButton.transform; GameObject roleCard = Object.Instantiate(new GameObject("RoleCard"), HudManager.Instance.transform); SpriteRenderer roleCardRend = roleCard.AddComponent(); roleCard.layer = 5; @@ -199,6 +246,37 @@ private static void AddInfoCard(RoleInfo roleInfo) roleCard.transform.localScale = new Vector3(0.68f, 0.68f, 1f); RolesSummaryUI = roleCard.gameObject; + // 添加退出按钮 + Transform exitButtonTransform = Object.Instantiate(buttonTemplate, roleCardRend.transform); + exitButtonTransform.name = "RoleCardExit"; + exitButtonTransform.GetComponent().size = new Vector2(1f, 1f); + exitButtonTransform.GetComponent().sprite = new ResourceSprite("ExitButton.png", 135f); + exitButtonTransform.localPosition = new Vector3(5.35f, 0.5f, -5); + exitButtonTransform.localScale = new Vector3(1f, 1f, 1f); + + PassiveButton exitButton = exitButtonTransform.GetComponent(); + Button.ButtonClickedEvent exitOnClick = exitButton.OnClick = new Button.ButtonClickedEvent(); + exitOnClick.AddListener((Action)(() => + { + Object.Destroy(RolesSummaryUI); + })); + + // 添加返回按钮 + Transform backButtonTransform = Object.Instantiate(buttonTemplate, roleCardRend.transform); + backButtonTransform.name = "RoleCardBack"; + backButtonTransform.GetComponent().size = new Vector2(1f, 1f); + backButtonTransform.GetComponent().sprite = new ResourceSprite("BackButton.png", 135f); + backButtonTransform.localPosition = new Vector3(5.35f, 1.5f, -5); + backButtonTransform.localScale = new Vector3(1f, 1f, 1f); + + PassiveButton backButton = backButtonTransform.GetComponent(); + Button.ButtonClickedEvent backOnClick = backButton.OnClick = new Button.ButtonClickedEvent(); + backOnClick.AddListener((Action)(() => + { + Object.Destroy(roleCardRend.gameObject); + _ = new LateTask(RoleSummaryOnClick, 0); + })); + roleCardRend.sprite = UnityHelper.loadSpriteFromResources("TheOtherRoles.Resources.LobbyRoleInfo.SummaryScreen.png", 110f); infoButtonText = Object.Instantiate(HudManager.Instance.TaskPanel.taskText, roleCard.transform); diff --git a/TheOtherRoles/Patches/MeetingHudPatch.cs b/TheOtherRoles/Patches/MeetingHudPatch.cs index 9ad7321e..3c060a43 100644 --- a/TheOtherRoles/Patches/MeetingHudPatch.cs +++ b/TheOtherRoles/Patches/MeetingHudPatch.cs @@ -174,7 +174,8 @@ private static void populateButtonsPostfix(MeetingHud __instance) var checkbox = Object.Instantiate(template, playerVoteArea.transform, true); checkbox.transform.position = template.transform.position; checkbox.transform.localPosition = new Vector3(-0.95f, 0.03f, -1.3f); - if (HandleGuesser.isGuesserGm && HandleGuesser.isGuesser(CachedPlayer.LocalPlayer.PlayerId)) + if ((HandleGuesser.isGuesserGm && HandleGuesser.isGuesser(CachedPlayer.LocalPlayer.PlayerId)) + || (CachedPlayer.LocalPlayer.PlayerId == Mimic.mimic.PlayerId)) checkbox.transform.localPosition = new Vector3(-0.5f, 0.03f, -1.3f); var renderer = checkbox.GetComponent(); renderer.sprite = Swapper.spriteCheck; @@ -466,26 +467,6 @@ private static bool Prefix(MeetingHud __instance) VoterId = playerVoteArea.TargetPlayerId, VotedForId = playerVoteArea.VotedFor }); - /* - if (Tiebreaker.tiebreaker == null || Balancer.currentAbilityUser != null || playerVoteArea.TargetPlayerId != Tiebreaker.tiebreaker.PlayerId) - continue; - - var tiebreakerVote = playerVoteArea.VotedFor; - if (swapped1 != null && swapped2 != null) - { - if (tiebreakerVote == swapped1.TargetPlayerId) tiebreakerVote = swapped2.TargetPlayerId; - else if (tiebreakerVote == swapped2.TargetPlayerId) tiebreakerVote = swapped1.TargetPlayerId; - } - - if (potentialExiled.FindAll(x => x != null && x.PlayerId == tiebreakerVote).Count <= 0 || - (potentialExiled.Count <= 1 && !skipIsTie)) continue; - exiled = potentialExiled.ToArray().FirstOrDefault(v => v.PlayerId == tiebreakerVote); - tie = false; - tiebreakerHandled = true; - var writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, - (byte)CustomRPC.SetTiebreak, SendOption.Reliable); - AmongUsClient.Instance.FinishRpcImmediately(writer); - RPCProcedure.setTiebreak();*/ } states = statesList.ToArray(); @@ -570,7 +551,8 @@ private static bool Prefix(MeetingHud __instance, Il2CppStructArray Swapper.charges--; } - __instance.TitleText.text = FastDestroyableSingleton.Instance.GetString(StringNames.MeetingVotingResults, new Il2CppReferenceArray(0)); + __instance.TitleText.text = FastDestroyableSingleton.Instance + .GetString(StringNames.MeetingVotingResults, new Il2CppReferenceArray(0)); var allNums = new Dictionary(); __instance.TitleText.text = Object.FindObjectOfType().GetString(StringNames.MeetingVotingResults, []); @@ -593,10 +575,9 @@ private static bool Prefix(MeetingHud __instance, Il2CppStructArray playerVoteArea.ClearForResults(); var num2 = 0; - var mayorVotesDisplayed = 0; for (var j = 0; j < states.Length; j++) { - if (Prosecutor.ProsecuteThisMeeting) continue; + if (Prosecutor.ProsecuteThisMeeting && Prosecutor.prosecutor.IsAlive()) break; var voterState = states[j]; var playerById = GameData.Instance.GetPlayerById(voterState.VoterId); if (playerById == null) @@ -606,57 +587,61 @@ private static bool Prefix(MeetingHud __instance, Il2CppStructArray else if (i == 0 && voterState.SkippedVote && !playerById.IsDead) { __instance.BloopAVoteIcon(playerById, num, __instance.SkippedVoting.transform); + + if (Mayor.mayor != null && voterState.VoterId == Mayor.mayor.PlayerId && Mayor.Revealed) + for (var repeat = 1; repeat < Mayor.Vote; repeat++) + __instance.BloopAVoteIcon(playerById, num, __instance.SkippedVoting.transform); + num++; } else if (voterState.VotedForId == targetPlayerId && !playerById.IsDead) { __instance.BloopAVoteIcon(playerById, num2, playerVoteArea.transform); + + if (Mayor.mayor != null && voterState.VoterId == Mayor.mayor.PlayerId && Mayor.Revealed) + for (var repeat = 1; repeat < Mayor.Vote; repeat++) + __instance.BloopAVoteIcon(playerById, num2, playerVoteArea.transform); + num2++; } - - // Mayor vote, redo this iteration to place a second vote - if (Mayor.mayor == null || voterState.VoterId != (sbyte)Mayor.mayor.PlayerId - || mayorVotesDisplayed >= Mayor.Vote - 1 || !Mayor.Revealed) - { - mayorVotesDisplayed = 0; - continue; - }; - mayorVotesDisplayed++; - j--; } - for (var stateIdx = 0; stateIdx < states.Length; stateIdx++) + for (var j = 0; j < states.Length; j++) { - var voteState = states[stateIdx]; - var playerInfo = GameData.Instance.GetPlayerById(voteState.VoterId); + var voterState = states[j]; + var playerById = GameData.Instance.GetPlayerById(voterState.VoterId); + if (Prosecutor.prosecutor == null) continue; - if (Prosecutor.prosecutor.Data.IsDead || Prosecutor.prosecutor.Data.Disconnected) continue; + if (Prosecutor.prosecutor.IsDead()) continue; if (Prosecutor.ProsecuteThisMeeting) { - if (voteState.VoterId == Prosecutor.prosecutor.PlayerId) + byte targetId = playerVoteArea.TargetPlayerId; + if (doSwap) { - if (playerInfo == null) + if (playerVoteArea.TargetPlayerId == swapped2.TargetPlayerId) targetId = swapped1.TargetPlayerId; + if (playerVoteArea.TargetPlayerId == swapped1.TargetPlayerId) targetId = swapped2.TargetPlayerId; + } + + if (voterState.VoterId == Prosecutor.prosecutor.PlayerId) + { + if (playerById == null) { - Error(string.Format("找不到投票者的玩家信息: {0}", voteState.VoterId)); + Error($"找不到投票者的玩家信息: {voterState.VoterId}"); Prosecutor.Prosecuted = true; } - else if (i == 0 && voteState.SkippedVote) + else if (i == 0 && voterState.SkippedVote) { - __instance.BloopAVoteIcon(playerInfo, amountOfSkippedVoters, __instance.SkippedVoting.transform); - __instance.BloopAVoteIcon(playerInfo, amountOfSkippedVoters, __instance.SkippedVoting.transform); - __instance.BloopAVoteIcon(playerInfo, amountOfSkippedVoters, __instance.SkippedVoting.transform); - __instance.BloopAVoteIcon(playerInfo, amountOfSkippedVoters, __instance.SkippedVoting.transform); - __instance.BloopAVoteIcon(playerInfo, amountOfSkippedVoters, __instance.SkippedVoting.transform); + for (var repeat = 0; repeat < 6; repeat++) + __instance.BloopAVoteIcon(playerById, allNums[i], playerVoteArea.transform); + amountOfSkippedVoters += 6; Prosecutor.Prosecuted = true; } - else if (voteState.VotedForId == playerVoteArea.TargetPlayerId) + else if (voterState.VotedForId == targetId) { - __instance.BloopAVoteIcon(playerInfo, allNums[i], playerVoteArea.transform); - __instance.BloopAVoteIcon(playerInfo, allNums[i], playerVoteArea.transform); - __instance.BloopAVoteIcon(playerInfo, allNums[i], playerVoteArea.transform); - __instance.BloopAVoteIcon(playerInfo, allNums[i], playerVoteArea.transform); - __instance.BloopAVoteIcon(playerInfo, allNums[i], playerVoteArea.transform); + for (var repeat = 0; repeat < 6; repeat++) + __instance.BloopAVoteIcon(playerById, allNums[i], playerVoteArea.transform); + allNums[i] += 6; Prosecutor.Prosecuted = true; } @@ -802,7 +787,7 @@ public static void Prefix(PlayerControl __instance, [HarmonyArgument(0)] GameDat { var timeBeforeMeeting = (float)(DateTime.UtcNow - entry.time).TotalMilliseconds / 1000; msg += Portalmaker.logShowsTime ? $"{(int)timeBeforeMeeting} 秒前: " : ""; - msg = msg + $"{entry.name} 使用了星门\n"; + msg += $"{entry.name} 使用了星门\n"; } FastDestroyableSingleton.Instance.Chat.AddChat(Portalmaker.portalmaker, $"{msg}"); @@ -925,7 +910,7 @@ public static void Postfix(MeetingHud __instance) { Message("会议开始"); shookAlready = false; - if (CachedPlayer.LocalPlayer.IsDead) CanSeeRoleInfo = true; + if (CachedPlayer.LocalPlayer.IsDead && Specter.player != PlayerControl.LocalPlayer) CanSeeRoleInfo = true; // Remove first kill shield firstKillPlayer = null; diff --git a/TheOtherRoles/Patches/PlayerControlPatch.cs b/TheOtherRoles/Patches/PlayerControlPatch.cs index 17ed3b47..f5176331 100644 --- a/TheOtherRoles/Patches/PlayerControlPatch.cs +++ b/TheOtherRoles/Patches/PlayerControlPatch.cs @@ -98,7 +98,9 @@ private static void setBasePlayerOutlines() shouldShowGhostInfo()); } - if ((CachedPlayer.LocalPlayer.Data.IsDead || (BodyGuard.showShielded && target == BodyGuard.guarded)) && BodyGuard.guarded != null && target == BodyGuard.guarded) + if (BodyGuard.guarded != null && (CachedPlayer.LocalPlayer.Data.IsDead || + CachedPlayer.LocalPlayer.PlayerControl == BodyGuard.bodyguard || + (BodyGuard.showShielded && CachedPlayer.LocalPlayer.PlayerControl == BodyGuard.guarded))) { hasVisibleShield = true; color = new Color32(205, 150, 100, byte.MaxValue); @@ -324,7 +326,10 @@ private static void vampireSetTarget() if (Vampire.vampire == null || Vampire.vampire != CachedPlayer.LocalPlayer.PlayerControl) return; PlayerControl target = null; - if (Spy.spy != null || Sidekick.wasSpy || Jackal.wasSpy) + + var untargetablePlayers = new List(); + + if (Spy.spy != null) { if (Spy.impostorsCanKillAnyone) { @@ -332,12 +337,12 @@ private static void vampireSetTarget() } else { - target = setTarget(true, true, [Spy.spy, Sidekick.wasTeamRed ? Sidekick.sidekick : null, Jackal.wasTeamRed ? Jackal.jackal : null]); + target = setTarget(true, true); } } else { - target = setTarget(true, true, [Sidekick.wasImpostor ? Sidekick.sidekick : null, Jackal.wasImpostor ? Jackal.jackal : null]); + target = setTarget(true, true); } bool targetNearGarlic = false; @@ -352,38 +357,44 @@ private static void vampireSetTarget() private static void jackalSetTarget() { - if (Jackal.jackal == null || Jackal.jackal != CachedPlayer.LocalPlayer.PlayerControl) return; - var untargetablePlayers = new List(); - if (Sidekick.sidekick != null) untargetablePlayers.Add(Sidekick.sidekick); - //if (Jackal.jackal != null && Jackal.isInvisable) untargetablePlayers.Add(Jackal.jackal); - // Exclude Jackal from targeting the Mini unless it has grown up - if (Mini.mini != null && !Mini.isGrownUp()) untargetablePlayers.Add(Mini.mini); - Jackal.currentTarget = setTarget(untargetablePlayers: untargetablePlayers); - setPlayerOutline(Jackal.currentTarget, Palette.ImpostorRed); + if (Jackal.jackal.Any(x => x.IsAlive() && x.PlayerId == CachedPlayer.LocalId)) + { + var untargetablePlayers = new List(); + foreach (var p in Jackal.jackal) + { + untargetablePlayers.Add(p); + } + if (Jackal.sidekick != null) untargetablePlayers.Add(Jackal.sidekick); + if (Mini.mini != null && !Mini.isGrownUp()) untargetablePlayers.Add(Mini.mini); + Jackal.currentTarget = setTarget(untargetablePlayers: untargetablePlayers); + setPlayerOutline(Jackal.currentTarget, Palette.ImpostorRed); + } } private static void sidekickSetTarget() { - if (Sidekick.sidekick == null || Sidekick.sidekick != CachedPlayer.LocalPlayer.PlayerControl) return; + if (Jackal.sidekick == null || Jackal.sidekick != CachedPlayer.LocalPlayer.PlayerControl) return; var untargetablePlayers = new List(); - if (Jackal.jackal != null) untargetablePlayers.Add(Jackal.jackal); - if (Mini.mini != null && !Mini.isGrownUp()) - untargetablePlayers.Add(Mini.mini); // Exclude Sidekick from targeting the Mini unless it has grown up - Sidekick.currentTarget = setTarget(untargetablePlayers: untargetablePlayers); - if (Sidekick.canKill) setPlayerOutline(Sidekick.currentTarget, Palette.ImpostorRed); + foreach (var p in Jackal.jackal) + { + untargetablePlayers.Add(p); + } + if (Mini.mini != null && !Mini.isGrownUp()) untargetablePlayers.Add(Mini.mini); + Jackal.currentTarget2 = setTarget(untargetablePlayers: untargetablePlayers); + setPlayerOutline(Jackal.currentTarget2, Palette.ImpostorRed); } private static void sidekickCheckPromotion() { // If LocalPlayer is Sidekick, the Jackal is disconnected and Sidekick promotion is enabled, then trigger promotion - if (Sidekick.sidekick == null || Sidekick.sidekick != CachedPlayer.LocalPlayer.PlayerControl) return; - if (Sidekick.sidekick.Data.IsDead || !Sidekick.promotesToJackal) return; - if (Jackal.jackal == null || Jackal.jackal?.Data?.Disconnected == true) + if (Jackal.sidekick.IsDead()|| !Jackal.promotesToJackal || Jackal.sidekick != CachedPlayer.LocalPlayer.PlayerControl) return; + if (Jackal.jackal.Count > 0 && Jackal.jackal.All(x => x.IsDead())) { var writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SidekickPromotes, SendOption.Reliable); + writer.Write(Jackal.sidekick.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); - RPCProcedure.sidekickPromotes(); + RPCProcedure.sidekickPromotes(CachedPlayer.LocalId); } } @@ -402,8 +413,6 @@ private static void eraserSetTarget() var untargetables = new List(); if (Spy.spy != null) untargetables.Add(Spy.spy); - if (Sidekick.wasTeamRed) untargetables.Add(Sidekick.sidekick); - if (Jackal.wasTeamRed) untargetables.Add(Jackal.jackal); Eraser.currentTarget = setTarget(!Eraser.canEraseAnyone, untargetablePlayers: Eraser.canEraseAnyone ? [] : untargetables); setPlayerOutline(Eraser.currentTarget, Eraser.color); @@ -432,8 +441,8 @@ private static void deputyUpdate() private static void engineerUpdate() { var jackalHighlight = Engineer.highlightForTeamJackal && - (CachedPlayer.LocalPlayer.PlayerControl == Jackal.jackal || - CachedPlayer.LocalPlayer.PlayerControl == Sidekick.sidekick); + (Jackal.jackal.Any(x => x == CachedPlayer.LocalPlayer.PlayerControl) || + CachedPlayer.LocalPlayer.PlayerControl == Jackal.sidekick); var impostorHighlight = Engineer.highlightForImpostors && CachedPlayer.LocalPlayer.Data.Role.IsImpostor; if ((jackalHighlight || impostorHighlight) && MapUtilities.CachedShipStatus?.AllVents != null) foreach (var vent in MapUtilities.CachedShipStatus.AllVents) @@ -468,7 +477,7 @@ private static void impostorSetTarget() } PlayerControl target; - if (Spy.spy != null || Sidekick.wasSpy || Jackal.wasSpy) + if (Spy.spy != null) { if (Spy.impostorsCanKillAnyone) { @@ -476,12 +485,12 @@ private static void impostorSetTarget() } else { - target = setTarget(true, true, [Spy.spy, Sidekick.wasTeamRed ? Sidekick.sidekick : null, Jackal.wasTeamRed ? Jackal.jackal : null]); + target = setTarget(true, true, [Spy.spy]); } } else { - target = setTarget(true, true, [Sidekick.wasImpostor ? Sidekick.sidekick : null, Jackal.wasImpostor ? Jackal.jackal : null]); + target = setTarget(true, true); } FastDestroyableSingleton.Instance.KillButton.SetTarget(target); // Includes setPlayerOutline(target, Palette.ImpstorRed); @@ -516,14 +525,14 @@ private static void swooperUpdate() AmongUsClient.Instance.FinishRpcImmediately(invisibleWriter); RPCProcedure.setSwoop(Swooper.swooper.PlayerId, byte.MaxValue); } - if (Jackal.isInvisable && Jackal.swoopTimer <= 0 && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl) + if (Jackal.isInvisable && Jackal.swoopTimer <= 0 && Jackal.jackal.Any(x => x == CachedPlayer.LocalPlayer.PlayerControl)) { var invisibleWriter = AmongUsClient.Instance.StartRpcImmediately( CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetJackalSwoop, SendOption.Reliable); - invisibleWriter.Write(Jackal.jackal.PlayerId); + invisibleWriter.Write(CachedPlayer.LocalPlayer.PlayerId); invisibleWriter.Write(byte.MaxValue); AmongUsClient.Instance.FinishRpcImmediately(invisibleWriter); - RPCProcedure.setJackalSwoop(Jackal.jackal.PlayerId, byte.MaxValue); + RPCProcedure.setJackalSwoop(CachedPlayer.LocalPlayer.PlayerId, byte.MaxValue); } } @@ -721,16 +730,6 @@ public static void GiantSizeUpdate(PlayerControl p) { if (Giant.giant == null || InMeeting) return; - DeadBody[] array = Object.FindObjectsOfType(); - foreach (var body in array.Where(x => x.ParentId == Giant.giant.PlayerId)) - { - try - { - body.transform.localScale = new Vector3(Giant.size, Giant.size, 1f); - } - catch (Exception e) { Error(e, "updateGiant"); } - } - var collider = p.Collider.CastFast(); collider.offset = Mini.defaultColliderOffset * Vector2.down; @@ -745,41 +744,41 @@ public static void GiantSizeUpdate(PlayerControl p) public static void updatePlayerInfo() { - var local = CachedPlayer.LocalPlayer.PlayerControl; - //var colorBlindTextMeetingInitialLocalPos = new Vector3(0.3384f, -0.16666f, -0.01f); - //var colorBlindTextMeetingInitialLocalScale = new Vector3(0.9f, 1f, 1f); foreach (PlayerControl p in CachedPlayer.AllPlayers) { - // Colorblind Text in Meeting var playerVoteArea = MeetingHud.Instance?.playerStates?.FirstOrDefault(x => x.TargetPlayerId == p.PlayerId); if (playerVoteArea != null && playerVoteArea.ColorBlindName.gameObject.active) { playerVoteArea.ColorBlindName.transform.localPosition = new Vector3(-0.93f, -0.2f, -0.1f); - //playerVoteArea.ColorBlindName.transform.localScale = colorBlindTextMeetingInitialLocalScale * 0.8f; + playerVoteArea.ColorBlindName.fontSize *= 1.75f; } - // This moves both the name AND the colorblindtext behind objects (if the player is behind the object), like the rock on polus p.cosmetics.nameText.transform.parent.SetLocalZ(-0.0001f); - if (p == local || local.Data.IsDead || - (Lawyer.lawyerKnowsRole && local == Lawyer.lawyer && p == Lawyer.target) || + bool canSeeRole = (Lawyer.lawyerKnowsRole && local == Lawyer.lawyer && p == Lawyer.target) || (PartTimer.knowsRole && local == PartTimer.partTimer && p == PartTimer.target) || (local == PartTimer.target && p == PartTimer.partTimer) || (Akujo.knowsRoles && local == Akujo.akujo && (p == Akujo.honmei || Akujo.keeps.Any(x => x.PlayerId == p.PlayerId))) || - (p == Mayor.mayor && Mayor.Revealed) || - (local == Slueth.slueth && Slueth.reported.Any(x => x.PlayerId == p.PlayerId)) || - (ModOption.impostorSeeRoles && Spy.spy == null && CachedPlayer.LocalPlayer.Data.Role.IsImpostor && - !CachedPlayer.LocalPlayer.IsDead && p == (p.Data.Role.IsImpostor && !p.Data.IsDead)) || - (local == Poucher.poucher && Poucher.killed.Any(x => x.PlayerId == p.PlayerId))) + (ModOption.impostorSeeRoles && Spy.spy == null && PlayerControl.LocalPlayer.isImpostor() && + PlayerControl.LocalPlayer.IsAlive() && p.isImpostor() && p.IsAlive()); + + bool reported = ((local == Slueth.slueth && Slueth.reported.Any(x => x.PlayerId == p.PlayerId)) + || (local == Poucher.poucher && Poucher.killed.Any(x => x.PlayerId == p.PlayerId))) && p.IsDead(); + + if (p == local || local.Data.IsDead || canSeeRole || reported || (Mayor.mayor == p && Mayor.Revealed)) { + var roleNames = RoleInfo.GetRolesString(p, true, false, false, true); + var mainRole = RoleInfo.GetRolesString(p, true, false, false, false); + var allRoleText = RoleInfo.GetRolesString(p, true, true, true, true); + var playerInfoTransform = p.cosmetics.nameText.transform.parent.FindChild("Info"); var playerInfo = playerInfoTransform != null ? playerInfoTransform.GetComponent() : null; if (playerInfo == null) { playerInfo = Object.Instantiate(p.cosmetics.nameText, p.cosmetics.nameText.transform.parent); playerInfo.transform.localPosition += Vector3.up * 0.225f; - playerInfo.fontSize *= 0.75f; + playerInfo.fontSize *= 0.8f; playerInfo.gameObject.name = "Info"; playerInfo.color = playerInfo.color.SetAlpha(1f); } @@ -803,8 +802,6 @@ public static void updatePlayerInfo() } var (tasksCompleted, tasksTotal) = TasksHandler.taskInfo(p.Data); - var roleNames = RoleInfo.GetRolesString(p, true, false, false, true); - var allRoleText = RoleInfo.GetRolesString(p, true, true, true, true); var taskInfo = tasksTotal > 0 ? $"({tasksCompleted}/{tasksTotal})" : ""; var playerInfoText = ""; @@ -820,46 +817,42 @@ public static void updatePlayerInfo() } meetingInfoText = $"{allRoleText} {taskInfo}".Trim(); } - else if (ModOption.impostorSeeRoles - && Spy.spy == null - && CachedPlayer.LocalPlayer.Data.Role.IsImpostor - && !CachedPlayer.LocalPlayer.Data.IsDead - && p.Data.Role.IsImpostor && !p.Data.IsDead) - { - playerInfoText = roleNames; - meetingInfoText = playerInfoText; - } - else if (Lawyer.lawyerKnowsRole && local == Lawyer.lawyer && p == Lawyer.target) - { - playerInfoText = roleNames; - meetingInfoText = playerInfoText; - } - else if (PartTimer.partTimer == local && PartTimer.target != null && p == PartTimer.target && local.IsAlive()) + else if (reported) { - playerInfoText = roleNames; - meetingInfoText = playerInfoText; + meetingInfoText = playerInfoText = mainRole; } else if (local.IsAlive() && Mayor.mayor == p && Mayor.Revealed) { meetingInfoText = "Mayor".Translate(); } - else if (local == PartTimer.target && p == PartTimer.partTimer) + else if (canSeeRole) { - playerInfoText = roleNames; - meetingInfoText = playerInfoText; + meetingInfoText = playerInfoText = roleNames; } - else if (CanSeeRoleInfo) + else { - playerInfoText = $"{allRoleText} {taskInfo}".Trim(); - meetingInfoText = playerInfoText; + if (CanSeeRoleInfo) + { + playerInfoText = $"{allRoleText} {taskInfo}".Trim(); + meetingInfoText = playerInfoText; + } } playerInfo.text = playerInfoText; playerInfo.gameObject.SetActive(p.Visible); if (meetingInfo != null) - meetingInfo.text = MeetingHud.Instance.state == MeetingHud.VoteStates.Results - ? "" - : meetingInfoText; + { + meetingInfo.text = MeetingHud.Instance.state == MeetingHud.VoteStates.Results ? "" : meetingInfoText; + } + } + else + { + if (local != p && p != null) + { + var playerInfoTransform = p.cosmetics.nameText.transform.parent.FindChild("Info"); + var playerInfo = playerInfoTransform?.GetComponent(); + if (playerInfo != null) playerInfo.text = ""; + } } } } @@ -1091,9 +1084,7 @@ private static void bountyHunterUpdate() var possibleTargets = new List(); foreach (PlayerControl p in CachedPlayer.AllPlayers) if (!p.Data.IsDead && !p.Data.Disconnected && p != p.Data.Role.IsImpostor && p != Spy.spy && - (p != Sidekick.sidekick || !Sidekick.wasTeamRed) && (p != Jackal.jackal || !Jackal.wasTeamRed) && - (p != Mini.mini || Mini.isGrownUp()) && (BountyHunter.bountyHunter.getPartner() == null || - p != BountyHunter.bountyHunter.getPartner())) + (p != Mini.mini || Mini.isGrownUp()) && (BountyHunter.bountyHunter.getPartner() == null || p != BountyHunter.bountyHunter.getPartner())) possibleTargets.Add(p); if (possibleTargets.Count == 0) return; BountyHunter.bounty = possibleTargets[rnd.Next(0, possibleTargets.Count)]; @@ -1181,9 +1172,9 @@ private static void vultureUpdate() private static void amnisiacUpdate() { - if (Amnisiac.amnisiac == null || CachedPlayer.LocalPlayer.PlayerControl != Amnisiac.amnisiac || - Amnisiac.localArrows == null || !Amnisiac.showArrows) return; - if (Amnisiac.amnisiac.Data.IsDead) + if (Amnisiac.player.Count < 1 || Amnisiac.player.Any(x => x.PlayerId != CachedPlayer.LocalId) + || Amnisiac.localArrows == null || !Amnisiac.showArrows) return; + if (Amnisiac.player.Any(x => x.PlayerId == CachedPlayer.LocalId)) { foreach (var arrow in Amnisiac.localArrows) Object.Destroy(arrow.arrow); Amnisiac.localArrows = []; @@ -1556,8 +1547,6 @@ private static void witchSetTarget() // Also target players that have already been spelled, to hide spells that were blanks/blocked by shields untargetables = []; if (Spy.spy != null && !Witch.canSpellAnyone) untargetables.Add(Spy.spy); - if (Sidekick.wasTeamRed && !Witch.canSpellAnyone) untargetables.Add(Sidekick.sidekick); - if (Jackal.wasTeamRed && !Witch.canSpellAnyone) untargetables.Add(Jackal.jackal); } Witch.currentTarget = setTarget(!Witch.canSpellAnyone, untargetablePlayers: untargetables); @@ -1570,8 +1559,6 @@ private static void ninjaSetTarget() var untargetables = new List(); if (Spy.spy != null && !Spy.impostorsCanKillAnyone) untargetables.Add(Spy.spy); if (Mini.mini != null && !Mini.isGrownUp()) untargetables.Add(Mini.mini); - if (Sidekick.wasTeamRed && !Spy.impostorsCanKillAnyone) untargetables.Add(Sidekick.sidekick); - if (Jackal.wasTeamRed && !Spy.impostorsCanKillAnyone) untargetables.Add(Jackal.jackal); Ninja.currentTarget = setTarget(Spy.spy == null || !Spy.impostorsCanKillAnyone, untargetablePlayers: untargetables); setPlayerOutline(Ninja.currentTarget, Ninja.color); @@ -1647,7 +1634,7 @@ public static void miniCooldownUpdate() HudManagerStartPatch.sheriffKillButton.MaxTimer = Sheriff.cooldown * multiplier; HudManagerStartPatch.vampireKillButton.MaxTimer = Vampire.cooldown * multiplier; HudManagerStartPatch.jackalKillButton.MaxTimer = Jackal.cooldown * multiplier; - HudManagerStartPatch.sidekickKillButton.MaxTimer = Sidekick.cooldown * multiplier; + HudManagerStartPatch.sidekickKillButton.MaxTimer = Jackal.cooldown * multiplier; HudManagerStartPatch.warlockCurseButton.MaxTimer = Warlock.cooldown * multiplier; HudManagerStartPatch.pavlovsdogsKillButton.MaxTimer = Pavlovsdogs.cooldown * multiplier; HudManagerStartPatch.witchSpellButton.MaxTimer = (Witch.cooldown + Witch.currentCooldownAddition) * multiplier; @@ -1932,10 +1919,10 @@ public static void Prefix(PlayerPhysics __instance) { var correctOffset = !isCamoComms && Camouflager.camouflageTimer <= 0f && !MushroomSabotageActive() && (__instance.myPlayer == Mini.mini || - (Morphling.morphling != null && - __instance.myPlayer == Morphling.morphling && - Morphling.morphTarget == Mini.mini && - Morphling.morphTimer > 0f)); + (Morphling.morphling != null && + __instance.myPlayer == Morphling.morphling && + Morphling.morphTarget == Mini.mini && + Morphling.morphTimer > 0f)); correctOffset = correctOffset && !(Mini.mini == Morphling.morphling && Morphling.morphTimer > 0f); if (correctOffset) { @@ -1945,26 +1932,44 @@ public static void Prefix(PlayerPhysics __instance) } } - [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.Revive))] internal class PlayerControlRevivePatch { public static void Postfix(PlayerControl __instance) { - foreach (var p in PlayerControl.AllPlayerControls) + CanSeeRoleInfo = false; + + RPCProcedure.clearGhostRoles(__instance.PlayerId); + + if (__instance.isLover() && Lovers.otherLover(__instance)?.IsDead() == true) + { + Lovers.otherLover(__instance)?.Revive(); + } + + if (Akujo.akujo?.Data?.IsDead == true && Akujo.honmei?.Data?.IsDead == true) { - if (p != __instance && p != null) + var target = __instance == Akujo.akujo ? Akujo.honmei : __instance == Akujo.honmei ? Akujo.akujo : null; + + if (target?.Data.IsDead == true) { - var playerInfoTransform = p.cosmetics.nameText.transform.parent.FindChild("Info"); - var playerInfo = playerInfoTransform?.GetComponent(); - if (playerInfo != null) playerInfo.text = ""; + target.Revive(); + } + } + + DeadBody[] array = Object.FindObjectsOfType(); + for (var i = 0; i < array.Length; i++) + { + if (GameData.Instance.GetPlayerById(array[i].ParentId).PlayerId == __instance.PlayerId) + { + Object.Destroy(array[i].gameObject); + break; } } } } [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.CmdReportDeadBody))] -internal class PlayerControlCmdReportDeadBodyPatch +internal class BodyReportPatch { public static bool Prefix(PlayerControl __instance) { @@ -1973,11 +1978,7 @@ public static bool Prefix(PlayerControl __instance) handleTrapperTrapOnBodyReport(); return true; } -} -[HarmonyPatch(typeof(PlayerControl), nameof(CachedPlayer.LocalPlayer.PlayerControl.CmdReportDeadBody))] -internal class BodyReportPatch -{ private static void Postfix(PlayerControl __instance, [HarmonyArgument(0)] GameData.PlayerInfo target) { // Medic or Detective report @@ -2120,14 +2121,15 @@ public static void Postfix(PlayerControl __instance, [HarmonyArgument(0)] Player LastImpostor.promoteToLastImpostor(); } - // Sidekick promotion trigger on murder - if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead && - target == Jackal.jackal && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl) + // Sidekick promotion trigger on exile + if (Jackal.promotesToJackal && Jackal.sidekick != null && !Jackal.sidekick.Data.IsDead && + Jackal.jackal.Any(x => x == __instance && x == PlayerControl.LocalPlayer)) { var writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SidekickPromotes, SendOption.Reliable); + writer.Write(Jackal.sidekick.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); - RPCProcedure.sidekickPromotes(); + RPCProcedure.sidekickPromotes(Jackal.sidekick.PlayerId); } // Pursuer promotion trigger on murder (the host sends the call such that everyone recieves the update before a possible game End) @@ -2285,7 +2287,7 @@ public static void Postfix(PlayerControl __instance, [HarmonyArgument(0)] Player { color = Color.white; if (target.Data.Role.IsImpostor) color = Color.red; - else if (RoleInfo.getRoleInfoForPlayer(target, false).FirstOrDefault().roleTeam == RoleType.Neutral) color = Color.blue; + else if (RoleInfo.getRoleInfoForPlayer(target, false).FirstOrDefault().roleType == RoleType.Neutral) color = Color.blue; } showFlash(color, 1.75f); @@ -2378,9 +2380,10 @@ public static void Postfix(PlayerControl __instance) var deadPlayer = new DeadPlayer(__instance, DateTime.UtcNow, CustomDeathReason.Exile, null); DeadPlayers.Add(deadPlayer); + if (__instance == PlayerControl.LocalPlayer && Specter.player != PlayerControl.LocalPlayer) CanSeeRoleInfo = true; + // Remove fake tasks when player dies - if (__instance.hasFakeTasks() || __instance == Lawyer.lawyer || __instance == Pursuer.pursuer.Contains(__instance) || - __instance == Thief.thief) + if (__instance.hasFakeTasks() || __instance == Pursuer.pursuer.Contains(__instance) || __instance == Thief.thief) __instance.clearAllTasks(); // Lover suicide trigger on exile @@ -2401,13 +2404,14 @@ public static void Postfix(PlayerControl __instance) } // Sidekick promotion trigger on exile - if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead && - __instance == Jackal.jackal && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl) + if (Jackal.promotesToJackal && Jackal.sidekick != null && !Jackal.sidekick.Data.IsDead && + Jackal.jackal.Any(x => x == __instance && x == PlayerControl.LocalPlayer)) { var writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SidekickPromotes, SendOption.Reliable); + writer.Write(Jackal.sidekick.PlayerId); AmongUsClient.Instance.FinishRpcImmediately(writer); - RPCProcedure.sidekickPromotes(); + RPCProcedure.sidekickPromotes(Jackal.sidekick.PlayerId); } // Pursuer promotion trigger on exile & suicide (the host sends the call such that everyone recieves the update before a possible game End) diff --git a/TheOtherRoles/Patches/RoleAssignmentPatch.cs b/TheOtherRoles/Patches/RoleAssignmentPatch.cs index 5134313f..4f707a2d 100644 --- a/TheOtherRoles/Patches/RoleAssignmentPatch.cs +++ b/TheOtherRoles/Patches/RoleAssignmentPatch.cs @@ -147,6 +147,7 @@ public static RoleAssignmentData getRoleAssignmentData() neutralSettings.Add((byte)RoleId.Jester, CustomOptionHolder.jesterSpawnRate.GetSelection()); neutralSettings.Add((byte)RoleId.Lawyer, CustomOptionHolder.lawyerSpawnRate.GetSelection()); neutralSettings.Add((byte)RoleId.Executioner, CustomOptionHolder.executionerSpawnRate.GetSelection()); + neutralSettings.Add((byte)RoleId.Witness, CustomOptionHolder.witnessSpawnRate.GetSelection()); neutralSettings.Add((byte)RoleId.Vulture, CustomOptionHolder.vultureSpawnRate.GetSelection()); neutralSettings.Add((byte)RoleId.Doomsayer, CustomOptionHolder.doomsayerSpawnRate.GetSelection()); neutralSettings.Add((byte)RoleId.Akujo, CustomOptionHolder.akujoSpawnRate.GetSelection()); @@ -439,7 +440,7 @@ private static void assignRoleTargets(RoleAssignmentData data) // Lawyer foreach (PlayerControl p in CachedPlayer.AllPlayers) if (!p.Data.IsDead && !p.Data.Disconnected && p != Lovers.lover1 && p != Lovers.lover2 && - (p.Data.Role.IsImpostor || p == Swooper.swooper || p == Jackal.jackal || p == Juggernaut.juggernaut || + (p.Data.Role.IsImpostor || p == Swooper.swooper || Jackal.jackal.Any(x => x == p) || p == Juggernaut.juggernaut || p == Werewolf.werewolf || (Lawyer.targetCanBeJester && p == Jester.jester))) possibleTargets.Add(p); @@ -646,8 +647,11 @@ private static void assignGuesserGamemodeToPlayers(List playerLis { var IndexList = new Queue(); - if (Jackal.jackal != null && forceJackal) - IndexList.Enqueue(Jackal.jackal); + if (forceJackal) + { + foreach (var jackalPlayer in Jackal.jackal) + if (jackalPlayer != null) IndexList.Enqueue(jackalPlayer); + } if (Pavlovsdogs.pavlovsowner != null && forcePavlovsowner) IndexList.Enqueue(Pavlovsdogs.pavlovsowner); @@ -826,8 +830,8 @@ private static void assignModifiersToPlayers(List modifiers, List x.Data.Role.IsImpostor - || x == Jackal.jackal - || x == Sidekick.sidekick + || Jackal.jackal.Any(p => p == x) + || x == Jackal.sidekick || x == Lawyer.lawyer || x == Pavlovsdogs.pavlovsowner); } diff --git a/TheOtherRoles/Patches/UpdatePatch.cs b/TheOtherRoles/Patches/UpdatePatch.cs index 7de6bd10..07f74962 100644 --- a/TheOtherRoles/Patches/UpdatePatch.cs +++ b/TheOtherRoles/Patches/UpdatePatch.cs @@ -136,19 +136,21 @@ private static void setNameColors() } } - if (Jackal.jackal != null && Jackal.jackal == localPlayer) + if (Jackal.jackal != null && Jackal.jackal.Any(x => x == localPlayer)) { // Jackal can see his sidekick - setPlayerNameColor(Jackal.jackal, Jackal.color); - if (Sidekick.sidekick != null) setPlayerNameColor(Sidekick.sidekick, Jackal.color); + foreach(var p in Jackal.jackal) + setPlayerNameColor(p, Jackal.color); + if (Jackal.sidekick != null) setPlayerNameColor(Jackal.sidekick, Jackal.color); } // No else if here, as a Lover of team Jackal needs the colors - if (Sidekick.sidekick != null && Sidekick.sidekick == localPlayer) + if (Jackal.sidekick != null && Jackal.sidekick == localPlayer) { // Sidekick can see the jackal - setPlayerNameColor(Sidekick.sidekick, Sidekick.color); - if (Jackal.jackal != null) setPlayerNameColor(Jackal.jackal, Jackal.color); + setPlayerNameColor(Jackal.sidekick, Jackal.color); + foreach (var p in Jackal.jackal) + setPlayerNameColor(p, Jackal.color); } if (Pavlovsdogs.pavlovsowner != null && Pavlovsdogs.pavlovsowner == localPlayer) @@ -218,11 +220,7 @@ private static void setNameColors() // No else if here, as the Impostors need the Spy name to be colored if (Spy.spy != null && localPlayer.Data.Role.IsImpostor) setPlayerNameColor(Spy.spy, Spy.color); - if (Sidekick.sidekick != null && Sidekick.wasTeamRed && localPlayer.Data.Role.IsImpostor) - setPlayerNameColor(Sidekick.sidekick, Spy.color); - if (Jackal.jackal != null && Jackal.wasTeamRed && localPlayer.Data.Role.IsImpostor) - setPlayerNameColor(Jackal.jackal, Spy.color); // Crewmate roles with no changes: Mini // Impostor roles with no changes: Morphling, Camouflager, Vampire, Godfather, Eraser, Janitor, Cleaner, Warlock, BountyHunter, Witch and Mafioso } @@ -339,24 +337,15 @@ private static void setNameTags() player.NameText.text += suffix; } - // Former Thief - if (Thief.formerThief != null && (Thief.formerThief == local || local.Data.IsDead)) - { - var suffix = cs(Thief.color, " $"); - Thief.formerThief.cosmetics.nameText.text += suffix; - if (MeetingHud.Instance != null) - foreach (var player in MeetingHud.Instance.playerStates) - if (player.TargetPlayerId == Thief.formerThief.PlayerId) - player.NameText.text += suffix; - } - // Display lighter / darker color for all alive players if (CachedPlayer.LocalPlayer != null && MeetingHud.Instance != null && ModOption.showLighterDarker) + { foreach (var player in MeetingHud.Instance.playerStates) { var target = playerById(player.TargetPlayerId); if (target != null) player.NameText.text += $" ({(isLighterColor(target) ? "浅" : "深")})"; } + } // Add medic shield info: if (MeetingHud.Instance != null && Medic.medic != null && Medic.shielded != null && Medic.shieldVisible(Medic.shielded)) @@ -397,7 +386,7 @@ public static void miniUpdate() (Mini.mini == Morphling.morphling && Morphling.morphTimer > 0f) || (Mini.mini == Ninja.ninja && Ninja.isInvisble) || SurveillanceMinigamePatch.nightVisionIsActive || (Mini.mini == Swooper.swooper && Swooper.isInvisable) || - (Mini.mini == Jackal.jackal && Jackal.isInvisable) || isActiveCamoComms) return; + (Jackal.jackal.Any(x => x == Mini.mini) && Jackal.isInvisable) || isActiveCamoComms) return; var growingProgress = Mini.growingProgress(); var scale = (growingProgress * 0.35f) + 0.35f; @@ -474,6 +463,20 @@ private static void updateMapButton(HudManager __instance) __instance.MapButton.HeldButtonSprite.color = Trapper.playersOnMap.Any() ? Trapper.color : Color.white; } + public static void updateGiantSize(HudManager __instance) + { + if (Giant.giant == null) return; + DeadBody[] array = UnityEngine.Object.FindObjectsOfType(); + foreach (var body in array.Where(x => x.ParentId == Giant.giant.PlayerId)) + { + try + { + body.transform.localScale = new Vector3(Giant.size, Giant.size, 1f); + } + catch { } + } + } + private static void Postfix(HudManager __instance) { var player = PlayerControl.LocalPlayer; @@ -510,6 +513,7 @@ private static void Postfix(HudManager __instance) // Meeting hide buttons if needed (used for the map usage, because closing the map would show buttons) updateSabotageButton(__instance); updateUseButton(__instance); + updateGiantSize(__instance); updateBlindReport(); updateMapButton(__instance); if (!MeetingHud.Instance) __instance.AbilityButton?.Update(); diff --git a/TheOtherRoles/RPC.cs b/TheOtherRoles/RPC.cs index b62f7637..3c97e315 100644 --- a/TheOtherRoles/RPC.cs +++ b/TheOtherRoles/RPC.cs @@ -8,7 +8,6 @@ using Hazel; using InnerNet; using PowerTools; -using Reactor.Networking.Extensions; using Reactor.Utilities; using Reactor.Utilities.Extensions; using TheOtherRoles.Buttons; @@ -63,6 +62,7 @@ public enum RoleId Executioner, Pursuer, PartTimer, + Witness, Doomsayer, Arsonist, Jackal, @@ -134,6 +134,7 @@ public enum RoleId Shifter, GhostEngineer = 200, + Specter, } public enum CustomRPC @@ -156,12 +157,10 @@ public enum CustomRPC ShareGameMode = 95, // Role functionality - EngineerFixLights = 100, - EngineerFixSubmergedOxygen, - EngineerUsedRepair, + FixLights = 100, + FixSubmergedOxygen, CleanBody, DissectionBody, - RandomDeadBodyPosition, Mine, ShowIndomitableFlash, DragBody, @@ -198,6 +197,7 @@ public enum CustomRPC PavlovsCreateDog, SidekickPromotes, ErasePlayerRoles, + ClearGhostRoles, SetFutureErased, SetFutureReveal, SetFutureShifted, @@ -207,6 +207,7 @@ public enum CustomRPC PlaceNinjaTrace, PlacePortal, AmnisiacTakeRole, + SpecterTakeRole, MimicMimicRole, UsePortal, PlaceJackInTheBox, @@ -252,7 +253,6 @@ public enum CustomRPC TriggerTrap, PlaceBomb, DefuseBomb, - //ShareRoom, YoyoMarkLocation, YoyoBlink, BalancerBalance, @@ -410,7 +410,7 @@ public static void setRole(byte roleId, byte playerId) TimeMaster.timeMaster = player; break; case RoleId.Amnisiac: - Amnisiac.amnisiac = player; + Amnisiac.player.Add(player); break; case RoleId.PartTimer: PartTimer.partTimer = player; @@ -445,6 +445,9 @@ public static void setRole(byte roleId, byte playerId) case RoleId.Butcher: Butcher.butcher = player; break; + case RoleId.Witness: + Witness.player = player; + break; case RoleId.Hacker: Hacker.hacker = player; break; @@ -458,10 +461,10 @@ public static void setRole(byte roleId, byte playerId) Snitch.snitch = player; break; case RoleId.Jackal: - Jackal.jackal = player; + Jackal.jackal.Add(player); break; case RoleId.Sidekick: - Sidekick.sidekick = player; + Jackal.sidekick = player; break; case RoleId.Pavlovsowner: Pavlovsdogs.pavlovsowner = player; @@ -679,6 +682,9 @@ public static void setGhostRole(byte playerId, byte roleId) case RoleId.GhostEngineer: GhostEngineer.player = player; break; + case RoleId.Specter: + Specter.player = player; + break; } } @@ -760,16 +766,6 @@ public static void FixSubmergedOxygen() SubmergedCompatibility.RepairOxygen(); } - public static void engineerUsedRepair() - { - Engineer.remainingFixes--; - /* - if (Helpers.shouldShowGhostInfo()) - { - Helpers.showFlash(Engineer.color, 0.5f, "Engineer Fix"); - }*/ - } - public static void showIndomitableFlash() { if (Indomitable.indomitable == CachedPlayer.LocalPlayer.PlayerControl) showFlash(Indomitable.color); @@ -818,10 +814,6 @@ public static void dissectionBody(byte playerId, byte killerId) } } - public static void RandomDeadBodyPosition(byte parentId, Vector2 position) - { - } - public static void dragBody(byte playerId) { DeadBody[] array = Object.FindObjectsOfType(); @@ -883,667 +875,6 @@ public static void impostorPromotesToLastImpostor(byte targetId) LastImpostor.lastImpostor = target; } - public static void amnisiacTakeRole(byte targetId) - { - var target = playerById(targetId); - var amnisiac = Amnisiac.amnisiac; - if (target == null || amnisiac == null) return; - var targetInfo = RoleInfo.getRoleInfoForPlayer(target); - var roleInfo = targetInfo.FirstOrDefault(info => info.roleTeam != RoleType.Modifier); - switch (roleInfo!.roleId) - { - case RoleId.Crewmate: - Amnisiac.clearAndReload(); - break; - case RoleId.Impostor: - Helpers.turnToImpostor(Amnisiac.amnisiac); - Amnisiac.clearAndReload(); - break; - case RoleId.Jester: - if (Amnisiac.resetRole) Jester.clearAndReload(); - Jester.jester = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - - case RoleId.BodyGuard: - if (Amnisiac.resetRole) BodyGuard.clearAndReload(); - BodyGuard.bodyguard = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Werewolf: - if (Amnisiac.resetRole) Werewolf.clearAndReload(); - Werewolf.werewolf = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - - case RoleId.Prosecutor: - Prosecutor.prosecutor = target; - Amnisiac.clearAndReload(); - break; - - case RoleId.Mayor: - if (Amnisiac.resetRole) Mayor.clearAndReload(); - Mayor.mayor = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Portalmaker: - if (Amnisiac.resetRole) Portalmaker.clearAndReload(); - Portalmaker.portalmaker = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Engineer: - if (Amnisiac.resetRole) Engineer.clearAndReload(); - Engineer.engineer = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Sheriff: - // Never reload Sheriff - if (Sheriff.formerDeputy != null && Sheriff.formerDeputy == Sheriff.sheriff) - { - Sheriff.formerDeputy = null; - Deputy.deputy = amnisiac; - } - else Sheriff.sheriff = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Deputy: - if (Amnisiac.resetRole) Deputy.clearAndReload(); - Deputy.deputy = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Poucher: - if (!Poucher.spawnModifier) - { - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Poucher.clearAndReload(); - Poucher.poucher = amnisiac; - Amnisiac.clearAndReload(); - } - break; - - case RoleId.Butcher: - Helpers.turnToImpostor(Amnisiac.amnisiac); - Butcher.butcher = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Detective: - if (Amnisiac.resetRole) Detective.clearAndReload(); - Detective.detective = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Balancer: - if (Amnisiac.resetRole) Balancer.clearAndReload(); - Balancer.balancer = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.InfoSleuth: - InfoSleuth.infoSleuth = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.TimeMaster: - if (Amnisiac.resetRole) TimeMaster.clearAndReload(); - TimeMaster.timeMaster = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Veteran: - if (Amnisiac.resetRole) Veteran.clearAndReload(); - Veteran.veteran = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Medic: - if (Amnisiac.resetRole) Medic.clearAndReload(); - Medic.medic = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Shifter: - if (Amnisiac.resetRole) Shifter.clearAndReload(); - Shifter.shifter = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Swapper: - if (Amnisiac.resetRole) Swapper.clearAndReload(); - Swapper.swapper = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.PartTimer: - if (Amnisiac.resetRole) PartTimer.clearAndReload(); - PartTimer.partTimer = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Seer: - if (Amnisiac.resetRole) Seer.clearAndReload(); - Seer.seer = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Morphling: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Morphling.clearAndReload(); - Morphling.morphling = amnisiac; - Amnisiac.clearAndReload(); - break; - case RoleId.Bomber: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Bomber.clearAndReload(); - Bomber.bomber = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Yoyo: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Yoyo.clearAndReload(); - Yoyo.yoyo = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Terrorist: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Terrorist.clearAndReload(); - Terrorist.terrorist = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Camouflager: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Camouflager.clearAndReload(); - Camouflager.camouflager = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Hacker: - if (Amnisiac.resetRole) Hacker.clearAndReload(); - Hacker.hacker = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Tracker: - if (Amnisiac.resetRole) Tracker.clearAndReload(); - Tracker.tracker = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Vampire: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Vampire.clearAndReload(); - Vampire.vampire = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Snitch: - if (Amnisiac.resetRole) Snitch.clearAndReload(); - Snitch.snitch = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Jackal: - Jackal.jackal = amnisiac; - Jackal.formerJackals.Add(target); - Amnisiac.clearAndReload(); - break; - - case RoleId.Sidekick: - Jackal.formerJackals.Add(target); - if (Amnisiac.resetRole) Sidekick.clearAndReload(); - Sidekick.sidekick = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Pavlovsowner: - Pavlovsdogs.pavlovsdogs.Add(Pavlovsdogs.pavlovsowner); - Pavlovsdogs.pavlovsowner = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Pavlovsdogs: - Pavlovsdogs.pavlovsdogs.Add(amnisiac); - Amnisiac.clearAndReload(); - break; - - case RoleId.Eraser: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Eraser.clearAndReload(); - Eraser.eraser = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Spy: - if (Amnisiac.resetRole) Spy.clearAndReload(); - Spy.spy = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Trickster: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Trickster.clearAndReload(); - Trickster.trickster = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Mimic: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Mimic.clearAndReload(false); - Mimic.mimic = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Cleaner: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Cleaner.clearAndReload(); - Cleaner.cleaner = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Warlock: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Warlock.clearAndReload(); - Warlock.warlock = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Grenadier: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Grenadier.clearAndReload(); - Grenadier.grenadier = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.SecurityGuard: - if (Amnisiac.resetRole) SecurityGuard.clearAndReload(); - SecurityGuard.securityGuard = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Survivor: - Survivor.survivor.Add(amnisiac); - Amnisiac.clearAndReload(); - break; - - case RoleId.Arsonist: - if (Amnisiac.resetRole) Arsonist.clearAndReload(); - Arsonist.arsonist = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - - if (CachedPlayer.LocalPlayer.PlayerControl == Arsonist.arsonist) - { - var playerCounter = 0; - var bottomLeft = new Vector3( - -FastDestroyableSingleton.Instance.UseButton.transform.localPosition.x, - FastDestroyableSingleton.Instance.UseButton.transform.localPosition.y, - FastDestroyableSingleton.Instance.UseButton.transform.localPosition.z); - foreach (PlayerControl p in CachedPlayer.AllPlayers) - if (playerIcons.ContainsKey(p.PlayerId) && p != Arsonist.arsonist) - { - //Arsonist.poolIcons.Add(p); - if (Arsonist.dousedPlayers.Contains(p)) - playerIcons[p.PlayerId].setSemiTransparent(false); - else - playerIcons[p.PlayerId].setSemiTransparent(true); - - playerIcons[p.PlayerId].transform.localPosition = bottomLeft + - new Vector3(-0.25f, -0.25f, 0) + - (Vector3.right * playerCounter++ * 0.35f); - playerIcons[p.PlayerId].transform.localScale = Vector3.one * 0.2f; - playerIcons[p.PlayerId].gameObject.SetActive(true); - } - } - - break; - - case RoleId.Assassin: - Helpers.turnToImpostor(Amnisiac.amnisiac); - // Never Reload Guesser - Assassin.assassin.Add(amnisiac); - Amnisiac.clearAndReload(); - break; - - case RoleId.Vigilante: - // Never Reload Guesser - if (Amnisiac.resetRole) Vigilante.clearAndReload(); - Vigilante.vigilante = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.BountyHunter: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) BountyHunter.clearAndReload(); - BountyHunter.bountyHunter = amnisiac; - Amnisiac.clearAndReload(); - - BountyHunter.bountyUpdateTimer = 0f; - if (CachedPlayer.LocalPlayer.PlayerControl == BountyHunter.bountyHunter) - { - var bottomLeft = - new Vector3(-FastDestroyableSingleton.Instance.UseButton.transform.localPosition.x, - FastDestroyableSingleton.Instance.UseButton.transform.localPosition.y, - FastDestroyableSingleton.Instance.UseButton.transform.localPosition.z) + - new Vector3(-0.25f, 1f, 0); - BountyHunter.cooldownText = - Object.Instantiate(FastDestroyableSingleton.Instance.KillButton.cooldownTimerText, - FastDestroyableSingleton.Instance.transform); - BountyHunter.cooldownText.alignment = TextAlignmentOptions.Center; - BountyHunter.cooldownText.transform.localPosition = bottomLeft + new Vector3(0f, -1f, -1f); - BountyHunter.cooldownText.gameObject.SetActive(true); - - foreach (PlayerControl p in CachedPlayer.AllPlayers) - if (playerIcons.ContainsKey(p.PlayerId)) - { - playerIcons[p.PlayerId].setSemiTransparent(false); - playerIcons[p.PlayerId].transform.localPosition = bottomLeft + new Vector3(0f, -1f, 0); - playerIcons[p.PlayerId].transform.localScale = Vector3.one * 0.4f; - playerIcons[p.PlayerId].gameObject.SetActive(false); - } - } - - break; - - case RoleId.Vulture: - if (Amnisiac.resetRole) Vulture.clearAndReload(); - Vulture.vulture = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - - case RoleId.Executioner: - Executioner.executioner = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - - case RoleId.Medium: - if (Amnisiac.resetRole) Medium.clearAndReload(); - Medium.medium = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Lawyer: - // Never reset Lawyer - Lawyer.lawyer = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - - case RoleId.Pursuer: - if (Amnisiac.resetRole) Pursuer.clearAndReload(); - Pursuer.pursuer.Add(amnisiac); - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - - case RoleId.Witch: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Witch.clearAndReload(); - Witch.witch = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Jumper: - if (Amnisiac.resetRole) Jumper.clearAndReload(); - Jumper.jumper = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Escapist: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Escapist.clearAndReload(); - Escapist.escapist = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Thief: - if (Amnisiac.resetRole) Thief.clearAndReload(); - Thief.thief = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - - case RoleId.Trapper: - if (Amnisiac.resetRole) Trapper.clearAndReload(); - Trapper.trapper = amnisiac; - Amnisiac.clearAndReload(); - break; - case RoleId.Juggernaut: - if (Amnisiac.resetRole) Juggernaut.clearAndReload(); - Juggernaut.juggernaut = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - case RoleId.Doomsayer: - if (Amnisiac.resetRole) Doomsayer.clearAndReload(); - Doomsayer.doomsayer = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - case RoleId.Swooper: - if (Amnisiac.resetRole) Swooper.clearAndReload(); - Swooper.swooper = amnisiac; - Amnisiac.clearAndReload(); - Amnisiac.amnisiac = target; - break; - case RoleId.Ninja: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Ninja.clearAndReload(); - Ninja.ninja = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Akujo: - Helpers.turnToImpostor(Akujo.akujo); - if (Amnisiac.resetRole) Mimic.clearAndReload(); - Akujo.akujo = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Blackmailer: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Blackmailer.clearAndReload(); - Blackmailer.blackmailer = amnisiac; - Amnisiac.clearAndReload(); - break; - - case RoleId.Miner: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Miner.clearAndReload(); - Miner.miner = amnisiac; - Amnisiac.clearAndReload(); - break; - case RoleId.Undertaker: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) Undertaker.clearAndReload(); - Undertaker.undertaker = amnisiac; - Amnisiac.clearAndReload(); - break; - case RoleId.Prophet: - if (Amnisiac.resetRole) Prophet.clearAndReload(); - Prophet.prophet = amnisiac; - Amnisiac.clearAndReload(); - break; - case RoleId.EvilTrapper: - Helpers.turnToImpostor(Amnisiac.amnisiac); - if (Amnisiac.resetRole) EvilTrapper.clearAndReload(); - EvilTrapper.evilTrapper = amnisiac; - Amnisiac.clearAndReload(); - break; - case RoleId.Gambler: - Gambler.gambler = amnisiac; - Amnisiac.clearAndReload(); - break; - } - } - - public static void mimicMimicRole(byte targetId) - { - var target = playerById(targetId); - if (target == null || Mimic.mimic == null) return; - var targetInfo = RoleInfo.getRoleInfoForPlayer(target); - var roleInfo = targetInfo.FirstOrDefault(info => info.roleTeam != RoleType.Modifier); - switch (roleInfo!.roleId) - { - case RoleId.BodyGuard: - if (Amnisiac.resetRole) BodyGuard.clearAndReload(); - BodyGuard.bodyguard = Mimic.mimic; - bodyGuardGuardButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Mayor: - if (Amnisiac.resetRole) Mayor.clearAndReload(); - Mayor.mayor = Mimic.mimic; - mayorMeetingButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - - Mimic.hasMimic = true; - break; - - case RoleId.Prosecutor: - if (Amnisiac.resetRole) Prosecutor.clearAndReload(); - Prosecutor.prosecutor = Mimic.mimic; - Prosecutor.diesOnIncorrectPros = false; - Mimic.hasMimic = true; - break; - - case RoleId.InfoSleuth: - InfoSleuth.infoSleuth = Mimic.mimic; - Mimic.hasMimic = true; - break; - - case RoleId.Trapper: - if (Amnisiac.resetRole) Trapper.clearAndReload(); - Trapper.trapper = Mimic.mimic; - trapperButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Portalmaker: - if (Amnisiac.resetRole) Portalmaker.clearAndReload(); - Portalmaker.portalmaker = Mimic.mimic; - portalmakerPlacePortalButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Engineer: - if (Amnisiac.resetRole) Engineer.clearAndReload(); - Engineer.engineer = Mimic.mimic; - engineerRepairButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Jumper: - if (Amnisiac.resetRole) Jumper.clearAndReload(); - Jumper.jumper = Mimic.mimic; - jumperMarkButton.PositionOffset = CustomButton.ButtonPositions.lowerRowCenter; - jumperJumpButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Detective: - if (Amnisiac.resetRole) Detective.clearAndReload(); - Detective.detective = Mimic.mimic; - Mimic.hasMimic = true; - break; - /* - case RoleId.NiceGuesser: - if (Amnisiac.resetRole) //Guesser.clearAndReload(); - Guesser.niceGuesser = Mimic.mimic; - Mimic.hasMimic = true; - break; - */ - case RoleId.TimeMaster: - if (Amnisiac.resetRole) TimeMaster.clearAndReload(); - TimeMaster.timeMaster = Mimic.mimic; - timeMasterShieldButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Veteran: - if (Amnisiac.resetRole) Veteran.clearAndReload(); - Veteran.veteran = Mimic.mimic; - veteranAlertButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Medic: - if (Amnisiac.resetRole) Medic.clearAndReload(); - Medic.medic = Mimic.mimic; - medicShieldButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Swapper: - if (Amnisiac.resetRole) Swapper.clearAndReload(); - Swapper.swapper = Mimic.mimic; - Mimic.hasMimic = true; - break; - - case RoleId.Seer: - if (Amnisiac.resetRole) Seer.clearAndReload(); - Seer.seer = Mimic.mimic; - Mimic.hasMimic = true; - break; - - case RoleId.Hacker: - if (Amnisiac.resetRole) Hacker.clearAndReload(); - Hacker.hacker = Mimic.mimic; - hackerAdminTableButton.PositionOffset = CustomButton.ButtonPositions.upperRowFarLeft; - hackerVitalsButton.PositionOffset = CustomButton.ButtonPositions.lowerRowFarLeft; - hackerButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Tracker: - if (Amnisiac.resetRole) Tracker.clearAndReload(); - Tracker.tracker = Mimic.mimic; - trackerTrackPlayerButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.SecurityGuard: - if (Amnisiac.resetRole) SecurityGuard.clearAndReload(); - SecurityGuard.securityGuard = Mimic.mimic; - securityGuardButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - securityGuardCamButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Medium: - if (Amnisiac.resetRole) Medium.clearAndReload(); - Medium.medium = Mimic.mimic; - mediumButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - - case RoleId.Balancer: - if (Amnisiac.resetRole) Balancer.clearAndReload(); - Balancer.balancer = Mimic.mimic; - Mimic.hasMimic = true; - break; - - case RoleId.Prophet: - if (Amnisiac.resetRole) Prophet.clearAndReload(); - Prophet.prophet = Mimic.mimic; - prophetButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; - Mimic.hasMimic = true; - break; - } - } - public static void turnToImpostor(byte targetId) { var player = playerById(targetId); @@ -1832,34 +1163,11 @@ public static void jackalCreatesSidekick(byte targetId) } } - if (Jackal.killFakeImpostor && target.Data.Role.IsImpostor) - { - //uncheckedMurderPlayer(Jackal.jackal.PlayerId, player.PlayerId, 1); - Jackal.jackal.MurderPlayer(target, MurderResultFlags.Succeeded); - OverrideDeathReasonAndKiller(target, CustomDeathReason.FakeSK, Jackal.jackal); - return; - } - - var wasSpy = Spy.spy != null && target == Spy.spy; - var wasImpostor = target.Data.Role.IsImpostor; // This can only be reached if impostors can be sidekicked. FastDestroyableSingleton.Instance.SetRole(target, RoleTypes.Crewmate); - if (target == Lawyer.lawyer && Lawyer.target != null) - { - var playerInfoTransform = Lawyer.target.cosmetics.nameText.transform.parent.FindChild("Info"); - var playerInfo = playerInfoTransform?.GetComponent(); - if (playerInfo != null) playerInfo.text = ""; - } erasePlayerRoles(target.PlayerId); - Sidekick.sidekick = target; - if (target.PlayerId == CachedPlayer.LocalPlayer.PlayerId) - CachedPlayer.LocalPlayer.PlayerControl.moveable = true; - if ((wasSpy || wasImpostor) && !Jackal.CanImpostorFindSidekick) - { - Sidekick.wasTeamRed = true; - Sidekick.wasSpy = wasSpy; - Sidekick.wasImpostor = wasImpostor; - } + Jackal.sidekick = target; + if (target == CachedPlayer.LocalPlayer.PlayerControl) SoundEffectsManager.play("jackalSidekick"); if (HandleGuesser.isGuesserGm && CustomOptionHolder.guesserGamemodeSidekickIsAlwaysGuesser.GetBool() && !HandleGuesser.isGuesser(targetId)) setGuesserGm(targetId); @@ -1867,26 +1175,16 @@ public static void jackalCreatesSidekick(byte targetId) Jackal.canCreateSidekick = false; } - public static void sidekickPromotes() - { - removeCurrentJackal(); - Jackal.jackal = Sidekick.sidekick; - Jackal.canCreateSidekick = Jackal.jackalPromotedFromSidekickCanCreateSidekick; - Jackal.wasTeamRed = Sidekick.wasTeamRed; - Jackal.wasSpy = Sidekick.wasSpy; - Jackal.wasImpostor = Sidekick.wasImpostor; - Sidekick.clearAndReload(); - return; - } - - public static void removeCurrentJackal() + public static void sidekickPromotes(byte playerId) { - if (Jackal.jackal != null && !Jackal.formerJackals.Any(x => x.PlayerId == Jackal.jackal.PlayerId)) - Jackal.formerJackals.Add(Jackal.jackal); - Jackal.jackal = null; - Jackal.currentTarget = null; - Jackal.cooldown = CustomOptionHolder.jackalKillCooldown.GetFloat(); - Jackal.createSidekickCooldown = CustomOptionHolder.jackalCreateSidekickCooldown.GetFloat(); + if (Jackal.jackal.All(x => x.IsDead())) + { + var player = playerById(playerId); + Jackal.jackal.Add(player); + Jackal.sidekick = null; + Jackal.canCreateSidekick = Jackal.jackalPromotedFromSidekickCanCreateSidekick; + return; + } } public static void jackalCanSwooper(bool chance) @@ -1939,8 +1237,6 @@ public static void erasePlayerRoles(byte playerId, bool ignoreModifier = true) if (player == null) return; // Crewmate roles - if (Assassin.assassin.Any(x => x.PlayerId == player.PlayerId)) - Assassin.assassin.RemoveAll(x => x.PlayerId == player.PlayerId); if (player == Swooper.swooper) Swooper.clearAndReload(); if (player == Mayor.mayor) Mayor.clearAndReload(); if (player == Prosecutor.prosecutor) Prosecutor.clearAndReload(); @@ -1952,7 +1248,6 @@ public static void erasePlayerRoles(byte playerId, bool ignoreModifier = true) if (player == Deputy.deputy) Deputy.deputy = null; if (player == Detective.detective) Detective.clearAndReload(); if (player == TimeMaster.timeMaster) TimeMaster.clearAndReload(); - if (player == Amnisiac.amnisiac) Amnisiac.clearAndReload(); if (player == Veteran.veteran) Veteran.clearAndReload(); if (player == Medic.medic) Medic.clearAndReload(); if (player == Seer.seer) Seer.clearAndReload(); @@ -2000,15 +1295,15 @@ public static void erasePlayerRoles(byte playerId, bool ignoreModifier = true) if (player == Miner.miner) Miner.clearAndReload(); if (player == Arsonist.arsonist) Arsonist.clearAndReload(); if (Guesser.isGuesser(player.PlayerId)) Guesser.clear(player.PlayerId); - if (player == Jackal.jackal) + + if (Jackal.jackal.Any(x => x == player)) { - Jackal.jackal = null; - sidekickPromotes(); + Jackal.jackal.RemoveAll(x => x == player); + if (Jackal.sidekick.IsAlive()) sidekickPromotes(Jackal.sidekick.PlayerId); } - if (player == Shifter.shifter) Shifter.clearAndReload(); if (player == Pavlovsdogs.pavlovsowner) Pavlovsdogs.pavlovsowner = null; - if (player == Sidekick.sidekick) Sidekick.clearAndReload(); + if (player == Jackal.sidekick) Jackal.sidekick = null; if (player == BountyHunter.bountyHunter) BountyHunter.clearAndReload(); if (player == Vulture.vulture) Vulture.clearAndReload(); if (player == Executioner.executioner) Executioner.clearAndReload(); @@ -2018,34 +1313,31 @@ public static void erasePlayerRoles(byte playerId, bool ignoreModifier = true) if (player == Doomsayer.doomsayer) Doomsayer.clearAndReload(); if (player == Akujo.akujo) Akujo.clearAndReload(); if (player == PartTimer.partTimer) PartTimer.clearAndReload(); - if (player == Specoality.specoality) Specoality.clearAndReload(); - if (Pavlovsdogs.pavlovsdogs.Any(x => x.PlayerId == player.PlayerId)) - Pavlovsdogs.pavlovsdogs.RemoveAll(x => x.PlayerId == player.PlayerId); - if (Pursuer.pursuer.Any(x => x.PlayerId == player.PlayerId)) - Pursuer.pursuer.RemoveAll(x => x.PlayerId == player.PlayerId); - if (Survivor.survivor.Any(x => x.PlayerId == player.PlayerId)) - Survivor.survivor.RemoveAll(x => x.PlayerId == player.PlayerId); + if (player == Cursed.cursed) Cursed.clearAndReload(); + if (player == Shifter.shifter) Shifter.clearAndReload(); + + Assassin.assassin.RemoveAll(x => x.PlayerId == player.PlayerId); + Amnisiac.player.RemoveAll(x => x.PlayerId == playerId); + Pavlovsdogs.pavlovsdogs.RemoveAll(x => x.PlayerId == player.PlayerId); + Pursuer.pursuer.RemoveAll(x => x.PlayerId == player.PlayerId); + Survivor.survivor.RemoveAll(x => x.PlayerId == player.PlayerId); // Modifier if (!ignoreModifier) { - if (player == Lovers.lover1 || player == Lovers.lover2) - Lovers.clearAndReload(); // The whole Lover couple is being erased - if (Bait.bait.Any(x => x.PlayerId == player.PlayerId)) - Bait.bait.RemoveAll(x => x.PlayerId == player.PlayerId); - if (Bloody.bloody.Any(x => x.PlayerId == player.PlayerId)) - Bloody.bloody.RemoveAll(x => x.PlayerId == player.PlayerId); - if (AntiTeleport.antiTeleport.Any(x => x.PlayerId == player.PlayerId)) - AntiTeleport.antiTeleport.RemoveAll(x => x.PlayerId == player.PlayerId); - if (Sunglasses.sunglasses.Any(x => x.PlayerId == player.PlayerId)) - Sunglasses.sunglasses.RemoveAll(x => x.PlayerId == player.PlayerId); - if (Torch.torch.Any(x => x.PlayerId == player.PlayerId)) - Torch.torch.RemoveAll(x => x.PlayerId == player.PlayerId); - if (Flash.flash.Any(x => x.PlayerId == player.PlayerId)) - Flash.flash.RemoveAll(x => x.PlayerId == player.PlayerId); - if (Multitasker.multitasker.Any(x => x.PlayerId == player.PlayerId)) - Multitasker.multitasker.RemoveAll(x => x.PlayerId == player.PlayerId); + Bait.bait.RemoveAll(x => x.PlayerId == player.PlayerId); + Bloody.bloody.RemoveAll(x => x.PlayerId == player.PlayerId); + AntiTeleport.antiTeleport.RemoveAll(x => x.PlayerId == player.PlayerId); + Sunglasses.sunglasses.RemoveAll(x => x.PlayerId == player.PlayerId); + Torch.torch.RemoveAll(x => x.PlayerId == player.PlayerId); + Flash.flash.RemoveAll(x => x.PlayerId == player.PlayerId); + Multitasker.multitasker.RemoveAll(x => x.PlayerId == player.PlayerId); + Vip.vip.RemoveAll(x => x.PlayerId == player.PlayerId); + Invert.invert.RemoveAll(x => x.PlayerId == player.PlayerId); + Chameleon.chameleon.RemoveAll(x => x.PlayerId == player.PlayerId); + if (player == Lovers.lover1 || player == Lovers.lover2) Lovers.clearAndReload(); // The whole Lover couple is being erased + if (player == Specoality.specoality) Specoality.clearAndReload(); if (player == Tiebreaker.tiebreaker) Tiebreaker.clearAndReload(); if (player == Mini.mini) Mini.clearAndReload(); if (player == Aftermath.aftermath) Aftermath.clearAndReload(); @@ -2059,15 +1351,17 @@ public static void erasePlayerRoles(byte playerId, bool ignoreModifier = true) if (player == Tunneler.tunneler) Tunneler.clearAndReload(); if (player == Slueth.slueth) Slueth.clearAndReload(); if (player == Blind.blind) Blind.clearAndReload(); - if (player == Cursed.cursed) Cursed.clearAndReload(); - if (Vip.vip.Any(x => x.PlayerId == player.PlayerId)) Vip.vip.RemoveAll(x => x.PlayerId == player.PlayerId); - if (Invert.invert.Any(x => x.PlayerId == player.PlayerId)) - Invert.invert.RemoveAll(x => x.PlayerId == player.PlayerId); - if (Chameleon.chameleon.Any(x => x.PlayerId == player.PlayerId)) - Chameleon.chameleon.RemoveAll(x => x.PlayerId == player.PlayerId); } } + public static void clearGhostRoles(byte playerId) + { + var player = playerById(playerId); + + if (player == GhostEngineer.player) GhostEngineer.ClearAndReload(); + if (player == Specter.player) Specter.ClearAndReload(); + } + public static void infoSleuthTarget(byte playerId) { var player = playerById(playerId); @@ -2353,7 +1647,7 @@ public static void akujoSuicide(byte akujoId) } } - public static void Mine(int ventId, PlayerControl role, byte[] buff, float zAxis) + public static void Mine(int ventId, byte[] buff, float zAxis) { var position = Vector3.zero; position.x = BitConverter.ToSingle(buff, 0 * sizeof(float)); @@ -2446,8 +1740,8 @@ public static void setJackalSwoop(byte playerId, byte flag) target.setLook("", 6, "", "", "", ""); var color = Color.clear; - var canSee = Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl || - Sidekick.sidekick == CachedPlayer.LocalPlayer.PlayerControl || + var canSee = Jackal.jackal.Any(x => x == CachedPlayer.LocalPlayer.PlayerControl) || + Jackal.sidekick == CachedPlayer.LocalPlayer.PlayerControl || CachedPlayer.LocalPlayer.Data.IsDead; if (canSee) color.a = 0.1f; target.cosmetics.currentBodySprite.BodySprite.color = color; @@ -2469,7 +1763,7 @@ public static void placeTrap(byte[] buff) var pos = Vector3.zero; pos.x = BitConverter.ToSingle(buff, 0 * sizeof(float)); pos.y = BitConverter.ToSingle(buff, 1 * sizeof(float)) - 0.2f; - KillTrap trap = new(pos); + _ = new KillTrap(pos); } public static void clearTrap() @@ -2685,7 +1979,7 @@ public static void guesserShoot(byte killerId, byte dyingTargetId, byte guessedT { var roleInfo = RoleInfo.allRoleInfos.FirstOrDefault(x => (byte)x.roleId == guessedRoleId); if (Thief.thief.IsAlive() && Thief.tiefCanKill(dyingTarget, guesser)) - thiefStealsRole(dyingTarget.PlayerId); + Thief.StealsRole(dyingTarget.PlayerId); } if ((Akujo.akujo != null && dyingTarget == Akujo.akujo) || (Akujo.honmei != null && dyingTarget == Akujo.honmei)) @@ -2911,116 +2205,6 @@ public static void setChatNotificationOverlay(byte localPlayerId, byte targetPla } } - public static void thiefStealsRole(byte playerId) - { - var target = playerById(playerId); - var thief = Thief.thief; - if (target == null) return; - if (target == Sheriff.sheriff) Sheriff.sheriff = thief; - if (target == Deputy.deputy) Deputy.deputy = thief; - if (target == Veteran.veteran) Veteran.veteran = thief; - if (target == Jackal.jackal) - { - Jackal.jackal = thief; - Jackal.formerJackals.Add(target); - } - - if (target == Sidekick.sidekick) - { - Sidekick.sidekick = thief; - Jackal.formerJackals.Add(target); - if (HandleGuesser.isGuesserGm && CustomOptionHolder.guesserGamemodeSidekickIsAlwaysGuesser.GetBool() && !HandleGuesser.isGuesser(thief.PlayerId)) - setGuesserGm(thief.PlayerId); - } - if (target == Pavlovsdogs.pavlovsowner) - { - Pavlovsdogs.pavlovsdogs.Add(target); - Pavlovsdogs.pavlovsowner = thief; - if (HandleGuesser.isGuesserGm && CustomOptionHolder.guesserGamemodePavlovsdogIsAlwaysGuesser.GetBool() && !HandleGuesser.isGuesser(thief.PlayerId)) - setGuesserGm(thief.PlayerId); - } - if (Pavlovsdogs.pavlovsdogs.Any(x => x == target)) - { - Pavlovsdogs.pavlovsdogs.Add(thief); - } - if (target == Poucher.poucher && !Poucher.spawnModifier) Poucher.poucher = thief; - if (target == Butcher.butcher) Butcher.butcher = thief; - if (target == Morphling.morphling) Morphling.morphling = thief; - if (target == Camouflager.camouflager) Camouflager.camouflager = thief; - if (target == Vampire.vampire) Vampire.vampire = thief; - if (target == Eraser.eraser) Eraser.eraser = thief; - if (target == Trickster.trickster) Trickster.trickster = thief; - if (target == Gambler.gambler) Gambler.gambler = thief; - if (target == Cleaner.cleaner) Cleaner.cleaner = thief; - if (target == Warlock.warlock) Warlock.warlock = thief; - if (target == Grenadier.grenadier) Grenadier.grenadier = thief; - if (target == BountyHunter.bountyHunter) BountyHunter.bountyHunter = thief; - if (target == Witch.witch) - { - Witch.witch = thief; - if (MeetingHud.Instance) - if (Witch.witchVoteSavesTargets) // In a meeting, if the thief guesses the witch, all targets are saved or no target is saved. - Witch.futureSpelled = new List(); - else // If thief kills witch during the round, remove the thief from the list of spelled people, keep the rest - Witch.futureSpelled.RemoveAll(x => x.PlayerId == thief.PlayerId); - } - - if (target == Ninja.ninja) Ninja.ninja = thief; - if (target == Escapist.escapist) Escapist.escapist = thief; - if (target == Terrorist.terrorist) Terrorist.terrorist = thief; - if (target == Bomber.bomber) Bomber.bomber = thief; - if (target == Miner.miner) Miner.miner = thief; - if (target == Undertaker.undertaker) Undertaker.undertaker = thief; - if (target == Mimic.mimic) - { - Mimic.mimic = thief; - Mimic.hasMimic = false; - } - if (target == Yoyo.yoyo) - { - Yoyo.yoyo = thief; - Yoyo.markedLocation = null; - } - if (target.Data.Role.IsImpostor) - { - RoleManager.Instance.SetRole(Thief.thief, RoleTypes.Impostor); - FastDestroyableSingleton.Instance.KillButton.SetCoolDown(Thief.thief.killTimer, - GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown); - } - - if (target == Werewolf.werewolf) - { - Survivor.survivor.Add(target); - Werewolf.werewolf = thief; - } - if (target == Arsonist.arsonist) - { - Survivor.survivor.Add(target); - Arsonist.arsonist = thief; - } - if (target == Juggernaut.juggernaut) - { - Survivor.survivor.Add(target); - Juggernaut.juggernaut = thief; - } - if (target == Swooper.swooper) - { - Survivor.survivor.Add(target); - Swooper.swooper = thief; - } - - if (target == Deputy.deputy) Deputy.deputy = thief; - if (target == Veteran.veteran) Veteran.veteran = thief; - if (target == Blackmailer.blackmailer) Blackmailer.blackmailer = thief; - if (target == EvilTrapper.evilTrapper) EvilTrapper.evilTrapper = thief; - - if (Lawyer.lawyer != null && target == Lawyer.target) - Lawyer.target = thief; - if (Thief.thief == PlayerControl.LocalPlayer) CustomButton.ResetAllCooldowns(); - Thief.clearAndReload(); - Thief.formerThief = thief; // After clearAndReload, else it would get reset... - } - public static void setTrap(byte[] buff) { if (Trapper.trapper == null) return; @@ -3110,13 +2294,6 @@ public static void defuseBomb() terroristButton.isEffectActive = false; terroristButton.actionButton.cooldownTimerText.color = Palette.EnabledColor; } - /* - public static void shareRoom(byte playerId, byte roomId) - { - if (Snitch.playerRoomMap.ContainsKey(playerId)) Snitch.playerRoomMap[playerId] = roomId; - else Snitch.playerRoomMap.Add(playerId, roomId); - } - */ } [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.HandleRpc))] @@ -3230,15 +2407,12 @@ private static bool Prefix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1) // Role functionality - case CustomRPC.EngineerFixLights: + case CustomRPC.FixLights: RPCProcedure.FixLights(); break; - case CustomRPC.EngineerFixSubmergedOxygen: + case CustomRPC.FixSubmergedOxygen: RPCProcedure.FixSubmergedOxygen(); break; - case CustomRPC.EngineerUsedRepair: - RPCProcedure.engineerUsedRepair(); - break; case CustomRPC.UseCameraTime: RPCProcedure.useCameraTime(reader.ReadSingle()); @@ -3256,10 +2430,6 @@ private static bool Prefix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1) RPCProcedure.dissectionBody(reader.ReadByte(), reader.ReadByte()); break; - case CustomRPC.RandomDeadBodyPosition: - RPCProcedure.RandomDeadBodyPosition(reader.ReadByte(), reader.ReadVector2()); - break; - case CustomRPC.BlackmailPlayer: RPCProcedure.blackmailPlayer(reader.ReadByte()); break; @@ -3285,7 +2455,11 @@ private static bool Prefix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1) break; case CustomRPC.AmnisiacTakeRole: - RPCProcedure.amnisiacTakeRole(reader.ReadByte()); + Amnisiac.TakeRole(reader.ReadByte(), reader.ReadByte()); + break; + + case CustomRPC.SpecterTakeRole: + Specter.TakeRole(reader.ReadByte()); break; case CustomRPC.ImpostorPromotesToLastImpostor: @@ -3293,7 +2467,7 @@ private static bool Prefix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1) break; case CustomRPC.MimicMimicRole: - RPCProcedure.mimicMimicRole(reader.ReadByte()); + Mimic.MimicRole(reader.ReadByte()); break; case CustomRPC.ShowIndomitableFlash: @@ -3381,7 +2555,7 @@ private static bool Prefix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1) break; case CustomRPC.SidekickPromotes: - RPCProcedure.sidekickPromotes(); + RPCProcedure.sidekickPromotes(reader.ReadByte()); break; case CustomRPC.ErasePlayerRoles: @@ -3390,6 +2564,10 @@ private static bool Prefix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1) Eraser.alreadyErased.Add(eraseTarget); break; + case CustomRPC.ClearGhostRoles: + RPCProcedure.clearGhostRoles(reader.ReadByte()); + break; + case CustomRPC.SetFutureErased: RPCProcedure.setFutureErased(reader.ReadByte()); break; @@ -3523,10 +2701,9 @@ private static bool Prefix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1) case CustomRPC.Mine: var newVentId = reader.ReadInt32(); - var role = playerById(reader.ReadByte()); var pos = reader.ReadBytesAndSize(); var zAxis = reader.ReadSingle(); - RPCProcedure.Mine(newVentId, role, pos, zAxis); + RPCProcedure.Mine(newVentId, pos, zAxis); break; case CustomRPC.TurnToImpostor: @@ -3535,7 +2712,7 @@ private static bool Prefix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1) case CustomRPC.ThiefStealsRole: var thiefTargetId = reader.ReadByte(); - RPCProcedure.thiefStealsRole(thiefTargetId); + Thief.StealsRole(thiefTargetId); break; case CustomRPC.SetTrap: @@ -3583,13 +2760,6 @@ private static bool Prefix([HarmonyArgument(0)] byte callId, [HarmonyArgument(1) case CustomRPC.ShareGhostInfo: RPCProcedure.receiveGhostInfo(reader.ReadByte(), reader); break; - /* - case CustomRPC.ShareRoom: - var roomPlayer = reader.ReadByte(); - var roomId = reader.ReadByte(); - RPCProcedure.shareRoom(roomPlayer, roomId); - break; - */ case CustomRPC.MayorMeeting: if (AmongUsClient.Instance.AmHost) { diff --git a/TheOtherRoles/Resources/BackButton.png b/TheOtherRoles/Resources/BackButton.png new file mode 100644 index 0000000000000000000000000000000000000000..2be40b7676501c1baf8b94b42f20f6cda4d97a77 GIT binary patch literal 30956 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
  • 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 Ef}ado?f?J) diff --git a/TheOtherRoles/Resources/ExitButton.png b/TheOtherRoles/Resources/ExitButton.png new file mode 100644 index 0000000000000000000000000000000000000000..9b7efbb242b767b1d968ce5b276702f98f5a28dc GIT binary patch literal 17089 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 E0h?|Mpa1{> literal 0 HcmV?d00001 diff --git a/TheOtherRoles/Resources/stringData.json b/TheOtherRoles/Resources/stringData.json index 242b6413..3fafe9a5 100644 --- a/TheOtherRoles/Resources/stringData.json +++ b/TheOtherRoles/Resources/stringData.json @@ -124,6 +124,10 @@ "0": "Modifier Settings", "13": "附加能力设置" }, + "ghostSettings": { + "0": "Ghost Roles Settings", + "13": "幽灵职业设置" + }, "guesserSettings": { "0": "Guesser Mode Settings", "13": "赌怪模式设置" @@ -1247,6 +1251,10 @@ "0": "Vulture Can Use Vents", "13": "可使用管道" }, + "SpecterOptions": { + "0": "Specter (Ghost)", + "13": "怨灵 (幽灵职业)" + }, "jesterCanCallEmergency": { "0": "Jester Can Call Emergency Meeting", "13": "小丑可召开会议" @@ -1590,6 +1598,10 @@ "0": "Thief Can Guess To Steal A Role (If Guesser)", "13": "身份窃贼可通过猜测窃取身份\n(赌怪模式)" }, + "GhostEngineerOptions": { + "0": "Engineer (Ghost)", + "13": "灵魂工程师 (幽灵职业)" + }, "guesserNumberOfShots": { "0": "Vigilante Number Of Shots", "13": "可猜测次数" @@ -3000,6 +3012,10 @@ "0": "FLASH", "13": "闪光弹" }, + "SpecterButton": { + "0": "Revive", + "13": "复活" + }, "GuessserGMInfo": { "0": " (Guesser)", "13": " (赌怪)" @@ -3328,6 +3344,16 @@ "PursuerShortDesc": { "13": "活下去!" }, + "Witness": { + "0": "Witness", + "13": "污点证人" + }, + "WitnessIntroDesc": { + "13": "那就只剩下……了" + }, + "WitnessShortDesc": { + "13": "让大家猜谁是真凶" + }, "PartTimer": { "0": "PartTimer", "13": "打工仔" @@ -4000,6 +4026,16 @@ "GhostEngineerShortDesc": { "13": "弥补生前未能修好飞船的遗憾" }, + "Specter": { + "0": "Specter", + "13": "怨灵" + }, + "SpecterIntroDesc": { + "13": "我还不想死" + }, + "SpecterShortDesc": { + "13": "我还不想死" + }, "Hunter": { "0": "Hunter", "13": "猎人" @@ -4320,5 +4356,11 @@ }, "ShifterFullDesc": { "13": "分配阵营:船员(可设置为中立交换师)\n\n可以在行动阶段与其他玩家交换主职业,交换时名字下方会有黄字提示,\n会议结束后生效。\n如果交换目标不是船员(可以设置),会议结束时会自杀。\n(交换完毕后此附加能力消失)\n提示:交换师的目的主要是为了继承船员强力职业,\n例如在警长死亡前将身份交换。\n\n注:玩家死亡不会影响交换效果。" + }, + "GhostEngineerFullDesc": { + "13": "分配阵营:船员\n\n在死后可以修复一次破坏" + }, + "SpecterFullDesc": { + "13": "分配阵营:无阵营中立(豺狼、巴甫洛夫 以及 律师 无法获得)\n\n死亡后可以重新寻找尸体复活,但不能是自己的尸体\n注:复活时会消耗一具该玩家的尸体。" } } \ No newline at end of file diff --git a/TheOtherRoles/Roles/Crewmate/Deputy.cs b/TheOtherRoles/Roles/Crewmate/Deputy.cs index f12d9d0e..7a9b8da2 100644 --- a/TheOtherRoles/Roles/Crewmate/Deputy.cs +++ b/TheOtherRoles/Roles/Crewmate/Deputy.cs @@ -56,12 +56,12 @@ public static void clearAndReload(bool resetCuffs = true) { if (resetCuffs) { + handcuffedPlayers = []; + handcuffedKnows = []; + HudManagerStartPatch.setAllButtonsHandcuffedStatus(false, true); } deputy = null; currentTarget = null; - handcuffedPlayers = []; - handcuffedKnows = []; - HudManagerStartPatch.setAllButtonsHandcuffedStatus(false, true); promotesToSheriff = CustomOptionHolder.deputyGetsPromoted.GetSelection(); remainingHandcuffs = CustomOptionHolder.deputyNumberOfHandcuffs.GetFloat(); handcuffCooldown = CustomOptionHolder.deputyHandcuffCooldown.GetFloat(); diff --git a/TheOtherRoles/Roles/Crewmate/Medium.cs b/TheOtherRoles/Roles/Crewmate/Medium.cs index 22fb8516..b66ccf3f 100644 --- a/TheOtherRoles/Roles/Crewmate/Medium.cs +++ b/TheOtherRoles/Roles/Crewmate/Medium.cs @@ -61,8 +61,7 @@ public static string getInfo(PlayerControl target, PlayerControl killer) infos.Add(SpecialMediumInfo.ImpostorTeamkill); } - if (target == Sidekick.sidekick && - (killer == Jackal.jackal || Jackal.formerJackals.Any(x => x.PlayerId == killer.PlayerId))) + if (target == Jackal.sidekick && Jackal.jackal.Any(x => x.PlayerId == killer.PlayerId)) infos.Add(SpecialMediumInfo.JackalKillsSidekick); if (target == Lawyer.lawyer && killer == Lawyer.target) infos.Add(SpecialMediumInfo.LawyerKilledByClient); if (Medium.target.wasCleaned) infos.Add(SpecialMediumInfo.BodyCleaned); diff --git a/TheOtherRoles/Roles/Crewmate/Prophet.cs b/TheOtherRoles/Roles/Crewmate/Prophet.cs index e6e07d30..0349171a 100644 --- a/TheOtherRoles/Roles/Crewmate/Prophet.cs +++ b/TheOtherRoles/Roles/Crewmate/Prophet.cs @@ -34,7 +34,7 @@ public static bool IsRed(PlayerControl p) if (killCrewAsRed && (p == Sheriff.sheriff || p == Deputy.deputy || p == Veteran.veteran)) return true; - if (benignNeutralAsRed && isNeutral(p) && (p == Amnisiac.amnisiac || Pursuer.pursuer.Contains(p) || Survivor.survivor.Contains(p))) return true; + if (benignNeutralAsRed && isNeutral(p) && (Amnisiac.player.Contains(p) || Pursuer.pursuer.Contains(p) || Survivor.survivor.Contains(p))) return true; return evilNeutralAsRed && isEvilNeutral(p); } diff --git a/TheOtherRoles/Roles/Crewmate/Prosecutor.cs b/TheOtherRoles/Roles/Crewmate/Prosecutor.cs index 9bc4f2d3..98671c99 100644 --- a/TheOtherRoles/Roles/Crewmate/Prosecutor.cs +++ b/TheOtherRoles/Roles/Crewmate/Prosecutor.cs @@ -200,17 +200,16 @@ public class ExilePros { public static void ExileControllerPostfix(ExileController __instance) { - if (Prosecutor.prosecutor != null) + if (Prosecutor.prosecutor != null && Prosecutor.ProsecuteThisMeeting) { - if (Prosecutor.ProsecuteThisMeeting) + var exiled = __instance.exiled?.Object; + if (exiled != null && exiled == exiled.isCrew() && Prosecutor.diesOnIncorrectPros) { - var exiled = __instance.exiled?.Object; - if (exiled != null && exiled != (exiled.Data.Role.IsImpostor || isKillerNeutral(exiled) || isEvilNeutral(exiled)) && Prosecutor.diesOnIncorrectPros) - Prosecutor.prosecutor.Exiled(); - if (exiled == null) - Prosecutor.Prosecuted = false; - Prosecutor.ProsecuteThisMeeting = false; + Prosecutor.prosecutor.Exiled(); } + + if (exiled == null) Prosecutor.Prosecuted = false; + Prosecutor.ProsecuteThisMeeting = false; } } diff --git a/TheOtherRoles/Roles/Crewmate/Sheriff.cs b/TheOtherRoles/Roles/Crewmate/Sheriff.cs index f734ded7..8bd36933 100644 --- a/TheOtherRoles/Roles/Crewmate/Sheriff.cs +++ b/TheOtherRoles/Roles/Crewmate/Sheriff.cs @@ -40,8 +40,8 @@ public static bool sheriffCanKillNeutral(PlayerControl target) { return (target != Mini.mini || Mini.isGrownUp()) && (target.Data.Role.IsImpostor || - Jackal.jackal == target || - Sidekick.sidekick == target || + Jackal.jackal.Any(x => x == target) || + Jackal.sidekick == target || Juggernaut.juggernaut == target || Werewolf.werewolf == target || Swooper.swooper == target || @@ -50,15 +50,15 @@ public static bool sheriffCanKillNeutral(PlayerControl target) (spyCanDieToSheriff && Spy.spy == target) || (canKillNeutrals && (Akujo.akujo == target || isKillerNeutral(target) || - (Survivor.survivor.Contains(target) && canKillSurvivor) || + (Survivor.survivor.Any(p => p == target) && canKillSurvivor) || (Jester.jester == target && canKillJester) || (Vulture.vulture == target && canKillVulture) || (Thief.thief == target && canKillThief) || - (Amnisiac.amnisiac == target && canKillAmnesiac) || + (Amnisiac.player.Any(p => p == target) && canKillAmnesiac) || (PartTimer.partTimer == target && canKillPartTimer) || (Lawyer.lawyer == target && canKillLawyer) || (Executioner.executioner == target && canKillExecutioner) || - (Pursuer.pursuer.Contains(target) && canKillPursuer) || + (Pursuer.pursuer.Any(p => p == target) && canKillPursuer) || (Doomsayer.doomsayer == target && canKillDoomsayer)))); } diff --git a/TheOtherRoles/Roles/Ghost/Specter.cs b/TheOtherRoles/Roles/Ghost/Specter.cs new file mode 100644 index 00000000..2ca65698 --- /dev/null +++ b/TheOtherRoles/Roles/Ghost/Specter.cs @@ -0,0 +1,325 @@ +using System.Linq; +using UnityEngine; + +namespace TheOtherRoles.Roles.Ghost; + +public class Specter +{ + public static PlayerControl player; + public static Color color = new Color32(154, 147, 80, byte.MaxValue); + public static bool remember; + + public static bool resetRole; + + public static void ClearAndReload() + { + player = null; + remember = false; + resetRole = CustomOptionHolder.specterResetRole.GetBool(); + } + + public static void TakeRole(byte targetId) + { + var target = playerById(targetId); + if (player == null || target == null) return; + var local = player; + RPCProcedure.erasePlayerRoles(local.PlayerId); + var targetInfo = RoleInfo.getRoleInfoForPlayer(target); + var roleInfo = targetInfo.FirstOrDefault(info => info.roleType is not RoleType.Modifier and not RoleType.GhostRole); + if (target.isImpostor()) turnToImpostor(player); + + DeadBody[] array = Object.FindObjectsOfType(); + for (var i = 0; i < array.Length; i++) + { + if (GameData.Instance.GetPlayerById(array[i].ParentId).PlayerId == targetId) + { + Object.Destroy(array[i].gameObject); + break; + } + } + + if (roleInfo != null) switch (roleInfo.roleId) + { + case RoleId.Amnisiac: + Amnisiac.player.Add(local); + break; + case RoleId.Impostor: + break; + case RoleId.Morphling: + if (resetRole) Morphling.clearAndReload(); + Morphling.morphling = local; + break; + case RoleId.Bomber: + if (resetRole) Bomber.clearAndReload(); + Bomber.bomber = local; + break; + case RoleId.Poucher: + if (resetRole) Poucher.clearAndReload(); + Poucher.poucher = local; + break; + case RoleId.Butcher: + if (resetRole) Butcher.clearAndReload(); + Butcher.butcher = local; + break; + case RoleId.Mimic: + if (resetRole) Mimic.clearAndReload(); + Mimic.mimic = local; + break; + case RoleId.Camouflager: + if (resetRole) Camouflager.clearAndReload(); + Camouflager.camouflager = local; + break; + case RoleId.Miner: + if (resetRole) Miner.clearAndReload(); + Miner.miner = local; + break; + case RoleId.Eraser: + if (resetRole) Eraser.clearAndReload(); + Eraser.eraser = local; + break; + case RoleId.Vampire: + if (resetRole) Vampire.clearAndReload(); + Vampire.vampire = local; + break; + case RoleId.Undertaker: + if (resetRole) Undertaker.clearAndReload(); + Undertaker.undertaker = local; + break; + case RoleId.Escapist: + if (resetRole) Escapist.clearAndReload(); + Escapist.escapist = local; + break; + case RoleId.Warlock: + if (resetRole) Warlock.clearAndReload(); + Warlock.warlock = local; + break; + case RoleId.Trickster: + if (resetRole) Trickster.clearAndReload(); + Trickster.trickster = local; + break; + case RoleId.BountyHunter: + if (resetRole) BountyHunter.clearAndReload(); + BountyHunter.bountyHunter = local; + break; + case RoleId.Cleaner: + if (resetRole) Cleaner.clearAndReload(); + Cleaner.cleaner = local; + break; + case RoleId.Terrorist: + if (resetRole) Terrorist.clearAndReload(); + Terrorist.terrorist = local; + break; + case RoleId.Blackmailer: + if (resetRole) Blackmailer.clearAndReload(); + Blackmailer.blackmailer = local; + break; + case RoleId.Witch: + if (resetRole) Witch.clearAndReload(); + Witch.witch = local; + break; + case RoleId.Ninja: + if (resetRole) Ninja.clearAndReload(); + Ninja.ninja = local; + break; + case RoleId.Yoyo: + if (resetRole) Yoyo.clearAndReload(); + Yoyo.yoyo = local; + break; + case RoleId.EvilTrapper: + if (resetRole) EvilTrapper.clearAndReload(); + EvilTrapper.evilTrapper = local; + break; + case RoleId.Gambler: + if (resetRole) Gambler.clearAndReload(); + Gambler.gambler = local; + break; + case RoleId.Grenadier: + if (resetRole) Grenadier.clearAndReload(); + Grenadier.grenadier = local; + break; + case RoleId.Survivor: + Survivor.survivor.RemoveAll(x => x == target); + Survivor.survivor.Add(local); + Amnisiac.player.Add(target); + break; + case RoleId.Jester: + Jester.jester = local; + Amnisiac.player.Add(target); + break; + case RoleId.Vulture: + Vulture.vulture = local; + Amnisiac.player.Add(target); + break; + case RoleId.Lawyer: + Lawyer.lawyer = local; + Amnisiac.player.Add(target); + break; + case RoleId.Executioner: + Executioner.executioner = local; + Amnisiac.player.Add(target); + break; + case RoleId.Pursuer: + Pursuer.pursuer.RemoveAll(x => x == target); + Pursuer.pursuer.Add(local); + Amnisiac.player.Add(target); + break; + case RoleId.PartTimer: + PartTimer.partTimer = local; + Amnisiac.player.Add(target); + break; + case RoleId.Witness: + Witness.player = local; + Amnisiac.player.Add(target); + break; + case RoleId.Doomsayer: + Doomsayer.doomsayer = local; + Amnisiac.player.Add(target); + break; + case RoleId.Arsonist: + Arsonist.arsonist = local; + Amnisiac.player.Add(target); + break; + case RoleId.Jackal: + Jackal.jackal.Add(local); + break; + case RoleId.Sidekick: + Jackal.sidekick = local; + Jackal.jackal.Add(target); + break; + case RoleId.Pavlovsowner: + Pavlovsdogs.pavlovsowner = local; + Pavlovsdogs.pavlovsdogs.Add(target); + break; + case RoleId.Pavlovsdogs: + Pavlovsdogs.pavlovsdogs.Add(local); + break; + case RoleId.Werewolf: + Werewolf.werewolf = local; + Amnisiac.player.Add(target); + break; + case RoleId.Swooper: + Swooper.swooper = local; + Amnisiac.player.Add(target); + break; + case RoleId.Juggernaut: + Juggernaut.juggernaut = local; + Amnisiac.player.Add(target); + break; + case RoleId.Akujo: + Akujo.akujo = local; + Amnisiac.player.Add(target); + break; + case RoleId.Thief: + Thief.thief = local; + Amnisiac.player.Add(target); + break; + case RoleId.Crewmate: + break; + case RoleId.Vigilante: + if (resetRole) Vigilante.clearAndReload(); + Vigilante.vigilante = local; + break; + case RoleId.Mayor: + if (resetRole) Mayor.clearAndReload(); + Mayor.mayor = local; + break; + case RoleId.Prosecutor: + if (resetRole) Prosecutor.clearAndReload(); + Prosecutor.prosecutor = local; + break; + case RoleId.Portalmaker: + if (resetRole) Portalmaker.clearAndReload(); + Portalmaker.portalmaker = local; + break; + case RoleId.Engineer: + if (resetRole) Engineer.clearAndReload(); + Engineer.engineer = local; + break; + case RoleId.Sheriff: + if (Sheriff.formerDeputy != null && Sheriff.formerDeputy == Sheriff.sheriff) + { + Sheriff.formerDeputy = null; + Deputy.deputy = local; + } + else Sheriff.sheriff = local; + break; + case RoleId.Deputy: + if (Amnisiac.resetRole) Deputy.clearAndReload(false); + Deputy.deputy = local; + break; + case RoleId.BodyGuard: + if (Amnisiac.resetRole) BodyGuard.clearAndReload(); + BodyGuard.bodyguard = local; + break; + case RoleId.Jumper: + if (Amnisiac.resetRole) Jumper.clearAndReload(); + Jumper.jumper = local; + break; + case RoleId.Detective: + if (Amnisiac.resetRole) Detective.clearAndReload(); + Detective.detective = local; + break; + case RoleId.TimeMaster: + if (Amnisiac.resetRole) TimeMaster.clearAndReload(); + TimeMaster.timeMaster = local; + break; + case RoleId.Veteran: + if (Amnisiac.resetRole) Veteran.clearAndReload(); + Veteran.veteran = local; + break; + case RoleId.Medic: + if (Amnisiac.resetRole) Medic.clearAndReload(); + Medic.medic = local; + break; + case RoleId.Swapper: + if (Amnisiac.resetRole) Swapper.clearAndReload(); + Swapper.swapper = local; + break; + case RoleId.Seer: + if (Amnisiac.resetRole) Seer.clearAndReload(); + Seer.seer = local; + break; + case RoleId.Hacker: + if (Amnisiac.resetRole) Hacker.clearAndReload(); + Hacker.hacker = local; + break; + case RoleId.Tracker: + if (Amnisiac.resetRole) Tracker.clearAndReload(); + Tracker.tracker = local; + break; + case RoleId.Snitch: + if (Amnisiac.resetRole) Snitch.clearAndReload(); + Snitch.snitch = local; + break; + case RoleId.Prophet: + if (Amnisiac.resetRole) Prophet.clearAndReload(); + Prophet.prophet = local; + break; + case RoleId.InfoSleuth: + if (resetRole) InfoSleuth.clearAndReload(); + break; + case RoleId.Spy: + if (Amnisiac.resetRole) Spy.clearAndReload(); + Spy.spy = local; + break; + case RoleId.SecurityGuard: + if (Amnisiac.resetRole) SecurityGuard.clearAndReload(); + SecurityGuard.securityGuard = local; + break; + case RoleId.Medium: + if (Amnisiac.resetRole) Medium.clearAndReload(); + Medium.medium = local; + break; + case RoleId.Trapper: + if (Amnisiac.resetRole) Trapper.clearAndReload(); + Trapper.trapper = local; + break; + case RoleId.Balancer: + if (Amnisiac.resetRole) Balancer.clearAndReload(); + Balancer.balancer = local; + break; + } + if (local != null) RPCProcedure.clearGhostRoles(local.PlayerId); + local.Revive(); + } +} \ No newline at end of file diff --git a/TheOtherRoles/Roles/Guesser.cs b/TheOtherRoles/Roles/Guesser.cs index 24f299a7..de251fe0 100644 --- a/TheOtherRoles/Roles/Guesser.cs +++ b/TheOtherRoles/Roles/Guesser.cs @@ -240,13 +240,16 @@ static void CreatePage(bool IsNext, MeetingHud __instance, Transform container) if (CachedPlayer.LocalId == Doomsayer.doomsayer?.PlayerId) { - if (!Doomsayer.canGuessImpostor && roleInfo.roleTeam == RoleType.Impostor) + if (!Doomsayer.canGuessImpostor && roleInfo.roleType == RoleType.Impostor) continue; - if (!Doomsayer.canGuessNeutral && roleInfo.roleTeam == RoleType.Neutral) + if (!Doomsayer.canGuessNeutral && roleInfo.roleType == RoleType.Neutral) continue; } - if (roleInfo.roleTeam == RoleType.Modifier && ModOption.allowModGuess && !roleInfo.isGuessable) + if (roleInfo.roleType == RoleType.Modifier && ModOption.allowModGuess && !roleInfo.isGuessable) + continue; + + if (roleInfo.roleType == RoleType.GhostRole) continue; // remove all roles that cannot spawn due to the settings from the ui. @@ -285,7 +288,8 @@ static void CreatePage(bool IsNext, MeetingHud __instance, Transform container) void CreateRole(RoleInfo roleInfo = null) { - RoleType team = roleInfo?.roleTeam ?? RoleType.Crewmate; + if (roleInfo.roleType is RoleType.GhostRole or RoleType.Special) return; + RoleType team = roleInfo?.roleType ?? RoleType.Crewmate; //Color color = roleInfo?.color ?? Color.white; //RoleId role = roleInfo?.roleId ?? RoleId.Crewmate; diff --git a/TheOtherRoles/Roles/Impostor/Camouflager.cs b/TheOtherRoles/Roles/Impostor/Camouflager.cs index 7b267bda..5371208e 100644 --- a/TheOtherRoles/Roles/Impostor/Camouflager.cs +++ b/TheOtherRoles/Roles/Impostor/Camouflager.cs @@ -23,7 +23,7 @@ public static void resetCamouflage() { if ((p == Ninja.ninja && Ninja.isInvisble) || (p == Swooper.swooper && Swooper.isInvisable) - || (p == Jackal.jackal && Jackal.isInvisable)) + || (Jackal.jackal.Any(x => x == p) && Jackal.isInvisable)) continue; p.setDefaultLook(); camoComms = false; diff --git a/TheOtherRoles/Roles/Impostor/Mimic.cs b/TheOtherRoles/Roles/Impostor/Mimic.cs index 458ca16a..4b8c3581 100644 --- a/TheOtherRoles/Roles/Impostor/Mimic.cs +++ b/TheOtherRoles/Roles/Impostor/Mimic.cs @@ -1,5 +1,8 @@ using System.Collections.Generic; +using System.Linq; +using TheOtherRoles.Buttons; using UnityEngine; +using static TheOtherRoles.Buttons.HudManagerStartPatch; namespace TheOtherRoles.Roles.Impostor; @@ -16,4 +19,161 @@ public static void clearAndReload(bool clearList = true) mimic = null; if (clearList) hasMimic = false; } + + + public static void MimicRole(byte targetId) + { + var target = playerById(targetId); + if (target == null || mimic == null) return; + var targetInfo = RoleInfo.getRoleInfoForPlayer(target); + var roleInfo = targetInfo.FirstOrDefault(info => info.roleType != RoleType.Modifier); + switch (roleInfo!.roleId) + { + case RoleId.BodyGuard: + if (Amnisiac.resetRole) BodyGuard.clearAndReload(); + BodyGuard.bodyguard = mimic; + bodyGuardGuardButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Mayor: + if (Amnisiac.resetRole) Mayor.clearAndReload(); + Mayor.mayor = mimic; + mayorMeetingButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + + hasMimic = true; + break; + + case RoleId.Prosecutor: + if (Amnisiac.resetRole) Prosecutor.clearAndReload(); + Prosecutor.prosecutor = mimic; + Prosecutor.diesOnIncorrectPros = false; + hasMimic = true; + break; + + case RoleId.InfoSleuth: + InfoSleuth.infoSleuth = mimic; + hasMimic = true; + break; + + case RoleId.Trapper: + if (Amnisiac.resetRole) Trapper.clearAndReload(); + Trapper.trapper = mimic; + trapperButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Portalmaker: + if (Amnisiac.resetRole) Portalmaker.clearAndReload(); + Portalmaker.portalmaker = mimic; + portalmakerPlacePortalButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Engineer: + if (Amnisiac.resetRole) Engineer.clearAndReload(); + Engineer.engineer = mimic; + engineerRepairButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Jumper: + if (Amnisiac.resetRole) Jumper.clearAndReload(); + Jumper.jumper = mimic; + jumperMarkButton.PositionOffset = CustomButton.ButtonPositions.lowerRowCenter; + jumperJumpButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Detective: + if (Amnisiac.resetRole) Detective.clearAndReload(); + Detective.detective = mimic; + hasMimic = true; + break; + /* + case RoleId.NiceGuesser: + if (Amnisiac.resetRole) //Guesser.clearAndReload(); + Guesser.niceGuesser = Mimic.mimic; + Mimic.hasMimic = true; + break; + */ + case RoleId.TimeMaster: + if (Amnisiac.resetRole) TimeMaster.clearAndReload(); + TimeMaster.timeMaster = mimic; + timeMasterShieldButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Veteran: + if (Amnisiac.resetRole) Veteran.clearAndReload(); + Veteran.veteran = mimic; + veteranAlertButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Medic: + if (Amnisiac.resetRole) Medic.clearAndReload(); + Medic.medic = mimic; + medicShieldButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Swapper: + if (Amnisiac.resetRole) Swapper.clearAndReload(); + Swapper.swapper = mimic; + hasMimic = true; + break; + + case RoleId.Seer: + if (Amnisiac.resetRole) Seer.clearAndReload(); + Seer.seer = mimic; + hasMimic = true; + break; + + case RoleId.Hacker: + if (Amnisiac.resetRole) Hacker.clearAndReload(); + Hacker.hacker = mimic; + hackerAdminTableButton.PositionOffset = CustomButton.ButtonPositions.upperRowFarLeft; + hackerVitalsButton.PositionOffset = CustomButton.ButtonPositions.lowerRowFarLeft; + hackerButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Tracker: + if (Amnisiac.resetRole) Tracker.clearAndReload(); + Tracker.tracker = mimic; + trackerTrackPlayerButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.SecurityGuard: + if (Amnisiac.resetRole) SecurityGuard.clearAndReload(); + SecurityGuard.securityGuard = mimic; + securityGuardButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + securityGuardCamButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Medium: + if (Amnisiac.resetRole) Medium.clearAndReload(); + Medium.medium = mimic; + mediumButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + + case RoleId.Balancer: + if (Amnisiac.resetRole) Balancer.clearAndReload(); + Balancer.balancer = mimic; + hasMimic = true; + break; + + case RoleId.Prophet: + if (Amnisiac.resetRole) Prophet.clearAndReload(); + Prophet.prophet = mimic; + prophetButton.PositionOffset = CustomButton.ButtonPositions.upperRowLeft; + hasMimic = true; + break; + } + } + } diff --git a/TheOtherRoles/Roles/Modifier/Aftermath.cs b/TheOtherRoles/Roles/Modifier/Aftermath.cs index 6550c645..dd20d1dc 100644 --- a/TheOtherRoles/Roles/Modifier/Aftermath.cs +++ b/TheOtherRoles/Roles/Modifier/Aftermath.cs @@ -153,7 +153,7 @@ public static void aftermathTrigger(byte playerId, byte killerId) writer.WriteBytesAndSize(buff); writer.Write(0.01f); AmongUsClient.Instance.FinishRpcImmediately(writer); - Mine(id, Miner.miner, buff, 0.01f); + Mine(id, buff, 0.01f); minerMineButton.Timer = minerMineButton.MaxTimer; } else if (Escapist.escapist == killer) @@ -368,14 +368,14 @@ public static void aftermathTrigger(byte playerId, byte killerId) setSwoop(Swooper.swooper.PlayerId, byte.MinValue); swooperSwoopButton.Timer = swooperSwoopButton.MaxTimer + Swooper.duration; } - else if (Jackal.jackal == killer && Jackal.canSwoop) + else if (Jackal.jackal.Any(x => x == killer) && Jackal.canSwoop) { var invisibleWriter = AmongUsClient.Instance.StartRpcImmediately(killer.NetId, (byte)CustomRPC.SetJackalSwoop, SendOption.Reliable); invisibleWriter.Write(killer.PlayerId); invisibleWriter.Write(byte.MinValue); AmongUsClient.Instance.FinishRpcImmediately(invisibleWriter); - setJackalSwoop(Jackal.jackal.PlayerId, byte.MinValue); + setJackalSwoop(killer.PlayerId, byte.MinValue); jackalSwoopButton.Timer = jackalSwoopButton.MaxTimer + Jackal.duration; } } diff --git a/TheOtherRoles/Roles/Modifier/Chameleon.cs b/TheOtherRoles/Roles/Modifier/Chameleon.cs index a5905920..54ebbcc2 100644 --- a/TheOtherRoles/Roles/Modifier/Chameleon.cs +++ b/TheOtherRoles/Roles/Modifier/Chameleon.cs @@ -47,7 +47,7 @@ public static void update() { if ((chameleonPlayer == Ninja.ninja && Ninja.isInvisble) || (chameleonPlayer == Swooper.swooper && Swooper.isInvisable) || - (chameleonPlayer == Jackal.jackal && Jackal.isInvisable)) continue; // Dont make Ninja visible... + (Jackal.jackal.Any(x => x == chameleonPlayer) && Jackal.isInvisable)) continue; // Dont make Ninja visible... // check movement by animation var playerPhysics = chameleonPlayer.MyPhysics; var currentPhysicsAnim = playerPhysics.Animations.Animator.GetCurrentAnimation(); diff --git a/TheOtherRoles/Roles/Modifier/Lovers.cs b/TheOtherRoles/Roles/Modifier/Lovers.cs index 0876b6dd..0bc8cbe8 100644 --- a/TheOtherRoles/Roles/Modifier/Lovers.cs +++ b/TheOtherRoles/Roles/Modifier/Lovers.cs @@ -33,7 +33,7 @@ public static bool existingAndAlive() public static PlayerControl otherLover(PlayerControl oneLover) { - if (!existingAndAlive()) return null; + if (!existing()) return null; if (oneLover == lover1) return lover2; if (oneLover == lover2) return lover1; return null; diff --git a/TheOtherRoles/Roles/Modifier/Shifter.cs b/TheOtherRoles/Roles/Modifier/Shifter.cs index 0c37d246..b427333b 100644 --- a/TheOtherRoles/Roles/Modifier/Shifter.cs +++ b/TheOtherRoles/Roles/Modifier/Shifter.cs @@ -18,9 +18,9 @@ public static bool isShiftNeutral(PlayerControl player) if (shiftNeutral && shiftALLNeutra) { return player != null && ( - player == Jackal.jackal || - player == Sidekick.sidekick || + player == Jackal.sidekick || player == Pavlovsdogs.pavlovsowner || + Jackal.jackal.Any(x => x == player) || Pavlovsdogs.pavlovsdogs.Any(x => x == player) || player == Akujo.akujo || player == Lawyer.lawyer); @@ -28,15 +28,15 @@ public static bool isShiftNeutral(PlayerControl player) else if (shiftNeutral) { return player != null && ( - player == Jackal.jackal || - player == Sidekick.sidekick || + player == Jackal.sidekick || player == Werewolf.werewolf || player == Lawyer.lawyer || player == Juggernaut.juggernaut || player == Akujo.akujo || + player == Swooper.swooper || player == Pavlovsdogs.pavlovsowner || - Pavlovsdogs.pavlovsdogs.Any(x => x == player) || - player == Swooper.swooper); + Jackal.jackal.Any(x => x == player) || + Pavlovsdogs.pavlovsdogs.Any(x => x == player)); } return player != null && isNeutral(player); } @@ -172,10 +172,11 @@ public static void shiftRole(PlayerControl player1, PlayerControl player2, bool if (repeat) shiftRole(player2, player1, false); Prosecutor.prosecutor = player1; } - else if (Amnisiac.amnisiac != null && Amnisiac.amnisiac == player2) + else if (Amnisiac.player != null && Amnisiac.player.Any(x => x.PlayerId == player2.PlayerId)) { if (repeat) shiftRole(player2, player1, false); - Amnisiac.amnisiac = player1; + Amnisiac.player.RemoveAll(p => p.PlayerId == player2.PlayerId); + Amnisiac.player.Add(player1); } else if (Jester.jester != null && Jester.jester == player2) { @@ -254,6 +255,11 @@ public static void shiftRole(PlayerControl player1, PlayerControl player2, bool if (repeat) shiftRole(player2, player1, false); Balancer.balancer = player1; } + else if (Witness.player != null && Witness.player == player2) + { + if (repeat) shiftRole(player2, player1, false); + Witness.player = player1; + } } public static void clearAndReload() diff --git a/TheOtherRoles/Roles/Neutral/Amnisiac.cs b/TheOtherRoles/Roles/Neutral/Amnisiac.cs index c8d646a8..55b3a730 100644 --- a/TheOtherRoles/Roles/Neutral/Amnisiac.cs +++ b/TheOtherRoles/Roles/Neutral/Amnisiac.cs @@ -1,13 +1,16 @@ using System.Collections.Generic; using TheOtherRoles.Objects; +using TheOtherRoles.Utilities; +using TMPro; using UnityEngine; using Object = UnityEngine.Object; +using static TheOtherRoles.Options.ModOption; namespace TheOtherRoles.Roles.Neutral; public class Amnisiac { - public static PlayerControl amnisiac; + public static List player = new(); public static List localArrows = new(); public static Color color = new(0.5f, 0.7f, 1f, 1f); public static List poolIcons = new(); @@ -19,7 +22,7 @@ public class Amnisiac public static void clearAndReload() { - amnisiac = null; + player.Clear(); showArrows = CustomOptionHolder.amnisiacShowArrows.GetBool(); resetRole = CustomOptionHolder.amnisiacResetRole.GetBool(); if (localArrows != null) @@ -28,4 +31,477 @@ public static void clearAndReload() Object.Destroy(arrow.arrow); localArrows.Clear(); } + + public static void TakeRole(byte targetId, byte playerId) + { + var target = playerById(targetId); + var local = playerById(playerId); + if (target == null || local == null) return; + var targetInfo = RoleInfo.getRoleInfoForPlayer(target, false, false); + var roleInfo = targetInfo.FirstOrDefault(); + if (target.isImpostor()) turnToImpostor(local); + switch (roleInfo!.roleId) + { + case RoleId.Crewmate: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + break; + case RoleId.Impostor: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + break; + case RoleId.Jester: + if (resetRole) Jester.clearAndReload(); + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Jester.jester = local; + player.Add(target); + break; + case RoleId.Juggernaut: + if (resetRole) Juggernaut.clearAndReload(); + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Juggernaut.juggernaut = local; + player.Add(target); + break; + case RoleId.Doomsayer: + if (resetRole) Doomsayer.clearAndReload(); + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Doomsayer.doomsayer = local; + player.Add(target); + break; + case RoleId.Swooper: + if (resetRole) Swooper.clearAndReload(); + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Swooper.swooper = local; + player.Add(target); + break; + case RoleId.Vulture: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Vulture.clearAndReload(); + Vulture.vulture = local; + player.Add(target); + break; + + case RoleId.Executioner: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Executioner.executioner = local; + player.Add(target); + break; + + case RoleId.Lawyer: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Lawyer.lawyer = local; + player.Add(target); + break; + + case RoleId.Akujo: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Akujo.akujo = local; + player.Add(target); + break; + + case RoleId.Pursuer: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Pursuer.clearAndReload(); + Pursuer.pursuer.Add(local); + player.Add(target); + break; + + case RoleId.Jackal: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Jackal.jackal.Add(local); + break; + + case RoleId.Sidekick: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Jackal.jackal.Add(target); + Jackal.sidekick = local; + break; + + case RoleId.Survivor: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Survivor.survivor.Add(local); + break; + + case RoleId.Thief: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Thief.clearAndReload(); + Thief.thief = local; + player.Add(target); + break; + + case RoleId.Pavlovsowner: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Pavlovsdogs.pavlovsdogs.Add(Pavlovsdogs.pavlovsowner); + Pavlovsdogs.pavlovsowner = local; + break; + + case RoleId.Pavlovsdogs: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Pavlovsdogs.pavlovsdogs.Add(local); + break; + + case RoleId.Werewolf: + if (resetRole) Werewolf.clearAndReload(); + Werewolf.werewolf = local; + player.RemoveAll(x => x.PlayerId == local.PlayerId); + player.Add(target); + break; + + + case RoleId.Witness: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Witness.ClearAndReload(); + Witness.player = local; + player.Add(target); + break; + + case RoleId.Arsonist: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Arsonist.clearAndReload(); + Arsonist.arsonist = local; + player.Add(target); + + if (CachedPlayer.LocalPlayer.PlayerControl == Arsonist.arsonist) + { + var playerCounter = 0; + var bottomLeft = new Vector3( + -FastDestroyableSingleton.Instance.UseButton.transform.localPosition.x, + FastDestroyableSingleton.Instance.UseButton.transform.localPosition.y, + FastDestroyableSingleton.Instance.UseButton.transform.localPosition.z); + foreach (PlayerControl p in CachedPlayer.AllPlayers) + if (playerIcons.ContainsKey(p.PlayerId) && p != Arsonist.arsonist) + { + //Arsonist.poolIcons.Add(p); + if (Arsonist.dousedPlayers.Contains(p)) + playerIcons[p.PlayerId].setSemiTransparent(false); + else + playerIcons[p.PlayerId].setSemiTransparent(true); + + playerIcons[p.PlayerId].transform.localPosition = bottomLeft + + new Vector3(-0.25f, -0.25f, 0) + + (Vector3.right * playerCounter++ * 0.35f); + playerIcons[p.PlayerId].transform.localScale = Vector3.one * 0.2f; + playerIcons[p.PlayerId].gameObject.SetActive(true); + } + } + break; + + case RoleId.Mimic: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Mimic.clearAndReload(false); + Mimic.mimic = local; + break; + + case RoleId.BodyGuard: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) BodyGuard.clearAndReload(); + BodyGuard.bodyguard = local; + break; + + case RoleId.Prosecutor: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Prosecutor.clearAndReload(); + Prosecutor.prosecutor = target; + break; + + case RoleId.Mayor: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Mayor.clearAndReload(); + Mayor.mayor = local; + break; + + case RoleId.Portalmaker: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Portalmaker.clearAndReload(); + Portalmaker.portalmaker = local; + break; + + case RoleId.Engineer: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Engineer.clearAndReload(); + Engineer.engineer = local; + break; + + case RoleId.Sheriff: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (Sheriff.formerDeputy != null && Sheriff.formerDeputy == Sheriff.sheriff) + { + Sheriff.formerDeputy = null; + Deputy.deputy = local; + } + else Sheriff.sheriff = local; + break; + + case RoleId.Deputy: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Deputy.clearAndReload(false); + Deputy.deputy = local; + break; + + case RoleId.Butcher: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Butcher.butcher = local; + break; + + case RoleId.Detective: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Detective.clearAndReload(); + Detective.detective = local; + break; + + case RoleId.Balancer: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Balancer.clearAndReload(); + Balancer.balancer = local; + break; + + case RoleId.InfoSleuth: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + InfoSleuth.infoSleuth = local; + break; + + case RoleId.TimeMaster: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) TimeMaster.clearAndReload(); + TimeMaster.timeMaster = local; + break; + + case RoleId.Veteran: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Veteran.clearAndReload(); + Veteran.veteran = local; + break; + + case RoleId.Medic: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Medic.clearAndReload(); + Medic.medic = local; + break; + + case RoleId.Swapper: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Swapper.clearAndReload(); + Swapper.swapper = local; + break; + + case RoleId.PartTimer: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) PartTimer.clearAndReload(); + PartTimer.partTimer = local; + break; + + case RoleId.Seer: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Seer.clearAndReload(); + Seer.seer = local; + break; + + case RoleId.Morphling: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Morphling.clearAndReload(); + Morphling.morphling = local; + break; + case RoleId.Bomber: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Bomber.clearAndReload(); + Bomber.bomber = local; + break; + + case RoleId.Yoyo: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Yoyo.clearAndReload(); + Yoyo.yoyo = local; + break; + + case RoleId.Terrorist: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Terrorist.clearAndReload(); + Terrorist.terrorist = local; + break; + + case RoleId.Camouflager: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Camouflager.clearAndReload(); + Camouflager.camouflager = local; + break; + + case RoleId.Hacker: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Hacker.clearAndReload(); + Hacker.hacker = local; + break; + + case RoleId.Tracker: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Tracker.clearAndReload(); + Tracker.tracker = local; + break; + + case RoleId.Vampire: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Vampire.clearAndReload(); + Vampire.vampire = local; + break; + + case RoleId.Snitch: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Snitch.clearAndReload(); + Snitch.snitch = local; + break; + + case RoleId.Eraser: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Eraser.clearAndReload(); + Eraser.eraser = local; + break; + + case RoleId.Spy: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Spy.clearAndReload(); + Spy.spy = local; + break; + + case RoleId.Trickster: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Trickster.clearAndReload(); + Trickster.trickster = local; + break; + + case RoleId.Cleaner: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Cleaner.clearAndReload(); + Cleaner.cleaner = local; + break; + + case RoleId.Warlock: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Warlock.clearAndReload(); + Warlock.warlock = local; + break; + + case RoleId.Grenadier: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Grenadier.clearAndReload(); + Grenadier.grenadier = local; + break; + + case RoleId.SecurityGuard: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) SecurityGuard.clearAndReload(); + SecurityGuard.securityGuard = local; + break; + + case RoleId.Assassin: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Assassin.assassin.Add(local); + break; + + case RoleId.Vigilante: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Vigilante.clearAndReload(); + Vigilante.vigilante = local; + break; + + case RoleId.BountyHunter: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) BountyHunter.clearAndReload(); + BountyHunter.bountyHunter = local; + + BountyHunter.bountyUpdateTimer = 0f; + if (CachedPlayer.LocalPlayer.PlayerControl == BountyHunter.bountyHunter) + { + var bottomLeft = + new Vector3(-FastDestroyableSingleton.Instance.UseButton.transform.localPosition.x, + FastDestroyableSingleton.Instance.UseButton.transform.localPosition.y, + FastDestroyableSingleton.Instance.UseButton.transform.localPosition.z) + + new Vector3(-0.25f, 1f, 0); + BountyHunter.cooldownText = + Object.Instantiate(FastDestroyableSingleton.Instance.KillButton.cooldownTimerText, + FastDestroyableSingleton.Instance.transform); + BountyHunter.cooldownText.alignment = TextAlignmentOptions.Center; + BountyHunter.cooldownText.transform.localPosition = bottomLeft + new Vector3(0f, -1f, -1f); + BountyHunter.cooldownText.gameObject.SetActive(true); + + foreach (PlayerControl p in CachedPlayer.AllPlayers) + if (playerIcons.ContainsKey(p.PlayerId)) + { + playerIcons[p.PlayerId].setSemiTransparent(false); + playerIcons[p.PlayerId].transform.localPosition = bottomLeft + new Vector3(0f, -1f, 0); + playerIcons[p.PlayerId].transform.localScale = Vector3.one * 0.4f; + playerIcons[p.PlayerId].gameObject.SetActive(false); + } + } + break; + + case RoleId.Medium: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Medium.clearAndReload(); + Medium.medium = local; + break; + + case RoleId.Witch: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Witch.clearAndReload(); + Witch.witch = local; + break; + + case RoleId.Jumper: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Jumper.clearAndReload(); + Jumper.jumper = local; + break; + + case RoleId.Escapist: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Escapist.clearAndReload(); + Escapist.escapist = local; + break; + + case RoleId.Trapper: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Trapper.clearAndReload(); + Trapper.trapper = local; + break; + case RoleId.Ninja: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Ninja.clearAndReload(); + Ninja.ninja = local; + break; + + case RoleId.Blackmailer: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Blackmailer.clearAndReload(); + Blackmailer.blackmailer = local; + break; + + case RoleId.Miner: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Miner.clearAndReload(); + Miner.miner = local; + break; + case RoleId.Undertaker: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Undertaker.clearAndReload(); + Undertaker.undertaker = local; + break; + case RoleId.Prophet: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Prophet.clearAndReload(); + Prophet.prophet = local; + break; + case RoleId.EvilTrapper: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) EvilTrapper.clearAndReload(); + EvilTrapper.evilTrapper = local; + break; + case RoleId.Gambler: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + Gambler.gambler = local; + break; + case RoleId.Poucher: + player.RemoveAll(x => x.PlayerId == local.PlayerId); + if (resetRole) Poucher.clearAndReload(); + Poucher.poucher = local; + break; + } + } + } diff --git a/TheOtherRoles/Roles/Neutral/Jackal.cs b/TheOtherRoles/Roles/Neutral/Jackal.cs index 50de8072..d6eebe9f 100644 --- a/TheOtherRoles/Roles/Neutral/Jackal.cs +++ b/TheOtherRoles/Roles/Neutral/Jackal.cs @@ -7,11 +7,12 @@ namespace TheOtherRoles.Roles.Neutral; public class Jackal { - public static PlayerControl jackal; + public static List jackal = new(); + public static PlayerControl sidekick; public static Color color = new Color32(0, 180, 235, byte.MaxValue); public static PlayerControl currentTarget; - public static List formerJackals = new(); + public static PlayerControl currentTarget2; public static float cooldown = 30f; public static float createSidekickCooldown = 30f; @@ -19,12 +20,12 @@ public class Jackal public static bool canCreateSidekick = true; public static bool jackalPromotedFromSidekickCanCreateSidekick = true; public static bool hasImpostorVision; - public static bool CanImpostorFindSidekick; public static bool canSabotage; public static bool killFakeImpostor; - public static bool wasTeamRed; - public static bool wasImpostor; - public static bool wasSpy; + + public static bool sidekickCanUseVents; + public static bool sidekickCanKill; + public static bool promotesToJackal; public static float chanceSwoop; public static bool canSwoop; @@ -47,9 +48,10 @@ public static void setSwoop() public static void clearAndReload() { - jackal = null; - formerJackals.Clear(); + jackal.Clear(); + sidekick = null; currentTarget = null; + currentTarget2 = null; isInvisable = false; cooldown = CustomOptionHolder.jackalKillCooldown.GetFloat(); swoopCooldown = CustomOptionHolder.jackalSwooperCooldown.GetFloat(); @@ -57,12 +59,14 @@ public static void clearAndReload() createSidekickCooldown = CustomOptionHolder.jackalCreateSidekickCooldown.GetFloat(); canUseVents = CustomOptionHolder.jackalCanUseVents.GetBool(); canSabotage = CustomOptionHolder.jackalCanUseSabo.GetBool(); - CanImpostorFindSidekick = CustomOptionHolder.jackalCanImpostorFindSidekick.GetBool(); canCreateSidekick = CustomOptionHolder.jackalCanCreateSidekick.GetBool(); jackalPromotedFromSidekickCanCreateSidekick = CustomOptionHolder.jackalPromotedFromSidekickCanCreateSidekick.GetBool(); hasImpostorVision = CustomOptionHolder.jackalAndSidekickHaveImpostorVision.GetBool(); killFakeImpostor = CustomOptionHolder.jackalkillFakeImpostor.GetBool(); - wasTeamRed = wasImpostor = wasSpy = false; chanceSwoop = CustomOptionHolder.jackalChanceSwoop.GetSelection() / 10f; + + sidekickCanUseVents = CustomOptionHolder.sidekickCanUseVents.GetBool(); + sidekickCanKill = CustomOptionHolder.sidekickCanKill.GetBool(); + promotesToJackal = CustomOptionHolder.sidekickPromotesToJackal.GetBool(); } } diff --git a/TheOtherRoles/Roles/Neutral/Sidekick.cs b/TheOtherRoles/Roles/Neutral/Sidekick.cs deleted file mode 100644 index 9e1eb489..00000000 --- a/TheOtherRoles/Roles/Neutral/Sidekick.cs +++ /dev/null @@ -1,33 +0,0 @@ -using UnityEngine; - -namespace TheOtherRoles.Roles.Neutral; - -public class Sidekick -{ - public static PlayerControl sidekick; - public static Color color = new Color32(0, 180, 235, byte.MaxValue); - - public static PlayerControl currentTarget; - - public static bool wasTeamRed; - public static bool wasImpostor; - public static bool wasSpy; - - public static float cooldown = 30f; - public static bool canUseVents = true; - public static bool canKill = true; - public static bool promotesToJackal = true; - public static bool hasImpostorVision; - - public static void clearAndReload() - { - sidekick = null; - currentTarget = null; - cooldown = CustomOptionHolder.jackalKillCooldown.GetFloat(); - canUseVents = CustomOptionHolder.sidekickCanUseVents.GetBool(); - canKill = CustomOptionHolder.sidekickCanKill.GetBool(); - promotesToJackal = CustomOptionHolder.sidekickPromotesToJackal.GetBool(); - hasImpostorVision = CustomOptionHolder.jackalAndSidekickHaveImpostorVision.GetBool(); - wasTeamRed = wasImpostor = wasSpy = false; - } -} diff --git a/TheOtherRoles/Roles/Neutral/Thief.cs b/TheOtherRoles/Roles/Neutral/Thief.cs index 7c503e9a..7e2cf9a1 100644 --- a/TheOtherRoles/Roles/Neutral/Thief.cs +++ b/TheOtherRoles/Roles/Neutral/Thief.cs @@ -1,4 +1,8 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; +using AmongUs.GameOptions; +using TheOtherRoles.Buttons; +using TheOtherRoles.Utilities; using UnityEngine; namespace TheOtherRoles.Roles.Neutral; @@ -39,8 +43,8 @@ public static void clearAndReload() public static bool tiefCanKill(PlayerControl target, PlayerControl killer) { return killer == thief && (target.Data.Role.IsImpostor || - target == Jackal.jackal || - target == Sidekick.sidekick || + Jackal.jackal.Any(x => x == target) || + target == Jackal.sidekick || target == Werewolf.werewolf || target == Juggernaut.juggernaut || target == Swooper.swooper || @@ -50,4 +54,114 @@ public static bool tiefCanKill(PlayerControl target, PlayerControl killer) (canKillDeputy && target == Deputy.deputy) || (canKillVeteran && target == Veteran.veteran)); } + + public static void StealsRole(byte playerId) + { + var target = playerById(playerId); + var thief = Thief.thief; + if (target == null) return; + if (target == Sheriff.sheriff) Sheriff.sheriff = thief; + if (target == Deputy.deputy) Deputy.deputy = thief; + if (target == Veteran.veteran) Veteran.veteran = thief; + if (Jackal.jackal.Any(x => x == target)) + { + Jackal.jackal.Add(thief); + } + + if (target == Jackal.sidekick) + { + Jackal.sidekick = thief; + Jackal.jackal.Add(target); + if (HandleGuesser.isGuesserGm && CustomOptionHolder.guesserGamemodeSidekickIsAlwaysGuesser.GetBool() && !HandleGuesser.isGuesser(thief.PlayerId)) + RPCProcedure.setGuesserGm(thief.PlayerId); + } + if (target == Pavlovsdogs.pavlovsowner) + { + Pavlovsdogs.pavlovsdogs.Add(target); + Pavlovsdogs.pavlovsowner = thief; + if (HandleGuesser.isGuesserGm && CustomOptionHolder.guesserGamemodePavlovsdogIsAlwaysGuesser.GetBool() && !HandleGuesser.isGuesser(thief.PlayerId)) + RPCProcedure.setGuesserGm(thief.PlayerId); + } + if (Pavlovsdogs.pavlovsdogs.Any(x => x == target)) + { + Pavlovsdogs.pavlovsdogs.Add(thief); + } + if (target == Poucher.poucher && !Poucher.spawnModifier) Poucher.poucher = thief; + if (target == Butcher.butcher) Butcher.butcher = thief; + if (target == Morphling.morphling) Morphling.morphling = thief; + if (target == Camouflager.camouflager) Camouflager.camouflager = thief; + if (target == Vampire.vampire) Vampire.vampire = thief; + if (target == Eraser.eraser) Eraser.eraser = thief; + if (target == Trickster.trickster) Trickster.trickster = thief; + if (target == Gambler.gambler) Gambler.gambler = thief; + if (target == Cleaner.cleaner) Cleaner.cleaner = thief; + if (target == Warlock.warlock) Warlock.warlock = thief; + if (target == Grenadier.grenadier) Grenadier.grenadier = thief; + if (target == BountyHunter.bountyHunter) BountyHunter.bountyHunter = thief; + if (target == Witch.witch) + { + Witch.witch = thief; + if (MeetingHud.Instance) + if (Witch.witchVoteSavesTargets) // In a meeting, if the thief guesses the witch, all targets are saved or no target is saved. + Witch.futureSpelled = new List(); + else // If thief kills witch during the round, remove the thief from the list of spelled people, keep the rest + Witch.futureSpelled.RemoveAll(x => x.PlayerId == thief.PlayerId); + } + + if (target == Ninja.ninja) Ninja.ninja = thief; + if (target == Escapist.escapist) Escapist.escapist = thief; + if (target == Terrorist.terrorist) Terrorist.terrorist = thief; + if (target == Bomber.bomber) Bomber.bomber = thief; + if (target == Miner.miner) Miner.miner = thief; + if (target == Undertaker.undertaker) Undertaker.undertaker = thief; + if (target == Mimic.mimic) + { + Mimic.mimic = thief; + Mimic.hasMimic = false; + } + if (target == Yoyo.yoyo) + { + Yoyo.yoyo = thief; + Yoyo.markedLocation = null; + } + if (target.Data.Role.IsImpostor) + { + RoleManager.Instance.SetRole(Thief.thief, RoleTypes.Impostor); + FastDestroyableSingleton.Instance.KillButton.SetCoolDown(Thief.thief.killTimer, + GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown); + } + + if (target == Werewolf.werewolf) + { + Survivor.survivor.Add(target); + Werewolf.werewolf = thief; + } + if (target == Arsonist.arsonist) + { + Survivor.survivor.Add(target); + Arsonist.arsonist = thief; + } + if (target == Juggernaut.juggernaut) + { + Survivor.survivor.Add(target); + Juggernaut.juggernaut = thief; + } + if (target == Swooper.swooper) + { + Survivor.survivor.Add(target); + Swooper.swooper = thief; + } + + if (target == Deputy.deputy) Deputy.deputy = thief; + if (target == Veteran.veteran) Veteran.veteran = thief; + if (target == Blackmailer.blackmailer) Blackmailer.blackmailer = thief; + if (target == EvilTrapper.evilTrapper) EvilTrapper.evilTrapper = thief; + + if (Lawyer.lawyer != null && target == Lawyer.target) + Lawyer.target = thief; + if (Thief.thief == PlayerControl.LocalPlayer) CustomButton.ResetAllCooldowns(); + Thief.clearAndReload(); + Thief.formerThief = thief; // After clearAndReload, else it would get reset... + } + } diff --git a/TheOtherRoles/Roles/Neutral/Witness.cs b/TheOtherRoles/Roles/Neutral/Witness.cs new file mode 100644 index 00000000..8f929f39 --- /dev/null +++ b/TheOtherRoles/Roles/Neutral/Witness.cs @@ -0,0 +1,21 @@ +using UnityEngine; + +namespace TheOtherRoles.Roles.Neutral; + +public class Witness +{ + public static PlayerControl player; + public static Color color = new Color32(123, 170, 255, byte.MaxValue); + public static PlayerControl target; + + public static int markTimer; + public static int winCount; + + public static void ClearAndReload() + { + player = null; + target = null; + markTimer = 30; + winCount = 3; + } +} diff --git a/TheOtherRoles/Roles/RoleHelpers.cs b/TheOtherRoles/Roles/RoleHelpers.cs index fc7be7f2..180e1a64 100644 --- a/TheOtherRoles/Roles/RoleHelpers.cs +++ b/TheOtherRoles/Roles/RoleHelpers.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using MonoMod.Utils; @@ -32,7 +33,8 @@ public static bool CanMultipleShots(PlayerControl dyingTarget) } public static Dictionary blockedRolePairings = new(); - public static Dictionary GhostRoles = new(); + public static Dictionary> GhostRoles = new(); + public static List GhostPlayer = new(); public static void blockRole() { @@ -166,10 +168,18 @@ public static void ResetRoleSelection() { RoleId.Watcher, CustomOptionHolder.modifierWatcher.GetSelection()} }); GhostRoles.Clear(); - GhostRoles.AddRange(new() + GhostPlayer.Clear(); + + GhostRoles[AssignType.Crewmate] = new List { - { RoleId.GhostEngineer, CustomOptionHolder.ghostEngineerSpawnRate.GetSelection()} - }); + new(RoleId.GhostEngineer, CustomOptionHolder.ghostEngineerSpawnRate.GetSelection()), + }; + + + GhostRoles[AssignType.otherNeutral] = new List + { + new(RoleId.Specter, CustomOptionHolder.specterSpawnRate.GetSelection()) + }; } public static void clearAndReloadRoles() @@ -205,7 +215,6 @@ public static void clearAndReloadRoles() Vampire.clearAndReload(); Snitch.clearAndReload(); Jackal.clearAndReload(); - Sidekick.clearAndReload(); Pavlovsdogs.clearAndReload(); Eraser.clearAndReload(); Spy.clearAndReload(); @@ -272,6 +281,7 @@ public static void clearAndReloadRoles() Specoality.clearAndReload(); GhostEngineer.ClearAndReload(); + Specter.ClearAndReload(); // Gamemodes HandleGuesser.clearAndReload(); @@ -289,39 +299,96 @@ public static bool Prefix([HarmonyArgument(0)] PlayerControl player) if (player.IsAlive() || player == null) return false; return true; } + + public static bool otherNeutral(PlayerControl player) + { + if (isNeutral(player) && + player != Jackal.sidekick && + player != Pavlovsdogs.pavlovsowner && + player != Akujo.akujo && + player != Lawyer.lawyer && + !Pavlovsdogs.pavlovsdogs.Contains(player) && + !Jackal.jackal.Contains(player) && + (player != PartTimer.partTimer || PartTimer.target != null)) + return true; + return false; + } + public static void Postfix([HarmonyArgument(0)] PlayerControl player) { - if (player.IsAlive()) return; - int RolesCount = GhostRoles.Sum(role => role.Value); - if (RolesCount == 0) return; + if (GhostPlayer.Contains(player)) return; + + if (player.isCrew()) TryAssignRole(player, AssignType.Crewmate); + + if (otherNeutral(player)) TryAssignRole(player, AssignType.otherNeutral); + } - if (player.isCrew() && GhostRoles.Any(x => x.Value > 0)) + private static void TryAssignRole(PlayerControl player, AssignType assignType) + { + if (!GhostRoles.TryGetValue(assignType, out var roles) || roles.Count == 0) return; + roles = roles.OrderBy(x => Guid.NewGuid()).ToList(); + foreach (var role in roles.Where(x => x.SpawnRate == 10 && !x.Assigned).ToList()) { - foreach (var role in GhostRoles.Where(x => x.Value == 10)) - { - var write = StartRPC(PlayerControl.LocalPlayer, CustomRPC.SetGhostRole); - write.Write(player.PlayerId); - write.Write((byte)role.Key); - write.EndRPC(); - RPCProcedure.setGhostRole(player.PlayerId, (byte)role.Key); - GhostRoles.Remove(role.Key); - return; - } + AssignRoleToPlayer(player, role, roles); + return; + } - foreach (var role in GhostRoles.Where(x => x.Value is > 0 and < 10)) + int maxCount = roles.Count; + int count = 0; + int rd = rnd.Next(1, 10); + while (count < maxCount) + { + bool assigned = false; + foreach (var role in roles.Where(x => x.SpawnRate is > 0 and < 10 && !x.Assigned).ToList()) { - if (rnd.Next(1, 11) <= role.Value) + if (rnd.Next(1, 11) <= role.SpawnRate) { - var write = StartRPC(PlayerControl.LocalPlayer, CustomRPC.SetGhostRole); - write.Write(player.PlayerId); - write.Write((byte)role.Key); - write.EndRPC(); - RPCProcedure.setGhostRole(player.PlayerId, (byte)role.Key); - GhostRoles.Remove(role.Key); + AssignRoleToPlayer(player, role, roles); + assigned = true; break; } } + if (assigned) break; + rd += rnd.Next(0, 3); + count++; } } + + private static void AssignRoleToPlayer(PlayerControl player, Assignment role, List roles) + { + var write = StartRPC(PlayerControl.LocalPlayer, CustomRPC.SetGhostRole); + write.Write(player.PlayerId); + write.Write((byte)role.RoleId); + write.EndRPC(); + + RPCProcedure.setGhostRole(player.PlayerId, (byte)role.RoleId); + roles.Remove(role); + GhostPlayer.Add(player); + role.Assigned = true; + } + } + + public class Assignment + { + public RoleId RoleId { get; set; } + public int SpawnRate { get; set; } + public bool Assigned { get; set; } + + public Assignment(RoleId roleId, int Rate) + { + RoleId = roleId; + SpawnRate = Rate; + } } -} \ No newline at end of file + + public enum AssignType + { + None, + Crewmate, + Impostor, + Neutral, + otherNeutral, + Custom + } +} + diff --git a/TheOtherRoles/Roles/RoleInfo.cs b/TheOtherRoles/Roles/RoleInfo.cs index 1e53793b..5de5c426 100644 --- a/TheOtherRoles/Roles/RoleInfo.cs +++ b/TheOtherRoles/Roles/RoleInfo.cs @@ -7,7 +7,7 @@ namespace TheOtherRoles.Roles; -public class RoleInfo(string name, Color color, RoleId roleId, RoleType roleTeam, bool isGuessable = false) +public class RoleInfo(string name, Color color, RoleId roleId, RoleType roleType, bool isGuessable = false) { public string Name => GetString(nameKey); public string IntroDescription => GetString(nameKey + "IntroDesc"); @@ -16,7 +16,7 @@ public class RoleInfo(string name, Color color, RoleId roleId, RoleType roleTeam public Color color = color; public RoleId roleId = roleId; - public RoleType roleTeam = roleTeam; + public RoleType roleType = roleType; public bool isGuessable = isGuessable; private readonly string nameKey = name; @@ -54,7 +54,7 @@ public class RoleInfo(string name, Color color, RoleId roleId, RoleType roleTeam public static RoleInfo pursuer = new("Pursuer", Pursuer.color, RoleId.Pursuer, RoleType.Neutral); public static RoleInfo partTimer = new("PartTimer", PartTimer.color, RoleId.PartTimer, RoleType.Neutral); public static RoleInfo jackal = new("Jackal", Jackal.color, RoleId.Jackal, RoleType.Neutral); - public static RoleInfo sidekick = new("Sidekick", Sidekick.color, RoleId.Sidekick, RoleType.Neutral); + public static RoleInfo sidekick = new("Sidekick", Jackal.color, RoleId.Sidekick, RoleType.Neutral); public static RoleInfo pavlovsowner = new("Pavlovsowner", Pavlovsdogs.color, RoleId.Pavlovsowner, RoleType.Neutral); public static RoleInfo pavlovsdogs = new("Pavlovsdogs", Pavlovsdogs.color, RoleId.Pavlovsdogs, RoleType.Neutral); public static RoleInfo swooper = new("Swooper", Swooper.color, RoleId.Swooper, RoleType.Neutral); @@ -124,6 +124,7 @@ public class RoleInfo(string name, Color color, RoleId roleId, RoleType roleTeam public static RoleInfo shifter = new("Shifter", Color.yellow, RoleId.Shifter, RoleType.Modifier); public static RoleInfo ghostEngineer = new("GhostEngineer", GhostEngineer.color, RoleId.GhostEngineer, RoleType.GhostRole); + public static RoleInfo specter = new("Specter", Specter.color, RoleId.Specter, RoleType.GhostRole); public static List allRoleInfos = [ @@ -229,7 +230,8 @@ public class RoleInfo(string name, Color color, RoleId roleId, RoleType roleTeam chameleon, shifter, - ghostEngineer + ghostEngineer, + specter, ]; public static List getRoleInfoForPlayer(PlayerControl p, bool showModifier = true, bool showGhost = true) @@ -305,7 +307,6 @@ public static List getRoleInfoForPlayer(PlayerControl p, bool showModi if (p == Terrorist.terrorist) infos.Add(terrorist); if (p == Detective.detective) infos.Add(detective); if (p == TimeMaster.timeMaster) infos.Add(timeMaster); - if (p == Amnisiac.amnisiac) infos.Add(amnisiac); if (p == Veteran.veteran) infos.Add(veteran); if (p == Grenadier.grenadier) infos.Add(grenadier); if (p == Medic.medic) infos.Add(medic); @@ -315,8 +316,6 @@ public static List getRoleInfoForPlayer(PlayerControl p, bool showModi if (p == Hacker.hacker) infos.Add(hacker); if (p == Tracker.tracker) infos.Add(tracker); if (p == Snitch.snitch) infos.Add(snitch); - if (p == Jackal.jackal || (Jackal.formerJackals != null && Jackal.formerJackals.Any(x => x.PlayerId == p.PlayerId))) infos.Add(jackal); - if (p == Sidekick.sidekick) infos.Add(sidekick); if (p == Spy.spy) infos.Add(spy); if (p == SecurityGuard.securityGuard) infos.Add(securityGuard); if (p == Arsonist.arsonist) infos.Add(arsonist); @@ -342,14 +341,18 @@ public static List getRoleInfoForPlayer(PlayerControl p, bool showModi if (p == Juggernaut.juggernaut) infos.Add(juggernaut); if (p == Doomsayer.doomsayer) infos.Add(doomsayer); if (p == Akujo.akujo) infos.Add(akujo); + if (p == Jackal.sidekick) infos.Add(sidekick); if (p == Pavlovsdogs.pavlovsowner) infos.Add(pavlovsowner); - if (p == Pavlovsdogs.pavlovsdogs.Any(x => x.PlayerId == p.PlayerId)) infos.Add(pavlovsdogs); + if (Jackal.jackal.Any(x => x != null && x.PlayerId == p.PlayerId)) infos.Add(jackal); + if (Amnisiac.player.Any(x => x.PlayerId == p.PlayerId)) infos.Add(amnisiac); + if (Pavlovsdogs.pavlovsdogs.Any(x => x.PlayerId == p.PlayerId)) infos.Add(pavlovsdogs); if (Pursuer.pursuer.Any(x => x.PlayerId == p.PlayerId)) infos.Add(pursuer); if (Survivor.survivor.Any(x => x.PlayerId == p.PlayerId)) infos.Add(survivor); if (showGhost) { if (p == GhostEngineer.player) infos.Add(ghostEngineer); + if (p == Specter.player) infos.Add(specter); } if (infos.Count == count) @@ -368,11 +371,11 @@ public static string GetRolesString(PlayerControl p, bool useColors, bool showMo if (onlyGhostRole) { - var ghostRoleInfo = getRoleInfoForPlayer(p, false, true).FirstOrDefault(x => x.roleTeam == RoleType.GhostRole); + var ghostRoleInfo = getRoleInfoForPlayer(p, false, true).FirstOrDefault(x => x.roleType == RoleType.GhostRole); if (p.Data.IsDead && ghostRoleInfo != null) { - roleName = string.Join(" ", getRoleInfoForPlayer(p, false, true).Where(x => x.roleTeam is RoleType.GhostRole or RoleType.Modifier) + roleName = string.Join(" ", getRoleInfoForPlayer(p, false, true).Where(x => x.roleType is RoleType.GhostRole or RoleType.Modifier) .Select(x => useColors ? cs(x.color, x.Name) : x.Name).ToArray()); } } @@ -383,7 +386,7 @@ public static string GetRolesString(PlayerControl p, bool useColors, bool showMo if (Executioner.target != null && p.PlayerId == Executioner.target.PlayerId && CachedPlayer.LocalPlayer.PlayerControl != Executioner.target) roleName += useColors ? cs(Executioner.color, " §") : " §"; - if (p == Jackal.jackal && Jackal.canSwoop) roleName += "JackalIsSwooperInfo".Translate(); + if (Jackal.jackal.Any(x => x == p && x.IsAlive()) && Jackal.canSwoop) roleName += "JackalIsSwooperInfo".Translate(); if (HandleGuesser.isGuesserGm && HandleGuesser.isGuesser(p.PlayerId)) roleName += "GuessserGMInfo".Translate(); @@ -409,6 +412,8 @@ public static string GetRolesString(PlayerControl p, bool useColors, bool showMo roleName = cs(Warlock.color, "(被下咒) ") + roleName; if (p == Ninja.ninjaMarked) roleName = cs(Ninja.color, "(被标记) ") + roleName; + if (p == Thief.formerThief) + roleName += cs(Thief.color, " (窃)"); if (Pursuer.blankedList.Contains(p) && !p.Data.IsDead) roleName = cs(Pursuer.color, "(被塞空包弹) ") + roleName; if (Witch.futureSpelled.Contains(p) && !MeetingHud.Instance) // This is already displayed in meetings! diff --git a/TheOtherRoles/TasksHandler.cs b/TheOtherRoles/TasksHandler.cs index d6f31c13..0f149cc3 100644 --- a/TheOtherRoles/TasksHandler.cs +++ b/TheOtherRoles/TasksHandler.cs @@ -31,7 +31,7 @@ private static bool ShouldCountTasks(GameData.PlayerInfo playerInfo) { return !(playerInfo.Object && playerInfo.Object.hasAliveKillingLover()) && playerInfo.PlayerId != Thief.thief?.PlayerId - && playerInfo.PlayerId != Amnisiac.amnisiac?.PlayerId + && !Amnisiac.player.Any(x => x.PlayerId == playerInfo.PlayerId) && playerInfo.PlayerId != Akujo.honmei?.PlayerId; } @@ -39,7 +39,7 @@ private static bool Prefix(GameData __instance) { var totalTasks = 0; var completedTasks = 0; - //任务结算 + foreach (var playerInfo in GameData.Instance.AllPlayers.GetFastEnumerator()) { if (!ShouldCountTasks(playerInfo)) diff --git a/TheOtherRoles/TheOtherRoles.csproj b/TheOtherRoles/TheOtherRoles.csproj index 3693fa4b..9e49520d 100644 --- a/TheOtherRoles/TheOtherRoles.csproj +++ b/TheOtherRoles/TheOtherRoles.csproj @@ -1,7 +1,7 @@  net6.0 - 1.0.9.9 + 1.1.0.0 TheOtherUs mxyx-club latest