diff options
| author | Shauren <shauren.trinity@gmail.com> | 2021-10-16 13:22:42 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-10-16 13:22:42 +0200 |
| commit | 6b69338990a651c54dd9d2b5ad3281a4d702efb7 (patch) | |
| tree | 9e36dbb051857a28ec25bd5f92829a75bb20864d /src | |
| parent | 047117fe9fe31514c9f49340d4ebecee038c547e (diff) | |
Core/Items: Refactored learning spells from items to check for ITEM_SPELLTRIGGER_LEARN_SPELL_ID instead of hardcoded spell ids
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Item/Item.h | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 31 | ||||
| -rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 18 |
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() |
