Core/BattlePets: Journal lock improvements (#27178)

Co-authored-by: Shauren <shauren.trinity@gmail.com>
This commit is contained in:
Meji
2021-11-19 15:37:21 +01:00
committed by GitHub
parent 12cc779ab0
commit 895367e69f
10 changed files with 94 additions and 14 deletions

View File

@@ -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());
}

View File

@@ -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;

View File

@@ -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)

View File

@@ -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();

View File

@@ -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:

View File

@@ -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);

View File

@@ -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();

View File

@@ -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);

View File

@@ -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();

View File

@@ -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;