<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.boxofrocks.net/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.boxofrocks.net/index.php?action=history&amp;feed=atom&amp;title=Module%3ACrafting"/>
	<link rel="alternate" type="text/html" href="https://wiki.boxofrocks.net/index.php?title=Module:Crafting&amp;action=history"/>
	<updated>2026-05-30T21:51:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>https://wiki.boxofrocks.net/index.php?title=Module:Crafting&amp;diff=369&amp;oldid=prev</id>
		<title>BoxWiki: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.boxofrocks.net/index.php?title=Module:Crafting&amp;diff=369&amp;oldid=prev"/>
		<updated>2021-05-13T15:55:18Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&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: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 15:55, 13 May 2021&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key wikidb:diff::1.12:old-368:rev-369 --&gt;
&lt;/table&gt;</summary>
		<author><name>BoxWiki</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.boxofrocks.net/index.php?title=Module:Crafting&amp;diff=368&amp;oldid=prev</id>
		<title>Crafting&gt;Dhranios at 15:27, 13 February 2021</title>
		<link rel="alternate" type="text/html" href="https://wiki.boxofrocks.net/index.php?title=Module:Crafting&amp;diff=368&amp;oldid=prev"/>
		<updated>2021-02-13T15:27:35Z</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;
&lt;br /&gt;
local i18n = {&lt;br /&gt;
	colored = 'Colored',&lt;br /&gt;
	coloredDyes = {&lt;br /&gt;
		'Orange Dye', 'Magenta Dye', 'Light Blue Dye', 'Yellow Dye', 'Lime Dye',&lt;br /&gt;
		'Pink Dye', 'Gray Dye', 'Light Gray Dye', 'Cyan Dye', 'Purple Dye',&lt;br /&gt;
		'Blue Dye', 'Brown Dye', 'Green Dye',&lt;br /&gt;
		'Red Dye', 'Black Dye',&lt;br /&gt;
	},&lt;br /&gt;
	categoryIngredientUsage = 'Category:Recipe using $1',&lt;br /&gt;
	categoryRecipeType = 'Category:$1 recipe',&lt;br /&gt;
	itemBlockOfQuartz = 'Block of Quartz',&lt;br /&gt;
	itemBlockOfQuartz = 'Block of Quartz',&lt;br /&gt;
	itemBrownMushroom = 'Brown Mushroom',&lt;br /&gt;
	itemCharcoal = 'Charcoal',&lt;br /&gt;
	itemCoal = 'Coal',&lt;br /&gt;
	itemColoredDye = 'Colored Dye',&lt;br /&gt;
	itemDye = 'Dye',&lt;br /&gt;
	itemMushroom = 'Mushroom',&lt;br /&gt;
	itemQuartzBlock = 'Quartz Block',&lt;br /&gt;
	itemSmoothQuartzBlock = 'Smooth Quartz Block',&lt;br /&gt;
	itemRedMushroom = 'Red Mushroom',&lt;br /&gt;
	itemStone = 'Stone',&lt;br /&gt;
	itemWhiteDye = 'White Dye',&lt;br /&gt;
	moduleArgs = [[Module:ProcessArgs]],&lt;br /&gt;
	moduleRecipe = [[Module:Recipe table]],&lt;br /&gt;
	moduleSlot = [[Module:Inventory slot]],&lt;br /&gt;
	stoneVariants = { 'Stone', 'Andesite', 'Granite', 'Diorite' },&lt;br /&gt;
	type = 'Crafting',&lt;br /&gt;
	variantPages = {&lt;br /&gt;
		'Andesite', 'Banner', 'Bed', 'Diorite', 'Firework Star', 'Granite', &lt;br /&gt;
		'Pressure Plate', 'Sand', 'Sandstone', 'Shield', 'Slab', 'Stained Glass Pane', &lt;br /&gt;
		'Stained Glass', 'Stairs', 'Wood Planks', 'Wood', 'Wool',&lt;br /&gt;
	},&lt;br /&gt;
    CopperBlockLinks = {&lt;br /&gt;
		'Block of Copper', 'Exposed Copper', 'Weathered Copper', 'Oxidized Copper', 'Cut Copper', 'Exposed Cut Copper', 'Weathered Cut Copper', 'Oxidized Cut Copper', 'Waxed Block of Copper', 'Waxed Copper', 'Waxed Exposed Copper', 'Waxed Weathered Copper', 'Waxed Cut Copper', 'Waxed Exposed Cut Copper', 'Waxed Weathered Cut Copper', 'Copper Block'&lt;br /&gt;
	},&lt;br /&gt;
    CopperBlock = 'Block of Copper',&lt;br /&gt;
}&lt;br /&gt;
p.i18n = i18n&lt;br /&gt;
&lt;br /&gt;
local slot = require( i18n.moduleSlot )&lt;br /&gt;
local recipeTable = require( i18n.moduleRecipe ).table&lt;br /&gt;
local cArgVals = { 'A1', 'B1', 'C1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3' }&lt;br /&gt;
p.cArgVals = cArgVals&lt;br /&gt;
&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( i18n.moduleArgs ).merge( true )&lt;br /&gt;
	else&lt;br /&gt;
		f = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Automatic shapeless positioning&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		args.shapeless = 1&lt;br /&gt;
		if args[7] then&lt;br /&gt;
			args.A1 = args[1]&lt;br /&gt;
			args.B1 = args[2]&lt;br /&gt;
			args.C1 = args[3]&lt;br /&gt;
			args.A2 = args[4]&lt;br /&gt;
			args.B2 = args[5]&lt;br /&gt;
			args.C2 = args[6]&lt;br /&gt;
			if args[8] then&lt;br /&gt;
				-- ◼◼◼      ◼◼◼&lt;br /&gt;
				-- ◼◼◼  OR  ◼◼◼&lt;br /&gt;
				-- ◼◼◼      ◼◼◻&lt;br /&gt;
				args.A3 = args[7]&lt;br /&gt;
				args.B3 = args[8]&lt;br /&gt;
				args.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;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if identical then&lt;br /&gt;
						args.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;
				args.B3 = args[7]&lt;br /&gt;
			end&lt;br /&gt;
		elseif args[2] then&lt;br /&gt;
			args.A2 = args[1]&lt;br /&gt;
			args.B2 = args[2]&lt;br /&gt;
			if args[5] then&lt;br /&gt;
				-- ◻◻◻      ◻◻◻&lt;br /&gt;
				-- ◼◼◼  OR  ◼◼◼&lt;br /&gt;
				-- ◼◼◼      ◼◼◻&lt;br /&gt;
				args.C2 = args[3]&lt;br /&gt;
				args.A3 = args[4]&lt;br /&gt;
				args.B3 = args[5]&lt;br /&gt;
				args.C3 = args[6]&lt;br /&gt;
			elseif args[4] then&lt;br /&gt;
				-- ◻◻◻&lt;br /&gt;
				-- ◼◼◻&lt;br /&gt;
				-- ◼◼◻&lt;br /&gt;
				args.A3 = args[3]&lt;br /&gt;
				args.B3 = args[4]&lt;br /&gt;
			else&lt;br /&gt;
				-- ◻◻◻      ◻◻◻&lt;br /&gt;
				-- ◼◼◻  OR  ◼◼◻&lt;br /&gt;
				-- ◻◼◻      ◻◻◻&lt;br /&gt;
				args.B3 = args[3]&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- ◻◻◻&lt;br /&gt;
			-- ◻◼◻&lt;br /&gt;
			-- ◻◻◻&lt;br /&gt;
			args.B2 = args[1]&lt;br /&gt;
			args.shapeless = nil&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		for i = 1, 9 do&lt;br /&gt;
			args[i] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Create recipe table, and list of ingredients&lt;br /&gt;
	local out, ingredientSets = recipeTable( args, {&lt;br /&gt;
		uiFunc = 'craftingTable',&lt;br /&gt;
		type = i18n.type,&lt;br /&gt;
		ingredientArgs = cArgVals,&lt;br /&gt;
		outputArgs = { 'Output' },&lt;br /&gt;
	} )&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if args.nocat == '1' or title.namespace ~= 0 or title.isSubpage then&lt;br /&gt;
		return out&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	local cI = 1&lt;br /&gt;
	&lt;br /&gt;
	if args.type and args.ignoreusage ~= '1' then&lt;br /&gt;
		categories[cI] = '[[' .. i18n.categoryRecipeType:gsub( '%$1', args.type ) .. ']]'&lt;br /&gt;
		cI = cI + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.ignoreusage ~= '1' then&lt;br /&gt;
		-- Create ingredient categories for DPL&lt;br /&gt;
		local usedNames = {}&lt;br /&gt;
		&lt;br /&gt;
		local function addName(name)&lt;br /&gt;
			if not usedNames[name] then -- redundant with most current code, but not with all, and might prevent other issues&lt;br /&gt;
				categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', name ) .. ']]'&lt;br /&gt;
				cI = cI + 1&lt;br /&gt;
				usedNames[name] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		for _, ingredientSet in pairs( ingredientSets ) do&lt;br /&gt;
			for _, ingredient in pairs( ingredientSet ) do&lt;br /&gt;
				local name = ingredient.name&lt;br /&gt;
				if not ingredient.mod and not usedNames[name] then&lt;br /&gt;
					-- List each dye individually as they have their own pages&lt;br /&gt;
					if&lt;br /&gt;
						name == slot.i18n.prefixes.any .. ' ' .. i18n.itemDye or&lt;br /&gt;
						name == slot.i18n.prefixes.matching .. ' ' .. i18n.itemDye or&lt;br /&gt;
						name == slot.i18n.prefixes.any .. ' ' .. i18n.itemColoredDye or&lt;br /&gt;
						name == slot.i18n.prefixes.matching .. ' ' .. i18n.itemColoredDye&lt;br /&gt;
					then&lt;br /&gt;
						if not name:find( i18n.colored ) then&lt;br /&gt;
							addName( i18n.itemWhiteDye )&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						for _, dye in pairs( i18n.coloredDyes ) do&lt;br /&gt;
							addName( dye )&lt;br /&gt;
						end&lt;br /&gt;
					-- List stone variants individually as they have their own pages&lt;br /&gt;
					elseif&lt;br /&gt;
						name == slot.i18n.prefixes.any .. ' ' .. i18n.itemStone or&lt;br /&gt;
						name == slot.i18n.prefixes.matching .. ' ' .. i18n.itemStone&lt;br /&gt;
					then&lt;br /&gt;
						for _, stone in pairs( i18n.stoneVariants ) do&lt;br /&gt;
							addName( stone )&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						-- Merge item variants which use a single page&lt;br /&gt;
						if&lt;br /&gt;
							name == slot.i18n.prefixes.any .. ' ' .. i18n.itemMushroom or&lt;br /&gt;
							name == slot.i18n.prefixes.matching .. ' ' .. i18n.itemMushroom or&lt;br /&gt;
							name == i18n.itemRedMushroom or&lt;br /&gt;
							name == i18n.itemBrownMushroom&lt;br /&gt;
						then name = i18n.itemMushroom&lt;br /&gt;
						elseif name == i18n.itemSmoothQuartzBlock then name = i18n.itemSmoothQuartzBlock&lt;br /&gt;
						elseif name == i18n.itemCharcoal then name = i18n.itemCoal&lt;br /&gt;
						elseif name:find( ' ' .. i18n.itemQuartzBlock .. '$' ) then name = i18n.itemBlockOfQuartz&lt;br /&gt;
						else&lt;br /&gt;
							for _, variant in pairs( i18n.variantPages ) do&lt;br /&gt;
								if name:find( ' ' .. variant .. '$' ) then&lt;br /&gt;
									name = variant&lt;br /&gt;
									break&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							for _, variant in pairs( i18n.CopperBlockLinks ) do&lt;br /&gt;
								if name:find( variant ) then&lt;br /&gt;
									name = i18n.CopperBlock&lt;br /&gt;
									break&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
							-- Remove prefixes&lt;br /&gt;
							for _, prefix in pairs( slot.i18n.prefixes ) do&lt;br /&gt;
								if name:find( '^' .. prefix .. ' ' ) then&lt;br /&gt;
									name = name:gsub( '^' .. prefix .. ' ', '' )&lt;br /&gt;
									break&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						-- handle &amp;quot;A or B&amp;quot; names&lt;br /&gt;
						local orA, orB = name:match(&amp;quot;(.-) or (.+)&amp;quot;)&lt;br /&gt;
						if orA then&lt;br /&gt;
							addName( orA )&lt;br /&gt;
							addName( orB )&lt;br /&gt;
						else&lt;br /&gt;
							addName( name )&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out, table.concat( categories, '' )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Crafting&gt;Dhranios</name></author>
		
	</entry>
</feed>