<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.celestek.xyz/index.php?action=history&amp;feed=atom&amp;title=Module%3ACrafting</id>
		<title>Module:Crafting - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.celestek.xyz/index.php?action=history&amp;feed=atom&amp;title=Module%3ACrafting"/>
		<link rel="alternate" type="text/html" href="https://wiki.celestek.xyz/index.php?title=Module:Crafting&amp;action=history"/>
		<updated>2026-04-29T07:58:36Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.24.2</generator>

	<entry>
		<id>//wiki.celestek.xyz/index.php?title=Module:Crafting&amp;diff=235&amp;oldid=prev</id>
		<title>Celestek at 10:55, 14 May 2015</title>
		<link rel="alternate" type="text/html" href="https://wiki.celestek.xyz/index.php?title=Module:Crafting&amp;diff=235&amp;oldid=prev"/>
				<updated>2015-05-14T10:55:02Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
function p.table( f )&lt;br /&gt;
	local args = f&lt;br /&gt;
	if f == mw.getCurrentFrame() then&lt;br /&gt;
		args = require( 'Module:ProcessArgs' ).merge()&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	local grid = require( 'Module:Grid' )&lt;br /&gt;
	&lt;br /&gt;
	-- Start table when appropriate&lt;br /&gt;
	local multirow = f:callParserFunction( '#dplvar', 'multirow' )&lt;br /&gt;
	if multirow ~= '1' then&lt;br /&gt;
		multirow = nil&lt;br /&gt;
	end&lt;br /&gt;
	local head = args.head or ''&lt;br /&gt;
	if multirow then&lt;br /&gt;
		head = ''&lt;br /&gt;
	elseif head ~= '' then&lt;br /&gt;
		multirow = 1&lt;br /&gt;
		f:callParserFunction( '#dplvar:set', 'multirow', '1' )&lt;br /&gt;
	else&lt;br /&gt;
		head = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- End table when appropriate&lt;br /&gt;
	local foot = args.foot or ''&lt;br /&gt;
	if multirow then&lt;br /&gt;
		if foot ~= '' then&lt;br /&gt;
			multirow = nil&lt;br /&gt;
			f:callParserFunction( '#dplvar:set', 'multirow', '0' )&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		foot = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local header = ''&lt;br /&gt;
	if head ~= '' then&lt;br /&gt;
		local name = ''&lt;br /&gt;
		local description = ''&lt;br /&gt;
		if args.showname == '1' or multirow and args.showname ~= '0' then&lt;br /&gt;
			name = 'Name !! '&lt;br /&gt;
			f:callParserFunction( '#dplvar:set', 'craftingname', '1' )&lt;br /&gt;
		end&lt;br /&gt;
		if args.showdescription == '1' then&lt;br /&gt;
			description = ' !! class=&amp;quot;unsortable&amp;quot; | Description'&lt;br /&gt;
			f:callParserFunction( '#dplvar:set', 'craftingdescription', '1' )&lt;br /&gt;
		end&lt;br /&gt;
		local class = args.class or ''&lt;br /&gt;
		local recipeClass = ''&lt;br /&gt;
		if multirow then&lt;br /&gt;
			class = 'sortable collapsible ' .. class&lt;br /&gt;
			recipeClass = 'class=&amp;quot;unsortable collapse-button&amp;quot; |'&lt;br /&gt;
		end&lt;br /&gt;
		header = table.concat( {&lt;br /&gt;
			' {| class=&amp;quot;wikitable ' .. '&amp;quot;',&lt;br /&gt;
			'! ' .. name .. 'Ingredients !! ' .. ' [[Crafting]] recipe' .. description,&lt;br /&gt;
			'|-'&lt;br /&gt;
		}, '\n' )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Name cell&lt;br /&gt;
	local nameCell&lt;br /&gt;
	if f:callParserFunction( '#dplvar', 'craftingname' ) == '1' then&lt;br /&gt;
		if args.name or '' ~= '' then&lt;br /&gt;
			nameCell = args.name&lt;br /&gt;
		else&lt;br /&gt;
			local names = {}&lt;br /&gt;
			local links = {}&lt;br /&gt;
			for v in mw.text.gsplit( args.Output or '', '%s*;%s*' ) do&lt;br /&gt;
				parts = grid.getParts( v, args.Mod )&lt;br /&gt;
				parts.mod = parts.mod or ''&lt;br /&gt;
				if not names[parts.mod .. ':' .. parts.name] then&lt;br /&gt;
					local link = ''&lt;br /&gt;
					if parts.mod ~= '' then&lt;br /&gt;
						link = 'Mods/' .. parts.mod .. '/' .. parts.name .. '|'&lt;br /&gt;
					end&lt;br /&gt;
					&lt;br /&gt;
					if parts.name:find( '^Any ' ) then&lt;br /&gt;
						table.insert( links, 'Any [[' .. link .. parts.name:sub( 4 ) .. ']]' )&lt;br /&gt;
					else&lt;br /&gt;
						table.insert( links, '[[' .. link .. parts.name .. ']]' )&lt;br /&gt;
					end&lt;br /&gt;
					names[parts.mod .. ':' .. parts.name] = 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			nameCell = table.concat( links, '&amp;amp;nbsp;or&amp;lt;br&amp;gt;' )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if nameCell and args.upcoming then&lt;br /&gt;
		nameCell = nameCell .. '&amp;lt;br&amp;gt;([[' .. args.upcoming .. ']])'&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Create ingredient list&lt;br /&gt;
	local ingredients = {}&lt;br /&gt;
	local ingredientKeys = {}&lt;br /&gt;
	local animatedIngredients = {}&lt;br /&gt;
	local animatedKeys = {}&lt;br /&gt;
	for k, v in pairs( args ) do&lt;br /&gt;
		v = mw.text.trim( v )&lt;br /&gt;
		if v ~= '' and tostring( k ):find( '^%u?%d%d?$' ) then&lt;br /&gt;
			if v:find( ';' ) then&lt;br /&gt;
				table.insert( animatedKeys, v )&lt;br /&gt;
			else&lt;br /&gt;
				local parts = grid.getParts( v, args.Mod )&lt;br /&gt;
				parts.mod = parts.mod or ''&lt;br /&gt;
				local fullName = parts.mod .. ':' .. parts.name&lt;br /&gt;
				if not ingredients[fullName] then&lt;br /&gt;
					table.insert( ingredientKeys, fullName )&lt;br /&gt;
					ingredients[fullName] = { mod = parts.mod, name = parts.name }&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in ipairs( animatedKeys ) do&lt;br /&gt;
		local frames = mw.text.split( v, '%s*;%s*' )&lt;br /&gt;
		local length = #frames&lt;br /&gt;
		for k2, v2 in ipairs( frames ) do&lt;br /&gt;
			local parts = grid.getParts( v2, args.Mod )&lt;br /&gt;
			parts.mod = parts.mod or ''&lt;br /&gt;
			local fullName = parts.mod .. ':' .. parts.name&lt;br /&gt;
			if v2 ~= '' and not ingredients[fullName] and not animatedIngredients[fullName] then&lt;br /&gt;
				table.insert( ingredientKeys, fullName )&lt;br /&gt;
				animatedIngredients[fullName] = { mod = parts.mod, name = parts.name, final = k2 == length }&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Ingredients cell&lt;br /&gt;
	local ingredientsCell&lt;br /&gt;
	if args.ingredients or '' ~= '' then&lt;br /&gt;
		ingredientsCell = args.ingredients&lt;br /&gt;
	else&lt;br /&gt;
		ingredientsCell = {}&lt;br /&gt;
		for k, v in ipairs( ingredientKeys ) do&lt;br /&gt;
			local link = ''&lt;br /&gt;
			local separator = '&amp;amp;nbsp;+'&lt;br /&gt;
			if k == #ingredientKeys then&lt;br /&gt;
				separator = ''&lt;br /&gt;
			elseif animatedIngredients[v] and not animatedIngredients[v].final then&lt;br /&gt;
				separator = '&amp;amp;nbsp;or'&lt;br /&gt;
			end&lt;br /&gt;
			local mod = ( ingredients[v] or animatedIngredients[v] ).mod&lt;br /&gt;
			local name = ( ingredients[v] or animatedIngredients[v] ).name&lt;br /&gt;
			if mod ~= '' then&lt;br /&gt;
				link = 'Mods/'.. mod .. '/' .. name .. '|'&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if name:find( '^Any ' ) then&lt;br /&gt;
				table.insert( ingredientsCell, 'Any [[' .. link .. name:sub( 5 ) .. ']]' .. separator )&lt;br /&gt;
			else&lt;br /&gt;
				table.insert( ingredientsCell, '[[' .. link .. name .. ']]' .. separator )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		ingredientsCell = table.concat( ingredientsCell, '&amp;lt;br&amp;gt;\n' )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Automatic shapeless positioning&lt;br /&gt;
	local newArgs = {}&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		newArgs.shapeless = 1&lt;br /&gt;
		if args[7] then&lt;br /&gt;
			newArgs.A1 = args[1]&lt;br /&gt;
			newArgs.B1 = args[2]&lt;br /&gt;
			newArgs.C1 = args[3]&lt;br /&gt;
			newArgs.A2 = args[4]&lt;br /&gt;
			newArgs.B2 = args[5]&lt;br /&gt;
			newArgs.C2 = args[6]&lt;br /&gt;
			if args[8] then&lt;br /&gt;
				-- ◼◼◼      ◼◼◼&lt;br /&gt;
				-- ◼◼◼  OR  ◼◼◼&lt;br /&gt;
				-- ◼◼◼      ◼◼◻&lt;br /&gt;
				newArgs.A3 = args[7]&lt;br /&gt;
				newArgs.B3 = args[8]&lt;br /&gt;
				newArgs.C3 = args[9]&lt;br /&gt;
				if args[9] then&lt;br /&gt;
					local identical = true&lt;br /&gt;
					for i = 1, 8 do&lt;br /&gt;
						if args[i] ~= args[i + 1] then&lt;br /&gt;
							identical = false&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if identical then&lt;br /&gt;
						newArgs.shapeless = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				-- ◼◼◼&lt;br /&gt;
				-- ◼◼◼&lt;br /&gt;
				-- ◻◼◻&lt;br /&gt;
				newArgs.B3 = args[7]&lt;br /&gt;
			end&lt;br /&gt;
		elseif args[2] then&lt;br /&gt;
			newArgs.A2 = args[1]&lt;br /&gt;
			newArgs.B2 = args[2]&lt;br /&gt;
			if args[5] then&lt;br /&gt;
				-- ◻◻◻      ◻◻◻&lt;br /&gt;
				-- ◼◼◼  OR  ◼◼◼&lt;br /&gt;
				-- ◼◼◼      ◼◼◻&lt;br /&gt;
				newArgs.C2 = args[3]&lt;br /&gt;
				newArgs.A3 = args[4]&lt;br /&gt;
				newArgs.B3 = args[5]&lt;br /&gt;
				newArgs.C3 = args[6]&lt;br /&gt;
			elseif args[4] then&lt;br /&gt;
				-- ◻◻◻&lt;br /&gt;
				-- ◼◼◻&lt;br /&gt;
				-- ◼◼◻&lt;br /&gt;
				newArgs.A3 = args[3]&lt;br /&gt;
				newArgs.B3 = args[4]&lt;br /&gt;
			else&lt;br /&gt;
				-- ◻◻◻      ◻◻◻&lt;br /&gt;
				-- ◼◼◻  OR  ◼◼◻&lt;br /&gt;
				-- ◻◼◻      ◻◻◻&lt;br /&gt;
				newArgs.B3 = args[3]&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- ◻◻◻&lt;br /&gt;
			-- ◻◼◻&lt;br /&gt;
			-- ◻◻◻&lt;br /&gt;
			newArgs.B2 = args[1]&lt;br /&gt;
			newArgs.shapeless = nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		newArgs.A1 = args.A1&lt;br /&gt;
		newArgs.B1 = args.B1&lt;br /&gt;
		newArgs.C1 = args.C1&lt;br /&gt;
		newArgs.A2 = args.A2&lt;br /&gt;
		newArgs.B2 = args.B2&lt;br /&gt;
		newArgs.C2 = args.C2&lt;br /&gt;
		newArgs.A3 = args.A3&lt;br /&gt;
		newArgs.B3 = args.B3&lt;br /&gt;
		newArgs.C3 = args.C3&lt;br /&gt;
		newArgs.fixed = args.fixed&lt;br /&gt;
		newArgs.notfixed = args.notfixed&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Any other args we want to pass along&lt;br /&gt;
	newArgs.Mod = args.Mod&lt;br /&gt;
	newArgs.Output = args.Output&lt;br /&gt;
	newArgs.Otitle = args.Otitle&lt;br /&gt;
	newArgs.Olink = args.Olink&lt;br /&gt;
	&lt;br /&gt;
	-- Recipe cell&lt;br /&gt;
	local recipeCell = grid.craftingTable( newArgs )&lt;br /&gt;
	&lt;br /&gt;
	local row = { ingredientsCell, recipeCell }&lt;br /&gt;
	if nameCell then&lt;br /&gt;
		table.insert( row, 1, nameCell )&lt;br /&gt;
	end&lt;br /&gt;
	if f:callParserFunction( '#dplvar', 'craftingdescription' ) == '1' then&lt;br /&gt;
		table.insert( row, args.description or '' )&lt;br /&gt;
	end&lt;br /&gt;
	row = table.concat( row, '\n|\n' )&lt;br /&gt;
	&lt;br /&gt;
	if nameCell then&lt;br /&gt;
		row = '!\n' .. row&lt;br /&gt;
	else&lt;br /&gt;
		row = '|\n' .. row&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local footer = ''&lt;br /&gt;
	if foot ~= '' then&lt;br /&gt;
		footer = '|}'&lt;br /&gt;
		f:callParserFunction( '#dplvar:set', 'craftingname', '0', 'craftingdescription', '0' )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Create ingredient categories for DPL&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	local categories = ''&lt;br /&gt;
	if args.nocat ~= '1' and title.namespace == 0 and not title.isSubpage then&lt;br /&gt;
		categories = {}&lt;br /&gt;
		&lt;br /&gt;
		if args.upcoming then&lt;br /&gt;
			table.insert( categories, '[[Category:Upcoming]]' )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if args.type then&lt;br /&gt;
			table.insert( categories, '[[Category:' .. args.type .. ' recipe]]' )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if args.ignoreusage ~= '1' then&lt;br /&gt;
			for k, v in ipairs( ingredientKeys ) do&lt;br /&gt;
				v = v:sub( 2 )&lt;br /&gt;
				if not v:find( ':' ) then&lt;br /&gt;
					if v == 'Any Dye' or v == 'Any Colored Dye' then&lt;br /&gt;
						local dyes = {&lt;br /&gt;
							'Orange Dye', 'Magenta Dye', 'Light Blue Dye', 'Dandelion Yellow', 'Lime Dye',&lt;br /&gt;
							'Pink Dye', 'Gray Dye', 'Light Gray Dye', 'Cyan Dye', 'Purple Dye',&lt;br /&gt;
							'Lapis Lazuli', 'Cocoa Beans', 'Cactus Green', 'Rose Red', 'Ink Sac'&lt;br /&gt;
						}&lt;br /&gt;
						if v == 'Any Dye' then&lt;br /&gt;
							table.insert( dyes, 1, 'Bone Meal' )&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						for _, dye in ipairs( dyes ) do&lt;br /&gt;
							table.insert( categories, '[[Category:Recipe using ' .. dye .. ']]' )&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						if v == 'Sticky Piston' then v = 'Piston'&lt;br /&gt;
						elseif v== 'Any Mushroom' or v == 'Red Mushroom' or v == 'Brown Mushroom' then v = 'Mushroom'&lt;br /&gt;
						elseif v == 'Red Sand' then v = 'Sand'&lt;br /&gt;
						elseif v == 'Charcoal' then v = 'Coal'&lt;br /&gt;
						elseif v:find( ' Wood$' ) then v = 'Wood'&lt;br /&gt;
						elseif v:find( ' Wood Planks$' ) then v = 'Wood Planks'&lt;br /&gt;
						elseif v:find( ' Stained Glass$' ) then v = 'Stained Glass'&lt;br /&gt;
						elseif v:find( ' Stained Glass Pane$' ) then v = 'Stained Glass Pane'&lt;br /&gt;
						elseif v:find( ' Wool$' ) then v = 'Wool'&lt;br /&gt;
						elseif v:find( 'Red Sandstone$' ) then v = 'Red Sandstone'&lt;br /&gt;
						elseif v:find( ' Sandstone$' ) then v = 'Sandstone'&lt;br /&gt;
						elseif v:find( ' Stairs$' ) then v = 'Stairs'&lt;br /&gt;
						elseif v:find( ' Slab$' ) then v = 'Slab'&lt;br /&gt;
						elseif v:find( ' Pressure Plate$' ) then v = 'Pressure Plate'&lt;br /&gt;
						elseif v:find( ' Firework Star$' ) then v = 'Firework Star'&lt;br /&gt;
						elseif v:find( ' Stone Bricks$' ) then v = 'Stone Bricks'&lt;br /&gt;
						elseif v:find( ' Quartz Block$' ) then v = 'Block of Quartz'&lt;br /&gt;
						elseif v:find( ' Andesite$' ) then v = 'Andesite'&lt;br /&gt;
						elseif v:find( ' Diorite$' ) then v = 'Diorite'&lt;br /&gt;
						elseif v:find( ' Granite$' ) then v = 'Granite'&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						table.insert( categories, '[[Category:Recipe using ' .. v .. ']]' )&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		categories = table.concat( categories, '' )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.debug == '1' then&lt;br /&gt;
		return '&amp;lt;pre&amp;gt;' .. header .. '\n' .. row .. '\n|-\n' .. footer .. categories .. '&amp;lt;/pre&amp;gt;'&lt;br /&gt;
	else&lt;br /&gt;
		return header .. '\n' .. row .. '\n|-\n' .. footer .. categories&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Celestek</name></author>	</entry>

	</feed>