diff options
| -rw-r--r-- | src/server/game/BattlePets/BattlePetMgr.cpp | 41 | ||||
| -rw-r--r-- | src/server/game/BattlePets/BattlePetMgr.h | 6 | ||||
| -rw-r--r-- | src/server/game/Handlers/BattlePetHandler.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/BattlePetPackets.h | 18 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 2 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 13 | ||||
| -rw-r--r-- | src/server/game/World/World.h | 3 |
10 files changed, 94 insertions, 14 deletions
diff --git a/src/server/game/BattlePets/BattlePetMgr.cpp b/src/server/game/BattlePets/BattlePetMgr.cpp index c56ebe8532d..9ff67a33d1e 100644 --- a/src/server/game/BattlePets/BattlePetMgr.cpp +++ b/src/server/game/BattlePets/BattlePetMgr.cpp @@ -25,6 +25,7 @@ #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Player.h" +#include "World.h" #include "WorldSession.h" void BattlePetMgr::BattlePet::CalculateStats() @@ -408,16 +409,14 @@ void BattlePetMgr::AddPet(uint32 species, uint32 display, uint16 breed, BattlePe void BattlePetMgr::RemovePet(ObjectGuid guid) { + if (!HasJournalLock()) + return; + BattlePet* pet = GetPet(guid); if (!pet) return; pet->SaveInfo = BATTLE_PET_REMOVED; - - // spell is not unlearned on retail - /*if (GetPetCount(pet->PacketInfo.Species) == 0) - if (BattlePetSpeciesEntry const* speciesEntry = sBattlePetSpeciesStore.LookupEntry(pet->PacketInfo.Species)) - _owner->GetPlayer()->RemoveSpell(speciesEntry->SummonSpellID);*/ } void BattlePetMgr::ClearFanfare(ObjectGuid guid) @@ -434,6 +433,9 @@ void BattlePetMgr::ClearFanfare(ObjectGuid guid) void BattlePetMgr::ModifyName(ObjectGuid guid, std::string const& name, DeclinedName* declinedName) { + if (!HasJournalLock()) + return; + BattlePet* pet = GetPet(guid); if (!pet) return; @@ -508,6 +510,9 @@ uint16 BattlePetMgr::GetMaxPetLevel() const void BattlePetMgr::CageBattlePet(ObjectGuid guid) { + if (!HasJournalLock()) + return; + BattlePet* pet = GetPet(guid); if (!pet) return; @@ -595,8 +600,12 @@ void BattlePetMgr::DismissPet() void BattlePetMgr::SendJournal() { + if (!HasJournalLock()) + SendJournalLockStatus(); + WorldPackets::BattlePet::BattlePetJournal battlePetJournal; battlePetJournal.Trap = _trapLevel; + battlePetJournal.HasJournalLock = _hasJournalLock; for (auto& pet : _pets) if (pet.second.SaveInfo != BATTLE_PET_REMOVED) @@ -624,3 +633,25 @@ void BattlePetMgr::SendError(BattlePetError error, uint32 creatureId) battlePetError.CreatureID = creatureId; _owner->SendPacket(battlePetError.Write()); } + +void BattlePetMgr::SendJournalLockStatus() +{ + if (!IsJournalLockAcquired()) + ToggleJournalLock(true); + + if (HasJournalLock()) + { + WorldPackets::BattlePet::BattlePetJournalLockAcquired battlePetJournalLockAcquired; + _owner->SendPacket(battlePetJournalLockAcquired.Write()); + } + else + { + WorldPackets::BattlePet::BattlePetJournalLockDenied BattlePetJournalLockDenied; + _owner->SendPacket(BattlePetJournalLockDenied.Write()); + } +} + +bool BattlePetMgr::IsJournalLockAcquired() const +{ + return sWorld->IsBattlePetJournalLockAcquired(_owner->GetBattlenetAccountGUID()); +} diff --git a/src/server/game/BattlePets/BattlePetMgr.h b/src/server/game/BattlePets/BattlePetMgr.h index fb9ca64b3b4..7ad31f71db7 100644 --- a/src/server/game/BattlePets/BattlePetMgr.h +++ b/src/server/game/BattlePets/BattlePetMgr.h @@ -163,10 +163,14 @@ public: void SendUpdates(std::vector<std::reference_wrapper<BattlePet>> pets, bool petAdded); void SendError(BattlePetError error, uint32 creatureId); - bool HasJournalLock() const { return true; } + void SendJournalLockStatus(); + bool IsJournalLockAcquired() const; + bool HasJournalLock() const { return _hasJournalLock; } + void ToggleJournalLock(bool lock) { _hasJournalLock = lock; } private: WorldSession* _owner; + bool _hasJournalLock = false; uint16 _trapLevel = 0; std::unordered_map<uint64 /*battlePetGuid*/, BattlePet> _pets; std::vector<WorldPackets::BattlePet::BattlePetSlot> _slots; diff --git a/src/server/game/Handlers/BattlePetHandler.cpp b/src/server/game/Handlers/BattlePetHandler.cpp index 9d8583e5cc9..581be775faa 100644 --- a/src/server/game/Handlers/BattlePetHandler.cpp +++ b/src/server/game/Handlers/BattlePetHandler.cpp @@ -25,6 +25,14 @@ void WorldSession::HandleBattlePetRequestJournal(WorldPackets::BattlePet::Battle GetBattlePetMgr()->SendJournal(); } +void WorldSession::HandleBattlePetRequestJournalLock(WorldPackets::BattlePet::BattlePetRequestJournalLock& /*battlePetRequestJournalLock*/) +{ + GetBattlePetMgr()->SendJournalLockStatus(); + + if (GetBattlePetMgr()->HasJournalLock()) + GetBattlePetMgr()->SendJournal(); +} + void WorldSession::HandleBattlePetSetBattleSlot(WorldPackets::BattlePet::BattlePetSetBattleSlot& battlePetSetBattleSlot) { if (BattlePetMgr::BattlePet* pet = GetBattlePetMgr()->GetPet(battlePetSetBattleSlot.PetGuid)) @@ -44,6 +52,9 @@ void WorldSession::HandleBattlePetDeletePet(WorldPackets::BattlePet::BattlePetDe void WorldSession::HandleBattlePetSetFlags(WorldPackets::BattlePet::BattlePetSetFlags& battlePetSetFlags) { + if (!GetBattlePetMgr()->HasJournalLock()) + return; + if (BattlePetMgr::BattlePet* pet = GetBattlePetMgr()->GetPet(battlePetSetFlags.PetGuid)) { if (battlePetSetFlags.ControlType == FLAGS_CONTROL_TYPE_APPLY) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 75f261a96bc..fd0b4c0a07c 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -24,7 +24,7 @@ #include "AuthenticationPackets.h" #include "Battleground.h" #include "BattlegroundPackets.h" -#include "BattlePetPackets.h" +#include "BattlePetMgr.h" #include "CalendarMgr.h" #include "CharacterCache.h" #include "CharacterPackets.h" @@ -1108,9 +1108,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) pCurrChar->SetGuildLevel(0); } - // TODO: Move this to BattlePetMgr::SendJournalLock() just to have all packets in one file - WorldPackets::BattlePet::BattlePetJournalLockAcquired lock; - SendPacket(lock.Write()); + pCurrChar->GetSession()->GetBattlePetMgr()->SendJournalLockStatus(); pCurrChar->SendInitialPacketsBeforeAddToMap(); diff --git a/src/server/game/Server/Packets/BattlePetPackets.h b/src/server/game/Server/Packets/BattlePetPackets.h index ebcf4c3e997..5cd161045f4 100644 --- a/src/server/game/Server/Packets/BattlePetPackets.h +++ b/src/server/game/Server/Packets/BattlePetPackets.h @@ -69,7 +69,7 @@ namespace WorldPackets WorldPacket const* Write() override; uint16 Trap = 0; - bool HasJournalLock = true; + bool HasJournalLock = false; std::vector<std::reference_wrapper<BattlePetSlot>> Slots; std::vector<std::reference_wrapper<BattlePet>> Pets; }; @@ -82,6 +82,14 @@ namespace WorldPackets WorldPacket const* Write() override { return &_worldPacket; } }; + class BattlePetJournalLockDenied final : public ServerPacket + { + public: + BattlePetJournalLockDenied() : ServerPacket(SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + class BattlePetRequestJournal final : public ClientPacket { public: @@ -90,6 +98,14 @@ namespace WorldPackets void Read() override { } }; + class BattlePetRequestJournalLock final : public ClientPacket + { + public: + BattlePetRequestJournalLock(WorldPacket&& packet) : ClientPacket(CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK, std::move(packet)) { } + + void Read() override { } + }; + class BattlePetUpdates final : public ServerPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ae3d7162740..b036b6f8515 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -214,7 +214,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET_CHEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_MODIFY_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlePetModifyName); DEFINE_HANDLER(CMSG_BATTLE_PET_REQUEST_JOURNAL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlePetRequestJournal); - DEFINE_HANDLER(CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlePetRequestJournalLock); DEFINE_HANDLER(CMSG_BATTLE_PET_SET_BATTLE_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlePetSetBattleSlot); DEFINE_HANDLER(CMSG_BATTLE_PET_SET_FLAGS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlePetSetFlags); DEFINE_HANDLER(CMSG_BATTLE_PET_SUMMON, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBattlePetSummon); @@ -1045,7 +1045,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_LICENSE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_RESTORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_REVOKED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 885a20666f2..1552730bfb0 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -562,6 +562,10 @@ void WorldSession::LogoutPlayer(bool save) ///- Remove pet _player->RemovePet(nullptr, PET_SAVE_AS_CURRENT, true); + ///- Release battle pet journal lock + if (_battlePetMgr->HasJournalLock()) + _battlePetMgr->ToggleJournalLock(false); + ///- Clear whisper whitelist _player->ClearWhisperWhiteList(); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 6f56ed013ee..439ad78f70a 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -190,6 +190,7 @@ namespace WorldPackets namespace BattlePet { class BattlePetRequestJournal; + class BattlePetRequestJournalLock; class BattlePetSetBattleSlot; class BattlePetModifyName; class BattlePetDeletePet; @@ -1744,6 +1745,7 @@ class TC_GAME_API WorldSession // Battle Pets void HandleBattlePetRequestJournal(WorldPackets::BattlePet::BattlePetRequestJournal& battlePetRequestJournal); + void HandleBattlePetRequestJournalLock(WorldPackets::BattlePet::BattlePetRequestJournalLock& battlePetRequestJournalLock); void HandleBattlePetSetBattleSlot(WorldPackets::BattlePet::BattlePetSetBattleSlot& battlePetSetBattleSlot); void HandleBattlePetModifyName(WorldPackets::BattlePet::BattlePetModifyName& battlePetModifyName); void HandleBattlePetDeletePet(WorldPackets::BattlePet::BattlePetDeletePet& battlePetDeletePet); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 8522a194541..6b20cbb9989 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -350,11 +350,13 @@ void World::AddSession_(WorldSession* s) if (RemoveQueuedPlayer(old->second)) decrease_session = false; // not remove replaced session form queue if listed + Trinity::Containers::MultimapErasePair(m_sessionsByBnetGuid, old->second->GetBattlenetAccountGUID(), old->second); delete old->second; } } m_sessions[s->GetAccountId()] = s; + m_sessionsByBnetGuid.emplace(s->GetBattlenetAccountGUID(), s); uint32 Sessions = GetActiveAndQueuedSessionCount(); uint32 pLimit = GetPlayerAmountLimit(); @@ -3242,8 +3244,8 @@ void World::UpdateSessions(uint32 diff) m_disconnects[itr->second->GetAccountId()] = GameTime::GetGameTime(); RemoveQueuedPlayer(pSession); m_sessions.erase(itr); + Trinity::Containers::MultimapErasePair(m_sessionsByBnetGuid, pSession->GetBattlenetAccountGUID(), pSession); delete pSession; - } } } @@ -3643,6 +3645,15 @@ void World::UpdateAreaDependentAuras() } } +bool World::IsBattlePetJournalLockAcquired(ObjectGuid battlenetAccountGuid) +{ + for (auto&& sessionForBnet : Trinity::Containers::MapEqualRange(m_sessionsByBnetGuid, battlenetAccountGuid)) + if (sessionForBnet.second->GetBattlePetMgr()->HasJournalLock()) + return true; + + return false; +} + void World::LoadWorldStates() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index aad6025a6b4..caa5ec9a48c 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -789,6 +789,8 @@ class TC_GAME_API World void UpdateAreaDependentAuras(); + bool IsBattlePetJournalLockAcquired(ObjectGuid battlenetAccountGuid); + uint32 GetCleaningFlags() const { return m_CleaningFlags; } void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; } void ResetEventSeasonalQuests(uint16 event_id); @@ -838,6 +840,7 @@ class TC_GAME_API World time_t blackmarket_timer; SessionMap m_sessions; + std::unordered_multimap<ObjectGuid, WorldSession*> m_sessionsByBnetGuid; typedef std::unordered_map<uint32, time_t> DisconnectMap; DisconnectMap m_disconnects; uint32 m_maxActiveSessionCount; |
