coa.10: CoA reputation factions (data-driven) + custom-class icons + all-professions Skills
release / release (push) Successful in 5s
release / release (push) Successful in 5s
- Reputation view rebuilt data-driven from each char's scanned factions grouped by in-game category; CoA custom factions (and future ones) appear automatically. Old hardcoded tree kept only as an icon lookup. - CoA custom-class icons (classes 12-32) render from bundled atlas Altoholic/images/coa-classes.blp (texcoords from coa-details) instead of the Warrior glue-icon fallback in ShowClassIcons. - Skills tab shows ALL known professions (dynamic list incl Woodcutting/Woodworking), not 2 fixed slots; DataStore_Skills scans on PLAYER_ENTERING_WORLD/SKILL_LINES_CHANGED (fixes 'no profession data' that only scanned on ghost-release).
This commit is contained in:
@@ -14,6 +14,13 @@ local DARK_RED = "|cFFF00000"
|
||||
local ICON_UNKNOWN = "\124TInterface\\RaidFrame\\ReadyCheck-NotReady:14\124t"
|
||||
local ICON_EXALTED = "\124TInterface\\RaidFrame\\ReadyCheck-Ready:14\124t"
|
||||
|
||||
-- NOTE (Exiles/CoA): The Reputations view is DATA-DRIVEN.
|
||||
-- The hardcoded `Factions` table below is used ONLY as an icon lookup (faction name -> icon),
|
||||
-- so well-known Blizzard factions keep their nice icons. The list of factions actually shown,
|
||||
-- and their grouping, is built at runtime from what DataStore_Reputations scanned on each
|
||||
-- character (faction name + in-game category header). This means CoA's custom factions
|
||||
-- (and any new ones added over time) appear automatically, with no code edits required.
|
||||
-- Factions not present in the icon lookup fall back to a generic faction icon.
|
||||
local Factions = {
|
||||
-- Factions reference table, based on http://www.wowwiki.com/Factions
|
||||
{ -- [1]
|
||||
@@ -151,8 +158,96 @@ local VertexColors = {
|
||||
[FACTION_STANDING_LABEL8] = { r = 1.0, g = 1.0, b = 1.0 }, -- exalted
|
||||
}
|
||||
|
||||
local currentXPack = 1 -- default to wow classic
|
||||
local currentFactionGroup = (UnitFactionGroup("player") == "Alliance") and 1 or 2 -- default to alliance or horde
|
||||
local GENERIC_FACTION_ICON = "Achievement_Reputation_01" -- fallback icon for factions not in the lookup (ex: CoA custom factions)
|
||||
|
||||
-- Flat icon lookup built once from the hardcoded reference table above: faction name -> icon name.
|
||||
local FactionIcons = {}
|
||||
for _, xpack in ipairs(Factions) do
|
||||
for _, factionGroup in ipairs(xpack) do
|
||||
for _, faction in ipairs(factionGroup) do
|
||||
if faction.name and faction.icon then
|
||||
FactionIcons[faction.name] = faction.icon
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function GetFactionIcon(name)
|
||||
return FactionIcons[name] or GENERIC_FACTION_ICON
|
||||
end
|
||||
|
||||
-- *** Dynamic, data-driven group/faction model ***
|
||||
-- currentGroup = "" means "All factions" (every scanned faction, flat). Otherwise it's an in-game
|
||||
-- category header name (ex: "Wrath of the Lich King", or a CoA custom category).
|
||||
local ALL_GROUPS = ""
|
||||
local currentGroup = ALL_GROUPS
|
||||
|
||||
-- Rebuilt on each Update from the union of all characters' scanned reputations on the current realm.
|
||||
local displayedGroups = {} -- ordered list of { name = headerName } for the dropdown
|
||||
local displayedFactions = {} -- ordered list of faction names currently shown (filtered by currentGroup)
|
||||
|
||||
local function BuildModel()
|
||||
local DS = DataStore
|
||||
local realm, account = addon:GetCurrentRealm()
|
||||
|
||||
-- header (group) name -> { set of faction names }, plus first-seen order for stable display
|
||||
local groupSet = {}
|
||||
local factionHeader = {} -- faction name -> its header (last writer wins; headers are consistent across chars)
|
||||
local factionOrder = {} -- faction name -> first-seen index (stable ordering)
|
||||
local orderCounter = 0
|
||||
local groupOrder = {} -- header name -> first-seen index
|
||||
|
||||
for _, characterKey in pairs(DS:GetCharacters(realm, account)) do
|
||||
local reputations = DS:GetReputations(characterKey) or {}
|
||||
local headers = DS:GetReputationHeaders(characterKey) or {}
|
||||
for factionName in pairs(reputations) do
|
||||
local header = headers[factionName] or ""
|
||||
if factionOrder[factionName] == nil then
|
||||
orderCounter = orderCounter + 1
|
||||
factionOrder[factionName] = orderCounter
|
||||
end
|
||||
factionHeader[factionName] = header
|
||||
if not groupSet[header] then
|
||||
groupSet[header] = true
|
||||
groupOrder[header] = orderCounter
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Build the ordered group list for the dropdown.
|
||||
wipe(displayedGroups)
|
||||
local groupNames = {}
|
||||
for header in pairs(groupSet) do
|
||||
tinsert(groupNames, header)
|
||||
end
|
||||
table.sort(groupNames, function(a, b) return (groupOrder[a] or 0) < (groupOrder[b] or 0) end)
|
||||
for _, header in ipairs(groupNames) do
|
||||
tinsert(displayedGroups, header)
|
||||
end
|
||||
|
||||
-- If the previously selected group no longer exists, fall back to "All factions".
|
||||
if currentGroup ~= ALL_GROUPS and not groupSet[currentGroup] then
|
||||
currentGroup = ALL_GROUPS
|
||||
end
|
||||
|
||||
-- Build the ordered faction list for the currently selected group.
|
||||
wipe(displayedFactions)
|
||||
local names = {}
|
||||
for factionName in pairs(factionHeader) do
|
||||
if currentGroup == ALL_GROUPS or factionHeader[factionName] == currentGroup then
|
||||
tinsert(names, factionName)
|
||||
end
|
||||
end
|
||||
table.sort(names, function(a, b) return (factionOrder[a] or 0) < (factionOrder[b] or 0) end)
|
||||
for _, factionName in ipairs(names) do
|
||||
tinsert(displayedFactions, factionName)
|
||||
end
|
||||
end
|
||||
|
||||
local function GroupLabel(header)
|
||||
if header == ALL_GROUPS or header == "" then return ALL end -- "All", a Blizzard global string
|
||||
return header
|
||||
end
|
||||
|
||||
addon.Reputations = {}
|
||||
|
||||
@@ -194,46 +289,43 @@ local function DDM_AddCloseMenu()
|
||||
UIDropDownMenu_AddButton(info, 1)
|
||||
end
|
||||
|
||||
local function DDM_OnClick(self, xpackIndex, factionGroupIndex)
|
||||
currentXPack = xpackIndex
|
||||
currentFactionGroup = factionGroupIndex
|
||||
|
||||
local factionGroup = Factions[currentXPack][currentFactionGroup]
|
||||
UIDropDownMenu_SetText(AltoholicFrameReputations_SelectFaction, factionGroup.name)
|
||||
|
||||
local function DDM_OnClick(self, header)
|
||||
currentGroup = header or ALL_GROUPS
|
||||
|
||||
UIDropDownMenu_SetText(AltoholicFrameReputations_SelectFaction, GroupLabel(currentGroup))
|
||||
|
||||
ns:Update()
|
||||
end
|
||||
|
||||
local function Reputations_UpdateEx(self, offset, entry, desc)
|
||||
local line
|
||||
local size = desc:GetSize()
|
||||
|
||||
|
||||
local DS = DataStore
|
||||
local realm, account = addon:GetCurrentRealm()
|
||||
local character
|
||||
local factionGroup = Factions[currentXPack][currentFactionGroup]
|
||||
|
||||
|
||||
for i=1, desc.NumLines do
|
||||
line = i + offset
|
||||
if line <= size then
|
||||
local faction = factionGroup[line]
|
||||
|
||||
_G[entry..i.."Name"]:SetText(WHITE .. faction.name)
|
||||
local factionName = displayedFactions[line]
|
||||
|
||||
_G[entry..i.."Name"]:SetText(WHITE .. (factionName or ""))
|
||||
_G[entry..i.."Name"]:SetJustifyH("LEFT")
|
||||
_G[entry..i.."Name"]:SetPoint("TOPLEFT", 15, 0)
|
||||
|
||||
|
||||
for j = 1, 10 do -- loop through the 10 alts
|
||||
local itemName = entry.. i .. "Item" .. j;
|
||||
local itemButton = _G[itemName]
|
||||
local classButton = _G["AltoholicFrameClassesItem" .. j]
|
||||
|
||||
|
||||
local itemTexture = _G[itemName .. "_Background"]
|
||||
itemTexture:SetTexture("Interface\\Icons\\"..faction.icon)
|
||||
itemTexture:SetTexture("Interface\\Icons\\"..GetFactionIcon(factionName))
|
||||
|
||||
local status, rate
|
||||
if classButton.CharName then -- if there's an alt in this column..
|
||||
character = DS:GetCharacter(classButton.CharName, realm, account)
|
||||
status, _, _, rate = DS:GetReputationInfo(character, faction.name)
|
||||
status, _, _, rate = DS:GetReputationInfo(character, factionName)
|
||||
|
||||
if status and rate then
|
||||
local vc = VertexColors[status]
|
||||
@@ -276,22 +368,24 @@ local ReputationsScrollFrame_Desc = {
|
||||
NumLines = 8,
|
||||
LineHeight = 41,
|
||||
Frame = "AltoholicFrameReputations",
|
||||
GetSize = function() return #Factions[currentXPack][currentFactionGroup] end,
|
||||
GetSize = function() return #displayedFactions end,
|
||||
Update = Reputations_UpdateEx,
|
||||
}
|
||||
|
||||
function ns:DropDownFaction_Initialize()
|
||||
for xpackIndex, xpack in ipairs(Factions) do
|
||||
DDM_AddTitle(xpack.name)
|
||||
|
||||
for factionGroupIndex, factionGroup in ipairs(Factions[xpackIndex]) do
|
||||
DDM_Add(factionGroup.name, DDM_OnClick, xpackIndex, factionGroupIndex)
|
||||
end
|
||||
-- Dropdown is built dynamically from the categories actually scanned across all characters.
|
||||
BuildModel()
|
||||
|
||||
DDM_Add(GroupLabel(ALL_GROUPS), DDM_OnClick, ALL_GROUPS) -- "All factions" pseudo-group
|
||||
for _, header in ipairs(displayedGroups) do
|
||||
DDM_Add(GroupLabel(header), DDM_OnClick, header)
|
||||
end
|
||||
DDM_AddCloseMenu()
|
||||
end
|
||||
|
||||
function ns:Update()
|
||||
BuildModel()
|
||||
UIDropDownMenu_SetText(AltoholicFrameReputations_SelectFaction, GroupLabel(currentGroup))
|
||||
addon:ScrollFrameUpdate(ReputationsScrollFrame_Desc)
|
||||
end
|
||||
|
||||
@@ -302,12 +396,12 @@ function ns:OnEnter(frame)
|
||||
local DS = DataStore
|
||||
local realm, account = addon:GetCurrentRealm()
|
||||
local character = DS:GetCharacter(charName, realm, account)
|
||||
local factionGroup = Factions[currentXPack][currentFactionGroup]
|
||||
local faction = factionGroup[ frame:GetParent():GetID() ].name
|
||||
|
||||
local faction = displayedFactions[ frame:GetParent():GetID() ]
|
||||
if not faction then return end
|
||||
|
||||
local status, currentLevel, maxLevel, rate = DS:GetReputationInfo(character, faction)
|
||||
if not status then return end
|
||||
|
||||
|
||||
AltoTooltip:SetOwner(frame, "ANCHOR_LEFT");
|
||||
AltoTooltip:ClearLines();
|
||||
AltoTooltip:AddLine((DS:GetColoredCharacterName(character) or "?") .. WHITE .. " @ " .. TEAL .. faction,1,1,1);
|
||||
@@ -346,12 +440,12 @@ function ns:OnClick(frame, button)
|
||||
local DS = DataStore
|
||||
local realm, account = addon:GetCurrentRealm()
|
||||
local character = DS:GetCharacter(charName, realm, account)
|
||||
local factionGroup = Factions[currentXPack][currentFactionGroup]
|
||||
local faction = factionGroup[ frame:GetParent():GetID() ].name
|
||||
|
||||
local faction = displayedFactions[ frame:GetParent():GetID() ]
|
||||
if not faction then return end
|
||||
|
||||
local status, currentLevel, maxLevel, rate = DS:GetReputationInfo(character, faction)
|
||||
if not status then return end
|
||||
|
||||
|
||||
if ( button == "LeftButton" ) and ( IsShiftKeyDown() ) then
|
||||
local chat = ChatEdit_GetLastActiveWindow()
|
||||
if chat:IsShown() then
|
||||
|
||||
Reference in New Issue
Block a user