From eac48441754260fe42c7a605e72141a79ed79bc1 Mon Sep 17 00:00:00 2001
From: ShadowNinja <noreply@gmail.com>
Date: Sat, 19 Oct 2013 04:28:32 +0200
Subject: [PATCH] Fix negative tool discharging and a few other tweaks...

---
 technic/tools/chainsaw.lua                |   41 +-
 technic/tools/mining_laser_mk1.lua        |  113 ++++----
 technic/tools/flashlight.lua              |   40 +-
 technic/tools/cans.lua                    |  145 +++++-----
 technic/machines/register/battery_box.lua |  129 ++++-----
 technic/register.lua                      |    6 
 technic/tools/mining_drill.lua            |  165 ++++++------
 technic/config.lua                        |    2 
 technic/tools/sonic_screwdriver.lua       |   95 +++---
 9 files changed, 362 insertions(+), 374 deletions(-)

diff --git a/technic/config.lua b/technic/config.lua
index 668e7db..db3dfaf 100644
--- a/technic/config.lua
+++ b/technic/config.lua
@@ -8,7 +8,7 @@
 local defaults = {
 	enable_mining_drill = "true",
 	enable_mining_laser = "true",
-	enable_flashlight = "true",
+	enable_flashlight = "false",
 	enable_rubber_tree_generation = "true",
 	enable_marble_generation = "true",
 	enable_granite_generation = "true",
diff --git a/technic/machines/register/battery_box.lua b/technic/machines/register/battery_box.lua
index 6264672..a1d9b00 100644
--- a/technic/machines/register/battery_box.lua
+++ b/technic/machines/register/battery_box.lua
@@ -137,80 +137,73 @@
 end -- End registration
 
 
-function technic.charge_tools(meta, charge, charge_step)
-	--charge registered power tools
+function technic.charge_tools(meta, batt_charge, charge_step)
 	local inv = meta:get_inventory()
-	if not inv:is_empty("src") then
-		local srcstack = inv:get_stack("src", 1)
-		local src_item = srcstack:to_table()
-		local src_meta = get_item_meta(src_item["metadata"])
-
-		local toolname = src_item["name"]
-		if technic.power_tools[toolname] ~= nil then
-			-- Set meta data for the tool if it didn't do it itself :-(
-			src_meta = get_item_meta(src_item["metadata"])
-			src_meta = src_meta or {}
-			if src_meta["charge"] == nil then
-				src_meta["charge"] = 0
-			end
-			-- Do the charging
-			local item_max_charge = technic.power_tools[toolname]
-			local tool_charge     = src_meta["charge"]
-			if tool_charge < item_max_charge and charge > 0 then
-				if charge - charge_step < 0 then
-					charge_step = charge
-				end
-				if tool_charge + charge_step > item_max_charge then
-					charge_step = item_max_charge - tool_charge
-				end
-				tool_charge = tool_charge + charge_step
-				charge = charge - charge_step
-				technic.set_RE_wear(src_item, tool_charge, item_max_charge)
-				src_meta["charge"]   = tool_charge
-				src_item["metadata"] = set_item_meta(src_meta)
-				inv:set_stack("src", 1, src_item)
-			end
-		end
+	if inv:is_empty("src") then
+		return batt_charge
 	end
-	return charge -- return the remaining charge in the battery
+	local srcstack = inv:get_stack("src", 1)
+	local src_meta = get_item_meta(srcstack:get_metadata())
+
+	local toolname = srcstack:get_name()
+	if not technic.power_tools[toolname] then
+		return batt_charge
+	end
+	-- Set meta data for the tool if it didn't do it itself
+	src_meta = get_item_meta(srcstack:get_metadata())
+	src_meta = src_meta or {}
+	if not src_meta.charge then
+		src_meta.charge = 0
+	end
+	-- Do the charging
+	local item_max_charge = technic.power_tools[toolname]
+	local tool_charge     = src_meta.charge
+	if tool_charge >= item_max_charge or batt_charge <= 0 then
+		return batt_charge
+	end
+	charge_step = math.min(charge_step, batt_charge)
+	charge_step = math.min(charge_step, item_max_charge - tool_charge)
+	tool_charge = tool_charge + charge_step
+	batt_charge = batt_charge - charge_step
+	technic.set_RE_wear(srcstack, tool_charge, item_max_charge)
+	src_meta.charge = tool_charge
+	srcstack:set_metadata(set_item_meta(src_meta))
+	inv:set_stack("src", 1, srcstack)
+	return batt_charge
 end
 
 
-function technic.discharge_tools(meta, charge, charge_step, max_charge)
-	-- discharging registered power tools
+function technic.discharge_tools(meta, batt_charge, charge_step, max_charge)
 	local inv = meta:get_inventory()
-	if not inv:is_empty("dst") then
-		srcstack = inv:get_stack("dst", 1)
-		src_item = srcstack:to_table()
-		local src_meta = get_item_meta(src_item["metadata"])
-		local toolname = src_item["name"]
-		if technic.power_tools[toolname] ~= nil then
-			-- Set meta data for the tool if it didn't do it itself :-(
-			src_meta = get_item_meta(src_item["metadata"])
-			src_meta = src_meta or {}
-			if src_meta["charge"] == nil then
-				src_meta["charge"] = 0
-			end
-
-			-- Do the discharging
-			local item_max_charge = technic.power_tools[toolname]
-			local tool_charge     = src_meta["charge"]
-			if tool_charge > 0 and charge < max_charge then
-				if charge + charge_step > max_charge then
-					charge_step = max_charge - charge
-				end
-				if tool_charge - charge_step < 0 then
-					charge_step = charge
-				end
-				tool_charge = tool_charge - charge_step
-				charge = charge + charge_step
-				technic.set_RE_wear(src_item, tool_charge, item_max_charge)
-				src_meta["charge"] = tool_charge
-				src_item["metadata"] = set_item_meta(src_meta)
-				inv:set_stack("dst", 1, src_item)
-			end
-		end
+	if inv:is_empty("dst") then
+		return batt_charge
 	end
-	return charge -- return the remaining charge in the battery
+	srcstack = inv:get_stack("dst", 1)
+	local toolname = srcstack:get_name()
+	if technic.power_tools[toolname] == nil then
+		return batt_charge
+	end
+	-- Set meta data for the tool if it didn't do it itself :-(
+	local src_meta = get_item_meta(srcstack:get_metadata())
+	src_meta = src_meta or {}
+	if not src_meta.charge then
+		src_meta.charge = 0
+	end
+
+	-- Do the discharging
+	local item_max_charge = technic.power_tools[toolname]
+	local tool_charge     = src_meta.charge
+	if tool_charge <= 0 or batt_charge >= max_charge then
+		return batt_charge
+	end
+	charge_step = math.min(charge_step, max_charge - batt_charge)
+	charge_step = math.min(charge_step, tool_charge)
+	tool_charge = tool_charge - charge_step
+	batt_charge = batt_charge + charge_step
+	technic.set_RE_wear(srcstack, tool_charge, item_max_charge)
+	src_meta.charge = tool_charge
+	srcstack:set_metadata(set_item_meta(src_meta))
+	inv:set_stack("dst", 1, srcstack)
+	return batt_charge
 end
 
diff --git a/technic/register.lua b/technic/register.lua
index 38766d9..288db57 100644
--- a/technic/register.lua
+++ b/technic/register.lua
@@ -43,8 +43,8 @@
 end
 
 -- Wear down a tool depending on the remaining charge.
-function technic.set_RE_wear(item_stack, item_load, max_load)
+function technic.set_RE_wear(itemstack, item_load, max_load)
 	local temp = 65536 - math.floor(item_load / max_load * 65535)
-	item_stack.wear = tostring(temp)
-	return item_stack
+	itemstack:set_wear(temp)
+	return itemstack
 end
diff --git a/technic/tools/cans.lua b/technic/tools/cans.lua
index 6a98ce9..e95b144 100644
--- a/technic/tools/cans.lua
+++ b/technic/tools/cans.lua
@@ -26,48 +26,46 @@
 	stack_max = 1,
 	liquids_pointable = true,
 	on_use = function(itemstack, user, pointed_thing)
-		
 		if pointed_thing.type ~= "node" then
-					return end
-		n = minetest.env:get_node(pointed_thing.under)
-		
-		item=itemstack:to_table()
-		local load=nil
-		if item["metadata"]=="" then load=0 
-		else load=tonumber(item["metadata"]) 
+			return
 		end
-		
-		if n.name == "default:water_source" then
-			if load+1<17 then
-			minetest.env:add_node(pointed_thing.under, {name="air"})
-			 load=load+1;	
-			item["metadata"]=tostring(load)
-			technic.set_RE_wear(item,load,water_can_max_load)
-			itemstack:replace(item)
-			end
-			return itemstack
-		end
-		item=itemstack:to_table()
-		if load==0 then return end
-			
-		if n.name == "default:water_flowing" then
-			minetest.env:add_node(pointed_thing.under, {name="default:water_source"})
-			load=load-1;	
-			item["metadata"]=tostring(load)
-			technic.set_RE_wear(item,load,water_can_max_load)
-			itemstack:replace(item)
-			return itemstack
-			end
+		node = minetest.get_node(pointed_thing.under)
 
-		n = minetest.env:get_node(pointed_thing.above)
-		if n.name == "air" then
-			minetest.env:add_node(pointed_thing.above, {name="default:water_source"})
-			load=load-1;	
-			item["metadata"]=tostring(load)
-			technic.set_RE_wear(item,load,water_can_max_load)
-			itemstack:replace(item)
+		local charge = nil
+		if itemstack:get_metadata() == "" then
+			charge = 0
+		else
+			charge = tonumber(itemstack:get_metadata())
+		end
+		if node.name == "default:water_source" then
+			if charge + 1 < 17 then
+				minetest.remove_node(pointed_thing.under)
+				charge = charge + 1
+				itemstack:set_metadata(tostring(charge))
+				technic.set_RE_wear(itemstack, charge, water_can_max_load)
+			end
 			return itemstack
-			end		
+		end
+		if charge == 0 then
+			return
+		end
+
+		if node.name == "default:water_flowing" then
+			minetest.set_node(pointed_thing.under, {name="default:water_source"})
+			charge = charge - 1
+			itemstack:set_metadata(tostring(charge))
+			technic.set_RE_wear(itemstack, charge, water_can_max_load)
+			return itemstack
+		end
+
+		node = minetest.get_node(pointed_thing.above)
+		if node.name == "air" then
+			minetest.set_node(pointed_thing.above, {name="default:water_source"})
+			charge = charge - 1;
+			itemstack:set_metadata(tostring(charge))
+			technic.set_RE_wear(itemstack, charge, water_can_max_load)
+			return itemstack
+		end		
 	end,
 })
 
@@ -77,44 +75,45 @@
 	stack_max = 1,
 	liquids_pointable = true,
 	on_use = function(itemstack, user, pointed_thing)
-		if pointed_thing.type ~= "node" then return end
-		n = minetest.env:get_node(pointed_thing.under)
-		item=itemstack:to_table()
-		local load=nil
-		if item["metadata"]=="" then load=0 
-		else load=tonumber(item["metadata"]) 
+		if pointed_thing.type ~= "node" then
+			return
 		end
-		
-		if n.name == "default:lava_source" then
-			if load+1<17 then
-			minetest.env:add_node(pointed_thing.under, {name="air"})
-			 load=load+1;
-			item["metadata"]=tostring(load)
-			technic.set_RE_wear(item,load,lava_can_max_load)
-			itemstack:replace(item)
-			end
-			return itemstack
+		node = minetest.get_node(pointed_thing.under)
+		local charge = 0
+		if itemstack:get_metadata() == "" then
+			charge = 0
+		else
+			charge = tonumber(itemstack:get_metadata())
 		end
-		item=itemstack:to_table()
-		if load==0 then return end
-			
-		if n.name == "default:lava_flowing" then
-			minetest.env:add_node(pointed_thing.under, {name="default:lava_source"})
-			load=load-1;	
-			item["metadata"]=tostring(load)
-			technic.set_RE_wear(item,load,lava_can_max_load)
-			itemstack:replace(item)
-			return itemstack
-			end
 
-		n = minetest.env:get_node(pointed_thing.above)
-		if n.name == "air" then
-			minetest.env:add_node(pointed_thing.above, {name="default:lava_source"})
-			load=load-1;	
-			item["metadata"]=tostring(load)
-			technic.set_RE_wear(item,load,lava_can_max_load)
-			itemstack:replace(item)
+		if node.name == "default:lava_source" then
+			if charge + 1 < 17 then
+				minetest.remove_node(pointed_thing.under)
+				charge = charge + 1
+				itemstack:set_metadata(tostring(charge))
+				technic.set_RE_wear(itemstack, charge, lava_can_max_load)
+			end
 			return itemstack
-			end	
+		end
+		if charge == 0 then
+			return
+		end
+
+		if node.name == "default:lava_flowing" then
+			minetest.set_node(pointed_thing.under, {name="default:lava_source"})
+			charge = charge - 1	
+			itemstack:set_metadata(tostring(charge))
+			technic.set_RE_wear(itemstack, charge, lava_can_max_load)
+			return itemstack
+		end
+
+		node = minetest.get_node(pointed_thing.above)
+		if node.name == "air" then
+			minetest.set_node(pointed_thing.above, {name="default:lava_source"})
+			charge = charge - 1
+			itemstack:set_metadata(tostring(charge))
+			technic.set_RE_wear(itemstack, charge, lava_can_max_load)
+			return itemstack
+		end
 	end,
 })
diff --git a/technic/tools/chainsaw.lua b/technic/tools/chainsaw.lua
index 785cf3e..833f830 100644
--- a/technic/tools/chainsaw.lua
+++ b/technic/tools/chainsaw.lua
@@ -6,27 +6,28 @@
 technic.register_power_tool("technic:chainsaw", chainsaw_max_charge)
 
 minetest.register_tool("technic:chainsaw", {
-        description = "Chainsaw",
-        inventory_image = "technic_chainsaw.png",
-        stack_max = 1,
-        on_use = function(itemstack, user, pointed_thing)
-                if pointed_thing.type=="node" then
-                        item=itemstack:to_table()
-                        local meta=get_item_meta(item["metadata"])
-                        if meta==nil then return end --tool not charged
-                        if meta["charge"]==nil then return end
-                        -- Send current charge to digging function so that the chainsaw will stop after digging a number of nodes.
-                        local charge=meta["charge"]
-                        if charge < chainsaw_charge_per_node then return end -- only cut if charged
+	description = "Chainsaw",
+	inventory_image = "technic_chainsaw.png",
+	stack_max = 1,
+	on_use = function(itemstack, user, pointed_thing)
+		if pointed_thing.type == "node" then
+			return itemstack
+		end
+		local meta = get_item_meta(itemstack:get_metadata())
+		if not meta or not meta.charge then
+			return
+		end
+		-- Send current charge to digging function so that the chainsaw will stop after digging a number of nodes.
+		if mata.charge < chainsaw_charge_per_node then
+			return
+		end
 
-                        charge=chainsaw_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,charge)
-                        technic.set_RE_wear(item,charge,chainsaw_max_charge)
-                        meta["charge"]=charge
-                        item["metadata"]=set_item_meta(meta)
-                        itemstack:replace(item)
-                        return itemstack
-                end
-        end,
+		local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+		meta.charge = chainsaw_dig_it(pos, user, mata.charge)
+		technic.set_RE_wear(itemstack, meta.charge, chainsaw_max_charge)
+		itemstack:set_metadata(set_item_meta(meta))
+		return itemstack
+	end,
 })
 
 minetest.register_craft({
diff --git a/technic/tools/flashlight.lua b/technic/tools/flashlight.lua
index f37c4a3..e33ee7b 100644
--- a/technic/tools/flashlight.lua
+++ b/technic/tools/flashlight.lua
@@ -140,28 +140,26 @@
     },
 })
 
-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;
-			technic.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
+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 do
+		if hotbar[i]:get_name() == "technic:flashlight" then
+			local meta = get_item_meta(hotbar[i]:get_metadata())
+			if not meta or not meta.charge then
+				return false
 			end
+			if meta.charge - 2 > 0 then
+				meta.charge = meta.charge - 2;
+				technic.set_RE_wear(hotbar[i], meta.charge, flashlight_max_charge)
+				hotbar[i]:set_metadata(set_item_meta(meta))
+				inv:set_stack("main", i, hotbar[i])
+				return true
 			end
 		end
-return false
+	end
+	return false
 end	
diff --git a/technic/tools/mining_drill.lua b/technic/tools/mining_drill.lua
index 4203c2b..f20cb64 100644
--- a/technic/tools/mining_drill.lua
+++ b/technic/tools/mining_drill.lua
@@ -8,28 +8,28 @@
 minetest.register_craft({
 	output = 'technic:mining_drill',
 	recipe = {
-		{'technic:stainless_steel_ingot', 	'technic:diamond_drill_head', 	'technic:stainless_steel_ingot'},
-		{'technic:stainless_steel_ingot', 	'technic:motor', 				'technic:stainless_steel_ingot'},
-		{'',								'technic:red_energy_crystal', 	'moreores:copper_ingot'},
+		{'technic:stainless_steel_ingot', 'technic:diamond_drill_head', 'technic:stainless_steel_ingot'},
+		{'technic:stainless_steel_ingot', 'technic:motor',              'technic:stainless_steel_ingot'},
+		{'',                              'technic:red_energy_crystal', 'moreores:copper_ingot'},
 	}
 })
 minetest.register_craft({
 	output = 'technic:mining_drill_mk2',
 	recipe = {
-		{'technic:diamond_drill_head', 		'technic:diamond_drill_head', 	'technic:diamond_drill_head'},
-		{'technic:stainless_steel_ingot', 	'technic:mining_drill', 		'technic:stainless_steel_ingot'},
-		{'', 								'technic:green_energy_crystal', ''},
+		{'technic:diamond_drill_head',    'technic:diamond_drill_head',   'technic:diamond_drill_head'},
+		{'technic:stainless_steel_ingot', 'technic:mining_drill',         'technic:stainless_steel_ingot'},
+		{'',                              'technic:green_energy_crystal', ''},
 	}
 })
 minetest.register_craft({
 	output = 'technic:mining_drill_mk3',
 	recipe = {
-		{'technic:diamond_drill_head', 		'technic:diamond_drill_head', 	'technic:diamond_drill_head'},
-		{'technic:stainless_steel_ingot', 	'technic:mining_drill_mk2', 	'technic:stainless_steel_ingot'},
-		{'', 								'technic:blue_energy_crystal', 	''},
+		{'technic:diamond_drill_head',    'technic:diamond_drill_head',  'technic:diamond_drill_head'},
+		{'technic:stainless_steel_ingot', 'technic:mining_drill_mk2',    'technic:stainless_steel_ingot'},
+		{'',                              'technic:blue_energy_crystal', ''},
 	}
 })
-for i=1,4,1 do
+for i = 1, 4 do
 	minetest.register_craft({
 		output = 'technic:mining_drill_mk3',
 		recipe = {
@@ -40,25 +40,23 @@
 	})
 end
 
-function drill_dig_it (pos, player,drill_type,mode)
-	
+function drill_dig_it(pos, player, drill_type, mode)
 	local charge
-
-	if mode==1 then
-		drill_dig_it0 (pos,player)
+	if mode == 1 then
+		drill_dig_it0(pos, player)
 	end
 	
-	if mode==2 then -- 3 deep
-		dir=drill_dig_it1(player)
-		if dir==0 then -- x+
-			drill_dig_it0 (pos,player)
-			pos.x=pos.x+1
-			drill_dig_it0 (pos,player)
-			pos.x=pos.x+1
-			drill_dig_it0 (pos,player)
+	if mode == 2 then -- 3 deep
+		dir = drill_dig_it1(player)
+		if dir == 0 then -- x+
+			drill_dig_it0(pos, player)
+			pos.x = pos.x + 1
+			drill_dig_it0(pos, player)
+			pos.x = pos.x + 1
+			drill_dig_it0(pos, player)
 		end
-		if dir==1 then  -- x-
-			drill_dig_it0 (pos,player)
+		if dir == 1 then  -- x-
+			drill_dig_it0(pos, player)
 			pos.x=pos.x-1
 			drill_dig_it0 (pos,player)
 			pos.x=pos.x-1
@@ -226,22 +224,21 @@
 	inventory_image = "technic_mining_drill.png",
 	stack_max = 1,
 	on_use = function(itemstack, user, pointed_thing)
-		if pointed_thing.type=="node" then 
-		local item=itemstack:to_table()
-		local meta=get_item_meta(item["metadata"])
-		if meta==nil then return end --tool not charghed
-		if meta["charge"]==nil then return end
-		local charge=meta["charge"]
-		if charge-mining_drill_power_usage>0 then
-			charge_to_take=drill_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,1,1)
-			charge =charge-mining_drill_power_usage;
-			meta["charge"]=charge
-			item["metadata"]=set_item_meta(meta)
-			technic.set_RE_wear(item,charge,mining_drill_max_charge)
-			itemstack:replace(item)
-			end
-		return itemstack
+		if pointed_thing.type ~= "node" then
+			return itemstack
 		end
+		local meta = get_item_meta(itemstack:get_metadata())
+		if not meta or not meta.charge then
+			return
+		end
+		if meta.charge - mining_drill_power_usage > 0 then
+			local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+			charge_to_take = drill_dig_it(pos, user, 1, 1)
+			meta.charge = meta.charge - mining_drill_power_usage
+			itemstack:set_metadata(set_item_meta(meta))
+			technic.set_RE_wear(itemstack, meta.charge, mining_drill_max_charge)
+		end
+		return itemstack
 	end,
 })
 
@@ -249,14 +246,14 @@
 	description = "Mining Drill Mk2",
 	inventory_image = "technic_mining_drill_mk2.png",
 	on_use = function(itemstack, user, pointed_thing)
-	mining_drill_mk2_handler(itemstack,user,pointed_thing)
-	return itemstack
+		mining_drill_mk2_handler(itemstack, user, pointed_thing)
+		return itemstack
 	end,
 })
 
 technic.register_power_tool("technic:mining_drill_mk2", mining_drill_mk2_max_charge)
 
-for i=1,4,1 do
+for i = 1, 4 do
 	technic.register_power_tool("technic:mining_drill_mk2_"..i, mining_drill_mk2_max_charge)
 	minetest.register_tool("technic:mining_drill_mk2_"..i, {
 		description = "Mining Drill Mk2 in Mode "..i,
@@ -295,56 +292,54 @@
 	})
 end
 
-function mining_drill_mk2_handler (itemstack,user,pointed_thing)
-	local keys=user:get_player_control()
-	local player_name=user:get_player_name()
-	local item=itemstack:to_table()
-	local meta=get_item_meta(item["metadata"])
-	if meta==nil or keys["sneak"]==true then return mining_drill_mk2_setmode(user,itemstack) end
-	if meta["mode"]==nil then return mining_drill_mk2_setmode(user,itemstack) end
-	if pointed_thing.type~="node" then return end
-	if meta["charge"]==nil then return end
-	charge=meta["charge"]
-	if charge-mining_drill_power_usage>0 then
-		local charge_to_take=drill_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,2,meta["mode"])
-		charge=charge-charge_to_take;
-		if charge<0 then charge=0 end
-		meta["charge"]=charge
-		item["metadata"]=set_item_meta(meta)
-		technic.set_RE_wear(item,charge,mining_drill_mk2_max_charge)
-		itemstack:replace(item)
+function mining_drill_mk2_handler(itemstack, user, pointed_thing)
+	local keys = user:get_player_control()
+	local player_name = user:get_player_name()
+	local meta = get_item_meta(itemstack:get_metadata())
+	if not meta or not meta.mode or keys.sneak then
+		return mining_drill_mk2_setmode(user, itemstack)
+	end
+	if pointed_thing.type ~= "node" or not meta.charge then
+		return
+	end
+	if meta.charge - mining_drill_power_usage > 0 then
+		local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+		local charge_to_take = drill_dig_it(pos, user, 2, meta.mode)
+		meta.charge = meta.charge - charge_to_take
+		meta.charge = math.max(meta.charge, 0)
+		itemstack:set_metadata(set_item_meta(meta))
+		technic.set_RE_wear(itemstack, meta.charge, mining_drill_mk2_max_charge)
 	end
 	return itemstack
 end
 
-function mining_drill_mk3_handler (itemstack,user,pointed_thing)
-	local keys=user:get_player_control()
-	local player_name=user:get_player_name()
-	local item=itemstack:to_table()
-	local meta=get_item_meta(item["metadata"])
-	if meta==nil or keys["sneak"]==true then return mining_drill_mk3_setmode(user,itemstack) end
-	if meta["mode"]==nil then return mining_drill_mk3_setmode(user,itemstack) end
-	if pointed_thing.type~="node" then return end
-	if meta["charge"]==nil then return end
-	local charge=meta["charge"]
-	if charge-mining_drill_power_usage>0 then
-		local charge_to_take=drill_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,3,meta["mode"])
-		charge=charge-charge_to_take;
-		if charge<0 then charge=0 end
-		meta["charge"]=charge
-		item["metadata"]=set_item_meta(meta)
-		technic.set_RE_wear(item,charge,mining_drill_mk3_max_charge)
-		itemstack:replace(item)
+function mining_drill_mk3_handler(itemstack, user, pointed_thing)
+	local keys = user:get_player_control()
+	local player_name = user:get_player_name()
+	local meta = get_item_meta(itemstack:get_metadata())
+	if not meta or not meta.mode or keys.sneak then
+		return mining_drill_mk3_setmode(user, itemstack)
+	end
+	if pointed_thing.type ~= "node" or not meta.charge then
+		return
+	end
+	if meta.charge - mining_drill_power_usage > 0 then
+		local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+		local charge_to_take = drill_dig_it(pos, user, 3, meta.mode)
+		meta.charge = meta.charge - charge_to_take
+		meta.charge = math.max(meta.charge, 0)
+		itemstack:set_metadata(set_item_meta(meta))
+		technic.set_RE_wear(itemstack, meta.charge, mining_drill_mk3_max_charge)
 	end
 	return itemstack
 end
 
-mining_drill_mode_text={
-{"Single node."},
-{"3 nodes deep."},
-{"3 modes wide."},
-{"3 modes tall."},
-{"3x3 nodes."},
+mining_drill_mode_text = {
+	{"Single node."},
+	{"3 nodes deep."},
+	{"3 modes wide."},
+	{"3 modes tall."},
+	{"3x3 nodes."},
 }
 
 function mining_drill_mk2_setmode(user,itemstack)
diff --git a/technic/tools/mining_laser_mk1.lua b/technic/tools/mining_laser_mk1.lua
index 3d8d556..4280cf7 100644
--- a/technic/tools/mining_laser_mk1.lua
+++ b/technic/tools/mining_laser_mk1.lua
@@ -1,52 +1,52 @@
 local laser_mk1_max_charge = 40000
 technic.register_power_tool("technic:laser_mk1", laser_mk1_max_charge)
 
-local laser_shoot = function(itemstack, player, pointed_thing)
-				local laser_straight_mode=0
-				local playerpos=player:getpos()
-				local dir=player:get_look_dir()
-				if pointed_thing.type=="node" then  
-					pos=minetest.get_pointed_thing_position(pointed_thing, above)
-					local node = minetest.env:get_node(pos)
-					if node.name~="ignore" then
-					minetest.node_dig(pos,node,player)
-					end
-					laser_straight_mode=1
-					end	
-				
-				direction_y=math.abs(math.floor(dir.y*100))
-				if direction_y>50 then entity_name="technic:laser_beam_entityV"
-					else entity_name="technic:laser_beam_entity" end
-				
-				if laser_straight_mode==1  then
-					pos1=minetest.get_pointed_thing_position(pointed_thing, under)
-					pos1.x=math.floor(pos1.x) 
-					pos1.y=math.floor(pos1.y)
-					pos1.z=math.floor(pos1.z)
-					obj=minetest.env:add_entity(pos1,entity_name)
-				else
-				obj=minetest.env:add_entity({x=playerpos.x,y=playerpos.y+1.6,z=playerpos.z},entity_name)
-				end
-				if obj:get_luaentity().player == nil then
-					obj:get_luaentity().player = player
-				end
-				if laser_straight_mode==1 and direction_y<50 then
-					obj:setvelocity({x=dir.x*8, y=0, z=dir.z*8})
-				else if laser_straight_mode==1 and direction_y>50 then
-					obj:setvelocity({x=0, y=dir.y*8, z=dir.z*8})
-					end
-				end
-				if laser_straight_mode==0 then
-					obj:setvelocity({x=dir.x*8, y=dir.y*8, z=dir.z*8})
-					end
-				obj:setacceleration({x=0, y=0, z=0})
-				obj:setyaw(player:get_look_yaw()+math.pi)
-				if obj:get_luaentity().player == nil then
-					obj:get_luaentity().player = player
-				end
-				--obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name()
-				minetest.sound_play("technic_laser", {pos = playerpos, gain = 1.0, max_hear_distance = 10,})
-				return true
+local laser_shoot = function(player, pointed_thing)
+	local laser_straight_mode=0
+	local playerpos=player:getpos()
+	local dir=player:get_look_dir()
+	if pointed_thing.type=="node" then  
+		pos=minetest.get_pointed_thing_position(pointed_thing, above)
+		local node = minetest.env:get_node(pos)
+		if node.name~="ignore" then
+			minetest.node_dig(pos,node,player)
+		end
+		laser_straight_mode=1
+	end
+	
+	direction_y=math.abs(math.floor(dir.y*100))
+	if direction_y>50 then entity_name="technic:laser_beam_entityV"
+		else entity_name="technic:laser_beam_entity" end
+	
+	if laser_straight_mode==1  then
+		pos1=minetest.get_pointed_thing_position(pointed_thing, under)
+		pos1.x=math.floor(pos1.x) 
+		pos1.y=math.floor(pos1.y)
+		pos1.z=math.floor(pos1.z)
+		obj=minetest.env:add_entity(pos1,entity_name)
+	else
+	obj=minetest.env:add_entity({x=playerpos.x,y=playerpos.y+1.6,z=playerpos.z},entity_name)
+	end
+	if obj:get_luaentity().player == nil then
+		obj:get_luaentity().player = player
+	end
+	if laser_straight_mode==1 and direction_y<50 then
+		obj:setvelocity({x=dir.x*8, y=0, z=dir.z*8})
+	else if laser_straight_mode==1 and direction_y>50 then
+		obj:setvelocity({x=0, y=dir.y*8, z=dir.z*8})
+		end
+	end
+	if laser_straight_mode==0 then
+		obj:setvelocity({x=dir.x*8, y=dir.y*8, z=dir.z*8})
+		end
+	obj:setacceleration({x=0, y=0, z=0})
+	obj:setyaw(player:get_look_yaw()+math.pi)
+	if obj:get_luaentity().player == nil then
+		obj:get_luaentity().player = player
+	end
+	--obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name()
+	minetest.sound_play("technic_laser", {pos = playerpos, gain = 1.0, max_hear_distance = 10,})
+	return true
 end
 
 
@@ -55,18 +55,15 @@
 	inventory_image = "technic_mining_laser_mk1.png",
 	stack_max = 1,
 	on_use = function(itemstack, user, pointed_thing)
-		item=itemstack:to_table()
-		local meta=get_item_meta(item["metadata"])
-		if meta==nil then return end --tool not charghed
-		if meta["charge"]==nil then return end
-		charge=meta["charge"]
-		if charge-400>0 then
-		 laser_shoot(item, user, pointed_thing)
-		 charge = charge-400;
-		technic.set_RE_wear(item,charge,laser_mk1_max_charge)
-		meta["charge"]=charge
-		item["metadata"]=set_item_meta(meta)
-		itemstack:replace(item)
+		local meta = get_item_meta(itemstack:get_metadata())
+		if not meta or not meta.charge then
+			return
+		end
+		if meta.charge - 400 > 0 then
+			laser_shoot(user, pointed_thing)
+			meta.charge = meta.charge - 400
+			technic.set_RE_wear(itemstack, meta.charge, laser_mk1_max_charge)
+			itemstack:set_metadata(set_item_meta(meta))
 		end
 		return itemstack
 	end,
diff --git a/technic/tools/sonic_screwdriver.lua b/technic/tools/sonic_screwdriver.lua
index 31fa0f9..7582c8c 100644
--- a/technic/tools/sonic_screwdriver.lua
+++ b/technic/tools/sonic_screwdriver.lua
@@ -2,52 +2,57 @@
 technic.register_power_tool("technic:sonic_screwdriver", sonic_screwdriver_max_charge)
 
 minetest.register_tool("technic:sonic_screwdriver", {
-			description = "Sonic Screwdriver",
-			inventory_image = "technic_sonic_screwdriver.png",
-			on_use = function(itemstack, user, pointed_thing)
-					-- Must be pointing to facedir applicable node
-					if pointed_thing.type~="node" then return end
-					local pos=minetest.get_pointed_thing_position(pointed_thing,above)
-					local node=minetest.env:get_node(pos)
-					local node_name=node.name
-						if minetest.registered_nodes[node_name].paramtype2 == "facedir" or minetest.registered_nodes[node_name].paramtype2 == "wallmounted" then
-					if node.param2==nil  then return end
-					item=itemstack:to_table()
-					local meta1=get_item_meta(item["metadata"])
-					if meta1==nil then return end --tool not charghed
-					if meta1["charge"]==nil then return end
-					charge=meta1["charge"]
-					if charge-100>0 then
-						minetest.sound_play("technic_sonic_screwdriver", {pos = pos, gain = 0.3, max_hear_distance = 10,})
-						local n = node.param2
-						if minetest.registered_nodes[node_name].paramtype2 == "facedir" then
-						   n = n+1
-						if n == 4 then n = 0 end
-						else
-							n = n+1
-							if n == 6 then n = 0 end
-						end
-						-- hacky_swap_node, unforunatly.
-						local meta = minetest.env:get_meta(pos)
-						local meta0 = meta:to_table()
-						node.param2 = n
-						minetest.env:set_node(pos,node)
-						meta = minetest.env:get_meta(pos)
-						meta:from_table(meta0)
+	description = "Sonic Screwdriver",
+	inventory_image = "technic_sonic_screwdriver.png",
+	on_use = function(itemstack, user, pointed_thing)
+		-- Must be pointing to facedir applicable node
+		if pointed_thing.type ~= "node" then
+			return
+		end
+		local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+		local node = minetest.get_node(pos)
+		local node_name = node.name
+		if minetest.registered_nodes[node_name].paramtype2 ~= "facedir" and
+		   minetest.registered_nodes[node_name].paramtype2 ~= "wallmounted" then
+			return itemstack
+		end
+		if node.param2 == nil then
+			return
+		end
+		local meta1 = get_item_meta(itemstack:get_metadata())
+		if not meta1 or not meta1.charge then
+			return
+		end
+		if meta1.charge - 100 > 0 then
+			minetest.sound_play("technic_sonic_screwdriver",
+					{pos = pos, gain = 0.3, max_hear_distance = 10})
+			local p = node.param2
+			if minetest.registered_nodes[node_name].paramtype2 == "facedir" then
+				p = p + 1
+				if p == 4 then
+					p = 0
+				end
+			else
+				p = p + 1
+				if p == 6 then
+					p = 0
+				end
+			end
+			-- hacky_swap_node, unforunatly.
+			local meta = minetest.get_meta(pos)
+			local meta0 = meta:to_table()
+			node.param2 = p
+			minetest.set_node(pos, node)
+			meta = minetest.get_meta(pos)
+			meta:from_table(meta0)
 
-						charge=charge-100;  
-						meta1["charge"]=charge
-						item["metadata"]=set_item_meta(meta1)
-						technic.set_RE_wear(item,charge,sonic_screwdriver_max_charge)
-						itemstack:replace(item)
-						end
-						return itemstack
-						else
-						return itemstack
-						end
-						end,
-		 
-	})
+			meta1.charge = meta1.charge - 100  
+			itemstack:set_metadata(set_item_meta(meta1))
+			technic.set_RE_wear(itemstack, meta1.charge, sonic_screwdriver_max_charge)
+		end
+		return itemstack
+	end, 
+})
  
 minetest.register_craft({
 	output = "technic:sonic_screwdriver",

--
Gitblit v1.8.0