From 6726f301598516047e1cda55867e046705788022 Mon Sep 17 00:00:00 2001 From: Florian Berthold Date: Sat, 30 May 2026 01:28:16 +0200 Subject: [PATCH] Add CoA custom-class Pawn scales for all 21 classes (70+ specs) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Pawn/CoAClassSpecData.lua: copied from coa-db/data (source of truth, keyed by UnitClass token, neutral stat keys). - Pawn/CoAScales.lua: registers a scale per class+spec via PawnAddPluginScaleProvider/PawnAddPluginScale; translates neutral keys to Pawn internal (AttackPower→Ap, RangedAttackPower→Rap, Dodge/Parry/Defense→DodgeRating/ParryRating/DefenseRating). Auto-enables the player's class scales on first login via C_Timer.After(0), honouring the same one-shot LastAdded guard used by Wowhead.lua. - Pawn/Pawn.toc: loads CoAClassSpecData.lua early (before Pawn.lua), CoAScales.lua last (after Wowhead.lua); adds PawnCoAScaleProviderOptions to SavedVariables. --- Pawn/CoAClassSpecData.lua | 143 ++++++++++++++++++++++++++++++++++++++ Pawn/CoAScales.lua | 132 +++++++++++++++++++++++++++++++++++ Pawn/Pawn.toc | 6 +- 3 files changed, 279 insertions(+), 2 deletions(-) create mode 100644 Pawn/CoAClassSpecData.lua create mode 100644 Pawn/CoAScales.lua diff --git a/Pawn/CoAClassSpecData.lua b/Pawn/CoAClassSpecData.lua new file mode 100644 index 0000000..5057aeb --- /dev/null +++ b/Pawn/CoAClassSpecData.lua @@ -0,0 +1,143 @@ +-- CoAClassSpecData.lua — GENERATED by coa-db/tools/gen_coa_class_spec_lua.py +-- Source of truth: coa-db/data/class_spec_meta.json (class.file_string tokens + wiki specs). +-- Do not hand-edit; regenerate from coa-db. Neutral stat keys; each addon maps them. +-- Keyed by the in-game class token (2nd return of UnitClass), e.g. Templar=MONK. +CoAClassSpec = { + ["BARBARIAN"] = { name="Barbarian", classId=12, specs={ + { name="Headhunting", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Brutality", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Ancestry", roles={"MELEE","SUPPORT"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, + ["WITCHDOCTOR"] = { name="Witch Doctor", classId=13, specs={ + { name="Shadowhunting", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Voodoo", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Brewing", roles={"HEALER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Intellect=0.55 } }, + }}, + ["DEMONHUNTER"] = { name="Felsworn", classId=14, specs={ + { name="Slayer", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Infernal", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Tyrant", roles={"TANK"}, primaryStat="Agility", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Agility=0.4 } }, + }}, + ["WITCHHUNTER"] = { name="Witch Hunter", classId=15, specs={ + { name="Boltslinger", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Darkness", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Inquisition", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Black Knight", roles={"TANK"}, primaryStat="Agility", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Agility=0.4 } }, + }}, + ["STORMBRINGER"] = { name="Stormbringer", classId=16, specs={ + { name="Maelstrom", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Lightning", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Wind", roles={"CASTER","SUPPORT"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + }}, + ["FLESHWARDEN"] = { name="Knight of Xoroth", classId=17, specs={ + { name="Hellfire", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Defiance", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + { name="War", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, + ["GUARDIAN"] = { name="Guardian", classId=18, specs={ + { name="Gladiator", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Inspiration", roles={"MELEE","SUPPORT"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Vanguard", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + }}, + ["MONK"] = { name="Templar", classId=19, specs={ + { name="Oathkeeper", roles={"TANK"}, primaryStat="Agility", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Agility=0.4 } }, + { name="Zealot", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Crusader", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, + ["SONOFARUGAL"] = { name="Bloodmage", classId=20, specs={ + { name="Fleshweaver", roles={"SUPPORT"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Sanguine", roles={"CASTER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Accursed", roles={"MELEE","CASTER"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Eternal", roles={"TANK"}, primaryStat="Agility", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Agility=0.4 } }, + }}, + ["RANGER"] = { name="Ranger", classId=21, specs={ + { name="Archery", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Farstrider", roles={"RANGED","SUPPORT"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Brigand", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, + ["CHRONOMANCER"] = { name="Chronomancer", classId=22, specs={ + { name="Infinite", roles={"CASTER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Time", roles={"HEALER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Intellect=0.55 } }, + { name="Artificer", roles={"RANGED"}, primaryStat="Spirit", weights={ Spirit=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + }}, + ["NECROMANCER"] = { name="Necromancer", classId=23, specs={ + { name="Death", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Animation", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Rime", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + }}, + ["PYROMANCER"] = { name="Pyromancer", classId=24, specs={ + { name="Incineration", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Flameweaving", roles={"HEALER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Intellect=0.55 } }, + { name="Draconic", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + }}, + ["CULTIST"] = { name="Cultist", classId=25, specs={ + { name="Heretic", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + { name="Corruption", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Godblade", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Dreadnought", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + }}, + ["STARCALLER"] = { name="Starcaller", classId=26, specs={ + { name="Sentinel", roles={"RANGED"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Warden", roles={"MELEE"}, primaryStat="Intellect", weights={ Intellect=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Moon Priest", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + { name="Moon Guard", roles={"TANK"}, primaryStat="Intellect", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Intellect=0.4 } }, + }}, + ["SUNCLERIC"] = { name="Sun Cleric", classId=27, specs={ + { name="Piety", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Valkyrie", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Seraphim", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + { name="Blessings", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + }}, + ["TINKER"] = { name="Tinker", classId=28, specs={ + { name="Demolition", roles={"RANGED"}, primaryStat="Agility", weights={ Agility=1, RangedAttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5 } }, + { name="Mechanics", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Invention", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + }}, + ["PROPHET"] = { name="Venomancer", classId=29, specs={ + { name="Fortitude", roles={"TANK"}, primaryStat="Intellect", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Intellect=0.4 } }, + { name="Stalking", roles={"MELEE"}, primaryStat="Intellect", weights={ Intellect=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Rot", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Vizier", roles={"HEALER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, CritRating=0.5, HasteRating=0.5, Mp5=0.5, Spirit=0.55 } }, + }}, + ["REAPER"] = { name="Reaper", classId=30, specs={ + { name="Soul", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Harvest", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Domination", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + }}, + ["WILDWALKER"] = { name="Primalist", classId=31, specs={ + { name="Grovekeeper", roles={"SUPPORT"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Wildwalker", roles={"MELEE"}, primaryStat="Strength", weights={ Strength=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Mountain King", roles={"TANK"}, primaryStat="Strength", weights={ Stamina=1, Armor=0.6, Dodge=0.55, Parry=0.55, Defense=0.6, Strength=0.4 } }, + { name="Geomancy", roles={"CASTER"}, primaryStat="Intellect", weights={ Intellect=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + }}, + ["SPIRITMAGE"] = { name="Runemaster", classId=32, specs={ + { name="Engravement", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + { name="Glyphic", roles={"CASTER"}, primaryStat="Spirit", weights={ Spirit=1, SpellPower=0.8, HitRating=0.7, CritRating=0.55, HasteRating=0.55 } }, + { name="Riftblade", roles={"MELEE"}, primaryStat="Agility", weights={ Agility=1, AttackPower=0.5, CritRating=0.55, HitRating=0.6, HasteRating=0.5, ArmorPenetration=0.5 } }, + }}, +} + +CoAClassPrimaryStats = { + ["BARBARIAN"] = { "Agility" }, + ["WITCHDOCTOR"] = { "Agility", "Intellect", "Spirit" }, + ["DEMONHUNTER"] = { "Agility", "Intellect", "Stamina" }, + ["WITCHHUNTER"] = { "Agility", "Intellect", "Stamina" }, + ["STORMBRINGER"] = { "Intellect" }, + ["FLESHWARDEN"] = { "Strength", "Intellect", "Stamina" }, + ["GUARDIAN"] = { "Strength", "Stamina" }, + ["MONK"] = { "Agility", "Stamina" }, + ["SONOFARUGAL"] = { "Spirit", "Stamina", "Agility" }, + ["RANGER"] = { "Agility" }, + ["CHRONOMANCER"] = { "Spirit" }, + ["NECROMANCER"] = { "Intellect" }, + ["PYROMANCER"] = { "Intellect", "Spirit" }, + ["CULTIST"] = { "Intellect", "Strength", "Stamina" }, + ["STARCALLER"] = { "Intellect", "Stamina" }, + ["SUNCLERIC"] = { "Intellect", "Strength", "Stamina" }, + ["TINKER"] = { "Agility", "Intellect" }, + ["PROPHET"] = { "Intellect", "Stamina" }, + ["REAPER"] = { "Strength", "Stamina" }, + ["WILDWALKER"] = { "Strength", "Intellect", "Stamina" }, + ["SPIRITMAGE"] = { "Agility", "Spirit" }, +} + diff --git a/Pawn/CoAScales.lua b/Pawn/CoAScales.lua new file mode 100644 index 0000000..5f3d5b6 --- /dev/null +++ b/Pawn/CoAScales.lua @@ -0,0 +1,132 @@ +-- CoAScales.lua — Pawn integration for CoA custom-class stat scales +-- Registers one scale per class+spec from CoAClassSpec (CoAClassSpecData.lua). +-- Auto-enables all scales for the logged-in player's class on first login. +-- Saved in PawnCoAScaleProviderOptions.LastAdded (per SavedVariables). +-- +-- Neutral-key → Pawn-internal-key map used here: +-- AttackPower → Ap +-- RangedAttackPower → Rap +-- Dodge → DodgeRating +-- Parry → ParryRating +-- Defense → DefenseRating +-- All others → unchanged (Agility, Strength, Intellect, Spirit, +-- Stamina, SpellPower, CritRating, HitRating, +-- HasteRating, ArmorPenetration, Mp5, Armor) +------------------------------------------------------------ + +local CoAScaleProviderName = "CoAClasses" + +-- Class-token → 6-digit hex colour (roughly matching CoA class colours). +-- Fallback "a0a0a0" (grey) for any token not listed. +local CoAClassColor = { + BARBARIAN = "c69b3a", + WITCHDOCTOR = "00ff96", + DEMONHUNTER = "a330c9", + WITCHHUNTER = "6e95ff", + STORMBRINGER = "69ccf0", + FLESHWARDEN = "c79c6e", + GUARDIAN = "f58cba", + MONK = "f0eba0", + SONOFARUGAL = "ff0000", + RANGER = "abd473", + CHRONOMANCER = "40c0e0", + NECROMANCER = "556699", + PYROMANCER = "ff6600", + CULTIST = "9966cc", + STARCALLER = "e0d060", + SUNCLERIC = "ffe680", + TINKER = "aaaaaa", + PROPHET = "5a8a00", + REAPER = "336699", + WILDWALKER = "1aaa55", + SPIRITMAGE = "c0a0ff", +} + +-- Translate one neutral-key weights table to Pawn internal keys. +local function TranslateWeights(neutralWeights) + local out = {} + for k, v in pairs(neutralWeights) do + local pawnKey + if k == "AttackPower" then pawnKey = "Ap" + elseif k == "RangedAttackPower" then pawnKey = "Rap" + elseif k == "Dodge" then pawnKey = "DodgeRating" + elseif k == "Parry" then pawnKey = "ParryRating" + elseif k == "Defense" then pawnKey = "DefenseRating" + else pawnKey = k + end + out[pawnKey] = v + end + return out +end + +-- Sanitise a string for use as an internal scale name (no double-quotes, +-- no spaces — keeps names safe for PawnGetProviderScaleName). +local function SafeInternalName(token, specName) + local s = token .. "_" .. specName + s = s:gsub("[^%w_]", "_") + return s +end + +-- Build a human-readable localized name for tooltip display. +local function LocalizedScaleName(classData, specName) + return classData.name .. ": " .. specName +end + +------------------------------------------------------------ +-- Scale provider registration +------------------------------------------------------------ + +local function CoAScaleProvider_AddScales() + if not CoAClassSpec then return end + + for token, classData in pairs(CoAClassSpec) do + local color = CoAClassColor[token] or "a0a0a0" + for _, spec in ipairs(classData.specs) do + local internalName = SafeInternalName(token, spec.name) + local localizedName = LocalizedScaleName(classData, spec.name) + local pawnWeights = TranslateWeights(spec.weights) + pcall(PawnAddPluginScale, + CoAScaleProviderName, + internalName, + localizedName, + color, + pawnWeights, + 1 + ) + end + end + + ------------------------------------------------------------ + -- Auto-enable scales for the player's class + -- Mirror the same C_Timer.After(0) pattern used by Wowhead.lua. + -- PawnCoAScaleProviderOptions is a SavedVariable declared in .toc; + -- only enable once (LastAdded == 0 means never done). + ------------------------------------------------------------ + if not PawnCoAScaleProviderOptions then PawnCoAScaleProviderOptions = {} end + if not PawnCoAScaleProviderOptions.LastAdded then PawnCoAScaleProviderOptions.LastAdded = 0 end + + local _lastAdded = PawnCoAScaleProviderOptions.LastAdded + C_Timer.After(0, function() + local _, playerToken = UnitClass("player") + if not playerToken then return end + if _lastAdded >= 1 then return end -- already enabled once; honour user's subsequent changes + + local classData = CoAClassSpec and CoAClassSpec[playerToken] + if not classData then return end -- vanilla class; nothing to do + + for _, spec in ipairs(classData.specs) do + local internalName = SafeInternalName(playerToken, spec.name) + local fullName = PawnGetProviderScaleName(CoAScaleProviderName, internalName) + pcall(PawnSetScaleVisible, fullName, true) + end + + PawnCoAScaleProviderOptions.LastAdded = 1 + end) + + -- Self-destruct to free memory (matches Wowhead.lua pattern). + CoAScaleProvider_AddScales = nil +end + +------------------------------------------------------------ + +PawnAddPluginScaleProvider(CoAScaleProviderName, "CoA class scales", CoAScaleProvider_AddScales) diff --git a/Pawn/Pawn.toc b/Pawn/Pawn.toc index d63b4a8..244b0d8 100644 --- a/Pawn/Pawn.toc +++ b/Pawn/Pawn.toc @@ -3,14 +3,16 @@ ## Version: 1.3.8 ## Notes: Pawn calculates scores for items that let you easily see which one is better for you. ## OptionalDependencies: AtlasLoot, EQCompare, EquipCompare, MultiTips, Outfitter -## SavedVariables: PawnCommon +## SavedVariables: PawnCommon, PawnCoAScaleProviderOptions ## SavedVariablesPerCharacter: PawnOptions, PawnWowheadScaleProviderOptions VgerCore\VgerCore.lua +CoAClassSpecData.lua Localization.lua Gems.lua Pawn.lua PawnUI.lua PawnUI.xml -Wowhead.lua \ No newline at end of file +Wowhead.lua +CoAScales.lua \ No newline at end of file