From 9de1e4653c3f845098cbe4db107fc2900e148da0 Mon Sep 17 00:00:00 2001 From: "Antonio M. Berti" <15972392+BertiRean@users.noreply.github.com> Date: Mon, 18 Mar 2024 00:07:31 -0300 Subject: [PATCH 1/5] Updated to 7.3.5 26972 --- SpellWork/DBC/DBC.cs | 173 +++++++-------- .../DBC/Structures/AreaGroupMemberEntry.cs | 12 +- SpellWork/DBC/Structures/AreaTableEntry.cs | 55 +++-- SpellWork/DBC/Structures/ItemEffectEntry.cs | 24 +- SpellWork/DBC/Structures/ItemEntry.cs | 22 +- SpellWork/DBC/Structures/ItemSparseEntry.cs | 141 ++++++------ .../DBC/Structures/OverrideSpellDataEntry.cs | 13 +- .../DBC/Structures/RandPropPointsEntry.cs | 15 +- SpellWork/DBC/Structures/ScreenEffectEntry.cs | 32 +-- .../DBC/Structures/SkillLineAbilityEntry.cs | 32 +-- SpellWork/DBC/Structures/SkillLineEntry.cs | 23 +- .../DBC/Structures/SpellAuraOptionsEntry.cs | 23 +- .../Structures/SpellAuraRestrictionsEntry.cs | 26 ++- .../DBC/Structures/SpellCastTimesEntry.cs | 12 +- .../SpellCastingRequirementsEntry.cs | 20 +- .../DBC/Structures/SpellCategoriesEntry.cs | 24 +- .../DBC/Structures/SpellClassOptionsEntry.cs | 15 +- .../DBC/Structures/SpellCooldownsEntry.cs | 16 +- .../SpellDescriptionVariablesEntry.cs | 6 +- .../DBC/Structures/SpellDurationEntry.cs | 12 +- SpellWork/DBC/Structures/SpellEffectEntry.cs | 73 +++--- .../DBC/Structures/SpellEffectScalingEntry.cs | 15 +- SpellWork/DBC/Structures/SpellEntry.cs | 18 +- .../DBC/Structures/SpellEquippedItemsEntry.cs | 14 +- .../DBC/Structures/SpellInterruptsEntry.cs | 19 +- SpellWork/DBC/Structures/SpellLevelsEntry.cs | 18 +- SpellWork/DBC/Structures/SpellMiscEntry.cs | 19 +- SpellWork/DBC/Structures/SpellMissileEntry.cs | 37 ++-- .../DBC/Structures/SpellMissileMotionEntry.cs | 15 +- SpellWork/DBC/Structures/SpellPowerEntry.cs | 35 +-- .../Structures/SpellProcsPerMinuteEntry.cs | 11 +- SpellWork/DBC/Structures/SpellRadiusEntry.cs | 8 +- SpellWork/DBC/Structures/SpellRangeEntry.cs | 12 +- .../Structures/SpellReagentsCurrencyEntry.cs | 12 +- .../DBC/Structures/SpellReagentsEntry.cs | 14 +- SpellWork/DBC/Structures/SpellScalingEntry.cs | 16 +- .../DBC/Structures/SpellShapeshiftEntry.cs | 16 +- .../SpellTargetRestrictionsEntry.cs | 23 +- SpellWork/DBC/Structures/SpellTotemsEntry.cs | 14 +- SpellWork/DBC/Structures/SpellVisualEntry.cs | 54 ++--- .../DBC/Structures/SpellXSpellVisualEntry.cs | 29 +-- SpellWork/Forms/FormMain.cs | 2 +- SpellWork/Properties/Resources.Designer.cs | 2 +- SpellWork/Properties/Settings.Designer.cs | 13 +- SpellWork/Properties/Settings.settings | 3 + SpellWork/Spell/ProcInfo.cs | 8 +- SpellWork/Spell/SpellInfo.cs | 209 +++++++++--------- SpellWork/SpellWork.csproj | 8 +- SpellWork/app.config | 16 +- 49 files changed, 799 insertions(+), 630 deletions(-) diff --git a/SpellWork/DBC/DBC.cs b/SpellWork/DBC/DBC.cs index a48ea0ce..8d4cccfa 100644 --- a/SpellWork/DBC/DBC.cs +++ b/SpellWork/DBC/DBC.cs @@ -1,4 +1,4 @@ -using SpellWork.Database; +using DBFileReaderLib; using SpellWork.DBC.Structures; using SpellWork.GameTables; using SpellWork.GameTables.Structures; @@ -10,14 +10,13 @@ using System.IO; using System.Linq; using System.Reflection; -using DBFilesClient.NET; using System.Threading.Tasks; namespace SpellWork.DBC { public static class DBC { - public const string Version = "SpellWork 7.2.5 (24330)"; + public const string Version = "SpellWork 7.3.5 (26972)"; public const uint MaxLevel = 110; // ReSharper disable MemberCanBePrivate.Global @@ -37,7 +36,7 @@ public static class DBC public static Storage SpellDescriptionVariables { get; set; } public static Storage SpellDuration { get; set; } public static Storage SpellEffect { get; set; } - public static Storage SpellEffectScaling { get; set; } + //public static Storage SpellEffectScaling { get; set; } public static Storage SpellMisc { get; set; } public static Storage SpellEquippedItems { get; set; } public static Storage SpellInterrupts { get; set; } @@ -85,8 +84,9 @@ public static async void Load() try { - dbc.SetValue(dbc.GetValue(null), - Activator.CreateInstance(dbc.PropertyType, $@"{ Settings.Default.DbcPath }\{ Settings.Default.Locale }\{ name }.db2", true)); + var db2Reader = new DBReader($@"{Settings.Default.DbcPath}\{Settings.Default.Locale}\{name}.db2"); + dynamic storage = Activator.CreateInstance(dbc.PropertyType, db2Reader); + dbc.SetValue(dbc.GetValue(null), storage); } catch (DirectoryNotFoundException) { @@ -104,9 +104,9 @@ public static async void Load() await Task.WhenAll(Task.Run(() => { - foreach (var effect in SpellInfoStore.Where(effect => SpellMisc.ContainsKey(effect.Value.Spell.MiscID))) + foreach (var effect in SpellInfoStore.Where(effect => SpellMisc.ContainsKey(effect.Value.Spell.ID))) { - effect.Value.Misc = SpellMisc[effect.Value.Spell.MiscID]; + effect.Value.Misc = SpellMisc[effect.Value.Spell.ID]; if (SpellDuration.ContainsKey(effect.Value.Misc.DurationIndex)) effect.Value.DurationEntry = SpellDuration[effect.Value.Misc.DurationIndex]; @@ -116,197 +116,186 @@ await Task.WhenAll(Task.Run(() => } }), Task.Run(() => { - foreach (var effect in SpellEffect) + foreach (var effect in SpellEffect.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(effect.SpellID)) { Console.WriteLine( - $"Spell effect {effect.Value.ID} is referencing unknown spell {effect.Value.SpellID}, ignoring!"); + $"Spell effect {effect.ID} is referencing unknown spell {effect.SpellID}, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].Effects.Add(effect.Value); - SpellInfoStore[effect.Value.SpellID].SpellEffectInfoStore[effect.Value.EffectIndex] = new SpellEffectInfo(effect.Value); // Helper + SpellInfoStore[effect.SpellID].Effects.Add(effect); + SpellInfoStore[effect.SpellID].SpellEffectInfoStore[(uint)effect.EffectIndex] = new SpellEffectInfo(effect); // Helper - var triggerId = (int)effect.Value.EffectTriggerSpell; + var triggerId = (int)effect.EffectTriggerSpell; if (triggerId != 0) { if (SpellTriggerStore.ContainsKey(triggerId)) - SpellTriggerStore[triggerId].Add(effect.Value.SpellID); + SpellTriggerStore[triggerId].Add(effect.SpellID); else - SpellTriggerStore.Add(triggerId, new SortedSet { effect.Value.SpellID }); + SpellTriggerStore.Add(triggerId, new SortedSet { effect.SpellID }); } } }), Task.Run(() => { - foreach (var effect in SpellTargetRestrictions) + foreach (var effect in SpellTargetRestrictions.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(effect.SpellID)) { Console.WriteLine( - $"SpellTargetRestrictions: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellTargetRestrictions: Unknown spell {effect.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].TargetRestrictions.Add(effect.Value); + SpellInfoStore[effect.SpellID].TargetRestrictions.Add(effect); } }), Task.Run(() => { - foreach (var effect in SpellXSpellVisual.Where(effect => - effect.Value.DifficultyID == 0 && effect.Value.PlayerConditionID == 0)) + foreach (var spellXSpellVisual in SpellXSpellVisual.Where(effect => + effect.Value.DifficultyID == 0 && effect.Value.CasterPlayerConditionID == 0)) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (spellXSpellVisual.Value.DifficultyID != 0) { continue; } + + if (!SpellInfoStore.ContainsKey(spellXSpellVisual.Value.SpellID)) { Console.WriteLine( - $"SpellXSpellVisual: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellXSpellVisual: Unknown spell {spellXSpellVisual.Value.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].SpellXSpellVisual = effect.Value; + SpellInfoStore[spellXSpellVisual.Value.SpellID].SpellXSpellVisual = spellXSpellVisual.Value; } }), Task.Run(() => { - foreach (var effect in SpellScaling) + foreach (var spellScaling in SpellScaling.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellScaling.SpellID)) { Console.WriteLine( - $"SpellScaling: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellScaling: Unknown spell {spellScaling.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].Scaling = effect.Value; + SpellInfoStore[spellScaling.SpellID].Scaling = spellScaling; } }), Task.Run(() => { - foreach (var effect in SpellAuraOptions) + foreach (var spellAuraOptions in SpellAuraOptions.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellAuraOptions.SpellID)) { Console.WriteLine( - $"SpellAuraOptions: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellAuraOptions: Unknown spell {spellAuraOptions.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]; + SpellInfoStore[spellAuraOptions.SpellID].AuraOptions = spellAuraOptions; + if (spellAuraOptions.SpellProcsPerMinuteID != 0) + SpellInfoStore[spellAuraOptions.SpellID].ProcsPerMinute = SpellProcsPerMinute[spellAuraOptions.SpellProcsPerMinuteID]; } }), Task.Run(() => { - foreach (var effect in SpellAuraRestrictions) + foreach (var spellAuraRestriction in SpellAuraRestrictions.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellAuraRestriction.SpellID)) { Console.WriteLine( - $"SpellAuraRestrictions: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellAuraRestrictions: Unknown spell {spellAuraRestriction.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].AuraRestrictions = effect.Value; + SpellInfoStore[spellAuraRestriction.SpellID].AuraRestrictions = spellAuraRestriction; } }), Task.Run(() => { - foreach (var effect in SpellCategories) + foreach (var spellCategory in SpellCategories.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellCategory.SpellID)) { Console.WriteLine( - $"SpellCategories: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellCategories: Unknown spell {spellCategory.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].Categories = effect.Value; + SpellInfoStore[spellCategory.SpellID].Categories = spellCategory; } }), Task.Run(() => { - foreach (var effect in SpellCastingRequirements) + foreach (var spellCasting in SpellCastingRequirements.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellCasting.SpellID)) { Console.WriteLine( - $"SpellCastingRequirements: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellCastingRequirements: Unknown spell {spellCasting.SpellID} referenced, ignoring!"); return; } - SpellInfoStore[effect.Value.SpellID].CastingRequirements = effect.Value; + SpellInfoStore[spellCasting.SpellID].CastingRequirements = spellCasting; } }), Task.Run(() => { - foreach (var effect in SpellClassOptions) + foreach (var spellClassOptions in SpellClassOptions.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellClassOptions.SpellID)) { Console.WriteLine( - $"SpellClassOptions: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellClassOptions: Unknown spell {spellClassOptions.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].ClassOptions = effect.Value; + SpellInfoStore[spellClassOptions.SpellID].ClassOptions = spellClassOptions; } }), Task.Run(() => { - foreach (var effect in SpellCooldowns) + foreach (var spellCooldown in SpellCooldowns.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellCooldown.SpellID)) { Console.WriteLine( - $"SpellCooldowns: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellCooldowns: Unknown spell {spellCooldown.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].Cooldowns = effect.Value; + SpellInfoStore[spellCooldown.SpellID].Cooldowns = spellCooldown; } }), Task.Run(() => { - foreach (var effect in SpellEffectScaling) + foreach (var spellInterrupts in SpellInterrupts.Values) { - if (!SpellEffect.ContainsKey(effect.Value.SpellEffectId)) + if (!SpellInfoStore.ContainsKey(spellInterrupts.SpellID)) { Console.WriteLine( - $"SpellEffectScaling: Unknown spell effect {effect.Value.SpellEffectId} referenced, ignoring!"); + $"SpellInterrupts: Unknown spell {spellInterrupts.SpellID} referenced, ignoring!"); continue; } - SpellEffect[effect.Value.SpellEffectId].SpellEffectScalingEntry = effect.Value; + SpellInfoStore[spellInterrupts.SpellID].Interrupts = spellInterrupts; } }), Task.Run(() => { - foreach (var effect in SpellInterrupts) + foreach (var spellEquippedItem in SpellEquippedItems.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellEquippedItem.SpellID)) { Console.WriteLine( - $"SpellInterrupts: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellEquippedItems: Unknown spell {spellEquippedItem.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].Interrupts = effect.Value; + SpellInfoStore[spellEquippedItem.SpellID].EquippedItems = spellEquippedItem; } }), Task.Run(() => { - foreach (var effect in SpellEquippedItems) + foreach (var spellLevel in SpellLevels.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellLevel.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!"); + Console.WriteLine($"SpellLevels: Unknown spell {spellLevel.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].Levels = effect.Value; + SpellInfoStore[spellLevel.SpellID].Levels = spellLevel; } }), Task.Run(() => { @@ -323,41 +312,41 @@ await Task.WhenAll(Task.Run(() => } }), Task.Run(() => { - foreach (var reagentsCurrency in SpellReagentsCurrency) + foreach (var reagentsCurrency in SpellReagentsCurrency.Values) { - if (!SpellInfoStore.ContainsKey(reagentsCurrency.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(reagentsCurrency.SpellID)) { Console.WriteLine( - $"SpellReagentsCurrency: Unknown spell {reagentsCurrency.Value.SpellID} referenced, ignoring!"); + $"SpellReagentsCurrency: Unknown spell {reagentsCurrency.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[reagentsCurrency.Value.SpellID].ReagentsCurrency.Add(reagentsCurrency.Value); + SpellInfoStore[reagentsCurrency.SpellID].ReagentsCurrency.Add(reagentsCurrency); } }), Task.Run(() => { - foreach (var effect in SpellShapeshift) + foreach (var spellShapeShift in SpellShapeshift.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellShapeShift.SpellID)) { Console.WriteLine( - $"SpellShapeshift: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellShapeshift: Unknown spell {spellShapeShift.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].Shapeshift = effect.Value; + SpellInfoStore[spellShapeShift.SpellID].Shapeshift = spellShapeShift; } }), Task.Run(() => { - foreach (var effect in SpellTotems) + foreach (var spellTotem in SpellTotems.Values) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellTotem.SpellID)) { - Console.WriteLine($"SpellTotems: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + Console.WriteLine($"SpellTotems: Unknown spell {spellTotem.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].Totems = effect.Value; + SpellInfoStore[spellTotem.SpellID].Totems = spellTotem; } })); diff --git a/SpellWork/DBC/Structures/AreaGroupMemberEntry.cs b/SpellWork/DBC/Structures/AreaGroupMemberEntry.cs index 3b096dae..95e8c83a 100644 --- a/SpellWork/DBC/Structures/AreaGroupMemberEntry.cs +++ b/SpellWork/DBC/Structures/AreaGroupMemberEntry.cs @@ -1,8 +1,12 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class AreaGroupMemberEntry { - public ushort AreaGroupId; - public short AreaId; - } + [Index(true)] + public int ID; // $noninline,id$ID<32> + public ushort AreaID; // AreaID + public ushort AreaGroupID; // AreaGroupID + }; } diff --git a/SpellWork/DBC/Structures/AreaTableEntry.cs b/SpellWork/DBC/Structures/AreaTableEntry.cs index c4ae162d..b023aba1 100644 --- a/SpellWork/DBC/Structures/AreaTableEntry.cs +++ b/SpellWork/DBC/Structures/AreaTableEntry.cs @@ -1,29 +1,36 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class AreaTableEntry { - public uint[] Flags; - public string ZoneName; - public float AmbientMultiplier; - public string AreaName; - public ushort MapID; - public ushort ParentAreaID; - public short AreaBit; - public ushort AmbienceID; - public ushort ZoneMusic; - public ushort IntroSound; - public ushort[] LiquidTypeID; - public ushort UWZoneMusic; - public ushort UWAmbience; - public ushort PvPCombatWorldStateID; - public byte SoundProviderPref; - public byte SoundProviderPrefUnderwater; - public byte ExplorationLevel; - public byte FactionGroupMask; - public byte MountFlags; - public byte WildBattlePetLevelMin; - public byte WildBattlePetLevelMax; - public byte WindSettingsID; - public uint UWIntroSound; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public string ZoneName; // ZoneName + public string AreaName_lang; // AreaName_lang + [Cardinality(2)] + public int[] Flags = new int[2]; // Flags<32>[2] + public float Ambient_multiplier; // Ambient_multiplier + public ushort ContinentID; // ContinentID + public ushort ParentAreaID; // ParentAreaID + public short AreaBit; // AreaBit<16> + public ushort AmbienceID; // AmbienceID + public ushort ZoneMusic; // ZoneMusic + public ushort IntroSound; // IntroSound + [Cardinality(4)] + public ushort[] LiquidTypeID = new ushort[4]; // LiquidTypeID[4] + public ushort UwZoneMusic; // UwZoneMusic + public ushort UwAmbience; // UwAmbience + public short PvpCombatWorldStateID; // PvpCombatWorldStateID<16> + public byte SoundProviderPref; // SoundProviderPref + public byte SoundProviderPrefUnderwater; // SoundProviderPrefUnderwater + public sbyte ExplorationLevel; // ExplorationLevel<8> + public byte FactionGroupMask; // FactionGroupMask + public byte MountFlags; // MountFlags + public byte WildBattlePetLevelMin; // WildBattlePetLevelMin + public byte WildBattlePetLevelMax; // WildBattlePetLevelMax + public byte WindSettingsID; // WindSettingsID + public uint UwIntroSound; // UwIntroSound } } diff --git a/SpellWork/DBC/Structures/ItemEffectEntry.cs b/SpellWork/DBC/Structures/ItemEffectEntry.cs index c6af0f7d..3a8a33ce 100644 --- a/SpellWork/DBC/Structures/ItemEffectEntry.cs +++ b/SpellWork/DBC/Structures/ItemEffectEntry.cs @@ -1,15 +1,19 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class ItemEffectEntry { - public uint ItemID; - public uint SpellID; - public int Cooldown; - public int CategoryCooldown; - public short Charges; - public ushort Category; - public ushort ChrSpecializationID; - public byte OrderIndex; - public byte Trigger; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // SpellID<32> + public int CoolDownMSec; // CoolDownMSec<32> + public int CategoryCoolDownMSec; // CategoryCoolDownMSec<32> + public short Charges; // Charges<16> + public ushort SpellCategoryID; // SpellCategoryID + public ushort ChrSpecializationID; // ChrSpecializationID + public byte LegacySlotIndex; // LegacySlotIndex + public sbyte TriggerType; // TriggerType<8> + public int ParentItemID; // $noninline,relation$ParentItemID<32> } } diff --git a/SpellWork/DBC/Structures/ItemEntry.cs b/SpellWork/DBC/Structures/ItemEntry.cs index 28a611ae..b71e8a4d 100644 --- a/SpellWork/DBC/Structures/ItemEntry.cs +++ b/SpellWork/DBC/Structures/ItemEntry.cs @@ -1,14 +1,18 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class ItemEntry { - public uint FileDataID; - public byte Class; - public byte SubClass; - public sbyte SoundOverrideSubclass; - public sbyte Material; - public byte InventoryType; - public byte Sheath; - public byte GroupSoundsID; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int IconFileDataID; // IconFileDataID<32> + public byte ClassID; // ClassID + public byte SubclassID; // SubclassID + public sbyte Sound_override_subclassID; // Sound_override_subclassID<8> + public byte Material; // Material + public byte InventoryType; // InventoryType + public byte SheatheType; // SheatheType + public byte ItemGroupSoundsID; // ItemGroupSoundsID } } diff --git a/SpellWork/DBC/Structures/ItemSparseEntry.cs b/SpellWork/DBC/Structures/ItemSparseEntry.cs index 5da59685..9553ba99 100644 --- a/SpellWork/DBC/Structures/ItemSparseEntry.cs +++ b/SpellWork/DBC/Structures/ItemSparseEntry.cs @@ -1,70 +1,81 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class ItemSparseEntry { - public uint[] Flags; - public float Unk1; - public float Unk2; - public uint BuyCount; - public uint BuyPrice; - public uint SellPrice; - public int AllowableRace; - public uint RequiredSpell; - public uint MaxCount; - public uint Stackable; - public int[] ItemStatAllocation; - public float[] ItemStatSocketCostMultiplier; - public float RangedModRange; - public string Name; - public string Name2; - public string Name3; - public string Name4; - public string Description; - public uint BagFamily; - public float ArmorDamageModifier; - public uint Duration; - public float StatScalingFactor; - public ushort AllowableClass; - public ushort ItemLevel; - public ushort RequiredSkill; - public ushort RequiredSkillRank; - public ushort RequiredReputationFaction; - public short[] ItemStatValue; - public ushort ScalingStatDistribution; - public ushort Delay; - public ushort PageText; - public ushort StartQuest; - public ushort LockID; - public ushort RandomProperty; - public ushort RandomSuffix; - public ushort ItemSet; - public ushort Area; - public ushort Map; - public ushort TotemCategory; - public ushort SocketBonus; - public ushort GemProperties; - public ushort ItemLimitCategory; - public ushort HolidayID; - public ushort RequiredTransmogHolidayID; - public ushort ItemNameDescriptionID; - public byte Quality; - public byte InventoryType; - public sbyte RequiredLevel; - public byte RequiredHonorRank; - public byte RequiredCityRank; - public byte RequiredReputationRank; - public byte ContainerSlots; - public sbyte[] ItemStatType; - public byte DamageType; - public byte Bonding; - public byte LanguageID; - public byte PageMaterial; - public sbyte Material; - public byte Sheath; - public byte[] SocketColor; - public byte CurrencySubstitutionID; - public byte CurrencySubstitutionCount; - public byte ArtifactID; - public byte RequiredExpansion; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public long AllowableRace; // AllowableRace<64> + public string Display_lang; // Display_lang + public string Display1_lang; // Display1_lang + public string Display2_lang; // Display2_lang + public string Display3_lang; // Display3_lang + public string Description_lang; // Description_lang + [Cardinality(4)] + public int[] Flags = new int[4]; // Flags<32>[4] + public float PriceRandomValue; // PriceRandomValue + public float PriceVariance; // PriceVariance + public uint VendorStackCount; // VendorStackCount + public uint BuyPrice; // BuyPrice + public uint SellPrice; // SellPrice + public uint RequiredAbility; // RequiredAbility + public int MaxCount; // MaxCount<32> + public int Stackable; // Stackable<32> + [Cardinality(10)] + public int[] StatPercentEditor = new int[10]; // StatPercentEditor<32>[10] + [Cardinality(10)] + public float[] StatPercentageOfSocket = new float[10]; // StatPercentageOfSocket[10] + public int ItemRange; // ItemRange + public uint BagFamily; // BagFamily + public int QualityModifier; // QualityModifier + public uint DurationInInventory; // DurationInInventory + public float DmgVariance; // DmgVariance + public short AllowableClass; // AllowableClass<16> + public ushort ItemLevel; // ItemLevel + public ushort RequiredSkill; // RequiredSkill + public ushort RequiredSkillRank; // RequiredSkillRank + public ushort MinFactionID; // MinFactionID + [Cardinality(10)] + public short[] StatModifier_bonusAmount = new short[10]; // StatModifier_bonusAmount<16>[10] + public ushort ScalingStatDistributionID; // ScalingStatDistributionID + public ushort ItemDelay; // ItemDelay + public ushort PageID; // PageID + public ushort StartQuestID; // StartQuestID + public ushort LockID; // LockID + public ushort RandomSelect; // RandomSelect + public ushort ItemRandomSuffixGroupID; // ItemRandomSuffixGroupID + public ushort ItemSet; // ItemSet + public ushort ZoneBound; // ZoneBound + public ushort InstanceBound; // InstanceBound + public ushort TotemCategoryID; // TotemCategoryID + public ushort Socket_match_enchantment_ID; // Socket_match_enchantment_ID + public ushort Gem_properties; // Gem_properties + public ushort LimitCategory; // LimitCategory + public ushort RequiredHoliday; // RequiredHoliday + public ushort RequiredTransmogHoliday; // RequiredTransmogHoliday + public ushort ItemNameDescriptionID; // ItemNameDescriptionID + public byte OverallQualityID; // OverallQualityID + public byte InventoryType; // InventoryType + public sbyte RequiredLevel; // RequiredLevel<8> + public byte RequiredPVPRank; // RequiredPVPRank + public byte RequiredPVPMedal; // RequiredPVPMedal + public byte MinReputation; // MinReputation + public byte ContainerSlots; // ContainerSlots + [Cardinality(10)] + public sbyte[] StatModifier_bonusStat = new sbyte[10]; // StatModifier_bonusStat<8>[10] + public byte Damage_damageType; // Damage_damageType + public byte Bonding; // Bonding + public byte LanguageID; // LanguageID + public byte PageMaterialID; // PageMaterialID + public byte Material; // Material + public byte SheatheType; // SheatheType + [Cardinality(3)] + public byte[] SocketType = new byte[3]; // SocketType[3] + public byte SpellWeightCategory; // SpellWeightCategory + public byte SpellWeight; // SpellWeight + public byte ArtifactID; // ArtifactID + public byte ExpansionID; // ExpansionID } } diff --git a/SpellWork/DBC/Structures/OverrideSpellDataEntry.cs b/SpellWork/DBC/Structures/OverrideSpellDataEntry.cs index 8b4477b4..3a6f1164 100644 --- a/SpellWork/DBC/Structures/OverrideSpellDataEntry.cs +++ b/SpellWork/DBC/Structures/OverrideSpellDataEntry.cs @@ -1,9 +1,14 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class OverrideSpellDataEntry { - public uint[] Spells; - public uint PlayerActionbarFileDataID; - public byte Flags; + [Index(true)] + public int ID; // $noninline,id$ID<32> + [Cardinality(10)] + public int[] Spells = new int[10]; // Spells<32>[10] + public int PlayerActionbarFileDataID; // PlayerActionbarFileDataID<32> + public byte Flags; // Flags } } diff --git a/SpellWork/DBC/Structures/RandPropPointsEntry.cs b/SpellWork/DBC/Structures/RandPropPointsEntry.cs index 84e81773..cb756874 100644 --- a/SpellWork/DBC/Structures/RandPropPointsEntry.cs +++ b/SpellWork/DBC/Structures/RandPropPointsEntry.cs @@ -1,9 +1,16 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class RandPropPointsEntry { - public uint[] Epic; - public uint[] Superior; - public uint[] Good; + [Index(true)] + public int ID; // $noninline,id$ID<32> + [Cardinality(5)] + public uint[] Epic = new uint[5]; // Epic[5] + [Cardinality(5)] + public uint[] Superior = new uint[5]; // Superior[5] + [Cardinality(5)] + public uint[] Good = new uint[5]; // Good[5] } } diff --git a/SpellWork/DBC/Structures/ScreenEffectEntry.cs b/SpellWork/DBC/Structures/ScreenEffectEntry.cs index 2e24c904..9f8706ec 100644 --- a/SpellWork/DBC/Structures/ScreenEffectEntry.cs +++ b/SpellWork/DBC/Structures/ScreenEffectEntry.cs @@ -1,18 +1,24 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class ScreenEffectEntry { - public string Name; - public int[] field04; - public ushort field14; - public ushort field16; - public ushort field18; - public ushort field1A; - public byte field1C; - public byte field1D; - public byte field1E; - public int field1F; - public int field23; - public int field27; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public string Name; // Name + [Cardinality(4)] + public int[] Param = new int[4]; // Param<32>[4] + public ushort LightParamsID; // LightParamsID + public ushort LightParamsFadeIn; // LightParamsFadeIn + public ushort LightParamsFadeOut; // LightParamsFadeOut + public short TimeOfDayOverride; // TimeOfDayOverride<16> + public byte Effect; // Effect + public byte LightFlags; // LightFlags + public sbyte EffectMask; // EffectMask<8> + public uint FullScreenEffectID; // FullScreenEffectID + public uint SoundAmbienceID; // SoundAmbienceID + public uint ZoneMusicID; // ZoneMusicID } } diff --git a/SpellWork/DBC/Structures/SkillLineAbilityEntry.cs b/SpellWork/DBC/Structures/SkillLineAbilityEntry.cs index 1a641896..e1a24729 100644 --- a/SpellWork/DBC/Structures/SkillLineAbilityEntry.cs +++ b/SpellWork/DBC/Structures/SkillLineAbilityEntry.cs @@ -1,19 +1,23 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class SkillLineAbilityEntry { - public int SpellID; - public uint RaceMask; - public uint SupercedesSpell; - public ushort SkillLine; - public ushort MinSkillLineRank; - public ushort TrivialSkillLineRankHigh; - public ushort TrivialSkillLineRankLow; - public ushort UniqueBit; - public ushort TradeSkillCategoryID; - public byte AquireMethod; - public byte NumSkillUps; - public byte Unknown703; - public uint ClassMask; + public long RaceMask; // RaceMask<64> + [Index(true)] + public int ID; // $id$ID<32> + public int Spell; // Spell<32> + public int SupercedesSpell; // SupercedesSpell<32> + public short SkillLine; // $relation$SkillLine<16> + public short TrivialSkillLineRankHigh; // TrivialSkillLineRankHigh<16> + public short TrivialSkillLineRankLow; // TrivialSkillLineRankLow<16> + public short UniqueBit; // UniqueBit<16> + public short TradeSkillCategoryID; // TradeSkillCategoryID<16> + public sbyte NumSkillUps; // NumSkillUps<8> + public int ClassMask; // ClassMask<32> + public short MinSkillLineRank; // MinSkillLineRank<16> + public sbyte AcquireMethod; // AcquireMethod<8> + public sbyte Flags; // Flags<8> } } diff --git a/SpellWork/DBC/Structures/SkillLineEntry.cs b/SpellWork/DBC/Structures/SkillLineEntry.cs index ba85f9c2..aced4ed3 100644 --- a/SpellWork/DBC/Structures/SkillLineEntry.cs +++ b/SpellWork/DBC/Structures/SkillLineEntry.cs @@ -1,14 +1,19 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class SkillLineEntry { - public string DisplayName; - public string Description; - public string AlternateVerb; - public ushort Flags; - public byte CategoryID; - public byte CanLink; - public uint IconFileDataID; - public uint ParentSkillLineID; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public string DisplayName_lang; // DisplayName_lang + public string Description_lang; // Description_lang + public string AlternateVerb_lang; // AlternateVerb_lang + public ushort Flags; // Flags + public sbyte CategoryID; // CategoryID<8> + public sbyte CanLink; // CanLink<8> + public int SpellIconFileID; // SpellIconFileID<32> + public uint ParentSkillLineID; // ParentSkillLineID } } diff --git a/SpellWork/DBC/Structures/SpellAuraOptionsEntry.cs b/SpellWork/DBC/Structures/SpellAuraOptionsEntry.cs index a7494ecb..612f5a18 100644 --- a/SpellWork/DBC/Structures/SpellAuraOptionsEntry.cs +++ b/SpellWork/DBC/Structures/SpellAuraOptionsEntry.cs @@ -1,14 +1,19 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellAuraOptionsEntry { - public int SpellID; - public uint ProcCharges; - public uint ProcTypeMask; - public uint ProcCategoryRecovery; - public ushort CumulativeAura; - public byte DifficultyID; - public byte ProcChance; - public byte SpellProcsPerMinuteID; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int ProcCharges; // ProcCharges<32> + [Cardinality(2)] + public int[] ProcTypeMask = new int[2]; // ProcTypeMask<32>[2] + public int ProcCategoryRecovery; // ProcCategoryRecovery<32> + public ushort CumulativeAura; // CumulativeAura + public ushort SpellProcsPerMinuteID; // SpellProcsPerMinuteID + public byte DifficultyID; // DifficultyID + public byte ProcChance; // ProcChance + public int SpellID; // $noninline,relation$SpellID<32> } } diff --git a/SpellWork/DBC/Structures/SpellAuraRestrictionsEntry.cs b/SpellWork/DBC/Structures/SpellAuraRestrictionsEntry.cs index c4f3a348..7fc381fc 100644 --- a/SpellWork/DBC/Structures/SpellAuraRestrictionsEntry.cs +++ b/SpellWork/DBC/Structures/SpellAuraRestrictionsEntry.cs @@ -1,16 +1,20 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellAuraRestrictionsEntry { - public int SpellID; - public uint CasterAuraSpell; - public uint TargetAuraSpell; - public uint ExcludeCasterAuraSpell; - public uint ExcludeTargetAuraSpell; - public byte DifficultyID; - public byte CasterAuraState; - public byte TargetAuraState; - public byte ExcludeCasterAuraState; - public byte ExcludeTargetAuraState; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int CasterAuraSpell; // CasterAuraSpell<32> + public int TargetAuraSpell; // TargetAuraSpell<32> + public int ExcludeCasterAuraSpell; // ExcludeCasterAuraSpell<32> + public int ExcludeTargetAuraSpell; // ExcludeTargetAuraSpell<32> + public byte DifficultyID; // DifficultyID + public byte CasterAuraState; // CasterAuraState + public byte TargetAuraState; // TargetAuraState + public byte ExcludeCasterAuraState; // ExcludeCasterAuraState + public byte ExcludeTargetAuraState; // ExcludeTargetAuraState + public int SpellID; // $noninline,relation$SpellID<32> } } diff --git a/SpellWork/DBC/Structures/SpellCastTimesEntry.cs b/SpellWork/DBC/Structures/SpellCastTimesEntry.cs index d37aa276..2e0391dc 100644 --- a/SpellWork/DBC/Structures/SpellCastTimesEntry.cs +++ b/SpellWork/DBC/Structures/SpellCastTimesEntry.cs @@ -1,9 +1,13 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellCastTimesEntry { - public int CastTime; - public int MinCastTime; - public short CastTimePerLevel; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int Base; // Base<32> + public int Minimum; // Minimum<32> + public short PerLevel; // PerLevel<16> } } diff --git a/SpellWork/DBC/Structures/SpellCastingRequirementsEntry.cs b/SpellWork/DBC/Structures/SpellCastingRequirementsEntry.cs index a83995e3..e83aa508 100644 --- a/SpellWork/DBC/Structures/SpellCastingRequirementsEntry.cs +++ b/SpellWork/DBC/Structures/SpellCastingRequirementsEntry.cs @@ -1,13 +1,17 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellCastingRequirementsEntry { - public int SpellID; - public ushort MinFactionID; - public ushort RequiredAreasID; - public ushort RequiresSpellFocus; - public byte FacingCasterFlags; - public byte MinReputation; - public byte RequiredAuraVision; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // SpellID<32> + public ushort MinFactionID; // MinFactionID + public ushort RequiredAreasID; // RequiredAreasID + public ushort RequiresSpellFocus; // RequiresSpellFocus + public byte FacingCasterFlags; // FacingCasterFlags + public sbyte MinReputation; // MinReputation<8> + public byte RequiredAuraVision; // RequiredAuraVision } } diff --git a/SpellWork/DBC/Structures/SpellCategoriesEntry.cs b/SpellWork/DBC/Structures/SpellCategoriesEntry.cs index 980c629c..6e15dfde 100644 --- a/SpellWork/DBC/Structures/SpellCategoriesEntry.cs +++ b/SpellWork/DBC/Structures/SpellCategoriesEntry.cs @@ -1,15 +1,19 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellCategoriesEntry { - public int SpellID; - public ushort Category; - public ushort StartRecoveryCategory; - public ushort ChargeCategory; - public byte DifficultyID; - public byte DefenseType; - public byte DispelType; - public byte Mechanic; - public byte PreventionType; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public short Category; // Category<16> + public short StartRecoveryCategory; // StartRecoveryCategory<16> + public short ChargeCategory; // ChargeCategory<16> + public byte DifficultyID; // DifficultyID + public sbyte DefenseType; // DefenseType<8> + public sbyte DispelType; // DispelType<8> + public sbyte Mechanic; // Mechanic<8> + public sbyte PreventionType; // PreventionType<8> + public int SpellID; // $noninline,relation$SpellID<32> } } diff --git a/SpellWork/DBC/Structures/SpellClassOptionsEntry.cs b/SpellWork/DBC/Structures/SpellClassOptionsEntry.cs index 185687db..c3e146e2 100644 --- a/SpellWork/DBC/Structures/SpellClassOptionsEntry.cs +++ b/SpellWork/DBC/Structures/SpellClassOptionsEntry.cs @@ -1,10 +1,15 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellClassOptionsEntry { - public int SpellID; - public uint[] SpellFamilyFlags; - public byte SpellClassSet; - public uint ModalNextSpell; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // SpellID<32> + [Cardinality(4)] + public int[] SpellClassMask = new int[4]; // SpellClassMask<32>[4] + public byte SpellClassSet; // SpellClassSet + public uint ModalNextSpell; // ModalNextSpell } } diff --git a/SpellWork/DBC/Structures/SpellCooldownsEntry.cs b/SpellWork/DBC/Structures/SpellCooldownsEntry.cs index d6f4c122..96bbf87f 100644 --- a/SpellWork/DBC/Structures/SpellCooldownsEntry.cs +++ b/SpellWork/DBC/Structures/SpellCooldownsEntry.cs @@ -1,11 +1,15 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellCooldownsEntry { - public int SpellID; - public uint CategoryRecoveryTime; - public uint RecoveryTime; - public uint StartRecoveryTime; - public byte DifficultyID; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int CategoryRecoveryTime; // CategoryRecoveryTime<32> + public int RecoveryTime; // RecoveryTime<32> + public int StartRecoveryTime; // StartRecoveryTime<32> + public byte DifficultyID; // DifficultyID + public int SpellID; // SpellID<32> } } diff --git a/SpellWork/DBC/Structures/SpellDescriptionVariablesEntry.cs b/SpellWork/DBC/Structures/SpellDescriptionVariablesEntry.cs index b1dd67ad..5f46d64d 100644 --- a/SpellWork/DBC/Structures/SpellDescriptionVariablesEntry.cs +++ b/SpellWork/DBC/Structures/SpellDescriptionVariablesEntry.cs @@ -1,7 +1,11 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class SpellDescriptionVariablesEntry { + [Index(true)] + public int ID; public string Variables; } } diff --git a/SpellWork/DBC/Structures/SpellDurationEntry.cs b/SpellWork/DBC/Structures/SpellDurationEntry.cs index 65b2080b..09e74f55 100644 --- a/SpellWork/DBC/Structures/SpellDurationEntry.cs +++ b/SpellWork/DBC/Structures/SpellDurationEntry.cs @@ -1,9 +1,13 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class SpellDurationEntry { - public int Duration; - public int MaxDuration; - public int DurationPerLevel; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int Duration; // Duration<32> + public int MaxDuration; // MaxDuration<32> + public uint DurationPerLevel; // DurationPerLevel } } diff --git a/SpellWork/DBC/Structures/SpellEffectEntry.cs b/SpellWork/DBC/Structures/SpellEffectEntry.cs index af58aa21..b5646c2c 100644 --- a/SpellWork/DBC/Structures/SpellEffectEntry.cs +++ b/SpellWork/DBC/Structures/SpellEffectEntry.cs @@ -1,40 +1,47 @@ -using System.Runtime.InteropServices; +using DBFileReaderLib.Attributes; +using System.Runtime.InteropServices; +using System.Security.Policy; namespace SpellWork.DBC.Structures { [StructLayout(LayoutKind.Sequential)] public class SpellEffectEntry { - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] - public uint[] EffectSpellClassMask; - public uint ID; - public int SpellID; - public uint Effect; - public uint EffectAura; - public int EffectBasePoints; - public uint EffectIndex; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] - public int[] EffectMiscValues; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] - public uint[] EffectRadiusIndex; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] - public uint[] ImplicitTarget; - public uint DifficultyID; - public float EffectAmplitude; - public uint EffectAuraPeriod; - public float EffectBonusCoefficient; - public float EffectChainAmplitude; - public uint EffectChainTargets; - public int EffectDieSides; - public uint EffectItemType; - public uint EffectMechanic; - public float EffectPointsPerResource; - public float EffectRealPointsPerLevel; - public uint EffectTriggerSpell; - public float EffectPosFacing; - public uint EffectAttributes; - public float BonusCoefficientFromAP; - public float PvPMultiplier; + [Index(false)] + public int ID; // $id$ID<32> + public uint Effect; // Effect + public int EffectBasePoints; // EffectBasePoints<32> + public int EffectIndex; // EffectIndex<32> + public int EffectAura; // EffectAura<32> + public int DifficultyID; // DifficultyID<32> + public float EffectAmplitude; // EffectAmplitude + public int EffectAuraPeriod; // EffectAuraPeriod<32> + public float EffectBonusCoefficient; // EffectBonusCoefficient + public float EffectChainAmplitude; // EffectChainAmplitude + public int EffectChainTargets; // EffectChainTargets<32> + public int EffectDieSides; // EffectDieSides<32> + public int EffectItemType; // EffectItemType<32> + public int EffectMechanic; // EffectMechanic<32> + public float EffectPointsPerResource; // EffectPointsPerResource + public float EffectRealPointsPerLevel; // EffectRealPointsPerLevel + public int EffectTriggerSpell; // EffectTriggerSpell<32> + public float EffectPos_facing; // EffectPos_facing + public int EffectAttributes; // EffectAttributes<32> + public float BonusCoefficientFromAP; // BonusCoefficientFromAP + public float PvpMultiplier; // PvpMultiplier + public float Coefficient; // Coefficient + public float Variance; // Variance + public float ResourceCoefficient; // ResourceCoefficient + public float GroupSizeBasePointsCoefficient; // GroupSizeBasePointsCoefficient + [Cardinality(4)] + public int[] EffectSpellClassMask = new int[4]; // EffectSpellClassMask<32>[4] + [Cardinality(2)] + public int[] EffectMiscValue = new int[2]; // EffectMiscValue<32>[2] + [Cardinality(2)] + public uint[] EffectRadiusIndex = new uint[2]; // EffectRadiusIndex[2] + [Cardinality(2)] + public uint[] ImplicitTarget = new uint[2]; // ImplicitTarget[2] + public int SpellID; // $noninline,relation$SpellID<32> public SpellEffectScalingEntry SpellEffectScalingEntry { get; set; } @@ -46,7 +53,7 @@ public string MaxRadius return string.Empty; return $"Max Radius (Id {EffectRadiusIndex[1]}) {DBC.SpellRadius[(int)EffectRadiusIndex[1]].Radius:F}" + - $" (Min: {DBC.SpellRadius[(int)EffectRadiusIndex[1]].RadiusMin:F} Max: {DBC.SpellRadius[(int)EffectRadiusIndex[1]].MaxRadius:F})"; + $" (Min: {DBC.SpellRadius[(int)EffectRadiusIndex[1]].RadiusMin:F} Max: {DBC.SpellRadius[(int)EffectRadiusIndex[1]].RadiusMax:F})"; } } @@ -58,7 +65,7 @@ public string Radius return string.Empty; return $"Radius (Id {EffectRadiusIndex[0]}) {DBC.SpellRadius[(int)EffectRadiusIndex[0]].Radius:F}" + - $" (Min: {DBC.SpellRadius[(int)EffectRadiusIndex[0]].RadiusMin:F} Max: {DBC.SpellRadius[(int)EffectRadiusIndex[0]].MaxRadius:F})"; + $" (Min: {DBC.SpellRadius[(int)EffectRadiusIndex[0]].RadiusMin:F} Max: {DBC.SpellRadius[(int)EffectRadiusIndex[0]].RadiusMax:F})"; } } } diff --git a/SpellWork/DBC/Structures/SpellEffectScalingEntry.cs b/SpellWork/DBC/Structures/SpellEffectScalingEntry.cs index 8c08aa00..a153623a 100644 --- a/SpellWork/DBC/Structures/SpellEffectScalingEntry.cs +++ b/SpellWork/DBC/Structures/SpellEffectScalingEntry.cs @@ -1,10 +1,15 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public class SpellEffectScalingEntry { - public float Coefficient; - public float Variance; - public float ResourceCoefficient; - public int SpellEffectId; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public float Coefficient; // Coefficient + public float Variance; // Variance + public float ResourceCoefficient; // ResourceCoefficient + public int SpellEffectID; // SpellEffectID<32> } } diff --git a/SpellWork/DBC/Structures/SpellEntry.cs b/SpellWork/DBC/Structures/SpellEntry.cs index 8f579750..d8e291a8 100644 --- a/SpellWork/DBC/Structures/SpellEntry.cs +++ b/SpellWork/DBC/Structures/SpellEntry.cs @@ -1,14 +1,16 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class SpellEntry { - public string Name; - public string NameSubtext; - public string Description; - public string AuraDescription; - public int MiscID; - public int ID; - public int DescriptionVariablesID; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public string Name_lang; // Name_lang + public string NameSubtext_lang; // NameSubtext_lang + public string Description_lang; // Description_lang + public string AuraDescription_lang; // AuraDescription_lang /*public List SpellPowerList { diff --git a/SpellWork/DBC/Structures/SpellEquippedItemsEntry.cs b/SpellWork/DBC/Structures/SpellEquippedItemsEntry.cs index c087d41a..5f531297 100644 --- a/SpellWork/DBC/Structures/SpellEquippedItemsEntry.cs +++ b/SpellWork/DBC/Structures/SpellEquippedItemsEntry.cs @@ -1,10 +1,14 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellEquippedItemsEntry { - public int SpellID; - public uint EquippedItemInventoryTypeMask; - public uint EquippedItemSubClassMask; - public byte EquippedItemClass; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // SpellID<32> + public int EquippedItemInvTypes; // EquippedItemInvTypes<32> + public int EquippedItemSubclass; // EquippedItemSubclass<32> + public sbyte EquippedItemClass; // EquippedItemClass<8> } } diff --git a/SpellWork/DBC/Structures/SpellInterruptsEntry.cs b/SpellWork/DBC/Structures/SpellInterruptsEntry.cs index 23371cbe..ecce37a6 100644 --- a/SpellWork/DBC/Structures/SpellInterruptsEntry.cs +++ b/SpellWork/DBC/Structures/SpellInterruptsEntry.cs @@ -1,11 +1,18 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellInterruptsEntry { - public int SpellID; - public uint[] AuraInterruptFlags; - public uint[] ChannelInterruptFlags; - public ushort InterruptFlags; - public byte Difficulty; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public byte DifficultyID; // DifficultyID + public short InterruptFlags; // InterruptFlags<16> + [Cardinality(2)] + public int[] AuraInterruptFlags = new int[2]; // AuraInterruptFlags<32>[2] + [Cardinality(2)] + public int[] ChannelInterruptFlags = new int[2]; // ChannelInterruptFlags<32>[2] + public int SpellID; // SpellID<32> + } } diff --git a/SpellWork/DBC/Structures/SpellLevelsEntry.cs b/SpellWork/DBC/Structures/SpellLevelsEntry.cs index 0918e701..bd800515 100644 --- a/SpellWork/DBC/Structures/SpellLevelsEntry.cs +++ b/SpellWork/DBC/Structures/SpellLevelsEntry.cs @@ -1,12 +1,16 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellLevelsEntry { - public int SpellID; - public ushort BaseLevel; - public ushort MaxLevel; - public ushort SpellLevel; - public byte Difficulty; - public byte MaxUsableLevel; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public short BaseLevel; // BaseLevel<16> + public short MaxLevel; // MaxLevel<16> + public short SpellLevel; // SpellLevel<16> + public byte DifficultyID; // DifficultyID + public byte MaxPassiveAuraLevel; // MaxPassiveAuraLevel + public int SpellID; // $noninline,relation$SpellID<32> } } diff --git a/SpellWork/DBC/Structures/SpellMiscEntry.cs b/SpellWork/DBC/Structures/SpellMiscEntry.cs index c7c0fd34..3ad4ea95 100644 --- a/SpellWork/DBC/Structures/SpellMiscEntry.cs +++ b/SpellWork/DBC/Structures/SpellMiscEntry.cs @@ -1,15 +1,22 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellMiscEntry { - public uint[] Attributes; - public float Speed; - public float MultistrikeSpeedMod; + [Index(true)] + public int ID; public ushort CastingTimeIndex; public ushort DurationIndex; public ushort RangeIndex; public byte SchoolMask; - public uint IconFileDataID; - public uint ActiveIconFileDataID; + public int SpellIconFileDataID; + public float Speed; + public int ActiveIconFileDataID; + public float LaunchDelay; + public byte DifficultyID; + [Cardinality(14)] + public int[] Attributes = new int[14]; + public int SpellID; } } diff --git a/SpellWork/DBC/Structures/SpellMissileEntry.cs b/SpellWork/DBC/Structures/SpellMissileEntry.cs index ef2b08cd..201d497a 100644 --- a/SpellWork/DBC/Structures/SpellMissileEntry.cs +++ b/SpellWork/DBC/Structures/SpellMissileEntry.cs @@ -1,21 +1,26 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class SpellMissileEntry { - public uint Flags; - public float DefaultPitchMin; - public float DefaultPitchMax; - public float DefaultSpeedMin; - public float DefaultSpeedMax; - public float RandomizeFacingMin; - public float RandomizeFacingMax; - public float RandomizePitchMin; - public float RandomizePitchMax; - public float RandomizeSpeedMin; - public float RandomizeSpeedMax; - public float Gravity; - public float MaxDuration; - public float CollisionRadius; - public byte UnkLegion; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // SpellID<32> + public float DefaultPitchMin; // DefaultPitchMin + public float DefaultPitchMax; // DefaultPitchMax + public float DefaultSpeedMin; // DefaultSpeedMin + public float DefaultSpeedMax; // DefaultSpeedMax + public float RandomizeFacingMin; // RandomizeFacingMin + public float RandomizeFacingMax; // RandomizeFacingMax + public float RandomizePitchMin; // RandomizePitchMin + public float RandomizePitchMax; // RandomizePitchMax + public float RandomizeSpeedMin; // RandomizeSpeedMin + public float RandomizeSpeedMax; // RandomizeSpeedMax + public float Gravity; // Gravity + public float MaxDuration; // MaxDuration + public float CollisionRadius; // CollisionRadius + public byte Flags; // Flags } } diff --git a/SpellWork/DBC/Structures/SpellMissileMotionEntry.cs b/SpellWork/DBC/Structures/SpellMissileMotionEntry.cs index c7469c1d..5ba2ee50 100644 --- a/SpellWork/DBC/Structures/SpellMissileMotionEntry.cs +++ b/SpellWork/DBC/Structures/SpellMissileMotionEntry.cs @@ -1,10 +1,15 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class SpellMissileMotionEntry { - public string Name; - public string Script; - public byte Flags; - public byte MissileCount; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public string Name; // Name + public string ScriptBody; // ScriptBody + public byte Flags; // Flags + public byte MissileCount; // MissileCount } } diff --git a/SpellWork/DBC/Structures/SpellPowerEntry.cs b/SpellWork/DBC/Structures/SpellPowerEntry.cs index 0699dc67..4ed16522 100644 --- a/SpellWork/DBC/Structures/SpellPowerEntry.cs +++ b/SpellWork/DBC/Structures/SpellPowerEntry.cs @@ -1,21 +1,24 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class SpellPowerEntry { - public uint SpellID; - public uint ManaCost; - public float ManaCostPercentage; - public float ManaCostPercentagePerSecond; - public uint RequiredAura; - public float HealthCostPercentage; - public byte PowerIndex; - public byte PowerType; - public uint ID; - public uint ManaCostPerLevel; - public uint ManaCostPerSecond; - public uint ManaCostAdditional; // Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource - // only SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE, SPELL_EFFECT_WEAPON_DAMAGE, SPELL_EFFECT_NORMALIZED_WEAPON_DMG - public uint PowerDisplayID; - public uint UnitPowerBarID; + public int ManaCost; // ManaCost<32> + public float PowerCostPct; // PowerCostPct + public float PowerPctPerSecond; // PowerPctPerSecond + public int RequiredAuraSpellID; // RequiredAuraSpellID<32> + public float PowerCostMaxPct; // PowerCostMaxPct + public byte OrderIndex; // OrderIndex + public sbyte PowerType; // PowerType<8> + [Index(false)] + public int ID; // $id$ID<32> + public int ManaCostPerLevel; // ManaCostPerLevel<32> + public int ManaPerSecond; // ManaPerSecond<32> + public uint OptionalCost; // OptionalCost + public uint PowerDisplayID; // PowerDisplayID + public int AltPowerBarID; // AltPowerBarID<32> + public int SpellID; // $noninline,relation$SpellID<32> } } diff --git a/SpellWork/DBC/Structures/SpellProcsPerMinuteEntry.cs b/SpellWork/DBC/Structures/SpellProcsPerMinuteEntry.cs index c929d227..a0f88a87 100644 --- a/SpellWork/DBC/Structures/SpellProcsPerMinuteEntry.cs +++ b/SpellWork/DBC/Structures/SpellProcsPerMinuteEntry.cs @@ -1,8 +1,13 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public class SpellProcsPerMinuteEntry { - public float BaseProcRate; - public byte Flags; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public float BaseProcRate; // BaseProcRate + public byte Flags; // Flags } } diff --git a/SpellWork/DBC/Structures/SpellRadiusEntry.cs b/SpellWork/DBC/Structures/SpellRadiusEntry.cs index 48184752..0da9ad6c 100644 --- a/SpellWork/DBC/Structures/SpellRadiusEntry.cs +++ b/SpellWork/DBC/Structures/SpellRadiusEntry.cs @@ -1,10 +1,14 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class SpellRadiusEntry { + [Index(true)] + public int ID; public float Radius; public float RadiusPerLevel; public float RadiusMin; - public float MaxRadius; + public float RadiusMax; } } diff --git a/SpellWork/DBC/Structures/SpellRangeEntry.cs b/SpellWork/DBC/Structures/SpellRangeEntry.cs index 8af25a0b..cc882df3 100644 --- a/SpellWork/DBC/Structures/SpellRangeEntry.cs +++ b/SpellWork/DBC/Structures/SpellRangeEntry.cs @@ -1,11 +1,17 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public sealed class SpellRangeEntry { - public float[] MinRange; - public float[] MaxRange; + [Index(true)] + public int ID; public string DisplayName; public string DisplayNameShort; + [Cardinality(2)] + public float[] MinRange; + [Cardinality(2)] + public float[] MaxRange; public byte Flags; } } diff --git a/SpellWork/DBC/Structures/SpellReagentsCurrencyEntry.cs b/SpellWork/DBC/Structures/SpellReagentsCurrencyEntry.cs index 4183bca8..0dcefdf5 100644 --- a/SpellWork/DBC/Structures/SpellReagentsCurrencyEntry.cs +++ b/SpellWork/DBC/Structures/SpellReagentsCurrencyEntry.cs @@ -1,9 +1,13 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellReagentsCurrencyEntry { - public int SpellID; - public ushort CurrencyTypeID; - public ushort CurrencyCount; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // $relation$SpellID<32> + public ushort CurrencyTypesID; // CurrencyTypesID + public ushort CurrencyCount; // CurrencyCount } } diff --git a/SpellWork/DBC/Structures/SpellReagentsEntry.cs b/SpellWork/DBC/Structures/SpellReagentsEntry.cs index efb02c2a..e860b5dc 100644 --- a/SpellWork/DBC/Structures/SpellReagentsEntry.cs +++ b/SpellWork/DBC/Structures/SpellReagentsEntry.cs @@ -1,12 +1,16 @@ -using System.Runtime.InteropServices; +using DBFileReaderLib.Attributes; +using System.Runtime.InteropServices; namespace SpellWork.DBC.Structures { public class SpellReagentsEntry { - public int SpellID; - public uint[] Reagent; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] - public ushort[] ReagentCount; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // SpellID<32> + [Cardinality(8)] + public int[] Reagent = new int[8]; // Reagent<32>[8] + [Cardinality(8)] + public short[] ReagentCount = new short[8]; // ReagentCount<16>[8] } } diff --git a/SpellWork/DBC/Structures/SpellScalingEntry.cs b/SpellWork/DBC/Structures/SpellScalingEntry.cs index 268d9401..1764d32e 100644 --- a/SpellWork/DBC/Structures/SpellScalingEntry.cs +++ b/SpellWork/DBC/Structures/SpellScalingEntry.cs @@ -1,11 +1,15 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellScalingEntry { - public int SpellID; - public ushort ScalesFromItemLevel; - public int ScalingClass; - public uint MinScalingLevel; - public uint MaxScalingLevel; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // SpellID<32> + public short ScalesFromItemLevel; // ScalesFromItemLevel<16> + public int Class; // Class<32> + public uint MinScalingLevel; // MinScalingLevel + public uint MaxScalingLevel; // MaxScalingLevel } } diff --git a/SpellWork/DBC/Structures/SpellShapeshiftEntry.cs b/SpellWork/DBC/Structures/SpellShapeshiftEntry.cs index 41aa6db7..60999376 100644 --- a/SpellWork/DBC/Structures/SpellShapeshiftEntry.cs +++ b/SpellWork/DBC/Structures/SpellShapeshiftEntry.cs @@ -1,10 +1,16 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; + +namespace SpellWork.DBC.Structures { public class SpellShapeshiftEntry { - public int SpellID; - public uint[] ShapeshiftExclude; - public uint[] ShapeshiftMask; - public int StanceBarOrder; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // SpellID<32> + [Cardinality(2)] + public int[] ShapeshiftExclude = new int[2]; // ShapeshiftExclude<32>[2] + [Cardinality(2)] + public int[] ShapeshiftMask = new int[2]; // ShapeshiftMask<32>[2] + public sbyte StanceBarOrder; // StanceBarOrder<8> } } diff --git a/SpellWork/DBC/Structures/SpellTargetRestrictionsEntry.cs b/SpellWork/DBC/Structures/SpellTargetRestrictionsEntry.cs index f6f7c6af..5c7aa2a9 100644 --- a/SpellWork/DBC/Structures/SpellTargetRestrictionsEntry.cs +++ b/SpellWork/DBC/Structures/SpellTargetRestrictionsEntry.cs @@ -1,14 +1,19 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class SpellTargetRestrictionsEntry { - public int SpellID; - public float ConeAngle; - public float Width; - public uint Targets; - public ushort TargetCreatureType; - public byte DifficultyID; - public byte MaxAffectedTargets; - public uint MaxTargetLevel; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public float ConeDegrees; // ConeDegrees + public float Width; // Width + public int Targets; // Targets<32> + public short TargetCreatureType; // TargetCreatureType<16> + public byte DifficultyID; // DifficultyID + public byte MaxTargets; // MaxTargets + public uint MaxTargetLevel; // MaxTargetLevel + public int SpellID; // $noninline,relation$SpellID<32> } } diff --git a/SpellWork/DBC/Structures/SpellTotemsEntry.cs b/SpellWork/DBC/Structures/SpellTotemsEntry.cs index 82718b93..5a0632b8 100644 --- a/SpellWork/DBC/Structures/SpellTotemsEntry.cs +++ b/SpellWork/DBC/Structures/SpellTotemsEntry.cs @@ -1,12 +1,16 @@ -using System.Runtime.InteropServices; +using DBFileReaderLib.Attributes; +using System.Runtime.InteropServices; namespace SpellWork.DBC.Structures { public class SpellTotemsEntry { - public int SpellID; - public uint[] Totem; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] - public ushort[] RequiredTotemCategoryID; + [Index(true)] + public int ID; // $noninline,id$ID<32> + public int SpellID; // SpellID<32> + [Cardinality(2)] + public int[] Totem = new int[2]; // Totem<32>[2] + [Cardinality(2)] + public ushort[] RequiredTotemCategoryID = new ushort[2]; // RequiredTotemCategoryID[2] } } diff --git a/SpellWork/DBC/Structures/SpellVisualEntry.cs b/SpellWork/DBC/Structures/SpellVisualEntry.cs index c44c88f9..4a88b5c3 100644 --- a/SpellWork/DBC/Structures/SpellVisualEntry.cs +++ b/SpellWork/DBC/Structures/SpellVisualEntry.cs @@ -1,37 +1,27 @@ -namespace SpellWork.DBC.Structures +using DBFileReaderLib.Attributes; +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class SpellVisualEntry { - public uint ID; - public uint UnkMoP1; - public uint PrecastKit; - public uint CastingKit; - public uint ImpactKit; - public uint StateKit; - public uint StateDoneKit; - public uint ChannelKit; - public uint UnkMoP2; - public uint MissileModel; - public uint Flags; - public uint CasterImpactKit; - public uint TargetImpactKit; - public int MissileMotionId; - public uint MissileTargetingKit; - public uint UnkMoP3; - public uint InstantAreaKit; - public uint ImpactAreaKit; - public uint PersistentAreaKit; - public float MissileCastOffsetX; - public float MissileCastOffsetY; - public float MissileCastOffsetZ; - public float MissileImpactOffsetX; - public float MissileImpactOffsetY; - public float MissileImpactOffsetZ; - public uint UnkCata1; - public uint Id; - public uint UnkMoP4; - public uint UnkMoP5; - public uint UnkMoP6; - public uint MissileGroupingId; + [Index(true)] + public int ID; // $noninline,id$ID<32> + [Cardinality(3)] + public float[] MissileCastOffset = new float[3]; // MissileCastOffset[3] + [Cardinality(3)] + public float[] MissileImpactOffset = new float[3]; // MissileImpactOffset[3] + public int Flags; // Flags<32> + public ushort SpellVisualMissileSetID; // SpellVisualMissileSetID + public sbyte MissileDestinationAttachment; // MissileDestinationAttachment<8> + public sbyte MissileAttachment; // MissileAttachment<8> + public uint MissileCastPositionerID; // MissileCastPositionerID + public uint MissileImpactPositionerID; // MissileImpactPositionerID + public int MissileTargetingKit; // MissileTargetingKit<32> + public uint AnimEventSoundID; // AnimEventSoundID + public ushort DamageNumberDelay; // DamageNumberDelay + public uint HostileSpellVisualID; // HostileSpellVisualID + public uint CasterSpellVisualID; // CasterSpellVisualID + public uint LowViolenceSpellVisualID; // LowViolenceSpellVisualID } } diff --git a/SpellWork/DBC/Structures/SpellXSpellVisualEntry.cs b/SpellWork/DBC/Structures/SpellXSpellVisualEntry.cs index ce62879e..f0c22e1f 100644 --- a/SpellWork/DBC/Structures/SpellXSpellVisualEntry.cs +++ b/SpellWork/DBC/Structures/SpellXSpellVisualEntry.cs @@ -1,19 +1,20 @@ -namespace SpellWork.DBC.Structures +using System.Security.Policy; + +namespace SpellWork.DBC.Structures { public sealed class SpellXSpellVisualEntry { - public int SpellID; - public uint SpellVisualID; - public uint ID; - public float Chance; - public ushort CasterPlayerConditionID; - public ushort CasterUnitConditionID; - public ushort PlayerConditionID; - public ushort UnitConditionID; - public uint IconFileDataID; - public uint ActiveIconFileDataID; - public byte Flags; - public byte DifficultyID; - public byte Priority; + public uint SpellVisualID; // SpellVisualID + public float Probability; // Probability + public ushort CasterPlayerConditionID; // CasterPlayerConditionID + public ushort CasterUnitConditionID; // CasterUnitConditionID + public ushort ViewerPlayerConditionID; // ViewerPlayerConditionID + public ushort ViewerUnitConditionID; // ViewerUnitConditionID + public int SpellIconFileID; // SpellIconFileID<32> + public int ActiveIconFileID; // ActiveIconFileID<32> + public byte Flags; // Flags + public byte DifficultyID; // DifficultyID + public byte Priority; // Priority + public int SpellID; // $noninline,relation$SpellID<32> } } diff --git a/SpellWork/Forms/FormMain.cs b/SpellWork/Forms/FormMain.cs index 401e343f..d553494b 100644 --- a/SpellWork/Forms/FormMain.cs +++ b/SpellWork/Forms/FormMain.cs @@ -423,7 +423,7 @@ private void FamilyTreeAfterCheck(object sender, TreeViewEventArgs e) where spell.SpellFamilyName == ProcInfo.SpellProc.SpellFamilyName && spell.SpellFamilyFlags.ContainsElement(mask) - join sk in DBC.DBC.SkillLineAbility.Values on spell.ID equals sk.SpellID into temp1 + join sk in DBC.DBC.SkillLineAbility.Values on spell.ID equals sk.Spell into temp1 from skill in temp1.DefaultIfEmpty(new SkillLineAbilityEntry()) join skl in DBC.DBC.SkillLine on skill.SkillLine equals skl.Key into temp2 from SkillLine in temp2.DefaultIfEmpty() diff --git a/SpellWork/Properties/Resources.Designer.cs b/SpellWork/Properties/Resources.Designer.cs index 5853c0d4..8413b602 100644 --- a/SpellWork/Properties/Resources.Designer.cs +++ b/SpellWork/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace SpellWork.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { diff --git a/SpellWork/Properties/Settings.Designer.cs b/SpellWork/Properties/Settings.Designer.cs index 3a425ca8..a39ce870 100644 --- a/SpellWork/Properties/Settings.Designer.cs +++ b/SpellWork/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace SpellWork.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.8.0.0")] public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -118,18 +118,15 @@ public string GtPath { this["GtPath"] = value; } } - + [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("enUS")] - public string Locale - { - get - { + public string Locale { + get { return ((string)(this["Locale"])); } - set - { + set { this["Locale"] = value; } } diff --git a/SpellWork/Properties/Settings.settings b/SpellWork/Properties/Settings.settings index b3bb84f4..4faf2dca 100644 --- a/SpellWork/Properties/Settings.settings +++ b/SpellWork/Properties/Settings.settings @@ -26,5 +26,8 @@ gt + + enUS + \ No newline at end of file diff --git a/SpellWork/Spell/ProcInfo.cs b/SpellWork/Spell/ProcInfo.cs index bfeab378..6a209b76 100644 --- a/SpellWork/Spell/ProcInfo.cs +++ b/SpellWork/Spell/ProcInfo.cs @@ -19,7 +19,7 @@ public static void Fill(TreeView familyTree, SpellFamilyNames spellfamily) var spells = from spell in DBC.DBC.SpellInfoStore.Values where spell.SpellFamilyName == (uint)spellfamily - join sk in DBC.DBC.SkillLineAbility.Values on spell.ID equals sk.SpellID into temp1 + join sk in DBC.DBC.SkillLineAbility.Values on spell.ID equals sk.Spell into temp1 from skill in temp1.DefaultIfEmpty(new SkillLineAbilityEntry()) join skl in DBC.DBC.SkillLine on skill.SkillLine equals skl.Key into temp2 @@ -69,11 +69,11 @@ from skillLine in temp2.DefaultIfEmpty() if (isSkill) { - name.AppendFormat("(Skill: ({0}) {1}) ", elem.SkillLine, elem.skillLine.DisplayName); + name.AppendFormat("(Skill: ({0}) {1}) ", elem.SkillLine, elem.skillLine.DisplayName_lang); toolTip.AppendLine(); - toolTip.AppendFormatLine("Skill Name: {0}", elem.skillLine.DisplayName); - toolTip.AppendFormatLine("Description: {0}", elem.skillLine.Description); + toolTip.AppendFormatLine("Skill Name: {0}", elem.skillLine.DisplayName_lang); + toolTip.AppendFormatLine("Description: {0}", elem.skillLine.Description_lang); } name.AppendFormat("({0})", ((SpellSchoolMask)spell.SchoolMask).ToString().NormalizeString("MASK_")); diff --git a/SpellWork/Spell/SpellInfo.cs b/SpellWork/Spell/SpellInfo.cs index 383c333e..79700b13 100644 --- a/SpellWork/Spell/SpellInfo.cs +++ b/SpellWork/Spell/SpellInfo.cs @@ -45,38 +45,38 @@ public class SpellInfo #region SpellDuration public int Duration => DurationEntry?.Duration ?? 0; - public int DurationPerLevel => DurationEntry?.DurationPerLevel ?? 0; + public uint DurationPerLevel => DurationEntry?.DurationPerLevel ?? 0; public int MaxDuration => DurationEntry?.MaxDuration ?? 0; #endregion #region Spell public int ID => Spell.ID; - public string Name => Spell.Name; - public string Description => Spell.Description; - public string Tooltip => Spell.AuraDescription; - public int MiscID => Spell.MiscID; + public string Name => Spell.Name_lang; + public string Description => Spell.Description_lang; + public string Tooltip => Spell.AuraDescription_lang; + public int MiscID => Spell.ID; #endregion #region SpellMisc // SpellMisc - public uint Attributes => Misc?.Attributes[0] ?? 0; - public uint AttributesEx => Misc?.Attributes[1] ?? 0; - public uint AttributesEx2 => Misc?.Attributes[2] ?? 0; - public uint AttributesEx3 => Misc?.Attributes[3] ?? 0; - public uint AttributesEx4 => Misc?.Attributes[4] ?? 0; - public uint AttributesEx5 => Misc?.Attributes[5] ?? 0; - public uint AttributesEx6 => Misc?.Attributes[6] ?? 0; - public uint AttributesEx7 => Misc?.Attributes[7] ?? 0; - public uint AttributesEx8 => Misc?.Attributes[8] ?? 0; - public uint AttributesEx9 => Misc?.Attributes[9] ?? 0; - public uint AttributesEx10 => Misc?.Attributes[10] ?? 0; - public uint AttributesEx11 => Misc?.Attributes[11] ?? 0; - public uint AttributesEx12 => Misc?.Attributes[12] ?? 0; - public uint AttributesEx13 => Misc?.Attributes[13] ?? 0; + public uint Attributes => (uint)(Misc?.Attributes[0] ?? 0); + public uint AttributesEx => (uint)(Misc?.Attributes[1] ?? 0); + public uint AttributesEx2 => (uint)(Misc?.Attributes[2] ?? 0); + public uint AttributesEx3 => (uint)(Misc?.Attributes[3] ?? 0); + public uint AttributesEx4 => (uint)(Misc?.Attributes[4] ?? 0); + public uint AttributesEx5 => (uint)(Misc?.Attributes[5] ?? 0); + public uint AttributesEx6 => (uint)(Misc?.Attributes[6] ?? 0); + public uint AttributesEx7 => (uint)(Misc?.Attributes[7] ?? 0); + public uint AttributesEx8 => (uint)(Misc?.Attributes[8] ?? 0); + public uint AttributesEx9 => (uint)(Misc?.Attributes[9] ?? 0); + public uint AttributesEx10 => (uint)(Misc?.Attributes[10] ?? 0); + public uint AttributesEx11 => (uint)(Misc?.Attributes[11] ?? 0); + public uint AttributesEx12 => (uint)(Misc?.Attributes[12] ?? 0); + public uint AttributesEx13 => (uint)(Misc?.Attributes[13] ?? 0); public float Speed => Misc?.Speed ?? 0; public int CastingTimeIndex => Misc?.CastingTimeIndex ?? 0; - public uint ActiveIconFileDataID => Misc?.ActiveIconFileDataID ?? 0; - public uint IconFileDataID => Misc?.IconFileDataID ?? 0; + public int ActiveIconFileDataID => Misc?.ActiveIconFileDataID ?? 0; + public int IconFileDataID => Misc?.SpellIconFileDataID ?? 0; public int RangeIndex => Misc?.RangeIndex ?? 0; public uint SchoolMask => (uint)(Misc?.SchoolMask ?? 0); #endregion @@ -85,30 +85,30 @@ public class SpellInfo // SpellClassOptions public uint ModalNextSpell => ClassOptions?.ModalNextSpell ?? 0; public uint SpellFamilyName => ClassOptions?.SpellClassSet ?? 0; - public uint[] SpellFamilyFlags => ClassOptions?.SpellFamilyFlags ?? new uint[4]; + public uint[] SpellFamilyFlags => Array.ConvertAll(ClassOptions?.SpellClassMask ?? new int[4], i => (uint)i); #endregion #region SpellCategories // SpellCategories public int DamageClass => Categories?.DefenseType ?? 0; public int PreventionType => Categories?.PreventionType ?? 0; - public uint Category => Categories?.Category ?? 0; + public int Category => Categories?.Category ?? 0; public int Dispel => Categories?.DispelType ?? 0; public int Mechanic => Categories?.Mechanic ?? 0; #endregion #region SpellShapeshift // SpellShapeshift - public ulong Stances => ((Shapeshift?.ShapeshiftMask[0] ?? 0) << 32) | (Shapeshift?.ShapeshiftMask[1] ?? 0); - public ulong StancesNot => ((Shapeshift?.ShapeshiftExclude[0] ?? 0) << 32) | (Shapeshift?.ShapeshiftExclude[1] ?? 0); + public ulong Stances => (ulong)(((Shapeshift?.ShapeshiftMask[0] ?? 0) << 32) | (Shapeshift?.ShapeshiftMask[1] ?? 0)); + public ulong StancesNot => (ulong)(((Shapeshift?.ShapeshiftExclude[0] ?? 0) << 32) | (Shapeshift?.ShapeshiftExclude[1] ?? 0)); #endregion #region SpellCooldowns // SpellCooldowns - public uint CategoryRecoveryTime => Cooldowns?.CategoryRecoveryTime ?? 0; - public uint RecoveryTime => Cooldowns?.RecoveryTime ?? 0; - public uint StartRecoveryTime => Cooldowns?.StartRecoveryTime ?? 0; - public uint StartRecoveryCategory => Categories?.StartRecoveryCategory ?? 0; + public int CategoryRecoveryTime => Cooldowns?.CategoryRecoveryTime ?? 0; + public int RecoveryTime => Cooldowns?.RecoveryTime ?? 0; + public int StartRecoveryTime => Cooldowns?.StartRecoveryTime ?? 0; + public int StartRecoveryCategory => Categories?.StartRecoveryCategory ?? 0; #endregion #region SpellAuraRestrictions @@ -124,11 +124,12 @@ public class SpellInfo #endregion #region SpellAuraOptions - public uint ProcCharges => AuraOptions?.ProcCharges ?? 0; + public int ProcCharges => AuraOptions?.ProcCharges ?? 0; public uint ProcChance => AuraOptions?.ProcChance ?? 0; - public uint ProcFlags => AuraOptions?.ProcTypeMask ?? 0; + public uint ProcFlags => (uint)(AuraOptions?.ProcTypeMask[0] ?? 0); + public uint ProcFlagsEx => (uint)(AuraOptions?.ProcTypeMask[1] ?? 0); public uint CumulativeAura => AuraOptions?.CumulativeAura ?? 0; - public uint ProcCooldown => AuraOptions?.ProcCategoryRecovery ?? 0; + public int ProcCooldown => AuraOptions?.ProcCategoryRecovery ?? 0; #endregion #region SpellLevels @@ -136,14 +137,14 @@ public class SpellInfo public int BaseLevel => Levels?.BaseLevel ?? 0; public int MaxLevel => Levels?.MaxLevel ?? 0; public int SpellLevel => Levels?.SpellLevel ?? 0; - public int MaxUsableLevel => Levels?.MaxUsableLevel ?? 0; + public int MaxPassiveAuraLevel => Levels?.MaxPassiveAuraLevel ?? 0; #endregion #region EquippedItems // Equippeditems public int EquippedItemClass => EquippedItems?.EquippedItemClass ?? 0; - public uint EquippedItemInventoryTypeMask => EquippedItems?.EquippedItemInventoryTypeMask ?? 0; - public uint EquippedItemSubClassMask => EquippedItems?.EquippedItemSubClassMask ?? 0; + public int EquippedItemInventoryType => EquippedItems?.EquippedItemInvTypes ?? 0; + public int EquippedItemSubClass => EquippedItems?.EquippedItemSubclass ?? 0; #endregion #region SpellXSpellVisual @@ -154,7 +155,7 @@ public class SpellInfo public uint RequiredAreasId => CastingRequirements?.RequiredAreasID ?? 0; public uint FacingCasterFlags => CastingRequirements?.FacingCasterFlags ?? 0; public uint MinFactionID => CastingRequirements?.MinFactionID ?? 0; - public uint MinReputation => CastingRequirements?.MinReputation ?? 0; + public int MinReputation => CastingRequirements?.MinReputation ?? 0; public uint RequiredAuraVision => CastingRequirements?.RequiredAuraVision ?? 0; public uint RequiresSpellFocus => CastingRequirements?.RequiresSpellFocus ?? 0; #endregion @@ -166,11 +167,11 @@ public class SpellInfo #region SpellInterrupts // SpellInterrupts - public uint AuraInterruptFlags => Interrupts?.AuraInterruptFlags[0] ?? 0; - public uint AuraInterruptFlags2 => Interrupts?.AuraInterruptFlags[1] ?? 0; - public uint ChannelInterruptFlags => Interrupts?.ChannelInterruptFlags[0] ?? 0; - public uint ChannelInterruptFlags2 => Interrupts?.ChannelInterruptFlags[1] ?? 0; - public uint InterruptFlags => Interrupts?.InterruptFlags ?? 0; + public int AuraInterruptFlags => Interrupts?.AuraInterruptFlags[0] ?? 0; + public int AuraInterruptFlags2 => Interrupts?.AuraInterruptFlags[1] ?? 0; + public int ChannelInterruptFlags => Interrupts?.ChannelInterruptFlags[0] ?? 0; + public int ChannelInterruptFlags2 => Interrupts?.ChannelInterruptFlags[1] ?? 0; + public int InterruptFlags => Interrupts?.InterruptFlags ?? 0; #endregion public string ProcInfo @@ -198,7 +199,7 @@ public SpellInfo(SpellEntry spellEntry) { SpellDescriptionVariablesEntry variables; Spell = spellEntry; - if (DBC.DBC.SpellDescriptionVariables.TryGetValue(spellEntry.DescriptionVariablesID, out variables)) + if (DBC.DBC.SpellDescriptionVariables.TryGetValue(spellEntry.ID, out variables)) DescriptionVariables = variables; } @@ -222,7 +223,7 @@ public void Write(RichTextBox rtb) } rtb.AppendFormatLineIfNotNull("Modal Next Spell: {0}", ModalNextSpell); - if (!string.IsNullOrEmpty(Spell.Description) && !string.IsNullOrEmpty(Spell.AuraDescription) && ModalNextSpell != 0) + if (!string.IsNullOrEmpty(Spell.Description_lang) && !string.IsNullOrEmpty(Spell.AuraDescription_lang) && ModalNextSpell != 0) rtb.AppendFormatLine(Separator); #region Triggered by ... @@ -233,7 +234,7 @@ public void Write(RichTextBox rtb) { var procname = "Spell Not Found"; if (DBC.DBC.Spell.ContainsKey(procSpellId)) - procname = DBC.DBC.Spell[procSpellId].Name; + procname = DBC.DBC.Spell[procSpellId].Name_lang; rtb.SetStyle(Color.Blue, FontStyle.Bold); rtb.AppendFormatLine("Triggered by spell: ({0}) {1}", procSpellId, procname); @@ -264,7 +265,7 @@ from eff in s.Effects { rtb.SetStyle(Color.Blue, FontStyle.Bold); rtb.AppendFormatLine("Modified by {0} ({1})", - DBC.DBC.SpellInfoStore[eff.SpellID].Spell.Name, eff.SpellID); + DBC.DBC.SpellInfoStore[eff.SpellID].Spell.Name_lang, eff.SpellID); } #endregion @@ -321,8 +322,8 @@ from eff in s.Effects rtb.AppendFormatLine("Creature Type Mask = 0x{0:X8} ({1})", targetRestriction.TargetCreatureType, (CreatureTypeMask)targetRestriction.TargetCreatureType); - if (targetRestriction.MaxAffectedTargets != 0) - rtb.AppendFormatLine("MaxAffectedTargets: {0}", targetRestriction.MaxAffectedTargets); + if (targetRestriction.MaxTargets != 0) + rtb.AppendFormatLine("MaxAffectedTargets: {0}", targetRestriction.MaxTargets); } } @@ -334,13 +335,13 @@ from eff in s.Effects // Skills { - var query = DBC.DBC.SkillLineAbility.Where(skl => skl.Value.SpellID == Spell.ID).ToArray(); + var query = DBC.DBC.SkillLineAbility.Where(skl => skl.Value.Spell == Spell.ID).ToArray(); if (query.Length != 0) { var skill = query.First().Value; var line = DBC.DBC.SkillLine[skill.SkillLine]; - rtb.AppendFormatLine(@"Skill (Id {0}) ""{1}""", skill.SkillLine, line.DisplayName); + rtb.AppendFormatLine(@"Skill (Id {0}) ""{1}""", skill.SkillLine, line.DisplayName_lang); rtb.AppendFormat(" MinSkillLineRank {0}", skill.MinSkillLineRank); rtb.AppendFormat(", SupercedesSpell = {0}, MinMaxValue ({1}, {2})", skill.SupercedesSpell, @@ -383,7 +384,7 @@ from eff in s.Effects printedHeader = true; } - rtb.AppendFormat(" {0} x{1}", reagentsCurrency.CurrencyTypeID, reagentsCurrency.CurrencyCount); + rtb.AppendFormat(" {0} x{1}", reagentsCurrency.CurrencyTypesID, reagentsCurrency.CurrencyCount); } if (printedHeader) @@ -391,30 +392,30 @@ from eff in s.Effects } rtb.AppendFormatLine("Spell Level = {0}, base {1}, max {2}, max usable {3}", - SpellLevel, BaseLevel, MaxLevel, MaxUsableLevel); + SpellLevel, BaseLevel, MaxLevel, MaxPassiveAuraLevel); if (EquippedItemClass != 0) { rtb.AppendFormatLine("EquippedItemClass = {0} ({1})", EquippedItemClass, (ItemClass)EquippedItemClass); - if (EquippedItemSubClassMask != 0) + if (EquippedItemSubClass != 0) { switch ((ItemClass)EquippedItemClass) { case ItemClass.WEAPON: - rtb.AppendFormatLine(" SubClass mask 0x{0:X8} ({1})", EquippedItemSubClassMask, (ItemSubClassWeaponMask)EquippedItemSubClassMask); + rtb.AppendFormatLine(" SubClass mask 0x{0:X8} ({1})", EquippedItemSubClass, (ItemSubClassWeaponMask)EquippedItemSubClass); break; case ItemClass.ARMOR: - rtb.AppendFormatLine(" SubClass mask 0x{0:X8} ({1})", EquippedItemSubClassMask, (ItemSubClassArmorMask)EquippedItemSubClassMask); + rtb.AppendFormatLine(" SubClass mask 0x{0:X8} ({1})", EquippedItemSubClass, (ItemSubClassArmorMask)EquippedItemSubClass); break; case ItemClass.MISC: - rtb.AppendFormatLine(" SubClass mask 0x{0:X8} ({1})", EquippedItemSubClassMask, (ItemSubClassMiscMask)EquippedItemSubClassMask); + rtb.AppendFormatLine(" SubClass mask 0x{0:X8} ({1})", EquippedItemSubClass, (ItemSubClassMiscMask)EquippedItemSubClass); break; } } - if (EquippedItemInventoryTypeMask != 0) - rtb.AppendFormatLine(" InventoryType mask = 0x{0:X8} ({1})", EquippedItemInventoryTypeMask, (InventoryTypeMask)EquippedItemInventoryTypeMask); + if (EquippedItemInventoryType != 0) + rtb.AppendFormatLine(" InventoryType mask = 0x{0:X8} ({1})", EquippedItemInventoryType, (InventoryTypeMask)EquippedItemInventoryType); } rtb.AppendLine(); @@ -449,14 +450,14 @@ from eff in s.Effects level = Scaling.MaxScalingLevel; if (Levels != null && Levels.BaseLevel != 0) - level -= Levels.BaseLevel; + level -= (ushort)Levels.BaseLevel; if (Scaling != null && level < Scaling.MinScalingLevel) level = Scaling.MinScalingLevel; - var castTime = castTimeEntry.CastTime + castTimeEntry.CastTimePerLevel * level; - if (castTime < castTimeEntry.MinCastTime) - castTime = castTimeEntry.MinCastTime; + var castTime = castTimeEntry.Base + castTimeEntry.PerLevel * level; + if (castTime < castTimeEntry.Minimum) + castTime = castTimeEntry.Minimum; rtb.AppendFormatLine("Cast Time: (ID {0}): {1}", CastingTimeIndex, castTime); } @@ -492,7 +493,7 @@ from eff in s.Effects if (CasterAuraSpell != 0) { if (DBC.DBC.SpellInfoStore.ContainsKey(CasterAuraSpell)) - rtb.AppendFormatLine(" Caster Aura Spell ({0}) {1}", CasterAuraSpell, DBC.DBC.SpellInfoStore[CasterAuraSpell].Spell.Name); + rtb.AppendFormatLine(" Caster Aura Spell ({0}) {1}", CasterAuraSpell, DBC.DBC.SpellInfoStore[CasterAuraSpell].Spell.Name_lang); else rtb.AppendFormatLine(" Caster Aura Spell ({0}) ?????", CasterAuraSpell); } @@ -500,7 +501,7 @@ from eff in s.Effects if (TargetAuraSpell != 0) { if (DBC.DBC.SpellInfoStore.ContainsKey(TargetAuraSpell)) - rtb.AppendFormatLine(" Target Aura Spell ({0}) {1}", TargetAuraSpell, DBC.DBC.SpellInfoStore[TargetAuraSpell].Spell.Name); + rtb.AppendFormatLine(" Target Aura Spell ({0}) {1}", TargetAuraSpell, DBC.DBC.SpellInfoStore[TargetAuraSpell].Spell.Name_lang); else rtb.AppendFormatLine(" Target Aura Spell ({0}) ?????", TargetAuraSpell); } @@ -508,7 +509,7 @@ from eff in s.Effects if (ExcludeCasterAuraSpell != 0) { if (DBC.DBC.SpellInfoStore.ContainsKey(ExcludeCasterAuraSpell)) - rtb.AppendFormatLine(" Ex Caster Aura Spell ({0}) {1}", ExcludeCasterAuraSpell, DBC.DBC.SpellInfoStore[ExcludeCasterAuraSpell].Spell.Name); + rtb.AppendFormatLine(" Ex Caster Aura Spell ({0}) {1}", ExcludeCasterAuraSpell, DBC.DBC.SpellInfoStore[ExcludeCasterAuraSpell].Spell.Name_lang); else rtb.AppendFormatLine(" Ex Caster Aura Spell ({0}) ?????", ExcludeCasterAuraSpell); } @@ -516,14 +517,14 @@ from eff in s.Effects if (ExcludeTargetAuraSpell != 0) { if (DBC.DBC.SpellInfoStore.ContainsKey(ExcludeTargetAuraSpell)) - rtb.AppendFormatLine(" Ex Target Aura Spell ({0}) {1}", ExcludeTargetAuraSpell, DBC.DBC.SpellInfoStore[ExcludeTargetAuraSpell].Spell.Name); + rtb.AppendFormatLine(" Ex Target Aura Spell ({0}) {1}", ExcludeTargetAuraSpell, DBC.DBC.SpellInfoStore[ExcludeTargetAuraSpell].Spell.Name_lang); else rtb.AppendFormatLine(" Ex Target Aura Spell ({0}) ?????", ExcludeTargetAuraSpell); } if (RequiredAreasId > 0) { - var areas = DBC.DBC.AreaGroupMember.Values.Where(ag => ag.AreaGroupId == RequiredAreasId).ToList(); + var areas = DBC.DBC.AreaGroupMember.Values.Where(ag => ag.AreaGroupID == RequiredAreasId).ToList(); if (areas.Count == 0) rtb.AppendFormatLine("Cannot find area group id {0} in AreaGroupMember.db2!", RequiredAreasId); else @@ -533,12 +534,12 @@ from eff in s.Effects rtb.AppendLine("Allowed areas:"); foreach (var areaGroupMember in areas) { - var areaId = areaGroupMember.AreaId; + var areaId = areaGroupMember.AreaID; if (!DBC.DBC.AreaTable.ContainsKey(areaId)) continue; var areaEntry = DBC.DBC.AreaTable[areaId]; - rtb.AppendFormatLine("{0} - {1} (Map: {2})", areaId, areaEntry.AreaName, areaEntry.MapID); + rtb.AppendFormatLine("{0} - {1} (Map: {2})", areaId, areaEntry.AreaName_lang, areaEntry.ContinentID); } rtb.AppendLine(); @@ -588,7 +589,7 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) if (effect.SpellEffectScalingEntry != null && Math.Abs(effect.SpellEffectScalingEntry.Coefficient) > 1.0E-5f && Scaling != null && - Scaling.ScalingClass != 0) + Scaling.Class != 0) { var level = (int)(DBC.DBC.SelectedLevel - 1); if ((AttributesEx11 & (uint)SpellAtributeEx11.SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) == 0) @@ -605,7 +606,7 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) if (level < 1) level = 1; - if (Scaling.ScalingClass != 0) + if (Scaling.Class != 0) { if (Scaling.ScalesFromItemLevel == 0) @@ -614,7 +615,7 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) { var gtScaling = GameTable.GetRecord(level); Debug.Assert(gtScaling != null); - value = gtScaling.GetColumnForClass(Scaling.ScalingClass); + value = gtScaling.GetColumnForClass(Scaling.Class); } else if (DBC.DBC.RandPropPoints.ContainsKey(level)) { @@ -690,7 +691,7 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) AuraModTypeName(rtb, effect); - var classMask = effect.EffectSpellClassMask; + var classMask = Array.ConvertAll(effect.EffectSpellClassMask, i => (uint)i); if (classMask[0] != 0 || classMask[1] != 0 || classMask[2] != 0 || classMask[3] != 0) { @@ -698,12 +699,12 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) var query = from spell in DBC.DBC.SpellInfoStore.Values where spell.SpellFamilyName == SpellFamilyName && spell.SpellFamilyFlags.ContainsElement(classMask) - join sk in DBC.DBC.SkillLineAbility.Values on spell.ID equals sk.SpellID into temp + join sk in DBC.DBC.SkillLineAbility.Values on spell.ID equals sk.Spell into temp from skill in temp.DefaultIfEmpty(new SkillLineAbilityEntry()) select new { SpellID = spell.Spell.ID, - SpellName = spell.Spell.Name, + SpellName = spell.Spell.Name_lang, SkillId = skill.SkillLine }; @@ -734,9 +735,9 @@ from skill in temp.DefaultIfEmpty(new SkillLineAbilityEntry()) { var triggerSpell = DBC.DBC.SpellInfoStore[(int)trigger]; rtb.SetStyle(Color.Blue, FontStyle.Bold); - rtb.AppendFormatLine(" Trigger spell ({0}) {1}. Chance = {2}", trigger, triggerSpell.Spell.Name, ProcChance); - rtb.AppendFormatLineIfNotNull(" Description: {0}", triggerSpell.Spell.Description); - rtb.AppendFormatLineIfNotNull(" ToolTip: {0}", triggerSpell.Spell.AuraDescription); + rtb.AppendFormatLine(" Trigger spell ({0}) {1}. Chance = {2}", trigger, triggerSpell.Spell.Name_lang, ProcChance); + rtb.AppendFormatLineIfNotNull(" Description: {0}", triggerSpell.Spell.Description_lang); + rtb.AppendFormatLineIfNotNull(" ToolTip: {0}", triggerSpell.Spell.AuraDescription_lang); rtb.SetDefaultStyle(); if (triggerSpell.ProcFlags != 0) { @@ -763,12 +764,12 @@ from skill in temp.DefaultIfEmpty(new SkillLineAbilityEntry()) private static void AuraModTypeName(RichTextBox rtb, SpellEffectEntry effect) { var aura = (AuraType)effect.EffectAura; - var misc = effect.EffectMiscValues[0]; + var misc = effect.EffectMiscValue[0]; if (effect.EffectAura == 0) { - rtb.AppendFormatLineIfNotNull("EffectMiscValueA = {0}", effect.EffectMiscValues[0]); - rtb.AppendFormatLineIfNotNull("EffectMiscValueB = {0}", effect.EffectMiscValues[1]); + rtb.AppendFormatLineIfNotNull("EffectMiscValueA = {0}", effect.EffectMiscValue[0]); + rtb.AppendFormatLineIfNotNull("EffectMiscValueB = {0}", effect.EffectMiscValue[1]); rtb.AppendFormatLineIfNotNull("EffectAmplitude = {0}", effect.EffectAmplitude); return; @@ -797,7 +798,7 @@ private static void AuraModTypeName(RichTextBox rtb, SpellEffectEntry effect) break; } - rtb.AppendFormat("), miscB = {0}", effect.EffectMiscValues[1]); + rtb.AppendFormat("), miscB = {0}", effect.EffectMiscValue[1]); rtb.AppendFormatLine(", amplitude = {0}, periodic = {1}", effect.EffectAmplitude, effect.EffectAuraPeriod); switch (aura) @@ -846,20 +847,20 @@ private void AppendItemInfo(RichTextBox rtb) foreach (var item in items) { - if (!DBC.DBC.ItemSparse.ContainsKey((int)item.Value.ItemID)) + if (!DBC.DBC.ItemSparse.ContainsKey((int)item.Value.ParentItemID)) { - rtb.AppendFormatLine($@" Non-existing Item-sparse.db2 entry { item.Value.ItemID }"); + rtb.AppendFormatLine($@" Non-existing Item-sparse.db2 entry { item.Value.ParentItemID}"); continue; } - var itemTemplate = DBC.DBC.ItemSparse[(int)item.Value.ItemID]; + var itemTemplate = DBC.DBC.ItemSparse[(int)item.Value.ParentItemID]; - var name = itemTemplate.Name; - var description = itemTemplate.Description; + var name = itemTemplate.Display_lang; + var description = itemTemplate.Description_lang; description = string.IsNullOrEmpty(description) ? string.Empty : $" - \"{ description }\""; - rtb.AppendFormatLine($@" { item.Value.ItemID }: { name } { description }"); + rtb.AppendFormatLine($@" { item.Value.ParentItemID }: { name } { description }"); } } @@ -935,30 +936,30 @@ public class SpellEffectInfo { public SpellEffectEntry SpellEffect { get; set; } - public uint ID => SpellEffect.ID; + public int ID => SpellEffect.ID; public int SpellID => SpellEffect.SpellID; - public uint DifficultyID => SpellEffect.DifficultyID; + public int DifficultyID => SpellEffect.DifficultyID; public uint Effect => SpellEffect.Effect; - public uint EffectIndex => SpellEffect.EffectIndex; - public uint EffectAttributes => SpellEffect.EffectAttributes; + public int EffectIndex => SpellEffect.EffectIndex; + public int EffectAttributes => SpellEffect.EffectAttributes; - public uint EffectAura => SpellEffect.EffectAura; - public uint EffectAuraPeriod => SpellEffect.EffectAuraPeriod; + public int EffectAura => SpellEffect.EffectAura; + public int EffectAuraPeriod => SpellEffect.EffectAuraPeriod; public int EffectBasePoints => SpellEffect.EffectBasePoints; - public int EffectMiscValueA => SpellEffect.EffectMiscValues[0]; - public int EffectMiscValueB => SpellEffect.EffectMiscValues[1]; + public int EffectMiscValueA => SpellEffect.EffectMiscValue[0]; + public int EffectMiscValueB => SpellEffect.EffectMiscValue[1]; - public uint EffectSpellClassMaskA => SpellEffect.EffectSpellClassMask[0]; - public uint EffectSpellClassMaskB => SpellEffect.EffectSpellClassMask[1]; - public uint EffectSpellClassMaskC => SpellEffect.EffectSpellClassMask[2]; - public uint EffectSpellClassMaskD => SpellEffect.EffectSpellClassMask[3]; + public int EffectSpellClassMaskA => SpellEffect.EffectSpellClassMask[0]; + public int EffectSpellClassMaskB => SpellEffect.EffectSpellClassMask[1]; + public int EffectSpellClassMaskC => SpellEffect.EffectSpellClassMask[2]; + public int EffectSpellClassMaskD => SpellEffect.EffectSpellClassMask[3]; - public uint EffectTriggerSpell => SpellEffect.EffectTriggerSpell; + public int EffectTriggerSpell => SpellEffect.EffectTriggerSpell; public uint TargetA => SpellEffect.ImplicitTarget[0]; public uint TargetB => SpellEffect.ImplicitTarget[1]; @@ -966,10 +967,10 @@ public class SpellEffectInfo public uint EffectRadiusIndex => SpellEffect.EffectRadiusIndex[0]; public uint EffectRadiusMaxIndex => SpellEffect.EffectRadiusIndex[1]; - public uint EffectChainTargets => SpellEffect.EffectChainTargets; + public int EffectChainTargets => SpellEffect.EffectChainTargets; public int EffectDieSides => SpellEffect.EffectDieSides; - public uint EffectItemType => SpellEffect.EffectItemType; - public uint EffectMechanic => SpellEffect.EffectMechanic; + public int EffectItemType => SpellEffect.EffectItemType; + public int EffectMechanic => SpellEffect.EffectMechanic; public float EffectAmplitude => SpellEffect.EffectAmplitude; public float EffectBonusCoefficient => SpellEffect.EffectBonusCoefficient; @@ -977,7 +978,7 @@ public class SpellEffectInfo public float EffectPointsPerResource => SpellEffect.EffectPointsPerResource; public float EffectRealPointsPerLevel => SpellEffect.EffectRealPointsPerLevel; - public float EffectPosFacing => SpellEffect.EffectPosFacing; + public float EffectPosFacing => SpellEffect.EffectPos_facing; public float BonusCoefficientFromAP => SpellEffect.BonusCoefficientFromAP; public SpellEffectInfo(SpellEffectEntry spellEffectEntry) diff --git a/SpellWork/SpellWork.csproj b/SpellWork/SpellWork.csproj index 46b935f1..2801ae0b 100644 --- a/SpellWork/SpellWork.csproj +++ b/SpellWork/SpellWork.csproj @@ -10,7 +10,7 @@ Properties SpellWork SpellWork - v4.6 + v4.8 512 New Icon.ico false @@ -62,9 +62,10 @@ false - - ..\packages\DBFilesClient.NET.1.1.4\lib\net452\DBFilesClient.NET.dll + + ..\packages\DBFileReaderLib.1.0.0.0\lib\DBFileReaderLib.dll + ..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll @@ -77,6 +78,7 @@ + diff --git a/SpellWork/app.config b/SpellWork/app.config index ea441927..9bc52cf3 100644 --- a/SpellWork/app.config +++ b/SpellWork/app.config @@ -1,8 +1,8 @@ - + -
+
@@ -31,14 +31,14 @@ gt - - enUS - + + enUS + - + - - + + From b85c9e3282fc288cf10d393f3c4a74805696ce2a Mon Sep 17 00:00:00 2001 From: "Antonio M. Berti" <15972392+BertiRean@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:44:17 -0300 Subject: [PATCH 2/5] Database: Added Helper for get scriptnames of spell --- SpellWork/Database/MySQLConnect.cs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/SpellWork/Database/MySQLConnect.cs b/SpellWork/Database/MySQLConnect.cs index bc643548..2d770126 100644 --- a/SpellWork/Database/MySQLConnect.cs +++ b/SpellWork/Database/MySQLConnect.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Windows.Forms; using MySql.Data.MySqlClient; @@ -38,6 +39,27 @@ private static string GetSpellName(uint id) return string.Empty; } + public static ArrayList GetScriptNames(uint id) + { + ArrayList scripts = new ArrayList(); + string query = $"SELECT * FROM `spell_script_names` where `spell_id` = {id};"; + using (_conn = new MySql.Data.MySqlClient.MySqlConnection(ConnectionString)) + { + _command = new MySqlCommand(query, _conn); + _conn.Open(); + + using (var reader = _command.ExecuteReader()) + { + while (reader.Read()) + { + var scriptName = reader.GetString(1); + scripts.Add(scriptName); + } + } + } + return scripts; + } + public static void SelectProc(string query) { using (_conn = new MySql.Data.MySqlClient.MySqlConnection(ConnectionString)) From d06071109a18ceea770a96919c76419fac9a3928 Mon Sep 17 00:00:00 2001 From: "Antonio M. Berti" <15972392+BertiRean@users.noreply.github.com> Date: Mon, 18 Mar 2024 10:45:06 -0300 Subject: [PATCH 3/5] Miscellaneous: - Updated ProcFlags, ProcFlags2, InterruptFlags, TargetTypes, PreventionType, ItemSubClassWeaponMask, ItemSubClassArmorMask, ItemSubClassMiscMask, CreatureTypeMask - Updated SpellEffectScalingEntry calls to values from SpellEffect --- SpellWork/Spell/SpellEnums.cs | 552 +++++++++++++++++++--------------- SpellWork/Spell/SpellInfo.cs | 42 ++- 2 files changed, 332 insertions(+), 262 deletions(-) diff --git a/SpellWork/Spell/SpellEnums.cs b/SpellWork/Spell/SpellEnums.cs index fd61cdc0..fc888dca 100644 --- a/SpellWork/Spell/SpellEnums.cs +++ b/SpellWork/Spell/SpellEnums.cs @@ -866,201 +866,216 @@ public enum AuraType /// public enum Targets { - NO_TARGET = 0, - TARGET_UNIT_CASTER = 1, - TARGET_UNIT_NEARBY_ENEMY = 2, - TARGET_UNIT_NEARBY_PARTY = 3, - TARGET_UNIT_NEARBY_ALLY = 4, - TARGET_UNIT_PET = 5, - TARGET_UNIT_TARGET_ENEMY = 6, - TARGET_UNIT_SRC_AREA_ENTRY = 7, - TARGET_UNIT_DEST_AREA_ENTRY = 8, - TARGET_DEST_HOME = 9, - TARGET_10 = 10, - TARGET_UNIT_SRC_AREA_UNK_11 = 11, // teleport target to caster - TARGET_12 = 12, - TARGET_13 = 13, - TARGET_14 = 14, - TARGET_UNIT_SRC_AREA_ENEMY = 15, - TARGET_UNIT_DEST_AREA_ENEMY = 16, - TARGET_DEST_DB = 17, - TARGET_DEST_CASTER = 18, - TARGET_19 = 19, - TARGET_UNIT_CASTER_AREA_PARTY = 20, - TARGET_UNIT_TARGET_ALLY = 21, - TARGET_SRC_CASTER = 22, - TARGET_GAMEOBJECT_TARGET = 23, - TARGET_UNIT_CONE_ENEMY_24 = 24, - TARGET_UNIT_TARGET_ANY = 25, - TARGET_GAMEOBJECT_ITEM_TARGET = 26, - TARGET_UNIT_MASTER = 27, - TARGET_DEST_DYNOBJ_ENEMY = 28, - TARGET_DEST_DYNOBJ_ALLY = 29, - TARGET_UNIT_SRC_AREA_ALLY = 30, - TARGET_UNIT_DEST_AREA_ALLY = 31, - TARGET_DEST_CASTER_SUMMON = 32, // front left, doesn't use radius - TARGET_UNIT_SRC_AREA_PARTY = 33, - TARGET_UNIT_DEST_AREA_PARTY = 34, - TARGET_UNIT_TARGET_PARTY = 35, - TARGET_DEST_CASTER_UNK_36 = 36, - TARGET_UNIT_LASTTARGET_AREA_PARTY = 37, - TARGET_UNIT_NEARBY_ENTRY = 38, - TARGET_DEST_CASTER_FISHING = 39, - TARGET_GAMEOBJECT_NEARBY_ENTRY = 40, - TARGET_DEST_CASTER_FRONT_RIGHT = 41, - TARGET_DEST_CASTER_BACK_RIGHT = 42, - TARGET_DEST_CASTER_BACK_LEFT = 43, - TARGET_DEST_CASTER_FRONT_LEFT = 44, - TARGET_UNIT_TARGET_CHAINHEAL_ALLY = 45, - TARGET_DEST_NEARBY_ENTRY = 46, - TARGET_DEST_CASTER_FRONT = 47, - TARGET_DEST_CASTER_BACK = 48, - TARGET_DEST_CASTER_RIGHT = 49, - TARGET_DEST_CASTER_LEFT = 50, - TARGET_GAMEOBJECT_SRC_AREA = 51, - TARGET_GAMEOBJECT_DEST_AREA = 52, - TARGET_DEST_TARGET_ENEMY = 53, - TARGET_UNIT_CONE_ENEMY_54 = 54, - TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell - TARGET_UNIT_CASTER_AREA_RAID = 56, - TARGET_UNIT_TARGET_RAID = 57, - TARGET_UNIT_NEARBY_RAID = 58, - TARGET_UNIT_CONE_ALLY = 59, - TARGET_UNIT_CONE_ENTRY = 60, - TARGET_UNIT_TARGET_AREA_RAID_CLASS = 61, - TARGET_UNK_62 = 62, - TARGET_DEST_TARGET_ANY = 63, - TARGET_DEST_TARGET_FRONT = 64, - TARGET_DEST_TARGET_BACK = 65, - TARGET_DEST_TARGET_RIGHT = 66, - TARGET_DEST_TARGET_LEFT = 67, - TARGET_DEST_TARGET_FRONT_RIGHT = 68, - TARGET_DEST_TARGET_BACK_RIGHT = 69, - TARGET_DEST_TARGET_BACK_LEFT = 70, - TARGET_DEST_TARGET_FRONT_LEFT = 71, - TARGET_DEST_CASTER_RANDOM = 72, - TARGET_DEST_CASTER_RADIUS = 73, - TARGET_DEST_TARGET_RANDOM = 74, - TARGET_DEST_TARGET_RADIUS = 75, - TARGET_DEST_CHANNEL_TARGET = 76, - TARGET_UNIT_CHANNEL_TARGET = 77, - TARGET_DEST_DEST_FRONT = 78, - TARGET_DEST_DEST_BACK = 79, - TARGET_DEST_DEST_RIGHT = 80, - TARGET_DEST_DEST_LEFT = 81, - TARGET_DEST_DEST_FRONT_RIGHT = 82, - TARGET_DEST_DEST_BACK_RIGHT = 83, - TARGET_DEST_DEST_BACK_LEFT = 84, - TARGET_DEST_DEST_FRONT_LEFT = 85, - TARGET_DEST_DEST_RANDOM = 86, - TARGET_DEST_DEST = 87, - TARGET_DEST_DYNOBJ_NONE = 88, - TARGET_DEST_TRAJ = 89, - TARGET_UNIT_TARGET_MINIPET = 90, - TARGET_DEST_DEST_RADIUS = 91, - TARGET_UNIT_SUMMONER = 92, - TARGET_CORPSE_SRC_AREA_ENEMY = 93, // NYI - TARGET_UNIT_VEHICLE = 94, - TARGET_UNIT_TARGET_PASSENGER = 95, - TARGET_UNIT_PASSENGER_0 = 96, - TARGET_UNIT_PASSENGER_1 = 97, - TARGET_UNIT_PASSENGER_2 = 98, - TARGET_UNIT_PASSENGER_3 = 99, - TARGET_UNIT_PASSENGER_4 = 100, - TARGET_UNIT_PASSENGER_5 = 101, - TARGET_UNIT_PASSENGER_6 = 102, - TARGET_UNIT_PASSENGER_7 = 103, - TARGET_UNIT_CONE_ENEMY_104 = 104, - TARGET_UNIT_UNK_105 = 105, // 1 spell - TARGET_DEST_CHANNEL_CASTER = 106, - TARGET_UNK_DEST_AREA_UNK_107 = 107, // not enough info - only generic spells avalible - TARGET_GAMEOBJECT_CONE = 108, - TARGET_109 = 109, - TARGET_DEST_UNK_110 = 110, // 1 spell - TARGET_UNK_111 = 111, - TARGET_UNK_112 = 112, - TARGET_UNK_113 = 113, - TARGET_UNK_114 = 114, - TARGET_UNK_115 = 115, - TARGET_UNK_116 = 116, - TARGET_UNK_117 = 117, - TARGET_UNK_118 = 118, - TARGET_UNK_119 = 119, - TARGET_UNK_120 = 120, - TARGET_UNK_121 = 121, - TARGET_UNK_122 = 122, - TARGET_UNK_123 = 123, - TARGET_UNK_124 = 124, - TARGET_UNK_125 = 125, - TARGET_UNK_126 = 126, - TARGET_UNK_127 = 127, - TARGET_UNK_128 = 128, - TARGET_UNK_129 = 129, - TARGET_UNK_130 = 130, - TARGET_UNK_131 = 131, - TARGET_UNK_132 = 132, - TARGET_UNK_133 = 133, - TARGET_UNK_134 = 134, - TARGET_UNK_135 = 135, - TARGET_UNK_136 = 136, - TARGET_UNK_137 = 137, - TARGET_UNK_138 = 138, - TARGET_UNK_139 = 139, - TARGET_UNK_140 = 140, - TARGET_UNK_141 = 141, - TARGET_UNK_142 = 142, - TARGET_UNK_143 = 143, - TARGET_UNK_144 = 144, - TARGET_UNK_145 = 145, - TARGET_UNK_146 = 146, - TARGET_UNK_147 = 147, - TARGET_UNK_148 = 148, - TOTAL_SPELL_TARGETS, + NO_TARGET = 0, + TARGET_UNIT_CASTER = 1, + TARGET_UNIT_NEARBY_ENEMY = 2, + TARGET_UNIT_NEARBY_ALLY = 3, + TARGET_UNIT_NEARBY_PARTY = 4, + TARGET_UNIT_PET = 5, + TARGET_UNIT_TARGET_ENEMY = 6, + TARGET_UNIT_SRC_AREA_ENTRY = 7, + TARGET_UNIT_DEST_AREA_ENTRY = 8, + TARGET_DEST_HOME = 9, + TARGET_UNK_10 = 10, + TARGET_UNIT_SRC_AREA_UNK_11 = 11, + TARGET_UNK_12 = 12, + TARGET_UNK_13 = 13, + TARGET_UNK_14 = 14, + TARGET_UNIT_SRC_AREA_ENEMY = 15, + TARGET_UNIT_DEST_AREA_ENEMY = 16, + TARGET_DEST_DB = 17, + TARGET_DEST_CASTER = 18, + TARGET_UNK_19 = 19, + TARGET_UNIT_CASTER_AREA_PARTY = 20, + TARGET_UNIT_TARGET_ALLY = 21, + TARGET_SRC_CASTER = 22, + TARGET_GAMEOBJECT_TARGET = 23, + TARGET_UNIT_CONE_ENEMY_24 = 24, + TARGET_UNIT_TARGET_ANY = 25, + TARGET_GAMEOBJECT_ITEM_TARGET = 26, + TARGET_UNIT_MASTER = 27, + TARGET_DEST_DYNOBJ_ENEMY = 28, + TARGET_DEST_DYNOBJ_ALLY = 29, + TARGET_UNIT_SRC_AREA_ALLY = 30, + TARGET_UNIT_DEST_AREA_ALLY = 31, + TARGET_DEST_CASTER_SUMMON = 32, // front left, doesn't use radius + TARGET_UNIT_SRC_AREA_PARTY = 33, + TARGET_UNIT_DEST_AREA_PARTY = 34, + TARGET_UNIT_TARGET_PARTY = 35, + TARGET_DEST_CASTER_UNK_36 = 36, + TARGET_UNIT_LASTTARGET_AREA_PARTY = 37, + TARGET_UNIT_NEARBY_ENTRY = 38, + TARGET_DEST_CASTER_FISHING = 39, + TARGET_GAMEOBJECT_NEARBY_ENTRY = 40, + TARGET_DEST_CASTER_FRONT_RIGHT = 41, + TARGET_DEST_CASTER_BACK_RIGHT = 42, + TARGET_DEST_CASTER_BACK_LEFT = 43, + TARGET_DEST_CASTER_FRONT_LEFT = 44, + TARGET_UNIT_TARGET_CHAINHEAL_ALLY = 45, + TARGET_DEST_NEARBY_ENTRY = 46, + TARGET_DEST_CASTER_FRONT = 47, + TARGET_DEST_CASTER_BACK = 48, + TARGET_DEST_CASTER_RIGHT = 49, + TARGET_DEST_CASTER_LEFT = 50, + TARGET_GAMEOBJECT_SRC_AREA = 51, + TARGET_GAMEOBJECT_DEST_AREA = 52, + TARGET_DEST_TARGET_ENEMY = 53, + TARGET_UNIT_CONE_180_DEG_ENEMY = 54, // Defaults to 180 if ConeDegrees is not set + TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell + TARGET_UNIT_CASTER_AREA_RAID = 56, + TARGET_UNIT_TARGET_RAID = 57, + TARGET_UNIT_NEARBY_RAID = 58, + TARGET_UNIT_CONE_ALLY = 59, + TARGET_UNIT_CONE_ENTRY = 60, + TARGET_UNIT_TARGET_AREA_RAID_CLASS = 61, + TARGET_DEST_CASTER_GROUND = 62, + TARGET_DEST_TARGET_ANY = 63, + TARGET_DEST_TARGET_FRONT = 64, + TARGET_DEST_TARGET_BACK = 65, + TARGET_DEST_TARGET_RIGHT = 66, + TARGET_DEST_TARGET_LEFT = 67, + TARGET_DEST_TARGET_FRONT_RIGHT = 68, + TARGET_DEST_TARGET_BACK_RIGHT = 69, + TARGET_DEST_TARGET_BACK_LEFT = 70, + TARGET_DEST_TARGET_FRONT_LEFT = 71, + TARGET_DEST_CASTER_RANDOM = 72, + TARGET_DEST_CASTER_RADIUS = 73, + TARGET_DEST_TARGET_RANDOM = 74, + TARGET_DEST_TARGET_RADIUS = 75, + TARGET_DEST_CHANNEL_TARGET = 76, + TARGET_UNIT_CHANNEL_TARGET = 77, + TARGET_DEST_DEST_FRONT = 78, + TARGET_DEST_DEST_BACK = 79, + TARGET_DEST_DEST_RIGHT = 80, + TARGET_DEST_DEST_LEFT = 81, + TARGET_DEST_DEST_FRONT_RIGHT = 82, + TARGET_DEST_DEST_BACK_RIGHT = 83, + TARGET_DEST_DEST_BACK_LEFT = 84, + TARGET_DEST_DEST_FRONT_LEFT = 85, + TARGET_DEST_DEST_RANDOM = 86, + TARGET_DEST_DEST = 87, + TARGET_DEST_DYNOBJ_NONE = 88, + TARGET_DEST_TRAJ = 89, + TARGET_UNIT_TARGET_MINIPET = 90, + TARGET_DEST_DEST_RADIUS = 91, + TARGET_UNIT_SUMMONER = 92, + TARGET_CORPSE_SRC_AREA_ENEMY = 93, // NYI + TARGET_UNIT_VEHICLE = 94, + TARGET_UNIT_TARGET_PASSENGER = 95, + TARGET_UNIT_PASSENGER_0 = 96, + TARGET_UNIT_PASSENGER_1 = 97, + TARGET_UNIT_PASSENGER_2 = 98, + TARGET_UNIT_PASSENGER_3 = 99, + TARGET_UNIT_PASSENGER_4 = 100, + TARGET_UNIT_PASSENGER_5 = 101, + TARGET_UNIT_PASSENGER_6 = 102, + TARGET_UNIT_PASSENGER_7 = 103, + TARGET_UNIT_CONE_CASTER_TO_DEST_ENEMY = 104, + TARGET_UNIT_CASTER_AND_PASSENGERS = 105, + TARGET_DEST_CHANNEL_CASTER = 106, + TARGET_DEST_NEARBY_ENTRY_2 = 107, + TARGET_GAMEOBJECT_CONE_CASTER_TO_DEST_ENEMY = 108, + TARGET_GAMEOBJECT_CONE_CASTER_TO_DEST_ALLY = 109, + TARGET_UNIT_CONE_CASTER_TO_DEST_ENTRY = 110, + TARGET_UNK_111 = 111, // NYI + TARGET_UNK_112 = 112, // NYI + TARGET_UNK_113 = 113, // NYI + TARGET_UNK_114 = 114, // NYI + TARGET_UNIT_SRC_AREA_FURTHEST_ENEMY = 115, + TARGET_UNIT_AND_DEST_LAST_ENEMY = 116, + TARGET_UNK_117 = 117, + TARGET_UNIT_TARGET_ALLY_OR_RAID = 118, // If target is in your party or raid, all party and raid members will be affected + TARGET_CORPSE_SRC_AREA_RAID = 119, + TARGET_UNIT_CASTER_AND_SUMMONS = 120, + TARGET_CORPSE_TARGET_ALLY = 121, + TARGET_UNIT_AREA_THREAT_LIST = 122, // any unit on threat list + TARGET_UNIT_AREA_TAP_LIST = 123, + TARGET_UNIT_TARGET_TAP_LIST = 124, + TARGET_DEST_CASTER_GROUND_2 = 125, + TARGET_UNIT_CASTER_AREA_ENEMY_CLUMP = 126, // NYI + TARGET_DEST_CASTER_ENEMY_CLUMP_CENTROID = 127, // NYI + TARGET_UNIT_RECT_CASTER_ALLY = 128, + TARGET_UNIT_RECT_CASTER_ENEMY = 129, + TARGET_UNIT_RECT_CASTER = 130, + TARGET_DEST_SUMMONER = 131, + TARGET_DEST_TARGET_ALLY = 132, + TARGET_UNIT_LINE_CASTER_TO_DEST_ALLY = 133, + TARGET_UNIT_LINE_CASTER_TO_DEST_ENEMY = 134, + TARGET_UNIT_LINE_CASTER_TO_DEST = 135, + TARGET_UNIT_CONE_CASTER_TO_DEST_ALLY = 136, + TARGET_DEST_CASTER_MOVEMENT_DIRECTION = 137, + TARGET_DEST_DEST_GROUND = 138, + TARGET_UNK_139 = 139, + TARGET_DEST_CASTER_CLUMP_CENTROID = 140, // NYI + TARGET_UNK_141 = 141, + TARGET_UNK_142 = 142, + TARGET_UNK_143 = 143, + TARGET_UNK_144 = 144, + TARGET_UNK_145 = 145, + TARGET_UNK_146 = 146, + TARGET_UNK_147 = 147, + TARGET_UNK_148 = 148, + TOTAL_SPELL_TARGETS }; /// ///Spell proc event related declarations (accessed using SpellMgr functions) /// [Flags] - public enum ProcFlags + public enum ProcFlags : uint { - PROC_FLAG_KILLED = 0x00000001, // 00 Killed by agressor - not sure about this flag - PROC_FLAG_KILL = 0x00000002, // 01 Kill target (in most cases need XP/Honor reward) + PROC_FLAG_HEARTBEAT = 0x00000001, // 00 Heartbeat + PROC_FLAG_KILL = 0x00000002, // 01 Kill target (in most cases need XP/Honor reward) - PROC_FLAG_DONE_MELEE_AUTO_ATTACK = 0x00000004, // 02 Done melee auto attack - PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK = 0x00000008, // 03 Taken melee auto attack + PROC_FLAG_DEAL_MELEE_SWING = 0x00000004, // 02 Deal Melee Swing + PROC_FLAG_TAKE_MELEE_SWING = 0x00000008, // 03 Take Melee Swing - PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS = 0x00000010, // 04 Done attack by Spell that has dmg class melee - PROC_FLAG_TAKEN_SPELL_MELEE_DMG_CLASS = 0x00000020, // 05 Taken attack by Spell that has dmg class melee + PROC_FLAG_DEAL_MELEE_ABILITY = 0x00000010, // 04 Deal Melee Ability + PROC_FLAG_TAKE_MELEE_ABILITY = 0x00000020, // 05 Take Melee Ability - PROC_FLAG_DONE_RANGED_AUTO_ATTACK = 0x00000040, // 06 Done ranged auto attack - PROC_FLAG_TAKEN_RANGED_AUTO_ATTACK = 0x00000080, // 07 Taken ranged auto attack + PROC_FLAG_DEAL_RANGED_ATTACK = 0x00000040, // 06 Deal Ranged Attack + PROC_FLAG_TAKE_RANGED_ATTACK = 0x00000080, // 07 Take Ranged Attack - PROC_FLAG_DONE_SPELL_RANGED_DMG_CLASS = 0x00000100, // 08 Done attack by Spell that has dmg class ranged - PROC_FLAG_TAKEN_SPELL_RANGED_DMG_CLASS = 0x00000200, // 09 Taken attack by Spell that has dmg class ranged + PROC_FLAG_DEAL_RANGED_ABILITY = 0x00000100, // 08 Deal Ranged Ability + PROC_FLAG_TAKE_RANGED_ABILITY = 0x00000200, // 09 Take Ranged Ability - PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS = 0x00000400, // 10 Done positive spell that has dmg class none - PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_POS = 0x00000800, // 11 Taken positive spell that has dmg class none + PROC_FLAG_DEAL_HELPFUL_ABILITY = 0x00000400, // 10 Deal Helpful Ability + PROC_FLAG_TAKE_HELPFUL_ABILITY = 0x00000800, // 11 Take Helpful Ability - PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_NEG = 0x00001000, // 12 Done negative spell that has dmg class none - PROC_FLAG_TAKEN_SPELL_NONE_DMG_CLASS_NEG = 0x00002000, // 13 Taken negative spell that has dmg class none + PROC_FLAG_DEAL_HARMFUL_ABILITY = 0x00001000, // 12 Deal Harmful Ability + PROC_FLAG_TAKE_HARMFUL_ABILITY = 0x00002000, // 13 Take Harmful Ability - PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS = 0x00004000, // 14 Done positive spell that has dmg class magic - PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_POS = 0x00008000, // 15 Taken positive spell that has dmg class magic + PROC_FLAG_DEAL_HELPFUL_SPELL = 0x00004000, // 14 Deal Helpful Spell + PROC_FLAG_TAKE_HELPFUL_SPELL = 0x00008000, // 15 Take Helpful Spell - PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_NEG = 0x00010000, // 16 Done negative spell that has dmg class magic - PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG = 0x00020000, // 17 Taken negative spell that has dmg class magic + PROC_FLAG_DEAL_HARMFUL_SPELL = 0x00010000, // 16 Deal Harmful Spell + PROC_FLAG_TAKE_HARMFUL_SPELL = 0x00020000, // 17 Take Harmful Spell - PROC_FLAG_DONE_PERIODIC = 0x00040000, // 18 Successful do periodic (damage / healing) - PROC_FLAG_TAKEN_PERIODIC = 0x00080000, // 19 Taken spell periodic (damage / healing) + PROC_FLAG_DEAL_HARMFUL_PERIODIC = 0x00040000, // 18 Deal Harmful Periodic + PROC_FLAG_TAKE_HARMFUL_PERIODIC = 0x00080000, // 19 Take Harmful Periodic - PROC_FLAG_TAKEN_DAMAGE = 0x00100000, // 20 Taken any damage - PROC_FLAG_DONE_TRAP_ACTIVATION = 0x00200000, // 21 On trap activation (possibly needs name change to ON_GAMEOBJECT_CAST or USE) + PROC_FLAG_TAKE_ANY_DAMAGE = 0x00100000, // 20 Take Any Damage - PROC_FLAG_DONE_MAINHAND_ATTACK = 0x00400000, // 22 Done main-hand melee attacks (spell and autoattack) - PROC_FLAG_DONE_OFFHAND_ATTACK = 0x00800000, // 23 Done off-hand melee attacks (spell and autoattack) + PROC_FLAG_DEAL_HELPFUL_PERIODIC = 0x00200000, // 21 Deal Helpful Periodic - PROC_FLAG_DEATH = 0x01000000 // 24 Died in any way + PROC_FLAG_MAIN_HAND_WEAPON_SWING = 0x00400000, // 22 Main Hand Weapon Swing + PROC_FLAG_OFF_HAND_WEAPON_SWING = 0x00800000, // 23 Off Hand Weapon Swing + + PROC_FLAG_DEATH = 0x01000000, // 24 Died in any way + + PROC_FLAG_JUMP = 0x02000000, // 25 Jumped + + PROC_FLAG_PROC_CLONE_SPELL = 0x04000000, // 26 Proc Clone Spell + + PROC_FLAG_ENTER_COMBAT = 0x08000000, // 27 Entered combat + + PROC_FLAG_ENCOUNTER_START = 0x10000000, // 28 Encounter started + + PROC_FLAG_CAST_ENDED = 0x20000000, // 29 Cast Ended + + PROC_FLAG_LOOTED = 0x40000000, // 30 Looted (took from loot, not opened loot window) + + PROC_FLAG_TAKE_HELPFUL_PERIODIC = 0x80000000, // 31 Take Helpful Periodic }; [Flags] @@ -1196,9 +1211,10 @@ public enum SpellDmgClass public enum SpellPreventionType { - SPELL_PREVENTION_TYPE_NONE = 0, - SPELL_PREVENTION_TYPE_SILENCE = 1, - SPELL_PREVENTION_TYPE_PACIFY = 2 + SPELL_PREVENTION_TYPE_NONE = 0, + SPELL_PREVENTION_TYPE_SILENCE = 1, + SPELL_PREVENTION_TYPE_PACIFY = 2, + SPELL_PREVENTION_TYPE_NO_ACTIONS = 4 }; [Flags] @@ -1441,7 +1457,7 @@ public enum ItemSubClassWeaponMask POLEARM = 1 << 6, SWORD = 1 << 7, SWORD2 = 1 << 8, - OBSOLETE = 1 << 9, + WARGLAIVES = 1 << 9, STAFF = 1 << 10, EXOTIC = 1 << 11, EXOTIC2 = 1 << 12, @@ -1458,30 +1474,32 @@ public enum ItemSubClassWeaponMask [Flags] public enum ItemSubClassArmorMask { - ALL = -1, - MISC = 1 << 0, - CLOTH = 1 << 1, - LEATHER = 1 << 2, - MAIL = 1 << 3, - PLATE = 1 << 4, - BUCKLER = 1 << 5, - SHIELD = 1 << 6, - LIBRAM = 1 << 7, - IDOL = 1 << 8, - TOTEM = 1 << 9, - SIGIL = 1 << 10 + ALL = -1, + MISCELLANEOUS = 1 << 0, + CLOTH = 1 << 1, + LEATHER = 1 << 2, + MAIL = 1 << 3, + PLATE = 1 << 4, + COSMETIC = 1 << 5, + SHIELD = 1 << 6, + LIBRAM = 1 << 7, + IDOL = 1 << 8, + TOTEM = 1 << 9, + SIGIL = 1 << 10, + RELIC = 1 << 11, }; [Flags] public enum ItemSubClassMiscMask { - ALL = -1, - JUNK = 1 << 0, - REAGENT = 1 << 1, - PET = 1 << 2, - HOLIDAY = 1 << 3, - OTHER = 1 << 4, - MOUNT = 1 << 5, + ALL = -1, + JUNK = 1 << 0, + REAGENT = 1 << 1, + COMPANION_PET = 1 << 2, + HOLIDAY = 1 << 3, + OTHER = 1 << 4, + MOUNT = 1 << 5, + MOUNT_EQUIPMENT = 1 << 6 } [Flags] @@ -1501,7 +1519,9 @@ public enum CreatureTypeMask NOT_SPECIFIED = 1 << 9, TOTEM = 1 << 10, NON_COMBAT_PET = 1 << 11, - GAS_CLOUD = 1 << 12 + GAS_CLOUD = 1 << 12, + WILD_PET = 1 << 13, + ABERRATION = 1 << 14 }; [Flags] @@ -2105,52 +2125,84 @@ public enum UnitMods [Flags] enum SpellInterruptFlags { - SPELL_INTERRUPT_FLAG_MOVEMENT = 0x01, // why need this for instant? - SPELL_INTERRUPT_FLAG_PUSH_BACK = 0x02, // push back - SPELL_INTERRUPT_FLAG_UNK3 = 0x04, // any info? - SPELL_INTERRUPT_FLAG_INTERRUPT = 0x08, // interrupt - SPELL_INTERRUPT_FLAG_ABORT_ON_DMG = 0x10, // _complete_ interrupt on direct damage - SPELL_INTERRUPT_UNK = 0x20 // unk, 564 of 727 spells having this spell start with "Glyph" + None = 0, + Movement = 0x00000001, + DamagePushbackPlayerOnly = 0x00000002, + Stun = 0x00000004, // useless, even spells without it get interrupted + Combat = 0x00000008, + DamageCancelsPlayerOnly = 0x00000010, + MeleeCombat = 0x00000020, // NYI + Immunity = 0x00000040, // NYI + DamageAbsorb = 0x00000080, + ZeroDamageCancels = 0x00000100, + DamagePushback = 0x00000200, + DamageCancels = 0x00000400 }; [Flags] - enum SpellChannelInterruptFlags + enum SpellAuraInterruptFlags : uint { - CHANNEL_INTERRUPT_FLAG_INTERRUPT = 0x0008, // interrupt - CHANNEL_FLAG_DELAY = 0x4000 + None = 0, + HostileActionReceived = 0x00000001, + Damage = 0x00000002, + Action = 0x00000004, + Moving = 0x00000008, + Turning = 0x00000010, + Anim = 0x00000020, + Dismount = 0x00000040, + UnderWater = 0x00000080, + AboveWater = 0x00000100, + Sheathing = 0x00000200, + Interacting = 0x00000400, + Looting = 0x00000800, + Attacking = 0x00001000, + ItemUse = 0x00002000, + DamageChannelDuration = 0x00004000, + Shapeshifting = 0x00008000, + ActionDelayed = 0x00010000, + Mount = 0x00020000, + Standing = 0x00040000, + LeaveWorld = 0x00080000, + StealthOrInvis = 0x00100000, + InvulnerabilityBuff = 0x00200000, + EnterWorld = 0x00400000, + PvPActive = 0x00800000, + NonPeriodicDamage = 0x01000000, + LandingOrFlight = 0x02000000, + Release = 0x04000000, + DamageScript = 0x08000000, + EnteringCombat = 0x10000000, + Login = 0x20000000, + Summon = 0x40000000, + LeavingCombat = 0x80000000, }; [Flags] - enum SpellAuraInterruptFlags + enum SpellAuraInterruptFlags2 : uint { - AURA_INTERRUPT_FLAG_HITBYSPELL = 0x00000001, // 0 removed when getting hit by a negative spell? - AURA_INTERRUPT_FLAG_TAKE_DAMAGE = 0x00000002, // 1 removed by any damage - AURA_INTERRUPT_FLAG_CAST = 0x00000004, // 2 cast any spells - AURA_INTERRUPT_FLAG_MOVE = 0x00000008, // 3 removed by any movement - AURA_INTERRUPT_FLAG_TURNING = 0x00000010, // 4 removed by any turning - AURA_INTERRUPT_FLAG_JUMP = 0x00000020, // 5 removed by entering combat - AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040, // 6 removed by dismounting - AURA_INTERRUPT_FLAG_NOT_ABOVEWATER = 0x00000080, // 7 removed by entering water - AURA_INTERRUPT_FLAG_NOT_UNDERWATER = 0x00000100, // 8 removed by leaving water - AURA_INTERRUPT_FLAG_NOT_SHEATHED = 0x00000200, // 9 removed by unsheathing - AURA_INTERRUPT_FLAG_TALK = 0x00000400, // 10 talk to npc / loot? action on creature - AURA_INTERRUPT_FLAG_USE = 0x00000800, // 11 mine/use/open action on gameobject - AURA_INTERRUPT_FLAG_MELEE_ATTACK = 0x00001000, // 12 removed by attacking - AURA_INTERRUPT_FLAG_SPELL_ATTACK = 0x00002000, // 13 ??? - AURA_INTERRUPT_FLAG_UNK14 = 0x00004000, // 14 - AURA_INTERRUPT_FLAG_TRANSFORM = 0x00008000, // 15 removed by transform? - AURA_INTERRUPT_FLAG_UNK16 = 0x00010000, // 16 - AURA_INTERRUPT_FLAG_MOUNT = 0x00020000, // 17 misdirect, aspect, swim speed - AURA_INTERRUPT_FLAG_NOT_SEATED = 0x00040000, // 18 removed by standing up (used by food and drink mostly and sleep/Fake Death like) - AURA_INTERRUPT_FLAG_CHANGE_MAP = 0x00080000, // 19 leaving map/getting teleported - AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION = 0x00100000, // 20 removed by auras that make you invulnerable, or make other to lose selection on you - AURA_INTERRUPT_FLAG_UNK21 = 0x00200000, // 21 - AURA_INTERRUPT_FLAG_TELEPORTED = 0x00400000, // 22 - AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT = 0x00800000, // 23 removed by entering pvp combat - AURA_INTERRUPT_FLAG_DIRECT_DAMAGE = 0x01000000, // 24 removed by any direct damage - AURA_INTERRUPT_FLAG_LANDING = 0x02000000, // 25 removed by hitting the ground - - AURA_INTERRUPT_FLAG_NOT_VICTIM = (AURA_INTERRUPT_FLAG_HITBYSPELL | AURA_INTERRUPT_FLAG_TAKE_DAMAGE | AURA_INTERRUPT_FLAG_DIRECT_DAMAGE) + None = 0, + Falling = 0x00000001, + Swimming = 0x00000002, + NotMoving = 0x00000004, + Ground = 0x00000008, + Transform = 0x00000010, + Jump = 0x00000020, + ChangeSpec = 0x00000040, + AbandonVehicle = 0x00000080, + StartOfEncounter = 0x00000100, + EndOfEncounter = 0x00000200, + Disconnect = 0x00000400, + EnteringInstance = 0x00000800, + DuelEnd = 0x00001000, + LeaveArenaOrBattleground = 0x00002000, + ChangeTalent = 0x00004000, + ChangeGlyph = 0x00008000, + SeamlessTransfer = 0x00010000, + WarModeLeave = 0x00020000, + TouchingGround = 0x00040000, + ChromieTime = 0x00080000, + SplineFlightOrFreeFlight = 0x00100000, + ProcOrPeriodicAttacking = 0x00200000 }; // ReSharper restore InconsistentNaming @@ -2162,7 +2214,7 @@ public class SpellEnums public static readonly string[] ProcFlagDesc = { //00 0x00000001 000000000000000000000001 - - "00 Killed by aggressor that receive experience or honor", + "00 Heartbeat", //01 0x00000002 000000000000000000000010 - "01 Kill that yields experience or honor", @@ -2214,7 +2266,7 @@ public class SpellEnums //20 0x00100000 000100000000000000000000 - "20 Taken any damage", //21 0x00200000 001000000000000000000000 - - "21 On trap activation", + "21 Deal helpful periodic", //22 0x00800000 010000000000000000000000 - "22 Successful main-hand melee attacks", @@ -2223,13 +2275,19 @@ public class SpellEnums //24 0x01000000 "24 On death", - "25", - "26", - "27", - "28", - "29", - "30", - "31" + //25 0x02000000 + "25 Jumped", + "26 Proc Clone Spell", + //27 0x08000000 + "27 Entered combat", + //28 0x10000000 + "28 Encounter started", + "29 On end of spell cast", + "30 Looted something", + "31 Taken helpful periodic", + "32 Kill or assist in killing target (not restricted to killing blow)", + "33 Knockback", + "34 Cast Successful", }; #endregion } diff --git a/SpellWork/Spell/SpellInfo.cs b/SpellWork/Spell/SpellInfo.cs index 79700b13..79d39d04 100644 --- a/SpellWork/Spell/SpellInfo.cs +++ b/SpellWork/Spell/SpellInfo.cs @@ -211,6 +211,20 @@ public void Write(RichTextBox rtb) rtb.AppendFormatLine("ID - {0} {1}{2}", ID, Name, Scaling != null ? $" (Level {DBC.DBC.SelectedLevel})" : string.Empty); rtb.SetDefaultStyle(); + rtb.AppendLine($"https://wowhead.com/spell={ID}"); + + if (MySqlConnection.Connected) + { + var scripts = MySqlConnection.GetScriptNames((uint)ID); + if (scripts.Count > 0) + { + rtb.AppendLine("Scripts:"); + rtb.SetStyle(Color.Blue, FontStyle.Bold); + foreach (string script in scripts) + rtb.AppendLine(script); + rtb.SetDefaultStyle(); + } + } rtb.AppendFormatLine(Separator); @@ -474,8 +488,8 @@ from eff in s.Effects if (Interrupts != null) { rtb.AppendFormatLine("Interrupt Flags: 0x{0:X8} ({1})", Interrupts.InterruptFlags, (SpellInterruptFlags)Interrupts.InterruptFlags); - rtb.AppendFormatLine("AuraInterrupt Flags: 0x{0:X8} ({1}), 0x{2:X8} ({3})", Interrupts.AuraInterruptFlags[0], (SpellAuraInterruptFlags)Interrupts.AuraInterruptFlags[0], Interrupts.AuraInterruptFlags[1], (SpellAuraInterruptFlags)Interrupts.AuraInterruptFlags[1]); - rtb.AppendFormatLine("ChannelInterrupt Flags: 0x{0:X8} ({1}), 0x{2:X8} ({3})", Interrupts.ChannelInterruptFlags[0], (SpellChannelInterruptFlags)Interrupts.ChannelInterruptFlags[0], Interrupts.ChannelInterruptFlags[1], (SpellChannelInterruptFlags)Interrupts.ChannelInterruptFlags[1]); + rtb.AppendFormatLine("AuraInterrupt Flags: 0x{0:X8} ({1}), 0x{2:X8} ({3})", Interrupts.AuraInterruptFlags[0], (SpellAuraInterruptFlags)Interrupts.AuraInterruptFlags[0], Interrupts.AuraInterruptFlags[1], (SpellAuraInterruptFlags2)Interrupts.AuraInterruptFlags[1]); + rtb.AppendFormatLine("ChannelInterrupt Flags: 0x{0:X8} ({1}), 0x{2:X8} ({3})", Interrupts.ChannelInterruptFlags[0], (SpellAuraInterruptFlags)Interrupts.ChannelInterruptFlags[0], Interrupts.ChannelInterruptFlags[1], (SpellAuraInterruptFlags)Interrupts.ChannelInterruptFlags[1]); } if (CasterAuraState != 0) @@ -584,10 +598,9 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) rtb.AppendFormatLine($"Difficulty: Id { effect.DifficultyID } ({ (Difficulty)effect.DifficultyID })"); rtb.SetDefaultStyle(); - var value = 0.0f; + var value = CalculateBaseEffectValue(effect); - if (effect.SpellEffectScalingEntry != null && - Math.Abs(effect.SpellEffectScalingEntry.Coefficient) > 1.0E-5f && + if (Math.Abs(effect.Coefficient) > 1.0E-5f && Scaling != null && Scaling.Class != 0) { @@ -608,7 +621,6 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) if (Scaling.Class != 0) { - if (Scaling.ScalesFromItemLevel == 0) { if ((AttributesEx11 & (uint)SpellAtributeEx11.SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL) == 0) @@ -639,20 +651,20 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) // value *= ((((1.0f - Scaling.NerfFactor) * (level - 1)) / (Scaling.NerfMaxLevel - 1)) + Scaling.NerfFactor); } - value *= effect.SpellEffectScalingEntry.Coefficient; + value *= effect.Coefficient; if (Math.Abs(value) > 1.0E-5f && value < 1.0f) value = 1.0f; - if (Math.Abs(effect.SpellEffectScalingEntry.Variance) > 1.0E-5f) + if (Math.Abs(effect.Variance) > 1.0E-5f) { - var delta = Math.Abs(value * effect.SpellEffectScalingEntry.Variance * 0.5f); + var delta = Math.Abs(value * effect.Variance * 0.5f); rtb.AppendFormat("BasePoints = {0:F} to {1:F}", value - delta, value + delta); } else rtb.AppendFormat("BasePoints = {0:F}", value); - if (Math.Abs(effect.SpellEffectScalingEntry.ResourceCoefficient) > 1.0E-5f) - rtb.AppendFormatIfNotNull(" + combo * {0:F}", effect.SpellEffectScalingEntry.ResourceCoefficient * value); + if (Math.Abs(effect.ResourceCoefficient) > 1.0E-5f) + rtb.AppendFormatIfNotNull(" + combo * {0:F}", effect.ResourceCoefficient * value); } else { @@ -674,15 +686,15 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) } if (effect.EffectBonusCoefficient > 1.0E-5f) - rtb.AppendFormat(" + spellPower * {0}", effect.EffectBonusCoefficient); + rtb.AppendFormat(" + SP * {0}", effect.EffectBonusCoefficient); if (effect.BonusCoefficientFromAP > 1.0E-5) rtb.AppendFormat(" + AP * {0}", effect.BonusCoefficientFromAP); - // if (Math.Abs(effect.DamageMultiplier - 1.0f) > 1.0E-5f) - // rtb.AppendFormat(" x {0:F}", effect.DamageMultiplier); + if (Math.Abs(effect.EffectChainAmplitude - 1.0f) > 1.0E-5f) + rtb.AppendFormat(" x {0:F}", effect.EffectChainAmplitude); - // rtb.AppendFormatIfNotNull(" Multiple = {0:F}", effect.ValueMultiplier); + rtb.AppendFormatIfNotNull(" Multiple = {0:F}", effect.EffectAmplitude); rtb.AppendLine(); rtb.AppendFormatLine("Targets ({0}, {1}) ({2}, {3})", From 20a78f276cc4005b93bddb930e5e6df4bc7e0f78 Mon Sep 17 00:00:00 2001 From: "Antonio M. Berti" <15972392+BertiRean@users.noreply.github.com> Date: Wed, 20 Mar 2024 17:19:44 -0300 Subject: [PATCH 4/5] Fixed Build and added Missing dll files --- .gitignore | 1 + SpellWork/Spell/SpellInfo.cs | 2 +- .../lib/DBFileReaderLib.dll | Bin 0 -> 82944 bytes 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 packages/DBFileReaderLib.1.0.0.0/lib/DBFileReaderLib.dll diff --git a/.gitignore b/.gitignore index 3a2238d6..5d6a8b28 100644 --- a/.gitignore +++ b/.gitignore @@ -152,6 +152,7 @@ publish/ **/packages/* # except build/, which is used as an MSBuild target. !**/packages/build/ +!**/packages/DBFileReaderLib.1.0.0.0/ # Uncomment if necessary however generally it will be regenerated when needed #!**/packages/repositories.config # NuGet v3's project.json files produces more ignoreable files diff --git a/SpellWork/Spell/SpellInfo.cs b/SpellWork/Spell/SpellInfo.cs index 79d39d04..3386893c 100644 --- a/SpellWork/Spell/SpellInfo.cs +++ b/SpellWork/Spell/SpellInfo.cs @@ -598,7 +598,7 @@ private void AppendEffectInfo(RichTextBox rtb, SpellEffectEntry effect) rtb.AppendFormatLine($"Difficulty: Id { effect.DifficultyID } ({ (Difficulty)effect.DifficultyID })"); rtb.SetDefaultStyle(); - var value = CalculateBaseEffectValue(effect); + var value = 0.0f; if (Math.Abs(effect.Coefficient) > 1.0E-5f && Scaling != null && diff --git a/packages/DBFileReaderLib.1.0.0.0/lib/DBFileReaderLib.dll b/packages/DBFileReaderLib.1.0.0.0/lib/DBFileReaderLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..0953e39b6013dfd1844638c735c6e1eb66b3d33f GIT binary patch literal 82944 zcmeFa2Yi&p);~Vav%AmMl+BhDN)kxIl1(C20|WOWcW%{)<+K%Vu z5UcJM!k&^v_KS4U8&GX$q7p4vZh`}>ptBWpwSw+eaF7-Bwt_9xFtYqrM2#XA~rg@mt>x#P5hsNwi169m~>$5%3hfyXC!`yC3Q) zx_IY?lJ0q)q96Xgp?%f468D;oe5)Trj-H}|pEi{Cx&_!%bl=Eejml89`OjKMYzm=H3fVk^ACYje0^D}0``bu&> zG2dV&Y^|7=5%WoA4oWiFAa^nI7?W9fe)YA?8I$BRR9^^=?xW^xHkflP01IoFL7rOgx*Lk97f1EjGFpd2~I zE(6WttM3MqI1JS&=kiWOd5{cBp|grny3eRI>M>?~6bI)GpM?C5E9aprEBTJs{^Z^jJ^)u7}w)SxI91-Fl)I zeq#rN1UxbHA79=TtsqkxHI|g-x|hUU$U1Qd_~p}dOQtp8oJAJ9ok;l!dJL0&JkbyA z=#@jM5O-217!b1)>Yo^Z=*d3aU^zW85U@0HD5Wt*wK;K0Ef4M(dYo!2U0{@O+8Bz7 zJ4TynEiw)PJJM1U)aOlREyi3yI{EZ@6-7q$N($376W5hu7>#if9gK2~^0vC;M8_@- z^Ihz4Fk-pfY_O#+&^-id5iBgKKLSy{xZ7|ih9IOTjsz|BS8jJ02~^gXz%t}3r!=q~ ztsOzm%#k=6e9{@i&8J5b$C4Pg6D%R1Sx~RL1)aMI&E`vBjq+s+J#id<^Tu33R`f;v z@jSz=yYoipB}RZ>m>nC5pPSvewSKoTZ*rH-RE36G@Ti|RasZ4`CW8aA-=BvvVThof z+elnF%_7Zc0uJs73Cse%#<9fE9s11U5r~~YEc9W>!~(Eg<2V@|8&9z(fjHKq33S=5 zYJjH`M71j&(YRqWd_!FngAP?^yTX_PjSzIiFlytam4UJxZC50Oc5=sk4cj4IKM~Tt z91%MizZH3gKN`re)}gxF%vrM{6H^!LWi(P@9~ITzyRWHBXpq!V z(xJoTlvSoXoC#EdIzRQLKF|Xd2|B13bT-^KVuVg2gA{w}(L_duw}Gmm$JzmO4ajPG z6KEr%|>E;x$uD3>A+jFjRd0cn^1?0D*vq28U76 zCKg0ohR5*I3?FxRXy^dcK_;G|V4@zV%$-1&@l`(ck@o^zx;+PSrOgx*3qzI+ z5y#M@fzCq^ECf*?GtNt9r#9`d% zcPAR5dqsu2p$Wgx{|Lm-Jq|OnyWxCrJWp0T}IiJEh z*l92MsH%8aVI#K|j?cWwhh+Ws+ixg<=T9`MK=+4Du$so(j!wLfO4BTi&L`(2m*@%^ zbnu`kGMK&rTuZ^r2vPfgUZP2#Dm$;f_Fh407OR3m#S!J*^DjAFRIGeD_v`@-d ztkByogIP@FW3eXo^45HkI;Yy?5W7UFnM}OM_+7^s8iir9q!+`2jYWW}3yYLOSy67r@*xa&F4Wm%!$P{Bq0_htqf< z>Z@M};xpK#Ph5j=VPMJu{<>mKoKb%*;CV*kI{XyX9yKen+9!Jo2xdj*to(UiYM-d2)P~I zP!V=JH~pdkU;fssMS7P40i+k7hlEsGNaPO>&T<9$lY)sxDDST*U`1?AT@PIc>Msg zy%P5$ez(GPsmB9Uc#9cgprIbgyho|bZl1~24XK|V!^~%lX3wM%JW@kxqnRkqo`0LMvOBWGUDAW?oP<9HxNH)Ofl#jz(_m>(IAXV&KRHO2Hm43 z*M^KBszBLwdD`wDnP>JnF!q_fk<*fbQ6^_RGbHxX_`YhekOjMs_L8w_|h<{DnWYq%898z_-pvL-g3`h>BDhw7rf8RXMTNwD6NA9`iJT#CYNNw0N4(204c_ z+{P%qfvS~&k7INhV5XM5LEy>qln{5ag?q_$Eez(7ClsTa`XXOT;W^F(I}^OrvJGV^ zjUFI5&ewUW9Qk*=6jD4=*s`g$!zTjg8I=-0sU$};ccn!y- zVp*x|Yq*p+%`RbE!==PjyTl0V8ZISHw@ZvNCFGu8%1pD%j84k%Zdc0S`j}PQF-aNT zHA|T@>@sOj78O$k7w4P-9%`(PLPg49~b2dM~D70=ax?qzAV4*ehe&23xKBy!zHZ ziIk1#473#2|AhehsT1L+5DvL$nVn|D+F-2+xr6S8XAxO35`i@o7#egbUXCZRnsmt1 z8z{XjBxuwIJ&C8mkC*5TR7lXBcm^<;EGd^j##pU$d3_E#yUdl^=gA8@t;p@LDNna) z#2e8?aXKTjZi>($23;8s^Gw%FJqTL*N}DN$HqY`xFuN=9k-w(^_Cxm1SZH`Ers$$@k{V zos06Uz8s~B6_GDTnwZ{LjKuchby<8ls#dx$$2@3)VMiJ14b0$)W50d5A;@=6zMQNo zXA1H=eYqpjGPe41X&EcU|F8LSIO@iE%tbWA{Rthrh4UCGF~=@p^W~((#dZmsFDE4~ zu}h3f`e1y5AZ0GK%ZyISurDWNF0;#wNy@MJ&&aK=*vl&EA29AzMPb~$}WSsQeDfiSYf_hrX(q2vF6ow8H{b25BYMk zqy=_~Qd5G?*`&lmyF{5OL1%SR;u^bz&6krB*V-l0d^ss|on0o)myl<2IEXDtiJ7?-Vr-tWDT9$BvbG1%RSIP_P zIS0#+xmug6U_T7tJ)fYo=uTwByI9--x*9~@gw2_-`4Ud}5_Fovp2Tz2@W5CLf`#2i zS(cQhRcb;G(3O zAMO$EC!&Kdk8+RvHuoq1_b3pApD&NrqZVu><+rR|y!a0GGfN($=@B&d8PE~J67GJU1T zAx`IB9(n3jtH&-vhNh>~MwO^HPzmm(n85WIMopacOL|R|WG`M5U;3gGun=}gdIMFM z)y55vsdF&qO5cgHQ)2t{o&F9}s&lXgdA60?$*X&UPP&gS-ZT!Mo|TmV}^M&d;(s0zoXdo4(n`4ScMPad1~reia{ z=Vu}m#SRbGdZ|{b_v)@`a^Y5h0?KYWa>az8(k&TK>KSy4j zlhSvP^m?-6>m-9wulzE;-X>-4w9BBsDH--orOaJ+nf6H;_V1+3-FBHY|4z!>W0y(l zO#YpexYsUGYL=90*X4Ezn|~+sxX&(O^Y5g@{dS2o|4zz0V3$er@1zWFGO*aUnPw`B ze>Weako~)hvBvDDe>boN|E@dyyA=Ol@$Zn9j@@F_G&}F#(VIcbjxSatQ*aoUa@|4V#7%r!~h&*DQ){=*CWU+e{5ieC5oy+G^r&M6q1 zGx2Bf0Z*i1OgwzN;*Y1WE4BdPaw^L$x?zkJV*Mq5kn?Y#w8|fp49eZ~2Y*xkAg&9OQi%3?2G;w+TR*GZ+9 z$ffs15}TLET8dWogTTY8B-FtG}|qlk4P-ZTNq+a1L>(XJJP;3#t4trbqX zi>Vqrg3cS2G8Xp{dl9&gH=)FRU1&Wit#~8xHWfdBuDZ*LrtH1%;*}=vQ1SnyQ@Qh3 zbw5?gr=+${_bDyBC5TS?l*E@lCAU~-v=#f5EWcNuvPuY1g#PNPz(yLktN)ek;6VV3 zb-dhBSmd;Lntt31nM-`>8)Dxjijg)mb_*qf6wPuOMBd{HU0$}W@Ui%OX%Z8FW&|LZ>> z8=>u$56LH!Qu;3>y@BlbA<3YPt-h#~dCD%+E-7Qtezjc&E{Dp;Vuh#eGHJf3EbAG& zOj2j^MWw{Eb_ts=Dkav~C2YQ^lz7fAVe>_$#PfEEG+$K8thLLe`Jz(h1)EGWO@Txw4P@dI- z1A8DG*c9J%JTXfoozPB}a2HFsn+&tldY~ozuRE~P`^6n#*Q5Hl5~tkR&*2KtLD^p1 z*~>9QnP+L{iB&&j@;i?*LoWN3Q7nWQ6V9N^c4gFMaaDr`T^V)Jaz+Q3U7oJ~CwyAB z9&}qzHr$c#nUc*duxM!`^lzHo@|=Q z)XAn-oowQUH@e&#bpHoVHUoP;*;H3n`DD`@?NhFym1ojk#uLM+jmwS#Uo)6-MPJN0 zjhHZ;-hxrVj8>yZwLLz%OABR2Ls`{dpm!+QY=a+54h4gmm0>!)p&=9uCN{!mSY_i{ zK`1APhnT3ZbsjGt0}N*6gm*@b!Q8}VhzBERo=7kf%p&eE^B@GYXR_pq^2n zun}7fW%lD41oL zpDJZux67pYsZ!<*yG)v&DrMfZ%cS|KQsynYOq!o6W!|>QG*gFZ@tU}leutzVCOfVK zN%vEw%wO#?m|d-Brc&lzyG)v&DrMfY%cS|KQs#ZTOp#d@`KeOk1G|LHPn8lI>=HIV zRZ4tlm*`-YLeDfxiI40OSSVDT`I$y3^RZn9lb4d=XBwrElR z!(OoUk@)i=O#iUdO{Zp|GcXQ-kuVt?kY`{`Qap7Ab_Rs7_K}F5>1wQ}Uzt>%ft_h# zybdEY))7OUft@A8{fU3J3}ZMOjpxYlKnl;GFizLbrC(QUIe6uyi&u2ig~0gXGcqo} zf$~;oWRgLpn`dM{pt^L;6lY|lv^*m_OOM@)9L+Pbo^(bglag-c85!y3UW&ens*!GP zoEni{I52}QaaJmMU`F}v<-lw*)UX_wu_}F$1m`XlW*!Yx*}ddpIT*VD4bs#Aar-gY z7Bp?e;dH$;Rh#4q6jcWxRUbYEqY80=RXP+ZCAK1$jA{(feV&A!m!^S{_=GeVMkirp zkbg-J)nK2JHv3$}l?~G#QgHCqR_Zqn@hj?s88hf=xD#6YjDapN= zdKF0W=*sVob_%!}?m`-RR@3QsxcR!Nc^S0aVTrWIWa2E#k@zcF#DkM6Ovdr@EXPb3 z);aSb5OqrCYPg#+e*lDp@yJjnTI5R1%<}ZBTnRh~f!wa`P+pq63-T_Dd>xLu&XCod zikO5p?60YurC= zjIK@9iq8Op>gE{A7FV3PqOuO@6}7$c0(G`L`}r9RVL$&XWWVYYTCYAwWa0~ws5MX2 z=vuUt_|z_OoGC%qETzO}c8L+D1g+sx;&Z!1nqMVlzOc)r`BhTpOS?>(UnOP!W|v9x ztE9{}y9_2`>%E3j<|~^_GmZNCFUdwl$#tL4|D^QSB>gwC<2I5hPRj7LXeommU#v1| zewCE@#x8?-%X<2d4^#i1 zu4P}2De~WO_~*8JbGR)I0|F0;*t|Ks3}YY-m_tE=9`fdJ2cYTARbxGdDxSjOqv-vJ zcu@|iJ=$_P+mhNdh3+Asc0(WaotO4VNyw`Qz1BlPujNqCD-Q*I^wfm;JPe*dFb@R- z=IxF?#mmV^tVS7Whl2iE+@kk1_{ryC0`gGMOr{P6{pwIq-N+a8;!x1=7L3{VO^ca( zKHAH~F;HeOlaKb2hr1Q9Sz}um9c~=`%$t10AdIUT+AESU7z0I58T^j-RXY$W9fT*YyND zlQPBwEt_D@5N;I1)a49j2ZKwZp`3VrFep2_K~H4I6JJ3nm;(dk1aqdekj>a>U0w-h zBR)HrZ7O%j44jnJW17ap$w6nd^O->$Ltl@K$dALStN>Qb6u{zW0FjqyP*050Ib%3p z1s2u>11E~%E6d4{e<5v?=t&^%7r`)e2nWN#5Ek*5@bDE*DXVXwF24JtH_^27#3-u# z1{Hz^z%1x?}LCK@i($tNDe9t-Oe@3B~q2FhIRu_S|vH}_Z9I$U zskzNMPp4HvsAAiuk-_$oM;-Fmy{1*B>ZC5*d!B3dTvc@g z1nME0uoR{3^R}a#RUA$GJZTQ@Bn@Pg*8Y60wYySsFrdTVul=nc&zzg0Z@B8ixoU}nUbW8#hPBbOiE|o^U50f>@sC$KB>0#+a*d(iB$gx z*d;oc5~)6xVV8i%AZwKBrLo1`&l^j zdwj9MVYHvUDY#enFw7%@h;sj$u?$ zipzLC&@s}^T4K8(M=w8%H&UMRH58QvdeVw7f@^OWD(+Mj*Ak9T-M+~iFH=B|AY|;eOrY&snpFn;0wZZR;4Svvr(T~S`J%6VZToz*p53Aa3GD*4*nL90;3ui$jHWp z^egj~rvURUjMtH{@oHkIQ-Et_xIgi)lVSKnMk9I#$qb}0PG0yz>y7m5iaiG&J)h_k z-Qj~`MdvdB)~$iERvUB4pu){F0Q#2zC9kutL5Ai50AFX7Nl7(x15c`%*I7w5 z+Q5@q*uWoz;lny5H}I6-UN+xnX|@eKtI`)qY#Vs0>t6Ecj6AIS@0%fRzs|ZH%`W%f zvNqg24OFM({+lY5yxK~&;%zroivz6Kp-}91?7z`-YzyF(V=(Uf1cYAgKBIE$@uU1GQ8uIGOg?~W0Eqw zbCoi!?J{ZmZYk5oE;AsR5AURzVDVYMRu9AeYcb; zw##7aW8HU4nRa%WlBA5qn(gf}MM)XncguWA>@sDhOsZ{5?Go^Qq&BJkQD&F0?Ym_u z9qbaeeYcdr=Yy=a>u8n|;_Jv#1~*b!WSVJ}v+TRqW8UO__qp(KusPhHefL7z4`3Bc zesci3ZhE0$ivPcCw~aevQrqi#7fj-&N2=rG@5gb6-@j{n?MiO1E&JTm_S(WsZLeMC z_S&+2O>VE#cCdTcUK`2nwb9b{S~2fH$1u0oxQh<`9&aEHy0N|XV0(>A*YIw9){BtJ zfi}0-)@*ottzLm>y9h~d;B$HszaguTw|X-++Bx2s(16qjAMhl~t0;Modu_zOhWP#5 zW%I_lGNL0DI(qs(J0pIOb)SuwZ4^_bGrYC7tM(Zdp0iYgG|x`&@9}Mmf>W zHEPG}*Xte7kKegTTmC)1kkQ}V*6>)d|1KgM-< z%XRJ~N?qp;VjmgAzijM1UP@M`Cv^p?7vJcBi}k(+YL{r|eAx=~CI@roO-2{!<4PW` z1atTZ0q>}chCYzTHq|RQoiL9he)&VNJ>erhmlG!QWW$rs2=B zA72cGct6eo?8k32863bT=n5f^d!KP!=PVy#gV>R?5bxO!L;mznZy-sTkKV8tVO#`~ zAKmPYzIFt>S-d%%_-#%cRaki9NyNbKMC{p#>!@v{A3PJ}On%pRFM0MsoxVPNzTaaT{;Q4|TR>4N85LU(t(*eQwLwI%Qe? zk+u`kM(G=it+AMqY2EYjbu^>UcM|=yo-p1g@0aH|45Rl9BcG!R{fL8L79sjv9VO`E5M)G0n?Yy*hsG`iKoRsOz|;mJi5tKU~<3V02r%H1_!`++GKD5 zjAu*+2k-?xp7RLEUPYh6!P$zFe%GpBn%4=_L`}c%s9!W4V>AK(zNdb%m1X>q`u$k_ zZdAXU)bD2XyG8wCTH|z|t6$7)jK5UBf1_Uv1~&#H2E%qc{DvULhKl_b5Mu);1bB%V z^(pv<67`W(YBm&@keJRik3>U1M*>DQAQPnYIW47!45llR zX-oP1YR#ug<`bQQkDyl7>VHV3rmOAyckMc{_#5Pf5-|I(noY3qzz4QzX4E z4&SVj-?)Vrid(@*z-JWxTIDoyyZXdOxLXjt+(_CWDD)70LYLCH#25|VOi!ls>kTd> z54bBb-MPKsJcy|8!=CujBaM`=hu;%Zks*H*5ol5Ah6rADDLfvY=9}P}NjHS*wadV1 zxIy-W8$vNn$kZB*4Tn*W0 zf_vx-fD*W?!O0SbNJC@mApFAhQSDv0t1E6$qyE4> zqpM$!as_l>JQU?GfZ}7*+_d~1P#$J+XqW8Xm?vQqXJUiwx0oo6W*9Hk|GPM17>@C| zBe8og2N*yA$}$*8;5Y>iB|rxgBsPcuoj?%4S{a{9M-2o96QDB%0$2y)bB7YZ*kK*o zIh^!;&v-cnhM0jP%>ZO&6b70MB!!PQImeiRW6i)Y3dl7k4*MMl`_)&Xs`R~as(#eT zE-OA6UIi|VPG4*|(!@}=xMd8YGnr!$ovnp2NCIhN@G#`q;uzG$UC;&XiMFJ47=xI; zXbk$@xm71(bX|scbQ3OB_FDcX9e;hU5i=MM4T_ET&}R}(eT@!pB!@lF_Lv5pU2%!2 z5%VT>ZxToM?n2$0GnNUL2#n~*^%!X@^V$`GThK~&=tHRv27k|&`tz-~%5F@3IF*Ox zQ+CvcsXR*`W{9-ZhiQJVPS#uYVX|kc4|A^EhXceCj{$d}(n8BTmR59+yLm-jt z&pq+^V?;RQ-8PtMk3noRrfge}MlVhEX!Pt`nB_r#~KDLbVKp3v%pjWY_oYT>#d-fupniwESQ`jT=Z!lX}@V^AYlg1Fau|r zfuwMq$*DI3)6KwH6d-?>?AVj+c#5(ko5mHRY+=V!Td-qQ{rO}tEX^r{wRP|{Yiqy6 zT4=HHg_H#AUn&Wv!?RIH(#GcyFl}5!!0eYZ2$(iLmw;*G^9YzWZXjUVcqV~8*qAck z-NudJa%XKa1LvE8W-~C$3?zjwFgdf$z=dYuA_|x`?nO49rEJWmam6TG*!Y4LY;5VP za11PVyqW9>k052o1F>+-K~B<;gf1q;mLyb6h)qf85<+ZCLYER^V-mvrtE@@razboQ zLUReRJ+IBQ-M^gWLM)YGw`jQo&+x^r0KZ%Y=cR&Irh-?cg7Z^BOR}p|+y$xN!c_1Y z3d*&vQV4M{+4%;xv#XI!M|w~(u=I_4w=`TUi=|hPrQv9$EZxuH#Dj*hYmu2WwqjgI z47Rsoln{eWt{B%7gRQO@HxPpjuNXHHgL|@K+(ZmEzhc}>3~qrtG7amr5yB;NR*Z^O zt)M&{v>Y_fG-9_PsyvAn+0d;vwAhAjvmtvfSVJv&F14X$Hgr27Y9klzNkwmJqldVS zaPvJ|U8zZhqn-Y=_jZD7YiXx-)K2ugeRA@_%yI`ZO3o~I65#ehOh*Fd%mR-jHM87J zz?@m`Az;od_Y&Z?KnBYRa68b7N7*Tx(?WM2AWtIqn}G++z=LMsAv2H^{*%f1vl&=n z1|FsWY-Y|QeaLn%vhAFWYzSA3a)#Aj+Pl@@(Oayxm8=FAK4rCIWnXcjx2!~l(s~x= zBgAAYT9{BxS<}LNl$hMxEzHM=$=0MJun*503+=}sw5 z>a;ilT(Kt+WsU$>>@PO-lnt%6p{H%gp35_~xMyu>jSW3V$n5`zP#bRIHpF8s+%DYz zT`?*eExEacmaMA(iJA<1q*RlQph-3pEtctyJ&&Yw$J5rr%3Vubczky53&iE7w90lO zE{_Z=_eJ7zV_LZ{5tm!j%6*x*+?-bKI^uGBTDh+fmm3s)+aqew$LU|D*V?${nI4yX zr)aJG%nlA4Ep;Z1)s5!mYR2p7pb3vU@vDd|Pr=vhaJ?PAZijE!VOmyi+GF3c!?*45 z9fAjvR!+1MdK#ap;KD*Pwq2>Fj5_dIE%@(Yiosz)D#mKGzaq2U8~I)0?$*ff5qGyn zK8U!xHS+t!-K~*7AntCByn(p8HS&kV-K~*7A}%-br}l?d~ksU3bsFxjH$-PEFSYPS+=yU7-nREU1V4)2F^K(jvFS% z&KDvZy!L~R8$1BNQ-P1p1MW99aS{pRpN=s<^5dm`Z(D$$w664_X(}B>2sE^a0pRkM z_={7}`?>`>BfV2ZV1i>g6vdlf%vGWQf5+qRBK(E$hsI|aB&T=v(%GeeQRo|e_;)kB zQ~GC!X_2c64beVI^l_#ygy*#li3gF$5ap4Z^9(UJdVPT*Hb#ifV!DWFf97up6aSQg zwMB+l6Ct`Nd{hTRgri&X4e@n8(GQD>KAV4a2Ka4=_A*||G{jL%XNRfu)&|K8ZbiAZ z=WyqO2awx9rmu2tpM*%}vb}UDO6Ia}WoH;>Bac@n{J{jEKx@Yl!)rcC?$)zKT?1#62+bYf5IChxlW?M5pKC@skpIDbeHvFC~(2##7!tqkdVWyMPPHIcx+4*Nf{*!h@uXhpW z3Z^@`j&)qt$6TY2m~Q6WwiJ+7I}1qucy1j(mwrVValYcT=eIo<{bXmmE&0@|PRJli zBS}LyJE~}9=0J%sBCc$`GIOx-05{_pd>P^f3$Msxbc;e529O-#lyL=+%@*!9gtA33 zqalbhaGfY7n!)?1^{K@%pg5yPfCl3lQzhqee<`63;s{1dS+YWmWppaXbr$0p_2amM z#A%Gq;kcgSbVjut*H4_o=wgl=D9&XxjpL3Kvl(5=10=LVEFSUjcT)^Xgk;wzTy2tCgg&nfh-LFg5+T`We*cOfanJK|fGj5sLn z9r1TYi&&SB#LtXA_EFqt=&O|O)>2BhT^Q)P+2Z!-&xL0J1sF|c^o_`1^k|skz7;t6 zLmf^{lb^ym6@25DgHjoi+X9LRChFT(*DeGQnS|Di}GUa*961Q*jo4B{-U>V|qh2g&$`6PWIV|{g&y=9Qz5= z`UYmAJe=!m+1RUr{$4ulvWcl z)V)}IR!W+iIeg7IxU=o4qPwN)-;S*D7E0My4i!j?Sw2*V(_(A6`=3L<{Vcs$Tnwv{ z9b(yJhXKi29QnI)DCSn6d`{$iE==ZA%XPWE_^!0N?A?YFerM^_ABwp@NKJ~xW$4eO z&x5SbhNM1XuQ}hxZIseY+NYTNTg&;of@HTYL9_LXk^eEx{=Jqm>t8PAAmm>x7L?tK zJ~_CUdgIZ^(-4moj}01PbvvTd+nosdc`nhTbI;B)u*#f-@Co5lLA7>ML3_126ZA<= zTboZgoKi&8%87R%PRHD{Avp(DHN+*Ln&_07L||-%aw)63XXQP>eN{UM$XMN^=oLDD*5AgD{U3i;ta`1dDOs64CK) zq8ULRp}#YgEXA6?EV1QM%0xcqnKH37M6>JnITU_|b>5V7x@L$sbKb)>(=7p?7KIn{ z3x_WcMn!M!D$uTu8-o;E=ZK1C{TFPkzI9ySAkH$xZWVWP?4J?du00C6#PI@Jvo1{S za%0K+2p4fnO)Z*;KK7OKW3KdEa3u6xX=1B$1C(9qbUl_$)&h+6k5jULWO?Kt8r;!zC!VQLW>l7yp+=2t59vx zvA9wxk9tDF3)j`WeRmJTae=s8cl(g$(^;z)&7<~@>=DaIzzlQ~)9DutfOdoCv^9#yDU*(*6A;VGj$=XhG@#BqmL zwn9}oAxBu`EA(U8i+V&9E9C9q5)n}$5vf-|}D73q&`Cx@QsUD-qkeKnzc!`Plidmq_$2dNZfB*r3o;g`0BPidc+FSfh1A zT%jnzkvZzXxfF};Ni-kdYUrOttMEqLV;ODIwiJDqQzB+Fx)A9!Q6esvlHAWq!~z-T z$t-mt?q(H7y{=R&Q*mFFxbP;F`&1nD!7}l%in}J)g||WeMa5B%>>!?3agQRdgLqBF zQU8pIzp6NY{&zVsu~EfQZ|x{PS8+WN*HL_{;&!0#mWv-%oL=U_ll*+sAzCvFEf&Z9 zSY($AJ*^QJ7a>M-Jk;kaL@O2dGU`_$N>m(;fJ#xJ;!Z012T*qv*Od8dPL=4bP*tWg zR3!!~v>?+9bfiK#nb|63-U*2pu36 zF_LX`fOv?}r`~^LzNjA{9#d#nrVDpWKBLfm83RI{#7hdT%oq&xrb0u}>pF{#3X$bI zi?0;w%W*#`v^Fb_D@*P;S@2VDf3#m`5oSdF?5I#@Q7z-N+uGKKx{4tcB#Aj9_mog~ zafU*J%BF=56b~@^RC_)&BUCL`F?wEHm-C`tEh=c^FFw_-C~897g^cFs&1idJsE0VY z6UE7X-9t=IqWQSKephFX!%TEZsFzr+&`qHQp@YTnE)+LQe3E%XsJEck7Em3?X1zrx zg~(>TMGu9@W_?6og~(=o#1KYQ`t6}Z#3eG0Yuir@=uUac+71wt6r$P=6n8R`wH+i@ z$T+UiAaPAKrIR%pB$g%7eB8PFR!@qPdJYyF6e2wbi%%3HJr5UODMWf6E_O1aJns)3 zA%^tgTv*Segr_$lspm1GLLt)gSaBL7spoJpL&mY5!^Nl?N+d~uvuJb>b) zo+HFv3Xz^8#6t>^o+HI$3Xz^8#TrIZ&svc;kaJ-@$BMTOB_#DcLF`nB^gK}p#JLZtOs;zNZ<>$Ak?jHK3Qi{ZFRVQPJz zSU8%H)Ox0Hjv+)^ZwNJs8ifXxeG|GsEM_G8#Kq!48OMF%Vln>&N+-3xSS(JW`Qj3> zZUV*0K5?mdOCi$wQt_cer1fRu6NO0Y%lLd==6QSQa#1mnb75Q06Q7?3NNKPa)FtTCqtX z((_uejS=N(gs&4bPUBoy&zr@ArxPMQgW*MD)ij9)l~sh7i6sdsNxk51@gO7F3+@*4 z>nKj@dAC@cMDxWxqGSfA<6dyDs8ERXyjOHri1b`8dMiYFE*FO}qC5wM?-Ltj9P9aK zv8;jelzKia*3FcN^n60BXq0Gl*|6|xaa0o_Y2D|#h~86(X(Iic*D0>lZ|&LZtNzqMDJk?u%lhjAN}|6(yHbo>J@eV#r*HNb7e* zw<{zftv?WJ7)h-+innAO_lb?-y{kx4YQ0f>o<#F;YP#$?j`KWT@S?t1ELUi4feWXf z4=YsJ?nQlzcv7M2b}pQSJ}(h${eZqzyq!d+hCdP8BoddpriDKfHP>?q;tO|u_;ayP zp+?t?@E2l*LLa)%4}U4%QfOh;`Qg6_=M6I5%DhF+ZK8&eTsOCgD^=X{p#h<7B!+*_ zXSiC=38&Cug)iz!R>!mn$UmT%eH5^CpF4o=X*ydETp#%;nFvbWhmQ zJ*$u`;bnznF48d1XOI_^symI%6r!>DZPJ1?Hj~Ij>)&@~oQvkOAHU_%?}_hH;L66D3_B^7HQw?-VtRD4iyL6o)aIEwY?vYd?y+7|Ge@C$YjJ`IA_s zBp(wY?I*FuBKfmeZ;||2ysIQfYWIhK78?~h((!Qk7xB3z-LK*YOS)ghFG})KJ*53A zoHvu!v&B!2%N@H!fRWVfH<8Ck)&Xb!O7bhQD*T(Mut*B6+9D~m8YTIo_H0;aLls)? zSRdB3kx5Axt{hBfv`LHNwor$*T%p5D<3ODjk!G{RPAA13&S;bO#r88o4((WpG*3H< z8>QkBCB1mql8#C{hkX*w^*4?SCw@5m*ca>x} zeS6rceWK9oj_qNW_MJk%xVDE4?Kg#by0?ejT7WK|!MZ~|+ru6$U!jA&+rwV1OrgVk z+rvJst3ti~+rxgXMxlX$?csoSm_i3->pj*j-)PDZjdOSDdlsqULJYRwYu2S&0rOSH_}IL_OuUCS(auqbTC+qupOI|M676C}vNcPzYZ=MbEY+4+Bulk>lw_vvkCbYU zDDky|rS6I%MQWYP52N28#Shf32%RoAvz2q1wR;9q!7H4AurJbi0us z8KMnU=pJ`|VLXUa!Bgbmv6uQ%!A308&tk7~_exz2bGbR1`kulm#g&qv#M^4cG z%t+dEy!M2OqtP*5dx?>>=SkW-7Ri&ekCfzS*z+XqZwhUKJx|tlDikpMkx80sskF=C zu;*!7jzTBEp3}5Kg@(YMXKED+)xw_BwH^u`345NS9jefAu;+Q&6om%Co{buPI*2TP zD(u;;%~Z(g$dAm{E>dVJ>^Vo9r_fs1^HS|Ph1S8IbG5|^eE@r2soky6i?HX_+Mg79 z752PFd%~22J+If+DD(#Gd6V`tBWbfmntK^(Cat?j%VIQJysni+7HPSbxLdVC6-So8 zRjXnob6KqQv`8-2`YB1W{9^4Wg~;+twXq73)m~MIEdPY|SB1#(f6+E7M3#SA`$8eI{2J{$g~;-2wVxFt z%fF;KZ3wQUW+P3mVZ+#G$mpAceI#7Wcl~B6B$WcZ_rLvab(X8+S!bx zJwMbgutJ!P(hbT1O=o1O*BNaNu-6s;!Pg3YCPoGG>e!4;vynP~V^cf0G^7V-n z>$6Qsf1gOHew9K~p-V^oMMlz|mHO){j_g^fZ)7CxS*35YNLJ}TD9J(E&`6c;x>MG# zw_|9en;unYm1}6Er`|!KpNyfA8ogSfOwZ8Bq55EjegPVyk5lMm%O^TeYf22^IF)1=r-=@$x z?n#jg^q&-(MEBe!Yc$fCqR<@wq{xkWH-#FZ%VPaZM$(>l z=;x|9vgaN8C5)s!@6;DsB=6L3R+6-G-KpQL5UpJI=qnYXmFqtJS%qljdQe}l5UpH) z)<0B;R<4!$mkQC!^_cz-g=pnkr91DI^`n*RDIME;{F^Ok<$6YMtq`qT&*`NK(aQCL zUZoJNTrcYfDMTyRt9p$>v~slp%ATH z8}&OGNqcV5A5d{*&n^027)g6>)nBqmZq?sVl1sE%k*)e?3SHos71^f$qR=|mtjG^~ z@E%!rpLrZJg3k?V{_y~$6E^B;NBeB>e!;tU7pR6zd62B=vwdQ$afCyKB?JFzRi&z z9oY)q<=-5^+iw)QHLyA2c2+6W3|%sv2Q!iuj5rTtBrO|tb)ICA zj5?<%NwRg+*{l%Ry3l#8LS*ZhbGbrf>(0(+6e3&qbiS()*}A{;YlXg~--tIL}pxY<-UN5{1atP0s5SB3obNyh9=eG)xtslV6M^bCD^-5rqFbU7NvWbHF0%_=u7!T-^@wTVXY`EX?Yt8r>HKr=Mv}pOrk#{tcz)!gH>ih z9>q>XT3uY+mco)A$Y~`#mP<6L4#{_MtLg4q>Eiy@#NSa!l=L(?R{f=nHUHlmKC6K8 zx28H5b=1XYWyHT1wa~@)9KMumL=;ckcc9ooY^8H8_8e-li8W8Ml8(C<@ZwYPMd`kC zw&uB~eAZ{tTLk`hvE&2oC>8Z6mmp1y{}D}g z*OSV1;r<+Ik^RwA_WA!gTkWpl?ETP?#x?W@)x}!KYhp$5-l%m%? zDJMHy7lq7ug-cn<;SM}UNsgqFW93^pbz#zQD$iFb{beoopPDnFth<~Q|C8bLTHw7m zuoB)*C1+-Ck^fGP)mBo&|1F$UpZUYu$<@lz)Be5fD97v{HkY%?e`cgutxY}yz7B?2 z1$X;fW|jX-d~1)j*6aT^U$!!N6sBjM@(-m?VyG7XLxx75)qnmy_L044?>78H=HF!> z>)iF<>G@b^(f`bR{y(>N>}d{3-=n#C1@Y{0KKVnQdcuFoKC(Z^l`eh1OizNOc5{Eo z{7>7*I`7F-2(r0LP`P+Y3)Ic$7#?mHZwn*nk5vCxZ79bnwXf-Wv^-CmXD@$9N)PtG z(@JtDYwfFaw&vth+21qX|48+J)rNAsQ~U1Uc>hCkf5!X&Usf_to4w*f;TP-hw+eqb zA_L(p`~~qB!e0b`x%kV+Un~5z!C$3l#uo#cMJJ@`jK41U>x1t&^uhZ|`rw7_eeh0` zKH@&n7w=r^3tnG5UECMEzTkNU-GLkgbs!2k&^k*E1~Ul~g0#p&fDN;V#bBVszWX#bj+X?%F(; zQ&q4`H|Bozr$UiuNB`f zI)a~#w|CaHT_px^ssXq<`kv^ajSGDOdRyDC#c+NadpMqN_G!Zf-B&#pl5wqvzO}eB zXnolTZGfO>xCik4*%LW-D(5zx!!woqgJrjCef1;TyazfYXOs4#SQpxcaJ=+8(4G0e zg5Htg)h`sY@SNWlqJN~bK3V@E_h9`t5iRPA@Euu$5dOhE4D^Zok@^kd@q%IcxhykT zKeNqAkXezH(0>%${4?~qC>K|t#GI^okpDco5S;q5>k+#tZxLuw(cQXNYYacY^kKbN zKe5AV(B_I?ZTAPe~|APf0@Aw9H)vN)a?Iv;NhS;%h+ zS;)`xF61|eEaW$cEac~X7YceJc%h(YhHr*e^YoiVc5YnUEZ%Ha4Z1U0Eq>Hi6(8+b z#!t5|gSG1rrhCknbE;+hy!$e~&wPclXUDP|9P{-{avpQ667T1)1wAi zi2x{`&sOr;;ZGbr^y*Tl^DWV_sL*+Xz9TP=Fv%yz`0z|v(DSVzs5OUzcjSSNquRF^9PRo1^lO+^TjGWRr!!k&u`A>r#OG$ zQhs4geqe34GG`lewlYUUZ*1+Nep~IjL5$BIrf=f@c^jUQsR4hX>qULIM)|)b9>r6} zZ=q$^qDEayC%DF<|2MfNVvH-kSP7cze?%gp6* zw-7Y0&DE$CW-{kO=FDV{=J+c28slbgT;gWtEMu8v&~2?_8RxT{V^=U;r6}pJg5{S( za-P15<<}sVM&FnDZQRSDPbc>}&fzU+^^ki5hqrQgIrq8^kk`akPPKt^TgRNYn6r*K zw~6a%+4BpBojQdBI%)C?r*gu2aqSmQwT(GHa6a3Z6Gkk)f}&Hs!aCV1 z0FFxpnA4i`Dd9XTINS~44!#Ob)s1tm(8-3anNz}?*31boUBOxn;Iu=Kwzq#chsPp( zoBw8Ro#C8zET>Iy6xqG znL5qG7jmrTn45olfLccrGj+Nnf3kjg+Z6$tkv2`e zE6}&+WUPT!H)gD3$+rYqc%6PzS+#hJN6;G9ZH3kz@2I7Iu8Fretp}$eoija{4-N#) z7QH~jq6Rci3ih1FhEY24^~R zX6W}Lyg?^zH|nJAR-Lr{T>mrZHl1|-Mt>CaL&xEn9q?|q12e1O2@nm5)1y^b_0I-v zFRlTNi$$Pa#oM60#FwD`#Xmrgz~>37#4zTM0qu{cY7fku&G{^4`n1*n&PI)L-o#;{ zQ@Ds}4b#3l$&BOhcn&vncov5jbNDt6ujcU69Nx&`O&k^u%2RVtK1CcZ=5P(uzD&n4 z9nZ9x>0+j99J7(C*hOgrbSHK zGp%9TpXoTJ6PPwLoy~MH)1^#TGkuonMy8vXZefZ~9aAYx+cWLYbOO`aOqVi!mgyFz z4lmcsd%4KUZO`GpO#3q($8-YIW~Q^5E@k>G(=ALLKFX&()Ba2+FrCG8Hq)hw{tc4P za`;&vg;)D87l-F=^0OuZqBTtWW>9!B)74C8WwJ~b%P^gl%`!|^Gp)%X&N!yGG2Iv< zjtDb9LbRFbtmqaoJNGuw&vQ3MStgh0CZ<{*g^QW?W!lViG1I3DSdyvMiY1x$W%@MJ zO-!}c9LuyX)A3B3nJ#9!n(0QSo0y6=luBb-#I%@c4b#3%$1xqxbah*j-^f%HQn-j| z4byQv5aGH=a@T~e<$W( zfp4-9y_@Mh;xat@JV#rv9i@-e8}()SOIgmbiwx z?sxs_nq%Byylx!mKGyw}`&aiHo~@p5Jzczqcn|g+;T!8)?0eMzyuVwZZ{UT%y1?s! z4+0wlUk7#u24>u!u|DI|jO`gaGJej`GToUOnW4=5Ob71VF|f~ZW8U*&Kjjx~K})f# z>VSPuN6e~m?5ZlUt2zKXpw6Nd=F>L#I#40LDpQ0VP+asv>>=1;^@T)#?6MAn)REX_ z4TEGYc2=ViGZyvDDfQ#-%x_DG-jGXl71ONzEQI?oeT`*KDGGtpB_|Iw-hm_?1w?yf z5#67Bj53leVrtFvp3K(ZcgbuIdR=A=G@5w;=+_wsfo6sJgAU=?CN8Tka|k%ca#-p) zki#!$k#3Ewzg6;oI{ZG{VRbvIowxNdpkoRtEa|DNTLaUt3XcPSek+psYg>}BhGmVU z{=3&}@3D>oYOlS^>~1kxmb9DIO3wBtAh#v$CsLm6C#kTGUg^N-(Q$gOBjg5kqL&i( zgBs|gI=ES&9`sWkd-o91v;x)P&qNSz1FB=co(tLzeOE_6Z3RC02s-*|8-zQ7>gcb9 z2zLS1(P#1gG<>zJ7~$^lBXB=2D18&F6ya)69lgE-!aYHC^!|CevhbD%A>KH?ZAUqUQ7e^rv zT^xBlCDrnQ z7rPha3j2U|7ZgE5CqSCi&ao2JF-51TlDJLWI;}%1Cvq((itDPjtDZx%avS&9ZQSFe zwo12-Q$JF>txfg!&CEXT0wg8J{ln*E$vgACX6Bo3zIomU)O#4SSk)4`eB<^(;J-)6 zGuP^2;P(-_eBbt+z#k-Z*~PvK_-R6ylYv>_4->kaG^Bz5F`>&BC^EnwBXl`K@qy11 zx_s021n~2OE++{&;6EaC*{v=Be~!>qpGRwl5wQULMYML*zbACne^8GB|0$u%S8XeV zUsFqjU*{XXj`{|nt6rgI4qtv<2EIhiSOpWh>c6Wefd2=f%eM%Ap77h8#qbQ(hSgv$8{q2v5hLf82{!jSXN3B$Y`fj>JRCyY9OfQB(b z{Mq?K;5ebn7sEe6c)RmS!U^Y7gzs?vn0|0vz3AMj{*&`*!as99+^(ZG~U*x+N-{)JdPq63xp!1A#v-@86D{g=2(a?KB9|--+ z(3e7g7P>y13qKZqfB2)}Plhjtok%zmizFf)k*-KjmdZQ~as;C*xm^hZ0XGzMHtQ zZK`dhE!w`R{TJGwZvUyayaaYIj4!`5qI{rz=f9wda%Dva--@o7vpqaM~ z_2)XPybEAvZkfI1x1;l8nzn~g=WechxZc7@vlpwsRi73n=#g#o>^3aYPOt8uS9Z{& zH_Opi4l@?r&vk^+Xo~9r?0S^ZYMN1KhI#iGBg%2U zfi1sw^$gEW^SwD6-(cgdHoj5E@-29g<6H7N-ojWV_!h<~6W?m%+jP7cT}-}5Y`kdW zvW-vaSkZ?~`ro(l$1VK}7XNoP{-ULS!{YzV#^1E`A6xuY8#|8VtN2>7iEq&H7QUBk z%Dd6h-)!RnOCPfFZcCrA_&aQT*wWJ$&)C?v^ks{`$Hq@sI{vHe^|XyYWaH1-_}}Ol zecfj|wy76otaUOf>paG{9-mO#+`kL$y<9uEp5pp|z82i=>Qy(Tc7#&uEus6N{ki(X z(0?WVXIxw0eMemmeUIx0>fZ3@ofkQ6eJt{X`isa#b!)WbEV!=_zd?1zZXtd@%eBkI zTbx^?*CTt2`ax_Eco*@R-OcW+?qljy z$H&xjT+ege%K6v}#Gm2%EZ0k13+{P!q2oL<=aD&&%z0$a!#|JQdCh;RBdxyLkx_rq zaS^$T$X!I{BK(WUT_m52$h}NHFT;Ns{>$X^GBPj2e;K)#HUFiKSKz+_{}p(zKz{}P zE2Mt~{w301f`1AACDLC)<`Vo%$X(L>mpU%PzYPB}yvxup!@o@W%kY(Rp+h;(aXrt) zpFnV4ApR`ZXSjs_QpXnfTi|bjw*~qZ_**o6!QDpsZSc3j-$wdv$ZUhZ4Y_Tk--g^E z{6YAG@CKm|!XMQ11$UVA!|;dU50icvnPK?D$PJTz7`gl4-v|Fbc=tiS5B`0czTi%h zeiHs9{7KSJA~Okp61hpzPa-!5e-8c}ygBG|@aHsr!OfCB3qK1#OZqG_S@>DxvZT)< zcLtd=$ecmu4E!_j&LDF}^A_9{_$%;N;IEL!3NkCmtRS;O9xKS5MdmCrXOTGz|1A8o z@Xu=Af_o1BIr!(`pCgZR$ecsw95Uy~;~a7^Rs$Y0f1E49)y9?N>fw_6FV}Nz;o8b| zBUdli&vB)=-pF+`*DYMPa^1#tJJ(LGJGtJ>wTo+jYmiI-_V#Bo)lzxi-0bY&!0f;- z)l3*{B@DL`Mp_61ceM}(_p}fO?iRwqrDEpYEv1dj4hD+{+jqCtD@Y%h1wZPivq$|* zshq7?MG}ML^t-FDg zp*Eyw@(rXc6}>fE?0u+IozI>2wL+TM$U~fSpvBHD1e`M{fpZ23;+z43IA?$$&N-lr z8V8Ei^78QjTa>UqN!MuAM(w>ytJ`!#CRx3GgPBl+K&Di{6i4d-t#7h`xKuBYoZ2*j|ALwAt&u7QdnUjLtzm(6X=kfy5 z(UuB+xrQAn(+~Y@ka*y+rF7LwOu@}%(p5=&;PhhIuTC#U@? z&}6P6(PBC~ppF$6ilxVkqVrv|vyYe4ivkvAXAkCz>3n_}Ea+#00Rk-@B+yDh0*wK*>F)^;kLE5CbCO^oMsE2PWIVAG76el|eD_<>BN_Y5^_!C=@zz_dXL zOdBAGX#)f?ZGa%A9a46vKBR~G2gk<(A}A8X2V3yr7JMX#qeL+Mo*<42L&kbT;(b*|kZMEN7a&sO zAU@cF54YeWL7ZZP>GuS23ccIZ7_q~p>{8y}r}j>jbEjCxOcWOLe!(wR)3T8m_p9k# zzOs+gw=q?iE&KEQO~&cvO4Tp)PaNSa?UXDIW@pu8x-geb>joTWail7=qz3dt>oD19 zY^;=DDirJJQGcH0RWajhrnJ7R|}*d;w}3)S)|tN zh7Iy|o5tR)=$CUD^>*oovgeasr>c}Qy5Nbdwj+@)ajA^0s)y4>may5GlVuXX+Pg15 zJDV%!s=0K&P89jkrCeSF1U7x#B2!D1lNLOjD*{Pl8AxOgr%%^t8WP3S{%lr_=BiWa z%z~e7p0=m4r==WYt!gmYw(;jWGYbupS$R7df0>)OxIEi#JT?&iLy&M&pfn=8v1s$Sz@H0nL)#!1{bA z)61o$>c+g|epxmc>l59-R51Ef*7Ibam}Aen&gKX6=@T1~#nUTerKMtZeHvTJ6}S^w zZARS%*Qb>h6Kik4q0u(xjHSz2*#+gQ%j=S9r)q9K(_aFVgKXEc2h5meTy0*erw*qV zeB1r#)F(?>>4X+4`qfG`UCdH6zRp=q##dwXH-^WeFhCKO78)yMeKwPMpK;W$_3)z@ zE?4m7@MaNKdD<_Z%4PgY|FL2vJ@2cE*@mj4>Ea1rX?65gR8165l@@$8S<0mIzM=z3 zB#orKMfc<;$08s33%Z6^m^E0%piTQ&*#=b>OBL}&WmTJ5Ui1%9K`2y2u!H4N!BVEl z6h?L~BNbD&7P|EN(*;pD?`r_gT(0P=`%5%yUZ7&Bm@^PGUmf-fbAI{pT*V*D3oh-Y z+dxWGV<)Bl8q~Ws4IP;`JWOXd(;62|rcb8JzIyN^Q%23wO;zhRwS={pE>}ct8K6aZ zn~!wl*@;4d4Lc2~%)r&a?H(V_-hBhJSW|=^EawPo?Wo-aa&~_e%g-&rI#xWz06w1+ zx>2~7%G84&6&RU_wh*~F6RTdVLrP9LEVx6eXQOBgz#(bxT*(OxDO#_oIM-~;W zG+7tu@kvW)U(5Pga|EJENBxTEDDaVaHP6VWI2su^Sg6un)!5{84SaBXbkI@}Xn>J3c%iXq6P)qH7&#^OPX zH=%p?4b9G0WdJ%UnX#ICFqf^GGA8}v3Ba6L&(D;`PWqVzrpR*TWIC^;E3jtGtC{kW zk81n#c{K*5b(Pzng{DX9DwAbFYd@NC(zw;GiZ4jgqgV9cndmkQXJ;K-t1RP;3# zlR6J;SEdu0r={e^QLCL}nh3h%`V65>G}fWzY?j>WDAT^Ii=~7Er!&63&BLTx zwYPd$zSOBL`wDx1=n9h^9>UEdnDn}mIr5fq+N?MaCE3a zZGfZ0b?WHu1~_8D@zDlt%z`p#STH+h0r7ha*1U*8xAo?o5;5y!8?tkDUue&XYME>I zwa7_ROWB?4>h9HkxQ|_V)7+^_Rn|?qCl{n|(EX(c==DumJub_fGM!Jt{gtUwPDA1c zepP6-q1=~Lhgs1|%;1G(YLy?)rB4(~m1-_isZY-p)2}MZPLvfr3E1tDnkp?W zw~aa6^gH37;1 z!K9$$W zEoi3OIwEGUh>5J{A1KzyhR~Eij;1VXwwHPtW+`Ha7TJo$v4Vw4Mk_2*l@UWb>XEWt zv)5Nx%#e%Jgk?N~@u^(7RFtFGjp}ZXE}Cs{ts!^J93cLrx!GoK47OLvuQtp|%Unh5 zC#Zz<^1oq@>nd`MJew=iEV_5!;OuP18r3v2$A}Z-`e@8_GC4xC$2o>t-vKp*^xn># zwrQtr#-%vxohE^Jb%0ST39GL;i*Ehg5eBl=m5(PcgB>U}#VkeR{2Z*Sg2Z$L5wc`coZ zbp(x2z_b9-W}}C-s9x zMvN|xu$10(uAt4(j8mg#bUKJ;8po!pv^c9LF3ulnZC{&*)PcexRQbgp^;D0LutvCvsco$NDl=|6*(!Prhi6jT-Msx^?rLW%_-zrN|LgK zhAG~e*u}dNwH&T&0o73^Wg49%y^0^Tn0m9cnbVtJwMp5 zq{m6Eq*Sqs@kq7$E6tAf`m55MS%ue_g4s{#ZYj<2E(|jLnk)XA-F5k=r+t5*365$r z$&kd|QeHoi;U&;S4;OejD_5`II1O3l>Syret_Uw;RT-923}vlN-muBWY1FgdI{u-r z|L{xq{(j}VFaGcD-}!`$g-$r-I9`OH`#J$THMrZmF1h-&>-DH8wB+h=(kqmY2qm6Un%ScwDV1FPgBaMqa*{hGCW(#_+!;%`lAE_lg_CPeXZKp9doA9* z))9?`k`HvorR?Nk!oHAJsV^idB_hgoJ3FH))X6V;T{7itryNAv!wJB6%%PaC0ZDNZ zdk7s9?RllcQ&M90+Ez5{OZp=6bwoN4NxMn^y5tt8M<;;XqY^3d5=zoULk z+vY(IqdI*ErB3;cU5Mx6`PI-%U;+MAMVHzj@D zE}HO|;H$scCcN7OUc0HQ%OUTzJE;&@U$PJvt#j0@7b`%wh~&4FTpJ*HxXV$}Mtu=4 zMuoSlu1F~6cz8tu_n;ADVgwJ?CZ}t=3MHI~$4hjZ_!kfJLhuvum{e!YiA1Qnj%iWt zRuO3_@g%3SFA^pn2n5*LxDHgh}d-azc&xBqiK?}VcHJHxs%bN6M z)WB`MSh%m#>rCznE645J3?{{E4-nr^?lg}1El8r->bEFXYiMxVd#6~^)7?a4#?RIc zm`s}eEP|gQjq!D+I5{!C*~3Sk$b*WIb4u!E9m(CI+txa3lh3-k3aj0;khXurW5wG% z9J5V#>MxLIkF%Lvy4M~+(rAP0(ka9)7q-PB6ebn!h5flua>WCn9xJ^u<@WaCEOa{U zOkI*ScwNq;F?v*2j}vbu_2?pLRQ`^!G;e1;naS1WPDkpYrZhWAa8koX%AZWw=K ztc_x>{@?9ubNdo*AK%LH+`hQmhfhUuE4MG~_H~L;Wqj(1MUqsTf*(k(zL4OuquAl( z6KEJmam(9`*Cbc}EiI0td{J94xl;xMsA9C_>L>6xGZu;zLyckeD5?Dy>Nc0uV)J-C z9~p3+7|uqW3fd;U9$itocqdj!t}S=Qb<_t%ckCyi(UsezA6xyfqVCBSy)DpeUkWEz z#L9_IX}r}2n%vP#-}SDqH$fB6>)jNP^?DPjP)|s7?{RO~Cy0Zx}+`fWKrn$SX73^nu9e|Td!$fY*X?9uiF#(hh6gQUVYZ{5;kwV5F%VO zSi@(Y)dhH_oVfII5f^(&oJ0?iZ1g_qq;#wsW1SQt*)|tq)E|h&>bgqeuSAk7-K+02 z718ppEb@FqLxqiHyxtp85yzyH3QKq=(#u>u&Vzk{e3QL-P-E`|3&t>MQC&4)4InS6T)lL$LYNL@`lnkt=9$9BWZNTo;C;P1Z z8g>+||2%FiyrBTf-`ZUJt7MhZ7PyMQ?Tw7CRVEg{re2#C|*?nu$h>b;hFI ztG`PHKTKWY@vfMMnS~-GFYXP-wi;6>S3kDS+;vlXSn8wFJ!QVpCVnz3#?#oB%w(ILjZTPz*Nq1o$Qtx$7?(W}fH2)k2rt7ijF~>uF^JAt_|xVpF2d>UW$- zr>KK(X^h2w7qi25SyF}*ZX_;28#8`eIOevsv8I%%ltm>dT{`9*=!%%-=_UtK++%$g zq7KYawH<!b;crUF>e6ITTV{2yeo9aIF*u(>b6I+cjI_PbkT&bsA2JyyxZ1h+ zu7VTgigAUx+Vs-&N2VD&v5eOVRhFkHxGT9+*lT>#flz0*hHZeE83=FIp^+KZ@Luo2 zdwO2|!ku4zzvp?VcrNlif-1+i?BY`V{;9*aKE(zodN#UImJalm8P?*2psKUD> zklW@G423z?)9A3EyTf}dIuhp3k!i+Qc*a0u17XhRgf=!99+;jS6KE)m$yGQ)u=`YB9&E<0$4rOO}s{*1WJuGxb7(1>Q<;cLTR;@-0o2#v+PA@rDfa-(f-G$L(yNt%_$WA|T&JYoFLI_e7geQE2aF~yU%Zo(O3 zMC=0XXGRmSHHD|_ObEqnO@!7i!Db1zm=a{&D`-lB9TM!4V2=d%N-!?LA!!epDFm66 zU`i-5ShG>-_Tsx7MprqcY1`$<9!Kv|J=sml5l6e;66yUQV=4$+qgwoc92hXzGodl; zYrwOlz6iTXx0}^{L^-U$!3dL25YwxEiLIiX5p?Wg_h3s*w#&HP*O}1!Sl#zzd#_KK zy1gie40J*??z8ZdF<|M3jK1}bXw^=1wvm)d>LVMIqdxf}eR4(54=ZeD9a$Q_pp_s8 z*|M-bH&tAz)o6u%1e?JNBw{bmc;@IsC#KirPICgbOYgkxKFv#ooa7D`KJir803K$Q zN=o)#0y|+ZS-E3a*#m3X>*;dBur*Q}RIclCA_xSDULqB-`Fh*BoM?^TvdDrZX*cRf zZK-H21D1)AzRsGEUJWGJp}KNRgzfeG+lIMW89Za656hOMErQEXuyGNOs*0@{>*Q32 zRYzDkaoOmysb3{x)|5zkN;{aDAF*gBd*Iazb=0(yJ+WjS#NfTj6|^Bl8-=;GXUHK< zM=AtW%1m@7ceFQQq9!YvXS-5iBrtPLXj72jZB0dcgQl%XZn*--OQjfPYt|Ca)0MWd zDAGsDEAwwk#U(k~y|1OUY9((^#iX)V5}-+3X%{yV+MztIcz6dL7{HD0Fx`X5Gw_o! zVBI~4Yl?b1bgxcyk}$bK!Zu5x>7cA$fYd9zogU|fOxudXQa=^V~j<$Qfk7%=Ahn92L=sQujD&cS}m11(65gD*cUT@b1{)1yjDLtA?(WwDCxv zPHJzt@6+!{@=+r7PP>MY8_YlLb%|cE{r@h+G^=hir9S@S-~Fa?4o^uNa=%I4`!HYB zdy6a?%}*fyz!KkVQR+E(&o%KxLKc$EzoXOR(_?@6&WpD{{l}xfnmcp)g?;Y#G%{TR=1o@fxZ3a;?LNsNo zspDGexW1QskXw;*7g=sD&T|h~emCn>Gu* Date: Wed, 20 Mar 2024 18:18:42 -0300 Subject: [PATCH 5/5] DBC: Fixed crash and load of SpellMisc data --- SpellWork/DBC/DBC.cs | 68 +++++++++++++++++++++++------------- SpellWork/Spell/SpellInfo.cs | 2 +- 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/SpellWork/DBC/DBC.cs b/SpellWork/DBC/DBC.cs index 8d4cccfa..1d668b83 100644 --- a/SpellWork/DBC/DBC.cs +++ b/SpellWork/DBC/DBC.cs @@ -104,15 +104,19 @@ public static async void Load() await Task.WhenAll(Task.Run(() => { - foreach (var effect in SpellInfoStore.Where(effect => SpellMisc.ContainsKey(effect.Value.Spell.ID))) + foreach (var spellMisc in SpellMisc.Values.Where(misc => SpellInfoStore.ContainsKey(misc.SpellID))) { - effect.Value.Misc = SpellMisc[effect.Value.Spell.ID]; + if (spellMisc.DifficultyID != 0) + continue; + + var spell = SpellInfoStore[spellMisc.SpellID]; + spell.Misc = spellMisc; - if (SpellDuration.ContainsKey(effect.Value.Misc.DurationIndex)) - effect.Value.DurationEntry = SpellDuration[effect.Value.Misc.DurationIndex]; + if (SpellDuration.ContainsKey(spellMisc.DurationIndex)) + spell.DurationEntry = SpellDuration[spellMisc.DurationIndex]; - if (SpellRange.ContainsKey(effect.Value.Misc.RangeIndex)) - effect.Value.Range = SpellRange[effect.Value.Misc.RangeIndex]; + if (SpellRange.ContainsKey(spellMisc.RangeIndex)) + spell.Range = SpellRange[spellMisc.RangeIndex]; } }), Task.Run(() => { @@ -139,32 +143,32 @@ await Task.WhenAll(Task.Run(() => } }), Task.Run(() => { - foreach (var effect in SpellTargetRestrictions.Values) + foreach (var spellTargetRestrictions in SpellTargetRestrictions.Values) { - if (!SpellInfoStore.ContainsKey(effect.SpellID)) + if (!SpellInfoStore.ContainsKey(spellTargetRestrictions.SpellID)) { Console.WriteLine( - $"SpellTargetRestrictions: Unknown spell {effect.SpellID} referenced, ignoring!"); + $"SpellTargetRestrictions: Unknown spell {spellTargetRestrictions.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.SpellID].TargetRestrictions.Add(effect); + SpellInfoStore[spellTargetRestrictions.SpellID].TargetRestrictions.Add(spellTargetRestrictions); } }), Task.Run(() => { - foreach (var spellXSpellVisual in SpellXSpellVisual.Where(effect => - effect.Value.DifficultyID == 0 && effect.Value.CasterPlayerConditionID == 0)) + foreach (var spellXSpellVisual in SpellXSpellVisual.Values.Where(effect => effect.CasterPlayerConditionID == 0)) { - if (spellXSpellVisual.Value.DifficultyID != 0) { continue; } + if (spellXSpellVisual.DifficultyID != 0) + continue; - if (!SpellInfoStore.ContainsKey(spellXSpellVisual.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellXSpellVisual.SpellID)) { Console.WriteLine( - $"SpellXSpellVisual: Unknown spell {spellXSpellVisual.Value.SpellID} referenced, ignoring!"); + $"SpellXSpellVisual: Unknown spell {spellXSpellVisual.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[spellXSpellVisual.Value.SpellID].SpellXSpellVisual = spellXSpellVisual.Value; + SpellInfoStore[spellXSpellVisual.SpellID].SpellXSpellVisual = spellXSpellVisual; } }), Task.Run(() => { @@ -176,13 +180,15 @@ await Task.WhenAll(Task.Run(() => $"SpellScaling: Unknown spell {spellScaling.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[spellScaling.SpellID].Scaling = spellScaling; } }), Task.Run(() => { foreach (var spellAuraOptions in SpellAuraOptions.Values) { + if (spellAuraOptions.DifficultyID != 0) + continue; + if (!SpellInfoStore.ContainsKey(spellAuraOptions.SpellID)) { Console.WriteLine( @@ -196,21 +202,27 @@ await Task.WhenAll(Task.Run(() => } }), Task.Run(() => { - foreach (var spellAuraRestriction in SpellAuraRestrictions.Values) + foreach (var spellAuraRestrictions in SpellAuraRestrictions.Values) { - if (!SpellInfoStore.ContainsKey(spellAuraRestriction.SpellID)) + if (spellAuraRestrictions.DifficultyID != 0) + continue; + + if (!SpellInfoStore.ContainsKey(spellAuraRestrictions.SpellID)) { Console.WriteLine( - $"SpellAuraRestrictions: Unknown spell {spellAuraRestriction.SpellID} referenced, ignoring!"); + $"SpellAuraRestrictions: Unknown spell {spellAuraRestrictions.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[spellAuraRestriction.SpellID].AuraRestrictions = spellAuraRestriction; + SpellInfoStore[spellAuraRestrictions.SpellID].AuraRestrictions = spellAuraRestrictions; } }), Task.Run(() => { foreach (var spellCategory in SpellCategories.Values) { + if (spellCategory.DifficultyID != 0) + continue; + if (!SpellInfoStore.ContainsKey(spellCategory.SpellID)) { Console.WriteLine( @@ -250,6 +262,9 @@ await Task.WhenAll(Task.Run(() => { foreach (var spellCooldown in SpellCooldowns.Values) { + if (spellCooldown.DifficultyID != 0) + continue; + if (!SpellInfoStore.ContainsKey(spellCooldown.SpellID)) { Console.WriteLine( @@ -289,6 +304,9 @@ await Task.WhenAll(Task.Run(() => { foreach (var spellLevel in SpellLevels.Values) { + if (spellLevel.DifficultyID != 0) + continue; + if (!SpellInfoStore.ContainsKey(spellLevel.SpellID)) { Console.WriteLine($"SpellLevels: Unknown spell {spellLevel.SpellID} referenced, ignoring!"); @@ -299,16 +317,16 @@ await Task.WhenAll(Task.Run(() => } }), Task.Run(() => { - foreach (var effect in SpellReagents) + foreach (var spellReagents in SpellReagents) { - if (!SpellInfoStore.ContainsKey(effect.Value.SpellID)) + if (!SpellInfoStore.ContainsKey(spellReagents.Value.SpellID)) { Console.WriteLine( - $"SpellReagents: Unknown spell {effect.Value.SpellID} referenced, ignoring!"); + $"SpellReagents: Unknown spell {spellReagents.Value.SpellID} referenced, ignoring!"); continue; } - SpellInfoStore[effect.Value.SpellID].Reagents = effect.Value; + SpellInfoStore[spellReagents.Value.SpellID].Reagents = spellReagents.Value; } }), Task.Run(() => { diff --git a/SpellWork/Spell/SpellInfo.cs b/SpellWork/Spell/SpellInfo.cs index 3386893c..dd92e11c 100644 --- a/SpellWork/Spell/SpellInfo.cs +++ b/SpellWork/Spell/SpellInfo.cs @@ -769,7 +769,7 @@ from skill in temp.DefaultIfEmpty(new SkillLineAbilityEntry()) if ((Mechanics)effect.EffectMechanic != Mechanics.MECHANIC_NONE) rtb.AppendFormatLine("Effect Mechanic = {0} ({1})", effect.EffectMechanic, (Mechanics)effect.EffectMechanic); - rtb.AppendFormatLineIfNotNull("Attributes {0:X8} ({0})", effect.EffectAttributes); + rtb.AppendFormatLineIfNotNull("Attributes {0:X8} ({0})", (uint)effect.EffectAttributes); rtb.AppendLine(); }