void HandleUseCritterItem(UseCritterItem useCritterItem) { Item item = GetPlayer().GetItemByGuid(useCritterItem.ItemGuid); if (!item) { return; } foreach (var itemEffect in item.GetEffects()) { if (itemEffect.TriggerType != ItemSpelltriggerType.LearnSpellId) { continue; } var speciesEntry = Global.SpellMgr.GetBattlePetSpecies((uint)itemEffect.SpellID); if (speciesEntry != null) { GetBattlePetMgr().AddPet(speciesEntry.Id, BattlePetMgr.SelectPetDisplay(speciesEntry), BattlePetMgr.RollPetBreed(speciesEntry.Id), BattlePetMgr.GetDefaultPetQuality(speciesEntry.Id)); } } GetPlayer().DestroyItem(item.GetBagSlot(), item.GetSlot(), true); }
public void TeachSpell(Creature npc, Player player, uint spellId) { TrainerSpell trainerSpell = GetSpell(spellId); if (trainerSpell == null || !CanTeachSpell(player, trainerSpell)) { SendTeachFailure(npc, player, spellId, TrainerFailReason.Unavailable); 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)) { SendTeachFailure(npc, player, spellId, TrainerFailReason.NotEnoughMoney); return; } player.ModifyMoney(-moneyCost); 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 { 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); } }