diff --git a/src/CNShardServer.cpp b/src/CNShardServer.cpp index 28bdb47..7c22600 100644 --- a/src/CNShardServer.cpp +++ b/src/CNShardServer.cpp @@ -56,7 +56,8 @@ void CNShardServer::newConnection(CNSocket* cns) { cns->setActiveKey(SOCKETKEY_E); // by default they accept keys encrypted with the default key } -void CNShardServer::killConnection(CNSocket* cns) { +// must be static to be called from PlayerManager::exitDuplicate() +void CNShardServer::_killConnection(CNSocket* cns) { // check if the player ever sent a REQ_PC_ENTER if (PlayerManager::players.find(cns) == PlayerManager::players.end()) return; @@ -76,6 +77,10 @@ void CNShardServer::killConnection(CNSocket* cns) { CNSharedData::erasePlayer(key); } +void CNShardServer::killConnection(CNSocket *cns) { + _killConnection(cns); +} + void CNShardServer::onStep() { time_t currTime = getTime(); diff --git a/src/CNShardServer.hpp b/src/CNShardServer.hpp index c03e30d..078b59c 100644 --- a/src/CNShardServer.hpp +++ b/src/CNShardServer.hpp @@ -21,6 +21,8 @@ public: CNShardServer(uint16_t p); + static void _killConnection(CNSocket *cns); + void newConnection(CNSocket* cns); void killConnection(CNSocket* cns); void onStep(); diff --git a/src/PlayerManager.cpp b/src/PlayerManager.cpp index 6baf8bf..952ff6f 100644 --- a/src/PlayerManager.cpp +++ b/src/PlayerManager.cpp @@ -885,6 +885,7 @@ WarpLocation PlayerManager::getRespawnPoint(Player *plr) { return best; } + bool PlayerManager::isAccountInUse(int accountId) { std::map::iterator it; for (it = PlayerManager::players.begin(); it != PlayerManager::players.end(); it++) @@ -897,15 +898,18 @@ bool PlayerManager::isAccountInUse(int accountId) { void PlayerManager::exitDuplicate(int accountId) { std::map::iterator it; - for (it = PlayerManager::players.begin(); it != PlayerManager::players.end(); it++) - { - if (it->second.plr->accountId == accountId) - { + + // disconnect any duplicate players + for (it = players.begin(); it != players.end(); it++) { + if (it->second.plr->accountId == accountId) { CNSocket* sock = it->first; + INITSTRUCT(sP_FE2CL_REP_PC_EXIT_DUPLICATE, resp); resp.iErrorCode = 0; sock->sendPacket((void*)&resp, P_FE2CL_REP_PC_EXIT_DUPLICATE, sizeof(sP_FE2CL_REP_PC_EXIT_DUPLICATE)); + sock->kill(); + CNShardServer::_killConnection(sock); } } }