Files
AtlasLoot/Core/WishList.lua
T
2026-07-02 08:57:26 +03:00

311 lines
9.1 KiB
Lua

--File containing functions related to the wish list.
local AL = AceLibrary("AceLocale-2.2"):new("AtlasLoot")
AtlasLoot_WishList = nil
local currentPage = 1
-- Colours stored for code readability
local GREY = "|cff999999"
local RED = "|cffff0000"
local WHITE = "|cffFFFFFF"
local GREEN = "|cff1eff00"
local PURPLE = "|cff9F3FFF"
local BLUE = "|cff0070dd"
local ORANGE = "|cffFF8400"
--[[
AtlasLoot_ShowWishList()
Displays the WishList
]]
function AtlasLoot_ShowWishList()
AtlasLoot_ShowItemsFrame("WishList", "WishListPage"..currentPage, AL["WishList"])
CloseDropDownMenus()
AtlasLootDefaultFrame_SubMenu:Disable()
AtlasLootDefaultFrame_SelectedTable:Hide()
AtlasLootQuickLooksButton:Hide()
AtlasLoot_QuickLooks:Hide()
end
--[[
AtlasLoot_AddToWishlist(itemID, itemTexture, itemName, lootPage, sourcePage)
Looks for an empty slot in the wishlist and slots the item in
]]
function AtlasLoot_AddToWishlist(itemID, itemTexture, itemName, extraText, sourcePage)
for _, v in ipairs(AtlasLootCharDB["WishList"]) do
if v[1] == itemID then
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..AtlasLoot_FixText(itemName)..RED..AL[" already in the WishList!"])
return
end
end
table.insert(AtlasLootCharDB["WishList"], { itemID, itemTexture, itemName, extraText, sourcePage })
DEFAULT_CHAT_FRAME:AddMessage(BLUE..AL["AtlasLoot"]..": "..AtlasLoot_FixText(itemName)..GREY..AL[" added to the WishList."])
AtlasLoot_WishList = AtlasLoot_CategorizeWishList(AtlasLootCharDB["WishList"])
end
--[[
AtlasLoot_DeleteFromWishList(itemID)
Deletes the specified items from the wishlist
]]
function AtlasLoot_DeleteFromWishList(itemID)
if itemID and itemID == 0 then return end
for i, v in ipairs(AtlasLootCharDB["WishList"]) do
if v[1] == itemID then
DEFAULT_CHAT_FRAME:AddMessage(RED..AL["AtlasLoot"]..": "..AtlasLoot_FixText(v[3])..GREY..AL[" deleted from the WishList."])
table.remove(AtlasLootCharDB["WishList"], i)
break
end
end
AtlasLoot_WishList = AtlasLoot_CategorizeWishList(AtlasLootCharDB["WishList"])
AtlasLootItemsFrame:Hide()
AtlasLoot_ShowItemsFrame("WishList", "WishListPage"..currentPage, AL["WishList"])
end
--[[
AtlasLoot_WishListSort()
Sorts the Wishlist
]]
function AtlasLoot_WishListSort()
local j = 0
local P = 2
local temp = {}
local check = false
while (P < 31) do
temp = AtlasLootCharDB["WishList"][P]
j = P
check = AtlasLoot_WishListSortCheck(AtlasLootCharDB["WishList"][j - 1], temp)
while ((j > 1) and check) do
AtlasLootCharDB["WishList"][j] = AtlasLootCharDB["WishList"][j - 1]
j = j - 1
check = AtlasLoot_WishListSortCheck(AtlasLootCharDB["WishList"][j - 1], temp)
end
AtlasLootCharDB["WishList"][j] = temp
P = P + 1
end
end
--[[
AtlasLoot_WishListSortCheck(temp1, temp2)
Checks if temp1 > temp2
Sorts by rarity, then alphabetically.
]]
function AtlasLoot_WishListSortCheck(temp1, temp2)
if (temp1 == nil) then
return false
elseif (temp2 == nil) then
return false
end
if temp2[1] == 0 then
return false
elseif temp1[1] == 0 then
return true
else
local prefix1 = string.lower(string.sub(temp1[3], 1, 10))
local prefix2 = string.lower(string.sub(temp2[3], 1, 10))
if prefix1 ~= prefix2 then
if prefix1 == "|cffff0000" then
return false
elseif (prefix1 == "|cffff8000") and (prefix2 ~= "|cffff0000") then
return false
elseif (prefix1 == "|cffa335ee") then
if (prefix2 == "|cffff8000") or (prefix2 == "|cffff0000") then
return true
else
return false
end
elseif (prefix1 == "|cff0070dd") then
if (prefix2 == "|cffa335ee") or (prefix2 == "|cffff8000") or (prefix2 == "|cffff0000") then
return true
else
return false
end
elseif (prefix1 == "|cff1eff00") then
if (prefix2 == "|cffffffff") or (prefix2 == "|cff9d9d9d") then
return false
else
return true
end
elseif (prefix1 == "|cff9d9d9d") then
return true
elseif (prefix1 == "|cffffffff") and (prefix2 ~= "|cff9d9d9d") then
return true
else
return false
end
else
if (temp1[3] > temp2[3]) then
return true
else
return false
end
end
end
end
--[[
local RecursiveSearchZoneName(dataTable, zoneID):
A recursive function iterate AtlasLoot_HewdropDown table for the zone name
]]
local function RecursiveSearchZoneName(dataTable, zoneID)
if (dataTable[2] == zoneID) then
return dataTable[1]
end
for _, v in pairs(dataTable) do
if type(v) == "table" then
local result = RecursiveSearchZoneName(v, zoneID)
if result then return result end
end
end
end
--[[
AtlasLoot_GetWishListSubheading(dataID):
Iterating through dropdown data tables to search backward for zone name with specified dataID
]]
function AtlasLoot_GetWishListSubheading(dataID)
if not AtlasLoot_HewdropDown or not AtlasLoot_HewdropDown_SubTables then return end
local zoneID
for subKey, subTable in pairs(AtlasLoot_HewdropDown_SubTables) do
for _, t in ipairs(subTable) do
if t[2] == dataID then
zoneID = subKey
break
end
end
if zoneID then break end
end
return RecursiveSearchZoneName(AtlasLoot_HewdropDown, zoneID or dataID)
end
function AtlasLoot_GetWishListSubheadingBoss(dataID)
if not AtlasLoot_TableNamesBoss then
return
end
local zoneID
for i, v in pairs(AtlasLoot_TableNamesBoss) do
for j, k in pairs(v) do
if dataID == j then
zoneID = k[1]
break
end
end
end
--[[for i, v in pairs(AtlasLoot_TableNames) do
if dataID == i then
zoneID = v[1]
break
end
end]]
return zoneID
end
function GetLootTableParent(dataID)
if not dataID then return end
local parentID
for i, v in pairs(AtlasLoot_TableNamesBoss) do
for j, k in pairs(v) do
if dataID == j then
parentID = i
break
end
end
end
return parentID
end
local function GetWishListSubheadingDungeon(dataID)
if not AtlasLoot_TableNames then return end
local zoneID
for i, v in pairs(AtlasLoot_TableNamesBoss) do
for j, k in pairs(v) do
if dataID == j then
zoneID = i
break
end
end
end
return zoneID
end
--[[
AtlasLoot_CategorizeWishList(wlTable):
Group items with zone/event name etc, and format them by adding subheadings and empty lines
This function returns a single table with all items, use AtlasLoot_GetWishListPage to split it
wlTable: is AtlasLootCharDB["WishList"], parameterized for flexible
]]
function AtlasLoot_CategorizeWishList(wlTable)
local subheadings, categories, result = {}, {}, {}
for _, v in pairs(wlTable) do
if v[5] and v[5] ~= "" then
local _, _, dataID = strfind(v[5], "^(.+)|.+")
-- Build subheading table
if not subheadings[dataID] then
if AtlasLootCharDB.WishlistGroupedByDungeon then
subheadings[dataID] = GetWishListSubheadingDungeon(dataID)
else
subheadings[dataID] = AtlasLoot_GetWishListSubheadingBoss(dataID)
end
-- If search failed, replace ID like "Aldor2" to "Aldor1" and try again
if not subheadings[dataID] and string.find(dataID, "^%a+%d?$") then
subheadings[dataID] = AtlasLoot_GetWishListSubheading(string.sub(dataID, 1, string.len(dataID) - 1).."1")
end
-- If still cant find it, mark it with Unknown
if not subheadings[dataID] then subheadings[dataID] = AL["Unknown"] end
end
-- Build category tables
if not categories[subheadings[dataID]] then categories[subheadings[dataID]] = {} end
table.insert(categories[subheadings[dataID]], v)
end
end
-- Sort and flatten categories
for k, v in pairs(categories) do
-- Add a empty line between categories when in a same column
if table.getn(result) > 1 and (table.getn(result) - math.floor(table.getn(result) / 15) * 15) > 0 then table.insert(result, { 0, "", "", "" }) end
-- If a subheading is on the last row of a column, push it to next column
if ((table.getn(result) + 1) - math.floor((table.getn(result) + 1) / 15) * 15) == 0 then table.insert(result, { 0, "", "", "" }) end
-- Subheading
-- some debug code that I've used to fix WishList errors before due to people adding drops to AtlasLoot incorrectly.
local box = k or "Unknown"
local cat = categories[k][1][5] or "Unknown"
_, _, cat = strfind(cat, "^(.+)|.+")
local parent = GetLootTableParent(cat) or "Unknown"
--print("box: "..box.." - cat: "..cat)
table.insert(result, { 0, "INV_Box_01", "=q6="..box, "=q0="..parent })
--table.insert(result, { 0, "INV_Box_01", "=q6="..k, "=q0="..GetLootTableParent(strsplit("|", categories[k][1][5])) })
-- Sort first then add items
table.sort(v, AtlasLoot_WishListSortCheck) -- not works?
for i = 1, table.getn(v) do table.insert(result, v[i]) end
end
collectgarbage()
return result
end
--[[
AtlasLoot_GetWishListPage(page):
Return partial data of WishList table
page: the page number needed
]]
function AtlasLoot_GetWishListPage(page)
if not AtlasLoot_WishList then AtlasLoot_WishList = AtlasLoot_CategorizeWishList(AtlasLootCharDB["WishList"]) end
-- Calc for maximal pages
local pageMax = math.ceil(table.getn(AtlasLoot_WishList) / 30)
if page < 1 then page = 1 end
if page > pageMax then page = pageMax end
currentPage = page
-- Table copy
local result = {}
local start = (page - 1) * 30 + 1
for i = start, start + 29 do
if not AtlasLoot_WishList[i] then break end
table.insert(result, AtlasLoot_WishList[i])
end
return result, pageMax
end