Compare commits
135 Commits
v0.6-stabl
...
next
Author | SHA1 | Date | |
---|---|---|---|
2a61e8bea6 | |||
36bcce57b0 | |||
6cf713098a | |||
21550b3727 | |||
6983db6d82 | |||
1ff437b7b0 | |||
5f9e655c13 | |||
3c3e45c7ea | |||
5fd1cf5c80 | |||
e1211729cc | |||
588e41c786 | |||
79bb4a3433 | |||
e1577eba46 | |||
4406654fa4 | |||
db90c1cb4b | |||
3792b692aa | |||
84d5546df1 | |||
629a52af11 | |||
4c0988ceab | |||
ac23eb070a | |||
e707afef1a | |||
2848df007e | |||
c9e89189eb | |||
36263d481a | |||
a0920104fc | |||
cc41f136cc | |||
8827cfd66f | |||
d36dd865ad | |||
ad9dde706e | |||
09ac201bac | |||
1c4ab938ad | |||
eeed4f148d | |||
0e34696214 | |||
10ea3c971b | |||
591e2d7cde | |||
7cc803b0d7 | |||
536c77330b | |||
fb45ee1d77 | |||
5b5e919683 | |||
4714c908ac | |||
ccb3430540 | |||
43cb258877 | |||
e3c9eded2a | |||
74eefc270a | |||
a5a4f2b65c | |||
c23295409b | |||
baba7de063 | |||
59cd72191b | |||
2b30360da2 | |||
18da94006a | |||
5c2959826e | |||
ef087f2bb6 | |||
62ddebaecb | |||
fc384aedbb | |||
ec517becab | |||
0d44144421 | |||
240fb83e8b | |||
e297a02ec2 | |||
bd749ec4d4 | |||
841bc70b97 | |||
17579a6aa1 | |||
ec07fc27d7 | |||
52ddd4bdc9 | |||
5921f6d46c | |||
7e231b99a6 | |||
ab1966f763 | |||
2bbc9dd4b7 | |||
72d58d2018 | |||
c062411fa1 | |||
2a061362fb | |||
92122379de | |||
c63afd49ec | |||
2a8bd68c41 | |||
84ad046533 | |||
cdd9a93da9 | |||
d3b77b5be3 | |||
ac0fb91139 | |||
d1ace465c7 | |||
7fe4947056 | |||
5a88a9715f | |||
d91e0b66cb | |||
a9a2108d13 | |||
c508bfaea6 | |||
af8fd75fa4 | |||
e2ec7b5b04 | |||
5e8e003b8c | |||
6fab716f3e | |||
34fa8a1167 | |||
23bebfc054 | |||
973a9c650f | |||
9019a4aff7 | |||
f114cb8ddc | |||
5aa0815ffb | |||
6b1bfe6391 | |||
f6ef7b005d | |||
5cdf23fb00 | |||
e9e1006656 | |||
313b9adcd5 | |||
313a137675 | |||
c50b68cf83 | |||
13befe3bba | |||
2c4a46a557 | |||
0aab812487 | |||
c76c274cc0 | |||
a1852204fb | |||
ae4bd1e21c | |||
9dee0c020c | |||
aab0d4d943 | |||
b5f5beeb3d | |||
5fb5df446c | |||
18731cbc8a | |||
44dc1a128c | |||
c0d3bd2abb | |||
594d061d6d | |||
659060ddcd | |||
de46729b97 | |||
5540fcbcb3 | |||
a55874b5d2 | |||
192b9eca4f | |||
59a39204a9 | |||
e9f2beb2c6 | |||
5904abbd79 | |||
d5825f9602 | |||
05def1540a | |||
961b955f2d | |||
31f3c99288 | |||
a0a3328f7c | |||
b37bdbf55c | |||
cf6080f723 | |||
00e071b695 | |||
8578fd89c8 | |||
472650f099 | |||
f28cf0af03 | |||
e0aa5b1d3d | |||
12206ac190 |
@ -3,128 +3,112 @@
|
||||
-- | \/ | |___ ____ |___ | | | | \ | |____
|
||||
-- | | | | | | | | | \ | |
|
||||
-- | | |___ ____| |___ |____ |____| | \| ____|
|
||||
-- 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
|
||||
-- Currently there is nothing here
|
||||
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
|
||||
local np = {
|
||||
x = pos.x + rule.x,
|
||||
y = pos.y + rule.y,
|
||||
z = pos.z + rule.z}
|
||||
if mesecon:rules_link(pos, np, rules) then
|
||||
mesecon:turnon(np, pos)
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = mesecon:addPosRule(pos, rule)
|
||||
local link, rulename = mesecon:rules_link(pos, np, rules)
|
||||
if link then
|
||||
mesecon:turnon(np, rulename)
|
||||
end
|
||||
end
|
||||
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
|
||||
local np = {
|
||||
x = pos.x + rule.x,
|
||||
y = pos.y + rule.y,
|
||||
z = pos.z + rule.z}
|
||||
if mesecon:rules_link(pos, np, rules) and not mesecon:connected_to_pw_src(np) then
|
||||
mesecon:turnoff(np, pos)
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = mesecon:addPosRule(pos, rule)
|
||||
local link, rulename = mesecon:rules_link(pos, np, rules)
|
||||
if link then
|
||||
if not mesecon:connected_to_receptor(np) then
|
||||
mesecon:turnoff(np, rulename)
|
||||
else
|
||||
mesecon:changesignal(np, minetest.env:get_node(np), rulename, mesecon.state.off)
|
||||
end
|
||||
end
|
||||
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,173 +1,275 @@
|
||||
-- INTERNAL
|
||||
-- Internal.lua - The core of mesecons
|
||||
--
|
||||
-- For more practical developer resources see mesecons.tk
|
||||
--
|
||||
-- Function overview
|
||||
-- mesecon:get_effector(nodename) --> Returns the mesecons.effector -specifictation in the nodedef by the nodename
|
||||
-- mesecon:get_receptor(nodename) --> Returns the mesecons.receptor -specifictation in the nodedef by the nodename
|
||||
-- mesecon:get_conductor(nodename) --> Returns the mesecons.conductor-specifictation in the nodedef by the nodename
|
||||
-- mesecon:get_any_inputrules (node) --> Returns the rules of a node if it is a conductor or an effector
|
||||
-- mesecon:get_any_outputrules (node) --> Returns the rules of a node if it is a conductor or a receptor
|
||||
|
||||
--Receptors
|
||||
function mesecon:is_receptor_node(nodename)
|
||||
for _, receptor in ipairs(mesecon.receptors) do
|
||||
if receptor.onstate == nodename then
|
||||
return true
|
||||
-- RECEPTORS
|
||||
-- mesecon:is_receptor(nodename) --> Returns true if nodename is a receptor
|
||||
-- mesecon:is_receptor_on(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.on
|
||||
-- mesecon:is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off
|
||||
-- mesecon:receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified)
|
||||
|
||||
-- EFFECTORS
|
||||
-- mesecon:is_effector(nodename) --> Returns true if nodename is an effector
|
||||
-- mesecon:is_effector_on(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_off
|
||||
-- mesecon:is_effector_off(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_on
|
||||
-- mesecon:effector_get_rules(node) --> Returns the input rules of the effector (mesecon.rules.default if none specified)
|
||||
|
||||
-- SIGNALS
|
||||
-- mesecon:activate(pos, node) --> Activates the effector node at the specific pos (calls nodedef.mesecons.effector.action_on)
|
||||
-- mesecon:deactivate(pos, node) --> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off)
|
||||
-- mesecon:changesignal(pos, node, rulename, newstate) --> Changes the effector node at the specific pos (calls nodedef.mesecons.effector.action_change)
|
||||
|
||||
-- RULES
|
||||
-- mesecon:add_rules(name, rules) | deprecated? --> Saves rules table by name
|
||||
-- mesecon:get_rules(name, rules) | deprecated? --> Loads rules table with name
|
||||
|
||||
-- CONDUCTORS
|
||||
-- mesecon:is_conductor(nodename) --> Returns true if nodename is a conductor
|
||||
-- mesecon:is_conductor_on(nodename) --> Returns true if nodename is a conductor with state = mesecon.state.on
|
||||
-- mesecon:is_conductor_off(nodename) --> Returns true if nodename is a conductor with state = mesecon.state.off
|
||||
-- mesecon:get_conductor_on(offstate) --> Returns the onstate nodename of the conductor with the name offstate
|
||||
-- mesecon:get_conductor_off(onstate) --> Returns the offstate nodename of the conductor with the name onstate
|
||||
-- mesecon:conductor_get_rules(node) --> Returns the input+output rules of a conductor (mesecon.rules.default if none specified)
|
||||
|
||||
-- HIGH-LEVEL Internals
|
||||
-- mesecon:is_power_on(pos) --> Returns true if pos emits power in any way
|
||||
-- mesecon:is_power_off(pos) --> Returns true if pos does not emit power in any way
|
||||
-- mesecon:turnon(pos, rulename) --> Returns true whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnon
|
||||
-- mesecon:turnoff(pos, rulename) --> Turns off whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnoff
|
||||
-- mesecon:connected_to_receptor(pos) --> Returns true if pos is connected to a receptor directly or via conductors; calls itself if pos is a conductor --> recursive
|
||||
-- mesecon:rules_link(output, input, dug_outputrules) --> Returns true if outputposition + outputrules = inputposition and inputposition + inputrules = outputposition (if the two positions connect)
|
||||
-- mesecon:rules_link_anydir(outp., inp., d_outpr.) --> Same as rules mesecon:rules_link but also returns true if output and input are swapped
|
||||
-- mesecon:is_powered(pos) --> Returns true if pos is powered by a receptor or a conductor
|
||||
|
||||
-- RULES ROTATION helpsers
|
||||
-- mesecon:rotate_rules_right(rules)
|
||||
-- mesecon:rotate_rules_left(rules)
|
||||
-- mesecon:rotate_rules_up(rules)
|
||||
-- mesecon:rotate_rules_down(rules)
|
||||
-- These functions return rules that have been rotated in the specific direction
|
||||
|
||||
-- General
|
||||
function mesecon:get_effector(nodename)
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.effector then
|
||||
return minetest.registered_nodes[nodename].mesecons.effector
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:get_receptor(nodename)
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.receptor then
|
||||
return minetest.registered_nodes[nodename].mesecons.receptor
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:get_conductor(nodename)
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.conductor then
|
||||
return minetest.registered_nodes[nodename].mesecons.conductor
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:get_any_outputrules (node)
|
||||
if mesecon:is_conductor(node.name) then
|
||||
return mesecon:conductor_get_rules(node)
|
||||
elseif mesecon:is_receptor(node.name) then
|
||||
return mesecon:receptor_get_rules(node)
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_receptor_node_off(nodename, pos, ownpos)
|
||||
for _, receptor in ipairs(mesecon.receptors) do
|
||||
if receptor.offstate == nodename then
|
||||
function mesecon:get_any_inputrules (node)
|
||||
if mesecon:is_conductor(node.name) then
|
||||
return mesecon:conductor_get_rules(node)
|
||||
elseif mesecon:is_effector(node.name) then
|
||||
return mesecon:effector_get_rules(node)
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Receptors
|
||||
-- Nodes that can power mesecons
|
||||
function mesecon:is_receptor_on(nodename)
|
||||
local receptor = mesecon:get_receptor(nodename)
|
||||
if receptor and receptor.state == mesecon.state.on then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_receptor_off(nodename)
|
||||
local receptor = mesecon:get_receptor(nodename)
|
||||
if receptor and receptor.state == mesecon.state.off then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_receptor(nodename)
|
||||
local receptor = mesecon:get_receptor(nodename)
|
||||
if receptor then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:receptor_get_rules(node)
|
||||
for i, receptor in ipairs(mesecon.receptors) do
|
||||
if receptor.onstate == node.name or receptor.offstate == node.name then
|
||||
if receptor.get_rules ~= nil then
|
||||
return receptor.get_rules(node.param2)
|
||||
elseif mesecon.receptors[i].rules ~=nil then
|
||||
return receptor.rules
|
||||
else
|
||||
return mesecon:get_rules("default")
|
||||
local receptor = mesecon:get_receptor(node.name)
|
||||
if receptor then
|
||||
local rules = receptor.rules
|
||||
if type(rules) == 'function' then
|
||||
return rules(node)
|
||||
elseif rules then
|
||||
return rules
|
||||
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 effector.onstate == nodename then
|
||||
local effector = mesecon:get_effector(nodename)
|
||||
if effector and effector.action_off then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_effector_off(nodename)
|
||||
for i, effector in ipairs(mesecon.effectors) do
|
||||
if effector.offstate == nodename then
|
||||
local effector = mesecon:get_effector(nodename)
|
||||
if effector and effector.action_on then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_effector(nodename)
|
||||
return mesecon:is_effector_on(nodename) or mesecon:is_effector_off(nodename)
|
||||
local effector = mesecon:get_effector(nodename)
|
||||
if effector then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:effector_get_input_rules(node)
|
||||
for i, 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
|
||||
return effector.input_rules
|
||||
else
|
||||
return mesecon:get_rules("default")
|
||||
end
|
||||
function mesecon:effector_get_rules(node)
|
||||
local effector = mesecon:get_effector(node.name)
|
||||
if effector then
|
||||
local rules = effector.rules
|
||||
if type(rules) == 'function' then
|
||||
return rules(node)
|
||||
elseif rules then
|
||||
return rules
|
||||
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
|
||||
action(pos, node)
|
||||
function mesecon:activate(pos, node, rulename)
|
||||
local effector = mesecon:get_effector(node.name)
|
||||
if effector and effector.action_on then
|
||||
effector.action_on (pos, node, rulename)
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:deactivate(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
for i, action in ipairs(mesecon.actions_off) do
|
||||
action(pos, node)
|
||||
function mesecon:deactivate(pos, node, rulename)
|
||||
local effector = mesecon:get_effector(node.name)
|
||||
if effector and effector.action_off then
|
||||
effector.action_off (pos, node, rulename)
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:changesignal(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
for i, action in ipairs(mesecon.actions_change) do
|
||||
action(pos, node)
|
||||
function mesecon:changesignal(pos, node, rulename, newstate)
|
||||
local effector = mesecon:get_effector(node.name)
|
||||
if effector and effector.action_change then
|
||||
effector.action_change (pos, node, rulename, newstate)
|
||||
end
|
||||
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:is_conductor_on(nodename)
|
||||
local conductor = mesecon:get_conductor(nodename)
|
||||
if conductor and conductor.state == mesecon.state.on then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_conductor_off(nodename)
|
||||
local conductor = mesecon:get_conductor(nodename)
|
||||
if conductor and conductor.state == mesecon.state.off then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_conductor(nodename)
|
||||
local conductor = mesecon:get_conductor(nodename)
|
||||
if conductor then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:get_conductor_on(offstate)
|
||||
for i, conductor in ipairs(mesecon.conductors) do
|
||||
if conductor.offstate == offstate then
|
||||
local conductor = mesecon:get_conductor(offstate)
|
||||
if conductor then
|
||||
return conductor.onstate
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:get_conductor_off(onstate)
|
||||
for i, conductor in ipairs(mesecon.conductors) do
|
||||
if conductor.onstate == onstate then
|
||||
local conductor = mesecon:get_conductor(onstate)
|
||||
if conductor then
|
||||
return conductor.offstate
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_conductor_on(name)
|
||||
for i, conductor in ipairs(mesecon.conductors) do
|
||||
if conductor.onstate == name 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
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_conductor(name)
|
||||
return mesecon:is_conductor_on(name) or mesecon:is_conductor_off(name)
|
||||
end
|
||||
|
||||
function mesecon:conductor_get_rules(node)
|
||||
for i, conductor in ipairs(mesecon.conductors) do
|
||||
if conductor.onstate == node.name
|
||||
or conductor.offstate == node.name then
|
||||
if conductor.get_rules ~= nil then
|
||||
return conductor.get_rules(node.param2)
|
||||
else
|
||||
return conductor.rules
|
||||
end
|
||||
local conductor = mesecon:get_conductor(node.name)
|
||||
if conductor then
|
||||
local rules = conductor.rules
|
||||
if type(rules) == 'function' then
|
||||
return rules(node)
|
||||
elseif rules then
|
||||
return rules
|
||||
end
|
||||
end
|
||||
return mesecon.rules.default
|
||||
end
|
||||
|
||||
--
|
||||
-- some more general high-level stuff
|
||||
|
||||
function mesecon:is_power_on(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
if mesecon:is_conductor_on(node.name) or mesecon:is_receptor_node(node.name) then
|
||||
if mesecon:is_conductor_on(node.name) or mesecon:is_receptor_on(node.name) then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
@ -175,146 +277,126 @@ end
|
||||
|
||||
function mesecon:is_power_off(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
if mesecon:is_conductor_off(node.name) or mesecon:is_receptor_node_off(node.name) then
|
||||
if mesecon:is_conductor_off(node.name) or mesecon:is_receptor_off(node.name) then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:turnon(pos)
|
||||
function mesecon:turnon(pos, rulename)
|
||||
local node = minetest.env:get_node(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})
|
||||
|
||||
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)
|
||||
local link, rulename = mesecon:rules_link(pos, np)
|
||||
|
||||
if mesecon:rules_link(pos, np) then
|
||||
mesecon:turnon(np)
|
||||
if link then
|
||||
mesecon:turnon(np, rulename)
|
||||
end
|
||||
end
|
||||
elseif mesecon:is_effector(node.name) then
|
||||
mesecon:changesignal(pos, node, rulename, mesecon.state.on)
|
||||
if mesecon:is_effector_off(node.name) then
|
||||
mesecon:activate(pos, node, rulename)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if mesecon:is_effector(node.name) then
|
||||
mesecon:changesignal(pos)
|
||||
if mesecon:is_effector_off(node.name) then mesecon:activate(pos) end
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:turnoff(pos) --receptor rules used because output could have been dug
|
||||
function mesecon:turnoff(pos, rulename)
|
||||
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)
|
||||
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)
|
||||
local link, rulename = mesecon:rules_link(pos, np)
|
||||
|
||||
if mesecon:rules_link(pos, np) then
|
||||
mesecon:turnoff(np)
|
||||
if link then
|
||||
mesecon:turnoff(np, rulename)
|
||||
end
|
||||
end
|
||||
elseif mesecon:is_effector(node.name) then
|
||||
mesecon:changesignal(pos, node, rulename, mesecon.state.off)
|
||||
if mesecon:is_effector_on(node.name)
|
||||
and not mesecon:is_powered(pos) then
|
||||
mesecon:deactivate(pos, node, rulename)
|
||||
end
|
||||
end
|
||||
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
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
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
|
||||
return false, checked
|
||||
end
|
||||
c = c + 1
|
||||
end
|
||||
checked[c] = {x=pos.x, y=pos.y, z=pos.z} --add current node to checked
|
||||
|
||||
local node = minetest.env:get_node_or_nil(pos)
|
||||
|
||||
if node == nil then return false, checked end
|
||||
if mesecon:is_powered_by_receptor(pos) then --return if conductor is powered
|
||||
return true, checked
|
||||
end
|
||||
function mesecon:connected_to_receptor(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
|
||||
-- Check if conductors around are connected
|
||||
if mesecon:is_conductor(node.name) then
|
||||
rules = mesecon:conductor_get_rules(node)
|
||||
elseif mesecon:is_effector(node.name) then
|
||||
rules = mesecon:effector_get_input_rules(node)
|
||||
else
|
||||
return false, checked
|
||||
end
|
||||
local rules = mesecon:get_any_inputrules(node)
|
||||
if not rules then return false end
|
||||
|
||||
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
|
||||
if mesecon:rules_link(pos, np) then
|
||||
connected, checked = mesecon:connected_to_pw_src(np, checked)
|
||||
if connected then
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = mesecon:addPosRule(pos, rule)
|
||||
if mesecon:rules_link(np, pos) then
|
||||
if mesecon:find_receptor_on(np, {}) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
return false, checked
|
||||
|
||||
return false
|
||||
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
|
||||
function mesecon:find_receptor_on(pos, checked)
|
||||
-- find out if node has already been checked (to prevent from endless loop)
|
||||
for _, cp in ipairs(checked) do
|
||||
if mesecon:cmpPos(cp, pos) then
|
||||
return false, checked
|
||||
end
|
||||
end
|
||||
|
||||
-- add current position to checked
|
||||
table.insert(checked, {x=pos.x, y=pos.y, z=pos.z})
|
||||
local node = minetest.env:get_node(pos)
|
||||
|
||||
if mesecon:is_receptor_on(node.name) then
|
||||
return true
|
||||
end
|
||||
|
||||
if mesecon:is_conductor(node.name) then
|
||||
local rules = mesecon:conductor_get_rules(node)
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = mesecon:addPosRule(pos, rule)
|
||||
if mesecon:rules_link(np, pos) then
|
||||
if mesecon:find_receptor_on(np, checked) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug), second return value: the name of the affected input rule
|
||||
local outputnode = minetest.env:get_node(output)
|
||||
local inputnode = minetest.env:get_node(input)
|
||||
|
||||
local outputrules = dug_outputrules
|
||||
local inputrules
|
||||
|
||||
if outputrules == nil then
|
||||
if mesecon:is_conductor(outputnode.name) then
|
||||
outputrules = mesecon:conductor_get_rules(outputnode)
|
||||
elseif mesecon:is_receptor_node(outputnode.name) or mesecon:is_receptor_node_off(outputnode.name) then
|
||||
outputrules = mesecon:receptor_get_rules(outputnode)
|
||||
else
|
||||
return false
|
||||
end
|
||||
local outputrules = dug_outputrules or mesecon:get_any_outputrules (outputnode)
|
||||
local inputrules = mesecon:get_any_inputrules (inputnode)
|
||||
if not outputrules or not inputrules then
|
||||
return
|
||||
end
|
||||
|
||||
if mesecon:is_conductor(inputnode.name) then
|
||||
inputrules = mesecon:conductor_get_rules(inputnode)
|
||||
elseif mesecon:is_effector(inputnode.name) then
|
||||
inputrules = mesecon:effector_get_input_rules(inputnode)
|
||||
else
|
||||
return false
|
||||
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
|
||||
return true
|
||||
for _, outputrule in ipairs(outputrules) do
|
||||
-- Check if output sends to input
|
||||
if mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then
|
||||
for _, inputrule in ipairs(inputrules) do
|
||||
-- Check if input accepts from output
|
||||
if mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then
|
||||
return true, inputrule.name
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -322,135 +404,69 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:rules_link_bothdir(pos1, pos2)
|
||||
function mesecon:rules_link_anydir(pos1, pos2)
|
||||
return mesecon:rules_link(pos1, pos2) or mesecon:rules_link(pos2, pos1)
|
||||
end
|
||||
|
||||
function mesecon:is_powered_by_conductor(pos)
|
||||
local j = 1
|
||||
local k = 1
|
||||
|
||||
local rules
|
||||
local con_pos = {}
|
||||
local con_rules = {}
|
||||
local con_node
|
||||
|
||||
local node = minetest.env:get_node(pos)
|
||||
if mesecon:is_conductor(node.name) then
|
||||
rules = mesecon:conductor_get_rules(node)
|
||||
elseif mesecon:is_effector(node.name) then
|
||||
rules = mesecon:effector_get_input_rules(node)
|
||||
else
|
||||
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}
|
||||
|
||||
con_node = minetest.env:get_node(con_pos)
|
||||
|
||||
if mesecon:is_conductor_on(con_node.name) and mesecon:rules_link(con_pos, pos) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_powered_by_receptor(pos)
|
||||
local j = 1
|
||||
local k = 1
|
||||
|
||||
local rules
|
||||
local rcpt_pos = {}
|
||||
local rcpt_rules = {}
|
||||
local rcpt_node
|
||||
|
||||
local node = minetest.env:get_node(pos)
|
||||
if mesecon:is_conductor(node.name) then
|
||||
rules = mesecon:conductor_get_rules(node)
|
||||
elseif mesecon:is_effector(node.name) then
|
||||
rules = mesecon:effector_get_input_rules(node)
|
||||
else
|
||||
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}
|
||||
|
||||
rcpt_node = minetest.env:get_node(rcpt_pos)
|
||||
|
||||
if mesecon:is_receptor_node(rcpt_node.name) and mesecon:rules_link(rcpt_pos, pos) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function mesecon:is_powered(pos)
|
||||
return mesecon:is_powered_by_conductor(pos) or mesecon:is_powered_by_receptor(pos)
|
||||
end
|
||||
local node = minetest.env:get_node(pos)
|
||||
local rules = mesecon:get_any_inputrules(node)
|
||||
if not rules then return false end
|
||||
|
||||
function mesecon:updatenode(pos)
|
||||
if mesecon:connected_to_pw_src(pos) then
|
||||
mesecon:turnon(pos)
|
||||
else
|
||||
mesecon:turnoff(pos)
|
||||
for _, rule in ipairs(rules) do
|
||||
local np = mesecon:addPosRule(pos, rule)
|
||||
local nn = minetest.env:get_node(np)
|
||||
|
||||
if (mesecon:is_conductor_on (nn.name) or mesecon:is_receptor_on (nn.name))
|
||||
and mesecon:rules_link(np, pos) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function compare_pos(pos1, pos2)
|
||||
return pos1.x == pos2.x and pos1.y == pos2.y and pos1.z == pos2.z
|
||||
return false
|
||||
end
|
||||
|
||||
--Rules rotation Functions:
|
||||
function mesecon:rotate_rules_right(rules)
|
||||
local nr={};
|
||||
local nr = {}
|
||||
for i, rule in ipairs(rules) do
|
||||
nr[i]={}
|
||||
nr[i].z=rule.x
|
||||
nr[i].x=-rule.z
|
||||
nr[i].y=rule.y
|
||||
table.insert(nr, {
|
||||
x = -rule.z,
|
||||
y = rule.y,
|
||||
z = rule.x})
|
||||
end
|
||||
return nr
|
||||
end
|
||||
|
||||
function mesecon:rotate_rules_left(rules)
|
||||
local nr={};
|
||||
local nr = {}
|
||||
for i, rule in ipairs(rules) do
|
||||
nr[i]={}
|
||||
nr[i].z=-rules[i].x
|
||||
nr[i].x=rules[i].z
|
||||
nr[i].y=rules[i].y
|
||||
table.insert(nr, {
|
||||
x = rule.z,
|
||||
y = rule.y,
|
||||
z = -rule.x})
|
||||
end
|
||||
return nr
|
||||
end
|
||||
|
||||
function mesecon:rotate_rules_down(rules)
|
||||
local nr={};
|
||||
local nr = {}
|
||||
for i, rule in ipairs(rules) do
|
||||
nr[i]={}
|
||||
nr[i].y=rule.x
|
||||
nr[i].x=-rule.y
|
||||
nr[i].z=rule.z
|
||||
table.insert(nr, {
|
||||
x = -rule.y,
|
||||
y = rule.x,
|
||||
z = rule.z})
|
||||
end
|
||||
return nr
|
||||
end
|
||||
|
||||
function mesecon:rotate_rules_up(rules)
|
||||
local nr={};
|
||||
local nr = {}
|
||||
for i, rule in ipairs(rules) do
|
||||
nr[i]={}
|
||||
nr[i].y=-rule.x
|
||||
nr[i].x=rule.y
|
||||
nr[i].z=rule.z
|
||||
table.insert(nr, {
|
||||
x = rule.y,
|
||||
y = -rule.x,
|
||||
z = rule.z})
|
||||
end
|
||||
return nr
|
||||
end
|
||||
|
@ -1,13 +0,0 @@
|
||||
function mesecon:add_receptor_node(name, rules, get_rules)
|
||||
if get_rules==nil and rules==nil then
|
||||
rules=mesecon:get_rules("default")
|
||||
end
|
||||
table.insert(mesecon.receptors, {onstate = name, rules = rules, get_rules = get_rules})
|
||||
end
|
||||
|
||||
function mesecon:add_receptor_node_off(name, rules, get_rules)
|
||||
if get_rules==nil and rules==nil then
|
||||
rules=mesecon:get_rules("default")
|
||||
end
|
||||
table.insert(mesecon.receptors, {offstate = name, rules = rules, get_rules = get_rules})
|
||||
end
|
||||
|
38
mesecons/oldwires.lua
Normal file
@ -0,0 +1,38 @@
|
||||
minetest.register_node("mesecons:mesecon_off", {
|
||||
drawtype = "raillike",
|
||||
tiles = {"jeija_mesecon_off.png", "jeija_mesecon_curved_off.png", "jeija_mesecon_t_junction_off.png", "jeija_mesecon_crossing_off.png"},
|
||||
inventory_image = "jeija_mesecon_off.png",
|
||||
wield_image = "jeija_mesecon_off.png",
|
||||
paramtype = "light",
|
||||
is_ground_content = true,
|
||||
walkable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
|
||||
},
|
||||
groups = {dig_immediate=3, mesecon=1, mesecon_conductor_craftable=1},
|
||||
description="Mesecons",
|
||||
mesecons = {conductor={
|
||||
state = mesecon.state.off,
|
||||
onstate = "mesecons:mesecon_on"
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons:mesecon_on", {
|
||||
drawtype = "raillike",
|
||||
tiles = {"jeija_mesecon_on.png", "jeija_mesecon_curved_on.png", "jeija_mesecon_t_junction_on.png", "jeija_mesecon_crossing_on.png"},
|
||||
paramtype = "light",
|
||||
is_ground_content = true,
|
||||
walkable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1},
|
||||
drop = '"mesecons:mesecon_off" 1',
|
||||
light_source = LIGHT_MAX-11,
|
||||
mesecons = {conductor={
|
||||
state = mesecon.state.on,
|
||||
offstate = "mesecons:mesecon_off"
|
||||
}}
|
||||
})
|
45
mesecons/presets.lua
Normal file
@ -0,0 +1,45 @@
|
||||
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.flat =
|
||||
{{x = 1, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = 1},
|
||||
{x = 0, y = 0, z =-1}}
|
||||
|
||||
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"
|
@ -1,28 +1,28 @@
|
||||
minetest.register_on_dignode(
|
||||
function(pos, oldnode, digger)
|
||||
if mesecon:is_conductor_on(oldnode.name) then
|
||||
mesecon:receptor_off(pos)
|
||||
end
|
||||
|
||||
if mesecon:is_receptor_node(oldnode.name) then
|
||||
mesecon:receptor_off(pos, mesecon:receptor_get_rules(oldnode))
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
minetest.register_on_placenode(
|
||||
function (pos, node)
|
||||
if mesecon:is_receptor_node(node.name) then
|
||||
mesecon.on_placenode = function (pos, node)
|
||||
if mesecon:is_receptor_on(node.name) then
|
||||
mesecon:receptor_on(pos, mesecon:receptor_get_rules(node))
|
||||
elseif mesecon:is_powered(pos) then
|
||||
if mesecon:is_conductor(node.name) then
|
||||
mesecon:turnon (pos)
|
||||
mesecon:receptor_on (pos, mesecon:conductor_get_rules(node))
|
||||
else
|
||||
mesecon:changesignal(pos, node)
|
||||
mesecon:activate(pos, node)
|
||||
end
|
||||
elseif mesecon:is_conductor_on(node.name) then
|
||||
mesecon:swap_node(pos, mesecon:get_conductor_off(node.name))
|
||||
elseif mesecon:is_effector_on (node.name) then
|
||||
mesecon:deactivate(pos, node)
|
||||
end
|
||||
end
|
||||
|
||||
if mesecon:is_powered(pos) then
|
||||
if mesecon:is_conductor_off(node.name) then
|
||||
mesecon:turnon(pos)
|
||||
else
|
||||
mesecon:changesignal(pos)
|
||||
mesecon:activate(pos)
|
||||
mesecon.on_dignode = function (pos, node)
|
||||
if mesecon:is_conductor_on(node.name) then
|
||||
mesecon:receptor_off(pos, mesecon:conductor_get_rules(node))
|
||||
elseif mesecon:is_receptor_on(node.name) then
|
||||
mesecon:receptor_off(pos, mesecon:receptor_get_rules(node))
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
minetest.register_on_placenode(mesecon.on_placenode)
|
||||
minetest.register_on_dignode(mesecon.on_dignode)
|
||||
|
@ -2,3 +2,6 @@
|
||||
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
|
||||
PISTON_MAXIMUM_PUSH = 15
|
||||
MOVESTONE_MAXIMUM_PUSH = 100
|
||||
|
24
mesecons/util.lua
Normal file
@ -0,0 +1,24 @@
|
||||
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:move_node(pos, newpos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
local meta = minetest.env:get_meta(pos):to_table()
|
||||
minetest.env:remove_node(pos)
|
||||
minetest.env:add_node(newpos, node)
|
||||
minetest.env:get_meta(pos):from_table(meta)
|
||||
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
|
@ -1,39 +1,3 @@
|
||||
-- Oldstyle wires:
|
||||
|
||||
if NEW_STYLE_WIRES == false then --old wires
|
||||
minetest.register_node("mesecons:mesecon_off", {
|
||||
drawtype = "raillike",
|
||||
tiles = {"jeija_mesecon_off.png", "jeija_mesecon_curved_off.png", "jeija_mesecon_t_junction_off.png", "jeija_mesecon_crossing_off.png"},
|
||||
inventory_image = "jeija_mesecon_off.png",
|
||||
wield_image = "jeija_mesecon_off.png",
|
||||
paramtype = "light",
|
||||
is_ground_content = true,
|
||||
walkable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
|
||||
},
|
||||
groups = {dig_immediate=3, mesecon=1, mesecon_conductor_craftable=1},
|
||||
description="Mesecons",
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons:mesecon_on", {
|
||||
drawtype = "raillike",
|
||||
tiles = {"jeija_mesecon_on.png", "jeija_mesecon_curved_on.png", "jeija_mesecon_t_junction_on.png", "jeija_mesecon_crossing_on.png"},
|
||||
paramtype = "light",
|
||||
is_ground_content = true,
|
||||
walkable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
|
||||
},
|
||||
groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1},
|
||||
drop = '"mesecons:mesecon_off" 1',
|
||||
light_source = LIGHT_MAX-11,
|
||||
})
|
||||
mesecon:register_conductor("mesecons:mesecon_on", "mesecons:mesecon_off")
|
||||
else -- NEW STYLE WIRES
|
||||
|
||||
-- naming scheme: wire:(xp)(zp)(xm)(zm)_on/off
|
||||
-- The conditions in brackets define whether there is a mesecon at that place or not
|
||||
-- 1 = there is one; 0 = there is none
|
||||
@ -41,7 +5,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}
|
||||
@ -53,6 +16,8 @@ box_zpy = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/16, .5}
|
||||
box_xmy = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/16, 1/16}
|
||||
box_zmy = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/16, -.5+1/16}
|
||||
|
||||
-- Registering the wires
|
||||
|
||||
for xp=0, 1 do
|
||||
for zp=0, 1 do
|
||||
for xm=0, 1 do
|
||||
@ -69,10 +34,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 +55,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,13 +117,21 @@ 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", {
|
||||
description = "Wire ID:"..nodeid,
|
||||
drawtype = "nodebox",
|
||||
tiles = tiles_on,
|
||||
-- inventory_image = "wires_inv.png",
|
||||
-- wield_image = "wires_inv.png",
|
||||
inventory_image = "jeija_mesecon_off.png",
|
||||
wield_image = "jeija_mesecon_off.png",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
@ -174,9 +146,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 +161,18 @@ end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_placenode(function(pos, node)
|
||||
if minetest.get_item_group(node.name, "mesecon") > 1 then
|
||||
mesecon:update_autoconnect(pos)
|
||||
end
|
||||
end)
|
||||
-- Updating the wires:
|
||||
-- Place the right connection wire
|
||||
|
||||
minetest.register_on_dignode(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_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,65 +210,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_anydir(pos, xppos) then xp = 1 else xp = 0 end
|
||||
if mesecon:rules_link_anydir(pos, xmpos) then xm = 1 else xm = 0 end
|
||||
if mesecon:rules_link_anydir(pos, zppos) then zp = 1 else zp = 0 end
|
||||
if mesecon:rules_link_anydir(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_anydir(pos, xpympos) then xp = 1 end
|
||||
if mesecon:rules_link_anydir(pos, xmympos) then xm = 1 end
|
||||
if mesecon:rules_link_anydir(pos, zpympos) then zp = 1 end
|
||||
if mesecon:rules_link_anydir(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
|
||||
|
||||
-- Backward compatibility
|
||||
if replace_old then
|
||||
xp = (xp == 1 or (string.find(minetest.env:get_node(xppos ).name, "mesecons:mesecon_") ~= nil or
|
||||
string.find(minetest.env:get_node(xpympos).name, "mesecons:mesecon_") ~= nil)) and 1 or 0
|
||||
zp = (zp == 1 or (string.find(minetest.env:get_node(zppos ).name, "mesecons:mesecon_") ~= nil or
|
||||
string.find(minetest.env:get_node(zpympos).name, "mesecons:mesecon_") ~= nil)) and 1 or 0
|
||||
xm = (xm == 1 or (string.find(minetest.env:get_node(xmpos ).name, "mesecons:mesecon_") ~= nil or
|
||||
string.find(minetest.env:get_node(xmympos).name, "mesecons:mesecon_") ~= nil)) and 1 or 0
|
||||
zm = (zm == 1 or (string.find(minetest.env:get_node(zmpos ).name, "mesecons:mesecon_") ~= nil or
|
||||
string.find(minetest.env:get_node(zmympos).name, "mesecons:mesecon_") ~= nil)) and 1 or 0
|
||||
|
||||
xpy = (xpy == 1 or string.find(minetest.env:get_node(xpypos).name, "mesecons:mesecon_") ~=nil) and 1 or 0
|
||||
zpy = (zpy == 1 or string.find(minetest.env:get_node(zpypos).name, "mesecons:mesecon_") ~=nil) and 1 or 0
|
||||
xmy = (xmy == 1 or string.find(minetest.env:get_node(xmypos).name, "mesecons:mesecon_") ~=nil) and 1 or 0
|
||||
zmy = (zmy == 1 or string.find(minetest.env:get_node(zmypos).name, "mesecons:mesecon_") ~=nil) and 1 or 0
|
||||
end
|
||||
if mesecon:rules_link_anydir(pos, xpypos) then xpy = 1 else xpy = 0 end
|
||||
if mesecon:rules_link_anydir(pos, zpypos) then zpy = 1 else zpy = 0 end
|
||||
if mesecon:rules_link_anydir(pos, xmypos) then xmy = 1 else xmy = 0 end
|
||||
if mesecon:rules_link_anydir(pos, zmypos) then zmy = 1 else zmy = 0 end
|
||||
|
||||
if xpy == 1 then xp = 1 end
|
||||
if zpy == 1 then zp = 1 end
|
||||
@ -310,19 +241,41 @@ function mesecon:update_autoconnect(pos, secondcall, replace_old)
|
||||
end
|
||||
end
|
||||
|
||||
if minetest.registered_nodes["default:stone_with_mese"] == nil then
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons:wire_00000000_off" 16',
|
||||
output = "mesecons:wire_00000000_off 18",
|
||||
recipe = {
|
||||
{'"default:mese"'},
|
||||
{"default:mese"},
|
||||
}
|
||||
})
|
||||
else
|
||||
|
||||
minetest.register_abm(
|
||||
{nodenames = {"mesecons:mesecon_off", "mesecons:mesecon_on"},
|
||||
interval = 2,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
mesecon:update_autoconnect(pos, false, true)
|
||||
end,
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mesecons:wire_00000000_off 2",
|
||||
recipe = "default:mese_crystal_fragment",
|
||||
cooktime = 3,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mesecons:wire_00000000_off 18",
|
||||
recipe = "default:mese_crystal",
|
||||
cooktime = 15,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mesecons:wire_00000000_off 162",
|
||||
recipe = "default:mese",
|
||||
cooktime = 30,
|
||||
})
|
||||
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = '"mesecons:wire_00000000_off" 16',
|
||||
recipe = "default:mese_crystal",
|
||||
})
|
||||
|
@ -11,7 +11,7 @@ minetest.register_alias("mesecons:wireless_receiver", "mesecons_wireless:wireles
|
||||
minetest.register_alias("mesecons:wireless_transmitter", "mesecons_wireless:wireless_transmitter_off")
|
||||
minetest.register_alias("mesecons:switch", "mesecons_switch:mesecon_switch_off")
|
||||
minetest.register_alias("mesecons:button", "mesecons_button:button_off")
|
||||
minetest.register_alias("mesecons:piston", "mesecons_pistons:piston_normal")
|
||||
minetest.register_alias("mesecons:piston", "mesecons_pistons:piston_normal_off")
|
||||
minetest.register_alias("mesecons:blinky_plant", "mesecons_blinkyplant:blinky_plant_off")
|
||||
minetest.register_alias("mesecons:mesecon_torch", "mesecons_torch:mesecon_torch_on")
|
||||
minetest.register_alias("mesecons:torch", "mesecons_torch:mesecon_torch_on")
|
||||
@ -23,10 +23,16 @@ minetest.register_alias("mesecons:mesecon_inverter", "mesecons_temperest:mesecon
|
||||
minetest.register_alias("mesecons:movestone", "mesecons_movestones:movestone")
|
||||
minetest.register_alias("mesecons:sticky_movestone", "mesecons_movestones:sticky_movestone")
|
||||
minetest.register_alias("mesecons:noteblock", "mesecons_noteblock:noteblock")
|
||||
minetest.register_alias("mesecons:microcontroller", "mesecons_microcontroller:microcontroller")
|
||||
minetest.register_alias("mesecons:microcontroller", "mesecons_microcontroller:microcontroller0000")
|
||||
minetest.register_alias("mesecons:delayer", "mesecons_delayer:delayer_off_1")
|
||||
minetest.register_alias("mesecons:solarpanel", "mesecons_solarpanel:solar_panel_off")
|
||||
|
||||
|
||||
--Backwards compatibility
|
||||
minetest.register_alias("mesecons:mesecon_off", "mesecons:wire_00000000_off")
|
||||
minetest.register_alias("mesecons_pistons:piston_sticky", "mesecons_pistons:piston_sticky_on")
|
||||
minetest.register_alias("mesecons_pistons:piston_normal", "mesecons_pistons:piston_normal_on")
|
||||
minetest.register_alias("mesecons_pistons:piston_up_normal", "mesecons_pistons:piston_up_normal_on")
|
||||
minetest.register_alias("mesecons_pistons:piston_down_normal", "mesecons_pistons:piston_down_normal_on")
|
||||
minetest.register_alias("mesecons_pistons:piston_up_sticky", "mesecons_pistons:piston_up_sticky_on")
|
||||
minetest.register_alias("mesecons_pistons:piston_down_sticky", "mesecons_pistons:piston_down_sticky_on")
|
||||
|
@ -9,10 +9,14 @@ minetest.register_node("mesecons_blinkyplant:blinky_plant_off", {
|
||||
walkable = false,
|
||||
groups = {dig_immediate=3, mesecon = 2},
|
||||
description="Blinky Plant",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
|
||||
},
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_blinkyplant:blinky_plant_on", {
|
||||
@ -26,10 +30,14 @@ minetest.register_node("mesecons_blinkyplant:blinky_plant_on", {
|
||||
drop='"mesecons_blinkyplant:blinky_plant_off" 1',
|
||||
light_source = LIGHT_MAX-7,
|
||||
description = "Blinky Plant",
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
|
||||
},
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.on
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -64,6 +72,3 @@ minetest.register_abm({
|
||||
mesecon:receptor_off(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:add_receptor_node("mesecons_blinkyplant:blinky_plant_on")
|
||||
mesecon:add_receptor_node_off("mesecons_blinkyplant:blinky_plant_off")
|
||||
|
@ -1,4 +1,17 @@
|
||||
-- WALL BUTTON
|
||||
-- A button that when pressed emits power for 1 second
|
||||
-- and then turns off again
|
||||
|
||||
mesecon.button_turnoff = function (pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
if node.name=="mesecons_button:button_on" then --has not been dug
|
||||
mesecon:swap_node(pos, "mesecons_button:button_off")
|
||||
minetest.sound_play("mesecons_button_pop", {pos=pos})
|
||||
local rules = mesecon.rules.buttonlike_get(node)
|
||||
mesecon:receptor_off(pos, rules)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_button:button_off", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
@ -25,9 +38,21 @@ minetest.register_node("mesecons_button:button_off", {
|
||||
{ -4/16, -2/16, 4/16, 4/16, 2/16, 6/16 } -- the button itself
|
||||
}
|
||||
},
|
||||
groups = {dig_immediate=2, mesecon = 3, mesecon_needs_receiver = 1},
|
||||
groups = {dig_immediate=2, mesecon_needs_receiver = 1},
|
||||
description = "Button",
|
||||
on_punch = function (pos, node)
|
||||
mesecon:swap_node(pos, "mesecons_button:button_on")
|
||||
mesecon:receptor_on(pos, mesecon.rules.buttonlike_get(node))
|
||||
minetest.sound_play("mesecons_button_push", {pos=pos})
|
||||
minetest.after(1, mesecon.button_turnoff, pos)
|
||||
end,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off,
|
||||
rules = mesecon.rules.buttonlike_get
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_button:button_on", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
@ -55,57 +80,19 @@ minetest.register_node("mesecons_button:button_on", {
|
||||
{ -4/16, -2/16, 11/32, 4/16, 2/16, 6/16 }
|
||||
}
|
||||
},
|
||||
groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon = 3, mesecon_needs_receiver = 1},
|
||||
groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon_needs_receiver = 1},
|
||||
drop = 'mesecons_button:button_off',
|
||||
description = "Button",
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.on,
|
||||
rules = mesecon.rules.buttonlike_get
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_on_punchnode(function(pos, node, puncher)
|
||||
if node.name == "mesecons_button:button_off" then
|
||||
minetest.env:add_node(pos, {name="mesecons_button:button_on",param2=node.param2})
|
||||
local rules=mesecon.button_get_rules(node.param2)
|
||||
mesecon:receptor_on(pos, rules)
|
||||
minetest.after(1, mesecon.button_turnoff, {pos=pos, param2=node.param2})
|
||||
end
|
||||
end)
|
||||
|
||||
mesecon.button_turnoff = function (params)
|
||||
if minetest.env:get_node(params.pos).name=="mesecons_button:button_on" then
|
||||
minetest.env:add_node(params.pos, {name="mesecons_button:button_off", param2=params.param2})
|
||||
local rules=mesecon.button_get_rules(params.param2)
|
||||
mesecon:receptor_off(params.pos, rules)
|
||||
end
|
||||
end
|
||||
|
||||
mesecon.button_get_rules = function(param2)
|
||||
local rules=mesecon:get_rules("button")
|
||||
if param2 == 2 then
|
||||
rules=mesecon:rotate_rules_left(rules)
|
||||
end
|
||||
if param2 == 3 then
|
||||
rules=mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules))
|
||||
end
|
||||
if param2 == 0 then
|
||||
rules=mesecon:rotate_rules_right(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_button:button_off" 2',
|
||||
recipe = {
|
||||
{'"group:mesecon_conductor_craftable"','"default:stone"'},
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:add_rules("button", {
|
||||
{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:add_receptor_node_off("mesecons_button:button_off", nil, mesecon.button_get_rules)
|
||||
mesecon:add_receptor_node("mesecons_button:button_on", nil, mesecon.button_get_rules)
|
||||
|
||||
|
BIN
mesecons_button/sounds/mesecons_button_pop.ogg
Normal file
BIN
mesecons_button/sounds/mesecons_button_push.ogg
Normal file
@ -1,3 +1,39 @@
|
||||
minetest.register_chatcommand("say", {
|
||||
params = "<text>",
|
||||
description = "Say <text> as the server",
|
||||
privs = {server=true},
|
||||
func = function(name, param)
|
||||
minetest.chat_send_all(name .. ": " .. param)
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("tell", {
|
||||
params = "<name> <text>",
|
||||
description = "Say <text> to <name> privately",
|
||||
func = function(name, param)
|
||||
local found, _, target, message = param:find("^([^%s]+)%s+(.*)$")
|
||||
if found == nil then
|
||||
minetest.chat_send_player(name, "Invalid usage: " .. param)
|
||||
return
|
||||
end
|
||||
minetest.chat_send_player(target, name .. " whispers: " .. message)
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("hp", {
|
||||
params = "<name> <value>",
|
||||
description = "Set health of <name> to <value> hitpoints",
|
||||
privs = {ban=true},
|
||||
func = function(name, param)
|
||||
local found, _, target, value = param:find("^([^%s]+)%s+(%d+)$")
|
||||
if found == nil then
|
||||
minetest.chat_send_player(name, "Invalid usage: " .. param)
|
||||
return
|
||||
end
|
||||
minetest.get_player_by_name(target):set_hp(value)
|
||||
end
|
||||
})
|
||||
|
||||
local initialize_data = function(meta, player, command, param)
|
||||
meta:set_string("formspec",
|
||||
"invsize[9,6;]" ..
|
||||
@ -87,50 +123,12 @@ local resolve_player = function(name, pos)
|
||||
return name
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_commandblock:commandblock_off", {
|
||||
description = "Command Block",
|
||||
tiles = {"jeija_commandblock_off.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_commandblock_off.png"),
|
||||
groups = {cracky=2, mesecon_effector_off=1, mesecon=2},
|
||||
on_construct = construct,
|
||||
after_place_node = after_place,
|
||||
on_receive_fields = receive_fields,
|
||||
can_dig = function(pos,player)
|
||||
local owner = minetest.env:get_meta(pos):get_string("owner")
|
||||
return owner == "" or owner == player:get_player_name()
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_commandblock:commandblock_on", {
|
||||
tiles = {"jeija_commandblock_on.png"},
|
||||
groups = {cracky=2, mesecon_effector_on=1, mesecon=2, not_in_creative_inventory=1},
|
||||
light_source = 10,
|
||||
drop = "mesecons_commandblock:commandblock_off",
|
||||
on_construct = construct,
|
||||
after_place_node = after_place,
|
||||
on_receive_fields = receive_fields,
|
||||
can_dig = function(pos,player)
|
||||
local owner = minetest.env:get_meta(pos):get_string("owner")
|
||||
return owner == "" or owner == player:get_player_name()
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:register_effector("mesecons_commandblock:commandblock_on", "mesecons_commandblock:commandblock_off")
|
||||
|
||||
local swap_node = function(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
|
||||
|
||||
mesecon:register_on_signal_on(function(pos, node)
|
||||
local commandblock_action_on = function(pos, node)
|
||||
if node.name ~= "mesecons_commandblock:commandblock_off" then
|
||||
return
|
||||
end
|
||||
|
||||
swap_node(pos, "mesecons_commandblock:commandblock_on")
|
||||
mesecon:swap_node(pos, "mesecons_commandblock:commandblock_on")
|
||||
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local command = minetest.chatcommands[meta:get_string("command")]
|
||||
@ -148,10 +146,46 @@ mesecon:register_on_signal_on(function(pos, node)
|
||||
end
|
||||
local player = resolve_player(meta:get_string("player"), pos)
|
||||
command.func(player, meta:get_string("param"))
|
||||
end)
|
||||
|
||||
mesecon:register_on_signal_off(function(pos, node)
|
||||
if node.name == "mesecons_commandblock:commandblock_on" then
|
||||
swap_node(pos, "mesecons_commandblock:commandblock_off")
|
||||
end
|
||||
end)
|
||||
|
||||
local commandblock_action_off = function(pos, node)
|
||||
if node.name == "mesecons_commandblock:commandblock_on" then
|
||||
mesecon:swap_node(pos, "mesecons_commandblock:commandblock_off")
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_commandblock:commandblock_off", {
|
||||
description = "Command Block",
|
||||
tiles = {"jeija_commandblock_off.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_commandblock_off.png"),
|
||||
groups = {cracky=2, mesecon_effector_off=1},
|
||||
on_construct = construct,
|
||||
after_place_node = after_place,
|
||||
on_receive_fields = receive_fields,
|
||||
can_dig = function(pos,player)
|
||||
local owner = minetest.env:get_meta(pos):get_string("owner")
|
||||
return owner == "" or owner == player:get_player_name()
|
||||
end,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_on = commandblock_action_on
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_commandblock:commandblock_on", {
|
||||
tiles = {"jeija_commandblock_on.png"},
|
||||
groups = {cracky=2, mesecon_effector_on=1, not_in_creative_inventory=1},
|
||||
light_source = 10,
|
||||
drop = "mesecons_commandblock:commandblock_off",
|
||||
on_construct = construct,
|
||||
after_place_node = after_place,
|
||||
on_receive_fields = receive_fields,
|
||||
can_dig = function(pos,player)
|
||||
local owner = minetest.env:get_meta(pos):get_string("owner")
|
||||
return owner == "" or owner == player:get_player_name()
|
||||
end,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_off = commandblock_action_off
|
||||
}}
|
||||
})
|
||||
|
2
mesecons_compatibility/depends.txt
Normal file
@ -0,0 +1,2 @@
|
||||
mesecons
|
||||
doors
|
167
mesecons_compatibility/init.lua
Normal file
@ -0,0 +1,167 @@
|
||||
doors = {}
|
||||
|
||||
-- Registers a door - REDEFINITION ONLY | DOORS MOD MUST HAVE BEEN LOADED BEFORE
|
||||
-- name: The name of the door
|
||||
-- def: a table with the folowing fields:
|
||||
-- description
|
||||
-- inventory_image
|
||||
-- groups
|
||||
-- tiles_bottom: the tiles of the bottom part of the door {front, side}
|
||||
-- tiles_top: the tiles of the bottom part of the door {front, side}
|
||||
-- If the following fields are not defined the default values are used
|
||||
-- node_box_bottom
|
||||
-- node_box_top
|
||||
-- selection_box_bottom
|
||||
-- selection_box_top
|
||||
-- only_placer_can_open: if true only the player who placed the door can
|
||||
-- open it
|
||||
|
||||
function doors:register_door(name, def)
|
||||
def.groups.not_in_creative_inventory = 1
|
||||
|
||||
local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}}
|
||||
|
||||
if not def.node_box_bottom then
|
||||
def.node_box_bottom = box
|
||||
end
|
||||
if not def.node_box_top then
|
||||
def.node_box_top = box
|
||||
end
|
||||
if not def.selection_box_bottom then
|
||||
def.selection_box_bottom= box
|
||||
end
|
||||
if not def.selection_box_top then
|
||||
def.selection_box_top = box
|
||||
end
|
||||
|
||||
local tt = def.tiles_top
|
||||
local tb = def.tiles_bottom
|
||||
|
||||
local function after_dig_node(pos, name)
|
||||
if minetest.env:get_node(pos).name == name then
|
||||
minetest.env:remove_node(pos)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_rightclick(pos, dir, check_name, replace, replace_dir, params)
|
||||
pos.y = pos.y+dir
|
||||
if not minetest.env:get_node(pos).name == check_name then
|
||||
return
|
||||
end
|
||||
local p2 = minetest.env:get_node(pos).param2
|
||||
p2 = params[p2+1]
|
||||
|
||||
local meta = minetest.env:get_meta(pos):to_table()
|
||||
minetest.env:set_node(pos, {name=replace_dir, param2=p2})
|
||||
minetest.env:get_meta(pos):from_table(meta)
|
||||
|
||||
pos.y = pos.y-dir
|
||||
meta = minetest.env:get_meta(pos):to_table()
|
||||
minetest.env:set_node(pos, {name=replace, param2=p2})
|
||||
minetest.env:get_meta(pos):from_table(meta)
|
||||
end
|
||||
|
||||
local function on_mesecons_signal_open (pos, node)
|
||||
on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
|
||||
end
|
||||
|
||||
local function on_mesecons_signal_close (pos, node)
|
||||
on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
|
||||
end
|
||||
|
||||
local function check_player_priv(pos, player)
|
||||
if not def.only_placer_can_open then
|
||||
return true
|
||||
end
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local pn = player:get_player_name()
|
||||
return meta:get_string("doors_owner") == pn
|
||||
end
|
||||
|
||||
minetest.register_node(":"..name.."_b_1", {
|
||||
tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drop = name,
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = def.node_box_bottom
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = def.selection_box_bottom
|
||||
},
|
||||
groups = def.groups,
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
pos.y = pos.y+1
|
||||
after_dig_node(pos, name.."_t_1")
|
||||
end,
|
||||
|
||||
on_rightclick = function(pos, node, puncher)
|
||||
if check_player_priv(pos, puncher) then
|
||||
on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
|
||||
end
|
||||
end,
|
||||
|
||||
mesecons = {effector = {
|
||||
action_on = on_mesecons_signal_open
|
||||
}},
|
||||
|
||||
can_dig = check_player_priv,
|
||||
})
|
||||
|
||||
minetest.register_node(":"..name.."_b_2", {
|
||||
tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drop = name,
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = def.node_box_bottom
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = def.selection_box_bottom
|
||||
},
|
||||
groups = def.groups,
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
pos.y = pos.y+1
|
||||
after_dig_node(pos, name.."_t_2")
|
||||
end,
|
||||
|
||||
on_rightclick = function(pos, node, puncher)
|
||||
if check_player_priv(pos, puncher) then
|
||||
on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
|
||||
end
|
||||
end,
|
||||
|
||||
mesecons = {effector = {
|
||||
action_off = on_mesecons_signal_close
|
||||
}},
|
||||
|
||||
can_dig = check_player_priv,
|
||||
})
|
||||
end
|
||||
|
||||
doors:register_door("doors:door_wood", {
|
||||
description = "Wooden Door",
|
||||
inventory_image = "door_wood.png",
|
||||
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1},
|
||||
tiles_bottom = {"door_wood_b.png", "door_brown.png"},
|
||||
tiles_top = {"door_wood_a.png", "door_brown.png"},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
|
||||
doors:register_door("doors:door_steel", {
|
||||
description = "Steel Door",
|
||||
inventory_image = "door_steel.png",
|
||||
groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1},
|
||||
tiles_bottom = {"door_steel_b.png", "door_grey.png"},
|
||||
tiles_top = {"door_steel_a.png", "door_grey.png"},
|
||||
only_placer_can_open = true,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
@ -1,11 +1,62 @@
|
||||
-- Function that get the input/output rules of the delayer
|
||||
local delayer_get_output_rules = function(node)
|
||||
local rules = {{x = 0, y = 0, z = 1}}
|
||||
for i = 0, node.param2 do
|
||||
rules = mesecon:rotate_rules_left(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
local delayer_get_input_rules = function(node)
|
||||
local rules = {{x = 0, y = 0, z = -1}}
|
||||
for i = 0, node.param2 do
|
||||
rules = mesecon:rotate_rules_left(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
-- Functions that are called after the delay time
|
||||
|
||||
local delayer_turnon = function(params)
|
||||
local rules = delayer_get_output_rules(params.node)
|
||||
mesecon:receptor_on(params.pos, rules)
|
||||
end
|
||||
|
||||
local delayer_turnoff = function(params)
|
||||
local rules = delayer_get_output_rules(params.node)
|
||||
mesecon:receptor_off(params.pos, rules)
|
||||
end
|
||||
|
||||
local delayer_activate = function(pos, node)
|
||||
local def = minetest.registered_nodes[node.name]
|
||||
local time = def.delayer_time
|
||||
mesecon:swap_node(pos, def.delayer_onstate)
|
||||
minetest.after(time, delayer_turnon , {pos = pos, node = node})
|
||||
end
|
||||
|
||||
local delayer_deactivate = function(pos, node)
|
||||
local def = minetest.registered_nodes[node.name]
|
||||
local time = def.delayer_time
|
||||
mesecon:swap_node(pos, def.delayer_offstate)
|
||||
minetest.after(time, delayer_turnoff, {pos = pos, node = node})
|
||||
end
|
||||
|
||||
-- Register the 2 (states) x 4 (delay times) delayers
|
||||
|
||||
for i = 1, 4 do
|
||||
local groups = {}
|
||||
if i == 1 then
|
||||
groups = {bendy=2,snappy=1,dig_immediate=2, mesecon = 3}
|
||||
groups = {bendy=2,snappy=1,dig_immediate=2}
|
||||
else
|
||||
groups = {bendy=2,snappy=1,dig_immediate=2, not_in_creative_inventory=1, mesecon = 3}
|
||||
groups = {bendy=2,snappy=1,dig_immediate=2, not_in_creative_inventory=1}
|
||||
end
|
||||
|
||||
local delaytime
|
||||
if i == 1 then delaytime = 0.1
|
||||
elseif i == 2 then delaytime = 0.3
|
||||
elseif i == 3 then delaytime = 0.5
|
||||
elseif i == 4 then delaytime = 1.0 end
|
||||
|
||||
boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab
|
||||
|
||||
{ -2/16, -7/16, -4/16, 2/16, -26/64, -3/16 }, -- the jeweled "on" indicator
|
||||
@ -46,6 +97,32 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), {
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = true,
|
||||
drop = 'mesecons_delayer:delayer_off_1',
|
||||
on_punch = function (pos, node)
|
||||
if node.name=="mesecons_delayer:delayer_off_1" then
|
||||
mesecon:swap_node(pos,"mesecons_delayer:delayer_off_2")
|
||||
elseif node.name=="mesecons_delayer:delayer_off_2" then
|
||||
mesecon:swap_node(pos,"mesecons_delayer:delayer_off_3")
|
||||
elseif node.name=="mesecons_delayer:delayer_off_3" then
|
||||
mesecon:swap_node(pos,"mesecons_delayer:delayer_off_4")
|
||||
elseif node.name=="mesecons_delayer:delayer_off_4" then
|
||||
mesecon:swap_node(pos,"mesecons_delayer:delayer_off_1")
|
||||
end
|
||||
end,
|
||||
delayer_time = delaytime,
|
||||
delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i),
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {
|
||||
receptor =
|
||||
{
|
||||
state = mesecon.state.off,
|
||||
rules = delayer_get_output_rules
|
||||
},
|
||||
effector =
|
||||
{
|
||||
rules = delayer_get_input_rules,
|
||||
action_on = delayer_activate
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@ -69,147 +146,44 @@ minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), {
|
||||
type = "fixed",
|
||||
fixed = boxes
|
||||
},
|
||||
groups = {bendy=2,snappy=1,dig_immediate=2, not_in_creative_inventory=1, mesecon = 3},
|
||||
groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = true,
|
||||
drop = 'mesecons_delayer:delayer_off_1',
|
||||
on_punch = function (pos, node)
|
||||
if node.name=="mesecons_delayer:delayer_on_1" then
|
||||
mesecon:swap_node(pos,"mesecons_delayer:delayer_on_2")
|
||||
elseif node.name=="mesecons_delayer:delayer_on_2" then
|
||||
mesecon:swap_node(pos,"mesecons_delayer:delayer_on_3")
|
||||
elseif node.name=="mesecons_delayer:delayer_on_3" then
|
||||
mesecon:swap_node(pos,"mesecons_delayer:delayer_on_4")
|
||||
elseif node.name=="mesecons_delayer:delayer_on_4" then
|
||||
mesecon:swap_node(pos,"mesecons_delayer:delayer_on_1")
|
||||
end
|
||||
end,
|
||||
delayer_time = delaytime,
|
||||
delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i),
|
||||
mesecons = {
|
||||
receptor =
|
||||
{
|
||||
state = mesecon.state.on,
|
||||
rules = delayer_get_output_rules
|
||||
},
|
||||
effector =
|
||||
{
|
||||
rules = delayer_get_input_rules,
|
||||
action_off = delayer_deactivate
|
||||
}
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
minetest.register_on_punchnode(function (pos, node)
|
||||
mesecon.delayer_get_output_rules(node.param2)
|
||||
if node.name=="mesecons_delayer:delayer_off_1" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_off_2", param2=node.param2})
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_off_2" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_off_3", param2=node.param2})
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_off_3" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_off_4", param2=node.param2})
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_off_4" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_off_1", param2=node.param2})
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_punchnode(function (pos, node)
|
||||
mesecon.delayer_get_output_rules(node.param2)
|
||||
if node.name=="mesecons_delayer:delayer_on_1" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_on_2", param2=node.param2})
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_on_2" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_on_3", param2=node.param2})
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_on_3" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_on_4", param2=node.param2})
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_on_4" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_on_1", param2=node.param2})
|
||||
end
|
||||
end)
|
||||
|
||||
mesecon.delayer_update = function(pos, node)
|
||||
if string.find(node.name, "mesecons_delayer:delayer_off")~=nil then
|
||||
local time = 0
|
||||
if node.name=="mesecons_delayer:delayer_off_1" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_on_1", param2=node.param2})
|
||||
time=0.1
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_off_2" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_on_2", param2=node.param2})
|
||||
time=0.3
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_off_3" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_on_3", param2=node.param2})
|
||||
time=0.5
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_off_4" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_on_4", param2=node.param2})
|
||||
time=1
|
||||
end
|
||||
minetest.after(time, mesecon.delayer_turnon, {pos=pos, param2=node.param2})
|
||||
end
|
||||
|
||||
if string.find(node.name, "mesecons_delayer:delayer_on")~=nil then
|
||||
local time = 0
|
||||
if node.name=="mesecons_delayer:delayer_on_1" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_off_1", param2=node.param2})
|
||||
time=0.1
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_on_2" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_off_2", param2=node.param2})
|
||||
time=0.3
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_on_3" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_off_3", param2=node.param2})
|
||||
time=0.5
|
||||
end
|
||||
if node.name=="mesecons_delayer:delayer_on_4" then
|
||||
minetest.env:add_node(pos, {name="mesecons_delayer:delayer_off_4", param2=node.param2})
|
||||
time=1
|
||||
end
|
||||
minetest.after(time, mesecon.delayer_turnoff, {pos=pos, param2=node.param2})
|
||||
end
|
||||
end
|
||||
|
||||
mesecon:register_on_signal_change(mesecon.delayer_update)
|
||||
|
||||
mesecon.delayer_turnon=function(params)
|
||||
local rules = mesecon.delayer_get_output_rules(params.param2)
|
||||
mesecon:receptor_on(params.pos, rules)
|
||||
end
|
||||
|
||||
mesecon.delayer_turnoff=function(params)
|
||||
local rules = mesecon.delayer_get_output_rules(params.param2)
|
||||
mesecon:receptor_off(params.pos, rules)
|
||||
end
|
||||
|
||||
mesecon.delayer_get_output_rules = function(param2)
|
||||
local rules = {}
|
||||
if param2 == 0 then
|
||||
table.insert(rules, {x = 1, y = 0, z = 0})
|
||||
elseif param2 == 2 then
|
||||
table.insert(rules, {x =-1, y = 0, z = 0})
|
||||
elseif param2 == 1 then
|
||||
table.insert(rules, {x = 0, y = 0, z =-1})
|
||||
elseif param2 == 3 then
|
||||
table.insert(rules, {x = 0, y = 0, z = 1})
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
mesecon.delayer_get_input_rules = function(param2)
|
||||
local rules = {}
|
||||
if param2 == 0 then
|
||||
table.insert(rules, {x =-1, y = 0, z = 0})
|
||||
elseif param2 == 2 then
|
||||
table.insert(rules, {x = 1, y = 0, z = 0})
|
||||
elseif param2 == 1 then
|
||||
table.insert(rules, {x = 0, y = 0, z = 1})
|
||||
elseif param2 == 3 then
|
||||
table.insert(rules, {x = 0, y = 0, z =-1})
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
all_rules = {{x = 1, y = 0, z = 0}, {x =-1, y = 0, z = 0}, {x = 0, y = 0, z =-1}, {x = 0, y = 0, z = 1}} --required to check if a newly placed should be turned on
|
||||
|
||||
mesecon:add_receptor_node("mesecons_delayer:delayer_on_1", all_rules, mesecon.delayer_get_output_rules)
|
||||
mesecon:add_receptor_node("mesecons_delayer:delayer_on_2", all_rules, mesecon.delayer_get_output_rules)
|
||||
mesecon:add_receptor_node("mesecons_delayer:delayer_on_3", all_rules, mesecon.delayer_get_output_rules)
|
||||
mesecon:add_receptor_node("mesecons_delayer:delayer_on_4", all_rules, mesecon.delayer_get_output_rules)
|
||||
|
||||
mesecon:add_receptor_node_off("mesecons_delayer:delayer_off_1", all_rules, mesecon.delayer_get_output_rules)
|
||||
mesecon:add_receptor_node_off("mesecons_delayer:delayer_off_2", all_rules, mesecon.delayer_get_output_rules)
|
||||
mesecon:add_receptor_node_off("mesecons_delayer:delayer_off_3", all_rules, mesecon.delayer_get_output_rules)
|
||||
mesecon:add_receptor_node_off("mesecons_delayer:delayer_off_4", all_rules, mesecon.delayer_get_output_rules)
|
||||
|
||||
mesecon:register_effector("mesecons_delayer:delayer_on_1", "mesecons_delayer:delayer_off_1", all_rules, mesecon.delayer_get_input_rules)
|
||||
mesecon:register_effector("mesecons_delayer:delayer_on_2", "mesecons_delayer:delayer_off_2", all_rules, mesecon.delayer_get_input_rules)
|
||||
mesecon:register_effector("mesecons_delayer:delayer_on_3", "mesecons_delayer:delayer_off_3", all_rules, mesecon.delayer_get_input_rules)
|
||||
mesecon:register_effector("mesecons_delayer:delayer_on_4", "mesecons_delayer:delayer_off_4", all_rules, mesecon.delayer_get_input_rules)
|
||||
minetest.register_craft({
|
||||
output = "mesecons_delayer:delayer_off_1",
|
||||
recipe = {
|
||||
{"mesecons_torch:mesecon_torch_on", "group:mesecon_conductor_craftable", "mesecons_torch:mesecon_torch_on"},
|
||||
{"default:cobble","default:cobble", "default:cobble"},
|
||||
}
|
||||
})
|
||||
|
@ -1,27 +1,84 @@
|
||||
--SHORT RANGE DETECTORS
|
||||
-- Object detector
|
||||
-- Detects players in a certain radius
|
||||
-- The radius can be specified in mesecons/settings.lua
|
||||
|
||||
local object_detector_make_formspec = function (pos)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
meta:set_string("formspec", "size[9,2.5]" ..
|
||||
"field[0.3, 0;9,2;scanname;Name of player to scan for (empty for any):;${scanname}]"..
|
||||
"field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]")
|
||||
end
|
||||
|
||||
local object_detector_on_receive_fields = function (pos, formname, fields)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
meta:set_string("scanname", fields.scanname)
|
||||
meta:set_string("digiline_channel", fields.digiline_channel)
|
||||
object_detector_make_formspec(pos)
|
||||
end
|
||||
|
||||
-- returns true if player was found, false if not
|
||||
local object_detector_scan = function (pos)
|
||||
local objs = minetest.env:get_objects_inside_radius(pos, OBJECT_DETECTOR_RADIUS)
|
||||
for k, obj in pairs(objs) do
|
||||
local isname = obj:get_player_name() -- "" is returned if it is not a player; "" ~= nil!
|
||||
local scanname = minetest.env:get_meta(pos):get_string("scanname")
|
||||
if (isname == scanname and isname ~= "") or (isname ~= "" and scanname == "") then -- player with scanname found or not scanname specified
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- set player name when receiving a digiline signal on a specific channel
|
||||
object_detector_digiline = {
|
||||
effector = {
|
||||
action = function (pos, node, channel, msg)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local active_channel = meta:get_string("digiline_channel")
|
||||
if channel == active_channel then
|
||||
meta:set_string("scanname", msg)
|
||||
object_detector_make_formspec(pos)
|
||||
end
|
||||
end,
|
||||
}
|
||||
}
|
||||
|
||||
minetest.register_node("mesecons_detector:object_detector_off", {
|
||||
tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png"},
|
||||
paramtype = "light",
|
||||
walkable = true,
|
||||
groups = {cracky=3, mesecon = 2},
|
||||
groups = {cracky=3},
|
||||
description="Player Detector",
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off
|
||||
}},
|
||||
on_construct = object_detector_make_formspec,
|
||||
on_receive_fields = object_detector_on_receive_fields,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
digiline = object_detector_digiline
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_detector:object_detector_on", {
|
||||
tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png"},
|
||||
paramtype = "light",
|
||||
walkable = true,
|
||||
groups = {cracky=3,not_in_creative_inventory=1, mesecon = 2},
|
||||
groups = {cracky=3,not_in_creative_inventory=1},
|
||||
drop = 'mesecons_detector:object_detector_off',
|
||||
description="Player Detector",
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.on
|
||||
}},
|
||||
on_construct = object_detector_make_formspec,
|
||||
on_receive_fields = object_detector_on_receive_fields,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
digiline = object_detector_digiline
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'mesecons_detector:object_detector_off',
|
||||
recipe = {
|
||||
{"default:steelblock", '', "default:steelblock"},
|
||||
{"default:steelblock", "mesecons_microcontroller:microcontroller0000", "default:steelblock"},
|
||||
{"default:steelblock", "group:mesecon_conductor_craftable", "default:steelblock"},
|
||||
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
|
||||
{"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "default:steel_ingot"},
|
||||
{"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"},
|
||||
}
|
||||
})
|
||||
|
||||
@ -29,19 +86,10 @@ minetest.register_abm(
|
||||
{nodenames = {"mesecons_detector:object_detector_off"},
|
||||
interval = 1.0,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local objs = minetest.env:get_objects_inside_radius(pos, 6)
|
||||
for k, obj in pairs(objs) do
|
||||
if obj:get_entity_name()~="mesecons_pistons:piston_pusher_sticky" and obj:get_entity_name()~="mesecons_pistons:piston_pusher_normal" and obj:get_player_name()~=nil then -- Detected object is not piston pusher - will be changed if every entity has a type (like entity_type=mob)
|
||||
if minetest.env:get_node({x=pos.x, y=pos.y-1, z=pos.z}).name=="default:sign_wall" then
|
||||
if obj:get_player_name()~=minetest.env:get_meta({x=pos.x, y=pos.y-1, z=pos.z}):get_string("text") then
|
||||
return
|
||||
end
|
||||
end
|
||||
local objpos=obj:getpos()
|
||||
minetest.env:add_node(pos, {name="mesecons_detector:object_detector_on"})
|
||||
mesecon:receptor_on(pos, mesecon:get_rules("pressureplate"))
|
||||
end
|
||||
action = function(pos)
|
||||
if object_detector_scan(pos) then
|
||||
mesecon:swap_node(pos, "mesecons_detector:object_detector_on")
|
||||
mesecon:receptor_on(pos)
|
||||
end
|
||||
end,
|
||||
})
|
||||
@ -50,28 +98,10 @@ minetest.register_abm(
|
||||
{nodenames = {"mesecons_detector:object_detector_on"},
|
||||
interval = 1.0,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local objs = minetest.env:get_objects_inside_radius(pos, 6)
|
||||
local objectfound=0
|
||||
for k, obj in pairs(objs) do
|
||||
if obj:get_entity_name()~="mesecons_pistons:piston_pusher_sticky" and obj:get_entity_name()~="mesecons_pistons:piston_pusher_normal" and obj~=nil
|
||||
and obj:get_player_name()~=nil then
|
||||
if minetest.env:get_node({x=pos.x, y=pos.y-1, z=pos.z}).name=="default:sign_wall" then
|
||||
if minetest.env:get_meta({x=pos.x, y=pos.y-1, z=pos.z}):get_string("text")== obj:get_player_name() then
|
||||
objectfound=objectfound+1
|
||||
end
|
||||
else
|
||||
-- Detected object is not piston pusher - will be changed if every entity has a type (like entity_type=mob)
|
||||
objectfound=objectfound + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
if objectfound==0 then
|
||||
minetest.env:add_node(pos, {name="mesecons_detector:object_detector_off"})
|
||||
mesecon:receptor_off(pos, mesecon:get_rules("pressureplate"))
|
||||
action = function(pos)
|
||||
if not object_detector_scan(pos) then
|
||||
mesecon:swap_node(pos, "mesecons_detector:object_detector_off")
|
||||
mesecon:receptor_off(pos)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:add_receptor_node("mesecons_detector:object_detector_on", mesecon:get_rules("pressureplate"))
|
||||
mesecon:add_receptor_node_off("mesecons_detector:object_detector_off", mesecon:get_rules("pressureplate"))
|
||||
|
@ -1,4 +0,0 @@
|
||||
Please note:
|
||||
The mesecons modules in here have been disabled for various reasons:
|
||||
They are old and deprecated, are not needed anymore or are buggy atm.
|
||||
You can create a module out of them, but it is not recommended to use any of them.
|
@ -1 +0,0 @@
|
||||
--read README
|
@ -1,2 +0,0 @@
|
||||
mesecons
|
||||
mesecons_materials
|
@ -1,313 +0,0 @@
|
||||
--COMMON WIRELESS FUNCTIONS
|
||||
|
||||
mesecon.wireless_receivers={}
|
||||
|
||||
function mesecon:read_wlre_from_file()
|
||||
print "[MESEcons] Reading Mesecon Data..."
|
||||
mesecon_file=io.open(minetest.get_modpath("jeija").."/mesecon_data", "r")
|
||||
if mesecon_file==nil then return end
|
||||
local row=mesecon_file:read()
|
||||
local i=1
|
||||
while row~=nil do
|
||||
mesecon.wireless_receivers[i]={}
|
||||
mesecon.wireless_receivers[i].pos={}
|
||||
mesecon.wireless_receivers[i].pos.x=tonumber(mesecon_file:read())
|
||||
mesecon.wireless_receivers[i].pos.y=tonumber(mesecon_file:read())
|
||||
mesecon.wireless_receivers[i].pos.z=tonumber(mesecon_file:read())
|
||||
mesecon.wireless_receivers[i].channel=mesecon_file:read()
|
||||
mesecon.wireless_receivers[i].requested_state=tonumber(mesecon_file:read())
|
||||
mesecon.wireless_receivers[i].inverting=tonumber(mesecon_file:read())
|
||||
i=i+1
|
||||
row=mesecon_file:read()
|
||||
end
|
||||
mesecon_file:close()
|
||||
print "[MESEcons] Finished Reading Mesecon Data..."
|
||||
end
|
||||
|
||||
|
||||
function mesecon:register_wireless_receiver(pos, inverting)
|
||||
local i = 1
|
||||
repeat
|
||||
if mesecon.wireless_receivers[i]==nil then break end
|
||||
i=i+1
|
||||
until false
|
||||
|
||||
|
||||
local node_under_pos={}
|
||||
node_under_pos.x=pos.x
|
||||
node_under_pos.y=pos.y
|
||||
node_under_pos.z=pos.z
|
||||
|
||||
node_under_pos.y=node_under_pos.y-1
|
||||
local node_under=minetest.env:get_node(node_under_pos)
|
||||
mesecon.wireless_receivers[i]={}
|
||||
mesecon.wireless_receivers[i].pos={}
|
||||
mesecon.wireless_receivers[i].pos.x=pos.x
|
||||
mesecon.wireless_receivers[i].pos.y=pos.y
|
||||
mesecon.wireless_receivers[i].pos.z=pos.z
|
||||
mesecon.wireless_receivers[i].channel=node_under.name
|
||||
mesecon.wireless_receivers[i].requested_state=0
|
||||
mesecon.wireless_receivers[i].inverting=inverting
|
||||
end
|
||||
|
||||
function mesecon:remove_wireless_receiver(pos)
|
||||
local i = 1
|
||||
while mesecon.wireless_receivers[i]~=nil do
|
||||
if mesecon.wireless_receivers[i].pos.x==pos.x and
|
||||
mesecon.wireless_receivers[i].pos.y==pos.y and
|
||||
mesecon.wireless_receivers[i].pos.z==pos.z then
|
||||
mesecon.wireless_receivers[i]=nil
|
||||
break
|
||||
end
|
||||
i=i+1
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:set_wlre_channel(pos, channel)
|
||||
--local i = 1
|
||||
--while mesecon.wireless_receivers[i]~=nil do
|
||||
-- if tonumber(mesecon.wireless_receivers[i].pos.x)==tonumber(pos.x) and
|
||||
-- tonumber(mesecon.wireless_receivers[i].pos.y)==tonumber(pos.y) and
|
||||
-- tonumber(mesecon.wireless_receivers[i].pos.z)==tonumber(pos.z) then
|
||||
-- mesecon.wireless_receivers[i].channel=channel
|
||||
-- break
|
||||
-- end
|
||||
-- i=i+1
|
||||
--end
|
||||
local wlre=mesecon:get_wlre(pos)
|
||||
if wlre~=nil then
|
||||
wlre.channel=channel
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:get_wlre(pos)
|
||||
local i=1
|
||||
while mesecon.wireless_receivers[i]~=nil do
|
||||
if mesecon.wireless_receivers[i].pos.x==pos.x and
|
||||
mesecon.wireless_receivers[i].pos.y==pos.y and
|
||||
mesecon.wireless_receivers[i].pos.z==pos.z then
|
||||
return mesecon.wireless_receivers[i]
|
||||
end
|
||||
i=i+1
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_placenode(function(pos, newnode, placer)
|
||||
pos.y=pos.y+1
|
||||
if minetest.env:get_node(pos).name == "mesecons_wireless:wireless_receiver_off" or
|
||||
minetest.env:get_node(pos).name == "mesecons_wireless:wireless_receiver_on" or
|
||||
minetest.env:get_node(pos).name == "mesecons_wireless:wireless_inverter_off" or
|
||||
minetest.env:get_node(pos).name == "mesecons_wireless:wireless_inverter_on" then
|
||||
mesecon:set_wlre_channel(pos, newnode.name)
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_dignode(
|
||||
function(pos, oldnode, digger)
|
||||
local channel
|
||||
pos.y=pos.y+1
|
||||
if minetest.env:get_node(pos).name == "mesecons_wireless:wireless_receiver_on" or
|
||||
minetest.env:get_node(pos).name == "mesecons_wireless:wireless_receiver_off" or
|
||||
minetest.env:get_node(pos).name == "mesecons_wireless:wireless_inverter_on" or
|
||||
minetest.env:get_node(pos).name == "mesecons_wireless:wireless_inverter_off" then
|
||||
mesecon:set_wlre_channel(pos, "air")
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
minetest.register_abm(
|
||||
{nodenames = {"mesecons_wireless:wireless_receiver_on", "mesecons_wireless:wireless_receiver_off",
|
||||
"mesecons_wireless:wireless_inverter_on", "mesecons_wireless:wireless_inverter_off"},
|
||||
interval = 1.0,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local wlre=mesecon:get_wlre(pos)
|
||||
if (wlre==nil) then return end
|
||||
|
||||
if node.name=="mesecons_wireless:wireless_receiver_on" and wlre.requested_state==0 then
|
||||
minetest.env:add_node(pos, {name="mesecons_wireless:wireless_receiver_off"})
|
||||
mesecon:receptor_off(pos)
|
||||
end
|
||||
if node.name=="mesecons_wireless:wireless_receiver_off" and wlre.requested_state==1 then
|
||||
minetest.env:add_node(pos, {name="mesecons_wireless:wireless_receiver_on"})
|
||||
mesecon:receptor_on(pos)
|
||||
end
|
||||
if node.name=="mesecons_wireless:wireless_inverter_off" and wlre.requested_state==0 and wlre.inverting==1 then
|
||||
minetest.env:add_node(pos, {name="mesecons_wireless:wireless_inverter_on"})
|
||||
mesecon:receptor_on(pos)
|
||||
end
|
||||
if node.name=="mesecons_wireless:wireless_inverter_on" and wlre.requested_state==1 and wlre.inverting==1 then
|
||||
minetest.env:add_node(pos, {name="mesecons_wireless:wireless_inverter_off"})
|
||||
mesecon:receptor_off(pos)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
--WIRELESS RECEIVER
|
||||
|
||||
minetest.register_node("mesecons_wireless:wireless_receiver_off", {
|
||||
tile_images = {"jeija_wireless_receiver_tb_off.png", "jeija_wireless_receiver_tb_off.png", "jeija_wireless_receiver_off.png", "jeija_wireless_receiver_off.png", "jeija_wireless_receiver_off.png", "jeija_wireless_receiver_off.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_wireless_receiver_off.png"),
|
||||
groups = {choppy=2},
|
||||
description="Wireless Receiver",
|
||||
after_place_node = function(pos)
|
||||
mesecon:register_wireless_receiver(pos, 0)
|
||||
end,
|
||||
after_dig_node = function(pos)
|
||||
mesecon:remove_wireless_receiver(pos)
|
||||
mesecon:receptor_off(pos)
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_wireless:wireless_receiver_on", {
|
||||
tile_images = {"jeija_wireless_receiver_tb_on.png", "jeija_wireless_receiver_tb_on.png", "jeija_wireless_receiver_on.png", "jeija_wireless_receiver_on.png", "jeija_wireless_receiver_on.png", "jeija_wireless_receiver_on.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_wireless_receiver_on.png"),
|
||||
groups = {choppy=2},
|
||||
drop = 'mesecons_wireless:wireless_receiver_off',
|
||||
description="Wireless Receiver",
|
||||
after_place_node = function(pos)
|
||||
mesecon:register_wireless_receiver(pos, 0)
|
||||
end,
|
||||
after_dig_node = function(pos)
|
||||
mesecon:remove_wireless_receiver(pos)
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_wireless:wireless_receiver_off" 2',
|
||||
recipe = {
|
||||
{'', "group:mesecon_conductor_craftable", ''},
|
||||
{'', "group:mesecon_conductor_craftable", ''},
|
||||
{'', "mesecons_materials:ic", ''},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_abm( -- SAVE WIRELESS RECEIVERS TO FILE
|
||||
{nodenames = {"mesecons_wireless:wireless_receiver_off", "mesecons_wireless:wireless_receiver_on", "mesecons_wireless:wireless_inverter_on", "mesecons_wireless:wireless_inverter_off"},
|
||||
interval = 10,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local mesecon_file = io.open(minetest.get_modpath("jeija").."/mesecon_data", "w")
|
||||
local i=1
|
||||
while mesecon.wireless_receivers[i]~=nil do
|
||||
mesecon_file:write("NEXT\n")
|
||||
mesecon_file:write(mesecon.wireless_receivers[i].pos.x.."\n")
|
||||
mesecon_file:write(mesecon.wireless_receivers[i].pos.y.."\n")
|
||||
mesecon_file:write(mesecon.wireless_receivers[i].pos.z.."\n")
|
||||
mesecon_file:write(mesecon.wireless_receivers[i].channel.."\n")
|
||||
mesecon_file:write(mesecon.wireless_receivers[i].requested_state.."\n")
|
||||
mesecon_file:write(mesecon.wireless_receivers[i].inverting.."\n")
|
||||
i=i+1
|
||||
end
|
||||
mesecon_file:close()
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:add_receptor_node("mesecons_wireless:wireless_receiver_on")
|
||||
mesecon:add_receptor_node_off("mesecons_wireless:wireless_receiver_off")
|
||||
|
||||
-- WIRELESS INVERTER OFF/ON BELONGS TO THE OUTPUT STATE (ON=INPUT OFF)
|
||||
|
||||
minetest.register_node("mesecons_wireless:wireless_inverter_off", {
|
||||
tile_images = {"jeija_wireless_inverter_tb.png", "jeija_wireless_inverter_tb.png", "jeija_wireless_inverter_off.png", "jeija_wireless_inverter_off.png", "jeija_wireless_inverter_off.png", "jeija_wireless_inverter_off.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_wireless_inverter_off.png"),
|
||||
groups = {choppy=2},
|
||||
drop = 'mesecons_wireless:wireless_inverter_on',
|
||||
description = "Wireless Inverter",
|
||||
after_place_node = function(pos)
|
||||
mesecon:register_wireless_receiver(pos, 1)
|
||||
mesecon:receptor_on(pos)
|
||||
end,
|
||||
after_dig_node = function(pos)
|
||||
mesecon:remove_wireless_receiver(pos)
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_wireless:wireless_inverter_on", {
|
||||
tile_images = {"jeija_wireless_inverter_tb.png", "jeija_wireless_inverter_tb.png", "jeija_wireless_inverter_on.png", "jeija_wireless_inverter_on.png", "jeija_wireless_inverter_on.png", "jeija_wireless_inverter_on.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_wireless_inverter_on.png"),
|
||||
groups = {choppy=2},
|
||||
description = "Wireless Inverter",
|
||||
after_place_node = function(pos)
|
||||
mesecon:register_wireless_receiver(pos, 1)
|
||||
mesecon:receptor_on(pos)
|
||||
end,
|
||||
after_dig_node = function(pos)
|
||||
mesecon:remove_wireless_receiver(pos)
|
||||
mesecon:receptor_off(pos)
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_wireless:wireless_inverter_off" 2',
|
||||
recipe = {
|
||||
{'', 'default:steel_ingot', ''},
|
||||
{'mesecons_materials:ic', 'group:mesecon_conductor_craftable', 'mesecons_materials:ic'},
|
||||
{'', 'group:mesecon_conductor_craftable', ''},
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:add_receptor_node("mesecons_wireless:wireless_inverter_on")
|
||||
mesecon:add_receptor_node_off("mesecons_wireless:wireless_inverter_off")
|
||||
|
||||
-- WIRELESS TRANSMITTER
|
||||
|
||||
function mesecon:wireless_transmit(channel, senderstate)
|
||||
local i = 1
|
||||
while mesecon.wireless_receivers[i]~=nil do
|
||||
if mesecon.wireless_receivers[i].channel==channel then
|
||||
if senderstate==1 then
|
||||
mesecon.wireless_receivers[i].requested_state=1
|
||||
elseif senderstate==0 then
|
||||
mesecon.wireless_receivers[i].requested_state=0
|
||||
end
|
||||
end
|
||||
i=i+1
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_wireless:wireless_transmitter_on", {
|
||||
tile_images = {"jeija_wireless_transmitter_tb.png", "jeija_wireless_transmitter_tb.png", "jeija_wireless_transmitter_on.png", "jeija_wireless_transmitter_on.png", "jeija_wireless_transmitter_on.png", "jeija_wireless_transmitter_on.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_wireless_transmitter_on.png"),
|
||||
groups = {choppy=2},
|
||||
drop = {'"mesecons_wireless:wireless_transmitter_off" 1'},
|
||||
description="Wireless Transmitter",
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_wireless:wireless_transmitter_off", {
|
||||
tile_images = {"jeija_wireless_transmitter_tb.png", "jeija_wireless_transmitter_tb.png", "jeija_wireless_transmitter_off.png", "jeija_wireless_transmitter_off.png", "jeija_wireless_transmitter_off.png", "jeija_wireless_transmitter_off.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_wireless_transmitter_off.png"),
|
||||
groups = {choppy=2},
|
||||
description="Wireless Transmitter",
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_wireless:wireless_transmitter_off" 2',
|
||||
recipe = {
|
||||
{'default:steel_ingot', 'group:mesecon_conductor_craftable', 'default:steel_ingot'},
|
||||
{'', 'group:mesecon_conductor_craftable', ''},
|
||||
{'', 'mesecons_materials:ic', ''},
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:register_on_signal_on(function(pos, node)
|
||||
if node.name=="mesecons_wireless:wireless_transmitter_off" then
|
||||
minetest.env:add_node(pos, {name="mesecons_wireless:wireless_transmitter_on"})
|
||||
local node_under_pos=pos
|
||||
node_under_pos.y=node_under_pos.y-1
|
||||
local node_under=minetest.env:get_node(node_under_pos)
|
||||
mesecon:wireless_transmit(node_under.name, 1)
|
||||
end
|
||||
end)
|
||||
|
||||
mesecon:register_on_signal_off(function(pos, node)
|
||||
if node.name=="mesecons_wireless:wireless_transmitter_on" then
|
||||
minetest.env:add_node(pos, {name="mesecons_wireless:wireless_transmitter_off"})
|
||||
local node_under_pos=pos
|
||||
node_under_pos.y=node_under_pos.y-1
|
||||
local node_under=minetest.env:get_node(node_under_pos)
|
||||
mesecon:wireless_transmit(node_under.name, 0)
|
||||
end
|
||||
end)
|
||||
|
||||
mesecon:read_wlre_from_file()
|
83
mesecons_extrawires/corner.lua
Normal file
@ -0,0 +1,83 @@
|
||||
local corner_nodebox = {
|
||||
type = "fixed",
|
||||
fixed = {{ -16/32-0.001, -17/32, -3/32, 0, -13/32, 3/32 },
|
||||
{ -3/32, -17/32, -16/32+0.001, 3/32, -13/32, 3/32}}
|
||||
}
|
||||
|
||||
local corner_selectionbox = {
|
||||
type = "fixed",
|
||||
fixed = { -16/32-0.001, -18/32, -16/32, 5/32, -12/32, 5/32 },
|
||||
}
|
||||
|
||||
local corner_get_rules = function (node)
|
||||
local rules =
|
||||
{{x = 1, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = -1}}
|
||||
|
||||
for i = 0, node.param2 do
|
||||
rules = mesecon:rotate_rules_left(rules)
|
||||
end
|
||||
|
||||
return rules
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_extrawires:corner_on", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"jeija_insulated_wire_curved_tb_on.png",
|
||||
"jeija_insulated_wire_curved_tb_on.png^[transformR270",
|
||||
"jeija_insulated_wire_sides_on.png",
|
||||
"jeija_insulated_wire_ends_on.png",
|
||||
"jeija_insulated_wire_sides_on.png",
|
||||
"jeija_insulated_wire_ends_on.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = false,
|
||||
sunlight_propagates = true,
|
||||
selection_box = corner_selectionbox,
|
||||
node_box = corner_nodebox,
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
drop = "mesecons_extrawires:corner_off",
|
||||
mesecons = {conductor =
|
||||
{
|
||||
state = mesecon.state.on,
|
||||
rules = corner_get_rules,
|
||||
offstate = "mesecons_extrawires:corner_off"
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:corner_off", {
|
||||
drawtype = "nodebox",
|
||||
description = "Mesecon Corner",
|
||||
tiles = {
|
||||
"jeija_insulated_wire_curved_tb_off.png",
|
||||
"jeija_insulated_wire_curved_tb_off.png^[transformR270",
|
||||
"jeija_insulated_wire_sides_off.png",
|
||||
"jeija_insulated_wire_ends_off.png",
|
||||
"jeija_insulated_wire_sides_off.png",
|
||||
"jeija_insulated_wire_ends_off.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
walkable = false,
|
||||
sunlight_propagates = true,
|
||||
selection_box = corner_selectionbox,
|
||||
node_box = corner_nodebox,
|
||||
groups = {dig_immediate = 3},
|
||||
mesecons = {conductor =
|
||||
{
|
||||
state = mesecon.state.off,
|
||||
rules = corner_get_rules,
|
||||
onstate = "mesecons_extrawires:corner_on"
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_extrawires:corner_off" 3',
|
||||
recipe = {
|
||||
{"", "", ""},
|
||||
{"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", ""},
|
||||
{"", "mesecons_insulated:insulated_off", ""},
|
||||
}
|
||||
})
|
@ -1,46 +1,16 @@
|
||||
for x=-1, 1 do for z=-1, 1 do
|
||||
rules = {}
|
||||
nodename = "mesecons_extrawires:crossing"
|
||||
if x == -1 then
|
||||
nodename = nodename .. "A"
|
||||
table.insert(rules, {x=-1, y=0, z=0})
|
||||
-- CODE NOT ACTIVE
|
||||
|
||||
local crossing_get_rules = function(node)
|
||||
--TODO: calculate the real port states and use rules to link to them only if
|
||||
end
|
||||
if z == 1 then
|
||||
nodename = nodename .. "B"
|
||||
table.insert(rules, {x=0, y=0, z=1})
|
||||
end
|
||||
if x == 1 then
|
||||
nodename = nodename .. "C"
|
||||
table.insert(rules, {x=1, y=0, z=0})
|
||||
end
|
||||
if z == -1 then
|
||||
nodename = nodename .. "D"
|
||||
table.insert(rules, {x=0, y=0, z=-1})
|
||||
end
|
||||
mesecon:add_rules(nodename, rules)
|
||||
mesecon:register_effector(nodename, nodename, all_rules)
|
||||
if nodename == "mesecons_extrawires:crossing" then
|
||||
description = "Insulated Crossing"
|
||||
groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1}
|
||||
else
|
||||
description = "You hacker you!"
|
||||
drop = "mesecons_extrawires:crossing"
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory=1, mesecon = 3}
|
||||
mesecon:add_receptor_node(nodename, rules)
|
||||
end
|
||||
minetest.register_node(nodename, {
|
||||
|
||||
minetest.register_node("mesecons_extrawires:crossing_on", {
|
||||
drawtype = "nodebox",
|
||||
description = description,
|
||||
tiles = {
|
||||
"jeija_insulated_wire_sides.png",
|
||||
},
|
||||
tiles = {"jeija_insulated_wire_sides_on.png"},
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
stack_max = 99,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001 },
|
||||
},
|
||||
selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
@ -52,73 +22,14 @@ for x=-1, 1 do for z=-1, 1 do
|
||||
{ -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
|
||||
},
|
||||
},
|
||||
groups = groups,
|
||||
drop = drop,
|
||||
groups = {dig_immediate=3, mesecon=3, mesecon_conductor_craftable=1, not_in_creative_inventory=1},
|
||||
mesecons = {
|
||||
receptor = {
|
||||
state = mesecon.state.on,
|
||||
rules = crossing_get_rules,
|
||||
}
|
||||
},
|
||||
})
|
||||
end end
|
||||
|
||||
function receptor_set(pos, rules, on)
|
||||
if on then
|
||||
mesecon:receptor_on(pos, rules)
|
||||
else
|
||||
mesecon:receptor_off(pos, rules)
|
||||
end
|
||||
end
|
||||
|
||||
function update_plus(pos, name)
|
||||
vL = {
|
||||
a = string.find(name, "A")~=nil,
|
||||
b = string.find(name, "B")~=nil,
|
||||
c = string.find(name, "C")~=nil,
|
||||
d = string.find(name, "D")~=nil,
|
||||
}
|
||||
rL = yc_get_real_portstates(pos)
|
||||
L = {
|
||||
a = rL.c and not vL.c,
|
||||
b = rL.d and not vL.d,
|
||||
c = rL.a and not vL.a,
|
||||
d = rL.b and not vL.b,
|
||||
}
|
||||
newname = "mesecons_extrawires:crossing"
|
||||
if L.a then newname = newname .. "A" end
|
||||
if L.b then newname = newname .. "B" end
|
||||
if L.c then newname = newname .. "C" end
|
||||
if L.d then newname = newname .. "D" end
|
||||
if newname ~= name then
|
||||
minetest.env:add_node(pos, {name = newname})
|
||||
end
|
||||
if L.a ~= vL.a then
|
||||
receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingA"), L.a)
|
||||
if not L.a and yc_get_real_portstates(pos).a then
|
||||
--catch signal changing direction while on
|
||||
update_plus(pos, newname)
|
||||
end
|
||||
end
|
||||
if L.b ~= vL.b then
|
||||
receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingB"), L.b)
|
||||
if not L.b and yc_get_real_portstates(pos).b then
|
||||
update_plus(pos, newname)
|
||||
end
|
||||
end
|
||||
if L.c ~= vL.c then
|
||||
receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingC"), L.c)
|
||||
if not L.c and yc_get_real_portstates(pos).c then
|
||||
update_plus(pos, newname)
|
||||
end
|
||||
end
|
||||
if L.d ~= vL.d then
|
||||
receptor_set(pos, mesecon:get_rules("mesecons_extrawires:crossingD"), L.d)
|
||||
if not L.c and yc_get_real_portstates(pos).d then
|
||||
update_plus(pos, newname)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
mesecon:register_on_signal_change(function(pos, node)
|
||||
if string.find(node.name, "mesecons_extrawires:crossing")~=nil then
|
||||
update_plus(pos, node.name)
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
|
@ -1,2 +1,6 @@
|
||||
dofile(minetest.get_modpath("mesecons_extrawires").."/crossing.lua");
|
||||
-- dofile(minetest.get_modpath("mesecons_extrawires").."/crossing.lua");
|
||||
-- The crossing code is not active right now because it is hard to maintain
|
||||
dofile(minetest.get_modpath("mesecons_extrawires").."/tjunction.lua");
|
||||
dofile(minetest.get_modpath("mesecons_extrawires").."/corner.lua");
|
||||
dofile(minetest.get_modpath("mesecons_extrawires").."/vertical.lua");
|
||||
dofile(minetest.get_modpath("mesecons_extrawires").."/mesewire.lua");
|
||||
|
35
mesecons_extrawires/mesewire.lua
Normal file
@ -0,0 +1,35 @@
|
||||
local mesewire_rules =
|
||||
{
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0},
|
||||
{x = 0, y = 1, z = 0},
|
||||
{x = 0, y =-1, z = 0},
|
||||
{x = 0, y = 0, z = 1},
|
||||
{x = 0, y = 0, z =-1},
|
||||
}
|
||||
|
||||
minetest.register_node(":default:mese", {
|
||||
description = "Mese Block",
|
||||
tiles = {minetest.registered_nodes["default:mese"].tiles[1]},
|
||||
is_ground_content = true,
|
||||
groups = {cracky=1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
onstate = "mesecons_extrawires:mese_powered",
|
||||
rules = mesewire_rules
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:mese_powered", {
|
||||
tiles = {minetest.registered_nodes["default:mese"].tiles[1].."^[brighten"},
|
||||
is_ground_content = true,
|
||||
groups = {cracky=1, not_in_creative_inventory = 1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
offstate = "default:mese",
|
||||
rules = mesewire_rules
|
||||
}},
|
||||
drop = "default:mese"
|
||||
})
|
@ -9,14 +9,27 @@ local tjunction_selectionbox = {
|
||||
fixed = { -16/32-0.001, -18/32, -16/32, 16/32+0.001, -12/32, 7/32 },
|
||||
}
|
||||
|
||||
local tjunction_get_rules = function (node)
|
||||
local rules =
|
||||
{{x = 0, y = 0, z = 1},
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = -1}}
|
||||
|
||||
for i = 0, node.param2 do
|
||||
rules = mesecon:rotate_rules_left(rules)
|
||||
end
|
||||
|
||||
return rules
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_extrawires:tjunction_on", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_tjunction_tb_on.png",
|
||||
"jeija_insulated_wire_tjunction_tb_on.png^[transformR180",
|
||||
"jeija_insulated_wire_ends_on.png",
|
||||
"jeija_insulated_wire_ends_on.png",
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides_on.png",
|
||||
"jeija_insulated_wire_ends_on.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
@ -25,20 +38,25 @@ minetest.register_node("mesecons_extrawires:tjunction_on", {
|
||||
sunlight_propagates = true,
|
||||
selection_box = tjunction_selectionbox,
|
||||
node_box = tjunction_nodebox,
|
||||
groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1, not_in_creative_inventory = 1},
|
||||
drop = "mesecons_insulated:insulated_off",
|
||||
|
||||
groups = {dig_immediate = 3, mesecon_conductor_craftable=1, not_in_creative_inventory = 1},
|
||||
drop = "mesecons_extrawires:tjunction_off",
|
||||
mesecons = {conductor =
|
||||
{
|
||||
state = mesecon.state.on,
|
||||
rules = tjunction_get_rules,
|
||||
offstate = "mesecons_extrawires:tjunction_off"
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:tjunction_off", {
|
||||
drawtype = "nodebox",
|
||||
description = "T-junction",
|
||||
tiles = {
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_tjunction_tb_off.png",
|
||||
"jeija_insulated_wire_tjunction_tb_off.png^[transformR180",
|
||||
"jeija_insulated_wire_ends_off.png",
|
||||
"jeija_insulated_wire_ends_off.png",
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides_off.png",
|
||||
"jeija_insulated_wire_ends_off.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
@ -47,7 +65,13 @@ minetest.register_node("mesecons_extrawires:tjunction_off", {
|
||||
sunlight_propagates = true,
|
||||
selection_box = tjunction_selectionbox,
|
||||
node_box = tjunction_nodebox,
|
||||
groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1},
|
||||
groups = {dig_immediate = 3, mesecon_conductor_craftable=1},
|
||||
mesecons = {conductor =
|
||||
{
|
||||
state = mesecon.state.off,
|
||||
rules = tjunction_get_rules,
|
||||
onstate = "mesecons_extrawires:tjunction_on"
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -58,28 +82,3 @@ minetest.register_craft({
|
||||
{"", "mesecons_insulated:insulated_off", ""},
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:add_rules("tjunction_all", { --all possible rules
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = 1},
|
||||
{x = 0, y = 0, z =-1},})
|
||||
|
||||
mesecon:add_rules("tjunction", {
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = -1},})
|
||||
|
||||
function tjunction_get_rules(param2)
|
||||
local rules = mesecon:get_rules("tjunction")
|
||||
if param2 == 1 then
|
||||
rules = mesecon:rotate_rules_left(mesecon:get_rules("tjunction"))
|
||||
elseif param2 == 2 then
|
||||
rules = mesecon:rotate_rules_right(mesecon:rotate_rules_right(mesecon:get_rules("tjunction")))
|
||||
elseif param2 == 3 then
|
||||
rules = mesecon:rotate_rules_right(mesecon:get_rules("tjunction"))
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
mesecon:register_conductor("mesecons_extrawires:tjunction_on", "mesecons_extrawires:tjunction_off", mesecon:get_rules("tjunction_all"), tjunction_get_rules)
|
||||
|
217
mesecons_extrawires/vertical.lua
Normal file
@ -0,0 +1,217 @@
|
||||
local vbox = {
|
||||
type = "fixed",
|
||||
fixed = {-1/16, -.5, -1/16, 1/16, .5, 1/16}
|
||||
}
|
||||
|
||||
local tbox = {
|
||||
type = "fixed",
|
||||
fixed = {{-.5, -.5, -.5, .5, -.5 + 1/16, .5}}
|
||||
}
|
||||
|
||||
local bbox = {
|
||||
type = "fixed",
|
||||
fixed = {{ -.5, -.5 , -.5, .5, -.5+1/16, .5},
|
||||
{-1/16, -.5+1/16, -1/16, 1/16, .5 , 1/16}}
|
||||
}
|
||||
|
||||
local vrules =
|
||||
{{x = 0, y = 1, z = 0},
|
||||
{x = 0, y =-1, z = 0}}
|
||||
|
||||
local trules =
|
||||
{{x = 1, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = 1},
|
||||
{x = 0, y = 0, z =-1},
|
||||
{x = 0, y =-1, z = 0}}
|
||||
|
||||
local brules =
|
||||
{{x = 1, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = 1},
|
||||
{x = 0, y = 0, z =-1},
|
||||
{x = 0, y = 1, z = 0}}
|
||||
|
||||
local vertical_updatepos = function (pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
if minetest.registered_nodes[node.name].is_vertical_conductor then
|
||||
local node_above = minetest.env:get_node(mesecon:addPosRule(pos, vrules[1]))
|
||||
local node_below = minetest.env:get_node(mesecon:addPosRule(pos, vrules[2]))
|
||||
local namestate = minetest.registered_nodes[node.name].vertical_conductor_state
|
||||
|
||||
-- above and below: vertical mesecon
|
||||
if minetest.registered_nodes[node_above.name].is_vertical_conductor
|
||||
and minetest.registered_nodes[node_below.name].is_vertical_conductor then
|
||||
minetest.env:add_node (pos,
|
||||
{name = "mesecons_extrawires:vertical_"..namestate})
|
||||
|
||||
-- above only: bottom
|
||||
elseif minetest.registered_nodes[node_above.name].is_vertical_conductor
|
||||
and not minetest.registered_nodes[node_below.name].is_vertical_conductor then
|
||||
minetest.env:add_node (pos,
|
||||
{name = "mesecons_extrawires:vertical_bottom_"..namestate})
|
||||
|
||||
-- below only: top
|
||||
elseif not minetest.registered_nodes[node_above.name].is_vertical_conductor
|
||||
and minetest.registered_nodes[node_below.name].is_vertical_conductor then
|
||||
minetest.env:add_node (pos,
|
||||
{name = "mesecons_extrawires:vertical_top_"..namestate})
|
||||
else -- no vertical wire above, no vertical wire below: use default wire
|
||||
minetest.env:add_node (pos,
|
||||
{name = "mesecons_extrawires:vertical_"..namestate})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local vertical_update = function (pos, node)
|
||||
vertical_updatepos(pos) -- this one
|
||||
vertical_updatepos(mesecon:addPosRule(pos, vrules[1])) -- above
|
||||
vertical_updatepos(mesecon:addPosRule(pos, vrules[2])) -- below
|
||||
end
|
||||
|
||||
-- Vertical wire
|
||||
minetest.register_node("mesecons_extrawires:vertical_on", {
|
||||
description = "Vertical mesecon",
|
||||
drawtype = "nodebox",
|
||||
tiles = {"wires_vertical_on.png"},
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
selection_box = vbox,
|
||||
node_box = vbox,
|
||||
is_vertical_conductor = true,
|
||||
vertical_conductor_state = "on",
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
offstate = "mesecons_extrawires:vertical_off",
|
||||
rules = vrules
|
||||
}},
|
||||
drop = {"mesecons_extrawires:vertical_off"},
|
||||
after_place_node = vertical_update,
|
||||
after_dig_node = vertical_update
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:vertical_off", {
|
||||
description = "Vertical mesecon",
|
||||
drawtype = "nodebox",
|
||||
tiles = {"wires_vertical_off.png"},
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
groups = {dig_immediate = 3},
|
||||
selection_box = vbox,
|
||||
node_box = vbox,
|
||||
is_vertical_conductor = true,
|
||||
vertical_conductor_state = "off",
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
onstate = "mesecons_extrawires:vertical_on",
|
||||
rules = vrules
|
||||
}},
|
||||
after_place_node = vertical_update,
|
||||
after_dig_node = vertical_update
|
||||
})
|
||||
|
||||
-- Vertical wire top
|
||||
minetest.register_node("mesecons_extrawires:vertical_top_on", {
|
||||
description = "Vertical mesecon",
|
||||
drawtype = "nodebox",
|
||||
tiles = {"wires_full_on.png"},
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
selection_box = tbox,
|
||||
node_box = tbox,
|
||||
is_vertical_conductor = true,
|
||||
vertical_conductor_state = "on",
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
offstate = "mesecons_extrawires:vertical_top_off",
|
||||
rules = trules
|
||||
}},
|
||||
drop = {"mesecons_extrawires:vertical_off"},
|
||||
after_place_node = vertical_update,
|
||||
after_dig_node = vertical_update
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:vertical_top_off", {
|
||||
description = "Vertical mesecon",
|
||||
drawtype = "nodebox",
|
||||
tiles = {"wires_full_off.png"},
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
selection_box = tbox,
|
||||
node_box = tbox,
|
||||
is_vertical_conductor = true,
|
||||
vertical_conductor_state = "off",
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
onstate = "mesecons_extrawires:vertical_top_on",
|
||||
rules = trules
|
||||
}},
|
||||
drop = {"mesecons_extrawires:vertical_off"},
|
||||
after_place_node = vertical_update,
|
||||
after_dig_node = vertical_update
|
||||
})
|
||||
|
||||
-- Vertical wire bottom
|
||||
minetest.register_node("mesecons_extrawires:vertical_bottom_on", {
|
||||
description = "Vertical mesecon",
|
||||
drawtype = "nodebox",
|
||||
tiles = {"wires_full_on.png"},
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
vertical_conductor_state = "on",
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
selection_box = bbox,
|
||||
node_box = bbox,
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
offstate = "mesecons_extrawires:vertical_bottom_off",
|
||||
rules = brules
|
||||
}},
|
||||
drop = {"mesecons_extrawires:vertical_off"},
|
||||
after_place_node = vertical_update,
|
||||
after_dig_node = vertical_update
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:vertical_bottom_off", {
|
||||
description = "Vertical mesecon",
|
||||
drawtype = "nodebox",
|
||||
tiles = {"wires_full_off.png"},
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
selection_box = bbox,
|
||||
node_box = bbox,
|
||||
is_vertical_conductor = true,
|
||||
vertical_conductor_state = "off",
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
onstate = "mesecons_extrawires:vertical_bottom_on",
|
||||
rules = brules
|
||||
}},
|
||||
drop = {"mesecons_extrawires:vertical_off"},
|
||||
after_place_node = vertical_update,
|
||||
after_dig_node = vertical_update
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mesecons_extrawires:vertical_off 3",
|
||||
recipe = {
|
||||
{"mesecons:wire_00000000_off"},
|
||||
{"mesecons:wire_00000000_off"},
|
||||
{"mesecons:wire_00000000_off"}
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mesecons:wire_00000000_off",
|
||||
recipe = {{"mesecons_extrawires:vertical_off"}}
|
||||
})
|
@ -1,62 +1,129 @@
|
||||
outrules = {
|
||||
{x=1, y=0, z=0},
|
||||
}
|
||||
oneinput = {
|
||||
{x=-1, y=0, z=0},
|
||||
{x=1, y=0, z=0},
|
||||
}
|
||||
twoinputs = {
|
||||
{x=0, y=0, z=1},
|
||||
{x=0, y=0, z=-1},
|
||||
{x=1, y=0, z=0},
|
||||
}
|
||||
function get_gate_rules(param2, onlyout, singleinput)
|
||||
if onlyout then
|
||||
rules = outrules
|
||||
else
|
||||
if singleinput then
|
||||
rules = oneinput
|
||||
else
|
||||
rules = twoinputs
|
||||
end
|
||||
end
|
||||
for rotations=0, param2-1 do
|
||||
function gate_rotate_rules(node)
|
||||
for rotations = 0, node.param2 - 1 do
|
||||
rules = mesecon:rotate_rules_left(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
function get_gate_rules_one(param2) return get_gate_rules(param2, false, true) end
|
||||
function get_gate_rules_two(param2) return get_gate_rules(param2, false, false) end
|
||||
function get_gate_rules_out(param2) return get_gate_rules(param2, true) end
|
||||
gates = {"diode", "not", "nand", "and", "xor"}
|
||||
for g in ipairs(gates) do gate = gates[g]
|
||||
if g < 3 then
|
||||
get_rules = get_gate_rules_one
|
||||
function gate_get_output_rules(node)
|
||||
rules = {{x=1, y=0, z=0}}
|
||||
return gate_rotate_rules(node)
|
||||
end
|
||||
|
||||
function gate_get_input_rules_oneinput(node)
|
||||
rules = {{x=-1, y=0, z=0}, {x=1, y=0, z=0}}
|
||||
return gate_rotate_rules(node)
|
||||
end
|
||||
|
||||
function gate_get_input_rules_twoinputs(node)
|
||||
rules = {
|
||||
{x=0, y=0, z=1},
|
||||
{x=0, y=0, z=-1},
|
||||
{x=1, y=0, z=0}}
|
||||
return gate_rotate_rules(node)
|
||||
end
|
||||
|
||||
function update_gate(pos)
|
||||
gate = get_gate(pos)
|
||||
L = rotate_ports(
|
||||
yc_get_real_portstates(pos),
|
||||
minetest.env:get_node(pos).param2
|
||||
)
|
||||
if gate == "diode" then
|
||||
set_gate(pos, L.a)
|
||||
elseif gate == "not" then
|
||||
set_gate(pos, not L.a)
|
||||
elseif gate == "nand" then
|
||||
set_gate(pos, not(L.b and L.d))
|
||||
elseif gate == "and" then
|
||||
set_gate(pos, L.b and L.d)
|
||||
elseif gate == "xor" then
|
||||
set_gate(pos, (L.b and not L.d) or (not L.b and L.d))
|
||||
end
|
||||
end
|
||||
|
||||
function set_gate(pos, on)
|
||||
gate = get_gate(pos)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
if on ~= gate_state(pos) then
|
||||
yc_heat(meta)
|
||||
minetest.after(0.5, yc_cool, meta)
|
||||
if yc_overheat(meta) then
|
||||
pop_gate(pos)
|
||||
else
|
||||
get_rules = get_gate_rules_two
|
||||
if on then
|
||||
mesecon:swap_node(pos, "mesecons_gates:"..gate.."_on")
|
||||
mesecon:receptor_on(pos,
|
||||
gate_get_output_rules(minetest.env:get_node(pos)))
|
||||
else
|
||||
mesecon:swap_node(pos, "mesecons_gates:"..gate.."_off")
|
||||
mesecon:receptor_off(pos,
|
||||
gate_get_output_rules(minetest.env:get_node(pos)))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function get_gate(pos)
|
||||
return minetest.registered_nodes[minetest.env:get_node(pos).name].mesecons_gate
|
||||
end
|
||||
|
||||
function gate_state(pos)
|
||||
name = minetest.env:get_node(pos).name
|
||||
return string.find(name, "_on") ~= nil
|
||||
end
|
||||
|
||||
function pop_gate(pos)
|
||||
gate = get_gate(pos)
|
||||
minetest.env:remove_node(pos)
|
||||
minetest.after(0.2, yc_overheat_off, pos)
|
||||
minetest.env:add_item(pos, "mesecons_gates:"..gate.."_off")
|
||||
end
|
||||
|
||||
function rotate_ports(L, param2)
|
||||
for rotations=0, param2-1 do
|
||||
port = L.a
|
||||
L.a = L.b
|
||||
L.b = L.c
|
||||
L.c = L.d
|
||||
L.d = port
|
||||
end
|
||||
return L
|
||||
end
|
||||
|
||||
gates = {
|
||||
{name = "diode", inputnumber = 1},
|
||||
{name = "not" , inputnumber = 1},
|
||||
{name = "nand" , inputnumber = 2},
|
||||
{name = "and" , inputnumber = 2},
|
||||
{name = "xor" , inputnumber = 2}}
|
||||
|
||||
local onoff, drop, nodename, description, groups
|
||||
for _, gate in ipairs(gates) do
|
||||
if gate.inputnumber == 1 then
|
||||
get_rules = gate_get_input_rules_oneinput
|
||||
elseif gate.inputnumber == 2 then
|
||||
get_rules = gate_get_input_rules_twoinputs
|
||||
end
|
||||
for on = 0, 1 do
|
||||
nodename = "mesecons_gates:"..gate
|
||||
nodename = "mesecons_gates:"..gate.name
|
||||
if on == 1 then
|
||||
onoff = "on"
|
||||
drop = nodename.."_off"
|
||||
nodename = nodename.."_"..onoff
|
||||
description = "You hacker you!"
|
||||
groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon = 3}
|
||||
mesecon:add_receptor_node(nodename, get_rules, get_gate_rules_out)
|
||||
--mesecon:add_receptor_node(nodename, mesecon:get_rules("insulated_all"))
|
||||
groups = {dig_immediate=2, not_in_creative_inventory=1}
|
||||
else
|
||||
onoff = "off"
|
||||
drop = nil
|
||||
nodename = nodename.."_"..onoff
|
||||
description = gate.." Gate"
|
||||
groups = {dig_immediate=2, mesecon = 3}
|
||||
--mesecon:add_receptor_node_off(nodename, get_gate_rules_out)
|
||||
description = gate.name.." Gate"
|
||||
groups = {dig_immediate=2}
|
||||
end
|
||||
|
||||
tiles = "jeija_microcontroller_bottom.png^"..
|
||||
"jeija_gate_"..onoff..".png^"..
|
||||
"jeija_gate_"..gate..".png"
|
||||
"jeija_gate_"..gate.name..".png"
|
||||
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
@ -65,6 +132,13 @@ for g in ipairs(gates) do gate = gates[g]
|
||||
},
|
||||
}
|
||||
|
||||
local mesecon_state
|
||||
if on == 1 then
|
||||
mesecon_state = mesecon.state.on
|
||||
else
|
||||
mesecon_state = mesecon.state.off
|
||||
end
|
||||
|
||||
minetest.register_node(nodename, {
|
||||
description = description,
|
||||
paramtype = "light",
|
||||
@ -82,103 +156,25 @@ for g in ipairs(gates) do gate = gates[g]
|
||||
end,
|
||||
groups = groups,
|
||||
drop = drop,
|
||||
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons_gate = gate.name,
|
||||
mesecons =
|
||||
{
|
||||
receptor =
|
||||
{
|
||||
state = mesecon_state,
|
||||
rules = gate_get_output_rules
|
||||
},
|
||||
effector =
|
||||
{
|
||||
rules = get_rules,
|
||||
action_change = update_gate
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:register_effector(nodename, nodename, all_rules, get_rules)
|
||||
end
|
||||
end
|
||||
|
||||
function get_gate(pos)
|
||||
return
|
||||
string.gsub(
|
||||
string.gsub(
|
||||
string.gsub(
|
||||
minetest.env:get_node(pos).name
|
||||
, "mesecons_gates:", "") --gate
|
||||
,"_on", "")
|
||||
,"_off", "")
|
||||
end
|
||||
|
||||
function gate_state(pos)
|
||||
name = minetest.env:get_node(pos).name
|
||||
return string.find(name, "_on") ~= nil
|
||||
end
|
||||
|
||||
function pop_gate(pos)
|
||||
gate = get_gate(pos)
|
||||
minetest.env:remove_node(pos)
|
||||
minetest.after(0.2, yc_overheat_off, pos)
|
||||
minetest.env:add_item(pos, "mesecons_gates:"..gate.."_off")
|
||||
end
|
||||
|
||||
function set_gate(pos, on)
|
||||
gate = get_gate(pos)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
if on ~= gate_state(pos) then
|
||||
yc_heat(meta)
|
||||
minetest.after(0.5, yc_cool, meta)
|
||||
if yc_overheat(meta) then
|
||||
pop_gate(pos)
|
||||
else
|
||||
heat = meta:get_int("heat")
|
||||
if on then
|
||||
onoff = "_on"
|
||||
else
|
||||
onoff = "_off"
|
||||
end
|
||||
param2 = minetest.env:get_node(pos).param2
|
||||
minetest.env:add_node(pos, {
|
||||
name = "mesecons_gates:"..gate..onoff,
|
||||
param2 = param2,
|
||||
})
|
||||
local meta2 = minetest.env:get_meta(pos)
|
||||
meta2:set_int("heat", heat)
|
||||
if on then
|
||||
mesecon:receptor_on(pos, get_gate_rules(param2, true))
|
||||
else
|
||||
mesecon:receptor_off(pos, all_rules)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function rotate_ports(L, param2)
|
||||
for rotations=0, param2-1 do
|
||||
port = L.a
|
||||
L.a = L.b
|
||||
L.b = L.c
|
||||
L.c = L.d
|
||||
L.d = port
|
||||
end
|
||||
return L
|
||||
end
|
||||
|
||||
function update_gate(pos)
|
||||
gate = get_gate(pos)
|
||||
L = rotate_ports(
|
||||
yc_get_real_portstates(pos),
|
||||
minetest.env:get_node(pos).param2
|
||||
)
|
||||
if gate == "diode" then
|
||||
set_gate(pos, L.a)
|
||||
elseif gate == "not" then
|
||||
set_gate(pos, not L.a)
|
||||
elseif gate == "nand" then
|
||||
set_gate(pos, not(L.b and L.d))
|
||||
elseif gate == "and" then
|
||||
set_gate(pos, L.b and L.d)
|
||||
else--if gate == "xor" then
|
||||
set_gate(pos, (L.b and not L.d) or (not L.b and L.d))
|
||||
end
|
||||
end
|
||||
|
||||
mesecon:register_on_signal_change(function(pos,node)
|
||||
if string.find(node.name, "mesecons_gates:")~=nil then
|
||||
update_gate(pos)
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'mesecons_gates:diode_off',
|
||||
recipe = {
|
||||
|
@ -1,9 +1,12 @@
|
||||
-- HYDRO_TURBINE
|
||||
-- Water turbine:
|
||||
-- Active if flowing >water< above it
|
||||
-- (does not work with other liquids)
|
||||
|
||||
minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_hydro_turbine_off.png"},
|
||||
groups = {dig_immediate=2, mesecon = 2},
|
||||
groups = {dig_immediate=2},
|
||||
description="Water Turbine",
|
||||
paramtype = "light",
|
||||
selection_box = {
|
||||
@ -20,13 +23,17 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
|
||||
{-0.45, 1.15, -0.1, 0.45, 1.45, 0.1},
|
||||
{-0.1, 1.15, -0.45, 0.1, 1.45, 0.45}},
|
||||
},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_hydro_turbine_on.png"},
|
||||
drop = '"mesecons_hydroturbine:hydro_turbine_off" 1',
|
||||
groups = {dig_immediate=2,not_in_creative_inventory=1, mesecon = 2},
|
||||
groups = {dig_immediate=2,not_in_creative_inventory=1},
|
||||
description="Water Turbine",
|
||||
paramtype = "light",
|
||||
selection_box = {
|
||||
@ -43,6 +50,10 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
|
||||
{-0.5, 1.15, -0.1, 0.5, 1.45, 0.1},
|
||||
{-0.1, 1.15, -0.5, 0.1, 1.45, 0.5}},
|
||||
},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.on
|
||||
}}
|
||||
})
|
||||
|
||||
|
||||
@ -74,9 +85,6 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_on"},
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:add_receptor_node("mesecons_hydroturbine:hydro_turbine_on")
|
||||
mesecon:add_receptor_node_off("mesecons_hydroturbine:hydro_turbine_off")
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_hydroturbine:hydro_turbine_off" 2',
|
||||
recipe = {
|
||||
|
@ -1,13 +1,22 @@
|
||||
function insulated_wire_get_rules(node)
|
||||
local rules = {{x = 1, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0}}
|
||||
if node.param2 == 1 or node.param2 == 3 then
|
||||
return mesecon:rotate_rules_right(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_insulated:insulated_on", {
|
||||
drawtype = "nodebox",
|
||||
description = "insulated mesecons",
|
||||
description = "Insulated Mesecon",
|
||||
tiles = {
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides_on.png",
|
||||
"jeija_insulated_wire_sides_on.png",
|
||||
"jeija_insulated_wire_ends_on.png",
|
||||
"jeija_insulated_wire_ends_on.png",
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides.png"
|
||||
"jeija_insulated_wire_sides_on.png",
|
||||
"jeija_insulated_wire_sides_on.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
@ -21,21 +30,25 @@ minetest.register_node("mesecons_insulated:insulated_on", {
|
||||
type = "fixed",
|
||||
fixed = { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }
|
||||
},
|
||||
groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1, not_in_creative_inventory = 1},
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
drop = "mesecons_insulated:insulated_off",
|
||||
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
offstate = "mesecons_insulated:insulated_off",
|
||||
rules = insulated_wire_get_rules
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_insulated:insulated_off", {
|
||||
drawtype = "nodebox",
|
||||
description = "insulated mesecons",
|
||||
tiles = {
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides_off.png",
|
||||
"jeija_insulated_wire_sides_off.png",
|
||||
"jeija_insulated_wire_ends_off.png",
|
||||
"jeija_insulated_wire_ends_off.png",
|
||||
"jeija_insulated_wire_sides.png",
|
||||
"jeija_insulated_wire_sides.png"
|
||||
"jeija_insulated_wire_sides_off.png",
|
||||
"jeija_insulated_wire_sides_off.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
@ -49,7 +62,12 @@ minetest.register_node("mesecons_insulated:insulated_off", {
|
||||
type = "fixed",
|
||||
fixed = { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }
|
||||
},
|
||||
groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1},
|
||||
groups = {dig_immediate = 3},
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
onstate = "mesecons_insulated:insulated_on",
|
||||
rules = insulated_wire_get_rules
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -61,21 +79,6 @@ minetest.register_craft({
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:add_rules("insulated_all", { --all possible rules
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = 1},
|
||||
{x = 0, y = 0, z =-1},})
|
||||
|
||||
mesecon:add_rules("insulated", {
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0},})
|
||||
|
||||
function insulated_wire_get_rules(param2)
|
||||
if param2 == 1 or param2 == 3 then
|
||||
return mesecon:rotate_rules_right(mesecon:get_rules("insulated"))
|
||||
end
|
||||
return mesecon:get_rules("insulated")
|
||||
end
|
||||
|
||||
mesecon:register_conductor("mesecons_insulated:insulated_on", "mesecons_insulated:insulated_off", mesecon:get_rules("insulated_all"), insulated_wire_get_rules)
|
||||
{x =-1, y = 0, z = 0}})
|
||||
|
@ -1,4 +1,14 @@
|
||||
-- MESELAMPS
|
||||
-- A lamp is "is an electrical device used to create artificial light" (wikipedia)
|
||||
-- guess what?
|
||||
|
||||
mesecon_lamp_box = {
|
||||
type = "wallmounted",
|
||||
wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
|
||||
wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
|
||||
wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
|
||||
}
|
||||
|
||||
minetest.register_node("mesecons_lamp:lamp_on", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_meselamp_on.png"},
|
||||
@ -8,20 +18,16 @@ minetest.register_node("mesecons_lamp:lamp_on", {
|
||||
sunlight_propagates = true,
|
||||
walkable = true,
|
||||
light_source = LIGHT_MAX,
|
||||
node_box = {
|
||||
type = "wallmounted",
|
||||
wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
|
||||
wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
|
||||
wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
|
||||
},
|
||||
selection_box = {
|
||||
type = "wallmounted",
|
||||
wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
|
||||
wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
|
||||
wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
|
||||
},
|
||||
groups = {dig_immediate=3,not_in_creative_inventory=1, mesecon_effector_on = 1, mesecon = 2},
|
||||
node_box = mesecon_lamp_box,
|
||||
selection_box = mesecon_lamp_box,
|
||||
groups = {dig_immediate=3,not_in_creative_inventory=1, mesecon_effector_on = 1},
|
||||
drop='"mesecons_lamp:lamp_off" 1',
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_off = function (pos, node)
|
||||
mesecon:swap_node(pos, "mesecons_lamp:lamp_off")
|
||||
end
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_lamp:lamp_off", {
|
||||
@ -33,20 +39,16 @@ minetest.register_node("mesecons_lamp:lamp_off", {
|
||||
paramtype2 = "wallmounted",
|
||||
sunlight_propagates = true,
|
||||
walkable = true,
|
||||
node_box = {
|
||||
type = "wallmounted",
|
||||
wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
|
||||
wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
|
||||
wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
|
||||
},
|
||||
selection_box = {
|
||||
type = "wallmounted",
|
||||
wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
|
||||
wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
|
||||
wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
|
||||
},
|
||||
groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2},
|
||||
node_box = mesecon_lamp_box,
|
||||
selection_box = mesecon_lamp_box,
|
||||
groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1},
|
||||
description="Meselamp",
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
mesecon:swap_node(pos, "mesecons_lamp:lamp_on")
|
||||
end
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -57,19 +59,3 @@ minetest.register_craft({
|
||||
{'', '"default:glass"', ''},
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:register_on_signal_on(function(pos, node)
|
||||
if node.name == "mesecons_lamp:lamp_off" then
|
||||
minetest.env:add_node(pos, {name="mesecons_lamp:lamp_on", param2 = node.param2})
|
||||
nodeupdate(pos)
|
||||
end
|
||||
end)
|
||||
|
||||
mesecon:register_on_signal_off(function(pos, node)
|
||||
if node.name == "mesecons_lamp:lamp_on" then
|
||||
minetest.env:add_node(pos, {name="mesecons_lamp:lamp_off", param2 = node.param2})
|
||||
nodeupdate(pos)
|
||||
end
|
||||
end)
|
||||
|
||||
mesecon:register_effector("mesecons_lamp:lamp_on", "mesecons_lamp:lamp_off")
|
||||
|
@ -4,6 +4,12 @@ function mesecon:lightstone_add(name, base_item, texture_off, texture_on)
|
||||
inventory_image = minetest.inventorycube(texture_off),
|
||||
groups = {cracky=2, mesecon_effector_off = 1, mesecon = 2},
|
||||
description=name.." Lightstone",
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
mesecon:swap_node(pos, "mesecons_lightstone:lightstone_" .. name .. "_on")
|
||||
end
|
||||
}}
|
||||
})
|
||||
minetest.register_node("mesecons_lightstone:lightstone_" .. name .. "_on", {
|
||||
tiles = {texture_on},
|
||||
@ -11,20 +17,14 @@ function mesecon:lightstone_add(name, base_item, texture_off, texture_on)
|
||||
groups = {cracky=2,not_in_creative_inventory=1, mesecon = 2},
|
||||
drop = "node mesecons_lightstone:lightstone_" .. name .. "_off 1",
|
||||
light_source = LIGHT_MAX-2,
|
||||
description=name.." Lightstone",
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_off = function (pos, node)
|
||||
mesecon:swap_node(pos, "mesecons_lightstone:lightstone_" .. name .. "_off")
|
||||
end
|
||||
}}
|
||||
})
|
||||
assert(loadstring('mesecon:register_on_signal_on(function(pos, node) \n \
|
||||
if node.name == "mesecons_lightstone:lightstone_' .. name .. '_off" then \n \
|
||||
minetest.env:add_node(pos, {name="mesecons_lightstone:lightstone_' .. name .. '_on"}) \n \
|
||||
nodeupdate(pos) \n \
|
||||
end \n \
|
||||
end)'))()
|
||||
assert(loadstring('mesecon:register_on_signal_off(function(pos, node) \n \
|
||||
if node.name == "mesecons_lightstone:lightstone_' .. name .. '_on" then \n \
|
||||
minetest.env:add_node(pos, {name="mesecons_lightstone:lightstone_' .. name .. '_off"}) \n \
|
||||
nodeupdate(pos) \n \
|
||||
end \n \
|
||||
end)'))()
|
||||
|
||||
minetest.register_craft({
|
||||
output = "node mesecons_lightstone:lightstone_" .. name .. "_off 1",
|
||||
recipe = {
|
||||
@ -33,7 +33,6 @@ function mesecon:lightstone_add(name, base_item, texture_off, texture_on)
|
||||
{'','group:mesecon_conductor_craftable',''},
|
||||
}
|
||||
})
|
||||
mesecon:register_effector("mesecons_lightstone:lightstone_" .. name .. "_on", "mesecons_lightstone:lightstone_" .. name .. "_off")
|
||||
end
|
||||
|
||||
|
||||
|
1
mesecons_luacontroller/depends.txt
Normal file
@ -0,0 +1 @@
|
||||
mesecons
|
510
mesecons_luacontroller/init.lua
Normal file
@ -0,0 +1,510 @@
|
||||
-- Reference
|
||||
-- ports = get_real_portstates(pos): gets if inputs are powered from outside
|
||||
-- newport = merge_portstates(state1, state2): just does result = state1 or state2 for every port
|
||||
-- action_setports(pos, ports, vports): activates/deactivates the mesecons according to the portstates (helper for action)
|
||||
-- action(pos, ports): Applies new portstates to a luacontroller at pos
|
||||
-- lc_update(pos): updates the controller at pos by executing the code
|
||||
-- reset_meta (pos, code, errmsg): performs a software-reset, installs new code and prints error messages
|
||||
-- reset (pos): performs a hardware reset, turns off all ports
|
||||
--
|
||||
-- The Sandbox
|
||||
-- The whole code of the controller runs in a sandbox,
|
||||
-- a very restricted environment.
|
||||
-- However, as this does not prevent you from using e.g. loops,
|
||||
-- we need to check for these prohibited commands first.
|
||||
-- Actually the only way to damage the server is to
|
||||
-- use too much memory from the sandbox.
|
||||
-- You can add more functions to the environment
|
||||
-- (see where local env is defined)
|
||||
-- Something nice to play is is appending minetest.env to it.
|
||||
|
||||
local BASENAME = "mesecons_luacontroller:luacontroller"
|
||||
|
||||
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"}
|
||||
|
||||
------------------
|
||||
-- Action stuff --
|
||||
------------------
|
||||
-- These helpers are required to set the portstates of the luacontroller
|
||||
|
||||
local get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside)
|
||||
ports = {
|
||||
a = mesecon:is_power_on(mesecon:addPosRule(pos, rules.a))
|
||||
and mesecon:rules_link(mesecon:addPosRule(pos, rules.a), pos),
|
||||
b = mesecon:is_power_on(mesecon:addPosRule(pos, rules.b))
|
||||
and mesecon:rules_link(mesecon:addPosRule(pos, rules.b), pos),
|
||||
c = mesecon:is_power_on(mesecon:addPosRule(pos, rules.c))
|
||||
and mesecon:rules_link(mesecon:addPosRule(pos, rules.c), pos),
|
||||
d = mesecon:is_power_on(mesecon:addPosRule(pos, rules.d))
|
||||
and mesecon:rules_link(mesecon:addPosRule(pos, rules.d), pos),
|
||||
}
|
||||
return ports
|
||||
end
|
||||
|
||||
local merge_portstates = function (ports, vports)
|
||||
local npo = {a=false, b=false, c=false, d=false}
|
||||
npo.a = vports.a or ports.a
|
||||
npo.b = vports.b or ports.b
|
||||
npo.c = vports.c or ports.c
|
||||
npo.d = vports.d or ports.d
|
||||
return npo
|
||||
end
|
||||
|
||||
local generate_name = function (ports, overwrite)
|
||||
local overwrite = overwrite or {}
|
||||
local d = overwrite.d or (ports.d and 1 or 0)
|
||||
local c = overwrite.c or (ports.c and 1 or 0)
|
||||
local b = overwrite.b or (ports.b and 1 or 0)
|
||||
local a = overwrite.a or (ports.a and 1 or 0)
|
||||
return BASENAME..d..c..b..a
|
||||
end
|
||||
|
||||
local setport = function (pos, rule, ignore, state, ports)
|
||||
local ignorename = generate_name(ports, ignore)
|
||||
mesecon:swap_node(pos, ignorename)
|
||||
if state then
|
||||
mesecon:receptor_on(pos, {rule})
|
||||
else
|
||||
mesecon:receptor_off(pos, {rule})
|
||||
end
|
||||
if minetest.env:get_node(pos).name ~= ignorename then
|
||||
return true -- overridden by second process
|
||||
end
|
||||
return false -- success
|
||||
end
|
||||
|
||||
local action = function (pos, ports, forcereset)
|
||||
local name = minetest.env:get_node(pos).name
|
||||
local vports = minetest.registered_nodes[name].virtual_portstates
|
||||
local newname = generate_name(ports)
|
||||
|
||||
if name ~= newname and vports then
|
||||
local rules_on = {}
|
||||
local rules_off = {}
|
||||
local ignore = {}
|
||||
|
||||
local interrupted
|
||||
if ports.a ~= vports.a then interrupted = setport(pos, rules.a, {a = 2}, ports.a, ports) end
|
||||
if interrupted and not forcereset then return end
|
||||
if ports.b ~= vports.b then interrupted = setport(pos, rules.b, {b = 2}, ports.b, ports) end
|
||||
if interrupted and not forcereset then return end
|
||||
if ports.c ~= vports.c then interrupted = setport(pos, rules.c, {c = 2}, ports.c, ports) end
|
||||
if interrupted and not forcereset then return end
|
||||
if ports.d ~= vports.d then interrupted = setport(pos, rules.d, {d = 2}, ports.d, ports) end
|
||||
if interrupted and not forcereset then return end
|
||||
|
||||
mesecon:swap_node(pos, newname)
|
||||
end
|
||||
end
|
||||
|
||||
local delayedaction = function (params)
|
||||
action(params.pos, params.ports)
|
||||
end
|
||||
|
||||
--------------------
|
||||
-- Overheat stuff --
|
||||
--------------------
|
||||
|
||||
local heat = function (meta) -- warm up
|
||||
h = meta:get_int("heat")
|
||||
if h ~= nil then
|
||||
meta:set_int("heat", h + 1)
|
||||
end
|
||||
end
|
||||
|
||||
local cool = function (meta) -- cool down after a while
|
||||
h = meta:get_int("heat")
|
||||
if h ~= nil then
|
||||
meta:set_int("heat", h - 1)
|
||||
end
|
||||
end
|
||||
|
||||
local overheat = function (meta) -- determine if too hot
|
||||
h = meta:get_int("heat")
|
||||
if h == nil then return true end -- if nil then overheat
|
||||
if h > 20 then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local overheat_off = function(pos)
|
||||
mesecon:receptor_off(pos, mesecon.rules.flat)
|
||||
end
|
||||
|
||||
-------------------
|
||||
-- Parsing stuff --
|
||||
-------------------
|
||||
|
||||
local code_prohibited = function(code)
|
||||
-- Clean code
|
||||
local prohibited = {"while", "for", "repeat", "until", "function"}
|
||||
for _, p in ipairs(prohibited) do
|
||||
if string.find(code, p) then
|
||||
return "Prohibited command: "..p
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local safeprint = function(param)
|
||||
print(dump(param))
|
||||
end
|
||||
|
||||
local interrupt = function(params)
|
||||
lc_update(params.pos, {type="interrupt", iid = params.iid})
|
||||
end
|
||||
|
||||
local getinterrupt = function(pos)
|
||||
local interrupt = function (time, iid) -- iid = interrupt id
|
||||
if type(time) ~= "number" then return end
|
||||
local iid = iid or math.random()
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local interrupts = minetest.deserialize(meta:get_string("lc_interrupts")) or {}
|
||||
table.insert (interrupts, iid)
|
||||
meta:set_string("lc_interrupts", minetest.serialize(interrupts))
|
||||
minetest.after(time, interrupt, {pos=pos, iid = iid})
|
||||
end
|
||||
return interrupt
|
||||
end
|
||||
|
||||
local getdigiline_send = function (pos)
|
||||
local digiline_send = function (channel, msg)
|
||||
if digiline then
|
||||
digiline:receptor_send(pos, digiline.rules.default, channel, msg)
|
||||
end
|
||||
end
|
||||
return digiline_send
|
||||
end
|
||||
|
||||
local create_environment = function(pos, mem, event)
|
||||
-- Gather variables for the environment
|
||||
local vports = minetest.registered_nodes[minetest.env:get_node(pos).name].virtual_portstates
|
||||
vports = {a = vports.a, b = vports.b, c = vports.c, d = vports.d}
|
||||
local rports = get_real_portstates(pos)
|
||||
|
||||
return {
|
||||
print = safeprint,
|
||||
pin = merge_portstates(vports, rports),
|
||||
port = vports,
|
||||
interrupt = getinterrupt(pos),
|
||||
digiline_send = getdigiline_send(pos),
|
||||
mem = mem,
|
||||
tostring = tostring,
|
||||
tonumber = tonumber,
|
||||
string = {
|
||||
byte = string.byte,
|
||||
char = string.char,
|
||||
find = string.find,
|
||||
format = string.format,
|
||||
gmatch = string.gmatch,
|
||||
gsub = string.gsub,
|
||||
len = string.len,
|
||||
lower = string.lower,
|
||||
match = string.match,
|
||||
rep = string.rep,
|
||||
reverse = string.reverse,
|
||||
sub = string.sub,
|
||||
},
|
||||
math = {
|
||||
abs = math.abs,
|
||||
acos = math.acos,
|
||||
asin = math.asin,
|
||||
atan = math.atan,
|
||||
atan2 = math.atan2,
|
||||
ceil = math.ceil,
|
||||
cos = math.cos,
|
||||
cosh = math.cosh,
|
||||
deg = math.deg,
|
||||
exp = math.exp,
|
||||
floor = math.floor,
|
||||
fmod = math.fmod,
|
||||
frexp = math.frexp,
|
||||
huge = math.huge,
|
||||
ldexp = math.ldexp,
|
||||
log = math.log,
|
||||
log10 = math.log10,
|
||||
max = math.max,
|
||||
min = math.min,
|
||||
modf = math.modf,
|
||||
pi = math.pi,
|
||||
pow = math.pow,
|
||||
rad = math.rad,
|
||||
random = math.random,
|
||||
sin = math.sin,
|
||||
sinh = math.sinh,
|
||||
sqrt = math.sqrt,
|
||||
tan = math.tan,
|
||||
tanh = math.tanh,
|
||||
},
|
||||
table = {
|
||||
insert = table.insert,
|
||||
maxn = table.maxn,
|
||||
remove = table.remove,
|
||||
sort = table.sort
|
||||
},
|
||||
event = event,
|
||||
}
|
||||
end
|
||||
|
||||
local create_sandbox = function (code, env)
|
||||
-- Create Sandbox
|
||||
if code:byte(1) == 27 then
|
||||
return _, "You Hacker You! Don't use binary code!"
|
||||
end
|
||||
f, msg = loadstring(code)
|
||||
if not f then return _, msg end
|
||||
setfenv(f, env)
|
||||
return f
|
||||
end
|
||||
|
||||
local do_overheat = function (pos, meta)
|
||||
-- Overheat protection
|
||||
heat(meta)
|
||||
minetest.after(0.5, cool, meta)
|
||||
if overheat(meta) then
|
||||
minetest.env:remove_node(pos)
|
||||
minetest.after(0.2, overheat_off, pos) -- wait for pending operations
|
||||
minetest.env:add_item(pos, BASENAME.."0000")
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local load_memory = function(meta)
|
||||
return minetest.deserialize(meta:get_string("lc_memory")) or {}
|
||||
end
|
||||
|
||||
local save_memory = function(meta, mem)
|
||||
meta:set_string("lc_memory", minetest.serialize(mem))
|
||||
end
|
||||
|
||||
local interrupt_allow = function (meta, event)
|
||||
if event.type ~= "interrupt" then return true end
|
||||
|
||||
local interrupts = minetest.deserialize(meta:get_string("lc_interrupts")) or {}
|
||||
for _, i in ipairs(interrupts) do
|
||||
if minetest.serialize(i) == minetest.serialize(event.iid) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
local ports_invalid = function (var)
|
||||
if type(var) == "table" then
|
||||
return false
|
||||
end
|
||||
return "The ports you set are invalid"
|
||||
end
|
||||
|
||||
----------------------
|
||||
-- Parsing function --
|
||||
----------------------
|
||||
|
||||
lc_update = function (pos, event)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
if not interrupt_allow(meta, event) then return end
|
||||
if do_overheat(pos, meta) then return end
|
||||
|
||||
-- load code & mem from memory
|
||||
local mem = load_memory(meta)
|
||||
local code = meta:get_string("code")
|
||||
|
||||
-- make sure code is ok and create environment
|
||||
local prohibited = code_prohibited(code)
|
||||
if prohibited then return prohibited end
|
||||
local env = create_environment(pos, mem, event)
|
||||
|
||||
-- create the sandbox and execute code
|
||||
local chunk, msg = create_sandbox (code, env)
|
||||
if not chunk then return msg end
|
||||
local success, msg = pcall(f)
|
||||
if not success then return msg end
|
||||
if ports_invalid(env.port) then return ports_invalid(env.port) end
|
||||
|
||||
save_memory(meta, mem)
|
||||
|
||||
-- Actually set the ports
|
||||
minetest.after(0, delayedaction, {pos = pos, ports = env.port})
|
||||
end
|
||||
|
||||
local reset_meta = function(pos, code, errmsg)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
meta:set_string("code", code)
|
||||
if minetest.formspec_escape then
|
||||
code = minetest.formspec_escape(code or "")
|
||||
errmsg = minetest.formspec_escape(errmsg or "")
|
||||
else
|
||||
code = string.gsub(code or "", "%[", "(") -- would otherwise
|
||||
code = string.gsub(code, "%]", ")") -- corrupt formspec
|
||||
errmsg = string.gsub(errmsg or "", "%[", "(") -- would otherwise
|
||||
errmsg = string.gsub(errmsg, "%]", ")") -- corrupt formspec
|
||||
end
|
||||
meta:set_string("formspec", "size[10,8]"..
|
||||
"background[-0.2,-0.25;10.4,8.75;jeija_luac_background.png]"..
|
||||
"textarea[0.2,0.6;10.2,5;code;;"..code.."]"..
|
||||
"image_button[3.75,6;2.5,1;jeija_luac_runbutton.png;program;]"..
|
||||
"image_button_exit[9.72,-0.25;0.425,0.4;jeija_close_window.png;exit;]"..
|
||||
"label[0.1,5;"..errmsg.."]")
|
||||
meta:set_int("heat", 0)
|
||||
end
|
||||
|
||||
local reset = function (pos)
|
||||
minetest.env:get_meta(pos):set_string("lc_interrupts", "")
|
||||
action(pos, {a=false, b=false, c=false, d=false}, true)
|
||||
end
|
||||
|
||||
-- ______
|
||||
-- |
|
||||
-- | | |
|
||||
-- |___| | __ ___ _ __ _ _
|
||||
-- | | | | |\ | | |_| | | | | |_ |_|
|
||||
-- | |______ |__| | \| | | \ |__| |_ |_ |_ |\
|
||||
--
|
||||
|
||||
-----------------------
|
||||
-- Node Registration --
|
||||
-----------------------
|
||||
|
||||
local output_rules={}
|
||||
local input_rules={}
|
||||
|
||||
local nodebox = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, -- bottom slab
|
||||
{ -5/16, -7/16, -5/16, 5/16, -6/16, 5/16 }, -- circuit board
|
||||
{ -3/16, -6/16, -3/16, 3/16, -5/16, 3/16 }, -- IC
|
||||
}
|
||||
}
|
||||
|
||||
local selectionbox = {
|
||||
type = "fixed",
|
||||
fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 },
|
||||
}
|
||||
|
||||
local digiline = {
|
||||
receptor = {},
|
||||
effector = {
|
||||
action = function (pos, node, channel, msg)
|
||||
lc_update (pos, {type = "digiline", channel = channel, msg = msg})
|
||||
end
|
||||
}
|
||||
}
|
||||
|
||||
for a = 0, 2 do -- 0 = off; 1 = on; 2 = ignore
|
||||
for b = 0, 2 do
|
||||
for c = 0, 2 do
|
||||
for d = 0, 2 do
|
||||
|
||||
local cid = tostring(d)..tostring(c)..tostring(b)..tostring(a)
|
||||
local nodename = BASENAME..cid
|
||||
local top = "jeija_luacontroller_top.png"
|
||||
if a == 1 then
|
||||
top = top.."^jeija_luacontroller_LED_A.png"
|
||||
end
|
||||
if b == 1 then
|
||||
top = top.."^jeija_luacontroller_LED_B.png"
|
||||
end
|
||||
if c == 1 then
|
||||
top = top.."^jeija_luacontroller_LED_C.png"
|
||||
end
|
||||
if d == 1 then
|
||||
top = top.."^jeija_luacontroller_LED_D.png"
|
||||
end
|
||||
|
||||
if a + b + c + d ~= 0 then
|
||||
groups = {dig_immediate=2, not_in_creative_inventory=1}
|
||||
else
|
||||
groups = {dig_immediate=2}
|
||||
end
|
||||
|
||||
output_rules[cid] = {}
|
||||
input_rules[cid] = {}
|
||||
if (a == 1) then table.insert(output_rules[cid], rules.a) end
|
||||
if (b == 1) then table.insert(output_rules[cid], rules.b) end
|
||||
if (c == 1) then table.insert(output_rules[cid], rules.c) end
|
||||
if (d == 1) then table.insert(output_rules[cid], rules.d) end
|
||||
|
||||
if (a == 0) then table.insert(input_rules[cid], rules.a) end
|
||||
if (b == 0) then table.insert(input_rules[cid], rules.b) end
|
||||
if (c == 0) then table.insert(input_rules[cid], rules.c) end
|
||||
if (d == 0) then table.insert(input_rules[cid], rules.d) end
|
||||
|
||||
local mesecons = {
|
||||
effector =
|
||||
{
|
||||
rules = input_rules[cid],
|
||||
action_change = function (pos, _, rulename, newstate)
|
||||
lc_update(pos, {type=newstate, pin=rulename})
|
||||
end,
|
||||
},
|
||||
receptor =
|
||||
{
|
||||
state = mesecon.state.on,
|
||||
rules = output_rules[cid]
|
||||
}
|
||||
}
|
||||
|
||||
minetest.register_node(nodename, {
|
||||
description = "Luacontroller",
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
top,
|
||||
"jeija_microcontroller_bottom.png",
|
||||
"jeija_microcontroller_sides.png",
|
||||
"jeija_microcontroller_sides.png",
|
||||
"jeija_microcontroller_sides.png",
|
||||
"jeija_microcontroller_sides.png"
|
||||
},
|
||||
|
||||
inventory_image = top,
|
||||
paramtype = "light",
|
||||
groups = groups,
|
||||
drop = BASENAME.."0000",
|
||||
sunlight_propagates = true,
|
||||
selection_box = selectionbox,
|
||||
node_box = nodebox,
|
||||
on_construct = reset_meta,
|
||||
on_receive_fields = function(pos, formname, fields)
|
||||
reset(pos)
|
||||
reset_meta(pos, fields.code)
|
||||
local err = lc_update(pos, {type="program"})
|
||||
if err then print(err) end
|
||||
reset_meta(pos, fields.code, err)
|
||||
end,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = mesecons,
|
||||
digiline = digiline,
|
||||
is_luacontroller = true,
|
||||
virtual_portstates = { a = a == 1, -- virtual portstates are
|
||||
b = b == 1, -- the ports the the
|
||||
c = c == 1, -- controller powers itself
|
||||
d = d == 1},-- so those that light up
|
||||
after_dig_node = function (pos, node)
|
||||
mesecon:receptor_off(pos, output_rules)
|
||||
end,
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
------------------------
|
||||
-- Craft Registration --
|
||||
------------------------
|
||||
|
||||
minetest.register_craft({
|
||||
output = BASENAME.."0000 2",
|
||||
recipe = {
|
||||
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
|
||||
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
|
||||
{'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''},
|
||||
}
|
||||
})
|
||||
|
@ -23,6 +23,33 @@ if tostring(d)..tostring(c)..tostring(b)..tostring(a) ~= "0000" then
|
||||
else
|
||||
groups = {dig_immediate=2, mesecon = 3}
|
||||
end
|
||||
local rules={}
|
||||
if (a == 1) then table.insert(rules, {x = -1, y = 0, z = 0}) end
|
||||
if (b == 1) then table.insert(rules, {x = 0, y = 0, z = 1}) end
|
||||
if (c == 1) then table.insert(rules, {x = 1, y = 0, z = 0}) end
|
||||
if (d == 1) then table.insert(rules, {x = 0, y = 0, z = -1}) end
|
||||
|
||||
local input_rules={}
|
||||
if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z = 0, name = "A"}) end
|
||||
if (b == 0) then table.insert(input_rules, {x = 0, y = 0, z = 1, name = "B"}) end
|
||||
if (c == 0) then table.insert(input_rules, {x = 1, y = 0, z = 0, name = "C"}) end
|
||||
if (d == 0) then table.insert(input_rules, {x = 0, y = 0, z = -1, name = "D"}) end
|
||||
mesecon:add_rules(nodename, rules)
|
||||
|
||||
local mesecons = {effector =
|
||||
{
|
||||
rules = input_rules,
|
||||
action_change = function (pos, node, rulename)
|
||||
update_yc(pos)
|
||||
end
|
||||
}}
|
||||
if nodename ~= "mesecons_microcontroller:microcontroller0000" then
|
||||
mesecons.receptor = {
|
||||
state = mesecon.state.on,
|
||||
rules = rules
|
||||
}
|
||||
end
|
||||
|
||||
minetest.register_node(nodename, {
|
||||
description = "Microcontroller",
|
||||
drawtype = "nodebox",
|
||||
@ -101,25 +128,13 @@ minetest.register_node(nodename, {
|
||||
yc_reset (pos)
|
||||
update_yc(pos)
|
||||
end,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = mesecons,
|
||||
after_dig_node = function (pos, node)
|
||||
rules = mesecon:get_rules(node.name)
|
||||
mesecon:receptor_off(pos, rules)
|
||||
end,
|
||||
})
|
||||
|
||||
local rules={}
|
||||
if (a == 1) then table.insert(rules, {x = -1, y = 0, z = 0}) end
|
||||
if (b == 1) then table.insert(rules, {x = 0, y = 0, z = 1}) end
|
||||
if (c == 1) then table.insert(rules, {x = 1, y = 0, z = 0}) end
|
||||
if (d == 1) then table.insert(rules, {x = 0, y = 0, z = -1}) end
|
||||
|
||||
local input_rules={}
|
||||
if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z = 0}) end
|
||||
if (b == 0) then table.insert(input_rules, {x = 0, y = 0, z = 1}) end
|
||||
if (c == 0) then table.insert(input_rules, {x = 1, y = 0, z = 0}) end
|
||||
if (d == 0) then table.insert(input_rules, {x = 0, y = 0, z = -1}) end
|
||||
mesecon:add_rules(nodename, rules)
|
||||
|
||||
mesecon:register_effector(nodename, nodename, input_rules)
|
||||
if nodename ~= "mesecons_microcontroller:microcontroller0000" then
|
||||
mesecon:add_receptor_node(nodename, rules)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -570,14 +585,12 @@ end
|
||||
--Real I/O functions
|
||||
function yc_action(pos, L) --L-->Lvirtual
|
||||
local Lv = yc_get_virtual_portstates(pos)
|
||||
local metatable = minetest.env:get_meta(pos):to_table()
|
||||
local name = "mesecons_microcontroller:microcontroller"
|
||||
..tonumber(L.d and 1 or 0)
|
||||
..tonumber(L.c and 1 or 0)
|
||||
..tonumber(L.b and 1 or 0)
|
||||
..tonumber(L.a and 1 or 0)
|
||||
minetest.env:add_node(pos, {name=name})
|
||||
minetest.env:get_meta(pos):from_table(metatable)
|
||||
mesecon:swap_node(pos, name)
|
||||
|
||||
yc_action_setports(pos, L, Lv)
|
||||
end
|
||||
@ -616,7 +629,7 @@ function yc_set_portstate(port, state, L)
|
||||
return L
|
||||
end
|
||||
|
||||
function yc_get_real_portstates(pos)
|
||||
function yc_get_real_portstates(pos) -- port powered or not (by itself or from outside)?
|
||||
rulesA = mesecon:get_rules("mesecons_microcontroller:microcontroller0001")
|
||||
rulesB = mesecon:get_rules("mesecons_microcontroller:microcontroller0010")
|
||||
rulesC = mesecon:get_rules("mesecons_microcontroller:microcontroller0100")
|
||||
@ -630,7 +643,7 @@ function yc_get_real_portstates(pos)
|
||||
return L
|
||||
end
|
||||
|
||||
function yc_get_virtual_portstates(pos)
|
||||
function yc_get_virtual_portstates(pos) -- portstates according to the name
|
||||
name = minetest.env:get_node(pos).name
|
||||
b, a = string.find(name, ":microcontroller")
|
||||
if a == nil then return nil end
|
||||
@ -682,16 +695,3 @@ function yc_overheat_off(pos)
|
||||
rules = mesecon:get_rules("mesecons_microcontroller:microcontroller1111")
|
||||
mesecon:receptor_off(pos, rules)
|
||||
end
|
||||
|
||||
mesecon:register_on_signal_change(function(pos, node)
|
||||
if string.find(node.name, "mesecons_microcontroller:microcontroller")~=nil then
|
||||
update_yc(pos)
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_dignode(function(pos, node)
|
||||
if string.find(node.name, "mesecons_microcontroller:microcontroller") then
|
||||
rules = mesecon:get_rules(node.name)
|
||||
mesecon:receptor_off(pos, rules)
|
||||
end
|
||||
end)
|
||||
|
@ -1,10 +1,30 @@
|
||||
-- MOVESTONE
|
||||
-- Non-sticky:
|
||||
-- Moves along mesecon lines
|
||||
-- Pushes all blocks in front of it
|
||||
--
|
||||
-- Sticky one
|
||||
-- Moves along mesecon lines
|
||||
-- Pushes all block in front of it
|
||||
-- Pull all blocks in its back
|
||||
|
||||
function mesecon:get_movestone_direction(pos)
|
||||
getactivated = 0
|
||||
local lpos
|
||||
local getactivated = 0
|
||||
local rules=mesecon:get_rules("movestone")
|
||||
local rules = {
|
||||
{x=0, y=1, z=-1},
|
||||
{x=0, y=0, z=-1},
|
||||
{x=0, y=-1, z=-1},
|
||||
{x=0, y=1, z=1},
|
||||
{x=0, y=-1, z=1},
|
||||
{x=0, y=0, z=1},
|
||||
{x=1, y=0, z=0},
|
||||
{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=-1, y=0, z=0}}
|
||||
|
||||
lpos = {x=pos.x+1, y=pos.y, z=pos.z}
|
||||
for n = 1, 3 do
|
||||
@ -41,8 +61,17 @@ minetest.register_node("mesecons_movestones:movestone", {
|
||||
legacy_facedir_simple = true,
|
||||
groups = {cracky=3},
|
||||
description="Movestone",
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
local direction=mesecon:get_movestone_direction(pos)
|
||||
if not direction then return end
|
||||
minetest.env:remove_node(pos)
|
||||
mesecon:update_autoconnect(pos)
|
||||
minetest.env:add_entity(pos, "mesecons_movestones:movestone_entity")
|
||||
end
|
||||
}}
|
||||
})
|
||||
mesecon:register_effector("mesecons_movestones:movestone", "mesecons_movestones:movestone")
|
||||
|
||||
minetest.register_entity("mesecons_movestones:movestone_entity", {
|
||||
physical = false,
|
||||
@ -50,10 +79,6 @@ minetest.register_entity("mesecons_movestones:movestone_entity", {
|
||||
textures = {"jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_arrows.png", "jeija_movestone_arrows.png"},
|
||||
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
|
||||
visual = "cube",
|
||||
--on_activate = function(self, staticdata)
|
||||
--self.object:setsprite({x=0,y=0}, 1, 0, true)
|
||||
--self.object:setvelocity({x=-3, y=0, z=0})
|
||||
--end,
|
||||
|
||||
on_punch = function(self, hitter)
|
||||
self.object:remove()
|
||||
@ -62,18 +87,28 @@ minetest.register_entity("mesecons_movestones:movestone_entity", {
|
||||
|
||||
on_step = function(self, dtime)
|
||||
local pos = self.object:getpos()
|
||||
pos.x, pos.y, pos.z = math.floor(pos.x), math.floor(pos.y), math.floor(pos.z)
|
||||
local direction = mesecon:get_movestone_direction(pos)
|
||||
|
||||
if not direction then
|
||||
local name = minetest.env:get_node(pos).name
|
||||
if name ~= "air" and name ~= "ignore" and minetest.registered_nodes[name].liquidtype == "none" then
|
||||
mesecon:mvps_push(pos, direction, MOVESTONE_MAXIMUM_PUSH)
|
||||
end
|
||||
minetest.env:add_node(pos, {name="mesecons_movestones:movestone"})
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
|
||||
self.object:setvelocity({x=direction.x*3, y=direction.y*3, z=direction.z*3})
|
||||
|
||||
mesecon:mvps_push(pos, direction)
|
||||
local np = mesecon:addPosRule(pos, direction)
|
||||
if not mesecon:mvps_push(np, direction, MOVESTONE_MAXIMUM_PUSH) then
|
||||
minetest.env:add_node(pos, {name="mesecons_movestones:movestone"})
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
|
||||
self.object:setvelocity({x=direction.x*2, y=direction.y*2, z=direction.z*2})
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -85,28 +120,6 @@ minetest.register_craft({
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:register_on_signal_on(function (pos, node)
|
||||
if node.name=="mesecons_movestones:movestone" then
|
||||
local direction=mesecon:get_movestone_direction(pos)
|
||||
if not direction then return end
|
||||
local checknode={}
|
||||
local collpos={x=pos.x, y=pos.y, z=pos.z}
|
||||
repeat -- Check if it collides with a stopper
|
||||
collpos={x=collpos.x+direction.x, y=collpos.y+direction.y, z=collpos.z+direction.z}
|
||||
checknode=minetest.env:get_node(collpos)
|
||||
if mesecon:is_mvps_stopper(checknode.name) then
|
||||
return
|
||||
end
|
||||
until checknode.name=="air"
|
||||
or checknode.name=="ignore"
|
||||
or not(minetest.registered_nodes[checknode.name].liquidtype == "none")
|
||||
minetest.env:remove_node(pos)
|
||||
nodeupdate(pos)
|
||||
minetest.env:add_entity(pos, "mesecons_movestones:movestone_entity")
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
|
||||
|
||||
-- STICKY_MOVESTONE
|
||||
@ -118,8 +131,17 @@ minetest.register_node("mesecons_movestones:sticky_movestone", {
|
||||
legacy_facedir_simple = true,
|
||||
groups = {cracky=3},
|
||||
description="Sticky Movestone",
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
local direction=mesecon:get_movestone_direction(pos)
|
||||
if not direction then return end
|
||||
minetest.env:remove_node(pos)
|
||||
mesecon:update_autoconnect(pos)
|
||||
minetest.env:add_entity(pos, "mesecons_movestones:sticky_movestone_entity")
|
||||
end
|
||||
}}
|
||||
})
|
||||
mesecon:register_effector("mesecons_movestones:sticky_movestone", "mesecons_movestones:sticky_movestone")
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_movestones:sticky_movestone" 2',
|
||||
@ -142,66 +164,29 @@ minetest.register_entity("mesecons_movestones:sticky_movestone_entity", {
|
||||
|
||||
on_step = function(self, dtime)
|
||||
local pos = self.object:getpos()
|
||||
local colp = pos
|
||||
local direction=mesecon:get_movestone_direction(colp)
|
||||
pos.x, pos.y, pos.z = math.floor(pos.x), math.floor(pos.y), math.floor(pos.z)
|
||||
local direction = mesecon:get_movestone_direction(pos)
|
||||
|
||||
if not direction then
|
||||
--or (minetest.env:get_node_or_nil(pos).name ~="air"
|
||||
--and minetest.env:get_node_or_nil(pos).name ~= nil) then
|
||||
local name = minetest.env:get_node(pos).name
|
||||
if name ~= "air" and name ~= "ignore" and minetest.registered_nodes[name].liquidtype == "none" then
|
||||
mesecon:mvps_push(pos, direction, MOVESTONE_MAXIMUM_PUSH)
|
||||
end
|
||||
minetest.env:add_node(pos, {name="mesecons_movestones:sticky_movestone"})
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
|
||||
self.object:setvelocity({x=direction.x*3, y=direction.y*3, z=direction.z*3})
|
||||
local np = mesecon:addPosRule(pos, direction)
|
||||
if not mesecon:mvps_push(np, direction, MOVESTONE_MAXIMUM_PUSH) then
|
||||
minetest.env:add_node(pos, {name="mesecons_movestones:sticky_movestone"})
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
|
||||
mesecon:mvps_push(pos, direction)
|
||||
self.object:setvelocity({x=direction.x*2, y=direction.y*2, z=direction.z*2})
|
||||
|
||||
--STICKY
|
||||
mesecon:mvps_pull_all(pos, direction)
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:register_on_signal_on(function (pos, node)
|
||||
if node.name=="mesecons_movestones:sticky_movestone" then
|
||||
local direction=mesecon:get_movestone_direction(pos)
|
||||
if not direction then return end
|
||||
local checknode={}
|
||||
local collpos={x=pos.x, y=pos.y, z=pos.z}
|
||||
repeat -- Check if it collides with a stopper
|
||||
collpos={x=collpos.x+direction.x, y=collpos.y+direction.y, z=collpos.z+direction.z}
|
||||
checknode=minetest.env:get_node(collpos)
|
||||
if mesecon:is_mvps_stopper(checknode.name) then
|
||||
return
|
||||
end
|
||||
until checknode.name=="air"
|
||||
or checknode.name=="ignore"
|
||||
or not(minetest.registered_nodes[checknode.name].liquidtype == "none")
|
||||
repeat -- Check if it collides with a stopper (pull direction)
|
||||
collpos={x=collpos.x-direction.x, y=collpos.y-direction.y, z=collpos.z-direction.z}
|
||||
checknode=minetest.env:get_node(collpos)
|
||||
if mesecon:is_mvps_stopper(checknode.name) then
|
||||
return
|
||||
end
|
||||
until checknode.name=="air"
|
||||
or checknode.name=="ignore"
|
||||
or not(minetest.registered_nodes[checknode.name].liquidtype == "none")
|
||||
minetest.env:remove_node(pos)
|
||||
nodeupdate(pos)
|
||||
minetest.env:add_entity(pos, "mesecons_movestones:sticky_movestone_entity")
|
||||
end
|
||||
end)
|
||||
|
||||
mesecon:add_rules("movestone", {
|
||||
{x=0, y=1, z=-1},
|
||||
{x=0, y=0, z=-1},
|
||||
{x=0, y=-1, z=-1},
|
||||
{x=0, y=1, z=1},
|
||||
{x=0, y=-1, z=1},
|
||||
{x=0, y=0, z=1},
|
||||
{x=1, y=0, z=0},
|
||||
{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=-1, y=0, z=0}})
|
||||
|
@ -2,44 +2,104 @@
|
||||
|
||||
mesecon.mvps_stoppers={}
|
||||
|
||||
function mesecon:is_mvps_stopper(nodename)
|
||||
local i=1
|
||||
repeat
|
||||
i=i+1
|
||||
if mesecon.mvps_stoppers[i]==nodename then return true end
|
||||
until mesecon.mvps_stoppers[i]==nil
|
||||
return false
|
||||
function mesecon:is_mvps_stopper(node, pushdir, stack, stackid)
|
||||
local get_stopper = mesecon.mvps_stoppers[node.name]
|
||||
if type (get_stopper) == "function" then
|
||||
get_stopper = get_stopper(node, pushdir, stack, stackid)
|
||||
end
|
||||
return get_stopper
|
||||
end
|
||||
|
||||
function mesecon:register_mvps_stopper(nodename)
|
||||
local i=1
|
||||
repeat
|
||||
i=i+1
|
||||
if mesecon.mvps_stoppers[i]==nil then break end
|
||||
until false
|
||||
mesecon.mvps_stoppers[i]=nodename
|
||||
function mesecon:register_mvps_stopper(nodename, get_stopper)
|
||||
if get_stopper == nil then
|
||||
get_stopper = true
|
||||
end
|
||||
mesecon.mvps_stoppers[nodename] = get_stopper
|
||||
end
|
||||
|
||||
function mesecon:mvps_push(pos, direction) -- pos: pos of mvps; direction: direction of push
|
||||
pos.x=pos.x+direction.x
|
||||
pos.y=pos.y+direction.y
|
||||
pos.z=pos.z+direction.z
|
||||
|
||||
local lpos = {x=pos.x, y=pos.y, z=pos.z}
|
||||
local lnode = minetest.env:get_node(lpos)
|
||||
local newnode
|
||||
minetest.env:remove_node(lpos)
|
||||
while not(lnode.name == "ignore" or lnode.name == "air" or not(minetest.registered_nodes[lnode.name].liquidtype == "none")) do
|
||||
lpos.x=lpos.x+direction.x
|
||||
lpos.y=lpos.y+direction.y
|
||||
lpos.z=lpos.z+direction.z
|
||||
newnode = lnode
|
||||
lnode = minetest.env:get_node(lpos)
|
||||
minetest.env:add_node(lpos, newnode)
|
||||
nodeupdate(lpos)
|
||||
function mesecon:mvps_process_stack(stack)
|
||||
-- update mesecons for placed nodes ( has to be done after all nodes have been added )
|
||||
for _, n in ipairs(stack) do
|
||||
nodeupdate(n.pos)
|
||||
mesecon.on_placenode(n.pos, minetest.env:get_node(n.pos))
|
||||
mesecon:update_autoconnect(n.pos)
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: direction of push; maximum: maximum nodes to be pushed
|
||||
np = {x = pos.x, y = pos.y, z = pos.z}
|
||||
|
||||
-- determine the number of nodes to be pushed
|
||||
local nodes = {}
|
||||
while true do
|
||||
nn = minetest.env:get_node_or_nil(np)
|
||||
if not nn or #nodes > maximum then
|
||||
-- don't push at all, something is in the way (unloaded map or too many nodes)
|
||||
return
|
||||
end
|
||||
|
||||
if nn.name == "air"
|
||||
or minetest.registered_nodes[nn.name].liquidtype ~= "none" then --is liquid
|
||||
break
|
||||
end
|
||||
|
||||
table.insert (nodes, {node = nn, pos = np})
|
||||
|
||||
np = mesecon:addPosRule(np, dir)
|
||||
end
|
||||
|
||||
-- determine if one of the nodes blocks the push
|
||||
for id, n in ipairs(nodes) do
|
||||
if mesecon:is_mvps_stopper(n.node, dir, nodes, id) then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- remove all nodes
|
||||
for _, n in ipairs(nodes) do
|
||||
n.meta = minetest.env:get_meta(n.pos):to_table()
|
||||
minetest.env:remove_node(n.pos)
|
||||
end
|
||||
|
||||
-- update mesecons for removed nodes ( has to be done after all nodes have been removed )
|
||||
for _, n in ipairs(nodes) do
|
||||
mesecon.on_dignode(n.pos, n.node)
|
||||
mesecon:update_autoconnect(n.pos)
|
||||
end
|
||||
|
||||
-- add nodes
|
||||
for _, n in ipairs(nodes) do
|
||||
np = mesecon:addPosRule(n.pos, dir)
|
||||
minetest.env:add_node(np, n.node)
|
||||
minetest.env:get_meta(np):from_table(n.meta)
|
||||
end
|
||||
|
||||
for i in ipairs(nodes) do
|
||||
nodes[i].pos = mesecon:addPosRule(nodes[i].pos, dir)
|
||||
end
|
||||
|
||||
return true, nodes
|
||||
end
|
||||
|
||||
function mesecon:mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: direction of pull (matches push direction for sticky pistons)
|
||||
np = mesecon:addPosRule(pos, dir)
|
||||
nn = minetest.env:get_node(np)
|
||||
|
||||
if minetest.registered_nodes[nn.name].liquidtype == "none"
|
||||
and not mesecon:is_mvps_stopper(nn, {x = -dir.x, y = -dir.y, z = -dir.z}, {{pos = np, node = nn}}, 1) then
|
||||
local meta = minetest.env:get_meta(np):to_table()
|
||||
minetest.env:remove_node(np)
|
||||
minetest.env:add_node(pos, nn)
|
||||
minetest.env:get_meta(pos):from_table(meta)
|
||||
|
||||
nodeupdate(np)
|
||||
nodeupdate(pos)
|
||||
mesecon.on_dignode(np, nn)
|
||||
mesecon:update_autoconnect(np)
|
||||
end
|
||||
return {{pos = np, node = {param2 = 0, name = "air"}}, {pos = pos, node = nn}}
|
||||
end
|
||||
|
||||
function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: direction of pull
|
||||
local lpos = {x=pos.x-direction.x, y=pos.y-direction.y, z=pos.z-direction.z} -- 1 away
|
||||
local lnode = minetest.env:get_node(lpos)
|
||||
@ -51,7 +111,8 @@ function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: d
|
||||
|
||||
local oldpos = {x=lpos2.x+direction.x, y=lpos2.y+direction.y, z=lpos2.z+direction.z}
|
||||
repeat
|
||||
minetest.env:add_node(oldpos, {name=minetest.env:get_node(lpos2).name})
|
||||
lnode2 = minetest.env:get_node(lpos2)
|
||||
minetest.env:add_node(oldpos, {name=lnode2.name})
|
||||
nodeupdate(oldpos)
|
||||
oldpos = {x=lpos2.x, y=lpos2.y, z=lpos2.z}
|
||||
lpos2.x = lpos2.x-direction.x
|
||||
@ -62,6 +123,5 @@ function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: d
|
||||
minetest.env:remove_node(oldpos)
|
||||
end
|
||||
|
||||
mesecon:register_mvps_stopper("default:chest")
|
||||
mesecon:register_mvps_stopper("default:chest_locked")
|
||||
mesecon:register_mvps_stopper("default:furnace")
|
||||
|
@ -1,15 +1,26 @@
|
||||
minetest.register_node("mesecons_noteblock:noteblock", {
|
||||
description = "Noteblock",
|
||||
tiles = {"mesecons_noteblock.png"},
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2},
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
|
||||
drawtype = "allfaces_optional",
|
||||
visual_scale = 1.3,
|
||||
paramtype="light",
|
||||
after_place_node = function(pos)
|
||||
minetest.env:add_node(pos, {name="mesecons_noteblock:noteblock", param2=0})
|
||||
end,
|
||||
on_punch = function (pos, node) -- change sound when punched
|
||||
local param2 = node.param2+1
|
||||
if param2==12 then param2=0 end
|
||||
minetest.env:add_node(pos, {name = node.name, param2 = param2})
|
||||
mesecon.noteblock_play(pos, param2)
|
||||
end,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
mesecons = {effector = { -- play sound when activated
|
||||
action_on = function (pos, node)
|
||||
mesecon.noteblock_play(pos, node.param2)
|
||||
end
|
||||
}}
|
||||
})
|
||||
mesecon:register_effector("mesecons_noteblock:noteblock", "mesecons_noteblock:noteblock")
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_noteblock:noteblock" 1',
|
||||
@ -20,15 +31,6 @@ minetest.register_craft({
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_on_punchnode(function (pos, node)
|
||||
if node.name=="mesecons_noteblock:noteblock" then
|
||||
local param2 = node.param2+1
|
||||
if param2==12 then param2=0 end
|
||||
minetest.env:add_node(pos, {name=node.name, param2=param2})
|
||||
mesecon.noteblock_play(pos, param2)
|
||||
end
|
||||
end)
|
||||
|
||||
mesecon.noteblock_play = function (pos, param2)
|
||||
local soundname
|
||||
if param2==8 then
|
||||
@ -75,9 +77,3 @@ mesecon.noteblock_play = function (pos, param2)
|
||||
minetest.sound_play(soundname,
|
||||
{pos = pos, gain = 1.0, max_hear_distance = 32,})
|
||||
end
|
||||
|
||||
mesecon:register_on_signal_on(function(pos, node)
|
||||
if node.name=="mesecons_noteblock:noteblock" then
|
||||
mesecon.noteblock_play(pos, node.param2)
|
||||
end
|
||||
end)
|
||||
|
@ -1,3 +1,2 @@
|
||||
mesecons
|
||||
mesecons_materials
|
||||
mesecons_mvps
|
||||
|
@ -1,63 +1,346 @@
|
||||
--PISTONS
|
||||
-- Get mesecon rules of pistons
|
||||
local piston_rules =
|
||||
{{x = 0, z = 0, y = 1}, -- everything apart from pusher side
|
||||
{x = 1, z = 0, y = 1},
|
||||
{x = 1, z = 1, y = 1},
|
||||
{x = 0, z = 1, y = 1},
|
||||
{x =-1, z = 0, y = 1},
|
||||
{x =-1, z =-1, y = 1},
|
||||
{x = 0, z =-1, y = 1},
|
||||
{x = 1, z =-1, y = 1},
|
||||
{x =-1, z = 1, y = 1},
|
||||
|
||||
minetest.register_node("mesecons_pistons:piston_normal", {
|
||||
{x = 1, z = 0, y = 0},
|
||||
{x = 1, z = 1, y = 0},
|
||||
{x = 0, z = 1, y = 0},
|
||||
{x =-1, z = 0, y = 0},
|
||||
{x =-1, z =-1, y = 0},
|
||||
--{x = 0, z =-1, y = 0}, pusher side --> disabled
|
||||
{x = 1, z =-1, y = 0},
|
||||
{x =-1, z = 1, y = 0},
|
||||
|
||||
{x = 0, z = 0, y =-1},
|
||||
{x = 1, z = 0, y =-1},
|
||||
{x = 1, z = 1, y =-1},
|
||||
{x = 0, z = 1, y =-1},
|
||||
{x =-1, z = 0, y =-1},
|
||||
{x =-1, z =-1, y =-1},
|
||||
{x = 0, z =-1, y =-1},
|
||||
{x = 1, z =-1, y =-1},
|
||||
{x =-1, z = 1, y =-1}}
|
||||
|
||||
local piston_rotate_rules = function(param2, rules)
|
||||
if param2 == 4 then
|
||||
return mesecon:rotate_rules_up(mesecon:rotate_rules_left(rules))
|
||||
end -- face up
|
||||
if param2 == 6 then
|
||||
return mesecon:rotate_rules_down(mesecon:rotate_rules_left(rules))
|
||||
end -- face up
|
||||
|
||||
rules = mesecon:rotate_rules_down(rules)
|
||||
for i = 1, param2 do
|
||||
rules = mesecon:rotate_rules_left(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
local piston_get_rules = function (node)
|
||||
return piston_rotate_rules(node.param2, piston_rules)
|
||||
end
|
||||
|
||||
piston_facedir_direction = function (node)
|
||||
local rules = piston_rotate_rules(node.param2, {{x = 0, y = 0, z =-1}})
|
||||
return rules[1]
|
||||
end
|
||||
|
||||
local piston_remove_pusher = function (pos, node)
|
||||
pistonspec = minetest.registered_nodes[node.name].mesecons_piston
|
||||
|
||||
dir = piston_facedir_direction(node)
|
||||
local pusherpos = mesecon:addPosRule(pos, dir)
|
||||
local pushername = minetest.env:get_node(pusherpos).name
|
||||
|
||||
if pushername == pistonspec.pusher then --make sure there actually is a pusher (for compatibility reasons mainly)
|
||||
minetest.env:remove_node(pusherpos)
|
||||
nodeupdate(pusherpos)
|
||||
end
|
||||
end
|
||||
|
||||
local piston_on = function (pos, node)
|
||||
local pistonspec = minetest.registered_nodes[node.name].mesecons_piston
|
||||
|
||||
dir = piston_facedir_direction(node)
|
||||
local np = mesecon:addPosRule(pos, dir)
|
||||
success, stack = mesecon:mvps_push(np, dir, PISTON_MAXIMUM_PUSH)
|
||||
if success then
|
||||
minetest.env:add_node(pos, {param2 = node.param2, name = pistonspec.onname})
|
||||
minetest.env:add_node(np, {param2 = node.param2, name = pistonspec.pusher})
|
||||
mesecon:mvps_process_stack(stack)
|
||||
end
|
||||
end
|
||||
|
||||
local piston_off = function (pos, node)
|
||||
local pistonspec = minetest.registered_nodes[node.name].mesecons_piston
|
||||
minetest.env:add_node(pos, {param2 = node.param2, name = pistonspec.offname})
|
||||
piston_remove_pusher (pos, node)
|
||||
|
||||
if pistonspec.sticky then
|
||||
dir = piston_facedir_direction(node)
|
||||
pullpos = mesecon:addPosRule(pos, dir)
|
||||
stack = mesecon:mvps_pull_single(pullpos, dir)
|
||||
mesecon:mvps_process_stack(stack)
|
||||
end
|
||||
end
|
||||
|
||||
local piston_orientate = function (pos, placer)
|
||||
-- not placed by player
|
||||
if not placer then return end
|
||||
|
||||
-- placer pitch in degrees
|
||||
local pitch = placer:get_look_pitch() * (180 / math.pi)
|
||||
|
||||
local node = minetest.env:get_node(pos)
|
||||
|
||||
if pitch > 55 then --looking upwards --> face down
|
||||
minetest.env:set_node(pos, {name = node.name, param2 = 6})
|
||||
elseif pitch < -55 then --looking downwards --> face up
|
||||
minetest.env:set_node(pos, {name = node.name, param2 = 4})
|
||||
end
|
||||
end
|
||||
|
||||
--
|
||||
--
|
||||
-- Node Registration
|
||||
--
|
||||
--
|
||||
|
||||
|
||||
local pt = 3/16 -- pusher thickness
|
||||
|
||||
local piston_pusher_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-2/16, -2/16, -.5 + pt, 2/16, 2/16, .5 + pt},
|
||||
{-.5 , -.5 , -.5 , .5 , .5 , -.5 + pt},
|
||||
}
|
||||
}
|
||||
|
||||
local piston_on_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-.5, -.5, -.5 + pt, .5, .5, .5}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-- Normal (non-sticky) ones:
|
||||
|
||||
local pistonspec_normal = {
|
||||
offname = "mesecons_pistons:piston_normal_off",
|
||||
onname = "mesecons_pistons:piston_normal_on",
|
||||
pusher = "mesecons_pistons:piston_pusher_normal",
|
||||
piston_down = "mesecons_pistons:piston_down_normal_off",
|
||||
piston_up = "mesecons_pistons:piston_up_normal_off",
|
||||
}
|
||||
|
||||
-- offstate
|
||||
minetest.register_node("mesecons_pistons:piston_normal_off", {
|
||||
description = "Piston",
|
||||
tiles = {"jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_side.png"},
|
||||
groups = {cracky=3, mesecon=2},
|
||||
tiles = {
|
||||
"mesecons_piston_top.png",
|
||||
"mesecons_piston_bottom.png",
|
||||
"mesecons_piston_left.png",
|
||||
"mesecons_piston_right.png",
|
||||
"mesecons_piston_back.png",
|
||||
"mesecons_piston_pusher_front.png"
|
||||
},
|
||||
groups = {cracky = 3},
|
||||
paramtype2 = "facedir",
|
||||
after_destruct = function(pos, oldnode)
|
||||
local dir = mesecon:piston_get_direction(oldnode)
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check
|
||||
|
||||
--ensure piston is extended
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
if checknode.name == "mesecons_pistons:piston_pusher_normal" then
|
||||
if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston
|
||||
minetest.env:remove_node(pos) --remove the pusher
|
||||
end
|
||||
end
|
||||
end,
|
||||
on_timer = function(pos, elapsed)
|
||||
if mesecon:is_powered(pos) then
|
||||
mesecon:piston_push(pos)
|
||||
else
|
||||
mesecon:piston_pull(pos)
|
||||
end
|
||||
return false
|
||||
end,
|
||||
after_place_node = piston_orientate,
|
||||
mesecons_piston = pistonspec_normal,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
mesecons = {effector={
|
||||
action_on = piston_on,
|
||||
rules = piston_get_rules
|
||||
}}
|
||||
})
|
||||
mesecon:register_effector("mesecons_pistons:piston_normal", "mesecons_pistons:piston_normal")
|
||||
|
||||
minetest.register_node("mesecons_pistons:piston_sticky", {
|
||||
-- onstate
|
||||
minetest.register_node("mesecons_pistons:piston_normal_on", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"mesecons_piston_top.png",
|
||||
"mesecons_piston_bottom.png",
|
||||
"mesecons_piston_left.png",
|
||||
"mesecons_piston_right.png",
|
||||
"mesecons_piston_back.png",
|
||||
"mesecons_piston_on_front.png"
|
||||
},
|
||||
inventory_image = "mesecons_piston_top.png",
|
||||
wield_image = "mesecons_piston_top.png",
|
||||
groups = {cracky = 3, not_in_creative_inventory = 1},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drop = "mesecons_pistons:piston_normal_off",
|
||||
after_dig_node = piston_remove_pusher,
|
||||
node_box = piston_on_box,
|
||||
selection_box = piston_on_box,
|
||||
mesecons_piston = pistonspec_normal,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
mesecons = {effector={
|
||||
action_off = piston_off,
|
||||
rules = piston_get_rules
|
||||
}}
|
||||
})
|
||||
|
||||
-- pusher
|
||||
minetest.register_node("mesecons_pistons:piston_pusher_normal", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"mesecons_piston_pusher_top.png",
|
||||
"mesecons_piston_pusher_bottom.png",
|
||||
"mesecons_piston_pusher_left.png",
|
||||
"mesecons_piston_pusher_right.png",
|
||||
"mesecons_piston_pusher_back.png",
|
||||
"mesecons_piston_pusher_front.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
diggable = false,
|
||||
corresponding_piston = "mesecons_pistons:piston_normal_on",
|
||||
selection_box = piston_pusher_box,
|
||||
node_box = piston_pusher_box,
|
||||
})
|
||||
|
||||
-- Sticky ones
|
||||
|
||||
local pistonspec_sticky = {
|
||||
offname = "mesecons_pistons:piston_sticky_off",
|
||||
onname = "mesecons_pistons:piston_sticky_on",
|
||||
pusher = "mesecons_pistons:piston_pusher_sticky",
|
||||
sticky = true,
|
||||
piston_down = "mesecons_pistons:piston_down_sticky_off",
|
||||
piston_up = "mesecons_pistons:piston_up_sticky_off",
|
||||
}
|
||||
|
||||
-- offstate
|
||||
minetest.register_node("mesecons_pistons:piston_sticky_off", {
|
||||
description = "Sticky Piston",
|
||||
tiles = {"jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_sticky_side.png"},
|
||||
groups = {cracky=3, mesecon=2},
|
||||
tiles = {
|
||||
"mesecons_piston_top.png",
|
||||
"mesecons_piston_bottom.png",
|
||||
"mesecons_piston_left.png",
|
||||
"mesecons_piston_right.png",
|
||||
"mesecons_piston_back.png",
|
||||
"mesecons_piston_pusher_front_sticky.png"
|
||||
},
|
||||
groups = {cracky = 3},
|
||||
paramtype2 = "facedir",
|
||||
after_destruct = function(pos, oldnode)
|
||||
local dir = mesecon:piston_get_direction(oldnode)
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check
|
||||
|
||||
--ensure piston is extended
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
if checknode.name == "mesecons_pistons:piston_pusher_sticky" then
|
||||
if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston
|
||||
minetest.env:remove_node(pos) --remove the pusher
|
||||
end
|
||||
end
|
||||
end,
|
||||
on_timer = function(pos, elapsed)
|
||||
if mesecon:is_powered(pos) then
|
||||
mesecon:piston_push(pos)
|
||||
else
|
||||
mesecon:piston_pull(pos)
|
||||
end
|
||||
return false
|
||||
end,
|
||||
after_place_node = piston_orientate,
|
||||
mesecons_piston = pistonspec_sticky,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
mesecons = {effector={
|
||||
action_on = piston_on,
|
||||
rules = piston_get_rules
|
||||
}}
|
||||
})
|
||||
mesecon:register_effector("mesecons_pistons:piston_sticky", "mesecons_pistons:piston_sticky")
|
||||
|
||||
-- onstate
|
||||
minetest.register_node("mesecons_pistons:piston_sticky_on", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"mesecons_piston_top.png",
|
||||
"mesecons_piston_bottom.png",
|
||||
"mesecons_piston_left.png",
|
||||
"mesecons_piston_right.png",
|
||||
"mesecons_piston_back.png",
|
||||
"mesecons_piston_on_front.png"
|
||||
},
|
||||
inventory_image = "mesecons_piston_top.png",
|
||||
wield_image = "mesecons_piston_top.png",
|
||||
groups = {cracky = 3, not_in_creative_inventory = 1},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drop = "mesecons_pistons:piston_normal_off",
|
||||
after_dig_node = piston_remove_pusher,
|
||||
node_box = piston_on_box,
|
||||
selection_box = piston_on_box,
|
||||
mesecons_piston = pistonspec_sticky,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
mesecons = {effector={
|
||||
action_off = piston_off,
|
||||
rules = piston_get_rules
|
||||
}}
|
||||
})
|
||||
|
||||
-- pusher
|
||||
minetest.register_node("mesecons_pistons:piston_pusher_sticky", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"mesecons_piston_pusher_top.png",
|
||||
"mesecons_piston_pusher_bottom.png",
|
||||
"mesecons_piston_pusher_left.png",
|
||||
"mesecons_piston_pusher_right.png",
|
||||
"mesecons_piston_pusher_back.png",
|
||||
"mesecons_piston_pusher_front_sticky.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
diggable = false,
|
||||
corresponding_piston = "mesecons_pistons:piston_sticky_on",
|
||||
selection_box = piston_pusher_box,
|
||||
node_box = piston_pusher_box,
|
||||
})
|
||||
|
||||
-- Register pushers as stoppers if they would be seperated from the piston
|
||||
local piston_pusher_get_stopper = function (node, dir, stack, stackid)
|
||||
if (stack[stackid + 1]
|
||||
and stack[stackid + 1].node.name == minetest.registered_nodes[node.name].corresponding_piston
|
||||
and stack[stackid + 1].node.param2 == node.param2)
|
||||
or (stack[stackid - 1]
|
||||
and stack[stackid - 1].node.name == minetest.registered_nodes[node.name].corresponding_piston
|
||||
and stack[stackid - 1].node.param2 == node.param2) then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
local piston_pusher_up_down_get_stopper = function (node, dir, stack, stackid)
|
||||
if (stack[stackid + 1]
|
||||
and stack[stackid + 1].node.name == minetest.registered_nodes[node.name].corresponding_piston)
|
||||
or (stack[stackid - 1]
|
||||
and stack[stackid - 1].node.name == minetest.registered_nodes[node.name].corresponding_piston) then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper)
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper)
|
||||
|
||||
local piston_get_stopper = function (node, dir, stack, stackid)
|
||||
pistonspec = minetest.registered_nodes[node.name].mesecons_piston
|
||||
dir = piston_facedir_direction(node)
|
||||
local pusherpos = mesecon:addPosRule(stack[stackid].pos, dir)
|
||||
local pushernode = minetest.env:get_node(pusherpos)
|
||||
|
||||
if minetest.registered_nodes[node.name].mesecons_piston.pusher == pushernode.name then
|
||||
for _, s in ipairs(stack) do
|
||||
if mesecon:cmpPos(s.pos, pusherpos) -- pusher is also to be pushed
|
||||
and s.node.param2 == node.param2 then
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_stopper)
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper)
|
||||
|
||||
--craft recipes
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_pistons:piston_normal" 2',
|
||||
output = 'mesecons_pistons:piston_normal_off 2',
|
||||
recipe = {
|
||||
{"default:wood", "default:wood", "default:wood"},
|
||||
{"default:cobble", "default:steel_ingot", "default:cobble"},
|
||||
@ -66,188 +349,9 @@ minetest.register_craft({
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mesecons_pistons:piston_sticky",
|
||||
output = "mesecons_pistons:piston_sticky_off",
|
||||
recipe = {
|
||||
{"mesecons_materials:glue"},
|
||||
{"mesecons_pistons:piston_normal"},
|
||||
{"mesecons_pistons:piston_normal_off"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_pistons:piston_pusher_normal", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_piston_pusher_normal.png"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
diggable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.2, -0.3, 0.2, 0.2, 0.5},
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.3},
|
||||
},
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.2, -0.3, 0.2, 0.2, 0.5},
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.3},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_pistons:piston_pusher_sticky", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_sticky.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
diggable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.2, -0.3, 0.2, 0.2, 0.5},
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.3},
|
||||
},
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.2, -0.3, 0.2, 0.2, 0.5},
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.3},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_normal")
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_pusher_sticky")
|
||||
|
||||
local update = function(pos, node)
|
||||
if node.name ~= "mesecons_pistons:piston_normal" and node.name ~= "mesecons_pistons:piston_sticky" then
|
||||
return
|
||||
end
|
||||
|
||||
local timer = minetest.env:get_node_timer(pos)
|
||||
timer:stop()
|
||||
timer:start(0)
|
||||
end
|
||||
mesecon:register_on_signal_on(update) --push action
|
||||
mesecon:register_on_signal_off(update) --pull action
|
||||
|
||||
function mesecon:piston_push(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
local dir = mesecon:piston_get_direction(node)
|
||||
pos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to first node being pushed
|
||||
|
||||
--determine the number of nodes that need to be pushed
|
||||
local count = 0
|
||||
local checkpos = {x=pos.x, y=pos.y, z=pos.z} --first node being pushed
|
||||
while true do
|
||||
local checknode = minetest.env:get_node(checkpos)
|
||||
|
||||
--check for collision with stopper or bounds
|
||||
if mesecon:is_mvps_stopper(checknode.name) or checknode.name == "ignore" then
|
||||
return
|
||||
end
|
||||
|
||||
--check for column end
|
||||
if checknode.name == "air"
|
||||
or not(minetest.registered_nodes[checknode.name].liquidtype == "none") then
|
||||
break
|
||||
end
|
||||
|
||||
--limit piston pushing capacity
|
||||
count = count + 1
|
||||
if count > 15 then
|
||||
return
|
||||
end
|
||||
|
||||
checkpos.x, checkpos.y, checkpos.z = checkpos.x + dir.x, checkpos.y + dir.y, checkpos.z + dir.z
|
||||
end
|
||||
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
|
||||
--add pusher
|
||||
if node.name == "mesecons_pistons:piston_normal" then
|
||||
minetest.env:add_node(pos, {name="mesecons_pistons:piston_pusher_normal", param2=node.param2})
|
||||
else
|
||||
minetest.env:add_node(pos, {name="mesecons_pistons:piston_pusher_sticky", param2=node.param2})
|
||||
end
|
||||
|
||||
--move nodes forward
|
||||
for i = 1, count do
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the next node
|
||||
|
||||
--check for conductor
|
||||
if mesecon:is_conductor_on(checknode.name) then
|
||||
checknode.name = mesecon:get_conductor_off(checknode.name)
|
||||
end
|
||||
|
||||
--move the node forward
|
||||
local nextnode = minetest.env:get_node(pos)
|
||||
minetest.env:add_node(pos, checknode)
|
||||
checknode = nextnode
|
||||
end
|
||||
|
||||
--update nodes
|
||||
for i = 1, count do
|
||||
mesecon:updatenode(pos)
|
||||
nodeupdate(pos)
|
||||
|
||||
pos.x, pos.y, pos.z = pos.x - dir.x, pos.y - dir.y, pos.z - dir.z --move to the previous node
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon:piston_pull(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
local dir = mesecon:piston_get_direction(node)
|
||||
pos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to first node being replaced
|
||||
|
||||
--ensure piston is extended
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
if checknode.name ~= "mesecons_pistons:piston_pusher_normal" and checknode.name ~= "mesecons_pistons:piston_pusher_sticky" then
|
||||
return
|
||||
end
|
||||
if checknode.param2 ~= node.param2 then --pusher is not facing the same direction as the piston
|
||||
return --piston is not extended
|
||||
end
|
||||
|
||||
--retract piston
|
||||
minetest.env:remove_node(pos) --remove pusher
|
||||
if node.name == "mesecons_pistons:piston_sticky" then --retract block
|
||||
local checkpos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to the node to be retracted
|
||||
checknode = minetest.env:get_node(checkpos)
|
||||
if checknode.name ~= "air"
|
||||
and checknode.name ~= "ignore"
|
||||
and minetest.registered_nodes[checknode.name].liquidtype == "none"
|
||||
and not mesecon:is_mvps_stopper(checknode.name) then
|
||||
minetest.env:add_node(pos, checknode)
|
||||
minetest.env:remove_node(checkpos)
|
||||
mesecon:updatenode(checkpos)
|
||||
nodeupdate(checkpos)
|
||||
end
|
||||
end
|
||||
mesecon:updatenode(pos)
|
||||
nodeupdate(pos)
|
||||
end
|
||||
|
||||
-- get piston direction
|
||||
function mesecon:piston_get_direction(node)
|
||||
if node.param2 == 3 then
|
||||
return {x=1, y=0, z=0}
|
||||
elseif node.param2 == 2 then
|
||||
return {x=0, y=0, z=1}
|
||||
elseif node.param2 == 1 then
|
||||
return {x=-1, y=0, z=0}
|
||||
else --node.param2 == 0
|
||||
return {x=0, y=0, z=-1}
|
||||
end
|
||||
end
|
||||
|
||||
dofile(minetest.get_modpath("mesecons_pistons").."/pistons_down.lua")
|
||||
dofile(minetest.get_modpath("mesecons_pistons").."/pistons_up.lua")
|
||||
|
@ -1,214 +0,0 @@
|
||||
--PISTONS
|
||||
--registration normal one:
|
||||
minetest.register_node("mesecons_pistons:piston_down_normal", {
|
||||
description = "Piston DOWN",
|
||||
tiles = {"jeija_piston_tb.png", "jeija_piston_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"},
|
||||
groups = {cracky=3, mesecon = 2},
|
||||
after_dig_node = function(pos, oldnode)
|
||||
local dir = {x=0, y=-1, z=0}
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check
|
||||
|
||||
--ensure piston is extended
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
if checknode.name == "mesecons_pistons:piston_down_pusher_normal" then
|
||||
if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston
|
||||
minetest.env:remove_node(pos) --remove the pusher
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:register_effector("mesecons_pistons:piston_down_normal", "mesecons_pistons:piston_down_normal")
|
||||
|
||||
--registration sticky one:
|
||||
minetest.register_node("mesecons_pistons:piston_down_sticky", {
|
||||
description = "Sticky Piston DOWN",
|
||||
tiles = {"jeija_piston_tb.png", "jeija_piston_sticky_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"},
|
||||
groups = {cracky=3, mesecon = 2},
|
||||
after_dig_node = function(pos, oldnode)
|
||||
local dir = {x=0, y=-1, z=0}
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check
|
||||
|
||||
--ensure piston is extended
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
if checknode.name == "mesecons_pistons:piston_down_pusher_sticky" then
|
||||
if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston
|
||||
minetest.env:remove_node(pos) --remove the pusher
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:register_effector("mesecons_pistons:piston_down_sticky", "mesecons_pistons:piston_down_sticky")
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mesecons_pistons:piston_down_normal",
|
||||
recipe = {
|
||||
{"mesecons_pistons:piston_up_normal"},
|
||||
}
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "mesecons_pistons:piston_normal",
|
||||
recipe = {
|
||||
{"mesecons_pistons:piston_down_normal"},
|
||||
}
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "mesecons_pistons:piston_down_sticky",
|
||||
recipe = {
|
||||
{"mesecons_pistons:piston_up_sticky"},
|
||||
}
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "mesecons_pistons:piston_sticky",
|
||||
recipe = {
|
||||
{"mesecons_pistons:piston_down_sticky"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_pistons:piston_down_pusher_normal", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_piston_pusher_normal.png"},
|
||||
paramtype = "light",
|
||||
diggable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.3, -0.2, 0.2, 0.5, 0.2},
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.3, 0.5},
|
||||
},
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.3, -0.2, 0.2, 0.5, 0.2},
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.3, 0.5},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal")
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky")
|
||||
|
||||
minetest.register_node("mesecons_pistons:piston_down_pusher_sticky", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"jeija_piston_pusher_sticky.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
diggable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.3, -0.2, 0.2, 0.5, 0.2},
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.3, 0.5},
|
||||
},
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.3, -0.2, 0.2, 0.5, 0.2},
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.3, 0.5},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
-- Push action
|
||||
mesecon:register_on_signal_on(function(pos, node)
|
||||
if node.name ~= "mesecons_pistons:piston_down_normal" and node.name ~= "mesecons_pistons:piston_down_sticky" then
|
||||
return
|
||||
end
|
||||
|
||||
local dir = {x=0, y=-1, z=0}
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node being pushed
|
||||
|
||||
--determine the number of nodes that need to be pushed
|
||||
local count = 0
|
||||
local checkpos = {x=pos.x, y=pos.y, z=pos.z} --first node being pushed
|
||||
while true do
|
||||
local checknode = minetest.env:get_node(checkpos)
|
||||
|
||||
--check for collision with stopper or bounds
|
||||
if mesecon:is_mvps_stopper(checknode.name) or checknode.name == "ignore" then
|
||||
return
|
||||
end
|
||||
|
||||
--check for column end
|
||||
if checknode.name == "air"
|
||||
or not(minetest.registered_nodes[checknode.name].liquidtype == "none") then
|
||||
break
|
||||
end
|
||||
|
||||
--limit piston pushing capacity
|
||||
count = count + 1
|
||||
if count > 15 then
|
||||
return
|
||||
end
|
||||
|
||||
checkpos.x, checkpos.y, checkpos.z = checkpos.x + dir.x, checkpos.y + dir.y, checkpos.z + dir.z
|
||||
end
|
||||
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
minetest.env:remove_node(pos) --remove the first node
|
||||
mesecon:updatenode(pos)
|
||||
|
||||
--add pusher
|
||||
if node.name == "mesecons_pistons:piston_down_normal" then
|
||||
minetest.env:add_node(pos, {name="mesecons_pistons:piston_down_pusher_normal", param2=node.param2})
|
||||
else
|
||||
minetest.env:add_node(pos, {name="mesecons_pistons:piston_down_pusher_sticky", param2=node.param2})
|
||||
end
|
||||
|
||||
--move nodes forward
|
||||
for i = 1, count do
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the next node
|
||||
|
||||
--move the node forward
|
||||
local nextnode = minetest.env:get_node(pos)
|
||||
--minetest.env:dig_node(pos)
|
||||
minetest.env:set_node(pos, checknode)
|
||||
mesecon:updatenode(pos)
|
||||
checknode = nextnode
|
||||
end
|
||||
end)
|
||||
|
||||
--Pull action
|
||||
mesecon:register_on_signal_off(function(pos, node)
|
||||
if node.name ~= "mesecons_pistons:piston_down_normal" and node.name ~= "mesecons_pistons:piston_down_sticky" then
|
||||
return
|
||||
end
|
||||
|
||||
local dir = {x=0, y=-1, z=0}
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the node to be replaced
|
||||
|
||||
--ensure piston is extended
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
if checknode.name ~= "mesecons_pistons:piston_down_pusher_normal" and checknode.name ~= "mesecons_pistons:piston_down_pusher_sticky" then
|
||||
return
|
||||
end
|
||||
if checknode.param2 ~= node.param2 then --pusher is not facing the same direction as the piston
|
||||
return --piston is not extended
|
||||
end
|
||||
|
||||
--retract piston
|
||||
minetest.env:remove_node(pos) --remove pusher
|
||||
if node.name == "mesecons_pistons:piston_down_sticky" then --retract block
|
||||
local checkpos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to the node to be retracted
|
||||
checknode = minetest.env:get_node(checkpos)
|
||||
if checknode.name ~= "air"
|
||||
and checknode.name ~= "ignore"
|
||||
and minetest.registered_nodes[checknode.name].liquidtype == "none"
|
||||
and not mesecon:is_mvps_stopper(checknode.name) then
|
||||
minetest.env:remove_node(checkpos)
|
||||
mesecon:updatenode(checkpos)
|
||||
minetest.env:set_node(pos, checknode)
|
||||
mesecon:updatenode(pos)
|
||||
end
|
||||
end
|
||||
nodeupdate(pos)
|
||||
end)
|
@ -1,202 +0,0 @@
|
||||
--PISTONS
|
||||
--registration normal one:
|
||||
minetest.register_node("mesecons_pistons:piston_up_normal", {
|
||||
description = "Piston UP",
|
||||
tiles = {"jeija_piston_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"},
|
||||
groups = {cracky=3, mesecon = 2},
|
||||
after_dig_node = function(pos, oldnode)
|
||||
local dir = {x=0, y=1, z=0}
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check
|
||||
|
||||
--ensure piston is extended
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
if checknode.name == "mesecons_pistons:piston_up_pusher_normal" then
|
||||
if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston
|
||||
minetest.env:remove_node(pos) --remove the pusher
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:register_effector("mesecons_pistons:piston_up_normal", "mesecons_pistons:piston_up_normal")
|
||||
|
||||
--registration sticky one:
|
||||
minetest.register_node("mesecons_pistons:piston_up_sticky", {
|
||||
description = "Sticky Piston UP",
|
||||
tiles = {"jeija_piston_sticky_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"},
|
||||
groups = {cracky=3, mesecon = 2},
|
||||
after_dig_node = function(pos, oldnode)
|
||||
local dir = {x=0, y=1, z=0}
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check
|
||||
|
||||
--ensure piston is extended
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
if checknode.name == "mesecons_pistons:piston_up_pusher_sticky" then
|
||||
if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston
|
||||
minetest.env:remove_node(pos) --remove the pusher
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:register_effector("mesecons_pistons:piston_up_sticky", "mesecons_pistons:piston_up_sticky")
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mesecons_pistons:piston_up_normal",
|
||||
recipe = {
|
||||
{"mesecons_pistons:piston_normal"},
|
||||
}
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "mesecons_pistons:piston_up_sticky",
|
||||
recipe = {
|
||||
{"mesecons_pistons:piston_sticky"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_pistons:piston_up_pusher_normal", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_piston_pusher_normal.png"},
|
||||
paramtype = "light",
|
||||
diggable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.5, -0.2, 0.2, 0.3, 0.2},
|
||||
{-0.5, 0.3, -0.5, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.5, -0.2, 0.2, 0.3, 0.2},
|
||||
{-0.5, 0.3, -0.5, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal")
|
||||
mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky")
|
||||
|
||||
minetest.register_node("mesecons_pistons:piston_up_pusher_sticky", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_sticky.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png",
|
||||
"jeija_piston_pusher_normal.png"
|
||||
},
|
||||
paramtype = "light",
|
||||
diggable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.5, -0.2, 0.2, 0.3, 0.2},
|
||||
{-0.5, 0.3, -0.5, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.2, -0.5, -0.2, 0.2, 0.3, 0.2},
|
||||
{-0.5, 0.3, -0.5, 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
-- Push action
|
||||
mesecon:register_on_signal_on(function(pos, node)
|
||||
if node.name ~= "mesecons_pistons:piston_up_normal" and node.name ~= "mesecons_pistons:piston_up_sticky" then
|
||||
return
|
||||
end
|
||||
|
||||
local dir = {x=0, y=1, z=0}
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node being pushed
|
||||
|
||||
--determine the number of nodes that need to be pushed
|
||||
local count = 0
|
||||
local checkpos = {x=pos.x, y=pos.y, z=pos.z} --first node being pushed
|
||||
while true do
|
||||
local checknode = minetest.env:get_node(checkpos)
|
||||
|
||||
--check for collision with stopper or bounds
|
||||
if mesecon:is_mvps_stopper(checknode.name) or checknode.name == "ignore" then
|
||||
return
|
||||
end
|
||||
|
||||
--check for column end
|
||||
if checknode.name == "air"
|
||||
or not(minetest.registered_nodes[checknode.name].liquidtype == "none") then
|
||||
break
|
||||
end
|
||||
|
||||
--limit piston pushing capacity
|
||||
count = count + 1
|
||||
if count > 15 then
|
||||
return
|
||||
end
|
||||
|
||||
checkpos.x, checkpos.y, checkpos.z = checkpos.x + dir.x, checkpos.y + dir.y, checkpos.z + dir.z
|
||||
end
|
||||
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
minetest.env:remove_node(pos) --remove the first node
|
||||
mesecon:updatenode(pos)
|
||||
|
||||
--add pusher
|
||||
if node.name == "mesecons_pistons:piston_up_normal" then
|
||||
minetest.env:add_node(pos, {name="mesecons_pistons:piston_up_pusher_normal", param2=node.param2})
|
||||
else
|
||||
minetest.env:add_node(pos, {name="mesecons_pistons:piston_up_pusher_sticky", param2=node.param2})
|
||||
end
|
||||
|
||||
--move nodes forward
|
||||
for i = 1, count do
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the next node
|
||||
|
||||
--move the node forward
|
||||
local nextnode = minetest.env:get_node(pos)
|
||||
--minetest.env:dig_node(pos)
|
||||
minetest.env:set_node(pos, checknode)
|
||||
mesecon:updatenode(pos)
|
||||
checknode = nextnode
|
||||
end
|
||||
end)
|
||||
|
||||
--Pull action
|
||||
mesecon:register_on_signal_off(function(pos, node)
|
||||
if node.name ~= "mesecons_pistons:piston_up_normal" and node.name ~= "mesecons_pistons:piston_up_sticky" then
|
||||
return
|
||||
end
|
||||
|
||||
local dir = {x=0, y=1, z=0}
|
||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the node to be replaced
|
||||
|
||||
--ensure piston is extended
|
||||
local checknode = minetest.env:get_node(pos)
|
||||
if checknode.name ~= "mesecons_pistons:piston_up_pusher_normal" and checknode.name ~= "mesecons_pistons:piston_up_pusher_sticky" then
|
||||
return
|
||||
end
|
||||
if checknode.param2 ~= node.param2 then --pusher is not facing the same direction as the piston
|
||||
return --piston is not extended
|
||||
end
|
||||
|
||||
--retract piston
|
||||
minetest.env:remove_node(pos) --remove pusher
|
||||
if node.name == "mesecons_pistons:piston_up_sticky" then --retract block
|
||||
local checkpos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to the node to be retracted
|
||||
checknode = minetest.env:get_node(checkpos)
|
||||
if checknode.name ~= "air"
|
||||
and checknode.name ~= "ignore"
|
||||
and minetest.registered_nodes[checknode.name].liquidtype == "none"
|
||||
and not mesecon:is_mvps_stopper(checknode.name) then
|
||||
minetest.env:remove_node(checkpos)
|
||||
mesecon:updatenode(checkpos)
|
||||
minetest.env:set_node(pos, checknode)
|
||||
mesecon:updatenode(pos)
|
||||
end
|
||||
end
|
||||
nodeupdate(pos)
|
||||
end)
|
@ -1,4 +1,5 @@
|
||||
-- The POWER_PLANT
|
||||
-- Just emits power. always.
|
||||
|
||||
minetest.register_node("mesecons_powerplant:power_plant", {
|
||||
drawtype = "plantlike",
|
||||
@ -14,6 +15,10 @@ minetest.register_node("mesecons_powerplant:power_plant", {
|
||||
type = "fixed",
|
||||
fixed = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
|
||||
},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.on
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -24,5 +29,3 @@ minetest.register_craft({
|
||||
{'"default:sapling"'},
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:add_receptor_node("mesecons_powerplant:power_plant")
|
||||
|
@ -1,174 +1,123 @@
|
||||
-- PRESSURE PLATE WOOD
|
||||
|
||||
minetest.register_node("mesecons_pressureplates:pressure_plate_wood_off", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_pressure_plate_wood_off.png"},
|
||||
inventory_image = "jeija_pressure_plate_wood_off.png",
|
||||
wield_image = "jeija_pressure_plate_wood_off.png",
|
||||
paramtype = "light",
|
||||
is_ground_content = true,
|
||||
walkable = true,
|
||||
selection_box = {
|
||||
local pp_box_off = {
|
||||
type = "fixed",
|
||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
||||
},
|
||||
node_box = {
|
||||
}
|
||||
|
||||
local pp_box_on = {
|
||||
type = "fixed",
|
||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
||||
},
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3, mesecon = 2},
|
||||
description="Wood Pressure Plate",
|
||||
}
|
||||
|
||||
pp_on_timer = function (pos, elapsed)
|
||||
local node = minetest.env:get_node(pos)
|
||||
local ppspec = minetest.registered_nodes[node.name].pressureplate
|
||||
|
||||
-- This is a workaround for a strange bug that occurs when the server is started
|
||||
-- For some reason the first time on_timer is called, the pos is wrong
|
||||
if not ppspec then return end
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
local objs = minetest.env:get_objects_inside_radius(pos, 1)
|
||||
local two_below = mesecon:addPosRule(pos, {x = 0, y = -2, z = 0})
|
||||
|
||||
if objs[1] == nil and node.name == ppspec.onstate then
|
||||
minetest.env:add_node(pos, {name = ppspec.offstate})
|
||||
mesecon:receptor_off(pos)
|
||||
-- force deactivation of mesecon two blocks below (hacky)
|
||||
if not mesecon:connected_to_receptor(two_below) then
|
||||
mesecon:turnoff(two_below)
|
||||
end
|
||||
else
|
||||
for k, obj in pairs(objs) do
|
||||
local objpos = obj:getpos()
|
||||
if objpos.y > pos.y-1 and objpos.y < pos.y then
|
||||
minetest.env:add_node(pos, {name="mesecons_pressureplates:pressure_plate_wood_on"})
|
||||
mesecon:receptor_on(pos, mesecon:get_rules("pressureplate"))
|
||||
minetest.env:add_node(pos, {name=ppspec.onstate})
|
||||
mesecon:receptor_on(pos)
|
||||
-- force activation of mesecon two blocks below (hacky)
|
||||
mesecon:turnon(two_below)
|
||||
end
|
||||
end
|
||||
end
|
||||
return true
|
||||
end,
|
||||
end
|
||||
|
||||
-- Register a Pressure Plate
|
||||
-- offstate: name of the pressure plate when inactive
|
||||
-- onstate: name of the pressure plate when active
|
||||
-- description: description displayed in the player's inventory
|
||||
-- tiles_off: textures of the pressure plate when inactive
|
||||
-- tiles_on: textures of the pressure plate when active
|
||||
-- image: inventory and wield image of the pressure plate
|
||||
-- recipe: crafting recipe of the pressure plate
|
||||
|
||||
function mesecon:register_pressure_plate(offstate, onstate, description, texture_off, texture_on, recipe)
|
||||
local ppspec = {
|
||||
offstate = offstate,
|
||||
onstate = onstate
|
||||
}
|
||||
|
||||
minetest.register_node(offstate, {
|
||||
drawtype = "nodebox",
|
||||
tiles = {texture_off},
|
||||
inventory_image = texture_off,
|
||||
wield_image = image,
|
||||
paramtype = "light",
|
||||
selection_box = pp_box_off,
|
||||
node_box = pp_box_off,
|
||||
groups = {snappy = 2, oddly_breakable_by_hand = 3},
|
||||
description = description,
|
||||
pressureplate = ppspec,
|
||||
on_timer = pp_on_timer,
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off
|
||||
}},
|
||||
on_construct = function(pos)
|
||||
minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_pressureplates:pressure_plate_wood_on", {
|
||||
minetest.register_node(onstate, {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_pressure_plate_wood_on.png"},
|
||||
tiles = {texture_on},
|
||||
paramtype = "light",
|
||||
is_ground_content = true,
|
||||
walkable = true,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = { -7/16, -8/16, -7/16, 7/16, -31/64, 7/16 },
|
||||
},
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1, mesecon = 2},
|
||||
drop='"mesecons_pressureplates:pressure_plate_wood_off" 1',
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
local objs = minetest.env:get_objects_inside_radius(pos, 1)
|
||||
if objs[1]==nil then
|
||||
minetest.env:add_node(pos, {name="mesecons_pressureplates:pressure_plate_wood_off"})
|
||||
mesecon:receptor_off(pos, mesecon:get_rules("pressureplate"))
|
||||
end
|
||||
return true
|
||||
end,
|
||||
|
||||
selection_box = pp_box_on,
|
||||
node_box = pp_box_on,
|
||||
groups = {snappy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1},
|
||||
drop = offstate,
|
||||
pressureplate = ppspec,
|
||||
on_timer = pp_on_timer,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.on
|
||||
}},
|
||||
on_construct = function(pos)
|
||||
minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
|
||||
end,
|
||||
after_dig_node = function(pos)
|
||||
local two_below = mesecon:addPosRule(pos, {x = 0, y = -2, z = 0})
|
||||
if not mesecon:connected_to_receptor(two_below) then
|
||||
mesecon:turnoff(two_below)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_pressureplates:pressure_plate_wood_off" 1',
|
||||
recipe = {
|
||||
{'"default:wood"', '"default:wood"'},
|
||||
}
|
||||
output = offstate,
|
||||
recipe = recipe,
|
||||
})
|
||||
|
||||
-- PRESSURE PLATE STONE
|
||||
|
||||
minetest.register_node("mesecons_pressureplates:pressure_plate_stone_off", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_pressure_plate_stone_off.png"},
|
||||
inventory_image = "jeija_pressure_plate_stone_off.png",
|
||||
wield_image = "jeija_pressure_plate_stone_off.png",
|
||||
paramtype = "light",
|
||||
is_ground_content = true,
|
||||
walkable = true,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
||||
},
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3, mesecon = 2},
|
||||
description="Stone Pressure Plate",
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
local objs = minetest.env:get_objects_inside_radius(pos, 1)
|
||||
for k, obj in pairs(objs) do
|
||||
local objpos=obj:getpos()
|
||||
if objpos.y>pos.y-1 and objpos.y<pos.y then
|
||||
minetest.env:add_node(pos, {name="mesecons_pressureplates:pressure_plate_stone_on"})
|
||||
mesecon:receptor_on(pos, mesecon:get_rules("pressureplate"))
|
||||
end
|
||||
end
|
||||
return true
|
||||
end,
|
||||
|
||||
on_construct = function(pos)
|
||||
minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
|
||||
end,
|
||||
})
|
||||
mesecon:register_pressure_plate(
|
||||
"mesecons_pressureplates:pressure_plate_wood_off",
|
||||
"mesecons_pressureplates:pressure_plate_wood_on",
|
||||
"Wooden Pressure Plate",
|
||||
"jeija_pressure_plate_wood_off.png",
|
||||
"jeija_pressure_plate_wood_on.png",
|
||||
{{"default:wood", "default:wood"}})
|
||||
|
||||
minetest.register_node("mesecons_pressureplates:pressure_plate_stone_on", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {"jeija_pressure_plate_stone_on.png"},
|
||||
paramtype = "light",
|
||||
is_ground_content = true,
|
||||
walkable = true,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = { -7/16, -8/16, -7/16, 7/16, -31/64, 7/16 },
|
||||
},
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1, mesecon = 2},
|
||||
drop='"mesecons_pressureplates:pressure_plate_stone_off" 1',
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
local objs = minetest.env:get_objects_inside_radius(pos, 1)
|
||||
if objs[1]==nil then
|
||||
minetest.env:add_node(pos, {name="mesecons_pressureplates:pressure_plate_stone_off"})
|
||||
mesecon:receptor_off(pos, mesecon:get_rules("pressureplate"))
|
||||
end
|
||||
return true
|
||||
end,
|
||||
|
||||
on_construct = function(pos)
|
||||
minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_pressureplates:pressure_plate_stone_off" 1',
|
||||
recipe = {
|
||||
{'"default:cobble"', '"default:cobble"'},
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:add_rules("pressureplate",
|
||||
{{x=0, y=1, z=-1},
|
||||
{x=0, y=0, z=-1},
|
||||
{x=0, y=-1, z=-1},
|
||||
{x=0, y=1, z=1},
|
||||
{x=0, y=-1, z=1},
|
||||
{x=0, y=0, z=1},
|
||||
{x=1, y=0, z=0},
|
||||
{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=-1, y=0, z=0},
|
||||
{x=0, y=-1, z=0},
|
||||
{x=0, y=-2, z=0},
|
||||
{x=0, y=1, z=0}})
|
||||
|
||||
mesecon:add_receptor_node("mesecons_pressureplates:pressure_plate_wood_on", mesecon:get_rules("pressureplate"))
|
||||
mesecon:add_receptor_node_off("mesecons_pressureplates:pressure_plate_wood_off", mesecon:get_rules("pressureplate"))
|
||||
|
||||
mesecon:add_receptor_node("mesecons_pressureplates:pressure_plate_stone_on", mesecon:get_rules("pressureplate"))
|
||||
mesecon:add_receptor_node_off("mesecons_pressureplates:pressure_plate_stone_off", mesecon:get_rules("pressureplate"))
|
||||
mesecon:register_pressure_plate(
|
||||
"mesecons_pressureplates:pressure_plate_stone_off",
|
||||
"mesecons_pressureplates:pressure_plate_stone_on",
|
||||
"Stone Pressure Plate",
|
||||
"jeija_pressure_plate_stone_off.png",
|
||||
"jeija_pressure_plate_stone_on.png",
|
||||
{{"default:cobble", "default:cobble"}})
|
||||
|
@ -3,12 +3,17 @@
|
||||
minetest.register_node("mesecons_random:removestone", {
|
||||
tiles = {"jeija_removestone.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_removestone_inv.png"),
|
||||
groups = {cracky=3, mesecon=2},
|
||||
groups = {cracky=3},
|
||||
description="Removestone",
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_on = function (pos, node)
|
||||
minetest.env:remove_node(pos)
|
||||
mesecon:update_autoconnect(pos)
|
||||
end
|
||||
}}
|
||||
})
|
||||
|
||||
mesecon:register_effector(nil, "mesecons_random:removestone")
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'mesecons_random:removestone 4',
|
||||
recipe = {
|
||||
@ -18,12 +23,6 @@ minetest.register_craft({
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:register_on_signal_on(function(pos, node)
|
||||
if node.name == "mesecons_random:removestone" then
|
||||
minetest.env:remove_node(pos)
|
||||
end
|
||||
end)
|
||||
|
||||
-- GHOSTSTONE
|
||||
|
||||
minetest.register_node("mesecons_random:ghoststone", {
|
||||
@ -31,8 +30,20 @@ minetest.register_node("mesecons_random:ghoststone", {
|
||||
tiles = {"jeija_ghoststone.png"},
|
||||
is_ground_content = true,
|
||||
inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"),
|
||||
groups = {cracky=3, mesecon=2},
|
||||
groups = {cracky=3},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
rules = { --axes
|
||||
{x = -1, y = 0, z = 0},
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x = 0, y = -1, z = 0},
|
||||
{x = 0, y = 1, z = 0},
|
||||
{x = 0, y = 0, z = -1},
|
||||
{x = 0, y = 0, z = 1},
|
||||
},
|
||||
onstate = "mesecons_random:ghoststone_active"
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_random:ghoststone_active", {
|
||||
@ -41,10 +52,28 @@ minetest.register_node("mesecons_random:ghoststone_active", {
|
||||
walkable = false,
|
||||
diggable = false,
|
||||
sunlight_propagates = true,
|
||||
groups = {mesecon=2},
|
||||
paramtype = "light",
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
rules = {
|
||||
{x = -1, y = 0, z = 0},
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x = 0, y = -1, z = 0},
|
||||
{x = 0, y = 1, z = 0},
|
||||
{x = 0, y = 0, z = -1},
|
||||
{x = 0, y = 0, z = 1},
|
||||
},
|
||||
offstate = "mesecons_random:ghoststone"
|
||||
}},
|
||||
on_construct = function(pos)
|
||||
--remove shadow
|
||||
pos2 = {x = pos.x, y = pos.y + 1, z = pos.z}
|
||||
if ( minetest.env:get_node(pos2).name == "air" ) then
|
||||
minetest.env:dig_node(pos2)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
mesecon:register_effector("mesecons_random:ghoststone_active", "mesecons_random:ghoststone")
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'mesecons_random:ghoststone 4',
|
||||
@ -54,17 +83,3 @@ minetest.register_craft({
|
||||
{"default:steel_ingot", "default:cobble", "default:steel_ingot"},
|
||||
}
|
||||
})
|
||||
|
||||
mesecon:register_on_signal_on(function(pos, node)
|
||||
if node.name == "mesecons_random:ghoststone" then
|
||||
minetest.env:add_node(pos, {name="mesecons_random:ghoststone_active"})
|
||||
nodeupdate(pos)
|
||||
end
|
||||
end)
|
||||
|
||||
mesecon:register_on_signal_off(function(pos, node)
|
||||
if node.name == "mesecons_random:ghoststone_active" then
|
||||
minetest.env:add_node(pos, {name="mesecons_random:ghoststone"})
|
||||
nodeupdate(pos)
|
||||
end
|
||||
end)
|
@ -1,10 +1,23 @@
|
||||
rcvboxes = {
|
||||
{ -3/16, -3/16 , -8/16 , 3/16, 3/16, -13/32 }, -- the smaller bump
|
||||
{ -5/32, -5/32 , -13/32 , 5/32, 5/32, -12/32 }, -- the receiver itself
|
||||
{ -3/32, -.5-1/32, -.5 , 3/32, 0 , -.5002+3/32 }, -- the vertical wire bit
|
||||
{ -3/32, -17/32 , -7/16+0.002 , 3/32, -13/32, 16/32+0.001 } -- the horizontal wire
|
||||
{ -1/32, -1/32 , -3/2 , 1/32, 1/32, -1/2 }, -- the wire through the block
|
||||
{ -2/32, -.5-1/32, -.5 , 2/32, 0 , -.5002+3/32 }, -- the vertical wire bit
|
||||
{ -2/32, -17/32 , -7/16+0.002 , 2/32, -14/32, 16/32+0.001 } -- the horizontal wire
|
||||
}
|
||||
|
||||
local receiver_get_rules = function (node)
|
||||
local rules = { {x = 1, y = 0, z = 0},
|
||||
{x = -2, y = 0, z = 0}}
|
||||
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
|
||||
|
||||
minetest.register_node("mesecons_receiver:receiver_on", {
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
@ -18,6 +31,7 @@ minetest.register_node("mesecons_receiver:receiver_on", {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 }
|
||||
@ -26,9 +40,13 @@ minetest.register_node("mesecons_receiver:receiver_on", {
|
||||
type = "fixed",
|
||||
fixed = rcvboxes
|
||||
},
|
||||
groups = {dig_immediate = 3, mesecon = 3, not_in_creative_inventory = 1},
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
drop = "mesecons:wire_00000000_off",
|
||||
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
rules = receiver_get_rules,
|
||||
offstate = "mesecons_receiver:receiver_off"
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_receiver:receiver_off", {
|
||||
@ -45,6 +63,7 @@ minetest.register_node("mesecons_receiver:receiver_off", {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 }
|
||||
@ -53,8 +72,13 @@ minetest.register_node("mesecons_receiver:receiver_off", {
|
||||
type = "fixed",
|
||||
fixed = rcvboxes
|
||||
},
|
||||
groups = {dig_immediate = 3, mesecon = 3, not_in_creative_inventory = 1},
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
drop = "mesecons:wire_00000000_off",
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
rules = receiver_get_rules,
|
||||
onstate = "mesecons_receiver:receiver_on"
|
||||
}}
|
||||
})
|
||||
|
||||
mesecon:add_rules("receiver_pos", {{x = 2, y = 0, z = 0}})
|
||||
@ -65,34 +89,6 @@ mesecon:add_rules("receiver_pos_all", {
|
||||
{x = 0, y = 0, z = 2},
|
||||
{x = 0, y = 0, z =-2}})
|
||||
|
||||
mesecon:add_rules("mesecon_receiver", {
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x = -2, y = 0, z = 0},})
|
||||
|
||||
mesecon:add_rules("mesecon_receiver_all", {
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x =-2, y = 0, z = 0},
|
||||
{x =-1, y = 0, z = 0},
|
||||
{x = 2, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = 1},
|
||||
{x = 0, y = 0, z =-2},
|
||||
{x = 1, y = 0, z =-1},
|
||||
{x =-2, y = 0, z = 2},})
|
||||
|
||||
function receiver_get_rules(param2)
|
||||
local rules = mesecon:get_rules("mesecon_receiver")
|
||||
if param2 == 2 then
|
||||
rules = mesecon:rotate_rules_left(rules)
|
||||
elseif param2 == 3 then
|
||||
rules = mesecon:rotate_rules_right(mesecon:rotate_rules_right(rules))
|
||||
elseif param2 == 0 then
|
||||
rules = mesecon:rotate_rules_right(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
mesecon:register_conductor("mesecons_receiver:receiver_on", "mesecons_receiver:receiver_off", mesecon:get_rules("mesecon_receiver_all"), receiver_get_rules)
|
||||
|
||||
function mesecon:receiver_get_pos_from_rcpt(pos, param2)
|
||||
local rules = mesecon:get_rules("receiver_pos")
|
||||
if param2 == nil then param2 = minetest.env:get_node(pos).param2 end
|
||||
@ -119,7 +115,7 @@ function mesecon:receiver_place(rcpt_pos)
|
||||
minetest.env:dig_node(pos)
|
||||
if mesecon:is_power_on(rcpt_pos) then
|
||||
minetest.env:add_node(pos, {name = "mesecons_receiver:receiver_on", param2 = node.param2})
|
||||
mesecon:receptor_on(pos, receiver_get_rules(node.param2))
|
||||
mesecon:receptor_on(pos, receiver_get_rules(node))
|
||||
else
|
||||
minetest.env:add_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2})
|
||||
end
|
||||
@ -132,8 +128,10 @@ function mesecon:receiver_remove(rcpt_pos, dugnode)
|
||||
local nn = minetest.env:get_node(pos)
|
||||
if string.find(nn.name, "mesecons_receiver:receiver_") ~=nil then
|
||||
minetest.env:dig_node(pos)
|
||||
minetest.env:place_node(pos, {name = "mesecons:wire_00000000_off"})
|
||||
local node = {name = "mesecons:wire_00000000_off"}
|
||||
minetest.env:add_node(pos, node)
|
||||
mesecon:update_autoconnect(pos)
|
||||
mesecon.on_placenode(pos, node)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -21,8 +21,11 @@ minetest.register_node("mesecons_solarpanel:solar_panel_on", {
|
||||
wall_side = { -8/16, -7/16, -7/16, -7/16, 7/16, 7/16 },
|
||||
},
|
||||
drop = "mesecons_solarpanel:solar_panel_off",
|
||||
groups = {dig_immediate=3, mesecon = 2, not_in_creative_inventory = 1},
|
||||
description="Solar Panel",
|
||||
groups = {dig_immediate=3, not_in_creative_inventory = 1},
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.on
|
||||
}}
|
||||
})
|
||||
|
||||
-- Solar Panel
|
||||
@ -47,8 +50,12 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", {
|
||||
wall_top = { -7/16, 7/16, -7/16, 7/16, 8/16, 7/16 },
|
||||
wall_side = { -8/16, -7/16, -7/16, -7/16, 7/16, 7/16 },
|
||||
},
|
||||
groups = {dig_immediate=3, mesecon = 2},
|
||||
groups = {dig_immediate=3},
|
||||
description="Solar Panel",
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off
|
||||
}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -86,6 +93,3 @@ minetest.register_abm(
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon:add_receptor_node("mesecons_solarpanel:solar_panel_on")
|
||||
mesecon:add_receptor_node_off("mesecons_solarpanel:solar_panel_off")
|
||||
|
@ -3,32 +3,34 @@
|
||||
minetest.register_node("mesecons_switch:mesecon_switch_off", {
|
||||
tiles = {"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_off.png"},
|
||||
paramtype2="facedir",
|
||||
groups = {dig_immediate=2, mesecon = 2},
|
||||
groups = {dig_immediate=2},
|
||||
description="Switch",
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off
|
||||
}},
|
||||
on_punch = function(pos, node)
|
||||
mesecon:swap_node(pos, "mesecons_switch:mesecon_switch_on")
|
||||
mesecon:receptor_on(pos)
|
||||
minetest.sound_play("mesecons_switch", {pos=pos})
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_switch:mesecon_switch_on", {
|
||||
tiles = {"jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_on.png"},
|
||||
paramtype2="facedir",
|
||||
groups = {dig_immediate=2,not_in_creative_inventory=1, mesecon = 2},
|
||||
groups = {dig_immediate=2,not_in_creative_inventory=1},
|
||||
drop='"mesecons_switch:mesecon_switch_off" 1',
|
||||
description="Switch",
|
||||
})
|
||||
|
||||
mesecon:register_receptor("mesecons_switch:mesecon_switch_on", "mesecons_switch:mesecon_switch_off")
|
||||
|
||||
minetest.register_on_punchnode(function(pos, node, puncher)
|
||||
if node.name == "mesecons_switch:mesecon_switch_on" then
|
||||
minetest.env:add_node(pos, {name="mesecons_switch:mesecon_switch_off", param2=node.param2})
|
||||
nodeupdate(pos)
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.on
|
||||
}},
|
||||
on_punch = function(pos, node)
|
||||
mesecon:swap_node(pos, "mesecons_switch:mesecon_switch_off")
|
||||
mesecon:receptor_off(pos)
|
||||
minetest.sound_play("mesecons_switch", {pos=pos})
|
||||
end
|
||||
if node.name == "mesecons_switch:mesecon_switch_off" then
|
||||
minetest.env:add_node(pos, {name="mesecons_switch:mesecon_switch_on", param2=node.param2})
|
||||
nodeupdate(pos)
|
||||
mesecon:receptor_on(pos)
|
||||
end
|
||||
end)
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = '"mesecons_switch:mesecon_switch_off" 2',
|
||||
|
BIN
mesecons_switch/sounds/mesecons_switch.ogg
Normal file
BIN
mesecons_textures/textures/jeija_close_window.png
Normal file
After Width: | Height: | Size: 323 B |
Before Width: | Height: | Size: 462 B |
After Width: | Height: | Size: 253 B |
BIN
mesecons_textures/textures/jeija_insulated_wire_curved_tb_on.png
Normal file
After Width: | Height: | Size: 196 B |
Before Width: | Height: | Size: 172 B After Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 172 B After Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 200 B After Width: | Height: | Size: 200 B |
BIN
mesecons_textures/textures/jeija_insulated_wire_sides_on.png
Normal file
After Width: | Height: | Size: 169 B |
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 207 B |
BIN
mesecons_textures/textures/jeija_luac_background.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
mesecons_textures/textures/jeija_luac_runbutton.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
mesecons_textures/textures/jeija_luacontroller_LED_A.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
mesecons_textures/textures/jeija_luacontroller_LED_B.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
mesecons_textures/textures/jeija_luacontroller_LED_C.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
mesecons_textures/textures/jeija_luacontroller_LED_D.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
mesecons_textures/textures/jeija_luacontroller_top.png
Normal file
After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 793 B |
Before Width: | Height: | Size: 782 B |
Before Width: | Height: | Size: 793 B |
Before Width: | Height: | Size: 782 B |
Before Width: | Height: | Size: 778 B |
Before Width: | Height: | Size: 635 B |
Before Width: | Height: | Size: 715 B |
Before Width: | Height: | Size: 678 B |
Before Width: | Height: | Size: 579 B |
Before Width: | Height: | Size: 620 B |
Before Width: | Height: | Size: 678 B |
Before Width: | Height: | Size: 678 B |
Before Width: | Height: | Size: 590 B |
Before Width: | Height: | Size: 621 B |
Before Width: | Height: | Size: 678 B |
BIN
mesecons_textures/textures/mesecons_piston_back.png
Normal file
After Width: | Height: | Size: 763 B |
BIN
mesecons_textures/textures/mesecons_piston_bottom.png
Normal file
After Width: | Height: | Size: 791 B |
BIN
mesecons_textures/textures/mesecons_piston_left.png
Normal file
After Width: | Height: | Size: 790 B |
BIN
mesecons_textures/textures/mesecons_piston_on_front.png
Normal file
After Width: | Height: | Size: 759 B |
BIN
mesecons_textures/textures/mesecons_piston_pusher_back.png
Normal file
After Width: | Height: | Size: 781 B |
BIN
mesecons_textures/textures/mesecons_piston_pusher_bottom.png
Normal file
After Width: | Height: | Size: 762 B |
BIN
mesecons_textures/textures/mesecons_piston_pusher_front.png
Normal file
After Width: | Height: | Size: 759 B |
After Width: | Height: | Size: 738 B |
BIN
mesecons_textures/textures/mesecons_piston_pusher_left.png
Normal file
After Width: | Height: | Size: 790 B |
BIN
mesecons_textures/textures/mesecons_piston_pusher_right.png
Normal file
After Width: | Height: | Size: 802 B |
BIN
mesecons_textures/textures/mesecons_piston_pusher_top.png
Normal file
After Width: | Height: | Size: 787 B |
BIN
mesecons_textures/textures/mesecons_piston_right.png
Normal file
After Width: | Height: | Size: 786 B |
BIN
mesecons_textures/textures/mesecons_piston_top.png
Normal file
After Width: | Height: | Size: 790 B |
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 494 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 239 B |
Before Width: | Height: | Size: 374 B After Width: | Height: | Size: 494 B |
Before Width: | Height: | Size: 517 B After Width: | Height: | Size: 239 B |