Module:Crafting
This module implements {{CraftV2}}. This module was ported from https://minecraft.wiki. It is licensed under CC BY-NC-SA 3.0
Parent arguments are automatically merged with directly passed arguments (the latter overwriting the former).
Dependencies
local p = {} local i18n = { moduleArgs = [[Module:ProcessArgs]], moduleRecipe = [[Module:Recipe table]], moduleSlot = [[Module:Inventory slot]], moduleAliases = [[Module:Inventory slot/Aliases]], type = 'Crafting' } p.i18n = i18n local slot = require( i18n.moduleSlot ) local recipeTable = require( i18n.moduleRecipe ).table local aliases = mw.loadData( i18n.moduleAliases ) local cArgVals = { 'A1', 'B1', 'C1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3' } p.cArgVals = cArgVals function p.table( f ) local args = f if f == mw.getCurrentFrame() then args = require( i18n.moduleArgs ).merge( true ) else f = mw.getCurrentFrame() end -- Automatic shapeless positioning if args[1] then args.shapeless = 1 if args[7] then args.A1 = args[1] args.B1 = args[2] args.C1 = args[3] args.A2 = args[4] args.B2 = args[5] args.C2 = args[6] if args[8] then -- ◼◼◼ ◼◼◼ -- ◼◼◼ OR ◼◼◼ -- ◼◼◼ ◼◼◻ args.A3 = args[7] args.B3 = args[8] args.C3 = args[9] if args[9] then local identical = true for i = 1, 8 do if args[i] ~= args[i + 1] then identical = false break end end if identical then args.shapeless = nil end end else -- ◼◼◼ -- ◼◼◼ -- ◻◼◻ args.B3 = args[7] end elseif args[2] then args.A2 = args[1] args.B2 = args[2] if args[5] then -- ◻◻◻ ◻◻◻ -- ◼◼◼ OR ◼◼◼ -- ◼◼◼ ◼◼◻ args.C2 = args[3] args.A3 = args[4] args.B3 = args[5] args.C3 = args[6] elseif args[4] then -- ◻◻◻ -- ◼◼◻ -- ◼◼◻ args.A3 = args[3] args.B3 = args[4] else -- ◻◻◻ ◻◻◻ -- ◼◼◻ OR ◼◼◻ -- ◻◼◻ ◻◻◻ args.B3 = args[3] end else -- ◻◻◻ -- ◻◼◻ -- ◻◻◻ args.B2 = args[1] args.shapeless = nil end for i = 1, 9 do args[i] = nil end end -- Create recipe table, and list of ingredients local out, ingredientSets, outputSets = recipeTable( args, { uiFunc = 'craftingTable', type = i18n.type, ingredientArgs = cArgVals, outputArgs = { 'Output' }, } ) local title = mw.title.getCurrentTitle() if args.ignoreusage or args.nocat == '1' or title.namespace ~= 0 or title.isSubpage then return out end -- SMW -- Json contains the full frames, the other SMW properties are just item names. local smw_json = { ["type"] = args.type, ["shapeless"] = args.shapeless, ["fixed"] = args.fixed, ["notfixed"] = args.notfixed, ["description"] = mw.text.unstrip(args.description or ''), --Remove ref tags ["name"] = args.name, ["ingredients"] = args.ingredients, ["nocat"] = args.nocat, ["A1"] = args.A1, ["A2"] = args.A2, ["A3"] = args.A3, ["B1"] = args.B1, ["B2"] = args.B2, ["B3"] = args.B3, ["C1"] = args.C1, ["C2"] = args.C2, ["C3"] = args.C3, ["Output"] = args.Output, ["group"] = args.group } -- Flatten the item sets into a simple list local function makeNameList(itemSets) local retTable = {} local inputRetTable = {} local usedNames = {} for _, itemSet in pairs(itemSets) do for _, item in pairs(itemSet) do --local name = item.mod .. ":" .. item.name -- use instead of just item.name if mods are covered if not usedNames[item.name] then table.insert(retTable, item.name) table.insert(inputRetTable, item.name) usedNames[item.name] = true if aliases[item.name] then for _, aliasEntry in ipairs(aliases[item.name]) do if not usedNames[aliasEntry] then 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. usedNames[aliasEntry] = true end end end end end end return retTable, inputRetTable end local output_names, original_output_names = makeNameList(outputSets) local ingredient_names, original_ingredient_names = makeNameList(ingredientSets) local group_names = {} if args.group then for name in string.gmatch(args.group, "[^,]+") do table.insert(group_names, mw.text.trim(name)) end end local json = mw.text.jsonEncode(smw_json) local smw_sub = {} -- We must have a unique subname since Crafting usage cannot handle when multiple json entries are within one sub object. local subname = 'CRAFTING_OUT_'..table.concat(original_output_names,'_'):sub(1,100)..'_IN_'..table.concat(original_ingredient_names,'_'):sub(1,100)..'_'..mw.hash.hashValue("md4",json) local smw_sub = { -- the actual SMW sub-object ['Crafting ingredient'] = ingredient_names, ['Crafting output'] = output_names, ['Crafting JSON'] = json, ['Crafting type'] = args.type } mw.smw.subobject(smw_sub, subname) return out end return p