rendered paste bodyIndex: 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);