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.
166 lines
3.2 KiB
166 lines
3.2 KiB
--[[
|
|
|
|
This file is part of 'Masque', an add-on for World of Warcraft. For bug reports,
|
|
suggestions and license information, please visit https://github.com/SFX-WoW/Masque.
|
|
|
|
* File...: Skins\Skins.lua
|
|
* Author.: StormFX, JJSheets
|
|
|
|
Skin API
|
|
|
|
]]
|
|
|
|
local _, Core = ...
|
|
|
|
----------------------------------------
|
|
-- Lua
|
|
---
|
|
|
|
local error, setmetatable, type = error, setmetatable, type
|
|
|
|
----------------------------------------
|
|
-- Internal
|
|
---
|
|
|
|
-- @ Skins\Regions
|
|
local Layers = Core.RegTypes.Legacy
|
|
|
|
----------------------------------------
|
|
-- Locals
|
|
---
|
|
|
|
local Skins, SkinList = {}, {}
|
|
local Hidden = {Hide = true}
|
|
|
|
----------------------------------------
|
|
-- Functions
|
|
---
|
|
|
|
-- Returns a valid shape.
|
|
local function GetShape(Shape)
|
|
if type(Shape) ~= "string" then
|
|
Shape = "Square"
|
|
end
|
|
return Shape
|
|
end
|
|
|
|
-- Adds data to the skin tables.
|
|
local function AddSkin(SkinID, SkinData)
|
|
local Template = SkinData.Template
|
|
local Default = Skins.Default
|
|
|
|
if Template then
|
|
setmetatable(SkinData, {__index = Skins[Template]})
|
|
end
|
|
|
|
for Layer, Info in pairs(Layers) do
|
|
local Skin = SkinData[Layer]
|
|
|
|
if Layer == "AutoCastShine" then
|
|
Skin = Skin or SkinData.Shine or SkinData.AutoCast
|
|
elseif Layer == "ChargeCooldown" then
|
|
Skin = Skin or SkinData.Cooldown
|
|
end
|
|
|
|
if (type(Skin) ~= "table") or (Skin.Hide and not Info.CanHide) then
|
|
Skin = Default[Layer]
|
|
elseif Info.Hide then
|
|
Skin = Hidden
|
|
end
|
|
|
|
SkinData[Layer] = Skin
|
|
end
|
|
|
|
SkinData.SkinID = SkinID
|
|
SkinData.API_VERSION = SkinData.API_VERSION or SkinData.Masque_Version
|
|
|
|
local Shape = SkinData.Shape
|
|
SkinData.Shape = GetShape(Shape)
|
|
|
|
Skins[SkinID] = SkinData
|
|
|
|
if not SkinData.Disable then
|
|
SkinList[SkinID] = SkinID
|
|
end
|
|
end
|
|
|
|
----------------------------------------
|
|
-- Core
|
|
---
|
|
|
|
Core.__Hidden = Hidden
|
|
Core.AddSkin = AddSkin
|
|
|
|
Core.Skins = setmetatable(Skins, {
|
|
__index = function(self, id)
|
|
if id == "Blizzard" then
|
|
return self.Classic
|
|
end
|
|
end
|
|
})
|
|
|
|
Core.SkinList = SkinList
|
|
|
|
----------------------------------------
|
|
-- API
|
|
---
|
|
|
|
local API = Core.API
|
|
|
|
-- Wrapper for the AddSkin function.
|
|
function API:AddSkin(SkinID, SkinData, Replace)
|
|
local Debug = Core.Debug
|
|
|
|
if type(SkinID) ~= "string" then
|
|
if Debug then
|
|
error("Bad argument to API method 'AddSkin'. 'SkinID' must be a string.", 2)
|
|
end
|
|
return
|
|
end
|
|
|
|
if Skins[SkinID] then return end
|
|
|
|
if type(SkinData) ~= "table" then
|
|
if Debug then
|
|
error("Bad argument to API method 'AddSkin'. 'SkinData' must be a table.", 2)
|
|
end
|
|
return
|
|
end
|
|
|
|
local Template = SkinData.Template
|
|
|
|
if Template then
|
|
if type(Template) ~= "string" then
|
|
if Debug then
|
|
error(("Invalid template reference by skin '%s'. 'Template' must be a string."):format(SkinID), 2)
|
|
end
|
|
return
|
|
end
|
|
|
|
local Parent = Skins[Template]
|
|
|
|
if type(Parent) ~= "table" then
|
|
if Debug then
|
|
error(("Invalid template reference by skin '%s'. Template '%s' does not exist or is not a table."):format(SkinID, Template), 2)
|
|
end
|
|
return
|
|
end
|
|
end
|
|
|
|
AddSkin(SkinID, SkinData)
|
|
end
|
|
|
|
-- Retrieves the default skin.
|
|
function API:GetDefaultSkin()
|
|
return "Classic"
|
|
end
|
|
|
|
-- Retrieves the skin data for the specified skin.
|
|
function API:GetSkin(SkinID)
|
|
return SkinID and Skins[SkinID]
|
|
end
|
|
|
|
-- Retrieves the Skins table.
|
|
function API:GetSkins()
|
|
return Skins
|
|
end
|
|
|