From 4963c80395e465012d42e6e5be77fdc86faf0c59 Mon Sep 17 00:00:00 2001 From: ang-xd Date: Tue, 27 Aug 2024 20:56:53 -0400 Subject: [PATCH] Fixes and new stuff --- MiraAPI.Example/Buttons/ExampleButton.cs | 29 ------------ .../FreezeButton.cs} | 22 +++++---- MiraAPI.Example/Buttons/MeetingButton.cs | 47 +++++++++++++++++++ .../Buttons/Teleporter/TeleportButton.cs | 18 +++---- ...eModifierExample.cs => CaptainModifier.cs} | 10 +--- .../Modifiers/Freezer/FreezeModifier.cs | 30 ++++++++++++ .../Modifiers/ModifierTimerExample.cs | 21 --------- .../Options/Roles/CustomRole2Settings.cs | 2 +- .../Options/Roles/CustomRoleSettings.cs | 16 ------- .../Options/Roles/TeleporterOptions.cs | 23 +++++++++ MiraAPI.Example/Roles/CustomRole2.cs | 17 ------- MiraAPI.Example/Roles/FreezerRole.cs | 17 +++++++ .../{CustomRole.cs => TeleporterRole.cs} | 4 +- MiraAPI/Modifiers/ModifierManager.cs | 2 +- MiraAPI/Modifiers/Types/TimedModifier.cs | 6 +++ 15 files changed, 152 insertions(+), 112 deletions(-) delete mode 100644 MiraAPI.Example/Buttons/ExampleButton.cs rename MiraAPI.Example/Buttons/{ExampleTargetButton.cs => Freezer/FreezeButton.cs} (59%) create mode 100644 MiraAPI.Example/Buttons/MeetingButton.cs rename MiraAPI.Example/Modifiers/{GameModifierExample.cs => CaptainModifier.cs} (59%) create mode 100644 MiraAPI.Example/Modifiers/Freezer/FreezeModifier.cs delete mode 100644 MiraAPI.Example/Modifiers/ModifierTimerExample.cs delete mode 100644 MiraAPI.Example/Options/Roles/CustomRoleSettings.cs create mode 100644 MiraAPI.Example/Options/Roles/TeleporterOptions.cs delete mode 100644 MiraAPI.Example/Roles/CustomRole2.cs create mode 100644 MiraAPI.Example/Roles/FreezerRole.cs rename MiraAPI.Example/Roles/{CustomRole.cs => TeleporterRole.cs} (79%) diff --git a/MiraAPI.Example/Buttons/ExampleButton.cs b/MiraAPI.Example/Buttons/ExampleButton.cs deleted file mode 100644 index 4c9c7d6..0000000 --- a/MiraAPI.Example/Buttons/ExampleButton.cs +++ /dev/null @@ -1,29 +0,0 @@ -using MiraAPI.Example.Modifiers; -using MiraAPI.Hud; -using MiraAPI.Utilities; -using MiraAPI.Utilities.Assets; -using Reactor.Utilities; -using UnityEngine; - -namespace MiraAPI.Example.Buttons; - -[RegisterButton] -public class ExampleButton : CustomActionButton -{ - public override string Name => "Example Button"; - public override float Cooldown => 5f; - public override float EffectDuration => 0f; - public override int MaxUses => 5; - public override LoadableAsset Sprite => ExampleAssets.ExampleButton; - public override ButtonLocation Location => ButtonLocation.BottomRight; - - protected override void OnClick() - { - Logger.Info("Example button clicked!"); - } - - public override bool Enabled(RoleBehaviour role) - { - return PlayerControl.LocalPlayer.HasModifier(); - } -} \ No newline at end of file diff --git a/MiraAPI.Example/Buttons/ExampleTargetButton.cs b/MiraAPI.Example/Buttons/Freezer/FreezeButton.cs similarity index 59% rename from MiraAPI.Example/Buttons/ExampleTargetButton.cs rename to MiraAPI.Example/Buttons/Freezer/FreezeButton.cs index aa36854..c04d4a4 100644 --- a/MiraAPI.Example/Buttons/ExampleTargetButton.cs +++ b/MiraAPI.Example/Buttons/Freezer/FreezeButton.cs @@ -1,20 +1,24 @@ -using MiraAPI.Hud; +using MiraAPI.Example.Modifiers.Freezer; +using MiraAPI.Example.Roles; +using MiraAPI.Hud; +using MiraAPI.Utilities; using MiraAPI.Utilities.Assets; using UnityEngine; -namespace MiraAPI.Example.Buttons; +namespace MiraAPI.Example.Buttons.Freezer; -public class ExampleTargetButton : CustomActionButton +[RegisterButton] +public class FreezeButton : CustomActionButton { - public override string Name => "Shoot"; - public override float Cooldown => 0f; + public override string Name => "Freeze"; + public override float Cooldown => 5f; public override float EffectDuration => 0f; public override int MaxUses => 0; public override LoadableAsset Sprite => ExampleAssets.ExampleButton; protected override void OnClick() { - PlayerControl.LocalPlayer.CmdCheckMurder(Target); + Target.AddModifier(); } public override PlayerControl GetTarget() @@ -24,17 +28,17 @@ public class ExampleTargetButton : CustomActionButton public override void SetOutline(bool active) { - Target?.cosmetics.SetOutline(active, new Il2CppSystem.Nullable(Color.red)); + Target?.cosmetics.SetOutline(active, new Il2CppSystem.Nullable(Palette.Blue)); } public override bool IsTargetValid(PlayerControl target) { - return PlayerControl.LocalPlayer.Data.Role.IsValidTarget(target.Data); + return true; } public override bool Enabled(RoleBehaviour role) { - return role.IsImpostor; + return role is FreezerRole; } } \ No newline at end of file diff --git a/MiraAPI.Example/Buttons/MeetingButton.cs b/MiraAPI.Example/Buttons/MeetingButton.cs new file mode 100644 index 0000000..c7f202d --- /dev/null +++ b/MiraAPI.Example/Buttons/MeetingButton.cs @@ -0,0 +1,47 @@ +using MiraAPI.Example; +using MiraAPI.Example.Modifiers; +using MiraAPI.Hud; +using MiraAPI.Utilities; +using MiraAPI.Utilities.Assets; +using UnityEngine; + +[RegisterButton] +public class MeetingButton : CustomActionButton +{ + public override string Name => "Call Meeting"; + + public override float Cooldown => 15; + + public override float EffectDuration => 0; + + public override int MaxUses => 3; + + public override LoadableAsset Sprite => ExampleAssets.ExampleButton; + + public override bool Enabled(RoleBehaviour role) + { + return PlayerControl.LocalPlayer.HasModifier(); + } + + protected override void OnClick() + { + var bt = ShipStatus.Instance.EmergencyButton; + + PlayerControl.LocalPlayer.NetTransform.Halt(); + var minigame = Object.Instantiate(bt.MinigamePrefab, Camera.main!.transform, false); + + var taskAdderGame = minigame as TaskAdderGame; + if (taskAdderGame != null) + { + taskAdderGame.SafePositionWorld = bt.SafePositionLocal + (Vector2)bt.transform.position; + } + + minigame.transform.localPosition = new Vector3(0f, 0f, -50f); + minigame.Begin(null); + + if (UsesLeft == 0 && PlayerControl.LocalPlayer.HasModifier()) + { + PlayerControl.LocalPlayer.RemoveModifier(); + } + } +} diff --git a/MiraAPI.Example/Buttons/Teleporter/TeleportButton.cs b/MiraAPI.Example/Buttons/Teleporter/TeleportButton.cs index 950af26..a860d36 100644 --- a/MiraAPI.Example/Buttons/Teleporter/TeleportButton.cs +++ b/MiraAPI.Example/Buttons/Teleporter/TeleportButton.cs @@ -1,4 +1,6 @@ -using MiraAPI.Example.Roles; +using MiraAPI.Example.Options.Roles; +using MiraAPI.Example.Roles; +using MiraAPI.GameOptions; using MiraAPI.Hud; using MiraAPI.Utilities.Assets; using Reactor.Utilities; @@ -11,9 +13,9 @@ public class TeleportButton : CustomActionButton { public override string Name => "Teleport"; - public override float Cooldown => 3; + public override float Cooldown => OptionGroupSingleton.Instance.TeleportCooldown; - public override float EffectDuration => 10; + public override float EffectDuration => OptionGroupSingleton.Instance.TeleportDuration; public override int MaxUses => 0; @@ -22,7 +24,7 @@ public class TeleportButton : CustomActionButton public override bool Enabled(RoleBehaviour role) { - return role is CustomRole; + return role is TeleporterRole; } protected override void OnClick() { @@ -38,12 +40,12 @@ public class TeleportButton : CustomActionButton { base.FixedUpdate(playerControl); - if (!HasEffect) return; // this doesnt work... + if (!EffectActive) return; - if (Input.GetKeyDown(KeyCode.Mouse0)) + if (Input.GetKey(KeyCode.Mouse0)) { playerControl.NetTransform.RpcSnapTo(Camera.main.ScreenToWorldPoint(Input.mousePosition)); - OnEffectEnd(); + ResetCooldown(); } } @@ -51,7 +53,7 @@ public class TeleportButton : CustomActionButton { HudManager.Instance.ShadowQuad.gameObject.SetActive(false); IsZoom = true; - var zoomDistance = 6; + var zoomDistance = OptionGroupSingleton.Instance.ZoomDistance; for (var ft = Camera.main!.orthographicSize; ft < zoomDistance; ft += 0.3f) { Camera.main.orthographicSize = MeetingHud.Instance ? 3f : ft; diff --git a/MiraAPI.Example/Modifiers/GameModifierExample.cs b/MiraAPI.Example/Modifiers/CaptainModifier.cs similarity index 59% rename from MiraAPI.Example/Modifiers/GameModifierExample.cs rename to MiraAPI.Example/Modifiers/CaptainModifier.cs index 2b491ae..80d9224 100644 --- a/MiraAPI.Example/Modifiers/GameModifierExample.cs +++ b/MiraAPI.Example/Modifiers/CaptainModifier.cs @@ -4,15 +4,9 @@ using MiraAPI.Modifiers.Types; namespace MiraAPI.Example.Modifiers; [RegisterModifier] -public class GameModifierExample : GameModifier +public class CaptainModifier : GameModifier { - public override string ModifierName => "Example Game Modifier"; - - public override bool CanVent() - { - return true; - } - + public override string ModifierName => "Captain"; public override int GetAmountPerGame() { return 1; diff --git a/MiraAPI.Example/Modifiers/Freezer/FreezeModifier.cs b/MiraAPI.Example/Modifiers/Freezer/FreezeModifier.cs new file mode 100644 index 0000000..d112406 --- /dev/null +++ b/MiraAPI.Example/Modifiers/Freezer/FreezeModifier.cs @@ -0,0 +1,30 @@ +using MiraAPI.Modifiers; +using MiraAPI.Modifiers.Types; + +namespace MiraAPI.Example.Modifiers.Freezer; + +[RegisterModifier] +public class FreezeModifier : TimedModifier +{ + public override string ModifierName => "Freezed"; + public override bool HideOnUi => false; + public override float Duration => 15f; + public override bool AutoStart => true; + public override bool RemoveOnComplete => true; + + public override void OnActivate() + { + if (Player.AmOwner) + { + Player.moveable = false; + } + } + + public override void OnTimerComplete() + { + if (Player.AmOwner) + { + Player.moveable = true; + } + } +} diff --git a/MiraAPI.Example/Modifiers/ModifierTimerExample.cs b/MiraAPI.Example/Modifiers/ModifierTimerExample.cs deleted file mode 100644 index 3b7e1fd..0000000 --- a/MiraAPI.Example/Modifiers/ModifierTimerExample.cs +++ /dev/null @@ -1,21 +0,0 @@ -using MiraAPI.Modifiers; -using MiraAPI.Modifiers.Types; - -namespace MiraAPI.Example.Modifiers; - -[RegisterModifier] -public class ModifierTimerExample : TimedModifier -{ - public override string ModifierName => "Color Changer"; - public override bool HideOnUi => false; - public override float Duration => 10f; - public override bool AutoStart => true; - - private readonly System.Random _rand = new(); - - public override void OnTimerComplete() - { - Player.RpcSetColor((byte)_rand.Next(0, Palette.PlayerColors.Count)); - StartTimer(); - } -} diff --git a/MiraAPI.Example/Options/Roles/CustomRole2Settings.cs b/MiraAPI.Example/Options/Roles/CustomRole2Settings.cs index 9745035..e10931b 100644 --- a/MiraAPI.Example/Options/Roles/CustomRole2Settings.cs +++ b/MiraAPI.Example/Options/Roles/CustomRole2Settings.cs @@ -9,7 +9,7 @@ public class CustomRole2Settings : AbstractOptionGroup { public override string GroupName => "Custom Role"; - public override Type AdvancedRole => typeof(CustomRole2); + public override Type AdvancedRole => typeof(FreezerRole); [ModdedToggleOption("Teleportation ability")] public bool Teleport { get; set; } = true; diff --git a/MiraAPI.Example/Options/Roles/CustomRoleSettings.cs b/MiraAPI.Example/Options/Roles/CustomRoleSettings.cs deleted file mode 100644 index e2ca4a6..0000000 --- a/MiraAPI.Example/Options/Roles/CustomRoleSettings.cs +++ /dev/null @@ -1,16 +0,0 @@ -using MiraAPI.Example.Roles; -using MiraAPI.GameOptions; -using MiraAPI.GameOptions.Attributes; -using System; - -namespace MiraAPI.Example.Options.Roles; - -public class CustomRoleSettings : AbstractOptionGroup -{ - public override string GroupName => "Custom Role"; - - public override Type AdvancedRole => typeof(CustomRole); - - [ModdedNumberOption("Number Opt", min: 3, max: 9)] public float NumberOpt { get; set; } = 4; - -} \ No newline at end of file diff --git a/MiraAPI.Example/Options/Roles/TeleporterOptions.cs b/MiraAPI.Example/Options/Roles/TeleporterOptions.cs new file mode 100644 index 0000000..3e51e33 --- /dev/null +++ b/MiraAPI.Example/Options/Roles/TeleporterOptions.cs @@ -0,0 +1,23 @@ +using MiraAPI.Example.Roles; +using MiraAPI.GameOptions; +using MiraAPI.GameOptions.Attributes; +using MiraAPI.Utilities; +using System; + +namespace MiraAPI.Example.Options.Roles; + +public class TeleporterOptions : AbstractOptionGroup +{ + public override string GroupName => "Teleporter"; + + public override Type AdvancedRole => typeof(TeleporterRole); + + [ModdedNumberOption("Teleport Cooldown", 5, 60, 2.5f, MiraNumberSuffixes.Seconds)] + public float TeleportCooldown { get; set; } = 5; + + [ModdedNumberOption("Teleport Duration", 5, 25, 1, MiraNumberSuffixes.Seconds)] + public float TeleportDuration { get; set; } = 10; + + [ModdedNumberOption("Zoom Distance", 4, 15)] + public float ZoomDistance { get; set; } = 6; +} \ No newline at end of file diff --git a/MiraAPI.Example/Roles/CustomRole2.cs b/MiraAPI.Example/Roles/CustomRole2.cs deleted file mode 100644 index ce0650d..0000000 --- a/MiraAPI.Example/Roles/CustomRole2.cs +++ /dev/null @@ -1,17 +0,0 @@ -using MiraAPI.Roles; -using MiraAPI.Utilities.Assets; -using UnityEngine; - -namespace MiraAPI.Example.Roles; - -[RegisterCustomRole] -public class CustomRole2 : CrewmateRole, ICustomRole -{ - public string RoleName => "Custom Role 2"; - public string RoleLongDescription => "Save everyone from dying!"; - public string RoleDescription => RoleLongDescription; - public Color RoleColor => Palette.AcceptedGreen; - public ModdedRoleTeams Team => ModdedRoleTeams.Crewmate; - public LoadableAsset OptionsScreenshot => ExampleAssets.Banner; - -} \ No newline at end of file diff --git a/MiraAPI.Example/Roles/FreezerRole.cs b/MiraAPI.Example/Roles/FreezerRole.cs new file mode 100644 index 0000000..7415dd6 --- /dev/null +++ b/MiraAPI.Example/Roles/FreezerRole.cs @@ -0,0 +1,17 @@ +using MiraAPI.Roles; +using MiraAPI.Utilities.Assets; +using UnityEngine; + +namespace MiraAPI.Example.Roles; + +[RegisterCustomRole] +public class FreezerRole : ImpostorRole, ICustomRole +{ + public string RoleName => "Freezer"; + public string RoleLongDescription => "Freeze another player for a duration of time."; + public string RoleDescription => RoleLongDescription; + public Color RoleColor => Palette.Blue; + public ModdedRoleTeams Team => ModdedRoleTeams.Impostor; + public LoadableAsset OptionsScreenshot => ExampleAssets.Banner; + +} \ No newline at end of file diff --git a/MiraAPI.Example/Roles/CustomRole.cs b/MiraAPI.Example/Roles/TeleporterRole.cs similarity index 79% rename from MiraAPI.Example/Roles/CustomRole.cs rename to MiraAPI.Example/Roles/TeleporterRole.cs index 7cff2f6..be7528b 100644 --- a/MiraAPI.Example/Roles/CustomRole.cs +++ b/MiraAPI.Example/Roles/TeleporterRole.cs @@ -5,12 +5,12 @@ using UnityEngine; namespace MiraAPI.Example.Roles; [RegisterCustomRole] -public class CustomRole : CrewmateRole, ICustomRole +public class TeleporterRole : CrewmateRole, ICustomRole { public string RoleName => "Teleporter"; public string RoleLongDescription => "Zoom out and teleport across the map!"; public string RoleDescription => RoleLongDescription; - public Color RoleColor => Color.blue; + public Color RoleColor => new Color32(221, 176, 152, 255); public ModdedRoleTeams Team => ModdedRoleTeams.Crewmate; public LoadableAsset OptionsScreenshot => ExampleAssets.Banner; diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index f853e0e..cda2f5c 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -41,7 +41,7 @@ public static class ModifierManager List filteredModifiers = []; - foreach (var modifier in IdToTypeModifiers.Where(pair => pair.Value.GetType() == typeof(GameModifier))) + foreach (var modifier in IdToTypeModifiers.Where(pair => pair.Value.GetType().IsAssignableTo(typeof(GameModifier)))) { var mod = (GameModifier)Activator.CreateInstance(modifier.Value); var num = mod.GetAmountPerGame(); diff --git a/MiraAPI/Modifiers/Types/TimedModifier.cs b/MiraAPI/Modifiers/Types/TimedModifier.cs index 3dff8b4..b37c80e 100644 --- a/MiraAPI/Modifiers/Types/TimedModifier.cs +++ b/MiraAPI/Modifiers/Types/TimedModifier.cs @@ -6,6 +6,7 @@ public abstract class TimedModifier : BaseModifier { public abstract float Duration { get; } public virtual bool AutoStart => false; + public virtual bool RemoveOnComplete => true; public abstract void OnTimerComplete(); public bool TimerActive { get; protected set; } @@ -28,6 +29,11 @@ public abstract class TimedModifier : BaseModifier TimerActive = false; TimeRemaining = Duration; OnTimerComplete(); + + if (RemoveOnComplete) + { + ModifierComponent.RpcRemoveModifier(Player, ModifierId); + } } }