1. I am working through chapter 15, and I have ran into a few problems.

    First, TargetBuffButtonTemplate and TargetDebuffButtonTemplate have changed to TargetBuffFrameTemplate and TargetDebuffFrameTemplate.

    The former is referenced under TargetTextBuffs:CreateBuff() The latter is referenced in the XML where TargetTextBuffsDebuffTemplate inherits it.

    Now, I am running into a problem that I have not been able to fix my self.

    My UI loads without any problems, but when I target someone who has buffs, swatter throws "attempt to compare number with string" at line 93.

    Now, line 109 is under TargetTextBuffs:UpdateBuffsBase(BuffFunc, frames, method)

    at line 109, there is:

    if duration and duration > 0 then

    So, I am getting a string as duration.

    Curiously, to help me figure out whats up, I put the following code immediately preceding this: ChatFrame1:AddMessage("icon: "..icon.." count: "..count.." duration: "..duration.." timeLeft: "..timeLeft.." debuffType: "..debuffType.." Index: "..index)

    now, I was hoping to be able to see what is up with these values, but when I do this, swatter throws:

    "attempt to concatenate local 'debuffType' (a nil value)"

    what I suspect is that the TargetTextBuffs:UpdateDebuffs() wrapper is not working correctly. Here is the code copied from my lua file. It should be exactly what is from the book:

     function TargetTextBuffs:UpdateBuffs()
        return self:UpdateBuffsBase(
            function(index)
            local icon, count, debuffType, duration, timeLeft = select(3, UnitDebuff("target", index))
            return icon, count, duration, timeLeft, debuffType
            end,
            debuffFrames,
            "CreateDebuff"
            )
     end 
    

    Somewhere between filling local icon, count, duration, debuffType, duration, and timeLeft and when I ask them to be printed, I lose some (deBuffType is nil, maybe it was never filled at all), and some get switched around (I think, at least. I suspect that is why duration is a string. Maybe UnitDebuff now returns strings, and I must cast duration to a number and then check to see if it is greater than 0)

    My TargetTextBuffs:UpdateDebuffs() is also straight from the book.

    As I understand it, the TargetTextBuffs:OnEvent() function calls the TargetTextBuffs:UpdateBuffs and TargetTextBuffs:UpdateDebuffs() function. These each in turn call self:UpdateBase() sending UpdateBase() the BuffFunc() (Either UnitBuffs or UnitDebuffs()), the frame to update, and the method.

    I just don't see how my icon, count, duration, debuffType, duration, and timeLeft are getting messed up.

    Okay, I realize that I was trying to concantenate duration, when duration should be a nil value if the buff has no fixed duration (Mount for example).

    I also realize now that I only get the error that says I am trying to compare a string to a number when I target someone who has buffs with durations.

    After adding the code:

                if count then
                ChatFrame5:AddMessage(" count: "..count)
            else
                ChatFrame5:AddMessage("count: Nil")
            end
            if icon then
            ChatFrame5:AddMessage(" icon: "..icon)
            else
                ChatFrame5:AddMessage("icon: Nil")
            end
            if duration then
                ChatFrame5:AddMessage(" duration: "..duration)
            else
                ChatFrame5:AddMessage("duration: Nil")
            end
            if timeLeft then
                ChatFrame5:AddMessage(" timeLeft: "..timeLeft)
            else
                ChatFrame5:AddMessage("timeLeft: Nil")
            end
            if debuffType then
                ChatFrame5:AddMessage("debuffType: "..debuffType)
            else
                ChatFrame5:AddMessage("debuffType: Nil")
            end
    

    I noticed that I would get a printout saying "Duration: Magic" "debuffType: Nil"

    It seems that duration and debuffType are being switched

    I think I am headed in the right direction

    Okay, I decided to abondon using switch and get all returns from UnitBuff() and UnitDebuff(). I am noticing that I always get a nil for expires.

    Here is my code:

     function RhoBuffs:UpdateDebuffs()
        return self:UpdateBuffsBase(
            function(index)
            local name, rank, icon, count, dispelType, duration, expires, caster, isStealable = UnitDebuff("target", index)
            return name, rank, icon, count, dispelType, duration, expires, caster, isStealable
            end,
            debuffFrames,
            "CreateDebuff"
            )
     end 
    

    and I am only including the beginning of this:

     function RhoBuffs:UpdateBuffsBase(BuffFunc, frames, method)
        local index = 1
        local name, rank, icon, count, dispelType, duration, expires, caster, isStealable = BuffFunc(index)
        local anchorBuff
    

    Now, my issues are

    a) expires always comes back nil from UnitBuffs() or UnitDebuff()

    b) when I hover over a buff, I get this from swatter:

    Error occured in: Global Count: 1 Message: ...AddOns\Auc-Advanced\Libs\LibExtraTip\LibExtraTip.lua line 252: Usage: GameTooltip:SetUnitBuff("unit", [index] or ["name", "rank"][, "filter"]) Debug: ...AddOns\Auc-Advanced\Libs\LibExtraTip\LibExtraTip.lua:252:

      ...AddOns\Auc-Advanced\Libs\LibExtraTip\LibExtraTip.lua:246
      [string "*:OnEnter"]:1
    

    c) I since I have been messing with my addon, X-Perl has been acting strange, and it persists through UI reloads, even through game client closing and reopening. For instance, I can no longer see buffs on my target frame. I can no longer see the playermodel on my target frame.

    Regarding issue b), I believe that because I inherited from TargetBuffFrameTemplate and TargetDebuffFrameTemplate, they have scripts in place to show a popup on a mouseover of a tooltip. When I inherit this, I break the functionality.

    It would really help if you could narrow down your issue, since you seem to be having lots of problems. If you check a buff that you've cast on yourself (or any other buff that shows the default timer countdown on it) then you should get a proper return for expires. I suggest you play with that. It's relatively simple:

    /run print(UnitBuff("player", 1)

    For example. With regards to your other issues, I don't even know where to begin helping you troubleshoot, since I'm not quite familiar with the way you have things set up.