4 Commits

Author SHA1 Message Date
florian.berthold 694f6262ee feat(class): add CoA custom-class stat-summary defaults via CoAClassPrimaryStats
release / release (push) Successful in 2s
Copy CoAClassSpecData.lua into the addon folder and load it before
RatingBuster.lua in the .toc.  After the vanilla if/elseif ladder in
applyClassProfileDefaults(), a new CoA branch checks
CoAClassPrimaryStats[cls]: if the player's token is a CoA custom class,
enable the stat-summary keys that match the class's union of primary
stats (Agility→physical melee block, Strength→physical melee block,
Intellect→spell block, Spirit→healing/mp5 block, Stamina→health/sta).
Vanilla classes and unrelated settings are not touched.
2026-05-30 01:27:49 +02:00
florian.berthold e7b3d4fb93 ci(release): hide auto-generated source archives (hide_archive_links) 2026-05-29 20:51:15 +02:00
florian.berthold a969cf5fbd fix(libs): pcall AceGUI OnGamePadButtonDown (3.3.5 has no gamepad script type)
release / release (push) Successful in 3s
2026-05-29 20:23:33 +02:00
florian.berthold 1887013749 fix(class): resolve player class at login and defer class-specific defaults/options (was hardcoded DRUID) 2026-05-29 10:43:54 +02:00
5 changed files with 257 additions and 22 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" },
}
+109 -20
View File
@@ -352,7 +352,11 @@ Spi -> MP5, MP5NC, HP5, SpellDmg, Healing
}
-- Class specific defaults
if class == "DRUID" then
-- Applied at OnInitialize after UnitClass("player") is available.
-- CoA custom classes (not in the vanilla if/elseif ladder) fall through
-- to no block, which is the correct generic fallback for classless chars.
local function applyClassProfileDefaults(cls)
if cls == "DRUID" then
profileDefault.ratingSpell = true
profileDefault.ratingPhysical = true
profileDefault.sumHP = true
@@ -381,7 +385,7 @@ if class == "DRUID" then
profileDefault.showHealingFromSpi = true
profileDefault.sumIgnoreCloth = false
profileDefault.sumIgnoreLeather = false
elseif class == "HUNTER" then
elseif cls == "HUNTER" then
profileDefault.ratingPhysical = true
profileDefault.sumHP = true
profileDefault.sumMP = true
@@ -399,7 +403,7 @@ elseif class == "HUNTER" then
profileDefault.showAPFromSta = true
profileDefault.sumIgnoreLeather = false
profileDefault.sumIgnoreMail = false
elseif class == "MAGE" then
elseif cls == "MAGE" then
profileDefault.ratingSpell = true
profileDefault.sumHP = true
profileDefault.sumMP = true
@@ -417,7 +421,7 @@ elseif class == "MAGE" then
profileDefault.showMP5FromSpi = true
profileDefault.showSpellCritFromSpi = true -- Molten Armor
profileDefault.sumIgnoreCloth = false
elseif class == "PALADIN" then
elseif cls == "PALADIN" then
profileDefault.ratingSpell = true
profileDefault.ratingPhysical = true
profileDefault.sumHP = true
@@ -448,7 +452,7 @@ elseif class == "PALADIN" then
profileDefault.sumIgnoreLeather = false
profileDefault.sumIgnoreMail = false
profileDefault.sumIgnorePlate = false
elseif class == "PRIEST" then
elseif cls == "PRIEST" then
profileDefault.ratingSpell = true
profileDefault.sumHP = true
profileDefault.sumMP = true
@@ -466,7 +470,7 @@ elseif class == "PRIEST" then
profileDefault.showSpellDmgFromSpi = true
profileDefault.showHealingFromSpi = true
profileDefault.sumIgnoreCloth = false
elseif class == "ROGUE" then
elseif cls == "ROGUE" then
profileDefault.ratingPhysical = true
profileDefault.sumHP = true
profileDefault.sumResilience = true
@@ -478,7 +482,7 @@ elseif class == "ROGUE" then
profileDefault.sumArmorPenetration = true
profileDefault.showSpellCritFromInt = false
profileDefault.sumIgnoreLeather = false
elseif class == "SHAMAN" then
elseif cls == "SHAMAN" then
profileDefault.ratingSpell = true
profileDefault.ratingPhysical = true
profileDefault.sumHP = true
@@ -499,7 +503,7 @@ elseif class == "SHAMAN" then
profileDefault.sumIgnoreCloth = false
profileDefault.sumIgnoreLeather = false
profileDefault.sumIgnoreMail = false
elseif class == "WARLOCK" then
elseif cls == "WARLOCK" then
profileDefault.ratingSpell = true
profileDefault.sumHP = true
profileDefault.sumMP = true
@@ -515,7 +519,7 @@ elseif class == "WARLOCK" then
profileDefault.showMP5FromSpi = true
profileDefault.showSpellDmgFromSpi = true
profileDefault.sumIgnoreCloth = false
elseif class == "WARRIOR" then
elseif cls == "WARRIOR" then
profileDefault.ratingPhysical = true
profileDefault.sumHP = true
profileDefault.sumResilience = true
@@ -536,7 +540,7 @@ elseif class == "WARRIOR" then
profileDefault.sumIgnoreMail = false
end
profileDefault.sumIgnorePlate = false
elseif class == "DEATHKNIGHT" then
elseif cls == "DEATHKNIGHT" then
profileDefault.ratingPhysical = true
profileDefault.sumHP = true
profileDefault.sumResilience = true
@@ -555,6 +559,69 @@ elseif class == "DEATHKNIGHT" then
profileDefault.sumIgnorePlate = false
end
-- CoA custom classes: enable stat-summary defaults based on primary stats.
-- CoAClassPrimaryStats is defined in CoAClassSpecData.lua (loaded before this file).
if CoAClassPrimaryStats and CoAClassPrimaryStats[cls] then
local stats = CoAClassPrimaryStats[cls]
local hasAgi, hasStr, hasInt, hasSpi, hasSta = false, false, false, false, false
for _, stat in ipairs(stats) do
if stat == "Agility" then hasAgi = true end
if stat == "Strength" then hasStr = true end
if stat == "Intellect" then hasInt = true end
if stat == "Spirit" then hasSpi = true end
if stat == "Stamina" then hasSta = true end
end
-- Always: HP and resilience
profileDefault.sumHP = true
profileDefault.sumResilience = true
if hasAgi then
profileDefault.ratingPhysical = true
profileDefault.sumAgi = true
profileDefault.sumAP = true
profileDefault.sumHit = true
profileDefault.sumCrit = true
profileDefault.sumHaste = true
profileDefault.sumExpertise = true
profileDefault.sumArmorPenetration = true
end
if hasStr then
profileDefault.ratingPhysical = true
profileDefault.sumStr = true
profileDefault.sumAP = true
profileDefault.sumHit = true
profileDefault.sumCrit = true
profileDefault.sumHaste = true
profileDefault.sumExpertise = true
profileDefault.sumArmorPenetration = true
end
if hasInt then
profileDefault.ratingSpell = true
profileDefault.sumMP = true
profileDefault.sumInt = true
profileDefault.sumSpellDmg = true
profileDefault.sumSpellHit = true
profileDefault.sumSpellCrit = true
profileDefault.sumSpellHaste = true
profileDefault.sumHealing = true
profileDefault.sumMP5 = true
profileDefault.showSpellDmgFromInt = true
profileDefault.showMP5FromInt = true
end
if hasSpi then
profileDefault.ratingSpell = true
profileDefault.sumMP = true
profileDefault.sumSpi = true
profileDefault.sumHealing = true
profileDefault.sumMP5 = true
profileDefault.showMP5FromSpi = true
profileDefault.showHealingFromSpi = true
end
if hasSta then
profileDefault.sumSta = true
end
end
end -- applyClassProfileDefaults
local defaults = {}
defaults.profile = profileDefault
@@ -2252,7 +2319,10 @@ end
-- Class specific options
if class == "DRUID" then
-- Applied at OnInitialize (before SetupOptions) after UnitClass("player") is available.
-- CoA custom classes fall through to no block: no class-specific UI entries shown.
local function applyClassOptions(cls)
if cls == "DRUID" then
options.args.stat.args.agi.args.heal = { -- Nurturing Instinct (Rank 2) - 2,14
type = 'toggle',
width = "full",
@@ -2307,7 +2377,7 @@ if class == "DRUID" then
get = getProfileOption,
set = setProfileOptionAndClearCache,
}
elseif class == "HUNTER" then
elseif cls == "HUNTER" then
options.args.stat.args.int.args.rap = { -- Careful Aim
type = 'toggle',
width = "full",
@@ -2326,7 +2396,7 @@ elseif class == "HUNTER" then
get = getProfileOption,
set = setProfileOptionAndClearCache,
}
elseif class == "MAGE" then
elseif cls == "MAGE" then
options.args.stat.args.int.args.dmg = { -- Mind Mastery (Rank 5) - 1,22
type = 'toggle',
width = "full",
@@ -2363,7 +2433,7 @@ elseif class == "MAGE" then
get = getProfileOption,
set = setProfileOptionAndClearCache,
}
elseif class == "PALADIN" then
elseif cls == "PALADIN" then
options.args.stat.args.int.args.dmg = { -- Paladin: Holy Guidance (Rank 5) - 1,19
type = 'toggle',
width = "full",
@@ -2400,7 +2470,7 @@ elseif class == "PALADIN" then
get = getProfileOption,
set = setProfileOptionAndClearCache,
}
elseif class == "PRIEST" then
elseif cls == "PRIEST" then
options.args.stat.args.spi.args.mp5 = { -- Meditation (Rank 3) - 1,9
type = 'toggle',
width = "full",
@@ -2428,8 +2498,8 @@ elseif class == "PRIEST" then
get = getProfileOption,
set = setProfileOptionAndClearCache,
}
elseif class == "ROGUE" then
elseif class == "SHAMAN" then
elseif cls == "ROGUE" then
elseif cls == "SHAMAN" then
options.args.stat.args.str.args.dmg = { -- Mental Quickness (Rank 3) - 2,15
type = 'toggle',
width = "full",
@@ -2475,7 +2545,7 @@ elseif class == "SHAMAN" then
get = getProfileOption,
set = setProfileOptionAndClearCache,
}
elseif class == "WARLOCK" then
elseif cls == "WARLOCK" then
options.args.stat.args.sta.args.dmg = { -- Demonic Knowledge (Rank 3) - 2,20 - UnitExists("pet")
type = 'toggle',
width = "full",
@@ -2512,7 +2582,7 @@ elseif class == "WARLOCK" then
get = getProfileOption,
set = setProfileOptionAndClearCache,
}
elseif class == "WARRIOR" then
elseif cls == "WARRIOR" then
options.args.stat.args.armor = { -- Armored to the Teeth (Rank 3) - 2,1
type = 'group',
order = 7,
@@ -2530,7 +2600,7 @@ elseif class == "WARRIOR" then
},
},
}
elseif class == "DEATHKNIGHT" then
elseif cls == "DEATHKNIGHT" then
options.args.stat.args.str.args.parry = { -- Death Knight: Forceful Deflection - Passive
type = 'toggle',
width = "full",
@@ -2558,6 +2628,7 @@ elseif class == "DEATHKNIGHT" then
},
}
end
end -- applyClassOptions
function RatingBuster:SetupOptions()
-- Inject profile options
@@ -2660,6 +2731,16 @@ end
-- OnInitialize(name) called at ADDON_LOADED
function RatingBuster:OnInitialize()
-- Resolve player class as early as possible (ADDON_LOADED).
-- UnitClass("player") is nil at file-load time on this client (CoA 3.3.5a)
-- but is populated by ADDON_LOADED. Apply class-specific profileDefault
-- mutations BEFORE AceDB:New() so that first-install defaults are correct,
-- and apply class-specific options mutations BEFORE SetupOptions/RegisterOptionsTable.
local _, resolvedClass = UnitClass("player")
if resolvedClass then
class = resolvedClass
end
applyClassProfileDefaults(class)
-- Create DB
self.db = AceDB:New("RatingBusterDB", defaults)
self.db.RegisterCallback(self, "OnProfileChanged", "OnProfileChanged")
@@ -2668,6 +2749,7 @@ function RatingBuster:OnInitialize()
profileDB = self.db.profile
applyClassOptions(class)
self:SetupOptions()
-- Hook ShoppingTooltips to enable options to Hide Blizzard Item Comparisons
@@ -2680,6 +2762,13 @@ end
function RatingBuster:OnEnable()
-- Hook item tooltips
TipHooker:Hook(self.ProcessTooltip, "item")
-- Ensure class is resolved at PLAYER_LOGIN in case ADDON_LOADED fired too early.
-- This guards the runtime stat-conversion paths (class is used throughout
-- ProcessTooltip and StatLogic calls).
local _, resolvedClass = UnitClass("player")
if resolvedClass then
class = resolvedClass
end
-- Initialize playerLevel
playerLevel = UnitLevel("player")
-- for setting a new level
+3
View File
@@ -36,5 +36,8 @@ RatingBuster-Locale-frFR.lua
RatingBuster-Locale-koKR.lua
RatingBuster-Locale-esES.lua
# CoA class/spec data (must load before RatingBuster.lua) #
CoAClassSpecData.lua
# Core #
RatingBuster.lua
@@ -199,7 +199,7 @@ local function Constructor()
button:SetScript("OnKeyDown", Keybinding_OnKeyDown)
button:SetScript("OnMouseDown", Keybinding_OnMouseDown)
button:SetScript("OnMouseWheel", Keybinding_OnMouseWheel)
button:SetScript("OnGamePadButtonDown", Keybinding_OnKeyDown)
pcall(button.SetScript, button, "OnGamePadButtonDown", Keybinding_OnKeyDown)
button:SetPoint("BOTTOMLEFT")
button:SetPoint("BOTTOMRIGHT")
button:SetHeight(24)