<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.parallelmc.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AUI</id>
	<title>Module:UI - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.parallelmc.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AUI"/>
	<link rel="alternate" type="text/html" href="https://wiki.parallelmc.org/w/index.php?title=Module:UI&amp;action=history"/>
	<updated>2026-04-29T03:55:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://wiki.parallelmc.org/w/index.php?title=Module:UI&amp;diff=5550&amp;oldid=prev</id>
		<title>Diamondback88: 1 revision imported: Imported from minecraft.wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.parallelmc.org/w/index.php?title=Module:UI&amp;diff=5550&amp;oldid=prev"/>
		<updated>2023-10-25T06:06:38Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported: Imported from minecraft.wiki&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 08:06, 25 October 2023&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key s1667_MediaWiki:diff::1.12:old-5549:rev-5550 --&gt;
&lt;/table&gt;</summary>
		<author><name>Diamondback88</name></author>
	</entry>
	<entry>
		<id>https://wiki.parallelmc.org/w/index.php?title=Module:UI&amp;diff=5549&amp;oldid=prev</id>
		<title>minecraft&gt;Unavailablehoax: Reverting, broke templates, you can retrieve your old code in revision history. Next time please do this on your userpage</title>
		<link rel="alternate" type="text/html" href="https://wiki.parallelmc.org/w/index.php?title=Module:UI&amp;diff=5549&amp;oldid=prev"/>
		<updated>2023-10-17T08:50:33Z</updated>

		<summary type="html">&lt;p&gt;Reverting, broke templates, you can retrieve your old code in revision history. Next time please do this on your userpage&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local slot = require( [[Module:Inventory slot]] ).slot&lt;br /&gt;
local addSlot = function( args, item, prefix, class, default )&lt;br /&gt;
	local none, nostacksize&lt;br /&gt;
	prefix = prefix or &amp;#039;&amp;#039;&lt;br /&gt;
	if #prefix == 0 then&lt;br /&gt;
		none = &amp;#039;none&amp;#039;&lt;br /&gt;
		nostacksize = ((item == &amp;#039;&amp;#039; or nil) and &amp;#039;&amp;#039;) or (args and args[item] and args[item]:gsub( &amp;#039;[,%d]&amp;#039;, &amp;#039;&amp;#039; ) or &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return slot{&lt;br /&gt;
		nostacksize or args[item], mod = args.Mod, link = none or args[prefix .. &amp;#039;link&amp;#039;],&lt;br /&gt;
		title = none or args[prefix .. &amp;#039;title&amp;#039;], class = class, default = default,&lt;br /&gt;
		parsed = args.parsed&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function experience_class(exp_value)&lt;br /&gt;
&lt;br /&gt;
	local MINMAX = {&lt;br /&gt;
	  {-32768, 2},&lt;br /&gt;
	  {3, 6},&lt;br /&gt;
	  {7, 16},&lt;br /&gt;
	  {17, 36},&lt;br /&gt;
	  {37, 72},&lt;br /&gt;
	  {73, 148},&lt;br /&gt;
	  {149, 306},&lt;br /&gt;
	  {307, 616},&lt;br /&gt;
	  {617, 1236},&lt;br /&gt;
	  {1237, 2476},&lt;br /&gt;
	  {2477, 32767}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local EXP_IMGS = {&lt;br /&gt;
		&amp;quot;xp-2&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-6&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-16&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-36&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-72&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-148&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-306&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-616&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-1236&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-2476&amp;quot;,&lt;br /&gt;
		&amp;quot;xp-32767&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local n = assert( tonumber(exp_value), &amp;quot;Module:UI: Experience value is not a number (&amp;quot; .. exp_value .. &amp;quot;)&amp;quot; )&lt;br /&gt;
	&lt;br /&gt;
	local idx = 2; exp = tonumber( exp_value )&lt;br /&gt;
	if exp &amp;lt;= MINMAX[#MINMAX][2] then&lt;br /&gt;
	  for i = 1, #MINMAX do&lt;br /&gt;
		if MINMAX[i][1] &amp;lt; exp and MINMAX[i][2] &amp;gt;= exp then&lt;br /&gt;
		  idx = i&lt;br /&gt;
		  break&lt;br /&gt;
		end&lt;br /&gt;
	  end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring( EXP_IMGS[idx] )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Crafting table&lt;br /&gt;
function p.craftingTable( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = f:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local body = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui mcui-Crafting_Table pixel-image&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	local input = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-input&amp;#039; )&lt;br /&gt;
	for num = 1, 3 do&lt;br /&gt;
		local row = input:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-row&amp;#039; )&lt;br /&gt;
		for _, letter in ipairs{ &amp;#039;A&amp;#039;, &amp;#039;B&amp;#039;, &amp;#039;C&amp;#039; } do&lt;br /&gt;
			row:wikitext( addSlot( args, letter .. num, &amp;#039;I&amp;#039; ) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local arrow = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-arrow&amp;#039; ):tag( &amp;#039;br&amp;#039; ):done()&lt;br /&gt;
	if args.arrow or &amp;#039;&amp;#039; ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		arrow:css(&lt;br /&gt;
			&amp;#039;background-image&amp;#039;,&lt;br /&gt;
			&amp;#039;{{FileUrl|&amp;#039; .. args.arrow .. &amp;#039; (&amp;#039; .. args.Mod .. &amp;#039;).png}}&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	body&lt;br /&gt;
		:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
			:addClass( &amp;#039;mcui-output&amp;#039; )&lt;br /&gt;
			:wikitext( addSlot( args, &amp;#039;Output&amp;#039;, &amp;#039;O&amp;#039;, &amp;#039;invslot-large&amp;#039; ) )&lt;br /&gt;
	&lt;br /&gt;
	local shapeless = args.shapeless or &amp;#039;&amp;#039;&lt;br /&gt;
	local fixed = args.fixed or &amp;#039;&amp;#039;&lt;br /&gt;
	if shapeless ~= &amp;#039;&amp;#039; or fixed ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		local icon = body:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
			:addClass( &amp;#039;mcui-icons&amp;#039; )&lt;br /&gt;
			:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
				:tag( &amp;#039;br&amp;#039; )&lt;br /&gt;
			:done()&lt;br /&gt;
		if shapeless ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			icon:addClass( &amp;#039;mcui-shapeless&amp;#039; )&lt;br /&gt;
				:attr( &amp;#039;title&amp;#039;,&lt;br /&gt;
					&amp;#039;This recipe is shapeless; the inputs may be placed in any arrangement in the crafting grid.&amp;#039;&lt;br /&gt;
				)&lt;br /&gt;
		elseif fixed ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			local notFixed = args.notfixed or &amp;#039;&amp;#039;&lt;br /&gt;
			local exceptFixed = &amp;#039;&amp;#039;&lt;br /&gt;
			if notFixed ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				exceptFixed = &amp;#039;; except for &amp;#039; .. notFixed .. &amp;#039;, which can go anywhere&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			icon:addClass( &amp;#039;mcui-fixed&amp;#039; )&lt;br /&gt;
				:attr( &amp;#039;title&amp;#039;,&lt;br /&gt;
					&amp;#039;This recipe is fixed; the input arrangement may not be moved or mirrored in the crafting grid&amp;#039; .. exceptFixed .. &amp;#039;.&amp;#039;&lt;br /&gt;
				)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring( mw.html.create( &amp;#039;div&amp;#039; ):node( body ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Furnace&lt;br /&gt;
function p.furnace( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = f:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local body = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui mcui-Furnace pixel-image&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	local input = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-input&amp;#039; )&lt;br /&gt;
	input:wikitext( addSlot( args, &amp;#039;Input&amp;#039;, &amp;#039;I&amp;#039; ) )&lt;br /&gt;
	local fuel = input:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-fuel&amp;#039; ):tag( &amp;#039;br&amp;#039; ):done()&lt;br /&gt;
	local fuelImg = args.FuelUsage or &amp;#039;&amp;#039;&lt;br /&gt;
	local burning = args.Input or &amp;#039;&amp;#039; ~= &amp;#039;&amp;#039; and args.Fuel or &amp;#039;&amp;#039; ~= &amp;#039;&amp;#039;&lt;br /&gt;
	if not burning then&lt;br /&gt;
		fuel:addClass( &amp;#039;mcui-inactive&amp;#039; )&lt;br /&gt;
		if fuelImg ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			fuelImg = fuelImg .. &amp;#039; (in-active)&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if fuelImg ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		fuel:css(&lt;br /&gt;
			&amp;#039;background-image&amp;#039;,&lt;br /&gt;
			&amp;#039;{{FileUrl|&amp;#039; .. fuelImg .. &amp;#039; (&amp;#039; .. args.Mod .. &amp;#039;).png}}&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	input:wikitext( addSlot( args, &amp;#039;Fuel&amp;#039;, &amp;#039;F&amp;#039; ) )&lt;br /&gt;
	&lt;br /&gt;
	local arrow = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-arrow&amp;#039; ):tag( &amp;#039;br&amp;#039; ):done()&lt;br /&gt;
	local arrowImg = args.Progress or &amp;#039;&amp;#039;&lt;br /&gt;
	if not burning or ( args.Output or &amp;#039;&amp;#039; ) == &amp;#039;&amp;#039; then&lt;br /&gt;
		arrow:addClass( &amp;#039;mcui-inactive&amp;#039; )&lt;br /&gt;
		if arrowImg ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			arrowImg = arrowImg .. &amp;#039; (in-active)&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if arrowImg ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		arrow:css(&lt;br /&gt;
			&amp;#039;background-image&amp;#039;,&lt;br /&gt;
			&amp;#039;{{FileUrl|&amp;#039; .. arrowImg .. &amp;#039; Progress (&amp;#039; .. args.Mod .. &amp;#039;).png}}&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	body&lt;br /&gt;
		:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
			:addClass( &amp;#039;mcui-output&amp;#039; )&lt;br /&gt;
			:wikitext( addSlot( args, &amp;#039;Output&amp;#039;, &amp;#039;O&amp;#039;, &amp;#039;invslot-large&amp;#039; ) )&lt;br /&gt;
			&lt;br /&gt;
	args.Experience = args.Experience or &amp;#039;&amp;#039;&lt;br /&gt;
	if args.Experience ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		-- Converts commas to dots, removes all spaces and splits the arguments with semicolon.&lt;br /&gt;
		local split = mw.text.split(string.gsub(args.Experience, &amp;#039;[ ,]&amp;#039;, {[&amp;#039; &amp;#039;] = &amp;#039;&amp;#039;, [&amp;#039;,&amp;#039;] = &amp;#039;.&amp;#039;}), &amp;#039;;&amp;#039;, true)&lt;br /&gt;
		local animated = body:tag(&amp;#039;span&amp;#039;):attr(&amp;#039;title&amp;#039;, &amp;#039;If there is a fractional part, it means the recipe has a chance equal to the fractional part of rewarding an additional XP point.&amp;#039;)&lt;br /&gt;
							 :addClass(&amp;#039;animated mcui-experience&amp;#039;)&lt;br /&gt;
		local isNotFirst = true&lt;br /&gt;
		for i, v in ipairs(split) do&lt;br /&gt;
			assert(tonumber(v), &amp;#039;Module:UI: &amp;quot;&amp;#039; .. v .. &amp;#039;&amp;quot; is not a valid number&amp;#039;)&lt;br /&gt;
			local xp = tonumber(v)&lt;br /&gt;
			local xpWrapper = animated:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
					:addClass(isNotFirst and &amp;#039;animated-active&amp;#039; or nil)&lt;br /&gt;
			xpWrapper:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
					:addClass(experience_class(xp) .. &amp;#039; mcui-experience-orb&amp;#039;)&lt;br /&gt;
			xpWrapper:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
					:addClass(&amp;#039;mcui-experience-text&amp;#039;)&lt;br /&gt;
					:wikitext((&amp;#039;&amp;amp;nbsp;&amp;#039; and xp &amp;gt; 72 or &amp;#039;&amp;#039;) .. xp)&lt;br /&gt;
			isNotFirst = false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring( mw.html.create( &amp;#039;div&amp;#039; ):node( body ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Brewing Stand&lt;br /&gt;
function p.brewingStand( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = f:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local body = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui mcui-Brewing_Stand pixel-image&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	local input = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-input&amp;#039; )&lt;br /&gt;
	input:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-bubbling&amp;#039; ):tag( &amp;#039;br&amp;#039; )&lt;br /&gt;
	input:wikitext( addSlot( args, &amp;#039;Input&amp;#039;, &amp;#039;I&amp;#039; ) )&lt;br /&gt;
	input:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-arrow&amp;#039; ):tag( &amp;#039;br&amp;#039; )&lt;br /&gt;
	if ( args.Input or &amp;#039;&amp;#039; ) == &amp;#039;&amp;#039; or&lt;br /&gt;
		( ( args.Output1 or &amp;#039;&amp;#039; ) == &amp;#039;&amp;#039; and ( args.Output2 or &amp;#039;&amp;#039; ) == &amp;#039;&amp;#039; and ( args.Output3 or &amp;#039;&amp;#039; ) == &amp;#039;&amp;#039; )&lt;br /&gt;
	then&lt;br /&gt;
		input:addClass( &amp;#039;mcui-inactive&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-paths&amp;#039; ):tag( &amp;#039;br&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	local output = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-output&amp;#039; )&lt;br /&gt;
	for i = 1, 3 do&lt;br /&gt;
		output:wikitext( addSlot( args, &amp;#039;Output&amp;#039; .. i, &amp;#039;O&amp;#039; .. i, &amp;#039;mcui-output&amp;#039; .. i ) )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring( mw.html.create( &amp;#039;div&amp;#039; ):node( body ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Stonecutter&lt;br /&gt;
function p.stonecutter( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = f:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local body = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui mcui-Stonecutter pixel-image&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	local input = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-input&amp;#039; )&lt;br /&gt;
	input:wikitext( addSlot( args, &amp;#039;Input&amp;#039;, &amp;#039;I&amp;#039; ) )&lt;br /&gt;
	&lt;br /&gt;
	local arrow = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-stonecutterArrow&amp;#039; )&lt;br /&gt;
	if (args.arrow or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		arrow:css(&lt;br /&gt;
			&amp;#039;background-image&amp;#039;,&lt;br /&gt;
			&amp;#039;{{FileUrl|&amp;#039; .. args.arrow .. &amp;#039; (&amp;#039; .. args.Mod .. &amp;#039;).png}}&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
		arrow:wikitext( addSlot( args, &amp;#039;Output&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;invslot-plain mcui-stonecutterSprite&amp;#039; ) )&lt;br /&gt;
	&lt;br /&gt;
	body&lt;br /&gt;
		:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
			:addClass( &amp;#039;mcui-output&amp;#039; )&lt;br /&gt;
			:wikitext( addSlot( args, &amp;#039;Output&amp;#039;, &amp;#039;O&amp;#039;, &amp;#039;invslot-large&amp;#039; ) )&lt;br /&gt;
	&lt;br /&gt;
	return tostring( mw.html.create( &amp;#039;div&amp;#039; ):node( body ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Loom&lt;br /&gt;
function p.loom( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = f:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local body = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui mcui-Loom pixel-image&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	local tapestry = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-tapestry&amp;#039; )&lt;br /&gt;
	if args.Banner and #args.Banner&amp;gt;0 then&lt;br /&gt;
		tapestry:wikitext( addSlot( args, &amp;#039;Banner&amp;#039;, &amp;#039;B&amp;#039;, &amp;#039;mcui-inputBanner&amp;#039; ) )&lt;br /&gt;
	end&lt;br /&gt;
	if args.Dye and #args.Dye&amp;gt;0 then&lt;br /&gt;
		tapestry:wikitext( addSlot( args, &amp;#039;Dye&amp;#039;, &amp;#039;D&amp;#039;, &amp;#039;mcui-inputDye&amp;#039; ) )&lt;br /&gt;
	end&lt;br /&gt;
	if args.Pattern and #args.Pattern&amp;gt;0 then&lt;br /&gt;
		tapestry:wikitext( addSlot( args, &amp;#039;Pattern&amp;#039;, &amp;#039;P&amp;#039;, &amp;#039;mcui-inputPattern&amp;#039; ) )&lt;br /&gt;
	end&lt;br /&gt;
	tapestry:tag( &amp;#039;span&amp;#039; ):tag( &amp;#039;br&amp;#039; ):done()&lt;br /&gt;
	local arrow = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-loomArrow&amp;#039; )&lt;br /&gt;
	if args.arrow or &amp;#039;&amp;#039; ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		arrow:css(&lt;br /&gt;
			&amp;#039;background-image&amp;#039;,&lt;br /&gt;
			&amp;#039;{{FileUrl|&amp;#039; .. args.arrow .. &amp;#039; (&amp;#039; .. args.Mod .. &amp;#039;).png}}&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local sprite = args.Sprite&lt;br /&gt;
	local bannerSprite&lt;br /&gt;
	if sprite and #sprite&amp;gt;0 then&lt;br /&gt;
		local animate = require( [[Module:AnimateSprite]] ).animate&lt;br /&gt;
		bannerSprite = animate{&lt;br /&gt;
			args.Sprite,&lt;br /&gt;
			name = &amp;#039;SlotSprite&amp;#039;&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		bannerSprite = &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	arrow&lt;br /&gt;
		:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
		:addClass( &amp;#039;mcui-bannerSprite&amp;#039; )&lt;br /&gt;
		:wikitext( bannerSprite )&lt;br /&gt;
	&lt;br /&gt;
	body&lt;br /&gt;
		:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
			:addClass( &amp;#039;mcui-output&amp;#039; )&lt;br /&gt;
			:wikitext( addSlot( args, &amp;#039;Output&amp;#039;, &amp;#039;O&amp;#039;, &amp;#039;invslot-large&amp;#039; ) )&lt;br /&gt;
	&lt;br /&gt;
	return tostring( mw.html.create( &amp;#039;div&amp;#039; ):node( body ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Grindstone&lt;br /&gt;
function p.grindstone( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = f:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local body = mw.html.create( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui mcui-Grindstone pixel-image&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	local grindstone = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-grindstone&amp;#039; )&lt;br /&gt;
		grindstone:wikitext( addSlot( args, &amp;#039;Input1&amp;#039;, &amp;#039;I1&amp;#039;, &amp;#039;mcui-input1&amp;#039; ) )&lt;br /&gt;
		grindstone:wikitext( addSlot( args, &amp;#039;Input2&amp;#039;, &amp;#039;I2&amp;#039;, &amp;#039;mcui-input2&amp;#039; ) )&lt;br /&gt;
	local arrow = body:tag( &amp;#039;span&amp;#039; ):addClass( &amp;#039;mcui-arrow&amp;#039; )&lt;br /&gt;
	if args.arrow or &amp;#039;&amp;#039; ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		arrow:css(&lt;br /&gt;
			&amp;#039;background-image&amp;#039;,&lt;br /&gt;
			&amp;#039;{{FileUrl|&amp;#039; .. args.arrow .. &amp;#039; (&amp;#039; .. args.Mod .. &amp;#039;).png}}&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	body&lt;br /&gt;
		:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
			:addClass( &amp;#039;mcui-output&amp;#039; )&lt;br /&gt;
			:wikitext( addSlot( args, &amp;#039;Output&amp;#039;, &amp;#039;O&amp;#039;, &amp;#039;invslot-large&amp;#039; ) )&lt;br /&gt;
	&lt;br /&gt;
	return tostring( mw.html.create( &amp;#039;div&amp;#039; ):node( body ) )&lt;br /&gt;
end&lt;br /&gt;
-- Smithing Table&lt;br /&gt;
function p.smithing (f) &lt;br /&gt;
local args = f&lt;br /&gt;
if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = f:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
return tostring( mw.html.create( &amp;#039;div&amp;#039; ):node( body ) )&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>minecraft&gt;Unavailablehoax</name></author>
	</entry>
</feed>