Add mesecon senders
This commit is contained in:
parent
e1df78ba3e
commit
d48074ed9e
94
mesecons.lua
94
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
|
-- Legacy rmod alias
|
||||||
minetest.register_alias_force('rmod:scriptblock_mesecon',
|
minetest.register_alias_force('rmod:scriptblock_mesecon',
|
||||||
'scriptblocks:mesecon_receiver')
|
'scriptblocks:mesecon_receiver')
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 263 B |
Reference in New Issue