Quantcast

libs for that way

Darthpred [08-31-16 - 05:30]
libs for that way
Filename
ElvUI_SLE/libs/LibProcessable/Changelog-LibProcessable-13.txt
ElvUI_SLE/libs/LibProcessable/LICENSE.txt
ElvUI_SLE/libs/LibProcessable/LibProcessable.lua
ElvUI_SLE/libs/LibProcessable/LibProcessable.toc
ElvUI_SLE/libs/LibProcessable/LibStub/LibStub.lua
ElvUI_SLE/libs/LibProcessable/LibStub/LibStub.toc
ElvUI_SLE/libs/LibProcessable/embed.xml
ElvUI_SLE/libs/load_libs.xml
diff --git a/ElvUI_SLE/libs/LibProcessable/Changelog-LibProcessable-13.txt b/ElvUI_SLE/libs/LibProcessable/Changelog-LibProcessable-13.txt
new file mode 100644
index 0000000..d6eec2d
--- /dev/null
+++ b/ElvUI_SLE/libs/LibProcessable/Changelog-LibProcessable-13.txt
@@ -0,0 +1,14 @@
+tag 13
+1b2c99d765ecdfeac2091b79dea1d989b4244e45
+Adrian L Lange <mail@p3lim.net>
+2016-08-26 04:28:18 +0200
+
+Tag 13
+
+
+--------------------
+
+Adrian L Lange:
+	- Update version
+	- Kill all humans
+	Fixes #12
diff --git a/ElvUI_SLE/libs/LibProcessable/LICENSE.txt b/ElvUI_SLE/libs/LibProcessable/LICENSE.txt
new file mode 100644
index 0000000..a63acc9
--- /dev/null
+++ b/ElvUI_SLE/libs/LibProcessable/LICENSE.txt
@@ -0,0 +1,34 @@
+Copyright (c) 2015-2016 Adrian L Lange <addons@p3lim.net>
+
+All rights reserved.
+
+Permission is granted for anyone to use, read, or otherwise interpret
+this software for any purpose, without any restrictions.
+
+Permission is granted for anyone to modify this software or sample from
+it, and to distribute such modified versions or derivative works as long
+as neither the names of this software nor its author(s) are used in the
+name or title of the work or in any other way that may cause it to be
+confused with this software.
+
+Permission is granted for anyone to aggregate this software with other
+works not derived from this software for the purpose of creating an
+"AddOn" for "World of Warcraft" and to distribute said "AddOn" as
+long as the software is not modified in any way, except removing any files
+(such as the included embedded "library", LibStub) other than this license.
+
+This software may not be distributed standalone or in any other way, in
+whole or in part, modified or unmodified, without specific prior written
+permission from the author(s) of this software.
+
+The names of this software and/or its author(s) may not be used to
+promote or endorse works derived from this software without specific
+prior written permission from the author(s) of this software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/ElvUI_SLE/libs/LibProcessable/LibProcessable.lua b/ElvUI_SLE/libs/LibProcessable/LibProcessable.lua
new file mode 100644
index 0000000..9be6bcb
--- /dev/null
+++ b/ElvUI_SLE/libs/LibProcessable/LibProcessable.lua
@@ -0,0 +1,582 @@
+local MAJOR, MINOR = 'LibProcessable', 13
+assert(LibStub, MAJOR .. ' requires LibStub')
+
+local lib, oldMinor = LibStub:NewLibrary(MAJOR, MINOR)
+if(not lib) then
+	return
+end
+
+local hasEnchantingBuilding
+local inscriptionSkill, jewelcraftingSkill, enchantingSkill, blacksmithingSkill
+
+local MILLING, MORTAR = 51005, 114942
+--- API to verify if an item can be processed through the Milling skill or with the Draenic Mortar.
+-- @name LibProcessable:IsMillable
+-- @usage LibStub('LibProcessable'):IsMillable(itemID[, ignoreMortar])
+-- @param itemID The itemID of the item to check against
+-- @param ignoreMortar Ignore the Draenic Mortar, an item to mill Draenor herbs without needing Inscription
+-- @return isMillable Boolean indicating if the player can process the item
+-- @return skillRequired Number representing the required skill to process the item
+-- @return skillLevel Number representing the player's skill in Inscription
+-- @return mortarItemID Number representing the Draenic Mortar, if used
+function lib:IsMillable(itemID, ignoreMortar)
+	assert(tonumber(itemID), 'itemID needs to be a number or convertable to a number')
+	itemID = tonumber(itemID)
+
+	if(IsSpellKnown(MILLING)) then
+		local skillRequired = lib.herbs[itemID]
+		return skillRequired and skillRequired <= inscriptionSkill, skillRequired, inscriptionSkill
+	elseif(not ignoreMortar and GetItemCount(MORTAR) > 0) then
+		return itemID >= 109124 and itemID <= 109130, 1, nil, MORTAR
+	end
+end
+
+local PROSPECTING = 31252
+--- API to verify if an item can be processed through the Prospecting skill.
+-- @name LibProcessable:IsProspectable
+-- @usage LibStub('LibProcessable'):IsProspectable(itemID)
+-- @param itemID The itemID of the item to check against
+-- @return isProspectable Boolean indicating if the player can process the item
+-- @return skillRequired Number representing the required skill to process the item
+-- @return skillLevel Number representing the player's skill in Jewelcrafting
+function lib:IsProspectable(itemID)
+	assert(tonumber(itemID), 'itemID needs to be a number or convertable to a number')
+	itemID = tonumber(itemID)
+
+	if(IsSpellKnown(PROSPECTING)) then
+		local skillRequired = lib.ores[itemID]
+		return skillRequired and skillRequired <= jewelcraftingSkill, skillRequired, jewelcraftingSkill
+	end
+end
+
+-- https://gist.github.com/p3lim/57acb053b3efccad0275
+local function GetSkillRequired(class, quality, level)
+	if(class == 2) then
+		if(quality == 2) then
+			if(level > 449) then
+				return 0
+			elseif(level > 416) then
+				return 475
+			elseif(level > 403) then
+				return 475
+			elseif(level > 390) then
+				return 475
+			elseif(level > 377) then
+				return 475
+			elseif(level > 363) then
+				return 475
+			elseif(level > 312) then
+				return 425
+			elseif(level > 305) then
+				return 425
+			elseif(level > 289) then
+				return 425
+			elseif(level > 272) then
+				return 425
+			elseif(level > 200) then
+				return 425
+			elseif(level > 153) then
+				return 350
+			elseif(level > 120) then
+				return 325
+			elseif(level > 99) then
+				return 275
+			elseif(level > 79) then
+				return 225
+			elseif(level > 65) then
+				return 225
+			elseif(level > 60) then
+				return 225
+			elseif(level > 55) then
+				return 200
+			elseif(level > 50) then
+				return 175
+			elseif(level > 45) then
+				return 150
+			elseif(level > 40) then
+				return 125
+			elseif(level > 35) then
+				return 100
+			elseif(level > 30) then
+				return 75
+			elseif(level > 25) then
+				return 50
+			elseif(level > 20) then
+				return 25
+			else
+				return 1
+			end
+		elseif(quality == 3) then
+			if(level > 499) then
+				return 0
+			elseif(level > 424) then
+				return 550
+			elseif(level > 377) then
+				return 525
+			elseif(level > 316) then
+				return 450
+			elseif(level > 200) then
+				return 450
+			elseif(level > 166) then
+				return 325
+			elseif(level > 115) then
+				return 325
+			elseif(level > 99) then
+				return 275
+			elseif(level > 79) then
+				return 225
+			elseif(level > 65) then
+				return 225
+			elseif(level > 60) then
+				return 225
+			elseif(level > 55) then
+				return 200
+			elseif(level > 50) then
+				return 175
+			elseif(level > 45) then
+				return 150
+			elseif(level > 40) then
+				return 125
+			elseif(level > 35) then
+				return 100
+			elseif(level > 30) then
+				return 75
+			elseif(level > 25) then
+				return 50
+			else
+				return 25
+			end
+		elseif(quality == 4) then
+			if(level > 599) then
+				return 0
+			elseif(level > 419) then
+				return 575
+			elseif(level > 299) then
+				return 475
+			elseif(level > 199) then
+				return 375
+			elseif(level > 99) then
+				return 300
+			elseif(level > 65) then
+				return 225
+			elseif(level > 60) then
+				return 225
+			elseif(level > 55) then
+				return 200
+			elseif(level > 50) then
+				return 175
+			elseif(level > 45) then
+				return 150
+			elseif(level > 40) then
+				return 125
+			elseif(level > 35) then
+				return 100
+			elseif(level > 30) then
+				return 75
+			elseif(level > 25) then
+				return 50
+			else
+				return 25
+			end
+		end
+	elseif(class == 4) then
+		if(quality == 2) then
+			if(level > 449) then
+				return 0
+			elseif(level > 416) then
+				return 475
+			elseif(level > 403) then
+				return 475
+			elseif(level > 390) then
+				return 475
+			elseif(level > 377) then
+				return 475
+			elseif(level > 363) then
+				return 475
+			elseif(level > 312) then
+				return 425
+			elseif(level > 305) then
+				return 425
+			elseif(level > 289) then
+				return 425
+			elseif(level > 272) then
+				return 425
+			elseif(level > 200) then
+				return 425
+			elseif(level > 153) then
+				return 350
+			elseif(level > 120) then
+				return 325
+			elseif(level > 99) then
+				return 275
+			elseif(level > 79) then
+				return 225
+			elseif(level > 65) then
+				return 225
+			elseif(level > 60) then
+				return 225
+			elseif(level > 55) then
+				return 200
+			elseif(level > 50) then
+				return 175
+			elseif(level > 45) then
+				return 150
+			elseif(level > 40) then
+				return 125
+			elseif(level > 35) then
+				return 100
+			elseif(level > 30) then
+				return 75
+			elseif(level > 25) then
+				return 50
+			elseif(level > 20) then
+				return 25
+			else
+				return 1
+			end
+		elseif(quality == 3) then
+			if(level > 499) then
+				return 0
+			elseif(level > 424) then
+				return 550
+			elseif(level > 377) then
+				return 525
+			elseif(level > 316) then
+				return 450
+			elseif(level > 200) then
+				return 450
+			elseif(level > 166) then
+				return 325
+			elseif(level > 115) then
+				return 325
+			elseif(level > 99) then
+				return 275
+			elseif(level > 79) then
+				return 225
+			elseif(level > 65) then
+				return 225
+			elseif(level > 60) then
+				return 225
+			elseif(level > 55) then
+				return 200
+			elseif(level > 50) then
+				return 175
+			elseif(level > 45) then
+				return 150
+			elseif(level > 40) then
+				return 125
+			elseif(level > 35) then
+				return 100
+			elseif(level > 30) then
+				return 75
+			elseif(level > 25) then
+				return 50
+			else
+				return 25
+			end
+		elseif(quality == 4) then
+			if(level > 599) then
+				return 0
+			elseif(level > 419) then
+				return 575
+			elseif(level > 299) then
+				return 475
+			elseif(level > 199) then
+				return 375
+			elseif(level > 99) then
+				return 300
+			elseif(level > 65) then
+				return 225
+			elseif(level > 60) then
+				return 225
+			elseif(level > 55) then
+				return 200
+			elseif(level > 50) then
+				return 175
+			elseif(level > 45) then
+				return 150
+			elseif(level > 40) then
+				return 125
+			elseif(level > 35) then
+				return 100
+			elseif(level > 30) then
+				return 75
+			elseif(level > 25) then
+				return 50
+			else
+				return 25
+			end
+		end
+	end
+end
+
+local DISENCHANTING = 13262
+--- API to verify if an item can be processed through the Disenchanting skill or garrison buildings.
+-- @name LibProcessable:IsDisenchantable
+-- @usage LibStub('LibProcessable'):IsDisenchantable(itemID[, ignoreGarrison[, ignoreGarrisonBuildingRequirement]])
+-- @param itemID The itemID of the item to check against
+-- @param ignoreGarrison Ignore the garrison enchanting buildings
+-- @param ignoreGarrisonBuildingRequirement Ignore the garrison enchanting building requirement
+-- @return isDisenchantable Boolean indicating if the player can process the item
+-- @return skillRequired Number representing the required skill to process the item
+-- @return skillLevel Number representing the player's skill in Enchanting
+function lib:IsDisenchantable(itemID, ignoreGarrison, ignoreGarrisonBuildingRequirement)
+	assert(tonumber(itemID), 'itemID needs to be a number or convertable to a number')
+	itemID = tonumber(itemID)
+
+	if(IsSpellKnown(DISENCHANTING)) then
+		local _, _, quality, level, _, type, _, _, _, _, _, class = GetItemInfo(itemID)
+		if(IsEquippableItem(itemID) and quality and level) then
+			local skillRequired = GetSkillRequired(class, quality, level)
+			return skillRequired and skillRequired <= enchantingSkill, skillRequired, enchantingSkill
+		end
+	elseif(not ignoreGarrison and (hasEnchantingBuilding or ignoreGarrisonBuildingRequirement)) then
+		local _, _, quality, level, _, type, _, _, _, _, _, class = GetItemInfo(itemID)
+		if(IsEquippableItem(itemID) and quality and level) then
+			local skillRequired = GetSkillRequired(class, quality, level)
+			return skillRequired and skillRequired == 0, skillRequired, enchantingSkill
+		end
+	end
+end
+
+-- http://www.wowhead.com/items/name:key?filter=86;2;0
+local function GetSkeletonKey(pickLevel)
+	if(pickLevel > 425) then
+		return 82960, 500 -- Ghostly Skeleton Key
+	elseif(pickLevel > 400) then
+		return 55053, 475 -- Obsidium Skeleton Key
+	elseif(pickLevel > 375) then
+		return 43853, 430 -- Titanium Skeleton Key
+	elseif(pickLevel > 300) then
+		return 43854, 350 -- Cobalt Skeleton Key
+	elseif(pickLevel > 200) then
+		return 15872, 275 -- Arcanite Skeleton Key
+	elseif(pickLevel > 125) then
+		return 15871, 200 -- Truesilver Skeleton Key
+	elseif(pickLevel > 25) then
+		return 15870, 150 -- Golden Skeleton Key
+	else
+		return 15869, 100 -- Silver Skeleton Key
+	end
+end
+
+-- http://www.wowhead.com/items/name:lock?filter=86;7;0
+local function GetJeweledLockpick(pickLevel)
+	if(pickLevel <= 750) then
+		return 130250, 1
+	end
+end
+
+local LOCKPICKING, BLACKSMITHING, JEWELCRAFTING = 1804, 2018, 25229
+--- API to verify if an item can be processed through the Lock Pick skill or with Blacksmithing skeleton keys.
+-- @name LibProcessable:IsOpenable
+-- @usage LibStub('LibProcessable'):IsOpenable(itemID[, ignoreProfessionKeys])
+-- @param itemID The itemID of the item to check against
+-- @param ignoreProfessionKeys Ignore checking for Skeleton Keys
+-- @return isOpenable Boolean indicating if the player can process the item
+-- @return skillRequired Number representing the required skill in Lockpicking or Blacksmithing to process the item
+-- @return skillLevel Number representing the player's skill in Lockpicking or Blacksmithing
+-- @return skeletonKeyItemID Number representing the Skeleton Key, if used
+function lib:IsOpenable(itemID, ignoreProfessionKeys)
+	assert(tonumber(itemID), 'itemID needs to be a number or convertable to a number')
+	itemID = tonumber(itemID)
+
+	local pickLevel = lib.containers[itemID]
+	if(IsSpellKnown(LOCKPICKING)) then
+		local playerSkill = UnitLevel('player') * 5
+		return pickLevel and pickLevel <= playerSkill, pickLevel, playerSkill
+	elseif(not ignoreProfessionKeys and pickLevel) then
+		if(GetSpellBookItemInfo(GetSpellInfo(BLACKSMITHING))) then
+			local skeletonKeyID, skillRequired = GetSkeletonKey(pickLevel)
+			return skillRequired <= blacksmithingSkill, skillRequired, blacksmithingSkill, skeletonKeyID
+		elseif(GetSpellBookItemInfo(GetSpellInfo(JEWELCRAFTING))) then
+			local lockpickID, skillRequired = GetJeweledLockpick(pickLevel)
+			return skillRequired <= jewelcraftingSkill, skillRequired, jewelcraftingSkill, lockpickID
+		end
+	end
+end
+
+local Handler = CreateFrame('Frame')
+Handler:RegisterEvent('SKILL_LINES_CHANGED')
+Handler:RegisterEvent('GARRISON_BUILDING_PLACED')
+Handler:RegisterEvent('GARRISON_BUILDING_REMOVED')
+Handler:SetScript('OnEvent', function(self, event, ...)
+	if(event == 'SKILL_LINES_CHANGED') then
+		inscriptionSkill, jewelcraftingSkill, enchantingSkill, blacksmithingSkill = 0, 0, 0, 0
+
+		local first, second = GetProfessions()
+		if(first) then
+			local _, _, skill, _, _, _, id = GetProfessionInfo(first)
+			if(id == 773) then
+				inscriptionSkill = skill
+			elseif(id == 755) then
+				jewelcraftingSkill = skill
+			elseif(id == 333) then
+				enchantingSkill = skill
+			elseif(id == 164) then
+				blacksmithingSkill = skill
+			end
+		end
+
+		if(second) then
+			local _, _, skill, _, _, _, id = GetProfessionInfo(second)
+			if(id == 773) then
+				inscriptionSkill = skill
+			elseif(id == 755) then
+				jewelcraftingSkill = skill
+			elseif(id == 333) then
+				enchantingSkill = skill
+			elseif(id == 164) then
+				blacksmithingSkill = skill
+			end
+		end
+	elseif(event == 'GARRISON_BUILDING_PLACED') then
+		local plotID = ...
+		local buildingID = C_Garrison.GetOwnedBuildingInfoAbbrev(plotID)
+		if(lib.enchantingBuildings[buildingID]) then
+			hasEnchantingBuilding = true
+		end
+	elseif(event == 'GARRISON_BUILDING_REMOVED') then
+		local _, buildingID = ...
+		if(lib.enchantingBuildings[buildingID]) then
+			hasEnchantingBuilding = false
+		end
+	end
+end)
+
+-- https://gist.github.com/p3lim/04e614e59c0064100c7c
+lib.herbs = {
+	[765] = 1, -- Silverleaf
+	[785] = 0, -- Mageroyal
+	[2447] = 1, -- Peacebloom
+	[2449] = 1, -- Earthroot
+	[2450] = 25, -- Briarthorn
+	[2452] = 25, -- Swiftthistle
+	[2453] = 25, -- Bruiseweed
+	[3355] = 75, -- Wild Steelbloom
+	[3356] = 75, -- Kingsblood
+	[3357] = 75, -- Liferoot
+	[3358] = 125, -- Khadgar's Whisker
+	[3369] = 75, -- Grave Moss
+	[3818] = 125, -- Fadeleaf
+	[3819] = 125, -- Dragon's Teeth
+	[3820] = 25, -- Stranglekelp
+	[3821] = 125, -- Goldthorn
+	[4625] = 175, -- Firebloom
+	[8831] = 175, -- Purple Lotus
+	[8836] = 175, -- Arthas' Tears
+	[8838] = 175, -- Sungrass
+	[8839] = 175, -- Blindweed
+	[8845] = 175, -- Ghost Mushroom
+	[8846] = 175, -- Gromsblood
+	[13463] = 225, -- Dreamfoil
+	[13464] = 225, -- Golden Sansam
+	[13465] = 225, -- Mountain Silversage
+	[13466] = 225, -- Sorrowmoss
+	[13467] = 200, -- Icecap
+	[22785] = 275, -- Felweed
+	[22786] = 275, -- Dreaming Glory
+	[22787] = 275, -- Ragveil
+	[22789] = 275, -- Terocone
+	[22790] = 275, -- Ancient Lichen
+	[22791] = 275, -- Netherbloom
+	[22792] = 275, -- Nightmare Vine
+	[22793] = 275, -- Mana Thistle
+	[36901] = 325, -- Goldclover
+	[36903] = 325, -- Adder's Tongue
+	[36904] = 325, -- Tiger Lily
+	[36905] = 325, -- Lichbloom
+	[36906] = 325, -- Icethorn
+	[36907] = 325, -- Talandra's Rose
+	[37921] = 325, -- Deadnettle
+	[39970] = 325, -- Fire Leaf
+	[52983] = 425, -- Cinderbloom
+	[52984] = 425, -- Stormvine
+	[52985] = 450, -- Azshara's Veil
+	[52986] = 450, -- Heartblossom
+	[52987] = 475, -- Twilight Jasmine
+	[52988] = 475, -- Whiptail
+	[72234] = 500, -- Green Tea Leaf
+	[72235] = 500, -- Silkweed
+	[72237] = 500, -- Rain Poppy
+	[79010] = 500, -- Snow Lily
+	[79011] = 500, -- Fool's Cap
+	[89639] = 500, -- Desecrated Herb
+	[109124] = 0, -- Frostweed
+	[109125] = 0, -- Fireweed
+	[109126] = 0, -- Gorgrond Flytrap
+	[109127] = 0, -- Starflower
+	[109128] = 0, -- Nagrand Arrowbloom
+	[109129] = 0, -- Talador Orchid
+	[109130] = 0, -- Chameleon Lotus
+	[124101] = 0, -- Aethril
+	[124102] = 0, -- Dreamleaf
+	[124103] = 0, -- Foxflower
+	[124104] = 0, -- Fjarnskaggl
+	[124105] = 0, -- Starlight Rose
+	[124106] = 0, -- Felwort
+	[128304] = 0, -- Yseralline Seed (this might be an error in the data files)
+}
+
+-- https://gist.github.com/p3lim/5c0363251db4a110017b
+lib.ores = {
+	[2770] = 1, -- Copper Ore
+	[2771] = 50, -- Tin Ore
+	[2772] = 125, -- Iron Ore
+	[3858] = 175, -- Mithril Ore
+	[10620] = 250, -- Thorium Ore
+	[23424] = 275, -- Fel Iron Ore
+	[23425] = 325, -- Adamantite Ore
+	[36909] = 350, -- Cobalt Ore
+	[36910] = 450, -- Titanium Ore
+	[36912] = 400, -- Saronite Ore
+	[52183] = 500, -- Pyrite Ore
+	[52185] = 475, -- Elementium Ore
+	[53038] = 425, -- Obsidium Ore
+	[72092] = 500, -- Ghost Iron Ore
+	[72093] = 550, -- Kyparite
+	[72094] = 600, -- Black Trillium Ore
+	[72103] = 600, -- White Trillium Ore
+	[123918] = 0, -- Leystone Ore
+	[123919] = 0, -- Felslate
+}
+
+-- http://www.wowhead.com/items?filter=10:161:128;1:1:1;::
+lib.containers = {
+	[4632] = 1, -- Ornate Bronze Lockbox
+	[6354] = 1, -- Small Locked Chest
+	[16882] = 1, -- Battered Junkbox
+	[4633] = 25, -- Heavy Bronze Lockbox
+	[4634] = 70, -- Iron Lockbox
+	[6355] = 70, -- Sturdy Locked Chest
+	[16883] = 70, -- Worn Junkbox
+	[4636] = 125, -- Strong Iron Lockbox
+	[4637] = 175, -- Steel Lockbox
+	[13875] = 175, -- Ironbound Locked Chest
+	[16884] = 175, -- Sturdy Junkbox
+	[4638] = 225, -- Reinforced Steel Lockbox
+	[5758] = 225, -- Mithril Lockbox
+	[5759] = 225, -- Thorium Lockbox
+	[5760] = 225, -- Eternium Lockbox
+	[13918] = 250, -- Reinforced Locked Chest
+	[16885] = 250, -- Heavy Junkbox
+	[12033] = 275, -- Thaurissan Family Jewels
+	[29569] = 300, -- Strong Junkbox
+	[31952] = 325, -- Khorium Lockbox
+	[43575] = 350, -- Reinforced Junkbox
+	[43622] = 375, -- Froststeel Lockbox
+	[43624] = 400, -- Titanium Lockbox
+	[45986] = 400, -- Tiny Titanium Lockbox
+	[63349] = 400, -- Flame-Scarred Junkbox
+	[68729] = 425, -- Elementium Lockbox
+	[88567] = 450, -- Ghost Iron Lockbox
+	[88165] = 450, -- Vine-Cracked Junkbox
+	[106895] = 500, -- Iron-Bound Junkbox
+	[116920] = 500, -- True Steel Lockbox
+}
+
+lib.enchantingBuildings = {
+	[93] = true,
+	[125] = true,
+	[126] = true,
+}
diff --git a/ElvUI_SLE/libs/LibProcessable/LibProcessable.toc b/ElvUI_SLE/libs/LibProcessable/LibProcessable.toc
new file mode 100644
index 0000000..114e82b
--- /dev/null
+++ b/ElvUI_SLE/libs/LibProcessable/LibProcessable.toc
@@ -0,0 +1,12 @@
+## Interface: 70000
+## Author: p3lim
+## Version: 13
+## Title: Lib: Processable
+## Notes: Library that lets you easily check if you can process resources
+## OptionalDeps: LibStub
+## X-Curse-Packaged-Version: 13
+## X-Curse-Project-Name: LibProcessable
+## X-Curse-Project-ID: libprocessable
+## X-Curse-Repository-ID: wow/libprocessable/mainline
+
+embed.xml
diff --git a/ElvUI_SLE/libs/LibProcessable/LibStub/LibStub.lua b/ElvUI_SLE/libs/LibProcessable/LibStub/LibStub.lua
new file mode 100644
index 0000000..0a41ac0
--- /dev/null
+++ b/ElvUI_SLE/libs/LibProcessable/LibStub/LibStub.lua
@@ -0,0 +1,30 @@
+-- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2  -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+local LibStub = _G[LIBSTUB_MAJOR]
+
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+	LibStub = LibStub or {libs = {}, minors = {} }
+	_G[LIBSTUB_MAJOR] = LibStub
+	LibStub.minor = LIBSTUB_MINOR
+
+	function LibStub:NewLibrary(major, minor)
+		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+		minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
+		local oldminor = self.minors[major]
+		if oldminor and oldminor >= minor then return nil end
+		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+		return self.libs[major], oldminor
+	end
+
+	function LibStub:GetLibrary(major, silent)
+		if not self.libs[major] and not silent then
+			error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+		end
+		return self.libs[major], self.minors[major]
+	end
+
+	function LibStub:IterateLibraries() return pairs(self.libs) end
+	setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
diff --git a/ElvUI_SLE/libs/LibProcessable/LibStub/LibStub.toc b/ElvUI_SLE/libs/LibProcessable/LibStub/LibStub.toc
new file mode 100644
index 0000000..17cf732
--- /dev/null
+++ b/ElvUI_SLE/libs/LibProcessable/LibStub/LibStub.toc
@@ -0,0 +1,13 @@
+## Interface: 20400
+## Title: Lib: LibStub
+## Notes: Universal Library Stub
+## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
+## X-Website: http://jira.wowace.com/browse/LS
+## X-Category: Library
+## X-License: Public Domain
+## X-Curse-Packaged-Version: 1.0
+## X-Curse-Project-Name: LibStub
+## X-Curse-Project-ID: libstub
+## X-Curse-Repository-ID: wow/libstub/mainline
+
+LibStub.lua
diff --git a/ElvUI_SLE/libs/LibProcessable/embed.xml b/ElvUI_SLE/libs/LibProcessable/embed.xml
new file mode 100644
index 0000000..343b382
--- /dev/null
+++ b/ElvUI_SLE/libs/LibProcessable/embed.xml
@@ -0,0 +1,7 @@
+<Ui>
+	<!-- Libraries -->
+	<Script file='LibStub\LibStub.lua'/>
+
+	<!-- Project -->
+	<Script file='LibProcessable.lua'/>
+</Ui>
diff --git a/ElvUI_SLE/libs/load_libs.xml b/ElvUI_SLE/libs/load_libs.xml
index 7702f29..ff6b904 100644
--- a/ElvUI_SLE/libs/load_libs.xml
+++ b/ElvUI_SLE/libs/load_libs.xml
@@ -1 +1 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/">
	<Script file="AceAddon-3.0\AceAddon-3.0.lua"/>
	<Script file="AceConsole-3.0\AceConsole-3.0.lua"/>
	<Include file="LibTourist-3.0\lib.xml" />
	<Script file="AceDB-3.0\AceDB-3.0.lua"/>
	<Include file="LibElv-UIButtons-1.0\load_uibuttons.xml"/>
	<Include file="LibElv-GameMenu-1.0\LibElv-GameMenu-1.0.lua"/>
	<Script file="LibAnim\LibAnim.lua"/>
	<Script file="LibQTip-1.0\LibQTip-1.0.lua"/>
	<Script file="LibRangeCheck-2.0\LibRangeCheck-2.0.lua"/>
	<Include file="LibBabble-SubZone-3.0\lib.xml"/>
	<Include file="LibFishing-1.0\lib.xml" />
	<Script file="oUF_OfflineSLE\oUF_OfflineSLE.lua"/>
</Ui>
\ No newline at end of file
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
	<Script file="AceAddon-3.0\AceAddon-3.0.lua"/>
	<Script file="AceConsole-3.0\AceConsole-3.0.lua"/>
	<Include file="LibTourist-3.0\lib.xml" />
	<Script file="AceDB-3.0\AceDB-3.0.lua"/>
	<Include file="LibElv-UIButtons-1.0\load_uibuttons.xml"/>
	<Include file="LibElv-GameMenu-1.0\LibElv-GameMenu-1.0.lua"/>
	<Script file="LibAnim\LibAnim.lua"/>
	<Script file="LibQTip-1.0\LibQTip-1.0.lua"/>
	<Script file="LibRangeCheck-2.0\LibRangeCheck-2.0.lua"/>
	<Include file="LibBabble-SubZone-3.0\lib.xml"/>
	<Include file="LibFishing-1.0\lib.xml" />
	<Script file="oUF_OfflineSLE\oUF_OfflineSLE.lua"/>
	<Include file="LibProcessable\LibProcessable.lua"/>
</Ui>
\ No newline at end of file