2019-03-08 03:07:41 +03:00
-- REDSTONE TORCH AND BLOCK OF REDSTONE
local S = minetest.get_translator ( " mesecons_torch " )
2018-01-23 01:51:44 +03:00
local TORCH_COOLOFF = 120 -- Number of seconds it takes for a burned-out torch to reactivate
2015-06-29 20:55:56 +03:00
local rotate_torch_rules = function ( rules , param2 )
2018-01-22 21:58:38 +03:00
if param2 == 1 then
return rules
elseif param2 == 5 then
2017-07-31 01:12:21 +03:00
return mesecon.rotate_rules_right ( rules )
2015-06-29 20:55:56 +03:00
elseif param2 == 2 then
2017-07-31 01:12:21 +03:00
return mesecon.rotate_rules_right ( mesecon.rotate_rules_right ( rules ) ) --180 degrees
2015-06-29 20:55:56 +03:00
elseif param2 == 4 then
2017-07-31 01:12:21 +03:00
return mesecon.rotate_rules_left ( rules )
2015-06-29 20:55:56 +03:00
elseif param2 == 0 then
2018-01-22 21:58:38 +03:00
return rules
2015-06-29 20:55:56 +03:00
else
return rules
end
end
2018-01-22 21:58:38 +03:00
local torch_get_output_rules = function ( node )
if node.param2 == 1 then
return {
{ x = - 1 , y = 0 , z = 0 } ,
{ x = 1 , y = 0 , z = 0 } ,
{ x = 0 , y = 1 , z = 0 , spread = true } ,
{ x = 0 , y = 0 , z = - 1 } ,
{ x = 0 , y = 0 , z = 1 } ,
}
else
return rotate_torch_rules ( {
{ x = 1 , y = 0 , z = 0 } ,
{ x = 0 , y = - 1 , z = 0 } ,
{ x = 0 , y = 1 , z = 0 , spread = true } ,
{ x = 0 , y = 1 , z = 0 } ,
{ x = 0 , y = 0 , z = - 1 } ,
{ x = 0 , y = 0 , z = 1 } ,
} , node.param2 )
end
2018-01-13 06:08:40 +03:00
end
2015-06-29 20:55:56 +03:00
local torch_get_input_rules = function ( node )
2018-01-22 21:58:38 +03:00
if node.param2 == 1 then
return { { x = 0 , y = - 1 , z = 0 } }
else
return rotate_torch_rules ( { { x = - 1 , y = 0 , z = 0 } } , node.param2 )
end
2015-06-29 20:55:56 +03:00
end
2018-01-23 01:51:44 +03:00
local torch_overheated = function ( pos )
minetest.sound_play ( " fire_extinguish_flame " , { pos = pos , gain = 0.02 , max_hear_distance = 6 } )
minetest.add_particle ( {
pos = { x = pos.x , y = pos.y + 0.2 , z = pos.z } ,
velocity = { x = 0 , y = 0.6 , z = 0 } ,
expirationtime = 1.2 ,
size = 1.5 ,
texture = " tnt_smoke.png " ,
} )
local timer = minetest.get_node_timer ( pos )
timer : start ( TORCH_COOLOFF )
end
2018-01-22 23:32:07 +03:00
local torch_action_on = function ( pos , node )
2018-01-23 01:51:44 +03:00
local overheat
2018-01-22 23:11:10 +03:00
if node.name == " mesecons_torch:mesecon_torch_on " then
2018-01-23 01:51:44 +03:00
overheat = mesecon.do_overheat ( pos )
if overheat then
minetest.swap_node ( pos , { name = " mesecons_torch:mesecon_torch_overheated " , param2 = node.param2 } )
else
minetest.swap_node ( pos , { name = " mesecons_torch:mesecon_torch_off " , param2 = node.param2 } )
end
2018-01-22 23:11:10 +03:00
mesecon.receptor_off ( pos , torch_get_output_rules ( node ) )
elseif node.name == " mesecons_torch:mesecon_torch_on_wall " then
2018-01-23 01:51:44 +03:00
overheat = mesecon.do_overheat ( pos )
if overheat then
minetest.swap_node ( pos , { name = " mesecons_torch:mesecon_torch_overheated_wall " , param2 = node.param2 } )
else
minetest.swap_node ( pos , { name = " mesecons_torch:mesecon_torch_off_wall " , param2 = node.param2 } )
end
2018-01-22 23:11:10 +03:00
mesecon.receptor_off ( pos , torch_get_output_rules ( node ) )
2018-01-22 23:32:07 +03:00
end
2018-01-23 01:51:44 +03:00
if overheat then
torch_overheated ( pos )
end
2018-01-22 23:32:07 +03:00
end
local torch_action_off = function ( pos , node )
2018-01-23 01:51:44 +03:00
local overheat
if node.name == " mesecons_torch:mesecon_torch_off " or node.name == " mesecons_torch:mesecon_torch_overheated " then
overheat = mesecon.do_overheat ( pos )
if overheat then
minetest.swap_node ( pos , { name = " mesecons_torch:mesecon_torch_overheated " , param2 = node.param2 } )
else
minetest.swap_node ( pos , { name = " mesecons_torch:mesecon_torch_on " , param2 = node.param2 } )
mesecon.receptor_on ( pos , torch_get_output_rules ( node ) )
end
elseif node.name == " mesecons_torch:mesecon_torch_off_wall " or node.name == " mesecons_torch:mesecon_torch_overheated_wall " then
overheat = mesecon.do_overheat ( pos )
if overheat then
minetest.swap_node ( pos , { name = " mesecons_torch:mesecon_torch_overheated_wall " , param2 = node.param2 } )
else
minetest.swap_node ( pos , { name = " mesecons_torch:mesecon_torch_on_wall " , param2 = node.param2 } )
mesecon.receptor_on ( pos , torch_get_output_rules ( node ) )
end
end
if overheat then
torch_overheated ( pos )
2018-01-22 23:11:10 +03:00
end
end
2015-06-29 20:55:56 +03:00
minetest.register_craft ( {
2017-01-05 06:39:36 +03:00
output = ' mesecons_torch:mesecon_torch_on ' ,
2015-06-29 20:55:56 +03:00
recipe = {
2017-01-09 20:45:34 +03:00
{ " mesecons:redstone " } ,
2017-02-01 01:32:56 +03:00
{ " mcl_core:stick " } , }
2015-06-29 20:55:56 +03:00
} )
2017-03-12 00:00:06 +03:00
mcl_torches.register_torch ( " mesecon_torch_off " , " Redstone Torch (off) " ,
nil ,
nil ,
" jeija_torches_off.png " ,
2017-02-10 17:38:53 +03:00
" mcl_torches_torch_floor.obj " , " mcl_torches_torch_wall.obj " ,
{ " jeija_torches_off.png " } ,
0 ,
2018-01-26 23:11:49 +03:00
{ dig_immediate = 3 , dig_by_water = 1 , redstone_torch = 2 , mesecon_ignore_opaque_dig = 1 , not_in_creative_inventory = 1 } ,
2017-02-11 20:46:23 +03:00
mcl_sounds.node_sound_wood_defaults ( ) ,
2017-02-10 17:38:53 +03:00
{
2018-01-22 23:11:10 +03:00
mesecons = {
receptor = {
state = mesecon.state . off ,
rules = torch_get_output_rules ,
} ,
effector = {
state = mesecon.state . on ,
rules = torch_get_input_rules ,
2018-01-22 23:32:07 +03:00
action_off = torch_action_off ,
2018-01-22 23:11:10 +03:00
} ,
} ,
2017-02-10 17:38:53 +03:00
drop = " mesecons_torch:mesecon_torch_on " ,
2017-03-02 21:53:53 +03:00
_doc_items_create_entry = false ,
2017-02-10 17:38:53 +03:00
}
)
2015-06-29 20:55:56 +03:00
2018-01-23 01:51:44 +03:00
mcl_torches.register_torch ( " mesecon_torch_overheated " , " Redstone Torch (overheated) " ,
nil ,
nil ,
" jeija_torches_off.png " ,
" mcl_torches_torch_floor.obj " , " mcl_torches_torch_wall.obj " ,
{ " jeija_torches_off.png " } ,
0 ,
2018-01-26 23:11:49 +03:00
{ dig_immediate = 3 , dig_by_water = 1 , redstone_torch = 2 , mesecon_ignore_opaque_dig = 1 , not_in_creative_inventory = 1 } ,
2018-01-23 01:51:44 +03:00
mcl_sounds.node_sound_wood_defaults ( ) ,
{
drop = " mesecons_torch:mesecon_torch_on " ,
_doc_items_create_entry = false ,
on_timer = function ( pos , elapsed )
if not mesecon.is_powered ( pos ) then
local node = minetest.get_node ( pos )
torch_action_off ( pos , node )
end
end ,
}
)
2019-03-08 03:07:41 +03:00
mcl_torches.register_torch ( " mesecon_torch_on " , S ( " Redstone Torch " ) ,
S ( " A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything. " ) ,
S ( " Redstone torches can generally be placed at the side and on the top of full solid opaque blocks. The following exceptions apply: " ) .. " \n " ..
S ( " • Glass, fence, wall, hopper: Can only be placed on top " ) ..
S ( " • Upside-down slab/stair: Can only be placed on top " ) ..
S ( " • Soul sand, mob spawner: Placement possible " ) ..
S ( " • Glowstone and pistons: No placement possible " ) ,
2017-07-17 17:38:14 +03:00
" jeija_torches_on.png " ,
2017-02-10 17:38:53 +03:00
" mcl_torches_torch_floor.obj " , " mcl_torches_torch_wall.obj " ,
{ " jeija_torches_on.png " } ,
7 ,
2018-01-26 23:11:49 +03:00
{ dig_immediate = 3 , dig_by_water = 1 , redstone_torch = 1 , mesecon_ignore_opaque_dig = 1 } ,
2017-02-11 20:46:23 +03:00
mcl_sounds.node_sound_wood_defaults ( ) ,
2017-02-10 17:38:53 +03:00
{
2018-01-22 23:11:10 +03:00
mesecons = {
receptor = {
state = mesecon.state . on ,
rules = torch_get_output_rules
} ,
effector = {
state = mesecon.state . off ,
rules = torch_get_input_rules ,
2018-01-22 23:32:07 +03:00
action_on = torch_action_on ,
2018-01-22 23:11:10 +03:00
} ,
}
2017-02-10 17:38:53 +03:00
}
)
2015-06-29 20:55:56 +03:00
minetest.register_node ( " mesecons_torch:redstoneblock " , {
2019-03-08 03:07:41 +03:00
description = S ( " Block of Redstone " ) ,
_doc_items_longdesc = S ( " A block of redstone permanently supplies redstone power to its surrounding blocks. " ) ,
2017-02-13 16:52:37 +03:00
tiles = { " redstone_redstone_block.png " } ,
2015-06-29 20:55:56 +03:00
stack_max = 64 ,
2017-02-27 20:20:19 +03:00
groups = { pickaxey = 1 } ,
2017-02-11 20:46:23 +03:00
sounds = mcl_sounds.node_sound_stone_defaults ( ) ,
2017-01-05 00:36:51 +03:00
is_ground_content = false ,
2015-06-29 20:55:56 +03:00
mesecons = { receptor = {
state = mesecon.state . on ,
2018-01-13 03:49:28 +03:00
rules = mesecon.rules . alldirs ,
2015-06-29 20:55:56 +03:00
} } ,
2017-03-15 22:46:36 +03:00
_mcl_blast_resistance = 30 ,
_mcl_hardness = 5 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_craft ( {
output = " mesecons_torch:redstoneblock " ,
recipe = {
{ ' mesecons:wire_00000000_off ' , ' mesecons:wire_00000000_off ' , ' mesecons:wire_00000000_off ' } ,
{ ' mesecons:wire_00000000_off ' , ' mesecons:wire_00000000_off ' , ' mesecons:wire_00000000_off ' } ,
{ ' mesecons:wire_00000000_off ' , ' mesecons:wire_00000000_off ' , ' mesecons:wire_00000000_off ' } ,
}
} )
minetest.register_craft ( {
output = ' mesecons:wire_00000000_off 9 ' ,
recipe = {
{ ' mesecons_torch:redstoneblock ' } ,
}
} )
2017-03-21 06:27:50 +03:00
if minetest.get_modpath ( " doc " ) then
doc.add_entry_alias ( " nodes " , " mesecons_torch:mesecon_torch_on " , " nodes " , " mesecons_torch:mesecon_torch_off " )
doc.add_entry_alias ( " nodes " , " mesecons_torch:mesecon_torch_on " , " nodes " , " mesecons_torch:mesecon_torch_off_wall " )
end