mirror of
https://github.com/luanti-org/minetest_game.git
synced 2025-05-20 22:33:16 -04:00
Add option 'enable_bed_in_the_daytime' and 'bed_night_skip_above_percent'
This commit is contained in:
parent
92701885d0
commit
258b52b906
2 changed files with 46 additions and 11 deletions
|
@ -19,12 +19,18 @@ This mod adds a bed to Minetest which allows players to skip the night.
|
||||||
To sleep, right click on the bed. If playing in singleplayer mode the night gets skipped
|
To sleep, right click on the bed. If playing in singleplayer mode the night gets skipped
|
||||||
immediately. If playing multiplayer you get shown how many other players are in bed too,
|
immediately. If playing multiplayer you get shown how many other players are in bed too,
|
||||||
if all players are sleeping the night gets skipped. The night skip can be forced if more
|
if all players are sleeping the night gets skipped. The night skip can be forced if more
|
||||||
than half of the players are lying in bed and use this option.
|
than 50 percent of the players are lying in bed and use this option. You can change the
|
||||||
|
percent value by setting "bed_night_skip_above_percent = <n>" in minetest.conf.
|
||||||
|
|
||||||
|
|
||||||
Another feature is a controlled respawning. If you have slept in bed (not just lying in
|
Another feature is a controlled respawning. If you have slept in bed (not just lying in
|
||||||
it) your respawn point is set to the beds location and you will respawn there after
|
it) your respawn point is set to the beds location and you will respawn there after
|
||||||
death.
|
death.
|
||||||
|
|
||||||
You can disable the respawn at beds by setting "enable_bed_respawn = false" in
|
You can disable the respawn at beds by setting "enable_bed_respawn = false" in
|
||||||
minetest.conf.
|
minetest.conf.
|
||||||
You can disable the night skip feature by setting "enable_bed_night_skip = false" in
|
You can disable the night skip feature by setting "enable_bed_night_skip = false" in
|
||||||
minetest.conf or by using the /set command in-game.
|
minetest.conf or by using the /set command in-game.
|
||||||
|
|
||||||
|
You can enable the bed in the daytime by setting "enable_bed_in_the_daytime = yes" in
|
||||||
|
minetest.conf. Then the players stay in bed.
|
||||||
|
|
|
@ -5,6 +5,8 @@ if enable_respawn == nil then
|
||||||
enable_respawn = true
|
enable_respawn = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local enable_bed_in_the_daytime = minetest.settings:get_bool("enable_bed_in_the_daytime")
|
||||||
|
|
||||||
-- support for MT game translation.
|
-- support for MT game translation.
|
||||||
local S = beds.get_translator
|
local S = beds.get_translator
|
||||||
|
|
||||||
|
@ -34,6 +36,11 @@ local function is_night_skip_enabled()
|
||||||
return enable_night_skip
|
return enable_night_skip
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function is_night()
|
||||||
|
local tod = minetest.get_timeofday()
|
||||||
|
return not (tod > 0.2 and tod < 0.805)
|
||||||
|
end
|
||||||
|
|
||||||
local function check_in_beds(players)
|
local function check_in_beds(players)
|
||||||
local in_bed = beds.player
|
local in_bed = beds.player
|
||||||
if not players then
|
if not players then
|
||||||
|
@ -146,19 +153,28 @@ local function get_player_in_bed_count()
|
||||||
return c
|
return c
|
||||||
end
|
end
|
||||||
|
|
||||||
local function update_formspecs(finished)
|
local function is_above_percent(player_in_bed)
|
||||||
|
-- default: 50, range: 0..99
|
||||||
|
local above_percent = math.min(tonumber(minetest.settings:get("bed_night_skip_above_percent")) or 50, 99);
|
||||||
|
|
||||||
|
return (#minetest.get_connected_players() * above_percent / 100) < player_in_bed
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_formspecs(force_morning)
|
||||||
local ges = #minetest.get_connected_players()
|
local ges = #minetest.get_connected_players()
|
||||||
local player_in_bed = get_player_in_bed_count()
|
local player_in_bed = get_player_in_bed_count()
|
||||||
local is_majority = (ges / 2) < player_in_bed
|
local tod = minetest.get_timeofday()
|
||||||
|
|
||||||
local form_n
|
local form_n
|
||||||
local esc = minetest.formspec_escape
|
local esc = minetest.formspec_escape
|
||||||
if finished then
|
if force_morning or (tod >= 0.23 and tod <= 0.375) then -- <= ~9:00
|
||||||
form_n = beds.formspec .. "label[2.7,9;" .. esc(S("Good morning.")) .. "]"
|
form_n = beds.formspec .. "label[2.7,9;" .. esc(S("Good morning.")) .. "]"
|
||||||
|
elseif not is_night() then
|
||||||
|
form_n = beds.formspec .. "label[2.7,9;" .. esc(S("Wake up!")) .. "]"
|
||||||
else
|
else
|
||||||
form_n = beds.formspec .. "label[2.2,9;" ..
|
form_n = beds.formspec .. "label[2.2,9;" ..
|
||||||
esc(S("@1 of @2 players are in bed", player_in_bed, ges)) .. "]"
|
esc(S("@1 of @2 players are in bed", player_in_bed, ges)) .. "]"
|
||||||
if is_majority and is_night_skip_enabled() then
|
if is_above_percent(player_in_bed) and is_night_skip_enabled() then
|
||||||
form_n = form_n .. "button_exit[2,6;4,0.75;force;" ..
|
form_n = form_n .. "button_exit[2,6;4,0.75;force;" ..
|
||||||
esc(S("Force night skip")) .. "]"
|
esc(S("Force night skip")) .. "]"
|
||||||
end
|
end
|
||||||
|
@ -169,10 +185,21 @@ local function update_formspecs(finished)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function update_formspecs_loop()
|
||||||
|
if is_sp or get_player_in_bed_count() < 1 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
update_formspecs(false)
|
||||||
|
minetest.after(2, update_formspecs_loop)
|
||||||
|
end
|
||||||
|
|
||||||
-- Public functions
|
-- Public functions
|
||||||
|
|
||||||
function beds.kick_players()
|
function beds.kick_players()
|
||||||
|
if enable_bed_in_the_daytime then
|
||||||
|
update_formspecs(false)
|
||||||
|
return
|
||||||
|
end
|
||||||
for name, _ in pairs(beds.player) do
|
for name, _ in pairs(beds.player) do
|
||||||
local player = minetest.get_player_by_name(name)
|
local player = minetest.get_player_by_name(name)
|
||||||
lay_down(player, nil, nil, false)
|
lay_down(player, nil, nil, false)
|
||||||
|
@ -186,9 +213,8 @@ end
|
||||||
function beds.on_rightclick(pos, player)
|
function beds.on_rightclick(pos, player)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
local ppos = player:get_pos()
|
local ppos = player:get_pos()
|
||||||
local tod = minetest.get_timeofday()
|
|
||||||
|
|
||||||
if tod > 0.2 and tod < 0.805 then
|
if not is_night() and not enable_bed_in_the_daytime then
|
||||||
if beds.player[name] then
|
if beds.player[name] then
|
||||||
lay_down(player, nil, nil, false)
|
lay_down(player, nil, nil, false)
|
||||||
end
|
end
|
||||||
|
@ -206,10 +232,14 @@ function beds.on_rightclick(pos, player)
|
||||||
|
|
||||||
if not is_sp then
|
if not is_sp then
|
||||||
update_formspecs(false)
|
update_formspecs(false)
|
||||||
|
if enable_bed_in_the_daytime then
|
||||||
|
-- update formspecs for day sleepers
|
||||||
|
minetest.after(2, update_formspecs_loop)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- skip the night and let all players stand up
|
-- skip the night and let all players stand up
|
||||||
if check_in_beds() then
|
if is_night() and check_in_beds() then
|
||||||
minetest.after(2, function()
|
minetest.after(2, function()
|
||||||
if not is_sp then
|
if not is_sp then
|
||||||
update_formspecs(is_night_skip_enabled())
|
update_formspecs(is_night_skip_enabled())
|
||||||
|
@ -250,7 +280,7 @@ minetest.register_on_leaveplayer(function(player)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
lay_down(player, nil, nil, false, true)
|
lay_down(player, nil, nil, false, true)
|
||||||
beds.player[name] = nil
|
beds.player[name] = nil
|
||||||
if check_in_beds() then
|
if is_night() and check_in_beds() then
|
||||||
minetest.after(2, function()
|
minetest.after(2, function()
|
||||||
update_formspecs(is_night_skip_enabled())
|
update_formspecs(is_night_skip_enabled())
|
||||||
if is_night_skip_enabled() then
|
if is_night_skip_enabled() then
|
||||||
|
@ -290,8 +320,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
end
|
end
|
||||||
|
|
||||||
if fields.force then
|
if fields.force then
|
||||||
local is_majority = (#minetest.get_connected_players() / 2) < last_player_in_bed
|
if is_above_percent(last_player_in_bed) and is_night_skip_enabled() then
|
||||||
if is_majority and is_night_skip_enabled() then
|
|
||||||
update_formspecs(true)
|
update_formspecs(true)
|
||||||
beds.skip_night()
|
beds.skip_night()
|
||||||
beds.kick_players()
|
beds.kick_players()
|
||||||
|
|
Loading…
Add table
Reference in a new issue