vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--
--  $Id: BlindFlashCount.lua 26 2005-04-17 14:46:10Z savage $
--  $Date: 2005-04-17 16:46:10 +0200 (Sun, 17 Apr 2005) $
--  $Rev: 26 $
--

-- Default display type of BlindFlashCount
BFC_Type = 1;

-- The number of powders for a "green" color indication
BFC_Max = 10;

-- Use colors?
BFC_UseColor = 1;

-- Show debug info
BFC_DebugLevel = 0;
-- -------------------------------------------
-- You shouldnt be editing anything below here
-- unless you know what you are doing.
-- -------------------------------------------
BFC_VERSION = "1.2";
BFC_ICON_VANISH = "Interface\\Icons\\Ability_Vanish";
BFC_ICON_BLIND = "Interface\\Icons\\Spell_Shadow_MindSteal";

-- Text Display Types, i removed HotKey because its ugly and doesnt work on all bars
BFC_DisplayTypes = {
        "Count", "Name",
};

BFC_BlindCount = 0;
BFC_FlashCount = 0;
BFCIcons = {};

-- Onload function, setups hook
function BlindFlashCount_OnLoad()
        -- Dont load this addon for non ROGUE classes
        local _,class = UnitClass("player");
        if (class ~= nil and class ~= "ROGUE") then
                return;
        end
        
        -- setup hook
        BlindFlashCount_SetupHook(1);
                
        -- register events
        BlindFlashCount_Register(1);
        
        SlashCmdList["BLINDFLASHCOUNT"] = BFC_SlashCmdHandler;
        SLASH_BLINDFLASHCOUNT1 = "/bfc";
        SLASH_BLINDFLASHCOUNT2 = "/bf";
                
        DEFAULT_CHAT_FRAME:AddMessage("BlindFlashCount "..BFC_VERSION.." AddOn loaded. Type "..
                        GREEN_FONT_COLOR_CODE.."/bfc"..FONT_COLOR_CODE_CLOSE.." for options");
end

function BlindFlashCount_Register(register)
        if (register == 1) then
                this:RegisterEvent("BAG_UPDATE");
                this:RegisterEvent("UNIT_INVENTORY_CHANGED");
        else    
                this:UnregisterEvent("BAG_UPDATE");
                this:UnregisterEvent("UNIT_INVENTORY_CHANGED");
        end
end

function BlindFlashCount_SetupHook(enable)

        if (enable == 1) then
                -- Save original GetActionText function and hook it with ours
                if ((GetActionText ~= BFC_GetActionText) and (BFC_OriginalGetActionText == nil)) then                   
                        BFC_OriginalGetActionText = GetActionText;
                        GetActionText = BFC_GetActionText;              
                end     
        else
                -- Unhook the function
                if (GetActionText == BFC_GetActionText) then
                        GetActionText = BFC_OriginalGetActionText;
                        BFC_OriginalGetActionText = nil;
                end     
        end
end

-- Something changed in our bags, update the counts
function BlindFlashCount_OnEvent()
        BFC_DebugPrint("BlindFlashCount_OnEvent() -> ".. event);
        
        if ( (event == "UNIT_INVENTORY_CHANGED") and (arg1 ~= "player") ) then
                -- inventory change did not occur on player
                return;
        end
        
        BFC_BlindCount, BFC_FlashCount = BFC_GetBlindFlashCount();
        BFC_UpdateIcons();
end


function BFC_SlashCmdHandler(msg)
        local GREEN = GREEN_FONT_COLOR_CODE;
        local CLOSE = FONT_COLOR_CODE_CLOSE;
        local NORMAL = NORMAL_FONT_COLOR_CODE;
        
        if ( (not msg) or (strlen(msg) <= 0 ) or (msg == "help") ) then
                DEFAULT_CHAT_FRAME:AddMessage(NORMAL.."BlindFlashCount "..BFC_VERSION.." usage:"..CLOSE);
                DEFAULT_CHAT_FRAME:AddMessage(GREEN.." /bfc help    "..CLOSE.." - This screen");
                DEFAULT_CHAT_FRAME:AddMessage(GREEN.." /bfc on | off"..CLOSE.." - Enable/Disable BlindFlashCount");
                DEFAULT_CHAT_FRAME:AddMessage(GREEN.." /bfc color   "..CLOSE.." - Toggle use of color indication");
                DEFAULT_CHAT_FRAME:AddMessage(GREEN.." /bfc type    "..CLOSE.." - Toggle count indication type (count/name)");
        elseif (msg == "on") then       
                BlindFlashCount_SetupHook(1);           
                BlindFlashCount_Register(1);
                
                BFC_UpdateIcons(1);
                BFC_UpdateIcons();
                                
                DEFAULT_CHAT_FRAME:AddMessage("BlindFlashCount is now "..GREEN.."Enabled"..CLOSE);
                
        elseif (msg == "off") then
                BlindFlashCount_SetupHook(0);
                BlindFlashCount_Register(0);
                                
                BFC_UpdateIcons(1);
                
                DEFAULT_CHAT_FRAME:AddMessage("BlindFlashCount is now "..GREEN.."Disabled"..CLOSE);
                
        elseif (msg == "color") then
                if (BFC_UseColor == 1) then
                        BFC_UseColor = 0;                       
                        DEFAULT_CHAT_FRAME:AddMessage("BlindFlashCount's Color Indicator is now turned "..GREEN.."Off"..CLOSE);
                else
                        BFC_UseColor = 1;                       
                        DEFAULT_CHAT_FRAME:AddMessage("BlindFlashCount's Color Indicator is now turned "..GREEN.."On"..CLOSE);
                end
                
                BFC_UpdateIcons();
        elseif (msg == "type") then
                
                if (BFC_Type >= getn(BFC_DisplayTypes)) then
                        BFC_Type = 1;
                else
                        BFC_Type = BFC_Type + 1;
                end
        
                DEFAULT_CHAT_FRAME:AddMessage("BlindFlashCount's DisplayType is set to "..
                                              GREEN..BFC_DisplayTypes[BFC_Type]..CLOSE);
                BFC_UpdateIcons(1);
                BFC_UpdateIcons();
        elseif (msg == "debug") then
                if (BFC_DebugLevel == nil or BFC_DebugLevel == 0) then
                        BFC_DebugLevel = 1;
                        DEFAULT_CHAT_FRAME:AddMessage("BlindFlashCount Debug Information "..
                                                      GREEN.."ON"..CLOSE);
                else
                        BFC_DebugLevel = 0;
                        DEFAULT_CHAT_FRAME:AddMessage("BlindFlashCount Debug Information "..
                                                      GREEN.."OFF"..CLOSE);
                end
        else
                DEFAULT_CHAT_FRAME:AddMessage("Unknown BlindFlashCount command: "..GREEN..msg..CLOSE..
                                              ", try "..GREEN.."/bfc help"..CLOSE);
        end
end

-- Hook function for GetActionText
function BFC_GetActionText(slot)
        
        --local slotCount = getglobal(this:GetName().."Count");
        --local slotName = getglobal(this:GetName().."Name");
        --local slotHotKey = getglobal(this:GetName().."HotKey");
                
        if (this == nil) then
                -- the "this" reference is nil, that means we cant get the button's name, so bail out.
                return BFC_OriginalGetActionText(slot);
        end
                
        local texture = GetActionTexture(slot);         
        local slotText = getglobal(this:GetName()..BFC_DisplayTypes[BFC_Type]);
        local buttonName = this:GetName();
        
        if (slotText == nil) then
                -- sometimes the button doesnt have a full name yet, so we are trying to guess it
                slotText = getglobal(this:GetName().."Button"..slot..BFC_DisplayTypes[BFC_Type]);
                buttonName = this:GetName().."Button"..slot;
                if (slotText == nil) then
                        -- failed, lets just bail out before something goes wrong
                        return BFC_OriginalGetActionText(slot);
                end
        end
                
        if (texture == BFC_ICON_VANISH or texture == BFC_ICON_BLIND) then
                -- Add this button/slot to icon table so it can be updated later
                BFC_AddButtonSlotToIconTable(slot, buttonName);
                
                local count = BFC_FlashCount;
                if (texture == BFC_ICON_BLIND) then
                        count = BFC_BlindCount;
                end
                
                BFC_SetColor(slotText, count);
                                
                if (BFC_DisplayTypes[BFC_Type] == "Name") then
                        -- GetActionText is called from a "Name" button.
                        -- return the count, so it gets updated with SetText.
                        return count;
                else
                        slotText:SetText(count);
                end
        end

        return BFC_OriginalGetActionText(slot);
end

-- Sets the color of the powder count
function BFC_SetColor(button, count)
        local r, g, b;
        
        if ((count == "") or (BFC_UseColor == 0)) then
                button:SetTextColor(1.0, 1.0, 1.0);
                return;
        end
        
        if ( (count < 0) or (count > BFC_Max) ) then
                count = BFC_Max
        end     
        count = count / BFC_Max;
        
        if(count > 0.5) then
                r = (1.0 - count) * 2;
                g = 1.0;
        else
                r = 1.0;
                g = count * 2;
        end

        b = 0.0;
        button:SetTextColor(r, g, b);
end;

-- Returns the itemname for bag, slot (code from CapnBry)
function BFC_GetItemName(bag, slot)
        local linktext = nil;
  
        if (bag == -1) then
                linktext = GetInventoryItemLink("player", slot);
        else
                linktext = GetContainerItemLink(bag, slot);
        end

        if linktext then
                local _,_,name = string.find(linktext, "^.*%[(.*)%].*$");
                return name;
        else
                return "";
        end;
end;

-- Returns blind, flash count
function BFC_GetBlindFlashCount()
        local blind = 0;
        local flash = 0;

        for bag = 0, 4, 1 do
                for slot = 1, GetContainerNumSlots(bag), 1 do
                        local name = BFC_GetItemName(bag, slot);
                        -- check if item is a blinding powder
                        if (name == BFC_ITEM_BLIND) then
                                local _, itemCount = GetContainerItemInfo(bag, slot);
                                blind = blind + itemCount;
                        -- check if item is a flash powder
                        elseif (name == BFC_ITEM_FLASH) then
                                local _, itemCount = GetContainerItemInfo(bag, slot);
                                flash = flash + itemCount;
                        end
                end
        end

        return blind, flash;
end


-- Updates the buttons in the icon table with the new blind/flash count
-- mode 1 = refresh all text labels, used when changing display type
-- mode 2 = clear all text, used for turning off BlindFlashCount
function BFC_UpdateIcons(clear)
        local newIcons = BFCIcons;
                
        for k, v in BFCIcons do         
                --local slot = getglobal(button):GetID();
                local slot = v[1];
                local slotText = getglobal(v[2]..BFC_DisplayTypes[BFC_Type]);
                
                local texture = GetActionTexture(slot);
                local count = "";
                if (texture == BFC_ICON_VANISH) then
                        BFC_DebugPrint("!!updating button: ".. v[2] .. " id: "..slot);
                        count = BFC_FlashCount;
                elseif (texture == BFC_ICON_BLIND) then
                        BFC_DebugPrint("!!updating button: ".. v[2] .. " id: "..slot);
                        count = BFC_BlindCount;
                else
                        -- icon became something else, remove from table
                        BFC_DebugPrint("--removing stale icon ".. v[2] .. " id: "..slot);
                        tremove(newIcons, key);
                end
                
                if (clear == 1) then
                        for k, displaytype in BFC_DisplayTypes do
                                local oldText = getglobal(v[2]..displaytype);
                                BFC_DebugPrint("****Name: " .. oldText:GetName());
                                oldText:SetText("");
                                oldText:SetTextColor(1.0, 1.0, 1.0);
                        end
                else            
                        slotText:SetText(count);
                        BFC_SetColor(slotText, count);
                end
        end
        
        BFCIcons = newIcons;
end

-- Adds a button + slot to the icon table, so it can be updated later
function BFC_AddButtonSlotToIconTable(slot, button)
        if (slot == nil or button == nil) then
                return;
        end
        
        BFC_DebugPrint("++Adding button: " .. button .. " id: " .. slot);

        for k, v in BFCIcons do
                if (v[1] == slot and v[2] == button) then
                        BFCIcons[k] = {slot, button};
                        BFC_DebugPrint("**Duplicate Button: " .. button .. " id: " .. slot);
                        return;
                end
        end     
        
        if (not BFCIcons) then
                BFCIcons = {};
        end
        
        tinsert(BFCIcons, {slot, button});
end

-- some debug functions
--
function BFC_DebugPrint(msg, level)
        if (not BFC_DebugLevel) then
                BFC_DebugLevel = 0;
        end
        
        if (not level) then
                level = 1;
        end
        
        if (BFC_DebugLevel >= level) then
                DEFAULT_CHAT_FRAME:AddMessage("|cff00caca[BFC]|r " .. msg);
        end
end

function BFC_SetBlindCount(count)
        BFC_BlindCount = count;
        BFC_UpdateIcons();
end

function BFC_SetFlashCount(count)
        BFC_FlashCount = count;
        BFC_UpdateIcons();
end

function BFC_SetMax(max)
        BFC_Max = max;
        BFC_UpdateIcons();
end

function BFC_SetDebug(level)
        BFC_DebugLevel = level;
end

Generated by GNU Enscript 1.6.5.90.