diff --git a/Modules/ClientControlGUI.cs b/Modules/ClientControlGUI.cs index 8b92c363b..e96cb2b86 100644 --- a/Modules/ClientControlGUI.cs +++ b/Modules/ClientControlGUI.cs @@ -5,6 +5,7 @@ using EHR.Patches; using UnityEngine; using UnityEngine.SceneManagement; using static EHR.Translator; +// ReSharper disable InconsistentNaming namespace EHR; @@ -12,9 +13,8 @@ public class ClientControlGUI : MonoBehaviour { public static ClientControlGUI Instance; - public bool IsOpen => _open; - - private bool _open; // whether the panel is visible + public bool IsOpen; // whether the panel is visible + private Vector2 _scroll; // current scroll position inside the panel private float _contentH; // total height of all drawn buttons, updated each frame @@ -25,7 +25,7 @@ public class ClientControlGUI : MonoBehaviour // Scale helpers - everything is relative to a 1080px-wide reference screen. // On PC the UI is scaled down to 60% but on Android we keep it at full size for better readability. - private static float PS => OperatingSystem.IsAndroid() ? 1.0f : 0.6f; // PS: platform scale multiplier (Android full size, PC smaller) + private static float PS => OperatingSystem.IsAndroid() ? 1.0f : 0.5f; // PS: platform scale multiplier (Android full size, PC smaller) private static float S => Screen.width / 1080f * PS; // S: global scale factor private static int FS => Mathf.Max(12, Mathf.RoundToInt(21f * S)); // FS: font size private static float BH => 66f * S; // BH: button height @@ -278,7 +278,7 @@ public class ClientControlGUI : MonoBehaviour HandleDrag(); DrawToggle(); - if (_open) DrawWindow(); + if (IsOpen) DrawWindow(); } // Draws the small square button that opens/closes the panel. @@ -288,7 +288,7 @@ public class ClientControlGUI : MonoBehaviour float size = 48f * S; float x, y; - if (_open) + if (IsOpen) { // Sits just to the right of the window, vertically centred on it x = _windowRect.x + _windowRect.width + 8f * S; @@ -296,27 +296,18 @@ public class ClientControlGUI : MonoBehaviour } else { - if (OperatingSystem.IsAndroid()) - { - // Bottom-left center: horizontally centred on the left quarter of the screen, - x = Screen.width * 0.25f - size * 0.5f; - y = Screen.height - size - 10f * S; - } - else - { - // PC: left side, vertically centred but shifted down to avoid overlapping with game UI - x = 20f * S; - y = (Screen.height - size) * 0.5f + 60f * S; - } + // Bottom-left center: horizontally centred on the left quarter of the screen, + x = Screen.width * 0.3f - size * 0.5f; + y = Screen.height - size - 10f * S; } // 90% transparent when in game and panel is closed, full opacity otherwise - bool fadeOut = !_open && GameStates.IsInGame; + bool fadeOut = !IsOpen && GameStates.IsInGame; Color prev = GUI.color; if (fadeOut) GUI.color = new Color(1f, 1f, 1f, 0.10f); - if (GUI.Button(new Rect(x, y, size, size), _open ? "X" : "=", _sToggle)) - _open = !_open; + if (GUI.Button(new Rect(x, y, size, size), IsOpen ? "X" : "=", _sToggle)) + IsOpen = !IsOpen; if (fadeOut) GUI.color = prev; } @@ -325,7 +316,7 @@ public class ClientControlGUI : MonoBehaviour // ImGUI doesn't have built-in window dragging, so we do it manually with mouse events. private void HandleDrag() { - if (!_open) return; + if (!IsOpen) return; Event e = Event.current; float titleH = BH * 0.80f + P; diff --git a/Patches/ControlPatch.cs b/Patches/ControlPatch.cs index 27bece159..88cb9f7c1 100644 --- a/Patches/ControlPatch.cs +++ b/Patches/ControlPatch.cs @@ -29,6 +29,9 @@ internal static class ControllerManagerUpdatePatch { try { + if (ClientControlGUI.Instance && (Input.GetKeyDown(KeyCode.Minus) || Input.GetKeyDown(KeyCode.KeypadMinus))) + ClientControlGUI.Instance.IsOpen = !ClientControlGUI.Instance.IsOpen; + if (HudManager.InstanceExists) { if (PlayerControl.LocalPlayer) @@ -223,9 +226,9 @@ internal static class ControllerManagerUpdatePatch Utils.SendMessage(GetString("HostKillSelfByCommand"), title: $"{GetString("DefaultSystemMessageTitle")}"); } +#if DEBUG if (!Options.NoGameEnd.GetBool()) return; -#if DEBUG if (KeysDown(KeyCode.F2, KeyCode.LeftControl)) { Logger.IsAlsoInGame = !Logger.IsAlsoInGame; @@ -369,10 +372,12 @@ internal static class ControllerManagerUpdatePatch return false; } +/* private static bool OrGetKeysDown(params KeyCode[] keys) { return keys.Any(Input.GetKeyDown); } +*/ } [HarmonyPatch(typeof(ConsoleJoystick), nameof(ConsoleJoystick.HandleHUD))] diff --git a/Patches/HandshakePatch.cs b/Patches/HandshakePatch.cs index 4c43fdd69..548634f53 100644 --- a/Patches/HandshakePatch.cs +++ b/Patches/HandshakePatch.cs @@ -78,21 +78,23 @@ public static class HandshakePatch public static void Postfix(ref Il2CppStructArray __result) { + if (GameStates.CurrentServerType is not (GameStates.ServerType.Modded or GameStates.ServerType.Niko)) return; + var handshake = new MessageWriter(1000); // Original data handshake.Write(__result); // Reactor Header - var version = (byte) ReactorProtocolVersion.Latest; - var value = (MAGIC << 8) | version; + const byte version = (byte)ReactorProtocolVersion.Latest; + const ulong value = (MAGIC << 8) | version; handshake.Write(value); // ModdedHandshakeC2S handshake.WritePacked(1); handshake.Write(Main.PluginGuid); handshake.Write(Main.PluginVersion); - handshake.Write((ushort) (ModFlags.RequireOnHost | ModFlags.RequireOnAllClients)); + handshake.Write((ushort)(ModFlags.RequireOnHost | ModFlags.RequireOnAllClients)); __result = handshake.ToByteArray(true); handshake.Recycle();