You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.4 KiB
180 lines
5.4 KiB
|
3 years ago
|
--[[
|
||
|
|
LibItemBuffs-1.0 - buff-to-item database.
|
||
|
|
(c) 2013-2018 Adirelle (adirelle@gmail.com)
|
||
|
|
|
||
|
|
This file is part of LibItemBuffs-1.0.
|
||
|
|
|
||
|
|
LibItemBuffs-1.0 is free software: you can redistribute it and/or modify
|
||
|
|
it under the terms of the GNU General Public License as published by
|
||
|
|
the Free Software Foundation, either version 3 of the License, or
|
||
|
|
(at your option) any later version.
|
||
|
|
|
||
|
|
LibItemBuffs-1.0 is distributed in the hope that it will be useful,
|
||
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
|
GNU General Public License for more details.
|
||
|
|
|
||
|
|
You should have received a copy of the GNU General Public License
|
||
|
|
along with LibItemBuffs-1.0. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
--]]
|
||
|
|
|
||
|
|
local MAJOR, MINOR, lib = "LibItemBuffs-1.0", 9
|
||
|
|
if LibStub then
|
||
|
|
lib = LibStub:NewLibrary(MAJOR, MINOR)
|
||
|
|
if not lib then return end
|
||
|
|
else
|
||
|
|
lib = {}
|
||
|
|
end
|
||
|
|
|
||
|
|
lib.__itemBuffs = lib.__itemBuffs or {}
|
||
|
|
lib.__databaseVersion = lib.__databaseVersion or 0
|
||
|
|
|
||
|
|
lib.trinkets = lib.trinkets or {}
|
||
|
|
lib.consumables = lib.consumables or {}
|
||
|
|
lib.enchantments = lib.enchantments or {}
|
||
|
|
lib.slots = lib.slots or {}
|
||
|
|
|
||
|
|
--- Tell whether a spell is an item buff or not.
|
||
|
|
-- @name LibItemBuffs:IsItemBuff
|
||
|
|
-- @param spellID number Spell identifier.
|
||
|
|
-- @return boolean True if the spell is a buff given by an item.
|
||
|
|
function lib:IsItemBuff(spellID)
|
||
|
|
return not not (spellID and (lib.enchantments[spellID] or lib.trinkets[spellID] or lib.consumables[spellID]))
|
||
|
|
end
|
||
|
|
|
||
|
|
--- Return the inventory slot containing the item that can apply the given buff.
|
||
|
|
-- @name LibItemBuffs:GetBuffInventorySlot
|
||
|
|
-- @param spellID number Spell identifier.
|
||
|
|
-- @return number The inventory slot of matching item (see INVSLOT_* values), returns nil for items in bags.
|
||
|
|
function lib:GetBuffInventorySlot(spellID)
|
||
|
|
if not spellID then return end
|
||
|
|
|
||
|
|
local invSlot = lib.enchantments[spellID]
|
||
|
|
if invSlot then
|
||
|
|
return invSlot
|
||
|
|
end
|
||
|
|
|
||
|
|
local itemID = lib.trinkets[spellID]
|
||
|
|
if not itemID then return end
|
||
|
|
|
||
|
|
local trinket1 = GetInventoryItemID("player", INVSLOT_TRINKET1)
|
||
|
|
local trinket2 = GetInventoryItemID("player", INVSLOT_TRINKET2)
|
||
|
|
if type(itemID) == "table" then
|
||
|
|
for i, realID in ipairs(itemID) do
|
||
|
|
if realID == trinket1 then
|
||
|
|
return INVSLOT_TRINKET1
|
||
|
|
end
|
||
|
|
if realID == trinket2 then
|
||
|
|
return INVSLOT_TRINKET2
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if itemID == trinket1 then
|
||
|
|
return INVSLOT_TRINKET1
|
||
|
|
end
|
||
|
|
if itemID == trinket2 then
|
||
|
|
return INVSLOT_TRINKET2
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--- Return the identifier of the item that can apply the given buff.
|
||
|
|
-- @name LibItemBuffs:GetBuffItemID
|
||
|
|
-- @param spellID number Spell identifier.
|
||
|
|
-- @return number The item identifier(s) or nil.
|
||
|
|
function lib:GetBuffItemID(spellID)
|
||
|
|
if not spellID then return end
|
||
|
|
|
||
|
|
local itemID = lib.trinkets[spellID] or lib.consumables[spellID]
|
||
|
|
if type(itemID) == "table" then
|
||
|
|
return unpack(itemID)
|
||
|
|
elseif itemID then
|
||
|
|
return itemID
|
||
|
|
end
|
||
|
|
|
||
|
|
local invSlot = lib.enchantments[spellID]
|
||
|
|
return invSlot and GetInventoryItemID("player", invSlot)
|
||
|
|
end
|
||
|
|
|
||
|
|
--- Get the list of inventory slots for which the library has information.
|
||
|
|
-- @name LibItemBuffs:GetInventorySlotList
|
||
|
|
-- @return table A list of INVSLOT_* values.
|
||
|
|
function lib:GetInventorySlotList()
|
||
|
|
return lib.slots
|
||
|
|
end
|
||
|
|
|
||
|
|
--- Return the buffs provided by then given item, excluding any enchant.
|
||
|
|
-- @name LibItemBuffs:GetItemBuffs
|
||
|
|
-- @param itemID number Item identifier.
|
||
|
|
-- @return number, ... A list of spell identifiers.
|
||
|
|
function lib:GetItemBuffs(itemID)
|
||
|
|
if not itemID then return end
|
||
|
|
local buffs = lib.__itemBuffs[itemID]
|
||
|
|
if type(buffs) == "table" then
|
||
|
|
return unpack(buffs)
|
||
|
|
end
|
||
|
|
return buffs
|
||
|
|
end
|
||
|
|
|
||
|
|
local function AddReverseEntry(reverse, spellID, itemID)
|
||
|
|
if type(itemID) == "table" then
|
||
|
|
for i, value in ipairs(itemID) do
|
||
|
|
AddReverseEntry(reverse, spellID, value)
|
||
|
|
end
|
||
|
|
return
|
||
|
|
end
|
||
|
|
local previous = reverse[itemID]
|
||
|
|
if not previous then
|
||
|
|
reverse[itemID] = spellID
|
||
|
|
elseif type(previous) == "table" then
|
||
|
|
tinsert(previous, spellID)
|
||
|
|
else
|
||
|
|
reverse[itemID] = { previous, spellID }
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Add the content of the given table into the reverse table.
|
||
|
|
-- Create a table when an item can provide several buffs.
|
||
|
|
local function FeedReverseTable(reverse, data)
|
||
|
|
for spellID, itemID in pairs(data) do
|
||
|
|
AddReverseEntry(reverse, spellID, itemID)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function lib:GetDatabaseVersion()
|
||
|
|
return floor(lib.__databaseVersion/10)
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Upgrade the trinket and consumables database if needed
|
||
|
|
function lib:__UpgradeDatabase(version, trinkets, consumables, enchantments)
|
||
|
|
assert(
|
||
|
|
type(version) == "number" and type(trinkets) == "table" and
|
||
|
|
type(consumables) == "table" and type(enchantments) == "table",
|
||
|
|
format('Usage: LibStub("%s"):__UpgradeDatabase(version, trinkets, consumables, enchantments)', MAJOR)
|
||
|
|
)
|
||
|
|
version = version*10 + MINOR -- Factor in the library revision
|
||
|
|
if version <= lib.__databaseVersion then return end
|
||
|
|
|
||
|
|
-- Upgrade the tables
|
||
|
|
lib.__databaseVersion = version
|
||
|
|
lib.trinkets = trinkets
|
||
|
|
lib.consumables = consumables
|
||
|
|
lib.enchantments = enchantments
|
||
|
|
|
||
|
|
-- Rebuild the reverse database
|
||
|
|
wipe(lib.__itemBuffs)
|
||
|
|
FeedReverseTable(lib.__itemBuffs, trinkets)
|
||
|
|
FeedReverseTable(lib.__itemBuffs, consumables)
|
||
|
|
|
||
|
|
-- Rebuild the slot list
|
||
|
|
wipe(lib.slots)
|
||
|
|
local slotSet = {}
|
||
|
|
for _, slot in pairs(enchantments) do
|
||
|
|
slotSet[slot] = true
|
||
|
|
end
|
||
|
|
for slot in pairs(slotSet) do
|
||
|
|
tinsert(lib.slots, slot)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return lib
|