From 9f373d65281836b1bbfb0069707a8eaa1aeb0c53 Mon Sep 17 00:00:00 2001
From: SmallJoker <mk939@ymail.com>
Date: Sat, 03 Aug 2024 08:25:13 +0200
Subject: [PATCH] technic_cnc: Add group 'cracky'

---
 technic_cnc/cnc.lua |  170 +++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 119 insertions(+), 51 deletions(-)

diff --git a/technic_cnc/cnc.lua b/technic_cnc/cnc.lua
index 642560f..c032fcf 100644
--- a/technic_cnc/cnc.lua
+++ b/technic_cnc/cnc.lua
@@ -7,21 +7,71 @@
 --   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 technic_modpath = minetest.get_modpath("technic")
+local S = technic_cnc.getter
 
-local S = technic.getter 
+local allow_metadata_inventory_put
+local allow_metadata_inventory_take
+local allow_metadata_inventory_move
+local can_dig
+local desc_tr = S("CNC Machine")
 
-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'},
-	},
-})
+if technic_cnc.use_technic then
+	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'},
+		},
+	})
 
+	allow_metadata_inventory_put = technic.machine_inventory_put
+	allow_metadata_inventory_take = technic.machine_inventory_take
+	allow_metadata_inventory_move = technic.machine_inventory_move
+	can_dig = technic.machine_can_dig
+	desc_tr = S("@1 CNC Machine", S("LV"))
+else
+	minetest.register_craft({
+		output = 'technic:cnc',
+		recipe = {
+			{'default:glass',       'default:diamond',    'default:glass'},
+			{'basic_materials:ic',  'default:steelblock', 'basic_materials:motor'},
+			{'default:steel_ingot', 'default:mese',       'default:steel_ingot'},
+		},
+	})
 
-local shape = {}
+	allow_metadata_inventory_put = function(pos, listname, index, stack, player)
+		if 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 minetest.is_protected(pos, player:get_player_name()) 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)
+		if minetest.is_protected(pos, player:get_player_name()) then
+			return 0
+		end
+		return count
+	end
+
+	can_dig = function(pos, player)
+		if player and minetest.is_protected(pos, player:get_player_name()) then return false end
+		local meta = minetest.get_meta(pos);
+		local inv = meta:get_inventory()
+		return inv:is_empty("dst")
+			and inv:is_empty("src")
+			and default.can_interact_with_node(player, pos)
+	end
+end
+
 local onesize_products = {
 	slope                    = 2,
 	slope_edge               = 1,
@@ -41,7 +91,7 @@
 	twocurvededge            = 1,
 }
 local twosize_products = {
-	element_straight         = 4,
+	element_straight         = 2,
 	element_end              = 2,
 	element_cross            = 1,
 	element_t                = 1,
@@ -80,9 +130,9 @@
 	"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;"..S("In:").."]"..
+	"label[0, 5;"..S("In:").."]"..
 	"list[current_name;src;0.5,5.5;1,1;]"..
-	"label[4, 5.5;"..S("Out:").."]"..
+	"label[4, 5;"..S("Out:").."]"..
 	"list[current_name;dst;5,5.5;4,1;]"..
 
 	"list[current_player;main;0,7;8,4;]"..
@@ -91,32 +141,34 @@
 	"listring[current_name;src]"..
 	"listring[current_player;main]"
 
-local size = 1;
-
 -- The form handler is declared here because we need it in both the inactive and active modes
 -- in order to be able to change programs wile it is running.
 local function form_handler(pos, formname, fields, sender)
+	local meta       = minetest.get_meta(pos)
+
 	-- REGISTER MILLING PROGRAMS AND OUTPUTS:
 	------------------------------------------
 	-- Program for half/full size
 	if fields["full"] then
-		size = 1
+		meta:set_int("size", 1)
 		return
 	end
 
 	if fields["half"] then
-		size = 2
+		meta:set_int("size", 2)
 		return
 	end
 
 	-- Resolve the node name and the number of items to make
-	local meta       = minetest.get_meta(pos)
 	local inv        = meta:get_inventory()
 	local inputstack = inv:get_stack("src", 1)
 	local inputname  = inputstack:get_name()
-	local multiplier = 0
+	local size       = meta:get_int("size")
+	if size < 1 then size = 1 end
+
 	for k, _ in pairs(fields) do
 		-- Set a multipier for the half/full size capable blocks
+		local multiplier
 		if twosize_products[k] ~= nil then
 			multiplier = size * twosize_products[k]
 		else
@@ -140,7 +192,19 @@
 			break
 		end
 	end
-	return
+
+	if not technic_cnc.use_technic then
+		local result = meta:get_string("cnc_product")
+
+		if not inv:is_empty("src")
+		  and minetest.registered_nodes[result]
+		  and inv:room_for_item("dst", result) then
+			local 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
 end
 
 -- Action code performing the transformation
@@ -148,7 +212,7 @@
 	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_name = desc_tr
 	local machine_node = "technic:cnc"
 	local demand       = 450
 
@@ -157,7 +221,7 @@
 	   (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("infotext", S("@1 Idle", machine_name))
 		meta:set_string("cnc_product", "")
 		meta:set_int("LV_EU_demand", 0)
 		return
@@ -165,10 +229,10 @@
 
 	if eu_input < demand then
 		technic.swap_node(pos, machine_node)
-		meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
+		meta:set_string("infotext", S("@1 Unpowered", 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_string("infotext", S("@1 Active", 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)
@@ -183,7 +247,7 @@
 
 -- The actual block inactive state
 minetest.register_node(":technic:cnc", {
-	description = S("%s CNC Machine"):format("LV"),
+	description = desc_tr,
 	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"},
 	groups = {cracky=2, technic_machine=1, technic_lv=1},
@@ -192,40 +256,44 @@
 	legacy_facedir_simple = true,
 	on_construct = function(pos)
 		local meta = minetest.get_meta(pos)
-		meta:set_string("infotext", S("%s CNC Machine"):format("LV"))
+		meta:set_string("infotext", desc_tr)
 		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 = 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,
+	can_dig = can_dig,
+	allow_metadata_inventory_put = allow_metadata_inventory_put,
+	allow_metadata_inventory_take = allow_metadata_inventory_take,
+	allow_metadata_inventory_move = allow_metadata_inventory_move,
 	on_receive_fields = form_handler,
-	technic_run = run,
+	technic_run = technic_cnc.use_technic and run,
 })
 
 -- Active state block
-minetest.register_node(":technic:cnc_active", {
-	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",
-	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",
-})
+if technic_cnc.use_technic then
 
-technic.register_machine("LV", "technic:cnc",        technic.receiver)
-technic.register_machine("LV", "technic:cnc_active", technic.receiver)
+	minetest.register_node(":technic:cnc_active", {
+		description = desc_tr,
+		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",
+		drop = "technic:cnc",
+		legacy_facedir_simple = true,
+		can_dig = can_dig,
+		allow_metadata_inventory_put = allow_metadata_inventory_put,
+		allow_metadata_inventory_take = allow_metadata_inventory_take,
+		allow_metadata_inventory_move = allow_metadata_inventory_move,
+		on_receive_fields = form_handler,
+		technic_run = run,
+		technic_disabled_machine_name = "technic:cnc",
+	})
 
+	technic.register_machine("LV", "technic:cnc",        technic.receiver)
+	technic.register_machine("LV", "technic:cnc_active", technic.receiver)
+else
+	minetest.register_alias("technic:cnc_active", "technic:cnc")
+end

--
Gitblit v1.8.0