mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-03 09:26:36 +00:00
Merge fixes, hopefully didn't break anything.
This commit is contained in:
+106
-110
@@ -1,4 +1,4 @@
|
||||
#include "../common/debug.h"
|
||||
#include "../common/global_define.h"
|
||||
|
||||
#include "client.h"
|
||||
#include "doors.h"
|
||||
@@ -17,7 +17,6 @@
|
||||
#endif
|
||||
|
||||
//#define PATHDEBUG
|
||||
#define ABS(x) ((x)<0?-(x):(x))
|
||||
|
||||
extern Zone *zone;
|
||||
|
||||
@@ -61,19 +60,19 @@ PathManager* PathManager::LoadPathFile(const char* ZoneName)
|
||||
|
||||
if(Ret->loadPaths(PathFile))
|
||||
{
|
||||
LogFile->write(EQEmuLog::Status, "Path File %s loaded.", ZonePathFileName);
|
||||
Log.Out(Logs::General, Logs::Status, "Path File %s loaded.", ZonePathFileName);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
LogFile->write(EQEmuLog::Error, "Path File %s failed to load.", ZonePathFileName);
|
||||
Log.Out(Logs::General, Logs::Error, "Path File %s failed to load.", ZonePathFileName);
|
||||
safe_delete(Ret);
|
||||
}
|
||||
fclose(PathFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogFile->write(EQEmuLog::Error, "Path File %s not found.", ZonePathFileName);
|
||||
Log.Out(Logs::General, Logs::Error, "Path File %s not found.", ZonePathFileName);
|
||||
}
|
||||
|
||||
return Ret;
|
||||
@@ -103,18 +102,18 @@ bool PathManager::loadPaths(FILE *PathFile)
|
||||
|
||||
if(strncmp(Magic, "EQEMUPATH", 9))
|
||||
{
|
||||
LogFile->write(EQEmuLog::Error, "Bad Magic String in .path file.");
|
||||
Log.Out(Logs::General, Logs::Error, "Bad Magic String in .path file.");
|
||||
return false;
|
||||
}
|
||||
|
||||
fread(&Head, sizeof(Head), 1, PathFile);
|
||||
|
||||
LogFile->write(EQEmuLog::Status, "Path File Header: Version %ld, PathNodes %ld",
|
||||
Log.Out(Logs::General, Logs::Status, "Path File Header: Version %ld, PathNodes %ld",
|
||||
(long)Head.version, (long)Head.PathNodeCount);
|
||||
|
||||
if(Head.version != 2)
|
||||
{
|
||||
LogFile->write(EQEmuLog::Error, "Unsupported path file version.");
|
||||
Log.Out(Logs::General, Logs::Error, "Unsupported path file version.");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -138,7 +137,7 @@ bool PathManager::loadPaths(FILE *PathFile)
|
||||
{
|
||||
if(PathNodes[i].Neighbours[j].id > MaxNodeID)
|
||||
{
|
||||
LogFile->write(EQEmuLog::Error, "Path Node %i, Neighbour %i (%i) out of range.", i, j, PathNodes[i].Neighbours[j].id);
|
||||
Log.Out(Logs::General, Logs::Error, "Path Node %i, Neighbour %i (%i) out of range.", i, j, PathNodes[i].Neighbours[j].id);
|
||||
|
||||
PathFileValid = false;
|
||||
}
|
||||
@@ -206,10 +205,10 @@ glm::vec3 PathManager::GetPathNodeCoordinates(int NodeNumber, bool BestZ)
|
||||
}
|
||||
|
||||
std::deque<int> PathManager::FindRoute(int startID, int endID)
|
||||
{
|
||||
_log(PATHING__DEBUG, "FindRoute from node %i to %i", startID, endID);
|
||||
{
|
||||
Log.Out(Logs::Detail, Logs::None, "FindRoute from node %i to %i", startID, endID);
|
||||
|
||||
memset(ClosedListFlag, 0, sizeof(int) * Head.PathNodeCount);
|
||||
memset(ClosedListFlag, 0, sizeof(int) * Head.PathNodeCount);
|
||||
|
||||
std::deque<AStarNode> OpenList, ClosedList;
|
||||
|
||||
@@ -330,7 +329,7 @@ std::deque<int> PathManager::FindRoute(int startID, int endID)
|
||||
}
|
||||
|
||||
}
|
||||
_log(PATHING__DEBUG, "Unable to find a route.");
|
||||
Log.Out(Logs::Detail, Logs::None, "Unable to find a route.");
|
||||
return Route;
|
||||
|
||||
}
|
||||
@@ -352,7 +351,7 @@ auto path_compare = [](const PathNodeSortStruct& a, const PathNodeSortStruct& b)
|
||||
|
||||
std::deque<int> PathManager::FindRoute(glm::vec3 Start, glm::vec3 End)
|
||||
{
|
||||
_log(PATHING__DEBUG, "FindRoute(%8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f)", Start.x, Start.y, Start.z, End.x, End.y, End.z);
|
||||
Log.Out(Logs::Detail, Logs::None, "FindRoute(%8.3f, %8.3f, %8.3f, %8.3f, %8.3f, %8.3f)", Start.x, Start.y, Start.z, End.x, End.y, End.z);
|
||||
|
||||
std::deque<int> noderoute;
|
||||
|
||||
@@ -371,10 +370,9 @@ std::deque<int> PathManager::FindRoute(glm::vec3 Start, glm::vec3 End)
|
||||
|
||||
for(uint32 i = 0 ; i < Head.PathNodeCount; ++i)
|
||||
{
|
||||
if((ABS(Start.x - PathNodes[i].v.x) <= CandidateNodeRangeXY) &&
|
||||
(ABS(Start.y - PathNodes[i].v.y) <= CandidateNodeRangeXY) &&
|
||||
(ABS(Start.z - PathNodes[i].v.z) <= CandidateNodeRangeZ))
|
||||
{
|
||||
if ((std::abs(Start.x - PathNodes[i].v.x) <= CandidateNodeRangeXY) &&
|
||||
(std::abs(Start.y - PathNodes[i].v.y) <= CandidateNodeRangeXY) &&
|
||||
(std::abs(Start.z - PathNodes[i].v.z) <= CandidateNodeRangeZ)) {
|
||||
TempNode.id = i;
|
||||
TempNode.Distance = VectorDistanceNoRoot(Start, PathNodes[i].v);
|
||||
SortedByDistance.push_back(TempNode);
|
||||
@@ -386,7 +384,7 @@ std::deque<int> PathManager::FindRoute(glm::vec3 Start, glm::vec3 End)
|
||||
|
||||
for(auto Iterator = SortedByDistance.begin(); Iterator != SortedByDistance.end(); ++Iterator)
|
||||
{
|
||||
_log(PATHING__DEBUG, "Checking Reachability of Node %i from Start Position.", PathNodes[(*Iterator).id].id);
|
||||
Log.Out(Logs::Detail, Logs::None, "Checking Reachability of Node %i from Start Position.", PathNodes[(*Iterator).id].id);
|
||||
|
||||
if(!zone->zonemap->LineIntersectsZone(Start, PathNodes[(*Iterator).id].v, 1.0f, nullptr))
|
||||
{
|
||||
@@ -396,11 +394,11 @@ std::deque<int> PathManager::FindRoute(glm::vec3 Start, glm::vec3 End)
|
||||
}
|
||||
|
||||
if(ClosestPathNodeToStart <0 ) {
|
||||
_log(PATHING__DEBUG, "No LOS to any starting Path Node within range.");
|
||||
Log.Out(Logs::Detail, Logs::None, "No LOS to any starting Path Node within range.");
|
||||
return noderoute;
|
||||
}
|
||||
|
||||
_log(PATHING__DEBUG, "Closest Path Node To Start: %2d", ClosestPathNodeToStart);
|
||||
Log.Out(Logs::Detail, Logs::None, "Closest Path Node To Start: %2d", ClosestPathNodeToStart);
|
||||
|
||||
// Find the nearest PathNode the end point has LOS to
|
||||
|
||||
@@ -410,10 +408,9 @@ std::deque<int> PathManager::FindRoute(glm::vec3 Start, glm::vec3 End)
|
||||
|
||||
for(uint32 i = 0 ; i < Head.PathNodeCount; ++i)
|
||||
{
|
||||
if((ABS(End.x - PathNodes[i].v.x) <= CandidateNodeRangeXY) &&
|
||||
(ABS(End.y - PathNodes[i].v.y) <= CandidateNodeRangeXY) &&
|
||||
(ABS(End.z - PathNodes[i].v.z) <= CandidateNodeRangeZ))
|
||||
{
|
||||
if ((std::abs(End.x - PathNodes[i].v.x) <= CandidateNodeRangeXY) &&
|
||||
(std::abs(End.y - PathNodes[i].v.y) <= CandidateNodeRangeXY) &&
|
||||
(std::abs(End.z - PathNodes[i].v.z) <= CandidateNodeRangeZ)) {
|
||||
TempNode.id = i;
|
||||
TempNode.Distance = VectorDistanceNoRoot(End, PathNodes[i].v);
|
||||
SortedByDistance.push_back(TempNode);
|
||||
@@ -424,8 +421,8 @@ std::deque<int> PathManager::FindRoute(glm::vec3 Start, glm::vec3 End)
|
||||
|
||||
for(auto Iterator = SortedByDistance.begin(); Iterator != SortedByDistance.end(); ++Iterator)
|
||||
{
|
||||
_log(PATHING__DEBUG, "Checking Reachability of Node %i from End Position.", PathNodes[(*Iterator).id].id);
|
||||
_log(PATHING__DEBUG, " (%8.3f, %8.3f, %8.3f) to (%8.3f, %8.3f, %8.3f)",
|
||||
Log.Out(Logs::Detail, Logs::None, "Checking Reachability of Node %i from End Position.", PathNodes[(*Iterator).id].id);
|
||||
Log.Out(Logs::Detail, Logs::None, " (%8.3f, %8.3f, %8.3f) to (%8.3f, %8.3f, %8.3f)",
|
||||
End.x, End.y, End.z,
|
||||
PathNodes[(*Iterator).id].v.x, PathNodes[(*Iterator).id].v.y, PathNodes[(*Iterator).id].v.z);
|
||||
|
||||
@@ -437,11 +434,11 @@ std::deque<int> PathManager::FindRoute(glm::vec3 Start, glm::vec3 End)
|
||||
}
|
||||
|
||||
if(ClosestPathNodeToEnd < 0) {
|
||||
_log(PATHING__DEBUG, "No LOS to any end Path Node within range.");
|
||||
Log.Out(Logs::Detail, Logs::None, "No LOS to any end Path Node within range.");
|
||||
return noderoute;
|
||||
}
|
||||
|
||||
_log(PATHING__DEBUG, "Closest Path Node To End: %2d", ClosestPathNodeToEnd);
|
||||
Log.Out(Logs::Detail, Logs::None, "Closest Path Node To End: %2d", ClosestPathNodeToEnd);
|
||||
|
||||
if(ClosestPathNodeToStart == ClosestPathNodeToEnd)
|
||||
{
|
||||
@@ -673,7 +670,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
if(To == From)
|
||||
return To;
|
||||
|
||||
mlog(PATHING__DEBUG, "UpdatePath. From(%8.3f, %8.3f, %8.3f) To(%8.3f, %8.3f, %8.3f)", From.x, From.y, From.z, To.x, To.y, To.z);
|
||||
Log.Out(Logs::Detail, Logs::None, "UpdatePath. From(%8.3f, %8.3f, %8.3f) To(%8.3f, %8.3f, %8.3f)", From.x, From.y, From.z, To.x, To.y, To.z);
|
||||
|
||||
if(From == PathingLastPosition)
|
||||
{
|
||||
@@ -681,7 +678,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
|
||||
if((PathingLoopCount > 5) && !IsRooted())
|
||||
{
|
||||
mlog(PATHING__DEBUG, "appears to be stuck. Teleporting them to next position.", GetName());
|
||||
Log.Out(Logs::Detail, Logs::None, "appears to be stuck. Teleporting them to next position.", GetName());
|
||||
|
||||
if(Route.size() == 0)
|
||||
{
|
||||
@@ -721,7 +718,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
// If we are already pathing, and the destination is the same as before ...
|
||||
if(SameDestination)
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Still pathing to the same destination.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Still pathing to the same destination.");
|
||||
|
||||
// Get the coordinates of the first path node we are going to.
|
||||
NextNode = Route.front();
|
||||
@@ -732,7 +729,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
// We have reached the path node.
|
||||
if(NodeLoc == From)
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Arrived at node %i", NextNode);
|
||||
Log.Out(Logs::Detail, Logs::None, " Arrived at node %i", NextNode);
|
||||
|
||||
NodeReached = true;
|
||||
|
||||
@@ -746,37 +743,36 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
// target, and we may run past the target if we don't check LOS at this point.
|
||||
int RouteSize = Route.size();
|
||||
|
||||
mlog(PATHING__DEBUG, "Route size is %i", RouteSize);
|
||||
Log.Out(Logs::Detail, Logs::None, "Route size is %i", RouteSize);
|
||||
|
||||
if((RouteSize == 2)
|
||||
|| ((PathingTraversedNodes >= RuleI(Pathing, MinNodesTraversedForLOSCheck))
|
||||
&& (RouteSize <= RuleI(Pathing, MinNodesLeftForLOSCheck))
|
||||
&& PathingLOSCheckTimer->Check()))
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Checking distance to target.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Checking distance to target.");
|
||||
float Distance = VectorDistanceNoRoot(From, To);
|
||||
|
||||
mlog(PATHING__DEBUG, " Distance between From and To (NoRoot) is %8.3f", Distance);
|
||||
Log.Out(Logs::Detail, Logs::None, " Distance between From and To (NoRoot) is %8.3f", Distance);
|
||||
|
||||
if((Distance <= RuleR(Pathing, MinDistanceForLOSCheckShort))
|
||||
&& (ABS(From.z - To.z) <= RuleR(Pathing, ZDiffThreshold)))
|
||||
{
|
||||
if ((Distance <= RuleR(Pathing, MinDistanceForLOSCheckShort)) &&
|
||||
(std::abs(From.z - To.z) <= RuleR(Pathing, ZDiffThreshold))) {
|
||||
if(!zone->zonemap->LineIntersectsZone(HeadPosition, To, 1.0f, nullptr))
|
||||
PathingLOSState = HaveLOS;
|
||||
else
|
||||
PathingLOSState = NoLOS;
|
||||
mlog(PATHING__DEBUG, " LOS stats is %s", (PathingLOSState == HaveLOS) ? "HaveLOS" : "NoLOS");
|
||||
Log.Out(Logs::Detail, Logs::None, "NoLOS");
|
||||
|
||||
if((PathingLOSState == HaveLOS) && zone->pathing->NoHazards(From, To))
|
||||
{
|
||||
mlog(PATHING__DEBUG, " No hazards. Running directly to target.");
|
||||
Log.Out(Logs::Detail, Logs::None, " No hazards. Running directly to target.");
|
||||
Route.clear();
|
||||
|
||||
return To;
|
||||
}
|
||||
else
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Continuing on node path.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Continuing on node path.");
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -802,7 +798,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
|
||||
if(Route.size() == 0)
|
||||
{
|
||||
mlog(PATHING__DEBUG, "Missing node after teleport.");
|
||||
Log.Out(Logs::Detail, Logs::None, "Missing node after teleport.");
|
||||
return To;
|
||||
}
|
||||
|
||||
@@ -812,7 +808,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
|
||||
Teleport(NodeLoc);
|
||||
|
||||
mlog(PATHING__DEBUG, " TELEPORTED to %8.3f, %8.3f, %8.3f\n", NodeLoc.x, NodeLoc.y, NodeLoc.z);
|
||||
Log.Out(Logs::Detail, Logs::None, " TELEPORTED to %8.3f, %8.3f, %8.3f\n", NodeLoc.x, NodeLoc.y, NodeLoc.z);
|
||||
|
||||
Route.pop_front();
|
||||
|
||||
@@ -823,7 +819,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
}
|
||||
zone->pathing->OpenDoors(PathingLastNodeVisited, NextNode, this);
|
||||
|
||||
mlog(PATHING__DEBUG, " Now moving to node %i", NextNode);
|
||||
Log.Out(Logs::Detail, Logs::None, " Now moving to node %i", NextNode);
|
||||
|
||||
return zone->pathing->GetPathNodeCoordinates(NextNode);
|
||||
}
|
||||
@@ -831,7 +827,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
{
|
||||
// we have run all the nodes, all that is left is the direct path from the last node
|
||||
// to the destination
|
||||
mlog(PATHING__DEBUG, " Reached end of node path, running direct to target.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Reached end of node path, running direct to target.");
|
||||
|
||||
return To;
|
||||
}
|
||||
@@ -845,31 +841,30 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
&& (RouteSize <= RuleI(Pathing, MinNodesLeftForLOSCheck))
|
||||
&& PathingLOSCheckTimer->Check())
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Checking distance to target.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Checking distance to target.");
|
||||
|
||||
float Distance = VectorDistanceNoRoot(From, To);
|
||||
|
||||
mlog(PATHING__DEBUG, " Distance between From and To (NoRoot) is %8.3f", Distance);
|
||||
Log.Out(Logs::Detail, Logs::None, " Distance between From and To (NoRoot) is %8.3f", Distance);
|
||||
|
||||
if((Distance <= RuleR(Pathing, MinDistanceForLOSCheckShort))
|
||||
&& (ABS(From.z - To.z) <= RuleR(Pathing, ZDiffThreshold)))
|
||||
{
|
||||
if ((Distance <= RuleR(Pathing, MinDistanceForLOSCheckShort)) &&
|
||||
(std::abs(From.z - To.z) <= RuleR(Pathing, ZDiffThreshold))) {
|
||||
if(!zone->zonemap->LineIntersectsZone(HeadPosition, To, 1.0f, nullptr))
|
||||
PathingLOSState = HaveLOS;
|
||||
else
|
||||
PathingLOSState = NoLOS;
|
||||
mlog(PATHING__DEBUG, " LOS stats is %s", (PathingLOSState == HaveLOS) ? "HaveLOS" : "NoLOS");
|
||||
Log.Out(Logs::Detail, Logs::None, "NoLOS");
|
||||
|
||||
if((PathingLOSState == HaveLOS) && zone->pathing->NoHazards(From, To))
|
||||
{
|
||||
mlog(PATHING__DEBUG, " No hazards. Running directly to target.");
|
||||
Log.Out(Logs::Detail, Logs::None, " No hazards. Running directly to target.");
|
||||
Route.clear();
|
||||
|
||||
return To;
|
||||
}
|
||||
else
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Continuing on node path.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Continuing on node path.");
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -881,7 +876,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
{
|
||||
// We get here if we were already pathing, but our destination has now changed.
|
||||
//
|
||||
mlog(PATHING__DEBUG, " Target has changed position.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Target has changed position.");
|
||||
// Update our record of where we are going to.
|
||||
PathingDestination = To;
|
||||
// Check if we now have LOS etc to the new destination.
|
||||
@@ -889,26 +884,25 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
{
|
||||
float Distance = VectorDistanceNoRoot(From, To);
|
||||
|
||||
if((Distance <= RuleR(Pathing, MinDistanceForLOSCheckShort))
|
||||
&& (ABS(From.z - To.z) <= RuleR(Pathing, ZDiffThreshold)))
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Checking for short LOS at distance %8.3f.", Distance);
|
||||
if ((Distance <= RuleR(Pathing, MinDistanceForLOSCheckShort)) &&
|
||||
(std::abs(From.z - To.z) <= RuleR(Pathing, ZDiffThreshold))) {
|
||||
Log.Out(Logs::Detail, Logs::None, " Checking for short LOS at distance %8.3f.", Distance);
|
||||
if(!zone->zonemap->LineIntersectsZone(HeadPosition, To, 1.0f, nullptr))
|
||||
PathingLOSState = HaveLOS;
|
||||
else
|
||||
PathingLOSState = NoLOS;
|
||||
|
||||
mlog(PATHING__DEBUG, " LOS stats is %s", (PathingLOSState == HaveLOS) ? "HaveLOS" : "NoLOS");
|
||||
Log.Out(Logs::Detail, Logs::None, "NoLOS");
|
||||
|
||||
if((PathingLOSState == HaveLOS) && zone->pathing->NoHazards(From, To))
|
||||
{
|
||||
mlog(PATHING__DEBUG, " No hazards. Running directly to target.");
|
||||
Log.Out(Logs::Detail, Logs::None, " No hazards. Running directly to target.");
|
||||
Route.clear();
|
||||
return To;
|
||||
}
|
||||
else
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Continuing on node path.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Continuing on node path.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -919,19 +913,19 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
{
|
||||
if(!PathingRouteUpdateTimerShort->Check())
|
||||
{
|
||||
mlog(PATHING__DEBUG, "Short route update timer not yet expired.");
|
||||
Log.Out(Logs::Detail, Logs::None, "Short route update timer not yet expired.");
|
||||
return zone->pathing->GetPathNodeCoordinates(Route.front());
|
||||
}
|
||||
mlog(PATHING__DEBUG, "Short route update timer expired.");
|
||||
Log.Out(Logs::Detail, Logs::None, "Short route update timer expired.");
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!PathingRouteUpdateTimerLong->Check())
|
||||
{
|
||||
mlog(PATHING__DEBUG, "Long route update timer not yet expired.");
|
||||
Log.Out(Logs::Detail, Logs::None, "Long route update timer not yet expired.");
|
||||
return zone->pathing->GetPathNodeCoordinates(Route.front());
|
||||
}
|
||||
mlog(PATHING__DEBUG, "Long route update timer expired.");
|
||||
Log.Out(Logs::Detail, Logs::None, "Long route update timer expired.");
|
||||
}
|
||||
|
||||
// We are already pathing, destination changed, no LOS. Find the nearest node to our destination.
|
||||
@@ -940,7 +934,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
// Destination unreachable via pathing, return direct route.
|
||||
if(DestinationPathNode == -1)
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Unable to find path node for new destination. Running straight to target.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Unable to find path node for new destination. Running straight to target.");
|
||||
Route.clear();
|
||||
return To;
|
||||
}
|
||||
@@ -948,7 +942,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
// one, we will carry on on our path.
|
||||
if(DestinationPathNode == Route.back())
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Same destination Node (%i). Continue with current path.", DestinationPathNode);
|
||||
Log.Out(Logs::Detail, Logs::None, " Same destination Node (%i). Continue with current path.", DestinationPathNode);
|
||||
|
||||
NodeLoc = zone->pathing->GetPathNodeCoordinates(Route.front());
|
||||
|
||||
@@ -956,7 +950,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
// Check if we have reached a path node.
|
||||
if(NodeLoc == From)
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Arrived at node %i, moving to next one.\n", Route.front());
|
||||
Log.Out(Logs::Detail, Logs::None, " Arrived at node %i, moving to next one.\n", Route.front());
|
||||
|
||||
NodeReached = true;
|
||||
|
||||
@@ -979,7 +973,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
|
||||
if(Route.size() == 0)
|
||||
{
|
||||
mlog(PATHING__DEBUG, "Missing node after teleport.");
|
||||
Log.Out(Logs::Detail, Logs::None, "Missing node after teleport.");
|
||||
return To;
|
||||
}
|
||||
|
||||
@@ -989,7 +983,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
|
||||
Teleport(NodeLoc);
|
||||
|
||||
mlog(PATHING__DEBUG, " TELEPORTED to %8.3f, %8.3f, %8.3f\n", NodeLoc.x, NodeLoc.y, NodeLoc.z);
|
||||
Log.Out(Logs::Detail, Logs::None, " TELEPORTED to %8.3f, %8.3f, %8.3f\n", NodeLoc.x, NodeLoc.y, NodeLoc.z);
|
||||
|
||||
Route.pop_front();
|
||||
|
||||
@@ -999,7 +993,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
NextNode = Route.front();
|
||||
}
|
||||
// Return the coords of our next path node on the route.
|
||||
mlog(PATHING__DEBUG, " Now moving to node %i", NextNode);
|
||||
Log.Out(Logs::Detail, Logs::None, " Now moving to node %i", NextNode);
|
||||
|
||||
zone->pathing->OpenDoors(PathingLastNodeVisited, NextNode, this);
|
||||
|
||||
@@ -1007,7 +1001,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
}
|
||||
else
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Reached end of path grid. Running direct to target.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Reached end of path grid. Running direct to target.");
|
||||
return To;
|
||||
}
|
||||
}
|
||||
@@ -1015,7 +1009,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
}
|
||||
else
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Target moved. End node is different. Clearing route.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Target moved. End node is different. Clearing route.");
|
||||
|
||||
Route.clear();
|
||||
// We will now fall through to get a new route.
|
||||
@@ -1025,11 +1019,11 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
|
||||
|
||||
}
|
||||
mlog(PATHING__DEBUG, " Our route list is empty.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Our route list is empty.");
|
||||
|
||||
if((SameDestination) && !PathingLOSCheckTimer->Check())
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Destination same as before, LOS check timer not reached. Returning To.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Destination same as before, LOS check timer not reached. Returning To.");
|
||||
return To;
|
||||
}
|
||||
|
||||
@@ -1041,25 +1035,24 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
|
||||
float Distance = VectorDistanceNoRoot(From, To);
|
||||
|
||||
if((Distance <= RuleR(Pathing, MinDistanceForLOSCheckLong))
|
||||
&& (ABS(From.z - To.z) <= RuleR(Pathing, ZDiffThreshold)))
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Checking for long LOS at distance %8.3f.", Distance);
|
||||
if ((Distance <= RuleR(Pathing, MinDistanceForLOSCheckLong)) &&
|
||||
(std::abs(From.z - To.z) <= RuleR(Pathing, ZDiffThreshold))) {
|
||||
Log.Out(Logs::Detail, Logs::None, " Checking for long LOS at distance %8.3f.", Distance);
|
||||
|
||||
if(!zone->zonemap->LineIntersectsZone(HeadPosition, To, 1.0f, nullptr))
|
||||
PathingLOSState = HaveLOS;
|
||||
else
|
||||
PathingLOSState = NoLOS;
|
||||
|
||||
mlog(PATHING__DEBUG, " LOS stats is %s", (PathingLOSState == HaveLOS) ? "HaveLOS" : "NoLOS");
|
||||
Log.Out(Logs::Detail, Logs::None, "NoLOS");
|
||||
|
||||
if((PathingLOSState == HaveLOS) && zone->pathing->NoHazards(From, To))
|
||||
{
|
||||
mlog(PATHING__DEBUG, "Target is reachable. Running directly there.");
|
||||
Log.Out(Logs::Detail, Logs::None, "Target is reachable. Running directly there.");
|
||||
return To;
|
||||
}
|
||||
}
|
||||
mlog(PATHING__DEBUG, " Calculating new route to target.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Calculating new route to target.");
|
||||
|
||||
Route = zone->pathing->FindRoute(From, To);
|
||||
|
||||
@@ -1067,14 +1060,14 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
|
||||
if(Route.size() == 0)
|
||||
{
|
||||
mlog(PATHING__DEBUG, " No route available, running direct.");
|
||||
Log.Out(Logs::Detail, Logs::None, " No route available, running direct.");
|
||||
|
||||
return To;
|
||||
}
|
||||
|
||||
if(SameDestination && (Route.front() == PathingLastNodeVisited))
|
||||
{
|
||||
mlog(PATHING__DEBUG, " Probable loop detected. Same destination and Route.front() == PathingLastNodeVisited.");
|
||||
Log.Out(Logs::Detail, Logs::None, " Probable loop detected. Same destination and Route.front() == PathingLastNodeVisited.");
|
||||
|
||||
Route.clear();
|
||||
|
||||
@@ -1082,7 +1075,7 @@ glm::vec3 Mob::UpdatePath(float ToX, float ToY, float ToZ, float Speed, bool &Wa
|
||||
}
|
||||
NodeLoc = zone->pathing->GetPathNodeCoordinates(Route.front());
|
||||
|
||||
mlog(PATHING__DEBUG, " New route determined, heading for node %i", Route.front());
|
||||
Log.Out(Logs::Detail, Logs::None, " New route determined, heading for node %i", Route.front());
|
||||
|
||||
PathingLoopCount = 0;
|
||||
|
||||
@@ -1109,10 +1102,9 @@ int PathManager::FindNearestPathNode(glm::vec3 Position)
|
||||
|
||||
for(uint32 i = 0 ; i < Head.PathNodeCount; ++i)
|
||||
{
|
||||
if((ABS(Position.x - PathNodes[i].v.x) <= CandidateNodeRangeXY) &&
|
||||
(ABS(Position.y - PathNodes[i].v.y) <= CandidateNodeRangeXY) &&
|
||||
(ABS(Position.z - PathNodes[i].v.z) <= CandidateNodeRangeZ))
|
||||
{
|
||||
if ((std::abs(Position.x - PathNodes[i].v.x) <= CandidateNodeRangeXY) &&
|
||||
(std::abs(Position.y - PathNodes[i].v.y) <= CandidateNodeRangeXY) &&
|
||||
(std::abs(Position.z - PathNodes[i].v.z) <= CandidateNodeRangeZ)) {
|
||||
TempNode.id = i;
|
||||
TempNode.Distance = VectorDistanceNoRoot(Position, PathNodes[i].v);
|
||||
SortedByDistance.push_back(TempNode);
|
||||
@@ -1124,7 +1116,7 @@ int PathManager::FindNearestPathNode(glm::vec3 Position)
|
||||
|
||||
for(auto Iterator = SortedByDistance.begin(); Iterator != SortedByDistance.end(); ++Iterator)
|
||||
{
|
||||
_log(PATHING__DEBUG, "Checking Reachability of Node %i from Start Position.", PathNodes[(*Iterator).id].id);
|
||||
Log.Out(Logs::Detail, Logs::None, "Checking Reachability of Node %i from Start Position.", PathNodes[(*Iterator).id].id);
|
||||
|
||||
if(!zone->zonemap->LineIntersectsZone(Position, PathNodes[(*Iterator).id].v, 1.0f, nullptr))
|
||||
{
|
||||
@@ -1134,7 +1126,7 @@ int PathManager::FindNearestPathNode(glm::vec3 Position)
|
||||
}
|
||||
|
||||
if(ClosestPathNodeToStart <0 ) {
|
||||
_log(PATHING__DEBUG, "No LOS to any starting Path Node within range.");
|
||||
Log.Out(Logs::Detail, Logs::None, "No LOS to any starting Path Node within range.");
|
||||
return -1;
|
||||
}
|
||||
return ClosestPathNodeToStart;
|
||||
@@ -1148,16 +1140,15 @@ bool PathManager::NoHazards(glm::vec3 From, glm::vec3 To)
|
||||
|
||||
float NewZ = zone->zonemap->FindBestZ(MidPoint, nullptr);
|
||||
|
||||
if(ABS(NewZ - From.z) > RuleR(Pathing, ZDiffThreshold))
|
||||
{
|
||||
_log(PATHING__DEBUG, " HAZARD DETECTED moving from %8.3f, %8.3f, %8.3f to %8.3f, %8.3f, %8.3f. Z Change is %8.3f",
|
||||
if (std::abs(NewZ - From.z) > RuleR(Pathing, ZDiffThreshold)) {
|
||||
Log.Out(Logs::Detail, Logs::None, " HAZARD DETECTED moving from %8.3f, %8.3f, %8.3f to %8.3f, %8.3f, %8.3f. Z Change is %8.3f",
|
||||
From.x, From.y, From.z, MidPoint.x, MidPoint.y, MidPoint.z, NewZ - From.z);
|
||||
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
_log(PATHING__DEBUG, "No HAZARD DETECTED moving from %8.3f, %8.3f, %8.3f to %8.3f, %8.3f, %8.3f. Z Change is %8.3f",
|
||||
Log.Out(Logs::Detail, Logs::None, "No HAZARD DETECTED moving from %8.3f, %8.3f, %8.3f to %8.3f, %8.3f, %8.3f. Z Change is %8.3f",
|
||||
From.x, From.y, From.z, MidPoint.x, MidPoint.y, MidPoint.z, NewZ - From.z);
|
||||
}
|
||||
|
||||
@@ -1187,9 +1178,8 @@ bool PathManager::NoHazardsAccurate(glm::vec3 From, glm::vec3 To)
|
||||
|
||||
glm::vec3 TestPoint(curx, cury, curz);
|
||||
float NewZ = zone->zonemap->FindBestZ(TestPoint, nullptr);
|
||||
if (ABS(NewZ - last_z) > 5.0f)
|
||||
{
|
||||
_log(PATHING__DEBUG, " HAZARD DETECTED moving from %8.3f, %8.3f, %8.3f to %8.3f, %8.3f, %8.3f. Best Z %8.3f, Z Change is %8.3f",
|
||||
if (std::abs(NewZ - last_z) > 5.0f) {
|
||||
Log.Out(Logs::Detail, Logs::None, " HAZARD DETECTED moving from %8.3f, %8.3f, %8.3f to %8.3f, %8.3f, %8.3f. Best Z %8.3f, Z Change is %8.3f",
|
||||
From.x, From.y, From.z, TestPoint.x, TestPoint.y, TestPoint.z, NewZ, NewZ - From.z);
|
||||
return false;
|
||||
}
|
||||
@@ -1217,30 +1207,33 @@ bool PathManager::NoHazardsAccurate(glm::vec3 From, glm::vec3 To)
|
||||
}
|
||||
if (best_z2 == -999990)
|
||||
{
|
||||
_log(PATHING__DEBUG, " HAZARD DETECTED, really deep water/lava!");
|
||||
Log.Out(Logs::Detail, Logs::None, " HAZARD DETECTED, really deep water/lava!");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ABS(NewZ - best_z2) > RuleR(Pathing, ZDiffThreshold))
|
||||
{
|
||||
_log(PATHING__DEBUG, " HAZARD DETECTED, water is fairly deep at %8.3f units deep", ABS(NewZ - best_z2));
|
||||
if (std::abs(NewZ - best_z2) > RuleR(Pathing, ZDiffThreshold)) {
|
||||
Log.Out(Logs::Detail, Logs::None,
|
||||
" HAZARD DETECTED, water is fairly deep at %8.3f units deep",
|
||||
std::abs(NewZ - best_z2));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
_log(PATHING__DEBUG, " HAZARD NOT DETECTED, water is shallow at %8.3f units deep", ABS(NewZ - best_z2));
|
||||
Log.Out(Logs::Detail, Logs::None,
|
||||
" HAZARD NOT DETECTED, water is shallow at %8.3f units deep",
|
||||
std::abs(NewZ - best_z2));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_log(PATHING__DEBUG, "Hazard point not in water or lava!");
|
||||
Log.Out(Logs::Detail, Logs::None, "Hazard point not in water or lava!");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_log(PATHING__DEBUG, "No water map loaded for hazards!");
|
||||
Log.Out(Logs::Detail, Logs::None, "No water map loaded for hazards!");
|
||||
}
|
||||
|
||||
curx += stepx;
|
||||
@@ -1251,9 +1244,12 @@ bool PathManager::NoHazardsAccurate(glm::vec3 From, glm::vec3 To)
|
||||
cur.y = cury;
|
||||
cur.z = curz;
|
||||
|
||||
if (ABS(curx - To.x) < step_size) cur.x = To.x;
|
||||
if (ABS(cury - To.y) < step_size) cur.y = To.y;
|
||||
if (ABS(curz - To.z) < step_size) cur.z = To.z;
|
||||
if (std::abs(curx - To.x) < step_size)
|
||||
cur.x = To.x;
|
||||
if (std::abs(cury - To.y) < step_size)
|
||||
cur.y = To.y;
|
||||
if (std::abs(curz - To.z) < step_size)
|
||||
cur.z = To.z;
|
||||
|
||||
} while (cur.x != To.x || cur.y != To.y || cur.z != To.z);
|
||||
return true;
|
||||
@@ -1292,7 +1288,7 @@ void PathManager::OpenDoors(int Node1, int Node2, Mob *ForWho)
|
||||
|
||||
if(d && !d->IsDoorOpen() )
|
||||
{
|
||||
_log(PATHING__DEBUG, "Opening door %i for %s", PathNodes[Node1].Neighbours[i].DoorID, ForWho->GetName());
|
||||
Log.Out(Logs::Detail, Logs::None, "Opening door %i for %s", PathNodes[Node1].Neighbours[i].DoorID, ForWho->GetName());
|
||||
|
||||
d->ForceOpen(ForWho);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user