Added autoconnect on file load

This commit is contained in:
Jerom Venneker
2025-07-16 18:50:32 +02:00
parent 9fbf67fc94
commit 79dd481116
3 changed files with 36 additions and 4 deletions

View File

@@ -179,6 +179,7 @@ typedef struct ShipArchipelagoSaveContextData {
char roomHash[100]; char roomHash[100];
char slotName[17]; char slotName[17];
char archiUri[50]; char archiUri[50];
char roomPass[50];
ArchipelagoLocationData locations[RC_MAX]; ArchipelagoLocationData locations[RC_MAX];
} ShipArchipelagoSaveContextData; } ShipArchipelagoSaveContextData;

View File

@@ -17,6 +17,7 @@
#include "soh/Notification/Notification.h" #include "soh/Notification/Notification.h"
#include "soh/ShipInit.hpp" #include "soh/ShipInit.hpp"
#include "soh/SaveManager.h" #include "soh/SaveManager.h"
#include "soh/util.h"
extern "C" { extern "C" {
#include "variables.h" #include "variables.h"
@@ -31,6 +32,8 @@ ArchipelagoClient::ArchipelagoClient() {
itemQueued = false; itemQueued = false;
disconnecting = false; disconnecting = false;
isDeathLinkedDeath = false; isDeathLinkedDeath = false;
uri = "";
password = "";
} }
ArchipelagoClient& ArchipelagoClient::GetInstance() { ArchipelagoClient& ArchipelagoClient::GetInstance() {
@@ -46,6 +49,8 @@ bool ArchipelagoClient::StartClient() {
disconnecting = false; disconnecting = false;
retries = 0; retries = 0;
uri = CVarGetString(CVAR_REMOTE_ARCHIPELAGO("ServerAddress"), "localhost:38281"); uri = CVarGetString(CVAR_REMOTE_ARCHIPELAGO("ServerAddress"), "localhost:38281");
password = CVarGetString(CVAR_REMOTE_ARCHIPELAGO("Password"), "");
apClient = std::unique_ptr<APClient>( apClient = std::unique_ptr<APClient>(
new APClient(uuid, AP_Client_consts::AP_GAME_NAME, new APClient(uuid, AP_Client_consts::AP_GAME_NAME,
uri, "cacert.pem")); uri, "cacert.pem"));
@@ -70,7 +75,7 @@ bool ArchipelagoClient::StartClient() {
tags.push_back("DeathLink"); tags.push_back("DeathLink");
} }
apClient->ConnectSlot(CVarGetString(CVAR_REMOTE_ARCHIPELAGO("SlotName"), ""), apClient->ConnectSlot(CVarGetString(CVAR_REMOTE_ARCHIPELAGO("SlotName"), ""),
CVarGetString(CVAR_REMOTE_ARCHIPELAGO("Password"), ""), 0b001, tags); password, 0b001, tags);
}); });
apClient->set_slot_connected_handler([&](const nlohmann::json data) { apClient->set_slot_connected_handler([&](const nlohmann::json data) {
@@ -89,6 +94,14 @@ bool ArchipelagoClient::StartClient() {
return; return;
} }
// save the connection details in case they changed
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.archiUri, uri,
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.archiUri));
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.slotName, GetSlotName(),
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName));
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.roomPass, password,
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.roomPass));
SynchSentLocations(); SynchSentLocations();
SynchReceivedLocations(); SynchReceivedLocations();
} }
@@ -243,6 +256,12 @@ bool ArchipelagoClient::StopClient() {
void ArchipelagoClient::GameLoaded() { void ArchipelagoClient::GameLoaded() {
if (apClient == nullptr) { if (apClient == nullptr) {
if(IS_ARCHIPELAGO) {
CVarSetString(CVAR_REMOTE_ARCHIPELAGO("ServerAddress"), gSaveContext.ship.quest.data.archipelago.archiUri);
CVarSetString(CVAR_REMOTE_ARCHIPELAGO("SlotName"), gSaveContext.ship.quest.data.archipelago.slotName);
CVarSetString(CVAR_REMOTE_ARCHIPELAGO("Password"), gSaveContext.ship.quest.data.archipelago.roomPass);
StartClient();
}
return; return;
} }
@@ -254,8 +273,12 @@ void ArchipelagoClient::GameLoaded() {
} }
if (!isRightSaveLoaded()) { if (!isRightSaveLoaded()) {
ArchipelagoConsole_SendMessage("[ERROR] Loaded save is not associated with connected slot, disconnecting..."); ArchipelagoConsole_SendMessage("Connec");
disconnecting = true; //disconnecting = true;
CVarSetString(CVAR_REMOTE_ARCHIPELAGO("ServerAddress"), gSaveContext.ship.quest.data.archipelago.archiUri);
CVarSetString(CVAR_REMOTE_ARCHIPELAGO("SlotName"), gSaveContext.ship.quest.data.archipelago.slotName);
CVarSetString(CVAR_REMOTE_ARCHIPELAGO("Password"), gSaveContext.ship.quest.data.archipelago.roomPass);
StartClient();
return; return;
} }
@@ -544,6 +567,8 @@ extern "C" void Archipelago_InitSaveFile() {
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName)); ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName));
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.archiUri, client.uri, SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.archiUri, client.uri,
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.archiUri)); ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.archiUri));
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.roomPass, client.password,
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.roomPass));
for (uint32_t i = 0; i < scoutedItems.size(); i++) { for (uint32_t i = 0; i < scoutedItems.size(); i++) {
RandomizerCheck rc = Rando::StaticData::locationNameToEnum[scoutedItems[i].locationName]; RandomizerCheck rc = Rando::StaticData::locationNameToEnum[scoutedItems[i].locationName];
@@ -568,6 +593,8 @@ void LoadArchipelagoData() {
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName)); ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName));
SaveManager::Instance->LoadCharArray("archiUri", gSaveContext.ship.quest.data.archipelago.archiUri, SaveManager::Instance->LoadCharArray("archiUri", gSaveContext.ship.quest.data.archipelago.archiUri,
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.archiUri)); ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.archiUri));
SaveManager::Instance->LoadCharArray("roomPass", gSaveContext.ship.quest.data.archipelago.roomPass,
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.roomPass));
SaveManager::Instance->LoadArray( SaveManager::Instance->LoadArray(
"locations", ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations), [](size_t i) { "locations", ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations), [](size_t i) {
@@ -590,6 +617,7 @@ void SaveArchipelagoData(SaveContext* saveContext, int sectionID, bool fullSave)
SaveManager::Instance->SaveData("roomHash", saveContext->ship.quest.data.archipelago.roomHash); SaveManager::Instance->SaveData("roomHash", saveContext->ship.quest.data.archipelago.roomHash);
SaveManager::Instance->SaveData("slotName", saveContext->ship.quest.data.archipelago.slotName); SaveManager::Instance->SaveData("slotName", saveContext->ship.quest.data.archipelago.slotName);
SaveManager::Instance->SaveData("archiUri", saveContext->ship.quest.data.archipelago.archiUri); SaveManager::Instance->SaveData("archiUri", saveContext->ship.quest.data.archipelago.archiUri);
SaveManager::Instance->SaveData("roomPass", gSaveContext.ship.quest.data.archipelago.roomPass);
SaveManager::Instance->SaveArray( SaveManager::Instance->SaveArray(
"locations", ARRAY_COUNT(saveContext->ship.quest.data.archipelago.locations), [&](size_t i) { "locations", ARRAY_COUNT(saveContext->ship.quest.data.archipelago.locations), [&](size_t i) {
@@ -612,6 +640,8 @@ void InitArchipelagoData(bool isDebug) {
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName)); ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.slotName));
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.archiUri, "", SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.archiUri, "",
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.archiUri)); ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.archiUri));
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.roomHash, "",
ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.roomPass));
for (uint32_t i = 0; i < ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations); i++) { for (uint32_t i = 0; i < ARRAY_COUNT(gSaveContext.ship.quest.data.archipelago.locations); i++) {
SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[i].itemName, "", SohUtils::CopyStringToCharArray(gSaveContext.ship.quest.data.archipelago.locations[i].itemName, "",

View File

@@ -70,6 +70,7 @@ class ArchipelagoClient {
bool isDeathLinkedDeath; bool isDeathLinkedDeath;
int retries; int retries;
std::string uri; std::string uri;
std::string password;
protected: protected:
ArchipelagoClient(); ArchipelagoClient();