Vanessa Dannenberg
2018-10-31 44cb8df048e09b64214f59db73a3fd23cfe12e77
technic/machines/LV/cnc.lua
@@ -7,6 +7,18 @@
--   I could imagine some form of API allowing modders to come with their own node
--   box definitions and easily stuff it in the this machine for production.
local S = technic.getter
minetest.register_craft({
   output = 'technic:cnc',
   recipe = {
      {'default:glass',              'technic:diamond_drill_head', 'default:glass'},
      {'technic:control_logic_unit', 'technic:machine_casing',     'basic_materials:motor'},
      {'technic:carbon_steel_ingot', 'technic:lv_cable',           'technic:carbon_steel_ingot'},
   },
})
local shape = {}
local onesize_products = {
@@ -16,6 +28,7 @@
   pyramid                  = 2,
   spike                    = 1,
   cylinder                 = 2,
   oblate_spheroid          = 1,
   sphere                   = 1,
   stick                    = 8,
   slope_upsdown            = 2,
@@ -35,27 +48,28 @@
}
local cnc_formspec =
   "invsize[9,11;]"..
   "label[1,0;Choose Milling Program:]"..
   "size[9,11;]"..
   "label[1,0;"..S("Choose Milling Program:").."]"..
   "image_button[1,0.5;1,1;technic_cnc_slope.png;slope; ]"..
   "image_button[2,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]"..
   "image_button[3,0.5;1,1;technic_cnc_slope_inner_edge.png;slope_inner_edge; ]"..
   "image_button[4,0.5;1,1;technic_cnc_pyramid.png;pyramid; ]"..
   "image_button[5,0.5;1,1;technic_cnc_spike.png;spike; ]"..
   "image_button[6,0.5;1,1;technic_cnc_cylinder.png;cylinder; ]"..
   "image_button[7,0.5;1,1;technic_cnc_sphere.png;sphere; ]"..
   "image_button[7,0.5;1,1;technic_cnc_oblate_spheroid.png;oblate_spheroid; ]"..
   "image_button[8,0.5;1,1;technic_cnc_stick.png;stick; ]"..
   "image_button[1,1.5;1,1;technic_cnc_slope_upsdwn.png;slope_upsdown; ]"..
   "image_button[2,1.5;1,1;technic_cnc_slope_edge_upsdwn.png;slope_edge_upsdown; ]"..
   "image_button[3,1.5;1,1;technic_cnc_slope_inner_edge_upsdwn.png;slope_inner_edge_upsdown; ]"..
   "image_button[4,1.5;1,1;technic_cnc_cylinder_horizontal.png;cylinder_horizontal; ]"..
   "image_button[5,1.5;1,1;technic_cnc_sphere.png;sphere; ]"..
   "image_button[1,2.5;1,1;technic_cnc_slope_lying.png;slope_lying; ]"..
   "image_button[2,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]"..
   "image_button[3,2.5;1,1;technic_cnc_twocurvededge.png;twocurvededge; ]"..
   "label[1,3.5;Slim Elements half / normal height:]"..
   "label[1,3.5;"..S("Slim Elements half / normal height:").."]"..
   "image_button[1,4;1,0.5;technic_cnc_full.png;full; ]"..
   "image_button[1,4.5;1,0.5;technic_cnc_half.png;half; ]"..
@@ -65,12 +79,16 @@
   "image_button[5,4;1,1;technic_cnc_element_t.png;element_t; ]"..
   "image_button[6,4;1,1;technic_cnc_element_edge.png;element_edge; ]"..
   "label[0, 5.5;In:]"..
   "label[0, 5.5;"..S("In:").."]"..
   "list[current_name;src;0.5,5.5;1,1;]"..
   "label[4, 5.5;Out:]"..
   "label[4, 5.5;"..S("Out:").."]"..
   "list[current_name;dst;5,5.5;4,1;]"..
   "list[current_player;main;0,7;8,4;]"
   "list[current_player;main;0,7;8,4;]"..
   "listring[current_name;dst]"..
   "listring[current_player;main]"..
   "listring[current_name;src]"..
   "listring[current_player;main]"
local size = 1;
@@ -124,131 +142,89 @@
   return
end
-- Action code performing the transformation
local run = function(pos, node)
   local meta         = minetest.get_meta(pos)
   local inv          = meta:get_inventory()
   local eu_input     = meta:get_int("LV_EU_input")
   local machine_name = S("%s CNC Machine"):format("LV")
   local machine_node = "technic:cnc"
   local demand       = 450
   local result = meta:get_string("cnc_product")
   if inv:is_empty("src") or
      (not minetest.registered_nodes[result]) or
      (not inv:room_for_item("dst", result)) then
      technic.swap_node(pos, machine_node)
      meta:set_string("infotext", S("%s Idle"):format(machine_name))
      meta:set_string("cnc_product", "")
      meta:set_int("LV_EU_demand", 0)
      return
   end
   if eu_input < demand then
      technic.swap_node(pos, machine_node)
      meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
   elseif eu_input >= demand then
      technic.swap_node(pos, machine_node.."_active")
      meta:set_string("infotext", S("%s Active"):format(machine_name))
      meta:set_int("src_time", meta:get_int("src_time") + 1)
      if meta:get_int("src_time") >= 3 then -- 3 ticks per output
         meta:set_int("src_time", 0)
         srcstack = inv:get_stack("src", 1)
         srcstack:take_item()
         inv:set_stack("src", 1, srcstack)
         inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier"))
      end
   end
   meta:set_int("LV_EU_demand", demand)
end
-- The actual block inactive state
minetest.register_node("technic:cnc", {
   description = "CNC Milling Machine",
   description = S("%s CNC Machine"):format("LV"),
   tiles       = {"technic_cnc_top.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
                  "technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front.png"},
   drawtype    = "nodebox",
   paramtype   = "light",
   groups = {cracky=2, technic_machine=1, technic_lv=1},
   connect_sides = {"bottom", "back", "left", "right"},
   paramtype2  = "facedir",
   node_box    = {
      type  = "fixed",
      fixed = {
         {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
      },
   },
   groups = {cracky=2},
   legacy_facedir_simple = true,
   on_construct = function(pos)
      local meta = minetest.get_meta(pos)
      meta:set_string("infotext", "CNC Machine")
      meta:set_string("infotext", S("%s CNC Machine"):format("LV"))
      meta:set_float("technic_power_machine", 1)
      meta:set_string("formspec", cnc_formspec)
      local inv = meta:get_inventory()
      inv:set_size("src", 1)
      inv:set_size("dst", 4)
   end,
   can_dig = function(pos,player)
      local meta = minetest.get_meta(pos);
      local inv = meta:get_inventory()
      if not inv:is_empty("src") or not inv:is_empty("dst") then
         minetest.chat_send_player(player:get_player_name(),
            "Machine cannot be removed because it is not empty");
         return false
      else
         return true
      end
   end,
   can_dig = technic.machine_can_dig,
   allow_metadata_inventory_put = technic.machine_inventory_put,
   allow_metadata_inventory_take = technic.machine_inventory_take,
   allow_metadata_inventory_move = technic.machine_inventory_move,
   on_receive_fields = form_handler,
   technic_run = run,
})
-- Active state block
minetest.register_node("technic:cnc_active", {
   description = "CNC Machine",
   description = S("%s CNC Machine"):format("LV"),
   tiles       = {"technic_cnc_top_active.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
                  "technic_cnc_side.png",       "technic_cnc_side.png",   "technic_cnc_front_active.png"},
   groups = {cracky=2, technic_machine=1, technic_lv=1, not_in_creative_inventory=1},
   connect_sides = {"bottom", "back", "left", "right"},
   paramtype2 = "facedir",
   groups = {cracky=2, not_in_creative_inventory=1},
   drop = "technic:cnc",
   legacy_facedir_simple = true,
   can_dig = function(pos,player)
      local meta = minetest.get_meta(pos);
      local inv = meta:get_inventory()
      if not inv:is_empty("src") or not inv:is_empty("dst") then
         minetest.chat_send_player(player:get_player_name(),
            "CNC machine cannot be removed because it is not empty");
         return false
      end
      return true
   end,
   can_dig = technic.machine_can_dig,
   allow_metadata_inventory_put = technic.machine_inventory_put,
   allow_metadata_inventory_take = technic.machine_inventory_take,
   allow_metadata_inventory_move = technic.machine_inventory_move,
   on_receive_fields = form_handler,
   technic_run = run,
   technic_disabled_machine_name = "technic:cnc",
})
-- Action code performing the transformation
minetest.register_abm({
   nodenames = {"technic:cnc","technic:cnc_active"},
   interval = 1,
   chance   = 1,
   action = function(pos, node, active_object_count, active_object_count_wider)
      local meta         = minetest.get_meta(pos)
      local inv          = meta:get_inventory()
      local eu_input     = meta:get_int("LV_EU_input")
      local machine_name = "CNC"
      local machine_node = "technic:cnc"
      local demand       = 450
      -- Setup meta data if it does not exist. state is used as an indicator of this
      if not eu_input then
         meta:set_int("LV_EU_demand", demand)
         meta:set_int("LV_EU_input", 0)
         return
      end
      -- Power off automatically if no longer connected to a switching station
      technic.switching_station_timeout_count(pos, "LV")
      local result = meta:get_string("cnc_product")
      if inv:is_empty("src") or
         (not minetest.registered_nodes[result]) or
         (not inv:room_for_item("dst", result)) then
         hacky_swap_node(pos, machine_node)
         meta:set_string("infotext", machine_name.." Idle")
         meta:set_string("cnc_product", "")
         return
      end
      if eu_input < demand then
         hacky_swap_node(pos, machine_node)
         meta:set_string("infotext", machine_name.." Unpowered")
      elseif eu_input >= demand then
         hacky_swap_node(pos, machine_node.."_active")
         meta:set_string("infotext", machine_name.." Active")
         meta:set_int("src_time", meta:get_int("src_time") + 1)
         if meta:get_int("src_time") >= 3 then -- 3 ticks per output
            meta:set_int("src_time", 0)
            srcstack = inv:get_stack("src", 1)
            srcstack:take_item()
            inv:set_stack("src", 1, srcstack)
            inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier"))
         end
      end
      meta:set_int("LV_EU_demand", demand)
   end
})
technic.register_machine("LV", "technic:cnc",        technic.receiver)
technic.register_machine("LV", "technic:cnc_active", technic.receiver)
-------------------------
-- CNC Machine Recipe
-------------------------
minetest.register_craft({
   output = 'technic:cnc',
   recipe = {
      {'default:glass',              'technic:diamond_drill_head', 'default:glass'},
      {'technic:control_logic_unit', 'technic:motor',              'default:steel_ingot'},
      {'default:steel_ingot',        'default:copper_ingot',       'default:steel_ingot'},
   },
})