Refactor saved bed data

This commit is contained in:
Wuzzy 2020-01-31 02:05:05 +01:00
parent b77dfc590e
commit 13d9ddd526

View File

@ -12,6 +12,8 @@ bed = {}
-- Per-user data table -- Per-user data table
bed.userdata = {} bed.userdata = {}
bed.userdata.saved = {}
bed.userdata.temp = {}
-- Savefile -- Savefile
@ -46,13 +48,13 @@ local function put_player_in_bed(player)
local name = player:get_player_name() local name = player:get_player_name()
if bed.userdata[name].slept if bed.userdata.temp[name].slept
and not is_bed_node(bed.userdata[name].node_pos) then and not is_bed_node(bed.userdata.temp[name].node_pos) then
return return
end end
player:set_look_horizontal(bed.userdata[name].spawn_yaw) player:set_look_horizontal(bed.userdata.saved[name].spawn_yaw)
player:set_pos(bed.userdata[name].spawn_pos) player:set_pos(bed.userdata.saved[name].spawn_pos)
player_effects.apply_effect(player, "inbed") player_effects.apply_effect(player, "inbed")
@ -77,7 +79,9 @@ local function take_player_from_bed(player)
local name = player:get_player_name() local name = player:get_player_name()
player:set_pos(bed.userdata[name].spawn_pos) if bed.userdata.saved[name].spawn_pos then
player:set_pos(bed.userdata.saved[name].spawn_pos)
end
player_effects.remove_effect(player, "inbed") player_effects.remove_effect(player, "inbed")
@ -97,7 +101,7 @@ end
local function save_bed() local function save_bed()
local f = io.open(bed_file, "w") local f = io.open(bed_file, "w")
f:write(minetest.serialize(bed.userdata)) f:write(minetest.serialize(bed.userdata.saved))
io.close(f) io.close(f)
@ -116,7 +120,7 @@ local function load_bed()
local f = io.open(bed_file, "r") local f = io.open(bed_file, "r")
if f then if f then
bed.userdata = minetest.deserialize(f:read("*all")) bed.userdata.saved = minetest.deserialize(f:read("*all"))
io.close(f) io.close(f)
else else
@ -141,39 +145,18 @@ end
local function on_joinplayer(player) local function on_joinplayer(player)
local name = player:get_player_name() local name = player:get_player_name()
if not bed.userdata[name] then if not bed.userdata.saved[name] then
bed.userdata[name] = { bed.userdata.saved[name] = {
in_bed = false,
spawn_yaw = 0, spawn_yaw = 0,
spawn_pos = nil, spawn_pos = nil,
}
end
bed.userdata.temp[name] = {
in_bed = false,
slept = false, slept = false,
node_pos = nil, node_pos = nil,
} }
delayed_save()
delayed_save()
end
if bed.userdata[name].in_bed then
minetest.after(
0.1,
function(player)
if player and player:is_player() then
local name = player:get_player_name()
bed.userdata[name].in_bed = false
local n = minetest.get_node(bed.userdata[name].node_pos)
if n.name == "bed:bed_foot" then
local meta = minetest.get_meta(bed.userdata[name].node_pos)
if meta:get_string("player") == name then
meta:set_string("player", "")
end
end
take_player_from_bed(player)
end
end, player)
end
end end
-- Respawning player -- Respawning player
@ -181,12 +164,12 @@ end
local function on_respawnplayer(player) local function on_respawnplayer(player)
local name = player:get_player_name() local name = player:get_player_name()
if bed.userdata[name] then if bed.userdata.temp[name] then
if not bed.userdata[name].slept then if not bed.userdata.temp[name].slept then
return return
end end
bed.userdata[name].in_bed = false bed.userdata.temp[name].in_bed = false
take_player_from_bed(player) take_player_from_bed(player)
@ -207,17 +190,25 @@ local function on_globalstep(dtime)
local sleeping_players = 0 local sleeping_players = 0
for name, data in pairs(bed.userdata) do local in_bed = {}
for name, data in pairs(bed.userdata.temp) do
if data.in_bed then if data.in_bed then
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
if player then
sleeping_players = sleeping_players + 1 table.insert(in_bed, name)
sleeping_players = sleeping_players + 1
if vector.distance(player:get_pos(), data.spawn_pos) > 2 then
player:move_to(data.spawn_pos)
end end
end end
end end
for p=1, #in_bed do
local data = bed.userdata.saved[in_bed[p]]
if data then
local player = minetest.get_player_by_name(in_bed[p])
if vector.distance(player:get_pos(), data.spawn_pos) > 2 then
player:move_to(data.spawn_pos)
end
end
end
local players = minetest.get_connected_players() local players = minetest.get_connected_players()
local player_count = #players local player_count = #players
@ -235,8 +226,8 @@ local function on_globalstep(dtime)
local players = minetest.get_connected_players() local players = minetest.get_connected_players()
for _, player in ipairs(players) do for _, player in ipairs(players) do
if bed.userdata[player:get_player_name()].in_bed then if bed.userdata.temp[player:get_player_name()].in_bed then
bed.userdata[player:get_player_name()].slept = true bed.userdata.temp[player:get_player_name()].slept = true
end end
end end
@ -371,13 +362,13 @@ minetest.register_node(
end end
if name == meta:get_string("player") then if name == meta:get_string("player") then
bed.userdata[name].in_bed = false bed.userdata.temp[name].in_bed = false
take_player_from_bed(clicker) take_player_from_bed(clicker)
meta:set_string("player", "") meta:set_string("player", "")
elseif meta:get_string("player") == "" and not default.player_attached[name] elseif meta:get_string("player") == "" and not default.player_attached[name]
and bed.userdata[name].in_bed == false then and bed.userdata.temp[name].in_bed == false then
if not minetest.settings:get_bool("bed_enable", true) then if not minetest.settings:get_bool("bed_enable", true) then
minetest.chat_send_player(name, minetest.colorize("#FFFF00", S("Sleeping is disabled."))) minetest.chat_send_player(name, minetest.colorize("#FFFF00", S("Sleeping is disabled.")))
return itemstack return itemstack
@ -414,12 +405,12 @@ minetest.register_node(
yaw = (node.param2 / 2.0) * math.pi yaw = (node.param2 / 2.0) * math.pi
end end
bed.userdata[name].in_bed = true bed.userdata.temp[name].in_bed = true
bed.userdata[name].spawn_yaw = yaw bed.userdata.saved[name].spawn_yaw = yaw
bed.userdata[name].spawn_pos = put_pos bed.userdata.saved[name].spawn_pos = put_pos
bed.userdata[name].node_pos = pos bed.userdata.temp[name].node_pos = pos
put_player_in_bed(clicker) put_player_in_bed(clicker)
@ -491,4 +482,15 @@ achievements.register_achievement(
craftitem = "bed:bed_foot", craftitem = "bed:bed_foot",
}) })
minetest.register_lbm({
label = "Reset beds",
name = "bed:reset_beds",
nodenames = {"bed:bed_foot"},
run_at_every_load = true,
action = function(pos, node)
local meta = minetest.get_meta(pos)
meta:set_string("player", "")
end,
})
default.log("mod:bed", "loaded") default.log("mod:bed", "loaded")