Module:InventorySlot: Difference between revisions
Jump to navigation
Jump to search
(Should now add `invslot` to html item slots) |
(Made gm4 items easier) |
||
Line 3: | Line 3: | ||
local UISlot = {} | local UISlot = {} | ||
local | local sprite = require([[Module:Sprite]]) | ||
local Sprites = { | |||
minecraft = sprite:new("inventory"), | |||
gm4 = sprite:new("gm4") | |||
} | |||
function UISlot:new(item, large) | function UISlot:new(item, large) | ||
Line 13: | Line 17: | ||
end | end | ||
-- Sets the item of this UISlot. If 'raw html' (=first char == '<') then | |||
-- this will return said html wrapped instead of doing a item lookup | |||
function UISlot:SetItem(item) | function UISlot:SetItem(item) | ||
if string.sub(item or "",1,1) == '<' then | if string.sub(item or "",1,1) == '<' then | ||
Line 20: | Line 26: | ||
end | end | ||
return self | |||
end | |||
function UISlot.Decode(item) | |||
if item == "" then item = nil end | if item == "" then item = nil end | ||
if item then | |||
return | -- split at ':' | ||
local t={} | |||
for str in string.gmatch(item, "([^:]+)") do | |||
table.insert(t, str) | |||
end | |||
if #t == 1 then | |||
return Sprites.minecraft:Item(item) | |||
elseif #t == 2 then | |||
local spr = Sprites[mw.text.trim(t[1])] | |||
if spr then | |||
return spr:Item(mw.text.trim(t[2])) | |||
else | |||
error("Unknown namespace: " .. mw.text.trim(t[1])) | |||
end | |||
else | |||
error("Got unexpected amount of ':', namely:" .. (#t - 1)) | |||
end | |||
else | |||
return nil | |||
end | |||
end | end | ||
-- Append the HTML for an item | |||
function UISlot.Item(item, large, html) | function UISlot.Item(item, large, html) | ||
return UISlot:new(item, large):GenerateHTML(html) | return UISlot:new(item, large):GenerateHTML(html) | ||
end | end | ||
-- Generate the HTML for a grid of items | |||
function UISlot.Call(items, width, height, size) | function UISlot.Call(items, width, height, size) | ||
local w = width or 1 | local w = width or 1 | ||
Line 43: | Line 78: | ||
end | end | ||
-- Convert a 2d list of itemnames to an HTML grid | |||
function UISlot.Grid(items, large) | function UISlot.Grid(items, large) | ||
local root = mw.html.create( "table" ):addClass("invgrid") | local root = mw.html.create( "table" ):addClass("invgrid") |
Revision as of 20:00, 30 April 2020
-- Based on work by the MC wiki: https://minecraft.gamepedia.com/
local UISlot = {}
local sprite = require([[Module:Sprite]])
local Sprites = {
minecraft = sprite:new("inventory"),
gm4 = sprite:new("gm4")
}
function UISlot:new(item, large)
o = {}
setmetatable(o, {__index = self})
o:SetItem(item)
o.__large = large
return o
end
-- Sets the item of this UISlot. If 'raw html' (=first char == '<') then
-- this will return said html wrapped instead of doing a item lookup
function UISlot:SetItem(item)
if string.sub(item or "",1,1) == '<' then
-- If the item is already html just save that
self.__html = item
return self
end
return self
end
function UISlot.Decode(item)
if item == "" then item = nil end
if item then
-- split at ':'
local t={}
for str in string.gmatch(item, "([^:]+)") do
table.insert(t, str)
end
if #t == 1 then
return Sprites.minecraft:Item(item)
elseif #t == 2 then
local spr = Sprites[mw.text.trim(t[1])]
if spr then
return spr:Item(mw.text.trim(t[2]))
else
error("Unknown namespace: " .. mw.text.trim(t[1]))
end
else
error("Got unexpected amount of ':', namely:" .. (#t - 1))
end
else
return nil
end
end
-- Append the HTML for an item
function UISlot.Item(item, large, html)
return UISlot:new(item, large):GenerateHTML(html)
end
-- Generate the HTML for a grid of items
function UISlot.Call(items, width, height, size)
local w = width or 1
local h = height or 1
local grid = {}
local large = size
for i = 1,h do
grid[i] = {}
for j = 1,w do
grid[i][j] = mw.text.trim(items[j+(i-1)*w] or "")
end
end
return UISlot.Grid(grid, large)
end
-- Convert a 2d list of itemnames to an HTML grid
function UISlot.Grid(items, large)
local root = mw.html.create( "table" ):addClass("invgrid")
for i = 1, #items do
local row = root:tag("tr"):addClass("invrow")
for j = 1, #items[i] do
UISlot.Item(items[i][j], large, row)
end
end
return root
end
function UISlot:GenerateHTML (html)
local slot
if html then
slot = html:tag("td")
else
slot = mw.html.create("div")
end
slot:addClass( "invslot" )
if self.__large then
slot:addClass( "invslot-large")
end
if self.__html then
slot:wikitext(self.__html)
end
if self.__sprite then
self.__sprite:GenerateHTML(slot)
end
return slot
end
return UISlot