More actions
minecraft>Mudscape Add hash of json to subname to ensure uniqueness |
mNo edit summary |
||
(2 intermediate revisions by the same user not shown) | |||
Line 178: | Line 178: | ||
['Crafting type'] = args.type | ['Crafting type'] = args.type | ||
} | } | ||
mw.smw.subobject(smw_sub, subname) | -- mw.smw.subobject(smw_sub, subname) | ||
return out | return out |
Latest revision as of 16:17, 11 October 2024
This module implements {{crafting}}
.
Parent arguments are automatically merged with directly passed arguments (the latter overwriting the former).
Dependencies
See also
cs:Modul:Crafting
de:Modul:Herstellen
es:Módulo:Fabricación
fr:Module:Fabrication
it:Modulo:Fabbricazione
ja:モジュール:Crafting
ko:모듈:Crafting
lzh:模組:Crafting
nl:Module:Vervaardiging
pl:Moduł:Crafting
pt:Módulo:Crafting
ru:Модуль:Крафт
th:มอดูล:Crafting
uk:Модуль:Майстрування
zh:Module:Crafting
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 = require( 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