From 65b21d1f74e6ed893318710fbcb77ed7da753148 Mon Sep 17 00:00:00 2001 From: Jouramie <16137441+Jouramie@users.noreply.github.com> Date: Fri, 31 Jul 2026 21:15:25 -0400 Subject: [PATCH 1/4] fix ap hui not showing up sometimes --- APRandomizerMain.cs | 10 ++++++---- Archipelago/ArchipelagoClient.cs | 32 ++++++-------------------------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/APRandomizerMain.cs b/APRandomizerMain.cs index 9eb97fd..b34f574 100644 --- a/APRandomizerMain.cs +++ b/APRandomizerMain.cs @@ -888,8 +888,10 @@ private void InGameHud_OnGUI(On.InGameHud.orig_OnGUI orig, InGameHud self) { apTextDisplay8 = Object.Instantiate(self.hud_8.coinCount, self.hud_8.gameObject.transform); apTextDisplay16 = Object.Instantiate(self.hud_16.coinCount, self.hud_16.gameObject.transform); - apTextDisplay8.transform.Translate(0f, -110f, 0f); - apTextDisplay16.transform.Translate(0f, -110f, 0f); + apTextDisplay8.rectTransform.Translate(0f, -110f, 0f); + apTextDisplay16.rectTransform.Translate(0f, -110f, 0f); + apTextDisplay8.rectTransform.sizeDelta = new Vector2(apTextDisplay8.rectTransform.sizeDelta.x + 100f, apTextDisplay8.rectTransform.sizeDelta.y); + apTextDisplay16.rectTransform.sizeDelta = new Vector2(apTextDisplay16.rectTransform.sizeDelta.x + 100f, apTextDisplay16.rectTransform.sizeDelta.y); apTextDisplay16.fontSize = apTextDisplay8.fontSize = UserConfig.StatusTextSize; apTextDisplay16.alignment = apTextDisplay8.alignment = TextAlignmentOptions.TopRight; apTextDisplay16.enableWordWrapping = apTextDisplay8.enableWordWrapping = true; @@ -897,8 +899,8 @@ private void InGameHud_OnGUI(On.InGameHud.orig_OnGUI orig, InGameHud self) apMessagesDisplay8 = Object.Instantiate(self.hud_8.coinCount, self.hud_8.gameObject.transform); apMessagesDisplay16 = Object.Instantiate(self.hud_16.coinCount, self.hud_16.gameObject.transform); - apMessagesDisplay8.transform.Translate(0f, -200f, 0f); - apMessagesDisplay16.transform.Translate(0f, -200f, 0f); + apMessagesDisplay8.rectTransform.Translate(0f, -200f, 0f); + apMessagesDisplay16.rectTransform.Translate(0f, -200f, 0f); apMessagesDisplay16.fontSize = apMessagesDisplay8.fontSize = UserConfig.MessageTextSize; apMessagesDisplay16.alignment = apMessagesDisplay8.alignment = TextAlignmentOptions.BottomRight; apMessagesDisplay16.enableWordWrapping = apMessagesDisplay16.enableWordWrapping = true; diff --git a/Archipelago/ArchipelagoClient.cs b/Archipelago/ArchipelagoClient.cs index 534b507..852e52e 100644 --- a/Archipelago/ArchipelagoClient.cs +++ b/Archipelago/ArchipelagoClient.cs @@ -101,13 +101,6 @@ private static ArchipelagoSession CreateSession() return session; } - private static ArchipelagoSession CreateSession(Uri uri) - { - var session = ArchipelagoSessionFactory.CreateSession(uri); - SetupSession(session); - return session; - } - private static void SetupSession(ArchipelagoSession session) { session.MessageLog.OnMessageReceived += OnMessageReceived; @@ -124,23 +117,6 @@ private static void OnPacketReceived(ArchipelagoPacketBase packet) } } - public static string Connect(Uri uri) - { - if (Authenticated) return "already connected"; - - try - { - Session = CreateSession(uri); - } - catch (Exception e) - { - Console.WriteLine($"Error: {e}"); - return e.ToString(); - } - - return TryConnect(); - } - public static string Connect() { if (Authenticated) return "already connected"; @@ -194,6 +170,7 @@ private static string HandleConnectResult(LoginResult result, bool needSlotData) ServerData.SlotData = success.SlotData; ServerData.SeedName = Session.RoomState.Seed; Authenticated = true; + roomUpdate = true; try { @@ -201,12 +178,13 @@ private static string HandleConnectResult(LoginResult result, bool needSlotData) } catch (Exception e) { - Console.WriteLine(e); + logger.Exception(e); outputText = "Something went wrong.\n" + "Please submit a bug report with the log.txt, " + "which can be found by the game executable."; Authenticated = false; + roomUpdate = true; Disconnect(); return outputText; } @@ -230,6 +208,7 @@ private static string HandleConnectResult(LoginResult result, bool needSlotData) Console.WriteLine(outputText); Authenticated = false; + roomUpdate = true; Disconnect(); } @@ -409,6 +388,7 @@ public static void Disconnect() Session?.Socket.Disconnect(); Session = null; Authenticated = false; + roomUpdate = true; attemptingConnection = false; DialogQueue = new Queue(); ItemQueue = new Queue(); @@ -533,7 +513,7 @@ public static string UpdateStatusText() } else if (HasConnected) { - statusText = "Disconnected from Archipelago server."; + statusText = "Disconnected from Archipelago server\nWill attempt to reconnect..."; } return statusText; } From c03ab0521f9e2d131a21b329f2016233d33da2e9 Mon Sep 17 00:00:00 2001 From: Jouramie <16137441+Jouramie@users.noreply.github.com> Date: Fri, 31 Jul 2026 22:13:24 -0400 Subject: [PATCH 2/4] improve tracker resiliency; move main loop in main --- APRandomizerMain.cs | 36 ++++++++++++- Archipelago/ArchipelagoClient.cs | 32 ----------- Archipelago/ItemsAndLocationsHandler.cs | 2 - Archipelago/TrackerManager.cs | 70 +++++++++++++++++++++---- 4 files changed, 95 insertions(+), 45 deletions(-) diff --git a/APRandomizerMain.cs b/APRandomizerMain.cs index b34f574..308ec9b 100644 --- a/APRandomizerMain.cs +++ b/APRandomizerMain.cs @@ -60,7 +60,6 @@ public override void Load() randoStateManager = new RandomizerStateManager(); trackerManager = new TrackerManager(); - ItemsAndLocationsHandler.TrackerManager = trackerManager; RandoPortalManager.TrackerManager = trackerManager; RandoLevelManager.TrackerManager = trackerManager; @@ -877,10 +876,43 @@ private void PlayerController_OnUpdate(PlayerController controller) TrapManager.TrapTimer += Time.deltaTime; if (!(updateTimer >= UpdateTime)) return; updateTimer = 0; - ArchipelagoClient.UpdateArchipelagoState(); + UpdateArchipelagoState(); apMessagesDisplay16.text = apMessagesDisplay8.text = ArchipelagoClient.UpdateMessagesText(); } + public void UpdateArchipelagoState() + { + while (ArchipelagoClient.ItemQueue.Count > 0) + { + ItemsAndLocationsHandler.Unlock((long)ArchipelagoClient.ItemQueue.Dequeue()); + } + + if (ArchipelagoClient.DialogQueue.Count > 0) + { + var message = (string)ArchipelagoClient.DialogQueue.Dequeue(); + logger.Log(message); + DialogChanger.CreateDialogBox(message); + } + + TrapManager.UpdateTrapStatus(); + if (ArchipelagoClient.Offline) return; + if (!ArchipelagoClient.Authenticated) + { + Console.WriteLine("Attempting to reconnect to Archipelago Server..."); + ThreadPool.QueueUserWorkItem(_ => ArchipelagoClient.ConnectAsync()); + return; + } + + if (ArchipelagoClient.ServerData.Index < ArchipelagoClient.Session.Items.AllItemsReceived.Count) + { + ItemsAndLocationsHandler.UnlockItems(); + return; + } + + if (!ItemsAndLocationsHandler.Synced) ItemsAndLocationsHandler.ReSync(); + if (!trackerManager.Synced) trackerManager.ReSync(); + } + private void InGameHud_OnGUI(On.InGameHud.orig_OnGUI orig, InGameHud self) { orig(self); diff --git a/Archipelago/ArchipelagoClient.cs b/Archipelago/ArchipelagoClient.cs index 852e52e..6da283b 100644 --- a/Archipelago/ArchipelagoClient.cs +++ b/Archipelago/ArchipelagoClient.cs @@ -395,38 +395,6 @@ public static void Disconnect() messageQueue = new Queue(); } - public static void UpdateArchipelagoState() - { - while (ItemQueue.Count > 0) - { - ItemsAndLocationsHandler.Unlock((long)ItemQueue.Dequeue()); - } - - if (DialogQueue.Count > 0) - { - var message = (string)DialogQueue.Dequeue(); - Console.WriteLine(message); - DialogChanger.CreateDialogBox(message); - } - - TrapManager.UpdateTrapStatus(); - if (Offline) return; - if (!Authenticated) - { - Console.WriteLine("Attempting to reconnect to Archipelago Server..."); - ThreadPool.QueueUserWorkItem(_ => ConnectAsync()); - return; - } - - if (ServerData.Index < Session.Items.AllItemsReceived.Count) - { - ItemsAndLocationsHandler.UnlockItems(); - return; - } - if (!ItemsAndLocationsHandler.Synced) - ItemsAndLocationsHandler.ReSync(); - } - public static void UpdateClientStatus(ArchipelagoClientState newState) { Console.WriteLine($"Updating client status to {newState}"); diff --git a/Archipelago/ItemsAndLocationsHandler.cs b/Archipelago/ItemsAndLocationsHandler.cs index da36ef4..3d92f9d 100644 --- a/Archipelago/ItemsAndLocationsHandler.cs +++ b/Archipelago/ItemsAndLocationsHandler.cs @@ -22,7 +22,6 @@ public static class ItemsAndLocationsHandler public const long BaseOffset = 0xADD_000; public static bool Synced; - public static TrackerManager TrackerManager; /// /// Builds the item and lookup dictionaries for converting to and from AP checks. Will always make every location @@ -547,7 +546,6 @@ public static void ReSync() { Synced = true; ArchipelagoClient.SyncEvents(); - TrackerManager.ReconciliateUnlockedPortals(); var receivedItems = new Dictionary(); diff --git a/Archipelago/TrackerManager.cs b/Archipelago/TrackerManager.cs index 4dce507..6ef16ae 100644 --- a/Archipelago/TrackerManager.cs +++ b/Archipelago/TrackerManager.cs @@ -9,28 +9,67 @@ namespace MessengerRando.Archipelago public class TrackerManager { - private List VisitedEntrances = []; + private List visitedEntrances = []; + + public bool Synced { get; private set; } = false; + + private readonly HashSet unsentVisitedEntrances = []; + private bool needsUnlockedPortalsReconciliation = true; + private ELevel lastKnownCurrentRegion = ELevel.NONE; + + public void ReSync() + { + Synced = true; + Console.WriteLine("Re-syncing tracker data from Data Storage"); + + visitedEntrances = ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"].To>() ?? []; + unsentVisitedEntrances.RemoveWhere(visitedEntrances.Contains); + if (unsentVisitedEntrances.Count > 0) + { + Console.WriteLine($"Adding visited entrances:\n\t{string.Join("\n\t", [.. unsentVisitedEntrances])}"); + visitedEntrances.AddRange(unsentVisitedEntrances); + visitedEntrances.Sort(); + ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"] = visitedEntrances; + unsentVisitedEntrances.Clear(); + } + + if (needsUnlockedPortalsReconciliation) ReconciliateUnlockedPortals(); + if (lastKnownCurrentRegion != ELevel.NONE) SetCurrentRegion(lastKnownCurrentRegion); + } public void AddVisitedEntrance(string entrance) { - if (VisitedEntrances.Contains(entrance)) return; + if (visitedEntrances.Contains(entrance)) return; - if (!ArchipelagoClient.Authenticated) return; - VisitedEntrances = ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"].To>() ?? []; - if (VisitedEntrances.Contains(entrance)) return; + if (ArchipelagoClient.Offline) return; + if (!ArchipelagoClient.Authenticated) + { + Synced = false; + unsentVisitedEntrances.Add(entrance); + return; + } + + visitedEntrances = ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"].To>() ?? []; + if (visitedEntrances.Contains(entrance)) return; Console.WriteLine("Adding visited entrance: " + entrance); - VisitedEntrances.Add(entrance); - VisitedEntrances.Sort(); - ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"] = VisitedEntrances; + visitedEntrances.Add(entrance); + visitedEntrances.Sort(); + ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"] = visitedEntrances; return; } public void ReconciliateUnlockedPortals() { - if (!ArchipelagoClient.Authenticated) return; + if (ArchipelagoClient.Offline) return; + if (!ArchipelagoClient.Authenticated) + { + Synced = false; + needsUnlockedPortalsReconciliation = true; + return; + } var unlockedPortals = RandoPortalManager.UnlockedPortals; unlockedPortals.UnionWith(ArchipelagoClient.Session.DataStorage[Scope.Slot, "UnlockedPortals"].To>() ?? []); @@ -40,5 +79,18 @@ public void ReconciliateUnlockedPortals() Console.WriteLine($"Updating unlocked portals with Data Storage. Unlocked portals are\n\t{string.Join("\n\t", [.. unlockedPortalsList])}"); ArchipelagoClient.Session.DataStorage[Scope.Slot, "UnlockedPortals"] = unlockedPortalsList; } + + public void SetCurrentRegion(ELevel level) + { + if (ArchipelagoClient.Offline) return; + if (!ArchipelagoClient.Authenticated) + { + Synced = false; + lastKnownCurrentRegion = level; + return; + } + + ArchipelagoClient.Session.DataStorage[Scope.Slot, "CurrentRegion"] = level.ToString(); + } } } From 30c140ebfcac63eb2caaa9e2edc358d054397416 Mon Sep 17 00:00:00 2001 From: Jouramie <16137441+Jouramie@users.noreply.github.com> Date: Fri, 31 Jul 2026 23:20:58 -0400 Subject: [PATCH 3/4] woops forget this from rebasing --- APRandomizerMain.cs | 2 +- Archipelago/ArchipelagoClient.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/APRandomizerMain.cs b/APRandomizerMain.cs index 308ec9b..7476b24 100644 --- a/APRandomizerMain.cs +++ b/APRandomizerMain.cs @@ -890,7 +890,7 @@ public void UpdateArchipelagoState() if (ArchipelagoClient.DialogQueue.Count > 0) { var message = (string)ArchipelagoClient.DialogQueue.Dequeue(); - logger.Log(message); + Console.WriteLine(message); DialogChanger.CreateDialogBox(message); } diff --git a/Archipelago/ArchipelagoClient.cs b/Archipelago/ArchipelagoClient.cs index 6da283b..06c7eeb 100644 --- a/Archipelago/ArchipelagoClient.cs +++ b/Archipelago/ArchipelagoClient.cs @@ -178,7 +178,7 @@ private static string HandleConnectResult(LoginResult result, bool needSlotData) } catch (Exception e) { - logger.Exception(e); + Console.WriteLine(e); outputText = "Something went wrong.\n" + "Please submit a bug report with the log.txt, " + From 9e399daeb23485888b734873bccf9dc43275173f Mon Sep 17 00:00:00 2001 From: Jouramie <16137441+Jouramie@users.noreply.github.com> Date: Fri, 31 Jul 2026 23:23:17 -0400 Subject: [PATCH 4/4] fix some broken fromatting --- Archipelago/TrackerManager.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Archipelago/TrackerManager.cs b/Archipelago/TrackerManager.cs index 6ef16ae..8d31de8 100644 --- a/Archipelago/TrackerManager.cs +++ b/Archipelago/TrackerManager.cs @@ -42,16 +42,16 @@ public void AddVisitedEntrance(string entrance) { if (visitedEntrances.Contains(entrance)) return; - if (ArchipelagoClient.Offline) return; - if (!ArchipelagoClient.Authenticated) - { - Synced = false; - unsentVisitedEntrances.Add(entrance); - return; - } + if (ArchipelagoClient.Offline) return; + if (!ArchipelagoClient.Authenticated) + { + Synced = false; + unsentVisitedEntrances.Add(entrance); + return; + } - visitedEntrances = ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"].To>() ?? []; - if (visitedEntrances.Contains(entrance)) return; + visitedEntrances = ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"].To>() ?? []; + if (visitedEntrances.Contains(entrance)) return; Console.WriteLine("Adding visited entrance: " + entrance); visitedEntrances.Add(entrance); @@ -64,7 +64,7 @@ public void AddVisitedEntrance(string entrance) public void ReconciliateUnlockedPortals() { if (ArchipelagoClient.Offline) return; - if (!ArchipelagoClient.Authenticated) + if (!ArchipelagoClient.Authenticated) { Synced = false; needsUnlockedPortalsReconciliation = true;