<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://otherwiki.horizonsend.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://otherwiki.horizonsend.net/index.php?action=history&amp;feed=atom&amp;title=Module%3ACrafting"/>
	<link rel="alternate" type="text/html" href="https://otherwiki.horizonsend.net/index.php?title=Module:Crafting&amp;action=history"/>
	<updated>2026-04-15T00:31:03Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://otherwiki.horizonsend.net/index.php?title=Module:Crafting&amp;diff=6791&amp;oldid=prev</id>
		<title>Gutin at 05:29, 12 August 2025</title>
		<link rel="alternate" type="text/html" href="https://otherwiki.horizonsend.net/index.php?title=Module:Crafting&amp;diff=6791&amp;oldid=prev"/>
		<updated>2025-08-12T05:29:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://otherwiki.horizonsend.net/index.php?title=Module:Crafting&amp;amp;diff=6791&amp;amp;oldid=4720&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Gutin</name></author>
	</entry>
	<entry>
		<id>https://otherwiki.horizonsend.net/index.php?title=Module:Crafting&amp;diff=4720&amp;oldid=prev</id>
		<title>Gutin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://otherwiki.horizonsend.net/index.php?title=Module:Crafting&amp;diff=4720&amp;oldid=prev"/>
		<updated>2025-02-16T21:41:48Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:41, 16 February 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Gutin</name></author>
	</entry>
	<entry>
		<id>https://otherwiki.horizonsend.net/index.php?title=Module:Crafting&amp;diff=4719&amp;oldid=prev</id>
		<title>Module_&gt;Leo768 at 11:54, 9 November 2024</title>
		<link rel="alternate" type="text/html" href="https://otherwiki.horizonsend.net/index.php?title=Module:Crafting&amp;diff=4719&amp;oldid=prev"/>
		<updated>2024-11-09T11:54:05Z</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;
	moduleArgs = [[Module:ProcessArgs]],&lt;br /&gt;
	moduleRecipe = [[Module:Recipe table]],&lt;br /&gt;
	moduleSlot = [[Module:Inventory slot]],&lt;br /&gt;
	moduleAliases = [[Module:Inventory slot/Aliases]],&lt;br /&gt;
	type = &amp;#039;Crafting&amp;#039;&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 aliases = mw.loadData( i18n.moduleAliases )&lt;br /&gt;
local cArgVals = { &amp;#039;A1&amp;#039;, &amp;#039;B1&amp;#039;, &amp;#039;C1&amp;#039;, &amp;#039;A2&amp;#039;, &amp;#039;B2&amp;#039;, &amp;#039;C2&amp;#039;, &amp;#039;A3&amp;#039;, &amp;#039;B3&amp;#039;, &amp;#039;C3&amp;#039; }&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, outputSets = recipeTable( args, {&lt;br /&gt;
		uiFunc = &amp;#039;craftingTable&amp;#039;,&lt;br /&gt;
		type = i18n.type,&lt;br /&gt;
		ingredientArgs = cArgVals,&lt;br /&gt;
		outputArgs = { &amp;#039;Output&amp;#039; },&lt;br /&gt;
	} )&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if args.ignoreusage or args.nocat == &amp;#039;1&amp;#039; or title.namespace ~= 0 or title.isSubpage then&lt;br /&gt;
		return out&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- SMW&lt;br /&gt;
	-- Json contains the full frames, the other SMW properties are just item names.&lt;br /&gt;
	local smw_json = {&lt;br /&gt;
		[&amp;quot;type&amp;quot;] = args.type,&lt;br /&gt;
		[&amp;quot;shapeless&amp;quot;] = args.shapeless,&lt;br /&gt;
		[&amp;quot;fixed&amp;quot;] = args.fixed,&lt;br /&gt;
		[&amp;quot;notfixed&amp;quot;] = args.notfixed,&lt;br /&gt;
		[&amp;quot;description&amp;quot;] = mw.text.unstrip(args.description or &amp;#039;&amp;#039;), --Remove ref tags&lt;br /&gt;
		[&amp;quot;name&amp;quot;] = args.name,&lt;br /&gt;
		[&amp;quot;ingredients&amp;quot;] = args.ingredients,&lt;br /&gt;
		[&amp;quot;nocat&amp;quot;] = args.nocat,&lt;br /&gt;
		[&amp;quot;A1&amp;quot;] = args.A1,&lt;br /&gt;
		[&amp;quot;A2&amp;quot;] = args.A2,&lt;br /&gt;
		[&amp;quot;A3&amp;quot;] = args.A3,&lt;br /&gt;
		[&amp;quot;B1&amp;quot;] = args.B1,&lt;br /&gt;
		[&amp;quot;B2&amp;quot;] = args.B2,&lt;br /&gt;
		[&amp;quot;B3&amp;quot;] = args.B3,&lt;br /&gt;
		[&amp;quot;C1&amp;quot;] = args.C1,&lt;br /&gt;
		[&amp;quot;C2&amp;quot;] = args.C2,&lt;br /&gt;
		[&amp;quot;C3&amp;quot;] = args.C3,&lt;br /&gt;
		[&amp;quot;Output&amp;quot;] = args.Output,&lt;br /&gt;
		[&amp;quot;group&amp;quot;] = args.group&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	-- Flatten the item sets into a simple list&lt;br /&gt;
	local function makeNameList(itemSets)&lt;br /&gt;
		local retTable = {}&lt;br /&gt;
		local inputRetTable = {}&lt;br /&gt;
		local usedNames = {}&lt;br /&gt;
		for _, itemSet in pairs(itemSets) do&lt;br /&gt;
			for _, item in pairs(itemSet) do&lt;br /&gt;
				--local name = item.mod .. &amp;quot;:&amp;quot; .. item.name     -- use instead of just item.name if mods are covered&lt;br /&gt;
				if not usedNames[item.name] then&lt;br /&gt;
					table.insert(retTable, item.name)&lt;br /&gt;
					table.insert(inputRetTable, item.name)&lt;br /&gt;
					usedNames[item.name] = true&lt;br /&gt;
					&lt;br /&gt;
					if aliases[item.name] then&lt;br /&gt;
						for _, aliasEntry in ipairs(aliases[item.name])	do&lt;br /&gt;
							if not usedNames[aliasEntry] then&lt;br /&gt;
								table.insert(retTable, (aliasEntry.name or aliasEntry)) -- Sometimes the alias entry is a table, so try and grab its name from within the table with a fallback to just the entry.&lt;br /&gt;
								usedNames[aliasEntry] = true&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;
		return retTable, inputRetTable&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local output_names, original_output_names = makeNameList(outputSets)&lt;br /&gt;
	local ingredient_names, original_ingredient_names = makeNameList(ingredientSets)&lt;br /&gt;
	local group_names = {}&lt;br /&gt;
	if args.group then&lt;br /&gt;
		for name in string.gmatch(args.group, &amp;quot;[^,]+&amp;quot;) do&lt;br /&gt;
			table.insert(group_names, mw.text.trim(name))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local json = mw.text.jsonEncode(smw_json)&lt;br /&gt;
	local smw_sub = {}&lt;br /&gt;
	-- We must have a unique subname since Crafting usage cannot handle when multiple json entries are within one sub object.&lt;br /&gt;
	local subname = &amp;#039;CRAFTING_OUT_&amp;#039;..table.concat(original_output_names,&amp;#039;_&amp;#039;):sub(1,100)..&amp;#039;_IN_&amp;#039;..table.concat(original_ingredient_names,&amp;#039;_&amp;#039;):sub(1,100)..&amp;#039;_&amp;#039;..mw.hash.hashValue(&amp;quot;md4&amp;quot;,json)&lt;br /&gt;
	local smw_sub = { -- the actual SMW sub-object&lt;br /&gt;
		[&amp;#039;Crafting ingredient&amp;#039;] = ingredient_names,&lt;br /&gt;
		[&amp;#039;Crafting output&amp;#039;] = output_names,&lt;br /&gt;
		[&amp;#039;Crafting JSON&amp;#039;] = json,&lt;br /&gt;
		[&amp;#039;Crafting type&amp;#039;] = args.type&lt;br /&gt;
	}&lt;br /&gt;
	mw.smw.subobject(smw_sub, subname)&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Module_&gt;Leo768</name></author>
	</entry>
</feed>