Fixed Server starting.

This commit is contained in:
Hondacrx
2025-06-09 00:04:23 -04:00
parent 4214100d93
commit 59b507e93d
16 changed files with 105 additions and 98 deletions
+1 -62
View File
@@ -395,59 +395,7 @@ namespace Game.DataStorage
WMOAreaTableStorage = ReadDB2<WMOAreaTableRecord>("WMOAreaTable.db2", HotfixStatements.SEL_WMO_AREA_TABLE, HotfixStatements.SEL_WMO_AREA_TABLE_LOCALE);
WorldEffectStorage = ReadDB2<WorldEffectRecord>("WorldEffect.db2", HotfixStatements.SEL_WORLD_EFFECT);
WorldMapOverlayStorage = ReadDB2<WorldMapOverlayRecord>("WorldMapOverlay.db2", HotfixStatements.SEL_WORLD_MAP_OVERLAY);
WorldStateExpressionStorage = ReadDB2<WorldStateExpressionRecord>("WorldStateExpression.db2", HotfixStatements.SEL_WORLD_STATE_EXPRESSION);
foreach (var entry in TaxiPathStorage.Values)
{
if (!TaxiPathSetBySource.ContainsKey(entry.FromTaxiNode))
TaxiPathSetBySource.Add(entry.FromTaxiNode, new Dictionary<uint, TaxiPathBySourceAndDestination>());
TaxiPathSetBySource[entry.FromTaxiNode][entry.ToTaxiNode] = new TaxiPathBySourceAndDestination(entry.Id, entry.Cost);
}
uint pathCount = TaxiPathStorage.GetNumRows();
// Calculate path nodes count
uint[] pathLength = new uint[pathCount]; // 0 and some other indexes not used
foreach (TaxiPathNodeRecord entry in TaxiPathNodeStorage.Values)
if (pathLength[entry.PathID] < entry.NodeIndex + 1)
pathLength[entry.PathID] = (uint)Math.Max(pathLength[entry.PathID], entry.NodeIndex + 1u);
// Set path length
for (uint i = 0; i < pathCount; ++i)
TaxiPathNodesByPath[i] = new TaxiPathNodeRecord[pathLength[i]];
// fill data
foreach (var entry in TaxiPathNodeStorage.Values)
TaxiPathNodesByPath[entry.PathID][entry.NodeIndex] = entry;
var taxiMaskSize = ((TaxiNodesStorage.GetNumRows() - 1) / (1 * 64) + 1) * 8;
TaxiNodesMask = new byte[taxiMaskSize];
OldContinentsNodesMask = new byte[taxiMaskSize];
HordeTaxiNodesMask = new byte[taxiMaskSize];
AllianceTaxiNodesMask = new byte[taxiMaskSize];
foreach (var node in TaxiNodesStorage.Values)
{
if (!node.IsPartOfTaxiNetwork())
continue;
// valid taxi network node
uint field = (node.Id - 1) / 8;
byte submask = (byte)(1 << (int)((node.Id - 1) % 8));
TaxiNodesMask[field] |= submask;
if (node.HasFlag(TaxiNodeFlags.ShowOnHordeMap))
HordeTaxiNodesMask[field] |= submask;
if (node.HasFlag(TaxiNodeFlags.ShowOnAllianceMap))
AllianceTaxiNodesMask[field] |= submask;
uint uiMapId;
if (!Global.DB2Mgr.GetUiMapPosition(node.Pos.X, node.Pos.Y, node.Pos.Z, node.ContinentID, 0, 0, 0, UiMapSystem.Adventure, false, out uiMapId))
Global.DB2Mgr.GetUiMapPosition(node.Pos.X, node.Pos.Y, node.Pos.Z, node.ContinentID, 0, 0, 0, UiMapSystem.Taxi, false, out uiMapId);
if (uiMapId == 985 || uiMapId == 986)
OldContinentsNodesMask[field] |= submask;
}
WorldStateExpressionStorage = ReadDB2<WorldStateExpressionRecord>("WorldStateExpression.db2", HotfixStatements.SEL_WORLD_STATE_EXPRESSION);
// Check loaded DB2 files proper version
if (!AreaTableStorage.ContainsKey(16108) || // last area added in 11.0.7 (58162)
@@ -864,15 +812,6 @@ namespace Game.DataStorage
public static GameTable<GtXpRecord> XpGameTable;
#endregion
#region Taxi Collections
public static byte[] TaxiNodesMask;
public static byte[] OldContinentsNodesMask;
public static byte[] HordeTaxiNodesMask;
public static byte[] AllianceTaxiNodesMask;
public static Dictionary<uint, Dictionary<uint, TaxiPathBySourceAndDestination>> TaxiPathSetBySource = new();
public static Dictionary<uint, TaxiPathNodeRecord[]> TaxiPathNodesByPath = new();
#endregion
#region Helper Methods
public static float GetGameTableColumnForClass(dynamic row, Class class_)
{
+59
View File
@@ -564,6 +564,24 @@ namespace Game.DataStorage
_talentsByPosition[talentInfo.ClassID][talentInfo.TierID][talentInfo.ColumnIndex].Add(talentInfo);
}
foreach (var entry in TaxiPathStorage.Values)
_taxiPaths[(entry.FromTaxiNode, entry.ToTaxiNode)] = entry;
uint pathCount = TaxiPathStorage.GetNumRows();
// Calculate path nodes count
uint[] pathLength = new uint[pathCount]; // 0 and some other indexes not used
foreach (TaxiPathNodeRecord entry in TaxiPathNodeStorage.Values)
pathLength[entry.PathID] = (uint)Math.Max(pathLength[entry.PathID], entry.NodeIndex + 1u);
// Set path length
for (uint i = 0; i < pathCount; ++i)
TaxiPathNodesByPath[i] = new TaxiPathNodeRecord[pathLength[i]];
// fill data
foreach (var entry in TaxiPathNodeStorage.Values)
TaxiPathNodesByPath[entry.PathID][entry.NodeIndex] = entry;
foreach (ToyRecord toy in ToyStorage.Values)
_toys.Add(toy.ItemID);
@@ -688,6 +706,35 @@ namespace Game.DataStorage
foreach (WMOAreaTableRecord entry in WMOAreaTableStorage.Values)
_wmoAreaTableLookup[Tuple.Create((short)entry.WmoID, (sbyte)entry.NameSetID, entry.WmoGroupID)] = entry;
var taxiMaskSize = ((TaxiNodesStorage.GetNumRows() - 1) / (1 * 64) + 1) * 8;
TaxiNodesMask = new byte[taxiMaskSize];
OldContinentsNodesMask = new byte[taxiMaskSize];
HordeTaxiNodesMask = new byte[taxiMaskSize];
AllianceTaxiNodesMask = new byte[taxiMaskSize];
foreach (var node in TaxiNodesStorage.Values)
{
if (!node.IsPartOfTaxiNetwork())
continue;
// valid taxi network node
uint field = (node.Id - 1) / 8;
byte submask = (byte)(1 << (int)((node.Id - 1) % 8));
TaxiNodesMask[field] |= submask;
if (node.HasFlag(TaxiNodeFlags.ShowOnHordeMap))
HordeTaxiNodesMask[field] |= submask;
if (node.HasFlag(TaxiNodeFlags.ShowOnAllianceMap))
AllianceTaxiNodesMask[field] |= submask;
uint uiMapId;
if (!Global.DB2Mgr.GetUiMapPosition(node.Pos.X, node.Pos.Y, node.Pos.Z, node.ContinentID, 0, 0, 0, UiMapSystem.Adventure, false, out uiMapId))
Global.DB2Mgr.GetUiMapPosition(node.Pos.X, node.Pos.Y, node.Pos.Z, node.ContinentID, 0, 0, 0, UiMapSystem.Taxi, false, out uiMapId);
if (uiMapId == 985 || uiMapId == 986)
OldContinentsNodesMask[field] |= submask;
}
foreach (PvpStatRecord pvpStat in PvpStatStorage.Values)
_pvpStatIdsByMap.Add(pvpStat.MapID, pvpStat.Id);
@@ -2001,6 +2048,11 @@ namespace Game.DataStorage
return _talentsByPosition[(int)class_][tier][column];
}
public TaxiPathRecord GetTaxiPath(uint from, uint to)
{
return _taxiPaths.LookupByKey((from, to));
}
public bool IsTotemCategoryCompatibleWith(uint itemTotemCategoryId, uint requiredTotemCategoryId, bool requireAllTotems = true)
{
if (requiredTotemCategoryId == 0)
@@ -2408,6 +2460,7 @@ namespace Game.DataStorage
MultiMap<uint, SpellProcsPerMinuteModRecord> _spellProcsPerMinuteMods = new();
MultiMap<uint, SpellVisualMissileRecord> _spellVisualMissilesBySet = new();
List<TalentRecord>[][][] _talentsByPosition = new List<TalentRecord>[(int)Class.Max][][];
Dictionary<(uint, uint), TaxiPathRecord> _taxiPaths = new();
List<uint> _toys = new();
Dictionary<uint, TransmogIllusionRecord> _transmogIllusionsByEnchantmentId = new();
MultiMap<uint, TransmogSetRecord> _transmogSetsByItemModifiedAppearance = new();
@@ -2420,6 +2473,12 @@ namespace Game.DataStorage
List<int> _uiMapPhases = new();
Dictionary<Tuple<short, sbyte, int>, WMOAreaTableRecord> _wmoAreaTableLookup = new();
MultiMap<uint, uint> _pvpStatIdsByMap = new();
public static byte[] TaxiNodesMask;
public static byte[] OldContinentsNodesMask;
public static byte[] HordeTaxiNodesMask;
public static byte[] AllianceTaxiNodesMask;
public static Dictionary<uint, TaxiPathNodeRecord[]> TaxiPathNodesByPath = new();
}
class UiMapBounds