diff --git a/Source/Game/BattlePets/BattlePetManager.cs b/Source/Game/BattlePets/BattlePetManager.cs index bbd25f27b..d5a1e0fb6 100644 --- a/Source/Game/BattlePets/BattlePetManager.cs +++ b/Source/Game/BattlePets/BattlePetManager.cs @@ -459,12 +459,10 @@ namespace Game.BattlePets pet.SaveInfo = BattlePetSaveInfo.Changed; // Update the timestamp if the battle pet is summoned - Player player = _owner.GetPlayer(); - Creature summonedBattlePet = ObjectAccessor.GetCreatureOrPetOrVehicle(player, player.GetCritterGUID()); + Creature summonedBattlePet = _owner.GetPlayer().GetSummonedBattlePet(); if (summonedBattlePet != null) - if (player.GetSummonedBattlePetGUID() == summonedBattlePet.GetBattlePetCompanionGUID()) - if (summonedBattlePet.GetBattlePetCompanionGUID() == guid) - summonedBattlePet.SetBattlePetCompanionNameTimestamp((uint)pet.NameTimestamp); + if (summonedBattlePet.GetBattlePetCompanionGUID() == guid) + summonedBattlePet.SetBattlePetCompanionNameTimestamp((uint)pet.NameTimestamp); } bool IsPetInSlot(ObjectGuid guid) @@ -579,6 +577,18 @@ namespace Game.BattlePets BattlePetDeleted deletePet = new(); deletePet.PetGuid = guid; _owner.SendPacket(deletePet); + + // Battle pet despawns if it's summoned + Player player = _owner.GetPlayer(); + Creature summonedBattlePet = player.GetSummonedBattlePet(); + if (summonedBattlePet != null) + { + if (summonedBattlePet.GetBattlePetCompanionGUID() == guid) + { + summonedBattlePet.DespawnOrUnsummon(); + player.SetBattlePetData(null); + } + } } public void HealBattlePetsPct(byte pct) @@ -615,20 +625,18 @@ namespace Game.BattlePets // TODO: set proper CreatureID for spell SPELL_SUMMON_BATTLE_PET (default EffectMiscValueA is 40721 - Murkimus the Gladiator) Player player = _owner.GetPlayer(); - player.SetSummonedBattlePetGUID(guid); - player.SetCurrentBattlePetBreedQuality(pet.PacketInfo.Quality); + player.SetBattlePetData(pet); player.CastSpell(_owner.GetPlayer(), speciesEntry.SummonSpellID != 0 ? speciesEntry.SummonSpellID : SharedConst.SpellSummonBattlePet); } public void DismissPet() { Player player = _owner.GetPlayer(); - Creature pet = ObjectAccessor.GetCreatureOrPetOrVehicle(player, player.GetCritterGUID()); - if (pet && player.GetSummonedBattlePetGUID() == pet.GetBattlePetCompanionGUID()) + Creature summonedBattlePet = player.GetSummonedBattlePet(); + if (summonedBattlePet) { - pet.DespawnOrUnsummon(); - player.SetSummonedBattlePetGUID(ObjectGuid.Empty); - player.SetCurrentBattlePetBreedQuality((byte)BattlePetBreedQuality.Poor); + summonedBattlePet.DespawnOrUnsummon(); + player.SetBattlePetData(null); } } diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index fb26ce875..ea6a79b49 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -942,6 +942,34 @@ namespace Game.Entities SendPacket(new PetSpells()); } + public Creature GetSummonedBattlePet() + { + Creature summonedBattlePet = ObjectAccessor.GetCreatureOrPetOrVehicle(this, GetCritterGUID()); + if (summonedBattlePet != null) + if (!GetSummonedBattlePetGUID().IsEmpty() && GetSummonedBattlePetGUID() == summonedBattlePet.GetBattlePetCompanionGUID()) + return summonedBattlePet; + + return null; + } + + public void SetBattlePetData(BattlePets.BattlePetMgr.BattlePet pet = null) + { + if (pet != null) + { + SetSummonedBattlePetGUID(pet.PacketInfo.Guid); + SetCurrentBattlePetBreedQuality(pet.PacketInfo.Quality); + SetBattlePetCompanionExperience(pet.PacketInfo.Exp); + SetWildBattlePetLevel(pet.PacketInfo.Level); + } + else + { + SetSummonedBattlePetGUID(ObjectGuid.Empty); + SetCurrentBattlePetBreedQuality((byte)BattlePetBreedQuality.Poor); + SetBattlePetCompanionExperience(0); + SetWildBattlePetLevel(0); + } + } + public void StopCastingCharm() { Unit charm = GetCharmed(); diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 605ccb362..fc6374867 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -1869,7 +1869,8 @@ namespace Game.Entities public uint GetBattlePetCompanionNameTimestamp() { return m_unitData.BattlePetCompanionNameTimestamp; } public void SetBattlePetCompanionNameTimestamp(uint timestamp) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BattlePetCompanionNameTimestamp), timestamp); } - + public uint GetBattlePetCompanionExperience() { return m_unitData.BattlePetCompanionExperience; } + public void SetBattlePetCompanionExperience(uint experience) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.BattlePetCompanionExperience), experience); } public uint GetWildBattlePetLevel() { return m_unitData.WildBattlePetLevel; } public void SetWildBattlePetLevel(uint wildBattlePetLevel) { SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.WildBattlePetLevel), wildBattlePetLevel); } diff --git a/Source/Game/Handlers/PetHandler.cs b/Source/Game/Handlers/PetHandler.cs index 26a4ee794..d36ca6da0 100644 --- a/Source/Game/Handlers/PetHandler.cs +++ b/Source/Game/Handlers/PetHandler.cs @@ -34,15 +34,20 @@ namespace Game Unit pet = ObjectAccessor.GetCreatureOrPetOrVehicle(GetPlayer(), packet.CritterGUID); if (!pet) { - Log.outDebug(LogFilter.Network, "Vanitypet {0} does not exist - player '{1}' ({2} / account: {3}) attempted to dismiss it (possibly lagged out)", + Log.outDebug(LogFilter.Network, "Critter {0} does not exist - player '{1}' ({2} / account: {3}) attempted to dismiss it (possibly lagged out)", packet.CritterGUID.ToString(), GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), GetAccountId()); return; } if (GetPlayer().GetCritterGUID() == pet.GetGUID()) { - if (pet.IsTypeId(TypeId.Unit) && pet.ToCreature().IsSummon()) + if (pet.IsCreature() && pet.IsSummon()) + { + if (!_player.GetSummonedBattlePetGUID().IsEmpty() && _player.GetSummonedBattlePetGUID() == pet.GetBattlePetCompanionGUID()) + _player.SetBattlePetData(null); + pet.ToTempSummon().UnSummon(); + } } }