From 37b73ea162f039ea0aa2637b9c14fef6fcf38d16 Mon Sep 17 00:00:00 2001 From: Nb1X Date: Fri, 7 Aug 2026 22:43:17 +0200 Subject: [PATCH] Added config file --- AUModdedRegions.cs | 243 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 211 insertions(+), 32 deletions(-) diff --git a/AUModdedRegions.cs b/AUModdedRegions.cs index a60cb81..1700d13 100644 --- a/AUModdedRegions.cs +++ b/AUModdedRegions.cs @@ -1,18 +1,28 @@ -using BepInEx; -using BepInEx.Unity.IL2CPP; -using HarmonyLib; -using UnityEngine; -using System; -using System.IO; +using System; using System.Collections.Generic; +using System.IO; using System.Text.Json; using System.Text.Json.Nodes; +using BepInEx; +using BepInEx.Unity.IL2CPP; +using HarmonyLib; +using Il2CppInterop.Runtime.InteropTypes.Arrays; +using UnityEngine; +using UnityEngine.SceneManagement; namespace AUModdedRegions { - [BepInPlugin("com.aumoddedregions", "AUModdedRegions", "1.0.0")] + [BepInPlugin(Id, Name, Version)] + [BepInProcess("Among Us.exe")] public class AUModdedRegionsPlugin : BasePlugin { + public const string Id = "com.nb1x.aumoddedregions"; + public const string Name = "AUModdedRegions"; + public const string Version = "1.3.0"; + + public static string ConfigPath => Path.Combine(Paths.ConfigPath, "CustomRegions.cfg"); + public Harmony Harmony { get; } = new Harmony(Id); + private static readonly string[] OfficialDomains = new string[] { "innersloth.com", @@ -22,27 +32,91 @@ namespace AUModdedRegions "matchmaker-eu.among.us" }; - private static readonly List<(string Name, string Host)> DefaultModdedRegions = new() - { - ("Niko233 (EU)", "https://au-eu.niko233.top"), - ("Niko233 (AS)", "https://au-as.niko233.top"), - ("Niko233 (NA)", "https://au-us.niko233.top"), - ("Niko233 (CN)", "https://au-cn.niko233.top"), - ("Modded NA", "https://aumods.org"), - ("Modded EU", "https://au-eu.duikbo.at"), - ("Modded AS", "https://au-as.duikbo.at"), - ("Skeld.net", "https://play.skeld.net") - }; - public override void Load() { - ProcessAndMergeRegions(); + Log.LogInfo($"[AUModdedRegions] Lancement de {Name} v{Version}..."); - Harmony.CreateAndPatchAll(typeof(PatchCleanAndMerge)); - Log.LogInfo("AUModdedRegions chargé avec succès !"); + EnsureConfigFileExists(); + + var parsedRegions = ParseConfigRegions(ConfigPath); + ProcessAndCleanRegionJson(parsedRegions); + + Harmony.PatchAll(); + + SceneManager.add_sceneLoaded((Action)((scene, _) => + { + if (scene.name == "MainMenu") + { + Log.LogInfo("[AUModdedRegions] Scène MainMenu détectée, injection des régions..."); + InjectRegions(parsedRegions); + } + })); } - private void ProcessAndMergeRegions() + private static void EnsureConfigFileExists() + { + if (File.Exists(ConfigPath)) return; + + string defaultConfig = @"[Region 1] +Name = Niko_NA +Adress = au-us.niko233.top +Https = true +Dtls = false +Port = 443, 22023 + +[Region 2] +Name = Niko_EU +Adress = au-eu.niko233.top +Https = true +Dtls = false +Port = 443, 22023 + +[Region 3] +Name = Niko_AS +Adress = au-as.niko233.top +Https = true +Dtls = false +Port = 443, 22023 + +[Region 4] +Name = Niko_CN +Adress = au-cn.niko233.top +Https = true +Dtls = false +Port = 443, 22023 + +[Region 5] +Name = Modded NA +Adress = aumods.org +Https = true +Dtls = false +Port = 443, 22023 + +[Region 6] +Name = Modded EU +Adress = au-eu.duikbo.at +Https = true +Dtls = false +Port = 443, 22023 + +[Region 7] +Name = Modded AS +Adress = au-as.duikbo.at +Https = true +Dtls = false +Port = 443, 22023 + +[Region 8] +Name = Default +Adress = +Https = +Dtls = +Port = 443, 22023 +"; + File.WriteAllText(ConfigPath, defaultConfig); + } + + private void ProcessAndCleanRegionJson(List parsedRegions) { string regionFilePath = Path.Combine(Application.persistentDataPath, "regionInfo.json"); @@ -71,20 +145,29 @@ namespace AUModdedRegions } } - foreach (var (name, host) in DefaultModdedRegions) + foreach (var reg in parsedRegions) { + if (string.Equals(reg.Name, "Default", StringComparison.OrdinalIgnoreCase) && string.IsNullOrWhiteSpace(reg.Adress)) + continue; + + if (string.IsNullOrWhiteSpace(reg.Name) || string.IsNullOrWhiteSpace(reg.Adress)) + continue; + + string protocol = reg.Https ? "https://" : "http://"; + string host = $"{protocol}{reg.Adress}"; + if (!HasRegion(regionsArray, host)) { - regionsArray.Add(BuildRegionNode(name, host)); + regionsArray.Add(BuildRegionNode(reg.Name, host, reg.Https ? reg.Port1 : reg.Port2, reg.Dtls)); } } rootNode["Regions"] = regionsArray; - + var options = new JsonSerializerOptions { WriteIndented = true }; File.WriteAllText(regionFilePath, rootNode.ToJsonString(options)); - Log.LogInfo("[AUModdedRegions] Fichier regionInfo.json mis à jour ! (Innersloth viré, tes régions custom + régions moddées conservées/ajoutées)."); + Log.LogInfo("[AUModdedRegions] Fichier regionInfo.json nettoyé et mis à jour !"); } catch (Exception ex) { @@ -123,7 +206,7 @@ namespace AUModdedRegions }; } - private JsonNode BuildRegionNode(string name, string host) + private JsonNode BuildRegionNode(string name, string host, ushort port, bool dtls) { return new JsonObject { @@ -136,8 +219,8 @@ namespace AUModdedRegions { ["Name"] = "Http-1", ["Ip"] = host, - ["Port"] = 443, - ["UseDtls"] = false, + ["Port"] = port, + ["UseDtls"] = dtls, ["Players"] = 0, ["ConnectionFailures"] = 0 } @@ -146,12 +229,108 @@ namespace AUModdedRegions ["TranslateName"] = 1003 }; } + + private void InjectRegions(List parsedRegions) + { + ServerManager serverMngr = DestroyableSingleton.Instance; + if (serverMngr == null) return; + + foreach (var reg in parsedRegions) + { + if (string.Equals(reg.Name, "Default", StringComparison.OrdinalIgnoreCase) && string.IsNullOrWhiteSpace(reg.Adress)) + continue; + + if (string.IsNullOrWhiteSpace(reg.Name) || string.IsNullOrWhiteSpace(reg.Adress)) + continue; + + ushort selectedPort = reg.Https ? reg.Port1 : reg.Port2; + string protocol = reg.Https ? "https://" : "http://"; + string fullUrl = $"{protocol}{reg.Adress}"; + + var serverInfo = new ServerInfo("http-1", fullUrl, selectedPort, reg.Dtls); + var serversArray = new Il2CppReferenceArray(new ServerInfo[] { serverInfo }); + + var regionInfo = new StaticHttpRegionInfo(reg.Name, (StringNames)1003, fullUrl, serversArray); + + serverMngr.AddOrUpdateRegion(regionInfo.Cast()); + Log.LogInfo($"[AUModdedRegions] Région '{reg.Name}' injectée en mémoire."); + } + } + + private static List ParseConfigRegions(string filePath) + { + var result = new List(); + if (!File.Exists(filePath)) return result; + + ParsedRegion? current = null; + + foreach (var line in File.ReadAllLines(filePath)) + { + string trimmed = line.Trim(); + + if (trimmed.StartsWith("[") && trimmed.EndsWith("]")) + { + if (current != null) result.Add(current); + current = new ParsedRegion(); + continue; + } + + if (current == null || !trimmed.Contains('=')) continue; + + var parts = trimmed.Split(new[] { '=' }, 2); + string key = parts[0].Trim().ToLowerInvariant(); + string val = parts[1].Trim(); + + switch (key) + { + case "name": + current.Name = val; + break; + case "adress": + case "address": + current.Adress = val; + break; + case "https": + bool.TryParse(val, out bool https); + current.Https = https; + break; + case "dtls": + bool.TryParse(val, out bool dtls); + current.Dtls = dtls; + break; + case "port": + var ports = val.Split(','); + if (ports.Length > 0 && ushort.TryParse(ports[0].Trim(), out ushort p1)) + current.Port1 = p1; + if (ports.Length > 1 && ushort.TryParse(ports[1].Trim(), out ushort p2)) + current.Port2 = p2; + break; + } + } + + if (current != null) result.Add(current); + + return result; + } + + private class ParsedRegion + { + public string Name { get; set; } = ""; + public string Adress { get; set; } = ""; + public bool Https { get; set; } = true; + public bool Dtls { get; set; } = false; + public ushort Port1 { get; set; } = 443; + public ushort Port2 { get; set; } = 22023; + } } - [HarmonyPatch("ServerManager+JsonServerData", "CleanAndMerge")] + [HarmonyPatch(typeof(ServerManager.JsonServerData), nameof(ServerManager.JsonServerData.CleanAndMerge))] public static class PatchCleanAndMerge { [HarmonyPrefix] - public static bool Prefix() => false; + public static bool Prefix() + { + return false; + } } } \ No newline at end of file