vanilla-wow-addons – Rev 1
?pathlinks?
GuildAdsShiftClick = {
metaInformations = {
name = "GuildAdsShiftClick",
guildadsCompatible = 100,
};
-- hook
callHook = {};
hookName = {};
hook = function(id, hook, new)
if getglobal(hook) then
GuildAdsShiftClick.hookName[id] = hook;
GuildAdsShiftClick.callHook[id] = getglobal(hook);
setglobal(hook, new);
end
end;
unhook = function(id)
if id and GuildAdsShiftClick.hookName[id] then
setglobal(GuildAdsShiftClick.hookName[id], GuildAdsShiftClick.callHook[id]);
GuildAdsShiftClick.hookName[id] = nil;
GuildAdsShiftClick.callHook[id] = nil;
end
end;
-- onInit
onInit = function()
-- Patch in inventory OnClick
GuildAdsShiftClick.hook("inventory", "ContainerFrameItemButton_OnClick", GuildAdsShiftClick.inventoryOnClick);
-- Patch in chat link
GuildAdsShiftClick.hook("chatFrameHyperlink", "ChatFrame_OnHyperlinkShow", GuildAdsShiftClick.chatFrameOnHyperlinkShow);
-- Patch in bank OnClick
GuildAdsShiftClick.hook("bank", "BankFrameItemButtonGeneric_OnClick", GuildAdsShiftClick.bankOnClick);
-- Patch in paperdoll
GuildAdsShiftClick.hook("paperdoll", "PaperDollItemSlotButton_OnClick", GuildAdsShiftClick.paperdollOnClick)
-- Patch in merchant OnClick
GuildAdsShiftClick.hook("merchant", "MerchantItemButton_OnClick", GuildAdsShiftClick.merchantOnClick);
-- Patch in quest item OnClick
-- GuildAdsShiftClick.hook("questProgress", "QuestItem_OnClick", GuildAdsShiftClick.quest.progressOnClick);
-- GuildAdsShiftClick.hook("questReward", "QuestRewardItem_OnClick", GuildAdsShiftClick.quest.rewardOnClick);
-- Patch in inspect : on parse of the LUA file
-- Patch in auction house : on parse of the LUA file
-- Patch in trade skill : on parse of the LUA file
-- Patch in craft : on parse of the LUA file
-- Patch in AllInOneInventory item OnClick
GuildAdsShiftClick.hook("allInOneInventory", "AllInOneInventoryFrameItemButton_OnClick", GuildAdsShiftClick.allInOneInventoryOnClick)
-- Patch in MyInventory item OnlLick
GuildAdsShiftClick.hook("myInventory", "MyInventoryFrameItemButton_OnClick", GuildAdsShiftClick.myInventoryOnClick);
-- Patch in EngInventory
GuildAdsShiftClick.hook("engInventory", "EngInventory_ItemButton_OnClick", GuildAdsShiftClick.engInventoryOnClick);
-- Patch in MyBank
GuildAdsShiftClick.hook("myBank", "MyBankFrameItemButton_OnClick", GuildAdsShiftClick.myBankOnClick);
-- Patch in BankItems OnClick
GuildAdsShiftClick.hook("bankItemsItem", "BankItems_Button_OnClick", GuildAdsShiftClick.bankItems.itemOnClick);
GuildAdsShiftClick.hook("bankItemsBag", "BankItems_BagItem_OnClick", GuildAdsShiftClick.bankItems.bagOnClick);
-- Patch in BankStatement
GuildAdsShiftClick.hook("bankStatementItem", "BankStatementItemButton_OnClick", GuildAdsShiftClick.bankStatement.itemOnClick);
GuildAdsShiftClick.hook("bankStatementBag", "BankStatementContainerFrameItemButton_OnClick", GuildAdsShiftClick.bankStatement.bagOnClick);
-- Patch in ItemsMatrix item OnClick
GuildAdsShiftClick.hook("itemMatrix", "ItemsMatrixItemButton_OnClick", GuildAdsShiftClick.itemMatrixOnClick);
-- Patch in LootLink item OnClick
GuildAdsShiftClick.hook("lootLink", "LootLinkItemButton_OnClick", GuildAdsShiftClick.lootLink.onClick);
end;
-- hook this click ?
hookTest = function(button)
return GuildAdsFrame:IsVisible() and IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown();
end;
-- set current item in GuildAds window
setItem = function(button, link, texture, itemCount, text)
if(link) then
GuildAds_MyAdsEdit(nil);
GuildAds_setEditItem(text, link, texture, itemCount);
else
GuildAdsShiftClick.debug("Clicked on empty");
end
end;
-- Inventory
inventoryOnClick = function(button, ignoreShift)
if(not ignoreShift and GuildAdsShiftClick.hookTest(button)) then
local texture, itemCount = GetContainerItemInfo(this:GetParent():GetID(), this:GetID());
local link = GetContainerItemLink(this:GetParent():GetID(), this:GetID());
GuildAdsShiftClick.setItem(button, link, texture, itemCount);
else
GuildAdsShiftClick.callHook.inventory(button, ignoreShift);
end
end;
-- Link into chatframe
chatFrameOnHyperlinkShow = function(link, text, button)
if (GuildAdsShiftClick.hookTest(button)) then
if string.sub(link, 1, 5) == "item:" then
local info = GAS_GetItemInfo(link);
GuildAdsShiftClick.setItem(button, text, info.texture, 1);
else
GuildAdsShiftClick.callHook.chatFrameHyperlink(link, text, button);
end
else
GuildAdsShiftClick.callHook.chatFrameHyperlink(link, text, button);
end
end;
-- Bank
bankOnClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local texture, itemCount = GetContainerItemInfo(BANK_CONTAINER, this:GetID());
local link = GetContainerItemLink(BANK_CONTAINER, this:GetID());
GuildAdsShiftClick.setItem(button, link, texture, itemCount);
else
GuildAdsShiftClick.callHook.bank(button);
end
end;
-- Paperdoll
paperdollOnClick = function(button, ignoreModifiers)
if (GuildAdsShiftClick.hookTest(button) and not ignoreModifiers) then
local texture = GetInventoryItemTexture("player", this:GetID());
local count;
if texture then
count = GetInventoryItemCount("player", this:GetID());
end
local link = GetInventoryItemLink("player", this:GetID());
GuildAdsShiftClick.setItem(button, link, texture, count);
else
GuildAdsShiftClick.callHook.paperdoll(button, ignoreModifiers);
end
end;
-- Merchant
merchantOnClick = function(button, ignoreModifiers)
if button=="LeftButton" and not ignoreModifiers and GuildAdsShiftClick.hookTest(button) then
local name, texture, price, quantity, numAvailable, isUsable = GetMerchantItemInfo(this:GetID());
local link = GetMerchantItemLink(this:GetID());
if (quantity == 1) then
quantity = nil;
end
GuildAdsShiftClick.setItem(button, link, texture, quantity);
else
GuildAdsShiftClick.callHook.merchant(button, ignoreModifiers);
end
end;
-- Quest
quest = {
itemOnClick = function(hookToCall, button, ignoreModifiers)
if GuildAdsShiftClick.hookTest(button) and this.rewardType ~= "spell" then
local name, texture, numItems, quality, isUsable = GetQuestItemInfo(this.type, this:GetID());
local link = GetQuestItemLink(this.type, this:GetID());
GuildAdsShiftClick.setItem(button, link, texture, nil);
else
hookToCall(button, ignoreModifiers);
end
end;
progressOnClick = function(button, ignoreModifiers)
GuildAdsShiftClick.quest.itemOnClick(GuildAdsShiftClick.callHook.questProgress);
end;
rewardOnClick = function(button, ignoreModifiers)
GuildAdsShiftClick.quest.itemOnClick(GuildAdsShiftClick.callHook.questReward);
end;
};
-- Inspect
inspect = {
notHook = true;
loadUI = function()
GuildAdsShiftClick.callHook.inspectLoadUI();
if GuildAdsShiftClick.inspect.notHook then
GuildAdsShiftClick.inspect.notHook = nil;
GuildAdsShiftClick.hook("inspect", "InspectPaperDollItemSlotButton_OnClick", GuildAdsShiftClick.inspect.onClick);
end
end;
onClick = function(button)
if GuildAdsShiftClick.hookTest(button) then
local link = GetInventoryItemLink(InspectFrame.unit, this:GetID());
local texture = GetInventoryItemTexture(InspectFrame.unit, this:GetID());
local count;
if ( textureName ) then
count = GetInventoryItemCount(unit, button:GetID());
end
GuildAdsShiftClick.setItem(button, link, texture, count);
else
GuildAdsShiftClick.callHook.inspect(button);
end
end;
};
-- Auction House
auctionHouse = {
notHook = true;
loadUI = function()
GuildAdsShiftClick.callHook.auctionHouseLoadUI();
if GuildAdsShiftClick.auctionHouse.notHook then
GuildAdsShiftClick.auctionHouse.notHook = nil;
-- Patch in auction OnClick
GuildAdsShiftClick.callHook.auctionHouseItemOnClick = BrowseButton1Item:GetScript("OnClick");
GuildAdsShiftClick.callHook.auctionHouseLineOnClick = BrowseButton1:GetScript("OnClick");
for i=1,9 do
local button = getglobal("BrowseButton"..i.."Item");
if button then
button:SetScript("OnClick", GuildAdsShiftClick.auctionHouse.itemOnClick);
end;
button = getglobal("BrowseButton"..i);
if button then
button:SetScript("OnClick", GuildAdsShiftClick.auctionHouse.lineOnClick);
end;
end
end
end;
itemOnClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local index = this:GetParent():GetID()+FauxScrollFrame_GetOffset(BrowseScrollFrame);
local name, texture, itemCount = GetAuctionItemInfo("list", index);
local link = GetAuctionItemLink("list", index);
GuildAdsShiftClick.setItem(button, link, texture, itemCount);
else
GuildAdsShiftClick.callHook.auctionHouseItemOnClick(button);
end
end;
lineOnClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local index = this:GetID()+FauxScrollFrame_GetOffset(BrowseScrollFrame);
local name, texture, itemCount = GetAuctionItemInfo("list", index);
local link = GetAuctionItemLink("list", index);
GuildAdsShiftClick.setItem(button, link, texture, itemCount);
else
GuildAdsShiftClick.callHook.auctionHouseLineOnClick(button);
end
end;
};
-- Tradeskill
tradeSkill = {
notHook = true;
loadUI = function()
GuildAdsShiftClick.callHook.tradeSkillLoadUI();
if GuildAdsShiftClick.tradeSkill.notHook then
GuildAdsShiftClick.tradeSkill.notHook = nil;
-- TradeSkillSkillIcon
GuildAdsShiftClick.callHook.tradeSkillSkillOnClick = TradeSkillSkillIcon:GetScript("OnClick");
TradeSkillSkillIcon:SetScript("OnClick", GuildAdsShiftClick.tradeSkill.SkillOnClick);
-- TradeSkillReagent1 .. TradeSkillReagent8
GuildAdsShiftClick.callHook.tradeSkillReagentOnClick = TradeSkillReagent1:GetScript("OnClick");
for i=1,TRADE_SKILLS_DISPLAYED do
local button = getglobal("TradeSkillReagent"..i);
if button then
button:SetScript("OnClick", GuildAdsShiftClick.tradeSkill.ReagentOnClick);
end;
end
end
end;
SkillOnClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local id = TradeSkillFrame.selectedSkill;
local link = GetTradeSkillItemLink(id);
local texture = GetTradeSkillIcon(id);
local minMade, maxMade = GetTradeSkillNumMade(id);
GuildAdsShiftClick.setItem(button, link, texture, minMade);
else
GuildAdsShiftClick.callHook.tradeSkillSkillOnClick(button);
end;
end;
ReagentOnClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local reagentName, reagentTexture, reagentCount, playerReagentCount = GetTradeSkillReagentInfo(TradeSkillFrame.selectedSkill, this:GetID());
local link = GetTradeSkillReagentItemLink(TradeSkillFrame.selectedSkill, this:GetID());
GuildAdsShiftClick.setItem(button, link, reagentTexture, reagentCount);
else
GuildAdsShiftClick.callHook.tradeSkillReagentOnClick(button);
end;
end;
};
-- Craft
craft = {
notHook = true;
loadUI = function()
-- call old function
GuildAdsShiftClick.callHook.craftLoadUI();
if GuildAdsShiftClick.craft.notHook then
GuildAdsShiftClick.craft.notHook = nil;
-- CraftIcon
GuildAdsShiftClick.callHook.craftIconOnClick = CraftIcon:GetScript("OnClick");
CraftIcon:SetScript("OnClick", GuildAdsShiftClick.craft.iconOnClick);
-- CraftReagent1 .. CraftReagent8
GuildAdsShiftClick.callHook.reagentIconOnClick = CraftReagent1:GetScript("OnClick");
for i=1,CRAFTS_DISPLAYED do
local button = getglobal("CraftReagent"..i);
if button then
button:SetScript("OnClick", GuildAdsShiftClick.craft.reagentOnClick);
end;
end
end
end;
iconOnClick = function(button)
if GuildAdsShiftClick.hookTest(button) then
local id = GetCraftSelectionIndex();
local craftName, craftSubSpellName, craftType, numAvailable, isExpanded = GetCraftInfo(id);
local texture = GetCraftIcon(id);
local craftDesc = GetCraftDescription(id);
GuildAdsShiftClick.setItem(button, GAS_PackLink("ffffffff", nil, craftName), texture, nil, craftDesc);
else
GuildAdsShiftClick.callHook.craftIconOnClick(button);
end
end;
reagentOnClick = function(button)
if GuildAdsShiftClick.hookTest(button) then
local id = GetCraftSelectionIndex();
local link = GetCraftReagentItemLink(id, this:GetID());
local reagentName, reagentTexture, reagentCount, playerReagentCount = GetCraftReagentInfo(id, this:GetID());
GuildAdsShiftClick.setItem(button, link, reagentTexture, reagentCount);
else
GuildAdsShiftClick.callHook.reagentIconOnClick(button);
end
end;
};
-- AllInOneInventory
allInOneInventoryOnClick = function(button, ignoreShift)
if(not ignoreShift and GuildAdsShiftClick.hookTest(button)) then
local bag, slot = AllInOneInventory_GetIdAsBagSlot(this:GetID());
local texture, itemCount = GetContainerItemInfo(bag, slot);
local link = GetContainerItemLink(bag,slot);
GuildAdsShiftClick.setItem(button, link, texture, itemCount);
else
GuildAdsShiftClick.callHook.allInOneInventory(button, ignoreShift);
end
end;
-- MyInventory
myInventoryOnClick = function(button, ignoreShift)
if(not ignoreShift and GuildAdsShiftClick.hookTest(button)) then
local texture, itemCount = GetContainerItemInfo(this.bagIndex, this.itemIndex);
local link = GetContainerItemLink(this.bagIndex, this.itemIndex);
GuildAdsShiftClick.setItem(button, link, texture, itemCount);
else
GuildAdsShiftClick.callHook.myInventory(button, ignoreShift);
end
end;
-- EngInventory
engInventoryOnClick = function(arg1)
if GuildAdsShiftClick.hookTest(arg1) then
if (EngInventory_buttons[this:GetName()] ~= nil) then
bar = EngInventory_buttons[this:GetName()]["bar"];
position = EngInventory_buttons[this:GetName()]["position"];
bag = EngInventory_bar_positions[bar][position]["bagnum"];
slot = EngInventory_bar_positions[bar][position]["slotnum"];
local texture, itemCount = GetContainerItemInfo(bag, slot);
local link = GetContainerItemLink(bag,slot);
GuildAdsShiftClick.setItem(button, link, texture, itemCount);
end
else
GuildAdsShiftClick.callHook.engInventory(arg1);
end
end;
-- MyBank
myBankOnClick = function(button, ignoreShift)
if(GuildAdsShiftClick.hookTest(button)) then
local myLink;
local item = MyBank_GetBag(this.bagIndex)[this.itemIndex];
if ItemsMatrix_GetLink then
myLink = ItemsMatrix_GetLink(item["name"]);
elseif LootLink_GetLink then
myLink = LootLink_GetLink(item["name"]);
else
myLink = MyBank_GetLink(item);
end
local icon, count = GetContainerItemInfo(this.bagIndex, this.itemIndex);
GuildAdsShiftClick.setItem(button, myLink, icon, count);
else
GuildAdsShiftClick.callHook.myBank(button, ignoreShift);
end
end;
-- BankItems
bankItems = {
itemOnClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local playerName = UIDropDownMenu_GetSelectedValue(BankItems_UserDropdown)
local item = BankItems_Save[playerName][this:GetID()];
if (item) then
GuildAdsShiftClick.setItem(button, item.link, item.icon, item.count);
end
else
GuildAdsShiftClick.callHook.bankItemsItem(button);
end
end;
bagOnClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local playerName = UIDropDownMenu_GetSelectedValue(BankItems_UserDropdown)
local bag = BankItems_Save[playerName]["Bag"..this:GetParent():GetID()];
local itemID = bag.size - ( this:GetID() - 1 );
local item = bag[itemID];
if (item) then
GuildAdsShiftClick.setItem(button, item.link, item.icon, item.count);
end
else
GuildAdsShiftClick.callHook.bankItemsBag(button);
end
end;
};
-- BankStatement
bankStatement = {
getItemInfo = function(container, itemNum)
local item;
local player = BankStatementGetBSIIndex();
if (BankStatementItems and BankStatementItems[player]) then
if (itemNum == "bag") then
item = BankStatementItems[player][container];
else
if (BankStatementItems[player][container]) then
item = BankStatementItems[player][container][itemNum];
end
end
end
return item.link, item.icon, item.quantity;
end;
itemOnClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local link, icon, count = GuildAds_BS_GetItemInfo("bank", this:GetID());
GuildAdsShiftClick.setItem(button, link, icon, count);
else
GuildAdsShiftClick.callHook.bankStatementItem(button);
end
end;
bagOnClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local link, icon, count = GuildAds_BS_GetItemInfo("bag"..this:GetParent():GetID(), this:GetID());
GuildAdsShiftClick.setItem(button, link, icon, count);
else
GuildAdsShiftClick.callHook.bankStatementBag(button);
end
end;
};
-- ItemMatrix
itemMatrixOnClick = function(button)
if GuildAdsShiftClick.hookTest(button) then
--only input if link is linkable
if(IM_GetData(this:GetText(), "item")) then
local nameGIF, linkGIF, qualityGIF, minLevelGIF, classGIF, subclassGIF, maxStackGIF = GetItemInfo(IM_GetData(this:GetText(), "item"));
if(linkGIF and qualityGIF and nameGIF) then
if(qualityGIF == 5) then --legendary
useColor = "ffff8000";
elseif(qualityGIF == 4) then --epic
useColor = "ffa335ee";
elseif(qualityGIF == 3) then --rare
useColor = "ff0070dd";
elseif(qualityGIF == 2) then --uncommon
useColor = "ff1eff00";
elseif(qualityGIF == 1) then--white
useColor = "ffffffff";
elseif(qualityGIF == 0) then--poor
useColor = "ff9d9d9d";
elseif(qualityGIF == -1) then--poor
useColor = "ff9d9d9d";
else
useColor = "ff57BDFB";
end
--now insert it
if(useColor) then
GuildAdsShiftClick.setItem(button, "|c"..useColor.."|H"..linkGIF.."|h["..nameGIF.."]|h|r", nil, nil);
end
end
end
else
GuildAdsShiftClick.callHook.itemMatrix(button);
end
end;
-- LootLink
lootLink = {
-- Handle Lootlink OnClick events
checkItemServer = function(item)
-- If we haven't converted and this item predates multiple server support, count it as valid
if (not item._)
and ((not LootLinkState or not LootLinkState.DataVersion) or (LootLinkState.DataVersion < 110) ) then
return 1;
end
-- normal case (LootLink_CheckItemServerRaw function)
if item.s then
local index = LootLinkState.ServerNamesToIndices[GetRealmName()];
for server in string.gfind(item.s, "(%d+)") do
if tonumber(server) == index then
return 1;
end
end
end
if( not item.s ) then
return nil;
end
return nil;
end;
getLink = function(name)
local itemLink = ItemLinks[name];
if( itemLink and itemLink.c and itemLink.i and GuildAdsShiftClick.lootLink.checkItemServer(itemLink) ) then
-- Remove instance-specific data that we captured from the link we return
local item = string.gsub(itemLink.i, "(%d+):(%d+):(%d+):(%d+)", "%1:0:%3:%4");
return "|c"..itemLink.c.."|Hitem:"..item.."|h["..name.."]|h|r";
end
return nil;
end;
onClick = function(button)
if(GuildAdsShiftClick.hookTest(button)) then
local link = GuildAdsShiftClick.lootLink.getLink(this:GetText());
GuildAdsShiftClick.setItem(button, link, nil, nil);
else
GuildAdsShiftClick.callHook.lootLink(button);
end
end;
};
};
GuildAdsPlugin.UIregister(GuildAdsShiftClick);
GuildAdsShiftClick.hook("inspectLoadUI", "InspectFrame_LoadUI", GuildAdsShiftClick.inspect.loadUI);
GuildAdsShiftClick.hook("auctionHouseLoadUI", "AuctionFrame_LoadUI", GuildAdsShiftClick.auctionHouse.loadUI);
GuildAdsShiftClick.hook("tradeSkillLoadUI", "TradeSkillFrame_LoadUI", GuildAdsShiftClick.tradeSkill.loadUI);
GuildAdsShiftClick.hook("craftLoadUI", "CraftFrame_LoadUI", GuildAdsShiftClick.craft.loadUI);