forked from Mirrorlandia_minetest/mesecons
Merge pull request #144 from Novatux/gates-fix
Fix gates with serverstep code. Let's give that a try.
This commit is contained in:
commit
a6bd955449
@ -2,4 +2,31 @@ minetest.swap_node = minetest.swap_node or function(pos, node)
|
|||||||
local data = minetest.get_meta(pos):to_table()
|
local data = minetest.get_meta(pos):to_table()
|
||||||
minetest.add_node(pos, node)
|
minetest.add_node(pos, node)
|
||||||
minetest.get_meta(pos):from_table(data)
|
minetest.get_meta(pos):from_table(data)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local rules = {}
|
||||||
|
rules.a = {x = -1, y = 0, z = 0, name="A"}
|
||||||
|
rules.b = {x = 0, y = 0, z = 1, name="B"}
|
||||||
|
rules.c = {x = 1, y = 0, z = 0, name="C"}
|
||||||
|
rules.d = {x = 0, y = 0, z = -1, name="D"}
|
||||||
|
|
||||||
|
function legacy_update_ports(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
L = {
|
||||||
|
a = mesecon:is_power_on(mesecon:addPosRule(pos, rules.a),
|
||||||
|
mesecon:invertRule(rules.a)) and
|
||||||
|
mesecon:rules_link(mesecon:addPosRule(pos, rules.a), pos),
|
||||||
|
b = mesecon:is_power_on(mesecon:addPosRule(pos, rules.b),
|
||||||
|
mesecon:invertRule(rules.b)) and
|
||||||
|
mesecon:rules_link(mesecon:addPosRule(pos, rules.b), pos),
|
||||||
|
c = mesecon:is_power_on(mesecon:addPosRule(pos, rules.c),
|
||||||
|
mesecon:invertRule(rules.c)) and
|
||||||
|
mesecon:rules_link(mesecon:addPosRule(pos, rules.c), pos),
|
||||||
|
d = mesecon:is_power_on(mesecon:addPosRule(pos, rules.d),
|
||||||
|
mesecon:invertRule(rules.d)) and
|
||||||
|
mesecon:rules_link(mesecon:addPosRule(pos, rules.d), pos),
|
||||||
|
}
|
||||||
|
local n = (L.a and 1 or 0) + (L.b and 2 or 0) + (L.c and 4 or 0) + (L.d and 8 or 0) + 1
|
||||||
|
meta:set_int("real_portstates", n)
|
||||||
|
return L
|
||||||
|
end
|
||||||
|
@ -23,7 +23,8 @@ function gate_get_input_rules_twoinputs(node)
|
|||||||
return gate_rotate_rules(node)
|
return gate_rotate_rules(node)
|
||||||
end
|
end
|
||||||
|
|
||||||
function update_gate(pos)
|
function update_gate(pos, node, rulename, newstate)
|
||||||
|
yc_update_real_portstates(pos, node, rulename, newstate)
|
||||||
gate = get_gate(pos)
|
gate = get_gate(pos)
|
||||||
L = rotate_ports(
|
L = rotate_ports(
|
||||||
yc_get_real_portstates(pos),
|
yc_get_real_portstates(pos),
|
||||||
|
@ -31,18 +31,46 @@ rules.d = {x = 0, y = 0, z = -1, name="D"}
|
|||||||
------------------
|
------------------
|
||||||
-- These helpers are required to set the portstates of the luacontroller
|
-- These helpers are required to set the portstates of the luacontroller
|
||||||
|
|
||||||
|
function lc_update_real_portstates(pos, rulename, newstate)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if rulename == nil then
|
||||||
|
meta:set_int("real_portstates", 1)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local n = meta:get_int("real_portstates") - 1
|
||||||
|
if n < 0 then
|
||||||
|
legacy_update_ports(pos)
|
||||||
|
n = meta:get_int("real_portstates") - 1
|
||||||
|
end
|
||||||
|
local L = {}
|
||||||
|
for i = 1, 4 do
|
||||||
|
L[i] = n%2
|
||||||
|
n = math.floor(n/2)
|
||||||
|
end
|
||||||
|
if rulename.x == nil then
|
||||||
|
for _, rname in ipairs(rulename) do
|
||||||
|
local port = ({4, 1, nil, 3, 2})[rname.x+2*rname.z+3]
|
||||||
|
L[port] = (newstate == "on") and 1 or 0
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local port = ({4, 1, nil, 3, 2})[rulename.x+2*rulename.z+3]
|
||||||
|
L[port] = (newstate == "on") and 1 or 0
|
||||||
|
end
|
||||||
|
meta:set_int("real_portstates", 1 + L[1] + 2*L[2] + 4*L[3] + 8*L[4])
|
||||||
|
end
|
||||||
|
|
||||||
local get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside)
|
local get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside)
|
||||||
ports = {
|
local meta = minetest.get_meta(pos)
|
||||||
a = mesecon:is_power_on(mesecon:addPosRule(pos, rules.a), mesecon:invertRule(rules.a))
|
local L = {}
|
||||||
and mesecon:rules_link(mesecon:addPosRule(pos, rules.a), pos),
|
local n = meta:get_int("real_portstates") - 1
|
||||||
b = mesecon:is_power_on(mesecon:addPosRule(pos, rules.b), mesecon:invertRule(rules.b))
|
if n < 0 then
|
||||||
and mesecon:rules_link(mesecon:addPosRule(pos, rules.b), pos),
|
return legacy_update_ports(pos)
|
||||||
c = mesecon:is_power_on(mesecon:addPosRule(pos, rules.c), mesecon:invertRule(rules.c))
|
end
|
||||||
and mesecon:rules_link(mesecon:addPosRule(pos, rules.c), pos),
|
for _, index in ipairs({"a", "b", "c", "d"}) do
|
||||||
d = mesecon:is_power_on(mesecon:addPosRule(pos, rules.d), mesecon:invertRule(rules.d))
|
L[index] = ((n%2) == 1)
|
||||||
and mesecon:rules_link(mesecon:addPosRule(pos, rules.d), pos),
|
n = math.floor(n/2)
|
||||||
}
|
end
|
||||||
return ports
|
return L
|
||||||
end
|
end
|
||||||
|
|
||||||
local merge_portstates = function (ports, vports)
|
local merge_portstates = function (ports, vports)
|
||||||
@ -457,6 +485,7 @@ local mesecons = {
|
|||||||
{
|
{
|
||||||
rules = input_rules[cid],
|
rules = input_rules[cid],
|
||||||
action_change = function (pos, _, rulename, newstate)
|
action_change = function (pos, _, rulename, newstate)
|
||||||
|
lc_update_real_portstates(pos, rulename, newstate)
|
||||||
lc_update(pos, {type=newstate, pin=rulename})
|
lc_update(pos, {type=newstate, pin=rulename})
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
@ -39,7 +39,8 @@ mesecon:add_rules(nodename, rules)
|
|||||||
local mesecons = {effector =
|
local mesecons = {effector =
|
||||||
{
|
{
|
||||||
rules = input_rules,
|
rules = input_rules,
|
||||||
action_change = function (pos, node, rulename)
|
action_change = function (pos, node, rulename, newstate)
|
||||||
|
yc_update_real_portstates(pos, node, rulename, newstate)
|
||||||
update_yc(pos)
|
update_yc(pos)
|
||||||
end
|
end
|
||||||
}}
|
}}
|
||||||
@ -633,25 +634,45 @@ function yc_set_portstate(port, state, L)
|
|||||||
return L
|
return L
|
||||||
end
|
end
|
||||||
|
|
||||||
function yc_get_real_portstates(pos) -- port powered or not (by itself or from outside)?
|
function yc_update_real_portstates(pos, node, rulename, newstate)
|
||||||
rulesA = mesecon:get_rules("mesecons_microcontroller:microcontroller0001")
|
local meta = minetest.get_meta(pos)
|
||||||
rulesB = mesecon:get_rules("mesecons_microcontroller:microcontroller0010")
|
if rulename == nil then
|
||||||
rulesC = mesecon:get_rules("mesecons_microcontroller:microcontroller0100")
|
meta:set_int("real_portstates", 1)
|
||||||
rulesD = mesecon:get_rules("mesecons_microcontroller:microcontroller1000")
|
return
|
||||||
L = {
|
end
|
||||||
a = mesecon:is_power_on(mesecon:addPosRule(pos, rulesA[1]),
|
local n = meta:get_int("real_portstates") - 1
|
||||||
mesecon:invertRule(rulesA[1])) and
|
if n < 0 then
|
||||||
mesecon:rules_link(mesecon:addPosRule(pos, rulesA[1]), pos),
|
legacy_update_ports(pos)
|
||||||
b = mesecon:is_power_on(mesecon:addPosRule(pos, rulesB[1]),
|
n = meta:get_int("real_portstates") - 1
|
||||||
mesecon:invertRule(rulesB[1])) and
|
end
|
||||||
mesecon:rules_link(mesecon:addPosRule(pos, rulesB[1]), pos),
|
local L = {}
|
||||||
c = mesecon:is_power_on(mesecon:addPosRule(pos, rulesC[1]),
|
for i = 1, 4 do
|
||||||
mesecon:invertRule(rulesC[1])) and
|
L[i] = n%2
|
||||||
mesecon:rules_link(mesecon:addPosRule(pos, rulesC[1]), pos),
|
n = math.floor(n/2)
|
||||||
d = mesecon:is_power_on(mesecon:addPosRule(pos, rulesD[1]),
|
end
|
||||||
mesecon:invertRule(rulesD[1])) and
|
if rulename.x == nil then
|
||||||
mesecon:rules_link(mesecon:addPosRule(pos, rulesD[1]), pos),
|
for _, rname in ipairs(rulename) do
|
||||||
}
|
local port = ({4, 1, nil, 3, 2})[rname.x+2*rname.z+3]
|
||||||
|
L[port] = (newstate == "on") and 1 or 0
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local port = ({4, 1, nil, 3, 2})[rulename.x+2*rulename.z+3]
|
||||||
|
L[port] = (newstate == "on") and 1 or 0
|
||||||
|
end
|
||||||
|
meta:set_int("real_portstates", 1 + L[1] + 2*L[2] + 4*L[3] + 8*L[4])
|
||||||
|
end
|
||||||
|
|
||||||
|
function yc_get_real_portstates(pos) -- determine if ports are powered (by itself or from outside)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local L = {}
|
||||||
|
local n = meta:get_int("real_portstates") - 1
|
||||||
|
if n < 0 then
|
||||||
|
return legacy_update_ports(pos)
|
||||||
|
end
|
||||||
|
for _, index in ipairs({"a", "b", "c", "d"}) do
|
||||||
|
L[index] = ((n%2) == 1)
|
||||||
|
n = math.floor(n/2)
|
||||||
|
end
|
||||||
return L
|
return L
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user