From d48074ed9ee7d769863ce7ea483836583aff0f98 Mon Sep 17 00:00:00 2001 From: luk3yx Date: Fri, 7 Sep 2018 18:53:32 +1200 Subject: [PATCH] Add mesecon senders --- mesecons.lua | 94 ++++++++++++++++++++ textures/scriptblocks_mesecon_sender_on.png | Bin 0 -> 263 bytes 2 files changed, 94 insertions(+) create mode 100644 textures/scriptblocks_mesecon_sender_on.png diff --git a/mesecons.lua b/mesecons.lua index 30490e8..4a20060 100644 --- a/mesecons.lua +++ b/mesecons.lua @@ -32,6 +32,100 @@ field[info;Starting @info;${info}] }} }) +-- Mesecon sender +local get_rules = function(pos) + local rules = {} + for _, rule in ipairs(mesecon.rules.alldirs) do + local rpos = vector.add(pos, rule) + local node = minetest.get_node(rpos) + local def = node.name and minetest.registered_nodes[node.name] + if def and not def.scriptblock then + table.insert(rules, rule) + end + end + return rules +end + +local disable_sender = function(pos) + if minetest.get_node(pos).name ~= 'scriptblocks:mesecon_sender_on' then + return + end + minetest.swap_node(pos, {name = 'scriptblocks:mesecon_sender_off'}) + mesecon.receptor_off(pos, get_rules(pos)) +end + +mesecon.register_node('scriptblocks:mesecon_sender', { + description = 'Scriptblocks: Mesecon Sender', + use_texture_alpha = true, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('mode', tostring(scriptblocks.tick_delay + 0.15)) + meta:set_string('formspec', [[ +field[mode;Pulse delay (0 to toggle, @info/@last for if);${mode}] +]]) + end, + on_receive_fields = scriptblocks.create_formspec_handler( + false, 'mode' + ), + scriptblock = function(pos, node, sender, info, last, main_channel) + local meta = minetest.get_meta(pos) + local mode = meta:get_string('mode') + local cond = nil + if mode == '0' then + cond = mesecon.flipstate(pos, node) == 'on' + elseif mode == '@info' then + cond = info + elseif mode == '@last' then + cond = last + else + cond = tonumber(mode) + end + + if type(cond) == 'number' then + local delay = cond + cond = true + if type(delay) ~= 'number' or + not (delay > scriptblocks.tick_delay) then + -- Catch nil, NaN and small numbers + delay = 0.1 + elseif delay > 5 then + -- Catch large numbers and inf + delay = 5 + end + minetest.after(delay, disable_sender, pos) + end + + if cond ~= nil then + local state + if cond then + state = 'on' + else + state = 'off' + end + minetest.swap_node(pos, { + name = 'scriptblocks:mesecon_sender_' .. state, + }) + mesecon['receptor_' .. state](pos, get_rules(pos)) + end + end, +}, { + groups = {oddly_breakable_by_hand = 1}, + tiles = {'scriptblocks_mesecon_sender.png'}, + mesecons = {receptor = { + state = mesecon.state.off, + rules = mesecon.rules.allfaces, + }} +}, { + groups = {oddly_breakable_by_hand = 1, not_in_creative_inventory = 1}, + tiles = {'scriptblocks_mesecon_sender_on.png'}, + mesecons = {receptor = { + state = mesecon.state.on, + rules = mesecon.rules.allfaces, + }} +}) +minetest.register_alias('scriptblocks:mesecon_sender', + 'scriptblocks:mesecon_sender_off') + -- Legacy rmod alias minetest.register_alias_force('rmod:scriptblock_mesecon', 'scriptblocks:mesecon_receiver') diff --git a/textures/scriptblocks_mesecon_sender_on.png b/textures/scriptblocks_mesecon_sender_on.png new file mode 100644 index 0000000000000000000000000000000000000000..8212e7659e203a748cb6a97e8642f0673b109f43 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPdCp(*=u;a%9d!UePW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<1J6wmf_aSYKopIq~`V|t^=fkOul960uErpML&bssl5MA$rP z39YX@2^2hV#6hXy)`xe7iSr#|&NZoNsdT@SH`yF6VuEYNfyWtIM@?MJH%it0RZ?taW_ZP?{JQO<(H)R`JYD@<);T3K0RS1`S|