Refactor saved bed data
This commit is contained in:
parent
b77dfc590e
commit
13d9ddd526
@ -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")
|
||||||
|
Loading…
Reference in New Issue
Block a user