mirror of
https://github.com/araxiaonline/TrinityCore2.git
synced 2026-06-19 14:29:33 -04:00
*Spell system update.
--HG-- branch : trunk
This commit is contained in:
+25
-25
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+23
-23
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user