2019-12-14 17:47:31 +01:00
-- 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 " } ,
2020-03-17 18:35:34 +01:00
groups = { cracky = 3 , mesecon_effector_on = 1 , tubedevice = 1 , tubedevice_receiver = 1 } ,
2019-12-14 17:47:31 +01:00
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 ,
2020-03-17 17:04:18 +01:00
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 }
} ,
2019-12-14 17:47:31 +01:00
} )
2020-04-23 19:22:58 +02:00
--[[
2019-12-14 17:47:31 +01:00
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 " } ,
2020-04-23 19:22:58 +02:00
}
} )
--]]
---------------------------
-- !!! 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 " , " " , " " } ,
{ " " , " " , " " } ,
2019-12-14 17:47:31 +01:00
}
} )