2015-06-29 20:55:56 +03:00
-- Function that get the input/output rules of the delayer
local delayer_get_output_rules = function ( node )
2018-01-13 05:37:41 +03:00
local rules = { { x = - 1 , y = 0 , z = 0 , spread = true } }
2015-06-29 20:55:56 +03:00
for i = 0 , node.param2 do
2017-07-31 01:12:21 +03:00
rules = mesecon.rotate_rules_left ( rules )
2015-06-29 20:55:56 +03:00
end
return rules
end
local delayer_get_input_rules = function ( node )
2017-03-12 02:09:55 +03:00
local rules = { { x = 1 , y = 0 , z = 0 } }
2015-06-29 20:55:56 +03:00
for i = 0 , node.param2 do
2017-07-31 01:12:21 +03:00
rules = mesecon.rotate_rules_left ( rules )
2015-06-29 20:55:56 +03:00
end
return rules
end
-- Functions that are called after the delay time
local delayer_activate = function ( pos , node )
local def = minetest.registered_nodes [ node.name ]
local time = def.delayer_time
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = def.delayer_onstate , param2 = node.param2 } )
2018-01-27 00:01:37 +03:00
mesecon.queue : add_action ( pos , " receptor_on " , { delayer_get_output_rules ( node ) } , time , nil )
2015-06-29 20:55:56 +03:00
end
local delayer_deactivate = function ( pos , node )
local def = minetest.registered_nodes [ node.name ]
local time = def.delayer_time
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = def.delayer_offstate , param2 = node.param2 } )
2018-01-27 00:01:37 +03:00
mesecon.queue : add_action ( pos , " receptor_off " , { delayer_get_output_rules ( node ) } , time , nil )
2015-06-29 20:55:56 +03:00
end
-- Register the 2 (states) x 4 (delay times) delayers
for i = 1 , 4 do
local groups = { }
if i == 1 then
2017-05-20 05:11:14 +03:00
groups = { dig_immediate = 3 , dig_by_water = 1 , destroy_by_lava_flow = 1 , dig_by_piston = 1 , attached_node = 1 }
2015-06-29 20:55:56 +03:00
else
2017-05-20 05:11:14 +03:00
groups = { dig_immediate = 3 , dig_by_water = 1 , destroy_by_lava_flow = 1 , dig_by_piston = 1 , attached_node = 1 , not_in_creative_inventory = 1 }
2015-06-29 20:55:56 +03:00
end
local delaytime
2017-03-12 01:29:46 +03:00
if i == 1 then delaytime = 0.1
elseif i == 2 then delaytime = 0.2
elseif i == 3 then delaytime = 0.3
elseif i == 4 then delaytime = 0.4
2015-06-29 20:55:56 +03:00
end
local boxes
if i == 1 then
boxes = {
{ - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 6 / 16 , 8 / 16 } , -- the main slab
2017-03-12 02:09:55 +03:00
{ - 1 / 16 , - 6 / 16 , 6 / 16 , 1 / 16 , - 1 / 16 , 4 / 16 } , -- still torch
{ - 1 / 16 , - 6 / 16 , 0 / 16 , 1 / 16 , - 1 / 16 , 2 / 16 } , -- moved torch
2015-06-29 20:55:56 +03:00
}
elseif i == 2 then
boxes = {
{ - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 6 / 16 , 8 / 16 } , -- the main slab
2017-03-12 02:09:55 +03:00
{ - 1 / 16 , - 6 / 16 , 6 / 16 , 1 / 16 , - 1 / 16 , 4 / 16 } , -- still torch
{ - 1 / 16 , - 6 / 16 , - 2 / 16 , 1 / 16 , - 1 / 16 , 0 / 16 } , -- moved torch
2015-06-29 20:55:56 +03:00
}
elseif i == 3 then
boxes = {
{ - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 6 / 16 , 8 / 16 } , -- the main slab
2017-03-12 02:09:55 +03:00
{ - 1 / 16 , - 6 / 16 , 6 / 16 , 1 / 16 , - 1 / 16 , 4 / 16 } , -- still torch
{ - 1 / 16 , - 6 / 16 , - 4 / 16 , 1 / 16 , - 1 / 16 , - 2 / 16 } , -- moved torch
2015-06-29 20:55:56 +03:00
}
elseif i == 4 then
boxes = {
{ - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 6 / 16 , 8 / 16 } , -- the main slab
2017-03-12 02:09:55 +03:00
{ - 1 / 16 , - 6 / 16 , 6 / 16 , 1 / 16 , - 1 / 16 , 4 / 16 } , -- still torch
{ - 1 / 16 , - 6 / 16 , - 6 / 16 , 1 / 16 , - 1 / 16 , - 4 / 16 } , -- moved torch
2015-06-29 20:55:56 +03:00
}
end
2017-03-12 02:17:10 +03:00
local help , longdesc , usagehelp , icon
if i == 1 then
help = true
2017-03-12 01:28:22 +03:00
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. "
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. "
2017-03-12 02:17:10 +03:00
icon = " mesecons_delayer_item.png "
else
help = false
2017-03-12 01:28:22 +03:00
end
2017-12-05 16:09:39 +03:00
local on_rotate
if minetest.get_modpath ( " screwdriver " ) then
on_rotate = screwdriver.disallow
end
2015-06-29 20:55:56 +03:00
minetest.register_node ( " mesecons_delayer:delayer_off_ " .. tostring ( i ) , {
2017-01-04 08:20:13 +03:00
description = " Redstone Repeater " ,
2017-03-12 02:17:10 +03:00
inventory_image = icon ,
wield_image = icon ,
2017-03-12 01:28:22 +03:00
_doc_items_create_entry = help ,
_doc_items_longdesc = longdesc ,
_doc_items_usagehelp = usagehelp ,
2015-06-29 20:55:56 +03:00
drawtype = " nodebox " ,
tiles = {
" mesecons_delayer_off.png " ,
2017-06-05 19:40:56 +03:00
" mcl_stairs_stone_slab_top.png " ,
2017-03-12 02:09:55 +03:00
" mesecons_delayer_sides_off.png " ,
" mesecons_delayer_sides_off.png " ,
2015-06-29 20:55:56 +03:00
" mesecons_delayer_ends_off.png " ,
" mesecons_delayer_ends_off.png " ,
} ,
wield_image = " mesecons_delayer_off.png " ,
walkable = true ,
selection_box = {
type = " fixed " ,
fixed = { - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 6 / 16 , 8 / 16 } ,
} ,
2017-03-12 01:38:15 +03:00
collision_box = {
type = " fixed " ,
fixed = { - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 6 / 16 , 8 / 16 } ,
} ,
2015-06-29 20:55:56 +03:00
node_box = {
type = " fixed " ,
fixed = boxes
} ,
groups = groups ,
paramtype = " light " ,
paramtype2 = " facedir " ,
2017-03-12 02:54:16 +03:00
sunlight_propagates = false ,
2017-01-05 00:36:51 +03:00
is_ground_content = false ,
2015-06-29 20:55:56 +03:00
drop = ' mesecons_delayer:delayer_off_1 ' ,
2017-02-05 19:57:33 +03:00
on_rightclick = function ( pos , node )
2015-06-29 20:55:56 +03:00
if node.name == " mesecons_delayer:delayer_off_1 " then
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = " mesecons_delayer:delayer_off_2 " , param2 = node.param2 } )
2015-06-29 20:55:56 +03:00
elseif node.name == " mesecons_delayer:delayer_off_2 " then
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = " mesecons_delayer:delayer_off_3 " , param2 = node.param2 } )
2015-06-29 20:55:56 +03:00
elseif node.name == " mesecons_delayer:delayer_off_3 " then
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = " mesecons_delayer:delayer_off_4 " , param2 = node.param2 } )
2015-06-29 20:55:56 +03:00
elseif node.name == " mesecons_delayer:delayer_off_4 " then
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = " mesecons_delayer:delayer_off_1 " , param2 = node.param2 } )
2015-06-29 20:55:56 +03:00
end
end ,
delayer_time = delaytime ,
delayer_onstate = " mesecons_delayer:delayer_on_ " .. tostring ( i ) ,
2017-02-11 20:46:23 +03:00
sounds = mcl_sounds.node_sound_stone_defaults ( ) ,
2015-06-29 20:55:56 +03:00
mesecons = {
receptor =
{
state = mesecon.state . off ,
rules = delayer_get_output_rules
} ,
effector =
{
rules = delayer_get_input_rules ,
action_on = delayer_activate
}
2017-12-05 16:09:39 +03:00
} ,
on_rotate = on_rotate ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_node ( " mesecons_delayer:delayer_on_ " .. tostring ( i ) , {
2017-03-12 02:09:55 +03:00
description = " Redstone Repeater (Powered) " ,
2017-03-02 21:53:53 +03:00
_doc_items_create_entry = false ,
2015-06-29 20:55:56 +03:00
drawtype = " nodebox " ,
tiles = {
" mesecons_delayer_on.png " ,
2017-06-05 19:40:56 +03:00
" mcl_stairs_stone_slab_top.png " ,
2017-03-12 02:09:55 +03:00
" mesecons_delayer_sides_on.png " ,
" mesecons_delayer_sides_on.png " ,
2015-06-29 20:55:56 +03:00
" mesecons_delayer_ends_on.png " ,
" mesecons_delayer_ends_on.png " ,
} ,
walkable = true ,
selection_box = {
type = " fixed " ,
fixed = { - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 6 / 16 , 8 / 16 } ,
} ,
2017-03-12 01:38:15 +03:00
collision_box = {
type = " fixed " ,
fixed = { - 8 / 16 , - 8 / 16 , - 8 / 16 , 8 / 16 , - 6 / 16 , 8 / 16 } ,
} ,
2015-06-29 20:55:56 +03:00
node_box = {
type = " fixed " ,
fixed = boxes
} ,
2017-05-20 05:11:14 +03:00
groups = { dig_immediate = 3 , dig_by_water = 1 , destroy_by_lava_flow = 1 , dig_by_piston = 1 , attached_node = 1 , not_in_creative_inventory = 1 } ,
2015-06-29 20:55:56 +03:00
paramtype = " light " ,
paramtype2 = " facedir " ,
2017-03-12 02:54:16 +03:00
sunlight_propagates = false ,
2017-01-05 00:36:51 +03:00
is_ground_content = false ,
2015-06-29 20:55:56 +03:00
drop = ' mesecons_delayer:delayer_off_1 ' ,
2017-02-05 19:57:33 +03:00
on_rightclick = function ( pos , node )
2015-06-29 20:55:56 +03:00
if node.name == " mesecons_delayer:delayer_on_1 " then
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = " mesecons_delayer:delayer_on_2 " , param2 = node.param2 } )
2015-06-29 20:55:56 +03:00
elseif node.name == " mesecons_delayer:delayer_on_2 " then
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = " mesecons_delayer:delayer_on_3 " , param2 = node.param2 } )
2015-06-29 20:55:56 +03:00
elseif node.name == " mesecons_delayer:delayer_on_3 " then
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = " mesecons_delayer:delayer_on_4 " , param2 = node.param2 } )
2015-06-29 20:55:56 +03:00
elseif node.name == " mesecons_delayer:delayer_on_4 " then
2017-07-31 01:12:21 +03:00
minetest.swap_node ( pos , { name = " mesecons_delayer:delayer_on_1 " , param2 = node.param2 } )
2015-06-29 20:55:56 +03:00
end
end ,
delayer_time = delaytime ,
delayer_offstate = " mesecons_delayer:delayer_off_ " .. tostring ( i ) ,
mesecons = {
receptor =
{
state = mesecon.state . on ,
rules = delayer_get_output_rules
} ,
effector =
{
rules = delayer_get_input_rules ,
action_off = delayer_deactivate
}
2017-12-05 16:09:39 +03:00
} ,
on_rotate = on_rotate ,
2015-06-29 20:55:56 +03:00
} )
end
minetest.register_craft ( {
output = " mesecons_delayer:delayer_off_1 " ,
recipe = {
2017-02-08 03:44:07 +03:00
{ " mesecons_torch:mesecon_torch_on " , " mesecons:redstone " , " mesecons_torch:mesecon_torch_on " } ,
2017-02-01 01:32:56 +03:00
{ " mcl_core:stone " , " mcl_core:stone " , " mcl_core:stone " } ,
2015-06-29 20:55:56 +03:00
}
} )
2017-03-21 06:27:50 +03:00
-- Add entry aliases for the Help
if minetest.get_modpath ( " doc " ) then
doc.add_entry_alias ( " nodes " , " mesecons_delayer:delayer_off_1 " , " nodes " , " mesecons_delayer:delayer_off_2 " )
doc.add_entry_alias ( " nodes " , " mesecons_delayer:delayer_off_1 " , " nodes " , " mesecons_delayer:delayer_off_3 " )
doc.add_entry_alias ( " nodes " , " mesecons_delayer:delayer_off_1 " , " nodes " , " mesecons_delayer:delayer_off_4 " )
doc.add_entry_alias ( " nodes " , " mesecons_delayer:delayer_off_1 " , " nodes " , " mesecons_delayer:delayer_on_1 " )
doc.add_entry_alias ( " nodes " , " mesecons_delayer:delayer_off_1 " , " nodes " , " mesecons_delayer:delayer_on_2 " )
doc.add_entry_alias ( " nodes " , " mesecons_delayer:delayer_off_1 " , " nodes " , " mesecons_delayer:delayer_on_3 " )
doc.add_entry_alias ( " nodes " , " mesecons_delayer:delayer_off_1 " , " nodes " , " mesecons_delayer:delayer_on_4 " )
end