vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[

        QuickLoot: easier, faster looting
                copyright 2004 by Telo

        - Automatically positions the most relevant part of the loot window under your cursor
        
]]

--------------------------------------------------------------------------------------------------
-- Configuration variables
--------------------------------------------------------------------------------------------------

QuickLoot_AutoHide = 1; -- set to 1 if you want the window to auto-hide when there's no loot
QuickLoot_OnScreen = 1; -- set to 1 if you want the window to remain completly on screen
QuickLoot_MoveOnce = 1; -- set to 1 if you want the window to only move once

--------------------------------------------------------------------------------------------------
-- Local variables
--------------------------------------------------------------------------------------------------

-- Function hooks
local originalLootFrame_OnEvent;
local originalLootFrame_Update;

--------------------------------------------------------------------------------------------------
-- Internal functions
--------------------------------------------------------------------------------------------------

-- Basically, what this function does is ensure that the LootFrame window is not placed outside the screen
local function LootFrame_SetLootFramePoint(x, y)
        if (QuickLoot_OnScreen) then
                local screenWidth = GetScreenWidth();
                if (UIParent:GetWidth() > screenWidth) then
                        screenWidth = UIParent:GetWidth();
                end
                local screenHeight = GetScreenHeight();
                
                -- LootFrame is set to 256 wide in the xml file, but is actually only 191 wide
                -- This is based on calculation envolving the offset on the close button:
                -- The height is always 256, which is the correct number.
                local windowWidth = 191;
                local windowHeight = 256;
                
                if ( (x + windowWidth) > screenWidth ) then
                        x = screenWidth - windowWidth;
                end
                if ( y > screenHeight ) then
                        y = screenHeight;
                end
                if ( x < 0 ) then
                        x = 0;
                end
                if ( (y - windowHeight) < 0 ) then
                        y = windowHeight;
                end
                --Print("wWith: "..windowWidth..", wHeight: "..windowHeight..", X: "..x..", Y: "..y..", sWidth: "..screenWidth..", sHeight: "..screenHeight);
        end
        
        LootFrame:ClearAllPoints();
        LootFrame:SetPoint("TOPLEFT", "UIParent", "BOTTOMLEFT", x, y);
end

function LootFrame_ItemUnderCursor()
        local index;
        local x, y = GetCursorPosition();
        local scale = LootFrame:GetEffectiveScale();

        x = x / scale;
        y = y / scale;

        LootFrame:ClearAllPoints();

        for index = 1, LOOTFRAME_NUMBUTTONS, 1 do
                local button = getglobal("LootButton"..index);
                if( button:IsVisible() ) then
                        x = x - 42;
                        y = y + 56 + (40 * index);
                        LootFrame:SetPoint("TOPLEFT", "UIParent", "BOTTOMLEFT", x, y);
                        return;
                end
        end

        if( LootFrameDownButton:IsVisible() ) then
                -- If down arrow, position on it
                x = x - 158;
                y = y + 223;
        else
                if( QuickLoot_AutoHide and GetNumLootItems() == 0 ) then
                        HideUIPanel(LootFrame);
                        return
                end
                -- Otherwise, position on close box
                x = x - 173;
                y = y + 25;
        end
        
        LootFrame:SetPoint("TOPLEFT", "UIParent", "BOTTOMLEFT", x, y);
end

local function QuickLoot_LootFrame_OnEvent(event)
        originalLootFrame_OnEvent(event);
        if ( event == "VARIABLES_LOADED" ) then
                if ( UltimateUI_RegisterConfiguration ) then
                        QuickLoot_RegisterUltimateUI()
                end
        end
        if ( event == "LOOT_SLOT_CLEARED" ) then
                if ( QuickLoot_MoveOnce ~= 1 ) then
                        LootFrame_ItemUnderCursor();
                end
        end
        if ( event == "LOOT_OPENED" ) then
                local lootItems = GetNumLootItems();
                if ( lootItems == 0 ) then
                        if( QuickLoot_AutoHide ) then
                                CloseLoot();
                                local info = ChatTypeInfo["LOOT"];
                        ChatFrame1:AddMessage(ERR_LOOT_NONE, info.r, info.g, info.b, info.id);
                        end
                elseif ( QuickLoot_MoveOnce == 1 ) then
                        LootFrame_ItemUnderCursor();
                end
        end
end

local function QuickLoot_LootFrame_Update()
        originalLootFrame_Update();
        if ( QuickLoot_MoveOnce ~= 1 ) then
                LootFrame_ItemUnderCursor();
        end
end

function QuickLoot_RegisterUltimateUI()
                        UltimateUI_RegisterConfiguration(
                                "UUI_QUICKLOOT",
                                "SECTION",
                                ULTIMATEUI_CONFIG_QLOOT_HEADER,
                                ULTIMATEUI_CONFIG_QLOOT_HEADER_INFO
                        );
                        UltimateUI_RegisterConfiguration(
                                "UUI_QUICKLOOT_HEADER",
                                "SEPARATOR",
                                ULTIMATEUI_CONFIG_QLOOT_HEADER,
                                ULTIMATEUI_CONFIG_QLOOT_HEADER_INFO
                        );
                        UltimateUI_RegisterConfiguration(
                                "UUI_QUICKLOOT_ONOFF",
                                "CHECKBOX", 
                                TEXT(ULTIMATEUI_CONFIG_QLOOT),
                                TEXT(ULTIMATEUI_CONFIG_QLOOT_INFO),
                                QuickLoot_Enable,
                                1
                        );
                        UltimateUI_RegisterConfiguration(
                                "UUI_QUICKLOOT_HIDE",
                                "CHECKBOX", 
                                TEXT(ULTIMATEUI_CONFIG_QLOOT_HIDE),
                                TEXT(ULTIMATEUI_CONFIG_QLOOT_HIDE_INFO),
                                QuickLoot_Hide_Enable,
                                1
                        );
                        UltimateUI_RegisterConfiguration(
                                "UUI_QUICKLOOT_ONSCREEN",
                                "CHECKBOX", 
                                TEXT(ULTIMATEUI_CONFIG_QLOOT_ONSCREEN),
                                TEXT(ULTIMATEUI_CONFIG_QLOOT_ONSCREEN_INFO),
                                QuickLoot_OnScreen_Enable,
                                1
                        );
                        UltimateUI_RegisterConfiguration(
                                "UUI_QUICKLOOT_MOVE_ONCE",
                                "CHECKBOX", 
                                TEXT(ULTIMATEUI_CONFIG_QLOOT_MOVE_ONCE),
                                TEXT(ULTIMATEUI_CONFIG_QLOOT_MOVE_ONCE_INFO),
                                QuickLoot_MoveOnce_Enable,
                                1
                        );
end

--------------------------------------------------------------------------------------------------
-- OnFoo functions
--------------------------------------------------------------------------------------------------
function QuickLoot_OnLoad()
        this:RegisterEvent("VARIABLES_LOADED");
        this:RegisterEvent("LOOT_SLOT_CLEARED");
        this:RegisterEvent("LOOT_OPENED");

        -- Hook the LootFrame_OnEvent function
        originalLootFrame_OnEvent = LootFrame_OnEvent;
        LootFrame_OnEvent = QuickLoot_LootFrame_OnEvent;
        
        -- Hook the LootFrame_Update function
        originalLootFrame_Update = LootFrame_Update;
        LootFrame_Update = QuickLoot_LootFrame_Update;
        
        -- Don't treat the LootFrame as a UI panel
        UIPanelWindows["LootFrame"] = nil;

        if ( not QuickLoot_RegisterUltimateUI() ) then
                SlashCmdList["QUICKLOOTSLASH"] = QuickLoot_ChatCommandHandler;
                SLASH_QUICKLOOTSLASH1 = "/quickloot";
        end
end

function QuickLoot_Enable(toggle) 
        if ( toggle == 1 ) then 
                QuickLoot_Enabled = 1;
        else 
                QuickLoot_Enabled = 0;
        end
end

function QuickLoot_Hide_Enable(toggle) 
        if ( toggle == 1 ) then 
                QuickLoot_AutoHide = 1;
        else 
                QuickLoot_AutoHide = nil;
        end
end

function QuickLoot_OnScreen_Enable(toggle) 
        if ( toggle == 1 ) then 
                QuickLoot_OnScreen = 1;
        else 
                QuickLoot_OnScreen = nil;
        end
end

function QuickLoot_MoveOnce_Enable(toggle)
        if ( toggle == 1 ) then 
                QuickLoot_MoveOnce = 1;
        else 
                QuickLoot_MoveOnce = nil;
        end
end

function QuickLoot_ChatCommandHandler(msg)
        if ( ( not msg ) or ( strlen(msg) <= 0) ) then
                QuickLoot_Print(QUICKLOOT_CHAT_COMMAND_USAGE);
                return
        end
        local command = string.lower(msg);
        local varName = nil;
        local varText = nil;
        if ( command == "enable" ) then
                varName = "QuickLoot_Enabled";
                varText = QUICKLOOT_CHAT_COMMAND_ENABLE;
        elseif ( command == "autohide" ) then
                varName = "QuickLoot_AutoHide";
                varText = QUICKLOOT_CHAT_COMMAND_HIDE;
        elseif ( command == "onscreen" ) then
                varName = "QuickLoot_OnScreen";
                varText = QUICKLOOT_CHAT_COMMAND_ONSCREEN;
        elseif ( strfind(command, "once") ) then
                varName = "QuickLoot_MoveOnce";
                varText = QUICKLOOT_CHAT_COMMAND_MOVE_ONCE;
        end
        if ( varName ) then
                local oldValue = getglobal(varName);
                local newValue = nil;
                if ( ( not curValue ) or ( curValue == 0 ) ) then
                        newValue = 1;
                else
                        newValue = 0;
                end
                if ( newValue == 1 ) then
                        setglobal(varName, 1);
                        if ( varText ) then
                                QuickLoot_Print(varText..QUICKLOOT_CHAT_STATE_ENABLED);
                        end
                else
                        setglobal(varName, nil);
                        if ( varText ) then
                                QuickLoot_Print(varText..QUICKLOOT_CHAT_STATE_DISABLED);
                        end
                end
        else
                QuickLoot_Print(QUICKLOOT_CHAT_COMMAND_USAGE);
                return
        end
end

function QuickLoot_Print(msg) 
        if ( ( msg ) and ( strlen(msg) > 0 ) ) then
                if( Print ) then
                        Print(msg);
                        return;
                end
                if ( DEFAULT_CHAT_FRAME ) then
                        DEFAULT_CHAT_FRAME:AddMessage(msg, 1, 1, 0);
                end
        end
end