diff --git a/NewAge b/NewAge deleted file mode 160000 index b3e312b..0000000 --- a/NewAge +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b3e312b05846b83a3de30fae8754daddf12baca9 diff --git a/NewAge/AHBot/AUCTION_HOUSE_BROWSE_RESULTS_UPDATED.lua b/NewAge/AHBot/AUCTION_HOUSE_BROWSE_RESULTS_UPDATED.lua new file mode 100644 index 0000000..85ef8c0 --- /dev/null +++ b/NewAge/AHBot/AUCTION_HOUSE_BROWSE_RESULTS_UPDATED.lua @@ -0,0 +1,19 @@ +function() + results = C_AuctionHouse.GetBrowseResults() + -- DevTools_Dump(results) + for k,v in ipairs(results) do + local itemID = v.itemKey.itemID + local itemName = GetItemInfo(itemID) + if aura_env.sellPriceThresholds[itemID] then + if v.minPrice > aura_env.sellPriceThresholds[itemID] then + print(itemName, "too expensive") + SendChatMessage("POKE", "WHISPER", nil, UnitName("player")) + end + elseif aura_env.buyPriceThresholds[itemID] then + if v.minPrice < aura_env.buyPriceThresholds[itemID] then + print(itemName, "too cheap") + SendChatMessage("POKE", "WHISPER", nil, UnitName("player")) + end + end + end +end \ No newline at end of file diff --git a/NewAge/AHBot/EveryFrameThrottled.lua b/NewAge/AHBot/EveryFrameThrottled.lua new file mode 100644 index 0000000..2fafe3f --- /dev/null +++ b/NewAge/AHBot/EveryFrameThrottled.lua @@ -0,0 +1,6 @@ +function() + if not aura_env.last or aura_env.last < GetTime() - aura_env.throttleTime then + aura_env.last = GetTime() + AuctionHouseFrame.SearchBar.FavoritesSearchButton:Click() + end +end \ No newline at end of file diff --git a/NewAge/AHBot/INIT.lua b/NewAge/AHBot/INIT.lua new file mode 100644 index 0000000..bdd5d98 --- /dev/null +++ b/NewAge/AHBot/INIT.lua @@ -0,0 +1,17 @@ +aura_env.throttleTime = 10 + +aura_env.sellPriceThresholds = { + [168446] = 5000 * 100 * 100, -- Accord of Critical Strike + [168447] = 5000 * 100 * 100, -- Accord of Haste + [168448] = 5000 * 100 * 100, -- Accord of Mastery + [168449] = 5000 * 100 * 100, -- Accord of Versatility + [168592] = 4500 * 100 * 100, -- Oceanic Restoration + [168496] = 4500 * 100 * 100, -- Force Multiplier + [168593] = 4500 * 100 * 100, -- Machinist's Brilliance + [168598] = 4500 * 100 * 100, -- Naga Hide +} + +aura_env.buyPriceThresholds = { + [152576] = 5 * 100 * 100, -- Tidesrpay Linen + [152877] = 500 * 100 * 100, -- Veiled Crystal +} diff --git a/NewAge/AHBot/Info.txt b/NewAge/AHBot/Info.txt new file mode 100644 index 0000000..d4a3b55 --- /dev/null +++ b/NewAge/AHBot/Info.txt @@ -0,0 +1,3 @@ +/run AuctionHouseFrame.SearchBar.FavoritesSearchButton:Click() + +/dump C_AuctionHouse.GetBrowseResults() \ No newline at end of file diff --git a/NewAge/Automation/Eventz.lua b/NewAge/Automation/Eventz.lua new file mode 100644 index 0000000..a9c580b --- /dev/null +++ b/NewAge/Automation/Eventz.lua @@ -0,0 +1,205 @@ +--- LOOT_READY LOOT_OPENED MERCHANT_SHOW QUEST_POI_UPDATE QUEST_DETAIL QUEST_COMPLETE QUEST_GREETING QUEST_PROGRESS GOSSIP_SHOW SCRAPPING_MACHINE_SHOW MERCHANT_CLOSED EQUIP_BIND_CONFIRM +function(e) + local aura_env = aura_env + if e == "LOOT_READY" or e == "LOOT_OPENED" then --Auto Loot + local slot = 1 + local lootinfo = GetLootInfo() + for k, v in pairs(lootinfo) do + if v.locked == false then + local link = GetLootSlotLink(slot) + local looted = false + if not link then link = GetLootSlotLink(slot) end + if aura_env.filter[1] == true and (v.item:match("%d+ Gold") or v.item:match("%d+ Silver") or v.item:match("%d+ Copper")) then + LootSlot(slot) + elseif aura_env.filter[2] == true and link:match("Azerite") then + LootSlot(slot) + elseif aura_env.filter[3] == true and v.item:match("War Resources") then + LootSlot(slot) + elseif aura_env.filter[4] == true and v.item:match("Residuum") then + LootSlot(slot) + elseif aura_env.filter[5] == true and v.item:match("Manapearl") then + LootSlot(slot) + end + if link then + local icon = v.texture + local id = link:match("item:(%d+):") + local type = select(6, GetItemInfo(link)) or "" + local subtype = select(7, GetItemInfo(link)) or "" + local ilvl = select(4, GetItemInfo(link)) or 0 + local equip = select(9, GetItemInfo(link)) + if aura_env.filter[6] == true and (select(7, GetItemInfo(link)) or 0) == "Mount" then + LootSlot(slot) + elseif aura_env.filter[7] == true and ilvl > aura_env.ilvlFilter then + LootSlot(slot) + elseif aura_env.filter[8] == true and (select(7, GetItemInfo(link)) or 0) == "Herb" then + LootSlot(slot) + elseif aura_env.filter[9] == true and (select(7, GetItemInfo(link)) or 0) == "Cooking" then + LootSlot(slot) + elseif aura_env.filter[10] == true and (select(7, GetItemInfo(link)) or 0) == "Cloth" and type == "Tradeskill" then + LootSlot(slot) + elseif aura_env.filter[11] == true and (select(7, GetItemInfo(link)) or 0) == "Metal & Stone" then + LootSlot(slot) + elseif aura_env.filter[12] == true and (select(11, GetItemInfo(link)) or 0) > aura_env.goldFilter and v.quality == 0 then + LootSlot(slot) + elseif aura_env.filter[13] == true and v.quality > 1 and v.quality < 4 and type ~= "Weapon" and type ~= "Armor" then + LootSlot(slot) + elseif aura_env.filter[14] == true and v.isQuestItem == true then + LootSlot(slot) + elseif aura_env.filter[15] == true and v.quality == 0 then + LootSlot(slot) + elseif aura_env.filter[16] == true and aura_env.whitelist[v.item] then + LootSlot(slot) + elseif aura_env.filter[17] == true and type == "Quest" and subtype == "Quest" then + LootSlot(slot) + elseif aura_env.filter[21] == true and type == "Tradeskill" and subtype == "Elemental" then + LootSlot(slot) + else + if type == "Weapon" or type == "Armor" then + if aura_env.filter[18] == true and aura_env.skills[select(3, UnitClass("player"))][subtype] == 1 and v.quality > 2 then + LootSlot(slot) + elseif aura_env.filter[19] == true and (equip == "INVTYPE_FINGER" or equip == "INVTYPE_TRINKET" or equip == "INVTYPE_CLOAK" or equip == "INVTYPE_NECK") and v.quality > 2 then + LootSlot(slot) + end + elseif aura_env.filter[20] == true and type == "Miscellaneous" then + if subtype == "Mount" then + LootSlot(slot) + end + end + end + end + slot = slot + 1 + end + end + --CloseLoot() + elseif e == "EQUIP_BIND_CONFIRM" then + StaticPopup1Button1:Click() + elseif e == "SCRAPPING_MACHINE_SHOW" then + for i = 0, 4 do + for j = 1, GetContainerNumSlots(i) do + local link = select(7, GetContainerItemInfo(i, j)) + if link then + local name = GetItemInfo(link) + local rarity = select(3, GetItemInfo(link)) + local ilvl = select(4, GetItemInfo(link)) or 0 + local type = select(6, GetItemInfo(link)) + local equip = select(9, GetItemInfo(link)) or "" + local price = select(11, GetItemInfo(link)) + if aura_env.sellWhitelist[name] ~= 1 then + if name and rarity and ilvl and type and equip and price then + if (type == "Armor" or type == "Weapon") and rarity <= 3 and aura_env.getequipID(equip) then + UseContainerItem(i, j) + elseif rarity > 3 and aura_env.getequipID(equip) then + if equip ~= "INVTYPE_FINGER" then + local eqID = aura_env.getequipID(equip) + local elink = GetInventoryItemLink("player", eqID) + local eilvl = select(4, GetItemInfo(elink)) or 0 + if eilvl > ilvl + 5 then + print("Scrapping " .. link .. "over " .. eilvl - ilvl .. " ilvl difference from " .. elink) + UseContainerItem(i, j) + end + elseif equip == "INVTYPE_FINGER" then + local eqID1, eqID2 = 11, 12 + local elink1, elink2 = GetInventoryItemLink("player", eqID1), GetInventoryItemLink("player", eqID2) + local eilvl1, eilvl2 = select(4, GetItemInfo(elink1)) or 0, select(4, GetItemInfo(elink2)) or 0 + if eilvl1 > ilvl + 5 then + print("Scrapping " .. link .. " over " .. eilvl1 - ilvl .. " ilvl difference from " .. elink1) + UseContainerItem(i, j) + elseif eilvl2 > ilvl + 5 then + print("Scrapping " .. link .. " over " .. eilvl2 - ilvl .. " ilvl difference from " .. elink2) + UseContainerItem(i, j) + end + end + end + end + end + end + end + end + elseif e == "MERCHANT_SHOW" then --Sell grey and white wepaon + if CanMerchantRepair() == true then RepairAllItems() end + local i, j = 0, 1 + for c = 0, 4 do + for s = 1, GetContainerNumSlots(c) do + local link = select(7, GetContainerItemInfo(c, s)) + if link then + local name = GetItemInfo(link) + local rarity = select(3, GetItemInfo(link)) + local ilvl = select(4, GetItemInfo(link)) or 0 + local type = select(6, GetItemInfo(link)) + local price = select(11, GetItemInfo(link)) + if price and price > 0 then + if aura_env.sellWhitelist[name] ~= 1 then + if rarity == 0 then + if aura_env.throttleSell == true then + aura_env.toSell[#aura_env.toSell + 1] = {["c"] = c, ["s"] = s} + else + UseContainerItem(c, s) + end + elseif (type == "Armor" or type == "Weapon") and ilvl < 200 then + if aura_env.throttleSell == true then + aura_env.toSell[#aura_env.toSell + 1] = {["c"] = c, ["s"] = s} + else + UseContainerItem(c, s) + end + end + end + end + end + end + end + if aura_env.throttleSell == true then + aura_env.ticker = C_Timer.NewTicker(0.05, function() + if aura_env.toSell[1] then + UseContainerItem(aura_env.toSell[1].c, aura_env.toSell[1].s) + table.remove(aura_env.toSell, 1) + else + aura_env.ticker:Cancel() + end + if j >= GetContainerNumSlots(i) then i = i + 1 + j = 1 end + if i >= 4 then aura_env.ticker:Cancel() end + end) + end + elseif e == "MERCHANT_CLOSED" then + if aura_env.ticker then aura_env.ticker:Cancel() end + aura_env.toSell = {} + elseif e == "QUEST_POI_UPDATE" then + CloseGossip() + elseif e == "QUEST_DETAIL" then + AcceptQuest() + elseif e == "QUEST_COMPLETE" then + if GetNumQuestChoices() <= 1 then + GetQuestReward(1) + end + elseif e == "GOSSIP_SHOW" then + local quests = GetNumGossipAvailableQuests() + local complquests = GetNumGossipActiveQuests() + local opt = GetNumGossipOptions() + if complquests > 0 and opt == 0 then + for i = 1, complquests do + SelectGossipActiveQuest(i) + end + end + if quests > 0 and opt == 0 then + SelectGossipAvailableQuest(1) + end + if opt == 1 and quests + complquests == 0 then + SelectGossipOption(1) + end + elseif e == "QUEST_GREETING" then + local quests = GetNumGossipAvailableQuests() + local complquests = GetNumGossipActiveQuests() + if complquests > 0 then + for i = 1, complquests do + SelectActiveQuest(1) + end + end + if quests > 0 then + SelectAvailableQuest(1) + end + elseif e == "QUEST_PROGRESS" then + if IsQuestCompletable(i) then + CompleteQuest() + end + end +end \ No newline at end of file diff --git a/NewAge/Automation/INIT.lua b/NewAge/Automation/INIT.lua new file mode 100644 index 0000000..bdec97a --- /dev/null +++ b/NewAge/Automation/INIT.lua @@ -0,0 +1,394 @@ +aura_env.debug = true +aura_env.filter = { + [1] = true, --Gold + [2] = true, --Azerite + [3] = true, --War resources + [4] = true, --Residuum + [5] = true, --Manapearls + [6] = true, --Mounts + [7] = true, --High ilvl + [8] = false, --Herbs + [9] = true, --Cooking + [10] = true, --Cloth + [11] = false, --Metal & Stone + [12] = true, --Gold filter greys + [13] = true, -- >1 && <4 quality items, no gear + [14] = true, --Quest items + [15] = true, --All greys + [16] = true, --Whitelist + [17] = true, --Quest items (different filter) + [18] = true, --Class aproperiate >2 items + [19] = true, --Jewelery >2 quality + [20] = true, --Additional mount filter + [21] = true, --Tradeskill // Elemental +} +aura_env.ilvlFilter = 200 +aura_env.goldFilter = 0.5 +aura_env.goldFilter = aura_env.goldFilter * 10000 +aura_env.throttleSell = false + +aura_env.whitelist = { + ["Pygmy Suckerfish"] = 1, + ["Drakkari Offerings"] = 1, + ["Deepcoral Pod"] = 1, + ["Hardened Spring"] = 1, + ["Machined Gear Assembly"] = 1, + ["Tempered Plating"] = 1, + ["Hefty Glimmershell"] = 1, + ["Fresh Meat"] = 1, + ["Wood"] = 1, + + ["Gloom Dust"] = 1, + ["Veiled Crytal"] = 1, + ["Coalescing Visions"] = 1, + ["Echoes of Ny'alotha"] = 1, + ["Corrupted Mementos"] = 1, + + ["Blood of Sargeras"] = 1, + ["Primal Sargerite"] = 1, + + ["Chain Ignitercoil"] = 1, + ["Galvanic Oscillator"] = 1, + ["Corrupted Memento"] = 1, +} +aura_env.sellWhitelist = { + ["Blacksmith Hammer"] = 1, + ["Endless Tincture of Renewed Combat"] = 1, + ["Mr. Munchykins"] = 1, + ["Arclight Spanner"] = 1, + ["Runeblade of Baron Rivendare"] = 1, +} +aura_env.toSell = {} +aura_env.getequipID = function(equip) + if equip == "INVTYPE_HEAD" then + return 1 + elseif equip == "INVTYPE_NECK" then + return 2 + elseif equip == "INVTYPE_SHOULDER" then + return 3 + elseif equip == "INVTYPE_BODY" then + return 4 + elseif equip == "INVTYPE_CHEST" or equip == "INVTYPE_ROBE" then + return 5 + elseif equip == "INVTYPE_WAIST" then + return 6 + elseif equip == "INVTYPE_LEGS" then + return 7 + elseif equip == "INVTYPE_FEET" then + return 8 + elseif equip == "INVTYPE_WRIST" then + return 9 + elseif equip == "INVTYPE_HAND" then + return 10 + elseif equip == "INVTYPE_CLOAK" then + return 15 + elseif equip == "INVTYPE_WEAPON" or equip == "INVTYPE_WEAPONMAINHAND" or equip == "INVTYPE_2HWEAPON" then + return 16 + elseif equip == "INVTYPE_SHIELD" then + return 17 + else + return nil + end +end +aura_env.skills = { + --Warrior + [1] = { + --Armor Skills + ["Cloth"] = 0, + ["Leather"] = 0, + ["Mail"] = 0, + ["Plate"] = 1, + ["Shields"] = 1, + --Weapon Skills + ["One-Handed Axes"] = 1, + ["Two-Handed Axes"] = 1, + ["Bows"] = 1, + ["Guns"] = 1, + ["One-Handed Maces"] = 1, + ["Two-Handed Maces"] = 1, + ["Polearms"] = 1, + ["One-Handed Swords"] = 1, + ["Two-Handed Swords"] = 1, + ["Warglaives"] = 1, + ["Staves"] = 1, + ["Fist Weapons"] = 1, + ["Daggers"] = 1, + ["Crossbows"] = 1, + ["Wands"] = 0, + }, + --Paladin + [2] = { + --Armor Skills + ["Cloth"] = 0, + ["Leather"] = 0, + ["Mail"] = 0, + ["Plate"] = 1, + ["Shields"] = 1, + --Weapon Skills + ["One-Handed Axes"] = 1, + ["Two-Handed Axes"] = 1, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 1, + ["Two-Handed Maces"] = 1, + ["Polearms"] = 1, + ["One-Handed Swords"] = 1, + ["Two-Handed Swords"] = 1, + ["Warglaives"] = 0, + ["Staves"] = 0, + ["Fist Weapons"] = 0, + ["Daggers"] = 0, + ["Crossbows"] = 0, + ["Wands"] = 0, + }, + --Hunter + [3] = { + --Armor Skills + ["Cloth"] = 0, + ["Leather"] = 0, + ["Mail"] = 1, + ["Plate"] = 0, + ["Shields"] = 0, + --Weapon Skills + ["One-Handed Axes"] = 1, + ["Two-Handed Axes"] = 1, + ["Bows"] = 1, + ["Guns"] = 1, + ["One-Handed Maces"] = 0, + ["Two-Handed Maces"] = 0, + ["Polearms"] = 1, + ["One-Handed Swords"] = 1, + ["Two-Handed Swords"] = 1, + ["Warglaives"] = 0, + ["Staves"] = 1, + ["Fist Weapons"] = 1, + ["Daggers"] = 1, + ["Crossbows"] = 1, + ["Wands"] = 0, + }, + --Rogue + [4] = { + --Armor Skills + ["Cloth"] = 0, + ["Leather"] = 1, + ["Mail"] = 0, + ["Plate"] = 0, + ["Shields"] = 0, + --Weapon Skills + ["One-Handed Axes"] = 1, + ["Two-Handed Axes"] = 0, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 1, + ["Two-Handed Maces"] = 0, + ["Polearms"] = 0, + ["One-Handed Swords"] = 1, + ["Two-Handed Swords"] = 0, + ["Warglaives"] = 0, + ["Staves"] = 0, + ["Fist Weapons"] = 1, + ["Daggers"] = 1, + ["Crossbows"] = 0, + ["Wands"] = 0, + }, + --Priest + [5] = { + --Armor Skills + ["Cloth"] = 1, + ["Leather"] = 0, + ["Mail"] = 0, + ["Plate"] = 0, + ["Shields"] = 0, + --Weapon Skills + ["One-Handed Axes"] = 0, + ["Two-Handed Axes"] = 0, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 1, + ["Two-Handed Maces"] = 0, + ["Polearms"] = 0, + ["One-Handed Swords"] = 0, + ["Two-Handed Swords"] = 0, + ["Warglaives"] = 0, + ["Staves"] = 1, + ["Fist Weapons"] = 0, + ["Daggers"] = 1, + ["Crossbows"] = 0, + ["Wands"] = 1, + }, + --Death Knight + [6] = { + --Armor Skills + ["Cloth"] = 0, + ["Leather"] = 0, + ["Mail"] = 0, + ["Plate"] = 1, + ["Shields"] = 0, + --Weapon Skills + ["One-Handed Axes"] = 1, + ["Two-Handed Axes"] = 1, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 1, + ["Two-Handed Maces"] = 1, + ["Polearms"] = 1, + ["One-Handed Swords"] = 1, + ["Two-Handed Swords"] = 1, + ["Warglaives"] = 0, + ["Staves"] = 0, + ["Fist Weapons"] = 0, + ["Daggers"] = 0, + ["Crossbows"] = 0, + ["Wands"] = 0, + }, + --Shaman + [7] = { + --Armor Skills + ["Cloth"] = 0, + ["Leather"] = 0, + ["Mail"] = 1, + ["Plate"] = 0, + ["Shields"] = 1, + --Weapon Skills + ["One-Handed Axes"] = 1, + ["Two-Handed Axes"] = 0, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 1, + ["Two-Handed Maces"] = 0, + ["Polearms"] = 0, + ["One-Handed Swords"] = 0, + ["Two-Handed Swords"] = 0, + ["Warglaives"] = 0, + ["Staves"] = 1, + ["Fist Weapons"] = 1, + ["Daggers"] = 1, + ["Crossbows"] = 0, + ["Wands"] = 0, + }, + --Mage + [8] = { + --Armor Skills + ["Cloth"] = 1, + ["Leather"] = 0, + ["Mail"] = 0, + ["Plate"] = 0, + ["Shields"] = 0, + --Weapon Skills + ["One-Handed Axes"] = 0, + ["Two-Handed Axes"] = 0, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 0, + ["Two-Handed Maces"] = 0, + ["Polearms"] = 0, + ["One-Handed Swords"] = 1, + ["Two-Handed Swords"] = 0, + ["Warglaives"] = 0, + ["Staves"] = 1, + ["Fist Weapons"] = 0, + ["Daggers"] = 1, + ["Crossbows"] = 0, + ["Wands"] = 1, + }, + --Warlock + [9] = { + --Armor Skills + ["Cloth"] = 1, + ["Leather"] = 0, + ["Mail"] = 0, + ["Plate"] = 0, + ["Shields"] = 0, + --Weapon Skills + ["One-Handed Axes"] = 0, + ["Two-Handed Axes"] = 0, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 0, + ["Two-Handed Maces"] = 0, + ["Polearms"] = 0, + ["One-Handed Swords"] = 1, + ["Two-Handed Swords"] = 0, + ["Warglaives"] = 0, + ["Staves"] = 1, + ["Fist Weapons"] = 0, + ["Daggers"] = 1, + ["Crossbows"] = 0, + ["Wands"] = 1, + }, + --Monk + [10] = { + --Armor Skills + ["Cloth"] = 0, + ["Leather"] = 1, + ["Mail"] = 0, + ["Plate"] = 1, + ["Shields"] = 1, + --Weapon Skills + ["One-Handed Axes"] = 1, + ["Two-Handed Axes"] = 0, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 1, + ["Two-Handed Maces"] = 0, + ["Polearms"] = 1, + ["One-Handed Swords"] = 1, + ["Two-Handed Swords"] = 0, + ["Warglaives"] = 0, + ["Staves"] = 1, + ["Fist Weapons"] = 1, + ["Daggers"] = 0, + ["Crossbows"] = 0, + ["Wands"] = 0, + }, + --Druid + [11] = { + --Armor Skills + ["Cloth"] = 0, + ["Leather"] = 1, + ["Mail"] = 0, + ["Plate"] = 0, + ["Shields"] = 0, + --Weapon Skills + ["One-Handed Axes"] = 0, + ["Two-Handed Axes"] = 0, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 1, + ["Two-Handed Maces"] = 0, + ["Polearms"] = 1, + ["One-Handed Swords"] = 0, + ["Two-Handed Swords"] = 0, + ["Warglaives"] = 0, + ["Staves"] = 1, + ["Fist Weapons"] = 1, + ["Daggers"] = 1, + ["Crossbows"] = 0, + ["Wands"] = 0, + }, + --Demon Hunter + [12] = { + --Armor Skills + ["Cloth"] = 0, + ["Leather"] = 1, + ["Mail"] = 0, + ["Plate"] = 0, + ["Shields"] = 0, + --Weapon Skills + ["One-Handed Axes"] = 1, + ["Two-Handed Axes"] = 0, + ["Bows"] = 0, + ["Guns"] = 0, + ["One-Handed Maces"] = 0, + ["Two-Handed Maces"] = 0, + ["Polearms"] = 0, + ["One-Handed Swords"] = 1, + ["Two-Handed Swords"] = 0, + ["Warglaives"] = 1, + ["Staves"] = 0, + ["Fist Weapons"] = 1, + ["Daggers"] = 0, + ["Crossbows"] = 0, + ["Wands"] = 0, + }, +} diff --git a/NewAge/Automation/LOOT_READY.lua b/NewAge/Automation/LOOT_READY.lua new file mode 100644 index 0000000..d4bb2e2 --- /dev/null +++ b/NewAge/Automation/LOOT_READY.lua @@ -0,0 +1,69 @@ +-- LOOT_READY LOOT_OPENED + +function(e, ...) + local slot = 1 + local lootinfo = GetLootInfo() + for k, v in pairs(lootinfo) do + if v.locked == false then + local link = GetLootSlotLink(slot) + if not link then link = GetLootSlotLink(slot) end + if aura_env.filter[1] == true and (v.item:match("%d+ Gold") or v.item:match("%d+ Silver") or v.item:match("%d+ Copper")) then + LootSlot(slot) + elseif aura_env.filter[2] == true and link:match("Azerite") then + LootSlot(slot) + elseif aura_env.filter[3] == true and v.item:match("War Resources") then + LootSlot(slot) + elseif aura_env.filter[4] == true and v.item:match("Residuum") then + LootSlot(slot) + elseif aura_env.filter[5] == true and v.item:match("Manapearl") then + LootSlot(slot) + end + if link then + local type = select(6, GetItemInfo(link)) or "" + local subtype = select(7, GetItemInfo(link)) or "" + local ilvl = select(4, GetItemInfo(link)) or 0 + local equip = select(9, GetItemInfo(link)) + if aura_env.filter[6] == true and (select(7, GetItemInfo(link)) or 0) == "Mount" then + LootSlot(slot) + elseif aura_env.filter[7] == true and ilvl > aura_env.ilvlFilter then + LootSlot(slot) + elseif aura_env.filter[8] == true and (select(7, GetItemInfo(link)) or 0) == "Herb" then + LootSlot(slot) + elseif aura_env.filter[9] == true and (select(7, GetItemInfo(link)) or 0) == "Cooking" then + LootSlot(slot) + elseif aura_env.filter[10] == true and (select(7, GetItemInfo(link)) or 0) == "Cloth" and type == "Tradeskill" then + LootSlot(slot) + elseif aura_env.filter[11] == true and (select(7, GetItemInfo(link)) or 0) == "Metal & Stone" then + LootSlot(slot) + elseif aura_env.filter[12] == true and (select(11, GetItemInfo(link)) or 0) > aura_env.goldFilter and v.quality == 0 then + LootSlot(slot) + elseif aura_env.filter[13] == true and v.quality > 1 and v.quality < 4 and type ~= "Weapon" and type ~= "Armor" then + LootSlot(slot) + elseif aura_env.filter[14] == true and v.isQuestItem == true then + LootSlot(slot) + elseif aura_env.filter[15] == true and v.quality == 0 then + LootSlot(slot) + elseif aura_env.filter[16] == true and aura_env.whitelist[v.item] then + LootSlot(slot) + elseif aura_env.filter[17] == true and type == "Quest" and subtype == "Quest" then + LootSlot(slot) + elseif aura_env.filter[21] == true and type == "Tradeskill" and subtype == "Elemental" then + LootSlot(slot) + else + if type == "Weapon" or type == "Armor" then + if aura_env.filter[18] == true and aura_env.skills[select(3, UnitClass("player"))][subtype] == 1 and v.quality > 2 then + LootSlot(slot) + elseif aura_env.filter[19] == true and (equip == "INVTYPE_FINGER" or equip == "INVTYPE_TRINKET" or equip == "INVTYPE_CLOAK" or equip == "INVTYPE_NECK") and v.quality > 2 then + LootSlot(slot) + end + elseif aura_env.filter[20] == true and type == "Miscellaneous" then + if subtype == "Mount" then + LootSlot(slot) + end + end + end + end + slot = slot + 1 + end + end +end \ No newline at end of file diff --git a/NewAge/CataAuraBar/CustomOptions.lua b/NewAge/CataAuraBar/CustomOptions.lua new file mode 100644 index 0000000..276c13d --- /dev/null +++ b/NewAge/CataAuraBar/CustomOptions.lua @@ -0,0 +1,20 @@ +{ + IsOnCooldown = { + type = "bool", + test = function(state, needle) + return state.IsOnCooldown == (needle == 1) + end, + }, + IsActive = { + type = "bool", + test = function(state, needle) + return state.IsActive == (needle == 1) + end, + }, + IsDebuff = { + type = "bool", + test = function(state, needle) + return state.IsBad == (needle == 1) + end, + }, +} \ No newline at end of file diff --git a/NewAge/CataAuraBar/CustomText.lua b/NewAge/CataAuraBar/CustomText.lua new file mode 100644 index 0000000..2240411 --- /dev/null +++ b/NewAge/CataAuraBar/CustomText.lua @@ -0,0 +1,11 @@ +function() + if aura_env.statee.pname then + output = "" + if aura_env.statee.pclass then + output = aura_env.GetClassColor(aura_env.statee.pclass) .. aura_env.statee.pname .. "\124r" + else + output = aura_env.statee.pname + end + return output + end +end \ No newline at end of file diff --git a/NewAge/CataAuraBar/Export b/NewAge/CataAuraBar/Export new file mode 100644 index 0000000..f200633 --- /dev/null +++ b/NewAge/CataAuraBar/Export @@ -0,0 +1 @@ +!WA:2!TVttxUXXXje8uKjKtS0AjMiAfNrq0maMGG7h0KumpgfaSaCx79lpalPOPjXoyMgaJ2bZmUNzWUGkRt0AfhLVUSx8PKd7HCWVCAZTCZ8yo1p(YpahDi)a4VGuv3Z3yWU7Zw0pNxcEKaZ0DvvxDvvxF0DV5U)CoYlvDXQln3O50Mt7ZVE9buR9KLx9ER05l6zr1i06kQ7QrTSTFJ6g6p9PkunPowwgU62093SFFhI7)Aj6eXtR8NVXRGFYDIIP6ql6ww6MU9A0CJonLpUVNHrdDQQbzh73WZHutacHUTPU7qQIQRULPZnLDCvOUfQRdTwOxF4hNHfo0LQpyaH6CPRq9F8NESgPNx)(DMytOR0CTTAT9A1DHxKv8OklEOJnXWyvnNcFHJxpYyIPBBaA99pPBJAT70TDNAYDQ7bdspBdLjeQSPYiItbzoO9wHOy4ome1TOeav52B1CT1oYZ0NfkCIQLH3iZ22kQK89OkA6EoF2x9ift9rk4S5MSFVwS3QUPLj5zefhsBxkXCG7Wx75AapIq0f5yQdr1YuZ5qegC(WUC9rk6MaUSlZ(wVg7kS)ewj4XVw6wKvm0hyYUWHulxo9YDmWYYKbOOSqDdlfTw1D0Fk5IYJ8aDwH6Gyr9ISRxqw1qXXbFQNRIbmfXhFEpFLDdldl63nF(8BLF(QFhQycr2bgM9etwzhvaR8Va0VeQPIX9HjbmMpSNWOz4XIFBQnGy)MT)rEkuIulWaq6bd1Djht5CiovFM2eqWRRc2DE2(y1gy4xv2qFKU7Rx3XI6YUmfSkqrEozhC8F7teqUQjy1L)laPh0VPBlWiYI2tU2YRUDBFqetLC5YL)zIgeMQx4WbuDnKdkkV8XUwQJfZGVY)KrrDnAnq)4iT0riqpqxZD4RFsFkyGaAqfxL8VqyF3cBcPrV2nKB2CJEaJ0xFqHf901ozPpQ9d3TuD5VVo55kEUa4BAZnXlCKcvDnUHWNDXJCig95RtQVwZwDogne0fGDIUzFlQWsQWHWkM1qjYW5uV0N)EhRda22YJQsE3xrwnqDL)yvphxRrDi77UFU713ZKVQQu5csWh9(s4AJUeZXvb5LlPQnA0l5oKyYba)y55A75kDxPIfdBlde5MpjXmb2HWFpIBdewUEOuMKPSu1QzZzq7f)HlS4nOr8cXWHCgdzmkeHMPw4ZuIRh10hXkPXd(wDxNcbib)N9A5yFf2fEMk43tZApt0QEN6Ogyh2BSXvyV5)n7T6je8Ni(HVS(eo98S1GVdAFOUgr2vFerJ9oSlXE3JBynQNIR0AwdyFt2Fm7j7N7BeQ1umm4KWPIePcilQkuJGrHu3kJL0nLSv0PorWvwsZkCwcZNHw7bYL(kXfzJRQouXCard6XL6rkex6W)kuESIIPMbPj6am2yuiMiKtae5cx7AsxN6zk9aIYU8fpvBRQyYX1PurUJZUBV1Y160SBJn3CTL38bBuSmhlnVr2symaeTsffEJlwrQyDdIJJU5ajR(sRRpyOBXYSlwq4q2X(7KjnL2EJv70T22Y1K2ATApSPCxWp)9A2PBJvQTX9AUm7BaE(gsu3L9US)a2FiBo2x)fcvZ9vO6k9GHC)C)hFcFoUQZMMn8v5GW6tcfHOYfxG0d6SyLOMjoOzyO6JlVQizsiGuSCcBwFXNWGl54CxPscmWhxOCCdyXqDqfFURgmmJjVC5SGX48ZvlZJk)YLRQROD(yPdysfort35J5JXyYIkMtSFtf(ZDebXx3sJKNDRh(IDje7Ay4rxz0L7q27lcFNmeC5ZoOmKyIJIlgGNmKv5B)5VJ975c(J7Y)s4rVRDx0jqxBkrvhd7K)Oqqw8BPUG9BWF1zOcyuefb7leTgeXOx9n70zZ1T)68MHymwyWcvE8Q61GxFHyi13NicI9Ppxe36HIyG5EgV)pgS)17pHDb75InQbW4JYh5)k7TOqggiC(qNS7J5Tffp6i)jTP7ZwVD9osODUoKneV5XWuVhMoyCk5pUVT97KHqt8aR3Z5nVhep)buf7dFG)dppC04zfU52DwB1nAAFPPOK6cbK6Y2FZzPCeVLZxxelJwMB0aH5Q8hzxEw0Wp7MUqcUeWDSH2Kec5aX2N)omR8mBq1VitOQzoS8mp2y2EFkB)Cmu7mnJkcvfovypfupS)c2NKJ9J5sF2Fj7VI9zS)A2HR9kSFcRxwsIfJq)NY(By)DWW(3MJ9P7W(7xG9pmH9pMR3qc689xWUwlwvmlr288VxG)9I8V)tzpM99)2WcHtaBFvQoprNddKpYgk0bK6CJMd3aIkxrc1pW3y7qe4vuCcCawa7x6As8FSe5DuaHgARo6y56scpmfeidn7)a65Vqmkb9mVeeQCbPsAK(kq6Vq(kwGNc59W1cV6)c7TK1nHmaOqQvldS9oSF2Rwh5F7pOjMwReVIGaMW568kk40ascuDxjhITcUixtQ3eWR1EOHn1FO(DwCxYKJ4ySMUJBDKuY84IGbpM53BFepHCeNDocZTJ36WddYXyh2AS1R)ulRr5y)U5yRiYlvEdYEslX(QONjQMv3bgw7n8y4bGrDuga(BEYZSPGjAPIBUX7vS8rqxIWBdz)(xH9Z3bsW49)3nSGK3d97kb50222q3TexAaVbXCRem7SOcpRcCePm1bJtIE4pimFehxkMpIdh5Qda7j1HjPxXsp6jfXe6cjmp7UhF1YftK2sSH4rVF8X7Qsl8yyqHHirkljsMJdPiHKutYTqPcV7sU43rPsTB8uPe9fNFeIZD5ml(oFomUC88dlui7SDJhCtKOBqA4ISNH4wfxMO4ou67zYZVjz(0(ZmEcWQTA14gl0CPAIeHXKGtsgkuYXPJFRw3QX8Zc)v8ql(tNa1QT8s3AXzqG1bRVth9LA14wnRpd03sXaQE28mMb342nQpRzaOGH8jolra(zgeq2AGh5mX)g382Za)2dvgPCgZG5N)wZV8YZGapqHcgT7E6u423623UzZztbQU1zOgBCZpO(nd4HadyXQfml8Wm3qxnXZodY6OIeUHjrPAzLinp8ZJkIquexOIpeLS3bHpbX7grGe54RfTqhng9lhRxJ(v72v3uJSpUAhEDQ62keMMh)jynNOC9P4wCzzlOPkCx5v4jIwon5m1nIi4b(sI6ko6Q(Id8N7asJWAtkxi0TsiC3jGlkLCqJ79e7Pcu6g(prOB(Jb7feuL3(26IN7OJ8B3qO5BM1Y(f5IuNpdRYLXXgh)c1L(X3fNwzAgKsFH8ogRnIELF8uAvHMnGp5A3qModaton4GNAMLbs(tro0(pNjyC5Mak(J8q8jH8GuwDj2YGaXWbjwaafIUUYKEej9r2gKrqfMsowqgi4UpHzaa5Vz56crHGO)8TQIBE)H(wl3dBzkRfoCXnwcb78ySqv01wNmcOia8gEJKfV3JarPIdNPxemBPqDNKfqiZk2dtSomBeSIbgmbd0FgNujmzsIgcy0(WigxFKterwXFXyS0d0HxxOchNyHwFjSQighdHP1JlwpR1hHSE0AIuu73UxzWddWbc5FEwitnbWflHXA)1F5vGgp4xq8g3Kj0ulPG(LGApAxJ(1sFh6G))xrF6kAFNOCXxG)tuccYpxcSehkBY0YvckqF3ks9HG5y(5s7nCsGhZqGNYRPzqpX9CMa8ZJ3ZKEUIO5z4G6gZ)s2)e(W)h1)0xYwCXszvCSptoTmxtLZ6lXSrBqjrM1PYh1LVtfrKx8UOOwSUzOAEcTuAOaJIaarpQcxuOWlwRIht3AFlO4)ItBg5Z6rjVIR8spS(vxeJCIeAMj5IsV58rUOvLZKKjx3NjzJStIYE3lHrrmteojkhy7Goro9YDG8aPtQiX1)NEzp4KrSEbrPkANY3PRzvDKamXSjnqdJ2eRyWgR10iW5poO8Ns3TV)Yy0YVLFJuEwSdQygljNAxycRfjYvpVPa2wWgCxNj2RMqITyfPXlgrVXtbv8Jdm95zDkhzy0rPfEkdPoLOzmfblFmGiNVJPiNPHFYZSldobefTrFTbuQuKibYKF(u6GAAA1C8n3txJCYd2lzCphFD85uzmBnkNytPfccfbJY4QbVKupLi6dhUKnLaA8iz954aMDvOPsJR6hxk5Pkfo1Fu4uaJJUB2HrtESPthHZ)0wZUtkHxj5S62MAnaaXPJ)jLXpH4mYBlMaB2HXNsMDwHWJVAUAgEqIjAXFYG95IU7cQ8PLkIq9OIZp5PPX2FdSWJMgFAAisTglBzym)mZca(5gkf36fdeHXheNPW5izKkrRNM1Q(mxt9LNda(9JsKPzmZHtXFqHzS8GdpF9reizSKy6vdN2kHzUk4uwbCES(ptl)PS6dLtsxDgOCw29Z0M)mThJhZdvKP798BiEqggERk4RFtA09)wmDqoqxnLTZyfdpcVaVen7A5cH5MQ5VSSkYuX)sWSiypWd1jZolKGRrbXGO6wAPkrOz23kMhJYjn6IfkDAZUPISEgdIp4LJN1UF(4nXCtphjKhp7FbgC7You9r8Rxi)kcwYh0uz1WBDzi9waRWd(0pn)IvkMoji)aBC6ltu0AgGEPqcvj(LprGL)fE50XArXM0GhQDX04huxySczUtuHLLoDcVK)U)eCyfjPTAKf6zqNBuMxM28f50lPVHyub9We8AQXk0iMBdJZ0OBzwqLTCrf)GqrlCrPGPq0)kfXR6)0QbJZ7rv5KUmOGAY4qyMrXzXRtAQkKeG4xNncX5R2n1Pkz7LyPwjuLZyXJq3MQIwH6cpe)7gb1J4a944AloeZyVPsDCAtN2cDgluHEM27r0P87p3sIug(HItf)bZLENboE9kv8jps6XxfVtHfNnm)qZlFgqGejnmzXVhe7cbeBVgXIIeoSM6MsecU4cexn8IJWV3ekx7P1U2pOY8x7dKsCDjc8(Xv58T2iUppKMB27JH(rd5OURi9(P4URg4blz7pkd4ES)Mzceo1nFi2LfnUYjvwjIcdL4vgQhvAy0GKOgrWIB8DccAwQ802CJVtyLTLYi)h)9CcPruOzGoaRYDBDUiEiEZEacO1V6dcpxQSgGyBdkEtK)AxH9ZhYEYZdUKpTA9EflZ(EVo7N9lyBCr2)8(52UP5apJ(49MDDLb6Qv8VVuveNBzfP5lu3akeZcV6Zt1vlQ1tb)V1nSS0YctWwhP8S6Fn8ASWHqoZ(VhvzSU7ePgupNHz0)6excyH0gkdmRUxwHUR0wGioluvmiJTW)sgW4667I3A6PaQbX0XJsI6X3jo0vBcE)M6d(z8CHXw0TyZwHUzBEYT(b9DAnWvr)hThi8X)Cbi7iRyypujpB7lDf2GBYEZ8ho2)AeFyWnHvMN9zEQiZxhaW)TVB(v(W)Rf4Fw5d)LZZ)K)qivwBc1Dc7HS7xG1MDH5g)F(r)pp \ No newline at end of file diff --git a/NewAge/CataAuraBar/INIT.lua b/NewAge/CataAuraBar/INIT.lua new file mode 100644 index 0000000..10f84c6 --- /dev/null +++ b/NewAge/CataAuraBar/INIT.lua @@ -0,0 +1,294 @@ +local function StrSplit(inputString, separator) + local outputTable = {} + for str in string.gmatch(inputString, "([^" .. separator .. "]+)") do + outputTable[#outputTable + 1] = str + end + return outputTable +end + +local function PrintTable(table) + for k, v in pairs(table) do + print(k .. " " .. v) + end +end + +aura_env.GetClassColor = function(class) + if class == "Death Knight" then + return "\124cFFC41E3A" + elseif class == "Druid" then + return "\124cFFFF7C0A" + elseif class == "Hunter" then + return "\124cFFAAD372" + elseif class == "Mage" then + return "\124cFF3FC7EB" + elseif class == "Paladin" then + return "\124cFFF48CBA" + elseif class == "Priest" then + return "\124cFFFFFFFF" + elseif class == "Rogue" then + return "\124cFFFFF468" + elseif class == "Shaman" then + return "\124cFF0070DD" + elseif class == "Warlock" then + return "\124cFF8788EE" + elseif class == "Warrior" then + return "\124cFFC69B6D" + end +end + +local Unit = { + New = function(self, unit) + o = { + ["unit"] = unit, + } + setmetatable(o, self) + self.__index = self + return o + end, + + GetAuras = function(self, auraFunc, name, type) return nil end, +} +local BasicUnit = Unit:New("player") +function BasicUnit:GetAuras(auraFunc, name) + local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc(self.unit, name) + if aura ~= nil then + return { + [UnitName(self.unit)] = { + ["duration"] = duration, + ["expirationTime"] = expirationTime, + ["spellID"] = spellID, + ["stacks"] = stacks or 1, + }, + } + else + return {} + end +end +-- Maybe implement some sort of throttle to group unit? +local GroupUnit = Unit:New("group") +function GroupUnit:GetAuras(auraFunc, name) + local raidMem = GetNumRaidMembers() + local num = GetNumPartyMembers() + local unitPrefix = "party" + if raidMem > num then + unitPrefix = "raid" + num = raidMem + end + auras = {} + for i = 1, num do + local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc(unitPrefix .. i, name) + if aura ~= nil then + auras[UnitName(unitPrefix .. i)] = { + ["duration"] = duration, + ["expirationTime"] = expirationTime, + ["spellID"] = spellID, + ["class"] = UnitClass(unitPrefix .. i) or "Paladin", + ["stacks"] = stacks or 1, + } + end + end + if unitPrefix == "party" then + local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc("player", name) + if aura ~= nil then + auras[UnitName("player")] = { + ["duration"] = duration, + ["expirationTime"] = expirationTime, + ["spellID"] = spellID, + ["class"] = UnitClass(unitPrefix .. i) or "Paladin", + ["stacks"] = stacks or 1, + } + end + end + return auras +end +-- Nameplate does not work, find out why? +local NameplateUnit = Unit:New("nameplate") +function NameplateUnit:GetAuras(auraFunc, name) + local unitPrefix = "nameplate" + auras = {} + for i = 1, 40 do + local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc(auraPrefix .. i, name) + if aura ~= nil then + auras[UnitName(unitPrefix .. i)] = { + ["duration"] = duration, + ["expirationTime"] = expirationTime, + ["spellID"] = spellID, + ["stacks"] = stacks or 1, + } + end + end + return auras +end + +local UnitFactory = { + New = function(self) + o = {} + setmetatable(o, self) + self.__index = self + return o + end, + + CreateUnit = function(self, target) + target = string.lower(target) + if target == "player" or target == "target" or target == "focus" then + return BasicUnit:New(target) + elseif target == "group" then + return GroupUnit:New(target) + elseif target == "nameplate" then + return NameplateUnit:New(target) + end + end, +} +local unitFactory = UnitFactory:New() + +local Aura = { + New = function(self, entry, index) + o = { + ["name"] = entry.auraName, + ["unit"] = entry.target, + ["hasCooldown"] = entry.hasCooldown, + ["index"] = index, + ["GetAura"] = entry.GetAura, + } + setmetatable(o, self) + self.__index = self + return o + end, + + IsActive = function(self) + for k, v in pairs(self.unit:GetAuras(self.GetAura, self.name)) do + for k2, v2 in pairs(v) do + end + return true + end + return false + end, + IsOnCooldown = function(self) + if not self.hasCooldown then return false end + return GetSpellCooldown(self.name) > 0 + end, + + AddAsAura = function(self, allstates) + local auras = self.unit:GetAuras(self.GetAura, self.name) + for k, v in pairs(auras) do + duration = v.duration + expirationTime = v.expirationTime + icon = self:GetAuraIcon(v.spellID) + allstates[self.name .. k] = { + changed = true, + show = true, + resort = true, + progressType = "timed", + duration = duration, + expirationTime = expirationTime, + index = self.index, + icon = icon, + pname = k, + stacks = v.stacks, + pclass = v.class, + IsOnCooldown = true, + IsActive = true, + IsBad = self.GetAura == UnitDebuff, + } + end + end, + AddAsCooldown = function(self, allstates) + if not self.hasCooldown then return false end + startTime, duration = GetSpellCooldown(self.name) + icon = self:GetSpellIcon() + allstates[self.name] = { + changed = true, + show = true, + resort = true, + progressType = "timed", + duration = duration, + expirationTime = startTime + duration, + index = self.index, + icon = icon, + IsOnCooldown = true, + IsActive = false, + IsBad = self.GetAura == UnitDebuff, + } + end, + AddAsIcon = function(self, allstates) + if not self.hasCooldown then return false end + icon = self:GetSpellIcon() + allstates[self.name] = { + changed = true, + show = true, + resort = true, + progressType = "static", + value = 1, + total = 1, + index = self.index, + icon = icon, + IsOnCooldown = false, + IsActive = false, + IsBad = self.GetAura == UnitDebuff, + } + end, + + GetSpellIcon = function(self) return select(3, GetSpellInfo(self.name)) end, + GetAuraIcon = function(self, spellID) return select(3, GetSpellInfo(spellID)) end, +} + +local Entry = { + New = function(self, entry) + entry = self:TrimWhitespace(entry) + + local entryData = StrSplit(entry, ",") + local name = self:ReadEntryData(entryData, 1) + local type = self:ReadEntryData(entryData, 2) or "Buff" + local target = unitFactory:CreateUnit(self:ReadEntryData(entryData, 3) or "Player") + local cooldown = (self:ReadEntryData(entryData, 4) == "0") or false + cooldown = not cooldown + local GetAura = UnitBuff + + if type == "Debuff" then GetAura = UnitDebuff end + + o = { + ["entry"] = entry, + ["auraName"] = name, + ["GetAura"] = GetAura, + ["target"] = target, + ["hasCooldown"] = cooldown, + } + setmetatable(o, self) + self.__index = self + return o + end, + + ReadEntryData = function(self, entryData, index) + local str = entryData[index] + if str == nil then return nil end + str = self:TrimWhitespace(str) + return str + end, + + TrimWhitespace = function(self, str) + str = str:gsub("^[ ]+", "") + str = str:gsub("\n$", "") + str = str:gsub("[ ]+$", "") + return str + end, +} + +aura_env.auras = {} +for entry in string.gmatch(aura_env.config.spellList, "([a-zA-Z,0-9 ]+)") do + entry = Entry:New(entry) + + auraObj = Aura:New(entry, #aura_env.auras + 1) + aura_env.auras[#aura_env.auras + 1] = auraObj +end + +aura_env.HandleEvent = function(allstates) + for k, v in ipairs(aura_env.auras) do + if v:IsActive() then + v:AddAsAura(allstates) + elseif v:IsOnCooldown() and not v:IsActive() then + v:AddAsCooldown(allstates) + elseif not v:IsOnCooldown() and not v:IsActive() then + v:AddAsIcon(allstates) + end + end +end diff --git a/NewAge/CataAuraBar/INIT_BFA.lua b/NewAge/CataAuraBar/INIT_BFA.lua new file mode 100644 index 0000000..787dfcc --- /dev/null +++ b/NewAge/CataAuraBar/INIT_BFA.lua @@ -0,0 +1,304 @@ +local function StrSplit(inputString, separator) + local outputTable = {} + for str in string.gmatch(inputString, "([^" .. separator .. "]+)") do + outputTable[#outputTable + 1] = str + end + return outputTable +end + +local function PrintTable(table) + for k, v in pairs(table) do + print(k .. " " .. v) + end +end + +local function GetAuraIndex(func, unit, name) + for i = 1, 40 do + local aura = func(unit, i) + if aura == "name" then return i end + if aura == nil then return 0 end + end + return 0 +end + +aura_env.GetClassColor = function(class) + if class == "Death Knight" then + return "\124cFFC41E3A" + elseif class == "Druid" then + return "\124cFFFF7C0A" + elseif class == "Hunter" then + return "\124cFFAAD372" + elseif class == "Mage" then + return "\124cFF3FC7EB" + elseif class == "Paladin" then + return "\124cFFF48CBA" + elseif class == "Priest" then + return "\124cFFFFFFFF" + elseif class == "Rogue" then + return "\124cFFFFF468" + elseif class == "Shaman" then + return "\124cFF0070DD" + elseif class == "Warlock" then + return "\124cFF8788EE" + elseif class == "Warrior" then + return "\124cFFC69B6D" + end +end + +local Unit = { + New = function(self, unit) + o = { + ["unit"] = unit, + } + setmetatable(o, self) + self.__index = self + return o + end, + + GetAuras = function(self, auraFunc, name, type) return nil end, +} +local BasicUnit = Unit:New("player") +function BasicUnit:GetAuras(auraFunc, name) + local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc(self.unit, name) + if aura ~= nil then + return { + [UnitName(self.unit)] = { + ["duration"] = duration, + ["expirationTime"] = expirationTime, + ["spellID"] = spellID, + ["stacks"] = stacks or 1, + }, + } + else + return {} + end +end +-- Maybe implement some sort of throttle to group unit? +local GroupUnit = Unit:New("group") +function GroupUnit:GetAuras(auraFunc, name) + local num = GetNumGroupMembers() + local unitPrefix = "party" + if IsInRaid() then unitPrefix = "raid" end + auras = {} + for i = 1, num do + -- local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc(unitPrefix .. i, name) + local auraIndex = GetAuraIndex(auraFunc, unitPrefix .. i, name) + if auraIndex > 0 then + local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = + auraFunc(unitPrefix .. i, auraIndex) + auras[UnitName(unitPrefix .. i)] = { + ["duration"] = duration, + ["expirationTime"] = expirationTime, + ["spellID"] = spellID, + ["class"] = UnitClass(unitPrefix .. i) or "Paladin", + ["stacks"] = stacks or 1, + } + end + end + if unitPrefix == "party" then + -- local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc("player", name) + local auraIndex = GetAuraIndex(auraFunc, "player", name) + if auraIndex > 0 then + local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc("player", auraIndex) + auras[UnitName("player")] = { + ["duration"] = duration, + ["expirationTime"] = expirationTime, + ["spellID"] = spellID, + ["class"] = UnitClass(unitPrefix .. i) or "Paladin", + ["stacks"] = stacks or 1, + } + end + end + return auras +end +-- Nameplate does not work, find out why? +local NameplateUnit = Unit:New("nameplate") +function NameplateUnit:GetAuras(auraFunc, name) + local unitPrefix = "nameplate" + auras = {} + for i = 1, 40 do + -- local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc(unitPrefix .. i, name) + local auraIndex = GetAuraIndex(auraFunc, unitPrefix .. i, name) + if auraIndex > 0 then + local aura, _, _, stacks, _, duration, expirationTime, _, _, _, spellID = auraFunc("player", auraIndex) + auras[UnitName(unitPrefix .. i)] = { + ["duration"] = duration, + ["expirationTime"] = expirationTime, + ["spellID"] = spellID, + ["stacks"] = stacks or 1, + } + end + end + return auras +end + +local UnitFactory = { + New = function(self) + o = {} + setmetatable(o, self) + self.__index = self + return o + end, + + CreateUnit = function(self, target) + target = string.lower(target) + if target == "player" or target == "target" or target == "focus" then + return BasicUnit:New(target) + elseif target == "group" then + return GroupUnit:New(target) + elseif target == "nameplate" then + return NameplateUnit:New(target) + end + end, +} +local unitFactory = UnitFactory:New() + +local Aura = { + New = function(self, entry, index) + o = { + ["name"] = entry.auraName, + ["unit"] = entry.target, + ["hasCooldown"] = entry.hasCooldown, + ["index"] = index, + ["GetAura"] = entry.GetAura, + } + setmetatable(o, self) + self.__index = self + return o + end, + + IsActive = function(self) + for k, v in pairs(self.unit:GetAuras(self.GetAura, self.name)) do + return true + end + return false + end, + IsOnCooldown = function(self) + if not self.hasCooldown then return false end + return GetSpellCooldown(self.name) > 0 + end, + + AddAsAura = function(self, allstates) + local auras = self.unit:GetAuras(self.GetAura, self.name) + for k, v in pairs(auras) do + duration = v.duration + expirationTime = v.expirationTime + icon = self:GetAuraIcon(v.spellID) + allstates[self.name .. k] = { + changed = true, + show = true, + resort = true, + progressType = "timed", + duration = duration, + expirationTime = expirationTime, + index = self.index, + icon = icon, + pname = k, + stacks = v.stacks, + pclass = v.class, + IsOnCooldown = true, + IsActive = true, + IsBad = self.GetAura == UnitDebuff, + } + end + end, + AddAsCooldown = function(self, allstates) + if not self.hasCooldown then return false end + startTime, duration = GetSpellCooldown(self.name) + icon = self:GetSpellIcon() + allstates[self.name] = { + changed = true, + show = true, + resort = true, + progressType = "timed", + duration = duration, + expirationTime = startTime + duration, + index = self.index, + icon = icon, + IsOnCooldown = true, + IsActive = false, + IsBad = self.GetAura == UnitDebuff, + } + end, + AddAsIcon = function(self, allstates) + if not self.hasCooldown then return false end + icon = self:GetSpellIcon() + allstates[self.name] = { + changed = true, + show = true, + resort = true, + progressType = "static", + value = 1, + total = 1, + index = self.index, + icon = icon, + IsOnCooldown = false, + IsActive = false, + IsBad = self.GetAura == UnitDebuff, + } + end, + + GetSpellIcon = function(self) return select(3, GetSpellInfo(self.name)) end, + GetAuraIcon = function(self, spellID) return select(3, GetSpellInfo(spellID)) end, +} + +local Entry = { + New = function(self, entry) + entry = self:TrimWhitespace(entry) + + local entryData = StrSplit(entry, ",") + local name = self:ReadEntryData(entryData, 1) + local type = self:ReadEntryData(entryData, 2) or "Buff" + local target = unitFactory:CreateUnit(self:ReadEntryData(entryData, 3) or "Player") + local cooldown = (self:ReadEntryData(entryData, 4) == "0") or false + cooldown = not cooldown + local GetAura = UnitBuff + + if type == "Debuff" then GetAura = UnitDebuff end + + o = { + ["entry"] = entry, + ["auraName"] = name, + ["GetAura"] = GetAura, + ["target"] = target, + ["hasCooldown"] = cooldown, + } + setmetatable(o, self) + self.__index = self + return o + end, + + ReadEntryData = function(self, entryData, index) + local str = entryData[index] + if str == nil then return nil end + str = self:TrimWhitespace(str) + return str + end, + + TrimWhitespace = function(self, str) + str = str:gsub("^[ ]+", "") + str = str:gsub("\n$", "") + str = str:gsub("[ ]+$", "") + return str + end, +} + +aura_env.auras = {} +for entry in string.gmatch(aura_env.config.spellList, "([a-zA-Z,0-9 ]+)") do + entry = Entry:New(entry) + + auraObj = Aura:New(entry, #aura_env.auras + 1) + aura_env.auras[#aura_env.auras + 1] = auraObj +end + +aura_env.HandleEvent = function(allstates) + for k, v in ipairs(aura_env.auras) do + if v:IsActive() then + v:AddAsAura(allstates) + elseif v:IsOnCooldown() and not v:IsActive() then + v:AddAsCooldown(allstates) + elseif not v:IsOnCooldown() and not v:IsActive() then + v:AddAsIcon(allstates) + end + end +end diff --git a/NewAge/CataAuraBar/README.md b/NewAge/CataAuraBar/README.md new file mode 100644 index 0000000..4d6179b --- /dev/null +++ b/NewAge/CataAuraBar/README.md @@ -0,0 +1,11 @@ +## While aura is active show aura + +## While aura is inactive and off cooldown show icon + +## While aura is inactive and on cooldown show cooldown + +## Use tsu + +### ACTIONBAR_UPDATE_COOLDOWN when anything on bar goes on cooldown + +### UNIT_AURA with one argument which is unit when aura fades/gets applied \ No newline at end of file diff --git a/NewAge/CataAuraBar/TSU.lua b/NewAge/CataAuraBar/TSU.lua new file mode 100644 index 0000000..932438c --- /dev/null +++ b/NewAge/CataAuraBar/TSU.lua @@ -0,0 +1,12 @@ +function(allstates, e, ...) + for _,v in pairs(allstates) do + v.show = false + v.changed = true + end + + aura_env.HandleEvent(allstates) + return true +end + +-- /run WeakAuras.ScanEvents("SPELL_UPDATE_COOLDOWN") +-- /dump UnitAura("player", "Blessing of Might") \ No newline at end of file diff --git a/NewAge/DHRogueSniffer/sniffer.lua b/NewAge/DHRogueSniffer/sniffer.lua new file mode 100644 index 0000000..7402cec --- /dev/null +++ b/NewAge/DHRogueSniffer/sniffer.lua @@ -0,0 +1,53 @@ +-- PLAYER_TARGET_CHANGED +function(e) + local hasEyes = UnitBuff("player", "Spectral Sight") -- Spectral Sight + if not hasEyes then + --print("Player has no Spectral Sight") + return + end + + local unitUuid = UnitGUID("target") + if not unitUuid then + --print(string.format("Target has no UUID: %s", tostring(unitUuid))) + return + end + --print(string.format("Target UUID: %s", tostring(unitUuid))) + + if not string.find(unitUuid, "Player") then + --print(string.format("Target %s is not a player", tostring(unitUuid))) + return + end + + local targetStealth = UnitBuff("target", "Stealth") + if not targetStealth then + --print("Target has no Stealth") + return + end + --print(string.format("Target Stealth: %s", tostring(targetStealth))) + + local targetName = UnitName("target") + if not targetName then + --print("Target has no name") + return + end + --print(string.format("Target Name: %s", tostring(targetName))) + + local pvp = UnitIsPVP("target") + local pvpState = pvp == true and "ON" or "OFF" + + local low, high = WeakAuras.GetRange("target") + local key = string.format("%s-%s-%s-%s", unitUuid, targetName, low, high) + --print(string.format("Key: %s", tostring(key))) + --print(string.format("Previous Key: %s", tostring(aura_env.previousTarget))) + if not aura_env.previousTarget then aura_env.previousTarget = key end + if aura_env.previousTarget == key then + --print(string.format("Target same as previous target: %s", tostring(key))) + return + end + + local message = + string.format("I see %s in stealth with pvp %s between %d and %d yards away", targetName, pvpState, low, high) + --print(string.format("Sending message: %s", tostring(message))) + SendChatMessage(message, "RAID") + aura_env.previousTarget = key +end diff --git a/NewAge/DamageIntake/export b/NewAge/DamageIntake/export new file mode 100644 index 0000000..f6f9cfa --- /dev/null +++ b/NewAge/DamageIntake/export @@ -0,0 +1 @@ +!LZtdtnoUs(FHQEvb1YKjFraU629UesgMWbbU4Wo7(M3MehBLe9WXoR)iaZEd)2VUBjzl)rCcWCxvxDVzNbJTuRw93DRwVX1gpASrWyJ6vQ1QsJXgRgByJ)h82f(Epo24(7gBmZZ3M53X06bBFV1Jn64W)23m9TFz6ippNqo8Qhnx41Vlm)RE(Mo38L)S6yJNUD(8aw44bF40QWV(S6xpb(ftxRLE(35XDdhBCrVbJ6nCSX8ihNl4(woSXDgBaRUXAtl24b1gBe57m2yzy46G)Lp(rCTQW9(y8A9XZbiAfY9CdOTtOPFi8aa65CxEWsXZWJI3cph6ZxSG5JdFarcKVaF0MnlA(8rpVMn24Z9U(UpD)1W3PF1mY3SoSaRzoo9TdeWniAgBdZn0aMf)PXgtUOTXOjgJApeaMR5kMCCr46BS2X8zyDmOPalaZ0jCzcqUZNraX4UExFTywjOwOa5T8CIw5MqC8nT5rbJhuhjZrbSR5RGvAgGUo8fUj0xBwG1yJU8aehcEzQ5ltNz6)Y0qZzoSxMYDFzQL3QzMHVm1HheYDxGVeEf9KT5kZfWWM9mmdGA8Y0ddEe(YXWRCymB4NeDb(jl06Okihm0ezkJha41gGAtpFoTzhYwizxHedJ2H44cyoZLYfDUD0OBVzSHJNjjqcBTjwoMbb4El00bjGWRxfbIGkglGcw5EPys5gk)BSSVehCuqO3kdpFu8jYLeRo0e3Lh9YvVmv8hFwyKpqVqbIjm3nvSwYDSXNc(QzfBZqZ(U2SN(JkWwlKvzJPteqW(x)5INXSTnJRyUG24mPI3fEoE(cjw8)Qt)Bd6FBc0UkNiKYdz(UMo)QIEFsduDJVcGkQwj0L77sQIGWtGfqiPNm9TUM5UaKgh0Ovv1irAT4PE2lavaJ)mY0h2lFcuwFz6xwYbWA4tCtHkJ9ZGmp3cSEeTwnvdKudiSHdjAo4eGzYHDwK9PdUD0gVRSFevUcbBc3UomrWyHp3wa1HGTL5(GYeOPc0kcHTGXfA6g(jq3himgdB3T)9gKHRO19TWnFRMNuVEdfAOSa1efZwTbvdRvPALZaPjpRyb0tR2avKq8RRuMVVBO5dawe4f5dkDg8vRj5de)(c3gjzNOmQ9jelfiTXfd71BaonCWUEUmcPNZxi2EcSsNTwLyRvj2AvITwJevba85NNHuduxvQ1imauLGPnxJSXDN75VsO7rVqW)f)AS5rdMzasov8CLrobEAdYP4mMiEzadxKaXKgLmoa4Rm5U)abxSj7FqauOuhBO3d4ZO5p1lsuMKu9k1Q1406N088Q1oVv1ZIzcWqkA0Nw70wnpT6jNDw9gGQMA0c(J)dcrUFJytL5JSQYWZi2tWC1Cx2SsTZR2806TQw)SMnRVfFN0Inu3GBQ3CJNnqrAF)OB)H6lvIZJn(Wh(a6RaecnDE5QyBCZbtKGnV)67AVt4h5ZGdgp)NZ)5LIpCrKpW4dZ)DH)ZlVVFx6B3dRj(lhEG4dhCK2ybZ(Hx4WmDJwtdUA(15lCxBVhPVwt)ZwIP1hTMc2Ifdq77OuxGa7s8ky8L(dUKE5b0Jt62(M2x27GJ1gc6xxoe8XcgYW2dUSNyi0JfmKU3oshg31By)B72)IcgzVb)QyKWd9hE7GBa5L2fTQDUUxpbj9a6r8BFpfTCgZjip)q8(VMMWuH2()HehXOeoy3tb3kQPGbsS7PqKh5ugA6UGzV75aKo5mUXCb3cOLEJ29SaQNCw9C3W99CxbcN7EAeLuoXoyqs6tHIwYa0L9CYkiD3N)DJ(x0wiOuldNGdw6(wEgb96s4dNC25vBD2oNqcxOwJZR160t31m0yc1ACsT67CjI5a1AuV65NSRHht6R340toRXUgUgjVw1gnAEAtGSEfyEc)70HuCBGySWAb8GLYqZkZNEz6skCCX41SIvzbl8gZNebRtWooYWJscgeTfjgcmwndstHO4qKOaaYdZcTyzahpl0UZQKrvn5JG)9xMobck1CLxeI9yW7Rn5(bhUflPaAy7Laa1F0aV6XFkgQXJwSbYe7RC8xvWUJh0ZfduXo9Uty6h9oNFFY0MqY4GFvpMznHA4TW6Qfonfxvfbyito53SirBxWwyFUmyJQTVjytwTlbYD9cFtWLSXxcCbtwVj4kDjucKjBA5Lmu8sLOHs77ILmRhaDo(CifYLWIUGd58cV)67HjTHud5W3Hq8TEaLfOCnxIVcxFbq(3vRYm0WzonvEWiXS7Trf)WEj)bXhBjvTnDcyzu1EG98XI0Ehar3xO6grZ2IwgUHZsStawAcSU6tkmgjzU6iAOpMuzkDtjbpVQkoNCSdthRihiVWaj7qzmXBEs6(yIpaeM77TIQyGoldIWe2aqesqQ)SWmSh3OvZGVKJbbtkGPsSsN7GeeGixPsL8ChbMbFfdF)bovLHaY15X4Umam1rvGygm(hONmNbjnnJE0YhIlfad84chi6zrrlS8JcwkmtCLoFkChMDiUqoom5CP3L3FD7HY4anYpO)NCxGKYaMdZk8WA1ZrgHytyWMlhgfwUDWcTAS15icC91nh0M4RBgcRsVU5GwiJNrXmW)3I3CsEEtX6SkFWzuAJJGH0ydIwTY0N)ncleo85KcJs9LtvUqSRayI1SrueJG9uDfcurgbHmLTIuDZRWAxyeljMZa0vwuS3AKlYqfO4vKvlBhuu7ciMwE(2IsH6YEmHSjDgrwMD9c5Z5XgjzUl4USkziFB8425jEM22cYLyHst0aMHbwRVa0ZcFfsssrFe)YrPTobitcwMqsfs9vv(isCeBN18gbGTqP)AY6)hkqTxdvS2zwnK(aeGmu2qpTyUvIaRwXS5aPW55KPVVl8EnUFkgb2kcUuvrcFjVkWtYXJ)IG1dIRCrymWoiATMHf0NDfUBaZp8WIR3XXyAEe3w4bplBpt4VjAj)Ccf87hLDtWD34Hk5uPJrCYg)zEkjirk(wBPOxIm4rX6gsfyLykkX4VY0bSXCiHlzeiL43VaPBXoFBgxvYJbH(G9WkIQtE4b)Tk1N35GKn5hjGK3TvQfP1ByrUj7I0AhlsJ3WI8q2fPrMfz7qRi7xzmvDpX4IT7l40YtUXtfpTLJhkF(ihZsLEJMUxLcIFMz6M3QvAzKTy06O0IGAzRMKK82YGU80Clmn5dZj0B5ZiSBTV3cW)CG8WS8LM0t74HB)073Jt8E)Ra4(JS1Sj7FSwsvKkos9J3(qdwklbPebF5)cnOwYeCnLgqYw)jeXkzEkAvSPMdqbjU1bLmNedq0tLmsBXjlsJnRrJsMwOxOSaRcHGYgQcVj(5whgwyO0KhrPI2b1rDKc0uBuYanJc9wYTzLXB)Er5iSgmAeEyA5OksY2UJiKY3tZUqIQS0oWFPx1zrjWQd7JP6vAw4S(7P14bvqRur5HbrUFb6j9LRn4)675gKRu((sw4iWLxELzoKejPnlItTOizltX2B2)Sq16u(Elj3Cc)(abNkcNZ)s(aluhvqXogY5Sn1ANyXWLxqXJk27qkceHLX6GtPZLrzPVAjQcQq(sXN(kUrliyVDmi9W82MvVDcHDmIFcniisg5q8JzJ5OWsswqKNYGGsI1uxMkJ)2FeL4zBHHQayrBETVHyq1YJa4sMlPKaE6cE2fyyH4XxKkJLa5EXKm1VgvLInk)iXH9ehVome8q8HH4UFzYi822fs385UAM5lnUGFuvoR4sJPa5r7Tgz(eYsLdwSXjn89yQ2zlR4dzc6T6WThqZr7Lik9pJnS9Mip40o7r7ij9kn2Ow(2esytFIXN7376Uuh(eEFQ2msSotqVvjNwRSfn6QGCNT00tAnVK4u2vaiYv2(sOXs74vrEu8ibvO(LV5OY28us4CHSVJU2BrYQKKcsk(eBtQsOSlxmOe0HFHz(qBy7guPFGSdtUfK9b(wwPNYf6luopT)5m2JOLNTrKG(bxC7nDApAY13E5KE)AVbJMC)Gp1)6r9g2R7b5qLpSV)V0w(eRbqlV9Y3fSKewKfdS0vRZwFIjf8xuaepo(T85Sh5jWfZA3EPP1dIQeeWW6lJ2WP(llqve6v452IywxVrPZf9WS1yFlNpUSWoPXg9Wf1(sf1zXwODMmzUxEPklWlf7jmPhMPVZZYQpB6dgwehdYa88IOS4eAZYICIVqFDJhQpZHTXu)C7eefjprMxrHDsbc40vgk3rPOFwefslKQbLTDPTwC1RMR5D(GLC880ZwfXKOk3YriCykrY0fwfxrvXCsvdkZ1RDariY2YvVw3eGHMsRux6y5EJ6WFAy7BGq1V)UUTh17DbnseqfFBXDgJESUz67Lcz0BT)AWL5QT56TKCmo8OTpTskyvo)SXpuqgtk3kXo9m0pcF4pBV3othr3XLvxJJ1wt1kIXrGo(erOb(62UpGJLC(jcgVOLxf1RNCRpdGjEgQX(nXVh70Vt2EmwS()QPphdzcwATYveNk9FLlIPRklX(duz6HY(fv3GWKAlqh5rrJHI)oyxvq5RP7IkzF00ocDo0omemnvwDl(A6gSsVZIEz6N5HLp3uDELElg9Aw6S(DsJdkc5TukVyqlLdZc7GR8DLKPt5Gr0DxPAkPYlFb843Z2j65IrtVpyehGoQnkIUfBNWnSrIjtDI4GpuRk1gHwEUtSkTTMRT1MAgBlASvFDTlVdALngTwJLNQPjL9VBTZfOJHOfFbmu(9B4((EuBqdkAMHO5dg1C9zAxzzG7u7BQyTuJmWDxOIFg7aFF(AP9hpiSySXOnCqN(JnEuGj1vnBQCsHElw4a)eYKc07t6VL4juteP(ydDvJaY4qxSL)PW7NBg5ekEeVfagl9ICSvN7p2CfyR(7eHf1IARFmfXfMC3aW58ZEr)Bis1OCKcfRZJu0RFhyJQRsfHRPC2s4tZsXNUEHBbBs098I19EhKlD8sbsmQzchpPuCe0BZJJPuMv46Bh)yPbNg9RvP4gzBip2j65N3nwntaMeSjDht)7IEyw)IIivWIVioZm9Na)nJ2cmLeddzeAHVn3ZNL8TMkv2j0)ionNjUYhuTAE8agB83KUcLVmyPPT3J7rd8lgDIfirNytVflMm2C(wcdrKsS8tqgZm19lOvtvNF)7A9monS)jylMp)5e7A0fVHj6K8b3oOxb7X1X7Xo8fdOYTLAp9BQfPMgXtqdkawZ4lMiQzxmyBpBMpBdEOUcOhiN4EyTxcBKo17P145v8ygkEmjaTslOIftAs1R8d7F5Nv87hHW6)IV56XgFj(P41vugKBVF019lK4zvBRuVn8a(mXfyRa6eAvycSJS4c3y10wuXDKPwmB(3YUxYGb7fnp2a0Rrg39)ZjDxGa6Rto7cpxBMBaArQJhAY6WNUy0pD0oe6E1crPeh7pyqVHtUU3NgTDnV9w4irUtzxxC5IMeiMz8VlMpg9KVUjtXD9sniRDZZLJutEx(g22VMyYr4fJ7Kv)Lm(ILOrCC35SEP4YDPU0FzVLEgGpIWNX1lWc8t5Z9WNjHyzXu99OBifmtxYL2O2d(p0Mp9RYHIPpHLY0VKBuiDRdPYtsl6(F)c)gGtyDonIDTbUoDTLxfNUDjq32gLVz2mBilskSY)F9v1k3nSddjhP7PUIBIibezcRvSCuSbVEY)8pp2GYWeed1sGeFPityj6HCo6q6tGPyAsb)kNkVeyNEwZgGUhPhuPwYRACAd1DglZlvAjItHbKxr9nHLuXnsteYYETf0YITOTGd39bioToVPntJI2mNDs1ZpRAJZRx7KwN1AF2mnEDBMm5f)o2vYTXz1pTzms3kRD(TJ3n3x8UOCVFpmJgAxAW6NR5Ek)N29U4K9DxOxuJ3o2xtj7GshkcFtj2xTvgwXUr)w7l6tvU49J3T0eURFQeVBUhyAO2Bk4QGQDDDx55fU8ozZ2q1LlLLEWi8S0xAAz(muvfihA6xxEQkjb0j4jIwi(oeRLPBN0PT1jDw5Dsx5Go65F2j2)0N52quqG0(n3n63vVt6DULmCKiFuDWzZ99HqLCmDFOK798388wHe36N96UW1IRB9iJ7FzADjAGeSS3)Bv9soRA8161YHVghknNl2NclHybvph6cPZp)Cp))ZO)S(67by6ZXCMfvR5Z3oS)F)wu9hCOjscKUI5gfCDRPvFKIyr1sFUPf7FCHj9)Rk0X0)FCF)pK8BFWG2IKe2gmmV6iYn()o \ No newline at end of file diff --git a/NewAge/DamageIntake/init.lua b/NewAge/DamageIntake/init.lua new file mode 100644 index 0000000..75e126d --- /dev/null +++ b/NewAge/DamageIntake/init.lua @@ -0,0 +1,198 @@ +--- initial +aura_env.fn = {} +aura_env.damageHistory = {} +aura_env.historyCurrent = {} +aura_env.playerGUID = UnitGUID("player") +aura_env.lastCleanup = 0 +aura_env.historyWindow = 10 +aura_env.cleanupInterval = 1 +aura_env.types = { + SWING = "SWING_DAMAGE", + SPELL = "SPELL_DAMAGE", + RANGE = "RANGE_DAMAGE", + DOT = "SPELL_PERIODIC_DAMAGE", + ENV = "ENVIRONMENTAL_DAMAGE", + BLEED = "BLEED", +} +aura_env.labels = {} +aura_env.labels[aura_env.types.SWING] = "Swing" +aura_env.labels[aura_env.types.SPELL] = "Spell" +aura_env.labels[aura_env.types.RANGE] = "Ranged" +aura_env.labels[aura_env.types.DOT] = "Magic DoT" +aura_env.labels[aura_env.types.ENV] = "Environment" +aura_env.labels[aura_env.types.BLEED] = "Bleed" +aura_env.spellSchool = { + PHYSICAL = 1, +} +aura_env.iconz = {} +aura_env.iconz[aura_env.types.SWING] = 589068 +aura_env.iconz[aura_env.types.SPELL] = 1391677 +aura_env.iconz[aura_env.types.RANGE] = 135128 +aura_env.iconz[aura_env.types.DOT] = 132095 +aura_env.iconz[aura_env.types.ENV] = 237583 +aura_env.iconz[aura_env.types.BLEED] = 1033474 + +-- +-- Returns players current max health +-- +aura_env.fn.getMaxHealth = function() return UnitHealthMax("player") end + +aura_env.fn.getMaxHit = function() + local maxHit = 0 + for _, amount in pairs(aura_env.historyCurrent) do + maxHit = maxHit + amount + end + return maxHit +end + +aura_env.fn.isEnabled = function(damageType) + local enabled = damageType == aura_env.types.SWING and aura_env.config.enableSwing + or damageType == aura_env.types.SPELL and aura_env.config.enableSpell + or damageType == aura_env.types.DOT and aura_env.config.enableDot + or damageType == aura_env.types.ENV and aura_env.config.enableEnv + or damageType == aura_env.types.BLEED and aura_env.config.enableBleed + return enabled +end + +-- +-- Checks if the given CLU event is tracked by this aura +-- @return bool +-- +aura_env.fn.isTrackedEvent = function(damageType) + local match = false + for key, typeName in pairs(aura_env.types) do + if damageType == typeName and aura_env.fn.isEnabled(damageType) then match = true end + end + + return match +end + +-- +-- Calculates the amount of damage taken from a given CLU parameter set +-- @return number +-- +aura_env.fn.parseDamage = function(type, ...) + local amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing + + if type == aura_env.types.SWING then + -- REGULAR SWINGS + amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = select(12, ...) + elseif + type == aura_env.types.SPELL + or type == aura_env.types.RANGE + or type == aura_env.types.DOT + or type == aura_env.types.BLEED + or type == aura_env.types.ENV + then + amount, overkill, school, resisted, blocked, absorbed, critical, glancing, crushing = select(15, ...) + end + + return amount +end + +-- +-- Returns the summarized, historical damage intake over all sources +-- @return number +-- +aura_env.fn.getCurrentHistoryDamage = function() + local d = 0 + for damageType, value in pairs(aura_env.historyCurrent) do + d = d + value + end + + return d +end + +-- +-- Records a new damage event and notifies the engine. +-- @return void +-- +aura_env.fn.addDamageRecord = function(allStates, time, damageType, damage) + if not damage or damage == 0 then return end + + if not aura_env.historyCurrent[damageType] then aura_env.historyCurrent[damageType] = 0 end + + -- add new damage to current value immediately + aura_env.historyCurrent[damageType] = aura_env.historyCurrent[damageType] + damage + + -- add new history record so the history engine picks it up + table.insert(aura_env.damageHistory, { time = time, damageType = damageType, value = damage }) + + -- invoke state update + aura_env.fn.updateAllState(allStates) +end + +local function normalize(value) + if value > 1e9 then + return string.format("%.2fB", value / 1e9) + elseif value > 1e6 then + return string.format("%.2fM", value / 1e6) + elseif value > 1e3 then + return string.format("%.2fk", value / 1e3) + else + return value + end +end + +-- +-- Updates the state table of the clone with the new damage. +-- @return boolean +-- +aura_env.fn.updateAllState = function(allStates) + -- local maxHealth = aura_env.fn.getMaxHealth() + local maxHit = aura_env.fn.getMaxHit() + + -- create progress bar records + for idx, value in pairs(aura_env.historyCurrent) do + allStates[idx] = { + changed = true, + show = value ~= 0, + name = aura_env.labels[idx], + progressType = "static", + value = value, + display = normalize(value), + total = maxHit, + type = idx, + icon = aura_env.iconz[idx], + duration = 3, + autohide = true, + } + --print(allStates[idx].display) + end + + return true +end + +-- @return table {SWING_DAMAGE = 123, SPELL_DAMAGE = 0} +aura_env.fn.calcCurrentHistoricalDamage = function() + local currentDamage = {} + local now = GetTime() + + -- iterate over historical damage records + for idx, obj in pairs(aura_env.damageHistory) do + if now - obj.time > aura_env.historyWindow then + aura_env.damageHistory[idx] = nil + else + -- if no value, start with 0 + if not currentDamage[obj.damageType] then currentDamage[obj.damageType] = 0 end + currentDamage[obj.damageType] = currentDamage[obj.damageType] + tonumber(obj.value) + end + end + + -- update current historical value + for key, typeName in pairs(aura_env.types) do + aura_env.historyCurrent[typeName] = currentDamage[typeName] or 0 + end +end + +-- +-- Generates synthetic damage events for a proper display when options are open. +-- @return void +-- +aura_env.fn.createDummyDisplay = function(allStates) + for key, typeName in pairs(aura_env.types) do + if aura_env.fn.isEnabled(typeName) then + aura_env.fn.addDamageRecord(allStates, GetTime(), typeName, math.random(aura_env.fn.getMaxHealth())) + end + end +end diff --git a/NewAge/DamageIntake/trigger.lua b/NewAge/DamageIntake/trigger.lua new file mode 100644 index 0000000..bfd2b79 --- /dev/null +++ b/NewAge/DamageIntake/trigger.lua @@ -0,0 +1,41 @@ +-- COMBAT_LOG_EVENT_UNFILTERED, FRAME_UPDATE +function (allStates, ev, ...) + local now = GetTime() + + if (WeakAuras.IsOptionsOpen()) then + aura_env.fn.createDummyDisplay(allStates) + return true + end + + if (ev == "COMBAT_LOG_EVENT_UNFILTERED") then + ----------------------------------------- + -- COMBAT LOG + ----------------------------------------- + local timestamp, damageType, _, _, _, _, _, destGUID, _, _, _, _, _, spellSchool = ... + + -- hack to separate bleeds from magical DoT + if (damageType == "SPELL_PERIODIC_DAMAGE" and spellSchool == aura_env.spellSchool.PHYSICAL) then + damageType = aura_env.types.BLEED + end + + -- exit early if target is NOT the player or the damageType is NOT relevant + if (destGUID ~= aura_env.playerGUID or not aura_env.fn.isTrackedEvent(damageType)) then + return + end + + -- get damage of current "hit" + local damage = aura_env.fn.parseDamage(damageType, ...) + -- record new damage application + aura_env.fn.addDamageRecord(allStates, now, damageType, damage) + else + ----------------------------------------- + -- FRAME UPDATE + ----------------------------------------- + if (now - aura_env.lastCleanup > aura_env.cleanupInterval) then + aura_env.lastCleanup = now + aura_env.fn.calcCurrentHistoricalDamage() + aura_env.fn.updateAllState(allStates) + end + end + return true +end \ No newline at end of file diff --git a/NewAge/DamageIntake/vars.lua b/NewAge/DamageIntake/vars.lua new file mode 100644 index 0000000..359e9d0 --- /dev/null +++ b/NewAge/DamageIntake/vars.lua @@ -0,0 +1,15 @@ +{ + type = { + display = "Damage Type", + type = "select", + values = { + ["SWING_DAMAGE"] = "Auto Attack", + ["SPELL_DAMAGE"] = "Spell Hit", + ["RANGE_DAMAGE"] = "Range Attack", + ["SPELL_PERIODIC_DAMAGE"] = "Spell Damage Over Time", + ["ENVIRONMENTAL_DAMAGE"] = "Environmental", + ["BLEED"] = "Bleed", + } + }, + display = "string" +} \ No newline at end of file diff --git a/NewAge/EquipmentManager/INIT.lua b/NewAge/EquipmentManager/INIT.lua new file mode 100644 index 0000000..9e16570 --- /dev/null +++ b/NewAge/EquipmentManager/INIT.lua @@ -0,0 +1,102 @@ +function() + --- @class Item + --- @field id number + --- @field name string + --- @field ilvl number + --- @field type string + + --- @field new function + Item = { + --- @param self Item + --- @return Item + new = function(self) + local obj = {} + obj.id = id or -1 + obj.name = name or "" + obj.ilvl = ilvl or -1 + obj.type = type or "" + setmetatable(obj, self) + self.__index = self + return obj + end, + } + + --- @class ItemSet + --- @field items Item[] + + --- @field new function + --- @field equip function + ItemSet = { + --- @param self ItemSet + --- @return ItemSet + new = function(self, items) + local obj = {} + obj.items = items or {} + setmetatable(obj, self) + self.__index = self + return obj + end, + + equip = function(self) + local equippedItems = getEquippedItems() + print(#equippedItems .. " items equipped") + + for itemSlot, eqItem in pairs(equippedItems) do + local item = self.items[itemSlot] + + if (eqItem.id ~= item.id and eqItem.ilvl ~= item.ilvl) then + print("Unequip " .. itemSlot) + PickupInventoryItem(itemSlot) + PutItemInBag(22) + print("Equip " .. item.id) + EquipItemByName(item.id, itemSlot) + end + end + end + } + + --- @return string + function getItemName(itemLink) + return select(1, GetItemInfo(itemLink)) + end + + --- @return number + function getItemIlvl(itemLink) + return select(4, GetItemInfo(itemLink)) + end + + --- @return string + function getItemType(itemLink) + return select(9, GetItemInfo(itemLink)) + end + + --- @return Item[] + function getEquippedItems() + --- @type Item[] + local items = {} + + for i = 1, 19 do + --- @type Item + local item = Item:new() + --- @type string + local eqItemLink = GetInventoryItemLink("player", i) + --- @type number + local eqItemId = GetInventoryItemID("player", i) + + if (eqItemLink ~= nil) then + item.name = getItemName(eqItemLink) + item.ilvl = getItemIlvl(eqItemLink) + item.type = getItemType(eqItemLink) + item.id = eqItemId + + items[i] = item + end + end + + return items + end + + --- @type ItemSet + local set = ItemSet:new(getEquippedItems()) + set:equip() +end diff --git a/NewAge/NameplateInfo/Hostility.lua b/NewAge/NameplateInfo/Hostility.lua new file mode 100644 index 0000000..72ee785 --- /dev/null +++ b/NewAge/NameplateInfo/Hostility.lua @@ -0,0 +1,19 @@ +--- NAME_PLATE_UNIT_ADDED NAME_PLATE_UNIT_REMOVED +function(allstates, e, ...) + ---@cast allstates allstates + print("Starting to process nameplates for hostility...") + for i = 1, 40 do + local unit = "nameplate" .. i + local hostile = UnitCanAttack("player", unit) + allstates[unit] = { + show = true, + changed = true, + resort = true, + + hostile = hostile, + } + print("Processed nameplate " .. i .. " hostility: " .. tostring(hostile)) + end + print("Finished processing nameplates for hostility.") + return true +end diff --git a/NewAge/NullBarrier/CLEU1.lua b/NewAge/NullBarrier/CLEU1.lua new file mode 100644 index 0000000..01cc500 --- /dev/null +++ b/NewAge/NullBarrier/CLEU1.lua @@ -0,0 +1,10 @@ +function() + if select(2, CombatLogGetCurrentEventInfo()) == "SPELL_AURA_APPLIED" then + local target = select(5, CombatLogGetCurrentEventInfo()) + local buff = select(13, CombatLogGetCurrentEventInfo()) + if target == UnitName("player") and aura_env.buffs[buff] ~= nil then + aura_env.max = aura_env.GetAbsorbs() + end + end + return aura_env.GetAbsorbs() > 0 +end \ No newline at end of file diff --git a/NewAge/NullBarrier/CLEU2.lua b/NewAge/NullBarrier/CLEU2.lua new file mode 100644 index 0000000..c5a705e --- /dev/null +++ b/NewAge/NullBarrier/CLEU2.lua @@ -0,0 +1,10 @@ +function() + if select(2, CombatLogGetCurrentEventInfo()) == "SPELL_AURA_APPLIED" then + local target = select(5, CombatLogGetCurrentEventInfo()) + local buff = select(13, CombatLogGetCurrentEventInfo()) + if target == UnitName("player") and aura_env.buffs[buff] ~= nil then + aura_env.timeApplied = GetTime() + return true + end + end +end \ No newline at end of file diff --git a/NewAge/NullBarrier/CustomDuration1.lua b/NewAge/NullBarrier/CustomDuration1.lua new file mode 100644 index 0000000..7c61f99 --- /dev/null +++ b/NewAge/NullBarrier/CustomDuration1.lua @@ -0,0 +1,3 @@ +function() + return aura_env.GetAbsorbs(), aura_env.max, 1 +end \ No newline at end of file diff --git a/NewAge/NullBarrier/CustomDuration2.lua b/NewAge/NullBarrier/CustomDuration2.lua new file mode 100644 index 0000000..ab30a4b --- /dev/null +++ b/NewAge/NullBarrier/CustomDuration2.lua @@ -0,0 +1,3 @@ +function() + return 15, aura_env.timeApplied + 15 +end \ No newline at end of file diff --git a/NewAge/NullBarrier/Export b/NewAge/NullBarrier/Export new file mode 100644 index 0000000..3395aea --- /dev/null +++ b/NewAge/NullBarrier/Export @@ -0,0 +1 @@ +!WA:2!TFv3UTXXv4qqyy4fOOw0Xw1UUjRzQTLQLv0p2YjPvXHKMsIQ0K0lP8)oKZYDi31A5UBMDxjkLM0AL2uvJ2Iw1a0))J30Bk6f8jiqpbhi0hGcDrFa0f9w3Zm7QvK0YWj96saYD5zoZzoZ35mNVZe72jCvNA8jFRXVsIwj0sOT5z3rLuFznMTtgBtB2IXJhVu8jg)Q7QAZ0OS0Hd6C80MgRVoHPjxX220ZWH1UyJgUuVyQbAQ3j4zwTMuNHk)b(egvEoFtt57OB4r7WOnnSTQSMdvPjZ23ju9YgRtps3G3d8GyXIfVJND9vOmxCgFTyV9FxXToXKgNrQ7HsCNrX1JW8KuByyz4QlLgF4jTHhZOztCsN5cSWx)0oAuv)gn4RkBHS5ln3s5t7XDbIpJm1gUoutZCAUs766RsxHA5vg12OD3QzsvUs1YvsPujTpACvhtYAuMIfPf1vsrOQ6cuIPNE0ulXO4uvkxkB(8B5Bf6csS1cXP9mS8OmlI5Td2yz6sSQRBZkzJdOMjBHkzv2YLA2qiOt6IvQu8M5ZoxLKgADlGazAcJzqzt5J)p3OLQKDKzuxEPsDBWqVQShJ4rIVxGnNJlIVRvlNrjB2cQ1TTAy0ukeOZzHou8Di(EOUfDeGQuhCJOicsUsBhOxGNFSo4S1mc0kTPnrBM0iYv)ukT8XmbjL6Mex3tbVLuAxmAYFzlILrlcFgZahFUTPexUdsTA6PFuy40w2w0D0WqaxJQ8acZLYxe3n4QYDCy20TigwZbFhCcWSW7cxhEp85qdkjr93zZj646qylFhdnp9tUT49ax)UXGJSW1F2Z(8xb)0PUVRNDRk02Eol0W3sKmnYOsY4hg1ZNzjZtlQsTwzCmy65Twjggjk43AKi5Zt9sP6AZuDhz0rLOwAW3CHp35Op7FH2hUaCXDelUITNyRfZzO(()nT1OPtTuLIWxfXfjyijiXf2sZUAGNvtn4z74NnAb5PVUYZk)Hc38bj5jcYHzcjFeoWKJfos2wo2Rszun5dtNpskYKTiTrztij17UknUoO0iyHNPhannSzYgcJiFLjK1Sfc5FmAiVeE2GpZrsgCaj5yYgJkp7SY8Pl7PtTI0Uhu2isicGs9(muHj4iB)(xaQF4EOPnwEq2J2YbhhpbrR7nYKZm2H5DdULdSYOb2b3qcJW979DfHaQPlnY3eo7lW)C71b715iIHMicqxEm5vKnSKDigm3r6pApAVGCWe5)Ej5NF9gz5rpm8dvFapS)85(GXO9UL87kpjDM(dBHw0flNz1CC01XJ1JK88JpvJBIWPL8BYNsOtGOuKzM(lQzwoYmtFGzgCEwr7s(rUtu4cWR(FWIalcNeofCg4RdNf(gBSFbLetaVoiVN2AyS1O(ncLwB3Gdx7)FN37LucO3J69K4GNEgtEsHF8AsWITJ9zdyheccZbNAm5m2TujE5TBIwlJpdlb6LLtwKZQHnwbHFujPGXOAQLusvnvPs5ZL9gj7h8cZVjSMuVdYWV6l16dya1GJ47Faz6V4ZNFWiC1NvCQQaEQj6u1OYeln5(ZHFa)3hj)XyLadZNVqWa1Ioum)LvK4qNeM7jkE0niyl4wWSHZbjHtlfWt7Mot(SlTVc6gAump6nK6Qz4(yrKCf6ueR1CgIiEVsapoV0D8ogijv1673OuC48zGVnNHBqwQuVCERnuj73WZcx)F8AIpXJJnS4s84POu9EjYUxmy6V1PGH7Y314mRIF38vDs4HKzvD1jA2RE3anJVLqg)NKNVUZX7rJd6VA3aP73SbCrNtiKGDeyZ5TRlOstNc)7EIbWoBOAcHpzNGwmUxyBnBlg)XiAA0yn4IDyCUokNKnDHIfYcdZW(k460rO4bGxGF2Wg71jBBhg11DvYA9TJcxIZ(k7ieUk2tYDyeNnUt4l7ezbrdEfxQs(CfYgUL7P5QTZvOqwLQbTyf4VRy4AOAsRDGj4nIEUW9wiugZ50ryz1GAwvTcFbMvvNA0u3BAyM5GRXB6bEBrRp(U0QwyMgthEhUGDfHX0MywjpjAQu34gohhvkLgh0OAuTBsARdtibx(y762Y22tVeZUjhqQnOIgw6WXyH5abn9K5GSXrGlULid1ftQvuYn)cvGPK6kuBbdnnQLsHS3oRsOeH7plJV78z0oznxzPCYfWDx61TTBfli9RsWOoJKJ39AdsD6dZqWyTvtSbJhUuUlFW)UCzXgLNdvd(k8(2Xox3U3MrueMuxHy6OtIdJdVPYQ8CQRmeCPU3YK2E95Ym)1M4wijbV7FQEA(2rVRnozRGwO6SqrLC3VyHkPYdxvAp(Lx4xNWslk5o2MtaPpjKjgCdi7aTNbZfdMhwa(mHIWjE)iIKk4xorIcugYhWGWjvGcox7W5jM8Q9qk4z0IMYXX0a7(6s4qc6HtlOh(K)p9W)70d9IRZkJUrfuqpud9ep8y(0dLYGhk41)Vfgtrg7BQlAA4nofSycjm8)VHHvXRt657Y8TeeeWt3sCXq(Ui2U8JZeb9c)0BTDAsTOmJ6L1TxTO1UUIhzWReJ1RS2GRm)(I12HHxoSCKv2HpqKrRjYS4zy5tmPZq8X6ZQ1e1qWl0vF5AboReSeCB4oXH7oaVdNqb5v6H3zajd9CsU3IXrga4(6WdcjvGhU5WWk4qVFYZ7avfmeqn4jabuH6pb0Ibu8StdOjQRoye4dpgw25Cpx9rNQ8ywvSEEDd(TCJdMN9vGhfhAbwGn4aFq3GQXIYthsbwNWxu42rdCRbENd8J586VOLkSppDy1blfdTdlbdRbRdFOo8ZXcn)sD47vd(iSok8XHxdlXfGC1GfDM)l1TU65gv9NMob)EDhCTt4hapbleUBV2qEk4NQd)WzHFe8PyPpYAfBmV5KLBFFkSj8tGNgw)e2a(e4Yhf(zIALCkIVFa2)lQb)4yWwWVcRbYl7JL5JQ61Zk)IlaIOGOl6nta)LAWVh(d8Jg8uTHHFn8BGNYZmJYs)D1G)um4pxJxr73gtuM8pwd(R1ehREX5MF57jki3m2(5MNrKBggxdIOx7qJRHOYus9eA5OcI8CSeHQqOgbso(Iy)(8t9hwMwqdFerIchXVuxfNR9DZmFU63V494OopGec79CfEiNosF83cOvINyL)5D)V) \ No newline at end of file diff --git a/NewAge/NullBarrier/INIT1.lua b/NewAge/NullBarrier/INIT1.lua new file mode 100644 index 0000000..3b75aa1 --- /dev/null +++ b/NewAge/NullBarrier/INIT1.lua @@ -0,0 +1,39 @@ +aura_env.buffs = { + ["Null Barrier"] = 1, + ["Empowered Null Barrier"] = 1, +} +aura_env.max = 0 + +aura_env.GetBuff = function(name) + for i = 1, 40 do + if UnitBuff("player", i) == name then return i end + end + return 0 +end + +aura_env.GetAbsorb = function(name) + local temp = select(16, UnitBuff("player", aura_env.GetBuff(name))) + if temp then + return temp + else + return 0 + end +end + +aura_env.GetAbsorbs = function() + local abs = 0 + for k, v in pairs(aura_env.buffs) do + abs = abs + aura_env.GetAbsorb(k) + end + return abs +end + +aura_env.PrettyPrintNum = function(n) + if n > 1e6 then + return string.format("%.2fM", n / 1e6) + elseif n > 1e3 then + return string.format("%.2fk", n / 1e3) + else + return n + end +end diff --git a/NewAge/NullBarrier/INIT2.lua b/NewAge/NullBarrier/INIT2.lua new file mode 100644 index 0000000..da3aac6 --- /dev/null +++ b/NewAge/NullBarrier/INIT2.lua @@ -0,0 +1,4 @@ +aura_env.buffs = { + ["Null Barrier"] = 1, +} +aura_env.timeApplied = 0 diff --git a/NewAge/NullBarrier/Text1.lua b/NewAge/NullBarrier/Text1.lua new file mode 100644 index 0000000..9a93ed4 --- /dev/null +++ b/NewAge/NullBarrier/Text1.lua @@ -0,0 +1,3 @@ +function() + return aura_env.PrettyPrintNum(aura_env.GetAbsorbs()) +end \ No newline at end of file diff --git a/NewAge/OverallAbsorbs/Export.txt b/NewAge/OverallAbsorbs/Export.txt new file mode 100644 index 0000000..7628805 --- /dev/null +++ b/NewAge/OverallAbsorbs/Export.txt @@ -0,0 +1 @@ +!WA:2!nA1YUnsrxyScsaEZKjadGe)sTS0mYbYK7jWSiaUD6KyWJTvB7jZv5uT7YURjTRQvvv7epi(LiRyDepbEnR8JqEcAfXtq2ZMSG1CQQ70(cbgAP0P8PQZ58DUuFNoZEl0Bb3fC)Lvhkcq8JpK4k9(4l0RR2PJalFAMlrHspgVAGKWOISdBhkKSEnWNkdoOtiTTsC(fZAapCSmKtnqHCulmT)Y1abYb14eQSsyV8PY3hll4iyChr(fxmlM6YhK4T3D7TwERriABWJ1yGEofTQ0WY(snKSzsKYDzcU7u)(XmxSzHMnQAsAZOENj5KUDXCrLhWtw(NMYbbyNySp0f7e2Ptdqc)aRY12Rz5ReHo4(yQSoSb50rTkwOEJw1BuWUX1UdOOEK27cOx5SJoZnz1cRAR1X5amYx6zgsjsNaF0am)QypDJobF3BjtnzgzPXI7HoDjJ1uziBadyr2yqkmlw2Q5OyF0sfzrFsAeajDicSRxZQC5O5pnZVoJRjDmeyFCBz(1xYOiRNdswM1faqXqoh03szKs0omO2ySZog50wQvHM2fAvOwTYLS2nNH0dt1wt94ZAJ8nKiExS0yNBS(wVvRpJbu1KXQV2g)31hcPB8(ognHQqfizLpxCPi3IgiQ74CQYnIxOE)kJ))oguI)0rJ6zYcaaPBTmLQauDYo5))3QTgFJXQQY5zIaSVFjxr2BQIEexC08Nhst6yZoYLiETU01hVoIoi4Ui96gX7R65NBOQFVvBMpJ)9Zbpxd3yWCkY)jq3puYlEoIs6PBb32wa5i5ExGrcCDjKl7k9EVO7yszu8L30sRBM4cmywxXzQJQULeTIzpeHUx0YGcrReTA0ArRhTIthcLi8Mv8zoiEXyiDW3(h)p9tM5GlDcKu5gS3KemplZqOZ1g3vXU8f3l6oJujoWeTG)(LpkybjW00s4HCzN80yvM7CTm1RC3VDW8tCIy)MjtM5Ukwk2VJMhj69d(qTeGnJPYiT1CDMfGFETEd4sd2vl8NVmMa6zXUlZf69FnuNiDge9(d5kAhSIb0Ss1kwr3HdrG6md1hCC5igNDyu5qRtd4yH4e0GPIOex85VZLAHNW4UhYrbNDyYIltTGMTQAZgLlvXkjKNGM8IsvQyz3kMSmgV9jcIJp(OXMOo5n41sITKuzMGplnxcNHdzMw0Kfqb2dt66j3W0NHC3Ze6zBFp7EH(ssw72(iH4ErhM98qbUffOE4EMcWdkzxPlWM(qNUQpD9c7UBW8W5k4QYIyxS7JrN6DDmu2Jd3wvHNt9I2wwvUs0JXKE14SUQu2rZQjH6nKR7x05KK2fostYj2o6HzJ2mRj0AkFW5USwX3VocOcN7SPjbGB2)O(g7lYvj033WeScbimEfSXAlLSJvVa2jyo214F(m2yblK6sODnaulXAKm9r2peXDNw0tyexJ6ECw4mBuxcxjfhtsnXpLDgcPvZMDs6fZyMZuIE1SIy(jOsAq0gXyZvnCztszQikvAMsuUKbrZ4Ru)VZjMqRrEB8EA(TPXxm93TJWKHh4EbtW9V9s3g6MnKJTYIPJ10grH7BGIwa2xGtXMgS)d4tmjaNeCi9wRMMqpEjJ(geQraIWf5NUNAXjtYXkQE)L3Y4G8hV4To3WrmdcN(ZOMknMg7uyYYA4TNUSLyrbmsH2D54B15ZD)LxVZJH0j1yfLkjGaYsPMzJ)RM54uZSXyZmRE00Oe(78jyKpxp9sad(STlT)bnmFdJ1lJPIH(OrAgKd08p7Wv0tHC8ql)(nlzubqW6He3rFvO4r)G9(pV5gBfpsPr85cYxsnhSdQn(LfraTnTlCV9Lnl9WX)6H11FbPwnVHsw7(XJm)0mp63sCoX1ftTRy9el74ppUykZ(OokslymksI(a7tutn28U2i)ap0Coqu1H0nlKTu2e7LJ4EvvyjY3pPtBedirOXF86WdQAx65vR0Oq5HQXUK4VZMFAcd91oO2h3LRiygpDBbHZ6lV2xV8Ml0)3F6Fb \ No newline at end of file diff --git a/NewAge/OverallAbsorbs/INIT.lua b/NewAge/OverallAbsorbs/INIT.lua new file mode 100644 index 0000000..233dfed --- /dev/null +++ b/NewAge/OverallAbsorbs/INIT.lua @@ -0,0 +1,43 @@ +aura_env.buffs = { + ["Null Barrier"] = 1, + ["Empowered Null Barrier"] = 1, + ["Resounding Protection"] = 1, + ["Guard"] = 1, + ["Void Shroud"] = 1, + ["Stoneskin"] = 1, +} +aura_env.max = 0 + +aura_env.GetBuff = function(name) + for i = 1, 40 do + if UnitBuff("player", i) == name then return i end + end + return 0 +end + +aura_env.GetAbsorb = function(name) + local temp = select(16, UnitBuff("player", aura_env.GetBuff(name))) + if temp then + return temp + else + return 0 + end +end + +aura_env.GetAbsorbs = function() + local abs = 0 + for k, v in pairs(aura_env.buffs) do + abs = abs + aura_env.GetAbsorb(k) + end + return abs +end + +aura_env.PrettyPrintNum = function(n) + if n > 1e6 then + return string.format("%.2fM", n / 1e6) + elseif n > 1e3 then + return string.format("%.2fk", n / 1e3) + else + return n + end +end diff --git a/NewAge/PrimaryStatBar/CLEU.lua b/NewAge/PrimaryStatBar/CLEU.lua new file mode 100644 index 0000000..398a605 --- /dev/null +++ b/NewAge/PrimaryStatBar/CLEU.lua @@ -0,0 +1,7 @@ +function(e, ...) + aura_env.currentStat = aura_env.GetPrimaryStat() + if aura_env.maxStat < aura_env.currentStat then + aura_env.maxStat = aura_env.currentStat + end + return true +end \ No newline at end of file diff --git a/NewAge/PrimaryStatBar/CustomDuration.lua b/NewAge/PrimaryStatBar/CustomDuration.lua new file mode 100644 index 0000000..314bbce --- /dev/null +++ b/NewAge/PrimaryStatBar/CustomDuration.lua @@ -0,0 +1,3 @@ +function() + return aura_env.currentStat, aura_env.maxStat, 1 +end \ No newline at end of file diff --git a/NewAge/PrimaryStatBar/Export.txt b/NewAge/PrimaryStatBar/Export.txt new file mode 100644 index 0000000..98aff93 --- /dev/null +++ b/NewAge/PrimaryStatBar/Export.txt @@ -0,0 +1 @@ +!WA:2!nA1tVnUXvCtOw0af0wBN0T7UTav1g1XURHqSXUEtkAWcrzPyTWw2GsE9geNknKCO4etnd7mdLT2G0MQt7XcDT3e6HEON0NGed07dec6ha3Z9I)e03mKs(pRxGoasC4BEZ7V)EVhTQUy3f9x0)1pEKigXp5iIVm8hEUz)(bbcS8Lw8Zs3TZ3(vF7CFZCZn3iVeHK1Tj(mzCXGeQNKWORUw(cWIJLjCAbuch1ct7v0lHZXuzdjsMht959ZK6p4PpT4tgJOEHm(bmcv6wUs9MvCMyuTdd4heQv88xPRdJ9rsSdUhipoYOuXwocjIlZ7gqOeryEB4HCLH(SwP3RTB6ZZS(BZmjrm2tBpnrUr4cFsHVYy4F(shrO(NIIobZx6laYBUEgDBo(0UiH8203JiKNIr9YO)41Z)15NPKUOZ06aO)H5VRGH5GRo5tXYd4KUiE)SdVvyvKs9qW70mS6sXrO(GIxVWTfH(4ABV6A3iDiYc)VPgtz)ouieKQT96MN1rD1Xj4gnG3iOiYRmzNA0a2QVb1BP67oS)5tL7xOnRbsoPthmx8hwHNT91pyO(MuGfXdVSgfheysxn5jYWlse4wixbJ7UhZh3EshmfZjEnczNUpDKaEuk6uuFHDceWCtJvd0xs)EBxdesyxE3kh6y0qEoCO2CApofV0kK4JvlmemZOi9b3367(V2Y(XaXbgI18f5NYSH(7oWhmyDeyXnMWXOOgtV7faccjdlWckuLWboJFqzglYNDkTWbCwhowikSQH914juJ1zJsKSlsL)2zYnU8))fBxdyKbfxVWg6y9eDyyMB1wTq8)AMuXRxOyXIPY(TaAFli2mdIe8gQTWV)UfLmetn35gk7QYM7SdIMxnm(AoVKNG1(1fIK086bCCa5mNghuz3DJxq7T3aD0EgJnscagh3QCPgnB1OzjNMd1CR7TCs7r(yx48MqMLVtLDpO6H7omHMboVN6(QhSI69)3QLD1LwjIuePbZPnO2QFR6rQnBRU)fcJwNMVvpu9luFGLQyB1swQ3Duzg1Ny6KPwzXnupPTAl1tvFu(X(eXxAsl9WBIO9Jxaz23m1a0O(CJiEmAlpweJ)8CW6sOlkMtrrVaQKarwEOahfyAUQENbUiEzdRw525z)N3ZSYbEPamFaEHdDqrXHOCxV3)Nznccwo4oAd83Dp1YJ1zfqsTGF9g7Y4(yElb5v4CtYEjTJ(MW5QLhcxoL85zNMASwww5UiJspIGa11TNkmSFhC8cn(JjioUq1KOOchfsK4PINzSRCV(Nh)RLWiHwM)cy8UizR4wssxCRyo0ns7)5goJLL(nEXZBEteIG8q5RSJuQtdu2LoS5(XVNHOUceKlXZmu0Ue86LP6JCg23q8Vmj1F)S04L15MZ)sOQLe0x9oJ465yy9Wl7DRuTPAzoes08mYW4v5UHzocvg)Z0ycmvG9lydGMcREw5MpAT4fVM5)Yu1L7geZSHF5CtMjld6D)dBUBT6vsPEkegpIJIhCu2MulEAwiliDTXYNxRE9koTshoh)G7iONUXrh79VdgOzBSPmk(ktRbaA(KSOxM7yf)REB5u)(qBAIxOBiM0ju(3)P2rmK)w26PiR4ki0or4CoDtIKKh22Xlcje3t1lVTgAQ3CHbuBhb9j0Looq2O(2XZdfTL81zlSp2Fp0zHdrusxtV2Tu)4QNJrcCdj09PJm8hPwwrNmTfVPLpxGHkqFXanF6yTIA3frOvvFTHB1Fs9NvFd88NCBkx6c9y6Wzju)uO4optDGzDTnFFtZk3yuMnUhH6SXhcRja0eIB7hB6CaExxgtgoDus7B7yeA4iUPi2aiYQHt)GVRQegAANiG5Eoo1(0DAEP58TN1Ga(ukgnG0jV6rHJnNTJjzKJRtyjC85BJLisKOq1iapCQU(yn7xXyDTCmShosY86L2B6(wF8)CjI)4RncjtMeFa87uVYlQ4moGdJOGeasIYDzkwPQMK2nCBu2PsL6PTRAMAbXBvt3cma5HpUKV)(uXXhHrNucSFXX7H9jOJZ4uCCAlMwMUlBMaMYZ5p)jp1PXQVARpMtOA7e6jAQqZpMXjWaJ0HWZdwwZALlTBRA1HTnQmYBwt8hUIJxi27KTuVFUb9qCI(BwgXM1(3PhkkbBX9cr0oWh2SI6F88Cw78S)68MvUbXCgKHK9vLJx4gFjSg2QEHTohfUOWDZIB8rfF8I9((x()( \ No newline at end of file diff --git a/NewAge/PrimaryStatBar/INIT.lua b/NewAge/PrimaryStatBar/INIT.lua new file mode 100644 index 0000000..64e9e7d --- /dev/null +++ b/NewAge/PrimaryStatBar/INIT.lua @@ -0,0 +1,17 @@ +aura_env.specStatTable = { + ["Windwalker"] = 2, + ["Brewmaster"] = 2, + ["Mistweaver"] = 4, +} +aura_env.maxStat = 0 +aura_env.currentStat = 0 + +aura_env.GetPrimaryStat = function() + stat = UnitStat("player", aura_env.GetPrimStatID()) + return stat +end + +aura_env.GetPrimStatID = function() + specID, specName = GetSpecializationInfo(GetSpecialization()) + return aura_env.specStatTable[specName] +end diff --git a/NewAge/ScrollingText/export b/NewAge/ScrollingText/export new file mode 100644 index 0000000..cb8c847 --- /dev/null +++ b/NewAge/ScrollingText/export @@ -0,0 +1 @@ +!T3ZdtjoYY)DHQSo5DiBs4pcB92xvOIR4PGpdU77(T1IgibipdjujbDDpp)S)R75pzscjqa195Ex07ytM0tpD3tp90DpDWbYd6pqD2avD8)GlDUZW1s7bp46UY0pW)tzqxPbDRq(Sk2Ip8R636nESNH)GUnLKgO(a)U9KRuBGQM9OPoUx4yAdqEy7U9BF5avV5AU3EPJVMVPJnIn1fUwduN67p379V7D3RnXPSPZ7moD0rlU6F77(UkduhQn62jUolS1p0XYXLruslrusLRHeL5ih7Rhfcsk5ltGuoG8vx4z03XXY3C(GdgOEVJR(ND1Mpq9ZbxnuZnHrSCnf5A1Buxz)Q1KA2iMurv3WtZFHRMVXGHduh7GC)XUMF)PB(3l00H21E6M(9zscQe73jcclhnYmG3CJrKjLfaTbxqK0UowgKhAApbUsTFRU)Mae6ThqbDKLMN3siWZ87gXBKkeAP)Fx45BOBOFUPnsZUgtGjN(pmhghnGtaXqGEXilQ4Y34BatcaCUHLL5t3CeWmmEQp)rO4rUjIdFhsFCgbiXJmXVVufuLrZA(unuWPUWe0aFqA8P7V4t326tq3hB(nd9pBQ7pfK7iWol8TmTHN07Q(N1PBByccMQmCpa0p0DDGjSdSm)(31C1bjmBMvndkcJa23zgs2WGUWEeQAUBXNo9PBO)Ao(PBq5W1g23v2duDnE6g)Pg2ci4)A5msZ6PBMA6)0nF4PB2TWoEpDZoEfk((XoUZ083nkAkRnd0Q9lfh9LNB4oYW2V4YJGRbiBTjdXYDZwBMHOlg26pDk8rSfDN7OdIWwx1VhDMbilZruXSAlCMs131CYeyIIBcG3a5sIwbvIbiEXqJ7acvDXyy2AG61h2sT)1G24L95a9jnxtTHwgEdu)dbT5bMgCSicP)yzMu30BoORrECHJ0MPnbK4QSUGmzHsl3jKYO9WdOx7jHH5plfFO7yRB8TTA8nXEUAcWEXSHgUPraA66M4eHM1fUotCn88i9soei6gA(tZg1HqUAQziq2XPL)eUL87avYe4a1tm0SqvGf2MWD4aat4btWx4AqMGvVO9zNX6dmJEyVZpOv)RpR3hVU9Nal8xFv3J7CgyOV9rpDtRRUS11D62PVqFjy1frF1d0Gjyc(xFOLzZHlMbYdqExcvX1noudSm5c345o6Jx15i6vDbva6vhBPnXJE5L8RbdW(myXlzaJxggIaWlxUCS16eAcKDOWR3f970RRAH1SINUqwMiWVe3PA3Ra5ivMUBbQ0SqX3jlj9puQvCnOrjlOroj0qfRFPqHVMMYd)xIPcI6XfTU8YFpjnOarcSFkb06vRwPrZvajL8PODvyKzEB9agYmrHf23A7CV9kP0Gf1vwbu3PzTGY7cH75AFtiFxrF9bJOwBzFNZwT3pKHk027Q4i0a9jW6ac8(UlmwbSJMQzpXqplG6n15(vb3FMQQL8gOz1(otqwDSPlA9Co4NWlUwwW(F8TxPldlMvDVVOuBNVUEfqXMfvZK2NYgQ9fBPDnPxjnWu255pcMv1H5kIbAQ4bKQ3dEtbcOBUhDqGkZPY4)8p)RUQUYgRQRovthhTFKk7kzxzxEdv2ROKjTD5NN2ELAV912v(RV2ELnqBhNhI5H9pNA4nBMRH)xon84DjvNTzABru9wg6dVUV5md3YTgdrISRuzqz4Mqzjium4oU(TS1PP0zxK8ksccFfrXJaflG9Lj74HKSIGUGWu0aKeeceThF2q72wav6vE2d0wjabb(SMOAgfDvjSKES5KLHgjqwyBmsu9ZD6(XRpQ15T(yBonnQS39GrJ0gYeJece1yENU10YQeF1Bju85zIzScUCia)TKR0gctadjxoYfwwaObUCILM9iyyjTUWBkHc(aL5tFL)yHzPvtTXt8dz57HlCDPr1oLVCovdeLsDDFMhu)PG8yQJLEOLZ)dWUZ7eJ(ArfYXHWZ)6d48vOgYMuigHrNV8IQe5H(gPYEYMIr1dlHF0HGsWl5BKYokqwKrrFH(VFDt5l(VriJy4eS9wA5gbFjZ8Oe1mWMO4DbDZWZC8OBistegF30c7uwE8o7Gw)dMzlM9rAV9O4XhTtthVTKmjwspHLJu(6BqPdNoP2kG)1Xn2YP9yRi3ocEt7m3ciM94ykWKPuY5cesrcHQWyYpf24rzoj7AKHHB6Ijik84OJHFocwoF4LD6)(hD3aSJ0e3(3Y47JN1Q7HT3CmkmJUmfEL6jBocdHHt2uwKjapoKtK0KUJ4ChVD8E09rBr63Pc6sS51sP5XzXTDzbDpOTG8z7Dr10cUHiG3nK8P1bQ9U8G2hbcjkls)joBUexXWiWxujEHTK)i72U5ShBtAc3fC9sm3bN17WFBJ5ng(E2Sg1NInN34(IqyoXnlXDx2wTJA)nM94y8zZFb2z3youyHonZ1H5ZEFQ9L)wNZolb(mDUKJ1THl5KPVjl80D)fb1a2ck8O7VemW6qSUGbItE)oN)(DulSjl05JtqyWSdIiMmyzMLbxXqw7gs(5QU)w3EFU7wzWZ0ESdZCNyCp3WYWGC2GOW)l749vbvOEi13C(Cwq(0PKL6HBHOqND0ybKHKe()i7t0pI30U74vmDLGi72xmbJZr9EOyPeC7zBycdFntMxQ4Eh8Ffe6XbbJCCOGmowe6XXHcijy5YMtk(0ZSoYrh)O9J24N8RcrvOcFjMczjMkrPGzLscwBZPeBJ7xx2GwFwIwvYbwBAJKRutz)QBbgiXxyQZJqyJ7)AthvXTaPHZs1UfIUWCzD4THRfhuggCYw2FrIXGGB2MzVG(VnsErM0IyjGAFcSLVfOuKCTqrIV9OtCS8r3gCROmXAD21BdbH1zep9EJkZVDlWKX3MBs7CF((OF0WhVgZX1V(mX(MMOsSIVsltLRmrLVKjW8LiXMBBwmx3VBqctZWraKQsQPTNHRVOAnG9f2GntgJR0Uf62DOPbysqZ01JHmqPs3jPKZUwReLfwzcUg0pL3gufxmUfM8ghIm(x4YelZzM88gcUGpYYXguvOTUXOxqQbAmJ1S82ccfZQ0nVsjHk50zVvOoXhAaCCAjz(8oQQIeFpQ8mt(Q8mLNzo4GwQPxVXJpbqtPiEbK5mftia(n0mOsWUilQ46bBh)FMsUC4mReHr3DP02K9W9cYYsMd271oiV)3gC3A8)pTa8OTljrdVA1rhespNnLMDPYwenqGCumUN(6hdW267FA64PO3YvB3GriZv82ZSc4wNF9BIuz78M)f0l(xiV3FEUA)8DX(1X1616s9g5N8lH)Xph)I3w)H3c)GZI)VN(k5z8lQhXVaEc)C8a(v2Z3T3J3m6PB28W90xgFF3a3AB39tDUSx3ZB3TFRZwQgki1Rcxcd3y66mdmVQzTwpDbGzoaKxBf51wrETvKHFFdwfg51RrE9A8tC9AKxzh5v2rELDKxzhVsglYRbKJBtIjWMguqEzGKxgiBtzGSX0SbgAzSOrybC69koSVe1PsqCXBFXQq5(VWWeZ7s5kknBwpVcwYRGL8ky5VFvWYkEv7YlGLFyfWsEPUKxQl)vOuxIEMapZsErCqa5f)Ypff)YBWYJHPdT24EzW9dQ8ywk23x9kKjZe)ZmaP36LQZlteq51VtE97Kx)o51VtE97Kx)oVm1VZlq15Wp(EqsTR4lNYc8kZPyGB4oGGZDDU1U3EKVcnz9(PBO3Dr7l707Oohg08LT6(X287wNd9STnlXUI)TJPOyqEluZp7oc)sQf)AKLjWc2S)PhXA9vPQsTAHIsia8IXcUiVOHYlAO)6v0q)OurZRyP8kwkVILYRyP8kwkVILYRyP8kw6nqflrlkOViSsgQ0cccOHrgIuOfy2mVIM(PUIMiZWDo69cHk3q0MuTtbbtYZS7p46F6LOqKcf8(2xksF0WN8Tpo7pcp7YemfFM1HuqkgYRgP8QrkVAKYRgP8QrkVAKYRgP)UunsPDgiN0U1zB6jG8Z0HwmQ8u6FQlYpdc(zqm95EielDKbnBMNZ8mNm7zM27gWTLIih(1Sx1s)flf0)C)niEEQGE1sfuEoGILdOLY9tEYCYtMtEYCYtMtEYCYtMtEYCYtMtEYC(BBYCyVwzf343RmEnTsrWs10kVzAnTYUBltpep5pVaV5ABB9OM10E8d5TJ7TuErER82YLxlgVmVnD0WAJ)k0LEiERk0UWlIdT2vSkFZdh9)jH1TfVJC)Cfv3RZRp3Z(1O7f61P7L41Q7VlXZLhe22)64LhAvEOv5Hw93OqRc3i5g4JbQOBdEd6pWFG6OPgJUDGk5VJ7duPorPZF2cpFNzx7dgjGhHAFlMJUzoqv3y4IXJ7tEWjTp7IJV6mSdWUWUMySiK(dnOnY38oJ(0gp3r3yq39KLWNyA7B4cw1(KHRhyEBq3knG(7z0s))Uap98ZnThmeqGT5mIPtaJij46JxqPiBq)aOCnpdvFypQj(tbSa0gZylNUna)BaoIayFrhbAyMMjbVKJP5YbDLbObpYm(g5snR5t1ODGkiyaEa5PKl)OaWJxypAGAWF)95gyrFjrQUeMhslFTIj9hsFUwabs2ueikUMGyukeNFdXguk(bbHmOR0a1hiF(nYNekTfbaUOzGkCJRdoJsajRYqqMbrNB6n9LBsaqj(hvnDxN5DSp21b0chI6HAU3EUPRRJl5wyRPBF4io1dTCxGAd80fdV0ycChQ2cSzaTH(jouZ9A4)HXPRc5jGZTx7nvt35()deFUNHprYqAg)yG6oJKJag5WMPygKvawWpRq(Sk2OphAdRXx4yIlJADv)ESwXDhrn4rFgtjk8i4E2JgB(ndDAZDRxf11bV)C)DovjXadxpyo(HbQh2UB)2xYN46ti2U962MZUGCGYb0bMGTaEuH18OqCJmHBKjCJCmUHsHe)RVEKSh7s(8DiXta9UhxSngMePZX9UQ)zDiei2(9oU6F2vB(a1phCf5b3z6zo0YyWbjo2jn0uMJjTpR9X9dn0GmE0iWFeYF8bU5cSCCGBg9qiqun)oO4RiXL5)N4Y8ytfOybeszu9r55Q(CzNpEs)xE9hgA3k1hPnu9jdtePP(Kz1KikbD62T9LxhwYLMAyeTlLK0U2AvKQcBpG0Ciq(WwHQ0)L1b0CNOnpYOihC)O1RSWGmKWG1IH(eyCLbjnOxyf0Stice6(udZjt9PCgXk7bwW(nKTMvp4S2Dpsyp(Wvoxt2fxiPKvWDAShBobLbKcUdPnV7nTNqUWuNYP8mvGwXzfXg(Cr5BbqjfARkaZsKT(j(vGBgkaS2avI7HazrzhSy6O7OzFhIv2KBW4k6kcVJRpbEfIRkl8HPNEZ9tyJeGojZK01h8mpD8Xh1r9IZA97pDJA7(9709JQp6s25gtOeo83txCQi29HTBOLXiF0lQXAlSOKhjUB24QkYGLkqt(g2K64qwPYTfjwYfp)mn3jg8NwQAT6fjBjka4ZMaBTWNetbikqqbibarE(wWXb1GfairR2DXSHyUKzVvCO8HZgHScszdqEBGuURPgOksTeDGqftouprPYj02hgSsXZzSp6NhznfbLUyufGgO5eqwphEqzCMtdDitIOfe0OaZZyyGWmcLdq66bEKb43C2IzImi5mo4D4(MDWCWH1jNperLUPhMIzgzfmMaHFeIPd4sOtyDou9gUtO5sCDbOykCqIiqJGhcd1K)dNTsNPIQ6YySJXye98b3WXyKUfIuA8c8OTPvAQhNAp3eZyGp70scHJWKBDb567mzILHaGdy0aDHmdP9Dbte43fG8)Q)HLLwF6Fw8EV0J(r183F9yhxUgf3gH)ktdMCyf90J9vQSFTgvwEuAS(rHAvk64qI45DUSOzfddWmnQwF5HP56hMalCrhj60ZSqZh7Q7a2SFhyf29H3zoB2cBJYLlxKo8kk1BU8WdMgx74ZTQgD4pH3Ae0rmYnlP1GH0qcP4tk54(r08flpPJEiTS4k20XujDwyixBJzUpyvZqor0zITJli7M5yF7V4rIzIE4xuzwJAjiZQeXytL0m2eyQrrkjsNkMQWOqrOucZfkbIQd0CdmOiY1yyl(K1DYrndkVokR2kimzgHr3quqv1cik42LnfcEJ4fZ(xCIS263i8IEQD63Px3mTtOC9TARW(9UaqA0T)oOx)(9o)r3GnZiUzW43p66CpAOoOmvcidPYvjeY(RGqusLqA5ncCzcwjSe5GQQbpkGKyUzWOkv6TO1tyNz9q0uDcnfYogAO31CoL0PI8GXg3XFpL9QSx19Qv8PtfJm8GAqJvGhkxmKhAQZm0nxml6U5YnZ2(WIDHtxbKBaG7gw49rdyE0LbqPZW)EdmlFuTpskorNw9IOiq9snZUBOeMIeUBCabpYVi4XpAkQaEJNRcebF3Xzg1XsrOC8y2PoJZZWbamEQB8)9AQwll4fAYMW4ZUILTTGKZbdugCkNahJQjogBsSzYCTTnIS2yMv8cTWScA)MzbGgA4oZrgz2D4YD5YsLvyiMgWZ)H48TjO(2XEKZmIEhFZtYz0HBcXjftDiUpW1Y2FcffJDbvbvFWKOgnRvK4IogBLURP6Hx2UD3bQbbUsdWxBe31CrIa5jMt8(baRUAzRtjYDb9FDNRzaDanTJMj3XGVZtJDsSFPWrGzeBGbl8v2F8FvG9zkfgIJ1SSeauTMutPAXaW3CYcdgaOhm1IbayIka)1AeR7NPDNwO(2OsKNIw8fDwrwQb8y8unon5VkTIXG7TNhq7wgIVfUe4MFgtfUy6dE4lgbwBFYHpWj87RkkiN4y9a(yLipUk)XeoeEC1ipUb)XD1WJCgbOreaKRhGaxWtDY4xpcevcOavscfqqQeLiQhqfTChPztgM6riK92t3zXWKfcvcZHynkH(AVlEZVYflfrmkfzmRfq3wyY25DdfdRQBbS7LA6MA4M00UGdxcG3mG39H41cgfQ0CvJJSuuUc6TOFPmyYkHNmJ1hSPK6Z(rM)eYb8UvsGnctGJDjHPX6wk0NIuKXASPRyKsH8uQgJ8O8eTpuolHEvPsuvUaUIE7QyRkbdy)7nTqt0IULcBvPE0rBSfPOp49kfoRAGW4clTjlc1HuzRQnInqmHoFGWBtsLnqvNu9ibcd6ATvQShWzhzENPDOoLIOOEJidfBgM1Nuee7hO12cinmwsEhsvq0qk6WWKd8Xjf5qZ6rLdePMOBuP4Y9BV9ab2Cl((MZaNFmtYmKsaV32YGhwCen1uxdk0YpCQlnBYXPRFnBikGfpxBswqs6Ms2xqsAoEzetjOmfBJUqVEGlTtoBwL)IcwcL9DDcQDNL22JaOKefq(iV8wFayg1BWadPYL3(daPHehti3S8wGfQjnECDzgvr47e2gSqdjbTtKrjStiaecgfiQ8mHndj0ehkQWpSYmBNLcsscza(wvhxIdHfWti2hwvjBEASI2IEI88JlLePvOZgfloasvNYkhjmxxO37CaP1cBbAU1kWRza(5Og9OWJG0aQGMRAbXGopLwXTskvbkH8VWxly2pRRwyfLs1sVdUkJpafPeiENSe)NIPxC0Xh)N1GF(sdEX0QWLug)NXWp(3Io6zLPFgdP8MpM)t6RRzwhsPKR9Iqcuo(xLgOYRMgiif0lTJuLqFikk2XwooU7UKYiiXs4jf3bViHNf8ast7i)APphLvwjxu8LLm3cAmDYR4gscVmkKNMC5cTuPOqr0PuOoLvOYCv3iVNLbpfd9woQzDTsdlkWPwzsnefQMVggTfYOfcBkBa2(NjJTKtmqu86qtmsOPGG31dTr8VsoIVSn4z4wtkl11rbvUmd7m37KPDqAPo4ZQMZKMusUCa)SH2TTaQYRmPs58(sajAQ)vAvcMSDeQyIrqS7yvjxKMyYXvRX5J5qRmRChXYC6UIBNMxs2g945kDLBptjbewcbq0dlUEdVrqUYgGCLIRLziZyMKVmyMqkYyX0M)kMAOqx23rLmBKPVVA(wivAP1c9dzd6eLx0A8n0mb4sy)ExS(6wm6GI1C6UmoLMZvstSfuG05FWx(KEToM2uAajQiir6zeSXu5EpFQCLvc6PPxtO4G(EvdWEfMz0DlqtIm6bJynpfQOl6znIV0CSUumlddlzPmfPsbsIv0zH5n2vjxhXPu(PXYjROKcxx6CX9II)BC0rsYlwEGKkmju66dsyVJRjg(m9yvoP3LD()6H)5RJu)k0ITxu)h0YJfp7awHT2DpfXzhmqTfwWmeGcvZiCqLdd5YfYVOQqc1bN5du)Whc3XqVtiSJKclFtFkRsRdBXytF(YhpqOciAURZCWynEE4GycIqZRmhDuY5nkpRKDEwQCtj5M1L2Vr1kYv2VcveuUwSgZIePYByjs1nrIulbjs2ebvFdlcAKfrGuzKNvQvLQv0i86IYvAivPPICT6nQRSFTSjrQ9w20q9SjsIRpKuPCUkzq93WYGkkBTmiXfkzuKS)Byrs9NRXImkdA8gwgiTP7AMrEUzY88kORasI9UIUEv1QHnHXNMI3yLKACzoyOMlTmcy0pTOYcyaorVIjOSjVB2KkUf3MwhcH71kjekMitgXwEil5vRT(jpQEuc6)C0PuPMsZQYY7xV6(s1tcFHQjdMZc(CLmw1u0bl0JU1RwTsJMm4z1SVcbxEGNnLLRxUcqjyfHrADW))d \ No newline at end of file