I hate to be a bother...
I figured out why the servers crash all the time now: BUT it is NOT reproducible
Code: Select all
[C]: in function 'set_hp'
...TE\bin\..\games\extreme_survival\mods\protector\init.lua:147: in function 'can_dig'
...TE\bin\..\games\extreme_survival\mods\protector\init.lua:208: in function 'is_protected'
...R-LITE\bin\..\games\extreme_survival\mods\bones\init.lua:140: in function 'may_replace'
...R-LITE\bin\..\games\extreme_survival\mods\bones\init.lua:162: in function <...R-LITE\bin\..\games\extreme_survival\mods\bones\init.lua:143>
D:\MTSERVER-LITE\bin\..\builtin\game\register.lua:355: in function <D:\MTSERVER-LITE\bin\..\builtin\game\register.lua:335>
[C]: in function 'set_hp'
...TE\bin\..\games\extreme_survival\mods\protector\init.lua:147: in function 'can_dig'
...TE\bin\..\games\extreme_survival\mods\protector\init.lua:456: in function <...TE\bin\..\games\extreme_survival\mods\protector\init.lua:455>
stack traceback:
[C]: in function 'set_hp'
...TE\bin\..\games\extreme_survival\mods\protector\init.lua:147: in function 'can_dig'
...TE\bin\..\games\extreme_survival\mods\protector\init.lua:456: in function <...TE\bin\..\games\extreme_survival\mods\protector\init.lua:455>
Your protector when someone dies their bones are not allowed to be placed or dug?
BONES PROBLEM:
Code: Select all
minetest.register_on_dieplayer(function(player)
if minetest.setting_getbool("creative_mode") then
return
end
local player_inv = player:get_inventory()
if player_inv:is_empty("main") and
player_inv:is_empty("craft") then
return
end
local pos = player:getpos()
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
local param2 = minetest.dir_to_facedir(player:get_look_dir())
local player_name = player:get_player_name()
local player_inv = player:get_inventory()
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
end
Protector Problem:
line 147 = player:set_hp(0);
Code: Select all
local positions = minetest.find_nodes_in_area(
{x = pos.x - r, y = pos.y - r, z = pos.z - r},
{x = pos.x + r, y = pos.y + r, z = pos.z + r},
{"protector:protect"})
local meta, owner, members
for _, pos in ipairs(positions) do
meta = minetest.get_meta(pos)
owner = meta:get_string("owner")
members = meta:get_string("members")
if owner ~= digger then
if onlyowner or not protector.is_member(meta, digger) then
if infolevel == 1 then
minetest.chat_send_player(digger,
"This area is owned by " .. owner .. " !")
local warn = meta:get_int("warn");local kill = meta:get_int("kill");
local player = minetest.get_player_by_name(digger);
if kill==1 then
player:set_hp(0);
minetest.after(1, function()
local inv = player:get_inventory();
inv:set_list("main", {});inv:set_list("craft", {})
end)
minetest.chat_send_player(digger, "PROTECTOR: You died inside protected area at " .. minetest.pos_to_string(pos) .. ". Next time try not to dig or hit players.");
return false end
if warn==1 then
local form = "size [2,2] textarea[0,0;2.7,2;help;WARNING;This area belongs to " .. meta:get_string("owner") .."]" ..
"button_exit[0.5,1.5;1.5,1;close;Close]"
minetest.show_formspec(digger, "protector_warn", form)
return false
end
elseif infolevel == 2 then
minetest.chat_send_player(digger,
"This area is owned by " .. owner .. ".")
minetest.chat_send_player(digger,
"Protection located at: " .. minetest.pos_to_string(pos) .. ", upgrade price was " .. meta:get_int("cost") .. ", protector count is " .. meta:get_int("count"))
if members ~= "" then
minetest.chat_send_player(digger,
"Members: " .. members .. ".")
end
end
return false
end
end
and protector line 208:
Code: Select all
if not protector.can_dig(protector.radius, pos, digger, false, 1) then
return true
end
return protector.old_is_protected(pos, digger)
end