Pokeystab
Pokeystab

Reputation: 41

Lua - World of Warcraft API Debuff frame

I have the strange problem, that with this AddOn it shows a frame with the current debuff. I think it displays only the first one and if another one is applied it just overlaps the first one. How can i make it so it displays the new ones next to the old ones?

This is the code:

function WCCPlayer_OnLoad() 
    this:SetHeight(40)
    this:SetWidth(40)
    this:SetPoint("CENTER", 0, 0)
    this:RegisterEvent("UNIT_AURA")
    this:RegisterEvent("PLAYER_AURAS_CHANGED")

    this.texture = this:CreateTexture(this, "BACKGROUND")
    this.texture:SetAllPoints(this)
    this.cooldown = CreateFrame("Model", "Cooldown", this, "CooldownFrameTemplate")
    this.cooldown:SetAllPoints(this) 
    this.maxExpirationTime = 0
    this:Hide()
end

function WCCPlayer_OnEvent()
    local spellFound = false
    for i=1, 16 do -- 16 is enough due to HARMFUL filter
        local texture = UnitDebuff("player", i)
        WCCTooltip:ClearLines()
        WCCTooltip:SetUnitDebuff("player", i)
        local buffName = WCCTooltipTextLeft1:GetText()

    if spellIds[buffName] then
        spellFound = true
        for j=0, 31 do
            local buffTexture = GetPlayerBuffTexture(j)
            if texture == buffTexture then
                local expirationTime = GetPlayerBuffTimeLeft(j)
                this:Show()
                this.texture:SetTexture(buffTexture)
                this.cooldown:SetModelScale(1)
                if this.maxExpirationTime <= expirationTime then
                    CooldownFrame_SetTimer(this.cooldown, GetTime(), expirationTime, 1)
                    this.maxExpirationTime = expirationTime
                end
                return
            end
        end     
    end
end
if spellFound == false then
    this.maxExpirationTime = 0
    this:Hide()
end
end

function WCCTarget_OnLoad()

end

function WCCTarget_OnEvent()

end

Upvotes: 3

Views: 602

Answers (1)

Walkerbo
Walkerbo

Reputation: 653

I think it is all about the frame position, and as you said, the new frame is displaying on top of the previous frame.

You need to have the new frame position next to the previous so each time you run your WCCPlayer_OnLoad() function it increase the X coordinate by the width of the frame.

First declare a local setPointX variable out side of the function, then increment the setPointX variable by the frame width, (in your case it is 40), each time the function is run;

local setPointX, setPointY = 0,0 -- x and y variables

function WCCPlayer_OnLoad()
    this:SetHeight(40)
    this:SetWidth(40)
    this:SetPoint('CENTER', setPointX, setPointY) -- use variables to set the frame point
    this:RegisterEvent('UNIT_AURA')
    this:RegisterEvent('PLAYER_AURAS_CHANGED')

    this.texture = this:CreateTexture(this, 'BACKGROUND')
    this.texture:SetAllPoints(this)
    this.cooldown = CreateFrame('Model', 'Cooldown', this, 'CooldownFrameTemplate')
    this.cooldown:SetAllPoints(this)
    this.maxExpirationTime = 0
    this:Hide()
    setPointX = setPointX + 40 -- increase the x variable by the width of the frame
end

I have no background in programming, (just trying to teach myself Java and Lua), so there undoubtedly will be better and more efficient/effective ways to solve your issue.

Upvotes: 0

Related Questions