vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
local dewdrop = DewdropLib:GetInstance('1.0');
local tablet = TabletLib:GetInstance('1.0');
local metrognome = Metrognome:GetInstance("1");
local babble = BabbleLib:GetInstance("1.0");

GroupFu = FuBarPlugin:new({
        name                            = GroupFuLocals.NAME,
        description                     = GroupFuLocals.DESCRIPTION,
        version                         = "1.4.7.4",
        releaseDate                     = "2006-07-10",
        aceCompatible           = 103,
        fuCompatible            = 102,
        author                          = "Etten",
        email                           = "idbrain@gmail.com",
        website                         = "http://etten.wowinterface.com",
        category                        = "interface",
        db                                      = AceDatabase:new("GroupFuDB"),
        defaults = {
                RollOnClick = true,
                ShowMLName = false,
                OutputChannel = "PARTY",
                OutputDetail = "SHORT",
                ClearTimer = 30,
                StandardRollsOnly = true,
                ShowRollCount = false,
                AnnounceRollCountdown = false,
                IgnoreDuplicates = true,
                DeleteRolls = true,
                ShowClassLevel = false,
                TextMode = "GROUPFU",
                LootColorTable = {}
        },
        hasIcon                         = GroupFuLocals.DEFAULT_ICON,
        clickableTooltip        = true,
        cannotDetachTooltip = false,
        canHideText                     = true,
        updateTime                      = 1.0,
        
        -- Localization Tags
        loc = GroupFuLocals,

        ENDGROUPFU = true
});
        
function GroupFu:Initialize()
        
    if self.data.version < self.versionNumber then
        self.data.Colors = nil;
                self.data.Rolls = nil;
                self.data.RollCount = nil;
                self.data.Threshold = nil;
                self.data.LootType = nil;
    end

        if not self.tmpdata then
                self.tmpdata = {};
        end

end

function GroupFu:Enable()
        self:RegisterEvent("CHAT_MSG_SYSTEM");
        self:RegisterEvent("PARTY_MEMBERS_CHANGED", "Update");
        self:RegisterEvent("PARTY_LOOT_METHOD_CHANGED", "Update");
        self:RegisterEvent("RAID_ROSTER_UPDATE", "Update");
        
        if not self.data.LootColorTable or table.getn(self.data.LootColorTable) == 0 then
                for i=0,6 do
                        local r, g, b, hex = GetItemQualityColor(i);
                        self.data.LootColorTable[i] = 
                                { 
                                        Red = r, 
                                        Green = g,
                                        Blue = b,
                                        Hex = hex,
                                        Threshold = i,
                                        Desc = getglobal("ITEM_QUALITY".. i .. "_DESC")
                                };
                end
        end

        self:ClearRolls();
        self.tmpdata.TimeSinceLastRoll = 0;
        metrognome:Register("MGtimer", self.CheckRollTimeout, self.updateTime, self);
        metrognome:Start("MGtimer");
end

function GroupFu:Disable()
        self:ClearRolls();
        metrognome:Stop("MGtimer");
end

function GroupFu:MenuSettings(level, value, inTooltip)
        if not inTooltip then
                if level == 1 then
                
                        dewdrop:AddLine(
                                'text', self.loc.MENU_OUTPUT,
                                'value', "MENU_OUTPUT",
                                'hasArrow', true
                        );

                        dewdrop:AddLine(
                                'text', self.loc.MENU_CLEAR,
                                'value', "MENU_CLEAR",
                                'hasArrow', true
                        );

                        dewdrop:AddLine(
                                'text', self.loc.MENU_DETAIL,
                                'value', "MENU_DETAIL",
                                'hasArrow', true
                        );

                        dewdrop:AddLine(
                                'text', self.loc.MENU_MODE,
                                'value', "MENU_MODE",
                                'hasArrow', true
                        );

                        dewdrop:AddLine(
                                'text', self.loc.MENU_PERFORMROLL,
                                'value', self.loc.MENU_PERFORMROLL,
                                'func', function() self:ToggleOption("RollOnClick") end,
                                'checked', self.data.RollOnClick
                        );
                                                
                        dewdrop:AddLine(
                                'text', self.loc.MENU_STANDARDROLLSONLY,
                                'value', self.loc.MENU_STANDARDROLLSONLY,
                                'func', function() self:ToggleOption("StandardRollsOnly") end,
                                'checked', self.data.StandardRollsOnly
                        );      

                        dewdrop:AddLine(
                                'text', self.loc.MENU_SHOWROLLCOUNT,
                                'value', self.loc.MENU_SHOWROLLCOUNT,
                                'func', function() self:ToggleOption("ShowRollCount") end,
                                'checked', self.data.ShowRollCount
                        );      

                        dewdrop:AddLine(
                                'text', self.loc.MENU_IGNOREDUPES,
                                'value', self.loc.MENU_IGNOREDUPES,
                                'func', function() self:ToggleOption("IgnoreDuplicates") end,
                                'checked', self.data.IgnoreDuplicates
                        );

                        dewdrop:AddLine(
                                'text', self.loc.MENU_AUTODELETE,
                                'value', self.loc.MENU_AUTODELETE,
                                'func', function() self:ToggleOption("DeleteRolls") end,
                                'checked', self.data.DeleteRolls
                        );

                        dewdrop:AddLine(
                                'text', self.loc.MENU_ANNOUNCEROLLCOUNTDOWN,
                                'value', self.loc.MENU_ANNOUNCEROLLCOUNTDOWN,
                                'func', function() self:ToggleOption("AnnounceRollCountdown") end,
                                'checked', self.data.AnnounceRollCountdown
                        );

                        dewdrop:AddLine(
                                'text', self.loc.MENU_SHOWCLASSLEVEL,
                                'value', self.loc.MENU_SHOWCLASSLEVEL,
                                'func', function() self:ToggleOption("ShowClassLevel") end,
                                'checked', self.data.ShowClassLevel
                        );

                        dewdrop:AddLine(
                                'text', self.loc.MENU_SHOWMLNAME,
                                'value', self.loc.MENU_SHOWMLNAME,
                                'func', function() self:ToggleOption("ShowMLName") end,
                                'checked', self.data.ShowMLName
                        );

                        dewdrop:AddLine(
                                'text', self.loc.MENU_GROUP,
                                'value', "MENU_GROUP",
                                'hasArrow', true
                        );

                elseif level == 2 then
                
                        if value == "MENU_OUTPUT" then
                        
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_OUTPUT_AUTO,
                                        'value', "AUTO",
                                        'func', function() self:ToggleOutputChannel("AUTO") end,
                                        'isRadio', true,
                                        'checked', self:IsOutputChannel("AUTO")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_OUTPUT_LOCAL,
                                        'value', "LOCAL",
                                        'func', function() self:ToggleOutputChannel("LOCAL") end,
                                        'isRadio', true,
                                        'checked', self:IsOutputChannel("LOCAL")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_OUTPUT_SAY,
                                        'value', "SAY",
                                        'func', function() self:ToggleOutputChannel("SAY") end,
                                        'isRadio', true,
                                        'checked', self:IsOutputChannel("SAY")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_OUTPUT_PARTY,
                                        'value', "PARTY",
                                        'func', function() self:ToggleOutputChannel("PARTY") end,
                                        'isRadio', true,
                                        'checked', self:IsOutputChannel("PARTY")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_OUTPUT_RAID,
                                        'value', "RAID",
                                        'func', function() self:ToggleOutputChannel("RAID") end,
                                        'isRadio', true,
                                        'checked', self:IsOutputChannel("RAID")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_OUTPUT_GUILD,
                                        'value', "GUILD",
                                        'func', function() self:ToggleOutputChannel("GUILD") end,
                                        'isRadio', true,
                                        'checked', self:IsOutputChannel("GUILD")
                                );
                                
                        elseif value == "MENU_CLEAR" then
                        
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_CLEAR_NEVER,
                                        'value', 0,
                                        'func', function() self:ToggleClearTimer(0) end,
                                        'isRadio', true,
                                        'checked', self:IsClearTimer(0)
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_CLEAR_15SEC,
                                        'value', 15,
                                        'func', function() self:ToggleClearTimer(15) end,
                                        'isRadio', true,
                                        'checked', self:IsClearTimer(15)
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_CLEAR_30SEC,
                                        'value', 30,
                                        'func', function() self:ToggleClearTimer(30) end,
                                        'isRadio', true,
                                        'checked', self:IsClearTimer(30)
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_CLEAR_45SEC,
                                        'value', 45,
                                        'func', function() self:ToggleClearTimer(45) end,
                                        'isRadio', true,
                                        'checked', self:IsClearTimer(45)
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_CLEAR_60SEC,
                                        'value', 60,
                                        'func', function() self:ToggleClearTimer(60) end,
                                        'isRadio', true,
                                        'checked', self:IsClearTimer(60)
                                );
                                
                        elseif value == "MENU_DETAIL" then
                        
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_DETAIL_SHORT,
                                        'value', "SHORT",
                                        'func', function() self:ToggleOutputDetail("SHORT") end,
                                        'isRadio', true,
                                        'checked', self:IsOutputDetail("SHORT")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_DETAIL_LONG,
                                        'value', "LONG",
                                        'func', function() self:ToggleOutputDetail("LONG") end,
                                        'isRadio', true,
                                        'checked', self:IsOutputDetail("LONG")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_DETAIL_FULL,
                                        'value', "FULL",
                                        'func', function() self:ToggleOutputDetail("FULL") end,
                                        'isRadio', true,
                                        'checked', self:IsOutputDetail("FULL")
                                );
                                
                        elseif value == "MENU_MODE" then
                        
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_MODE_GROUPFU,
                                        'value', "GROUPFU",
                                        'func', function() self:ToggleTextMode("GROUPFU") end,
                                        'isRadio', true,
                                        'checked', self:IsTextMode("GROUPFU")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_MODE_ROLLSFU,
                                        'value', "ROLLSFU",
                                        'func', function() self:ToggleTextMode("ROLLSFU") end,
                                        'isRadio', true,
                                        'checked', self:IsTextMode("ROLLSFU")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_MODE_LOOTTYFU,
                                        'value', "LOOTTYFU",
                                        'func', function() self:ToggleTextMode("LOOTTYFU") end,
                                        'isRadio', true,
                                        'checked', self:IsTextMode("LOOTTYFU")
                                );
                                
                        elseif value == "MENU_GROUP" then
                        
                                dewdrop:AddLine(
                                        'text', self.loc.MENU_GROUP_LEAVE,
                                        'value', "MENU_GROUP_LEAVE",
                                        'func', function() LeaveParty() end,
                                        'notCheckable', true
                                );
                                
                                if IsPartyLeader() or IsRaidLeader() then
                                
                                        dewdrop:AddLine(
                                                'text', self.loc.MENU_GROUP_RAID,
                                                'value', "MENU_GROUP_RAID",
                                                'func', function() ConvertToRaid() end,
                                                'notCheckable', true
                                        );
                                        
                                        dewdrop:AddLine(
                                                'text', self.loc.MENU_GROUP_LOOT,
                                                'value', "MENU_GROUP_LOOT",
                                                'hasArrow', true
                                        );

                                        dewdrop:AddLine(
                                                'text', self.loc.MENU_GROUP_THRESHOLD,
                                                'value', "MENU_GROUP_THRESHOLD",
                                                'hasArrow', true
                                        );
                                        
                                end
                        end
                        
                elseif level == 3 then
                
                        if value == "MENU_GROUP_LOOT" then
                        
                                dewdrop:AddLine(
                                        'text', self.loc.TEXT_GROUP,
                                        'value', "TEXT_GROUP",
                                        'func', function() self:SetLootType("group") end,
                                        'isRadio', true,
                                        'checked', self:IsLootType("group")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.TEXT_FFA,
                                        'value', "TEXT_FFA",
                                        'func', function() self:SetLootType("freeforall") end,
                                        'isRadio', true,
                                        'checked', self:IsLootType("freeforall")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.TEXT_MASTER,
                                        'value', "TEXT_MASTER",
                                        'func', function() self:SetLootType("master") end,
                                        'isRadio', true,
                                        'checked', self:IsLootType("master")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.TEXT_NBG,
                                        'value', "TEXT_NBG",
                                        'func', function() self:SetLootType("needbeforegreed") end,
                                        'isRadio', true,
                                        'checked', self:IsLootType("needbeforegreed")
                                );
                                
                                dewdrop:AddLine(
                                        'text', self.loc.TEXT_RR,
                                        'value', "TEXT_RR",
                                        'func', function() self:SetLootType("roundrobin") end,
                                        'isRadio', true,
                                        'checked', self:IsLootType("roundrobin")
                                );
                                
                        elseif value == "MENU_GROUP_THRESHOLD" then
                                local mnuGroupThrshldDesc, mnuGroupThrshldThrshld, mnuGroupThrshldHex
                                for j=0,6 do
                                        
                                        mnuGroupThrshldDesc = self.data.LootColorTable[j].Desc;
                                        mnuGroupThrshldThrshld = self.data.LootColorTable[j].Threshold;
                                        mnuGroupThrshldHex = self.data.LootColorTable[j].Hex;

                                        dewdrop:AddLine(
                                                'text', format("%s%s", mnuGroupThrshldHex, mnuGroupThrshldDesc .. "(" .. mnuGroupThrshldThrshld .. ")"),
                                                'func', function(val) self:SetLootThreshold(val) end,
                                                'arg1', mnuGroupThrshldThrshld,
                                                'isRadio', true,
                                                'checked', self:IsLootThreshold(mnuGroupThrshldThrshld)
                                        );

                                end
                        end
                end
        end
end

function GroupFu:UpdateData()
        if (GetNumPartyMembers() > 0) or (GetNumRaidMembers() > 0) then
                self.tmpdata.LootType = GetLootMethod();
                self.tmpdata.Threshold = GetLootThreshold();
        else
                self.tmpdata.LootType, self.tmpdata.Threshold = nil, nil;
        end
        
        local i, highRoll, rollLink;
        highRoll = 0;
        if(self.tmpdata.RollCount > 0) then
        
                for i = 1, self.tmpdata.RollCount do
                
                        if ((self.tmpdata.Rolls[i].Roll > highRoll) and ((not self.data.StandardRollsOnly) or ((self.tmpdata.Rolls[i].Min == 1) and (self.tmpdata.Rolls[i].Max == 100))))  then
                        
                                highRoll = self.tmpdata.Rolls[i].Roll;
                                rollLink = i;
                                
                        end
                end
                
                self.tmpdata.LastWinner = self.tmpdata.Rolls[rollLink].Player .. " [" .. FuBarUtils.Colorize("00FF00", highRoll) .. "]";
                
                if((self.tmpdata.Rolls[rollLink].Min ~= 1) or (self.tmpdata.Rolls[rollLink].Max ~= 100)) then
                
                        self.tmpdata.LastWinner = self.tmpdata.LastWinner .. " (" .. self.tmpdata.Rolls[rollLink].Min .. "-" .. self.tmpdata.Rolls[rollLink].Max .. ")";
                        
                end
                
        else
        
                self.tmpdata.LastWinner = nil;
                
        end
end

function GroupFu:UpdateText()
        if self.data.TextMode == "ROLLSFU" then
        
                if self.tmpdata.LastWinner ~= nil then
                
                        if self.data.ShowRollCount then
                        
                                if GetNumRaidMembers() > 0 then
                                
                                        self:SetText( string.format(self.loc.FORMAT_TEXT_ROLLCOUNT, self.tmpdata.LastWinner, self.tmpdata.RollCount, GetNumRaidMembers()) );
                                
                                elseif GetNumPartyMembers() > 0 then
                                
                                        self:SetText( string.format(self.loc.FORMAT_TEXT_ROLLCOUNT, self.tmpdata.LastWinner, self.tmpdata.RollCount, GetNumPartyMembers()+1) );
                                
                                else
                                
                                        self:SetText(self.tmpdata.LastWinner);
                                
                                end
                        
                        else
                                
                                self:SetText(self.tmpdata.LastWinner);
                                
                        end
                        
                else
                
                        self:SetText(self.loc.TEXT_NOROLLS);
                        
                end     
                
        elseif self.data.TextMode == "LOOTTYFU" then
        
                        if self.tmpdata.LootType == solo then
                                self:SetText(string.format("%s%s", "|cff888888", self:GetLootTypeText()));
                        else
                                if not self.tmpdata.Threshold then
                                        self:UpdateData();
                                end
                                self:SetText(string.format("%s%s", self.data.LootColorTable[self.tmpdata.Threshold].Hex, self:GetLootTypeText()));
                        end
                
        else
        
                if self.tmpdata.LastWinner ~= nil then
                
                        if self.data.ShowRollCount then
                        
                                if GetNumRaidMembers() > 0 then
                                
                                        self:SetText( string.format(self.loc.FORMAT_TEXT_ROLLCOUNT, self.tmpdata.LastWinner, self.tmpdata.RollCount, GetNumRaidMembers()) );
                                
                                elseif GetNumPartyMembers() > 0 then
                                
                                        self:SetText( string.format(self.loc.FORMAT_TEXT_ROLLCOUNT, self.tmpdata.LastWinner, self.tmpdata.RollCount, GetNumPartyMembers()+1) );
                                
                                else
                                
                                        self:SetText(self.tmpdata.LastWinner);
                                
                                end
                        
                        else
                                
                                self:SetText(self.tmpdata.LastWinner);
                                
                        end
                        
                else
                
                        if self.tmpdata.LootType == solo then
                                self:SetText(string.format("%s%s", "|cff888888", self:GetLootTypeText()));
                        else
                                if not self.tmpdata.Threshold then
                                        self:UpdateData();
                                end
                                self:SetText(string.format("%s%s", self.data.LootColorTable[self.tmpdata.Threshold].Hex, self:GetLootTypeText()));
                        end
                        
                end
        end
end

function GroupFu:UpdateTooltip()
        
        local cat;
        
        cat = tablet:AddCategory(
                'text', self.loc.TOOLTIP_CAT_LOOTING,
                'columns', 2
        );
        
        if self.tmpdata.LootType == "group" then
        
                if not self.tmpdata.Threshold then
                        self:UpdateData();
                end
                cat:AddLine(
                        'text', self.loc.TOOLTIP_METHOD .. ":",
                        'text2', string.format("%s%s", self.data.LootColorTable[self.tmpdata.Threshold].Hex, self.loc.TEXT_GROUP)
                );
                
        elseif self.tmpdata.LootType == "master" then 
        
                if self.data.ShowMLName and self.tmpdata.MLName then
                
                        if not self.tmpdata.Threshold then
                                self:UpdateData();
                        end
                        cat:AddLine(
                                'text', self.loc.TOOLTIP_METHOD .. ":",
                                'text2', string.format("%s%s", self.data.LootColorTable[self.tmpdata.Threshold].Hex, self.loc.TEXT_MASTER .. "(" .. self.tmpdata.MLName .. ")")
                        );
                        
                else
                
                        if not self.tmpdata.Threshold then
                                self:UpdateData();
                        end
                        cat:AddLine(
                                'text', self.loc.TOOLTIP_METHOD .. ":",
                                'text2', string.format("%s%s", self.data.LootColorTable[self.tmpdata.Threshold].Hex, self.loc.TEXT_MASTER)
                        );
                        
                end
                
        elseif self.tmpdata.LootType == "freeforall" then
        
                if not self.tmpdata.Threshold then
                        self:UpdateData();
                end
                cat:AddLine(
                        'text', self.loc.TOOLTIP_METHOD .. ":",
                        'text2', string.format("%s%s", self.data.LootColorTable[self.tmpdata.Threshold].Hex, self.loc.TEXT_FFA)
                );
                
        elseif self.tmpdata.LootType == "roundrobin" then
        
                if not self.tmpdata.Threshold then
                        self:UpdateData();
                end
                cat:AddLine(
                        'text', self.loc.TOOLTIP_METHOD .. ":",
                        'text2', string.format("%s%s", self.data.LootColorTable[self.tmpdata.Threshold].Hex, self.loc.TEXT_RR)
                );
                
        elseif self.tmpdata.LootType == "needbeforegreed" then
        
                if not self.tmpdata.Threshold then
                        self:UpdateData();
                end
                cat:AddLine(
                        'text', self.loc.TOOLTIP_METHOD .. ":",
                        'text2', string.format("%s%s", self.data.LootColorTable[self.tmpdata.Threshold].Hex, self.loc.TEXT_NBG)
                );
                
        else 
        
                if not self.tmpdata.Threshold then
                        self:UpdateData();
                end
                cat:AddLine(
                        'text', self.loc.TOOLTIP_METHOD .. ":",
                        'text2', string.format("%s%s", "|cff888888", self.loc.TEXT_SOLO)
                );
                
        end

        cat = tablet:AddCategory(
                'text', self.loc.TOOLTIP_CAT_ROLLS,
                'columns', 2
        );
        
        if(self.tmpdata.RollCount > 0) then
        
                local a, b, highRoll, rollLink, tallied, color, l, r;

                if self.data.ShowRollCount then
                
                        if GetNumRaidMembers() > 0 then
                        
                                cat:AddLine(
                                        'text', string.format(self.loc.FORMAT_TOOLTIP_ROLLCOUNT, self.tmpdata.RollCount, GetNumRaidMembers() )
                                );
                        
                        elseif GetNumPartyMembers() > 0 then
                        
                                cat:AddLine(
                                        'text', string.format(self.loc.FORMAT_TOOLTIP_ROLLCOUNT, self.tmpdata.RollCount, GetNumPartyMembers()+1 )
                                );
                        
                        end
                
                end

                tallied = {};
                for a=1,self.tmpdata.RollCount do
                        tallied[a] = 0;
                end
                
                for a=1,self.tmpdata.RollCount do
                
                        highRoll = 0;
                        rollLink = 0;
                        for b=1,self.tmpdata.RollCount do
                        
                                if((self.data.StandardRollsOnly) and ((self.tmpdata.Rolls[b].Min ~= 1) or (self.tmpdata.Rolls[b].Max ~= 100))) then
                                        
                                        tallied[b] = 1;
                                        
                                end
                                
                                if((self.tmpdata.Rolls[b].Roll > highRoll) and (tallied[b] == 0)) then
                                        
                                        highRoll = self.tmpdata.Rolls[b].Roll;
                                        rollLink = b;
                                        
                                end
                                
                        end
                        
                        if(rollLink ~= 0) then
                        
                                r = self.tmpdata.Rolls[rollLink].Player;
                                if(self.data.ShowClassLevel) then
                                
                                        local hexcolor = babble.GetClassHexColor(self.tmpdata.Rolls[rollLink].Class);
                                        r = string.format("|cff%s%s %d %s%s", hexcolor, r, self.tmpdata.Rolls[rollLink].Level, string.sub(self.tmpdata.Rolls[rollLink].Class,1,1), string.lower(string.sub(self.tmpdata.Rolls[rollLink].Class,2)));
                                        
                                end
                                
                                l = self.tmpdata.Rolls[rollLink].Roll;  
                                if((self.tmpdata.Rolls[rollLink].Min ~= 1) or (self.tmpdata.Rolls[rollLink].Max ~= 100)) then
                                
                                        l = l .. " (" .. self.tmpdata.Rolls[rollLink].Min .. "-" .. self.tmpdata.Rolls[rollLink].Max .. ")";
                                        
                                end
                                
                                cat:AddLine(
                                        'text', r,
                                        'text2', l
                                );
                                
                                tallied[rollLink] = 1;
                                
                        end
                end
                
        else
        
                cat:AddLine (
                        'text', self.loc.TEXT_NOROLLS,
                        'text2', ""
                );
                
        end
        
        if(self.data.RollOnClick) then
        
                tablet:SetHint(self.loc.TOOLTIP_HINT_ROLLS);
                
        else
        
                tablet:SetHint(self.loc.TOOLTIP_HINT_NOROLLS);
                
        end
end

function GroupFu:OnClick()

        if(IsControlKeyDown()) then
        
                if(self.tmpdata.RollCount > 0) then
                
                        local i, highRoll, highRoller;
        
                        highRoll = 0;
                        highRoller = "";
                        for i = 1, self.tmpdata.RollCount do
                        
                                if ((self.tmpdata.Rolls[i].Roll > highRoll) and ((not self.data.StandardRollsOnly) or ((self.tmpdata.Rolls[i].Min == 1) and (self.tmpdata.Rolls[i].Max == 100)))) then
                                        
                                        highRoll = self.tmpdata.Rolls[i].Roll;
                                        highRoller = self.tmpdata.Rolls[i].Player;
                                        
                                end
                        end
                        
                        -- Output the winner to the specified output channel
                        self:AnnounceOutput(format(self.loc.FORMAT_ANNOUNCE_WIN, highRoller, highRoll, self.tmpdata.RollCount));
                        
                        if((self.data.OutputDetail == "LONG") or (self.data.OutputDetail == "FULL")) then
                                local a, b, rollLink, tallied, message, count;
        
                                tallied = {};
                                count = 0;
                                message = "";
                                
                                for a=1,self.tmpdata.RollCount do
                                        tallied[a] = 0;
                                end
                                
                                for a=1,self.tmpdata.RollCount do
                                        highRoll = 0;
                                        rollLink = 0;
                                        
                                        for b=1,self.tmpdata.RollCount do
                                        
                                                if((self.data.StandardRollsOnly) and ((self.tmpdata.Rolls[b].min ~= 1) or (self.tmpdata.Rolls[b].max ~= 100))) then
                                                
                                                        tallied[b] = 1;
                                                        
                                                end
                                                
                                                if((self.tmpdata.Rolls[b].Roll > highRoll) and (tallied[b] == 0)) then
                                                
                                                        highRoll = self.tmpdata.Rolls[b].Roll;
                                                        rollLink = b;
                                                        
                                                end
                                        end
                                        
                                        if(rollLink ~= 0) then
                                        
                                                message = message .. "#" .. a .. " " .. self.tmpdata.Rolls[rollLink].Player .. " [" .. self.tmpdata.Rolls[rollLink].Roll .. "]";
                                                if((self.data.OutputDetail == "FULL") and ((self.tmpdata.Rolls[rollLink].Min ~= 1) or (self.tmpdata.Rolls[rollLink].Max ~= 100))) then
                                                
                                                        message = message .. " (" .. self.tmpdata.Rolls[rollLink].Min .. "-" .. self.tmpdata.Rolls[rollLink].Max .. ")";
                                                        
                                                end
                                                message = message .. ", ";
                                                count = count + 1;
                                                tallied[rollLink] = 1;
                                                
                                        end
                                        
                                        if((count == 10) or (a == self.tmpdata.RollCount)) then
                                        
                                                message = string.sub(message, 1, -3);
                                                self:AnnounceOutput(message);
                                                message = "";
                                                count = 0;
                                                
                                        end
                                end
                        end
                        
                        if(self.data.DeleteRolls) then
                        
                                self:ClearRolls();
                                
                        end
                end
                
        elseif(IsShiftKeyDown()) then
        
                self:ClearRolls();
                
        else
        
                if(self.data.RollOnClick) then
                
                        RandomRoll("1", "100");
                        
                end
        end
end

function GroupFu:CHAT_MSG_SYSTEM()
        local player, roll, min_roll, max_roll, mlname;
        
        -- Trap name of master looter if it has changed
        _, _, mlname = string.find(arg1, self.loc.SEARCH_MASTERLOOTER);
        if mlname then
        
                self.tmpdata.MLName = mlname;
                self:Update();
                
        end
        
        -- Trap rolls
        _, _, player, roll, min_roll, max_roll = string.find(arg1, self.loc.SEARCH_ROLLS);
        if(player) then
        
                if((self.data.StandardRollsOnly) and ((tonumber(min_roll) ~= 1) or (tonumber(max_roll) ~= 100))) then
                
                        return;
                        
                end
                
                if((self.tmpdata.RollCount > 0) and (self.data.IgnoreDuplicates)) then
                        local i;
        
                        for i=1,self.tmpdata.RollCount do
                        
                                if(self.tmpdata.Rolls[i].Player == player) then
                                        return;
                                end
                                
                        end
                end
                
                self.tmpdata.RollCount = self.tmpdata.RollCount + 1;
                self.tmpdata.Rolls[self.tmpdata.RollCount] = {};
                self.tmpdata.Rolls[self.tmpdata.RollCount].Roll = tonumber(roll);
                self.tmpdata.Rolls[self.tmpdata.RollCount].Player = player;
                self.tmpdata.Rolls[self.tmpdata.RollCount].Min = tonumber(min_roll);
                self.tmpdata.Rolls[self.tmpdata.RollCount].Max = tonumber(max_roll);
                
                if(player == UnitName("player")) then
                
                        _, self.tmpdata.Rolls[self.tmpdata.RollCount].Class = UnitClass("player");
                        self.tmpdata.Rolls[self.tmpdata.RollCount].Level = UnitLevel("player");
                        
                elseif(GetNumRaidMembers() > 0) then
                        local i, z;
        
                        z = GetNumRaidMembers();
                        for i=1,z do
                        
                                if(player == UnitName("raid"..i)) then
                                
                                        _, self.tmpdata.Rolls[self.tmpdata.RollCount].Class = UnitClass("raid"..i);
                                        self.tmpdata.Rolls[self.tmpdata.RollCount].Level = UnitLevel("raid"..i);
                                        break;
                                        
                                end
                        end
                        
                elseif(GetNumPartyMembers() > 0) then
                        local i, z;
        
                        z = GetNumPartyMembers();
                        for i=1,z do
                        
                                if(player == UnitName("party"..i)) then
                                
                                        _, self.tmpdata.Rolls[self.tmpdata.RollCount].Class = UnitClass("party"..i);
                                        self.tmpdata.Rolls[self.tmpdata.RollCount].Level = UnitLevel("party"..i);
                                        
                                end
                        end
                        
                else
                
                        self.tmpdata.Rolls[self.tmpdata.RollCount].Class = "";
                        self.tmpdata.Rolls[self.tmpdata.RollCount].Level = 0;
                        
                end
                
                if (self.data.ClearTimer > 0) and not self.data.AnnounceRollCountdown then
                        self.tmpdata.TimeSinceLastRoll = 0;
                end     
                
                self:Update();
                
        end
end

function GroupFu:ToggleOption(opt)

        self.data[opt] = not self.data[opt];
        self:Update();
        return self.data[opt];
        
end

function GroupFu:ToggleOutputChannel(channel)

        self.data.OutputChannel = channel;
        self:Update();
        return self.data.OutputChannel;
        
end

function GroupFu:IsOutputChannel(channel)

        if self.data.OutputChannel == channel then
                return true;
        else
                return false;
        end
        
end

function GroupFu:ToggleOutputDetail(detail)

        self.data.OutputDetail = detail;
        self:Update();
        return self.data.OutputDetail;
        
end

function GroupFu:IsOutputDetail(detail)

        if self.data.OutputDetail == detail then
                return true;
        else
                return false;
        end
        
end

function GroupFu:ToggleTextMode(mode)

        self.data.TextMode = mode;
        self:Update();
        return self.data.TextMode;
        
end

function GroupFu:IsTextMode(mode)

        if self.data.TextMode == mode then
                return true;
        else
                return false;
        end
        
end

function GroupFu:ToggleClearTimer(timeout)

        self.data.ClearTimer = timeout;
        self:Update();
        return self.data.ClearTimer;
        
end

function GroupFu:IsClearTimer(timeout)

        if self.data.ClearTimer == timeout then
                return true;
        else
                return false;
        end
        
end

function GroupFu:ClearRolls()

        self.tmpdata.Rolls = {};
        self.tmpdata.RollCount = 0;
        self.tmpdata.TimeSinceLastRoll = 0;
        self:Update();
        
end

function GroupFu:IsLootType(loottype)

        if GetLootMethod() == loottype then
                return true;
        else 
                return false;
        end
        
end

function GroupFu:SetLootType(loottype)

        if loottype == "master" then
                SetLootMethod(loottype,UnitName("player"),2);
        else
                SetLootMethod(loottype);
        end
        
        self:Update();
        dewdrop:Close(3);

end

function GroupFu:IsLootThreshold(threshold)

        if GetLootThreshold() == threshold then
                return true;
        else 
                return false;
        end
        
end

function GroupFu:SetLootThreshold(threshold)

        SetLootThreshold(threshold)     
        self:Update();
        dewdrop:Close(3);

end

function GroupFu:GetLootTypeText()

        if self.tmpdata.LootType == "group" then
        
                return self.loc.TEXT_GROUP;
                
        elseif self.tmpdata.LootType == "master" then
        
                if self.data.ShowMLName and self.tmpdata.MLName then
                        return self.loc.TEXT_MASTER .. "(" .. self.tmpdata.MLName .. ")";
                else
                        return self.loc.TEXT_MASTER;
                end
                
        elseif self.tmpdata.LootType == "freeforall" then
        
                return self.loc.TEXT_FFA;
                
        elseif self.tmpdata.LootType == "roundrobin" then
        
                return self.loc.TEXT_RR;
                
        elseif self.tmpdata.LootType == "needbeforegreed" then
        
                return self.loc.TEXT_NBG;
                
        else
        
                return self.loc.TEXT_SOLO;
                
        end
end

function GroupFu:CheckRollTimeout()

        if ((self.tmpdata.RollCount > 0) and (self.data.ClearTimer > 0)) then
        
                self.tmpdata.TimeSinceLastRoll = self.tmpdata.TimeSinceLastRoll + self.updateTime;

                if (self.data.AnnounceRollCountdown) then

                        if( self.tmpdata.TimeSinceLastRoll == (self.data.ClearTimer-10) ) then
                                
                                self:AnnounceOutput( self.loc.TEXT_ENDING10 );
                                
                        elseif( self.tmpdata.TimeSinceLastRoll == (self.data.ClearTimer-5) ) then
                                
                                self:AnnounceOutput( self.loc.TEXT_ENDING5 );
                                
                        elseif( self.tmpdata.TimeSinceLastRoll == (self.data.ClearTimer-4) ) then
                                
                                self:AnnounceOutput( self.loc.TEXT_ENDING4 );
                                
                        elseif( self.tmpdata.TimeSinceLastRoll == (self.data.ClearTimer-3) ) then
                                
                                self:AnnounceOutput( self.loc.TEXT_ENDING3 );
                                
                        elseif( self.tmpdata.TimeSinceLastRoll == (self.data.ClearTimer-2) ) then
                                
                                self:AnnounceOutput( self.loc.TEXT_ENDING2 );
                                
                        elseif( self.tmpdata.TimeSinceLastRoll == (self.data.ClearTimer-1) ) then
                                
                                self:AnnounceOutput( self.loc.TEXT_ENDING1 );
                                
                        elseif( self.tmpdata.TimeSinceLastRoll == self.data.ClearTimer ) then
                                
                                self:AnnounceOutput( self.loc.TEXT_ENDED );
                                
                                if(self.tmpdata.RollCount > 0) then
                                
                                        local i, highRoll, highRoller;
                        
                                        highRoll = 0;
                                        highRoller = "";
                                        for i = 1, self.tmpdata.RollCount do
                                        
                                                if ((self.tmpdata.Rolls[i].Roll > highRoll) and ((not self.data.StandardRollsOnly) or ((self.tmpdata.Rolls[i].Min == 1) and (self.tmpdata.Rolls[i].Max == 100)))) then
                                                        
                                                        highRoll = self.tmpdata.Rolls[i].Roll;
                                                        highRoller = self.tmpdata.Rolls[i].Player;
                                                        
                                                end
                                        end
                        
                                        self:AnnounceOutput(format(self.loc.FORMAT_ANNOUNCE_WIN, highRoller, highRoll, self.tmpdata.RollCount));
                                end
                                
                                self:ClearRolls();
                                
                        end
                        
                elseif( self.tmpdata.TimeSinceLastRoll == self.data.ClearTimer ) then 
                
                        self:ClearRolls();
                        
                end
        end
        
end

function GroupFu:AnnounceOutput( mymessage )

        if( self.data.OutputChannel == "LOCAL" ) then
        
                DEFAULT_CHAT_FRAME:AddMessage(mymessage);
                
        elseif ( self.data.OutputChannel == "AUTO" ) then
        
                if ( GetNumRaidMembers() > 0 ) then

                        SendChatMessage(mymessage, "RAID");
                
                elseif ( GetNumPartyMembers() > 0 ) then
                
                        SendChatMessage(mymessage, "PARTY");
                
                else
                        
                        DEFAULT_CHAT_FRAME:AddMessage(mymessage);
                        
                end
        
        else
        
                SendChatMessage(mymessage, self.data.OutputChannel);
                
        end

end

GroupFu:RegisterForLoad();

Generated by GNU Enscript 1.6.5.90.