From 0cd79f9162ad93a51d33bc67eaf020b6431fc205 Mon Sep 17 00:00:00 2001 From: js6pak Date: Thu, 28 Jan 2021 13:47:04 +0100 Subject: [PATCH] More extensions --- Reactor.Debugger/DebuggerPlugin.cs | 16 ++++++- Reactor/Assets/default.bundle | Bin 57957 -> 10091 bytes Reactor/Extensions/Extensions.cs | 20 +++------ Reactor/Extensions/TextRendererExtensions.cs | 41 ++++++++++++++++++ Reactor/Extensions/UnityObjectExtensions.cs | 43 +++++++++++++++++++ Reactor/Patches/ModdedHandshakePatches.cs | 3 ++ Reactor/Patches/ReactorVersionShower.cs | 24 ++++++----- Reactor/Reactor.csproj | 1 + Reactor/Unstrip/DefaultBundle.cs | 20 +++------ 9 files changed, 129 insertions(+), 39 deletions(-) create mode 100644 Reactor/Extensions/TextRendererExtensions.cs create mode 100644 Reactor/Extensions/UnityObjectExtensions.cs 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 bc2934d21ca46cd3e5f05ab0005a96dc94648007..ab3c5b5ce332d0128144a31fca76f41a388c1429 100644 GIT binary patch literal 10091 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 NxEVLEjQ`T}y}Ey;O&|aO literal 57957 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 AW&i*H 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() }; } }