mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/BattlePets: Journal lock improvements (#27178)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user