From da2fbed4c25dbfdfe3440b189d3e3becc58f5fdb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 22 Jan 2018 23:51:44 +0100 Subject: [PATCH] Burnout rs torch if it changes state too often --- mods/ITEMS/REDSTONE/mesecons/services.lua | 4 +- mods/ITEMS/REDSTONE/mesecons_torch/init.lua | 84 ++++++++++++++++++--- 2 files changed, 77 insertions(+), 11 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons/services.lua b/mods/ITEMS/REDSTONE/mesecons/services.lua index 3b75010f1..0a65b3bc2 100644 --- a/mods/ITEMS/REDSTONE/mesecons/services.lua +++ b/mods/ITEMS/REDSTONE/mesecons/services.lua @@ -99,8 +99,8 @@ minetest.register_on_placenode(mesecon.on_placenode) minetest.register_on_dignode(mesecon.on_dignode) -- Overheating service for fast circuits -local OVERHEAT_MAX = mesecon.setting("overheat_max", 20) -local COOLDOWN_TIME = mesecon.setting("cooldown_time", 2.0) +local OVERHEAT_MAX = mesecon.setting("overheat_max", 8) +local COOLDOWN_TIME = mesecon.setting("cooldown_time", 3.0) local COOLDOWN_STEP = mesecon.setting("cooldown_granularity", 0.5) local COOLDOWN_MULTIPLIER = OVERHEAT_MAX / COOLDOWN_TIME local cooldown_timer = 0.0 diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/init.lua b/mods/ITEMS/REDSTONE/mesecons_torch/init.lua index 81d7dc108..f5724875b 100644 --- a/mods/ITEMS/REDSTONE/mesecons_torch/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_torch/init.lua @@ -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) if param2 == 1 then @@ -45,23 +47,64 @@ local torch_get_input_rules = function(node) 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 overheat 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)) 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)) end + if overheat then + torch_overheated(pos) + end end local torch_action_off = function(pos, node) - if node.name == "mesecons_torch:mesecon_torch_off" then - minetest.set_node(pos, {name="mesecons_torch:mesecon_torch_on", param2=node.param2}) - mesecon.receptor_on(pos, torch_get_output_rules(node)) - elseif node.name == "mesecons_torch:mesecon_torch_off_wall" then - minetest.set_node(pos, {name="mesecons_torch:mesecon_torch_on_wall", param2=node.param2}) - mesecon.receptor_on(pos, torch_get_output_rules(node)) + 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) 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", "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: