Skip to content

Commit 1df6e5a

Browse files
committedFeb 14, 2015
Rewrite movestones, make them nodes instead of entities
1 parent b7076e6 commit 1df6e5a

File tree

3 files changed

+86
-205
lines changed

3 files changed

+86
-205
lines changed
 

Diff for: ‎mesecons_movestones/init.lua

+64-137
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99
-- Pull all blocks in its back
1010

1111
function mesecon.get_movestone_direction(pos)
12-
getactivated = 0
1312
local lpos
14-
local getactivated = 0
1513
local rules = {
1614
{x=0, y=1, z=-1},
1715
{x=0, y=0, z=-1},
@@ -55,75 +53,75 @@ function mesecon.get_movestone_direction(pos)
5553
end
5654
end
5755

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
7263
end
73-
}}
74-
})
7564

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)
9265
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)
9369

70+
-- ### Step 1: Push nodes in front ###
9471
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)
10780
return
10881
end
10982

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)
12294
end
95+
end
12396

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)
127125

128126
minetest.register_craft({
129127
output = "mesecons_movestones:movestone 2",
@@ -134,28 +132,14 @@ minetest.register_craft({
134132
}
135133
})
136134

137-
138-
139135
-- STICKY_MOVESTONE
140-
141-
minetest.register_node("mesecons_movestones:sticky_movestone", {
136+
mesecon.register_movestone("mesecons_movestones:sticky_movestone", {
142137
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"},
143138
inventory_image = minetest.inventorycube("jeija_sticky_movestone.png", "jeija_movestone_side.png", "jeija_movestone_side.png"),
144-
paramtype2 = "facedir",
145-
legacy_facedir_simple = true,
146139
groups = {cracky=3},
147140
description="Sticky Movestone",
148141
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)
159143

160144
minetest.register_craft({
161145
output = "mesecons_movestones:sticky_movestone 2",
@@ -164,63 +148,6 @@ minetest.register_craft({
164148
}
165149
})
166150

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")

Diff for: ‎mesecons_mvps/init.lua

+20-66
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
--register stoppers for movestones/pistons
22

33
mesecon.mvps_stoppers = {}
4-
mesecon.mvps_unmov = {}
54
mesecon.on_mvps_move = {}
65

76
function mesecon.is_mvps_stopper(node, pushdir, stack, stackid)
87
local get_stopper = mesecon.mvps_stoppers[node.name]
98
if type (get_stopper) == "function" then
109
get_stopper = get_stopper(node, pushdir, stack, stackid)
1110
end
11+
if (get_stopper) then print(node.name) end
1212
return get_stopper
1313
end
1414

@@ -19,15 +19,6 @@ function mesecon.register_mvps_stopper(nodename, get_stopper)
1919
mesecon.mvps_stoppers[nodename] = get_stopper
2020
end
2121

22-
-- Objects that cannot be moved (e.g. movestones)
23-
function mesecon.register_mvps_unmov(objectname)
24-
mesecon.mvps_unmov[objectname] = true;
25-
end
26-
27-
function mesecon.is_mvps_unmov(objectname)
28-
return mesecon.mvps_unmov[objectname]
29-
end
30-
3122
-- Functions to be called on mvps movement
3223
function mesecon.register_on_mvps_move(callback)
3324
mesecon.on_mvps_move[#mesecon.on_mvps_move+1] = callback
@@ -70,13 +61,21 @@ function mesecon.mvps_get_stack(pos, dir, maximum)
7061
return nodes
7162
end
7263

73-
function mesecon.mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: direction of push; maximum: maximum nodes to be pushed
74-
local nodes = mesecon.mvps_get_stack(pos, dir, maximum)
64+
function mesecon.mvps_push(pos, dir, maximum)
65+
return mesecon.mvps_push_or_pull(pos, dir, dir, maximum)
66+
end
67+
68+
function mesecon.mvps_pull_all(pos, dir, maximum)
69+
return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum)
70+
end
71+
72+
function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum) -- pos: pos of mvps; stackdir: direction of building the stack; movedir: direction of actual movement; maximum: maximum nodes to be pushed
73+
local nodes = mesecon.mvps_get_stack(pos, stackdir, maximum)
7574

7675
if not nodes then return end
77-
-- determine if one of the nodes blocks the push
76+
-- determine if one of the nodes blocks the push / pull
7877
for id, n in ipairs(nodes) do
79-
if mesecon.is_mvps_stopper(n.node, dir, nodes, id) then
78+
if mesecon.is_mvps_stopper(n.node, movedir, nodes, id) then
8079
return
8180
end
8281
end
@@ -94,22 +93,23 @@ function mesecon.mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio
9493

9594
-- add nodes
9695
for _, n in ipairs(nodes) do
97-
local np = mesecon.addPosRule(n.pos, dir)
96+
local np = mesecon.addPosRule(n.pos, movedir)
97+
9898
minetest.add_node(np, n.node)
9999
minetest.get_meta(np):from_table(n.meta)
100100
end
101-
101+
102102
local moved_nodes = {}
103103
local oldstack = mesecon.tablecopy(nodes)
104104
for i in ipairs(nodes) do
105105
moved_nodes[i] = {}
106106
moved_nodes[i].oldpos = nodes[i].pos
107-
nodes[i].pos = mesecon.addPosRule(nodes[i].pos, dir)
107+
nodes[i].pos = mesecon.addPosRule(nodes[i].pos, movedir)
108108
moved_nodes[i].pos = nodes[i].pos
109109
moved_nodes[i].node = nodes[i].node
110110
moved_nodes[i].meta = nodes[i].meta
111111
end
112-
112+
113113
on_mvps_move(moved_nodes)
114114

115115
return true, nodes, oldstack
@@ -128,7 +128,7 @@ function mesecon.mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: dire
128128

129129
if ((not minetest.registered_nodes[nn.name]) --unregistered node
130130
or minetest.registered_nodes[nn.name].liquidtype == "none") --non-liquid node
131-
and not mesecon.is_mvps_stopper(nn, {x = -dir.x, y = -dir.y, z = -dir.z}, {{pos = np, node = nn}}, 1) then --non-stopper node
131+
and not mesecon.is_mvps_stopper(nn, dir, {{pos = np, node = nn}}, 1) then --non-stopper node
132132
local meta = minetest.get_meta(np):to_table()
133133
minetest.remove_node(np)
134134
minetest.add_node(pos, nn)
@@ -143,52 +143,6 @@ function mesecon.mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: dire
143143
return {{pos = np, node = {param2 = 0, name = "air"}}, {pos = pos, node = nn}}
144144
end
145145

146-
function mesecon.mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: direction of pull
147-
local lpos = {x=pos.x-direction.x, y=pos.y-direction.y, z=pos.z-direction.z} -- 1 away
148-
local lnode = minetest.get_node(lpos)
149-
local lpos2 = {x=pos.x-direction.x*2, y=pos.y-direction.y*2, z=pos.z-direction.z*2} -- 2 away
150-
local lnode2 = minetest.get_node(lpos2)
151-
152-
--avoid pulling solid nodes
153-
if lnode.name ~= "ignore"
154-
and lnode.name ~= "air"
155-
and ((not minetest.registered_nodes[lnode.name])
156-
or minetest.registered_nodes[lnode.name].liquidtype == "none") then
157-
return
158-
end
159-
160-
--avoid pulling empty or liquid nodes
161-
if lnode2.name == "ignore"
162-
or lnode2.name == "air"
163-
or (minetest.registered_nodes[lnode2.name]
164-
and minetest.registered_nodes[lnode2.name].liquidtype ~= "none") then
165-
return
166-
end
167-
168-
local moved_nodes = {}
169-
local oldpos = {x=lpos2.x + direction.x, y=lpos2.y + direction.y, z=lpos2.z + direction.z}
170-
repeat
171-
lnode2 = minetest.get_node(lpos2)
172-
local meta = minetest.get_meta(lnode2):to_table()
173-
minetest.add_node(oldpos, lnode2)
174-
minetest.get_meta(oldpos):from_table(meta)
175-
moved_nodes[#moved_nodes+1] = {pos = oldpos, oldpos = lpos2, node = lnode2, meta = meta}
176-
nodeupdate(oldpos)
177-
oldpos = {x=lpos2.x, y=lpos2.y, z=lpos2.z}
178-
lpos2.x = lpos2.x-direction.x
179-
lpos2.y = lpos2.y-direction.y
180-
lpos2.z = lpos2.z-direction.z
181-
lnode = minetest.get_node(lpos2)
182-
until lnode.name == "air"
183-
or lnode.name == "ignore"
184-
or (minetest.registered_nodes[lnode.name]
185-
and minetest.registered_nodes[lnode.name].liquidtype ~= "none")
186-
minetest.remove_node(oldpos)
187-
mesecon.on_dignode(oldpos, lnode2)
188-
mesecon.update_autoconnect(oldpos)
189-
on_mvps_move(moved_nodes)
190-
end
191-
192146
function mesecon.mvps_move_objects(pos, dir, nodestack)
193147
local objects_to_move = {}
194148

@@ -218,7 +172,7 @@ function mesecon.mvps_move_objects(pos, dir, nodestack)
218172

219173
for _, obj in ipairs(objects_to_move) do
220174
local entity = obj:get_luaentity()
221-
if not entity or not mesecon.is_mvps_unmov(entity.name) then
175+
if not entity then
222176
local np = mesecon.addPosRule(obj:getpos(), dir)
223177

224178
--move only if destination is not solid

Diff for: ‎mesecons_pistons/init.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ local piston_on = function(pos, node)
8989
max_hear_distance = 20,
9090
gain = 0.3,
9191
})
92-
mesecon.mvps_process_stack (stack)
93-
mesecon.mvps_move_objects (np, dir, oldstack)
92+
mesecon.mvps_process_stack(stack)
93+
mesecon.mvps_move_objects(np, dir, oldstack)
9494
end
9595
end
9696

0 commit comments

Comments
 (0)
Please sign in to comment.