diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..1592dbb --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,13 @@ +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0a4cb5d --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# Lumberjack + +A simple mod based on ideas from the mods TreeCapitator, Timber, and New Timber. +This mod allows to hit the bottom of the tree and the whole tree (wood) is harvested +and moved to the players inventory. +To distinguish between "grown" trees and playes tree nodes, the 'node.param1' +is used to identify placed nodes. + + +## Dependencies +default + +# License +Copyright (C) 2018 Joachim Stolberg +Code: Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt +Sound is taken from Hybrid Dog (TreeCapitator) + +# History +V0.1 07/Apr/2018 mod initial created diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..31da60c --- /dev/null +++ b/depends.txt @@ -0,0 +1,10 @@ +default +unifieddyes +stairs? +moreblocks? +moreores? +building_blocks? +homedecor? + + + diff --git a/description.txt b/description.txt new file mode 100644 index 0000000..b0a9eb5 --- /dev/null +++ b/description.txt @@ -0,0 +1,2 @@ +This mod allows to dig the bottom of the tree and the whole tree is moved into the inventory. + diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..615044d --- /dev/null +++ b/init.lua @@ -0,0 +1,129 @@ +--[[ + + lumberjack + ========== + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + This mod allows to hit the bottom of the tree and the whole tree is harvested + and moved to the players inventory. + To distinguish between "grown" trees and playes tree nodes, the 'node.param1' + is used to identify placed nodes. + +]]-- + +lumberjack = {} + +local MY_PARAM1_VAL = 7 -- to identify placed nodes + +local lTrees = {} -- List od registered tree items + +-- +-- Register the tree node to the lumberjack mod. +-- 'radius' the the range (+x/-x/+z/-z), where all available tree nodes will be removed- +-- 'stem_height_min' is the minimum number of tree nodes, to be a valid stem (and not the a root)- +-- +function lumberjack.register_tree(name, radius, stem_height_min) + local data = minetest.registered_nodes[name] + if data == nil then + error("[lumberjack] "..name.." is no valid item") + end + if data.after_dig_node == nil then + minetest.override_item(name, { + after_dig_node = after_dig_node, + on_construct = on_construct, + }) + else + error("[lumberjack] "..name.." has already an 'after_dig_node' function") + end + lTrees[name] = {radius=radius, height_min=stem_height_min} +end + + +-- +-- Remove all treen nodes in the given range +-- +local function remove_level(pos1, pos2, name) + local cnt = 0 + for _,pos in ipairs(minetest.find_nodes_in_area(pos1, pos2, name)) do + minetest.remove_node(pos) + cnt = cnt + 1 + end + return cnt +end + +-- +-- Remove the complete tree and return the number of removed items +-- +local function remove_tree(pos, radius, name) + local level = 1 + local num_nodes = 0 + while true do + local pos1 = {x=pos.x-radius, y=pos.y+level, z=pos.z-radius} + local pos2 = {x=pos.x+radius, y=pos.y+level, z=pos.z+radius} + local cnt = remove_level(pos1, pos2, name) + if cnt == 0 then break end + num_nodes = num_nodes + cnt + level = level + 1 + end + return num_nodes +end + +-- +-- Add tree items to the players inventory +-- +local function add_to_inventory(digger, name, len) + local inv = digger:get_inventory() + local items = ItemStack(name .. " " .. len) + if inv and items and inv:room_for_item("main", items) then + inv:add_item("main", items) + end +end + + +-- +-- Remove the complete tree if the digged node belongs to a tree +-- +local function after_dig_node(pos, oldnode, oldmetadata, digger) + if not digger or digger:get_player_control().sneak then return end + -- not a player placed node? + if oldnode.param1 == MY_PARAM1_VAL then return end + -- not root nodes? + local height_min = lTrees[oldnode.name].height_min or 3 + local test_pos = {x=pos.x, y=pos.y+height_min-1, z=pos.z} + if minetest.get_node(test_pos).name ~= oldnode.name then return end + -- OK, cut tree + local radius = lTrees[oldnode.name].radius or 0 + local num_nodes = remove_tree(pos, radius, oldnode.name) + add_to_inventory(digger, oldnode.name, num_nodes) + minetest.sound_play("tree_falling", {pos = pos, max_hear_distance = 16}) +end + +-- +-- Mark node as "used placed" +-- +local function on_construct(pos) + local node = minetest.get_node(pos) + if node then + minetest.swap_node(pos, {name=node.name, param1=MY_PARAM1_VAL, param2=node.param2}) + end +end + + +lumberjack.register_tree("default:jungletree", 1, 5) +lumberjack.register_tree("default:acacia_tree", 2, 3) +lumberjack.register_tree("default:aspen_tree", 0, 5) +lumberjack.register_tree("default:tree", 1, 2) +lumberjack.register_tree("default:pine_tree", 0, 3) + +if minetest.get_modpath("ethereal") and ethereal ~= nil then + lumberjack.register_tree("ethereal:palm_trunk", 1, 3) + lumberjack.register_tree("ethereal:mushroom_trunk", 1, 3) + lumberjack.register_tree("ethereal:birch_trunk", 0, 3) + lumberjack.register_tree("ethereal:banana_trunk", 1, 3) + lumberjack.register_tree("ethereal:willow_trunk", 4, 3) + lumberjack.register_tree("ethereal:frost_tree", 1, 3) +end diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..24c6cdd --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +name=lumberjack diff --git a/sounds/tree_falling.ogg b/sounds/tree_falling.ogg new file mode 100644 index 0000000..3e838ac Binary files /dev/null and b/sounds/tree_falling.ogg differ