From 13d9ddd52640406851e0ae05763cea21832a79e1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 31 Jan 2020 02:05:05 +0100 Subject: [PATCH] Refactor saved bed data --- mods/bed/init.lua | 106 +++++++++++++++++++++++----------------------- 1 file changed, 54 insertions(+), 52 deletions(-) diff --git a/mods/bed/init.lua b/mods/bed/init.lua index 57b7adc..5b42d8d 100644 --- a/mods/bed/init.lua +++ b/mods/bed/init.lua @@ -12,6 +12,8 @@ bed = {} -- Per-user data table bed.userdata = {} +bed.userdata.saved = {} +bed.userdata.temp = {} -- Savefile @@ -46,13 +48,13 @@ local function put_player_in_bed(player) local name = player:get_player_name() - if bed.userdata[name].slept - and not is_bed_node(bed.userdata[name].node_pos) then + if bed.userdata.temp[name].slept + and not is_bed_node(bed.userdata.temp[name].node_pos) then return end - player:set_look_horizontal(bed.userdata[name].spawn_yaw) - player:set_pos(bed.userdata[name].spawn_pos) + player:set_look_horizontal(bed.userdata.saved[name].spawn_yaw) + player:set_pos(bed.userdata.saved[name].spawn_pos) player_effects.apply_effect(player, "inbed") @@ -77,7 +79,9 @@ local function take_player_from_bed(player) 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") @@ -97,7 +101,7 @@ end local function save_bed() local f = io.open(bed_file, "w") - f:write(minetest.serialize(bed.userdata)) + f:write(minetest.serialize(bed.userdata.saved)) io.close(f) @@ -116,7 +120,7 @@ local function load_bed() local f = io.open(bed_file, "r") if f then - bed.userdata = minetest.deserialize(f:read("*all")) + bed.userdata.saved = minetest.deserialize(f:read("*all")) io.close(f) else @@ -141,39 +145,18 @@ end local function on_joinplayer(player) local name = player:get_player_name() - if not bed.userdata[name] then - bed.userdata[name] = { - in_bed = false, - + if not bed.userdata.saved[name] then + bed.userdata.saved[name] = { spawn_yaw = 0, spawn_pos = nil, - + } + end + bed.userdata.temp[name] = { + in_bed = false, slept = false, - node_pos = nil, } - - 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 + delayed_save() end -- Respawning player @@ -181,12 +164,12 @@ end local function on_respawnplayer(player) local name = player:get_player_name() - if bed.userdata[name] then - if not bed.userdata[name].slept then + if bed.userdata.temp[name] then + if not bed.userdata.temp[name].slept then return end - bed.userdata[name].in_bed = false + bed.userdata.temp[name].in_bed = false take_player_from_bed(player) @@ -207,17 +190,25 @@ local function on_globalstep(dtime) 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 local player = minetest.get_player_by_name(name) - - sleeping_players = sleeping_players + 1 - - if vector.distance(player:get_pos(), data.spawn_pos) > 2 then - player:move_to(data.spawn_pos) + if player then + table.insert(in_bed, name) + sleeping_players = sleeping_players + 1 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 player_count = #players @@ -235,8 +226,8 @@ local function on_globalstep(dtime) local players = minetest.get_connected_players() for _, player in ipairs(players) do - if bed.userdata[player:get_player_name()].in_bed then - bed.userdata[player:get_player_name()].slept = true + if bed.userdata.temp[player:get_player_name()].in_bed then + bed.userdata.temp[player:get_player_name()].slept = true end end @@ -371,13 +362,13 @@ minetest.register_node( end 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) meta:set_string("player", "") 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 minetest.chat_send_player(name, minetest.colorize("#FFFF00", S("Sleeping is disabled."))) return itemstack @@ -414,12 +405,12 @@ minetest.register_node( yaw = (node.param2 / 2.0) * math.pi end - bed.userdata[name].in_bed = true + bed.userdata.temp[name].in_bed = true - bed.userdata[name].spawn_yaw = yaw - bed.userdata[name].spawn_pos = put_pos + bed.userdata.saved[name].spawn_yaw = yaw + 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) @@ -491,4 +482,15 @@ achievements.register_achievement( 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")