mirror of
https://github.com/mangosfour/server.git
synced 2025-12-27 01:37:04 +00:00
Spline movement controls movements of server-side controlled units (monster movement, taxi movement, etc). Proper implementation of effects such as charge, jump, cyclic movement will rely on it. However, need improve our states system before. Technical changes: 1. Added linear, catmullrom and bezier3 splines which based on client's algorthims. They can be reused for proper transport position interpolation. 2. Precission increased. There are no more position desync issues since client's position calculation formulas used. 3. Now possible to move by paths with multiple points, send whole path to client.
141 lines
4.6 KiB
C++
141 lines
4.6 KiB
C++
/*
|
|
* Copyright (C) 2005-2011 MaNGOS <http://getmangos.com/>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef MANGOS_WAYPOINTMOVEMENTGENERATOR_H
|
|
#define MANGOS_WAYPOINTMOVEMENTGENERATOR_H
|
|
|
|
/** @page PathMovementGenerator is used to generate movements
|
|
* of waypoints and flight paths. Each serves the purpose
|
|
* of generate activities so that it generates updated
|
|
* packets for the players.
|
|
*/
|
|
|
|
#include "MovementGenerator.h"
|
|
#include "WaypointManager.h"
|
|
|
|
#include "Player.h"
|
|
|
|
#include <vector>
|
|
#include <set>
|
|
|
|
#define FLIGHT_TRAVEL_UPDATE 100
|
|
#define STOP_TIME_FOR_PLAYER 3 * MINUTE * IN_MILLISECONDS // 3 Minutes
|
|
|
|
template<class T, class P>
|
|
class MANGOS_DLL_SPEC PathMovementBase
|
|
{
|
|
public:
|
|
PathMovementBase() : i_currentNode(0) {}
|
|
virtual ~PathMovementBase() {};
|
|
|
|
bool MovementInProgress(void) const { return (i_currentNode+1) < i_path->size(); }
|
|
|
|
// template pattern, not defined .. override required
|
|
void LoadPath(T &);
|
|
uint32 GetCurrentNode() const { return i_currentNode; }
|
|
|
|
protected:
|
|
P i_path;
|
|
uint32 i_currentNode;
|
|
};
|
|
|
|
/** WaypointMovementGenerator loads a series of way points
|
|
* from the DB and apply it to the creature's movement generator.
|
|
* Hence, the creature will move according to its predefined way points.
|
|
*/
|
|
|
|
template<class T>
|
|
class MANGOS_DLL_SPEC WaypointMovementGenerator;
|
|
|
|
template<>
|
|
class MANGOS_DLL_SPEC WaypointMovementGenerator<Creature>
|
|
: public MovementGeneratorMedium< Creature, WaypointMovementGenerator<Creature> >,
|
|
public PathMovementBase<Creature, WaypointPath const*>
|
|
{
|
|
public:
|
|
WaypointMovementGenerator(Creature &) : i_nextMoveTime(0), m_isArrivalDone(false) {}
|
|
~WaypointMovementGenerator() { i_path = NULL; }
|
|
void Initialize(Creature &u);
|
|
void Interrupt(Creature &);
|
|
void Finalize(Creature &);
|
|
void Reset(Creature &u);
|
|
bool Update(Creature &u, const uint32 &diff);
|
|
|
|
void MovementInform(Creature &);
|
|
|
|
MovementGeneratorType GetMovementGeneratorType() const { return WAYPOINT_MOTION_TYPE; }
|
|
|
|
// now path movement implmementation
|
|
void LoadPath(Creature &c);
|
|
|
|
bool GetResetPosition(Creature&, float& x, float& y, float& z);
|
|
|
|
private:
|
|
|
|
void Stop(int32 time) { i_nextMoveTime.Reset(time);}
|
|
|
|
bool Stopped() { return !i_nextMoveTime.Passed();}
|
|
|
|
bool CanMove(int32 diff)
|
|
{
|
|
i_nextMoveTime.Update(diff);
|
|
return i_nextMoveTime.Passed();
|
|
}
|
|
|
|
void OnArrived(Creature&);
|
|
void StartMove(Creature&);
|
|
|
|
void StartMoveNow(Creature& creature)
|
|
{
|
|
i_nextMoveTime.Reset(0);
|
|
StartMove(creature);
|
|
}
|
|
|
|
ShortTimeTracker i_nextMoveTime;
|
|
bool m_isArrivalDone;
|
|
};
|
|
|
|
/** FlightPathMovementGenerator generates movement of the player for the paths
|
|
* and hence generates ground and activities for the player.
|
|
*/
|
|
class MANGOS_DLL_SPEC FlightPathMovementGenerator
|
|
: public MovementGeneratorMedium< Player, FlightPathMovementGenerator >,
|
|
public PathMovementBase<Player,TaxiPathNodeList const*>
|
|
{
|
|
public:
|
|
explicit FlightPathMovementGenerator(TaxiPathNodeList const& pathnodes, uint32 startNode = 0)
|
|
{
|
|
i_path = &pathnodes;
|
|
i_currentNode = startNode;
|
|
}
|
|
void Initialize(Player &);
|
|
void Finalize(Player &);
|
|
void Interrupt(Player &);
|
|
void Reset(Player &);
|
|
bool Update(Player &, const uint32 &);
|
|
MovementGeneratorType GetMovementGeneratorType() const { return FLIGHT_MOTION_TYPE; }
|
|
|
|
TaxiPathNodeList const& GetPath() { return *i_path; }
|
|
uint32 GetPathAtMapEnd() const;
|
|
bool HasArrived() const { return (i_currentNode >= i_path->size()); }
|
|
void SetCurrentNodeAfterTeleport();
|
|
void SkipCurrentNode() { ++i_currentNode; }
|
|
void DoEventIfAny(Player& player, TaxiPathNodeEntry const& node, bool departure);
|
|
bool GetResetPosition(Player&, float& x, float& y, float& z);
|
|
};
|
|
#endif
|