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/flashlight.lua |  174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 174 insertions(+), 0 deletions(-)

diff --git a/technic/flashlight.lua b/technic/flashlight.lua
new file mode 100644
index 0000000..f6e4dc2
--- /dev/null
+++ b/technic/flashlight.lua
@@ -0,0 +1,174 @@
+-- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621
+
+flashlight_max_charge=30000
+register_power_tool ("technic:flashlight",flashlight_max_charge)
+      
+minetest.register_tool("technic:flashlight", {
+	description = "Flashlight",
+	inventory_image = "technic_flashlight.png",
+	stack_max = 1,
+	on_use = function(itemstack, user, pointed_thing)
+	end,
+	})
+ 
+minetest.register_craft({
+output = "technic:flashlight",
+recipe = {
+	{"technic:rubber","glass","technic:rubber"},
+	{"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"},
+	{"","technic:battery",""}
+	}
+})
+
+local players = {}
+local player_positions = {}
+local last_wielded = {}
+
+function round(num) 
+	return math.floor(num + 0.5) 
+end
+
+minetest.register_on_joinplayer(function(player)
+	local player_name = player:get_player_name()
+	table.insert(players, player_name)
+	local pos = player:getpos()
+	local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
+	player_positions[player_name] = {}
+	player_positions[player_name]["x"] = rounded_pos.x;
+	player_positions[player_name]["y"] = rounded_pos.y;
+	player_positions[player_name]["z"] = rounded_pos.z;
+end)
+
+minetest.register_on_leaveplayer(function(player)
+	local player_name = player:get_player_name()
+	for i,v in ipairs(players) do
+		if v == player_name then 
+			table.remove(players, i)
+			last_wielded[player_name] = nil
+			-- Neuberechnung des Lichts erzwingen
+			local pos = player:getpos()
+			local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
+			minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
+			minetest.env:add_node(rounded_pos,{type="node",name="air"})
+			player_positions[player_name]["x"] = nil
+			player_positions[player_name]["y"] = nil
+			player_positions[player_name]["z"] = nil
+			player_positions[player_name]["m"] = nil
+			player_positions[player_name] = nil
+		end
+	end
+end)
+
+minetest.register_globalstep(function(dtime)
+	for i,player_name in ipairs(players) do
+		local player = minetest.env:get_player_by_name(player_name)
+		if player then
+		flashlight_weared=check_for_flashlight(player)
+		local pos = player:getpos()
+		local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
+		local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
+		
+		if last_wielded[player_name] and not flashlight_weared then --remove light, flashlight weared out or was removed from hotbar
+			local node=minetest.env:get_node_or_nil(old_pos)
+			if node then
+			if node.name=="technic:light" then 
+			  	minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
+				minetest.env:add_node(old_pos,{type="node",name="air"})		
+			  last_wielded[player_name]=false
+			  end
+			end
+			end
+
+		player_moved=not(old_pos.x==rounded_pos.x and old_pos.y==rounded_pos.y and old_pos.z==rounded_pos.z)
+		if player_moved and last_wielded[player_name] and flashlight_weared  then
+			
+			local node=minetest.env:get_node_or_nil(rounded_pos)
+			if node then
+			if node.name=="air" then 
+			  	minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
+			  end
+			end
+			local node=minetest.env:get_node_or_nil(old_pos)
+			if node then
+			  if node.name=="technic:light" then 
+			  	minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
+				minetest.env:add_node(old_pos,{type="node",name="air"})		
+			  end
+			end
+			player_positions[player_name]["x"] = rounded_pos.x
+			player_positions[player_name]["y"] = rounded_pos.y
+			player_positions[player_name]["z"] = rounded_pos.z
+			
+		else if not last_wielded[player_name] and flashlight_weared then
+			local node=minetest.env:get_node_or_nil(rounded_pos)
+			if node then
+			if node.name=="air" then 
+			  	minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
+			  end
+			end
+			player_positions[player_name]["x"] = rounded_pos.x
+			player_positions[player_name]["y"] = rounded_pos.y
+			player_positions[player_name]["z"] = rounded_pos.z
+			last_wielded[player_name]=true
+			end			
+			
+	end
+	end
+	end
+end)
+
+minetest.register_node("technic:light", {
+	drawtype = "glasslike",
+	tile_images = {"technic_light.png"},
+	paramtype = "light",
+	walkable = false,
+	buildable_to = true,
+	is_ground_content = true,
+	light_propagates = true,
+	sunlight_propagates = true,
+	light_source = 15,
+	selection_box = {
+        type = "fixed",
+        fixed = {0, 0, 0, 0, 0, 0},
+    },
+})
+minetest.register_node("technic:light_off", {
+	drawtype = "glasslike",
+	tile_images = {"technic_light.png"},
+	paramtype = "light",
+	walkable = false,
+	buildable_to = true,
+	is_ground_content = true,
+	light_propagates = true,
+	sunlight_propagates = true,
+	selection_box = {
+        type = "fixed",
+        fixed = {0, 0, 0, 0, 0, 0},
+    },
+})
+
+function check_for_flashlight (player)
+if player==nil then return false end
+local inv = player:get_inventory()
+local hotbar=inv:get_list("main")
+		for i=1,8,1 do
+			
+			if hotbar[i]:get_name() == "technic:flashlight" then
+			local item=hotbar[i]:to_table()
+			local meta=get_item_meta(item["metadata"])
+			if meta==nil then return false end --flashlight not charghed
+			if meta["charge"]==nil then return false end
+			charge=meta["charge"]
+			if charge-2>0 then
+			 charge =charge-2;	
+			set_RE_wear(item,charge,flashlight_max_charge)
+			meta["charge"]=charge
+			item["metadata"]=set_item_meta(meta)
+			hotbar[i]:replace(item)
+			inv:set_stack("main",i,hotbar[i])
+			return true
+			end
+			end
+		end
+return false
+end	

--
Gitblit v1.8.0