All pastes #614126 Raw Edit

Untitled

public text v1 · immutable
·published 2007-07-11 11:30 UTC
rendered paste body
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);