You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

386 lines
12 KiB

local _, addon = ...
local ESM = Narci_EquipmentSetManager; --defined in EquipmentSetManager.lua
local IsSpellPassive = addon.TransitionAPI.IsSpellPassive;
local IconPresets = {};
IconPresets.tank = {
951819, --Shield_draenorcrafted_d_02_b_alliance
951820, --Shield_draenorcrafted_d_02_b_horde
2398168, --Inv_shield_1h_bloodelfguard_d_01
};
IconPresets.healer = {
460955, --Priest_icon_innewill
215433, --spell_priest_chakra
537099, --Spell_priest_angelicbulwark
135913, --Spell_holy_greaterheal
135930, --Spell_holy_lesserheal02
};
IconPresets.pvp = {
236335, --Achievement_arena_3v3_6
236328, --Achievement_arena_2v2_6
236340, --Achievement_arena_5v5_4
236357, --Achievement_bg_kill_carrier_opposing_flagroom
236349, --Achievement_bg_captureflag_eos
236320, --Ability_wintergrasp_rank1
458242, --Trade_archaeology_generalbeauregardslaststand
};
IconPresets.dungeon = {
236387, --Achievement_bg_winab_underxminutes
2011140, --Achievement_dungeon_skycapnkragg
2011149, --Achievement_dungeon_toldagor
1518644, --Inv_misc_diachest03
136180, --Spell Disruption
525134, --Inv_relics_hourglass [Keystone]
236353, --Achievement_bg_grab_cap_flagunderxseconds
};
local function GetRandomIcon(subclass)
local IconCategory = IconPresets[subclass];
return ( IconCategory[ math.random( #IconCategory ) ] );
end
--[[
--Dev Tool
local IconNames = {};
local IconNames_LowerCase = {};
local SetTimer = C_Timer.After;
local find = string.find;
IconNames = GetLooseMacroIcons();
local index = 1;
local totalMatches = 0;
local isConsecutive = false;
local isMatch = false;
local totalIcon = #IconNames;
local function ConvertToLowerCase()
local strlower = string.lower;
for i = 1, #IconNames do
IconNames_LowerCase[i] = strlower(IconNames[i]);
end
end
ConvertToLowerCase();
local function ResetFlags()
print("Found ".. totalMatches .. "matches.")
index = 1;
totalMatches = 0;
isConsecutive = false;
isMatch = false;
end
local function PrintIcons(name)
--Ability_ClassName_SpellName
if index <= totalIcon then
isMatch = find(IconNames_LowerCase[index], name, 9)
if isMatch then
print("|cFFFFD100"..index .."|r ".. IconNames[index]);
totalMatches = totalMatches + 1;
isConsecutive = true;
end
if isConsecutive and (not isMatch) then
print("|cffff5050"..index .."|r ".. IconNames[index]); --Irregular
print("Searching ended.")
ResetFlags();
return;
end
index = index + 1;
SetTimer(0, function()
PrintIcons(name)
end);
else
print("Searching completed.");
ResetFlags();
end
end
function SearchIconsByClassName(ClassName)
local name = strlower(ClassName);
PrintIcons(name);
end
--]]
----------------------------------------------------------
local staticIcons = {}; --exclude passive spell
local usedIcons = {}; --usedIcons = staticIcons∪recently used icons
local excludedIcons = { --Reset
132296, --DH: Double Jump
132301, --Rogue: Fleet Footed
};
local function IsUniqueIcon(icon)
if not icon then return false; end;
local isUnique = not usedIcons[icon];
usedIcons[icon] = true;
return isUnique;
end
local function GetStaticIcons()
local numTab = GetNumSpellTabs();
local spellID;
local icon;
for i = 2, numTab do
local _, _, tabOffset, numEntries = GetSpellTabInfo(i); --1:General 2:Current Spec
for j = (tabOffset + 1) , (tabOffset + numEntries) do
_, spellID = GetSpellBookItemInfo(j, "spell");
if spellID and (not IsSpellPassive(spellID) ) then
icon = GetSpellBookItemTexture(j, "spell");
staticIcons[icon] = true;
end
end
end
for i = 1, #excludedIcons do
staticIcons[ excludedIcons[i] ] = true;
end
return staticIcons
end
local GetEquipmentSetInfo = C_EquipmentSet.GetEquipmentSetInfo;
local function LoadEquipmentSetIcons()
local SetIDs = C_EquipmentSet.GetEquipmentSetIDs() or {};
for i = 1, #SetIDs do
local _, iconFileID = GetEquipmentSetInfo(SetIDs[i]);
usedIcons[iconFileID] = true;
end
end
local function GetSelectedPvpTalentIcons()
local talentIDs = C_SpecializationInfo.GetAllSelectedPvpTalentIDs(); --Return talentID
if talentIDs and #talentIDs > 1 then
local icons = {};
for i = 2, #talentIDs do
local _, _, icon = GetPvpTalentInfoByID(talentIDs[i]);
tinsert(icons, icon);
end
return icons;
else
return false;
end
end
local GetInventoryItemTexture = GetInventoryItemTexture;
local GetInventoryItemQuality = GetInventoryItemQuality;
local DoesItemExist = C_Item.DoesItemExist;
local function GenerateIcons() --Passive talent only
local icons, names = {}, {};
local MaxTiers = GetMaxTalentTier(); --based on the character's level
local talentGroup = GetActiveSpecGroup();
local talentID, icon, spellID, name;
local IsSpellPassive = IsSpellPassive;
--from Inventory
local itemLocation = ItemLocation:CreateFromEquipmentSlot(16); --Main Hand
if DoesItemExist(itemLocation) then
icon = C_Item.GetItemIcon(itemLocation);
if IsUniqueIcon(icon) then
name = C_Item.GetItemName(itemLocation);
tinsert(icons, icon);
tinsert(names, name);
end
end
itemLocation = ItemLocation:CreateFromEquipmentSlot(15) --INVSLOT_BACK
if DoesItemExist(itemLocation) then
local quality = C_Item.GetItemQuality(itemLocation)
if quality == 5 or quality == 6 then --Legendary & Artifact
icon = C_Item.GetItemIcon(itemLocation);
end
if IsUniqueIcon(icon) then
name = C_Item.GetItemName(itemLocation);
tinsert(icons, icon);
tinsert(names, name);
end
end
--from spell book
local GetSpellBookItemTexture = GetSpellBookItemTexture;
local GetSpellBookItemInfo = GetSpellBookItemInfo;
local _, _, tabOffset, numEntries = GetSpellTabInfo(2) --1:General 2:Current Spec
for i = (tabOffset + numEntries) , tabOffset + 1 , -1 do --Passive spell sits in the back
_, spellID = GetSpellBookItemInfo(i, "spell");
if spellID and IsSpellPassive(spellID) then
icon = GetSpellBookItemTexture(i, "spell");
if IsUniqueIcon(icon) then
tinsert(icons, icon);
name = GetSpellBookItemName(i, "spell");
tinsert(names, name);
end
else
--break;
end
end
--Regular talent tree
if talentGroup then
local column;
for tier = 1, MaxTiers do
_, column = GetTalentTierInfo(tier, talentGroup);
if column then
talentID, name, icon, _, _, spellID = GetTalentInfo(tier, column, talentGroup);
if spellID and IsSpellPassive(spellID) and IsUniqueIcon(icon) then
tinsert(icons, icon);
tinsert(names, name);
end
end
end
end
--PvP talents
local talentIDs = C_SpecializationInfo.GetAllSelectedPvpTalentIDs(); --Return talentID
if talentIDs and #talentIDs > 1 then
for i = 2, #talentIDs do
_, name, icon, _, _, spellID = GetPvpTalentInfoByID(talentIDs[i]);
if spellID and IsSpellPassive(spellID) and IsUniqueIcon(icon) then
tinsert(icons, icon);
tinsert(names, name);
end
end
end
itemLocation = ItemLocation:CreateFromEquipmentSlot(17); --INVSLOT_OFFHAND
if DoesItemExist(itemLocation) then
if #icons < 2 then
icon = C_Item.GetItemIcon(itemLocation);
if IsUniqueIcon(icon) then
name = C_Item.GetItemName(itemLocation);
tinsert(icons, icon);
tinsert(names, name);
end
end
end
return icons, names;
end
local function GetPassiveSpellIcons()
--from spell book
local GetSpellBookItemTexture = GetSpellBookItemTexture;
local GetSpellBookItemInfo = GetSpellBookItemInfo;
local spellID;
local icons = {};
local icon;
local _, _, tabOffset, numEntries = GetSpellTabInfo(2) --1:General 2:Current Spec
for i = (tabOffset + numEntries) , tabOffset + 1 , -1 do --Passive spell sits in the back
_, spellID = GetSpellBookItemInfo(i, "spell");
if spellID and IsSpellPassive(spellID) then
icon = GetSpellBookItemTexture(i, "spell");
if IsUniqueIcon(icon) then
tinsert(icons, icon);
end
else
--break;
end
end
return icons;
end
local GetEquipmentSetIDByName = C_EquipmentSet.GetEquipmentSetID;
local function ConvertToUniqueName(setName)
setName = setName or "";
local newName = setName;
local index = 2;
while (GetEquipmentSetIDByName(newName) and index <= 10) do
newName = setName..index;
index = index + 1
end
return newName;
end
function ESM:GetCurrentSpecializationNameAndIcons()
LoadEquipmentSetIcons();
local currentSpec = GetSpecialization() or 1;
local _, currentSpecName, _, specIcon, role = GetSpecializationInfo(currentSpec);
local roleName;
currentSpecName = ConvertToUniqueName(currentSpecName);
if role == "TANK" then
subclass = "tank";
roleName = TANK;
elseif role == "HEALER" then
subclass = "healer";
roleName = HEALER;
else --"DAMAGER" and else
subclass = "pvp";
roleName = DAMAGER;
end
local roleIcon = GetRandomIcon(subclass);
local dungeonIcon = GetRandomIcon("dungeon");
local pvpIcon = GetRandomIcon("pvp");
local spellIcons, spellNames = GenerateIcons(); --table
C_Timer.After(0.2, function()
wipe(usedIcons);
usedIcons = GetStaticIcons();
end)
return currentSpecName, specIcon, roleIcon, dungeonIcon, pvpIcon, spellIcons, roleName, spellNames;
end
----------------------------------------------------------
4 years ago
NarciEquipmentSetIconSelectorMixin = {};
function NarciEquipmentSetIconSelectorMixin:OnLoad()
ESM.IconSelector = self;
self.Header:SetText(Narci.L["Icon Selector"]);
4 years ago
end
function NarciEquipmentSetIconSelectorMixin:OnHide()
self:Hide();
self:SetAlpha(0);
self.Header:SetText(Narci.L["Icon Selector"]);
4 years ago
end
function NarciEquipmentSetIconSelectorMixin:Load()
if self.Init then
self:Init();
end
end
function NarciEquipmentSetIconSelectorMixin:Init()
usedIcons = GetStaticIcons();
LoadEquipmentSetIcons()
local row, column = 4, 3;
local size = 48;
4 years ago
self:SetSize(size * column, size * row);
self.row, self.column = row, column;
--Crreate icon buttons
local button;
local buttons = {};
local icons = {};
for i = 1 , (row * column) do
4 years ago
button = CreateFrame("Button", nil, self, "NarciEquipmentSetIconTemplate");
if i == 1 then
4 years ago
button:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 0, 0); --Start from bottom-left
elseif i % column == 1 then
button:SetPoint("BOTTOM", buttons[i - column], "TOP", 0, 0); --New row
else
button:SetPoint("LEFT", buttons[i - 1], "RIGHT", 0, 0);
end
tinsert(icons, button.Icon);
tinsert(buttons, button);
end
4 years ago
self.icons = icons;
self.buttons = buttons;
4 years ago
self.Init = nil;
end