aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2008-12-23 14:58:55 -0600
committermegamage <none@none>2008-12-23 14:58:55 -0600
commitc230fb2c28a51b9033e4494d8aade3e7eedf09cf (patch)
treeecb2dcd2133568c241577e58a04f50a5e0682f3e /src
parent31e2c74adcd4e7d4fdf33b5ce5a68ab430700a2e (diff)
*Spell system update.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Spell.cpp50
-rw-r--r--src/game/SpellEffects.cpp9
-rw-r--r--src/game/SpellMgr.cpp46
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