aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h7
-rw-r--r--src/server/game/Movement/MotionMaster.cpp7
-rw-r--r--src/server/game/Movement/MotionMaster.h2
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp4
-rw-r--r--src/server/game/Movement/PathGenerator.h4
-rw-r--r--src/server/game/Movement/Spline/MoveSplineInit.cpp2
-rw-r--r--src/server/game/Spells/Spell.cpp33
-rw-r--r--src/server/game/Spells/SpellEffects.cpp3
-rw-r--r--src/server/scripts/Commands/cs_mmaps.cpp2
9 files changed, 34 insertions, 30 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 9ad1c104e1c..a2d1cdd83dd 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -3157,7 +3157,12 @@ enum SummonType
enum EventId
{
EVENT_CHARGE = 1003,
- EVENT_JUMP = 1004
+ EVENT_JUMP = 1004,
+
+ /// Special charge event which is used for charge spells that have explicit targets
+ /// and had a path already generated - using it in PointMovementGenerator will not
+ /// create a new spline and launch it
+ EVENT_CHARGE_PREPATH = 1005
};
enum ResponseCodes
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp
index c9ca7772186..8e045b98dbb 100644
--- a/src/server/game/Movement/MotionMaster.cpp
+++ b/src/server/game/Movement/MotionMaster.cpp
@@ -424,15 +424,16 @@ void MotionMaster::MoveCharge(float x, float y, float z, float speed, uint32 id,
}
}
-void MotionMaster::MoveCharge(PathGenerator path, float speed, uint32 id)
+void MotionMaster::MoveCharge(PathGenerator const& path)
{
Vector3 dest = path.GetActualEndPosition();
- MoveCharge(dest.x, dest.y, dest.z, speed, id);
+ MoveCharge(dest.x, dest.y, dest.z, SPEED_CHARGE, EVENT_CHARGE_PREPATH);
+ // Charge movement is not started when using EVENT_CHARGE_PREPATH
Movement::MoveSplineInit init(_owner);
init.MovebyPath(path.GetPath());
- init.SetVelocity(speed);
+ init.SetVelocity(SPEED_CHARGE);
init.Launch();
}
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index 4b6075aac10..f2f3959dba5 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -162,7 +162,7 @@ class MotionMaster //: private std::stack<MovementGenerator *>
void MoveTakeoff(uint32 id, Position const& pos);
void MoveCharge(float x, float y, float z, float speed = SPEED_CHARGE, uint32 id = EVENT_CHARGE, bool generatePath = false);
- void MoveCharge(PathGenerator path, float speed = SPEED_CHARGE, uint32 id = EVENT_CHARGE);
+ void MoveCharge(PathGenerator const& path);
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ);
void MoveJumpTo(float angle, float speedXY, float speedZ);
void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP)
diff --git a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
index 1f5503948c8..ea7a8c4c710 100755
--- a/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/PointMovementGenerator.cpp
@@ -34,7 +34,7 @@ void PointMovementGenerator<T>::DoInitialize(T* unit)
unit->AddUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE);
- if (id == EVENT_CHARGE)
+ if (id == EVENT_CHARGE_PREPATH)
return;
Movement::MoveSplineInit init(unit);
@@ -58,7 +58,7 @@ bool PointMovementGenerator<T>::DoUpdate(T* unit, uint32 /*diff*/)
unit->AddUnitState(UNIT_STATE_ROAMING_MOVE);
- if (id != EVENT_CHARGE && i_recalculateSpeed && !unit->movespline->Finalized())
+ if (id != EVENT_CHARGE_PREPATH && i_recalculateSpeed && !unit->movespline->Finalized())
{
i_recalculateSpeed = false;
Movement::MoveSplineInit init(unit);
diff --git a/src/server/game/Movement/PathGenerator.h b/src/server/game/Movement/PathGenerator.h
index a20f900b584..d41d3160db5 100644
--- a/src/server/game/Movement/PathGenerator.h
+++ b/src/server/game/Movement/PathGenerator.h
@@ -55,7 +55,7 @@ enum PathType
class PathGenerator
{
public:
- PathGenerator(Unit const* owner);
+ explicit PathGenerator(Unit const* owner);
~PathGenerator();
// Calculate the path from owner to given destination
@@ -71,7 +71,7 @@ class PathGenerator
Vector3 const& GetEndPosition() const { return _endPosition; }
Vector3 const& GetActualEndPosition() const { return _actualEndPosition; }
- PointsArray& GetPath() { return _pathPoints; }
+ PointsArray const& GetPath() const { return _pathPoints; }
PathType GetPathType() const { return _type; }
private:
diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp
index 1e4d4950ea0..e661cf877e3 100644
--- a/src/server/game/Movement/Spline/MoveSplineInit.cpp
+++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp
@@ -158,7 +158,7 @@ namespace Movement
{
PathGenerator path(unit);
bool result = path.CalculatePath(dest.x, dest.y, dest.z, forceDestination);
- if (result && path.GetPathType() & ~PATHFIND_NOPATH)
+ if (result && !(path.GetPathType() & PATHFIND_NOPATH))
{
MovebyPath(path.GetPath());
return;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 18dc6f104a4..53bcd6bd077 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -5148,26 +5148,23 @@ SpellCastResult Spell::CheckCast(bool strict)
if (m_caster->HasUnitState(UNIT_STATE_ROOT))
return SPELL_FAILED_ROOTED;
- Unit* target = m_targets.GetUnitTarget();
-
- if (!target)
- return SPELL_FAILED_DONT_REPORT;
-
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- if (!target->isAlive())
- return SPELL_FAILED_BAD_TARGETS;
-
- Position pos;
- target->GetContactPoint(m_caster, pos.m_positionX, pos.m_positionY, pos.m_positionZ);
- target->GetFirstCollisionPosition(pos, CONTACT_DISTANCE, target->GetRelativeAngle(m_caster));
+ if (GetSpellInfo()->NeedsExplicitUnitTarget())
+ {
+ Unit* target = m_targets.GetUnitTarget();
+ if (!target)
+ return SPELL_FAILED_DONT_REPORT;
- m_preGeneratedPath.SetPathLengthLimit(m_spellInfo->GetMaxRange(true) * 1.5f);
- bool result = m_preGeneratedPath.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ + target->GetObjectSize());
- if (m_preGeneratedPath.GetPathType() & PATHFIND_SHORT)
- return SPELL_FAILED_OUT_OF_RANGE;
- else if (!result)
- return SPELL_FAILED_NOPATH;
+ Position pos;
+ target->GetContactPoint(m_caster, pos.m_positionX, pos.m_positionY, pos.m_positionZ);
+ target->GetFirstCollisionPosition(pos, CONTACT_DISTANCE, target->GetRelativeAngle(m_caster));
+ m_preGeneratedPath.SetPathLengthLimit(m_spellInfo->GetMaxRange(true) * 1.5f);
+ bool result = m_preGeneratedPath.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ + target->GetObjectSize());
+ if (m_preGeneratedPath.GetPathType() & PATHFIND_SHORT)
+ return SPELL_FAILED_OUT_OF_RANGE;
+ else if (!result || m_preGeneratedPath.GetPathType() & PATHFIND_NOPATH)
+ return SPELL_FAILED_NOPATH;
+ }
break;
}
case SPELL_EFFECT_SKINNING:
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 8b440b665ad..93e4b2e4771 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -4918,7 +4918,8 @@ void Spell::EffectCharge(SpellEffIndex /*effIndex*/)
if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET)
{
- if (m_preGeneratedPath.GetPathType() & PATHFIND_NOPATH)
+ // Spell is not using explicit target - no generated path
+ if (m_preGeneratedPath.GetPathType() == PATHFIND_BLANK)
{
Position pos;
unitTarget->GetContactPoint(m_caster, pos.m_positionX, pos.m_positionY, pos.m_positionZ);
diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp
index 97861133983..79cd0deb75e 100644
--- a/src/server/scripts/Commands/cs_mmaps.cpp
+++ b/src/server/scripts/Commands/cs_mmaps.cpp
@@ -95,7 +95,7 @@ public:
path.SetUseStraightPath(useStraightPath);
bool result = path.CalculatePath(x, y, z);
- PointsArray pointPath = path.GetPath();
+ PointsArray const& pointPath = path.GetPath();
handler->PSendSysMessage("%s's path to %s:", target->GetName().c_str(), player->GetName().c_str());
handler->PSendSysMessage("Building: %s", useStraightPath ? "StraightPath" : "SmoothPath");
handler->PSendSysMessage("Result: %s - Length: "SIZEFMTD" - Type: %u", (result ? "true" : "false"), pointPath.size(), path.GetPathType());