mirror of
https://github.com/minetest-mods/mesecons.git
synced 2024-11-17 15:48:28 +01:00
Store gate inputs in param2 instead of metadata (#583)
This commit is contained in:
parent
da57a6214a
commit
68171b3d8d
@ -23,16 +23,18 @@ local gate_get_input_rules_twoinputs = mesecon.horiz_rules_getter({
|
|||||||
local function set_gate(pos, node, state)
|
local function set_gate(pos, node, state)
|
||||||
local gate = minetest.registered_nodes[node.name]
|
local gate = minetest.registered_nodes[node.name]
|
||||||
|
|
||||||
if mesecon.do_overheat(pos) then
|
local new_nodename = state and gate.onstate or gate.offstate
|
||||||
minetest.remove_node(pos)
|
minetest.swap_node(pos, {name = new_nodename, param2 = node.param2})
|
||||||
mesecon.receptor_off(pos, gate_get_output_rules(node))
|
if new_nodename ~= node.name then
|
||||||
minetest.add_item(pos, gate.drop)
|
if mesecon.do_overheat(pos) then
|
||||||
elseif state then
|
minetest.remove_node(pos)
|
||||||
minetest.swap_node(pos, {name = gate.onstate, param2=node.param2})
|
mesecon.receptor_off(pos, gate_get_output_rules(node))
|
||||||
mesecon.receptor_on(pos, gate_get_output_rules(node))
|
minetest.add_item(pos, gate.drop)
|
||||||
else
|
elseif state then
|
||||||
minetest.swap_node(pos, {name = gate.offstate, param2=node.param2})
|
mesecon.receptor_on(pos, gate_get_output_rules(node))
|
||||||
mesecon.receptor_off(pos, gate_get_output_rules(node))
|
else
|
||||||
|
mesecon.receptor_off(pos, gate_get_output_rules(node))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -42,11 +44,36 @@ local function update_gate(pos, node, link, newstate)
|
|||||||
if gate.inputnumber == 1 then
|
if gate.inputnumber == 1 then
|
||||||
set_gate(pos, node, gate.assess(newstate == "on"))
|
set_gate(pos, node, gate.assess(newstate == "on"))
|
||||||
elseif gate.inputnumber == 2 then
|
elseif gate.inputnumber == 2 then
|
||||||
local meta = minetest.get_meta(pos)
|
-- Inputs are stored in param2. Bit 5 is always set.
|
||||||
meta:set_int(link.name, newstate == "on" and 1 or 0)
|
-- input1 is bit 6 and input2 is bit 7.
|
||||||
|
local val1, val2
|
||||||
local val1 = meta:get_int("input1") == 1
|
if node.param2 >= 32 then
|
||||||
local val2 = meta:get_int("input2") == 1
|
-- Bit 5 is set, so param2 is in the proper format.
|
||||||
|
if link.name == "input1" then
|
||||||
|
val1 = newstate == "on"
|
||||||
|
val2 = node.param2 >= 128
|
||||||
|
else
|
||||||
|
val1 = node.param2 % 128 >= 64
|
||||||
|
val2 = newstate == "on"
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Migrate old gates where the inputs are stored as metadata.
|
||||||
|
-- This also triggers for newly placed gates.
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if link.name == "input1" then
|
||||||
|
val1 = newstate == "on"
|
||||||
|
val2 = meta:get_int("input2") == 1
|
||||||
|
else
|
||||||
|
val1 = meta:get_int("input1") == 1
|
||||||
|
val2 = newstate == "on"
|
||||||
|
end
|
||||||
|
-- Set bit 5 so this won't happen again.
|
||||||
|
node.param2 = node.param2 + 32
|
||||||
|
-- Clear the metadata.
|
||||||
|
meta:set_string("input1", "")
|
||||||
|
meta:set_string("input2", "")
|
||||||
|
end
|
||||||
|
node.param2 = node.param2 % 64 + (val1 and 64 or 0) + (val2 and 128 or 0)
|
||||||
set_gate(pos, node, gate.assess(val1, val2))
|
set_gate(pos, node, gate.assess(val1, val2))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user