1
1
local bed_bottoms = {" beds:bed_bottom" , " beds:fancy_bed_bottom" }
2
2
3
+ -- sanity checks
4
+ assert (beds )
5
+ assert (beds .spawn )
6
+ assert (beds .save_spawns )
7
+
3
8
-- Calculate a bed's middle position (where players would spawn)
4
9
local function calc_bed_middle (bed_pos , facedir )
5
10
local dir = minetest .facedir_to_dir (facedir )
@@ -11,54 +16,48 @@ local function calc_bed_middle(bed_pos, facedir)
11
16
return bed_middle
12
17
end
13
18
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 = {}
24
20
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 )
29
21
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 )
39
28
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
40
36
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 )
47
43
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
59
52
end
60
- -- Tell beds mod to save the new spawns.
61
- beds .save_spawns ()
62
53
end
63
54
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 )
0 commit comments