diff --git a/dMasterServer/InstanceManager.cpp b/dMasterServer/InstanceManager.cpp index 5f2672e0..3c40136c 100644 --- a/dMasterServer/InstanceManager.cpp +++ b/dMasterServer/InstanceManager.cpp @@ -273,6 +273,16 @@ Instance* InstanceManager::FindInstance(LWOMAPID mapID, LWOINSTANCEID instanceID return nullptr; } +Instance* InstanceManager::FindInstanceWithPrivate(LWOMAPID mapID, LWOINSTANCEID instanceID) { + for (Instance* i : m_Instances) { + if (i && i->GetMapID() == mapID && i->GetInstanceID() == instanceID && !i->GetShutdownComplete() && !i->GetIsShuttingDown()) { + return i; + } + } + + return nullptr; +} + Instance* InstanceManager::CreatePrivateInstance(LWOMAPID mapID, LWOCLONEID cloneID, const std::string& password) { auto* instance = FindPrivateInstance(password); diff --git a/dMasterServer/InstanceManager.h b/dMasterServer/InstanceManager.h index 1fc4af43..3b816b58 100644 --- a/dMasterServer/InstanceManager.h +++ b/dMasterServer/InstanceManager.h @@ -76,25 +76,25 @@ public: void Shutdown(); private: - std::string m_IP; - uint32_t m_Port; - LWOZONEID m_ZoneID; - int m_MaxClientsSoftCap; - int m_MaxClientsHardCap; - int m_CurrentClientCount; - std::vector m_Players; - SystemAddress m_SysAddr; - bool m_Ready; - bool m_IsShuttingDown; - std::vector m_PendingRequests; - std::vector m_PendingAffirmations; + std::string m_IP{}; + uint32_t m_Port{}; + LWOZONEID m_ZoneID{}; + int m_MaxClientsSoftCap{}; + int m_MaxClientsHardCap{}; + int m_CurrentClientCount{}; + std::vector m_Players{}; + SystemAddress m_SysAddr{}; + bool m_Ready{}; + bool m_IsShuttingDown{}; + std::vector m_PendingRequests{}; + std::vector m_PendingAffirmations{}; - uint32_t m_AffirmationTimeout; + uint32_t m_AffirmationTimeout{}; - bool m_IsPrivate; - std::string m_Password; + bool m_IsPrivate{}; + std::string m_Password{}; - bool m_Shutdown; + bool m_Shutdown{}; //Private functions: }; @@ -125,6 +125,7 @@ public: Instance* FindInstance(LWOMAPID mapID, bool isFriendTransfer, LWOCLONEID cloneId = 0); Instance* FindInstance(LWOMAPID mapID, LWOINSTANCEID instanceID); + Instance* FindInstanceWithPrivate(LWOMAPID mapID, LWOINSTANCEID instanceID); Instance* CreatePrivateInstance(LWOMAPID mapID, LWOCLONEID cloneID, const std::string& password); Instance* FindPrivateInstance(const std::string& password); diff --git a/dMasterServer/MasterServer.cpp b/dMasterServer/MasterServer.cpp index 72a35f2a..89afb124 100644 --- a/dMasterServer/MasterServer.cpp +++ b/dMasterServer/MasterServer.cpp @@ -42,6 +42,7 @@ #include "Server.h" #include "CDZoneTableTable.h" #include "eGameMasterLevel.h" +#include "StringifiedEnum.h" #ifdef DARKFLAME_PLATFORM_UNIX @@ -556,7 +557,7 @@ void HandlePacket(Packet* packet) { Instance* in = Game::im->GetInstance(zoneID, false, zoneClone); for (auto* instance : Game::im->GetInstances()) { - LOG("Instance: %i/%i/%i -> %i", instance->GetMapID(), instance->GetCloneID(), instance->GetInstanceID(), instance == in); + LOG("Instance: %i/%i/%i -> %i %s", instance->GetMapID(), instance->GetCloneID(), instance->GetInstanceID(), instance == in, instance->GetSysAddr().ToString()); } if (in && !in->GetIsReady()) //Instance not ready, make a pending request @@ -597,15 +598,10 @@ void HandlePacket(Packet* packet) { if (!Game::im->IsPortInUse(theirPort)) { Instance* in = new Instance(theirIP.string, theirPort, theirZoneID, theirInstanceID, 0, 12, 12); - SystemAddress copy; - copy.binaryAddress = packet->systemAddress.binaryAddress; - copy.port = packet->systemAddress.port; - - in->SetSysAddr(copy); + in->SetSysAddr(packet->systemAddress); Game::im->AddInstance(in); } else { - auto instance = Game::im->FindInstance( - theirZoneID, static_cast(theirInstanceID)); + auto* instance = Game::im->FindInstanceWithPrivate(theirZoneID, static_cast(theirInstanceID)); if (instance) { instance->SetSysAddr(packet->systemAddress); } @@ -613,22 +609,14 @@ void HandlePacket(Packet* packet) { } if (theirServerType == ServerType::Chat) { - SystemAddress copy; - copy.binaryAddress = packet->systemAddress.binaryAddress; - copy.port = packet->systemAddress.port; - - chatServerMasterPeerSysAddr = copy; + chatServerMasterPeerSysAddr = packet->systemAddress; } if (theirServerType == ServerType::Auth) { - SystemAddress copy; - copy.binaryAddress = packet->systemAddress.binaryAddress; - copy.port = packet->systemAddress.port; - - authServerMasterPeerSysAddr = copy; + authServerMasterPeerSysAddr = packet->systemAddress; } - LOG("Received server info, instance: %i port: %i", theirInstanceID, theirPort); + LOG("Received %s server info, instance: %i port: %i", StringifiedEnum::ToString(theirServerType).data(), theirInstanceID, theirPort); break; } @@ -692,7 +680,7 @@ void HandlePacket(Packet* packet) { if (instance) { instance->AddPlayer(Player()); } else { - printf("Instance missing? What?"); + LOG("Instance missing? What?"); } break; } @@ -733,8 +721,8 @@ void HandlePacket(Packet* packet) { inStream.Read(character); password += character; } - - Game::im->CreatePrivateInstance(mapId, cloneId, password.c_str()); + auto* newInst = Game::im->CreatePrivateInstance(mapId, cloneId, password.c_str()); + LOG("Creating private zone %i/%i/%i with password %s", newInst->GetMapID(), newInst->GetCloneID(), newInst->GetInstanceID(), password.c_str()); break; } @@ -835,11 +823,10 @@ void HandlePacket(Packet* packet) { } case MessageType::Master::SHUTDOWN_RESPONSE: { - RakNet::BitStream inStream(packet->data, packet->length, false); - uint64_t header = inStream.Read(header); + CINSTREAM_SKIP_HEADER; auto* instance = Game::im->GetInstanceBySysAddr(packet->systemAddress); - + LOG("Got shutdown response from %s", packet->systemAddress.ToString()); if (instance == nullptr) { return; }