basic_machines-cd2025/constructor.lua
waxtatect b30e92fbdf update all formspecs to v4
update template, various things
enviro, init, space: add a setting to replace space skybox textures
light: add unifieddyes support
2022-12-22 15:42:37 +01:00

314 lines
9.1 KiB
Lua

-- rnd 2016:
-- CONSTRUCTOR machine: used to make all other basic_machines
local F, S = basic_machines.F, basic_machines.S
local craft_recipes = {}
local recipes_order = {}
local recipes_order_translated = {}
local function constructor_update_form(constructor, meta)
local description = craft_recipes[constructor][meta:get_string("craft")]
local item
if description then
item = description.item
local i = 0
local inv = meta:get_inventory() -- set up craft list
for _, v in ipairs(description.craft) do
i = i + 1; inv:set_stack("recipe", i, ItemStack(v))
end
for j = i + 1, 6 do
inv:set_stack("recipe", j, ItemStack(""))
end
description = description.description
else
description, item = "", ""
end
meta:set_string("formspec", "formspec_version[4]size[10.45,12.35]" ..
"style_type[list;spacing=0.25,0.15]" ..
"textlist[0.35,0.35;3.5,1.7;craft;" .. recipes_order_translated[constructor] .. ";" .. meta:get_int("selected") ..
"]item_image[4.75,0.35;1,1;" .. item .. "]button[4.6,1.65;1.3,0.8;CRAFT;" .. F(S("CRAFT")) ..
"]list[context;recipe;6.6,0.35;3,2]" ..
"label[0.35,2.85;" .. F(description) ..
"]list[context;main;0.35,3.25;8,3]" ..
basic_machines.get_form_player_inventory(0.35, 7.3, 8, 4, 0.25) ..
"listring[context;main]" ..
"listring[current_player;main]")
end
local function constructor_process(pos, constructor, name)
local meta = minetest.get_meta(pos)
local craft = craft_recipes[constructor][meta:get_string("craft")]
if craft then
local item = craft.item
local stack = ItemStack(item)
local def = stack:get_definition()
if def then
local inv = meta:get_inventory()
if inv:room_for_item("main", stack) then
if basic_machines.creative(name or "") then
inv:add_item("main", stack)
else
local recipe = craft.craft
for _, v in ipairs(recipe) do
if not inv:contains_item("main", ItemStack(v)) then
meta:set_string("infotext", S("CRAFTING: You need '@1' to craft '@2'", v, item)); return
end
end
for _, v in ipairs(recipe) do
inv:remove_item("main", ItemStack(v))
end
inv:add_item("main", stack)
end
end
end
if name or meta:get_string("infotext") == "" then
meta:set_string("infotext", S("CRAFTING: '@1' (@2)",
def and def.description or S("Unknown item"), item))
end
end
end
local function add_constructor(name, def)
craft_recipes[name] = def.craft_recipes
recipes_order[name] = def.recipes_order
recipes_order_translated[name] = table.concat(def.recipes_order_translated, ",")
minetest.register_node(name, {
description = def.description,
groups = {cracky = 3, constructor = 1},
tiles = {name:gsub(":", "_") .. ".png"},
sounds = default.node_sound_wood_defaults(),
after_place_node = function(pos, placer)
if not placer then return end
local meta = minetest.get_meta(pos)
meta:set_string("infotext",
S("Constructor: to operate it insert materials, select item to make and click craft button"))
meta:set_string("owner", placer:get_player_name())
meta:set_string("craft", def.recipes_order[1])
meta:set_int("selected", 1)
local inv = meta:get_inventory()
inv:set_size("main", 24)
inv:set_size("recipe", 6)
constructor_update_form(name, meta)
end,
can_dig = function(pos, player) -- main inv must be empty to be dug
local meta = minetest.get_meta(pos)
return meta:get_inventory():is_empty("main") and meta:get_string("owner") == player:get_player_name()
end,
on_receive_fields = function(pos, formname, fields, sender)
if fields.quit then return end
local player_name = sender:get_player_name()
if minetest.is_protected(pos, player_name) then return end
if fields.CRAFT then
constructor_process(pos, name, player_name)
elseif fields.craft then
if fields.craft:sub(1, 3) == "CHG" then
local sel = tonumber(fields.craft:sub(5)) or 1
local meta = minetest.get_meta(pos)
meta:set_string("infotext", "")
for i, v in ipairs(recipes_order[name]) do
if i == sel then meta:set_string("craft", v); break end
end
meta:set_int("selected", sel)
constructor_update_form(name, meta)
end
end
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
return 0
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if listname == "recipe" or minetest.is_protected(pos, player:get_player_name()) then
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
if listname == "recipe" or minetest.is_protected(pos, player:get_player_name()) then
return 0
end
return stack:get_count()
end,
effector = {
action_on = function(pos, _)
constructor_process(pos, name, nil)
end
}
})
minetest.register_craft({
output = name,
recipe = def.recipe
})
end
-- CONSTRUCTOR
local def = {
description = S("Constructor"),
recipe = {
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "default:copperblock", "default:steel_ingot"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
},
craft_recipes = {
["Autocrafter"] = {
item = "basic_machines:autocrafter",
description = S("Automate crafting"),
craft = {"default:steel_ingot 5", "default:mese_crystal 2", "default:diamondblock 2"}
},
["Ball Spawner"] = {
item = "basic_machines:ball_spawner",
description = S("Spawn moving energy balls"),
craft = {"basic_machines:power_cell", "basic_machines:keypad"}
},
["Battery"] = {
item = "basic_machines:battery_0",
description = S("Store energy, can power nearby machines"),
craft = {"default:bronzeblock 2", "default:mese", "default:diamond"}
},
["Clock Generator"] = {
item = "basic_machines:clockgen",
description = S("For making circuits that run non stop"),
craft = {"default:diamondblock", "basic_machines:keypad"}
},
["Coal Lump"] = {
item = "default:coal_lump",
description = S("Coal lump, contains 1 energy unit"),
craft = {"basic_machines:power_cell 2"}
},
["Detector"] = {
item = "basic_machines:detector",
description = S("Detect block, player, object, light level..."),
craft = {"default:mese_crystal 4", "basic_machines:keypad"}
},
["Distributor"] = {
item = "basic_machines:distributor",
description = S("Organize your circuits better"),
craft = {"default:steel_ingot", "default:mese_crystal", "basic_machines:keypad"}
},
["Environment Changer"] = {
item = "basic_machines:enviro",
description = S("Change gravity and more"),
craft = {"basic_machines:generator 8", "basic_machines:clockgen"}
},
["Generator"] = {
item = "basic_machines:generator",
description = S("Generate power crystals"),
craft = {"default:diamondblock 5", "basic_machines:battery_0 5", "default:goldblock 5"}
},
["Grinder"] = {
item = "basic_machines:grinder",
description = S("Make dusts and grind materials"),
craft = {"default:diamond 13", "default:mese 4"}
},
["Keypad"] = {
item = "basic_machines:keypad",
description = S("Activate machines by sending signal"),
craft = {"default:wood", "default:stick"}
},
["Light"] = {
item = "basic_machines:light_on",
description = S("Light in darkness"),
craft = {"default:torch 4"}
},
["Mover"] = {
item = "basic_machines:mover",
description = S("Universal digging, harvesting, teleporting, transporting machine"),
craft = {"default:mese_crystal 6", "default:stone 2", "basic_machines:keypad"}
},
["Power Block"] = {
item = "basic_machines:power_block 5",
description = S("Energy block"),
craft = {"basic_machines:power_rod"}
},
["Power Cell"] = {
item = "basic_machines:power_cell 5",
description = S("Energy cell"),
craft = {"basic_machines:power_block"}
},
["Recycler"] = {
item = "basic_machines:recycler",
description = S("Recycle old tools"),
craft = {"default:mese_crystal 8", "default:diamondblock"}
}
},
recipes_order = { -- order in which nodes appear
"Keypad",
"Light",
"Grinder",
"Mover",
"Battery",
"Generator",
"Detector",
"Distributor",
"Clock Generator",
"Recycler",
"Autocrafter",
"Ball Spawner",
"Environment Changer",
"Power Block",
"Power Cell",
"Coal Lump"
},
recipes_order_translated = { -- for translation
F(S("Keypad")), F(S("Light")), F(S("Grinder")), F(S("Mover")), F(S("Battery")),
F(S("Generator")), F(S("Detector")), F(S("Distributor")), F(S("Clock Generator")),
F(S("Recycler")), F(S("Autocrafter")), F(S("Ball Spawner")), F(S("Environment Changer")),
F(S("Power Block")), F(S("Power Cell")), F(S("Coal Lump"))
}
}
if minetest.global_exists("mesecon") then -- add mesecon adapter
def.craft_recipes["Mesecon Adapter"] = {
item = "basic_machines:mesecon_adapter",
description = S("Interface between machines and mesecons"),
craft = {"default:mese_crystal_fragment"}
}
def.recipes_order[#def.recipes_order + 1] = "Mesecon Adapter"
def.recipes_order_translated[#def.recipes_order_translated + 1] = F(S("Mesecon Adapter"))
end
add_constructor("basic_machines:constructor", def)