forked from minetest/minetest_game
Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
69b2fb7a32 | |||
407087977c | |||
844216cbb8 | |||
05d5461a41 | |||
9321c265b6 | |||
0351c66915 | |||
a6bf9dd526 | |||
838ad60ad0 | |||
c6fabe4734 |
10
.github/workflows/test.yml
vendored
10
.github/workflows/test.yml
vendored
@ -1,11 +1,19 @@
|
|||||||
name: test
|
name: Test
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
cfg:
|
||||||
|
- { image: 'ghcr.io/minetest/minetest:5.9.0' }
|
||||||
|
- { image: 'ghcr.io/minetest/minetest:5.10.0' }
|
||||||
|
- { image: 'ghcr.io/luanti-org/luanti:master' } # latest git
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- run: ./utils/test/run.sh
|
- run: ./utils/test/run.sh
|
||||||
|
env:
|
||||||
|
DOCKER_IMAGE: "${{ matrix.cfg.image }}"
|
||||||
|
@ -19,7 +19,10 @@ read_globals = {
|
|||||||
-- Silence errors about custom table methods.
|
-- Silence errors about custom table methods.
|
||||||
table = { fields = { "copy", "indexof" } },
|
table = { fields = { "copy", "indexof" } },
|
||||||
-- Silence warnings about accessing undefined fields of global 'math'
|
-- 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
|
-- Overwrites minetest.handle_node_drops
|
||||||
|
@ -5,6 +5,16 @@ if enable_respawn == nil then
|
|||||||
enable_respawn = true
|
enable_respawn = true
|
||||||
end
|
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.
|
-- support for MT game translation.
|
||||||
local S = beds.get_translator
|
local S = beds.get_translator
|
||||||
|
|
||||||
@ -50,6 +60,51 @@ local function check_in_beds(players)
|
|||||||
return #players > 0
|
return #players > 0
|
||||||
end
|
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 function lay_down(player, pos, bed_pos, state, skip)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
local hud_flags = player:hud_get_flags()
|
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])
|
player:set_pos(beds.pos[name])
|
||||||
|
|
||||||
-- physics, eye_offset, etc
|
-- physics, eye_offset, etc
|
||||||
local physics_override = beds.player[name].physics_override
|
set_physics_override(player, false)
|
||||||
beds.player[name] = nil
|
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_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
|
||||||
player:set_look_horizontal(math.random(1, 180) / 100)
|
player:set_look_horizontal(math.random(1, 180) / 100)
|
||||||
player_api.player_attached[name] = false
|
player_api.player_attached[name] = false
|
||||||
@ -112,9 +162,9 @@ local function lay_down(player, pos, bed_pos, state, skip)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
beds.player[name] = {}
|
||||||
beds.pos[name] = pos
|
beds.pos[name] = pos
|
||||||
beds.bed_position[name] = bed_pos
|
beds.bed_position[name] = bed_pos
|
||||||
beds.player[name] = {physics_override = player:get_physics_override()}
|
|
||||||
|
|
||||||
local yaw, param2 = get_look_yaw(bed_pos)
|
local yaw, param2 = get_look_yaw(bed_pos)
|
||||||
player:set_look_horizontal(yaw)
|
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,
|
y = bed_pos.y + 0.07,
|
||||||
z = bed_pos.z + dir.z / 2
|
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:set_pos(p)
|
||||||
player_api.player_attached[name] = true
|
player_api.player_attached[name] = true
|
||||||
hud_flags.wielditem = false
|
hud_flags.wielditem = false
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
name = beds
|
name = beds
|
||||||
description = Minetest Game mod: beds
|
description = Minetest Game mod: beds
|
||||||
depends = default, wool, spawn
|
depends = default, wool, spawn
|
||||||
|
optional_depends = player_monoids, pova
|
||||||
|
@ -41,15 +41,9 @@ end
|
|||||||
function carts:is_rail(pos, railtype)
|
function carts:is_rail(pos, railtype)
|
||||||
local node = minetest.get_node(pos).name
|
local node = minetest.get_node(pos).name
|
||||||
if node == "ignore" then
|
if node == "ignore" then
|
||||||
local vm = minetest.get_voxel_manip()
|
-- we really need to know, so load it
|
||||||
local emin, emax = vm:read_from_map(pos, pos)
|
minetest.load_area(pos)
|
||||||
local area = VoxelArea:new{
|
node = minetest.get_node(pos).name
|
||||||
MinEdge = emin,
|
|
||||||
MaxEdge = emax,
|
|
||||||
}
|
|
||||||
local data = vm:get_data()
|
|
||||||
local vi = area:indexp(pos)
|
|
||||||
node = minetest.get_name_from_content_id(data[vi])
|
|
||||||
end
|
end
|
||||||
if minetest.get_item_group(node, "rail") == 0 then
|
if minetest.get_item_group(node, "rail") == 0 then
|
||||||
return false
|
return false
|
||||||
|
@ -124,6 +124,11 @@ function creative.update_creative_inventory(player_name, tab_content)
|
|||||||
inv.size = #creative_list
|
inv.size = #creative_list
|
||||||
end
|
end
|
||||||
|
|
||||||
|
minetest.register_on_leaveplayer(function(player)
|
||||||
|
local name = player:get_player_name()
|
||||||
|
player_inventory[name] = nil
|
||||||
|
end)
|
||||||
|
|
||||||
-- Create the trash field
|
-- Create the trash field
|
||||||
local trash = minetest.create_detached_inventory("trash", {
|
local trash = minetest.create_detached_inventory("trash", {
|
||||||
-- Allow the stack to be placed and remove it in on_put()
|
-- Allow the stack to be placed and remove it in on_put()
|
||||||
|
@ -645,10 +645,11 @@ minetest.register_abm({
|
|||||||
-- Snow check is cheapest, so comes first
|
-- Snow check is cheapest, so comes first
|
||||||
if name == "default:snow" then
|
if name == "default:snow" then
|
||||||
minetest.set_node(pos, {name = "default:dirt_with_snow"})
|
minetest.set_node(pos, {name = "default:dirt_with_snow"})
|
||||||
elseif minetest.get_item_group(name, "grass") ~= 0 then
|
-- The group grass is also present in dry grass, so check dry grass first
|
||||||
minetest.set_node(pos, {name = "default:dirt_with_grass"})
|
|
||||||
elseif minetest.get_item_group(name, "dry_grass") ~= 0 then
|
elseif minetest.get_item_group(name, "dry_grass") ~= 0 then
|
||||||
minetest.set_node(pos, {name = "default:dirt_with_dry_grass"})
|
minetest.set_node(pos, {name = "default:dirt_with_dry_grass"})
|
||||||
|
elseif minetest.get_item_group(name, "grass") ~= 0 then
|
||||||
|
minetest.set_node(pos, {name = "default:dirt_with_grass"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
@ -397,7 +397,7 @@ minetest.register_node("default:furnace_active", apply_logger({
|
|||||||
"default_furnace_side.png", "default_furnace_side.png",
|
"default_furnace_side.png", "default_furnace_side.png",
|
||||||
"default_furnace_side.png",
|
"default_furnace_side.png",
|
||||||
{
|
{
|
||||||
image = "default_furnace_front_active.png",
|
name = "default_furnace_front_active.png",
|
||||||
backface_culling = false,
|
backface_culling = false,
|
||||||
animation = {
|
animation = {
|
||||||
type = "vertical_frames",
|
type = "vertical_frames",
|
||||||
|
@ -2604,6 +2604,9 @@ local function register_sign(material, desc, def)
|
|||||||
meta:set_string("formspec", "field[text;;${text}]")
|
meta:set_string("formspec", "field[text;;${text}]")
|
||||||
end,
|
end,
|
||||||
on_receive_fields = function(pos, formname, fields, sender)
|
on_receive_fields = function(pos, formname, fields, sender)
|
||||||
|
if not fields.quit then
|
||||||
|
return -- workaround for https://github.com/luanti-org/luanti/issues/16187
|
||||||
|
end
|
||||||
local player_name = sender:get_player_name()
|
local player_name = sender:get_player_name()
|
||||||
if minetest.is_protected(pos, player_name) then
|
if minetest.is_protected(pos, player_name) then
|
||||||
minetest.record_protection_violation(pos, player_name)
|
minetest.record_protection_violation(pos, player_name)
|
||||||
|
@ -132,7 +132,9 @@ function default.grow_tree(pos, is_apple_tree, bad)
|
|||||||
|
|
||||||
vm:set_data(data)
|
vm:set_data(data)
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
vm:update_map()
|
if vm.close ~= nil then
|
||||||
|
vm:close()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Jungle tree
|
-- Jungle tree
|
||||||
@ -184,7 +186,9 @@ function default.grow_jungle_tree(pos, bad)
|
|||||||
|
|
||||||
vm:set_data(data)
|
vm:set_data(data)
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
vm:update_map()
|
if vm.close ~= nil then
|
||||||
|
vm:close()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -310,7 +314,9 @@ function default.grow_pine_tree(pos, snow)
|
|||||||
|
|
||||||
vm:set_data(data)
|
vm:set_data(data)
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
vm:update_map()
|
if vm.close ~= nil then
|
||||||
|
vm:close()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -332,6 +332,9 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne
|
|||||||
|
|
||||||
vm1:set_data(data)
|
vm1:set_data(data)
|
||||||
vm1:write_to_map()
|
vm1:write_to_map()
|
||||||
|
if vm1.close ~= nil then
|
||||||
|
vm1:close()
|
||||||
|
end
|
||||||
|
|
||||||
-- recalculate new radius
|
-- recalculate new radius
|
||||||
radius = math.floor(radius * math.pow(count, 1/3))
|
radius = math.floor(radius * math.pow(count, 1/3))
|
||||||
@ -386,8 +389,10 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne
|
|||||||
|
|
||||||
vm:set_data(data)
|
vm:set_data(data)
|
||||||
vm:write_to_map()
|
vm:write_to_map()
|
||||||
vm:update_map()
|
|
||||||
vm:update_liquids()
|
vm:update_liquids()
|
||||||
|
if vm.close ~= nil then
|
||||||
|
vm:close()
|
||||||
|
end
|
||||||
|
|
||||||
-- call check_single_for_falling for everything within 1.5x blast radius
|
-- call check_single_for_falling for everything within 1.5x blast radius
|
||||||
for y = -radius * 1.5, radius * 1.5 do
|
for y = -radius * 1.5, radius * 1.5 do
|
||||||
|
@ -3,6 +3,7 @@ world=$(mktemp -d)
|
|||||||
trap 'rm -rf "$world" || :' EXIT
|
trap 'rm -rf "$world" || :' EXIT
|
||||||
|
|
||||||
[ -f game.conf ] || { echo "Must be run in game root folder." >&2; exit 1; }
|
[ -f game.conf ] || { echo "Must be run in game root folder." >&2; exit 1; }
|
||||||
|
[ -n "$DOCKER_IMAGE" ] || { echo "Specify a docker image." >&2; exit 1; }
|
||||||
|
|
||||||
chmod -R 777 "$world" # container uses unprivileged user inside
|
chmod -R 777 "$world" # container uses unprivileged user inside
|
||||||
|
|
||||||
@ -12,7 +13,6 @@ vol=(
|
|||||||
-v "$PWD":/var/lib/minetest/.minetest/games/minetest_game
|
-v "$PWD":/var/lib/minetest/.minetest/games/minetest_game
|
||||||
-v "$world":/var/lib/minetest/.minetest/world
|
-v "$world":/var/lib/minetest/.minetest/world
|
||||||
)
|
)
|
||||||
[ -z "$DOCKER_IMAGE" ] && DOCKER_IMAGE="ghcr.io/minetest/minetest:master"
|
|
||||||
docker run --rm -i "${vol[@]}" "$DOCKER_IMAGE" --config /etc/minetest/minetest.conf --gameid minetest
|
docker run --rm -i "${vol[@]}" "$DOCKER_IMAGE" --config /etc/minetest/minetest.conf --gameid minetest
|
||||||
|
|
||||||
test -f "$world/map.sqlite" || exit 1
|
test -f "$world/map.sqlite" || exit 1
|
||||||
|
Reference in New Issue
Block a user