Core/Misc: Cleanup TaxiPathGraph

Port From (https://github.com/TrinityCore/TrinityCore/commit/8fd05dbc931aa557177f666729b5654b2908b46e)
This commit is contained in:
hondacrx
2022-06-18 23:56:15 -04:00
parent 82c2d2fb2a
commit 7d502f167d
4 changed files with 60 additions and 63 deletions
+57 -59
View File
@@ -25,59 +25,30 @@ using System.Numerics;
namespace Game.Entities
{
public class TaxiPathGraph : Singleton<TaxiPathGraph>
public class TaxiPathGraph
{
EdgeWeightedDigraph m_graph;
List<TaxiNodesRecord> m_nodesByVertex = new();
Dictionary<uint, uint> m_verticesByNode = new();
static EdgeWeightedDigraph m_graph;
static List<TaxiNodesRecord> m_nodesByVertex = new();
static Dictionary<uint, uint> m_verticesByNode = new();
TaxiPathGraph() { }
public void Initialize()
{
if (m_graph != null)
return;
List<Tuple<Tuple<uint, uint>, uint>> edges = new();
// Initialize here
foreach (TaxiPathRecord path in CliDB.TaxiPathStorage.Values)
{
TaxiNodesRecord from = CliDB.TaxiNodesStorage.LookupByKey(path.FromTaxiNode);
TaxiNodesRecord to = CliDB.TaxiNodesStorage.LookupByKey(path.ToTaxiNode);
if (from != null && to != null && from.Flags.HasAnyFlag(TaxiNodeFlags.Alliance | TaxiNodeFlags.Horde) && to.Flags.HasAnyFlag(TaxiNodeFlags.Alliance | TaxiNodeFlags.Horde))
AddVerticeAndEdgeFromNodeInfo(from, to, path.Id, edges);
}
// create graph
m_graph = new EdgeWeightedDigraph(m_nodesByVertex.Count);
for (int j = 0; j < edges.Count; ++j)
{
m_graph.AddEdge(new DirectedEdge(edges[j].Item1.Item1, edges[j].Item1.Item2, edges[j].Item2));
}
}
uint GetNodeIDFromVertexID(uint vertexID)
{
if (vertexID < m_nodesByVertex.Count)
return m_nodesByVertex[(int)vertexID].Id;
return uint.MaxValue;
}
uint GetVertexIDFromNodeID(TaxiNodesRecord node)
{
return m_verticesByNode.ContainsKey(node.Id) ? m_verticesByNode[node.Id] : uint.MaxValue;
}
void GetTaxiMapPosition(Vector3 position, int mapId, out Vector2 uiMapPosition, out int uiMapId)
static void GetTaxiMapPosition(Vector3 position, int mapId, out Vector2 uiMapPosition, out int uiMapId)
{
if (!Global.DB2Mgr.GetUiMapPosition(position.X, position.Y, position.Z, mapId, 0, 0, 0, UiMapSystem.Adventure, false, out uiMapId, out uiMapPosition))
Global.DB2Mgr.GetUiMapPosition(position.X, position.Y, position.Z, mapId, 0, 0, 0, UiMapSystem.Taxi, false, out uiMapId, out uiMapPosition);
}
void AddVerticeAndEdgeFromNodeInfo(TaxiNodesRecord from, TaxiNodesRecord to, uint pathId, List<Tuple<Tuple<uint, uint>, uint>> edges)
static uint CreateVertexFromFromNodeInfoIfNeeded(TaxiNodesRecord node)
{
if (!m_verticesByNode.ContainsKey(node.Id))
{
m_verticesByNode.Add(node.Id, (uint)m_nodesByVertex.Count);
m_nodesByVertex.Add(node);
}
return m_verticesByNode[node.Id];
}
static void AddVerticeAndEdgeFromNodeInfo(TaxiNodesRecord from, TaxiNodesRecord to, uint pathId, List<Tuple<Tuple<uint, uint>, uint>> edges)
{
if (from.Id != to.Id)
{
@@ -125,7 +96,45 @@ namespace Game.Entities
}
}
public int GetCompleteNodeRoute(TaxiNodesRecord from, TaxiNodesRecord to, Player player, List<uint> shortestPath)
static uint GetVertexIDFromNodeID(TaxiNodesRecord node)
{
return m_verticesByNode.ContainsKey(node.Id) ? m_verticesByNode[node.Id] : uint.MaxValue;
}
static uint GetNodeIDFromVertexID(uint vertexID)
{
if (vertexID < m_nodesByVertex.Count)
return m_nodesByVertex[(int)vertexID].Id;
return uint.MaxValue;
}
public static void Initialize()
{
if (m_graph != null)
return;
List<Tuple<Tuple<uint, uint>, uint>> edges = new();
// Initialize here
foreach (TaxiPathRecord path in CliDB.TaxiPathStorage.Values)
{
TaxiNodesRecord from = CliDB.TaxiNodesStorage.LookupByKey(path.FromTaxiNode);
TaxiNodesRecord to = CliDB.TaxiNodesStorage.LookupByKey(path.ToTaxiNode);
if (from != null && to != null && from.Flags.HasAnyFlag(TaxiNodeFlags.Alliance | TaxiNodeFlags.Horde) && to.Flags.HasAnyFlag(TaxiNodeFlags.Alliance | TaxiNodeFlags.Horde))
AddVerticeAndEdgeFromNodeInfo(from, to, path.Id, edges);
}
// create graph
m_graph = new EdgeWeightedDigraph(m_nodesByVertex.Count);
for (int j = 0; j < edges.Count; ++j)
{
m_graph.AddEdge(new DirectedEdge(edges[j].Item1.Item1, edges[j].Item1.Item2, edges[j].Item2));
}
}
public static int GetCompleteNodeRoute(TaxiNodesRecord from, TaxiNodesRecord to, Player player, List<uint> shortestPath)
{
/*
Information about node algorithm from client
@@ -172,7 +181,7 @@ namespace Game.Entities
}
//todo test me
public void GetReachableNodesMask(TaxiNodesRecord from, byte[] mask)
public static void GetReachableNodesMask(TaxiNodesRecord from, byte[] mask)
{
DepthFirstSearch depthFirst = new(m_graph, GetVertexIDFromNodeID(from), vertex =>
{
@@ -181,17 +190,6 @@ namespace Game.Entities
mask[(taxiNode.Id - 1) / 8] |= (byte)(1 << (int)((taxiNode.Id - 1) % 8));
});
}
uint CreateVertexFromFromNodeInfoIfNeeded(TaxiNodesRecord node)
{
if (!m_verticesByNode.ContainsKey(node.Id))
{
m_verticesByNode.Add(node.Id, (uint)m_nodesByVertex.Count);
m_nodesByVertex.Add(node);
}
return m_verticesByNode[node.Id];
}
}
}
-1
View File
@@ -73,7 +73,6 @@ public static class Global
public static WaypointManager WaypointMgr { get { return WaypointManager.Instance; } }
public static TransportManager TransportMgr { get { return TransportManager.Instance; } }
public static InstanceSaveManager InstanceSaveMgr { get { return InstanceSaveManager.Instance; } }
public static TaxiPathGraph TaxiPathGraph { get { return TaxiPathGraph.Instance; } }
public static ScenarioManager ScenarioMgr { get { return ScenarioManager.Instance; } }
//PVP
+2 -2
View File
@@ -113,7 +113,7 @@ namespace Game
GetPlayer().m_taxi.AppendTaximaskTo(data, lastTaxiCheaterState);
byte[] reachableNodes = new byte[CliDB.TaxiNodesMask.Length];
Global.TaxiPathGraph.GetReachableNodesMask(CliDB.TaxiNodesStorage.LookupByKey(curloc), reachableNodes);
TaxiPathGraph.GetReachableNodesMask(CliDB.TaxiNodesStorage.LookupByKey(curloc), reachableNodes);
for (var i = 0; i < reachableNodes.Length; ++i)
{
data.CanLandNodes[i] &= reachableNodes[i];
@@ -221,7 +221,7 @@ namespace Game
}
List<uint> nodes = new();
Global.TaxiPathGraph.GetCompleteNodeRoute(from, to, GetPlayer(), nodes);
TaxiPathGraph.GetCompleteNodeRoute(from, to, GetPlayer(), nodes);
GetPlayer().ActivateTaxiPathTo(nodes, unit, 0, preferredMountDisplay);
}
+1 -1
View File
@@ -443,7 +443,7 @@ namespace Game
CliDB.LoadGameTables(_dataPath);
//Load weighted graph on taxi nodes path
Global.TaxiPathGraph.Initialize();
TaxiPathGraph.Initialize();
MultiMap<uint, uint> mapData = new();
foreach (MapRecord mapEntry in CliDB.MapStorage.Values)