Burnout rs torch if it changes state too often
parent
eacda330eb
commit
da2fbed4c2
|
@ -99,8 +99,8 @@ minetest.register_on_placenode(mesecon.on_placenode)
|
||||||
minetest.register_on_dignode(mesecon.on_dignode)
|
minetest.register_on_dignode(mesecon.on_dignode)
|
||||||
|
|
||||||
-- Overheating service for fast circuits
|
-- Overheating service for fast circuits
|
||||||
local OVERHEAT_MAX = mesecon.setting("overheat_max", 20)
|
local OVERHEAT_MAX = mesecon.setting("overheat_max", 8)
|
||||||
local COOLDOWN_TIME = mesecon.setting("cooldown_time", 2.0)
|
local COOLDOWN_TIME = mesecon.setting("cooldown_time", 3.0)
|
||||||
local COOLDOWN_STEP = mesecon.setting("cooldown_granularity", 0.5)
|
local COOLDOWN_STEP = mesecon.setting("cooldown_granularity", 0.5)
|
||||||
local COOLDOWN_MULTIPLIER = OVERHEAT_MAX / COOLDOWN_TIME
|
local COOLDOWN_MULTIPLIER = OVERHEAT_MAX / COOLDOWN_TIME
|
||||||
local cooldown_timer = 0.0
|
local cooldown_timer = 0.0
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
--MESECON TORCHES
|
-- REDSTONE TORCHES
|
||||||
|
|
||||||
|
local TORCH_COOLOFF = 120 -- Number of seconds it takes for a burned-out torch to reactivate
|
||||||
|
|
||||||
local rotate_torch_rules = function (rules, param2)
|
local rotate_torch_rules = function (rules, param2)
|
||||||
if param2 == 1 then
|
if param2 == 1 then
|
||||||
|
@ -45,23 +47,64 @@ local torch_get_input_rules = function(node)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
local torch_action_on = function(pos, node)
|
local torch_action_on = function(pos, node)
|
||||||
|
local overheat
|
||||||
if node.name == "mesecons_torch:mesecon_torch_on" then
|
if node.name == "mesecons_torch:mesecon_torch_on" then
|
||||||
minetest.set_node(pos, {name="mesecons_torch:mesecon_torch_off", param2=node.param2})
|
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
|
||||||
mesecon.receptor_off(pos, torch_get_output_rules(node))
|
mesecon.receptor_off(pos, torch_get_output_rules(node))
|
||||||
elseif node.name == "mesecons_torch:mesecon_torch_on_wall" then
|
elseif node.name == "mesecons_torch:mesecon_torch_on_wall" then
|
||||||
minetest.set_node(pos, {name="mesecons_torch:mesecon_torch_off_wall", param2=node.param2})
|
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
|
||||||
mesecon.receptor_off(pos, torch_get_output_rules(node))
|
mesecon.receptor_off(pos, torch_get_output_rules(node))
|
||||||
end
|
end
|
||||||
|
if overheat then
|
||||||
|
torch_overheated(pos)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local torch_action_off = function(pos, node)
|
local torch_action_off = function(pos, node)
|
||||||
if node.name == "mesecons_torch:mesecon_torch_off" then
|
local overheat
|
||||||
minetest.set_node(pos, {name="mesecons_torch:mesecon_torch_on", param2=node.param2})
|
if node.name == "mesecons_torch:mesecon_torch_off" or node.name == "mesecons_torch:mesecon_torch_overheated" then
|
||||||
mesecon.receptor_on(pos, torch_get_output_rules(node))
|
overheat = mesecon.do_overheat(pos)
|
||||||
elseif node.name == "mesecons_torch:mesecon_torch_off_wall" then
|
if overheat then
|
||||||
minetest.set_node(pos, {name="mesecons_torch:mesecon_torch_on_wall", param2=node.param2})
|
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_overheated", param2=node.param2})
|
||||||
mesecon.receptor_on(pos, torch_get_output_rules(node))
|
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)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -98,6 +141,29 @@ mcl_torches.register_torch("mesecon_torch_off", "Redstone Torch (off)",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
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,
|
||||||
|
{dig_immediate=3, dig_by_water=1, redstone_torch=2, not_in_creative_inventory=1},
|
||||||
|
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,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mcl_torches.register_torch("mesecon_torch_on", "Redstone Torch",
|
mcl_torches.register_torch("mesecon_torch_on", "Redstone Torch",
|
||||||
"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.",
|
"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.",
|
||||||
[[Redstone torches can generally be placed at the side and on the top of full solid opaque blocks. The following exceptions apply:
|
[[Redstone torches can generally be placed at the side and on the top of full solid opaque blocks. The following exceptions apply:
|
||||||
|
|
Loading…
Reference in New Issue