From dfcf64c1d07f4006045af37b0b01dbfc82dbb1d1 Mon Sep 17 00:00:00 2001
From: SmallJoker <mk939@ymail.com>
Date: Sat, 26 Aug 2023 10:57:05 +0200
Subject: [PATCH] Chainsaw: new setting to disable safe cutting

---
 technic/tools/chainsaw.lua |   40 ++++++++++++++++++++++++++--------------
 1 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/technic/tools/chainsaw.lua b/technic/tools/chainsaw.lua
index 65ec30d..d2ee966 100644
--- a/technic/tools/chainsaw.lua
+++ b/technic/tools/chainsaw.lua
@@ -5,9 +5,9 @@
 -- if this is disabled.
 local chainsaw_leaves = true
 
-local chainsaw_efficiency = 0.95 -- Drops less items
+local chainsaw_efficiency = 0.92 -- Drops less items
 
--- Maximal dimensions of the tree to cut
+-- Maximal dimensions of the tree to cut (giant sequoia)
 local tree_max_radius = 10
 local tree_max_height = 70
 
@@ -31,15 +31,24 @@
 	["default:cactus"] = -1,
 	["default:papyrus"] = -1,
 
+	-- dfcaves "fruits"
+	["df_trees:blood_thorn_spike"] = -1,
+	["df_trees:blood_thorn_spike_dead"] = -1,
+	["df_trees:tunnel_tube_fruiting_body"] = -1,
+
 	["ethereal:bamboo"] = -1,
+}
+
+local tree_nodes_by_cid = {
+	-- content ID indexed table, data populated on mod load.
+	-- Format: [node_name] = cost_number
 }
 
 -- Function to decide whether or not to cut a certain node (and at which energy cost)
 local function populate_costs(name, def)
 	repeat
-		if tree_nodes[name] == -1 then
-			tree_nodes[name] = nil
-			break -- Manually added, but need updating
+		if tree_nodes[name] then
+			break -- Manually specified node to chop
 		end
 		if (def.groups.tree or 0) > 0 then
 			break -- Tree node
@@ -56,17 +65,18 @@
 	until 1
 	-- luacheck: pop
 
-	-- Function did not return! --> add content ID to the digging table
+	-- Add the node cost to the content ID indexed table
 	local content_id = minetest.get_content_id(name)
 
-	-- Get 12 in average
-	local cost = 0
+	-- Make it so that the giant sequoia can be cut with a full charge
+	local cost = tree_nodes[name] or 0
 	if def.groups.choppy then
-		cost = def.groups.choppy * 5 -- trunks (usually 3 * 5)
-	elseif def.groups.snappy then
-		cost = def.groups.snappy * 2 -- leaves
+		cost = math.max(cost, def.groups.choppy * 14) -- trunks (usually 3 * 14)
 	end
-	tree_nodes[content_id] = math.max(4, cost)
+	if def.groups.snappy then
+		cost = math.max(cost, def.groups.snappy * 2) -- leaves
+	end
+	tree_nodes_by_cid[content_id] = math.max(4, cost)
 end
 
 minetest.register_on_mods_loaded(function()
@@ -106,6 +116,7 @@
 	-- See function cut_tree()
 }
 
+local safe_cut = minetest.settings:get_bool("technic_safe_chainsaw") ~= false
 local c_air = minetest.get_content_id("air")
 local function dig_recursive(x, y, z)
 	local i = cutter.area:index(x, y, z)
@@ -114,13 +125,14 @@
 	end
 	cutter.seen[i] = 1 -- Mark as visited
 
-	if cutter.param2[i] ~= 0 then
+	if safe_cut and cutter.param2[i] ~= 0 then
 		-- Do not dig manually placed nodes
+		-- Problem: moretrees' generated jungle trees use param2 = 2
 		return
 	end
 
 	local c_id = cutter.data[i]
-	local cost = tree_nodes[c_id]
+	local cost = tree_nodes_by_cid[c_id]
 	if not cost or cost > cutter.charge then
 		return -- Cannot dig this node
 	end

--
Gitblit v1.8.0