78 lines
2.8 KiB
C++
78 lines
2.8 KiB
C++
#ifdef ENABLE_REMOTE_CONTROL
|
|
|
|
#include "soh/Network/Anchor/Anchor.h"
|
|
#include "soh/Network/Anchor/JsonConversions.hpp"
|
|
#include <nlohmann/json.hpp>
|
|
#include <libultraship/libultraship.h>
|
|
#include "soh/OTRGlobals.h"
|
|
|
|
extern "C" {
|
|
#include "variables.h"
|
|
extern PlayState* gPlayState;
|
|
}
|
|
|
|
/**
|
|
* UPDATE_CLIENT_STATE
|
|
*
|
|
* Contains a small subset of data that is cached on the server and important for the client to know for various reasons
|
|
*
|
|
* Sent on various events, such as changing scenes, soft resetting, finishing the game, opening file select, etc.
|
|
*
|
|
* Note: This packet should be cross version compatible, so if you add anything here don't assume all clients will be
|
|
* providing it, consider doing a `contains` check before accessing any version specific data
|
|
*/
|
|
|
|
nlohmann::json Anchor::PrepClientState() {
|
|
nlohmann::json payload;
|
|
payload["name"] = CVarGetString(CVAR_REMOTE_ANCHOR("Name"), "");
|
|
payload["color"] = CVarGetColor24(CVAR_REMOTE_ANCHOR("Color"), { 100, 255, 100 });
|
|
payload["clientVersion"] = clientVersion;
|
|
payload["teamId"] = CVarGetString(CVAR_REMOTE_ANCHOR("TeamId"), "default");
|
|
payload["online"] = true;
|
|
|
|
if (IsSaveLoaded()) {
|
|
payload["seed"] = IS_RANDO ? Rando::Context::GetInstance()->GetSettings()->GetSeed() : 0;
|
|
payload["isSaveLoaded"] = true;
|
|
payload["isGameComplete"] = gSaveContext.sohStats.gameComplete;
|
|
payload["sceneNum"] = gPlayState->sceneNum;
|
|
payload["entranceIndex"] = gSaveContext.entranceIndex;
|
|
} else {
|
|
payload["seed"] = 0;
|
|
payload["isSaveLoaded"] = false;
|
|
payload["isGameComplete"] = false;
|
|
payload["sceneNum"] = SCENE_ID_MAX;
|
|
payload["entranceIndex"] = 0x00;
|
|
}
|
|
|
|
return payload;
|
|
}
|
|
|
|
void Anchor::SendPacket_UpdateClientState() {
|
|
nlohmann::json payload;
|
|
payload["type"] = UPDATE_CLIENT_STATE;
|
|
payload["state"] = PrepClientState();
|
|
|
|
SendJsonToRemote(payload);
|
|
}
|
|
|
|
void Anchor::HandlePacket_UpdateClientState(nlohmann::json payload) {
|
|
uint32_t clientId = payload["clientId"].get<uint32_t>();
|
|
|
|
if (clients.contains(clientId)) {
|
|
AnchorClient client = payload["state"].get<AnchorClient>();
|
|
clients[clientId].clientId = clientId;
|
|
clients[clientId].name = client.name;
|
|
clients[clientId].color = client.color;
|
|
clients[clientId].clientVersion = client.clientVersion;
|
|
clients[clientId].teamId = client.teamId;
|
|
clients[clientId].online = client.online;
|
|
clients[clientId].seed = client.seed;
|
|
clients[clientId].isSaveLoaded = client.isSaveLoaded;
|
|
clients[clientId].isGameComplete = client.isGameComplete;
|
|
clients[clientId].sceneNum = client.sceneNum;
|
|
clients[clientId].entranceIndex = client.entranceIndex;
|
|
}
|
|
}
|
|
|
|
#endif // ENABLE_REMOTE_CONTROL
|