From 2e7859c35e55b842752c6533edae2dd19290fabc Mon Sep 17 00:00:00 2001
From: Tanmaya Meher <tanmayameher@users.noreply.github.com>
Date: Sat, 25 Aug 2018 12:24:14 +0200
Subject: [PATCH] New MV Hydro Machine (#412)

---
 technic/machines/LV/cnc.lua |  158 ++++++++++++++++++++++++----------------------------
 1 files changed, 73 insertions(+), 85 deletions(-)

diff --git a/technic/machines/LV/cnc.lua b/technic/machines/LV/cnc.lua
index 10e9391..fdfec99 100644
--- a/technic/machines/LV/cnc.lua
+++ b/technic/machines/LV/cnc.lua
@@ -9,6 +9,17 @@
 
 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',     'technic:motor'},
+		{'technic:carbon_steel_ingot', 'technic:lv_cable',           'technic:carbon_steel_ingot'},
+	},
+})
+
+
 local shape = {}
 local onesize_products = {
 	slope                    = 2,
@@ -17,6 +28,7 @@
 	pyramid                  = 2,
 	spike                    = 1,
 	cylinder                 = 2,
+	oblate_spheroid          = 1,
 	sphere                   = 1,
 	stick                    = 8,
 	slope_upsdown            = 2,
@@ -36,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; ]"..
@@ -66,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;
 
@@ -125,25 +142,56 @@
 	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 = S("CNC 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", S("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()
@@ -155,88 +203,28 @@
 	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 = S("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 = 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 = S("CNC Machine")
-		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
-			technic.swap_node(pos, machine_node)
-			meta:set_string("infotext", S("%s Idle"):format(machine_name))
-			meta:set_string("cnc_product", "")
-			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
-}) 
 
 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'},         
-	},
-})
 

--
Gitblit v1.8.0