diff --git a/Reactor.Debugger/DebuggerPlugin.cs b/Reactor.Debugger/DebuggerPlugin.cs index 6c6d559..11ab8c9 100644 --- a/Reactor.Debugger/DebuggerPlugin.cs +++ b/Reactor.Debugger/DebuggerPlugin.cs @@ -11,7 +11,7 @@ namespace Reactor.Debugger { [BepInPlugin(Id)] [BepInProcess("Among Us.exe")] - [BepInDependency(ReactorPlugin.Id, "^0.2.0")] + [BepInDependency(ReactorPlugin.Id)] [ReactorPluginSide(PluginSide.ClientOnly)] public class DebuggerPlugin : BasePlugin { @@ -57,6 +57,20 @@ namespace Reactor.Debugger ShipStatus.RpcEndGame(GameOverReason.ImpostorDisconnect, false); } + if (TutorialManager.InstanceExists && GUILayout.Button("Spawn a dummy", new Il2CppReferenceArray(0))) + { + var playerControl = Instantiate(TutorialManager.Instance.PlayerPrefab); + var i = playerControl.PlayerId = (byte) GameData.Instance.GetAvailableId(); + GameData.Instance.AddPlayer(playerControl); + AmongUsClient.Instance.Spawn(playerControl, -2, SpawnFlags.None); + playerControl.transform.position = PlayerControl.LocalPlayer.transform.position; + playerControl.GetComponent().enabled = true; + playerControl.NetTransform.enabled = false; + playerControl.SetName("Dummy " + (i + 1)); + playerControl.SetColor((byte) (i % Palette.PlayerColors.Length)); + GameData.Instance.RpcSetTasks(playerControl.PlayerId, new byte[0]); + } + if (PlayerControl.LocalPlayer) { var position = PlayerControl.LocalPlayer.transform.position; diff --git a/Reactor/Assets/default.bundle b/Reactor/Assets/default.bundle index bc2934d..ab3c5b5 100644 Binary files a/Reactor/Assets/default.bundle and b/Reactor/Assets/default.bundle differ diff --git a/Reactor/Extensions/Extensions.cs b/Reactor/Extensions/Extensions.cs index d2ccdff..62a7c66 100644 --- a/Reactor/Extensions/Extensions.cs +++ b/Reactor/Extensions/Extensions.cs @@ -18,24 +18,16 @@ namespace Reactor.Extensions /// public static class Extensions { - /// - /// Stops from being destroyed - /// - /// Object to stop from being destroyed - /// Passed - public static T DontDestroy(this T obj) where T : Object + [Obsolete] + public static T DontDestroy(T obj) where T : Object { - obj.hideFlags |= HideFlags.HideAndDontSave; - Object.DontDestroyOnLoad(obj); - - return obj; + return UnityObjectExtensions.DontDestroy(obj); } - public static T DontUnload(this T obj) where T : Object + [Obsolete] + public static T DontUnload(T obj) where T : Object { - obj.hideFlags |= HideFlags.DontUnloadUnusedAsset; - - return obj; + return UnityObjectExtensions.DontUnload(obj); } /// diff --git a/Reactor/Extensions/TextRendererExtensions.cs b/Reactor/Extensions/TextRendererExtensions.cs new file mode 100644 index 0000000..da76273 --- /dev/null +++ b/Reactor/Extensions/TextRendererExtensions.cs @@ -0,0 +1,41 @@ +using System; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Reactor.Extensions +{ + public static class TextRendererExtensions + { + public static TextRendererPrefab Prefab { get; internal set; } + + public static TextRenderer AddTextRenderer(this GameObject gameObject) + { + if (Prefab == null) + { + throw new ArgumentException("TextRenderer prefab hasn't been initialized yet"); + } + + var renderer = gameObject.AddComponent(); + renderer.material = Prefab.Material; + + gameObject.AddComponent(); + + var textRenderer = gameObject.AddComponent(); + textRenderer.FontData = Prefab.FontData; + + return textRenderer; + } + } + + public class TextRendererPrefab + { + public Material Material { get; } + public TextAsset FontData { get; } + + internal TextRendererPrefab(TextRenderer textRenderer) + { + Material = Object.Instantiate(textRenderer.GetComponent().material).DontDestroy(); + FontData = Object.Instantiate(textRenderer.FontData).DontDestroy(); + } + } +} diff --git a/Reactor/Extensions/UnityObjectExtensions.cs b/Reactor/Extensions/UnityObjectExtensions.cs new file mode 100644 index 0000000..7787130 --- /dev/null +++ b/Reactor/Extensions/UnityObjectExtensions.cs @@ -0,0 +1,43 @@ +using UnityEngine; + +namespace Reactor.Extensions +{ + public static class UnityObjectExtensions + { + /// + /// Stops from being destroyed + /// + /// Object to stop from being destroyed + /// Passed + public static T DontDestroy(this T obj) where T : Object + { + obj.hideFlags |= HideFlags.HideAndDontSave; + + return obj.DontDestroyOnLoad(); + } + + public static T DontUnload(this T obj) where T : Object + { + obj.hideFlags |= HideFlags.DontUnloadUnusedAsset; + + return obj; + } + + public static T DontDestroyOnLoad(this T obj) where T : Object + { + Object.DontDestroyOnLoad(obj); + + return obj; + } + + public static void Destroy(this Object obj) + { + Object.Destroy(obj); + } + + public static void DestroyImmediate(this Object obj) + { + Object.DestroyImmediate(obj); + } + } +} diff --git a/Reactor/Patches/ModdedHandshakePatches.cs b/Reactor/Patches/ModdedHandshakePatches.cs index b90430d..0cf2df5 100644 --- a/Reactor/Patches/ModdedHandshakePatches.cs +++ b/Reactor/Patches/ModdedHandshakePatches.cs @@ -77,6 +77,9 @@ namespace Reactor.Patches ackCallback = (Action) (() => { + if (__instance.State == ConnectionState.Connected) + return; + PluginSingleton.Instance.Log.LogDebug("Hello was acked, waiting for modded handshake response"); Coroutines.Start(Coroutine()); diff --git a/Reactor/Patches/ReactorVersionShower.cs b/Reactor/Patches/ReactorVersionShower.cs index 3203662..85a9b3e 100644 --- a/Reactor/Patches/ReactorVersionShower.cs +++ b/Reactor/Patches/ReactorVersionShower.cs @@ -2,6 +2,8 @@ using System; using System.Reflection; using BepInEx; using BepInEx.IL2CPP; +using Reactor.Extensions; +using UnityEngine; using UnityEngine.SceneManagement; namespace Reactor.Patches @@ -16,30 +18,30 @@ namespace Reactor.Patches internal static void Initialize() { - SceneManager.add_sceneLoaded((Action) ((scene, loadMode) => + SceneManager.add_sceneLoaded((Action) ((_, _) => { var original = UnityEngine.Object.FindObjectOfType(); if (!original) return; - var gameObject = UnityEngine.Object.Instantiate(original.gameObject); - gameObject.name = "ReactorVersion"; + TextRendererExtensions.Prefab ??= new TextRendererPrefab(original.gameObject.GetComponentInChildren()); - var versionShower = gameObject.GetComponent(); - if (versionShower) - { - versionShower.enabled = false; - } + var gameObject = new GameObject("ReactorVersion"); + gameObject.transform.parent = original.transform.parent; - var aspectPosition = gameObject.GetComponent(); + var aspectPosition = gameObject.AddComponent(); - var position = aspectPosition.DistanceFromEdge; + aspectPosition.Alignment = AspectPosition.EdgeAlignments.LeftTop; + + var position = original.GetComponent().DistanceFromEdge; position.y += 0.2f; aspectPosition.DistanceFromEdge = position; aspectPosition.AdjustPosition(); - Text = gameObject.GetComponentInChildren(); + Text = gameObject.AddTextRenderer(); + Text.scale = 0.65f; + UpdateText(); })); } diff --git a/Reactor/Reactor.csproj b/Reactor/Reactor.csproj index f3457ba..b898204 100644 --- a/Reactor/Reactor.csproj +++ b/Reactor/Reactor.csproj @@ -4,6 +4,7 @@ latest 0.3.0 + dev Core mod and API for Among Us NuclearPowered diff --git a/Reactor/Unstrip/DefaultBundle.cs b/Reactor/Unstrip/DefaultBundle.cs index 0cbfb83..8326eec 100644 --- a/Reactor/Unstrip/DefaultBundle.cs +++ b/Reactor/Unstrip/DefaultBundle.cs @@ -1,4 +1,3 @@ -using System; using Reactor.Extensions; using UnityEngine; using UnityEngine.UI; @@ -18,20 +17,15 @@ namespace Reactor.Unstrip Graphic.defaultGraphicMaterial.shader = backupShader; } - var tex = new Texture2D(1, 1, TextureFormat.RGBA32, Texture.GenerateAllMips, false, IntPtr.Zero); - tex.SetPixel(0, 0, Color.red); - - var sprite = tex.CreateSprite(); - GUIExtensions.StandardResources = new DefaultControls.Resources { - background = sprite, - checkmark = sprite, - dropdown = sprite, - knob = sprite, - mask = sprite, - standard = sprite, - inputField = sprite + background = bundle.LoadAsset("Background").DontUnload(), + checkmark = bundle.LoadAsset("Checkmark").DontUnload(), + dropdown = bundle.LoadAsset("DropdownArrow").DontUnload(), + knob = bundle.LoadAsset("Knob").DontUnload(), + mask = bundle.LoadAsset("UIMask").DontUnload(), + standard = bundle.LoadAsset("UISprite").DontUnload(), + inputField = bundle.LoadAsset("InputFieldBackground").DontUnload() }; } }