public static async void Load() { Parallel.ForEach( typeof(DBC).GetProperties(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic), dbc => { if (!dbc.PropertyType.IsGenericType || dbc.PropertyType.GetGenericTypeDefinition() != typeof(Storage <>)) { return; } var name = dbc.Name; try { dbc.SetValue(dbc.GetValue(null), Activator.CreateInstance(dbc.PropertyType, $@"{ Settings.Default.DbcPath }\{ Settings.Default.Locale }\{ name }.db2", true)); } catch (DirectoryNotFoundException) { } catch (TargetInvocationException tie) { if (tie.InnerException is ArgumentException) { throw new ArgumentException($"Failed to load {name}.db2: {tie.InnerException.Message}"); } throw; } }); foreach (var spell in Spell) { SpellInfoStore[spell.Value.ID] = new SpellInfo(spell.Value); } await Task.WhenAll(Task.Run(() => { foreach (var effect in SpellInfoStore.Where(effect => SpellMisc.ContainsKey(effect.Value.Spell.MiscID))) { effect.Value.Misc = SpellMisc[effect.Value.Spell.MiscID]; if (SpellDuration.ContainsKey(effect.Value.Misc.DurationIndex)) { effect.Value.DurationEntry = SpellDuration[effect.Value.Misc.DurationIndex]; } if (SpellRange.ContainsKey(effect.Value.Misc.RangeIndex)) { effect.Value.Range = SpellRange[effect.Value.Misc.RangeIndex]; } } }), Task.Run(() => { foreach (var effect in SpellEffect) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"Spell effect {effect.Value.ID} is referencing unknown spell {effect.Value.SpellID}, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].Effects.Add(effect.Value); SpellInfoStore[effect.Value.SpellID].SpellEffectInfoStore[effect.Value.EffectIndex] = new SpellEffectInfo(effect.Value); // Helper var triggerId = (int)effect.Value.EffectTriggerSpell; if (triggerId != 0) { if (SpellTriggerStore.ContainsKey(triggerId)) { SpellTriggerStore[triggerId].Add(effect.Value.SpellID); } else { SpellTriggerStore.Add(triggerId, new SortedSet <int> { effect.Value.SpellID }); } } } }), Task.Run(() => { foreach (var effect in SpellTargetRestrictions) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellTargetRestrictions: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].TargetRestrictions.Add(effect.Value); } }), Task.Run(() => { foreach (var effect in SpellXSpellVisual.Where(effect => effect.Value.DifficultyID == 0 && effect.Value.PlayerConditionID == 0)) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellXSpellVisual: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].SpellXSpellVisual = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellScaling) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellScaling: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].Scaling = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellAuraOptions) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellAuraOptions: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].AuraOptions = effect.Value; if (effect.Value.SpellProcsPerMinuteID != 0) { SpellInfoStore[effect.Value.SpellID].ProcsPerMinute = SpellProcsPerMinute[effect.Value.SpellProcsPerMinuteID]; } } }), Task.Run(() => { foreach (var effect in SpellAuraRestrictions) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellAuraRestrictions: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].AuraRestrictions = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellCategories) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellCategories: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].Categories = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellCastingRequirements) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellCastingRequirements: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); return; } SpellInfoStore[effect.Value.SpellID].CastingRequirements = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellClassOptions) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellClassOptions: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].ClassOptions = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellCooldowns) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellCooldowns: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].Cooldowns = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellEffectScaling) { if (!SpellEffect.ContainsKey(effect.Value.SpellEffectId)) { Console.WriteLine( $"SpellEffectScaling: Unknown spell effect {effect.Value.SpellEffectId} referenced, ignoring!"); continue; } SpellEffect[effect.Value.SpellEffectId].SpellEffectScalingEntry = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellInterrupts) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellInterrupts: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].Interrupts = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellEquippedItems) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellEquippedItems: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].EquippedItems = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellLevels) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine($"SpellLevels: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].Levels = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellReagents) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellReagents: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].Reagents = effect.Value; } }), Task.Run(() => { foreach (var reagentsCurrency in SpellReagentsCurrency) { if (!SpellInfoStore.ContainsKey(reagentsCurrency.Value.SpellID)) { Console.WriteLine( $"SpellReagentsCurrency: Unknown spell {reagentsCurrency.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[reagentsCurrency.Value.SpellID].ReagentsCurrency.Add(reagentsCurrency.Value); } }), Task.Run(() => { foreach (var effect in SpellShapeshift) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine( $"SpellShapeshift: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].Shapeshift = effect.Value; } }), Task.Run(() => { foreach (var effect in SpellTotems) { if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) { Console.WriteLine($"SpellTotems: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); continue; } SpellInfoStore[effect.Value.SpellID].Totems = effect.Value; } })); GameTable <GtSpellScalingEntry> .Open($@"{Settings.Default.GtPath}\SpellScaling.txt"); }