Files
Shiip-of-Hakinian-Espanol/soh/soh/Network/Anchor/Packets/UpdateClientState.cpp
Garrett Cox 31ee15dcc8 WIP
2024-12-16 09:18:29 -06:00

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