From 5e0fd36ada736b07a8f9482d4b10edcacf0762a1 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 5 Jan 2022 20:38:57 -0500 Subject: [PATCH] Core/Spells: Implemented spell effect 204 (SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY) Port From (https://github.com/TrinityCore/TrinityCore/commit/c4fee8c5cf85aeddc45aad18d7a944efa59022bd) --- Source/Framework/Constants/SharedConst.cs | 1 + Source/Game/BattlePets/BattlePetManager.cs | 36 +++++++++++++ Source/Game/Spells/Spell.cs | 61 ++++++++++++++++++++++ Source/Game/Spells/SpellEffects.cs | 30 +++++++++++ 4 files changed, 128 insertions(+) diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index 9c0ba2e31..2ff1799a8 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -57,6 +57,7 @@ namespace Framework.Constants public const int SpellBattlePetTraining = 125610; public const int SpellReviveBattlePets = 125439; public const int SpellSummonBattlePet = 118301; + public const int MaxBattlePetLevel = 25; public static TimeSpan ReviveBattlePetsCooldown = TimeSpan.FromSeconds(180); /// diff --git a/Source/Game/BattlePets/BattlePetManager.cs b/Source/Game/BattlePets/BattlePetManager.cs index 848195819..d6b9200f8 100644 --- a/Source/Game/BattlePets/BattlePetManager.cs +++ b/Source/Game/BattlePets/BattlePetManager.cs @@ -591,6 +591,42 @@ namespace Game.BattlePets } } + public void ChangeBattlePetQuality(ObjectGuid guid, BattlePetBreedQuality quality) + { + if (!HasJournalLock()) + return; + + BattlePet pet = GetPet(guid); + if (pet == null) + return; + + if (quality > BattlePetBreedQuality.Rare) + return; + + var battlePetSpecies = CliDB.BattlePetSpeciesStorage.LookupByKey(pet.PacketInfo.Species); + if (battlePetSpecies != null) + if (battlePetSpecies.GetFlags().HasFlag(BattlePetSpeciesFlags.CantBattle)) + return; + + byte qualityValue = (byte)quality; + if (pet.PacketInfo.Quality >= qualityValue) + return; + + pet.PacketInfo.Quality = qualityValue; + pet.CalculateStats(); + pet.PacketInfo.Health = pet.PacketInfo.MaxHealth; + + if (pet.SaveInfo != BattlePetSaveInfo.New) + pet.SaveInfo = BattlePetSaveInfo.Changed; + + List updates = new(); + updates.Add(pet); + SendUpdates(updates, false); + + // UF::PlayerData::CurrentBattlePetBreedQuality isn't updated (Intended) + // _owner->GetPlayer()->SetCurrentBattlePetBreedQuality(qualityValue); + } + public void HealBattlePetsPct(byte pct) { // TODO: After each Pet Battle, any injured companion will automatically diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 945361a39..d716e8f33 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -5259,6 +5259,67 @@ namespace Game.Spells } break; } + case SpellEffectName.ChangeBattlepetQuality: + case SpellEffectName.GrantBattlepetExperience: + { + Player playerCaster = m_caster.ToPlayer(); + if (playerCaster == null || !m_targets.GetUnitTarget() || !m_targets.GetUnitTarget().IsCreature()) + return SpellCastResult.BadTargets; + + var battlePetMgr = playerCaster.GetSession().GetBattlePetMgr(); + if (!battlePetMgr.HasJournalLock()) + return SpellCastResult.CantDoThatRightNow; + + Creature creature = m_targets.GetUnitTarget().ToCreature(); + if (creature != null) + { + if (playerCaster.GetSummonedBattlePetGUID().IsEmpty() || creature.GetBattlePetCompanionGUID().IsEmpty()) + return SpellCastResult.NoPet; + + if (playerCaster.GetSummonedBattlePetGUID() != creature.GetBattlePetCompanionGUID()) + return SpellCastResult.BadTargets; + + var battlePet = battlePetMgr.GetPet(creature.GetBattlePetCompanionGUID()); + if (battlePet != null) + { + var battlePetSpecies = CliDB.BattlePetSpeciesStorage.LookupByKey(battlePet.PacketInfo.Species); + if (battlePetSpecies != null) + { + uint battlePetType = (uint)spellEffectInfo.MiscValue; + if (battlePetType != 0) + if ((battlePetType & (1 << battlePetSpecies.PetTypeEnum)) == 0) + return SpellCastResult.WrongBattlePetType; + + if (spellEffectInfo.Effect == SpellEffectName.ChangeBattlepetQuality) + { + BattlePetBreedQuality quality = BattlePetBreedQuality.Poor; + switch (spellEffectInfo.BasePoints) + { + case 85: + quality = BattlePetBreedQuality.Rare; + break; + case 75: + quality = BattlePetBreedQuality.Uncommon; + break; + default: + // Ignore Epic Battle-Stones + break; + } + if (battlePet.PacketInfo.Quality >= (byte)quality) + return SpellCastResult.CantUpgradeBattlePet; + } + + if (spellEffectInfo.Effect == SpellEffectName.GrantBattlepetExperience) + if (battlePet.PacketInfo.Level >= SharedConst.MaxBattlePetLevel) + return SpellCastResult.GrantPetLevelFail; + + if (battlePetSpecies.GetFlags().HasFlag(BattlePetSpeciesFlags.CantBattle)) + return SpellCastResult.BadTargets; + } + } + } + break; + } default: break; } diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index 5653a46d2..8a23f4e4d 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -5083,6 +5083,36 @@ namespace Game.Spells player.GetSession().GetBattlePetMgr().UnlockSlot(BattlePetSlots.Slot0); } + [SpellEffectHandler(SpellEffectName.ChangeBattlepetQuality)] + void EffectChangeBattlePetQuality() + { + if (effectHandleMode != SpellEffectHandleMode.HitTarget) + return; + + Player playerCaster = m_caster.ToPlayer(); + if (playerCaster == null) + return; + + if (unitTarget == null || !unitTarget.IsCreature()) + return; + + var quality = BattlePetBreedQuality.Poor; + switch (damage) + { + case 85: + quality = BattlePetBreedQuality.Rare; + break; + case 75: + quality = BattlePetBreedQuality.Uncommon; + break; + default: + // Ignore Epic Battle-Stones + break; + } + + playerCaster.GetSession().GetBattlePetMgr().ChangeBattlePetQuality(unitTarget.GetBattlePetCompanionGUID(), quality); + } + [SpellEffectHandler(SpellEffectName.LaunchQuestChoice)] void EffectLaunchQuestChoice() {