From 0584d234ad326770b69e4122a4b6bca8a1f3faf9 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 18 Jan 2023 17:25:54 -0500 Subject: [PATCH] Fix loading server and talents. --- .../Game/Networking/Packets/SpellPackets.cs | 1 + Source/Game/Spells/TraitManager.cs | 57 ++++++++++++++++--- Source/Game/World/WorldManager.cs | 3 + 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/Source/Game/Networking/Packets/SpellPackets.cs b/Source/Game/Networking/Packets/SpellPackets.cs index 006721767..647aa1d04 100644 --- a/Source/Game/Networking/Packets/SpellPackets.cs +++ b/Source/Game/Networking/Packets/SpellPackets.cs @@ -1506,6 +1506,7 @@ namespace Game.Networking.Packets { public void Read(WorldPacket data) { + data.ResetBitPos(); Flags = (SpellCastTargetFlags)data.ReadBits(28); if (data.HasBit()) SrcLocation = new(); diff --git a/Source/Game/Spells/TraitManager.cs b/Source/Game/Spells/TraitManager.cs index a31ff7c3c..b8da57fc5 100644 --- a/Source/Game/Spells/TraitManager.cs +++ b/Source/Game/Spells/TraitManager.cs @@ -107,7 +107,7 @@ namespace Game MultiMap traitTreesIdsByTraitSystem = new(); foreach (TraitTreeRecord traitTree in CliDB.TraitTreeStorage.Values) { - Tree tree = _traitTrees[(int)traitTree.Id]; + Tree tree = new(); tree.Data = traitTree; var costs = treeCosts.LookupByKey(traitTree.Id); @@ -123,11 +123,13 @@ namespace Game traitTreesIdsByTraitSystem.Add(traitTree.TraitSystemID, (int)traitTree.Id); tree.ConfigType = TraitConfigType.Generic; } + + _traitTrees[(int)traitTree.Id] = tree; } foreach (TraitNodeGroupRecord traitNodeGroup in CliDB.TraitNodeGroupStorage.Values) { - NodeGroup nodeGroup = _traitGroups[(int)traitNodeGroup.Id]; + NodeGroup nodeGroup = new(); nodeGroup.Data = traitNodeGroup; var conditions = nodeGroupConditions.LookupByKey(traitNodeGroup.Id); @@ -137,11 +139,13 @@ namespace Game var costs = nodeGroupCosts.LookupByKey(traitNodeGroup.Id); if (costs != null) nodeGroup.Costs = costs; + + _traitGroups[(int)traitNodeGroup.Id] = nodeGroup; } foreach (TraitNodeRecord traitNode in CliDB.TraitNodeStorage.Values) { - Node node = _traitNodes[(int)traitNode.Id]; + Node node = new(); node.Data = traitNode; Tree tree = _traitTrees.LookupByKey(traitNode.TraitTreeID); @@ -181,6 +185,8 @@ namespace Game var costs1 = nodeCosts.LookupByKey(traitNode.Id); if (costs1 != null) node.Costs = costs1; + + _traitNodes[(int)traitNode.Id] = node; } foreach (TraitEdgeRecord traitEdgeEntry in CliDB.TraitEdgeStorage.Values) @@ -203,7 +209,7 @@ namespace Game if (skillLineEntry == null) continue; - _traitTreesBySkillLine[skillLineXTraitTreeEntry.SkillLineID].Add(tree); + _traitTreesBySkillLine.Add(skillLineXTraitTreeEntry.SkillLineID, tree); if (skillLineEntry.CategoryID == SkillCategory.Class) { foreach (SkillRaceClassInfoRecord skillRaceClassInfo in Global.DB2Mgr.GetSkillRaceClassInfo(skillLineEntry.Id)) @@ -221,14 +227,14 @@ namespace Game { Tree tree = _traitTrees.LookupByKey(traitTreeId); if (tree != null) - _traitTreesByTraitSystem[traitSystemId].Add(tree); + _traitTreesByTraitSystem.Add(traitSystemId, tree); } foreach (TraitCurrencySourceRecord traitCurrencySource in CliDB.TraitCurrencySourceStorage.Values) - _traitCurrencySourcesByCurrency[traitCurrencySource.TraitCurrencyID].Add(traitCurrencySource); + _traitCurrencySourcesByCurrency.Add(traitCurrencySource.TraitCurrencyID, traitCurrencySource); foreach (TraitDefinitionEffectPointsRecord traitDefinitionEffectPoints in CliDB.TraitDefinitionEffectPointsStorage.Values) - _traitDefinitionEffectPointModifiers[traitDefinitionEffectPoints.TraitDefinitionID].Add(traitDefinitionEffectPoints); + _traitDefinitionEffectPointModifiers.Add(traitDefinitionEffectPoints.TraitDefinitionID, traitDefinitionEffectPoints); MultiMap traitTreeLoadoutEntries = new(); foreach (TraitTreeLoadoutEntryRecord traitTreeLoadoutEntry in CliDB.TraitTreeLoadoutEntryStorage.Values) @@ -354,7 +360,7 @@ namespace Game bool hasTraitNodeEntry(int traitNodeEntryId) { return traitConfig.Entries.Any(traitEntry => traitEntry.TraitNodeEntryID == traitNodeEntryId && (traitEntry.Rank > 0 || traitEntry.GrantedRanks > 0)); - } + } foreach (Tree tree in trees) { @@ -364,6 +370,9 @@ namespace Game { case TraitCurrencyType.Gold: { + if (!currencies.ContainsKey((int)currency.Id)) + currencies[(int)currency.Id] = 0; + int amount = currencies[(int)currency.Id]; if (player.GetMoney() > (ulong)(int.MaxValue - amount)) amount = int.MaxValue; @@ -372,6 +381,9 @@ namespace Game break; } case TraitCurrencyType.CurrencyTypesBased: + if (!currencies.ContainsKey((int)currency.Id)) + currencies[(int)currency.Id] = 0; + currencies[(int)currency.Id] += (int)player.GetCurrency((uint)currency.CurrencyTypesID); break; case TraitCurrencyType.TraitSourced: @@ -392,6 +404,9 @@ namespace Game if (currencySource.TraitNodeEntryID != 0 && !hasTraitNodeEntry(currencySource.TraitNodeEntryID)) continue; + if (!currencies.ContainsKey(currencySource.TraitCurrencyID)) + currencies[currencySource.TraitCurrencyID] = 0; + currencies[currencySource.TraitCurrencyID] += currencySource.Amount; } } @@ -407,21 +422,47 @@ namespace Game { Node node = _traitNodes.LookupByKey(entry.TraitNodeID); foreach (NodeGroup group in node.Groups) + { foreach (TraitCostRecord cost in group.Costs) + { + if (!cachedCurrencies.ContainsKey(cost.TraitCurrencyID)) + cachedCurrencies[cost.TraitCurrencyID] = 0; + cachedCurrencies[cost.TraitCurrencyID] += cost.Amount * entry.Rank; + } + } var nodeEntryItr = node.Entries.Find(nodeEntry => nodeEntry.Data.Id == entry.TraitNodeEntryID); if (nodeEntryItr != null) + { foreach (TraitCostRecord cost in nodeEntryItr.Costs) + { + if (!cachedCurrencies.ContainsKey(cost.TraitCurrencyID)) + cachedCurrencies[cost.TraitCurrencyID] = 0; + cachedCurrencies[cost.TraitCurrencyID] += cost.Amount * entry.Rank; + } + } foreach (TraitCostRecord cost in node.Costs) + { + if (!cachedCurrencies.ContainsKey(cost.TraitCurrencyID)) + cachedCurrencies[cost.TraitCurrencyID] = 0; + cachedCurrencies[cost.TraitCurrencyID] += cost.Amount * entry.Rank; + } Tree tree = _traitTrees.LookupByKey(node.Data.TraitTreeID); if (tree != null) + { foreach (TraitCostRecord cost in tree.Costs) + { + if (!cachedCurrencies.ContainsKey(cost.TraitCurrencyID)) + cachedCurrencies[cost.TraitCurrencyID] = 0; + cachedCurrencies[cost.TraitCurrencyID] += cost.Amount * entry.Rank; + } + } } public static void FillSpentCurrenciesMap(TraitConfigPacket traitConfig, Dictionary cachedCurrencies) diff --git a/Source/Game/World/WorldManager.cs b/Source/Game/World/WorldManager.cs index 7379f5701..f1e97985b 100644 --- a/Source/Game/World/WorldManager.cs +++ b/Source/Game/World/WorldManager.cs @@ -487,6 +487,9 @@ namespace Game Log.outInfo(LogFilter.ServerLoading, "Loading Spell Totem models..."); Global.SpellMgr.LoadSpellTotemModel(); + Log.outInfo(LogFilter.ServerLoading, "Loading Traits..."); + TraitMgr.Load(); + Log.outInfo(LogFilter.ServerLoading, "Loading languages..."); Global.LanguageMgr.LoadLanguages();