From 5923c0559f20bbbed9441a2f5459fb7e25cf24db Mon Sep 17 00:00:00 2001 From: megamage Date: Wed, 24 Dec 2008 13:06:19 -0600 Subject: *Spell target selection fix. Without this patch many spells are bugged. --HG-- branch : trunk --- src/game/Spell.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/game/Spell.cpp') diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index b3930a85520..f95f6dd1424 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -164,6 +164,9 @@ void SpellCastTargets::Update(Unit* caster) if(m_itemTarget) m_itemTargetEntry = m_itemTarget->GetEntry(); } + + m_originalCasterGUID = m_caster->GetGUID(); + m_originalCaster = m_caster; } bool SpellCastTargets::read ( WorldPacket * data, Unit *caster ) -- cgit v1.2.3 From bd2ded228d4f3d4e45f7fa6a715d4cb66b3e0762 Mon Sep 17 00:00:00 2001 From: megamage Date: Wed, 24 Dec 2008 14:30:05 -0600 Subject: *Revert my last commit. (What am I thinking today?) --HG-- branch : trunk --- src/game/Spell.cpp | 3 --- src/game/Spell.h | 7 ------- 2 files changed, 10 deletions(-) (limited to 'src/game/Spell.cpp') diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index f95f6dd1424..b3930a85520 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -164,9 +164,6 @@ void SpellCastTargets::Update(Unit* caster) if(m_itemTarget) m_itemTargetEntry = m_itemTarget->GetEntry(); } - - m_originalCasterGUID = m_caster->GetGUID(); - m_originalCaster = m_caster; } bool SpellCastTargets::read ( WorldPacket * data, Unit *caster ) diff --git a/src/game/Spell.h b/src/game/Spell.h index 2e7aee37c94..284e0b88fb1 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -180,13 +180,6 @@ class SpellCastTargets uint64 m_CorpseTargetGUID; uint64 m_itemTargetGUID; uint32 m_itemTargetEntry; - - Unit* m_caster; - - uint64 m_originalCasterGUID; // real source of cast (aura caster/etc), used for spell targets selection - // e.g. damage around area spell trigered by victim aura and damage enemies of aura caster - Unit* m_originalCaster; // cached pointer for m_originalCaster, updated at Spell::UpdatePointers() - }; enum SpellState -- cgit v1.2.3 From a65bf58497579e5f9123fc4fc645a60741aebcef Mon Sep 17 00:00:00 2001 From: megamage Date: Wed, 24 Dec 2008 14:42:24 -0600 Subject: *Fix fishing. --HG-- branch : trunk --- src/game/Spell.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/game/Spell.cpp') diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index b3930a85520..c2276a24960 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2416,8 +2416,9 @@ void Spell::_handle_immediate_phase() { if(spellmgr.EffectTargetType[m_spellInfo->Effect[j]] == SPELL_REQUIRE_DEST) { - if(m_targets.HasDest()) - HandleEffects(m_originalCaster, NULL, NULL, j); + if(!m_targets.HasDest()) + m_targets.setDestination(m_caster, false); + HandleEffects(m_originalCaster, NULL, NULL, j); } else if(spellmgr.EffectTargetType[m_spellInfo->Effect[j]] == SPELL_REQUIRE_NONE) HandleEffects(m_originalCaster, NULL, NULL, j); -- cgit v1.2.3 From f5216efa2497b73a29783cc480069a5de1c71624 Mon Sep 17 00:00:00 2001 From: megamage Date: Wed, 24 Dec 2008 15:06:06 -0600 Subject: *Fix the bug that owner learns pet spells when pet does not exist. --HG-- branch : trunk --- src/game/Spell.cpp | 18 +++++++++++------- src/game/SpellMgr.cpp | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) (limited to 'src/game/Spell.cpp') diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index c2276a24960..694ba2ceaa7 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -402,13 +402,11 @@ Spell::~Spell() void Spell::FillTargetMap() { - // TODO: ADD the correct target FILLS!!!!!! - - for(uint32 i=0;i<3;i++) + for(uint32 i = 0; i < 3; ++i) { // not call for empty effect. // Also some spells use not used effect targets for store targets for dummy effect in triggered spells - if(m_spellInfo->Effect[i]==0) + if(!m_spellInfo->Effect[i]) continue; // TODO: find a way so this is not needed? @@ -417,9 +415,13 @@ void Spell::FillTargetMap() AddUnitTarget(m_caster, i); std::list tmpUnitMap; + uint32 targetA = m_spellInfo->EffectImplicitTargetA[i]; + uint32 targetB = m_spellInfo->EffectImplicitTargetB[i]; - SetTargetMap(i,m_spellInfo->EffectImplicitTargetA[i],tmpUnitMap); - SetTargetMap(i,m_spellInfo->EffectImplicitTargetB[i],tmpUnitMap); + if(targetA) + SetTargetMap(i, targetA, tmpUnitMap); + if(targetB) // In very rare case !A && B + SetTargetMap(i, targetB, tmpUnitMap); if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] != SPELL_REQUIRE_UNIT) { @@ -433,7 +435,9 @@ void Spell::FillTargetMap() continue; } - if(tmpUnitMap.empty()) + if(!targetA && !targetB) + AddUnitTarget(m_caster, i); + else if(tmpUnitMap.empty()) { // add here custom effects that need default target. // FOR EVERY TARGET TYPE THERE IS A DIFFERENT FILL!! diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 705a69ea2a4..1e9ae3531dd 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -61,7 +61,7 @@ SpellMgr::SpellMgr() case SPELL_EFFECT_PARRY: // 0 case SPELL_EFFECT_BLOCK: // 0 case SPELL_EFFECT_SKILL: // always with dummy 3 as A - case SPELL_EFFECT_LEARN_SPELL: // 0 + //case SPELL_EFFECT_LEARN_SPELL: // 0 may be 5 pet case SPELL_EFFECT_TRADE_SKILL: // 0 or 1 case SPELL_EFFECT_PROFICIENCY: // 0 EffectTargetType[i] = SPELL_REQUIRE_NONE; -- cgit v1.2.3 From f481c04eac5514c5446a04c982b4318dda62b2c6 Mon Sep 17 00:00:00 2001 From: megamage Date: Wed, 24 Dec 2008 18:45:06 -0600 Subject: *Fix broken item spells. --HG-- branch : trunk --- src/game/Spell.cpp | 25 +++++++++++++++---------- src/game/SpellMgr.cpp | 7 +++++++ src/game/SpellMgr.h | 1 + 3 files changed, 23 insertions(+), 10 deletions(-) (limited to 'src/game/Spell.cpp') diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 694ba2ceaa7..6f5dd73f724 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -425,19 +425,24 @@ void Spell::FillTargetMap() if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] != SPELL_REQUIRE_UNIT) { - if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_DEST - && m_targets.HasDest() && m_spellInfo->speed > 0.0f) + if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_DEST) { - float dist = m_caster->GetDistance(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ); - if (dist < 5.0f) dist = 5.0f; - m_delayMoment = (uint64) floor(dist / m_spellInfo->speed * 1000.0f); + if(m_targets.HasDest() && m_spellInfo->speed > 0.0f) + { + float dist = m_caster->GetDistance(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ); + if (dist < 5.0f) dist = 5.0f; + m_delayMoment = (uint64) floor(dist / m_spellInfo->speed * 1000.0f); + } + } + else if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_ITEM) + { + if(m_targets.getItemTarget()) + AddItemTarget(m_targets.getItemTarget(), i); } continue; } if(!targetA && !targetB) - AddUnitTarget(m_caster, i); - else if(tmpUnitMap.empty()) { // add here custom effects that need default target. // FOR EVERY TARGET TYPE THERE IS A DIFFERENT FILL!! @@ -504,10 +509,10 @@ void Spell::FillTargetMap() case SPELL_EFFECT_RESURRECT: case SPELL_EFFECT_CREATE_ITEM: case SPELL_EFFECT_TRIGGER_SPELL: - //case SPELL_EFFECT_TRIGGER_MISSILE: ?? case SPELL_EFFECT_SKILL_STEP: case SPELL_EFFECT_SELF_RESURRECT: case SPELL_EFFECT_REPUTATION: + case SPELL_EFFECT_LEARN_SPELL: if(m_targets.getUnitTarget()) tmpUnitMap.push_back(m_targets.getUnitTarget()); else @@ -545,14 +550,14 @@ void Spell::FillTargetMap() if(Pet* pet = m_caster->GetPet()) tmpUnitMap.push_back(pet); break; - case SPELL_EFFECT_ENCHANT_ITEM: + /*case SPELL_EFFECT_ENCHANT_ITEM: case SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY: case SPELL_EFFECT_DISENCHANT: case SPELL_EFFECT_FEED_PET: case SPELL_EFFECT_PROSPECTING: if(m_targets.getItemTarget()) AddItemTarget(m_targets.getItemTarget(), i); - break; + break;*/ case SPELL_EFFECT_APPLY_AURA: switch(m_spellInfo->EffectApplyAuraName[i]) { diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 41faea5b8fb..78175708cba 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -66,6 +66,13 @@ SpellMgr::SpellMgr() case SPELL_EFFECT_PROFICIENCY: // 0 EffectTargetType[i] = SPELL_REQUIRE_NONE; break; + case SPELL_EFFECT_ENCHANT_ITEM: + case SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY: + case SPELL_EFFECT_DISENCHANT: + case SPELL_EFFECT_FEED_PET: + case SPELL_EFFECT_PROSPECTING: + EffectTargetType[i] = SPELL_REQUIRE_ITEM; + break; default: EffectTargetType[i] = SPELL_REQUIRE_UNIT; break; diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index 51e6fbd1d56..d8b4b866655 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -238,6 +238,7 @@ enum SpellEffectTargetTypes SPELL_REQUIRE_NONE, SPELL_REQUIRE_UNIT, SPELL_REQUIRE_DEST, + SPELL_REQUIRE_ITEM, }; enum SpellSelectTargetTypes -- cgit v1.2.3