Add CoA custom-class Pawn scales for all 21 classes (70+ specs)
release / release (push) Successful in 3s
release / release (push) Successful in 3s
- 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.
This commit is contained in:
@@ -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" },
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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)
|
||||||
+4
-2
@@ -3,14 +3,16 @@
|
|||||||
## Version: 1.3.8
|
## Version: 1.3.8
|
||||||
## Notes: Pawn calculates scores for items that let you easily see which one is better for you.
|
## Notes: Pawn calculates scores for items that let you easily see which one is better for you.
|
||||||
## OptionalDependencies: AtlasLoot, EQCompare, EquipCompare, MultiTips, Outfitter
|
## OptionalDependencies: AtlasLoot, EQCompare, EquipCompare, MultiTips, Outfitter
|
||||||
## SavedVariables: PawnCommon
|
## SavedVariables: PawnCommon, PawnCoAScaleProviderOptions
|
||||||
## SavedVariablesPerCharacter: PawnOptions, PawnWowheadScaleProviderOptions
|
## SavedVariablesPerCharacter: PawnOptions, PawnWowheadScaleProviderOptions
|
||||||
|
|
||||||
VgerCore\VgerCore.lua
|
VgerCore\VgerCore.lua
|
||||||
|
|
||||||
|
CoAClassSpecData.lua
|
||||||
Localization.lua
|
Localization.lua
|
||||||
Gems.lua
|
Gems.lua
|
||||||
Pawn.lua
|
Pawn.lua
|
||||||
PawnUI.lua
|
PawnUI.lua
|
||||||
PawnUI.xml
|
PawnUI.xml
|
||||||
Wowhead.lua
|
Wowhead.lua
|
||||||
|
CoAScales.lua
|
||||||
Reference in New Issue
Block a user