mirror of
https://github.com/minetest-mods/mesecons.git
synced 2025-06-28 13:56:02 +02:00
Merge branch 'mesecons_in_nodedef'
Conflicts: mesecons/internal.lua
This commit is contained in:
@ -3,63 +3,82 @@
|
||||
-- | \/ | |___ ____ |___ | | | | \ | |____
|
||||
-- | | | | | | | | | \ | |
|
||||
-- | | |___ ____| |___ |____ |____| | \| ____|
|
||||
-- by Jeija and Minerd247
|
||||
-- by Jeija, Uberi (Temperest), sfan5, VanessaE
|
||||
--
|
||||
--
|
||||
--
|
||||
-- This mod adds mesecons[=minecraft redstone] and different receptors/effectors to minetest.
|
||||
--
|
||||
-- See the documentation on the forum for additional information, especially about crafting
|
||||
--
|
||||
-- For developer documentation see the Developers' section on mesecons.tk
|
||||
--
|
||||
-- For developer documentation see the Developers' section on mesecons.TK
|
||||
--
|
||||
--
|
||||
--
|
||||
--Quick draft for the mesecons array in the node's definition
|
||||
--mesecons =
|
||||
--{
|
||||
-- receptor =
|
||||
-- {
|
||||
-- state = mesecon.state.on/off
|
||||
-- rules = rules/get_rules
|
||||
-- }
|
||||
-- effector =
|
||||
-- {
|
||||
-- action_on = function
|
||||
-- action_off = function
|
||||
-- action_change = function
|
||||
-- rules = rules/get_rules
|
||||
-- }
|
||||
-- conductor =
|
||||
-- {
|
||||
-- state = mesecon.state.on/off
|
||||
-- offstate = opposite state (for state = on only)
|
||||
-- onstate = opposite state (for state = off only)
|
||||
-- rules = rules/get_rules
|
||||
-- }
|
||||
--}
|
||||
|
||||
|
||||
-- PUBLIC VARIABLES
|
||||
mesecon={} -- contains all functions and all global variables
|
||||
mesecon.actions_on={} -- Saves registered function callbacks for mesecon on
|
||||
mesecon.actions_off={} -- Saves registered function callbacks for mesecon off
|
||||
mesecon.actions_change={} -- Saves registered function callbacks for mesecon change
|
||||
mesecon.receptors={}
|
||||
mesecon.effectors={}
|
||||
mesecon.rules={}
|
||||
mesecon.conductors={}
|
||||
mesecon.actions_on={} -- Saves registered function callbacks for mesecon on | DEPRECATED
|
||||
mesecon.actions_off={} -- Saves registered function callbacks for mesecon off | DEPRECATED
|
||||
mesecon.actions_change={} -- Saves registered function callbacks for mesecon change | DEPRECATED
|
||||
mesecon.receptors={} -- saves all information about receptors | DEPRECATED
|
||||
mesecon.effectors={} -- saves all information about effectors | DEPRECATED
|
||||
mesecon.conductors={} -- saves all information about conductors | DEPRECATED
|
||||
|
||||
-- INCLUDE SETTINGS
|
||||
-- Settings
|
||||
dofile(minetest.get_modpath("mesecons").."/settings.lua")
|
||||
|
||||
--Internal API
|
||||
-- Presets (eg default rules)
|
||||
dofile(minetest.get_modpath("mesecons").."/presets.lua");
|
||||
|
||||
|
||||
-- Utilities like comparing positions,
|
||||
-- adding positions and rules,
|
||||
-- mostly things that make the source look cleaner
|
||||
dofile(minetest.get_modpath("mesecons").."/util.lua");
|
||||
|
||||
-- Internal stuff
|
||||
-- This is the most important file
|
||||
-- it handles signal transmission and basically everything else
|
||||
-- It is also responsible for managing the nodedef things,
|
||||
-- like calling action_on/off/change
|
||||
dofile(minetest.get_modpath("mesecons").."/internal.lua");
|
||||
|
||||
-- API API API API API API API API API API API API API API API API API API
|
||||
-- Deprecated stuff
|
||||
-- To be removed in future releases
|
||||
dofile(minetest.get_modpath("mesecons").."/legacy.lua");
|
||||
|
||||
function mesecon:register_receptor(onstate, offstate, rules, get_rules)
|
||||
if get_rules == nil and rules == nil then
|
||||
rules = mesecon:get_rules("default")
|
||||
end
|
||||
table.insert(mesecon.receptors,
|
||||
{onstate = onstate,
|
||||
offstate = offstate,
|
||||
rules = rules,
|
||||
get_rules = get_rules})
|
||||
end
|
||||
|
||||
function mesecon:register_effector(onstate, offstate, input_rules, get_input_rules)
|
||||
if get_input_rules==nil and input_rules==nil then
|
||||
rules=mesecon:get_rules("default")
|
||||
end
|
||||
table.insert(mesecon.effectors,
|
||||
{onstate = onstate,
|
||||
offstate = offstate,
|
||||
input_rules = input_rules,
|
||||
get_input_rules = get_input_rules})
|
||||
end
|
||||
-- API
|
||||
-- these are the only functions you need to remember
|
||||
|
||||
function mesecon:receptor_on(pos, rules)
|
||||
if rules == nil then
|
||||
rules = mesecon:get_rules("default")
|
||||
end
|
||||
rules = rules or mesecon.rules.default
|
||||
|
||||
for i, rule in ipairs(rules) do
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = {
|
||||
x = pos.x + rule.x,
|
||||
y = pos.y + rule.y,
|
||||
@ -71,11 +90,9 @@ function mesecon:receptor_on(pos, rules)
|
||||
end
|
||||
|
||||
function mesecon:receptor_off(pos, rules)
|
||||
if rules == nil then
|
||||
rules = mesecon:get_rules("default")
|
||||
end
|
||||
rules = rules or mesecon.rules.default
|
||||
|
||||
for i, rule in ipairs(rules) do
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = {
|
||||
x = pos.x + rule.x,
|
||||
y = pos.y + rule.y,
|
||||
@ -86,45 +103,11 @@ function mesecon:receptor_off(pos, rules)
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:register_on_signal_on(action)
|
||||
table.insert(mesecon.actions_on, action)
|
||||
end
|
||||
|
||||
function mesecon:register_on_signal_off(action)
|
||||
table.insert(mesecon.actions_off, action)
|
||||
end
|
||||
|
||||
function mesecon:register_on_signal_change(action)
|
||||
table.insert(mesecon.actions_change, action)
|
||||
end
|
||||
|
||||
function mesecon:register_conductor (onstate, offstate, rules, get_rules)
|
||||
if rules == nil then
|
||||
rules = mesecon:get_rules("default")
|
||||
end
|
||||
table.insert(mesecon.conductors, {onstate = onstate, offstate = offstate, rules = rules, get_rules = get_rules})
|
||||
end
|
||||
|
||||
mesecon:add_rules("default",
|
||||
{{x=0, y=0, z=-1},
|
||||
{x=1, y=0, z=0},
|
||||
{x=-1, y=0, z=0},
|
||||
{x=0, y=0, z=1},
|
||||
{x=1, y=1, z=0},
|
||||
{x=1, y=-1, z=0},
|
||||
{x=-1, y=1, z=0},
|
||||
{x=-1, y=-1, z=0},
|
||||
{x=0, y=1, z=1},
|
||||
{x=0, y=-1, z=1},
|
||||
{x=0, y=1, z=-1},
|
||||
{x=0, y=-1, z=-1}})
|
||||
|
||||
print("[MESEcons] Main mod Loaded!")
|
||||
print("[OK] mesecons")
|
||||
|
||||
--The actual wires
|
||||
dofile(minetest.get_modpath("mesecons").."/wires.lua");
|
||||
|
||||
--Services like turnoff receptor on dignode and so on
|
||||
dofile(minetest.get_modpath("mesecons").."/services.lua");
|
||||
--Deprecated stuff
|
||||
dofile(minetest.get_modpath("mesecons").."/legacy.lua");
|
||||
|
@ -1,7 +1,14 @@
|
||||
-- INTERNAL
|
||||
|
||||
--Receptors
|
||||
-- Receptors
|
||||
-- Nodes that can power mesecons
|
||||
function mesecon:is_receptor_node(nodename)
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.receptor
|
||||
and minetest.registered_nodes[nodename].mesecons.receptor.state == mesecon.state.on then
|
||||
return true
|
||||
end
|
||||
for _, receptor in ipairs(mesecon.receptors) do
|
||||
if receptor.onstate == nodename then
|
||||
return true
|
||||
@ -11,6 +18,12 @@ function mesecon:is_receptor_node(nodename)
|
||||
end
|
||||
|
||||
function mesecon:is_receptor_node_off(nodename, pos, ownpos)
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.receptor
|
||||
and minetest.registered_nodes[nodename].mesecons.receptor.state == mesecon.state.off then
|
||||
return true
|
||||
end
|
||||
for _, receptor in ipairs(mesecon.receptors) do
|
||||
if receptor.offstate == nodename then
|
||||
return true
|
||||
@ -20,7 +33,16 @@ function mesecon:is_receptor_node_off(nodename, pos, ownpos)
|
||||
end
|
||||
|
||||
function mesecon:receptor_get_rules(node)
|
||||
for i, receptor in ipairs(mesecon.receptors) do
|
||||
if minetest.registered_nodes[node.name].mesecons
|
||||
and minetest.registered_nodes[node.name].mesecons.receptor then
|
||||
local rules = minetest.registered_nodes[node.name].mesecons.receptor.rules
|
||||
if type(rules) == 'function' then
|
||||
return rules(node)
|
||||
elseif rules then
|
||||
return rules
|
||||
end
|
||||
end
|
||||
for _, receptor in ipairs(mesecon.receptors) do --TODO
|
||||
if receptor.onstate == node.name or receptor.offstate == node.name then
|
||||
if receptor.get_rules ~= nil then
|
||||
return receptor.get_rules(node.param2)
|
||||
@ -31,12 +53,19 @@ function mesecon:receptor_get_rules(node)
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
return mesecon.rules.default
|
||||
end
|
||||
|
||||
-- Effectors
|
||||
-- Nodes that can be powered by mesecons
|
||||
function mesecon:is_effector_on(nodename)
|
||||
for i, effector in ipairs(mesecon.effectors) do
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.effector
|
||||
and minetest.registered_nodes[nodename].mesecons.effector.action_off then
|
||||
return true
|
||||
end
|
||||
for _, effector in ipairs(mesecon.effectors) do --TODO
|
||||
if effector.onstate == nodename then
|
||||
return true
|
||||
end
|
||||
@ -45,7 +74,13 @@ function mesecon:is_effector_on(nodename)
|
||||
end
|
||||
|
||||
function mesecon:is_effector_off(nodename)
|
||||
for i, effector in ipairs(mesecon.effectors) do
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.effector
|
||||
and minetest.registered_nodes[nodename].mesecons.effector.action_on then
|
||||
return true
|
||||
end
|
||||
for _, effector in ipairs(mesecon.effectors) do --TODO
|
||||
if effector.offstate == nodename then
|
||||
return true
|
||||
end
|
||||
@ -54,43 +89,73 @@ function mesecon:is_effector_off(nodename)
|
||||
end
|
||||
|
||||
function mesecon:is_effector(nodename)
|
||||
return mesecon:is_effector_on(nodename) or mesecon:is_effector_off(nodename)
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.effector then
|
||||
return true
|
||||
end
|
||||
return mesecon:is_effector_on(nodename) or mesecon:is_effector_off(nodename) --TODO
|
||||
end
|
||||
|
||||
function mesecon:effector_get_input_rules(node)
|
||||
for i, effector in ipairs(mesecon.effectors) do
|
||||
if minetest.registered_nodes[node.name].mesecons
|
||||
and minetest.registered_nodes[node.name].mesecons.effector then
|
||||
local rules = minetest.registered_nodes[node.name].mesecons.effector.rules
|
||||
if type(rules) == 'function' then
|
||||
return rules(node)
|
||||
elseif rules then
|
||||
return rules
|
||||
end
|
||||
end
|
||||
for _, effector in ipairs(mesecon.effectors) do
|
||||
if effector.onstate == node.name
|
||||
or effector.offstate == node.name then
|
||||
if effector.get_input_rules ~= nil then
|
||||
return effector.get_input_rules(node.param2)
|
||||
elseif mesecon.effectors[i].input_rules ~=nil then
|
||||
elseif effector.input_rules ~=nil then
|
||||
return effector.input_rules
|
||||
else
|
||||
return mesecon:get_rules("default")
|
||||
end
|
||||
end
|
||||
end
|
||||
return mesecon.rules.default
|
||||
end
|
||||
|
||||
--Signals
|
||||
|
||||
function mesecon:activate(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
for i, action in ipairs(mesecon.actions_on) do
|
||||
function mesecon:activate(pos, node)
|
||||
if minetest.registered_nodes[node.name]
|
||||
and minetest.registered_nodes[node.name].mesecons
|
||||
and minetest.registered_nodes[node.name].mesecons.effector
|
||||
and minetest.registered_nodes[node.name].mesecons.effector.action_on then
|
||||
minetest.registered_nodes[node.name].mesecons.effector.action_on (pos, node)
|
||||
end
|
||||
for _, action in ipairs(mesecon.actions_on) do --TODO
|
||||
action(pos, node)
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:deactivate(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
for i, action in ipairs(mesecon.actions_off) do
|
||||
function mesecon:deactivate(pos, node) --TODO
|
||||
if minetest.registered_nodes[node.name]
|
||||
and minetest.registered_nodes[node.name].mesecons
|
||||
and minetest.registered_nodes[node.name].mesecons.effector
|
||||
and minetest.registered_nodes[node.name].mesecons.effector.action_off then
|
||||
minetest.registered_nodes[node.name].mesecons.effector.action_off(pos, node)
|
||||
end
|
||||
for _, action in ipairs(mesecon.actions_off) do
|
||||
action(pos, node)
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:changesignal(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
for i, action in ipairs(mesecon.actions_change) do
|
||||
function mesecon:changesignal(pos, node) --TODO
|
||||
if minetest.registered_nodes[node.name]
|
||||
and minetest.registered_nodes[node.name].mesecons
|
||||
and minetest.registered_nodes[node.name].mesecons.effector
|
||||
and minetest.registered_nodes[node.name].mesecons.effector.action_change then
|
||||
minetest.registered_nodes[node.name].mesecons.effector.action_change(pos, node)
|
||||
end
|
||||
for _, action in ipairs(mesecon.actions_change) do
|
||||
action(pos, node)
|
||||
end
|
||||
end
|
||||
@ -98,21 +163,22 @@ end
|
||||
--Rules
|
||||
|
||||
function mesecon:add_rules(name, rules)
|
||||
table.insert(mesecon.rules, {name = name, rules = rules})
|
||||
mesecon.rules[name] = rules
|
||||
end
|
||||
|
||||
function mesecon:get_rules(name)
|
||||
for i, rule in ipairs(mesecon.rules) do
|
||||
if rule.name==name then
|
||||
return rule.rules
|
||||
end
|
||||
end
|
||||
return mesecon.rules[name]
|
||||
end
|
||||
|
||||
--Conductor system stuff
|
||||
-- Conductors
|
||||
|
||||
function mesecon:get_conductor_on(offstate)
|
||||
for i, conductor in ipairs(mesecon.conductors) do
|
||||
if minetest.registered_nodes[offstate]
|
||||
and minetest.registered_nodes[offstate].mesecons
|
||||
and minetest.registered_nodes[offstate].mesecons.conductor then
|
||||
return minetest.registered_nodes[offstate].mesecons.conductor.onstate
|
||||
end
|
||||
for _, conductor in ipairs(mesecon.conductors) do --TODO
|
||||
if conductor.offstate == offstate then
|
||||
return conductor.onstate
|
||||
end
|
||||
@ -121,7 +187,12 @@ function mesecon:get_conductor_on(offstate)
|
||||
end
|
||||
|
||||
function mesecon:get_conductor_off(onstate)
|
||||
for i, conductor in ipairs(mesecon.conductors) do
|
||||
if minetest.registered_nodes[onstate]
|
||||
and minetest.registered_nodes[onstate].mesecons
|
||||
and minetest.registered_nodes[onstate].mesecons.conductor then
|
||||
return minetest.registered_nodes[onstate].mesecons.conductor.offstate
|
||||
end
|
||||
for _, conductor in ipairs(mesecon.conductors) do --TODO
|
||||
if conductor.onstate == onstate then
|
||||
return conductor.offstate
|
||||
end
|
||||
@ -129,30 +200,53 @@ function mesecon:get_conductor_off(onstate)
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_conductor_on(name)
|
||||
for i, conductor in ipairs(mesecon.conductors) do
|
||||
if conductor.onstate == name then
|
||||
function mesecon:is_conductor_on(nodename)
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.conductor
|
||||
and minetest.registered_nodes[nodename].mesecons.conductor.state == mesecon.state.on then
|
||||
return true
|
||||
end
|
||||
for _, conductor in ipairs(mesecon.conductors) do --TODO
|
||||
if conductor.onstate == nodename then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_conductor_off(name)
|
||||
for i, conductor in ipairs(mesecon.conductors) do
|
||||
if conductor.offstate == name then
|
||||
function mesecon:is_conductor_off(nodename)
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.conductor
|
||||
and minetest.registered_nodes[nodename].mesecons.conductor.state == mesecon.state.off then
|
||||
return true
|
||||
end
|
||||
for _, conductor in ipairs(mesecon.conductors) do --TODO
|
||||
if conductor.offstate == nodename then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_conductor(name)
|
||||
return mesecon:is_conductor_on(name) or mesecon:is_conductor_off(name)
|
||||
function mesecon:is_conductor(nodename)
|
||||
--TODO
|
||||
return mesecon:is_conductor_on(nodename) or mesecon:is_conductor_off(nodename)
|
||||
end
|
||||
|
||||
function mesecon:conductor_get_rules(node)
|
||||
for i, conductor in ipairs(mesecon.conductors) do
|
||||
if minetest.registered_nodes[node.name]
|
||||
and minetest.registered_nodes[node.name].mesecons
|
||||
and minetest.registered_nodes[node.name].mesecons.conductor then
|
||||
local rules = minetest.registered_nodes[node.name].mesecons.conductor.rules
|
||||
if type(rules) == 'function' then
|
||||
return rules(node)
|
||||
elseif rules then
|
||||
return rules
|
||||
end
|
||||
end
|
||||
for _, conductor in ipairs(mesecon.conductors) do --TODO
|
||||
if conductor.onstate == node.name
|
||||
or conductor.offstate == node.name then
|
||||
if conductor.get_rules ~= nil then
|
||||
@ -162,6 +256,7 @@ function mesecon:conductor_get_rules(node)
|
||||
end
|
||||
end
|
||||
end
|
||||
return mesecon.rules.default
|
||||
end
|
||||
|
||||
--
|
||||
@ -186,13 +281,10 @@ function mesecon:turnon(pos)
|
||||
|
||||
if mesecon:is_conductor_off(node.name) then
|
||||
local rules = mesecon:conductor_get_rules(node)
|
||||
minetest.env:add_node(pos, {name=mesecon:get_conductor_on(node.name), param2 = node.param2})
|
||||
mesecon:swap_node(pos, mesecon:get_conductor_on(node.name))
|
||||
|
||||
for i, rule in ipairs(rules) do
|
||||
local np = {}
|
||||
np.x = pos.x + rule.x
|
||||
np.y = pos.y + rule.y
|
||||
np.z = pos.z + rule.z
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = mesecon:addPosRule(pos, rule)
|
||||
|
||||
if mesecon:rules_link(pos, np) then
|
||||
mesecon:turnon(np)
|
||||
@ -201,25 +293,22 @@ function mesecon:turnon(pos)
|
||||
end
|
||||
|
||||
if mesecon:is_effector(node.name) then
|
||||
mesecon:changesignal(pos)
|
||||
if mesecon:is_effector_off(node.name) then mesecon:activate(pos) end
|
||||
mesecon:changesignal(pos, node)
|
||||
if mesecon:is_effector_off(node.name) then
|
||||
mesecon:activate(pos, node)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:turnoff(pos) --receptor rules used because output could have been dug
|
||||
local node = minetest.env:get_node(pos)
|
||||
local rules
|
||||
|
||||
if mesecon:is_conductor_on(node.name) then
|
||||
rules = mesecon:conductor_get_rules(node)
|
||||
local rules = mesecon:conductor_get_rules(node)
|
||||
mesecon:swap_node(pos, mesecon:get_conductor_off(node.name))
|
||||
|
||||
minetest.env:add_node(pos, {name=mesecon:get_conductor_off(node.name), param2 = node.param2})
|
||||
|
||||
for i, rule in ipairs(rules) do
|
||||
local np = {
|
||||
x = pos.x + rule.x,
|
||||
y = pos.y + rule.y,
|
||||
z = pos.z + rule.z,}
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = mesecon:addPosRule(pos, rule)
|
||||
|
||||
if mesecon:rules_link(pos, np) then
|
||||
mesecon:turnoff(np)
|
||||
@ -228,8 +317,11 @@ function mesecon:turnoff(pos) --receptor rules used because output could have be
|
||||
end
|
||||
|
||||
if mesecon:is_effector(node.name) then
|
||||
mesecon:changesignal(pos)
|
||||
if mesecon:is_effector_on(node.name) and not mesecon:is_powered(pos) then mesecon:deactivate(pos) end
|
||||
mesecon:changesignal(pos, node)
|
||||
if mesecon:is_effector_on(node.name)
|
||||
and not mesecon:is_powered(pos) then
|
||||
mesecon:deactivate(pos, node)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -238,7 +330,7 @@ function mesecon:connected_to_pw_src(pos, checked)
|
||||
local c = 1
|
||||
checked = checked or {}
|
||||
while checked[c] ~= nil do --find out if node has already been checked (to prevent from endless loop)
|
||||
if compare_pos(checked[c], pos) then
|
||||
if mesecon:cmpPos(checked[c], pos) then
|
||||
return false, checked
|
||||
end
|
||||
c = c + 1
|
||||
@ -257,10 +349,7 @@ function mesecon:connected_to_pw_src(pos, checked)
|
||||
local rules = mesecon:conductor_get_rules(node)
|
||||
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = {}
|
||||
np.x = pos.x + rule.x
|
||||
np.y = pos.y + rule.y
|
||||
np.z = pos.z + rule.z
|
||||
local np = mesecon:addPosRule(pos, rule)
|
||||
if mesecon:rules_link(pos, np) then
|
||||
connected, checked = mesecon:connected_to_pw_src(np, checked)
|
||||
if connected then
|
||||
@ -272,9 +361,6 @@ function mesecon:connected_to_pw_src(pos, checked)
|
||||
end
|
||||
|
||||
function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug)
|
||||
local k = 1
|
||||
local l = 1
|
||||
|
||||
local outputnode = minetest.env:get_node(output)
|
||||
local inputnode = minetest.env:get_node(input)
|
||||
|
||||
@ -300,15 +386,10 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p
|
||||
end
|
||||
|
||||
|
||||
for k, outputrule in ipairs(outputrules) do
|
||||
if outputrule.x + output.x == input.x
|
||||
and outputrule.y + output.y == input.y
|
||||
and outputrule.z + output.z == input.z then -- Check if output sends to input
|
||||
l = 1
|
||||
for k, inputrule in ipairs(inputrules) do
|
||||
if inputrule.x + input.x == output.x
|
||||
and inputrule.y + input.y == output.y
|
||||
and inputrule.z + input.z == output.z then --Check if input accepts from output
|
||||
for _, outputrule in ipairs(outputrules) do
|
||||
if mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then -- Check if output sends to input
|
||||
for _, inputrule in ipairs(inputrules) do
|
||||
if mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then --Check if input accepts from output
|
||||
return true
|
||||
end
|
||||
end
|
||||
@ -339,11 +420,8 @@ function mesecon:is_powered_by_conductor(pos)
|
||||
return false
|
||||
end
|
||||
|
||||
for i, rule in ipairs(rules) do
|
||||
local con_pos = {
|
||||
x = pos.x + rule.x,
|
||||
y = pos.y + rule.y,
|
||||
z = pos.z + rule.z}
|
||||
for _, rule in ipairs(rules) do
|
||||
local con_pos = mesecon:addPosRule(pos, rule)
|
||||
|
||||
con_node = minetest.env:get_node(con_pos)
|
||||
|
||||
@ -373,11 +451,8 @@ function mesecon:is_powered_by_receptor(pos)
|
||||
return false
|
||||
end
|
||||
|
||||
for i, rule in ipairs(rules) do
|
||||
local rcpt_pos = {
|
||||
x = pos.x + rule.x,
|
||||
y = pos.y + rule.y,
|
||||
z = pos.z + rule.z}
|
||||
for _, rule in ipairs(rules) do
|
||||
local rcpt_pos = mesecon:addPosRule(pos, rule)
|
||||
|
||||
rcpt_node = minetest.env:get_node(rcpt_pos)
|
||||
|
||||
@ -401,10 +476,6 @@ function mesecon:updatenode(pos)
|
||||
end
|
||||
end
|
||||
|
||||
function compare_pos(pos1, pos2)
|
||||
return pos1.x == pos2.x and pos1.y == pos2.y and pos1.z == pos2.z
|
||||
end
|
||||
|
||||
--Rules rotation Functions:
|
||||
function mesecon:rotate_rules_right(rules)
|
||||
local nr={};
|
||||
|
@ -1,3 +1,5 @@
|
||||
--very old:
|
||||
|
||||
function mesecon:add_receptor_node(name, rules, get_rules)
|
||||
if get_rules==nil and rules==nil then
|
||||
rules=mesecon:get_rules("default")
|
||||
@ -11,3 +13,48 @@ function mesecon:add_receptor_node_off(name, rules, get_rules)
|
||||
end
|
||||
table.insert(mesecon.receptors, {offstate = name, rules = rules, get_rules = get_rules})
|
||||
end
|
||||
|
||||
--old:
|
||||
|
||||
function mesecon:register_receptor(onstate, offstate, rules, get_rules)
|
||||
if get_rules == nil and rules == nil then
|
||||
rules=mesecon:get_rules("default")
|
||||
end
|
||||
table.insert(mesecon.receptors,
|
||||
{onstate = onstate,
|
||||
offstate = offstate,
|
||||
rules = input_rules,
|
||||
get_rules = get_rules})
|
||||
end
|
||||
|
||||
function mesecon:register_effector(onstate, offstate, input_rules, get_input_rules)
|
||||
if get_input_rules==nil and input_rules==nil then
|
||||
rules=mesecon:get_rules("default")
|
||||
end
|
||||
table.insert(mesecon.effectors,
|
||||
{onstate = onstate,
|
||||
offstate = offstate,
|
||||
input_rules = input_rules,
|
||||
get_input_rules = get_input_rules})
|
||||
end
|
||||
|
||||
function mesecon:register_on_signal_on(action)
|
||||
table.insert(mesecon.actions_on, action)
|
||||
end
|
||||
|
||||
function mesecon:register_on_signal_off(action)
|
||||
table.insert(mesecon.actions_off, action)
|
||||
end
|
||||
|
||||
function mesecon:register_on_signal_change(action)
|
||||
table.insert(mesecon.actions_change, action)
|
||||
end
|
||||
|
||||
function mesecon:register_conductor (onstate, offstate, rules, get_rules)
|
||||
if rules == nil then
|
||||
rules = mesecon:get_rules("default")
|
||||
end
|
||||
table.insert(mesecon.conductors, {onstate = onstate, offstate = offstate, rules = rules, get_rules = get_rules})
|
||||
end
|
||||
|
||||
mesecon:add_rules("default", mesecon.rules.default)
|
||||
|
39
mesecons/presets.lua
Normal file
39
mesecons/presets.lua
Normal file
@ -0,0 +1,39 @@
|
||||
mesecon.rules = {}
|
||||
mesecon.state = {}
|
||||
|
||||
mesecon.rules.default =
|
||||
{{x=0, y=0, z=-1},
|
||||
{x=1, y=0, z=0},
|
||||
{x=-1, y=0, z=0},
|
||||
{x=0, y=0, z=1},
|
||||
{x=1, y=1, z=0},
|
||||
{x=1, y=-1, z=0},
|
||||
{x=-1, y=1, z=0},
|
||||
{x=-1, y=-1, z=0},
|
||||
{x=0, y=1, z=1},
|
||||
{x=0, y=-1, z=1},
|
||||
{x=0, y=1, z=-1},
|
||||
{x=0, y=-1, z=-1}}
|
||||
|
||||
mesecon.rules.buttonlike =
|
||||
{{x = 1, y = 0, z = 0},
|
||||
{x = 1, y = 1, z = 0},
|
||||
{x = 1, y =-1, z = 0},
|
||||
{x = 1, y =-1, z = 1},
|
||||
{x = 1, y =-1, z =-1},
|
||||
{x = 2, y = 0, z = 0}}
|
||||
|
||||
mesecon.rules.buttonlike_get = function(node)
|
||||
local rules = mesecon.rules.buttonlike
|
||||
if node.param2 == 2 then
|
||||
rules=mesecon:rotate_rules_left(rules)
|
||||
elseif node.param2 == 3 then
|
||||
rules=mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules))
|
||||
elseif node.param2 == 0 then
|
||||
rules=mesecon:rotate_rules_right(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
mesecon.state.on = "on"
|
||||
mesecon.state.off = "off"
|
@ -2,3 +2,4 @@
|
||||
BLINKY_PLANT_INTERVAL = 3
|
||||
NEW_STYLE_WIRES = true -- true = new nodebox wires, false = old raillike wires
|
||||
PRESSURE_PLATE_INTERVAL = 0.1
|
||||
OBJECT_DETECTOR_RADIUS = 6
|
||||
|
15
mesecons/util.lua
Normal file
15
mesecons/util.lua
Normal file
@ -0,0 +1,15 @@
|
||||
function mesecon:swap_node(pos, name)
|
||||
local node = minetest.env:get_node(pos)
|
||||
local data = minetest.env:get_meta(pos):to_table()
|
||||
node.name = name
|
||||
minetest.env:add_node(pos, node)
|
||||
minetest.env:get_meta(pos):from_table(data)
|
||||
end
|
||||
|
||||
function mesecon:addPosRule(p, r)
|
||||
return {x = p.x + r.x, y = p.y + r.y, z = p.z + r.z}
|
||||
end
|
||||
|
||||
function mesecon:cmpPos(p1, p2)
|
||||
return (p1.x == p2.x and p1.y == p2.y and p1.z == p2.z)
|
||||
end
|
@ -41,7 +41,6 @@ else -- NEW STYLE WIRES
|
||||
|
||||
box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/16, 1/16}
|
||||
box_bump1 = { -2/16, -8/16, -2/16, 2/16, -13/32, 2/16 }
|
||||
box_bump2 = { -3/32, -13/32, -3/32, 3/32, -12/32, 3/32 }
|
||||
|
||||
box_xp = {1/16, -.5, -1/16, 8/16, -.5+1/16, 1/16}
|
||||
box_zp = {-1/16, -.5, 1/16, 1/16, -.5+1/16, 8/16}
|
||||
@ -69,10 +68,10 @@ for zmy=0, 1 do
|
||||
tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy)
|
||||
|
||||
if nodeid == "00000000" then
|
||||
groups = {dig_immediate = 3, mesecon = 2, mesecon_conductor_craftable=1}
|
||||
groups = {dig_immediate = 3, mesecon_conductor_craftable=1}
|
||||
wiredesc = "Mesecon"
|
||||
else
|
||||
groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1}
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1}
|
||||
wiredesc = "Mesecons Wire (ID: "..nodeid..")"
|
||||
end
|
||||
|
||||
@ -90,7 +89,6 @@ for zmy=0, 1 do
|
||||
|
||||
if adjx and adjz and (xp + zp + xm + zm > 2) then
|
||||
table.insert(nodebox, box_bump1)
|
||||
table.insert(nodebox, box_bump2)
|
||||
tiles_off = {
|
||||
"wires_bump_off.png",
|
||||
"wires_bump_off.png",
|
||||
@ -153,7 +151,11 @@ for zmy=0, 1 do
|
||||
groups = groups,
|
||||
walkable = false,
|
||||
stack_max = 99,
|
||||
drop = "mesecons:wire_00000000_off"
|
||||
drop = "mesecons:wire_00000000_off",
|
||||
mesecons = {conductor={
|
||||
state = mesecon.state.off,
|
||||
onstate = "mesecons:wire_"..nodeid.."_on"
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons:wire_"..nodeid.."_on", {
|
||||
@ -174,9 +176,12 @@ for zmy=0, 1 do
|
||||
groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1},
|
||||
walkable = false,
|
||||
stack_max = 99,
|
||||
drop = "mesecons:wire_00000000_off"
|
||||
drop = "mesecons:wire_00000000_off",
|
||||
mesecons = {conductor={
|
||||
state = mesecon.state.on,
|
||||
offstate = "mesecons:wire_"..nodeid.."_off"
|
||||
}}
|
||||
})
|
||||
mesecon:register_conductor("mesecons:wire_"..nodeid.."_on", "mesecons:wire_"..nodeid.."_off")
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -186,17 +191,15 @@ end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_placenode(function(pos, node)
|
||||
if minetest.get_item_group(node.name, "mesecon") > 1 then
|
||||
local update_on_place_dig = function (pos, node)
|
||||
if minetest.registered_nodes[node.name]
|
||||
and minetest.registered_nodes[node.name].mesecons then
|
||||
mesecon:update_autoconnect(pos)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
minetest.register_on_dignode(function(pos, node)
|
||||
if minetest.get_item_group(node.name, "mesecon") > 1 then
|
||||
mesecon:update_autoconnect(pos)
|
||||
end
|
||||
end)
|
||||
minetest.register_on_placenode(update_on_place_dig)
|
||||
minetest.register_on_dignode(update_on_place_dig)
|
||||
|
||||
function mesecon:update_autoconnect(pos, secondcall, replace_old)
|
||||
local xppos = {x=pos.x+1, y=pos.y, z=pos.z}
|
||||
@ -234,48 +237,20 @@ function mesecon:update_autoconnect(pos, secondcall, replace_old)
|
||||
nodename = minetest.env:get_node(pos).name
|
||||
if string.find(nodename, "mesecons:wire_") == nil and not replace_old then return nil end
|
||||
|
||||
if mesecon:rules_link_bothdir(pos, xppos) then xp = 1 else xp = 0 end
|
||||
if mesecon:rules_link_bothdir(pos, xmpos) then xm = 1 else xm = 0 end
|
||||
if mesecon:rules_link_bothdir(pos, zppos) then zp = 1 else zp = 0 end
|
||||
if mesecon:rules_link_bothdir(pos, zmpos) then zm = 1 else zm = 0 end
|
||||
|
||||
--if the groups mesecon == 1 then wires won't connect to it
|
||||
local zmg = minetest.get_item_group(minetest.env:get_node(zmpos ).name, "mesecon")
|
||||
local zmymg = minetest.get_item_group(minetest.env:get_node(zmympos).name, "mesecon")
|
||||
local xmg = minetest.get_item_group(minetest.env:get_node(xmpos ).name, "mesecon")
|
||||
local xmymg = minetest.get_item_group(minetest.env:get_node(xmympos).name, "mesecon")
|
||||
local zpg = minetest.get_item_group(minetest.env:get_node(zppos ).name, "mesecon")
|
||||
local zpymg = minetest.get_item_group(minetest.env:get_node(zpympos).name, "mesecon")
|
||||
local xpg = minetest.get_item_group(minetest.env:get_node(xppos ).name, "mesecon")
|
||||
local xpymg = minetest.get_item_group(minetest.env:get_node(xpympos).name, "mesecon")
|
||||
if mesecon:rules_link_bothdir(pos, xpympos) then xp = 1 end
|
||||
if mesecon:rules_link_bothdir(pos, xmympos) then xm = 1 end
|
||||
if mesecon:rules_link_bothdir(pos, zpympos) then zp = 1 end
|
||||
if mesecon:rules_link_bothdir(pos, zmympos) then zm = 1 end
|
||||
|
||||
|
||||
local xpyg = minetest.get_item_group(minetest.env:get_node(xpypos).name, "mesecon")
|
||||
local zpyg = minetest.get_item_group(minetest.env:get_node(zpypos).name, "mesecon")
|
||||
local xmyg = minetest.get_item_group(minetest.env:get_node(xmypos).name, "mesecon")
|
||||
local zmyg = minetest.get_item_group(minetest.env:get_node(zmypos).name, "mesecon")
|
||||
|
||||
if ((zmg == 2) or (zmymg == 2)) == true then zm = 1 else zm = 0 end
|
||||
if ((xmg == 2) or (xmymg == 2)) == true then xm = 1 else xm = 0 end
|
||||
if ((zpg == 2) or (zpymg == 2)) == true then zp = 1 else zp = 0 end
|
||||
if ((xpg == 2) or (xpymg == 2)) == true then xp = 1 else xp = 0 end
|
||||
|
||||
if xpyg == 2 then xpy = 1 else xpy = 0 end
|
||||
if zpyg == 2 then zpy = 1 else zpy = 0 end
|
||||
if xmyg == 2 then xmy = 1 else xmy = 0 end
|
||||
if zmyg == 2 then zmy = 1 else zmy = 0 end
|
||||
|
||||
-- If group == 3 then the mesecon only connects to input and output ports
|
||||
if xpg == 3 and mesecon:rules_link_bothdir(pos, xppos) then xp = 1 end
|
||||
if xmg == 3 and mesecon:rules_link_bothdir(pos, xmpos) then xm = 1 end
|
||||
if zpg == 3 and mesecon:rules_link_bothdir(pos, zppos) then zp = 1 end
|
||||
if zmg == 3 and mesecon:rules_link_bothdir(pos, zmpos) then zm = 1 end
|
||||
|
||||
if xpymg == 3 and mesecon:rules_link_bothdir(pos, xpympos) then xp = 1 end
|
||||
if xmymg == 3 and mesecon:rules_link_bothdir(pos, xmympos) then xm = 1 end
|
||||
if zpymg == 3 and mesecon:rules_link_bothdir(pos, zpympos) then zp = 1 end
|
||||
if zmymg == 3 and mesecon:rules_link_bothdir(pos, zmympos) then zm = 1 end
|
||||
|
||||
if xpyg == 3 then if mesecon:rules_link(pos, xpypos) then xpy = 1 end end
|
||||
if zpyg == 3 then if mesecon:rules_link(pos, zpypos) then zpy = 1 end end
|
||||
if xmyg == 3 then if mesecon:rules_link(pos, xmypos) then xmy = 1 end end
|
||||
if zmyg == 3 then if mesecon:rules_link(pos, zmypos) then zmy = 1 end end
|
||||
if mesecon:rules_link(pos, xpypos) then xpy = 1 else xpy = 0 end
|
||||
if mesecon:rules_link(pos, zpypos) then zpy = 1 else zpy = 0 end
|
||||
if mesecon:rules_link(pos, xmypos) then xmy = 1 else xmy = 0 end
|
||||
if mesecon:rules_link(pos, zmypos) then zmy = 1 else zmy = 0 end
|
||||
|
||||
-- Backward compatibility
|
||||
if replace_old then
|
||||
|
Reference in New Issue
Block a user