vanilla-wow-addons – Rev 1
?pathlinks?
--
-- AutoBar
-- Copyright 2004, 2005, 2006 original author.
-- Copyright is expressly not transferred to Blizzard.
--
-- Configurable set of 12 buttons that seeks out configured items
-- in your pack for use. Intended primarily for consumables. Not
-- for use with spells, skills, trinkets, or powers.
--
-- Author: Marc aka Saien on Hyjal
-- WOWSaien@gmail.com
-- http://64.168.251.69/wow
--
-- 2006.03.31
-- Minor category changes
-- 2006.02.10
-- Enriched Manna Biscuit/Alterac Manna Biscuit (which is usable everywhere)
-- moved to their own category("Food & Water Combo") - Update your buttons
-- Custom items can now appear on multiple buttons, as intended.
-- 2006.01.28
-- Oils fixed.
-- Custom items got broken by selfcast config. Fixed.
-- 2006.01.20
-- Will no longer fallback to zone-restricted items when all items in a button are ineligible.
-- Fixed bug where hitting keybinding for a button that has no items found will popup an error
-- Buttons will skip items too high in level for character
-- 2006.01.12
-- Selfcast is back
-- AutoBar re-parented so it hides with an Alt-Z
-- Configuration checkbox to hide Keybind text
-- Configuration checkbox to hide Count text
-- Configuration checkbox to show empty buttons
-- Keybind text and count text scales with button width.
-- Can now open configuration while dead.
-- "Num Pad" key bindings are now shortened to just N in display.
-- Removed /ab as a shortcut for the depreciated slash commands.
-- Fixed Mana potion hp restriction - should be mana restriction
-- Minimum button width/height set to 9 pixels instead of 18.
-- 2006.01.06
-- Release of complete re-write.
--
AUTOBAR_VERSION = "2006.02.10" -- Notice the cleverly disguised date.
------------------------------------
BINDING_HEADER_AUTOBAR_SEP = "Auto Bar";
BINDING_NAME_AUTOBAR_CONFIG = "Configuration Window";
BINDING_NAME_AUTOBAR_BUTTON1 = "Button 1";
BINDING_NAME_AUTOBAR_BUTTON2 = "Button 2";
BINDING_NAME_AUTOBAR_BUTTON3 = "Button 3";
BINDING_NAME_AUTOBAR_BUTTON4 = "Button 4";
BINDING_NAME_AUTOBAR_BUTTON5 = "Button 5";
BINDING_NAME_AUTOBAR_BUTTON6 = "Button 6";
BINDING_NAME_AUTOBAR_BUTTON7 = "Button 7";
BINDING_NAME_AUTOBAR_BUTTON8 = "Button 8";
BINDING_NAME_AUTOBAR_BUTTON9 = "Button 9";
BINDING_NAME_AUTOBAR_BUTTON10 = "Button 10";
BINDING_NAME_AUTOBAR_BUTTON11 = "Button 11";
BINDING_NAME_AUTOBAR_BUTTON12 = "Button 12";
------------------------------------
AUTOBAR_MAXBUTTONS = 12;
-----------------------------------
AutoBar_Debug = nil;
AutoBar_Player = nil; -- global
--
local AutoBar_ConfigLoaded = nil;
AutoBar_SearchedForItems = {};
local AutoBar_ButtonItemList = {};
local AutoBar_ButtonItemList_Reversed = {};
local AutoBar_Buttons_CurrentItems = {};
--
local AutoBar_InWorld = nil;
local AutoBar_InCombat = nil; -- For item use restrictions
------------------------------------
local function AutoBar_LinkDecode(link)
if (link) then
local _, _, id, name = string.find(link,"|Hitem:(%d+):%d+:%d+:%d+|h%[([^]]+)%]|h|r$");
if (id and name) then
return name, tonumber(id);
end
end
end
local function AutoBar_ConfigInit()
if (not AutoBar_Config) then AutoBar_Config = {}; end
if (not AutoBar_Config[AutoBar_Player]) then AutoBar_Config[AutoBar_Player] = {}; end
---
if (AutoBar_Config[AutoBar_Player].docked and AutoBar_Config[AutoBar_Player].scaling and
AutoBar_Config[AutoBar_Player].rows and AutoBar_Config[AutoBar_Player].columns) then
-- Config is from pre re-write. Not upgrading.
AutoBar_Config[AutoBar_Player] = {};
AutoBar_Msg("Config for this character is old version. Clearing. No attempt to upgrade config is being done.");
end
---
if (not AutoBar_Config[AutoBar_Player].buttons) then
local _,class = UnitClass("player");
AutoBar_Config[AutoBar_Player].buttons = {};
AutoBar_Config[AutoBar_Player].buttons[1] = { "BANDAGES", "ALTERAC_BANDAGES", "WARSONG_BANDAGES", "ARATHI_BANDAGES", "UNGORO_RESTORE"};
AutoBar_Config[AutoBar_Player].buttons[2] = { "HEALPOTIONS", "REJUVENATION_POTIONS", "WHIPPER_ROOT", "NIGHT_DRAGONS_BREATH", "PVP_HEALPOTIONS", "ALTERAC_HEAL", "HEALTHSTONE" };
if (class == "WARRIOR") then
AutoBar_Config[AutoBar_Player].buttons[3] = "RAGEPOTIONS";
elseif (class == "ROGUE") then
AutoBar_Config[AutoBar_Player].buttons[3] = "ENERGYPOTIONS";
elseif (class == "MAGE") then
AutoBar_Config[AutoBar_Player].buttons[3] = { "MANAPOTIONS", "REJUVENATION_POTIONS", "NIGHT_DRAGONS_BREATH", "PVP_MANAPOTIONS", "ALTERAC_MANA", "MANASTONE" };
else
AutoBar_Config[AutoBar_Player].buttons[3] = { "MANAPOTIONS", "REJUVENATION_POTIONS", "NIGHT_DRAGONS_BREATH", "PVP_MANAPOTIONS", "ALTERAC_MANA" };
end
if (class ~= "ROGUE" and class ~= "WARRIOR") then
AutoBar_Config[AutoBar_Player].buttons[4] = { "WATER", "WATER_CONJURED" };
end
AutoBar_Config[AutoBar_Player].buttons[5] = { "FOOD", "FOOD_STAMINA", "FOOD_CONJURED" };
AutoBar_Config[AutoBar_Player].buttons[AUTOBAR_MAXBUTTONS] = "HEARTHSTONE";
end
if (not AutoBar_Config[AutoBar_Player].display) then
AutoBar_Config[AutoBar_Player].display = {};
end
AutoBar_ConfigUpdated();
end
local function AutoBar_BuildItemList()
local function AddItemInfo(identifier, buttonnum)
if (AutoBar_Category_Info[identifier] and AutoBar_Category_Info[identifier].items) then
local idx,j;
for idx, j in AutoBar_Category_Info[identifier].items do
if (AutoBar_SearchedForItems[j]) then
table.insert(AutoBar_SearchedForItems[j], buttonnum);
else
AutoBar_SearchedForItems[j] = { buttonnum, identifier, idx };
end
table.insert(AutoBar_ButtonItemList[buttonnum], j);
end
else
if (AutoBar_SearchedForItems[identifier]) then
table.insert(AutoBar_SearchedForItems[identifier], buttonnum);
else
AutoBar_SearchedForItems[identifier] = { buttonnum, identifier, 0 };
end
table.insert(AutoBar_ButtonItemList[buttonnum], identifier);
end
end
AutoBar_SearchedForItems = {};
AutoBar_ButtonItemList_Reversed = {};
local idx;
for idx = 1, AUTOBAR_MAXBUTTONS, 1 do
if (AutoBar_Config[AutoBar_Player].buttons[idx]) then
local i, j;
AutoBar_ButtonItemList[idx] = {};
AutoBar_ButtonItemList_Reversed[idx] = {};
if (type(AutoBar_Config[AutoBar_Player].buttons[idx]) == "table") then
for i, j in AutoBar_Config[AutoBar_Player].buttons[idx] do
AddItemInfo (j, idx);
end
else
AddItemInfo (AutoBar_Config[AutoBar_Player].buttons[idx], idx);
end
for i, j in AutoBar_ButtonItemList[idx] do
AutoBar_ButtonItemList_Reversed[idx][j] = i;
end
end
end
end
function AutoBar_Button_GetDisplayItem(buttonnum)
local idx, bag, slot, rank, itemid, category, categoryidx, acceptable, cooldowntime, level;
local cooldownidx, start, duration, enable, fallback;
if (AutoBar_Buttons_CurrentItems[buttonnum]) then
idx = table.getn(AutoBar_Buttons_CurrentItems[buttonnum]);
else
idx = 0;
end
while (idx > 0 and not acceptable) do
bag = AutoBar_Buttons_CurrentItems[buttonnum][idx].items[1][1];
slot = AutoBar_Buttons_CurrentItems[buttonnum][idx].items[1][2];
rank = AutoBar_Buttons_CurrentItems[buttonnum][idx].rank;
itemid = AutoBar_ButtonItemList[buttonnum][rank];
if (type(itemid) == "number") then
_,_,_,level = GetItemInfo(itemid);
else
level = 0;
end
if (AutoBar_SearchedForItems[itemid]) then
category = AutoBar_SearchedForItems[itemid][2];
categoryidx = AutoBar_SearchedForItems[itemid][3];
else
category = nil;
categoryidx = nil;
end
--
start, duration, enable = GetContainerItemCooldown(bag, slot);
if (start > 0 and duration > 0) then
local tmp = start - GetTime() + duration;
if (not cooldowntime or tmp < cooldowntime) then
cooldowntime = tmp;
cooldownidx = idx;
end
idx = idx - 1;
elseif (level > UnitLevel("player")) then
idx = idx - 1;
elseif (AutoBar_Category_Info[category] and AutoBar_Category_Info[category].location and AutoBar_Category_Info[category].location ~= GetZoneText()) then
idx = idx - 1;
elseif (AutoBar_Category_Info[category]) then
if (not fallback) then
fallback = idx;
end
if (AutoBar_Category_Info[category].combatonly and not AutoBar_InCombat) then
idx = idx - 1;
elseif (AutoBar_Category_Info[category].noncombat and AutoBar_InCombat) then
idx = idx - 1;
elseif (AutoBar_Category_Info[category].limit) then
local losthp = UnitHealthMax("player") - UnitHealth("player");
local lostmana = UnitManaMax("player") - UnitMana("player");
if (UnitPowerType("player") ~= 0 ) then
--if (UnitClass("player") == "Druid") then
-- Can't check mana in druid forms
-- lostmana = 0;
--else
-- Class doesn't have mana, don't limit
lostmana = 10000;
--end
end
if (AutoBar_Category_Info[category].limit.downhp and AutoBar_Category_Info[category].limit.downhp[categoryidx] > losthp) then
idx = idx - 1
elseif (AutoBar_Category_Info[category].limit.downmana and AutoBar_Category_Info[category].limit.downmana[categoryidx] > lostmana) then
idx = idx - 1
else
acceptable = true;
end
else
acceptable = true;
end
else
acceptable = true;
end
end
if (not acceptable) then
if (fallback) then
idx = fallback;
elseif (cooldownidx) then
idx = cooldownidx;
elseif (AutoBar_Buttons_CurrentItems[buttonnum]) then
idx = table.getn(AutoBar_Buttons_CurrentItems[buttonnum]);
else
idx = nil;
end
end
--
if (idx) then
bag = AutoBar_Buttons_CurrentItems[buttonnum][idx].items[1][1];
slot = AutoBar_Buttons_CurrentItems[buttonnum][idx].items[1][2];
rank = AutoBar_Buttons_CurrentItems[buttonnum][idx].rank;
else
bag = nil; slot = nil; rank = nil;
end
if (AutoBar_ButtonItemList[buttonnum]) then
itemid = AutoBar_ButtonItemList[buttonnum][rank];
if (AutoBar_SearchedForItems[itemid]) then
category = AutoBar_SearchedForItems[itemid][2];
categoryidx = AutoBar_SearchedForItems[itemid][3];
else
category = nil;
categoryidx = nil;
end
else
itemid = nil; category = nil; categoryidx = nil;
end
return bag, slot, rank, itemid, category, categoryidx, idx, acceptable, cooldowntime;
end
function AutoBar_Button_UpdateButtons()
local buttonnum, i, button, icon, normaltexture, counttxt, bag, slot, idx, items;
local hotkey, count, tmpcount, keyText, actioncommand;
for buttonnum = 1, AUTOBAR_MAXBUTTONS, 1 do
button = getglobal("AutoBar_Button"..buttonnum);
icon = getglobal("AutoBar_Button"..buttonnum.."Icon");
normaltexture = getglobal("AutoBar_Button"..buttonnum.."NormalTexture");
counttxt = getglobal("AutoBar_Button"..buttonnum.."Count");
hotkey = getglobal("AutoBar_Button"..buttonnum.."HotKey");
if (not button.forcehidden and button.effectiveButton) then
button:Show();
bag, slot,_,_,_,_,idx,enabled = AutoBar_Button_GetDisplayItem(button.effectiveButton)
if (bag and slot) then
items = AutoBar_Buttons_CurrentItems[button.effectiveButton][idx].items
count = 0;
for i, bagslot in items do
_, tmpcount = GetContainerItemInfo(bagslot[1], bagslot[2]);
if (tmpcount) then
count = count + tmpcount;
end
end
icon:SetTexture(GetContainerItemInfo(bag,slot));
if (count > 1) then
counttxt:SetText(count);
else
counttxt:SetText("");
end
if (enabled) then
icon:SetVertexColor(1,1,1);
normaltexture:SetVertexColor(1,1,1);
else
icon:SetVertexColor(0.4,0.4,0.4);
normaltexture:SetVertexColor(1,1,1);
end
actioncommand = "AUTOBAR_BUTTON"..button.effectiveButton;
if (actioncommand) then
keyText = GetBindingKey(actioncommand);
if (keyText) then
keyText = string.gsub(keyText, "CTRL", "C");
keyText = string.gsub(keyText, "ALT", "A");
keyText = string.gsub(keyText, "SHIFT", "S");
keyText = string.gsub(keyText, "NUMPAD", "N");
hotkey:SetText(keyText);
else
hotkey:SetText("");
end
end
else
icon:SetTexture("");
counttxt:SetText("");
hotkey:SetText("");
end
else
button:Hide();
end
end
end
local function AutoBar_AssignButtons()
local displayButton = 0;
local buttonidx, buttoninfo, rankidx, items;
for buttonidx = 1, AUTOBAR_MAXBUTTONS, 1 do
if (AutoBar_Config[AutoBar_Player].display.showemptybuttons or AutoBar_Buttons_CurrentItems[buttonidx]) then
displayButton = displayButton + 1;
local button = getglobal("AutoBar_Button"..displayButton);
button.effectiveButton = buttonidx;
end
end
for buttonidx = displayButton+1, AUTOBAR_MAXBUTTONS, 1 do
local button = getglobal("AutoBar_Button"..buttonidx);
button.effectiveButton = nil;
end
AutoBar_Button_UpdateButtons();
end
local function AutoBar_UpdateCategoryNameToID(name,id)
local buttonnum, idx;
for buttonnum = 1, AUTOBAR_MAXBUTTONS, 1 do
if (AutoBar_Config[AutoBar_Player].buttons[buttonnum]) then
if (type(AutoBar_Config[AutoBar_Player].buttons[buttonnum]) == "table") then
for idx in AutoBar_Config[AutoBar_Player].buttons[buttonnum] do
if (AutoBar_Config[AutoBar_Player].buttons[buttonnum][idx] == name) then
AutoBar_Config[AutoBar_Player].buttons[buttonnum][idx] = id;
AutoBar_Msg("Updating multi item button #",buttonnum," item #",idx," to use itemid instead of item name.");
end
end
elseif (AutoBar_Config[AutoBar_Player].buttons[buttonnum] == name) then
AutoBar_Config[AutoBar_Player].buttons[buttonnum] = id;
AutoBar_Msg("Updating single item button #",buttonnum," to use itemid instead of item name.");
end
end
end
end
function AutoBar_ScanBags(specificbag)
local function ClearOutBag(bag)
local buttonnum, idx, i, bagslot, newitemlist, newranks;
for buttonnum = 1, AUTOBAR_MAXBUTTONS, 1 do
if (AutoBar_Buttons_CurrentItems[buttonnum]) then
newranks = {};
for idx in AutoBar_Buttons_CurrentItems[buttonnum] do
newitemlist = {};
for i, bagslot in AutoBar_Buttons_CurrentItems[buttonnum][idx].items do
if (bag ~= bagslot[1]) then
table.insert(newitemlist,bagslot);
end
end
if (table.getn(newitemlist) > 0) then
AutoBar_Buttons_CurrentItems[buttonnum][idx].items = newitemlist;
table.insert(newranks,AutoBar_Buttons_CurrentItems[buttonnum][idx]);
end
end
if (table.getn(newranks) == 0) then
AutoBar_Buttons_CurrentItems[buttonnum] = nil;
else
AutoBar_Buttons_CurrentItems[buttonnum] = newranks;
end
end
end
end
local function AddItem(buttonnum, rank, bag, slot)
if (AutoBar_Buttons_CurrentItems[buttonnum]) then
local idx, rec, findRank;
for idx, rec in AutoBar_Buttons_CurrentItems[buttonnum] do
if (rec.rank == rank) then
findRank = idx;
end
end
if (findRank) then
table.insert(AutoBar_Buttons_CurrentItems[buttonnum][findRank].items, { bag, slot } );
else
table.insert(AutoBar_Buttons_CurrentItems[buttonnum],
{
["rank"] = rank,
["items"] = { { bag, slot } }
}
);
end
else
AutoBar_Buttons_CurrentItems[buttonnum] = {
[1] = {
["rank"] = rank,
["items"] = { { bag, slot } }
},
};
end
end
local function SortByRank(a,b)
if (a and b and a.rank and b.rank) then
return a.rank < b.rank;
else
return true;
end
end
local bag, slot, name, id, i;
local minbag,maxbag = 0, 4;
if (specificbag) then
minbag = specificbag;
maxbag = specificbag;
ClearOutBag(specificbag);
else
AutoBar_Buttons_CurrentItems = {};
end
-- AutoBar_Buttons_CurrentItems = {
-- buttonnum = {
-- idx = {
-- "rank" = ranknum,
-- "items" = { {bag,slot}, {bag,slot}, {bag, slot} }
-- },
-- },
--};
for bag = minbag, maxbag, 1 do
for slot = 1, GetContainerNumSlots(bag), 1 do
name, id = AutoBar_LinkDecode(GetContainerItemLink(bag,slot));
if (name and AutoBar_SearchedForItems[name] and id) then
if (not AutoBar_SearchedForItems[id]) then
AutoBar_SearchedForItems[id] = { AutoBar_SearchedForItems[name][1], AutoBar_SearchedForItems[name][2], AutoBar_SearchedForItems[name][3] };
end
AutoBar_UpdateCategoryNameToID(name,id);
AutoBar_SearchedForItems[name] = nil;
end
if (id and AutoBar_SearchedForItems[id]) then
local button = AutoBar_SearchedForItems[id][1];
local rank = AutoBar_ButtonItemList_Reversed[button][id];
AddItem(button, rank, bag, slot)
if (AutoBar_SearchedForItems[id][4]) then
for i = 4, table.getn(AutoBar_SearchedForItems[id]), 1 do
button = AutoBar_SearchedForItems[id][i];
rank = AutoBar_ButtonItemList_Reversed[button][id];
AddItem(button, rank, bag, slot)
end
end
end
end
end
local buttonnum;
for buttonnum = 1, AUTOBAR_MAXBUTTONS, 1 do
if (AutoBar_Buttons_CurrentItems[buttonnum]) then
table.sort(AutoBar_Buttons_CurrentItems[buttonnum], SortByRank);
end
end
AutoBar_AssignButtons();
end
------------------------------------
function AutoBar_OnLoad()
AutoBar_Player = UnitName("player").." - "..GetCVar("realmName");
this:RegisterEvent("PLAYER_ENTERING_WORLD");
this:RegisterEvent("PLAYER_LEAVING_WORLD");
--
this:RegisterEvent("BAG_UPDATE");
this:RegisterEvent("UPDATE_BINDINGS");
--
-- For item use restrictions
this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
this:RegisterEvent("PLAYER_REGEN_ENABLED");
this:RegisterEvent("PLAYER_REGEN_DISABLED");
this:RegisterEvent("UNIT_MANA");
this:RegisterEvent("UNIT_HEALTH");
this:RegisterEvent("PLAYER_ALIVE");
this:RegisterEvent("BAG_UPDATE_COOLDOWN");
--
end
function AutoBar_OnEvent(event)
if (event == "PLAYER_ENTERING_WORLD") then
AutoBar_InCombat = nil;
if (not AutoBar_ConfigLoaded) then
AutoBar_ConfigInit();
AutoBar_ConfigLoaded = 1;
AutoBar_ScanBags();
end
if (not AutoBar_InWorld) then
AutoBar_InWorld = 1;
AutoBar_ScanBags();
AutoBar_Button_UpdateButtons();
end
elseif (event == "PLAYER_LEAVING_WORLD") then
AutoBar_InWorld = nil;
elseif (AutoBar_InWorld) then
if (event == "BAG_UPDATE") then
if (arg1 < 5) then
AutoBar_ScanBags(arg1);
end
elseif (event == "UPDATE_BINDINGS") then
AutoBar_Button_UpdateButtons();
elseif (event == "PLAYER_ALIVE") then
AutoBar_Button_UpdateButtons();
elseif ((event == "UNIT_MANA" or event == "UNIT_HEALTH") and arg1=="player") then
AutoBar_Button_UpdateButtons();
elseif (event == "PLAYER_REGEN_ENABLED") then
AutoBar_InCombat = nil;
AutoBar_Button_UpdateButtons();
elseif (event == "PLAYER_REGEN_DISABLED") then
AutoBar_InCombat = 1;
AutoBar_Button_UpdateButtons();
elseif (event == "ZONE_CHANGED_NEW_AREA") then
AutoBar_Button_UpdateButtons();
elseif (event == "BAG_UPDATE_COOLDOWN") then
AutoBar_Button_UpdateButtons();
end
end
end
------------------------------------
function AutoBar_UseButton(num)
local bag, slot, rank, itemid, category, categoryidx, idx, acceptable = AutoBar_Button_GetDisplayItem(num);
if (bag and slot) then
UseContainerItem(bag,slot);
if (AutoBar_Category_Info[category] and AutoBar_Category_Info[category].targetted == "WEAPON" and SpellIsTargeting()) then
PickupInventoryItem(GetInventorySlotInfo("MainHandSlot"));
elseif (AutoBar_Category_Info[category] and AutoBar_Category_Info[category].targetted and AutoBar_Config[AutoBar_Player].smartselfcast and AutoBar_Config[AutoBar_Player].smartselfcast[category] and SpellIsTargeting()) then
SpellTargetUnit("player");
end
end
end
function AutoBar_Button_OnClick(mousebutton, updown, override)
local button;
if (override) then
button = getglobal("AutoBar_Button"..override);
else
button = this;
end
button:SetChecked(0);
if (AutoBar.moving) then
if (updown == "CLICK") then
AutoBar.moving = nil;
AutoBar:StopMovingOrSizing();
AutoBar_Config[AutoBar_Player].display.position = {};
AutoBar_Config[AutoBar_Player].display.position.x,
AutoBar_Config[AutoBar_Player].display.position.y = AutoBar:GetCenter();
AutoBar:SetMovable(0);
end
elseif (updown == "CLICK") then
local bag, slot, rank, itemid, category, categoryidx, idx, acceptable = AutoBar_Button_GetDisplayItem(button.effectiveButton);
if (bag and slot) then
UseContainerItem(bag,slot);
if (AutoBar_Category_Info[category] and AutoBar_Category_Info[category].targetted == "WEAPON" and SpellIsTargeting()) then
if (mousebutton == "LeftButton") then
PickupInventoryItem(GetInventorySlotInfo("MainHandSlot"));
elseif (mousebutton == "RightButton") then
PickupInventoryItem(GetInventorySlotInfo("SecondaryHandSlot"));
end
elseif (AutoBar_Category_Info[category] and AutoBar_Category_Info[category].targetted and AutoBar_Config[AutoBar_Player].smartselfcast and AutoBar_Config[AutoBar_Player].smartselfcast[category] and SpellIsTargeting()) then
SpellTargetUnit("player");
end
end
elseif (mousebutton == "RightButton" and updown == "DOWN" and IsControlKeyDown()) then
if (not AutoBar_Config[AutoBar_Player].display.docking) then
AutoBar.moving = true;
AutoBar:SetMovable(1);
AutoBar:StartMoving();
end
end
end
function AutoBar_Button_SetTooltip(button, elapsed)
if (not button) then button = this; end
if (button:GetParent().updateTooltip and elapsed) then
button.updateTooltip = button.updateTooltip - elapsed;
if (button.updateTooltip > 0) then return; end
end
if (button.effectiveButton) then
if (GetCVar("UberTooltips") == "1") then
GameTooltip_SetDefaultAnchor(GameTooltip, button);
else
GameTooltip:SetOwner(button, "ANCHOR_RIGHT");
end
button.updateTooltip = nil;
local bag, slot, rank, itemid, category, categoryidx = AutoBar_Button_GetDisplayItem(button.effectiveButton)
if (bag and slot) then
GameTooltip:SetBagItem(bag, slot);
if (AutoBar_Debug) then
if (rank) then
GameTooltip:AddLine("DISPLAYED RANK: "..rank);
end
if (itemid) then
GameTooltip:AddLine("DISPLAYED ITEMID: "..itemid);
end
if (category) then
GameTooltip:AddLine("DISPLAYED CATEGORY: "..category);
end
if (categoryidx) then
GameTooltip:AddLine("DISPLAYED CATEGORYIDX: "..categoryidx);
end
end
local start, duration, enable = GetContainerItemCooldown(bag, slot);
if (start > 0 and duration > 0) then
button.updateTooltip = TOOLTIP_UPDATE_TIME;
end
GameTooltip:AddLine("");
local rankidx, idx, itemident, bagslot, count, tmpcount, name, itemid, msg;
local start, duration, enable;
for rankidx, itemident in AutoBar_Buttons_CurrentItems[button.effectiveButton] do
count = 0;
for idx, bagslot in itemident.items do
_, tmpcount = GetContainerItemInfo(bagslot[1], bagslot[2]);
count = count + tmpcount;
end
name,itemid = AutoBar_LinkDecode(GetContainerItemLink(itemident.items[1][1], itemident.items[1][2]));
category = AutoBar_SearchedForItems[itemid][2];
start, duration, enable = GetContainerItemCooldown(itemident.items[1][1], itemident.items[1][2]);
msg = name.." (Count: "..count..")";
if (AutoBar_Debug) then
msg = msg.." ["..itemident.items[1][1]..","..itemident.items[1][2].."]";
if (rank) then
msg = msg.." rank="..itemident.rank;
end
if (cat) then
msg = msg.." cat="..category;
end
end
if (category == itemid and categoryidx == 0) then
msg = msg.." [Custom Item]"
end
if (AutoBar_Category_Info[category]) then
if (AutoBar_Category_Info[category].combatonly) then
msg=msg.." [In Combat Only]";
end
if (AutoBar_Category_Info[category].noncombat) then
msg=msg.." [Non Combat Only]";
end
if (AutoBar_Category_Info[category].limit) then
msg=msg.." [Limited Usage]";
end
end
if (start > 0 and duration > 0) then
msg = msg.." [Cooldown]";
end
GameTooltip:AddLine(msg);
if (category and AutoBar_Category_Info[category] and AutoBar_Category_Info[category].targetted == "WEAPON") then
GameTooltip:AddLine("\n(Left Click to apply to Main Hand weapon\nRight Click to apply to OffHand weapon)");
end
end
GameTooltip:Show();
end
end
end
------------------------------------
function AutoBar_GetTexture(id)
if (not id) then return ""; end
if (type(id) == "table" and id[1]) then id = id[1]; end
if (id and AutoBar_Category_Info[id]) then
if (AutoBar_Category_Info[id].texture) then
return "Interface\\Icons\\"..AutoBar_Category_Info[id].texture;
else
id = AutoBar_Category_Info[id].items[1];
end
end
if (type(id)=="number" and id > 0) then
local _,_,_,_,_,_,_,_,texture = GetItemInfo(tonumber(id));
if (texture) then return texture; end
end
return "Interface\\Icons\\INV_Misc_Gift_01";
end
function AutoBar_Msg(...)
local message = "";
for i = 1, arg.n, 1 do
if (type(arg[i]) == "string" or type(arg[i]) == "number") then
message = message..arg[i];
else
message = message..string.upper(type(arg[i]));
end
end
ChatFrame1:AddMessage("AutoBar: "..message);
end
function AutoBar_ConfigUpdated()
AutoBar_BuildItemList();
AutoBar_ScanBags();
AutoBar_SetupVisual();
end
function AutoBar_SetupVisual()
local rows = AutoBar_Config[AutoBar_Player].display.rows;
local columns = AutoBar_Config[AutoBar_Player].display.columns;
local gapping = AutoBar_Config[AutoBar_Player].display.gapping;
local alpha = AutoBar_Config[AutoBar_Player].display.alpha;
local buttonwidth = AutoBar_Config[AutoBar_Player].display.buttonwidth;
local buttonheight = AutoBar_Config[AutoBar_Player].display.buttonheight;
local dockshiftx = AutoBar_Config[AutoBar_Player].display.dockshiftx;
local dockshifty = AutoBar_Config[AutoBar_Player].display.dockshifty;
--
if (not rows) then rows = 1; end
if (not columns) then columns = 6; end
if (not gapping) then gapping = 6; end
if (not alpha) then alpha = 1; end
if (not buttonwidth) then buttonwidth = 36 end
if (not buttonheight) then buttonheight = 36; end
if (not dockshiftx) then dockshiftx = 0; end
if (not dockshifty) then dockshifty = 0; end
--
AutoBar:Show();
AutoBar:ClearAllPoints();
if (AutoBar_Config[AutoBar_Player].display.framestrata) then
AutoBar:SetFrameStrata(AutoBar_Config[AutoBar_Player].display.framestrata);
else
if (AutoBar_Config[AutoBar_Player].display.docking == "MAINMENU") then
AutoBar:SetFrameStrata("HIGH");
else
AutoBar:SetFrameStrata("LOW");
end
end
if (AutoBar_Config[AutoBar_Player].display.docking) then
if (AutoBar_Config[AutoBar_Player].display.docking == "MAINMENU") then
AutoBar:SetPoint("BOTTOMLEFT","MainMenuBarArtFrame","BOTTOMLEFT",546+dockshiftx,38+dockshifty);
else
AutoBar_Config[AutoBar_Player].display.docking = nil;
end
elseif (AutoBar_Config[AutoBar_Player].display.position) then
AutoBar:SetPoint("CENTER","UIParent","BOTTOMLEFT",
AutoBar_Config[AutoBar_Player].display.position.x,
AutoBar_Config[AutoBar_Player].display.position.y);
else
AutoBar:SetPoint("CENTER","UIParent","CENTER",0,0);
end
local i, texture, counttxt, hotkey, fonttext, fontsize, fontoptions, percent;
percent = buttonwidth / 36;
if (percent > 1) then percent = 1; end
for i = 1, AUTOBAR_MAXBUTTONS, 1 do
local button = getglobal("AutoBar_Button"..i);
if (i > (rows*columns)) then
button:Hide();
button.forcehidden = 1;
else
texture = getglobal("AutoBar_Button"..i.."NormalTexture");
counttxt = getglobal("AutoBar_Button"..i.."Count");
hotkey = getglobal("AutoBar_Button"..i.."HotKey");
button.forcehidden = nil;
button:SetAlpha(alpha);
texture:SetAlpha(alpha);
button:SetWidth(buttonwidth);
texture:SetWidth(buttonwidth*1.833);
button:SetHeight(buttonheight);
texture:SetHeight(buttonheight*1.833);
if (AutoBar_Config[AutoBar_Player].display.hidekeytext) then
hotkey:Hide();
else
hotkey:Show();
fonttext, fontsize, fontoptions = hotkey:GetFont();
hotkey:SetFont(fonttext, 12*percent, fontoptions);
hotkey:SetPoint("TOPLEFT","AutoBar_Button"..i,"TOPLEFT",-10,-2);
end
if (AutoBar_Config[AutoBar_Player].display.hidecount) then
counttxt:Hide();
else
counttxt:Show();
fonttext, fontsize, fontoptions = counttxt:GetFont();
counttxt:SetFont(fonttext, 14*percent, fontoptions);
end
button:ClearAllPoints();
if (i == 1) then
button:SetPoint("TOPLEFT","AutoBar","TOPLEFT",0,0);
elseif (columns == 1) then
if (AutoBar_Config[AutoBar_Player].display.reversebuttons) then
button:SetPoint("BOTTOM","AutoBar_Button"..(i-1),"TOP",0,gapping);
else
button:SetPoint("TOP","AutoBar_Button"..(i-1),"BOTTOM",0,gapping*-1);
end
elseif (math.mod(i,columns) == 1) then
local row = math.floor(i/columns);
if (AutoBar_Config[AutoBar_Player].display.reversebuttons) then
button:SetPoint("BOTTOM","AutoBar_Button"..(i-columns),"TOP",0,gapping);
else
button:SetPoint("TOP","AutoBar_Button"..(i-columns),"BOTTOM",0,gapping*-1);
end
else
if (AutoBar_Config[AutoBar_Player].display.reversebuttons) then
button:SetPoint("RIGHT","AutoBar_Button"..(i-1),"LEFT",gapping*-1,0);
else
button:SetPoint("LEFT","AutoBar_Button"..(i-1),"RIGHT",gapping,0);
end
end
end
end
AutoBar_AssignButtons();
AutoBar_Button_UpdateButtons();
end