2019-03-08 03:07:41 +03:00
-- REDSTONE TORCH AND BLOCK OF REDSTONE
2021-05-29 17:12:33 +03:00
local S = minetest.get_translator ( minetest.get_current_modname ( ) )
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
2021-05-29 17:12:33 +03:00
local function rotate_torch_rules ( 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
2021-05-29 17:12:33 +03:00
local function torch_get_output_rules ( node )
2018-01-22 21:58:38 +03:00
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
2021-05-29 17:12:33 +03:00
local function torch_get_input_rules ( 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
2021-05-29 17:12:33 +03:00
local function torch_overheated ( pos )
2020-04-07 01:55:45 +03:00
minetest.sound_play ( " fire_extinguish_flame " , { pos = pos , gain = 0.02 , max_hear_distance = 6 } , true )
2018-01-23 01:51:44 +03:00
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 ,
2020-08-19 19:47:58 +03:00
texture = " mcl_particles_smoke.png " ,
2018-01-23 01:51:44 +03:00
} )
local timer = minetest.get_node_timer ( pos )
timer : start ( TORCH_COOLOFF )
end
2021-05-29 17:12:33 +03:00
local function torch_action_on ( 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
2021-05-29 17:12:33 +03:00
local function torch_action_off ( 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 ( {
2021-05-29 17:12:33 +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
} )
2021-04-13 10:59:32 +03:00
local off_def = {
name = " mesecon_torch_off " ,
description = S ( " Redstone Torch (off) " ) ,
doc_items_create_entry = false ,
icon = " jeija_torches_off.png " ,
tiles = { " jeija_torches_off.png " } ,
light = 0 ,
groups = { dig_immediate = 3 , dig_by_water = 1 , redstone_torch = 2 , mesecon_ignore_opaque_dig = 1 , not_in_creative_inventory = 1 } ,
sounds = mcl_sounds.node_sound_wood_defaults ( ) ,
drop = " mesecons_torch:mesecon_torch_on " ,
}
mcl_torches.register_torch ( off_def )
local off_override = {
mesecons = {
receptor = {
state = mesecon.state . off ,
rules = torch_get_output_rules ,
} ,
effector = {
state = mesecon.state . on ,
rules = torch_get_input_rules ,
action_off = torch_action_off ,
2018-01-22 23:11:10 +03:00
} ,
2018-01-23 01:51:44 +03:00
}
2021-04-13 10:59:32 +03:00
}
2018-01-23 01:51:44 +03:00
2021-04-13 10:59:32 +03:00
minetest.override_item ( " mesecons_torch:mesecon_torch_off " , off_override )
minetest.override_item ( " mesecons_torch:mesecon_torch_off_wall " , off_override )
2018-01-23 01:51:44 +03:00
2021-04-13 10:59:32 +03:00
local overheated_def = table.copy ( off_def )
overheated_def.name = " mesecon_torch_overheated "
overheated_def.description = S ( " Redstone Torch (overheated) " )
2018-01-23 01:51:44 +03:00
2021-04-13 10:59:32 +03:00
mcl_torches.register_torch ( overheated_def )
local overheated_override = {
on_timer = function ( pos , elapsed )
if not mesecon.is_powered ( pos ) then
2020-05-13 22:11:17 +03:00
local node = minetest.get_node ( pos )
2021-04-13 10:59:32 +03:00
torch_action_off ( pos , node )
end
end
}
minetest.override_item ( " mesecons_torch:mesecon_torch_overheated " , overheated_override )
minetest.override_item ( " mesecons_torch:mesecon_torch_overheated_wall " , overheated_override )
local on_def = {
name = " mesecon_torch_on " ,
description = S ( " Redstone Torch " ) ,
doc_items_longdesc = 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. " ) ,
doc_items_usagehelp = S ( " Redstone torches can be placed at the side and on the top of full solid opaque blocks. " ) ,
icon = " jeija_torches_on.png " ,
tiles = { " jeija_torches_on.png " } ,
light = 7 ,
groups = { dig_immediate = 3 , dig_by_water = 1 , redstone_torch = 1 , mesecon_ignore_opaque_dig = 1 } ,
sounds = mcl_sounds.node_sound_wood_defaults ( ) ,
}
mcl_torches.register_torch ( on_def )
local on_override = {
on_destruct = function ( pos , oldnode )
local node = minetest.get_node ( pos )
torch_action_on ( pos , node )
end ,
mesecons = {
receptor = {
state = mesecon.state . on ,
rules = torch_get_output_rules
2020-03-08 05:18:47 +03:00
} ,
2021-04-13 10:59:32 +03:00
effector = {
state = mesecon.state . off ,
rules = torch_get_input_rules ,
action_on = torch_action_on ,
} ,
} ,
_tt_help = S ( " Provides redstone power when it's not powered itself " ) ,
}
minetest.override_item ( " mesecons_torch:mesecon_torch_on " , on_override )
minetest.override_item ( " mesecons_torch:mesecon_torch_on_wall " , on_override )
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 " ) ,
2020-02-19 06:54:17 +03:00
_tt_help = S ( " Provides redstone power " ) ,
2019-03-08 03:07:41 +03:00
_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
} } ,
2020-04-17 22:40:13 +03:00
_mcl_blast_resistance = 6 ,
2017-03-15 22:46:36 +03:00
_mcl_hardness = 5 ,
2015-06-29 20:55:56 +03:00
} )
minetest.register_craft ( {
output = " mesecons_torch:redstoneblock " ,
recipe = {
2021-05-29 17:12:33 +03:00
{ " 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 " } ,
2015-06-29 20:55:56 +03:00
}
} )
minetest.register_craft ( {
2021-05-29 17:12:33 +03:00
output = " mesecons:wire_00000000_off 9 " ,
2015-06-29 20:55:56 +03:00
recipe = {
2021-05-29 17:12:33 +03:00
{ " mesecons_torch:redstoneblock " } ,
2015-06-29 20:55:56 +03:00
}
} )
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