diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Spell.cpp | 50 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 9 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 46 |
3 files changed, 51 insertions, 54 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index e05673ab63e..3cd27d40305 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -421,17 +421,18 @@ void Spell::FillTargetMap() SetTargetMap(i,m_spellInfo->EffectImplicitTargetA[i],tmpUnitMap); SetTargetMap(i,m_spellInfo->EffectImplicitTargetB[i],tmpUnitMap); - if(m_targets.HasDest() - && spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_DEST) + if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] != SPELL_REQUIRE_UNIT) { - tmpUnitMap.clear(); - tmpUnitMap.push_back(m_caster); + if(spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_DEST + && 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); + } + continue; } - if(!m_spellInfo->EffectImplicitTargetA[i] - && spellmgr.EffectTargetType[m_spellInfo->Effect[i]] == SPELL_REQUIRE_NONE) - tmpUnitMap.push_back(m_caster); - if(tmpUnitMap.empty()) { // add here custom effects that need default target. @@ -584,6 +585,8 @@ void Spell::FillTargetMap() break; } } + + if(IsChanneledSpell(m_spellInfo) && !tmpUnitMap.empty()) m_needAliveTargetMask |= (1<<i); @@ -726,11 +729,7 @@ void Spell::AddUnitTarget(Unit* pVictim, uint32 effIndex) { // calculate spell incoming interval // TODO: this is a hack - float dist; - if(m_spellInfo->Effect[effIndex] == SPELL_EFFECT_TRIGGER_MISSILE && m_targets.HasDest()) - dist = m_caster->GetDistance(m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ); - else - dist = m_caster->GetDistance(pVictim->GetPositionX(), pVictim->GetPositionY(), pVictim->GetPositionZ()); + float dist = m_caster->GetDistance(pVictim->GetPositionX(), pVictim->GetPositionY(), pVictim->GetPositionZ()); if (dist < 5.0f) dist = 5.0f; target.timeDelay = (uint64) floor(dist / m_spellInfo->speed * 1000.0f); @@ -2460,6 +2459,7 @@ void Spell::handle_immediate() uint64 Spell::handle_delayed(uint64 t_offset) { + UpdatePointers(); uint64 next_time = 0; if (!m_immediateHandled) @@ -2551,12 +2551,18 @@ void Spell::_handle_immediate_phase() for(std::list<ItemTargetInfo>::iterator ihit= m_UniqueItemInfo.begin();ihit != m_UniqueItemInfo.end();++ihit) DoAllEffectOnTarget(&(*ihit)); + if(!m_originalCaster) + return; // process ground - for(uint32 j = 0;j<3;j++) + for(uint32 j = 0; j < 3; ++j) { - // persistent area auras target only the ground - if(m_spellInfo->Effect[j] == SPELL_EFFECT_PERSISTENT_AREA_AURA) - HandleEffects(NULL,NULL,NULL, j); + if(spellmgr.EffectTargetType[m_spellInfo->Effect[j]] == SPELL_REQUIRE_DEST) + { + if(m_targets.HasDest()) + HandleEffects(m_originalCaster, NULL, NULL, j); + } + else if(spellmgr.EffectTargetType[m_spellInfo->Effect[j]] == SPELL_REQUIRE_NONE) + HandleEffects(m_originalCaster, NULL, NULL, j); } } @@ -2713,8 +2719,8 @@ void Spell::update(uint32 difftime) cancel(); // check for incapacitating player states - if( m_caster->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_CONFUSED)) - cancel(); + //if( m_caster->hasUnitState(UNIT_STAT_STUNNED | UNIT_STAT_CONFUSED)) + // cancel(); } // check if there are alive targets left @@ -5355,12 +5361,6 @@ bool SpellEvent::Execute(uint64 e_time, uint32 p_time) // event will be re-added automatically at the end of routine) } break; - case SPELL_STATE_CASTING: - { - // this spell is in channeled state, process it on the next update - // event will be re-added automatically at the end of routine) - } break; - case SPELL_STATE_DELAYED: { // first, check, if we have just started diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 8581a81d5ef..c18e265b9db 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -2586,15 +2586,12 @@ void Spell::EffectCreateItem(uint32 i) void Spell::EffectPersistentAA(uint32 i) { float radius = GetSpellRadius(sSpellRadiusStore.LookupEntry(m_spellInfo->EffectRadiusIndex[i])); - Unit *caster = m_originalCasterGUID ? m_originalCaster : m_caster; - if(!caster) return; - - if(Player* modOwner = caster->GetSpellModOwner()) + if(Player* modOwner = m_originalCaster->GetSpellModOwner()) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RADIUS, radius); int32 duration = GetSpellDuration(m_spellInfo); DynamicObject* dynObj = new DynamicObject; - if(!dynObj->Create(objmgr.GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, i, m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, duration, radius)) + if(!dynObj->Create(objmgr.GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_originalCaster, m_spellInfo->Id, i, m_targets.m_destX, m_targets.m_destY, m_targets.m_destZ, duration, radius)) { delete dynObj; return; @@ -2602,7 +2599,7 @@ void Spell::EffectPersistentAA(uint32 i) dynObj->SetUInt32Value(OBJECT_FIELD_TYPE, 65); dynObj->SetUInt32Value(GAMEOBJECT_DISPLAYID, 368003); dynObj->SetUInt32Value(DYNAMICOBJECT_BYTES, 0x01eeeeee); - caster->AddDynObject(dynObj); + m_originalCaster->AddDynObject(dynObj); MapManager::Instance().GetMap(dynObj->GetMapId(), dynObj)->Add(dynObj); } diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 47bb47ce8b4..48f63763911 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -33,29 +33,29 @@ SpellMgr::SpellMgr() { switch(i) { - case SPELL_EFFECT_SUMMON: - case SPELL_EFFECT_SUMMON_WILD: - case SPELL_EFFECT_SUMMON_GUARDIAN: - case SPELL_EFFECT_TRANS_DOOR: //summon object - case SPELL_EFFECT_SUMMON_PET: - case SPELL_EFFECT_SUMMON_POSSESSED: - case SPELL_EFFECT_SUMMON_TOTEM: - case SPELL_EFFECT_SUMMON_OBJECT_WILD: - case SPELL_EFFECT_SUMMON_TOTEM_SLOT1: - case SPELL_EFFECT_SUMMON_TOTEM_SLOT2: - case SPELL_EFFECT_SUMMON_TOTEM_SLOT3: - case SPELL_EFFECT_SUMMON_TOTEM_SLOT4: - case SPELL_EFFECT_SUMMON_CRITTER: - case SPELL_EFFECT_SUMMON_OBJECT_SLOT1: - case SPELL_EFFECT_SUMMON_OBJECT_SLOT2: - case SPELL_EFFECT_SUMMON_OBJECT_SLOT3: - case SPELL_EFFECT_SUMMON_OBJECT_SLOT4: - case SPELL_EFFECT_SUMMON_DEAD_PET: - case SPELL_EFFECT_SUMMON_DEMON: - case SPELL_EFFECT_ADD_FARSIGHT: - case SPELL_EFFECT_TRIGGER_SPELL_2: //ritual of summon - case SPELL_EFFECT_TRIGGER_MISSILE: - case SPELL_EFFECT_PERSISTENT_AREA_AURA: + case SPELL_EFFECT_PERSISTENT_AREA_AURA: //27 + case SPELL_EFFECT_SUMMON: //28 + case SPELL_EFFECT_TRIGGER_MISSILE: //32 + case SPELL_EFFECT_SUMMON_WILD: //41 + case SPELL_EFFECT_SUMMON_GUARDIAN: //42 + case SPELL_EFFECT_TRANS_DOOR: //50 summon object + case SPELL_EFFECT_SUMMON_PET: //56 + case SPELL_EFFECT_ADD_FARSIGHT: //72 + case SPELL_EFFECT_SUMMON_POSSESSED: //73 + case SPELL_EFFECT_SUMMON_TOTEM: //74 + case SPELL_EFFECT_SUMMON_OBJECT_WILD: //76 + case SPELL_EFFECT_SUMMON_TOTEM_SLOT1: //87 + case SPELL_EFFECT_SUMMON_TOTEM_SLOT2: //88 + case SPELL_EFFECT_SUMMON_TOTEM_SLOT3: //89 + case SPELL_EFFECT_SUMMON_TOTEM_SLOT4: //90 + case SPELL_EFFECT_SUMMON_CRITTER: //97 + case SPELL_EFFECT_SUMMON_OBJECT_SLOT1: //104 + case SPELL_EFFECT_SUMMON_OBJECT_SLOT2: //105 + case SPELL_EFFECT_SUMMON_OBJECT_SLOT3: //106 + case SPELL_EFFECT_SUMMON_OBJECT_SLOT4: //107 + case SPELL_EFFECT_SUMMON_DEAD_PET: //109 + case SPELL_EFFECT_SUMMON_DEMON: //112 + case SPELL_EFFECT_TRIGGER_SPELL_2: //151 ritual of summon EffectTargetType[i] = SPELL_REQUIRE_DEST; break; case SPELL_EFFECT_PARRY: // 0 |