Thanks Gello, the idea of that approach seems to be working well.
Here’s the updated code:
---------------------------------------------------------------------
-- Initialization
---------------------------------------------------------------------
local CasualUI, addon = ...
addon.Loot = addon.Loot or CreateFrame("Frame", "CasualUI.Loot", UIParent)
addon.Loot.Items = addon.Loot.Items or CreateFrame("Frame", nil, addon.Loot)
addon.Loot:RegisterEvent("ADDON_LOADED")
addon.Loot:RegisterEvent("CHAT_MSG_LOOT")
addon.Loot:RegisterEvent("CHAT_MSG_SKILL")
addon.Loot:RegisterEvent("CHAT_MSG_COMBAT_FACTION_CHANGE")
addon.Loot:RegisterEvent("CHAT_MSG_MONEY")
addon.Loot.icons = addon.Loot.icons or {
["Professions-ChatIcon-Quality-Tier1"] = {
fileID = 4723389,
texCoords = {0.094, 0.119, 0.92, 0.97},
},
["Professions-ChatIcon-Quality-Tier2"] = {
fileID = 4723392,
texCoords = {0.094, 0.119, 0.92, 0.97},
},
["Professions-ChatIcon-Quality-Tier3"] = {
fileID = 4723395,
texCoords = {0.094, 0.119, 0.92, 0.97},
},
["Professions-ChatIcon-Quality-Tier4"] = {
fileID = 4723398,
texCoords = {0.094, 0.119, 0.92, 0.97},
},
["Professions-ChatIcon-Quality-Tier5"] = {
fileID = 4723401,
texCoords = {0.094, 0.119, 0.92, 0.97},
},
}
---------------------------------------------------------------------
-- Functions
---------------------------------------------------------------------
addon.Loot.GetTextFrame = addon.Loot.GetTextFrame or function()
local items = {addon.Loot.Items:GetChildren()}
-- Return the first available item text frame, if any
for index, item in ipairs(items) do
if not item.animation:IsPlaying() then
return item, index
end
end
-- Otherwise, create a new item text frame to return
local newItem = CreateFrame("Frame", nil, addon.Loot.Items)
newItem:SetPoint("LEFT", UIParent, "CENTER")
newItem:SetSize(GetScreenWidth() / 2, 50)
newItem:SetAlpha(1)
newItem:Hide()
newItem.icon = newItem:CreateTexture(nil, "BACKGROUND") -- used for images in text
newItem.icon:SetPoint("RIGHT", newItem, "LEFT", -5, 0)
newItem.icon:SetSize(16, 16)
newItem.icon:SetTexture("")
newItem.text = newItem:CreateFontString(nil, "OVERLAY", "GameFontNormal")
newItem.text:SetPoint("LEFT", newItem, "LEFT")
newItem.text:SetTextColor(1, 1, 1, 1)
newItem.text:SetTextScale(1.5)
newItem.text:SetWordWrap(false)
newItem.animation = newItem:CreateAnimationGroup()
newItem.animation:SetScript("OnFinished", function()
newItem.text:SetText("")
newItem.icon:SetTexture("")
newItem:Hide()
end)
newItem.duration = 1.5
newItem.startFaded = newItem.animation:CreateAnimation("Alpha")
newItem.startFaded:SetFromAlpha(0)
newItem.startFaded:SetToAlpha(0)
newItem.startFaded:SetDuration(0)
newItem.fadeIn = newItem.animation:CreateAnimation("Alpha")
newItem.fadeIn:SetStartDelay(0)
newItem.fadeIn:SetFromAlpha(0)
newItem.fadeIn:SetToAlpha(1)
newItem.fadeIn:SetDuration(0.5)
newItem.fadeIn:SetSmoothing("OUT")
newItem.fadeOut = newItem.animation:CreateAnimation("Alpha")
newItem.fadeOut:SetStartDelay(1.5)
newItem.fadeOut:SetFromAlpha(1)
newItem.fadeOut:SetToAlpha(0)
newItem.fadeOut:SetDuration(0.5)
newItem.fadeOut:SetSmoothing("IN")
newItem.moveIn = newItem.animation:CreateAnimation("Translation")
newItem.moveIn:SetStartDelay(0)
newItem.moveIn:SetOffset(50, 0)
newItem.moveIn:SetDuration(0.5)
newItem.moveIn:SetSmoothing("OUT")
newItem.moveOut = newItem.animation:CreateAnimation("Translation")
newItem.moveOut:SetStartDelay(1.5)
newItem.moveOut:SetOffset(25, 0)
newItem.moveOut:SetDuration(0.5)
newItem.moveOut:SetSmoothing("IN")
newItem.delay = 0
newItem.UpdateDelay = function(self, newDelay)
newItem.delay = newDelay
newItem.fadeIn:SetStartDelay(newDelay)
newItem.fadeOut:SetStartDelay(newDelay + newItem.duration)
newItem.moveIn:SetStartDelay(newDelay)
newItem.moveOut:SetStartDelay(newDelay + newItem.duration)
end
return newItem, addon.Loot.Items:GetNumChildren()
end
addon.Loot.ExtractIcon = addon.Loot.ExtractIcon or function(textFrame, text)
if text then
local iconReference = text:match("|A:(.-):")
if iconReference and addon.Loot.icons[iconReference] then
textFrame.icon:SetTexture(addon.Loot.icons[iconReference].fileID)
textFrame.icon:SetTexCoord(unpack(addon.Loot.icons[iconReference].texCoords))
end
end
end
addon.Loot.Reformat = addon.Loot.Reformat or function(self, eventType, text)
if eventType == "CHAT_MSG_LOOT" then
local reformattedText = text
:gsub("You receive loot: ", "")
:gsub("You receive currency: ", "")
:gsub("You receive item: ", "")
:gsub("%[", "")
:gsub("|A.-|a", "") -- remove inline icons
:gsub("%]", "")
:gsub("x%d+$", " (%1)") -- change "x2" into " (2)"
:gsub("(x", "") -- remove excess "(x"
return reformattedText
end
return text
end
addon.Loot.DisplayText = addon.Loot.DisplayText or function(self, eventType, text)
local textFrame, textFrameIndex = addon.Loot:GetTextFrame()
local reformattedText = addon.Loot:Reformat(eventType, text)
addon.Loot.ExtractIcon(textFrame, text)
textFrame.text:SetPoint("LEFT", textFrame, "LEFT", 0, ((textFrameIndex - 1) * 25))
textFrame.text:SetText(reformattedText)
textFrame:UpdateDelay((textFrameIndex - 1) * 0.1)
textFrame:Show()
textFrame.animation:Play()
end
---------------------------------------------------------------------
-- Events
---------------------------------------------------------------------
addon.Loot:SetScript("OnEvent", function(self, event, ...)
if event == "ADDON_LOADED" then
local addonName = ...
if addonName == CasualUI then
SetCVar("autoLootDefault", 1)
SetCVar("lootUnderMouse", 1)
SetCVar("lootPickup", 1)
self:UnregisterEvent(event)
addon.Loot:GetTextFrame()
end
elseif event ~= "ADDON_LOADED" then
self:DisplayText(event, ...)
end
end)