View Single Post
11-05-14, 11:18 PM   #6
Shenj
A Murloc Raider
Join Date: Feb 2011
Posts: 5
As the Nature of my Addon has changed, it no longer is a AutoLoot addon per se as im now using Blizzards autoloot itself and mine is pretty much just doing the Alert & instant hide of loot window, not sure why but i had to use OnUpdate to hide the frame because doing it at LOOT_OPENED event would break Blizzards autoloot, its still incomplete but im starting to be unable to improve it by much because of my lack of knowledge.

If i notice it failing to auto-loot again i will have to revert to force looting it.

Lua Code:
  1. --Credits AutoLootFix, Dugi
  2. local f = CreateFrame("Frame")
  3. f:RegisterEvent("PLAYER_ENTERING_WORLD")
  4. f:RegisterEvent("CVAR_UPDATE")
  5.  
  6. local LootAlertItems = {}
  7. local twipe = table.wipe
  8. local tinsert = table.insert
  9. local inInstance, instanceType
  10. local rarityThreshold = 3
  11.  
  12. local UpdateAutoLootStatus = function(value)
  13.     if tonumber(value) == 1 then
  14.         f:RegisterEvent("LOOT_OPENED")
  15.         f:RegisterEvent("CHAT_MSG_LOOT")
  16.     else
  17.         f:UnregisterEvent("LOOT_OPENED")
  18.         f:UnregisterEvent("CHAT_MSG_LOOT")
  19.     end
  20. end
  21.  
  22. IsAutoLootKeyDown = function()
  23.     -- Possible values: ALT, CTRL, SHIFT, NONE
  24.     local key = InterfaceOptionsControlsPanelAutoLootKeyDropDown:GetValue()
  25.     if key ~= "NONE" then
  26.         if key == "CTRL" then key = "CONTROL" end
  27.         local first, rest = key:sub(1, 1), key:sub(2):lower()
  28.         return _G[("Is%s%sKeyDown"):format(first, rest)]()
  29.     end
  30. end
  31.  
  32. local function GetItemIdFromLink(link)
  33.     return tonumber(link:match(".+|Hitem:([^:]+):.+"))
  34. end
  35.  
  36. f:SetScript("OnEvent", function(self, event, ...)
  37.     if event == "PLAYER_ENTERING_WORLD" then
  38.         inInstance, instanceType = IsInInstance()
  39.         UpdateAutoLootStatus(GetCVar"autoLootDefault")
  40.     elseif event == "CVAR_UPDATE" then
  41.         local glStr, value = ...
  42.         if glStr == "AUTO_LOOT_DEFAULT_TEXT" then
  43.             UpdateAutoLootStatus(value)
  44.         end
  45.     elseif event == "LOOT_OPENED" then
  46.         twipe(LootAlertItems)
  47.         local numItems = GetNumLootItems()
  48.         for i = numItems, 1, -1 do
  49.             local lootLink = GetLootSlotLink(i)
  50.             local _, _, _, rarity, locked = GetLootSlotInfo(i)
  51.             if lootLink and rarity >= rarityThreshold then
  52.                 local itemId = GetItemIdFromLink(lootLink)
  53.                 tinsert(LootAlertItems, itemId)
  54.             end
  55.             --LootSlot(i)
  56.         end
  57.         if not IsAutoLootKeyDown() then
  58.             f:SetScript("OnUpdate", LootAlert_OnUpdate);
  59.         end
  60.     elseif (event=="CHAT_MSG_LOOT") then
  61.         local message, sender, language, channelString, target, flags, _, channelNumber, channelName, _, _ = ...
  62.         LootAlert(message)
  63.     end
  64. end)
  65.  
  66. function LootAlert_OnUpdate(self, elapsed)
  67.     if not (inInstance and GetNumGroupMembers() > 0) then
  68.         if (ElvLootFrame:IsShown()) then
  69.             ElvLootFrame:Hide()
  70.         elseif (LootFrame:IsShown()) then
  71.             LootFrame:Hide()
  72.         end
  73.     end
  74.     self:SetScript("OnUpdate", nil);
  75. end
  76.  
  77. local ITEMNAME = {
  78.     [LE_ITEM_QUALITY_COMMON] = "Common",
  79.     [LE_ITEM_QUALITY_UNCOMMON] = "Uncommon",
  80.     [LE_ITEM_QUALITY_EPIC] = "Epic",
  81.     [LE_ITEM_QUALITY_RARE] = "Rare",
  82.     [LE_ITEM_QUALITY_LEGENDARY] = "Legendary",
  83.     [LE_ITEM_QUALITY_HEIRLOOM] = "Heirloom"
  84. }
  85.  
  86. local LOOT_SELF_REGEX = gsub(LOOT_ITEM_SELF, "%%s", "(.+)") --"You receive item: %s."
  87. local LOOT_PUSHED_REGEX = gsub(LOOT_ITEM_PUSHED_SELF, "%%s", "(.+)") --"You receive loot: %s."
  88.  
  89. function LootAlert(message)
  90.     local itemLink = string.match(message, LOOT_PUSHED_REGEX) or string.match(message, LOOT_SELF_REGEX)
  91.     if itemLink then
  92.         local itemId = GetItemIdFromLink(itemLink)
  93.         local itemName,_,_,_,_, Type, subType = GetItemInfo(itemLink)
  94.         if tContains(LootAlertItems, itemId) then
  95.             if (instanceType ~= "raid" and GetNumGroupMembers() == 0) or GetLootMethod() == "personalloot" then
  96.                 LootAlertFrame_ShowAlert(itemLink)
  97.             elseif subType == "Mount" or subType == "Companion Pets" or Type == "Recipe" then
  98.                 LootAlertFrame_ShowAlert(itemLink)
  99.             end
  100.         end
  101.     end
  102. end
  103.  
  104. function LootAlertFrame_ShowAlert(itemLink, quantity)
  105.     local frame;
  106.     for i=1, #LOOT_WON_ALERT_FRAMES do
  107.         local lootWon = LOOT_WON_ALERT_FRAMES[i];
  108.         if ( not lootWon:IsShown() ) then
  109.             frame = lootWon;
  110.             break;
  111.         end
  112.     end
  113.  
  114.     if ( not frame ) then
  115.         frame = CreateFrame("Button", nil, UIParent, "LootWonAlertFrameTemplate");
  116.         table.insert(LOOT_WON_ALERT_FRAMES, frame);
  117.     end
  118.  
  119.     LootAlertFrame_SetUp(frame, itemLink, quantity);
  120.     AlertFrame_AnimateIn(frame);
  121.     AlertFrame_FixAnchors();
  122. end
  123.  
  124. local LOOTALERTFRAME={
  125.     Default = { bgOffsetX=0, bgOffsetY=0, labelOffsetX=7, labelOffsetY=3, labelText=YOU_WON_LABEL, glowAtlas="loottoast-glow"},
  126.     Horde = { bgOffsetX=-1, bgOffsetY=-1, labelOffsetX=7, labelOffsetY=3, labelText=YOU_EARNED_LABEL, pvpAtlas="loottoast-bg-horde", glowAtlas="loottoast-glow"},
  127.     Alliance = { bgOffsetX=-1, bgOffsetY=-1, labelOffsetX=7, labelOffsetY=3, labelText=YOU_EARNED_LABEL, pvpAtlas="loottoast-bg-alliance", glowAtlas="loottoast-glow"},
  128. }
  129. function LootAlertFrame_SetUp(self, itemLink, quantity)
  130.     local itemName, itemHyperLink, itemRarity, _, _, _, _, _, _, itemTexture = GetItemInfo(itemLink);
  131.  
  132.  
  133.     local windowInfo = LOOTALERTFRAME.Default;
  134.     if( showFactionBG ) then
  135.         local factionGroup = UnitFactionGroup("player");
  136.         windowInfo = LOOTALERTFRAME[factionGroup]
  137.         self.PvPBackground:SetAtlas(windowInfo.pvpAtlas, true);
  138.         self.PvPBackground:SetPoint("CENTER", windowInfo.bgOffsetX, windowInfo.bgOffsetY);
  139.         self.Background:Hide();
  140.         self.BGAtlas:Hide();
  141.         self.PvPBackground:Show(); 
  142.     else
  143.         if ( windowInfo.bgAtlas ) then
  144.             self.Background:Hide();
  145.             self.BGAtlas:Show();
  146.             self.BGAtlas:SetAtlas(windowInfo.bgAtlas);
  147.             self.BGAtlas:SetPoint("CENTER", windowInfo.bgOffsetX, windowInfo.bgOffsetY);
  148.         else
  149.             self.Background:SetPoint("CENTER", windowInfo.bgOffsetX, windowInfo.bgOffsetY);
  150.             self.Background:Show();
  151.             self.BGAtlas:Hide();
  152.         end
  153.         self.PvPBackground:Hide();
  154.     end
  155.     self.glow:SetAtlas(windowInfo.glowAtlas);
  156.     self.IconBorder:SetShown(not windowInfo.noIconBorder);
  157.     if ( windowInfo.iconUnderBG ) then
  158.         self.Icon:SetDrawLayer("BACKGROUND");
  159.     else
  160.         self.Icon:SetDrawLayer("BORDER");
  161.     end
  162.    
  163.     local color = ITEM_QUALITY_COLORS[itemRarity];
  164.     local RarityText = ITEMNAME[itemRarity]
  165.     self.Label:SetText(format(RarityText, _G["ITEM_QUALITY"..itemRarity.."_DESC"]));
  166.     self.Label:SetVertexColor(color.r, color.g, color.b);
  167.     self.Label:SetPoint("TOPLEFT", self.Icon, "TOPRIGHT", windowInfo.labelOffsetX, windowInfo.labelOffsetY);
  168.  
  169.     self.Icon:SetTexture(itemTexture);
  170.     self.ItemName:SetText(itemName);
  171.    
  172.     self.ItemName:SetVertexColor(color.r, color.g, color.b);
  173.     self.IconBorder:SetTexCoord(unpack(LOOT_BORDER_QUALITY_COORDS[itemRarity] or LOOT_BORDER_QUALITY_COORDS[LE_ITEM_QUALITY_UNCOMMON]));
  174.  
  175.     self.RollTypeIcon:Hide();
  176.     self.RollValue:Hide();
  177.     self.SpecIcon:Hide();
  178.     self.SpecRing:Hide();
  179.     self.hyperlink = itemHyperLink;
  180.     self:SetScript('OnClick', function()
  181.         if(IsModifiedClick()) then
  182.             ChatEdit_InsertLink(self.hyperlink);
  183.         else
  184.             --This doesn't work with ElvUI
  185.             local bag = SearchBagsForItemLink(self.hyperlink);
  186.             if (bag >= 0) then
  187.                 OpenBag(bag);
  188.             end
  189.         end
  190.     end)
  191.  
  192.  
  193.     PlaySoundKitID(31578);  --UI_EpicLoot_Toast
  194. end

Last edited by Shenj : 11-06-14 at 12:27 AM.
  Reply With Quote