aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Item/Item.h5
-rw-r--r--src/server/game/Entities/Player/Player.cpp31
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp17
-rw-r--r--src/server/game/Spells/SpellEffects.cpp18
4 files changed, 24 insertions, 47 deletions
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 3c5bf046f90..98877b06b80 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -342,11 +342,6 @@ class TC_GAME_API Item : public Object
static ItemDisenchantLootEntry const* GetDisenchantLoot(ItemTemplate const* itemTemplate, uint32 quality, uint32 itemLevel);
void SetFixedLevel(uint8 level);
Trinity::IteratorPair<ItemEffectEntry const* const*> GetEffects() const { return { std::make_pair(&_bonusData.Effects[0], &_bonusData.Effects[0] + _bonusData.EffectCount) }; }
- ItemEffectEntry const* GetEffect(std::size_t i) const
- {
- ASSERT(i < _bonusData.EffectCount, "Attempted to get effect at index " SZFMTD " but item has only " SZFMTD " effects!", i, _bonusData.EffectCount);
- return _bonusData.Effects[i];
- }
// Item Refund system
void SetNotRefundable(Player* owner, bool changestate = true, CharacterDatabaseTransaction* trans = nullptr, bool addToCollection = true);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 591f4e9d25c..8bc1b8bf386 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -8477,37 +8477,6 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, Objec
{
if (!(item->GetTemplate()->GetFlags() & ITEM_FLAG_LEGACY))
{
- // special learning case
- if (item->GetBonus()->EffectCount >= 2)
- {
- if (item->GetEffect(0)->SpellID == 483 || item->GetEffect(0)->SpellID == 55884)
- {
- uint32 learn_spell_id = item->GetEffect(0)->SpellID;
- uint32 learning_spell_id = item->GetEffect(1)->SpellID;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id, DIFFICULTY_NONE);
- if (!spellInfo)
- {
- TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) has wrong spell id %u, ignoring", item->GetEntry(), learn_spell_id);
- SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, item, nullptr);
- return;
- }
-
- Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE);
-
- WorldPackets::Spells::SpellPrepare spellPrepare;
- spellPrepare.ClientCastID = castCount;
- spellPrepare.ServerCastID = spell->m_castId;
- SendDirectMessage(spellPrepare.Write());
-
- spell->m_fromClient = true;
- spell->m_CastItem = item;
- spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id);
- spell->prepare(targets);
- return;
- }
- }
-
// item spells cast at use
for (ItemEffectEntry const* effectData : item->GetEffects())
{
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 7e8e4e231e6..d72c0ce9d0d 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -1201,15 +1201,16 @@ void WorldSession::HandleUseCritterItem(WorldPackets::Item::UseCritterItem& useC
if (!item)
return;
- if (item->GetBonus()->EffectCount < 2)
- return;
-
- int32 spellToLearn = item->GetEffect(1)->SpellID;
+ for (ItemEffectEntry const* itemEffect : item->GetEffects())
+ {
+ if (itemEffect->TriggerType != ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
+ continue;
- if (BattlePetSpeciesEntry const* entry = sSpellMgr->GetBattlePetSpecies(uint32(spellToLearn)))
- {
- GetBattlePetMgr()->AddPet(entry->ID, BattlePetMgr::SelectPetDisplay(entry), BattlePetMgr::RollPetBreed(entry->ID), BattlePetMgr::GetDefaultPetQuality(entry->ID));
- _player->UpdateCriteria(CriteriaType::UniquePetsOwned);
+ if (BattlePetSpeciesEntry const* entry = sSpellMgr->GetBattlePetSpecies(uint32(itemEffect->SpellID)))
+ {
+ GetBattlePetMgr()->AddPet(entry->ID, BattlePetMgr::SelectPetDisplay(entry), BattlePetMgr::RollPetBreed(entry->ID), BattlePetMgr::GetDefaultPetQuality(entry->ID));
+ _player->UpdateCriteria(CriteriaType::UniquePetsOwned);
+ }
}
_player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 06ecc709000..6cb02a20306 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2138,10 +2138,22 @@ void Spell::EffectLearnSpell()
Player* player = unitTarget->ToPlayer();
- uint32 spellToLearn = (m_spellInfo->Id == 483 || m_spellInfo->Id == 55884) ? damage : effectInfo->TriggerSpell;
- player->LearnSpell(spellToLearn, false);
+ if (m_CastItem && !effectInfo->TriggerSpell)
+ {
+ for (ItemEffectEntry const* itemEffect : m_CastItem->GetEffects())
+ {
+ if (itemEffect->TriggerType != ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
+ continue;
+
+ player->LearnSpell(itemEffect->SpellID, false);
+ }
+ }
- TC_LOG_DEBUG("spells", "Spell: %s has learned spell %u from %s", player->GetGUID().ToString().c_str(), spellToLearn, m_caster->GetGUID().ToString().c_str());
+ if (effectInfo->TriggerSpell)
+ {
+ player->LearnSpell(effectInfo->TriggerSpell, false);
+ TC_LOG_DEBUG("spells", "Spell: %s has learned spell %u from %s", player->GetGUID().ToString().c_str(), effectInfo->TriggerSpell, m_caster->GetGUID().ToString().c_str());
+ }
}
void Spell::EffectDispel()