void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recv_data) { ObjectGuid playerGuid; recv_data >> playerGuid; // check if character is currently a playerbot, if so then logout Player *checkChar = sObjectMgr.GetPlayer(playerGuid); if (checkChar && checkChar->GetPlayerbotAI()) { checkChar->GetPlayerbotAI()->GetManager()->LogoutPlayerBot(playerGuid); --checkChar->GetPlayerbotAI()->GetManager()->m_botCount; } if (PlayerLoading() || GetPlayer() != NULL) { sLog.outError("Player tryes to login again, AccountId = %d", GetAccountId()); return; } m_playerLoading = true; DEBUG_LOG("WORLD: Recvd Player Logon Message"); LoginQueryHolder* holder = new LoginQueryHolder(GetAccountId(), playerGuid); if (!holder->Initialize()) { delete holder; // delete all unprocessed queries m_playerLoading = false; return; } CharacterDatabase.DelayQueryHolder(&chrHandler, &CharacterHandler::HandlePlayerLoginCallback, holder); }
void WorldSession::HandlePlayerLoginOpcode( WorldPacket & recv_data ) { if(PlayerLoading() || GetPlayer() != NULL) { sLog.outError("Player tryes to login again, AccountId = %d", GetAccountId()); return; } m_playerLoading = true; uint64 playerGuid = 0; DEBUG_LOG( "WORLD: Recvd Player Logon Message" ); recv_data >> playerGuid; LoginQueryHolder *holder = new LoginQueryHolder(GetAccountId(), playerGuid); if(!holder->Initialize()) { delete holder; // delete all unprocessed queries m_playerLoading = false; return; } CharacterDatabase.DelayQueryHolder(&chrHandler, &CharacterHandler::HandlePlayerLoginCallback, holder); }
void WorldSession::HandlePlayerLoginOpcode(WorldPacket & recv_data) { if (PlayerLoading() || GetPlayer() != NULL) { sLog->outError("Player tryes to login again, AccountId = %d", GetAccountId()); return; } m_playerLoading = true; uint64 playerGuid = 0; sLog->outDebug("WORLD: Recvd Player Logon Message"); recv_data >> playerGuid; if (!CharacterDatabase.PQuery("SELECT 1 FROM characters WHERE guid='%d' AND account='%d'", GUID_LOPART(playerGuid), GetAccountId())) KickPlayer(); LoginQueryHolder *holder = new LoginQueryHolder(GetAccountId(), playerGuid); if (!holder->Initialize()) { delete holder; // delete all unprocessed queries m_playerLoading = false; return; } CharacterDatabase.DelayQueryHolder(&chrHandler, &CharacterHandler::HandlePlayerLoginCallback, holder); }
void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recv_data) { ObjectGuid playerGuid; recv_data >> playerGuid; Player* pCurrChar = nullptr; pCurrChar = ObjectAccessor::FindPlayer(playerGuid, false); WorldPacket data(SMSG_CHARACTER_LOGIN_FAILED, 1); if (PlayerLoading()) { sLog.outError("HandlePlayerLoginOpcode> Player try to login again while already in loading stage, AccountId = %u", GetAccountId()); data << (uint8)CHAR_LOGIN_DUPLICATE_CHARACTER; SendPacket(data, true); return; } if (_player) { // player is reconnecting if (!pCurrChar) { sLog.outError("HandlePlayerLoginOpcode> %s try to login a second char, AccountId = %u", _player->GetGuidStr().c_str(), GetAccountId()); data << (uint8)CHAR_LOGIN_DUPLICATE_CHARACTER; SendPacket(data, true); return; } if (!isLogingOut()) { sLog.outError("HandlePlayerLoginOpcode> %s try to login again, AccountId = %u", pCurrChar->GetGuidStr().c_str(), GetAccountId()); data << (uint8)CHAR_LOGIN_FAILED; SendPacket(data, true); return; } if (!_player->IsInWorld()) // finish pending transfers before starting the logout while (_player && _player->IsBeingTeleportedFar()) HandleMoveWorldportAckOpcode(); HandlePlayerReconnect(); return; } DEBUG_LOG("WORLD: Received opcode Player Logon Message"); LoginQueryHolder* holder = new LoginQueryHolder(GetAccountId(), playerGuid); if (!holder->Initialize()) { delete holder; // delete all unprocessed queries m_playerLoading = false; return; } CharacterDatabase.DelayQueryHolder(&chrHandler, &CharacterHandler::HandlePlayerLoginCallback, holder); }
void WorldSession::LoginPlayer(ObjectGuid loginPlayerGuid) { ASSERT(loginPlayerGuid.IsPlayer()); LoginQueryHolder *holder = new LoginQueryHolder(GetAccountId(), loginPlayerGuid); if (!holder->Initialize()) { delete holder; // delete all unprocessed queries return; } m_playerLoading = true; CharacterDatabase.DelayQueryHolderUnsafe(&chrHandler, &CharacterHandler::HandlePlayerLoginCallback, holder); }
// Can't easily reuse HandlePlayerLoginOpcode for logging in bots because it assumes // a WorldSession exists for the bot. The WorldSession for a bot is created after the character is loaded. void PlayerbotMgr::LoginPlayerBot(ObjectGuid playerGuid) { // has bot already been added? if (sObjectMgr.GetPlayer(playerGuid)) return; uint32 accountId = sObjectMgr.GetPlayerAccountIdByGUID(playerGuid); if (accountId == 0) return; LoginQueryHolder* holder = new LoginQueryHolder(accountId, playerGuid); if (!holder->Initialize()) { delete holder; // delete all unprocessed queries return; } CharacterDatabase.DelayQueryHolder(&chrHandler, &CharacterHandler::HandlePlayerBotLoginCallback, holder); }
void WorldSession::HandlePlayerLoginOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data, 1+4+4); m_playerLoading = true; uint64 playerGuid = 0; sLog.outDebug( "WORLD: Recvd CMSG_AUTH_RESPONSE Message" ); uint8 lenPassword; uint32 accountId; uint32 patchVer; std::string password; recv_data >> lenPassword; CHECK_PACKET_SIZE(recv_data, 1+4+4+lenPassword); recv_data >> accountId; recv_data >> patchVer; recv_data >> password; QueryResult* result = CharacterDatabase.PQuery("SELECT guid FROM characters WHERE accountid = '%u'", accountId); if( !result ) { sLog.outError("ERROR: Player guid not found for account %u", accountId); return; } playerGuid = (*result)[0].GetUInt32(); delete result; LoginQueryHolder *holder = new LoginQueryHolder(accountId, playerGuid); if(!holder->Initialize()) { sLog.outDebug("HOLDER: Deleting holder"); delete holder; // delete all unprocessed queries m_playerLoading = false; return; } CharacterDatabase.DelayQueryHolder(&chrHandler, &CharacterHandler::HandlePlayerLoginCallback, holder); }
// This callback is different from the normal HandlePlayerLoginCallback in that it // sets up the bot's world session and also stores the pointer to the bot player in the master's // world session m_playerBots map void HandlePlayerBotLoginCallback(QueryResult* /*dummy*/, SqlQueryHolder* holder) { if (!holder) return; LoginQueryHolder* lqh = (LoginQueryHolder*) holder; WorldSession* masterSession = sWorld.FindSession(lqh->GetAccountId()); if (! masterSession || sObjectMgr.GetPlayer(lqh->GetGuid())) { delete holder; return; } // The bot's WorldSession is owned by the bot's Player object // The bot's WorldSession is deleted by PlayerbotMgr::LogoutPlayerBot WorldSession* botSession = new WorldSession(lqh->GetAccountId(), nullptr, SEC_PLAYER, 0, LOCALE_enUS); botSession->HandlePlayerLogin(lqh); // will delete lqh masterSession->GetPlayer()->GetPlayerbotMgr()->OnBotLogin(botSession->GetPlayer()); }
void WorldSession::HandlePlayerLoginOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data,8); m_playerLoading = true; uint64 playerGuid = 0; DEBUG_LOG( "WORLD: Recvd Player Logon Message" ); recv_data >> playerGuid; LoginQueryHolder *holder = new LoginQueryHolder(GetAccountId(), playerGuid); if(!holder->Initialize()) { delete holder; // delete all unprocessed queries m_playerLoading = false; return; } CharacterDatabase.DelayQueryHolder(&chrHandler, &CharacterHandler::HandlePlayerLoginCallback, holder); }
// Playerbot mod: is different from the normal HandlePlayerLoginCallback in that it // sets up the bot's world session and also stores the pointer to the bot player in the master's // world session m_playerBots map void HandlePlayerBotLoginCallback(QueryResult * /*dummy*/, SqlQueryHolder * holder, uint32 masterId) { if (!holder) return; LoginQueryHolder* lqh = (LoginQueryHolder*) holder; WorldSession* masterSession = sWorld.FindSession(masterId); if (! masterSession || sObjectMgr.GetPlayer(lqh->GetGuid())) { delete holder; return; } // The bot's WorldSession is owned by the bot's Player object // The bot's WorldSession is deleted by PlayerbotMgr::LogoutPlayerBot WorldSession *botSession = new WorldSession(lqh->GetAccountId(), NULL, SEC_PLAYER, 0, masterSession->GetSessionDbcLocale()); botSession->m_Address = "bot"; botSession->HandlePlayerLogin(lqh); // will delete lqh masterSession->GetPlayer()->GetPlayerbotMgr()->OnBotLogin(botSession->GetPlayer()); }
// Playerbot mod. Can't easily reuse HandlePlayerLoginOpcode for logging in bots because it assumes // a WorldSession exists for the bot. The WorldSession for a bot is created after the character is loaded. void PlayerbotMgr::AddPlayerBot(ObjectGuid playerGuid) { if (sWorld.getConfig(CONFIG_BOOL_PLAYERBOT_DISABLE)) return; // has bot already been added? if (sObjectMgr.GetPlayer(playerGuid)) return; uint32 accountId = sAccountMgr.GetPlayerAccountIdByGUID(playerGuid); if (accountId == 0) return; LoginQueryHolder *holder = new LoginQueryHolder(accountId, playerGuid); if (!holder->Initialize()) { delete holder; // delete all unprocessed queries return; } uint32 masterId = sAccountMgr.GetPlayerAccountIdByGUID(GetMaster()->GetObjectGuid()); CharacterDatabase.DelayQueryHolder(&chrHandler, &CharacterHandler::HandlePlayerBotLoginCallback, holder, masterId); }