3 Commits

Author SHA1 Message Date
florian.berthold 6726f30159 Add CoA custom-class Pawn scales for all 21 classes (70+ specs)
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.
2026-05-30 01:28:16 +02:00
florian.berthold 632406af6c ci(release): hide auto-generated source archives (hide_archive_links) 2026-05-29 20:51:15 +02:00
florian.berthold 914658af36 fix: defer UnitClass + guard InterfaceOptions for CoA; port Textures/*.tga to BLP (raw3)
release / release (push) Successful in 3s
2026-05-29 10:43:54 +02:00
27 changed files with 343 additions and 57 deletions
+1 -1
View File
@@ -37,7 +37,7 @@ jobs:
RID=$(curl -sf -X POST -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
"$API/repos/$REPO/releases" \
-d "$(jq -nc --arg t "$TAG" '{tag_name:$t,name:$t,draft:false,prerelease:false}')" \
-d "$(jq -nc --arg t "$TAG" '{tag_name:$t,name:$t,draft:false,prerelease:false,hide_archive_links:true}')" \
| jq -r '.id')
fi
echo "release id: $RID"
+143
View File
@@ -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" },
}
+132
View File
@@ -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)
+3 -1
View File
@@ -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
CoAScales.lua
+3
View File
@@ -1801,8 +1801,11 @@ function PawnInterfaceOptionsFrame_OnLoad()
-- NOTE: If you need anything from PawnCommon in the future, you should call PawnInitializeOptions first.
-- Register the Interface Options page.
-- CoA/3.3.5a: InterfaceOptions_AddCategory is a retail-only global; guard it.
PawnInterfaceOptionsFrame.name = "Pawn"
if InterfaceOptions_AddCategory then
InterfaceOptions_AddCategory(PawnInterfaceOptionsFrame)
end
-- Update the version display.
local Version = GetAddOnMetadata("Pawn", "Version")
if Version then
+2 -1
View File
@@ -1405,7 +1405,8 @@
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="40" y="-155" /></Offset></Anchor></Anchors>
<Scripts>
<OnClick>
InterfaceOptionsFrameOkay_OnClick()
-- CoA/3.3.5a: InterfaceOptionsFrameOkay_OnClick is retail-only; guard it.
if InterfaceOptionsFrameOkay_OnClick then InterfaceOptionsFrameOkay_OnClick() end
HideUIPanel(GameMenuFrame)
PawnUIShow()
</OnClick>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+12 -7
View File
@@ -420,8 +420,12 @@ PawnAddPluginScale(
if not PawnWowheadScaleProviderOptions then PawnWowheadScaleProviderOptions = { } end
if not PawnWowheadScaleProviderOptions.LastAdded then PawnWowheadScaleProviderOptions.LastAdded = 0 end
local _, Class = UnitClass("player")
if PawnWowheadScaleProviderOptions.LastAdded < 1 then
-- CoA/3.3.5a: UnitClass("player") returns nil at file-load and even at VARIABLES_LOADED on this client.
-- Defer the class-based auto-enable one frame so the unit is fully initialised.
local _PawnWowheadLastAdded = PawnWowheadScaleProviderOptions.LastAdded
C_Timer.After(0, function()
local _, Class = UnitClass("player")
if _PawnWowheadLastAdded < 1 then
-- Enable round one of scales based on the player's class.
if Class == "WARRIOR" then
PawnSetScaleVisible(PawnGetProviderScaleName(ScaleProviderName, "WarriorFury"), true)
@@ -466,16 +470,17 @@ if PawnWowheadScaleProviderOptions.LastAdded < 1 then
PawnSetScaleVisible(PawnGetProviderScaleName(ScaleProviderName, "DruidFeralTank"), true)
PawnSetScaleVisible(PawnGetProviderScaleName(ScaleProviderName, "DruidRestoration"), true)
end
end
end
if PawnWowheadScaleProviderOptions.LastAdded < 2 then
if _PawnWowheadLastAdded < 2 then
if Class == "WARRIOR" then
PawnSetScaleVisible(PawnGetProviderScaleName(ScaleProviderName, "WarriorArms"), true)
end
end
end
-- Don't reenable those scales again after the user has disabled them previously.
PawnWowheadScaleProviderOptions.LastAdded = 2
-- Don't reenable those scales again after the user has disabled them previously.
PawnWowheadScaleProviderOptions.LastAdded = 2
end)
-- After this function terminates there's no need for it anymore, so cause it to self-destruct to save memory.
PawnWowheadScaleProvider_AddScales = nil