From 623fcae4a4ad3ec12cc242b29b0d781357cff3f7 Mon Sep 17 00:00:00 2001
From: Zefram <zefram@fysh.org>
Date: Sat, 24 May 2014 00:24:30 +0200
Subject: [PATCH] Fix supply converter

---
 technic/tools/chainsaw.lua |  190 ++++++++++++++++++++++++++---------------------
 1 files changed, 105 insertions(+), 85 deletions(-)

diff --git a/technic/tools/chainsaw.lua b/technic/tools/chainsaw.lua
index ae0c30c..c8f6d37 100644
--- a/technic/tools/chainsaw.lua
+++ b/technic/tools/chainsaw.lua
@@ -3,41 +3,6 @@
 local chainsaw_charge_per_node = 12    -- 12    - Gives 2500 nodes on a single charge (about 50 complete normal trees)
 local chainsaw_leaves          = true  -- true  - Cut down entire trees, leaves and all
 
-technic.register_LV_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
-
-                        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,
-})
-
-minetest.register_craft({
-        output = 'technic:chainsaw',
-        recipe = {
-                {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'},
-                {'technic:stainless_steel_ingot', 'technic:motor',                 'technic:battery'},
-                {'',                               '',                             'default:copper_ingot'},
-        }
-})
-
 -- The default stuff
 local timber_nodenames={["default:jungletree"] = true,
                         ["default:papyrus"]    = true,
@@ -48,6 +13,16 @@
 
 if chainsaw_leaves == true then
         timber_nodenames["default:leaves"] = true
+end
+
+-- technic_worldgen defines rubber trees if moretrees isn't installed
+if minetest.get_modpath("technic_worldgen") or
+   minetest.get_modpath("moretrees") then
+	timber_nodenames["moretrees:rubber_tree_trunk_empty"] = true
+	timber_nodenames["moretrees:rubber_tree_trunk"]       = true
+	if chainsaw_leaves then
+                timber_nodenames["moretrees:rubber_tree_leaves"] = true
+	end
 end
 
 -- Support moretrees if it is there
@@ -66,9 +41,7 @@
         timber_nodenames["moretrees:palm_trunk_sideways"]              = true
         timber_nodenames["moretrees:pine_trunk"]                       = true
         timber_nodenames["moretrees:pine_trunk_sideways"]              = true
-        timber_nodenames["moretrees:rubber_tree_trunk"]                = true
         timber_nodenames["moretrees:rubber_tree_trunk_sideways"]       = true
-        timber_nodenames["moretrees:rubber_tree_trunk_empty"]          = true
         timber_nodenames["moretrees:rubber_tree_trunk_sideways_empty"] = true
         timber_nodenames["moretrees:sequoia_trunk"]                    = true
         timber_nodenames["moretrees:sequoia_trunk_sideways"]           = true
@@ -79,9 +52,11 @@
         timber_nodenames["moretrees:jungletree_trunk"]                 = true
         timber_nodenames["moretrees:jungletree_trunk_sideways"]        = true
 
-        if chainsaw_leaves == true then
+        if chainsaw_leaves then
                 timber_nodenames["moretrees:apple_tree_leaves"]        = true
                 timber_nodenames["moretrees:oak_leaves"]               = true
+                timber_nodenames["moretrees:fir_leaves"]               = true
+                timber_nodenames["moretrees:fir_leaves_bright"]        = true
                 timber_nodenames["moretrees:sequoia_leaves"]           = true
                 timber_nodenames["moretrees:birch_leaves"]             = true
                 timber_nodenames["moretrees:birch_leaves"]             = true
@@ -90,7 +65,6 @@
                 timber_nodenames["moretrees:spruce_leaves"]            = true
                 timber_nodenames["moretrees:pine_leaves"]              = true
                 timber_nodenames["moretrees:willow_leaves"]            = true
-                timber_nodenames["moretrees:rubber_tree_leaves"]       = true
                 timber_nodenames["moretrees:jungletree_leaves_green"]  = true
                 timber_nodenames["moretrees:jungletree_leaves_yellow"] = true
                 timber_nodenames["moretrees:jungletree_leaves_red"]    = true
@@ -145,55 +119,17 @@
    end
 end
 
+
+local S = technic.getter
+
+technic.register_power_tool("technic:chainsaw", chainsaw_max_charge)
+
 -- Table for saving what was sawed down
-local produced
-
--- Saw down trees entry point
-chainsaw_dig_it = function(pos, player,current_charge)
-        local remaining_charge=current_charge
-
-        -- Save the currently installed dropping mechanism so we can restore it.
-	local original_handle_node_drops = minetest.handle_node_drops
-
-        -- A bit of trickery here: use a different node drop callback
-        -- and restore the original afterwards.
-        minetest.handle_node_drops = chainsaw_handle_node_drops
-
-        -- clear result and start sawing things down
-        produced = {}
-        remaining_charge = recursive_dig(pos, remaining_charge, player)
-        minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, max_hear_distance = 10,})
-
-        -- Restore the original noder drop handler
-        minetest.handle_node_drops = original_handle_node_drops
-
-        -- Now drop items for the player
-        local number, produced_item, p
-        for produced_item,number in pairs(produced) do
-                --print("ADDING ITEM: " .. produced_item .. " " .. number)
-                -- Drop stacks of 99 or less
-                p = {
-                        x = pos.x + math.random()*4,
-                        y = pos.y,
-                        z = pos.z + math.random()*4
-                }
-                while number > 99 do
-                        minetest.env:add_item(p, produced_item .. " 99")
-                        p = {
-                                x = pos.x + math.random()*4,
-                                y = pos.y,
-                                z = pos.z + math.random()*4
-                        }
-                        number = number - 99
-                end
-                minetest.env:add_item(p, produced_item .. " " .. number)
-        end
-        return remaining_charge
-end
+local produced = nil
 
 -- Override the default handling routine to be able to count up the
 -- items sawed down so that we can drop them i an nice single stack
-chainsaw_handle_node_drops = function(pos, drops, digger)
+local function chainsaw_handle_node_drops(pos, drops, digger)
         -- Add dropped items to list of collected nodes
         local _, dropped_item
         for _, dropped_item in ipairs(drops) do
@@ -207,7 +143,7 @@
 
 -- This function does all the hard work. Recursively we dig the node at hand
 -- if it is in the table and then search the surroundings for more stuff to dig.
-recursive_dig = function(pos, remaining_charge, player)
+local function recursive_dig(pos, remaining_charge, player)
         local node=minetest.env:get_node(pos)
         local i=1
         -- Lookup node name in timber table:
@@ -267,3 +203,87 @@
         return remaining_charge
 end
 
+-- Saw down trees entry point
+local function chainsaw_dig_it(pos, player,current_charge)
+	if minetest.is_protected(pos, player:get_player_name()) then
+		minetest.record_protection_violation(pos, player:get_player_name())
+		return current_charge
+	end
+        local remaining_charge=current_charge
+
+        -- Save the currently installed dropping mechanism so we can restore it.
+	local original_handle_node_drops = minetest.handle_node_drops
+
+        -- A bit of trickery here: use a different node drop callback
+        -- and restore the original afterwards.
+        minetest.handle_node_drops = chainsaw_handle_node_drops
+
+        -- clear result and start sawing things down
+        produced = {}
+        remaining_charge = recursive_dig(pos, remaining_charge, player)
+        minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, max_hear_distance = 10,})
+
+        -- Restore the original noder drop handler
+        minetest.handle_node_drops = original_handle_node_drops
+
+        -- Now drop items for the player
+        local number, produced_item, p
+        for produced_item,number in pairs(produced) do
+                --print("ADDING ITEM: " .. produced_item .. " " .. number)
+                -- Drop stacks of 99 or less
+                p = {
+                        x = pos.x + math.random()*4,
+                        y = pos.y,
+                        z = pos.z + math.random()*4
+                }
+                while number > 99 do
+                        minetest.env:add_item(p, produced_item .. " 99")
+                        p = {
+                                x = pos.x + math.random()*4,
+                                y = pos.y,
+                                z = pos.z + math.random()*4
+                        }
+                        number = number - 99
+                end
+                minetest.env:add_item(p, produced_item .. " " .. number)
+        end
+        return remaining_charge
+end
+
+
+minetest.register_tool("technic:chainsaw", {
+	description = S("Chainsaw"),
+	inventory_image = "technic_chainsaw.png",
+	stack_max = 1,
+	wear_represents = "technic_RE_charge",
+	on_refill = technic.refill_RE_charge,
+	on_use = function(itemstack, user, pointed_thing)
+		if pointed_thing.type ~= "node" then
+			return itemstack
+		end
+		local meta = minetest.deserialize(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 meta.charge < chainsaw_charge_per_node then
+			return
+		end
+
+		local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+		meta.charge = chainsaw_dig_it(pos, user, meta.charge)
+		technic.set_RE_wear(itemstack, meta.charge, chainsaw_max_charge)
+		itemstack:set_metadata(minetest.serialize(meta))
+		return itemstack
+	end,
+})
+
+minetest.register_craft({
+        output = 'technic:chainsaw',
+        recipe = {
+                {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'},
+                {'technic:stainless_steel_ingot', 'technic:motor',                 'technic:battery'},
+                {'',                               '',                             'default:copper_ingot'},
+        }
+})
+

--
Gitblit v1.8.0