From fcde3c9fd46f3bf6ea5ee11ed20cff693c9eaa83 Mon Sep 17 00:00:00 2001 From: Nb1X Date: Fri, 18 Sep 2026 19:46:42 +0200 Subject: [PATCH] patch: added region dropdown patch --- Mini.RegionInstall/Mini.RegionInstall.csproj | 8 +- Mini.RegionInstall/RegionDropdownPatch.cs | 115 +++++++++++ Mini.RegionInstall/packages.lock.json | 202 +++++++++++-------- 3 files changed, 238 insertions(+), 87 deletions(-) create mode 100644 Mini.RegionInstall/RegionDropdownPatch.cs diff --git a/Mini.RegionInstall/Mini.RegionInstall.csproj b/Mini.RegionInstall/Mini.RegionInstall.csproj index 5a2dcd5..7295718 100644 --- a/Mini.RegionInstall/Mini.RegionInstall.csproj +++ b/Mini.RegionInstall/Mini.RegionInstall.csproj @@ -14,15 +14,15 @@ Steam - 2022.9.20 + 2026.8.18 - + - - + + diff --git a/Mini.RegionInstall/RegionDropdownPatch.cs b/Mini.RegionInstall/RegionDropdownPatch.cs new file mode 100644 index 0000000..94de6f5 --- /dev/null +++ b/Mini.RegionInstall/RegionDropdownPatch.cs @@ -0,0 +1,115 @@ +// +// This file is part of Mini.RegionInstaller. +// +// Mini.RegionInstaller is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Mini.RegionInstaller is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Mini.RegionInstaller. If not, see https://www.gnu.org/licenses/ +// + +namespace Mini.RegionInstall +{ + using System.Linq; + using HarmonyLib; + using UnityEngine; + + /// + /// Harmony patch for to format and display custom regions in a grid layout. + /// + [HarmonyPatch(typeof(ServerDropdown), nameof(ServerDropdown.FillServerOptions))] + public static class RegionDropdownPatch + { + /// + /// Prefix patch to override server dropdown option population and arrange buttons in columns. + /// + /// The server dropdown instance. + /// False to skip the original method execution. + [HarmonyPrefix] + public static bool Prefix(ServerDropdown __instance) + { + if (__instance == null || ServerManager.Instance?.AvailableRegions == null) + { + return true; + } + + var regions = ServerManager.Instance.AvailableRegions.ToList(); + if (regions.Count == 0) + { + return true; + } + + int maxPerColumn = 6; + float columnWidth = 3.2f; + float rowSpacing = 0.42f; + + int totalRegions = regions.Count; + int totalColumns = Mathf.Max(1, Mathf.CeilToInt((float)totalRegions / maxPerColumn)); + int maxRows = Mathf.Min(totalRegions, maxPerColumn); + + float bgWidth = totalColumns > 1 ? (columnWidth * totalColumns) + 1.2f : 5.0f; + float bgHeight = (maxRows * rowSpacing) + 0.9f; + + float startX = -0.1f; + float startY = __instance.y_posButton - 0.05f; + + if (__instance.background != null) + { + __instance.background.size = new Vector2(bgWidth, bgHeight); + float xOffset = (totalColumns - 1) * (columnWidth / 2f); + __instance.background.transform.localPosition = new Vector3(xOffset, __instance.initialYPos - ((bgHeight - 1.2f) / 2f), 0f); + } + + int index = 0; + foreach (var region in regions) + { + if (region == null) + { + continue; + } + + var button = __instance.ButtonPool.Get(); + if (button == null) + { + continue; + } + + int column = index / maxPerColumn; + int row = index % maxPerColumn; + + float xPos = startX + (column * columnWidth); + float yPos = startY - (row * rowSpacing); + + button.transform.localPosition = new Vector3(xPos, yPos, -1f); + button.transform.localScale = Vector3.one; + + if (button.Text != null) + { + button.Text.enableAutoSizing = false; + button.Text.fontSize = 3.5f; + button.Text.text = region.Name; + button.Text.ForceMeshUpdate(false, false); + } + + if (button.Button != null) + { + button.Button.OnClick.RemoveAllListeners(); + IRegionInfo capturedRegion = region; + button.Button.OnClick.AddListener((System.Action)(() => __instance.ChooseOption(capturedRegion))); + __instance.controllerSelectable.Add(button.Button); + } + + index++; + } + + return false; + } + } +} \ No newline at end of file diff --git a/Mini.RegionInstall/packages.lock.json b/Mini.RegionInstall/packages.lock.json index 9592e7d..0881e3f 100644 --- a/Mini.RegionInstall/packages.lock.json +++ b/Mini.RegionInstall/packages.lock.json @@ -4,37 +4,37 @@ "net6.0": { "AmongUs.GameLibs.Steam": { "type": "Direct", - "requested": "[2022.9.20, )", - "resolved": "2022.9.20", - "contentHash": "NxKOtn4ScIOCc53z+6YlNvwQ+rorGdbuAofp6GSOjnF9LJ+GRW/G18rDUnwZH+g9c+Q8j3JLADkC30j+NIIYXg==" + "requested": "[2026.8.18, )", + "resolved": "2026.8.18", + "contentHash": "sSGu2zGYvLboOc83PzPxQ0yGsK1YrhIO/538Tfzc/5FKfEbGCtCQErcKV0wdiYZCHGpCe561RzzfrBtp46jcgQ==" }, "BepInEx.AutoPlugin": { "type": "Direct", - "requested": "[1.0.1, )", - "resolved": "1.0.1", - "contentHash": "G4YpTHG9rtkDJof+ld7Er4E+sCOlgsjG4bJ1itx1ub7dgff6qqHLy9ksX1ehgO0AdBOPVyVl/GKJg9o7iNl8HA==" + "requested": "[1.1.0, )", + "resolved": "1.1.0", + "contentHash": "/7Nmc1EA9lYlGBiyz6qPAaHvlcJHEjFZ1RFpGX+8EBj3GrgoX5kbpnZusuSHoOlLx0l+CnzKuQNE54B8UaGPyw==" }, "BepInEx.IL2CPP.MSBuild": { "type": "Direct", - "requested": "[2.0.1, )", - "resolved": "2.0.1", - "contentHash": "hUZjCV0t8dkw/Z/zq4Zl405QP7frBk/LVfMdUmUz+7XOhGd7lYPKrR48A5vbGl2QeHudMxlkXzAr9WM3Duq2SQ==" + "requested": "[2.1.0-rc.1, )", + "resolved": "2.1.0-rc.1", + "contentHash": "WI/7TbJwWl5P4B6UXGtKI1VMe6fA6h3fcbp3ZjJKqOBQ5MJfDMmeVB4fb+RW1tUQdxnlSWV3Ul62PHFyTqp4PA==" }, "BepInEx.Unity.IL2CPP": { "type": "Direct", - "requested": "[6.0.0-be.660, )", - "resolved": "6.0.0-be.660", - "contentHash": "jYBL1hNrEKmS7FKnUIKqxU026nvvy0s5TJufkoAiLVq19ficXL/Edy72wHNKXS2GcWY1JwdTLWx44SGStyiNQw==", + "requested": "[6.0.0-be.735, )", + "resolved": "6.0.0-be.735", + "contentHash": "2+eFJGKMR1GFPeU9wuF+TVrMANIaWIc/6N9e8x4b7b/fNiY9B6vicYNiMDb2deYQpWZtOei+2btnar5dDE5BPg==", "dependencies": { - "BepInEx.Core": "6.0.0-be.660", - "BepInEx.Unity.Common": "6.0.0-be.660", - "HarmonyX": "2.10.0", - "Iced": "1.17.0", - "Il2CppInterop.Generator": "1.2.0", - "Il2CppInterop.HarmonySupport": "1.2.0", - "Il2CppInterop.Runtime": "1.2.0", - "MonoMod.RuntimeDetour": "22.5.1.1", - "Samboy063.Cpp2IL.Core": "2022.0.7.2" + "BepInEx.Core": "6.0.0-be.735", + "BepInEx.Unity.Common": "6.0.0-be.735", + "HarmonyX": "2.10.2", + "Iced": "1.21.0", + "Il2CppInterop.Generator": "1.4.6-ci.426", + "Il2CppInterop.HarmonySupport": "1.4.6-ci.426", + "Il2CppInterop.Runtime": "1.4.6-ci.426", + "MonoMod.RuntimeDetour": "22.7.31.1", + "Samboy063.Cpp2IL.Core": "2022.1.0-pre-release.19" } }, "Roslynator.Analyzers": { @@ -55,34 +55,81 @@ "resolved": "1.1.118", "contentHash": "Onx6ovGSqXSK07n/0eM3ZusiNdB6cIlJdabQhWGgJp3Vooy9AaLS/tigeybOJAobqbtggTamoWndz72JscZBvw==" }, - "AssetRipper.VersionUtilities": { + "AsmResolver": { + "type": "Transitive", + "resolved": "6.0.0-beta.1", + "contentHash": "M5btCR/rmrx32jZsoN6CLQ/VQk8lN8hvPb6lgojua7pjNoo7StAl92koMC8qz4vzZyH2CNqxLSDoswRvyyK/vA==" + }, + "AsmResolver.DotNet": { + "type": "Transitive", + "resolved": "6.0.0-beta.1", + "contentHash": "PTq8nNQvhgTxF1iARCknffCsu7Iq9B0kN7TVC8iMaU7uEYog3xvVqH/0+TreY8GW74/+MqhZt/yEFsvS4oAduQ==", + "dependencies": { + "AsmResolver.PE": "6.0.0-beta.1" + } + }, + "AsmResolver.PE": { + "type": "Transitive", + "resolved": "6.0.0-beta.1", + "contentHash": "KadLvx/zzFCJyF+E4jG6jPE1d0iJquzL6+hm8GBivBAs6nwHC8s6g4c857QwQCzXMWza6Vz5Q+3hFiNuOfKaWQ==", + "dependencies": { + "AsmResolver.PE.File": "6.0.0-beta.1" + } + }, + "AsmResolver.PE.File": { + "type": "Transitive", + "resolved": "6.0.0-beta.1", + "contentHash": "+lusB9UMHevI5aQsu73NQ1ctPMLFvyHAsEf8vjaJ/py+kX1DkU0JkbERtBRmaf58/hBZ7cyrE7gFnjoo7Bbg7A==", + "dependencies": { + "AsmResolver": "6.0.0-beta.1" + } + }, + "AssetRipper.CIL": { + "type": "Transitive", + "resolved": "1.1.2", + "contentHash": "BRPcHORadIzSFkrVOvGkSs54j19mQdXH8dmRTVM51mS8MZLSbTpi9CDPpnWN2IdDsILUrAqbPUFo3zJodYxErw==", + "dependencies": { + "AsmResolver.DotNet": "6.0.0-beta.1" + } + }, + "AssetRipper.Gee.External.Capstone": { + "type": "Transitive", + "resolved": "2.3.2", + "contentHash": "wOr5PQPL/2ZfD7+ebt6cpRbUhSzSY5nlHGHjjzuQRiU5zkQlqQNwWDLX0M3smrm5IkaDvONkmDjFMKTlZJmyuQ==" + }, + "AssetRipper.Primitives": { "type": "Transitive", - "resolved": "1.2.1", - "contentHash": "knQ/W1YwTZS2AbdaZh+nhyyBEZQPQDcahhSOnh88i+cdg4/FEoFJiCwaavgFvCMNuUeHTbcZc4qttF8WQ8xLIA==" + "resolved": "3.1.3", + "contentHash": "djZbN/+EXmI+Oia9Pm0LyjZVCPLf60TPSL5rGb7mBEYM5F4CN3nPFXvl2yA5LanPZoHS1Yq7PghGUmkP7Pv9RQ==" }, "BepInEx.Core": { "type": "Transitive", - "resolved": "6.0.0-be.660", - "contentHash": "6Dbje92nIRcLALn8aqqLEuZbD3Ob/V8A7m2jHB7PhTA6HmIVZ1jJTkMRAKVRKrzAIDZITKZ1j8cGsx2HcMVPEg==", + "resolved": "6.0.0-be.735", + "contentHash": "FuHm9UCzjSKeiZJc3IF70Fiuqi+FynRn62PwBoOeZcHK3/qm+vl1YwbZyFlmUyf45g+UKxg2Td40iZGx88LVAQ==", "dependencies": { - "HarmonyX": "2.10.0", - "MonoMod.Utils": "22.5.1.1", + "HarmonyX": "2.10.2", + "MonoMod.Utils": "22.7.31.1", "SemanticVersioning": "2.0.2" } }, "BepInEx.Unity.Common": { "type": "Transitive", - "resolved": "6.0.0-be.660", - "contentHash": "FS1JbYusO407yB0FgBJfgUoCLhCa2iZBL7bLBWeafjupVPU8fkpxoV6jhPDMncbrISqA4SE21wfrHMBLv/EdjQ==", + "resolved": "6.0.0-be.735", + "contentHash": "vmK//OBSr+jotqTk//HSdvHtMFTKu+NlQkiEsvr0dZApTVmQM2AgpVMhEAakQPmrSsM6LRJIHCBcLFO1ypfMPQ==", "dependencies": { - "AssetRipper.VersionUtilities": "1.2.1", - "MonoMod.Utils": "22.5.1.1" + "AssetRipper.Primitives": "3.1.3", + "MonoMod.Utils": "22.7.31.1" } }, + "Disarm": { + "type": "Transitive", + "resolved": "2022.1.0-master.57", + "contentHash": "/dkg7hg8iPBQN4bTV1lMQacarH6fMpgUXhJuo6iI7Wv7YpH7g5F9hJfje7dSMhqG0YlDacLuyWvcph5GzKUXog==" + }, "HarmonyX": { "type": "Transitive", - "resolved": "2.10.0", - "contentHash": "4ayiy/dlCiW86K2N7Jvbf+VpI5wvP7dncv/6oRmfwRi32UCmCRzCGzsxdMfzJZkp6/26oBW+DrD8vi4UejzVAg==", + "resolved": "2.10.2", + "contentHash": "/5WwkxXX8mPsRuigQt957rJGx1f0dDQxk+bvk4yYITKFjXas9Em+O71zEP8X0ym8OFQQ2XH/2SxS4NC7vEC+Xg==", "dependencies": { "MonoMod.RuntimeDetour": "22.3.23.4", "System.Reflection.Emit": "4.7.0" @@ -90,13 +137,13 @@ }, "Iced": { "type": "Transitive", - "resolved": "1.17.0", - "contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw==" + "resolved": "1.21.0", + "contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg==" }, "Il2CppInterop.Common": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "igx3+2h5cdquSFn7yfZenxBnoSnczZlwhCEInil/ioULMOVeVoxTXaB07qI5I1fwDhSa37nugTx1eNqp+YP0fA==", + "resolved": "1.4.6-ci.426", + "contentHash": "pI0kU0qqJKMP6z9eFz4+WJtGIwklfPxW2yWEY9vKnrN9bbYMusK3v5uFWV8al7S/HPSATV5jNWH1hyTvP7kglA==", "dependencies": { "Iced": "1.17.0", "Microsoft.Extensions.Logging.Abstractions": "6.0.1", @@ -105,41 +152,31 @@ }, "Il2CppInterop.Generator": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "g/CB12CCGgCUf/ykgP0LyFXPQpAy4M5kYqy43m2P0+R3htwnKs+0tF7HDCHXlOMclk/40SOThjnf7NlSXJnw+Q==", + "resolved": "1.4.6-ci.426", + "contentHash": "kecdx/vbNl0RtfzfYW592jU8PMyq1JbzpvoJSvqwO+tV6icp9SljXy6yG8bT/wt0gaPj9mFUNDTe2Wu6M6XGZQ==", "dependencies": { - "Il2CppInterop.Common": "1.2.0", + "Il2CppInterop.Common": "1.4.6-ci.426", "Mono.Cecil": "0.11.3" } }, "Il2CppInterop.HarmonySupport": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "scyvkvZA4/vSIwaSn8G31+i1969Grve/si+V6HrVudMVsR9IsAJVhEae9KDFJGrmTdTVAFfWZvIqeS3qjDxdrA==", + "resolved": "1.4.6-ci.426", + "contentHash": "rd2T5o6SybIc12hmX3HktTF5n27hFb0w4mNSExq7h1YsmrNlt7x+Ac1MBnnB0JwPLIg7w8LjnKjoIX6Gf626ng==", "dependencies": { "HarmonyX": "2.10.0", - "Il2CppInterop.Runtime": "1.2.0" + "Il2CppInterop.Runtime": "1.4.6-ci.426" } }, "Il2CppInterop.Runtime": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "8nv5Jb9cqqIqVgbFCW2vsEcNYrSGFPgEE7XXePR3HhIl3CMbbHJxEAYDatJY4GfNQeeE4avLpXiV6XVkFnWGQg==", + "resolved": "1.4.6-ci.426", + "contentHash": "0O0oI7gOqJixrsjvh1firhuGYK3Yr0uDLp6Q+t5CfcTMmeEX8Plk3pqAP9ZYyilBvh7uW0gv4Golqz08L1GXug==", "dependencies": { "Iced": "1.17.0", - "Il2CppInterop.Common": "1.2.0" + "Il2CppInterop.Common": "1.4.6-ci.426" } }, - "IndexRange": { - "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "6TgS1JLSUkpmPLfXBPaAgB39ZUix8E4soXWk2XSDcscVe84i1JKzIAtA7jHbRHSkOOrcr6YA0MpLCeq98y9mYQ==" - }, - "js6pak.Gee.External.Capstone": { - "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA==" - }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", "resolved": "6.0.1", @@ -162,11 +199,11 @@ }, "MonoMod.RuntimeDetour": { "type": "Transitive", - "resolved": "22.5.1.1", - "contentHash": "WG5zLRuAr8KJEnIkKTuIG1OJCrGIT3pjvnAD43E0FDchHf3Dp985MF/8tmIQvAzCZV87JNs6QKeGGqmwDmpXpw==", + "resolved": "22.7.31.1", + "contentHash": "nxVJTvQbWAujaogt5XX3eAy7d22t66Z88aWg9sirPLO9rR/6yNCHAyZpgxXrOsIobZVW0IEZPqNMOBhgke25/w==", "dependencies": { "Mono.Cecil": "0.11.4", - "MonoMod.Utils": "22.5.1.1", + "MonoMod.Utils": "22.7.31.1", "System.Collections.NonGeneric": "4.3.0", "System.ComponentModel.TypeConverter": "4.3.0", "System.IO.FileSystem.Primitives": "4.3.0", @@ -177,8 +214,8 @@ }, "MonoMod.Utils": { "type": "Transitive", - "resolved": "22.5.1.1", - "contentHash": "vBObO1atXxhi2C4AuC53y87Bqeogi9xIrD1Ym3YWr5uxc8Nrm8SrsFeD1i3x04R999+XQ3FdeHrbXScyWYEHqQ==", + "resolved": "22.7.31.1", + "contentHash": "nI0E1oadXS1iMbfwfCzYF08C1jRQR9cnnHv66a4BSPd4sGu2p6g4BmctCWsdAB6oGKkSJUhcfHfxcfTsDyB94Q==", "dependencies": { "Mono.Cecil": "0.11.4", "System.Collections.NonGeneric": "4.3.0", @@ -289,38 +326,42 @@ }, "Samboy063.Cpp2IL.Core": { "type": "Transitive", - "resolved": "2022.0.7.2", - "contentHash": "e17CAhKSxdAp7vFcYEVxjSc7t7rcvVGBipGhgE9tAjRXY85wZXLlHEVO0AEvMRkLmf9U+if4wK/nZEC1AX6VqQ==", + "resolved": "2022.1.0-pre-release.19", + "contentHash": "mAYIrMo0VdOZzh1NS5bZeflg80gtYNY7kZo9q/blEYheUPyLXu5ozQOjX+Bq2yDh40pA+yiE2MXTnN2Is2hjgw==", "dependencies": { - "HarmonyX": "2.5.5", - "Iced": "1.11.1", - "IndexRange": "1.0.0", - "Mono.Cecil": "0.11.4", - "Samboy063.LibCpp2IL": "2022.0.7.2", - "System.Runtime.InteropServices": "4.3.0", - "System.ValueTuple": "4.5.0", - "js6pak.Gee.External.Capstone": "2.1.0" + "AsmResolver.DotNet": "6.0.0-beta.1", + "AssetRipper.CIL": "1.1.2", + "AssetRipper.Gee.External.Capstone": "2.3.2", + "Disarm": "2022.1.0-master.57", + "Iced": "1.21.0", + "Samboy063.LibCpp2IL": "2022.1.0-pre-release.19", + "StableNameDotNet": "0.1.0-pre-release.19" } }, "Samboy063.LibCpp2IL": { "type": "Transitive", - "resolved": "2022.0.7.2", - "contentHash": "DpVeU0dQkUJCpbw0f1xKOG8vimdK2oYhrVABC7HDE3/ikGjhnMZd3i5b1joKDHZ+AiL90TWOaEXPcy24rCZ0dA==", + "resolved": "2022.1.0-pre-release.19", + "contentHash": "/n8p81ltd38BeNNS2xUNPGMSzxk/UGXr9cRNqG1MaLogzANNNrvCAXqWmNMM3tZctjp7vqTxEA+e4J4ngul8Fg==", "dependencies": { - "IndexRange": "1.0.0", - "Samboy063.WasmDisassembler": "2022.0.2" + "AssetRipper.Primitives": "3.1.3", + "Samboy063.WasmDisassembler": "2022.1.0-pre-release.19" } }, "Samboy063.WasmDisassembler": { "type": "Transitive", - "resolved": "2022.0.2", - "contentHash": "2uu+xBb7M3HKfBx9tAY6jiDieAf0hRnQjSmGX+7IdE6i24dYsx6TYgtrLvRx5lOuF2M8DijZ5H8yQ1pcuCs2SA==" + "resolved": "2022.1.0-pre-release.19", + "contentHash": "uVQdYm/J6+jJ1xt6GJ3hNhXhciwlX+LmHTPITu9jjZ75T33YJuuTD7pLVYuMymr+4gSVisg7f1wterFSyqJBWA==" }, "SemanticVersioning": { "type": "Transitive", "resolved": "2.0.2", "contentHash": "4EQgYdNZ92SyaO7YFk6olVnebF5V+jrHyMUjvPq89tLeMo8NSfgDF+6Zwq/lgh9j/0yfQp9Lkm0ZA0rUATCZFA==" }, + "StableNameDotNet": { + "type": "Transitive", + "resolved": "0.1.0-pre-release.19", + "contentHash": "5BPWtntv3PXeFIg9CuGW6OM3f5GnwvdQJbzRpufPsistFwFyt1xYW1wSDr+QIdDO7vLndr7iNpWD3FyYp9LL4g==" + }, "System.Collections": { "type": "Transitive", "resolved": "4.3.0", @@ -862,11 +903,6 @@ "Microsoft.NETCore.Targets": "1.1.0", "System.Runtime": "4.3.0" } - }, - "System.ValueTuple": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" } } }