mirror of
https://github.com/minetest/minetest_game.git
synced 2025-06-18 08:40:20 +02:00
Beds: Add support for pova and player_monoids (#3200)
This commit is contained in:
parent
844216cbb8
commit
407087977c
@ -19,7 +19,10 @@ read_globals = {
|
||||
-- Silence errors about custom table methods.
|
||||
table = { fields = { "copy", "indexof" } },
|
||||
-- Silence warnings about accessing undefined fields of global 'math'
|
||||
math = { fields = { "sign" } }
|
||||
math = { fields = { "sign" } },
|
||||
-- Mod support
|
||||
"player_monoids",
|
||||
"pova",
|
||||
}
|
||||
|
||||
-- Overwrites minetest.handle_node_drops
|
||||
|
@ -5,6 +5,16 @@ if enable_respawn == nil then
|
||||
enable_respawn = true
|
||||
end
|
||||
|
||||
-- Physics override management mods (shadow the global variable)
|
||||
local player_monoids = core.get_modpath("player_monoids") and player_monoids
|
||||
local pova = core.get_modpath("pova") and pova
|
||||
|
||||
if player_monoids and not player_monoids.speed.checkout_branch then
|
||||
-- This function exists since 2025-05-17
|
||||
core.log("warning", "[beds] player_monoids is too old, thus not supported.")
|
||||
player_monoids = nil
|
||||
end
|
||||
|
||||
-- support for MT game translation.
|
||||
local S = beds.get_translator
|
||||
|
||||
@ -50,6 +60,51 @@ local function check_in_beds(players)
|
||||
return #players > 0
|
||||
end
|
||||
|
||||
local function set_physics_override(player, put_to_bed)
|
||||
local IDENTIFIER = "beds:lie"
|
||||
local OVERRIDES = {speed = 0, jump = 0, gravity = 0}
|
||||
|
||||
local name = player:get_player_name()
|
||||
local pdata = beds.player[name]
|
||||
|
||||
if put_to_bed then -- Freeze player
|
||||
if player_monoids then
|
||||
for k, v in pairs(OVERRIDES) do
|
||||
local monoid = player_monoids[k]
|
||||
pdata["monoid_branch_" .. k] = monoid:get_active_branch(player)
|
||||
-- Change the "context" of the physics overrides
|
||||
local branch = monoid:checkout_branch(player, IDENTIFIER)
|
||||
branch:add_change(player, v)
|
||||
end
|
||||
elseif pova then
|
||||
pova.add_override(name, "force", OVERRIDES)
|
||||
pova.do_override(player)
|
||||
else
|
||||
-- Directly use engine API. May conflict with other mods.
|
||||
pdata.physics_override = player:get_physics_override()
|
||||
player:set_physics_override(OVERRIDES)
|
||||
end
|
||||
else -- Unfreeze player
|
||||
if player_monoids then
|
||||
for k, _ in pairs(OVERRIDES) do
|
||||
local monoid = player_monoids[k]
|
||||
monoid:checkout_branch(player, pdata["monoid_branch_" .. k])
|
||||
monoid:get_branch(IDENTIFIER):delete(player)
|
||||
end
|
||||
elseif pova then
|
||||
pova.del_override(name, "force")
|
||||
pova.do_override(player)
|
||||
else
|
||||
-- Restore the changed fields
|
||||
player:set_physics_override({
|
||||
speed = pdata.physics_override.speed,
|
||||
jump = pdata.physics_override.jump,
|
||||
gravity = pdata.physics_override.gravity
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function lay_down(player, pos, bed_pos, state, skip)
|
||||
local name = player:get_player_name()
|
||||
local hud_flags = player:hud_get_flags()
|
||||
@ -72,13 +127,8 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
||||
player:set_pos(beds.pos[name])
|
||||
|
||||
-- physics, eye_offset, etc
|
||||
local physics_override = beds.player[name].physics_override
|
||||
set_physics_override(player, false)
|
||||
beds.player[name] = nil
|
||||
player:set_physics_override({
|
||||
speed = physics_override.speed,
|
||||
jump = physics_override.jump,
|
||||
gravity = physics_override.gravity
|
||||
})
|
||||
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
|
||||
player:set_look_horizontal(math.random(1, 180) / 100)
|
||||
player_api.player_attached[name] = false
|
||||
@ -112,9 +162,9 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
||||
return false
|
||||
end
|
||||
|
||||
beds.player[name] = {}
|
||||
beds.pos[name] = pos
|
||||
beds.bed_position[name] = bed_pos
|
||||
beds.player[name] = {physics_override = player:get_physics_override()}
|
||||
|
||||
local yaw, param2 = get_look_yaw(bed_pos)
|
||||
player:set_look_horizontal(yaw)
|
||||
@ -126,7 +176,7 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
||||
y = bed_pos.y + 0.07,
|
||||
z = bed_pos.z + dir.z / 2
|
||||
}
|
||||
player:set_physics_override({speed = 0, jump = 0, gravity = 0})
|
||||
set_physics_override(player, true)
|
||||
player:set_pos(p)
|
||||
player_api.player_attached[name] = true
|
||||
hud_flags.wielditem = false
|
||||
|
@ -1,3 +1,4 @@
|
||||
name = beds
|
||||
description = Minetest Game mod: beds
|
||||
depends = default, wool, spawn
|
||||
optional_depends = player_monoids, pova
|
||||
|
Loading…
x
Reference in New Issue
Block a user