Core/Spells: Implemented SPELL_ATTR9_FORCE_DEST_LOCATION
Port From (https://github.com/TrinityCore/TrinityCore/commit/84c84b66d43d655a6fc9f6e75acbc1107dfadf23)
This commit is contained in:
@@ -1966,7 +1966,7 @@ namespace Framework.Constants
|
|||||||
}
|
}
|
||||||
public enum SpellAttr9 : uint
|
public enum SpellAttr9 : uint
|
||||||
{
|
{
|
||||||
Unk0 = 0x01, // 0
|
ForceDestLocation = 0x01, // Force Dest Location DESCRIPTION Ignores collision with terrain (unsure if it also ignores terrain height and can go under map)
|
||||||
Unk1 = 0x02, // 1
|
Unk1 = 0x02, // 1
|
||||||
RestrictedFlightArea = 0x04, // 2
|
RestrictedFlightArea = 0x04, // 2
|
||||||
Unk3 = 0x08, // 3
|
Unk3 = 0x08, // 3
|
||||||
|
|||||||
@@ -664,7 +664,7 @@ namespace Game.Spells
|
|||||||
{
|
{
|
||||||
float randomRadius1 = spellEffectInfo.CalcRadius(m_caster, targetIndex);
|
float randomRadius1 = spellEffectInfo.CalcRadius(m_caster, targetIndex);
|
||||||
if (randomRadius1 > 0.0f)
|
if (randomRadius1 > 0.0f)
|
||||||
m_caster.MovePositionToFirstCollision(dest.Position, randomRadius1, targetType.CalcDirectionAngle());
|
MovePosition(dest.Position, m_caster, randomRadius1, targetType.CalcDirectionAngle());
|
||||||
}
|
}
|
||||||
|
|
||||||
CallScriptDestinationTargetSelectHandlers(ref dest, spellEffectInfo.EffectIndex, targetType);
|
CallScriptDestinationTargetSelectHandlers(ref dest, spellEffectInfo.EffectIndex, targetType);
|
||||||
@@ -753,7 +753,7 @@ namespace Game.Spells
|
|||||||
case SpellTargetObjectTypes.Dest:
|
case SpellTargetObjectTypes.Dest:
|
||||||
SpellDestination dest = new(target);
|
SpellDestination dest = new(target);
|
||||||
if (randomRadius > 0.0f)
|
if (randomRadius > 0.0f)
|
||||||
target.MovePositionToFirstCollision(dest.Position, randomRadius, targetType.CalcDirectionAngle());
|
MovePosition(dest.Position, target, randomRadius, targetType.CalcDirectionAngle());
|
||||||
|
|
||||||
if (m_spellInfo.HasAttribute(SpellAttr4.UseFacingFromSpell))
|
if (m_spellInfo.HasAttribute(SpellAttr4.UseFacingFromSpell))
|
||||||
dest.Position.SetOrientation(spellEffectInfo.PositionFacing);
|
dest.Position.SetOrientation(spellEffectInfo.PositionFacing);
|
||||||
@@ -1116,7 +1116,7 @@ namespace Game.Spells
|
|||||||
|
|
||||||
Position pos = new(dest.Position);
|
Position pos = new(dest.Position);
|
||||||
|
|
||||||
unitCaster.MovePositionToFirstCollision(pos, dist, angle);
|
MovePosition(pos, unitCaster, dist, angle);
|
||||||
dest.Relocate(pos);
|
dest.Relocate(pos);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1142,7 +1142,7 @@ namespace Game.Spells
|
|||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
float dist = spellEffectInfo.CalcRadius(m_caster, targetIndex);
|
float dist = spellEffectInfo.CalcRadius(m_caster, targetIndex);
|
||||||
float angl = targetType.CalcDirectionAngle();
|
float angle = targetType.CalcDirectionAngle();
|
||||||
float objSize = m_caster.GetCombatReach();
|
float objSize = m_caster.GetCombatReach();
|
||||||
|
|
||||||
switch (targetType.GetTarget())
|
switch (targetType.GetTarget())
|
||||||
@@ -1172,7 +1172,7 @@ namespace Game.Spells
|
|||||||
dist = objSize;
|
dist = objSize;
|
||||||
|
|
||||||
Position pos = new(dest.Position);
|
Position pos = new(dest.Position);
|
||||||
m_caster.MovePositionToFirstCollision(pos, dist, angl);
|
MovePosition(pos, m_caster, dist, angle);
|
||||||
|
|
||||||
dest.Relocate(pos);
|
dest.Relocate(pos);
|
||||||
break;
|
break;
|
||||||
@@ -1204,7 +1204,7 @@ namespace Game.Spells
|
|||||||
float dist = spellEffectInfo.CalcRadius(null, targetIndex);
|
float dist = spellEffectInfo.CalcRadius(null, targetIndex);
|
||||||
|
|
||||||
Position pos = new(dest.Position);
|
Position pos = new(dest.Position);
|
||||||
target.MovePositionToFirstCollision(pos, dist, angle);
|
MovePosition(pos, target, dist, angle);
|
||||||
|
|
||||||
dest.Relocate(pos);
|
dest.Relocate(pos);
|
||||||
}
|
}
|
||||||
@@ -1244,7 +1244,7 @@ namespace Game.Spells
|
|||||||
Position pos = dest.Position;
|
Position pos = dest.Position;
|
||||||
float angle = pos.GetAbsoluteAngle(m_caster) - m_caster.GetOrientation();
|
float angle = pos.GetAbsoluteAngle(m_caster) - m_caster.GetOrientation();
|
||||||
|
|
||||||
m_caster.MovePositionToFirstCollision(pos, dist, angle);
|
MovePosition(pos, m_caster, dist, angle);
|
||||||
pos.SetOrientation(m_caster.GetAbsoluteAngle(dest.Position));
|
pos.SetOrientation(m_caster.GetAbsoluteAngle(dest.Position));
|
||||||
|
|
||||||
dest.Relocate(pos);
|
dest.Relocate(pos);
|
||||||
@@ -1256,7 +1256,7 @@ namespace Game.Spells
|
|||||||
float dist = spellEffectInfo.CalcRadius(m_caster, targetIndex);
|
float dist = spellEffectInfo.CalcRadius(m_caster, targetIndex);
|
||||||
|
|
||||||
Position pos = new(m_targets.GetDstPos());
|
Position pos = new(m_targets.GetDstPos());
|
||||||
m_caster.MovePositionToFirstCollision(pos, dist, angle);
|
MovePosition(pos, m_caster, dist, angle);
|
||||||
|
|
||||||
dest.Relocate(pos);
|
dest.Relocate(pos);
|
||||||
}
|
}
|
||||||
@@ -8139,6 +8139,14 @@ namespace Game.Spells
|
|||||||
return source.IsWithinLOS(target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), LineOfSightChecks.All, ignoreFlags);
|
return source.IsWithinLOS(target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), LineOfSightChecks.All, ignoreFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MovePosition(Position pos, WorldObject from, float dist, float angle)
|
||||||
|
{
|
||||||
|
if (m_spellInfo.HasAttribute(SpellAttr9.ForceDestLocation))
|
||||||
|
from.MovePosition(pos, dist, angle);
|
||||||
|
else
|
||||||
|
from.MovePositionToFirstCollision(pos, dist, angle);
|
||||||
|
}
|
||||||
|
|
||||||
void CallScriptEmpowerStageCompletedHandlers(int completedStagesCount)
|
void CallScriptEmpowerStageCompletedHandlers(int completedStagesCount)
|
||||||
{
|
{
|
||||||
foreach (SpellScript script in m_loadedScripts)
|
foreach (SpellScript script in m_loadedScripts)
|
||||||
|
|||||||
Reference in New Issue
Block a user