diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index ba33b896a..201b8e9cd 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -45,8 +45,6 @@ namespace Framework.Constants public const uint infinityCooldownDelayCheck = Time.Month / 2; public const int MaxPlayerSummonDelay = 2 * Time.Minute; - public const int TaxiMaskSize = 345; - // corpse reclaim times public const int DeathExpireStep = (5 * Time.Minute); public const int MaxDeathCount = 3; diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs index 8d7616934..05bbe36eb 100644 --- a/Source/Game/DataStorage/CliDB.cs +++ b/Source/Game/DataStorage/CliDB.cs @@ -370,6 +370,12 @@ namespace Game.DataStorage foreach (var entry in TaxiPathNodeStorage.Values) TaxiPathNodesByPath[entry.PathID][entry.NodeIndex] = entry; + var taxiMaskSize = ((TaxiNodesStorage.Count - 1) / 8) + 1; + TaxiNodesMask = new byte[taxiMaskSize]; + OldContinentsNodesMask = new byte[taxiMaskSize]; + HordeTaxiNodesMask = new byte[taxiMaskSize]; + AllianceTaxiNodesMask = new byte[taxiMaskSize]; + foreach (var node in TaxiNodesStorage.Values) { if (!node.Flags.HasAnyFlag(TaxiNodeFlags.Alliance | TaxiNodeFlags.Horde)) @@ -754,10 +760,10 @@ namespace Game.DataStorage #endregion #region Taxi Collections - public static byte[] TaxiNodesMask = new byte[PlayerConst.TaxiMaskSize]; - public static byte[] OldContinentsNodesMask = new byte[PlayerConst.TaxiMaskSize]; - public static byte[] HordeTaxiNodesMask = new byte[PlayerConst.TaxiMaskSize]; - public static byte[] AllianceTaxiNodesMask = new byte[PlayerConst.TaxiMaskSize]; + public static byte[] TaxiNodesMask; + public static byte[] OldContinentsNodesMask; + public static byte[] HordeTaxiNodesMask; + public static byte[] AllianceTaxiNodesMask; public static Dictionary> TaxiPathSetBySource = new(); public static Dictionary TaxiPathNodesByPath = new(); #endregion diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 7feb70445..7f1f9ae22 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -3434,7 +3434,7 @@ namespace Game.Entities stmt.AddValue(index++, transLowGUID); StringBuilder ss = new(); - for (int i = 0; i < PlayerConst.TaxiMaskSize; ++i) + for (int i = 0; i < m_taxi.m_taximask.Length; ++i) ss.Append(m_taxi.m_taximask[i] + " "); stmt.AddValue(index++, ss.ToString()); @@ -3575,7 +3575,7 @@ namespace Game.Entities stmt.AddValue(index++, transLowGUID); StringBuilder ss = new(); - for (int i = 0; i < PlayerConst.TaxiMaskSize; ++i) + for (int i = 0; i < m_taxi.m_taximask.Length; ++i) ss.Append(m_taxi.m_taximask[i] + " "); stmt.AddValue(index++, ss.ToString()); diff --git a/Source/Game/Entities/Player/PlayerTaxi.cs b/Source/Game/Entities/Player/PlayerTaxi.cs index eb0226af1..051f918ee 100644 --- a/Source/Game/Entities/Player/PlayerTaxi.cs +++ b/Source/Game/Entities/Player/PlayerTaxi.cs @@ -27,7 +27,7 @@ namespace Game.Entities { public class PlayerTaxi { - public byte[] m_taximask = new byte[PlayerConst.TaxiMaskSize]; + public byte[] m_taximask; List m_TaxiDestinations = new(); uint m_flightMasterFactionId; @@ -37,7 +37,8 @@ namespace Game.Entities if (chrClass == Class.Deathknight) { var factionMask = Player.TeamForRace(race) == Team.Horde ? CliDB.HordeTaxiNodesMask : CliDB.AllianceTaxiNodesMask; - for (int i = 0; i < PlayerConst.TaxiMaskSize; ++i) + m_taximask = new byte[factionMask.Length]; + for (int i = 0; i < factionMask.Length; ++i) m_taximask[i] |= (byte)(CliDB.OldContinentsNodesMask[i] & factionMask[i]); } @@ -107,7 +108,7 @@ namespace Game.Entities var split = new StringArray(data, ' '); int index = 0; - for (var i = 0; index < PlayerConst.TaxiMaskSize && i != split.Length; ++i, ++index) + for (var i = 0; index < m_taximask.Length && i != split.Length; ++i, ++index) { // load and set bits only for existing taxi nodes if (uint.TryParse(split[i], out uint id)) @@ -117,18 +118,18 @@ namespace Game.Entities public void AppendTaximaskTo(ShowTaxiNodes data, bool all) { - data.CanLandNodes = new byte[PlayerConst.TaxiMaskSize]; - data.CanUseNodes = new byte[PlayerConst.TaxiMaskSize]; + data.CanLandNodes = new byte[CliDB.TaxiNodesMask.Length]; + data.CanUseNodes = new byte[CliDB.TaxiNodesMask.Length]; if (all) { - Buffer.BlockCopy(CliDB.TaxiNodesMask, 0, data.CanLandNodes, 0, PlayerConst.TaxiMaskSize); // all existed nodes - Buffer.BlockCopy(CliDB.TaxiNodesMask, 0, data.CanLandNodes, 0, PlayerConst.TaxiMaskSize); + Buffer.BlockCopy(CliDB.TaxiNodesMask, 0, data.CanLandNodes, 0, data.CanLandNodes.Length); // all existed nodes + Buffer.BlockCopy(CliDB.TaxiNodesMask, 0, data.CanUseNodes, 0, data.CanUseNodes.Length); } else { - Buffer.BlockCopy(m_taximask, 0, data.CanLandNodes, 0, PlayerConst.TaxiMaskSize); // known nodes - Buffer.BlockCopy(m_taximask, 0, data.CanUseNodes, 0, PlayerConst.TaxiMaskSize); + Buffer.BlockCopy(m_taximask, 0, data.CanLandNodes, 0, data.CanLandNodes.Length); // known nodes + Buffer.BlockCopy(m_taximask, 0, data.CanUseNodes, 0, data.CanUseNodes.Length); } } diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index d7fbc2744..c99e70b42 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -1924,7 +1924,7 @@ namespace Game var factionMask = newTeamId == TeamId.Horde ? CliDB.HordeTaxiNodesMask : CliDB.AllianceTaxiNodesMask; - for (int i = 0; i < PlayerConst.TaxiMaskSize; ++i) + for (int i = 0; i < factionMask.Length; ++i) { // i = (315 - 1) / 8 = 39 // m = 1 << ((315 - 1) % 8) = 4 diff --git a/Source/Game/Handlers/TaxiHandler.cs b/Source/Game/Handlers/TaxiHandler.cs index bfde50fd7..866645544 100644 --- a/Source/Game/Handlers/TaxiHandler.cs +++ b/Source/Game/Handlers/TaxiHandler.cs @@ -112,9 +112,9 @@ namespace Game GetPlayer().m_taxi.AppendTaximaskTo(data, lastTaxiCheaterState); - byte[] reachableNodes = new byte[PlayerConst.TaxiMaskSize]; + byte[] reachableNodes = new byte[CliDB.TaxiNodesMask.Length]; Global.TaxiPathGraph.GetReachableNodesMask(CliDB.TaxiNodesStorage.LookupByKey(curloc), reachableNodes); - for (var i = 0; i < PlayerConst.TaxiMaskSize; ++i) + for (var i = 0; i < reachableNodes.Length; ++i) { data.CanLandNodes[i] &= reachableNodes[i]; data.CanUseNodes[i] &= reachableNodes[i];