From ecc807f36f6b032b4a4953ed897eb77ec1b98f45 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 29 Nov 2021 17:14:38 -0500 Subject: [PATCH] Core/Trainers: Implemented learning battle pets from trainers Port From (https://github.com/TrinityCore/TrinityCore/commit/b02f382ed78b784d547c68cdbbb681148708d7d0) --- Source/Game/Entities/Creature/Trainer.cs | 41 ++++++++++++++++++++---- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/Source/Game/Entities/Creature/Trainer.cs b/Source/Game/Entities/Creature/Trainer.cs index 23c0f322b..933c5a9b1 100644 --- a/Source/Game/Entities/Creature/Trainer.cs +++ b/Source/Game/Entities/Creature/Trainer.cs @@ -1,8 +1,9 @@ -using System; -using System.Collections.Generic; -using Framework.Constants; +using Framework.Constants; +using Game.BattlePets; using Game.Networking.Packets; using Game.Spells; +using System; +using System.Collections.Generic; namespace Game.Entities { @@ -67,6 +68,19 @@ namespace Game.Entities return; } + bool sendSpellVisual = true; + var speciesEntry = Global.SpellMgr.GetBattlePetSpecies(trainerSpell.SpellId); + if (speciesEntry != null) + { + if (player.GetSession().GetBattlePetMgr().HasMaxPetCount(speciesEntry, player.GetGUID())) + { + // Don't send any error to client (intended) + return; + } + + sendSpellVisual = false; + } + float reputationDiscount = player.GetReputationPriceDiscount(npc); long moneyCost = (long)(trainerSpell.MoneyCost * reputationDiscount); if (!player.HasEnoughMoney(moneyCost)) @@ -77,14 +91,29 @@ namespace Game.Entities player.ModifyMoney(-moneyCost); - npc.SendPlaySpellVisualKit(179, 0, 0); // 53 SpellCastDirected - player.SendPlaySpellVisualKit(362, 1, 0); // 113 EmoteSalute + if (sendSpellVisual) + { + npc.SendPlaySpellVisualKit(179, 0, 0); // 53 SpellCastDirected + player.SendPlaySpellVisualKit(362, 1, 0); // 113 EmoteSalute + } // learn explicitly or cast explicitly if (trainerSpell.IsCastable()) player.CastSpell(player, trainerSpell.SpellId, true); else - player.LearnSpell(trainerSpell.SpellId, false); + { + bool dependent = false; + + if (speciesEntry != null) + { + player.GetSession().GetBattlePetMgr().AddPet(speciesEntry.Id, BattlePetMgr.SelectPetDisplay(speciesEntry), BattlePetMgr.RollPetBreed(speciesEntry.Id), BattlePetMgr.GetDefaultPetQuality(speciesEntry.Id)); + // If the spell summons a battle pet, we fake that it has been learned and the battle pet is added + // marking as dependent prevents saving the spell to database (intended) + dependent = true; + } + + player.LearnSpell(trainerSpell.SpellId, dependent); + } } TrainerSpell GetSpell(uint spellId)