From 2d68498dc10bc74a35a5cc0ff4e81b6640807511 Mon Sep 17 00:00:00 2001
From: kpoppel <poulsen.kim@gmail.com>
Date: Wed, 08 May 2013 01:42:22 +0200
Subject: [PATCH] Massive change to the way CNC programs are registered. Now the API is open for adding new nodes and inhibiting some nodes for some materials. No more recipes outside of the CNC machine.

---
 technic/battery_box.lua |  240 +++++++++++++++++++++++++++++++----------------------------
 1 files changed, 125 insertions(+), 115 deletions(-)

diff --git a/technic/battery_box.lua b/technic/battery_box.lua
index f5827a4..9c91821 100644
--- a/technic/battery_box.lua
+++ b/technic/battery_box.lua
@@ -1,26 +1,28 @@
-power_tools ={}
+LV_machines = {}
+registered_LV_machines_count=0
 
-registered_power_tools_count=1
+function register_LV_machine (string1,string2)
+registered_LV_machines_count=registered_LV_machines_count+1
+LV_machines[registered_LV_machines_count]={}
+LV_machines[registered_LV_machines_count].machine_name=string1
+LV_machines[registered_LV_machines_count].machine_type=string2
+end
+
+power_tools ={}
+registered_power_tools_count=0
 
 function register_power_tool (string1,max_charge)
+registered_power_tools_count=registered_power_tools_count+1
 power_tools[registered_power_tools_count]={}
 power_tools[registered_power_tools_count].tool_name=string1
 power_tools[registered_power_tools_count].max_charge=max_charge
-registered_power_tools_count=registered_power_tools_count+1
 end
 
-register_power_tool ("technic:mining_drill",60000)
-register_power_tool ("technic:chainsaw",30000)
-register_power_tool ("technic:laser_mk1",40000)
+
 register_power_tool ("technic:battery",10000)
-register_power_tool ("technic:sonic_screwdriver",15000)
-register_power_tool ("technic:flashlight",30000)
 register_power_tool ("technic:red_energy_crystal",100000)
 register_power_tool ("technic:green_energy_crystal",250000)
 register_power_tool ("technic:blue_energy_crystal",500000)
-
-minetest.register_alias("battery", "technic:battery")
-minetest.register_alias("battery_box", "technic:battery_box")
 
 minetest.register_craft({
 	output = 'technic:battery 1',
@@ -134,7 +136,6 @@
 })
 end
 
-
 LV_nodes_visited = {}
 
 function get_RE_item_load (load1,max_load)
@@ -154,13 +155,12 @@
 function set_RE_wear (item_stack,load1,max_load)
 local temp=65536-math.floor(load1/max_load*65535)
 item_stack["wear"]=tostring(temp)
-return item_stack	
+return item_stack
 end
 
 minetest.register_abm({
 	nodenames = {"technic:battery_box","technic:battery_box1","technic:battery_box2","technic:battery_box3","technic:battery_box4",
-		     "technic:battery_box5","technic:battery_box6","technic:battery_box7","technic:battery_box8"
-			},
+		"technic:battery_box5","technic:battery_box6","technic:battery_box7","technic:battery_box8"},
 	interval = 1,
 	chance = 1,
 	action = function(pos, node, active_object_count, active_object_count_wider)
@@ -176,51 +176,73 @@
 	meta:set_float("last_side_shown",i)
 	end
 
---loading registered power tools	
+--loading registered power tools
 	local inv = meta:get_inventory()
 	if inv:is_empty("src")==false  then 
-		srcstack = inv:get_stack("src", 1)
-		src_item=srcstack:to_table()
-		item_meta=srcstack:get_metadata()
-		if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before tool/item
+		local srcstack = inv:get_stack("src", 1)
+		local src_item=srcstack:to_table()
+		local src_meta=get_item_meta(src_item["metadata"])
 
-	local item_max_charge = nil
-	local counter=registered_power_tools_count-1
-	for i=1, counter,1 do
-		if power_tools[i].tool_name==src_item["name"] then
-		item_max_charge=power_tools[i].max_charge	
+		local item_max_charge=nil
+		for i=1,registered_power_tools_count,1 do
+			if power_tools[i].tool_name==src_item["name"] then
+				src_meta=get_item_meta(src_item["metadata"])
+				if src_meta==nil then 
+					src_meta={}
+					src_meta["technic_power_tool"]=true
+					src_meta["charge"]=0
+				else 
+					if src_meta["technic_power_tool"]==nil then
+						src_meta["technic_power_tool"]=true
+						src_meta["charge"]=0
+					end
+				end
+				item_max_charge=power_tools[i].max_charge
+			end
 		end
-		end
-	if item_max_charge then
-		load1=tonumber((src_item["metadata"])) 
-		load_step=1000
-		if load1<item_max_charge and charge>0 then 
-		 if charge-load_step<0 then load_step=charge end
-		 if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end
-		load1=load1+load_step
-		charge=charge-load_step
-		set_RE_wear(src_item,load1,item_max_charge)
-		src_item["metadata"]=tostring(load1)
-		inv:set_stack("src", 1, src_item)
-		end
-		meta:set_int("battery_charge",charge)
-	end	
+		
+		if item_max_charge then
+			load1=src_meta["charge"] 
+			load_step=1000
+			if load1<item_max_charge and charge>0 then 
+				if charge-load_step<0 then load_step=charge end
+				if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end
+				load1=load1+load_step
+				charge=charge-load_step
+				set_RE_wear(src_item,load1,item_max_charge)
+				src_meta["charge"]=load1
+				src_item["metadata"]=set_item_meta(src_meta)
+				inv:set_stack("src", 1, src_item)
+			end
+			meta:set_int("battery_charge",charge)
+		end	
 	end
 	
--- dischargin registered power tools
+-- discharging registered power tools
 		if inv:is_empty("dst") == false then 
 		srcstack = inv:get_stack("dst", 1)
 		src_item=srcstack:to_table()
-		local item_max_charge = nil
-		local counter=registered_power_tools_count-1
-		for i=1, counter,1 do
-		if power_tools[i].tool_name==src_item["name"] then
-		item_max_charge=power_tools[i].max_charge	
+		local src_meta=get_item_meta(src_item["metadata"])
+		local item_max_charge=nil
+		for i=1,registered_power_tools_count,1 do
+			if power_tools[i].tool_name==src_item["name"] then
+				src_meta=get_item_meta(src_item["metadata"])
+				if src_meta==nil then 
+					src_meta={}
+					src_meta["technic_power_tool"]=true
+					src_meta["charge"]=0
+				else 
+					if src_meta["technic_power_tool"]==nil then
+						src_meta["technic_power_tool"]=true
+						src_meta["charge"]=0
+					end
+				end
+				item_max_charge=power_tools[i].max_charge
+			end
 		end
-		end
+
 		if item_max_charge then
-		if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before battery/crystal
-		local load1=tonumber((src_item["metadata"])) 
+		local load1=src_meta["charge"] 
 		load_step=1000
 		if load1>0 and charge<max_charge then 
 			 if charge+load_step>max_charge then load_step=max_charge-charge end
@@ -228,7 +250,8 @@
 		load1=load1-load_step
 		charge=charge+load_step
 		set_RE_wear(src_item,load1,item_max_charge)
-		src_item["metadata"]=tostring(load1)	
+		src_meta["charge"]=load1
+		src_item["metadata"]=set_item_meta(src_meta)
 		inv:set_stack("dst", 1, src_item)
 		end		
 		end
@@ -238,18 +261,10 @@
 
 	local load = math.floor(charge/60000 * 100)
 	meta:set_string("formspec",
-				"invsize[8,9;]"..
+				battery_box_formspec..
 				"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
-						(load)..":technic_power_meter_fg.png]"..
-				"list[current_name;src;3,1;1,1;]"..
-				"image[4,1;1,1;technic_battery_reload.png]"..
-				"list[current_name;dst;5,1;1,1;]"..
-				"label[0,0;Battery box]"..
-				"label[3,0;Charge]"..
-				"label[5,0;Discharge]"..
-				"label[1,3;Power level]"..
-				"list[current_player;main;0,5;8,4;]")
-		
+						(load)..":technic_power_meter_fg.png]")
+
 	local pos1={}
 
 	pos1.y=pos.y-1
@@ -260,15 +275,15 @@
 	meta1 = minetest.env:get_meta(pos1)
 	if meta1:get_float("cablelike")~=1 then return end
 
-		local LV_nodes = {}
-		local PR_nodes = {}
-		local RE_nodes = {}
+	local LV_nodes = {}
+	local PR_nodes = {}
+	local RE_nodes = {}
 
-	 	LV_nodes[1]={}
-	 	LV_nodes[1].x=pos1.x
-		LV_nodes[1].y=pos1.y
-		LV_nodes[1].z=pos1.z
-		LV_nodes[1].visited=false
+	LV_nodes[1]={}
+	LV_nodes[1].x=pos1.x
+	LV_nodes[1].y=pos1.y
+	LV_nodes[1].z=pos1.z
+	LV_nodes[1].visited=false
 
 
 table_index=1
@@ -282,7 +297,7 @@
 local pos1={}
 i=1
 	repeat
-	if PR_nodes[i]==nil then break end -- gettin power from all connected producers
+	if PR_nodes[i]==nil then break end -- getting power from all connected producers
 		pos1.x=PR_nodes[i].x
 		pos1.y=PR_nodes[i].y
 		pos1.z=PR_nodes[i].z
@@ -335,64 +350,59 @@
 })
 
 function add_new_cable_node (LV_nodes,pos1)
-local i=1
+	local i=1
 	repeat
 		if LV_nodes[i]==nil then break end
 		if pos1.x==LV_nodes[i].x and pos1.y==LV_nodes[i].y and pos1.z==LV_nodes[i].z then return false end
 		i=i+1
 	until false
-LV_nodes[i]={}
-LV_nodes[i].x=pos1.x
-LV_nodes[i].y=pos1.y
-LV_nodes[i].z=pos1.z
-LV_nodes[i].visited=false
-return true
+	LV_nodes[i]={}
+	LV_nodes[i].x=pos1.x
+	LV_nodes[i].y=pos1.y
+	LV_nodes[i].z=pos1.z
+	LV_nodes[i].visited=false
+	return true
 end
 
 function check_LV_node (PR_nodes,RE_nodes,LV_nodes,i)
-		local pos1={}
-		pos1.x=LV_nodes[i].x
-		pos1.y=LV_nodes[i].y
-		pos1.z=LV_nodes[i].z
-		LV_nodes[i].visited=true
-		new_node_added=false
-	
-		pos1.x=pos1.x+1
-		check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
-		pos1.x=pos1.x-2
-		check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
-		pos1.x=pos1.x+1
-		
-		pos1.y=pos1.y+1
-		check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
-		pos1.y=pos1.y-2
-		check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
-		pos1.y=pos1.y+1
+	local pos1={}
+	pos1.x=LV_nodes[i].x
+	pos1.y=LV_nodes[i].y
+	pos1.z=LV_nodes[i].z
+	LV_nodes[i].visited=true
+	new_node_added=false
 
-		pos1.z=pos1.z+1
-		check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
-		pos1.z=pos1.z-2
-		check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
-		pos1.z=pos1.z+1
+	pos1.x=pos1.x+1
+	check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
+	pos1.x=pos1.x-2
+	check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
+	pos1.x=pos1.x+1
+
+	pos1.y=pos1.y+1
+	check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
+	pos1.y=pos1.y-2
+	check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
+	pos1.y=pos1.y+1
+
+	pos1.z=pos1.z+1
+	check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
+	pos1.z=pos1.z-2
+	check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
+	pos1.z=pos1.z+1
 return new_node_added
 end
 
 function check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
 meta = minetest.env:get_meta(pos1)
 if meta:get_float("cablelike")==1 then new_node_added=add_new_cable_node(LV_nodes,pos1) end
-if minetest.env:get_node(pos1).name == "technic:solar_panel" then 	new_node_added=add_new_cable_node(PR_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:generator" then 	new_node_added=add_new_cable_node(PR_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:generator_active" then 	new_node_added=add_new_cable_node(PR_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:geothermal" then 	new_node_added=add_new_cable_node(PR_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:geothermal_active" then 	new_node_added=add_new_cable_node(PR_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:water_mill" then 	new_node_added=add_new_cable_node(PR_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:water_mill_active" then 	new_node_added=add_new_cable_node(PR_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:electric_furnace" then 	new_node_added=add_new_cable_node(RE_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:electric_furnace_active" then 	new_node_added=add_new_cable_node(RE_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:alloy_furnace" then 	new_node_added=add_new_cable_node(RE_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:alloy_furnace_active" then 	new_node_added=add_new_cable_node(RE_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:tool_workshop" then 	new_node_added=add_new_cable_node(RE_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:music_player" then 	new_node_added=add_new_cable_node(RE_nodes,pos1) end		
-if minetest.env:get_node(pos1).name == "technic:grinder" then 	new_node_added=add_new_cable_node(RE_nodes,pos1) end		
+for i in ipairs(LV_machines) do
+	if minetest.env:get_node(pos1).name == LV_machines[i].machine_name then 
+		if LV_machines[i].machine_type == "PR" then
+			new_node_added=add_new_cable_node(PR_nodes,pos1) 
+			end
+		if LV_machines[i].machine_type == "RE" then
+			new_node_added=add_new_cable_node(RE_nodes,pos1) 
+			end
+	end
 end
-		
\ No newline at end of file
+end

--
Gitblit v1.8.0