SmallJoker
2023-08-03 0921c326a8f1b6ffc5e8013e3c477983df96f386
Chainsaw: fix occasional error on startup

This also tweaks the cost function to make the chainsaw a bit less powerful.
1 files modified
32 ■■■■■ changed files
technic/tools/chainsaw.lua 32 ●●●●● patch | view | raw | blame | history
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
@@ -39,12 +39,16 @@
    ["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
@@ -61,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()
@@ -121,11 +126,12 @@
    if 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