From edced4d7ab48b302910d2cc59678f840ce6e3b63 Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 27 Dec 2014 16:46:03 +0100 Subject: [PATCH 1/8] prevent bones from deleting protected nodes (except air and liquids) --- mods/bones/init.lua | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 0f762573..f062260f 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -101,6 +101,25 @@ minetest.register_node("bones:bones", { end, }) +local function may_replace(pos, player) + local nodename = minetest.get_node(pos).name + print(nodename) + + -- allow replacing air and liquids + if nodename == "air" or minetest.registered_nodes[nodename].liquidtype ~= "none" then + return true + end + + -- don't replace filled chests and other nodes that don't allow it + if minetest.registered_nodes[nodename].can_dig and + not minetest.registered_nodes[nodename].can_dig(pos, player) then + return false + end + + -- only replace nodes that are not protected + return not minetest.is_protected(pos, player:get_player_name()) +end + minetest.register_on_dieplayer(function(player) if minetest.setting_getbool("creative_mode") then return @@ -119,11 +138,8 @@ minetest.register_on_dieplayer(function(player) local param2 = minetest.dir_to_facedir(player:get_look_dir()) local player_name = player:get_player_name() local player_inv = player:get_inventory() - - local nn = minetest.get_node(pos).name - if minetest.registered_nodes[nn].can_dig and - not minetest.registered_nodes[nn].can_dig(pos, player) then + if (not may_replace(pos, player)) then -- drop items instead of delete for i=1,player_inv:get_size("main") do minetest.add_item(pos, player_inv:get_stack("main", i)) @@ -137,8 +153,7 @@ minetest.register_on_dieplayer(function(player) return end - minetest.dig_node(pos) - minetest.add_node(pos, {name="bones:bones", param2=param2}) + minetest.set_node(pos, {name="bones:bones", param2=param2}) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() From b8f088a00e432113c1038ca7c20113519f793b53 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 30 Dec 2014 04:38:58 +0100 Subject: [PATCH 2/8] remove overlooked debugstatement --- mods/bones/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index f062260f..3c24bfa0 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -103,7 +103,6 @@ minetest.register_node("bones:bones", { local function may_replace(pos, player) local nodename = minetest.get_node(pos).name - print(nodename) -- allow replacing air and liquids if nodename == "air" or minetest.registered_nodes[nodename].liquidtype ~= "none" then From 97d73f73585a1a74fdbee4399916ec80150b68d5 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 30 Dec 2014 05:07:14 +0100 Subject: [PATCH 3/8] try placing the bones farther up first before escalating to drop the items this should solve most cases of protection related deaths in which players dig straight down --- mods/bones/init.lua | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 3c24bfa0..49f823c3 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -139,17 +139,24 @@ minetest.register_on_dieplayer(function(player) local player_inv = player:get_inventory() if (not may_replace(pos, player)) then - -- drop items instead of delete - for i=1,player_inv:get_size("main") do - minetest.add_item(pos, player_inv:get_stack("main", i)) + if (may_replace({x=pos.x, y=pos.y+1, z=pos.z}, player)) then + -- drop one node above if there's space + -- this should solve most cases of protection related deaths in which players dig straight down + -- yet keeps the bones reachable + pos.y = pos.y+1 + else + -- drop items instead of delete + for i=1,player_inv:get_size("main") do + minetest.add_item(pos, player_inv:get_stack("main", i)) + end + for i=1,player_inv:get_size("craft") do + minetest.add_item(pos, player_inv:get_stack("craft", i)) + end + -- empty lists main and craft + player_inv:set_list("main", {}) + player_inv:set_list("craft", {}) + return end - for i=1,player_inv:get_size("craft") do - minetest.add_item(pos, player_inv:get_stack("craft", i)) - end - -- empty lists main and craft - player_inv:set_list("main", {}) - player_inv:set_list("craft", {}) - return end minetest.set_node(pos, {name="bones:bones", param2=param2}) From b4777f0394cdc003621f5cbda270d2de74ecd0be Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 30 Dec 2014 15:25:43 +0100 Subject: [PATCH 4/8] correct node definition referencing --- mods/bones/init.lua | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 49f823c3..ae72d897 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -102,17 +102,23 @@ minetest.register_node("bones:bones", { }) local function may_replace(pos, player) - local nodename = minetest.get_node(pos).name + local node_name = minetest.get_node(pos).name + local node_definition = minetest.registered_nodes[node_name] - -- allow replacing air and liquids - if nodename == "air" or minetest.registered_nodes[nodename].liquidtype ~= "none" then - return true - end + -- if the node is unknown, we let the protection mod decide + -- unknown decoration would often be removed + -- while unknown building materials in use would usually be left + if node_definition then + -- allow replacing air and liquids + if node_name == "air" or node_definition.liquidtype ~= "none" then + return true + end - -- don't replace filled chests and other nodes that don't allow it - if minetest.registered_nodes[nodename].can_dig and - not minetest.registered_nodes[nodename].can_dig(pos, player) then - return false + -- don't replace filled chests and other nodes that don't allow it + local can_dig_func = node_definition.can_dig + if can_dig_func and not can_dig_func(pos, player) then + return false + end end -- only replace nodes that are not protected From d3a165d21b5fa3247a039cc5dcf427b4199e988e Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 31 Dec 2014 04:44:32 +0100 Subject: [PATCH 5/8] optimize timer of bones --- mods/bones/init.lua | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index ae72d897..214013f8 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -9,6 +9,8 @@ local function is_owner(pos, name) return false end +local share_bones_time = tonumber(minetest.setting_get("share_bones_time") or 1200) + minetest.register_node("bones:bones", { description = "Bones", tiles = { @@ -84,15 +86,8 @@ minetest.register_node("bones:bones", { on_timer = function(pos, elapsed) local meta = minetest.get_meta(pos) - local time = meta:get_int("time")+elapsed - local publish = 1200 - if tonumber(minetest.setting_get("share_bones_time")) then - publish = tonumber(minetest.setting_get("share_bones_time")) - end - if publish == 0 then - return - end - if time >= publish then + local time = meta:get_int("time") + elapsed + if time >= share_bones_time then meta:set_string("infotext", meta:get_string("owner").."'s old bones") meta:set_string("owner", "") else @@ -188,10 +183,13 @@ minetest.register_on_dieplayer(function(player) meta:set_string("formspec", "size[8,9;]".. "list[current_name;main;0,0;8,4;]".. "list[current_player;main;0,5;8,4;]") - meta:set_string("infotext", player_name.."'s fresh bones") meta:set_string("owner", player_name) - meta:set_int("time", 0) - local timer = minetest.get_node_timer(pos) - timer:start(10) + if share_bones_time ~= 0 then + meta:set_string("infotext", player_name.."'s fresh bones") + meta:set_int("time", 0) + minetest.get_node_timer(pos):start(10) + else + meta:set_string("infotext", player_name.."'s bones") + end end) From 26349eaa8ac019dc4b9085a1580780ee2dc06ba4 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 31 Dec 2014 04:46:41 +0100 Subject: [PATCH 6/8] fix old bug of bones never timing out in loaded chunks --- mods/bones/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 214013f8..c4f2a1c9 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -91,6 +91,7 @@ minetest.register_node("bones:bones", { meta:set_string("infotext", meta:get_string("owner").."'s old bones") meta:set_string("owner", "") else + meta:set_int("time", time) return true end end, From fc1df1194fb2eb03db34507b355ba47299d1e2cb Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 31 Dec 2014 05:25:27 +0100 Subject: [PATCH 7/8] timeout bones on protected terrain faster (configurable, defaulting to a fourth of the usual time) --- mods/bones/init.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index c4f2a1c9..5746f9bc 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -10,6 +10,7 @@ local function is_owner(pos, name) end local share_bones_time = tonumber(minetest.setting_get("share_bones_time") or 1200) +local share_bones_time_early = tonumber(minetest.setting_get("share_bones_time_early") or (share_bones_time/4)) minetest.register_node("bones:bones", { description = "Bones", @@ -188,7 +189,13 @@ minetest.register_on_dieplayer(function(player) if share_bones_time ~= 0 then meta:set_string("infotext", player_name.."'s fresh bones") - meta:set_int("time", 0) + + if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then + meta:set_int("time", 0) + else + meta:set_int("time", (share_bones_time - share_bones_time_early)) + end + minetest.get_node_timer(pos):start(10) else meta:set_string("infotext", player_name.."'s bones") From 650c76a90d8dc9a74fdc1221adf2dd64832e7491 Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 10 Jan 2015 17:09:03 +0100 Subject: [PATCH 8/8] take buidable_to into account, and make it the default decision if bones would be about to replace it --- mods/bones/init.lua | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 5746f9bc..80214e1f 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -103,23 +103,29 @@ local function may_replace(pos, player) local node_definition = minetest.registered_nodes[node_name] -- if the node is unknown, we let the protection mod decide + -- this is consistent with when a player could dig or not dig it -- unknown decoration would often be removed -- while unknown building materials in use would usually be left - if node_definition then - -- allow replacing air and liquids - if node_name == "air" or node_definition.liquidtype ~= "none" then - return true - end - - -- don't replace filled chests and other nodes that don't allow it - local can_dig_func = node_definition.can_dig - if can_dig_func and not can_dig_func(pos, player) then - return false - end + if not node_definition then + -- only replace nodes that are not protected + return not minetest.is_protected(pos, player:get_player_name()) end - -- only replace nodes that are not protected - return not minetest.is_protected(pos, player:get_player_name()) + -- allow replacing air and liquids + if node_name == "air" or node_definition.liquidtype ~= "none" then + return true + end + + -- don't replace filled chests and other nodes that don't allow it + local can_dig_func = node_definition.can_dig + if can_dig_func and not can_dig_func(pos, player) then + return false + end + + -- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones? + -- flowers being squished by bones are more realistical than a squished stone, too + -- exception are of course any protected buildable_to + return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name()) end minetest.register_on_dieplayer(function(player)