Files
coa-elvui/ElvUI_Enhanced/Modules/Misc/AlreadyKnown.lua
T
Andrew6810 8ad40722a0 Fixes Enhanced character frame
Update nameplate coloring.
Fix world map blips
2022-10-30 16:41:03 -07:00

275 lines
7.9 KiB
Lua

local E, L, V, P, G = unpack(ElvUI)
local AK = E:NewModule("Enhanced_AlreadyKnown", "AceHook-3.0", "AceEvent-3.0")
local _G = _G
local match = string.match
local ceil, fmod = math.ceil, math.fmod
local FauxScrollFrame_GetOffset = FauxScrollFrame_GetOffset
local GetAuctionItemClasses = GetAuctionItemClasses
local GetAuctionItemInfo = GetAuctionItemInfo
local GetAuctionItemLink = GetAuctionItemLink
local GetBuybackItemInfo = GetBuybackItemInfo
local GetBuybackItemLink = GetBuybackItemLink
local GetCurrentGuildBankTab = GetCurrentGuildBankTab
local GetGuildBankItemInfo = GetGuildBankItemInfo
local GetGuildBankItemLink = GetGuildBankItemLink
local GetItemInfo = GetItemInfo
local GetMerchantItemInfo = GetMerchantItemInfo
local GetMerchantItemLink = GetMerchantItemLink
local GetMerchantNumItems = GetMerchantNumItems
local GetNumAuctionItems = GetNumAuctionItems
local GetNumBuybackItems = GetNumBuybackItems
local IsAddOnLoaded = IsAddOnLoaded
local SetItemButtonTextureVertexColor = SetItemButtonTextureVertexColor
local BUYBACK_ITEMS_PER_PAGE = BUYBACK_ITEMS_PER_PAGE
local ITEM_SPELL_KNOWN = ITEM_SPELL_KNOWN
local MERCHANT_ITEMS_PER_PAGE = MERCHANT_ITEMS_PER_PAGE
local knownColor = {r = 0.1, g = 1.0, b = 0.2}
local function MerchantFrame_UpdateMerchantInfo()
local numItems = GetMerchantNumItems()
for i = 1, BUYBACK_ITEMS_PER_PAGE do
local index = (MerchantFrame.page - 1) * MERCHANT_ITEMS_PER_PAGE + i
if index > numItems then return end
local button = _G["MerchantItem"..i.."ItemButton"]
if button and button:IsShown() then
local _, _, _, _, numAvailable, isUsable = GetMerchantItemInfo(index)
if isUsable and AK:IsAlreadyKnown(GetMerchantItemLink(index)) then
local r, g, b = knownColor.r, knownColor.g, knownColor.b
if numAvailable == 0 then
r, g, b = r * 0.5, g * 0.5, b * 0.5
end
SetItemButtonTextureVertexColor(button, r, g, b)
end
end
end
end
local function MerchantFrame_UpdateBuybackInfo()
local numItems = GetNumBuybackItems()
for i = 1, BUYBACK_ITEMS_PER_PAGE do
if i > numItems then return end
local button = _G["MerchantItem"..i.."ItemButton"]
if button and button:IsShown() then
local _, _, _, _, _, isUsable = GetBuybackItemInfo(i)
if isUsable and AK:IsAlreadyKnown(GetBuybackItemLink(i)) then
SetItemButtonTextureVertexColor(button, knownColor.r, knownColor.g, knownColor.b)
end
end
end
end
local function AuctionFrameBrowse_Update()
local numItems = GetNumAuctionItems("list")
local offset = FauxScrollFrame_GetOffset(BrowseScrollFrame)
for i = 1, NUM_BROWSE_TO_DISPLAY do
local index = offset + i
if index > numItems then return end
local texture = _G["BrowseButton"..i.."ItemIconTexture"]
if texture and texture:IsShown() then
local _, _, _, _, canUse = GetAuctionItemInfo("list", index)
if canUse and AK:IsAlreadyKnown(GetAuctionItemLink("list", index)) then
texture:SetVertexColor(knownColor.r, knownColor.g, knownColor.b)
end
end
end
end
local function AuctionFrameBid_Update()
local numItems = GetNumAuctionItems("bidder")
local offset = FauxScrollFrame_GetOffset(BidScrollFrame)
for i = 1, NUM_BIDS_TO_DISPLAY do
local index = offset + i
if index > numItems then return end
local texture = _G["BidButton"..i.."ItemIconTexture"]
if texture and texture:IsShown() then
local _, _, _, _, canUse = GetAuctionItemInfo("bidder", index)
if canUse and AK:IsAlreadyKnown(GetAuctionItemLink("bidder", index)) then
texture:SetVertexColor(knownColor.r, knownColor.g, knownColor.b)
end
end
end
end
local function AuctionFrameAuctions_Update()
local numItems = GetNumAuctionItems("owner")
local offset = FauxScrollFrame_GetOffset(AuctionsScrollFrame)
for i = 1, NUM_AUCTIONS_TO_DISPLAY do
local index = offset + i
if index > numItems then return end
local texture = _G["AuctionsButton"..i.."ItemIconTexture"]
if texture and texture:IsShown() then
local _, _, _, _, canUse, _, _, _, _, _, _, _, saleStatus = GetAuctionItemInfo("owner", index)
if canUse and AK:IsAlreadyKnown(GetAuctionItemLink("owner", index)) then
local r, g, b = knownColor.r, knownColor.g, knownColor.b
if saleStatus == 1 then
r, g, b = r * 0.5, g * 0.5, b * 0.5
end
texture:SetVertexColor(r, g, b)
end
end
end
end
local function GuildBankFrame_Update()
if GuildBankFrame.mode ~= "bank" then return end
local tab = GetCurrentGuildBankTab()
for i = 1, MAX_GUILDBANK_SLOTS_PER_TAB do
local button = _G["GuildBankColumn"..ceil((i - 0.5) / NUM_SLOTS_PER_GUILDBANK_GROUP).."Button"..fmod(i, NUM_SLOTS_PER_GUILDBANK_GROUP)]
if button and button:IsShown() then
local texture, _, locked = GetGuildBankItemInfo(tab, i)
if texture and not locked then
if AK:IsAlreadyKnown(GetGuildBankItemLink(tab, i)) then
SetItemButtonTextureVertexColor(button, knownColor.r, knownColor.g, knownColor.b)
else
SetItemButtonTextureVertexColor(button, 1, 1, 1)
end
end
end
end
end
function AK:IsAlreadyKnown(itemLink)
if not itemLink then return end
local itemID = match(itemLink, "item:(%d+):")
if self.knownTable[itemID] then return true end
local _, _, _, _, _, itemType = GetItemInfo(itemLink)
if not self.knowableTypes[itemType] then return end
self.scantip:ClearLines()
self.scantip:SetHyperlink(itemLink)
for i = 2, self.scantip:NumLines() do
local text = _G["ElvUI_MerchantAlreadyKnownTextLeft"..i]:GetText()
if text == ITEM_SPELL_KNOWN then
self.knownTable[itemID] = true
return true
end
end
end
function AK:ADDON_LOADED(_, addon)
if addon == "Blizzard_AuctionUI" and not self.auctionHooked then
self:SetHooks()
elseif addon == "Blizzard_GuildBankUI" and not self.guildBankHooked then
self:SetHooks()
end
if self.auctionHooked and self.guildBankHooked then
self:UnregisterEvent("ADDON_LOADED")
end
end
function AK:SetHooks()
if not self:IsHooked("MerchantFrame_UpdateMerchantInfo") then
self:SecureHook("MerchantFrame_UpdateMerchantInfo", MerchantFrame_UpdateMerchantInfo)
end
if not self:IsHooked("MerchantFrame_UpdateBuybackInfo") then
self:SecureHook("MerchantFrame_UpdateBuybackInfo", MerchantFrame_UpdateBuybackInfo)
end
if not self.auctionHooked and IsAddOnLoaded("Blizzard_AuctionUI") then
if not self:IsHooked("AuctionFrameBrowse_Update") then
self:SecureHook("AuctionFrameBrowse_Update", AuctionFrameBrowse_Update)
end
if not self:IsHooked("AuctionFrameBid_Update") then
self:SecureHook("AuctionFrameBid_Update", AuctionFrameBid_Update)
end
if not self:IsHooked("AuctionFrameAuctions_Update") then
self:SecureHook("AuctionFrameAuctions_Update", AuctionFrameAuctions_Update)
end
self.auctionHooked = true
end
if not self.guildBankHooked and IsAddOnLoaded("Blizzard_GuildBankUI") then
if not self:IsHooked("GuildBankFrame_Update") then
self:SecureHook("GuildBankFrame_Update", GuildBankFrame_Update)
end
self.guildBankHooked = true
end
end
function AK:IsLoadeble()
return not (IsAddOnLoaded("RecipeKnown") or IsAddOnLoaded("AlreadyKnown"))
end
function AK:ToggleState()
if not self:IsLoadeble() then return end
if not self.initialized then
self.scantip = CreateFrame("GameTooltip", "ElvUI_MerchantAlreadyKnown", nil, "GameTooltipTemplate")
self.scantip:SetOwner(UIParent, "ANCHOR_NONE")
self.knownTable = {}
local _, _, _, consumable, glyph, _, recipe, _, miscallaneous = GetAuctionItemClasses()
self.knowableTypes = {
[consumable] = true,
[glyph] = true,
[recipe] = true,
[miscallaneous] = true
}
self.initialized = true
end
if E.db.enhanced.general.alreadyKnown then
self:SetHooks()
if not (IsAddOnLoaded("Blizzard_AuctionUI") and IsAddOnLoaded("Blizzard_GuildBankUI")) then
self:RegisterEvent("ADDON_LOADED")
end
else
self:UnhookAll()
self.auctionHooked = nil
self.guildBankHooked = nil
end
end
function AK:Initialize()
if not E.db.enhanced.general.alreadyKnown then return end
self:ToggleState()
end
local function InitializeCallback()
AK:Initialize()
end
E:RegisterModule(AK:GetName(), InitializeCallback)