Compare commits

...

10 Commits

Author SHA1 Message Date
Alexander Weber
b265a9707a Cleanup treenodes_sorted in one place
pass poshash to functions instead of recalculation
2022-01-06 14:22:46 +01:00
bell07
94eb6691cb
Update README.md 2021-05-28 09:09:17 +02:00
bell07
9500658b0b
Update README.md 2021-05-22 23:23:16 +02:00
bell07
17ebc111c6
Merge pull request #6 from Panquesito7/master
Use mod.conf for description, drop...
2019-09-22 22:32:15 +02:00
Panquesito7
52ce571bf9 Use mod.conf for description, drop...
...description.txt for better compatibility with MT/MTG 5.0.0 and above.
2019-09-22 15:30:16 -05:00
bell07
df96750d19
Merge pull request #5 from BlockySurvival/master
Command to toggle woodchopping.
2019-09-13 09:02:04 +02:00
flux
c5d4534014 fix reversed messages; disable process when player turns chopping off or leaves server 2019-09-03 22:04:33 +00:00
flux
5f43976b7a make all settings configurable; add command to toggle woodcutting 2019-09-03 22:04:33 +00:00
bell07
258d798d44
Merge pull request #3 from coil0/wear-limit
Add setting to set wear limit
2019-08-17 08:45:43 +02:00
coil
82c54bac7b
Add setting to set wear limit
When tool wear is higher than the limit, nodes are removed one at a
time so that it is still possible to switch to a different tool.
2019-08-16 19:04:32 -04:00
5 changed files with 92 additions and 25 deletions

View File

@ -9,7 +9,8 @@ Forum: https://forum.minetest.net/viewtopic.php?f=9&t=18023
## Highlights / Features ## Highlights / Features
- Lag-free because the work is not done at once. You can observe the woodcutting. - Lag-free because the work is not done at once. You can observe the woodcutting.
- You can stop the woodcutting by press sneak key second time - You can stop the woodcutting by press sneak key second time
- You can add additional trees to process by digging other tree nodes manually - Works with all trees. The cutting just follow connected tree (trunk) blocks in all directions for each cutted node and add them to the processing queue
- You can add additional trees to process by digging other tree nodes manually (without sneak key)
- The distance to the player is used to prefer next node so the player can partially influence the work direction on big areas - The distance to the player is used to prefer next node so the player can partially influence the work direction on big areas
- The auto-mining speed is dependent on wielded tool, so the diamond axe is still advantageously than empty hand - The auto-mining speed is dependent on wielded tool, so the diamond axe is still advantageously than empty hand
- All checks and functionalities are processed (like hunger damage and tool wear) as if the player did the mining manually - All checks and functionalities are processed (like hunger damage and tool wear) as if the player did the mining manually
@ -28,6 +29,7 @@ woodcutting.settings = {
leaves_distance = 2, -- do not touch leaves around the not removed trees with this distance leaves_distance = 2, -- do not touch leaves around the not removed trees with this distance
player_distance = 80, -- Allow cutting tree nodes with this maximum distance away from player player_distance = 80, -- Allow cutting tree nodes with this maximum distance away from player
dig_leaves = true, -- Dig dacayable leaves after tree node is digged - can be changed trough woodcutting_dig_leaves in minetest.conf dig_leaves = true, -- Dig dacayable leaves after tree node is digged - can be changed trough woodcutting_dig_leaves in minetest.conf
wear_limit = 65535, -- Maximum tool wear that allows cutting
} }
``` ```
@ -49,6 +51,7 @@ See (default) Settings
- process.leaves_distance - used in process:process_leaves(pos) - can be adjusted each step in on_after_dig_hook() - process.leaves_distance - used in process:process_leaves(pos) - can be adjusted each step in on_after_dig_hook()
- process.player_distance - used in process:check_processing_allowed(pos) - can be adjusted each step in on_step_hook() - process.player_distance - used in process:check_processing_allowed(pos) - can be adjusted each step in on_step_hook()
- process.dig_leaves - used at end of on_dignode function - can be adjusted each step in on_after_dig_hook() - process.dig_leaves - used at end of on_dignode function - can be adjusted each step in on_after_dig_hook()
- process.wear_limit - used in process:check_processing_allowed(pos) - can be adjusted each step in on_step_hook()
#### Methods #### Methods
Note:this methods could be redefined in on_new_process_hook, in a different way for each new process Note:this methods could be redefined in on_new_process_hook, in a different way for each new process

View File

@ -1,2 +0,0 @@
Asynchrounus tree cutter. Mine the first tree node from a
tree while the sneak key is pressed to start the woodcutting process.

View File

@ -1,10 +1,14 @@
woodcutting = {} woodcutting = {}
local mod_storage = minetest.get_mod_storage()
local disabled_by_player = {}
woodcutting.settings = { woodcutting.settings = {
tree_distance = 1, -- Apply tree nodes with this distance to the queue. 1 means touching tree nodes only tree_distance = tonumber(minetest.settings:get("woodcutting_tree_distance")) or 1,
leaves_distance = 2, -- do not touch leaves around the not removed trees with this distance leaves_distance = tonumber(minetest.settings:get("woodcutting_leaves_distance")) or 2,
player_distance = 80, -- Allow cutting tree nodes with this maximum distance away from player player_distance = tonumber(minetest.settings:get("woodcutting_player_distance")) or 80,
dig_leaves = true, -- Dig dacayable leaves after tree node is digged dig_leaves = minetest.settings:get_bool("woodcutting_dig_leaves", true),
wear_limit = tonumber(minetest.settings:get("woodcutting_wear_limit")) or 65535,
on_new_process_hook = function(process) return true end, -- do not start the process if set to nil or return false on_new_process_hook = function(process) return true end, -- do not start the process if set to nil or return false
on_step_hook = function(process) return true end, -- if false is returned finish the process on_step_hook = function(process) return true end, -- if false is returned finish the process
@ -12,11 +16,6 @@ woodcutting.settings = {
on_after_dig_hook = function(process, pos, oldnode) return true end, -- if false is returned do nothing after digging node on_after_dig_hook = function(process, pos, oldnode) return true end, -- if false is returned do nothing after digging node
} }
local _woodcutting_dig_leaves = minetest.settings:get_bool("woodcutting_dig_leaves")
if _woodcutting_dig_leaves ~= nil then
woodcutting.settings.dig_leaves = _woodcutting_dig_leaves
end
woodcutting.tree_content_ids = {} woodcutting.tree_content_ids = {}
woodcutting.leaves_content_ids = {} woodcutting.leaves_content_ids = {}
woodcutting.process_runtime = {} woodcutting.process_runtime = {}
@ -36,6 +35,7 @@ function woodcutting.new_process(playername, template)
process.tree_distance = process.tree_distance or woodcutting.settings.tree_distance process.tree_distance = process.tree_distance or woodcutting.settings.tree_distance
process.leaves_distance = process.leaves_distance or woodcutting.settings.leaves_distance process.leaves_distance = process.leaves_distance or woodcutting.settings.leaves_distance
process.player_distance = process.player_distance or woodcutting.settings.player_distance process.player_distance = process.player_distance or woodcutting.settings.player_distance
process.wear_limit = process.wear_limit or woodcutting.settings.wear_limit
if process.dig_leaves == nil then --bool value with default value true if process.dig_leaves == nil then --bool value with default value true
if woodcutting.settings.dig_leaves == nil then if woodcutting.settings.dig_leaves == nil then
@ -112,8 +112,7 @@ end
---------------------------------- ----------------------------------
--- Get the delay time before processing the node at pos --- Get the delay time before processing the node at pos
---------------------------------- ----------------------------------
function woodcutting_class:get_delay_time(pos) function woodcutting_class:get_delay_time(pos, poshash)
local poshash = minetest.hash_node_position(pos)
local nodedef = minetest.registered_nodes[self.treenodes_hashed[poshash]] local nodedef = minetest.registered_nodes[self.treenodes_hashed[poshash]]
local capabilities = self._player:get_wielded_item():get_tool_capabilities() local capabilities = self._player:get_wielded_item():get_tool_capabilities()
local dig_params = minetest.get_dig_params(nodedef.groups, capabilities) local dig_params = minetest.get_dig_params(nodedef.groups, capabilities)
@ -131,8 +130,9 @@ end
---------------------------------- ----------------------------------
--- Check node removal allowed --- Check node removal allowed
---------------------------------- ----------------------------------
function woodcutting_class:check_processing_allowed(pos) function woodcutting_class:check_processing_allowed(pos, poshash)
return vector.distance(pos, self._player:get_pos()) < self.player_distance return vector.distance(pos, self._player:get_pos()) < self.player_distance
and self._player:get_wielded_item():get_wear() <= self.wear_limit
end end
---------------------------------- ----------------------------------
@ -150,7 +150,20 @@ function woodcutting_class:select_next_tree_node()
end end
return aval < bval return aval < bval
end) end)
return self.treenodes_sorted[1]
-- Search for first unprocessed node. Cleanup tables
while true do
local pos = self.treenodes_sorted[1]
if not pos then --Finished
return
end
local poshash = minetest.hash_node_position(pos)
if not self.treenodes_hashed[poshash] then
table.remove(self.treenodes_sorted, 1)
else
return pos, poshash
end
end
end end
---------------------------------- ----------------------------------
@ -169,14 +182,13 @@ function woodcutting_class:process_woodcut_step()
return return
end end
local pos = process:select_next_tree_node() local pos, poshash = process:select_next_tree_node()
process:show_hud(pos) process:show_hud(pos)
if pos then if pos then
if process:check_processing_allowed(pos) then if process:check_processing_allowed(pos, poshash) then
-- dig the node -- dig the node
local delaytime = process:get_delay_time(pos) local delaytime = process:get_delay_time(pos, poshash)
if delaytime then if delaytime then
table.remove(process.treenodes_sorted, 1)
process:woodcut_node(pos, delaytime) process:woodcut_node(pos, delaytime)
else else
-- wait for right tool is used, try again -- wait for right tool is used, try again
@ -184,8 +196,6 @@ function woodcutting_class:process_woodcut_step()
end end
else else
-- just remove from hashed table and trigger the next step -- just remove from hashed table and trigger the next step
local poshash = minetest.hash_node_position(pos)
table.remove(process.treenodes_sorted, 1)
process.treenodes_hashed[poshash] = nil process.treenodes_hashed[poshash] = nil
process:process_woodcut_step() process:process_woodcut_step()
end end
@ -311,8 +321,12 @@ minetest.register_on_dignode(function(pos, oldnode, digger)
return return
end end
-- Get the process or create new one
local playername = digger:get_player_name() local playername = digger:get_player_name()
if disabled_by_player[playername] then
return
end
-- Get the process or create new one
local sneak = digger:get_player_control().sneak local sneak = digger:get_player_control().sneak
local process = woodcutting.get_process(playername) local process = woodcutting.get_process(playername)
if not process and sneak then if not process and sneak then
@ -378,4 +392,42 @@ minetest.register_on_dieplayer(function(player)
end end
end) end)
--dofile(minetest.get_modpath(minetest.get_current_modname()).."/hook_examples.lua") ----------------------------
-- Command to toggle whether cutting is enabled, per-player
----------------------------
minetest.register_chatcommand("toggle_woodcutting", {
description = "Toggle whether woodcutting is enabled",
func = function(player_name)
local is_currently_disabled = disabled_by_player[player_name]
if is_currently_disabled then
disabled_by_player[player_name] = nil
mod_storage:set_string(player_name .. "_disabled", "")
return true, "Woodcutting is now enabled."
else
disabled_by_player[player_name] = true
mod_storage:set_string(player_name .. "_disabled", "true")
local process = woodcutting.get_process(player_name)
if process then
process:stop_process()
end
return true, "Woodcutting is now disabled."
end
end
})
minetest.register_on_joinplayer(function(player)
-- load player settings
local player_name = player:get_player_name()
if mod_storage:get_string(player_name .. "_disabled") == "true" then
disabled_by_player[player_name] = true
end
end)
minetest.register_on_leaveplayer(function(player)
local player_name = player:get_player_name()
disabled_by_player[player_name] = nil
local process = woodcutting.get_process(player_name)
if process then
process:stop_process()
end
end)

View File

@ -1 +1,2 @@
name = woodcutting name = woodcutting
description = Asynchrounus tree cutter. Mine the first tree node from a tree while the sneak key is pressed to start the woodcutting process.

View File

@ -1,3 +1,16 @@
# If enabled the woodcutting dig not connected leaves # If enabled the woodcutting dig not connected leaves
# after tree nodes removed # after tree nodes removed
woodcutting_dig_leaves (Dig leaves) bool true woodcutting_dig_leaves (Woodcutting: Dig leaves) bool true
# Apply tree nodes with this distance to the queue. 1 means touching tree nodes only
woodcutting_tree_distance (Woodcutting: Tree distance) int 1
# Do not touch leaves around non-removed trees with this distance
woodcutting_leaves_distance (Woodcutting: Leaves distance) int 2
# Allow cutting tree nodes with this maximum distance away from player
woodcutting_player_distance (Woodcutting: Player distance) int 80
# Maximum tool wear that allows cutting
woodcutting_wear_limit (Woodcutting: Wear limit) int 65535