1 -- Function that get the input/output rules of the delayer
2 local delayer_get_output_rules
= function(node
)
3 local rules
= {{x
= -1, y
= 0, z
= 0, spread
=true}}
4 for i
= 0, node
.param2
do
5 rules
= mesecon
.rotate_rules_left(rules
)
10 local delayer_get_input_rules
= function(node
)
11 local rules
= {{x
= 1, y
= 0, z
= 0}}
12 for i
= 0, node
.param2
do
13 rules
= mesecon
.rotate_rules_left(rules
)
18 local delayer_get_all_rules
= function(node
)
19 local orules
= delayer_get_output_rules(node
)
20 local irules
= delayer_get_input_rules(node
)
21 return mesecon
.mergetables(orules
, irules
)
24 local check_lock_repeater
= function(pos
, node
)
25 -- Check the repeater at pos and look if there is
26 -- a repeater in its facing direction and sideways.
27 -- If yes, lock the second repeater.
28 local r
= delayer_get_output_rules(node
)[1]
29 local lpos
= vector
.add(pos
, r
)
30 local lnode
= minetest
.get_node(lpos
)
31 local ldef
= minetest
.registered_nodes
[lnode
.name
]
32 local g
= minetest
.get_item_group(lnode
.name
, "redstone_repeater")
33 if g
>= 1 and g
<= 4 then
34 local lrs
= delayer_get_input_rules(lnode
)
36 for _
, lr
in pairs(lrs
) do
37 if lr
.x
== r
.x
or lr
.z
== r
.z
then
43 minetest
.swap_node(lpos
, {name
=ldef
.delayer_lockstate
, param2
=lnode
.param2
})
50 local check_unlock_repeater
= function(pos
, node
)
52 local r
= delayer_get_output_rules(node
)[1]
53 local lpos
= vector
.add(pos
, r
)
54 local lnode
= minetest
.get_node(lpos
)
55 local ldef
= minetest
.registered_nodes
[lnode
.name
]
56 local g
= minetest
.get_item_group(lnode
.name
, "redstone_repeater")
58 local lrs
= delayer_get_input_rules(lnode
)
60 for _
, lr
in pairs(lrs
) do
61 if lr
.x
== r
.x
or lr
.z
== r
.z
then
67 if mesecon
.is_powered(lpos
) then
68 minetest
.swap_node(lpos
, {name
="mesecons_delayer:delayer_on_1", param2
=lnode
.param2
})
69 mesecon
.queue
:add_action(lpos
, "receptor_on", {delayer_get_output_rules(lnode
)}, ldef
.delayer_time
, nil)
71 minetest
.swap_node(lpos
, {name
="mesecons_delayer:delayer_off_1", param2
=lnode
.param2
})
72 mesecon
.queue
:add_action(lpos
, "receptor_off", {delayer_get_output_rules(lnode
)}, ldef
.delayer_time
, nil)
80 -- Functions that are called after the delay time
81 local delayer_activate
= function(pos
, node
)
82 local def
= minetest
.registered_nodes
[node
.name
]
83 local time
= def
.delayer_time
84 minetest
.swap_node(pos
, {name
=def
.delayer_onstate
, param2
=node
.param2
})
85 mesecon
.queue
:add_action(pos
, "receptor_on", {delayer_get_output_rules(node
)}, time
, nil)
87 check_lock_repeater(pos
, node
)
90 local delayer_deactivate
= function(pos
, node
)
91 local def
= minetest
.registered_nodes
[node
.name
]
92 local time
= def
.delayer_time
93 minetest
.swap_node(pos
, {name
=def
.delayer_offstate
, param2
=node
.param2
})
94 mesecon
.queue
:add_action(pos
, "receptor_off", {delayer_get_output_rules(node
)}, time
, nil)
96 check_unlock_repeater(pos
, node
)
99 -- Register the 2 (states) x 4 (delay times) delayers
104 groups
= {dig_immediate
=3,dig_by_water
=1,destroy_by_lava_flow
=1,dig_by_piston
=1,attached_node
=1,redstone_repeater
=i
}
106 groups
= {dig_immediate
=3,dig_by_water
=1,destroy_by_lava_flow
=1,dig_by_piston
=1,attached_node
=1,redstone_repeater
=i
,not_in_creative_inventory
=1}
110 if i
== 1 then delaytime
= 0.1
111 elseif i
== 2 then delaytime
= 0.2
112 elseif i
== 3 then delaytime
= 0.3
113 elseif i
== 4 then delaytime
= 0.4
119 { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab
120 { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch
121 { -1/16, -6/16, 0/16, 1/16, -1/16, 2/16}, -- moved torch
125 { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab
126 { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch
127 { -1/16, -6/16, -2/16, 1/16, -1/16, 0/16}, -- moved torch
131 { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab
132 { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch
133 { -1/16, -6/16, -4/16, 1/16, -1/16, -2/16}, -- moved torch
137 { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab
138 { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch
139 { -1/16, -6/16, -6/16, 1/16, -1/16, -4/16}, -- moved torch
143 local help
, longdesc
, usagehelp
, icon
146 longdesc
= "Redstone repeaters are versatile redstone components which delay redstone signals and only allow redstone signals to travel through one direction. The delay of the signal is indicated by the redstone torches and is between 0.1 and 0.4 seconds long."
147 usagehelp
= "To power a redstone repeater, send a signal in “arrow” direction. To change the delay, rightclick the redstone repeater. The delay is changed in steps of 0.1 seconds."
148 icon
= "mesecons_delayer_item.png"
154 if minetest
.get_modpath("screwdriver") then
155 on_rotate
= screwdriver
.disallow
158 minetest
.register_node("mesecons_delayer:delayer_off_"..tostring(i
), {
159 description
= "Redstone Repeater",
160 inventory_image
= icon
,
162 _doc_items_create_entry
= help
,
163 _doc_items_longdesc
= longdesc
,
164 _doc_items_usagehelp
= usagehelp
,
165 drawtype
= "nodebox",
167 "mesecons_delayer_off.png",
168 "mcl_stairs_stone_slab_top.png",
169 "mesecons_delayer_sides_off.png",
170 "mesecons_delayer_sides_off.png",
171 "mesecons_delayer_ends_off.png",
172 "mesecons_delayer_ends_off.png",
174 wield_image
= "mesecons_delayer_off.png",
178 fixed
= { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
182 fixed
= { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
190 paramtype2
= "facedir",
191 sunlight_propagates
= false,
192 is_ground_content
= false,
193 drop
= 'mesecons_delayer:delayer_off_1',
194 on_rightclick
= function (pos
, node
)
195 if node
.name
=="mesecons_delayer:delayer_off_1" then
196 minetest
.swap_node(pos
, {name
="mesecons_delayer:delayer_off_2", param2
=node
.param2
})
197 elseif node
.name
=="mesecons_delayer:delayer_off_2" then
198 minetest
.swap_node(pos
, {name
="mesecons_delayer:delayer_off_3", param2
=node
.param2
})
199 elseif node
.name
=="mesecons_delayer:delayer_off_3" then
200 minetest
.swap_node(pos
, {name
="mesecons_delayer:delayer_off_4", param2
=node
.param2
})
201 elseif node
.name
=="mesecons_delayer:delayer_off_4" then
202 minetest
.swap_node(pos
, {name
="mesecons_delayer:delayer_off_1", param2
=node
.param2
})
205 delayer_time
= delaytime
,
206 delayer_onstate
= "mesecons_delayer:delayer_on_"..tostring(i
),
207 delayer_lockstate
= "mesecons_delayer:delayer_off_locked",
208 sounds
= mcl_sounds
.node_sound_stone_defaults(),
212 state
= mesecon
.state
.off
,
213 rules
= delayer_get_output_rules
217 rules
= delayer_get_input_rules
,
218 action_on
= delayer_activate
221 on_rotate
= on_rotate
,
225 minetest
.register_node("mesecons_delayer:delayer_on_"..tostring(i
), {
226 description
= "Redstone Repeater (Powered)",
227 _doc_items_create_entry
= false,
228 drawtype
= "nodebox",
230 "mesecons_delayer_on.png",
231 "mcl_stairs_stone_slab_top.png",
232 "mesecons_delayer_sides_on.png",
233 "mesecons_delayer_sides_on.png",
234 "mesecons_delayer_ends_on.png",
235 "mesecons_delayer_ends_on.png",
240 fixed
= { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
244 fixed
= { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
250 groups
= {dig_immediate
= 3, dig_by_water
=1,destroy_by_lava_flow
=1, dig_by_piston
=1, attached_node
=1, redstone_repeater
=i
, not_in_creative_inventory
= 1},
252 paramtype2
= "facedir",
253 sunlight_propagates
= false,
254 is_ground_content
= false,
255 drop
= 'mesecons_delayer:delayer_off_1',
256 on_rightclick
= function (pos
, node
)
257 if node
.name
=="mesecons_delayer:delayer_on_1" then
258 minetest
.swap_node(pos
, {name
="mesecons_delayer:delayer_on_2",param2
=node
.param2
})
259 elseif node
.name
=="mesecons_delayer:delayer_on_2" then
260 minetest
.swap_node(pos
, {name
="mesecons_delayer:delayer_on_3",param2
=node
.param2
})
261 elseif node
.name
=="mesecons_delayer:delayer_on_3" then
262 minetest
.swap_node(pos
, {name
="mesecons_delayer:delayer_on_4",param2
=node
.param2
})
263 elseif node
.name
=="mesecons_delayer:delayer_on_4" then
264 minetest
.swap_node(pos
, {name
="mesecons_delayer:delayer_on_1",param2
=node
.param2
})
267 after_dig_node
= function(pos
, oldnode
, oldmetadata
, digger
)
268 check_unlock_repeater(pos
, oldnode
)
270 delayer_time
= delaytime
,
271 delayer_offstate
= "mesecons_delayer:delayer_off_"..tostring(i
),
272 delayer_lockstate
= "mesecons_delayer:delayer_on_locked",
273 sounds
= mcl_sounds
.node_sound_stone_defaults(),
277 state
= mesecon
.state
.on
,
278 rules
= delayer_get_output_rules
282 rules
= delayer_get_input_rules
,
283 action_off
= delayer_deactivate
286 on_rotate
= on_rotate
,
294 minetest
.register_node("mesecons_delayer:delayer_off_locked", {
295 description
= "Redstone Repeater (Locked)",
296 inventory_image
= icon
,
298 _doc_items_create_entry
= false,
299 drawtype
= "nodebox",
300 -- FIXME: Textures of torch and the lock bar overlap. Nodeboxes are (sadly) not suitable for this.
301 -- So this needs to be turned into a mesh.
303 "mesecons_delayer_locked_off.png",
304 "mcl_stairs_stone_slab_top.png",
305 "mesecons_delayer_sides_locked_off.png",
306 "mesecons_delayer_sides_locked_off.png",
307 "mesecons_delayer_front_locked_off.png",
308 "mesecons_delayer_end_locked_off.png",
310 wield_image
= "mesecons_delayer_locked_off.png",
314 fixed
= { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
318 fixed
= { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
323 { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab
324 { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch
325 { -6/16, -6/16, 0/16, 6/16, -4/16, 2/16}, -- lock
328 groups
= {dig_immediate
= 3, dig_by_water
=1,destroy_by_lava_flow
=1, dig_by_piston
=1, attached_node
=1, redstone_repeater
=5, not_in_creative_inventory
= 1},
330 paramtype2
= "facedir",
331 sunlight_propagates
= false,
332 is_ground_content
= false,
333 drop
= 'mesecons_delayer:delayer_off_1',
335 sounds
= mcl_sounds
.node_sound_stone_defaults(),
339 state
= mesecon
.state
.off
,
340 rules
= delayer_get_output_rules
344 rules
= delayer_get_input_rules
,
347 on_rotate
= on_rotate
,
350 minetest
.register_node("mesecons_delayer:delayer_on_locked", {
351 description
= "Redstone Repeater (Locked, Powered)",
352 _doc_items_create_entry
= false,
353 drawtype
= "nodebox",
355 "mesecons_delayer_locked_on.png",
356 "mcl_stairs_stone_slab_top.png",
357 "mesecons_delayer_sides_locked_on.png",
358 "mesecons_delayer_sides_locked_on.png",
359 "mesecons_delayer_front_locked_on.png",
360 "mesecons_delayer_end_locked_on.png",
365 fixed
= { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
369 fixed
= { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
374 { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab
375 { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch
376 { -6/16, -6/16, 0/16, 6/16, -4/16, 2/16}, -- lock
379 after_dig_node
= function(pos
, oldnode
, oldmetadata
, digger
)
380 check_unlock_repeater(pos
, oldnode
)
382 groups
= {dig_immediate
= 3, dig_by_water
=1,destroy_by_lava_flow
=1, dig_by_piston
=1, attached_node
=1, redstone_repeater
=5, not_in_creative_inventory
= 1},
384 paramtype2
= "facedir",
385 sunlight_propagates
= false,
386 is_ground_content
= false,
387 drop
= 'mesecons_delayer:delayer_off_1',
389 sounds
= mcl_sounds
.node_sound_stone_defaults(),
393 state
= mesecon
.state
.on
,
394 rules
= delayer_get_output_rules
398 rules
= delayer_get_input_rules
,
401 on_rotate
= on_rotate
,
404 minetest
.register_craft({
405 output
= "mesecons_delayer:delayer_off_1",
407 {"mesecons_torch:mesecon_torch_on", "mesecons:redstone", "mesecons_torch:mesecon_torch_on"},
408 {"mcl_core:stone","mcl_core:stone", "mcl_core:stone"},
412 -- Add entry aliases for the Help
413 if minetest
.get_modpath("doc") then
414 doc
.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_off_2")
415 doc
.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_off_3")
416 doc
.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_off_4")
417 doc
.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_off_locked")
418 doc
.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_1")
419 doc
.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_2")
420 doc
.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_3")
421 doc
.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_4")
422 doc
.add_entry_alias("nodes", "mesecons_delayer:delayer_off_1", "nodes", "mesecons_delayer:delayer_on_locked")