diff --git a/AmongUsRevamped.cs b/AmongUsRevamped.cs index 43ea1d4..1e67680 100644 --- a/AmongUsRevamped.cs +++ b/AmongUsRevamped.cs @@ -38,9 +38,11 @@ public partial class Main : BasePlugin public static NormalGameOptionsV10 NormalOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentNormalGameOptions : null; public static HideNSeekGameOptionsV10 HideNSeekOptions => GameOptionsManager.Instance != null ? GameOptionsManager.Instance.currentHideNSeekGameOptions : null; + public static MapNames CurrentMap => (MapNames)NormalOptions.MapId; + public static bool HasArgumentException; public static string CredentialsText; - public const string ModVersion = "v1.5.1"; + public const string ModVersion = "v1.5.2"; public static float GameTimer; diff --git a/Modules/CustomOptionsHolder.cs b/Modules/CustomOptionsHolder.cs index 5fc2256..b85e848 100644 --- a/Modules/CustomOptionsHolder.cs +++ b/Modules/CustomOptionsHolder.cs @@ -99,12 +99,46 @@ namespace AmongUsRevamped public static OptionItem NoGameEnd; //Gameplay - public static OptionItem TabGroupGameplayGeneral; + public static OptionItem TabGroupSabotages; public static OptionItem DisableSabotage; + public static OptionItem DisableReactor; + public static OptionItem DisableOxygen; + public static OptionItem DisableLights; + public static OptionItem DisableComms; + public static OptionItem DisableHeli; + public static OptionItem DisableMushroomMixup; public static OptionItem DisableCloseDoor; + public static OptionItem TabGroupGameplayGeneral; public static OptionItem DisableReport; + public static OptionItem ChangeDecontaminationTime; + public static OptionItem DecontaminationTimeOnMiraHQ; + public static OptionItem DecontaminationDoorOpenTimeOnMiraHQ; + public static OptionItem DecontaminationTimeOnPolus; + public static OptionItem DecontaminationDoorOpenTimeOnPolus; + + public static OptionItem DisableDevices; + private static OptionItem DisableSkeldDevices; + public static OptionItem DisableSkeldAdmin; + public static OptionItem DisableSkeldCamera; + private static OptionItem DisableMiraHQDevices; + public static OptionItem DisableMiraHQAdmin; + public static OptionItem DisableMiraHQDoorLog; + private static OptionItem DisablePolusDevices; + public static OptionItem DisablePolusAdmin; + public static OptionItem DisablePolusCamera; + public static OptionItem DisablePolusVital; + private static OptionItem DisableAirshipDevices; + public static OptionItem DisableAirshipCockpitAdmin; + public static OptionItem DisableAirshipRecordsAdmin; + public static OptionItem DisableAirshipCamera; + public static OptionItem DisableAirshipVital; + private static OptionItem DisableFungleDevices; + public static OptionItem DisableFungleCamera; + public static OptionItem DisableFungleVital; + + public static OptionItem TabGroupTasks; public static OptionItem OverrideTaskSettings; @@ -226,6 +260,14 @@ namespace AmongUsRevamped public static OptionItem CrewAutoWinsGameAfter; public static OptionItem CantKillTime; public static OptionItem MisfiresToSuicide; + public static OptionItem SNSDisableSabotage; + public static OptionItem SNSDisableReactor; + public static OptionItem SNSDisableOxygen; + public static OptionItem SNSDisableLights; + public static OptionItem SNSDisableComms; + public static OptionItem SNSDisableHeli; + public static OptionItem SNSDisableMushroomMixup; + public static OptionItem SNSDisableCloseDoor; public static OptionItem TabGroupSpeedrun; public static OptionItem SpeedrunSettingsOverride; @@ -341,6 +383,28 @@ namespace AmongUsRevamped MisfiresToSuicide = IntegerOptionItem.Create(70052, "Suicide After Amount Of Misfires", new(1, 10, 1), 2, TabGroup.GamemodeSettings, false); CrewAutoWinsGameAfter = IntegerOptionItem.Create(70054, "Crewmates Automatically Win After", new(0, 600, 10), 300, TabGroup.GamemodeSettings, false) .SetValueFormat(OptionFormat.Seconds); + SNSDisableSabotage = BooleanOptionItem.Create(70055, "Disable SnS Critical Sabotages", true, TabGroup.GamemodeSettings, false) + .SetColor(Color.red); + SNSDisableReactor = BooleanOptionItem.Create(70056, "Disable Reactor Sabotage", true, TabGroup.GamemodeSettings, false) + .SetParent(SNSDisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + SNSDisableOxygen = BooleanOptionItem.Create(70057, "Disable O2 Sabotage", true, TabGroup.GamemodeSettings, false) + .SetParent(SNSDisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + SNSDisableLights = BooleanOptionItem.Create(70058, "Disable Lights Sabotage", true, TabGroup.GamemodeSettings, false) + .SetParent(SNSDisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + SNSDisableComms = BooleanOptionItem.Create(70059, "Disable Communications Sabotage", true, TabGroup.GamemodeSettings, false) + .SetParent(SNSDisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + SNSDisableHeli = BooleanOptionItem.Create(70060, "Disable Crash Course Sabotage", true, TabGroup.GamemodeSettings, false) + .SetParent(SNSDisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + SNSDisableMushroomMixup = BooleanOptionItem.Create(70061, "Disable Mushroom Mixup Sabotage", true, TabGroup.GamemodeSettings, false) + .SetParent(SNSDisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + SNSDisableCloseDoor = BooleanOptionItem.Create(70062, "Disable SnS Door Sabotages", true, TabGroup.GamemodeSettings, false) + .SetColor(Color.red); TabGroupSpeedrun = TextOptionItem.Create(70075, "Speedrun", TabGroup.GamemodeSettings) .SetColor(Color.blue); @@ -348,15 +412,129 @@ namespace AmongUsRevamped GameAutoEndsAfter = IntegerOptionItem.Create(70077, "Game automatically ends after", new(0, 600, 10), 300, TabGroup.GamemodeSettings, false) .SetValueFormat(OptionFormat.Seconds); - // Gameplay Settings - TabGroupGameplayGeneral = TextOptionItem.Create(60564, "General", TabGroup.ModSettings) - .SetColor(Color.blue); - DisableSabotage = BooleanOptionItem.Create(60565, "Disable Critical Sabotages", false, TabGroup.ModSettings, false) + TabGroupSabotages = TextOptionItem.Create(60455, "Sabotages", TabGroup.ModSettings) + .SetColor(Color.red); + DisableSabotage = BooleanOptionItem.Create(60456, "Disable Critical Sabotages", false, TabGroup.ModSettings, false) + .SetColor(Color.red); + DisableReactor = BooleanOptionItem.Create(60457, "Disable Reactor Sabotage", false, TabGroup.ModSettings, false) + .SetParent(DisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + DisableOxygen = BooleanOptionItem.Create(60458, "Disable O2 Sabotage", false, TabGroup.ModSettings, false) + .SetParent(DisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + DisableLights = BooleanOptionItem.Create(60459, "Disable Lights Sabotage", false, TabGroup.ModSettings, false) + .SetParent(DisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + DisableComms = BooleanOptionItem.Create(60460, "Disable Communications Sabotage", false, TabGroup.ModSettings, false) + .SetParent(DisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + DisableHeli = BooleanOptionItem.Create(60461, "Disable Crash Course Sabotage", false, TabGroup.ModSettings, false) + .SetParent(DisableSabotage) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + DisableMushroomMixup = BooleanOptionItem.Create(60462, "Disable Mushroom Mixup Sabotage", false, TabGroup.ModSettings, false) + .SetParent(DisableSabotage) .SetColor(new Color32(255, 153, 153, byte.MaxValue)); DisableCloseDoor = BooleanOptionItem.Create(60566, "Disable Door Sabotages", false, TabGroup.ModSettings, false) - .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + .SetColor(Color.red); + + TabGroupGameplayGeneral = TextOptionItem.Create(60564, "General", TabGroup.ModSettings) + .SetColor(Color.blue); DisableReport = BooleanOptionItem.Create(60520, "Disable Body Reports", false, TabGroup.ModSettings, false) + .SetColor(Color.blue); + + ChangeDecontaminationTime = BooleanOptionItem.Create(60550, "Override Decontamination Time", false, TabGroup.ModSettings, false) + .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + DecontaminationTimeOnMiraHQ = FloatOptionItem.Create(60551, "Mira HQ Decon Duration", new(0.5f, 10f, 0.25f), 3f, TabGroup.ModSettings, false) + .SetParent(ChangeDecontaminationTime) + .SetValueFormat(OptionFormat.Seconds) + .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + DecontaminationDoorOpenTimeOnMiraHQ = FloatOptionItem.Create(60552, "Mira HQ Door Open Duration", new(0.5f, 10f, 0.25f), 3f, TabGroup.ModSettings, false) + .SetParent(ChangeDecontaminationTime) + .SetValueFormat(OptionFormat.Seconds) + .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + DecontaminationTimeOnPolus = FloatOptionItem.Create(60553, "Polus Decon Duration", new(0.5f, 10f, 0.25f), 3f, TabGroup.ModSettings, false) + .SetParent(ChangeDecontaminationTime) + .SetValueFormat(OptionFormat.Seconds) + .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + DecontaminationDoorOpenTimeOnPolus = FloatOptionItem.Create(60554, "Polus Door Open Duration", new(0.5f, 10f, 0.25f), 3f, TabGroup.ModSettings, false) + .SetParent(ChangeDecontaminationTime) + .SetValueFormat(OptionFormat.Seconds) + .SetColor(new Color32(19, 188, 233, byte.MaxValue)); + + DisableDevices = BooleanOptionItem.Create(22900, "Disable Devices", false, TabGroup.ModSettings, false) + .SetColor(Color.red); + + DisableSkeldDevices = BooleanOptionItem.Create(22905, "Disable Skeld Devices", false, TabGroup.ModSettings, false) + .SetParent(DisableDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableSkeldAdmin = BooleanOptionItem.Create(22906, "Disable Skeld Admin", false, TabGroup.ModSettings, false) + .SetParent(DisableSkeldDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableSkeldCamera = BooleanOptionItem.Create(22907, "Disable Skeld Camera", false, TabGroup.ModSettings, false) + .SetParent(DisableSkeldDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableMiraHQDevices = BooleanOptionItem.Create(22908, "Disable Mira HQ Devices", false, TabGroup.ModSettings, false) + .SetParent(DisableDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableMiraHQAdmin = BooleanOptionItem.Create(22909, "Disable Mira HQ Admin", false, TabGroup.ModSettings, false) + .SetParent(DisableMiraHQDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableMiraHQDoorLog = BooleanOptionItem.Create(22910, "Disable Mira HQ DoorLogs", false, TabGroup.ModSettings, false) + .SetParent(DisableMiraHQDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisablePolusDevices = BooleanOptionItem.Create(22911, "Disable Polus Devices", false, TabGroup.ModSettings, false) + .SetParent(DisableDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisablePolusAdmin = BooleanOptionItem.Create(22912, "Disable Polus Admin", false, TabGroup.ModSettings, false) + .SetParent(DisablePolusDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisablePolusCamera = BooleanOptionItem.Create(22913, "Disable Polus Camera", false, TabGroup.ModSettings, false) + .SetParent(DisablePolusDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisablePolusVital = BooleanOptionItem.Create(22914, "Disable Polus Vitals", false, TabGroup.ModSettings, false) + .SetParent(DisablePolusDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableAirshipDevices = BooleanOptionItem.Create(22915, "Disable Airship Devices", false, TabGroup.ModSettings, false) + .SetParent(DisableDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableAirshipCockpitAdmin = BooleanOptionItem.Create(22916, "Disable Airship Cockpit Admin", false, TabGroup.ModSettings, false) + .SetParent(DisableAirshipDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableAirshipRecordsAdmin = BooleanOptionItem.Create(22917, "Disable Airship Records Admin", false, TabGroup.ModSettings, false) + .SetParent(DisableAirshipDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableAirshipCamera = BooleanOptionItem.Create(22918, "Disable Airship Camera", false, TabGroup.ModSettings, false) + .SetParent(DisableAirshipDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableAirshipVital = BooleanOptionItem.Create(22919, "Disable Airship Vitals", false, TabGroup.ModSettings, false) + .SetParent(DisableAirshipDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableFungleDevices = BooleanOptionItem.Create(22925, "Disable Fungle Devices", false, TabGroup.ModSettings, false) + .SetParent(DisableDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableFungleCamera = BooleanOptionItem.Create(22926, "Disable Fungle Camera", false, TabGroup.ModSettings, false) + .SetParent(DisableFungleDevices) + .SetColor(new Color32(255, 153, 153, byte.MaxValue)); + + DisableFungleVital = BooleanOptionItem.Create(22927, "Disable Fungle Vitals", false, TabGroup.ModSettings, false) + .SetParent(DisableFungleDevices) .SetColor(new Color32(255, 153, 153, byte.MaxValue)); diff --git a/Modules/FixedUpdate.cs b/Modules/FixedUpdate.cs index 3525cfd..265c0fe 100644 --- a/Modules/FixedUpdate.cs +++ b/Modules/FixedUpdate.cs @@ -27,6 +27,9 @@ public static class FixedUpdate { nr.SetActive(false); } + + if (!AmongUsClient.Instance.AmHost) return; + DisableDevice.FixedUpdate(); } } diff --git a/Modules/Helpers/Il2CppHelper.cs b/Modules/Helpers/Il2CppHelper.cs new file mode 100644 index 0000000..154394c --- /dev/null +++ b/Modules/Helpers/Il2CppHelper.cs @@ -0,0 +1,42 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; +using Il2CppInterop.Runtime; +using Il2CppInterop.Runtime.InteropTypes; +using UnityEngine; + +namespace AmongUsRevamped; + + +// Credit: TommyXL +public static class Il2CppCastHelper +{ + public static T CastFast(this Il2CppObjectBase obj) where T : Il2CppObjectBase + { + if (obj is T casted) return casted; +#if ANDROID + return obj.Cast(); +#else + return obj.Pointer.CastFast(); +#endif + } + + private static T CastFast(this IntPtr ptr) where T : Il2CppObjectBase + { + return CastHelper.Cast(ptr); + } + + private static class CastHelper where T : Il2CppObjectBase + { + public static readonly Func Cast; + + static CastHelper() + { + ConstructorInfo constructor = typeof(T).GetConstructor([typeof(IntPtr)]); + ParameterExpression ptr = Expression.Parameter(typeof(IntPtr)); + NewExpression create = Expression.New(constructor!, ptr); + Expression> lambda = Expression.Lambda>(create, ptr); + Cast = lambda.Compile(); + } + } +} \ No newline at end of file diff --git a/Modules/Utils.cs b/Modules/Utils.cs index 59f62e8..e981b6a 100644 --- a/Modules/Utils.cs +++ b/Modules/Utils.cs @@ -221,6 +221,87 @@ public static class Utils } } + public static bool IsActive(SystemTypes type) + { + try + { + if (Utils.IsLobby || !ShipStatus.Instance || !ShipStatus.Instance.Systems.TryGetValue(type, out ISystemType systemType)) return false; + + int mapId = Main.NormalOptions.MapId; + + switch (type) + { + case SystemTypes.Electrical: + { + if (mapId == 5) return false; + + var switchSystem = systemType.CastFast(); + return switchSystem is { IsActive: true }; + } + case SystemTypes.Reactor: + { + switch (mapId) + { + case 2: + return false; + case 4: + var heliSabotageSystem = systemType.CastFast(); + return heliSabotageSystem != null && heliSabotageSystem.IsActive; + default: + var reactorSystemType = systemType.CastFast(); + return reactorSystemType is { IsActive: true }; + } + } + case SystemTypes.Laboratory: + { + if (mapId != 2) return false; + + var reactorSystemType = systemType.CastFast(); + return reactorSystemType is { IsActive: true }; + } + case SystemTypes.LifeSupp: + { + if (mapId is 2 or 4 or 5) return false; + + var lifeSuppSystemType = systemType.CastFast(); + return lifeSuppSystemType is { IsActive: true }; + } + case SystemTypes.Comms: + { + if (mapId is 1 or 5) + { + var hqHudSystemType = systemType.TryCast(); + return hqHudSystemType != null && hqHudSystemType.IsActive; + } + + var hudOverrideSystemType = systemType.CastFast(); + return hudOverrideSystemType is { IsActive: true }; + } + case SystemTypes.HeliSabotage: + { + if (mapId != 4) return false; + + var heliSabotageSystem = systemType.CastFast(); + return heliSabotageSystem != null && heliSabotageSystem.IsActive; + } + case SystemTypes.MushroomMixupSabotage: + { + if (mapId != 5) return false; + + var mushroomMixupSabotageSystem = systemType.CastFast(); + return mushroomMixupSabotageSystem != null && mushroomMixupSabotageSystem.IsActive; + } + default: + return false; + } + } + catch (Exception e) + { + Logger.Exception(e, "IsActive"); + return false; + } + } + public static void ShowLastResult(byte playerId = byte.MaxValue) { if (InGame) diff --git a/Patches/ChatPatches.cs b/Patches/ChatPatches.cs index e882899..15c3bbb 100644 --- a/Patches/ChatPatches.cs +++ b/Patches/ChatPatches.cs @@ -238,7 +238,7 @@ internal static class SendChatPatch [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.HandleRpc))] public static class RPCHandlerPatch { - public static void Prefix(PlayerControl __instance, byte callId, MessageReader reader) + public static void Prefix(PlayerControl __instance, [HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader) { if (!AmongUsClient.Instance.AmHost) return; @@ -266,7 +266,8 @@ public static class RPCHandlerPatch { c = keywords.Any(k => text == k); } - if (c && !Utils.IsPlayerModerator(__instance.Data.FriendCode) && Options.AutoKickStart.GetBool()) + + if (c && !Utils.IsPlayerModerator(__instance.Data.FriendCode) && Options.AutoKickStart.GetBool() && !Utils.InGame) { int clientId = __instance.Data.ClientId; diff --git a/Patches/DeconSystemPatch.cs b/Patches/DeconSystemPatch.cs new file mode 100644 index 0000000..b13abe1 --- /dev/null +++ b/Patches/DeconSystemPatch.cs @@ -0,0 +1,32 @@ +namespace AmongUsRevamped; + +[HarmonyPatch(typeof(DeconSystem), nameof(DeconSystem.UpdateSystem))] +public static class DeconSystemUpdateSystemPatch +{ + public static void Prefix(DeconSystem __instance) + { + if (!AmongUsClient.Instance.AmHost) return; + + if (Options.ChangeDecontaminationTime.GetBool()) + { + __instance.DoorOpenTime = Main.CurrentMap switch + { + MapNames.MiraHQ => Options.DecontaminationDoorOpenTimeOnMiraHQ.GetFloat(), + MapNames.Polus => Options.DecontaminationDoorOpenTimeOnPolus.GetFloat(), + _ => 3f + }; + + __instance.DeconTime = Main.CurrentMap switch + { + MapNames.MiraHQ => Options.DecontaminationTimeOnMiraHQ.GetFloat(), + MapNames.Polus => Options.DecontaminationTimeOnPolus.GetFloat(), + _ => 3f + }; + } + else + { + __instance.DoorOpenTime = 3f; + __instance.DeconTime = 3f; + } + } +} \ No newline at end of file diff --git a/Patches/DevicePatches.cs b/Patches/DevicePatches.cs new file mode 100644 index 0000000..897396b --- /dev/null +++ b/Patches/DevicePatches.cs @@ -0,0 +1,196 @@ +using System; +using Hazel; +using Il2CppInterop.Runtime.InteropTypes.Arrays; +using UnityEngine; + +namespace AmongUsRevamped; + +// https://github.com/ykundesu/SuperNewRoles/blob/master/SuperNewRoles/Mode/SuperHostRoles/BlockTool.cs +internal static class DisableDevice +{ + public static readonly List DesyncComms = []; + private static int frame; + + public static readonly Dictionary DevicePos = new() + { + ["SkeldAdmin"] = new(3.48f, -8.62f), + ["SkeldCamera"] = new(-13.06f, -2.45f), + ["MiraHQAdmin"] = new(21.02f, 19.09f), + ["MiraHQDoorLog"] = new(16.22f, 5.82f), + ["PolusLeftAdmin"] = new(22.80f, -21.52f), + ["PolusRightAdmin"] = new(24.66f, -21.52f), + ["PolusCamera"] = new(2.96f, -12.74f), + ["PolusVital"] = new(26.70f, -15.94f), + ["DleksAdmin"] = new(-3.48f, -8.62f), + ["DleksCamera"] = new(13.06f, -2.45f), + ["AirshipCockpitAdmin"] = new(-22.32f, 0.91f), + ["AirshipRecordsAdmin"] = new(19.89f, 12.60f), + ["AirshipCamera"] = new(8.10f, -9.63f), + ["AirshipVital"] = new(25.24f, -7.94f), + ["FungleCamera"] = new(6.20f, 0.10f), + ["FungleVital"] = new(-2.50f, -9.80f), + ["SubmergedVital"] = new(5f, 32.54f), + ["SubmergedLeftAdmin"] = new(-9.45f, 10.16f), + ["SubmergedRightAdmin"] = new(-7.07f, 10.16f), + ["SubmergedCamera"] = new(-3.41f, -34.56f) + }; + + public static bool DoDisable => Options.DisableDevices.GetBool(); + + public static float UsableDistance => Main.CurrentMap switch + { + MapNames.Skeld => 1.5f, + MapNames.MiraHQ => 2.2f, + MapNames.Polus => 1.4f, + MapNames.Dleks => 1.5f, + MapNames.Airship => 1.6f, + MapNames.Fungle => 1.7f, + _ => 2f + }; + + public static void FixedUpdate() + { + if (!AmongUsClient.Instance.AmHost || ShipStatus.Instance == null || !Utils.GamePastRoleSelection) return; + frame = frame == 5 ? 0 : ++frame; + if (frame != 0) return; + + if (!DoDisable) return; + + foreach (PlayerControl pc in Main.AllPlayerControls) + { + try + { + var doComms = false; + Vector2 PlayerPos = pc.GetTruePosition(); + + if (!Utils.IsActive(SystemTypes.Comms)) + { + switch (Main.NormalOptions.MapId) + { + case 0: + if (Options.DisableSkeldAdmin.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["SkeldAdmin"]) <= UsableDistance; + if (Options.DisableSkeldCamera.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["SkeldCamera"]) <= UsableDistance; + break; + case 1: + if (Options.DisableMiraHQAdmin.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["MiraHQAdmin"]) <= UsableDistance; + if (Options.DisableMiraHQDoorLog.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["MiraHQDoorLog"]) <= UsableDistance; + break; + case 2: + if (Options.DisablePolusAdmin.GetBool()) + { + doComms |= Vector2.Distance(PlayerPos, DevicePos["PolusLeftAdmin"]) <= UsableDistance; + doComms |= Vector2.Distance(PlayerPos, DevicePos["PolusRightAdmin"]) <= UsableDistance; + } + + if (Options.DisablePolusCamera.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["PolusCamera"]) <= UsableDistance; + if (Options.DisablePolusVital.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["PolusVital"]) <= UsableDistance; + break; + case 3: + if (Options.DisableSkeldAdmin.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["DleksAdmin"]) <= UsableDistance; + if (Options.DisableSkeldCamera.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["DleksCamera"]) <= UsableDistance; + break; + case 4: + if (Options.DisableAirshipCockpitAdmin.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["AirshipCockpitAdmin"]) <= UsableDistance; + if (Options.DisableAirshipRecordsAdmin.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["AirshipRecordsAdmin"]) <= UsableDistance; + if (Options.DisableAirshipCamera.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["AirshipCamera"]) <= UsableDistance; + if (Options.DisableAirshipVital.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["AirshipVital"]) <= UsableDistance; + break; + case 5: + if (Options.DisableFungleCamera.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["FungleCamera"]) <= UsableDistance; + if (Options.DisableFungleVital.GetBool()) doComms |= Vector2.Distance(PlayerPos, DevicePos["FungleVital"]) <= UsableDistance; + break; + } + } + + if (doComms && !pc.inVent) + { + if (!DesyncComms.Contains(pc.PlayerId)) + { + DesyncComms.Add(pc.PlayerId); + SendDesyncRepair(pc, SystemTypes.Comms, 128); + } + } + else if (!doComms && DesyncComms.Contains(pc.PlayerId)) + { + DesyncComms.Remove(pc.PlayerId); + SendDesyncRepair(pc, SystemTypes.Comms, 16); + + if (Main.NormalOptions.MapId is 1 or 5) SendDesyncRepair(pc, SystemTypes.Comms, 17); + } + } + catch (Exception ex) { Logger.Exception(ex, "DisableDevice"); } + } + } + public static void SendDesyncRepair(PlayerControl target, SystemTypes systemType, byte amount) + { + if (!AmongUsClient.Instance.AmHost) return; + if (target == null || target.Data == null || target.Data.ClientId == AmongUsClient.Instance.HostId) return; + + MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately( + ShipStatus.Instance.NetId, + (byte)RpcCalls.UpdateSystem, + SendOption.Reliable, + target.Data.ClientId + ); + + writer.Write((byte)systemType); + writer.WritePacked(target.NetId); + writer.Write(amount); + + AmongUsClient.Instance.FinishRpcImmediately(writer); + } +} + +[HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.Start))] +public class RemoveDisableDevicesPatch +{ + public static void Postfix() + { + if (!Options.DisableDevices.GetBool()) return; + + UpdateDisableDevices(); + } + + public static void UpdateDisableDevices() + { + PlayerControl player = PlayerControl.LocalPlayer; + + Il2CppArrayBase admins = Object.FindObjectsOfType(true); + Il2CppArrayBase consoles = Object.FindObjectsOfType(true); + if (admins == null || consoles == null) return; + + switch (Main.NormalOptions.MapId) + { + case 3: + case 0: + if (Options.DisableSkeldAdmin.GetBool()) admins[0].gameObject.GetComponent().enabled = false; + if (Options.DisableSkeldCamera.GetBool()) consoles.DoIf(x => x.name == "SurvConsole", x => x.gameObject.GetComponent().enabled = false); + break; + case 1: + if (Options.DisableMiraHQAdmin.GetBool()) admins[0].gameObject.GetComponent().enabled = false; + if (Options.DisableMiraHQDoorLog.GetBool()) consoles.DoIf(x => x.name == "SurvLogConsole", x => x.gameObject.GetComponent().enabled = false); + + break; + case 2: + if (Options.DisablePolusAdmin.GetBool()) admins.Do(x => x.gameObject.GetComponent().enabled = false); + if (Options.DisablePolusCamera.GetBool()) consoles.DoIf(x => x.name == "Surv_Panel", x => x.gameObject.GetComponent().enabled = false); + if (Options.DisablePolusVital.GetBool()) consoles.DoIf(x => x.name == "panel_vitals", x => x.gameObject.GetComponent().enabled = false); + break; + case 4: + admins.Do(x => + { + if ((Options.DisableAirshipCockpitAdmin.GetBool() && x.name == "panel_cockpit_map") || + (Options.DisableAirshipRecordsAdmin.GetBool() && x.name == "records_admin_map")) + x.gameObject.GetComponent().enabled = false; + }); + + if (Options.DisableAirshipCamera.GetBool()) consoles.DoIf(x => x.name == "task_cams", x => x.gameObject.GetComponent().enabled = false); + if (Options.DisableAirshipVital.GetBool()) consoles.DoIf(x => x.name == "panel_vitals", x => x.gameObject.GetComponent().enabled = false); + break; + case 5: + if (Options.DisableFungleCamera.GetBool()) consoles.DoIf(x => x.name == "BinocularsSecurityConsole", x => x.gameObject.GetComponent().enabled = false); + if (Options.DisableFungleVital.GetBool()) consoles.DoIf(x => x.name == "VitalsConsole", x => x.gameObject.GetComponent().enabled = false); + break; + } + } +} \ No newline at end of file diff --git a/Patches/SabotagePatches.cs b/Patches/SabotagePatches.cs index 457dd14..99cde49 100644 --- a/Patches/SabotagePatches.cs +++ b/Patches/SabotagePatches.cs @@ -9,8 +9,6 @@ public static class SabotageSystemTypeRepairDamagePatch { private static bool Prefix([HarmonyArgument(0)] PlayerControl player, [HarmonyArgument(1)] MessageReader msgReader) { - if (!AmongUsClient.Instance.AmHost) return true; - byte amount; { var newReader = MessageReader.Get(msgReader); @@ -18,12 +16,27 @@ public static class SabotageSystemTypeRepairDamagePatch newReader.Recycle(); } var Sabo = (SystemTypes)amount; - Logger.Info($" {player.Data.PlayerName} is trying to sabotage: {Sabo}", "SabotageCheck"); - if (Options.DisableSabotage.GetBool() || Options.Gamemode.GetValue() == 2) + + if (player.Data.ClientId == AmongUsClient.Instance.HostId) return true; + + if (Options.Gamemode.GetValue() == 0 || Options.Gamemode.GetValue() == 1) { - Logger.Info($" Sabotage {Sabo} by: {player.Data.PlayerName} was blocked", "SabotageCheck"); - return false; + if (Sabo == SystemTypes.LifeSupp && Options.DisableOxygen.GetBool() || Sabo == SystemTypes.Reactor && Options.DisableReactor.GetBool() || Sabo == SystemTypes.Electrical && Options.DisableLights.GetBool() || Sabo == SystemTypes.Comms && Options.DisableComms.GetBool() || Sabo == SystemTypes.HeliSabotage && Options.DisableHeli.GetBool() || Sabo == SystemTypes.MushroomMixupSabotage && Options.DisableMushroomMixup.GetBool()) + { + Logger.Info($" Sabotage {Sabo} by: {player.Data.PlayerName} was blocked", "SabotageCheck"); + return false; + } + return true; + } + if (Options.Gamemode.GetValue() == 2) + { + if (Sabo == SystemTypes.LifeSupp && Options.SNSDisableOxygen.GetBool() || Sabo == SystemTypes.Reactor && Options.SNSDisableReactor.GetBool() || Sabo == SystemTypes.Electrical && Options.SNSDisableLights.GetBool() || Sabo == SystemTypes.Comms && Options.SNSDisableComms.GetBool() || Sabo == SystemTypes.HeliSabotage && Options.SNSDisableHeli.GetBool() || Sabo == SystemTypes.MushroomMixupSabotage && Options.SNSDisableMushroomMixup.GetBool()) + { + Logger.Info($" Sabotage {Sabo} by: {player.Data.PlayerName} was blocked", "SnSSabotageCheck"); + return false; + } + return true; } else return true; } @@ -60,6 +73,8 @@ public static class MessageReaderUpdateSystemPatch or SystemTypes.Decontamination3 or SystemTypes.MedBay) return true; + if (player.Data.ClientId == AmongUsClient.Instance.HostId) return true; + var amount = MessageReader.Get(reader).ReadByte(); if (EACR.RpcUpdateSystemCheck(player, systemType, amount)) {