diff --git a/NewMod/Buttons/Overload/OverloadButton.cs b/NewMod/Buttons/Overload/OverloadButton.cs index c4266e2..c2352ce 100644 --- a/NewMod/Buttons/Overload/OverloadButton.cs +++ b/NewMod/Buttons/Overload/OverloadButton.cs @@ -96,7 +96,7 @@ public void Absorb(CustomActionButton target) absorbedCooldown = target.Cooldown; absorbedMaxUses = target.MaxUses; absorbedSprite = target.Sprite; - absorbedKeybind = target.Keybind; + absorbedKeybind = (MiraKeybind)target.Keybind; absorbedOnClick = () => target.GetType().GetMethod("OnClick", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) ?.Invoke(target, null); diff --git a/NewMod/Components/Toast.cs b/NewMod/Components/Toast.cs index e677f36..3ca52eb 100644 --- a/NewMod/Components/Toast.cs +++ b/NewMod/Components/Toast.cs @@ -5,6 +5,7 @@ using UnityEngine; using Reactor.Utilities.Attributes; using NewMod; +using Il2CppInterop.Runtime.Attributes; [RegisterInIl2Cpp] public class Toast(IntPtr ptr) : MonoBehaviour(ptr) @@ -39,6 +40,8 @@ public void ShowToast(string title, string text, Color color, float displayDurat Coroutines.Start(CoAnimateToast(displayDuration)); } + + [HideFromIl2Cpp] public IEnumerator CoAnimateToast(float duration) { Vector3 visiblePos = new Vector3(-0.0527f, 2.7741f, 0f); diff --git a/NewMod/DebugWindow.cs b/NewMod/DebugWindow.cs index 2e191a4..8bf96cb 100644 --- a/NewMod/DebugWindow.cs +++ b/NewMod/DebugWindow.cs @@ -104,7 +104,8 @@ private static bool AllowDebug() } if (GUILayout.Button("Show Toast") && LobbyBehaviour.Instance) { - Toast.CreateToast().ShowToast(string.Empty, "NewMod v1.2.6", Color.red, 5f); + var toast = Toast.CreateToast(); + toast.ShowToast(string.Empty, "NewMod v1.2.6", Color.red, 5f); } /*if (GUILayout.Button("Spawn General NPC") && allow) { diff --git a/NewMod/LocalSettings/NewModLocalSettings.cs b/NewMod/LocalSettings/NewModLocalSettings.cs new file mode 100644 index 0000000..387378d --- /dev/null +++ b/NewMod/LocalSettings/NewModLocalSettings.cs @@ -0,0 +1,36 @@ +using BepInEx.Configuration; +using MiraAPI.LocalSettings; +using MiraAPI.LocalSettings.Attributes; +using UnityEngine; + +namespace NewMod.LocalSettings +{ + public class NewModLocalSettings(ConfigFile config) : LocalSettingsTab(config) + { + public override string TabName => "NewMod"; + public override LocalSettingTabAppearance TabAppearance { get; } = new() + { + TabButtonColor = Color.cyan, + TabButtonHoverColor = Color.magenta, + TabIcon = NewModAsset.NMIcon, + }; + + [LocalSliderSetting("Frame Rate Limit", min: 30f, max: 240f, "Lock your framerate (FPS)", displayValue: true, formatString: "0", roundValue: true)] + public ConfigEntry FrameRateLimit { get; } = config.Bind( + "Performance", + "FrameRateLimit", + 165f, + "Frames per second limit" + ); + + public override void OnOptionChanged(ConfigEntryBase configEntry) + { + base.OnOptionChanged(configEntry); + + if (configEntry == FrameRateLimit) + { + Application.targetFrameRate = (int)FrameRateLimit.Value; + } + } + } +} \ No newline at end of file diff --git a/NewMod/Modifiers/AdrenalineModifier.cs b/NewMod/Modifiers/AdrenalineModifier.cs new file mode 100644 index 0000000..18a71ee --- /dev/null +++ b/NewMod/Modifiers/AdrenalineModifier.cs @@ -0,0 +1,30 @@ +using MiraAPI.Modifiers.Types; +using MiraAPI.GameOptions; +using NewMod.Options.Modifiers; +using NewMod.Options; + +namespace NewMod.Modifiers +{ + public class AdrenalineModifier : GameModifier + { + public override string ModifierName => "Adrenaline"; + public override bool HideOnUi => false; + public override int GetAssignmentChance() => (int)OptionGroupSingleton.Instance.AdrenalineChance.Value; + public override int GetAmountPerGame() => (int)OptionGroupSingleton.Instance.AdrenalineAmount; + + public override void OnActivate() + { + Player.MyPhysics.Speed *= OptionGroupSingleton.Instance.SpeedMultiplier; + } + + public override void OnDeactivate() + { + Player.MyPhysics.Speed /= OptionGroupSingleton.Instance.SpeedMultiplier; + } + + public override void OnDeath(DeathReason reason) + { + Player.MyPhysics.Speed /= OptionGroupSingleton.Instance.SpeedMultiplier; + } + } +} diff --git a/NewMod/Modifiers/DrowsyModifier.cs b/NewMod/Modifiers/DrowsyModifier.cs new file mode 100644 index 0000000..c48b1b7 --- /dev/null +++ b/NewMod/Modifiers/DrowsyModifier.cs @@ -0,0 +1,38 @@ +using MiraAPI.GameOptions; +using MiraAPI.Modifiers; +using MiraAPI.Modifiers.Types; +using MiraAPI.Utilities; +using NewMod.Options; +using NewMod.Options.Modifiers; +using UnityEngine; + +namespace NewMod.Modifiers +{ + public sealed class DrowsyModifier : GameModifier + { + public override string ModifierName => "Drowsy"; + public override bool ShowInFreeplay => true; + public override Color FreeplayFileColor => new(0.6f, 0.7f, 1f); + public override string GetDescription() => + $"Move slower (x{OptionGroupSingleton.Instance.DrowsyAmount:0.##})."; + + public override int GetAssignmentChance() => (int)OptionGroupSingleton.Instance.DrowsyChance.Value; + + public override int GetAmountPerGame() => (int)OptionGroupSingleton.Instance.DrowsyAmount; + + public override void OnActivate() + { + Player.MyPhysics.Speed *= OptionGroupSingleton.Instance.SpeedMultiplier; + } + + public override void OnDeactivate() + { + Player.MyPhysics.Speed /= OptionGroupSingleton.Instance.SpeedMultiplier; + } + + public override void OnDeath(DeathReason reason) + { + Player.MyPhysics.Speed /= OptionGroupSingleton.Instance.SpeedMultiplier; + } + } +} diff --git a/NewMod/Modifiers/FalseFormModifier.cs b/NewMod/Modifiers/FalseFormModifier.cs index b53b664..860d1bf 100644 --- a/NewMod/Modifiers/FalseFormModifier.cs +++ b/NewMod/Modifiers/FalseFormModifier.cs @@ -1,21 +1,27 @@ using MiraAPI.GameOptions; using MiraAPI.Modifiers.Types; using MiraAPI.Utilities; +using NewMod.Options; using NewMod.Options.Modifiers; using UnityEngine; namespace NewMod.Modifiers { - public class FalseFormModifier : TimedModifier + public class FalseFormModifier : GameModifier { public override string ModifierName => "FalseForm"; - public override bool AutoStart => OptionGroupSingleton.Instance.EnableModifier; - public override float Duration => (int)OptionGroupSingleton.Instance.FalseFormDuration; public override bool ShowInFreeplay => true; public override bool HideOnUi => false; - public override bool RemoveOnComplete => true; private float timer; private AppearanceBackup oldAppearance; + public override int GetAssignmentChance() + { + return OptionGroupSingleton.Instance.FalseFormChance; + } + public override int GetAmountPerGame() + { + return (int)OptionGroupSingleton.Instance.FalseFormAmount; + } public override void OnActivate() { oldAppearance = new AppearanceBackup diff --git a/NewMod/Modifiers/StickyModifier.cs b/NewMod/Modifiers/StickyModifier.cs index 3e4ce12..ab721ff 100644 --- a/NewMod/Modifiers/StickyModifier.cs +++ b/NewMod/Modifiers/StickyModifier.cs @@ -2,21 +2,27 @@ using System.Collections.Generic; using MiraAPI.GameOptions; using MiraAPI.Modifiers.Types; +using NewMod.Options; using NewMod.Options.Modifiers; using Reactor.Utilities; using UnityEngine; namespace NewMod.Modifiers { - public class StickyModifier : TimedModifier + public class StickyModifier : GameModifier { public override string ModifierName => "Sticky"; - public override bool AutoStart => OptionGroupSingleton.Instance.EnableModifier; - public override float Duration => (int)OptionGroupSingleton.Instance.StickyDuration; public override bool HideOnUi => false; public override bool ShowInFreeplay => true; - public override bool RemoveOnComplete => true; - public static List linkedPlayers = new(); + public static List linkedPlayers = []; + public override int GetAmountPerGame() + { + return (int)OptionGroupSingleton.Instance.StickyAmount; + } + public override int GetAssignmentChance() + { + return OptionGroupSingleton.Instance.StickyChance; + } public override bool? CanVent() { return Player.Data.Role.CanVent; @@ -49,8 +55,6 @@ public override void FixedUpdate() } public IEnumerator CoFollowStickyPlayer(PlayerControl player) { - float duration = Duration; - var info = new StickyState { StickyOwner = Player, @@ -59,7 +63,7 @@ public IEnumerator CoFollowStickyPlayer(PlayerControl player) }; yield return HudManager.Instance.StartCoroutine( - Effects.Overlerp(duration, new System.Action((t) => + Effects.Overlerp(0.5f, new System.Action((t) => { Vector3 targetPos = info.LinkedPlayer.transform.position; Vector3 currentPos = info.StickyOwner.transform.position; diff --git a/NewMod/NewMod.cs b/NewMod/NewMod.cs index 911fb68..15c6060 100644 --- a/NewMod/NewMod.cs +++ b/NewMod/NewMod.cs @@ -24,6 +24,7 @@ using MiraAPI.Events; using NewMod.Patches.Compatibility; using NewMod.Buttons.Overload; +using MiraAPI.LocalSettings; namespace NewMod; @@ -36,11 +37,11 @@ namespace NewMod; public partial class NewMod : BasePlugin, IMiraPlugin { public const string Id = "com.callofcreator.newmod"; - public const string ModVersion = "1.2.6"; + public const string ModVersion = "1.2.7"; public Harmony Harmony { get; } = new Harmony(Id); public static BasePlugin Instance; public static Minigame minigame; - public const string SupportedAmongUsVersion = "2025.6.10"; + public const string SupportedAmongUsVersion = "2025.9.9"; public static ConfigEntry ShouldEnableBepInExConsole { get; set; } public ConfigFile GetConfigFile() => Config; public string OptionsTitleText => "NewMod"; @@ -58,9 +59,10 @@ public override void Load() Harmony.PatchAll(typeof(LaunchpadCompatibility)); Harmony.PatchAll(typeof(LaunchpadHackTextPatch)); } - ShouldEnableBepInExConsole = Config.Bind("NewMod", "Console", false, "Whether to enable BepInEx Console for debugging"); + ShouldEnableBepInExConsole = Config.Bind("NewMod", "Console", true, "Whether to enable BepInEx Console for debugging"); if (!ShouldEnableBepInExConsole.Value) ConsoleManager.DetachConsole(); - Instance.Log.LogMessage($"Loaded Successfully NewMod v{ModVersion} With MiraAPI Version : {MiraApiPlugin.Version} with ID : {MiraApiPlugin.Id}"); + + Instance.Log.LogMessage($"Loaded Successfully NewMod v{ModVersion} With MiraAPI Version : {MiraApiPlugin.Version}"); } public static void CheckVersionCompatibility() { diff --git a/NewMod/NewMod.csproj b/NewMod/NewMod.csproj index 5d8245a..fcfa021 100644 --- a/NewMod/NewMod.csproj +++ b/NewMod/NewMod.csproj @@ -1,6 +1,6 @@ - 1.2.6 + 1.2.7 dev NewMod is a mod for Among Us that introduces a variety of new roles, unique abilities CallofCreator @@ -21,8 +21,8 @@ - - + + diff --git a/NewMod/NewModAsset.cs b/NewMod/NewModAsset.cs index 33cef04..2636ef6 100644 --- a/NewMod/NewModAsset.cs +++ b/NewMod/NewModAsset.cs @@ -14,6 +14,7 @@ public static class NewModAsset public static LoadableResourceAsset Banner { get; } = new("NewMod.Resources.optionImage.png"); public static LoadableResourceAsset Arrow { get; } = new("NewMod.Resources.Arrow.png"); public static LoadableResourceAsset ModLogo { get; } = new("NewMod.Resources.Logo.png"); + public static LoadableResourceAsset NMIcon { get; } = new("NewMod.Resources.nm.png"); public static LoadableResourceAsset CustomCursor { get; } = new("NewMod.Resources.cursor.png"); public static LoadableAsset Toast { get; } = new LoadableBundleAsset("Toast", Bundle); public static LoadableAsset SlashTray { get; } = new LoadableBundleAsset("SlashTray", Bundle); diff --git a/NewMod/Options/Modifiers/AdrenalineModifierOptions.cs b/NewMod/Options/Modifiers/AdrenalineModifierOptions.cs new file mode 100644 index 0000000..db93825 --- /dev/null +++ b/NewMod/Options/Modifiers/AdrenalineModifierOptions.cs @@ -0,0 +1,16 @@ +using MiraAPI.GameOptions; +using MiraAPI.Utilities; +using MiraAPI.GameOptions.Attributes; +using MiraAPI.GameOptions.OptionTypes; +using NewMod.Modifiers; + +namespace NewMod.Options.Modifiers +{ + public class AdrenalineModifierOptions : AbstractOptionGroup + { + public override string GroupName => "Adrenaline Settings"; + + [ModdedNumberOption("Speed Multiplier", min: 1.1f, max: 3f, increment: 0.1f, MiraNumberSuffixes.Multiplier)] + public float SpeedMultiplier { get; set; } = 1.5f; + } +} diff --git a/NewMod/Options/Modifiers/DrowsyModifierOptions.cs b/NewMod/Options/Modifiers/DrowsyModifierOptions.cs new file mode 100644 index 0000000..7391a13 --- /dev/null +++ b/NewMod/Options/Modifiers/DrowsyModifierOptions.cs @@ -0,0 +1,16 @@ +using MiraAPI.GameOptions; +using MiraAPI.Utilities; +using MiraAPI.GameOptions.Attributes; +using MiraAPI.GameOptions.OptionTypes; +using NewMod.Modifiers; + +namespace NewMod.Options.Modifiers +{ + public class DrowsyModifierOptions : AbstractOptionGroup + { + public override string GroupName => "Drowsy Settings"; + + [ModdedNumberOption("Speed Multiplier", min: 0.2f, max: 0.9f, increment: 0.05f, MiraNumberSuffixes.Multiplier)] + public float SpeedMultiplier { get; set; } = 0.5f; + } +} diff --git a/NewMod/Options/Modifiers/FalseFormModifierOptions.cs b/NewMod/Options/Modifiers/FalseFormModifierOptions.cs index 78bab9f..869b71e 100644 --- a/NewMod/Options/Modifiers/FalseFormModifierOptions.cs +++ b/NewMod/Options/Modifiers/FalseFormModifierOptions.cs @@ -8,7 +8,6 @@ namespace NewMod.Options.Modifiers public class FalseFormModifierOptions : AbstractOptionGroup { public override string GroupName => "FalseForm Settings"; - public ModdedToggleOption EnableModifier { get; } = new("Enable FalseForm", true); public ModdedNumberOption FalseFormDuration { get; } = new( "Duration of the FalseForm effect", diff --git a/NewMod/Options/Modifiers/StickyModifierOptions.cs b/NewMod/Options/Modifiers/StickyModifierOptions.cs index e0410b4..3654ec5 100644 --- a/NewMod/Options/Modifiers/StickyModifierOptions.cs +++ b/NewMod/Options/Modifiers/StickyModifierOptions.cs @@ -8,7 +8,6 @@ namespace NewMod.Options.Modifiers public class StickyModifierOptions : AbstractOptionGroup { public override string GroupName => "Sticky Settings"; - public ModdedToggleOption EnableModifier { get; } = new("Enable StickyModifier", true); public ModdedNumberOption StickyDuration { get; } = new( "Duration of Sticky Effect", diff --git a/NewMod/Options/ModifiersOptions.cs b/NewMod/Options/ModifiersOptions.cs new file mode 100644 index 0000000..f4aae1f --- /dev/null +++ b/NewMod/Options/ModifiersOptions.cs @@ -0,0 +1,47 @@ +using MiraAPI.GameOptions; +using MiraAPI.GameOptions.Attributes; +using MiraAPI.GameOptions.OptionTypes; +using MiraAPI.Utilities; +using UnityEngine; + +namespace NewMod.Options; + +public class ModifiersOptions : AbstractOptionGroup +{ + public override string GroupName => "Modifiers Settings"; + public override Color GroupColor => Color.blue; + public override bool ShowInModifiersMenu => true; + + [ModdedNumberOption("Sticky Amount", min:0f, max:6)] + public float StickyAmount { get; set; } = 10f; + + public ModdedNumberOption StickyChance { get; } = new("Sticky Chance", 50f, 0, 100f, 10f, MiraNumberSuffixes.Percent) + { + Visible = () => OptionGroupSingleton.Instance.StickyAmount > 0 + }; + + [ModdedNumberOption("FalseForm Amount", min:0, max:6)] + public float FalseFormAmount { get; set; } = 10f; + + public ModdedNumberOption FalseFormChance { get; } = new("FalseForm Chance", 50f, 0, 100f, 10f, MiraNumberSuffixes.Percent) + { + Visible = () => OptionGroupSingleton.Instance.FalseFormAmount > 0 + }; + + [ModdedNumberOption("Drowsy Amount", min:0f, max:6f)] + public float DrowsyAmount { get; set; } = 10f; + + public ModdedNumberOption DrowsyChance { get; } =new("Drowsy Chance", 50f, 0, 100f, 10f, MiraNumberSuffixes.Percent) + { + Visible = () => OptionGroupSingleton.Instance.DrowsyAmount > 0f + }; + + [ModdedNumberOption("Adrenaline Amount", min:0f, max:6f)] + public float AdrenalineAmount { get; set; } = 10f; + + public ModdedNumberOption AdrenalineChance { get; } =new("Adrenaline Chance", 50f, 0, 100f, 10f, MiraNumberSuffixes.Percent) + { + Visible = () => OptionGroupSingleton.Instance.AdrenalineAmount > 0f + }; + +} \ No newline at end of file diff --git a/NewMod/Resources/nm.png b/NewMod/Resources/nm.png new file mode 100644 index 0000000..45f2fe2 Binary files /dev/null and b/NewMod/Resources/nm.png differ diff --git a/NewMod/Utilities/PranksterUtilities.cs b/NewMod/Utilities/PranksterUtilities.cs index ba8877a..e6787c6 100644 --- a/NewMod/Utilities/PranksterUtilities.cs +++ b/NewMod/Utilities/PranksterUtilities.cs @@ -1,8 +1,6 @@ -using System.Linq; using UnityEngine; using System.Collections.Generic; using Reactor.Networking.Attributes; -using MiraAPI.Utilities; namespace NewMod.Utilities { @@ -25,7 +23,7 @@ public static void CreatePranksterDeadBody(PlayerControl player, byte parentId) { NewMod.Instance.Log.LogError("[PranksterUtilities] CreatePranksterDeadBody: Failed to create dead body, random player is null."); } - var deadBody = Object.Instantiate(GameManager.Instance.DeadBodyPrefab); + var deadBody = Object.Instantiate(GameManager.Instance.deadBodyPrefab[0]); deadBody.name = PranksterBodyName; deadBody.ParentId = parentId; diff --git a/libs/Android/AmongUs.GameLibs.Android.2025.6.10.nupkg b/libs/Android/AmongUs.GameLibs.Android.2025.9.9.nupkg similarity index 58% rename from libs/Android/AmongUs.GameLibs.Android.2025.6.10.nupkg rename to libs/Android/AmongUs.GameLibs.Android.2025.9.9.nupkg index 7c62209..d09ec17 100644 Binary files a/libs/Android/AmongUs.GameLibs.Android.2025.6.10.nupkg and b/libs/Android/AmongUs.GameLibs.Android.2025.9.9.nupkg differ diff --git a/libs/MiraAPI.dll b/libs/MiraAPI.dll index 1a553d5..d47ce6f 100644 Binary files a/libs/MiraAPI.dll and b/libs/MiraAPI.dll differ