9
9
-- Pull all blocks in its back
10
10
11
11
function mesecon .get_movestone_direction (pos )
12
- getactivated = 0
13
12
local lpos
14
- local getactivated = 0
15
13
local rules = {
16
14
{x = 0 , y = 1 , z =- 1 },
17
15
{x = 0 , y = 0 , z =- 1 },
@@ -55,75 +53,75 @@ function mesecon.get_movestone_direction(pos)
55
53
end
56
54
end
57
55
58
- minetest .register_node (" mesecons_movestones:movestone" , {
59
- tiles = {" jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_arrows.png" , " jeija_movestone_arrows.png" },
60
- paramtype2 = " facedir" ,
61
- legacy_facedir_simple = true ,
62
- groups = {cracky = 3 },
63
- description = " Movestone" ,
64
- sounds = default .node_sound_stone_defaults (),
65
- mesecons = {effector = {
66
- action_on = function (pos , node )
67
- local direction = mesecon .get_movestone_direction (pos )
68
- if not direction then return end
69
- minetest .remove_node (pos )
70
- mesecon .on_dignode (pos , node )
71
- minetest .add_entity (pos , " mesecons_movestones:movestone_entity" )
56
+ function mesecon .register_movestone (name , def , is_sticky )
57
+ local timer_interval = 1 / mesecon .setting (" movestone_speed" , 3 )
58
+ local name_active = name .. " _active"
59
+
60
+ local function movestone_move (pos )
61
+ if minetest .get_node (pos ).name ~= name_active then
62
+ return
72
63
end
73
- }}
74
- })
75
64
76
- minetest .register_entity (" mesecons_movestones:movestone_entity" , {
77
- physical = false ,
78
- visual = " sprite" ,
79
- textures = {" jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_arrows.png" , " jeija_movestone_arrows.png" },
80
- collisionbox = {- 0.5 ,- 0.5 ,- 0.5 , 0.5 , 0.5 , 0.5 },
81
- visual = " cube" ,
82
- lastdir = {x = 0 , y = 0 , z = 0 },
83
-
84
- on_punch = function (self , hitter )
85
- self .object :remove ()
86
- hitter :get_inventory ():add_item (" main" , " mesecons_movestones:movestone" )
87
- end ,
88
-
89
- on_step = function (self , dtime )
90
- local pos = self .object :getpos ()
91
- pos .x , pos .y , pos .z = math.floor (pos .x + 0.5 ), math.floor (pos .y + 0.5 ), math.floor (pos .z + 0.5 )
92
65
local direction = mesecon .get_movestone_direction (pos )
66
+ if not direction then return end
67
+ local frontpos = vector .add (pos , direction )
68
+ local backpos = vector .subtract (pos , direction )
93
69
70
+ -- ### Step 1: Push nodes in front ###
94
71
local maxpush = mesecon .setting (" movestone_max_push" , 50 )
95
- if not direction then -- no mesecon power
96
- -- push only solid nodes
97
- local name = minetest .get_node (pos ).name
98
- if name ~= " air" and name ~= " ignore"
99
- and ((not minetest .registered_nodes [name ])
100
- or minetest .registered_nodes [name ].liquidtype == " none" ) then
101
- mesecon .mvps_push (pos , self .lastdir , maxpush )
102
- end
103
- local nn = {name = " mesecons_movestones:movestone" }
104
- minetest .add_node (pos , nn )
105
- self .object :remove ()
106
- mesecon .on_placenode (pos , nn )
72
+ local maxpull = mesecon .setting (" movestone_max_pull" , 50 )
73
+ local success , stack , oldstack = mesecon .mvps_push (frontpos , direction , maxpush )
74
+ if success then
75
+ mesecon .mvps_process_stack (stack )
76
+ mesecon .mvps_move_objects (frontpos , direction , oldstack )
77
+ -- Too large stack/stopper in the way: try again very soon
78
+ else
79
+ minetest .after (0.05 , movestone_move , pos )
107
80
return
108
81
end
109
82
110
- local success , stack , oldstack =
111
- mesecon .mvps_push (pos , direction , maxpush )
112
- if not success then -- Too large stack/stopper in the way
113
- local nn = {name = " mesecons_movestones:movestone" }
114
- minetest .add_node (pos , nn )
115
- self .object :remove ()
116
- mesecon .on_placenode (pos , nn )
117
- return
118
- else
119
- mesecon .mvps_process_stack (stack )
120
- mesecon .mvps_move_objects (pos , direction , oldstack )
121
- self .lastdir = direction
83
+ -- ### Step 2: Move the movestone ###
84
+ local node = minetest .get_node (pos )
85
+ minetest .set_node (frontpos , node )
86
+ minetest .remove_node (pos )
87
+ mesecon .on_dignode (pos , node )
88
+ mesecon .on_placenode (frontpos , node )
89
+ minetest .after (timer_interval , movestone_move , frontpos )
90
+
91
+ -- ### Step 3: If sticky, pull stack behind ###
92
+ if is_sticky then
93
+ mesecon .mvps_pull_all (backpos , direction , maxpull )
122
94
end
95
+ end
123
96
124
- self .object :setvelocity ({x = direction .x * 2 , y = direction .y * 2 , z = direction .z * 2 })
125
- end ,
126
- })
97
+ def .mesecons = {effector = {
98
+ action_on = function (pos )
99
+ if minetest .get_node (pos ).name ~= name_active then
100
+ minetest .set_node (pos , {name = name_active })
101
+ movestone_move (pos )
102
+ end
103
+ end ,
104
+ action_off = function (pos )
105
+ minetest .set_node (pos , {name = name })
106
+ end
107
+ }}
108
+
109
+ def .drop = name
110
+
111
+ minetest .register_node (name , def )
112
+
113
+ -- active node only
114
+ local def_active = table .copy (def )
115
+ def_active .groups .not_in_creative_inventory = 1
116
+ minetest .register_node (name_active , def_active )
117
+ end
118
+
119
+ mesecon .register_movestone (" mesecons_movestones:movestone" , {
120
+ tiles = {" jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_arrows.png" , " jeija_movestone_arrows.png" },
121
+ groups = {cracky = 3 },
122
+ description = " Movestone" ,
123
+ sounds = default .node_sound_stone_defaults ()
124
+ }, false )
127
125
128
126
minetest .register_craft ({
129
127
output = " mesecons_movestones:movestone 2" ,
@@ -134,28 +132,14 @@ minetest.register_craft({
134
132
}
135
133
})
136
134
137
-
138
-
139
135
-- STICKY_MOVESTONE
140
-
141
- minetest .register_node (" mesecons_movestones:sticky_movestone" , {
136
+ mesecon .register_movestone (" mesecons_movestones:sticky_movestone" , {
142
137
tiles = {" jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_sticky_movestone.png" , " jeija_sticky_movestone.png" },
143
138
inventory_image = minetest .inventorycube (" jeija_sticky_movestone.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" ),
144
- paramtype2 = " facedir" ,
145
- legacy_facedir_simple = true ,
146
139
groups = {cracky = 3 },
147
140
description = " Sticky Movestone" ,
148
141
sounds = default .node_sound_stone_defaults (),
149
- mesecons = {effector = {
150
- action_on = function (pos , node )
151
- local direction = mesecon .get_movestone_direction (pos )
152
- if not direction then return end
153
- minetest .remove_node (pos )
154
- mesecon .on_dignode (pos , node )
155
- minetest .add_entity (pos , " mesecons_movestones:sticky_movestone_entity" )
156
- end
157
- }}
158
- })
142
+ }, true )
159
143
160
144
minetest .register_craft ({
161
145
output = " mesecons_movestones:sticky_movestone 2" ,
@@ -164,63 +148,6 @@ minetest.register_craft({
164
148
}
165
149
})
166
150
167
- minetest .register_entity (" mesecons_movestones:sticky_movestone_entity" , {
168
- physical = false ,
169
- visual = " sprite" ,
170
- textures = {" jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_movestone_side.png" , " jeija_sticky_movestone.png" , " jeija_sticky_movestone.png" },
171
- collisionbox = {- 0.5 , - 0.5 , - 0.5 , 0.5 , 0.5 , 0.5 },
172
- visual = " cube" ,
173
- lastdir = {x = 0 , y = 0 , z = 0 },
174
-
175
- on_punch = function (self , hitter )
176
- self .object :remove ()
177
- hitter :get_inventory ():add_item (" main" , ' mesecons_movestones:sticky_movestone' )
178
- end ,
179
-
180
- on_step = function (self , dtime )
181
- local pos = self .object :getpos ()
182
- pos .x , pos .y , pos .z = math.floor (pos .x + 0.5 ), math.floor (pos .y + 0.5 ), math.floor (pos .z + 0.5 )
183
- local direction = mesecon .get_movestone_direction (pos )
184
-
185
- if not direction then -- no mesecon power
186
- -- push only solid nodes
187
- local name = minetest .get_node (pos ).name
188
- if name ~= " air" and name ~= " ignore"
189
- and ((not minetest .registered_nodes [name ])
190
- or minetest .registered_nodes [name ].liquidtype == " none" ) then
191
- mesecon .mvps_push (pos , self .lastdir ,
192
- mesecon .setting (" movestone_max_push" , 50 ))
193
- -- STICKY
194
- mesecon .mvps_pull_all (pos , self .lastdir )
195
- end
196
- local nn = {name = " mesecons_movestones:sticky_movestone" }
197
- minetest .add_node (pos , nn )
198
- self .object :remove ()
199
- mesecon .on_placenode (pos , nn )
200
- return
201
- end
202
-
203
- local success , stack , oldstack =
204
- mesecon .mvps_push (pos , direction , mesecon .setting (" movestone_max_push" , 50 ))
205
- if not success then -- Too large stack/stopper in the way
206
- local nn = {name = " mesecons_movestones:sticky_movestone" }
207
- minetest .add_node (pos , nn )
208
- self .object :remove ()
209
- mesecon .on_placenode (pos , nn )
210
- return
211
- else
212
- mesecon .mvps_process_stack (stack )
213
- mesecon .mvps_move_objects (pos , direction , oldstack )
214
- self .lastdir = direction
215
- end
216
-
217
- self .object :setvelocity ({x = direction .x * 2 , y = direction .y * 2 , z = direction .z * 2 })
218
-
219
- -- STICKY
220
- mesecon .mvps_pull_all (pos , direction )
221
- end ,
222
- })
223
-
224
-
225
- mesecon .register_mvps_unmov (" mesecons_movestones:movestone_entity" )
226
- mesecon .register_mvps_unmov (" mesecons_movestones:sticky_movestone_entity" )
151
+ -- Don't allow pushing movestones while they're active
152
+ mesecon .register_mvps_stopper (" mesecons_movestones:movestone_active" )
153
+ mesecon .register_mvps_stopper (" mesecons_movestones:sticky_movestone_active" )
0 commit comments