"list[current_player;main;0,6.08;8,3;8]"..
default.get_hotbar_bg(0,4.85)
+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",
tiles = {
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
+ meta:set_int("time", time)
return true
end
end,
})
+local function may_replace(pos, player)
+ local node_name = minetest.get_node(pos).name
+ 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 not node_definition then
+ -- only replace nodes that are not protected
+ return not minetest.is_protected(pos, player:get_player_name())
+ end
+
+ -- 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)
if minetest.setting_getbool("creative_mode") then
return
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
- -- 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))
+ if (not may_replace(pos, player)) then
+ 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
- -- empty lists main and craft
- player_inv:set_list("main", {})
- player_inv:set_list("craft", {})
- 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()
player_inv:set_list("craft", {})
meta:set_string("formspec", bones.bones_formspec)
- 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")
+
+ 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")
+ end
end)