Back-port fixes from holiday build (#6060)
This commit is contained in:
@@ -40,6 +40,26 @@ void Anchor::OnDisconnected() {
|
||||
RegisterHooks();
|
||||
}
|
||||
|
||||
void Anchor::ProcessOutgoingPackets() {
|
||||
// Copy all queued packets while holding the lock, then send them after releasing
|
||||
std::queue<nlohmann::json> packetsToSend;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(outgoingPacketQueueMutex);
|
||||
packetsToSend.swap(outgoingPacketQueue);
|
||||
}
|
||||
|
||||
// Send packets without holding the lock
|
||||
while (!packetsToSend.empty()) {
|
||||
nlohmann::json payload = packetsToSend.front();
|
||||
packetsToSend.pop();
|
||||
|
||||
if (!payload.contains("quiet")) {
|
||||
SPDLOG_DEBUG("[Anchor] Sending payload:\n{}", payload.dump());
|
||||
}
|
||||
Network::SendJsonToRemote(payload);
|
||||
}
|
||||
}
|
||||
|
||||
void Anchor::SendJsonToRemote(nlohmann::json payload) {
|
||||
if (!isConnected) {
|
||||
return;
|
||||
@@ -47,9 +67,17 @@ void Anchor::SendJsonToRemote(nlohmann::json payload) {
|
||||
|
||||
payload["clientId"] = ownClientId;
|
||||
if (!payload.contains("quiet")) {
|
||||
SPDLOG_DEBUG("[Anchor] Sending payload:\n{}", payload.dump());
|
||||
SPDLOG_DEBUG("[Anchor] Queuing payload:\n{}", payload.dump());
|
||||
}
|
||||
Network::SendJsonToRemote(payload);
|
||||
|
||||
if (payload["type"] == HANDSHAKE) {
|
||||
Network::SendJsonToRemote(payload);
|
||||
return;
|
||||
}
|
||||
|
||||
// Queue the packet to be sent on the network thread
|
||||
std::lock_guard<std::mutex> lock(outgoingPacketQueueMutex);
|
||||
outgoingPacketQueue.push(payload);
|
||||
}
|
||||
|
||||
void Anchor::OnIncomingJson(nlohmann::json payload) {
|
||||
@@ -87,11 +115,17 @@ void Anchor::OnIncomingJson(nlohmann::json payload) {
|
||||
}
|
||||
|
||||
void Anchor::ProcessIncomingPacketQueue() {
|
||||
std::lock_guard<std::mutex> lock(incomingPacketQueueMutex);
|
||||
// Copy all queued packets while holding the lock, then process them after releasing
|
||||
std::queue<nlohmann::json> packetsToProcess;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(incomingPacketQueueMutex);
|
||||
packetsToProcess.swap(incomingPacketQueue);
|
||||
}
|
||||
|
||||
while (!incomingPacketQueue.empty()) {
|
||||
nlohmann::json payload = incomingPacketQueue.front();
|
||||
incomingPacketQueue.pop();
|
||||
// Process packets without holding the lock
|
||||
while (!packetsToProcess.empty()) {
|
||||
nlohmann::json payload = packetsToProcess.front();
|
||||
packetsToProcess.pop();
|
||||
|
||||
std::string packetType = payload["type"].get<std::string>();
|
||||
|
||||
|
||||
@@ -76,6 +76,8 @@ class Anchor : public Network {
|
||||
bool isProcessingIncomingPacket = false;
|
||||
std::queue<nlohmann::json> incomingPacketQueue;
|
||||
std::mutex incomingPacketQueueMutex;
|
||||
std::queue<nlohmann::json> outgoingPacketQueue;
|
||||
std::mutex outgoingPacketQueueMutex;
|
||||
|
||||
nlohmann::json PrepClientState();
|
||||
nlohmann::json PrepRoomState();
|
||||
@@ -143,6 +145,7 @@ class Anchor : public Network {
|
||||
void OnIncomingJson(nlohmann::json payload);
|
||||
void OnConnected();
|
||||
void OnDisconnected();
|
||||
void ProcessOutgoingPackets();
|
||||
void DrawMenu();
|
||||
void ProcessIncomingPacketQueue();
|
||||
void SendJsonToRemote(nlohmann::json packet);
|
||||
|
||||
@@ -158,13 +158,13 @@ void DummyPlayer_Update(Actor* actor, PlayState* play) {
|
||||
player->actor.world.pos.y += diff.y * player->actor.scale.y;
|
||||
}
|
||||
|
||||
if (player->modelGroup != Player_ActionToModelGroup(player, player->itemAction)) {
|
||||
if (player->modelGroup != client.modelGroup) {
|
||||
// Hack to account for usage of gSaveContext
|
||||
s32 originalAge = gSaveContext.linkAge;
|
||||
gSaveContext.linkAge = client.linkAge;
|
||||
u8 originalButtonItem0 = gSaveContext.equips.buttonItems[0];
|
||||
gSaveContext.equips.buttonItems[0] = client.buttonItem0;
|
||||
Player_SetModelGroup(player, Player_ActionToModelGroup(player, player->itemAction));
|
||||
Player_SetModelGroup(player, client.modelGroup);
|
||||
gSaveContext.linkAge = originalAge;
|
||||
gSaveContext.equips.buttonItems[0] = originalButtonItem0;
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ void Anchor::SendPacket_PlayerUpdate() {
|
||||
payload["currentShield"] = player->currentShield;
|
||||
payload["currentTunic"] = player->currentTunic;
|
||||
payload["stateFlags1"] = player->stateFlags1;
|
||||
payload["stateFlags2"] = player->stateFlags2;
|
||||
payload["stateFlags2"] = player->stateFlags2 & ~PLAYER_STATE2_DISABLE_DRAW;
|
||||
payload["buttonItem0"] = gSaveContext.equips.buttonItems[0];
|
||||
payload["itemAction"] = player->itemAction;
|
||||
payload["heldItemAction"] = player->heldItemAction;
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
|
||||
static bool isResultOfHandling = false;
|
||||
|
||||
/**
|
||||
* SET_CHECK_STATUS
|
||||
*
|
||||
@@ -11,7 +13,7 @@
|
||||
*/
|
||||
|
||||
void Anchor::SendPacket_SetCheckStatus(RandomizerCheck rc) {
|
||||
if (!IsSaveLoaded() || isProcessingIncomingPacket || !roomState.syncItemsAndFlags) {
|
||||
if (!IsSaveLoaded() || isResultOfHandling) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -40,12 +42,16 @@ void Anchor::HandlePacket_SetCheckStatus(nlohmann::json payload) {
|
||||
RandomizerCheckStatus status = payload["status"].get<RandomizerCheckStatus>();
|
||||
bool skipped = payload["skipped"].get<bool>();
|
||||
|
||||
isResultOfHandling = true;
|
||||
|
||||
if (randoContext->GetItemLocation(rc)->GetCheckStatus() != status) {
|
||||
randoContext->GetItemLocation(rc)->SetCheckStatus(status);
|
||||
}
|
||||
if (randoContext->GetItemLocation(rc)->GetIsSkipped() != skipped) {
|
||||
randoContext->GetItemLocation(rc)->SetIsSkipped(skipped);
|
||||
}
|
||||
|
||||
CheckTracker::RecalculateAllAreaTotals();
|
||||
CheckTracker::RecalculateAvailableChecks();
|
||||
isResultOfHandling = false;
|
||||
}
|
||||
|
||||
@@ -291,6 +291,7 @@ void Anchor::HandlePacket_UpdateTeamState(nlohmann::json payload) {
|
||||
}
|
||||
|
||||
if (payload.contains("queue")) {
|
||||
std::lock_guard<std::mutex> lock(incomingPacketQueueMutex);
|
||||
for (auto& item : payload["queue"]) {
|
||||
nlohmann::json itemPayload = nlohmann::json::parse(item.get<std::string>());
|
||||
incomingPacketQueue.push(itemPayload);
|
||||
|
||||
@@ -46,6 +46,9 @@ void Network::OnConnected() {
|
||||
void Network::OnDisconnected() {
|
||||
}
|
||||
|
||||
void Network::ProcessOutgoingPackets() {
|
||||
}
|
||||
|
||||
void Network::SendDataToRemote(const char* payload) {
|
||||
#ifdef ENABLE_REMOTE_CONTROL
|
||||
SPDLOG_DEBUG("[Network] Sending data: {}", payload);
|
||||
@@ -68,6 +71,7 @@ void Network::ReceiveFromServer() {
|
||||
|
||||
if (networkSocket) {
|
||||
isConnected = true;
|
||||
receivedData.clear();
|
||||
SPDLOG_INFO("[Network] Connection to server established!");
|
||||
|
||||
OnConnected();
|
||||
@@ -90,7 +94,11 @@ void Network::ReceiveFromServer() {
|
||||
break;
|
||||
}
|
||||
|
||||
// Always process outgoing packets
|
||||
ProcessOutgoingPackets();
|
||||
|
||||
if (socketsReady == 0) {
|
||||
// No incoming data
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -119,9 +127,15 @@ void Network::ReceiveFromServer() {
|
||||
}
|
||||
}
|
||||
|
||||
if (socketSet) {
|
||||
SDLNet_FreeSocketSet(socketSet);
|
||||
}
|
||||
|
||||
if (isConnected) {
|
||||
SDLNet_TCP_Close(networkSocket);
|
||||
networkSocket = nullptr;
|
||||
isConnected = false;
|
||||
receivedData.clear();
|
||||
OnDisconnected();
|
||||
SPDLOG_INFO("[Network] Ending receiving thread...");
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@ class Network {
|
||||
virtual void OnIncomingJson(nlohmann::json payload);
|
||||
virtual void OnConnected();
|
||||
virtual void OnDisconnected();
|
||||
virtual void ProcessOutgoingPackets();
|
||||
void SendDataToRemote(const char* payload);
|
||||
virtual void SendJsonToRemote(nlohmann::json packet);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user