aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.cpp41
-rw-r--r--src/server/game/BattlePets/BattlePetMgr.h6
-rw-r--r--src/server/game/Handlers/BattlePetHandler.cpp11
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp6
-rw-r--r--src/server/game/Server/Packets/BattlePetPackets.h18
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h2
-rw-r--r--src/server/game/World/World.cpp13
-rw-r--r--src/server/game/World/World.h3
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;