Skip to content

Commit 3a53876

Browse files
rewrite bed compat code
1 parent 4273691 commit 3a53876

File tree

3 files changed

+46
-61
lines changed

3 files changed

+46
-61
lines changed

compat/beds.lua

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
local bed_bottoms = {"beds:bed_bottom", "beds:fancy_bed_bottom"}
22

3+
-- sanity checks
4+
assert(beds)
5+
assert(beds.spawn)
6+
assert(beds.save_spawns)
7+
38
-- Calculate a bed's middle position (where players would spawn)
49
local function calc_bed_middle(bed_pos, facedir)
510
local dir = minetest.facedir_to_dir(facedir)
@@ -11,54 +16,48 @@ local function calc_bed_middle(bed_pos, facedir)
1116
return bed_middle
1217
end
1318

14-
jumpdrive.beds_compat = function(target_pos1, target_pos2, delta_vector)
15-
if beds == nil or
16-
beds.spawn == nil or
17-
beds.save_spawns == nil then
18-
-- Something is wrong. Don't do anything
19-
return
20-
end
21-
22-
-- Look for beds in target area
23-
local beds_list = minetest.find_nodes_in_area(target_pos1, target_pos2, bed_bottoms)
19+
local bed_from_positions = {}
2420

25-
if next(beds_list) ~= nil then
26-
-- We found some beds!
27-
local source_pos1 = vector.subtract(target_pos1, delta_vector)
28-
local source_pos2 = vector.subtract(target_pos2, delta_vector)
2921

30-
-- Look for players with spawn in source area
31-
local affected_players = {}
32-
for name, pos in pairs(beds.spawn) do
33-
-- pos1 and pos2 must already be sorted
34-
if pos.x >= source_pos1.x and pos.x <= source_pos2.x and
35-
pos.y >= source_pos1.y and pos.y <= source_pos2.y and
36-
pos.z >= source_pos1.z and pos.z <= source_pos2.z then
37-
table.insert(affected_players, name)
38-
end
22+
for _, nodename in ipairs(bed_bottoms) do
23+
-- override bed definitions
24+
minetest.override_item(nodename, {
25+
on_movenode = function(from_pos, to_pos)
26+
-- collect bed positions while jumping
27+
table.insert(bed_from_positions, from_pos)
3928
end
29+
})
30+
end
31+
32+
-- executed after jump
33+
jumpdrive.register_after_jump(function(from_area, to_area)
34+
local delta_vector = vector.subtract(to_area.pos1, from_area.pos1)
35+
local modified = false
4036

41-
if next(affected_players) ~= nil then
42-
-- Some players seem to be affected.
43-
-- Iterate over all beds
44-
for _, pos in pairs(beds_list) do
45-
local facedir = minetest.get_node(pos).param2
46-
local old_middle = calc_bed_middle(vector.subtract(pos, delta_vector), facedir)
37+
-- go over all collected bed positions
38+
for _, bed_pos in ipairs(bed_from_positions) do
39+
local facedir = minetest.get_node(bed_pos).param2
40+
local sleep_pos = calc_bed_middle(bed_pos, facedir)
41+
-- sleep position in target area
42+
local new_sleep_pos = vector.add(sleep_pos, delta_vector)
4743

48-
for _, name in ipairs(affected_players) do
49-
local spawn = beds.spawn[name]
50-
if spawn.x == old_middle.x and
51-
spawn.y == old_middle.y and
52-
spawn.z == old_middle.z then
53-
---- Player spawn seems to match old bed position; update
54-
beds.spawn[name] = calc_bed_middle(pos, facedir)
55-
minetest.log("action",
56-
"[jumpdrive] Updated bed spawn for player " .. name)
57-
end
58-
end
44+
for player_name, player_pos in pairs(beds.spawn) do
45+
if vector.equals(sleep_pos, player_pos) then
46+
-- player sleeps here, move position
47+
beds.spawn[player_name] = new_sleep_pos
48+
minetest.log("action", "[jumpdrive] Updated bed spawn for player " .. player_name)
49+
50+
-- set modified flag to save afterwards
51+
modified = true
5952
end
60-
-- Tell beds mod to save the new spawns.
61-
beds.save_spawns()
6253
end
6354
end
64-
end
55+
56+
if modified then
57+
-- Tell beds mod to save the new spawns.
58+
beds.save_spawns()
59+
end
60+
61+
-- clear collected bed positions
62+
bed_from_positions = {}
63+
end)

compat/compat.lua

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,11 @@ if has_ropes_mod then
5151
dofile(MP.."/compat/ropes.lua")
5252
end
5353

54+
if has_beds_mod then
55+
dofile(MP.."/compat/beds.lua")
56+
end
57+
5458
dofile(MP.."/compat/telemosaic.lua")
55-
dofile(MP.."/compat/beds.lua")
5659

5760
if has_pipeworks_mod then
5861
dofile(MP.."/compat/teleporttube.lua")
@@ -76,13 +79,3 @@ jumpdrive.commit_node_compat = function()
7679
jumpdrive.teleporttube_compat_commit()
7780
end
7881
end
79-
80-
81-
jumpdrive.target_region_compat = function(source_pos1, source_pos2, target_pos1, target_pos2, delta_vector)
82-
-- sync compat functions
83-
84-
if has_beds_mod then
85-
jumpdrive.beds_compat(target_pos1, target_pos2, delta_vector)
86-
end
87-
88-
end

move/move.lua

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,6 @@ jumpdrive.move = function(source_pos1, source_pos2, target_pos1, target_pos2)
155155
minetest.log("action", "[jumpdrive] step II took " .. (t1 - t0) .. " us")
156156

157157

158-
-- step 3: execute target region compat code
159-
t0 = minetest.get_us_time()
160-
jumpdrive.target_region_compat(source_pos1, source_pos2, target_pos1, target_pos2, delta_vector)
161-
t1 = minetest.get_us_time()
162-
minetest.log("action", "[jumpdrive] step III took " .. (t1 - t0) .. " us")
163-
164-
165158
-- step 4: move objects
166159
t0 = minetest.get_us_time()
167160
jumpdrive.move_objects(source_center, source_pos1, source_pos2, delta_vector)

0 commit comments

Comments
 (0)