예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }