Skip to content

Commit 4070879

Browse files
authored
Beds: Add support for pova and player_monoids (#3200)
1 parent 844216c commit 4070879

File tree

3 files changed

+63
-9
lines changed

3 files changed

+63
-9
lines changed

.luacheckrc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ read_globals = {
1919
-- Silence errors about custom table methods.
2020
table = { fields = { "copy", "indexof" } },
2121
-- Silence warnings about accessing undefined fields of global 'math'
22-
math = { fields = { "sign" } }
22+
math = { fields = { "sign" } },
23+
-- Mod support
24+
"player_monoids",
25+
"pova",
2326
}
2427

2528
-- Overwrites minetest.handle_node_drops

mods/beds/functions.lua

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@ if enable_respawn == nil then
55
enable_respawn = true
66
end
77

8+
-- Physics override management mods (shadow the global variable)
9+
local player_monoids = core.get_modpath("player_monoids") and player_monoids
10+
local pova = core.get_modpath("pova") and pova
11+
12+
if player_monoids and not player_monoids.speed.checkout_branch then
13+
-- This function exists since 2025-05-17
14+
core.log("warning", "[beds] player_monoids is too old, thus not supported.")
15+
player_monoids = nil
16+
end
17+
818
-- support for MT game translation.
919
local S = beds.get_translator
1020

@@ -50,6 +60,51 @@ local function check_in_beds(players)
5060
return #players > 0
5161
end
5262

63+
local function set_physics_override(player, put_to_bed)
64+
local IDENTIFIER = "beds:lie"
65+
local OVERRIDES = {speed = 0, jump = 0, gravity = 0}
66+
67+
local name = player:get_player_name()
68+
local pdata = beds.player[name]
69+
70+
if put_to_bed then -- Freeze player
71+
if player_monoids then
72+
for k, v in pairs(OVERRIDES) do
73+
local monoid = player_monoids[k]
74+
pdata["monoid_branch_" .. k] = monoid:get_active_branch(player)
75+
-- Change the "context" of the physics overrides
76+
local branch = monoid:checkout_branch(player, IDENTIFIER)
77+
branch:add_change(player, v)
78+
end
79+
elseif pova then
80+
pova.add_override(name, "force", OVERRIDES)
81+
pova.do_override(player)
82+
else
83+
-- Directly use engine API. May conflict with other mods.
84+
pdata.physics_override = player:get_physics_override()
85+
player:set_physics_override(OVERRIDES)
86+
end
87+
else -- Unfreeze player
88+
if player_monoids then
89+
for k, _ in pairs(OVERRIDES) do
90+
local monoid = player_monoids[k]
91+
monoid:checkout_branch(player, pdata["monoid_branch_" .. k])
92+
monoid:get_branch(IDENTIFIER):delete(player)
93+
end
94+
elseif pova then
95+
pova.del_override(name, "force")
96+
pova.do_override(player)
97+
else
98+
-- Restore the changed fields
99+
player:set_physics_override({
100+
speed = pdata.physics_override.speed,
101+
jump = pdata.physics_override.jump,
102+
gravity = pdata.physics_override.gravity
103+
})
104+
end
105+
end
106+
end
107+
53108
local function lay_down(player, pos, bed_pos, state, skip)
54109
local name = player:get_player_name()
55110
local hud_flags = player:hud_get_flags()
@@ -72,13 +127,8 @@ local function lay_down(player, pos, bed_pos, state, skip)
72127
player:set_pos(beds.pos[name])
73128

74129
-- physics, eye_offset, etc
75-
local physics_override = beds.player[name].physics_override
130+
set_physics_override(player, false)
76131
beds.player[name] = nil
77-
player:set_physics_override({
78-
speed = physics_override.speed,
79-
jump = physics_override.jump,
80-
gravity = physics_override.gravity
81-
})
82132
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
83133
player:set_look_horizontal(math.random(1, 180) / 100)
84134
player_api.player_attached[name] = false
@@ -112,9 +162,9 @@ local function lay_down(player, pos, bed_pos, state, skip)
112162
return false
113163
end
114164

165+
beds.player[name] = {}
115166
beds.pos[name] = pos
116167
beds.bed_position[name] = bed_pos
117-
beds.player[name] = {physics_override = player:get_physics_override()}
118168

119169
local yaw, param2 = get_look_yaw(bed_pos)
120170
player:set_look_horizontal(yaw)
@@ -126,7 +176,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
126176
y = bed_pos.y + 0.07,
127177
z = bed_pos.z + dir.z / 2
128178
}
129-
player:set_physics_override({speed = 0, jump = 0, gravity = 0})
179+
set_physics_override(player, true)
130180
player:set_pos(p)
131181
player_api.player_attached[name] = true
132182
hud_flags.wielditem = false

mods/beds/mod.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
name = beds
22
description = Minetest Game mod: beds
33
depends = default, wool, spawn
4+
optional_depends = player_monoids, pova

0 commit comments

Comments
 (0)