mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-24 21:31:28 +00:00
86 lines
2.1 KiB
C++
86 lines
2.1 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include <DetourNavMesh.h>
|
|
#include <DetourNavMeshQuery.h>
|
|
#include <glm/vec3.hpp>
|
|
|
|
enum NavigationAreaFlags
|
|
{
|
|
NavigationAreaFlagNormal,
|
|
NavigationAreaFlagWater,
|
|
NavigationAreaFlagLava,
|
|
NavigationAreaFlagZoneLine,
|
|
NavigationAreaFlagPvP,
|
|
NavigationAreaFlagSlime,
|
|
NavigationAreaFlagIce,
|
|
NavigationAreaFlagVWater,
|
|
NavigationAreaFlagGeneralArea,
|
|
NavigationAreaFlagPortal,
|
|
NavigationAreaFlagDisabled,
|
|
};
|
|
|
|
enum NavigationPolyFlags
|
|
{
|
|
NavigationPolyFlagNormal = 1,
|
|
NavigationPolyFlagWater = 2,
|
|
NavigationPolyFlagLava = 4,
|
|
NavigationPolyFlagZoneLine = 8,
|
|
NavigationPolyFlagPvP = 16,
|
|
NavigationPolyFlagSlime = 32,
|
|
NavigationPolyFlagIce = 64,
|
|
NavigationPolyFlagVWater = 128,
|
|
NavigationPolyFlagGeneralArea = 256,
|
|
NavigationPolyFlagPortal = 512,
|
|
NavigationPolyFlagDisabled = 1024,
|
|
NavigationPolyFlagAll = 0xFFFF
|
|
};
|
|
|
|
struct PathfindingNode
|
|
{
|
|
glm::vec3 position;
|
|
unsigned short flag;
|
|
};
|
|
|
|
class PathfindingRoute
|
|
{
|
|
public:
|
|
PathfindingRoute();
|
|
~PathfindingRoute();
|
|
|
|
bool Active() const { return m_active; }
|
|
bool DestinationValid(const glm::vec3 &dest);
|
|
void CalcCurrentNode(const glm::vec3 ¤t_pos, bool &wp_changed);
|
|
const PathfindingNode& GetCurrentNode() { return m_nodes[m_current_node]; }
|
|
unsigned short GetPreviousNodeFlag();
|
|
const std::vector<PathfindingNode>& GetNodes() const { return m_nodes; }
|
|
std::vector<PathfindingNode>& GetNodesEdit() { return m_nodes; }
|
|
private:
|
|
glm::vec3 m_dest;
|
|
std::vector<PathfindingNode> m_nodes;
|
|
int m_current_node;
|
|
bool m_active;
|
|
|
|
friend class PathfindingManager;
|
|
};
|
|
|
|
class PathfindingManager
|
|
{
|
|
public:
|
|
PathfindingManager();
|
|
~PathfindingManager();
|
|
|
|
void Load(const std::string &filename);
|
|
void Clear();
|
|
|
|
//Expects locations in EQEmu internal format eg what #loc returns not what /loc returns.
|
|
PathfindingRoute FindRoute(const glm::vec3 ¤t_location, const glm::vec3 &dest_location);
|
|
bool GetRandomPoint(const glm::vec3 &start, float radius, glm::vec3 &pos);
|
|
bool Loaded() const { return m_nav_mesh != nullptr; }
|
|
private:
|
|
dtNavMesh *m_nav_mesh;
|
|
dtNavMeshQuery *m_nav_query;
|
|
dtQueryFilter m_filter;
|
|
};
|