Module:UI: Difference between revisions

From Create: Minecraft Mod Wiki
Jump to navigation Jump to search
Create: Minecraft Mod Wiki>Joker876
No edit summary
Create: Minecraft Mod Wiki>Joker876
No edit summary
Line 347: Line 347:
local isChance = false
local isChance = false
for j=1,50,1 do
for j=1,50,1 do
if args['Chance'..i or 'C'..i] then
if args['Chance'..j or 'C'..j] then
isChance = true
isChance = true
break
break

Revision as of 19:42, 16 April 2021

Documentation for this module may be created at Module:UI/doc

local slot = require( [[Module:Inventory slot]] ).slot
local function addSlot(args, item, prefix, class, default)
	local none, nostacksize
	prefix = prefix or ''
	if #prefix == 0 then
		none = 'none'
		nostacksize = ((item == '' or nil) and '') or (args and args[item] and args[item]:gsub('[,%d]', '') or '')
	end
	return slot{
		nostacksize or args[item], mod = args.Mod, link = none or args[prefix .. 'link'],
		title = none or args[prefix .. 'title'], class = class, default = default,
		parsed = args.parsed, forcenum = args.forcenum
	}
end

local p = {}

-- Crafting table
function p.craftingTable(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	local body = mw.html.create('span'):addClass('mcui mcui-Crafting_Table pixel-image')
	
	-- CUSTOM: changing grid to use <table> since wikia mobile doesn't support CSS
	local input = body:tag('table'):addClass('mcui-input')
	for num = 1, 3 do
		local row = input:tag('tr'):addClass('mcui-row')
		for _, letter in ipairs{ 'A', 'B', 'C' } do
		    local td = row:tag('td')
			td:wikitext(addSlot(args, letter .. num, 'I'))
		end
	end
	
	local arrow = body:tag('span'):addClass('mcui-arrow'):tag('br'):done()
	if args.arrow or '' ~= '' then
		arrow:css(
			'background-image',
			'{{FileUrl|' .. args.arrow .. ' (' .. args.Mod .. ').png}}'
		)
	end
	
	body
		:tag('span')
			:addClass('mcui-output')
			:wikitext(addSlot(args, 'Output', 'O', 'invslot-large'))
	
	local shapeless = args.shapeless or ''
	local fixed = args.fixed or ''
	if shapeless ~= '' or fixed ~= '' then
		local icon = body:tag('span')
			:addClass('mcui-icons')
			:tag('span')
				:tag('br')
			:done()
		if shapeless ~= '' then
			icon:addClass('mcui-shapeless')
				:attr('title',
					'This recipe is shapeless, the inputs may be placed in any arrangement in the crafting grid.'
				)
		elseif fixed ~= '' then
			local notFixed = args.notfixed or ''
			local exceptFixed = ''
			if notFixed ~= '' then
				exceptFixed = '; except for ' .. notFixed .. ', which can go anywhere'
			end
			
			icon:addClass('mcui-fixed')
				:attr('title',
					'This recipe is fixed, the input arrangement may not be moved or mirrored in the crafting grid' .. exceptFixed .. '.'
				)
		end
	end
	
	return tostring(mw.html.create('div'):node(body))
end

-- Furnace
function p.furnace(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	local body = mw.html.create('span'):addClass('mcui mcui-Furnace pixel-image')
	
	local input = body:tag('span'):addClass('mcui-input')
	input:wikitext(addSlot(args, 'Input', 'I'))
	local fuel = input:tag('span'):addClass('mcui-fuel'):tag('br'):done()
	local fuelImg = args.FuelUsage or ''
	local burning = args.Input or '' ~= '' and args.Fuel or '' ~= ''
	if not burning then
		fuel:addClass('mcui-inactive')
		if fuelImg ~= '' then
			fuelImg = fuelImg .. ' (in-active)'
		end
	end
	if fuelImg ~= '' then
		fuel:css(
			'background-image',
			'{{FileUrl|' .. fuelImg .. ' (' .. args.Mod .. ').png}}'
		)
	end
	input:wikitext(addSlot(args, 'Fuel', 'F'))
	
	local arrow = body:tag('span'):addClass('mcui-arrow'):tag('br'):done()
	local arrowImg = args.Progress or ''
	if not burning or (args.Output or '') == '' then
		arrow:addClass('mcui-inactive')
		if arrowImg ~= '' then
			arrowImg = arrowImg .. ' (in-active)'
		end
	end
	if arrowImg ~= '' then
		arrow:css(
			'background-image',
			'{{FileUrl|' .. arrowImg .. ' Progress (' .. args.Mod .. ').png}}'
		)
	end
	
	body
		:tag('span')
			:addClass('mcui-output')
			:wikitext(addSlot(args, 'Output', 'O', 'invslot-large'))
	
	return tostring(mw.html.create('div'):node(body))
end

-- Brewing Stand
function p.brewingStand(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	local body = mw.html.create('span'):addClass('mcui mcui-Brewing_Stand pixel-image')
	
	local input = body:tag('span'):addClass('mcui-input')
	input:tag('span'):addClass('mcui-bubbling'):tag('br')
	input:wikitext(addSlot(args, 'Input', 'I'))
	input:tag('span'):addClass('mcui-arrow'):tag('br')
	if (args.Input or '') == '' or
		((args.Output1 or '') == '' and (args.Output2 or '') == '' and (args.Output3 or '') == '')
	then
		input:addClass('mcui-inactive')
	end
	
	body:tag('span'):addClass('mcui-paths'):tag('br')
	
	local output = body:tag('span'):addClass('mcui-output')
	for i = 1, 3 do
		output:wikitext(addSlot(args, 'Output' .. i, 'O' .. i, 'mcui-output' .. i))
	end
	
	return tostring(mw.html.create('div'):node(body))
end

-- Stonecutter
function p.stonecutter(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	local body = mw.html.create('span'):addClass('mcui mcui-Stonecutter pixel-image')
	
	local input = body:tag('span'):addClass('mcui-input')
	input:wikitext(addSlot(args, 'Input', 'I'))
	
	local arrow = body:tag('span'):addClass('mcui-stonecutterArrow')
	if (args.arrow or '') ~= '' then
		arrow:css(
			'background-image',
			'{{FileUrl|' .. args.arrow .. ' (' .. args.Mod .. ').png}}'
		)
	end
		arrow:wikitext(addSlot(args, 'Output', '', 'invslot-plain mcui-stonecutterSprite'))
	
	body
		:tag('span')
			:addClass('mcui-output')
			:wikitext(addSlot(args, 'Output', 'O', 'invslot-large'))
	
	return tostring(mw.html.create('div'):node(body))
end

-- Loom
function p.loom(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	local body = mw.html.create('span'):addClass('mcui mcui-Loom pixel-image')
	
	local tapestry = body:tag('span'):addClass('mcui-tapestry')
	if args.Banner and #args.Banner>0 then
		tapestry:wikitext(addSlot(args, 'Banner', 'B', 'mcui-inputBanner'))
	end
	if args.Dye and #args.Dye>0 then
		tapestry:wikitext(addSlot(args, 'Dye', 'D', 'mcui-inputDye'))
	end
	if args.Pattern and #args.Pattern>0 then
		tapestry:wikitext(addSlot(args, 'Pattern', 'P', 'mcui-inputPattern'))
	end
	tapestry:tag('span'):tag('br'):done()
	local arrow = body:tag('span'):addClass('mcui-loomArrow')
	if args.arrow or '' ~= '' then
		arrow:css(
			'background-image',
			'{{FileUrl|' .. args.arrow .. ' (' .. args.Mod .. ').png}}'
		)
	end
	
	local sprite = args.Sprite
	local bannerSprite
	if sprite and #sprite>0 then
		local animate = require([[Module:AnimateSprite]]).animate
		bannerSprite = animate{
			args.Sprite,
			sheet = 'SlotSprite'
		}
	else
		bannerSprite = '<br>'
	end
	
	arrow
		:tag('span')
		:addClass('mcui-bannerSprite')
		:wikitext(bannerSprite)
	
	body
		:tag('span')
			:addClass('mcui-output')
			:wikitext(addSlot(args, 'Output', 'O', 'invslot-large'))
	
	return tostring(mw.html.create('div'):node(body))
end

-- Grindstone
function p.grindstone(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	local body = mw.html.create('span'):addClass('mcui mcui-Grindstone pixel-image')
	
	local grindstone = body:tag('span'):addClass('mcui-grindstone')
		grindstone:wikitext(addSlot(args, 'Input1', 'I1', 'mcui-input1'))
		grindstone:wikitext(addSlot(args, 'Input2', 'I2', 'mcui-input2'))
	local arrow = body:tag('span'):addClass('mcui-arrow')
	if args.arrow or '' ~= '' then
		arrow:css(
			'background-image',
			'{{FileUrl|' .. args.arrow .. ' (' .. args.Mod .. ').png}}'
		)
	end
	
	body
		:tag('span')
			:addClass('mcui-output')
			:wikitext(addSlot(args, 'Output', 'O', 'invslot-large'))
	
	return tostring(mw.html.create('div'):node(body))
end
-- Crushing Wheel
function p.crushingWheel(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	local body = mw.html.create('span'):addClass('mcui mcui-Crushing_Wheel pixel-image')
	
	local input = body
		:tag('span')
			:addClass('mcui-input')
			:tag('div')
				:addClass('mcui-input')
				:wikitext(addSlot(args, 'Input', 'I'))
				:tag('div'):addClass('mcui-arrow-bent'):done()
			:done()
			:tag('div'):addClass('mcui-crushingwheel'):done()
	
	local output = body
		:tag('div')
			:addClass('mcui-output')
	
	local i = 1
	while args['Output'..i] do
		output
			:tag('span')
				:tag('span')
					:wikitext(addSlot(args, 'Output'..i, 'O'..i))
					:done()
				:tag('span')
					:addClass(args['Chance'..i or 'C'..i] and 'mcui-text' or 'mcui-text mcui-text-nondisplay')
					:wikitext(args['Chance'..i or 'C'..i] or 'nil')
					:done()	
				:done()
			:done()
		i = i + 1
	end
	
	return tostring(mw.html.create('div'):node(body))
end
-- Bulk Washing/Smoking/Blasting
function p.bulkProcessing(args, uitype)
	local body = mw.html.create('span'):addClass('mcui mcui-Bulk_Processing pixel-image')
	
	local input = body
		:tag('span')
			:addClass('mcui-input')
				:wikitext(addSlot(args, 'Input', 'I'))
			:tag('div')
				:tag('div'):addClass('mcui-arrow-long'):done()
				:tag('div')
					:wikitext(slot{
						uitype == 'washing' and 'Bulk Washing' or (uitype == 'smoking' and 'Bulk Smoking' or 'Bulk Blasting'), 
						class = 'invslot-noformat'
					})
				:done()
			:done()
	
	local output = body
		:tag('div')
			:addClass('mcui-output')
	
	local isChance = false
	for j=1,50,1 do
		if args['Chance'..j or 'C'..j] then
			isChance = true
			break
		end
	end
	local i = 1
	while args['Output'..i] do
		if isChance then
			output
				:tag('span')
					:tag('span')
						:wikitext(addSlot(args, 'Output'..i, 'O'..i))
						:done()
					:tag('span')
						:addClass(args['Chance'..i or 'C'..i] and 'mcui-text' or 'mcui-text mcui-text-nondisplay')
						:wikitext(args['Chance'..i or 'C'..i] or 'nil')
						:done()	
					:done()
				:done()
		else
			output
				:tag('span')
					:tag('span')
						:wikitext(addSlot(args, 'Output'..i, 'O'..i))
					:done()
				:done()
		end
		i = i + 1
	end
	
	return tostring(mw.html.create('div'):node(body))
end
--Bulk Washing
function p.bulkWashing(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	return p.bulkProcessing(args, 'washing')
end
--Bulk Smoking
function p.bulkSmoking(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	return p.bulkProcessing(args, 'smoking')
end
--Bulk Blasting
function p.bulkBlasting(f)
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	else
		f = mw.getCurrentFrame()
	end
	
	return p.bulkProcessing(args, 'blasting')
end
return p