Module:Sprite: Difference between revisions

From Official Gamemode 4 Wiki
Jump to navigation Jump to search
(Remove sprite level inline support)
(Added Custom Sprite Support)
Line 14: Line 14:
align = 'text-top'
align = 'text-top'
}
}
function getImage( image )
if not(image) then return nil end
local file = mw.title.new(image,"File").file
if not(file.exists) then return nil end
local f = mw.getCurrentFrame()
local t = {
url = f:expandTemplate{
title = 'FileUrl',
args = { image}
}
}
setmetatable(t, {__index = file})
return t
end


function Sprite:new (type)
function Sprite:new (type)
source = types[type]
local source = types[type]
if not(source) then
if not(source) then
error("Unknown type: " .. tostring(type))
error("Unknown type: " .. tostring(type))
end
end
o = {
o = {
__source = require(source),
__source = require(source),
}
setmetatable(o, {__index = self})
o:load()
return o
end
 
Sprite.Custom = {}
setmetatable(Sprite.Custom, {__index = Sprite})
local CustomSprite = Sprite.Custom
 
function CustomSprite:new(name, imagename)
local image = getImage(imagename)
if not(image) then
error("Couldn't find image: " .. tostring(imagename))
end
 
local size = image.width
 
o = {
__source = {
settings={
ids={[name]=1},
size = size,
sheetsize = size,
image = image
}
}
}
}
setmetatable(o, {__index = self})
setmetatable(o, {__index = self})
Line 36: Line 82:
scale = settings.scale,
scale = settings.scale,
autoScale = settings.autoscale,
autoScale = settings.autoscale,
image = settings.image or getImage(settings.imagename)
}
}


Line 77: Line 124:
function Sprite:calculateStyles()
function Sprite:calculateStyles()
styles = {}
styles = {}
function append(key, value) styles[#styles+1]=key .. ": " .. value return table end
function append(key, value) if value ~= nil then styles[#styles+1]=key .. ": " .. value end end
local settings = self.__settings
local settings = self.__settings


Line 92: Line 139:
local top = math.floor( pos / settings.tiles ) * settings.size * settings.scale
local top = math.floor( pos / settings.tiles ) * settings.size * settings.scale
append("background-position", '-' .. left .. 'px -' .. top .. 'px')
append("background-position", '-' .. left .. 'px -' .. top .. 'px')
if settings.image then
append("background", "url(" .. settings.image.url .. ")")
end


return table.concat( styles, "; " )
return table.concat( styles, "; " )
Line 99: Line 149:
local sprite
local sprite
if html then
if html then
sprite = html:tag("div")
if type(html) == "string" then
sprite = mw.html.create(html)
else
sprite = html:tag("div")
end
else
else
sprite = mw.html.create("div")
sprite = mw.html.create("div")

Revision as of 16:59, 2 July 2019

-- Based on work by the MC wiki: https://minecraft.gamepedia.com/ and https://minecraft.gamepedia.com/Module:Sprite

local Sprite = {}

local types = {
	inventory = [[Module:InvSprite]],
}

local defaultSettings = {
	scale = 1,
	sheetsize = 256,
	size = 16,
	pos = 1,
	align = 'text-top'
}

function getImage( image )
	if not(image) then return nil end
	local file = mw.title.new(image,"File").file
	if not(file.exists) then return nil end


	local f = mw.getCurrentFrame()
	local t = {
		url = f:expandTemplate{
			title = 'FileUrl',
			args = { image}
		}
	}

	setmetatable(t, {__index = file})

	return t
end

function Sprite:new (type)
	local source = types[type]
	if not(source) then
		error("Unknown type: " .. tostring(type))
	end
	o = {
			__source = require(source),
		}
	setmetatable(o, {__index = self})
	o:load()
	return o
end

Sprite.Custom = {}
setmetatable(Sprite.Custom, {__index = Sprite})
local CustomSprite = Sprite.Custom

function CustomSprite:new(name, imagename)
	local image = getImage(imagename)
	if not(image) then
		error("Couldn't find image: " .. tostring(imagename))
	end

	local size = image.width

	o = {
			__source = {
				settings={
					ids={[name]=1},
					size = size,
					sheetsize = size,
					image = image
				}
			}
		}
	setmetatable(o, {__index = self})
	o:load()
	return o
end

function Sprite:load()
	local settings = self.__source.settings
	self.__settings = {
		size = settings.size,
		sheetWidth = settings.sheetsize,
		tiles = settings.sheetsize / settings.size,
		scale = settings.scale,
		autoScale = settings.autoscale,
		image = settings.image or getImage(settings.imagename)
	}

	setmetatable(self.__settings, {__index=defaultSettings})
end

function Sprite:setItem(item)
	self.__settings.name = item;
	if self.__source.ids[item] then
		self:setPosition(self.__source.ids[item].pos)
	else
		self:setPosition(nil) --will use default
	end
	return self
end

function Sprite:Item(item)
	local sprite = {}
	setmetatable(sprite, {__index = self})
	local settings = {}
	setmetatable(settings, {__index = self.__settings})
	sprite.__settings = settings
	return sprite:setItem(item)
end

function Sprite:setPosition(pos)
	self.__settings.pos = pos or self.__settings.pos
	return self
end

function Sprite:SetScale(scale)
	self.__settings.scale = scale
	return self
end

function Sprite:SetSize(size)
	self.__settings.scale = size / self.__settings.size
	return self
end

function Sprite:calculateStyles()
	styles = {}
	function append(key, value) if value ~= nil then styles[#styles+1]=key .. ": " .. value end end
	local settings = self.__settings

	append ("background-size", settings.sheetWidth * settings.scale .. 'px auto')

	local t = settings.size * settings.scale .. 'px'

	append ("height", t)
	append ("width", t)
	append ("vertical-align", settings.align)

	local pos = self.__settings.pos - 1
	local left = pos % settings.tiles * settings.size * settings.scale
	local top = math.floor( pos / settings.tiles ) * settings.size * settings.scale
	append("background-position", '-' .. left .. 'px -' .. top .. 'px')
	if settings.image then
		append("background", "url(" .. settings.image.url .. ")")
	end

	return table.concat( styles, "; " )
end

function Sprite:GenerateHTML (html)
	local sprite
	if html then
		if type(html) == "string" then
			sprite = mw.html.create(html)
		else
			sprite = html:tag("div")
		end
	else
		sprite = mw.html.create("div")
	end

	sprite:addClass("sprite")

	local source = self.__source
	sprite:addClass(source.settings.classname)
	sprite:attr( "title", self.__settings.name )

	sprite:cssText( self:calculateStyles() )

	return sprite
end

return Sprite