vanilla-wow-addons – Rev 1
?pathlinks?
--[[
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