Files
DarkflameServer/dNet/ZoneInstanceManager.cpp
Aaron Kimbrell 4cf0909d52 feat(master): an edit mode flag on a private instance, down to its world server
CreatePrivateZone carries editMode as one more byte, written only when set, so
a plain private zone is sent as before. Master keeps it on the instance, starts
the world server with -editmode 1, and gives a private instance's replacement
(a reload or a live update) the same flag. Nothing sets it yet.

A capped string now skips the characters it cut, so what follows it is read
from the right place. A request to join a private instance that is still
starting is answered once its world server is ready, instead of at once with
an address nothing listens on yet.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-10 17:34:13 -06:00

63 lines
2.5 KiB
C++

#include "ZoneInstanceManager.h"
// Custom Classes
#include "MasterPackets.h"
// Static Variables
ZoneInstanceManager* ZoneInstanceManager::m_Address = nullptr;
//! Requests a zone transfer
void ZoneInstanceManager::RequestZoneTransfer(dServer* server, uint32_t zoneID, uint32_t zoneClone, bool mythranShift, TransferCallback callback) {
RequestZoneTransfer(server, zoneID, zoneClone, mythranShift, Stamps{}, [callback](bool mythranShift, uint32_t zoneID, uint32_t zoneInstance, uint32_t zoneClone, std::string serverIP, uint16_t serverPort, Stamps) {
callback(mythranShift, zoneID, zoneInstance, zoneClone, serverIP, serverPort);
});
}
void ZoneInstanceManager::RequestZoneTransfer(dServer* server, uint32_t zoneID, uint32_t zoneClone, bool mythranShift, const Stamps& stamps, StampedTransferCallback callback) {
const auto nextID = ++currentRequestID;
requests[nextID] = callback;
MasterPackets::RequestZoneTransfer request;
request.requestID = nextID;
request.mythranShift = mythranShift;
request.zoneID = zoneID;
request.cloneID = zoneClone;
request.stamps = stamps;
MasterPackets::SendToMaster(request, server);
}
//! Handles a zone transfer response
void ZoneInstanceManager::HandleRequestZoneTransferResponse(const MasterPackets::RequestZoneTransferResponse& response) {
const auto entry = requests.find(response.requestID);
if (entry != requests.end()) {
entry->second(response.mythranShift > 0, response.zoneID, response.zoneInstance, response.zoneClone, response.serverIP.string, response.serverPort, response.stamps);
requests.erase(entry);
}
}
void ZoneInstanceManager::CreatePrivateZone(dServer* server, uint32_t zoneID, uint32_t zoneClone, const std::string& password, const bool editMode) {
MasterPackets::CreatePrivateZone request;
request.zoneID = zoneID;
request.cloneID = zoneClone;
request.password = password;
request.editMode = editMode ? 1 : 0;
MasterPackets::SendToMaster(request, server);
}
void ZoneInstanceManager::RequestPrivateZone(
dServer* server,
bool mythranShift,
const std::string& password,
TransferCallback callback) {
const auto nextID = ++currentRequestID;
requests[nextID] = [callback](bool mythranShift, uint32_t zoneID, uint32_t zoneInstance, uint32_t zoneClone, std::string serverIP, uint16_t serverPort, Stamps) {
callback(mythranShift, zoneID, zoneInstance, zoneClone, serverIP, serverPort);
};
MasterPackets::RequestPrivateZone request;
request.requestID = nextID;
request.mythranShift = mythranShift;
request.password = password;
MasterPackets::SendToMaster(request, server);
}