aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Object/Object.cpp4
-rw-r--r--src/server/game/Entities/Object/Object.h4
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp6
-rw-r--r--src/server/game/Spells/Spell.cpp22
-rw-r--r--src/server/game/Spells/Spell.h1
6 files changed, 24 insertions, 15 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index ad7643826b5..cacf3f1f420 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -3485,7 +3485,7 @@ void WorldObject::GetContactPoint(WorldObject const* obj, float& x, float& y, fl
GetNearPoint(obj, x, y, z, distance2d, GetAbsoluteAngle(obj));
}
-void WorldObject::MovePosition(Position &pos, float dist, float angle)
+void WorldObject::MovePosition(Position &pos, float dist, float angle) const
{
angle += GetOrientation();
float destx, desty, destz, ground, floor;
@@ -3531,7 +3531,7 @@ void WorldObject::MovePosition(Position &pos, float dist, float angle)
pos.SetOrientation(GetOrientation());
}
-void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float angle)
+void WorldObject::MovePositionToFirstCollision(Position &pos, float dist, float angle) const
{
angle += GetOrientation();
float destx, desty, destz;
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 3b369d83519..577eff25495 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -505,9 +505,9 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation
void GetNearPoint2D(WorldObject const* searcher, float& x, float& y, float distance, float absAngle) const;
void GetNearPoint(WorldObject const* searcher, float& x, float& y, float& z, float distance2d, float absAngle) const;
void GetClosePoint(float& x, float& y, float& z, float size, float distance2d = 0, float relAngle = 0) const;
- void MovePosition(Position &pos, float dist, float angle);
+ void MovePosition(Position &pos, float dist, float angle) const;
Position GetNearPosition(float dist, float angle);
- void MovePositionToFirstCollision(Position &pos, float dist, float angle);
+ void MovePositionToFirstCollision(Position &pos, float dist, float angle) const;
Position GetFirstCollisionPosition(float dist, float angle);
Position GetRandomNearPosition(float radius);
void GetContactPoint(WorldObject const* obj, float& x, float& y, float& z, float distance2d = CONTACT_DISTANCE) const;
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index b2887463b03..64517a6a572 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -762,7 +762,7 @@ enum SpellAttr8 : uint32
// EnumUtils: DESCRIBE THIS
enum SpellAttr9 : uint32
{
- SPELL_ATTR9_UNK0 = 0x00000001, // TITLE Unknown attribute 0@Attr9
+ SPELL_ATTR9_FORCE_DEST_LOCATION = 0x00000001, // TITLE Force Dest Location DESCRIPTION Ignores collision with terrain (unsure if it also ignores terrain height and can go under map)
SPELL_ATTR9_UNK1 = 0x00000002, // TITLE Unknown attribute 1@Attr9
SPELL_ATTR9_RESTRICTED_FLIGHT_AREA = 0x00000004, // TITLE Only When Illegally Mounted
SPELL_ATTR9_UNK3 = 0x00000008, // TITLE Unknown attribute 3@Attr9
diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp
index 6563def0dd0..d8b08acca1f 100644
--- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp
+++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp
@@ -1438,7 +1438,7 @@ TC_API_EXPORT EnumText EnumUtils<SpellAttr9>::ToString(SpellAttr9 value)
{
switch (value)
{
- case SPELL_ATTR9_UNK0: return { "SPELL_ATTR9_UNK0", "Unknown attribute 0@Attr9", "" };
+ case SPELL_ATTR9_FORCE_DEST_LOCATION: return { "SPELL_ATTR9_FORCE_DEST_LOCATION", "Force Dest Location", "Ignores collision with terrain (unsure if it also ignores terrain height and can go under map)" };
case SPELL_ATTR9_UNK1: return { "SPELL_ATTR9_UNK1", "Unknown attribute 1@Attr9", "" };
case SPELL_ATTR9_RESTRICTED_FLIGHT_AREA: return { "SPELL_ATTR9_RESTRICTED_FLIGHT_AREA", "Only When Illegally Mounted", "" };
case SPELL_ATTR9_UNK3: return { "SPELL_ATTR9_UNK3", "Unknown attribute 3@Attr9", "" };
@@ -1482,7 +1482,7 @@ TC_API_EXPORT SpellAttr9 EnumUtils<SpellAttr9>::FromIndex(size_t index)
{
switch (index)
{
- case 0: return SPELL_ATTR9_UNK0;
+ case 0: return SPELL_ATTR9_FORCE_DEST_LOCATION;
case 1: return SPELL_ATTR9_UNK1;
case 2: return SPELL_ATTR9_RESTRICTED_FLIGHT_AREA;
case 3: return SPELL_ATTR9_UNK3;
@@ -1523,7 +1523,7 @@ TC_API_EXPORT size_t EnumUtils<SpellAttr9>::ToIndex(SpellAttr9 value)
{
switch (value)
{
- case SPELL_ATTR9_UNK0: return 0;
+ case SPELL_ATTR9_FORCE_DEST_LOCATION: return 0;
case SPELL_ATTR9_UNK1: return 1;
case SPELL_ATTR9_RESTRICTED_FLIGHT_AREA: return 2;
case SPELL_ATTR9_UNK3: return 3;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 38946defeba..24c7adb71bf 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1182,7 +1182,7 @@ void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo,
{
float randomRadius = spellEffectInfo.CalcRadius(m_caster, targetIndex);
if (randomRadius > 0.0f)
- m_caster->MovePositionToFirstCollision(dest._position, randomRadius, targetType.CalcDirectionAngle());
+ MovePosition(dest._position, m_caster, randomRadius, targetType.CalcDirectionAngle());
}
CallScriptDestinationTargetSelectHandlers(dest, spellEffectInfo.EffectIndex, targetType);
@@ -1269,7 +1269,7 @@ void Spell::SelectImplicitNearbyTargets(SpellEffectInfo const& spellEffectInfo,
{
SpellDestination dest(*target);
if (randomRadius > 0.0f)
- target->MovePositionToFirstCollision(dest._position, randomRadius, targetType.CalcDirectionAngle());
+ MovePosition(dest._position, target, randomRadius, targetType.CalcDirectionAngle());
if (m_spellInfo->HasAttribute(SPELL_ATTR4_USE_FACING_FROM_SPELL))
dest._position.SetOrientation(spellEffectInfo.PositionFacing);
@@ -1594,7 +1594,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn
Position pos = dest._position;
- unitCaster->MovePositionToFirstCollision(pos, dist, angle);
+ MovePosition(pos, unitCaster, dist, angle);
dest.Relocate(pos);
break;
}
@@ -1641,7 +1641,7 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffectInfo const& spellEffectIn
dist = objSize;
Position pos = dest._position;
- m_caster->MovePositionToFirstCollision(pos, dist, angle);
+ MovePosition(pos, m_caster, dist, angle);
dest.Relocate(pos);
break;
@@ -1674,7 +1674,7 @@ void Spell::SelectImplicitTargetDestTargets(SpellEffectInfo const& spellEffectIn
float dist = spellEffectInfo.CalcRadius(nullptr, targetIndex);
Position pos = dest._position;
- target->MovePositionToFirstCollision(pos, dist, angle);
+ MovePosition(pos, target, dist, angle);
dest.Relocate(pos);
break;
@@ -1714,7 +1714,7 @@ void Spell::SelectImplicitDestDestTargets(SpellEffectInfo const& spellEffectInfo
Position pos = dest._position;
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));
dest.Relocate(pos);
@@ -1726,7 +1726,7 @@ void Spell::SelectImplicitDestDestTargets(SpellEffectInfo const& spellEffectInfo
float dist = spellEffectInfo.CalcRadius(m_caster, targetIndex);
Position pos = dest._position;
- m_caster->MovePositionToFirstCollision(pos, dist, angle);
+ MovePosition(pos, m_caster, dist, angle);
dest.Relocate(pos);
break;
@@ -9006,6 +9006,14 @@ bool Spell::IsWithinLOS(WorldObject const* source, Position const& target, VMAP:
return source->IsWithinLOS(target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), LINEOFSIGHT_ALL_CHECKS, ignoreFlags);
}
+void Spell::MovePosition(Position& pos, WorldObject const* from, float dist, float angle) const
+{
+ if (m_spellInfo->HasAttribute(SPELL_ATTR9_FORCE_DEST_LOCATION))
+ from->MovePosition(pos, dist, angle);
+ else
+ from->MovePositionToFirstCollision(pos, dist, angle);
+}
+
namespace Trinity
{
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index cf6cef6fa8e..0b147c500d1 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -678,6 +678,7 @@ class TC_GAME_API Spell
bool IsWithinLOS(WorldObject const* source, WorldObject const* target, bool targetAsSourceLocation, VMAP::ModelIgnoreFlags ignoreFlags) const;
bool IsWithinLOS(WorldObject const* source, Position const& target, VMAP::ModelIgnoreFlags ignoreFlags) const;
+ void MovePosition(Position& pos, WorldObject const* from, float dist, float angle) const;
protected:
bool HasGlobalCooldown() const;