Index: src/game/Spell.cpp =================================================================== --- src/game/Spell.cpp (revision 4069) +++ src/game/Spell.cpp (working copy) @@ -67,6 +67,7 @@ m_unitTargetGUID = 0; m_GOTargetGUID = 0; m_CorpseTargetGUID = 0; + m_itemTargetGUID = 0; m_srcX = m_srcY = m_srcZ = m_destX = m_destY = m_destZ = 0; m_strTarget = ""; @@ -103,6 +104,19 @@ m_unitTarget = m_unitTargetGUID ? ( m_unitTargetGUID==caster->GetGUID() ? caster : ObjectAccessor::Instance().GetUnit(*caster, m_unitTargetGUID) ) : NULL; + + m_itemTarget = NULL; + if(caster->GetTypeId()==TYPEID_PLAYER) + { + if(m_targetMask & TARGET_FLAG_ITEM) + m_itemTarget = ((Player*)caster)->GetItemByGuid(m_itemTargetGUID); + else + { + Player* pTrader = ((Player*)caster)->GetTrader(); + if(pTrader && m_itemTargetGUID < TRADE_SLOT_COUNT) + m_itemTarget = pTrader->GetItemByPos(pTrader->GetItemPosByTradeSlot(m_itemTargetGUID)); + } + } } void SpellCastTargets::read ( WorldPacket * data,Unit *caster ) @@ -126,20 +140,7 @@ m_GOTargetGUID = readGUID(*data); if((m_targetMask & (TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM)) && caster->GetTypeId() == TYPEID_PLAYER) - { - uint64 _guid = readGUID(*data); - if(caster->GetTypeId()==TYPEID_PLAYER) - { - if(m_targetMask & TARGET_FLAG_ITEM) - m_itemTarget = ((Player*)caster)->GetItemByGuid(_guid); - else - { - Player* pTrader = ((Player*)caster)->GetTrader(); - if(pTrader && _guid < TRADE_SLOT_COUNT) - m_itemTarget = pTrader->GetItemByPos(pTrader->GetItemPosByTradeSlot(_guid)); - } - } - } + m_itemTargetGUID = readGUID(*data); if(m_targetMask & TARGET_FLAG_SOURCE_LOCATION) *data >> m_srcX >> m_srcY >> m_srcZ; @@ -1659,7 +1660,7 @@ if(m_targets.getUnitTarget()) data << m_targets.getUnitTargetGUID(); else if(m_targets.m_itemTarget) - data << m_targets.m_itemTarget->GetGUID(); + data << m_targets.getItemTargetGUID(); else if(m_targets.getGOTarget()) data << m_targets.getGOTargetGUID(); Index: src/game/Spell.h =================================================================== --- src/game/Spell.h (revision 4069) +++ src/game/Spell.h (working copy) @@ -203,6 +203,7 @@ void setGOTarget(GameObject *target); uint64 getCorpseTargetGUID() const { return m_CorpseTargetGUID; } + uint64 getItemTargetGUID() const { return m_unitTargetGUID; } bool IsEmpty() const { return m_GOTargetGUID==0 && m_unitTargetGUID==0 && m_itemTarget==0 && m_CorpseTargetGUID==0; } @@ -223,6 +224,7 @@ uint64 m_unitTargetGUID; uint64 m_GOTargetGUID; uint64 m_CorpseTargetGUID; + uint64 m_itemTargetGUID; }; enum SpellState Index: src/game/SpellEffects.cpp =================================================================== --- src/game/SpellEffects.cpp (revision 4069) +++ src/game/SpellEffects.cpp (working copy) @@ -2835,6 +2835,7 @@ uint32 count = 1; _player->DestroyItemCount(itemTarget,count,true); + // TODO: fix crash when a spell has two effects, both pointed at the same item target SpellEntry const *spellinfo = sSpellStore.LookupEntry(m_spellInfo->EffectTriggerSpell[i]); Spell _spell(m_caster, spellinfo, true, 0);