diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-06-10 00:13:57 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-06-20 01:19:21 +0200 |
commit | 2c643fe7d0fe3623fe2263330f8fa276152588f1 (patch) | |
tree | f681bfee6b076ae6f139ef290c4f813d9e821d91 | |
parent | 7d631f42d74942ef306197df6fe1ebed1bd234e3 (diff) |
Core/Spells: Implemented SPELL_ATTR9_FORCE_DEST_LOCATION
(cherry picked from commit 84c84b66d43d655a6fc9f6e75acbc1107dfadf23)
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 4 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 |
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; |