mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Movement: Delay creating MoveSplineInit objects used by GenericMovementGenerator to spline launch time
* This fixes inconsistent transport state detection for players exiting vehicles that are on transport (ICC gunship battle), fixes players being telerpoted to middle of nowhere on that fight
This commit is contained in:
@@ -507,10 +507,12 @@ bool Unit::haveOffhandWeapon() const
|
||||
|
||||
void Unit::MonsterMoveWithSpeed(float x, float y, float z, float speed, bool generatePath, bool forceDestination)
|
||||
{
|
||||
Movement::MoveSplineInit init(this);
|
||||
init.MoveTo(x, y, z, generatePath, forceDestination);
|
||||
init.SetVelocity(speed);
|
||||
GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(x, y, z, generatePath, forceDestination);
|
||||
init.SetVelocity(speed);
|
||||
};
|
||||
GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
}
|
||||
|
||||
void Unit::UpdateSplineMovement(uint32 t_diff)
|
||||
@@ -12748,18 +12750,19 @@ void Unit::_ExitVehicle(Position const* exitPosition)
|
||||
}
|
||||
}
|
||||
|
||||
float height = pos.GetPositionZ() + vehicle->GetBase()->GetCollisionHeight();
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
float height = pos.GetPositionZ() + vehicle->GetBase()->GetCollisionHeight();
|
||||
|
||||
Movement::MoveSplineInit init(this);
|
||||
// Creatures without inhabit type air should begin falling after exiting the vehicle
|
||||
if (GetTypeId() == TYPEID_UNIT && !CanFly() && height > GetMap()->GetWaterOrGroundLevel(GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ() + vehicle->GetBase()->GetCollisionHeight(), &height))
|
||||
init.SetFall();
|
||||
|
||||
// Creatures without inhabit type air should begin falling after exiting the vehicle
|
||||
if (GetTypeId() == TYPEID_UNIT && !CanFly() && height > GetMap()->GetWaterOrGroundLevel(GetPhaseMask(), pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ() + vehicle->GetBase()->GetCollisionHeight(), &height))
|
||||
init.SetFall();
|
||||
|
||||
init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), height, false);
|
||||
init.SetFacing(pos.GetOrientation());
|
||||
init.SetTransportExit();
|
||||
GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_EXIT, MOTION_PRIORITY_HIGHEST);
|
||||
init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), height, false);
|
||||
init.SetFacing(pos.GetOrientation());
|
||||
init.SetTransportExit();
|
||||
};
|
||||
GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_EXIT, MOTION_PRIORITY_HIGHEST);
|
||||
|
||||
if (player)
|
||||
player->ResummonPetTemporaryUnSummonedIfAny();
|
||||
|
||||
@@ -883,12 +883,14 @@ bool VehicleJoinEvent::Execute(uint64, uint32)
|
||||
Passenger->SetControlled(true, UNIT_STATE_ROOT); // SMSG_FORCE_ROOT - In some cases we send SMSG_SPLINE_MOVE_ROOT here (for creatures)
|
||||
// also adds MOVEMENTFLAG_ROOT
|
||||
|
||||
Movement::MoveSplineInit init(Passenger);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(x, y, z, false, true);
|
||||
init.SetFacing(o);
|
||||
init.SetTransportEnter();
|
||||
Passenger->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(x, y, z, false, true);
|
||||
init.SetFacing(o);
|
||||
init.SetTransportEnter();
|
||||
};
|
||||
Passenger->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
|
||||
|
||||
for (auto const& [guid, threatRef] : Passenger->GetThreatManager().GetThreatenedByMeList())
|
||||
threatRef->GetOwner()->GetThreatManager().AddThreat(Target->GetBase(), threatRef->GetThreat(), nullptr, true, true);
|
||||
|
||||
@@ -297,41 +297,26 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData)
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
|
||||
if (!movementInfo.pos.IsPositionValid())
|
||||
{
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mover->movespline->Finalized())
|
||||
{
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
return;
|
||||
}
|
||||
|
||||
/* handle special cases */
|
||||
if (movementInfo.HasMovementFlag(MOVEMENTFLAG_ONTRANSPORT))
|
||||
{
|
||||
// We were teleported, skip packets that were broadcast before teleport
|
||||
if (movementInfo.pos.GetExactDist2d(mover) > SIZE_OF_GRIDS)
|
||||
{
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
return;
|
||||
}
|
||||
|
||||
// transports size limited
|
||||
// (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped)
|
||||
if (fabs(movementInfo.transport.pos.GetPositionX()) > 75.0f || fabs(movementInfo.transport.pos.GetPositionY()) > 75.0f || fabs(movementInfo.transport.pos.GetPositionZ()) > 75.0f)
|
||||
{
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Trinity::IsValidMapCoord(movementInfo.pos.GetPositionX() + movementInfo.transport.pos.GetPositionX(), movementInfo.pos.GetPositionY() + movementInfo.transport.pos.GetPositionY(),
|
||||
movementInfo.pos.GetPositionZ() + movementInfo.transport.pos.GetPositionZ(), movementInfo.pos.GetOrientation() + movementInfo.transport.pos.GetOrientation()))
|
||||
{
|
||||
recvData.rfinish(); // prevent warnings spam
|
||||
return;
|
||||
}
|
||||
|
||||
// if we boarded a transport, add us to it
|
||||
if (plrMover)
|
||||
|
||||
@@ -686,10 +686,12 @@ void MotionMaster::MoveCloserAndStop(uint32 id, Unit* target, float distance)
|
||||
else
|
||||
{
|
||||
// We are already close enough. We just need to turn toward the target without changing position.
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ());
|
||||
init.SetFacing(target);
|
||||
Add(new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, id));
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=, target = target->GetGUID()](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ());
|
||||
init.SetFacing(target);
|
||||
};
|
||||
Add(new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, id));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -697,24 +699,28 @@ void MotionMaster::MoveLand(uint32 id, Position const& pos, Optional<float> velo
|
||||
{
|
||||
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveLand: '%s', landing point Id: %u (X: %f, Y: %f, Z: %f)", _owner->GetGUID().ToString().c_str(), id, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
|
||||
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
init.MoveTo(PositionToVector3(pos), false);
|
||||
init.SetAnimation(AnimTier::Ground);
|
||||
if (velocity)
|
||||
init.SetVelocity(*velocity);
|
||||
Add(new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, id));
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(PositionToVector3(pos), false);
|
||||
init.SetAnimation(AnimTier::Ground);
|
||||
if (velocity)
|
||||
init.SetVelocity(*velocity);
|
||||
};
|
||||
Add(new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, id));
|
||||
}
|
||||
|
||||
void MotionMaster::MoveTakeoff(uint32 id, Position const& pos, Optional<float> velocity /*= {}*/)
|
||||
{
|
||||
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveTakeoff: '%s', landing point Id: %u (X: %f, Y: %f, Z: %f)", _owner->GetGUID().ToString().c_str(), id, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
|
||||
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
init.MoveTo(PositionToVector3(pos), false);
|
||||
init.SetAnimation(AnimTier::Hover);
|
||||
if (velocity)
|
||||
init.SetVelocity(*velocity);
|
||||
Add(new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, id));
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(PositionToVector3(pos), false);
|
||||
init.SetAnimation(AnimTier::Hover);
|
||||
if (velocity)
|
||||
init.SetVelocity(*velocity);
|
||||
};
|
||||
Add(new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, id));
|
||||
}
|
||||
|
||||
void MotionMaster::MoveCharge(float x, float y, float z, float speed /*= SPEED_CHARGE*/, uint32 id /*= EVENT_CHARGE*/, bool generatePath /*= false*/)
|
||||
@@ -771,13 +777,15 @@ void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, floa
|
||||
// Use a mmap raycast to get a valid destination.
|
||||
_owner->MovePositionToFirstCollision(dest, dist, _owner->GetRelativeAngle(srcX, srcY) + float(M_PI));
|
||||
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false);
|
||||
init.SetParabolic(max_height, 0);
|
||||
init.SetOrientationFixed(true);
|
||||
init.SetVelocity(speedXY);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false);
|
||||
init.SetParabolic(max_height, 0);
|
||||
init.SetOrientationFixed(true);
|
||||
init.SetVelocity(speedXY);
|
||||
};
|
||||
|
||||
GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, 0);
|
||||
GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, 0);
|
||||
movement->Priority = MOTION_PRIORITY_HIGHEST;
|
||||
movement->AddFlag(MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH);
|
||||
Add(movement);
|
||||
@@ -814,14 +822,16 @@ void MotionMaster::MoveJump(float x, float y, float z, float o, float speedXY, f
|
||||
float moveTimeHalf = speedZ / Movement::gravity;
|
||||
float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);
|
||||
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
init.MoveTo(x, y, z, false);
|
||||
init.SetParabolic(max_height, 0);
|
||||
init.SetVelocity(speedXY);
|
||||
if (hasOrientation)
|
||||
init.SetFacing(o);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(x, y, z, false);
|
||||
init.SetParabolic(max_height, 0);
|
||||
init.SetVelocity(speedXY);
|
||||
if (hasOrientation)
|
||||
init.SetFacing(o);
|
||||
};
|
||||
|
||||
GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, id);
|
||||
GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, id);
|
||||
movement->Priority = MOTION_PRIORITY_HIGHEST;
|
||||
movement->BaseUnitState = UNIT_STATE_JUMPING;
|
||||
movement->AddFlag(MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH);
|
||||
@@ -830,47 +840,47 @@ void MotionMaster::MoveJump(float x, float y, float z, float o, float speedXY, f
|
||||
|
||||
void MotionMaster::MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount)
|
||||
{
|
||||
float step = 2 * float(M_PI) / stepCount * (clockwise ? -1.0f : 1.0f);
|
||||
Position const& pos = { x, y, z, 0.0f };
|
||||
float angle = pos.GetAbsoluteAngle(_owner->GetPositionX(), _owner->GetPositionY());
|
||||
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
|
||||
// add the owner's current position as starting point as it gets removed after entering the cycle
|
||||
init.Path().push_back(G3D::Vector3(_owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()));
|
||||
|
||||
for (uint8 i = 0; i < stepCount; angle += step, ++i)
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
G3D::Vector3 point;
|
||||
point.x = x + radius * cosf(angle);
|
||||
point.y = y + radius * sinf(angle);
|
||||
float step = 2 * float(M_PI) / stepCount * (clockwise ? -1.0f : 1.0f);
|
||||
Position const& pos = { x, y, z, 0.0f };
|
||||
float angle = pos.GetAbsoluteAngle(_owner->GetPositionX(), _owner->GetPositionY());
|
||||
|
||||
// add the owner's current position as starting point as it gets removed after entering the cycle
|
||||
init.Path().push_back(G3D::Vector3(_owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()));
|
||||
|
||||
for (uint8 i = 0; i < stepCount; angle += step, ++i)
|
||||
{
|
||||
G3D::Vector3 point;
|
||||
point.x = x + radius * cosf(angle);
|
||||
point.y = y + radius * sinf(angle);
|
||||
|
||||
if (_owner->IsFlying())
|
||||
point.z = z;
|
||||
else
|
||||
point.z = _owner->GetMapHeight(point.x, point.y, z) + _owner->GetHoverOffset();
|
||||
|
||||
init.Path().push_back(point);
|
||||
}
|
||||
|
||||
if (_owner->IsFlying())
|
||||
point.z = z;
|
||||
{
|
||||
init.SetFly();
|
||||
init.SetCyclic();
|
||||
init.SetAnimation(AnimTier::Hover);
|
||||
}
|
||||
else
|
||||
point.z = _owner->GetMapHeight(point.x, point.y, z) + _owner->GetHoverOffset();
|
||||
{
|
||||
init.SetWalk(true);
|
||||
init.SetCyclic();
|
||||
}
|
||||
};
|
||||
|
||||
init.Path().push_back(point);
|
||||
}
|
||||
|
||||
if (_owner->IsFlying())
|
||||
{
|
||||
init.SetFly();
|
||||
init.SetCyclic();
|
||||
init.SetAnimation(AnimTier::Hover);
|
||||
}
|
||||
else
|
||||
{
|
||||
init.SetWalk(true);
|
||||
init.SetCyclic();
|
||||
}
|
||||
|
||||
Add(new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, 0));
|
||||
Add(new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, 0));
|
||||
}
|
||||
|
||||
void MotionMaster::MoveSmoothPath(uint32 pointId, Position const* pathPoints, size_t pathSize, bool walk)
|
||||
{
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
Movement::PointsArray path;
|
||||
path.reserve(pathSize);
|
||||
std::transform(pathPoints, pathPoints + pathSize, std::back_inserter(path), [](Position const& point)
|
||||
@@ -878,14 +888,17 @@ void MotionMaster::MoveSmoothPath(uint32 pointId, Position const* pathPoints, si
|
||||
return G3D::Vector3(point.GetPositionX(), point.GetPositionY(), point.GetPositionZ());
|
||||
});
|
||||
|
||||
init.MovebyPath(path);
|
||||
init.SetSmooth();
|
||||
init.SetWalk(walk);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MovebyPath(path);
|
||||
init.SetSmooth();
|
||||
init.SetWalk(walk);
|
||||
};
|
||||
|
||||
// This code is not correct
|
||||
// GenericMovementGenerator does not affect UNIT_STATE_ROAMING_MOVE
|
||||
// need to call PointMovementGenerator with various pointIds
|
||||
Add(new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, pointId));
|
||||
Add(new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, pointId));
|
||||
}
|
||||
|
||||
void MotionMaster::MoveAlongSplineChain(uint32 pointId, uint16 dbChainId, bool walk)
|
||||
@@ -949,11 +962,13 @@ void MotionMaster::MoveFall(uint32 id/* = 0*/)
|
||||
return;
|
||||
}
|
||||
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), tz + _owner->GetHoverOffset(), false);
|
||||
init.SetFall();
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), tz + _owner->GetHoverOffset(), false);
|
||||
init.SetFall();
|
||||
};
|
||||
|
||||
GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, id);
|
||||
GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(initializer), EFFECT_MOTION_TYPE, id);
|
||||
movement->Priority = MOTION_PRIORITY_HIGHEST;
|
||||
Add(movement);
|
||||
}
|
||||
@@ -1050,7 +1065,7 @@ void MotionMaster::MoveFormation(Unit* leader, float range, float angle, uint32
|
||||
}
|
||||
}
|
||||
|
||||
void MotionMaster::LaunchMoveSpline(Movement::MoveSplineInit&& init, uint32 id/*= 0*/, MovementGeneratorPriority priority/* = MOTION_PRIORITY_NORMAL*/, MovementGeneratorType type/*= EFFECT_MOTION_TYPE*/)
|
||||
void MotionMaster::LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& init)>&& initializer, uint32 id/*= 0*/, MovementGeneratorPriority priority/* = MOTION_PRIORITY_NORMAL*/, MovementGeneratorType type/*= EFFECT_MOTION_TYPE*/)
|
||||
{
|
||||
if (IsInvalidMovementGeneratorType(type))
|
||||
{
|
||||
@@ -1060,7 +1075,7 @@ void MotionMaster::LaunchMoveSpline(Movement::MoveSplineInit&& init, uint32 id/*
|
||||
|
||||
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::LaunchMoveSpline: '%s', initiates spline Id: %u (Type: %u, Priority: %u)", _owner->GetGUID().ToString().c_str(), id, type, priority);
|
||||
|
||||
GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(init), type, id);
|
||||
GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(initializer), type, id);
|
||||
movement->Priority = priority;
|
||||
Add(movement);
|
||||
}
|
||||
|
||||
@@ -193,7 +193,7 @@ class TC_GAME_API MotionMaster
|
||||
void MoveRotate(uint32 id, uint32 time, RotateDirection direction);
|
||||
void MoveFormation(Unit* leader, float range, float angle, uint32 point1, uint32 point2);
|
||||
|
||||
void LaunchMoveSpline(Movement::MoveSplineInit&& init, uint32 id = 0, MovementGeneratorPriority priority = MOTION_PRIORITY_NORMAL, MovementGeneratorType type = EFFECT_MOTION_TYPE);
|
||||
void LaunchMoveSpline(std::function<void(Movement::MoveSplineInit& init)>&& initializer, uint32 id = 0, MovementGeneratorPriority priority = MOTION_PRIORITY_NORMAL, MovementGeneratorType type = EFFECT_MOTION_TYPE);
|
||||
private:
|
||||
typedef std::unique_ptr<MovementGenerator, MovementGeneratorDeleter> MovementGeneratorPointer;
|
||||
typedef std::multiset<MovementGenerator*, MovementGeneratorComparator> MotionMasterContainer;
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include "MoveSpline.h"
|
||||
#include "Unit.h"
|
||||
|
||||
GenericMovementGenerator::GenericMovementGenerator(Movement::MoveSplineInit&& splineInit, MovementGeneratorType type, uint32 id) : _splineInit(std::move(splineInit)), _type(type), _pointId(id), _duration(0)
|
||||
GenericMovementGenerator::GenericMovementGenerator(std::function<void(Movement::MoveSplineInit& init)>&& initializer, MovementGeneratorType type, uint32 id) : _splineInit(std::move(initializer)), _type(type), _pointId(id), _duration(0)
|
||||
{
|
||||
Mode = MOTION_MODE_DEFAULT;
|
||||
Priority = MOTION_PRIORITY_NORMAL;
|
||||
@@ -30,7 +30,7 @@ GenericMovementGenerator::GenericMovementGenerator(Movement::MoveSplineInit&& sp
|
||||
BaseUnitState = UNIT_STATE_ROAMING;
|
||||
}
|
||||
|
||||
void GenericMovementGenerator::Initialize(Unit* /*owner*/)
|
||||
void GenericMovementGenerator::Initialize(Unit* owner)
|
||||
{
|
||||
if (HasFlag(MOVEMENTGENERATOR_FLAG_DEACTIVATED) && !HasFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING)) // Resume spline is not supported
|
||||
{
|
||||
@@ -42,7 +42,9 @@ void GenericMovementGenerator::Initialize(Unit* /*owner*/)
|
||||
RemoveFlag(MOVEMENTGENERATOR_FLAG_INITIALIZATION_PENDING | MOVEMENTGENERATOR_FLAG_DEACTIVATED);
|
||||
AddFlag(MOVEMENTGENERATOR_FLAG_INITIALIZED);
|
||||
|
||||
_duration.Reset(_splineInit.Launch());
|
||||
Movement::MoveSplineInit init(owner);
|
||||
_splineInit(init);
|
||||
_duration.Reset(init.Launch());
|
||||
}
|
||||
|
||||
void GenericMovementGenerator::Reset(Unit* owner)
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "MovementGenerator.h"
|
||||
#include "MoveSplineInit.h"
|
||||
#include "Timer.h"
|
||||
#include <functional>
|
||||
|
||||
class Unit;
|
||||
|
||||
@@ -29,7 +30,7 @@ enum MovementGeneratorType : uint8;
|
||||
class GenericMovementGenerator : public MovementGenerator
|
||||
{
|
||||
public:
|
||||
explicit GenericMovementGenerator(Movement::MoveSplineInit&& splineInit, MovementGeneratorType type, uint32 id);
|
||||
explicit GenericMovementGenerator(std::function<void(Movement::MoveSplineInit& init)>&& initializer, MovementGeneratorType type, uint32 id);
|
||||
|
||||
void Initialize(Unit*) override;
|
||||
void Reset(Unit*) override;
|
||||
@@ -41,7 +42,7 @@ class GenericMovementGenerator : public MovementGenerator
|
||||
private:
|
||||
void MovementInform(Unit*);
|
||||
|
||||
Movement::MoveSplineInit _splineInit;
|
||||
std::function<void(Movement::MoveSplineInit& init)> _splineInit;
|
||||
MovementGeneratorType _type;
|
||||
uint32 _pointId;
|
||||
TimeTracker _duration;
|
||||
|
||||
@@ -211,9 +211,14 @@ namespace Movement
|
||||
}
|
||||
|
||||
void MoveSplineInit::SetFacing(Unit const* target)
|
||||
{
|
||||
SetFacing(target->GetGUID());
|
||||
}
|
||||
|
||||
void MoveSplineInit::SetFacing(ObjectGuid const& target)
|
||||
{
|
||||
args.flags.EnableFacingTarget();
|
||||
args.facing.target = target->GetGUID().GetRawValue();
|
||||
args.facing.target = target.GetRawValue();
|
||||
}
|
||||
|
||||
void MoveSplineInit::SetFacing(float angle)
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "MoveSplineInitArgs.h"
|
||||
|
||||
class ObjectGuid;
|
||||
class Unit;
|
||||
|
||||
enum class AnimTier : uint8;
|
||||
@@ -79,6 +80,7 @@ namespace Movement
|
||||
void SetFacing(float angle);
|
||||
void SetFacing(Vector3 const& point);
|
||||
void SetFacing(Unit const* target);
|
||||
void SetFacing(ObjectGuid const& target);
|
||||
|
||||
/* Initializes movement by path
|
||||
* @param path - array of points, shouldn't be empty
|
||||
|
||||
@@ -472,14 +472,16 @@ struct npc_eye_of_acherus : public ScriptedAI
|
||||
break;
|
||||
case EVENT_LAUNCH_TOWARDS_DESTINATION:
|
||||
{
|
||||
Movement::PointsArray path(EyeOfAcherusPath, EyeOfAcherusPath + EyeOfAcherusPathSize);
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.MovebyPath(path);
|
||||
init.SetFly();
|
||||
if (Unit* owner = me->GetCharmerOrOwner())
|
||||
init.SetVelocity(owner->GetSpeed(MOVE_RUN));
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
Movement::PointsArray path(EyeOfAcherusPath, EyeOfAcherusPath + EyeOfAcherusPathSize);
|
||||
init.MovebyPath(path);
|
||||
init.SetFly();
|
||||
if (Unit* owner = me->GetCharmerOrOwner())
|
||||
init.SetVelocity(owner->GetSpeed(MOVE_RUN));
|
||||
};
|
||||
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(init), POINT_NEW_AVALON, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), POINT_NEW_AVALON, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
break;
|
||||
}
|
||||
case EVENT_GRANT_CONTROL:
|
||||
|
||||
@@ -1466,12 +1466,14 @@ public:
|
||||
if (Creature* chromie = instance->instance->SummonCreature(NPC_CHROMIE_3, ArthasPositions[RP5_CHROMIE_SPAWN]))
|
||||
{
|
||||
chromie->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
|
||||
Movement::PointsArray path(ChromieSplinePos, ChromieSplinePos + chromiePathSize);
|
||||
Movement::MoveSplineInit init(chromie);
|
||||
init.SetFly();
|
||||
init.SetWalk(true);
|
||||
init.MovebyPath(path, 0);
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
|
||||
{
|
||||
Movement::PointsArray path(ChromieSplinePos, ChromieSplinePos + chromiePathSize);
|
||||
init.SetFly();
|
||||
init.SetWalk(true);
|
||||
init.MovebyPath(path, 0);
|
||||
};
|
||||
chromie->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
}
|
||||
break;
|
||||
case RP5_EVENT_CHROMIE_LAND:
|
||||
|
||||
@@ -474,10 +474,12 @@ public:
|
||||
if (!_owner->IsAlive())
|
||||
return true;
|
||||
|
||||
Movement::MoveSplineInit init(_owner);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(_dest.GetPositionX(), _dest.GetPositionY(), _dest.GetPositionZ(), false);
|
||||
_owner->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_CHARGE_PREPATH, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [dest = _dest](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false);
|
||||
};
|
||||
_owner->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_CHARGE_PREPATH, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -568,10 +570,12 @@ struct gunship_npc_AI : public ScriptedAI
|
||||
me->GetTransport()->CalculatePassengerPosition(hx, hy, hz, &ho);
|
||||
me->SetHomePosition(hx, hy, hz, ho);
|
||||
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(x, y, z, false);
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_CHARGE_PREPATH, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(x, y, z, false);
|
||||
};
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_CHARGE_PREPATH, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -934,11 +938,13 @@ struct npc_high_overlord_saurfang_igb : public ScriptedAI
|
||||
}
|
||||
else if (action == ACTION_EXIT_SHIP)
|
||||
{
|
||||
Movement::PointsArray path(SaurfangExitPath, SaurfangExitPath + SaurfangExitPathSize);
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MovebyPath(path, 0);
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
|
||||
{
|
||||
Movement::PointsArray path(SaurfangExitPath, SaurfangExitPath + SaurfangExitPathSize);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MovebyPath(path, 0);
|
||||
};
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
|
||||
me->DespawnOrUnsummon(18s);
|
||||
}
|
||||
@@ -1187,11 +1193,13 @@ struct npc_muradin_bronzebeard_igb : public ScriptedAI
|
||||
}
|
||||
else if (action == ACTION_EXIT_SHIP)
|
||||
{
|
||||
Movement::PointsArray path(MuradinExitPath, MuradinExitPath + MuradinExitPathSize);
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MovebyPath(path, 0);
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
|
||||
{
|
||||
Movement::PointsArray path(MuradinExitPath, MuradinExitPath + MuradinExitPathSize);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MovebyPath(path, 0);
|
||||
};
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
|
||||
me->DespawnOrUnsummon(18s);
|
||||
}
|
||||
|
||||
@@ -455,10 +455,12 @@ struct npc_bone_spike : public ScriptedAI
|
||||
/// @HACK - Change passenger offset to the one taken directly from sniffs
|
||||
/// Remove this when proper calculations are implemented.
|
||||
/// This fixes healing spiked people
|
||||
Movement::MoveSplineInit init(passenger);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false);
|
||||
passenger->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false);
|
||||
};
|
||||
passenger->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
|
||||
@@ -119,12 +119,14 @@ struct npc_frogger_trigger_naxx : public NullCreatureAI
|
||||
private:
|
||||
EventMap _events;
|
||||
|
||||
static void LaunchSpline(Creature* slime, Position const dest)
|
||||
static void LaunchSpline(Creature* slime, Position const& dest)
|
||||
{
|
||||
Movement::MoveSplineInit init(slime);
|
||||
init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ());
|
||||
init.SetWalk(true);
|
||||
slime->GetMotionMaster()->LaunchMoveSpline(std::move(init));
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [dest = dest](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ());
|
||||
init.SetWalk(true);
|
||||
};
|
||||
slime->GetMotionMaster()->LaunchMoveSpline(std::move(initializer));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -319,10 +319,12 @@ struct boss_algalon_the_observer : public BossAI
|
||||
DoCastSelf(SPELL_RIDE_THE_LIGHTNING, true);
|
||||
me->SetHomePosition(AlgalonLandPos);
|
||||
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.MoveTo(AlgalonLandPos.GetPositionX(), AlgalonLandPos.GetPositionY(), AlgalonLandPos.GetPositionZ(), false);
|
||||
init.SetOrientationFixed(true);
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(AlgalonLandPos.GetPositionX(), AlgalonLandPos.GetPositionY(), AlgalonLandPos.GetPositionZ(), false);
|
||||
init.SetOrientationFixed(true);
|
||||
};
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
|
||||
events.Reset();
|
||||
events.SetPhase(PHASE_ROLE_PLAY);
|
||||
|
||||
@@ -331,12 +331,14 @@ struct boss_razorscale : public BossAI
|
||||
|
||||
void HandleInitialMovement()
|
||||
{
|
||||
Movement::PointsArray path(RazorscalePath, RazorscalePath + pathSize);
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.MovebyPath(path, 0);
|
||||
init.SetCyclic();
|
||||
init.SetFly();
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
|
||||
{
|
||||
Movement::PointsArray path(RazorscalePath, RazorscalePath + pathSize);
|
||||
init.MovebyPath(path, 0);
|
||||
init.SetCyclic();
|
||||
init.SetFly();
|
||||
};
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
}
|
||||
|
||||
bool CanAIAttack(Unit const* target) const override
|
||||
|
||||
@@ -651,16 +651,18 @@ class boss_thorim : public CreatureScript
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
summon->CastSpell(summon, SPELL_LIGHTNING_DESTRUCTION, true);
|
||||
|
||||
Movement::PointsArray path;
|
||||
path.reserve(LightningOrbPathSize);
|
||||
std::transform(std::begin(LightningOrbPath), std::end(LightningOrbPath), std::back_inserter(path), [](Position const& pos)
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
|
||||
{
|
||||
return G3D::Vector3(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
|
||||
});
|
||||
Movement::PointsArray path;
|
||||
path.reserve(LightningOrbPathSize);
|
||||
std::transform(std::begin(LightningOrbPath), std::end(LightningOrbPath), std::back_inserter(path), [](Position const& pos)
|
||||
{
|
||||
return G3D::Vector3(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
|
||||
});
|
||||
|
||||
Movement::MoveSplineInit init(summon);
|
||||
init.MovebyPath(path);
|
||||
summon->GetMotionMaster()->LaunchMoveSpline(std::move(init), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
init.MovebyPath(path);
|
||||
};
|
||||
summon->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), 0, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE);
|
||||
break;
|
||||
}
|
||||
case NPC_DARK_RUNE_CHAMPION:
|
||||
|
||||
@@ -347,10 +347,12 @@ struct npc_grauf : public ScriptedAI
|
||||
return;
|
||||
}
|
||||
|
||||
Movement::MoveSplineInit init(who);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(0.3320355f, 0.05355075f, 5.196949f, false);
|
||||
who->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(0.3320355f, 0.05355075f, 5.196949f, false);
|
||||
};
|
||||
who->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
|
||||
|
||||
me->setActive(true);
|
||||
me->SetFarVisible(true);
|
||||
|
||||
@@ -257,10 +257,12 @@ struct boss_svala : public BossAI
|
||||
arthas->CastSpell(me, SPELL_TRANSFORMING_CHANNEL, true);
|
||||
|
||||
me->SetDisableGravity(true);
|
||||
Movement::MoveSplineInit init(me);
|
||||
init.MoveTo(296.614f, -346.2484f, 95.62769f);
|
||||
init.SetFly();
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(init));
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.MoveTo(296.614f, -346.2484f, 95.62769f);
|
||||
init.SetFly();
|
||||
};
|
||||
me->GetMotionMaster()->LaunchMoveSpline(std::move(initializer));
|
||||
|
||||
// spectators flee event
|
||||
std::list<Creature*> spectators;
|
||||
|
||||
@@ -2398,11 +2398,13 @@ public:
|
||||
break;
|
||||
}
|
||||
|
||||
Movement::MoveSplineInit init(who);
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(x, y, z, false);
|
||||
init.SetFacing(o);
|
||||
who->GetMotionMaster()->LaunchMoveSpline(std::move(init), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
|
||||
std::function<void(Movement::MoveSplineInit&)> initializer = [=](Movement::MoveSplineInit& init)
|
||||
{
|
||||
init.DisableTransportPathTransformations();
|
||||
init.MoveTo(x, y, z, false);
|
||||
init.SetFacing(o);
|
||||
};
|
||||
who->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
|
||||
who->m_Events.AddEvent(new CastFoodSpell(who, _chairSpells.at(who->GetEntry())), who->m_Events.CalculateTime(1s));
|
||||
if (who->GetTypeId() == TYPEID_UNIT)
|
||||
who->SetDisplayId(who->ToCreature()->GetCreatureTemplate()->Modelid1);
|
||||
|
||||
Reference in New Issue
Block a user