@@ -5,6 +5,16 @@ if enable_respawn == nil then
55 enable_respawn = true
66end
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.
919local S = beds .get_translator
1020
@@ -50,6 +60,51 @@ local function check_in_beds(players)
5060 return # players > 0
5161end
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+
53108local 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
0 commit comments