From 751f4dd8b259166d755597f9bc2e372eb6f94328 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 23 Nov 2021 14:01:16 -0500 Subject: [PATCH] Core/BattlePets: Journal lock improvements Port From (https://github.com/TrinityCore/TrinityCore/commit/895367e69fac542ea00079ee1405228d9f150898) --- Source/Game/BattlePets/BattlePetManager.cs | 38 ++++++++++++++++--- Source/Game/Handlers/BattlePetHandler.cs | 12 ++++++ Source/Game/Handlers/CharacterHandler.cs | 3 +- .../Networking/Packets/BattlePetPackets.cs | 16 +++++++- Source/Game/Server/WorldManager.cs | 14 +++++++ Source/Game/Server/WorldSession.cs | 4 ++ 6 files changed, 78 insertions(+), 9 deletions(-) diff --git a/Source/Game/BattlePets/BattlePetManager.cs b/Source/Game/BattlePets/BattlePetManager.cs index 2f0422498..f01feb5aa 100644 --- a/Source/Game/BattlePets/BattlePetManager.cs +++ b/Source/Game/BattlePets/BattlePetManager.cs @@ -363,16 +363,14 @@ namespace Game.BattlePets public void RemovePet(ObjectGuid guid) { + if (!HasJournalLock()) + return; + BattlePet pet = GetPet(guid); if (pet == null) return; pet.SaveInfo = BattlePetSaveInfo.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);*/ } public void ClearFanfare(ObjectGuid guid) @@ -389,6 +387,9 @@ namespace Game.BattlePets public void ModifyName(ObjectGuid guid, string name, DeclinedName declinedName) { + if (!HasJournalLock()) + return; + BattlePet pet = GetPet(guid); if (pet == null) return; @@ -458,6 +459,9 @@ namespace Game.BattlePets public void CageBattlePet(ObjectGuid guid) { + if (!HasJournalLock()) + return; + BattlePet pet = GetPet(guid); if (pet == null) return; @@ -548,8 +552,12 @@ namespace Game.BattlePets public void SendJournal() { + if (!HasJournalLock()) + SendJournalLockStatus(); + BattlePetJournal battlePetJournal = new(); battlePetJournal.Trap = _trapLevel; + battlePetJournal.HasJournalLock = _hasJournalLock; foreach (var pet in _pets) if (pet.Value.SaveInfo != BattlePetSaveInfo.Removed) @@ -577,15 +585,33 @@ namespace Game.BattlePets _owner.SendPacket(battlePetError); } + public void SendJournalLockStatus() + { + if (!IsJournalLockAcquired()) + ToggleJournalLock(true); + + if (HasJournalLock()) + _owner.SendPacket(new BattlePetJournalLockAcquired()); + else + _owner.SendPacket(new BattlePetJournalLockDenied()); + } + + public bool IsJournalLockAcquired() + { + return Global.WorldMgr.IsBattlePetJournalLockAcquired(_owner.GetBattlenetAccountGUID()); + } + public BattlePetSlot GetSlot(byte slot) { return slot < _slots.Count ? _slots[slot] : null; } WorldSession GetOwner() { return _owner; } public ushort GetTrapLevel() { return _trapLevel; } public List GetSlots() { return _slots; } - public bool HasJournalLock() { return true; } + public bool HasJournalLock() { return _hasJournalLock; } + public void ToggleJournalLock(bool on) { _hasJournalLock = on; } WorldSession _owner; + bool _hasJournalLock; ushort _trapLevel; Dictionary _pets = new(); List _slots = new(); diff --git a/Source/Game/Handlers/BattlePetHandler.cs b/Source/Game/Handlers/BattlePetHandler.cs index ee27e3052..45f9aa78f 100644 --- a/Source/Game/Handlers/BattlePetHandler.cs +++ b/Source/Game/Handlers/BattlePetHandler.cs @@ -30,6 +30,15 @@ namespace Game GetBattlePetMgr().SendJournal(); } + [WorldPacketHandler(ClientOpcodes.BattlePetRequestJournalLock)] + void HandleBattlePetRequestJournalLock(BattlePetRequestJournalLock battlePetRequestJournalLock) + { + GetBattlePetMgr().SendJournalLockStatus(); + + if (GetBattlePetMgr().HasJournalLock()) + GetBattlePetMgr().SendJournal(); + } + [WorldPacketHandler(ClientOpcodes.BattlePetSetBattleSlot)] void HandleBattlePetSetBattleSlot(BattlePetSetBattleSlot battlePetSetBattleSlot) { @@ -57,6 +66,9 @@ namespace Game [WorldPacketHandler(ClientOpcodes.BattlePetSetFlags)] void HandleBattlePetSetFlags(BattlePetSetFlags battlePetSetFlags) { + if (!GetBattlePetMgr().HasJournalLock()) + return; + var pet = GetBattlePetMgr().GetPet(battlePetSetFlags.PetGuid); if (pet != null) { diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index 2f75f2d15..0f225e35b 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -784,8 +784,7 @@ namespace Game pCurrChar.SetGuildLevel(0); } - // TODO: Move this to BattlePetMgr::SendJournalLock() just to have all packets in one file - SendPacket(new BattlePetJournalLockAcquired()); + pCurrChar.GetSession().GetBattlePetMgr().SendJournalLockStatus(); pCurrChar.SendInitialPacketsBeforeAddToMap(); diff --git a/Source/Game/Networking/Packets/BattlePetPackets.cs b/Source/Game/Networking/Packets/BattlePetPackets.cs index 9539380d0..432351971 100644 --- a/Source/Game/Networking/Packets/BattlePetPackets.cs +++ b/Source/Game/Networking/Packets/BattlePetPackets.cs @@ -43,7 +43,7 @@ namespace Game.Networking.Packets } public ushort Trap; - bool HasJournalLock = true; + public bool HasJournalLock = false; public List Slots = new(); public List Pets = new(); } @@ -55,6 +55,13 @@ namespace Game.Networking.Packets public override void Write() { } } + class BattlePetJournalLockDenied : ServerPacket + { + public BattlePetJournalLockDenied() : base(ServerOpcodes.BattlePetJournalLockDenied) { } + + public override void Write() { } + } + class BattlePetRequestJournal : ClientPacket { public BattlePetRequestJournal(WorldPacket packet) : base(packet) { } @@ -62,6 +69,13 @@ namespace Game.Networking.Packets public override void Read() { } } + class BattlePetRequestJournalLock : ClientPacket + { + public BattlePetRequestJournalLock(WorldPacket packet) : base(packet) { } + + public override void Read() { } + } + class BattlePetUpdates : ServerPacket { public BattlePetUpdates() : base(ServerOpcodes.BattlePetUpdates) { } diff --git a/Source/Game/Server/WorldManager.cs b/Source/Game/Server/WorldManager.cs index 4fe3e394f..2c93daade 100644 --- a/Source/Game/Server/WorldManager.cs +++ b/Source/Game/Server/WorldManager.cs @@ -205,10 +205,13 @@ namespace Game // prevent decrease sessions count if session queued if (RemoveQueuedPlayer(old)) decrease_session = false; + + m_sessionsByBnetGuid.Remove(old.GetBattlenetAccountGUID(), old); } } m_sessions[s.GetAccountId()] = s; + m_sessionsByBnetGuid.Add(s.GetBattlenetAccountGUID(), s); int Sessions = GetActiveAndQueuedSessionCount(); uint pLimit = GetPlayerAmountLimit(); @@ -1876,6 +1879,7 @@ namespace Game RemoveQueuedPlayer(session); m_sessions.TryRemove(pair.Key, out _); + m_sessionsByBnetGuid.Remove(session.GetBattlenetAccountGUID(), session); session.Dispose(); } } @@ -2206,6 +2210,15 @@ namespace Game } } + public bool IsBattlePetJournalLockAcquired(ObjectGuid battlenetAccountGuid) + { + foreach (var sessionForBnet in m_sessionsByBnetGuid.LookupByKey(battlenetAccountGuid)) + if (sessionForBnet.GetBattlePetMgr().HasJournalLock()) + return true; + + return false; + } + void LoadWorldStates() { uint oldMSTime = Time.GetMSTime(); @@ -2429,6 +2442,7 @@ namespace Game long blackmarket_timer; ConcurrentDictionary m_sessions = new(); + MultiMap m_sessionsByBnetGuid = new(); Dictionary m_disconnects = new(); uint m_maxActiveSessionCount; uint m_maxQueuedSessionCount; diff --git a/Source/Game/Server/WorldSession.cs b/Source/Game/Server/WorldSession.cs index 8befc1374..c25c47ce0 100644 --- a/Source/Game/Server/WorldSession.cs +++ b/Source/Game/Server/WorldSession.cs @@ -160,6 +160,10 @@ namespace Game // Remove pet _player.RemovePet(null, PetSaveMode.AsCurrent, true); + ///- Release battle pet journal lock + if (_battlePetMgr.HasJournalLock()) + _battlePetMgr.ToggleJournalLock(false); + // Clear whisper whitelist _player.ClearWhisperWhiteList();