mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-06-10 00:34:20 +00:00
fix: bugs in private instances causing master crashes (#1986)
* fix: bugs in private instances causing master crashes tested that creating a private instance and shutting down the server no longer crashes master * Update InstanceManager.cpp
This commit is contained in:
@@ -332,6 +332,12 @@ int InstanceManager::GetHardCap(LWOMAPID mapID) {
|
|||||||
return zone ? zone->population_hard_cap : 12;
|
return zone ? zone->population_hard_cap : 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InstanceManager::PruneUnreadyInstances() {
|
||||||
|
for (int i = static_cast<int>(m_Instances.size()) - 1; i >= 0; i--) {
|
||||||
|
if (!m_Instances[i]->GetIsReady()) m_Instances.erase(m_Instances.cbegin() + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Instance::SetShutdownComplete(const bool value) {
|
void Instance::SetShutdownComplete(const bool value) {
|
||||||
m_Shutdown = value;
|
m_Shutdown = value;
|
||||||
}
|
}
|
||||||
@@ -359,4 +365,3 @@ bool Instance::IsFull(bool isFriendTransfer) const {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -133,6 +133,7 @@ public:
|
|||||||
const InstancePtr& CreatePrivateInstance(LWOMAPID mapID, LWOCLONEID cloneID, const std::string& password);
|
const InstancePtr& CreatePrivateInstance(LWOMAPID mapID, LWOCLONEID cloneID, const std::string& password);
|
||||||
const InstancePtr& FindPrivateInstance(const std::string& password);
|
const InstancePtr& FindPrivateInstance(const std::string& password);
|
||||||
void SetIsShuttingDown(bool value) { this->m_IsShuttingDown = value; };
|
void SetIsShuttingDown(bool value) { this->m_IsShuttingDown = value; };
|
||||||
|
void PruneUnreadyInstances();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string mExternalIP;
|
std::string mExternalIP;
|
||||||
|
|||||||
@@ -665,7 +665,7 @@ void HandlePacket(Packet* packet) {
|
|||||||
inStream.Read(theirInstanceID);
|
inStream.Read(theirInstanceID);
|
||||||
|
|
||||||
const auto& instance =
|
const auto& instance =
|
||||||
Game::im->FindInstance(theirZoneID, theirInstanceID);
|
Game::im->FindInstanceWithPrivate(theirZoneID, theirInstanceID);
|
||||||
if (instance) {
|
if (instance) {
|
||||||
instance->AddPlayer(Player());
|
instance->AddPlayer(Player());
|
||||||
} else {
|
} else {
|
||||||
@@ -762,7 +762,7 @@ void HandlePacket(Packet* packet) {
|
|||||||
|
|
||||||
LOG("Got world ready %i %i", zoneID, instanceID);
|
LOG("Got world ready %i %i", zoneID, instanceID);
|
||||||
|
|
||||||
const auto& instance = Game::im->FindInstance(zoneID, instanceID);
|
const auto& instance = Game::im->FindInstanceWithPrivate(zoneID, instanceID);
|
||||||
|
|
||||||
if (instance == nullptr) {
|
if (instance == nullptr) {
|
||||||
LOG("Failed to find zone to ready");
|
LOG("Failed to find zone to ready");
|
||||||
@@ -858,13 +858,11 @@ int ShutdownSequence(int32_t signal) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// A server might not be finished spinning up yet, remove all of those here.
|
// A server might not be finished spinning up yet, remove all of those here.
|
||||||
|
// prune the unready ones before looping over all of them
|
||||||
|
Game::im->PruneUnreadyInstances();
|
||||||
for (const auto& instance : Game::im->GetInstances()) {
|
for (const auto& instance : Game::im->GetInstances()) {
|
||||||
if (!instance) continue;
|
if (!instance) continue;
|
||||||
|
|
||||||
if (!instance->GetIsReady()) {
|
|
||||||
Game::im->RemoveInstance(instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
instance->SetIsShuttingDown(true);
|
instance->SetIsShuttingDown(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user