Skip to content

Commit

Permalink
Bones mod fixes
Browse files Browse the repository at this point in the history
1. don't delete protected nodes, 2. time out in loaded chunks, 3. don't crash when dying in certain nodes (like default doors or sign_lib signs)
  • Loading branch information
t4im authored and BlockMen committed Feb 12, 2015
1 parent 047ecea commit 75ea7e3
Showing 1 changed file with 68 additions and 29 deletions.
97 changes: 68 additions & 29 deletions mods/bones/init.lua
Expand Up @@ -21,6 +21,9 @@ bones.bones_formspec =
"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 = {
Expand Down Expand Up @@ -96,23 +99,47 @@ 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
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
Expand All @@ -131,26 +158,29 @@ 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

-- 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()
Expand All @@ -171,10 +201,19 @@ minetest.register_on_dieplayer(function(player)
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)

0 comments on commit 75ea7e3

Please sign in to comment.