Documentation
GetPartInfo can be invoked using
{{#invoke:GetPartInfo|getField|FIELD}}
Replace "FIELD" with the wanted field, like:
{{#invoke:GetPartInfo|getField|Recipe}}
Additionally, you may add a second parameter to specify which part's information you want to retrieve, if this is not provided it will guess that the wanted part has the same name as the page's title. Usually, this will only need to be used if the page requests information about a part that the page isn't named after. An example of this is:
{{#invoke:GetPartInfo|getField|Recipe|WirelessButton}}
Fields
A list of all fields retrievable in this module can be found here:
- Recipe
- Raw recipe
- Malleability
- Description
Use-case Examples:
These are some examples of the module being used in which all of them specify information of the "HyperDrive" part to be retrieved:
In-game Description
"A device used to travel at faster than light speeds to other regions of the universe. Simply input the coordinates to your destination and have a sufficient amount of fuel, and you'll be on your way to your destination. To initiate warping, power the hyperdrive and trigger it. When warping, the hyperdrive will be anchored to prevent any movement. The power required for warping will be dependent on the distance travelled, as well as the size of the object being transported. The amount of power required will be displayed in the hyper drive, shown in the red text. All of the parts connected to the hyperdrive and every player sitting will be teleported, however any free floating parts or standing up players will be sucked into the vaccum of space, so be careful. The red text at the bottom of the hyperdrive indicates how much power is needed to perform the jump. Make sure the numbers on the hyperdrive is facing up to ensure correct stud alignment. "
Recipe
Raw recipe
Malleability
Fixed size
local module = {}
local Parts = require("Module:PartJSON")
local function getRawMaterials(item)
local Materials = {}
local function get(item, amount)
for _, itemEntry in pairs(item.Recipe) do
local itemName = itemEntry[1]
local itemAmount = itemEntry[2]
if not Parts[itemName] or not Parts[itemName]["Recipe"] then
if not Materials[itemName] then
Materials[itemName] = 0
end
Materials[itemName] = Materials[itemName] + (amount * itemAmount)
else
get(Parts[itemName], amount * itemAmount)
end
end
end
if item and item.Recipe then
get(item, 1)
else
return false
end
return Materials
end
local function formatNormalRecipe(recipe)
local formattedRecipe = {}
if recipe then
for _, itemEntry in pairs(recipe) do
local itemName = itemEntry[1]
local itemAmount = itemEntry[2]
formattedRecipe[itemName] = itemAmount
end
return formattedRecipe
end
end
local function formatRecipe(recipe)
if recipe then
local recipeString = ""
local i = 0
for itemName, amount in pairs(recipe) do
local endString = ""
i = i + 1
if not i == #recipe then
endString = ""
else
endString = "\n\n"
end
recipeString = recipeString .. "[[" .. itemName .. "|" .. itemName .. " x" .. amount .. "]]" .. endString
end
return recipeString
else
return "No crafting recipe"
end
end
function module.getField(page)
local args = page.args
local itemName = args[2] or page:getParent():getTitle()
local field = args[1]
if field == "Description" then
local part = Parts[itemName]
if not part then
return "No description found"
end
local description = part.Description
if description then
local descriptionSplit = mw.text.split(description, "\n")
local descriptionFormatted = "''\""
for i, str in pairs(descriptionSplit) do
if i > 1 and #str > 3 then descriptionFormatted = descriptionFormatted .. "''\n\n''" end
if #str > 3 then
descriptionFormatted = descriptionFormatted .. string.gsub(str, "%*%*", "'''") end
end
return descriptionFormatted .. "\" ''"
else
return "No description found"
end
elseif field == "Malleability" then
local malleability = Parts[itemName]["Malleability"]
if malleability == 0 or not malleability then
return "Fixed size"
else
return malleability
end
elseif field == "Raw recipe" then
local item = Parts[itemName]
if not item then
return nil
end
local rawRecipe = getRawMaterials(item)
module.rr = rawRecipe
module.r = item.Recipe
local recipeFormatted = getRawMaterials(rawRecipe)
if formatRecipe(rawRecipe) == formatRecipe(formatNormalRecipe(item.Recipe)) then
return nil
end
return formatRecipe(rawRecipe)
elseif field == "Recipe" then
local item = Parts[itemName]
if not item then
return "No recipe found"
end
local recipe = item.Recipe
module.r = recipe
return formatRecipe(formatNormalRecipe(recipe))
elseif field == "Durability" then
return Parts[itemName]["Durability"] or 3
elseif field == "Configuration" then
local configData = Parts[itemName]["ConfigData"]
local formatted = ""
for _, entry in pairs(configData) do
local entryName = entry[1]
local entryType = entry[2]
local default = entry[3]
local range = entry[4]
local description = entry[5]
if entryType == "number" then
formatted = formatted .. "\n * "..entryName.." <sup>(number) [" .. range[1] .. "-" .. range[2] .. "] [default '"..default.."']</sup>"
elseif entryType == "boolean" then
formatted = formatted .. "\n * "..entryName.." <sup>(boolean)</sup>"
elseif entryType == "string" then
formatted = formatted .. "\n * "..entryName.." <sup>(string)</sup>"
elseif entryType == "selectable" then
formatted = formatted .. "\n * "..entryName.." <sup>(selectable)</sup>"
end
end
return string.sub(formatted, 2)
elseif field == "ConfigurationLarge" then
local configData = Parts[itemName]["ConfigData"]
local formatted = ""
for _, entry in pairs(configData) do
local entryName = entry[1]
local entryType = entry[2]
local default = entry[3]
local range = entry[4]
local description = entry[5]
if entryType == "number" then
formatted = formatted .. "\n * "..entryName.."<sup>(number) (range "..range[1].."-"..range[2]..")</sup> - "..description
elseif entryType == "boolean" then
formatted = formatted .. "\n * "..entryName.."<sup>(boolean)</sup> - "..description
elseif entryType == "string" then
formatted = formatted .. "\n * "..entryName.."<sup>(string)</sup> - "..description
elseif entryType == "selectable" then
formatted = formatted .. "\n * "..entryName.."<sup>(selectable)</sup> - "..description
end
end
return string.sub(formatted, 2)
elseif Parts[itemName] and Parts[itemName][field] then
return tostring(Parts[itemName][field])
else
error("unknown field given: " .. tostring(args[1]))
end
end
return module