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/Spells/Spell.cpp26
-rw-r--r--src/server/game/Spells/SpellEffects.cpp1
3 files changed, 28 insertions, 3 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 549fadc0a6d..564bcac77cf 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1327,7 +1327,7 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const
else
{
float ground_z = GetMapHeight(x, y, z);
- if (z < ground_z)
+ if (std::fabs(z - ground_z) < GetCollisionHeight())
z = ground_z;
}
break;
@@ -1350,7 +1350,7 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z) const
else
{
float ground_z = GetMapHeight(x, y, z);
- if (z < ground_z)
+ if (std::fabs(z - ground_z) < GetCollisionHeight())
z = ground_z;
}
break;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 44bff9f6932..094cbb2045a 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1377,6 +1377,32 @@ void Spell::SelectImplicitCasterDestTargets(SpellEffIndex effIndex, SpellImplici
dest = SpellDestination(x, y, liquidLevel, m_caster->GetOrientation());
break;
}
+ case TARGET_DEST_CASTER_FRONT_LEAP:
+ {
+ float dist = m_spellInfo->GetEffect(effIndex)->CalcRadius(m_caster);
+ float angle = targetType.CalcDirectionAngle();
+
+ Position pos = dest._position;
+
+ m_caster->MovePositionToFirstCollision(pos, dist, angle);
+ // Generate path to that point.
+ if (!m_preGeneratedPath)
+ m_preGeneratedPath = std::make_unique<PathGenerator>(m_caster);
+
+ m_preGeneratedPath->SetPathLengthLimit(dist);
+
+ // Should we use straightline here ? What do we do when we don't have a full path ?
+ bool pathResult = m_preGeneratedPath->CalculatePath(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), false, true);
+ if (pathResult && m_preGeneratedPath->GetPathType() & (PATHFIND_NORMAL | PATHFIND_SHORTCUT))
+ {
+ pos.m_positionX = m_preGeneratedPath->GetActualEndPosition().x;
+ pos.m_positionY = m_preGeneratedPath->GetActualEndPosition().y;
+ pos.m_positionZ = m_preGeneratedPath->GetActualEndPosition().z;
+ }
+
+ dest.Relocate(pos);
+ break;
+ }
case TARGET_DEST_CASTER_GROUND:
m_caster->UpdateAllowedPositionZ(dest._position.GetPositionX(), dest._position.GetPositionY(), dest._position.m_positionZ);
break;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 25a79b4f50b..63319f25b84 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -3928,7 +3928,6 @@ void Spell::EffectLeap(SpellEffIndex /*effIndex*/)
return;
Position pos = destTarget->GetPosition();
- pos = unitTarget->GetFirstCollisionPosition(unitTarget->GetDistance(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()), 0.0f);
unitTarget->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), unitTarget == m_caster);
}