357 lines
No EOL
12 KiB
Lua
357 lines
No EOL
12 KiB
Lua
-- rnd 2016:
|
|
|
|
-- CONSTRUCTOR machine: used to make all other basic_machines
|
|
|
|
basic_machines.craft_recipes = {
|
|
["keypad"] = {item = "basic_machines:keypad", description = "Turns on/off lights and activates machines or opens doors", craft = {"default:wood","default:stick"}, tex = "keypad"},
|
|
["light"]={item = "basic_machines:light_on", description = "Light in darkness", craft = {"default:torch 4"}, tex = "light"},
|
|
["mover"]={item = "basic_machines:mover", description = "Can dig, harvest, plant, teleport or move items from/in inventories", craft = {"default:mese_crystal 6","default:stone 2", "basic_machines:keypad"}, tex = "basic_machine_mover_side"},
|
|
|
|
["detector"] = {item = "basic_machines:detector", description = "Detect and measure players, objects,blocks,light level", craft = {"default:mese_crystal 4","basic_machines:keypad"}, tex = "detector"},
|
|
|
|
["distributor"]= {item = "basic_machines:distributor", description = "Organize your circuits better", craft = {"default:steel_ingot","default:mese_crystal", "basic_machines:keypad"}, tex = "distributor"},
|
|
|
|
["clock_generator"]= {item = "basic_machines:clockgen", description = "For making circuits that run non stop", craft = {"default:diamondblock","basic_machines:keypad"}, tex = "basic_machine_clock_generator"},
|
|
|
|
["recycler"]= {item = "basic_machines:recycler", description = "Recycle old tools", craft = {"default:mese_crystal 8","default:diamondblock"}, tex = "recycler"},
|
|
|
|
["enviroment"] = {item = "basic_machines:enviro", description = "Change gravity and more", craft = {"basic_machines:generator 8","basic_machines:clockgen"}, tex = "enviro"},
|
|
|
|
["ball_spawner"]={item = "basic_machines:ball_spawner", description = "Spawn moving energy balls", craft = {"basic_machines:power_cell","basic_machines:keypad"}, tex = "basic_machines_ball"},
|
|
|
|
["battery"]={item = "basic_machines:battery_0", description = "Power for machines", craft = {"default:bronzeblock 2","default:mese","default:diamond"}, tex = "basic_machine_battery"},
|
|
|
|
["generator"]={item = "basic_machines:generator", description = "Generate power crystals", craft = {"default:diamondblock 5","basic_machines:battery 5","default:goldblock 5"}, tex = "basic_machine_generator"},
|
|
|
|
["autocrafter"] = {item = "basic_machines:autocrafter", description = "Automate crafting", craft = { "default:steel_ingot 5", "default:mese_crystal 2", "default:diamondblock 2"}, tex = "pipeworks_autocrafter"},
|
|
|
|
["grinder"] = {item = "basic_machines:grinder", description = "Makes dusts and grinds materials", craft = {"default:diamond 13","default:mese 4"}, tex = "grinder"},
|
|
|
|
["power_block"] = {item = "basic_machines:power_block 5", description = "Energy cell, contains 11 energy units", craft = {"basic_machines:power_rod"}, tex = "power_block"},
|
|
|
|
["power_cell"] = {item = "basic_machines:power_cell 5", description = "Energy cell, contains 1 energy unit", craft = {"basic_machines:power_block"}, tex = "power_cell"},
|
|
|
|
["coal_lump"] = {item = "default:coal_lump", description = "Coal lump, contains 1 energy unit", craft = {"basic_machines:power_cell 2"}, tex = "default_coal_lump"},
|
|
|
|
}
|
|
|
|
basic_machines.craft_recipe_order = { -- order in which nodes appear
|
|
"keypad","light","grinder","mover", "battery","generator","detector", "distributor", "clock_generator","recycler","autocrafter","ball_spawner", "enviroment", "power_block", "power_cell", "coal_lump",
|
|
}
|
|
|
|
|
|
|
|
local constructor_process = function(pos)
|
|
|
|
local meta = minetest.get_meta(pos);
|
|
local craft = basic_machines.craft_recipes[meta:get_string("craft")];
|
|
if not craft then return end
|
|
local item = craft.item;
|
|
local craftlist = craft.craft;
|
|
|
|
local inv = meta:get_inventory();
|
|
for _,v in pairs(craftlist) do
|
|
if not inv:contains_item("main", ItemStack(v)) then
|
|
meta:set_string("infotext", "#CRAFTING: you need " .. v .. " to craft " .. craft.item)
|
|
return
|
|
end
|
|
end
|
|
|
|
for _,v in pairs(craftlist) do
|
|
inv:remove_item("main", ItemStack(v));
|
|
end
|
|
inv:add_item("main", ItemStack(item));
|
|
|
|
end
|
|
|
|
local constructor_update_meta = function(pos)
|
|
local meta = minetest.get_meta(pos);
|
|
local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z
|
|
local craft = meta:get_string("craft");
|
|
|
|
local description = basic_machines.craft_recipes[craft];
|
|
local tex;
|
|
|
|
if description then
|
|
tex = description.tex;
|
|
local i = 0;
|
|
local itex;
|
|
|
|
local inv = meta:get_inventory(); -- set up craft list
|
|
for _,v in pairs(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 = ""
|
|
tex = ""
|
|
end
|
|
|
|
|
|
local textlist = " ";
|
|
|
|
local selected = meta:get_int("selected") or 1;
|
|
for _,v in ipairs(basic_machines.craft_recipe_order) do
|
|
textlist = textlist .. v .. ", ";
|
|
|
|
end
|
|
|
|
local form =
|
|
"size[8,10]"..
|
|
"textlist[0,0;3,1.5;craft;" .. textlist .. ";" .. selected .."]"..
|
|
"button[3.5,1;1.25,0.75;CRAFT;CRAFT]"..
|
|
"image[3.65,0;1,1;".. tex .. ".png]"..
|
|
"label[0,1.85;".. description .. "]"..
|
|
"list[context;recipe;5,0;3,2;]"..
|
|
"label[0,2.3;Put crafting materials here]"..
|
|
"list[context;main;0,2.7;8,3;]"..
|
|
--"list[context;dst;5,0;3,2;]"..
|
|
"label[0,5.5;player inventory]"..
|
|
"list[current_player;main;0,6;8,4;]"..
|
|
"listring[context;main]"..
|
|
"listring[current_player;main]";
|
|
meta:set_string("formspec", form);
|
|
end
|
|
|
|
|
|
minetest.register_node("basic_machines:constructor", {
|
|
description = "Constructor: used to make machines",
|
|
tiles = {"constructor.png"},
|
|
groups = {cracky=3, mesecon_effector_on = 1, tubedevice = 1, tubedevice_receiver = 1},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
after_place_node = function(pos, placer)
|
|
local meta = minetest.get_meta(pos);
|
|
meta:set_string("infotext", "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","keypad")
|
|
meta:set_int("selected",1);
|
|
local inv = meta:get_inventory();inv:set_size("main", 24);--inv:set_size("dst",6);
|
|
inv:set_size("recipe",8);
|
|
end,
|
|
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
local meta = minetest.get_meta(pos);
|
|
local privs = minetest.get_player_privs(player:get_player_name());
|
|
if minetest.is_protected(pos, player:get_player_name()) and not privs.privs then return end -- only owner can interact with recycler
|
|
constructor_update_meta(pos);
|
|
end,
|
|
|
|
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
if listname == "recipe" then return 0 end
|
|
local meta = minetest.get_meta(pos);
|
|
local privs = minetest.get_player_privs(player:get_player_name());
|
|
if meta:get_string("owner")~=player:get_player_name() and not privs.privs then return 0 end
|
|
return stack:get_count();
|
|
end,
|
|
|
|
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
if listname == "recipe" then return 0 end
|
|
local privs = minetest.get_player_privs(player:get_player_name());
|
|
if minetest.is_protected(pos, player:get_player_name()) and not privs.privs then return 0 end
|
|
return stack:get_count();
|
|
end,
|
|
|
|
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
if listname == "recipe" then return 0 end
|
|
local privs = minetest.get_player_privs(player:get_player_name());
|
|
if minetest.is_protected(pos, player:get_player_name()) and not privs.privs then return 0 end
|
|
return stack:get_count();
|
|
end,
|
|
|
|
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
return 0;
|
|
end,
|
|
|
|
mesecons = {effector = {
|
|
action_on = function (pos, node,ttl)
|
|
if type(ttl)~="number" then ttl = 1 end
|
|
if ttl<0 then return end -- machines_TTL prevents infinite recursion
|
|
constructor_process(pos);
|
|
end
|
|
}
|
|
},
|
|
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
|
|
if minetest.is_protected(pos, sender:get_player_name()) then return end
|
|
local meta = minetest.get_meta(pos);
|
|
|
|
if fields.craft then
|
|
if string.sub(fields.craft,1,3)=="CHG" then
|
|
local sel = tonumber(string.sub(fields.craft,5)) or 1
|
|
meta:set_int("selected",sel);
|
|
|
|
local i = 0;
|
|
for _,v in ipairs(basic_machines.craft_recipe_order) do
|
|
i=i+1;
|
|
if i == sel then meta:set_string("craft",v); break; end
|
|
end
|
|
else
|
|
return
|
|
end
|
|
end
|
|
|
|
if fields.CRAFT then
|
|
constructor_process(pos);
|
|
end
|
|
|
|
constructor_update_meta(pos);
|
|
end,
|
|
|
|
tube = {
|
|
insert_object = function(pos, node, stack, direction)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
return inv:add_item("main", stack)
|
|
end,
|
|
can_insert = function(pos, node, stack, direction)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
if meta:get_int("split_material_stacks") == 1 then
|
|
stack = stack:peek_item(1)
|
|
end
|
|
return inv:room_for_item("main", stack)
|
|
end,
|
|
input_inventory = "main",
|
|
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1}
|
|
},
|
|
})
|
|
|
|
--[[
|
|
minetest.register_craft({
|
|
output = "basic_machines: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"},
|
|
|
|
}
|
|
})
|
|
--]]
|
|
|
|
---------------------------
|
|
-- !!! replace nodes !!! --
|
|
---------------------------
|
|
|
|
local function replace_node(t)
|
|
minetest.register_abm({
|
|
label = "replace node",
|
|
nodenames = t.names or {t.name},
|
|
neighbors = t.need or nil,
|
|
interval = t.i or 2,
|
|
chance = t.ch or 3,
|
|
action = function(pos)
|
|
local node = minetest.get_node(pos)
|
|
node.name = t.to or t.to_name or "air"
|
|
minetest.swap_node(pos, node)
|
|
end
|
|
})
|
|
end
|
|
|
|
-- receptor --
|
|
replace_node({name = "basic_machines:keypad", to = "default:wood"})
|
|
replace_node({name = "clock_generator", to = "default:diamondblock"})
|
|
|
|
-- effector --
|
|
replace_node({name = "basic_machines:light_on", to = "mesecons_lightstone:lightstone_white_on"})
|
|
replace_node({name = "basic_machines:light_off", to = "mesecons_lightstone:lightstone_white_off"})
|
|
|
|
-- conductor --
|
|
minetest.register_craft({
|
|
output = "basic_machines:distributor",
|
|
recipe = {
|
|
{"default:steel_ingot","mesecons:wire_00000000_off", "default:steel_ingot"},
|
|
{"mesecons:wire_00000000_off","default:mese","mesecons:wire_00000000_off"},
|
|
{"default:steel_ingot","mesecons:wire_00000000_off","default:steel_ingot"},
|
|
|
|
}
|
|
})
|
|
replace_node({name = "basic_machines:detector", to = "default:mese"})
|
|
|
|
-- machines --
|
|
replace_node({name = "basic_machines:mover", to = "default:mese", need = {"air"}})
|
|
replace_node({name = "basic_machines:constructor", to = "default:copperblock", need = {"air"}})
|
|
|
|
-- inventory machines --
|
|
replace_node({name = "basic_machines:autocrafter", to = "pipeworks:autocrafter"})
|
|
minetest.register_craft({
|
|
output = "basic_machines:grinder",
|
|
recipe = {
|
|
{"default:diamond","default:mese","default:diamond"},
|
|
{"default:mese","default:diamondblock","default:mese"},
|
|
{"default:diamond","default:mese","default:diamond"},
|
|
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "basic_machines:recycler",
|
|
recipe = {
|
|
{"default:mese_crystal","default:mese_crystal","default:mese_crystal"},
|
|
{"default:mese_crystal","default:diamondblock","default:mese_crystal"},
|
|
{"default:mese_crystal","default:mese_crystal","default:mese_crystal"},
|
|
|
|
}
|
|
})
|
|
|
|
-- power --
|
|
minetest.register_craft({
|
|
output = "basic_machines:generator",
|
|
recipe = {
|
|
{"default:diamondblock","default:goldblock","default:diamondblock"},
|
|
{"default:goldblock","default:diamondblock","default:goldblock"},
|
|
{"default:diamondblock","default:goldblock","default:diamondblock"},
|
|
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "basic_machines:battery_0",
|
|
recipe = {
|
|
{"default:bronzeblock","default:mese","default:bronzeblock"},
|
|
{"","default:diamond",""},
|
|
{"","",""},
|
|
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "basic_machines:power_block 5",
|
|
recipe = {
|
|
{"basic_machines:power_rod","",""},
|
|
{"","",""},
|
|
{"","",""},
|
|
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "basic_machines:power_cell 5",
|
|
recipe = {
|
|
{"basic_machines:power_block","",""},
|
|
{"","",""},
|
|
{"","",""},
|
|
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "default:coal_lump",
|
|
recipe = {
|
|
{"basic_machines:power_cell","basic_machines:power_cell",""},
|
|
{"","",""},
|
|
{"","",""},
|
|
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "default:coal_lump",
|
|
recipe = {
|
|
{"basic_machines:power_cell","",""},
|
|
{"basic_machines:power_cell","",""},
|
|
{"","",""},
|
|
|
|
}
|
|
}) |