Compare commits
168 Commits
v0.6-stabl
...
dispenser
Author | SHA1 | Date | |
---|---|---|---|
1711cbcbd8 | |||
6efe579f68 | |||
fa0cf15cd9 | |||
8be0d0e1d9 | |||
f9ce95154e | |||
24160d45ff | |||
682cf34792 | |||
6f83f4cf1e | |||
255e363b04 | |||
ac9a05df0b | |||
cc20b9ba47 | |||
163384f308 | |||
d4f18d08c0 | |||
9299111900 | |||
13757ac854 | |||
0a9bcf26ca | |||
b3fb406727 | |||
b0bef909a0 | |||
fc5245139d | |||
109d817df6 | |||
1a5b1b4691 | |||
10bacdd7f4 | |||
8afc6abcd5 | |||
e88e99b54f | |||
01d8c26b5b | |||
3b1afb1783 | |||
6cfd12e63c | |||
c08e868be2 | |||
f1a327ad16 | |||
e45a2a511e | |||
63a18f1a51 | |||
57e1547515 | |||
3b38bbcaf2 | |||
e789794c75 | |||
2cc38909a1 | |||
36bcce57b0 | |||
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 |
24
README
@ -1,24 +0,0 @@
|
|||||||
-- |\ /| ____ ____ ____ _____ ____ _____
|
|
||||||
-- | \ / | | | | | | | |\ | |
|
|
||||||
-- | \/ | |___ ____ |___ | | | | \ | |____
|
|
||||||
-- | | | | | | | | | \ | |
|
|
||||||
-- | | |___ ____| |___ |____ |____| | \| ____|
|
|
||||||
-- by Jeija and contributors
|
|
||||||
|
|
||||||
Credits:
|
|
||||||
Jeija: main developer
|
|
||||||
VanessaE: Awesome textures & design, coding
|
|
||||||
sfan5: coding, textures
|
|
||||||
temperest: coding, textures
|
|
||||||
Jordach: Sounds for the noteblock
|
|
||||||
minerd247: Some textures
|
|
||||||
...other contributors
|
|
||||||
|
|
||||||
This is a mod for minetest-c55.
|
|
||||||
Copy the minetest-mod-mesecons directory into you game's mod folder
|
|
||||||
(e.g. games/minetest_game/mods/minetest-mod-mesecons)
|
|
||||||
|
|
||||||
You can remove modules of this mod by deleting the mesecons_*
|
|
||||||
folders in the minetest-mod-mesecons directory.
|
|
||||||
|
|
||||||
Mod dependencies: none
|
|
76
README.md
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
########################################################################
|
||||||
|
## __ __ _____ _____ _____ _____ _____ _ _ _____ ##
|
||||||
|
## | \ / | | ___| | ___| | ___| | ___| | _ | | \ | | | ___| ##
|
||||||
|
## | \/ | | |___ | |___ | |___ | | | | | | | \| | | |___ ##
|
||||||
|
## | |\__/| | | ___| |___ | | ___| | | | | | | | | |___ | ##
|
||||||
|
## | | | | | |___ ___| | | |___ | |___ | |_| | | |\ | ___| | ##
|
||||||
|
## |_| |_| |_____| |_____| |_____| |_____| |_____| |_| \_| |_____| ##
|
||||||
|
## ##
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
MESECONS by Jeija and contributors
|
||||||
|
|
||||||
|
Mezzee-what?
|
||||||
|
------------
|
||||||
|
[Mesecons](http://mesecons.net/)! They're yellow, they're conductive, and they'll add a whole new dimension to Minetest's gameplay.
|
||||||
|
|
||||||
|
Mesecons is a mod for [Minetest](http://minetest.net/) that implements a ton of items related to digital circuitry, such as wires, buttons, lights, and even programmable controllers. Among other things, there are also pistons, solar panels, pressure plates, and note blocks.
|
||||||
|
|
||||||
|
Mesecons has a similar goal to Redstone in Minecraft, but works in its own way, with different rules and mechanics.
|
||||||
|
|
||||||
|
OK, I want in.
|
||||||
|
--------------
|
||||||
|
Go get it!
|
||||||
|
|
||||||
|
[DOWNLOADS PAGE](http://mesecons.net/downloads.php)
|
||||||
|
|
||||||
|
Now go ahead and install it like any other Minetest mod. Don't know how? Check out [the wonderful page about it](http://wiki.minetest.com/wiki/Mods) over at the Minetest Wiki. For your convenience, here's a quick summary:
|
||||||
|
|
||||||
|
1. If Mesecons is still in a ZIP file, extract the folder inside to somewhere on the computer.
|
||||||
|
2. Make sure that when you open the folder, you can directly find `README.md` in the listing. If you just see another folder, move that folder up one level and delete the old one.
|
||||||
|
3. Open up the Minetest mods folder - usually `/mods/`. If you see the `minetest` or folder inside of that, that is your mod folder instead.
|
||||||
|
4. Copy the Mesecons folder into the mods folder.
|
||||||
|
|
||||||
|
Don't like some parts of Mesecons? Open up the Mesecons folder and delete the subfolder containing the mod you don't want. If you didn't want movestones, for example, all you have to do is delete the `mesecons_movestones` folder and they will no longer be available.
|
||||||
|
|
||||||
|
There are no dependencies - it will work right after installing!
|
||||||
|
|
||||||
|
How do I use this thing?
|
||||||
|
------------------------
|
||||||
|
How about a [quick overview video](https://www.youtube.com/watch?v=6kmeQj6iW5k)?
|
||||||
|
|
||||||
|
Or maybe a [comprehensive reference](http://mesecons.net/items.php) is your style?
|
||||||
|
|
||||||
|
An overview for the very newest of new beginners? How does [this one](http://uberi.mesecons.net/projects/MeseconsBasics/index.html) look?
|
||||||
|
|
||||||
|
Want to get more into building? Why not check out the [Mesecons Laboratory](http://uberi.mesecons.net/), a website dedicated to advanced Mesecons builders?
|
||||||
|
|
||||||
|
Want to contribute to Mesecons itself? Check out the [source code](https://github.com/Jeija/minetest-mod-mesecons)!
|
||||||
|
|
||||||
|
Who wrote it anyways?
|
||||||
|
---------------------
|
||||||
|
These awesome people made Mesecons possible!
|
||||||
|
|
||||||
|
| Contributor | Contribution |
|
||||||
|
| --------------- | ---------------------------------- |
|
||||||
|
| Jat15 | Various tweaks. |
|
||||||
|
| Jeija | **Main developer! Everything.** |
|
||||||
|
| Jordach | Noteblock sounds. |
|
||||||
|
| khonkhortistan | Coding, recipes, textures. |
|
||||||
|
| Kotolegokot | Nodeboxes for items. |
|
||||||
|
| minerd247 | Textures. |
|
||||||
|
| RealBadAngel | Fixes, improvements. |
|
||||||
|
| sfan5 | Coding, recipes, textures. |
|
||||||
|
| Uberi/Temperest | Coding, textures, documentation. |
|
||||||
|
| VanessaE | Coding, recipes, textures, design. |
|
||||||
|
| Whiskers75 | Logic gates implementation. |
|
||||||
|
|
||||||
|
There are also a whole bunch of other people helping with everything from code to testing and feedback. Mesecons would also not be possible without their help!
|
||||||
|
|
||||||
|
Alright, how can I use it?
|
||||||
|
--------------------------
|
||||||
|
All textures in this project are licensed under the CC-BY-SA 2.0 (Creative Commons Attribution-ShareAlike 2.0 Generic). That means you can distribute and remix them as much as you want to, under the condition that you give credit to the authors and the project, and that if you remix and release them, they must be under the same or similar license to this one.
|
||||||
|
|
||||||
|
All code in this project is licensed under the LGPL version 3 or later. That means you have unlimited freedom to distribute and modify the work however you see fit, provided that if you decide to distribute it or any modified versions of it, you must also use the same license. The LGPL also grants the additional freedom to write extensions for the software and distribute them without the extensions being subject to the terms of the LGPL, although the software itself retains its license.
|
||||||
|
|
||||||
|
No warranty is provided, express or implied, for any part of the project.
|
@ -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.
|
-- This mod adds mesecons[=minecraft redstone] and different receptors/effectors to minetest.
|
||||||
--
|
|
||||||
-- See the documentation on the forum for additional information, especially about crafting
|
-- 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
|
-- PUBLIC VARIABLES
|
||||||
mesecon={} -- contains all functions and all global variables
|
mesecon={} -- contains all functions and all global variables
|
||||||
mesecon.actions_on={} -- Saves registered function callbacks for mesecon on
|
mesecon.actions_on={} -- Saves registered function callbacks for mesecon on | DEPRECATED
|
||||||
mesecon.actions_off={} -- Saves registered function callbacks for mesecon off
|
mesecon.actions_off={} -- Saves registered function callbacks for mesecon off | DEPRECATED
|
||||||
mesecon.actions_change={} -- Saves registered function callbacks for mesecon change
|
mesecon.actions_change={} -- Saves registered function callbacks for mesecon change | DEPRECATED
|
||||||
mesecon.receptors={}
|
mesecon.receptors={} -- saves all information about receptors | DEPRECATED
|
||||||
mesecon.effectors={}
|
mesecon.effectors={} -- saves all information about effectors | DEPRECATED
|
||||||
mesecon.rules={}
|
mesecon.conductors={} -- saves all information about conductors | DEPRECATED
|
||||||
mesecon.conductors={}
|
|
||||||
|
|
||||||
-- INCLUDE SETTINGS
|
-- Settings
|
||||||
dofile(minetest.get_modpath("mesecons").."/settings.lua")
|
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");
|
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)
|
-- API
|
||||||
if get_rules == nil and rules == nil then
|
-- these are the only functions you need to remember
|
||||||
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
|
|
||||||
|
|
||||||
function mesecon:receptor_on(pos, rules)
|
function mesecon:receptor_on(pos, rules)
|
||||||
if rules == nil then
|
rules = rules or mesecon.rules.default
|
||||||
rules = mesecon:get_rules("default")
|
|
||||||
end
|
|
||||||
|
|
||||||
for i, rule in ipairs(rules) do
|
for _, rule in ipairs(rules) do
|
||||||
local np = {
|
local np = mesecon:addPosRule(pos, rule)
|
||||||
x = pos.x + rule.x,
|
local link, rulename = mesecon:rules_link(pos, np, rules)
|
||||||
y = pos.y + rule.y,
|
if link then
|
||||||
z = pos.z + rule.z}
|
mesecon:turnon(np, rulename)
|
||||||
if mesecon:rules_link(pos, np, rules) then
|
|
||||||
mesecon:turnon(np, pos)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:receptor_off(pos, rules)
|
function mesecon:receptor_off(pos, rules)
|
||||||
if rules == nil then
|
rules = rules or mesecon.rules.default
|
||||||
rules = mesecon:get_rules("default")
|
|
||||||
end
|
|
||||||
|
|
||||||
for i, rule in ipairs(rules) do
|
for _, rule in ipairs(rules) do
|
||||||
local np = {
|
local np = mesecon:addPosRule(pos, rule)
|
||||||
x = pos.x + rule.x,
|
local link, rulename = mesecon:rules_link(pos, np, rules)
|
||||||
y = pos.y + rule.y,
|
if link then
|
||||||
z = pos.z + rule.z}
|
if not mesecon:connected_to_receptor(np) then
|
||||||
if mesecon:rules_link(pos, np, rules) and not mesecon:connected_to_pw_src(np) then
|
mesecon:turnoff(np, rulename)
|
||||||
mesecon:turnoff(np, pos)
|
else
|
||||||
|
mesecon:changesignal(np, minetest.env:get_node(np), rulename, mesecon.state.off)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
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)
|
print("[OK] Mesecons")
|
||||||
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!")
|
|
||||||
|
|
||||||
--The actual wires
|
--The actual wires
|
||||||
dofile(minetest.get_modpath("mesecons").."/wires.lua");
|
dofile(minetest.get_modpath("mesecons").."/wires.lua");
|
||||||
|
|
||||||
--Services like turnoff receptor on dignode and so on
|
--Services like turnoff receptor on dignode and so on
|
||||||
dofile(minetest.get_modpath("mesecons").."/services.lua");
|
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
|
-- RECEPTORS
|
||||||
function mesecon:is_receptor_node(nodename)
|
-- mesecon:is_receptor(nodename) --> Returns true if nodename is a receptor
|
||||||
for _, receptor in ipairs(mesecon.receptors) do
|
-- mesecon:is_receptor_on(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.on
|
||||||
if receptor.onstate == nodename then
|
-- mesecon:is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off
|
||||||
return true
|
-- mesecon:receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified)
|
||||||
end
|
|
||||||
|
-- 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
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:is_receptor_node_off(nodename, pos, ownpos)
|
function mesecon:get_any_inputrules (node)
|
||||||
for _, receptor in ipairs(mesecon.receptors) do
|
if mesecon:is_conductor(node.name) then
|
||||||
if receptor.offstate == nodename then
|
return mesecon:conductor_get_rules(node)
|
||||||
return true
|
elseif mesecon:is_effector(node.name) then
|
||||||
end
|
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
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:receptor_get_rules(node)
|
function mesecon:receptor_get_rules(node)
|
||||||
for i, receptor in ipairs(mesecon.receptors) do
|
local receptor = mesecon:get_receptor(node.name)
|
||||||
if receptor.onstate == node.name or receptor.offstate == node.name then
|
if receptor then
|
||||||
if receptor.get_rules ~= nil then
|
local rules = receptor.rules
|
||||||
return receptor.get_rules(node.param2)
|
if type(rules) == 'function' then
|
||||||
elseif mesecon.receptors[i].rules ~=nil then
|
return rules(node)
|
||||||
return receptor.rules
|
elseif rules then
|
||||||
else
|
return rules
|
||||||
return mesecon:get_rules("default")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return nil
|
|
||||||
|
return mesecon.rules.default
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Effectors
|
-- Effectors
|
||||||
|
-- Nodes that can be powered by mesecons
|
||||||
function mesecon:is_effector_on(nodename)
|
function mesecon:is_effector_on(nodename)
|
||||||
for i, effector in ipairs(mesecon.effectors) do
|
local effector = mesecon:get_effector(nodename)
|
||||||
if effector.onstate == nodename then
|
if effector and effector.action_off then
|
||||||
return true
|
return true
|
||||||
end
|
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:is_effector_off(nodename)
|
function mesecon:is_effector_off(nodename)
|
||||||
for i, effector in ipairs(mesecon.effectors) do
|
local effector = mesecon:get_effector(nodename)
|
||||||
if effector.offstate == nodename then
|
if effector and effector.action_on then
|
||||||
return true
|
return true
|
||||||
end
|
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:is_effector(nodename)
|
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
|
end
|
||||||
|
|
||||||
function mesecon:effector_get_input_rules(node)
|
function mesecon:effector_get_rules(node)
|
||||||
for i, effector in ipairs(mesecon.effectors) do
|
local effector = mesecon:get_effector(node.name)
|
||||||
if effector.onstate == node.name
|
if effector then
|
||||||
or effector.offstate == node.name then
|
local rules = effector.rules
|
||||||
if effector.get_input_rules ~= nil then
|
if type(rules) == 'function' then
|
||||||
return effector.get_input_rules(node.param2)
|
return rules(node)
|
||||||
elseif mesecon.effectors[i].input_rules ~=nil then
|
elseif rules then
|
||||||
return effector.input_rules
|
return rules
|
||||||
else
|
|
||||||
return mesecon:get_rules("default")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return mesecon.rules.default
|
||||||
end
|
end
|
||||||
|
|
||||||
--Signals
|
--Signals
|
||||||
|
|
||||||
function mesecon:activate(pos)
|
function mesecon:activate(pos, node, rulename)
|
||||||
local node = minetest.env:get_node(pos)
|
local effector = mesecon:get_effector(node.name)
|
||||||
for i, action in ipairs(mesecon.actions_on) do
|
if effector and effector.action_on then
|
||||||
action(pos, node)
|
effector.action_on (pos, node, rulename)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:deactivate(pos)
|
function mesecon:deactivate(pos, node, rulename)
|
||||||
local node = minetest.env:get_node(pos)
|
local effector = mesecon:get_effector(node.name)
|
||||||
for i, action in ipairs(mesecon.actions_off) do
|
if effector and effector.action_off then
|
||||||
action(pos, node)
|
effector.action_off (pos, node, rulename)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:changesignal(pos)
|
function mesecon:changesignal(pos, node, rulename, newstate)
|
||||||
local node = minetest.env:get_node(pos)
|
local effector = mesecon:get_effector(node.name)
|
||||||
for i, action in ipairs(mesecon.actions_change) do
|
if effector and effector.action_change then
|
||||||
action(pos, node)
|
effector.action_change (pos, node, rulename, newstate)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--Rules
|
--Rules
|
||||||
|
|
||||||
function mesecon:add_rules(name, rules)
|
function mesecon:add_rules(name, rules)
|
||||||
table.insert(mesecon.rules, {name = name, rules = rules})
|
mesecon.rules[name] = rules
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:get_rules(name)
|
function mesecon:get_rules(name)
|
||||||
for i, rule in ipairs(mesecon.rules) do
|
return mesecon.rules[name]
|
||||||
if rule.name==name then
|
|
||||||
return rule.rules
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
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)
|
function mesecon:get_conductor_on(offstate)
|
||||||
for i, conductor in ipairs(mesecon.conductors) do
|
local conductor = mesecon:get_conductor(offstate)
|
||||||
if conductor.offstate == offstate then
|
if conductor then
|
||||||
return conductor.onstate
|
return conductor.onstate
|
||||||
end
|
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:get_conductor_off(onstate)
|
function mesecon:get_conductor_off(onstate)
|
||||||
for i, conductor in ipairs(mesecon.conductors) do
|
local conductor = mesecon:get_conductor(onstate)
|
||||||
if conductor.onstate == onstate then
|
if conductor then
|
||||||
return conductor.offstate
|
return conductor.offstate
|
||||||
end
|
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
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)
|
function mesecon:conductor_get_rules(node)
|
||||||
for i, conductor in ipairs(mesecon.conductors) do
|
local conductor = mesecon:get_conductor(node.name)
|
||||||
if conductor.onstate == node.name
|
if conductor then
|
||||||
or conductor.offstate == node.name then
|
local rules = conductor.rules
|
||||||
if conductor.get_rules ~= nil then
|
if type(rules) == 'function' then
|
||||||
return conductor.get_rules(node.param2)
|
return rules(node)
|
||||||
else
|
elseif rules then
|
||||||
return conductor.rules
|
return rules
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return mesecon.rules.default
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
-- some more general high-level stuff
|
||||||
|
|
||||||
function mesecon:is_power_on(pos)
|
function mesecon:is_power_on(pos)
|
||||||
local node = minetest.env:get_node(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
|
return true
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
@ -175,282 +277,196 @@ end
|
|||||||
|
|
||||||
function mesecon:is_power_off(pos)
|
function mesecon:is_power_off(pos)
|
||||||
local node = minetest.env:get_node(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
|
return true
|
||||||
end
|
end
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:turnon(pos)
|
function mesecon:turnon(pos, rulename)
|
||||||
local node = minetest.env:get_node(pos)
|
local node = minetest.env:get_node(pos)
|
||||||
|
|
||||||
if mesecon:is_conductor_off(node.name) then
|
if mesecon:is_conductor_off(node.name) then
|
||||||
local rules = mesecon:conductor_get_rules(node)
|
local rules = mesecon:conductor_get_rules(node)
|
||||||
minetest.env:add_node(pos, {name=mesecon:get_conductor_on(node.name), param2 = node.param2})
|
minetest.env:add_node(pos, {name = mesecon:get_conductor_on(node.name), param2 = node.param2})
|
||||||
|
|
||||||
for i, rule in ipairs(rules) do
|
for _, rule in ipairs(rules) do
|
||||||
local np = {}
|
local np = mesecon:addPosRule(pos, rule)
|
||||||
np.x = pos.x + rule.x
|
local link, rulename = mesecon:rules_link(pos, np)
|
||||||
np.y = pos.y + rule.y
|
|
||||||
np.z = pos.z + rule.z
|
|
||||||
|
|
||||||
if mesecon:rules_link(pos, np) then
|
if link then
|
||||||
mesecon:turnon(np)
|
mesecon:turnon(np, rulename)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
elseif mesecon:is_effector(node.name) then
|
||||||
|
mesecon:changesignal(pos, node, rulename, mesecon.state.on)
|
||||||
if mesecon:is_effector(node.name) then
|
if mesecon:is_effector_off(node.name) then
|
||||||
mesecon:changesignal(pos)
|
mesecon:activate(pos, node, rulename)
|
||||||
if mesecon:is_effector_off(node.name) then mesecon:activate(pos) end
|
end
|
||||||
end
|
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 node = minetest.env:get_node(pos)
|
||||||
local rules
|
|
||||||
|
|
||||||
if mesecon:is_conductor_on(node.name) then
|
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})
|
||||||
|
|
||||||
minetest.env:add_node(pos, {name=mesecon:get_conductor_off(node.name), param2 = node.param2})
|
for _, rule in ipairs(rules) do
|
||||||
|
local np = mesecon:addPosRule(pos, rule)
|
||||||
|
local link, rulename = mesecon:rules_link(pos, np)
|
||||||
|
|
||||||
for i, rule in ipairs(rules) do
|
if link then
|
||||||
local np = {
|
mesecon:turnoff(np, rulename)
|
||||||
x = pos.x + rule.x,
|
|
||||||
y = pos.y + rule.y,
|
|
||||||
z = pos.z + rule.z,}
|
|
||||||
|
|
||||||
if mesecon:rules_link(pos, np) then
|
|
||||||
mesecon:turnoff(np)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
elseif mesecon:is_effector(node.name) then
|
||||||
|
mesecon:changesignal(pos, node, rulename, mesecon.state.off)
|
||||||
if mesecon:is_effector(node.name) then
|
if mesecon:is_effector_on(node.name)
|
||||||
mesecon:changesignal(pos)
|
and not mesecon:is_powered(pos) then
|
||||||
if mesecon:is_effector_on(node.name) and not mesecon:is_powered(pos) then mesecon:deactivate(pos) end
|
mesecon:deactivate(pos, node, rulename)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function mesecon:connected_to_pw_src(pos, checked)
|
function mesecon:connected_to_receptor(pos)
|
||||||
local c = 1
|
local node = minetest.env:get_node(pos)
|
||||||
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)
|
-- Check if conductors around are connected
|
||||||
|
local rules = mesecon:get_any_inputrules(node)
|
||||||
|
if not rules then return false end
|
||||||
|
|
||||||
if node == nil then return false, checked end
|
for _, rule in ipairs(rules) do
|
||||||
if mesecon:is_powered_by_receptor(pos) then --return if conductor is powered
|
local np = mesecon:addPosRule(pos, rule)
|
||||||
return true, checked
|
if mesecon:rules_link(np, pos) then
|
||||||
end
|
if mesecon:find_receptor_on(np, {}) then
|
||||||
|
|
||||||
--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
|
|
||||||
|
|
||||||
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
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return false, checked
|
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug)
|
function mesecon:find_receptor_on(pos, checked)
|
||||||
local k = 1
|
-- find out if node has already been checked (to prevent from endless loop)
|
||||||
local l = 1
|
for _, cp in ipairs(checked) do
|
||||||
|
if mesecon:cmpPos(cp, pos) then
|
||||||
local outputnode = minetest.env:get_node(output)
|
return false, checked
|
||||||
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
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if mesecon:is_conductor(inputnode.name) then
|
-- add current position to checked
|
||||||
inputrules = mesecon:conductor_get_rules(inputnode)
|
table.insert(checked, {x=pos.x, y=pos.y, z=pos.z})
|
||||||
elseif mesecon:is_effector(inputnode.name) then
|
local node = minetest.env:get_node(pos)
|
||||||
inputrules = mesecon:effector_get_input_rules(inputnode)
|
|
||||||
else
|
if mesecon:is_receptor_on(node.name) then
|
||||||
return false
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if mesecon:is_conductor(node.name) then
|
||||||
for k, outputrule in ipairs(outputrules) do
|
local rules = mesecon:conductor_get_rules(node)
|
||||||
if outputrule.x + output.x == input.x
|
for _, rule in ipairs(rules) do
|
||||||
and outputrule.y + output.y == input.y
|
local np = mesecon:addPosRule(pos, rule)
|
||||||
and outputrule.z + output.z == input.z then -- Check if output sends to input
|
if mesecon:rules_link(np, pos) then
|
||||||
l = 1
|
if mesecon:find_receptor_on(np, checked) then
|
||||||
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
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
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 or mesecon:get_any_outputrules (outputnode)
|
||||||
|
local inputrules = mesecon:get_any_inputrules (inputnode)
|
||||||
|
if not outputrules or not inputrules then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
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
|
||||||
|
end
|
||||||
return false
|
return false
|
||||||
end
|
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)
|
return mesecon:rules_link(pos1, pos2) or mesecon:rules_link(pos2, pos1)
|
||||||
end
|
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)
|
function mesecon:is_powered(pos)
|
||||||
return mesecon:is_powered_by_conductor(pos) or mesecon:is_powered_by_receptor(pos)
|
local node = minetest.env:get_node(pos)
|
||||||
end
|
local rules = mesecon:get_any_inputrules(node)
|
||||||
|
if not rules then return false end
|
||||||
|
|
||||||
function mesecon:updatenode(pos)
|
for _, rule in ipairs(rules) do
|
||||||
if mesecon:connected_to_pw_src(pos) then
|
local np = mesecon:addPosRule(pos, rule)
|
||||||
mesecon:turnon(pos)
|
local nn = minetest.env:get_node(np)
|
||||||
else
|
|
||||||
mesecon:turnoff(pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function compare_pos(pos1, pos2)
|
if (mesecon:is_conductor_on (nn.name) or mesecon:is_receptor_on (nn.name))
|
||||||
return pos1.x == pos2.x and pos1.y == pos2.y and pos1.z == pos2.z
|
and mesecon:rules_link(np, pos) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
--Rules rotation Functions:
|
--Rules rotation Functions:
|
||||||
function mesecon:rotate_rules_right(rules)
|
function mesecon:rotate_rules_right(rules)
|
||||||
local nr={};
|
local nr = {}
|
||||||
for i, rule in ipairs(rules) do
|
for i, rule in ipairs(rules) do
|
||||||
nr[i]={}
|
table.insert(nr, {
|
||||||
nr[i].z=rule.x
|
x = -rule.z,
|
||||||
nr[i].x=-rule.z
|
y = rule.y,
|
||||||
nr[i].y=rule.y
|
z = rule.x})
|
||||||
end
|
end
|
||||||
return nr
|
return nr
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:rotate_rules_left(rules)
|
function mesecon:rotate_rules_left(rules)
|
||||||
local nr={};
|
local nr = {}
|
||||||
for i, rule in ipairs(rules) do
|
for i, rule in ipairs(rules) do
|
||||||
nr[i]={}
|
table.insert(nr, {
|
||||||
nr[i].z=-rules[i].x
|
x = rule.z,
|
||||||
nr[i].x=rules[i].z
|
y = rule.y,
|
||||||
nr[i].y=rules[i].y
|
z = -rule.x})
|
||||||
end
|
end
|
||||||
return nr
|
return nr
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:rotate_rules_down(rules)
|
function mesecon:rotate_rules_down(rules)
|
||||||
local nr={};
|
local nr = {}
|
||||||
for i, rule in ipairs(rules) do
|
for i, rule in ipairs(rules) do
|
||||||
nr[i]={}
|
table.insert(nr, {
|
||||||
nr[i].y=rule.x
|
x = -rule.y,
|
||||||
nr[i].x=-rule.y
|
y = rule.x,
|
||||||
nr[i].z=rule.z
|
z = rule.z})
|
||||||
end
|
end
|
||||||
return nr
|
return nr
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:rotate_rules_up(rules)
|
function mesecon:rotate_rules_up(rules)
|
||||||
local nr={};
|
local nr = {}
|
||||||
for i, rule in ipairs(rules) do
|
for i, rule in ipairs(rules) do
|
||||||
nr[i]={}
|
table.insert(nr, {
|
||||||
nr[i].y=-rule.x
|
x = rule.y,
|
||||||
nr[i].x=rule.y
|
y = -rule.x,
|
||||||
nr[i].z=rule.z
|
z = rule.z})
|
||||||
end
|
end
|
||||||
return nr
|
return nr
|
||||||
end
|
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,29 @@
|
|||||||
minetest.register_on_dignode(
|
mesecon.on_placenode = function (pos)
|
||||||
function(pos, oldnode, digger)
|
local node = minetest.env:get_node(pos)
|
||||||
if mesecon:is_conductor_on(oldnode.name) then
|
if mesecon:is_receptor_on(node.name) then
|
||||||
mesecon:receptor_off(pos)
|
mesecon:receptor_on(pos, mesecon:receptor_get_rules(node))
|
||||||
end
|
elseif mesecon:is_powered(pos) then
|
||||||
|
if mesecon:is_conductor(node.name) then
|
||||||
if mesecon:is_receptor_node(oldnode.name) then
|
mesecon:turnon (pos)
|
||||||
mesecon:receptor_off(pos, mesecon:receptor_get_rules(oldnode))
|
mesecon:receptor_on (pos, mesecon:conductor_get_rules(node))
|
||||||
|
else
|
||||||
|
mesecon:changesignal(pos, node)
|
||||||
|
mesecon:activate(pos, node)
|
||||||
end
|
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
|
||||||
)
|
end
|
||||||
|
|
||||||
minetest.register_on_placenode(
|
mesecon.on_dignode = function (pos, node)
|
||||||
function (pos, node)
|
if mesecon:is_conductor_on(node.name) then
|
||||||
if mesecon:is_receptor_node(node.name) then
|
mesecon:receptor_off(pos, mesecon:conductor_get_rules(node))
|
||||||
mesecon:receptor_on(pos, mesecon:receptor_get_rules(node))
|
elseif mesecon:is_receptor_on(node.name) then
|
||||||
end
|
mesecon:receptor_off(pos, mesecon:receptor_get_rules(node))
|
||||||
|
|
||||||
if mesecon:is_powered(pos) then
|
|
||||||
if mesecon:is_conductor_off(node.name) then
|
|
||||||
mesecon:turnon(pos)
|
|
||||||
else
|
|
||||||
mesecon:changesignal(pos)
|
|
||||||
mesecon:activate(pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
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
|
BLINKY_PLANT_INTERVAL = 3
|
||||||
NEW_STYLE_WIRES = true -- true = new nodebox wires, false = old raillike wires
|
NEW_STYLE_WIRES = true -- true = new nodebox wires, false = old raillike wires
|
||||||
PRESSURE_PLATE_INTERVAL = 0.1
|
PRESSURE_PLATE_INTERVAL = 0.1
|
||||||
|
OBJECT_DETECTOR_RADIUS = 6
|
||||||
|
PISTON_MAXIMUM_PUSH = 15
|
||||||
|
MOVESTONE_MAXIMUM_PUSH = 100
|
||||||
|
38
mesecons/util.lua
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
function mesecon:tablecopy(table) -- deep table copy
|
||||||
|
local newtable = {}
|
||||||
|
|
||||||
|
for idx, item in pairs(table) do
|
||||||
|
if type(item) == "table" then
|
||||||
|
newtable[idx] = mesecon:tablecopy(item)
|
||||||
|
else
|
||||||
|
newtable[idx] = item
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return newtable
|
||||||
|
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
|
-- naming scheme: wire:(xp)(zp)(xm)(zm)_on/off
|
||||||
-- The conditions in brackets define whether there is a mesecon at that place or not
|
-- The conditions in brackets define whether there is a mesecon at that place or not
|
||||||
-- 1 = there is one; 0 = there is none
|
-- 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_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_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_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}
|
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_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}
|
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 xp=0, 1 do
|
||||||
for zp=0, 1 do
|
for zp=0, 1 do
|
||||||
for xm=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)
|
tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy)
|
||||||
|
|
||||||
if nodeid == "00000000" then
|
if nodeid == "00000000" then
|
||||||
groups = {dig_immediate = 3, mesecon = 2, mesecon_conductor_craftable=1}
|
groups = {dig_immediate = 3, mesecon_conductor_craftable=1}
|
||||||
wiredesc = "Mesecon"
|
wiredesc = "Mesecon"
|
||||||
else
|
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..")"
|
wiredesc = "Mesecons Wire (ID: "..nodeid..")"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -90,7 +55,6 @@ for zmy=0, 1 do
|
|||||||
|
|
||||||
if adjx and adjz and (xp + zp + xm + zm > 2) then
|
if adjx and adjz and (xp + zp + xm + zm > 2) then
|
||||||
table.insert(nodebox, box_bump1)
|
table.insert(nodebox, box_bump1)
|
||||||
table.insert(nodebox, box_bump2)
|
|
||||||
tiles_off = {
|
tiles_off = {
|
||||||
"wires_bump_off.png",
|
"wires_bump_off.png",
|
||||||
"wires_bump_off.png",
|
"wires_bump_off.png",
|
||||||
@ -144,7 +108,7 @@ for zmy=0, 1 do
|
|||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5}
|
fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5}
|
||||||
},
|
},
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
@ -153,19 +117,27 @@ for zmy=0, 1 do
|
|||||||
groups = groups,
|
groups = groups,
|
||||||
walkable = false,
|
walkable = false,
|
||||||
stack_max = 99,
|
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", {
|
minetest.register_node("mesecons:wire_"..nodeid.."_on", {
|
||||||
description = "Wire ID:"..nodeid,
|
description = "Wire ID:"..nodeid,
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = tiles_on,
|
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",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5}
|
fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5}
|
||||||
},
|
},
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
@ -174,9 +146,12 @@ for zmy=0, 1 do
|
|||||||
groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1},
|
groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1},
|
||||||
walkable = false,
|
walkable = false,
|
||||||
stack_max = 99,
|
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
|
end
|
||||||
end
|
end
|
||||||
@ -186,17 +161,18 @@ end
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_on_placenode(function(pos, node)
|
-- Updating the wires:
|
||||||
if minetest.get_item_group(node.name, "mesecon") > 1 then
|
-- Place the right connection wire
|
||||||
mesecon:update_autoconnect(pos)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
minetest.register_on_dignode(function(pos, node)
|
local update_on_place_dig = function (pos, node)
|
||||||
if minetest.get_item_group(node.name, "mesecon") > 1 then
|
if minetest.registered_nodes[node.name]
|
||||||
|
and minetest.registered_nodes[node.name].mesecons then
|
||||||
mesecon:update_autoconnect(pos)
|
mesecon:update_autoconnect(pos)
|
||||||
end
|
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)
|
function mesecon:update_autoconnect(pos, secondcall, replace_old)
|
||||||
local xppos = {x=pos.x+1, y=pos.y, z=pos.z}
|
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
|
nodename = minetest.env:get_node(pos).name
|
||||||
if string.find(nodename, "mesecons:wire_") == nil and not replace_old then return nil end
|
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
|
if mesecon:rules_link_anydir(pos, xpympos) then xp = 1 end
|
||||||
local zmg = minetest.get_item_group(minetest.env:get_node(zmpos ).name, "mesecon")
|
if mesecon:rules_link_anydir(pos, xmympos) then xm = 1 end
|
||||||
local zmymg = minetest.get_item_group(minetest.env:get_node(zmympos).name, "mesecon")
|
if mesecon:rules_link_anydir(pos, zpympos) then zp = 1 end
|
||||||
local xmg = minetest.get_item_group(minetest.env:get_node(xmpos ).name, "mesecon")
|
if mesecon:rules_link_anydir(pos, zmympos) then zm = 1 end
|
||||||
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, xpypos) then xpy = 1 else xpy = 0 end
|
||||||
local xpyg = minetest.get_item_group(minetest.env:get_node(xpypos).name, "mesecon")
|
if mesecon:rules_link_anydir(pos, zpypos) then zpy = 1 else zpy = 0 end
|
||||||
local zpyg = minetest.get_item_group(minetest.env:get_node(zpypos).name, "mesecon")
|
if mesecon:rules_link_anydir(pos, xmypos) then xmy = 1 else xmy = 0 end
|
||||||
local xmyg = minetest.get_item_group(minetest.env:get_node(xmypos).name, "mesecon")
|
if mesecon:rules_link_anydir(pos, zmypos) then zmy = 1 else zmy = 0 end
|
||||||
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 xpy == 1 then xp = 1 end
|
if xpy == 1 then xp = 1 end
|
||||||
if zpy == 1 then zp = 1 end
|
if zpy == 1 then zp = 1 end
|
||||||
@ -310,19 +241,41 @@ function mesecon:update_autoconnect(pos, secondcall, replace_old)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_craft({
|
if minetest.registered_nodes["default:stone_with_mese"] == nil then
|
||||||
output = '"mesecons:wire_00000000_off" 16',
|
|
||||||
recipe = {
|
minetest.register_craft({
|
||||||
{'"default:mese"'},
|
output = "mesecons:wire_00000000_off 18",
|
||||||
}
|
recipe = {
|
||||||
})
|
{"default:mese"},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
else
|
||||||
|
|
||||||
|
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,
|
||||||
|
})
|
||||||
|
|
||||||
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,
|
|
||||||
})
|
|
||||||
end
|
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:wireless_transmitter", "mesecons_wireless:wireless_transmitter_off")
|
||||||
minetest.register_alias("mesecons:switch", "mesecons_switch:mesecon_switch_off")
|
minetest.register_alias("mesecons:switch", "mesecons_switch:mesecon_switch_off")
|
||||||
minetest.register_alias("mesecons:button", "mesecons_button:button_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:blinky_plant", "mesecons_blinkyplant:blinky_plant_off")
|
||||||
minetest.register_alias("mesecons:mesecon_torch", "mesecons_torch:mesecon_torch_on")
|
minetest.register_alias("mesecons:mesecon_torch", "mesecons_torch:mesecon_torch_on")
|
||||||
minetest.register_alias("mesecons: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:movestone", "mesecons_movestones:movestone")
|
||||||
minetest.register_alias("mesecons:sticky_movestone", "mesecons_movestones:sticky_movestone")
|
minetest.register_alias("mesecons:sticky_movestone", "mesecons_movestones:sticky_movestone")
|
||||||
minetest.register_alias("mesecons:noteblock", "mesecons_noteblock:noteblock")
|
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:delayer", "mesecons_delayer:delayer_off_1")
|
||||||
minetest.register_alias("mesecons:solarpanel", "mesecons_solarpanel:solar_panel_off")
|
minetest.register_alias("mesecons:solarpanel", "mesecons_solarpanel:solar_panel_off")
|
||||||
|
|
||||||
|
|
||||||
--Backwards compatibility
|
--Backwards compatibility
|
||||||
minetest.register_alias("mesecons:mesecon_off", "mesecons:wire_00000000_off")
|
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,
|
walkable = false,
|
||||||
groups = {dig_immediate=3, mesecon = 2},
|
groups = {dig_immediate=3, mesecon = 2},
|
||||||
description="Blinky Plant",
|
description="Blinky Plant",
|
||||||
|
sounds = default.node_sound_leaves_defaults(),
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
|
fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},
|
||||||
},
|
},
|
||||||
|
mesecons = {receptor = {
|
||||||
|
state = mesecon.state.off
|
||||||
|
}}
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mesecons_blinkyplant:blinky_plant_on", {
|
minetest.register_node("mesecons_blinkyplant:blinky_plant_on", {
|
||||||
@ -23,21 +27,25 @@ minetest.register_node("mesecons_blinkyplant:blinky_plant_on", {
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
walkable = false,
|
walkable = false,
|
||||||
groups = {dig_immediate=3, not_in_creative_inventory=1, mesecon = 2},
|
groups = {dig_immediate=3, not_in_creative_inventory=1, mesecon = 2},
|
||||||
drop='"mesecons_blinkyplant:blinky_plant_off" 1',
|
drop="mesecons_blinkyplant:blinky_plant_off 1",
|
||||||
light_source = LIGHT_MAX-7,
|
light_source = LIGHT_MAX-7,
|
||||||
description = "Blinky Plant",
|
description = "Blinky Plant",
|
||||||
|
sounds = default.node_sound_leaves_defaults(),
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
|
fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},
|
||||||
},
|
},
|
||||||
|
mesecons = {receptor = {
|
||||||
|
state = mesecon.state.on
|
||||||
|
}}
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = '"mesecons_blinkyplant:blinky_plant_off" 1',
|
output = "mesecons_blinkyplant:blinky_plant_off 1",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'','"group:mesecon_conductor_craftable"',''},
|
{"","group:mesecon_conductor_craftable",""},
|
||||||
{'','"group:mesecon_conductor_craftable"',''},
|
{"","group:mesecon_conductor_craftable",""},
|
||||||
{'"default:sapling"','"default:sapling"','"default:sapling"'},
|
{"default:sapling","default:sapling","default:sapling"},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -64,6 +72,3 @@ minetest.register_abm({
|
|||||||
mesecon:receptor_off(pos)
|
mesecon:receptor_off(pos)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
mesecon:add_receptor_node("mesecons_blinkyplant:blinky_plant_on")
|
|
||||||
mesecon:add_receptor_node_off("mesecons_blinkyplant:blinky_plant_off")
|
|
||||||
|
@ -1,7 +1,20 @@
|
|||||||
-- WALL BUTTON
|
-- 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", {
|
minetest.register_node("mesecons_button:button_off", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {
|
tiles = {
|
||||||
"jeija_wall_button_sides.png",
|
"jeija_wall_button_sides.png",
|
||||||
"jeija_wall_button_sides.png",
|
"jeija_wall_button_sides.png",
|
||||||
"jeija_wall_button_sides.png",
|
"jeija_wall_button_sides.png",
|
||||||
@ -9,25 +22,37 @@ minetest.register_node("mesecons_button:button_off", {
|
|||||||
"jeija_wall_button_sides.png",
|
"jeija_wall_button_sides.png",
|
||||||
"jeija_wall_button_off.png"
|
"jeija_wall_button_off.png"
|
||||||
},
|
},
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
legacy_wallmounted = true,
|
legacy_wallmounted = true,
|
||||||
walkable = false,
|
walkable = false,
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 }
|
fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 }
|
||||||
},
|
},
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
{ -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, -- the thin plate behind the button
|
{ -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, -- the thin plate behind the button
|
||||||
{ -4/16, -2/16, 4/16, 4/16, 2/16, 6/16 } -- the button itself
|
{ -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",
|
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", {
|
minetest.register_node("mesecons_button:button_on", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {
|
tiles = {
|
||||||
@ -44,68 +69,30 @@ minetest.register_node("mesecons_button:button_on", {
|
|||||||
walkable = false,
|
walkable = false,
|
||||||
light_source = LIGHT_MAX-7,
|
light_source = LIGHT_MAX-7,
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 }
|
fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 }
|
||||||
},
|
},
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
{ -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 },
|
{ -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 },
|
||||||
{ -4/16, -2/16, 11/32, 4/16, 2/16, 6/16 }
|
{ -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',
|
drop = 'mesecons_button:button_off',
|
||||||
description = "Button",
|
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({
|
minetest.register_craft({
|
||||||
output = '"mesecons_button:button_off" 2',
|
output = "mesecons_button:button_off 2",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'"group:mesecon_conductor_craftable"','"default:stone"'},
|
{"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,55 @@
|
|||||||
|
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
|
||||||
|
if not minetest.env:get_player_by_name(target) then
|
||||||
|
minetest.chat_send_player(name, "Invalid target: " .. target)
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(target, name .. " whispers: " .. message, false)
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_chatcommand("tellme", {
|
||||||
|
params = "<text>",
|
||||||
|
description = "Say <text> to yourself",
|
||||||
|
func = function(name, param)
|
||||||
|
minetest.chat_send_player(name, param, false)
|
||||||
|
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
|
||||||
|
local player = minetest.env:get_player_by_name(target)
|
||||||
|
if player then
|
||||||
|
player:set_hp(value)
|
||||||
|
else
|
||||||
|
minetest.chat_send_player(name, "Invalid target: " .. target)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
||||||
|
|
||||||
local initialize_data = function(meta, player, command, param)
|
local initialize_data = function(meta, player, command, param)
|
||||||
meta:set_string("formspec",
|
meta:set_string("formspec",
|
||||||
"invsize[9,6;]" ..
|
"invsize[9,6;]" ..
|
||||||
@ -87,50 +139,12 @@ local resolve_player = function(name, pos)
|
|||||||
return name
|
return name
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_node("mesecons_commandblock:commandblock_off", {
|
local commandblock_action_on = function(pos, node)
|
||||||
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)
|
|
||||||
if node.name ~= "mesecons_commandblock:commandblock_off" then
|
if node.name ~= "mesecons_commandblock:commandblock_off" then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
swap_node(pos, "mesecons_commandblock:commandblock_on")
|
mesecon:swap_node(pos, "mesecons_commandblock:commandblock_on")
|
||||||
|
|
||||||
local meta = minetest.env:get_meta(pos)
|
local meta = minetest.env:get_meta(pos)
|
||||||
local command = minetest.chatcommands[meta:get_string("command")]
|
local command = minetest.chatcommands[meta:get_string("command")]
|
||||||
@ -148,10 +162,46 @@ mesecon:register_on_signal_on(function(pos, node)
|
|||||||
end
|
end
|
||||||
local player = resolve_player(meta:get_string("player"), pos)
|
local player = resolve_player(meta:get_string("player"), pos)
|
||||||
command.func(player, meta:get_string("param"))
|
command.func(player, meta:get_string("param"))
|
||||||
end)
|
end
|
||||||
|
|
||||||
mesecon:register_on_signal_off(function(pos, node)
|
local commandblock_action_off = function(pos, node)
|
||||||
if node.name == "mesecons_commandblock:commandblock_on" then
|
if node.name == "mesecons_commandblock:commandblock_on" then
|
||||||
swap_node(pos, "mesecons_commandblock:commandblock_off")
|
mesecon:swap_node(pos, "mesecons_commandblock:commandblock_off")
|
||||||
end
|
end
|
||||||
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
|
for i = 1, 4 do
|
||||||
local groups = {}
|
local groups = {}
|
||||||
if i == 1 then
|
if i == 1 then
|
||||||
groups = {bendy=2,snappy=1,dig_immediate=2, mesecon = 3}
|
groups = {bendy=2,snappy=1,dig_immediate=2}
|
||||||
else
|
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
|
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
|
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
|
{ -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,
|
sunlight_propagates = true,
|
||||||
is_ground_content = true,
|
is_ground_content = true,
|
||||||
drop = 'mesecons_delayer:delayer_off_1',
|
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",
|
type = "fixed",
|
||||||
fixed = boxes
|
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",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
is_ground_content = true,
|
is_ground_content = true,
|
||||||
drop = 'mesecons_delayer:delayer_off_1',
|
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
|
end
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "mesecons_delayer:delayer_off_1",
|
||||||
|
recipe = {
|
||||||
minetest.register_on_punchnode(function (pos, node)
|
{"mesecons_torch:mesecon_torch_on", "group:mesecon_conductor_craftable", "mesecons_torch:mesecon_torch_on"},
|
||||||
mesecon.delayer_get_output_rules(node.param2)
|
{"default:cobble","default:cobble", "default:cobble"},
|
||||||
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)
|
|
||||||
|
@ -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", {
|
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"},
|
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",
|
paramtype = "light",
|
||||||
walkable = true,
|
walkable = true,
|
||||||
groups = {cracky=3, mesecon = 2},
|
groups = {cracky=3},
|
||||||
description="Player Detector",
|
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", {
|
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"},
|
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",
|
paramtype = "light",
|
||||||
walkable = true,
|
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',
|
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({
|
minetest.register_craft({
|
||||||
output = 'mesecons_detector:object_detector_off',
|
output = 'mesecons_detector:object_detector_off',
|
||||||
recipe = {
|
recipe = {
|
||||||
{"default:steelblock", '', "default:steelblock"},
|
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
|
||||||
{"default:steelblock", "mesecons_microcontroller:microcontroller0000", "default:steelblock"},
|
{"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "default:steel_ingot"},
|
||||||
{"default:steelblock", "group:mesecon_conductor_craftable", "default:steelblock"},
|
{"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -29,19 +86,10 @@ minetest.register_abm(
|
|||||||
{nodenames = {"mesecons_detector:object_detector_off"},
|
{nodenames = {"mesecons_detector:object_detector_off"},
|
||||||
interval = 1.0,
|
interval = 1.0,
|
||||||
chance = 1,
|
chance = 1,
|
||||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
action = function(pos)
|
||||||
local objs = minetest.env:get_objects_inside_radius(pos, 6)
|
if object_detector_scan(pos) then
|
||||||
for k, obj in pairs(objs) do
|
mesecon:swap_node(pos, "mesecons_detector:object_detector_on")
|
||||||
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)
|
mesecon:receptor_on(pos)
|
||||||
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
|
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -50,28 +98,10 @@ minetest.register_abm(
|
|||||||
{nodenames = {"mesecons_detector:object_detector_on"},
|
{nodenames = {"mesecons_detector:object_detector_on"},
|
||||||
interval = 1.0,
|
interval = 1.0,
|
||||||
chance = 1,
|
chance = 1,
|
||||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
action = function(pos)
|
||||||
local objs = minetest.env:get_objects_inside_radius(pos, 6)
|
if not object_detector_scan(pos) then
|
||||||
local objectfound=0
|
mesecon:swap_node(pos, "mesecons_detector:object_detector_off")
|
||||||
for k, obj in pairs(objs) do
|
mesecon:receptor_off(pos)
|
||||||
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"))
|
|
||||||
end
|
end
|
||||||
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()
|
|
1
mesecons_dispenser/depends.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
default
|
57
mesecons_dispenser/init.lua
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
minetest.register_node("mesecons_dispenser:dispenser", {
|
||||||
|
description = "Dispenser",
|
||||||
|
tiles = {"mesecons_dispenser_top.png" , "mesecons_dispenser_bottom.png",
|
||||||
|
"mesecons_dispenser_side.png", "mesecons_dispenser_side.png" ,
|
||||||
|
"mesecons_dispenser_side.png", "mesecons_dispenser_front.png"},
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
groups = {cracky=2},
|
||||||
|
sounds = default.node_sound_stone_defaults(),
|
||||||
|
on_construct = function(pos)
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
meta:set_string("formspec",
|
||||||
|
"size[8,7]"..
|
||||||
|
"list[current_name;main;2.5,0;3,3;]"..
|
||||||
|
"list[current_player;main;0,3;8,4;]")
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("main", 3*3)
|
||||||
|
end,
|
||||||
|
mesecons = {effector={
|
||||||
|
action_on = function (pos, node)
|
||||||
|
local dir = {{x=1, y=0, z=0}}
|
||||||
|
for _ = 0, node.param2 do
|
||||||
|
dir = mesecon:rotate_rules_left(dir)
|
||||||
|
end
|
||||||
|
dir = dir[1]
|
||||||
|
local objpos = mesecon:addPosRule(pos, {x=dir.x/2, y=dir.y/2, z=dir.z/2})
|
||||||
|
--minetest.env:add_node(mesecon:addPosRule(pos, dir[1]), {name="default:wood"})
|
||||||
|
local inv = minetest.env:get_meta(pos):get_inventory()
|
||||||
|
local stacks = {}
|
||||||
|
for j = 1, 9 do
|
||||||
|
local ts = inv:get_stack("main", j)
|
||||||
|
if not ts:is_empty() then
|
||||||
|
table.insert(stacks, {stack = ts, id = j})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
print(dump(stacks))
|
||||||
|
if #stacks > 0 then
|
||||||
|
local sn = math.random(1, #stacks)
|
||||||
|
local takenitem = stacks[sn].stack:take_item()
|
||||||
|
inv:set_stack("main", stacks[sn].id, stacks[sn].stack)
|
||||||
|
print(dump(takenitem:to_table()))
|
||||||
|
local obj = minetest.env:add_item(objpos, takenitem:to_table())
|
||||||
|
obj:setvelocity({ x=dir.x*5+math.random(1, 100)/50-0.5,
|
||||||
|
y=dir.y*5+math.random(1, 100)/50-0.5,
|
||||||
|
z=dir.z*5+math.random(1, 100)/50-0.5})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = 'mesecons_dispenser:dispenser',
|
||||||
|
recipe = {
|
||||||
|
{"default:cobble", "default:cobble", "default:cobble"},
|
||||||
|
{"default:cobble", "mesecons_materials:fiber", "default:cobble"},
|
||||||
|
{"default:cobble", "group:mesecon_conductor_craftable", "default:cobble"},
|
||||||
|
}
|
||||||
|
})
|
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,124 +1,35 @@
|
|||||||
for x=-1, 1 do for z=-1, 1 do
|
-- CODE NOT ACTIVE
|
||||||
rules = {}
|
|
||||||
nodename = "mesecons_extrawires:crossing"
|
|
||||||
if x == -1 then
|
|
||||||
nodename = nodename .. "A"
|
|
||||||
table.insert(rules, {x=-1, y=0, z=0})
|
|
||||||
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, {
|
|
||||||
drawtype = "nodebox",
|
|
||||||
description = description,
|
|
||||||
tiles = {
|
|
||||||
"jeija_insulated_wire_sides.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 },
|
|
||||||
},
|
|
||||||
node_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {
|
|
||||||
{ -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
|
|
||||||
{ -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 },
|
|
||||||
{ -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 },
|
|
||||||
{ -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 },
|
|
||||||
{ -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 },
|
|
||||||
{ -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
groups = groups,
|
|
||||||
drop = drop,
|
|
||||||
})
|
|
||||||
end end
|
|
||||||
|
|
||||||
function receptor_set(pos, rules, on)
|
local crossing_get_rules = function(node)
|
||||||
if on then
|
--TODO: calculate the real port states and use rules to link to them only if
|
||||||
mesecon:receptor_on(pos, rules)
|
|
||||||
else
|
|
||||||
mesecon:receptor_off(pos, rules)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function update_plus(pos, name)
|
minetest.register_node("mesecons_extrawires:crossing_on", {
|
||||||
vL = {
|
drawtype = "nodebox",
|
||||||
a = string.find(name, "A")~=nil,
|
tiles = {"jeija_insulated_wire_sides_on.png"},
|
||||||
b = string.find(name, "B")~=nil,
|
paramtype = "light",
|
||||||
c = string.find(name, "C")~=nil,
|
walkable = false,
|
||||||
d = string.find(name, "D")~=nil,
|
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}},
|
||||||
rL = yc_get_real_portstates(pos)
|
node_box = {
|
||||||
L = {
|
type = "fixed",
|
||||||
a = rL.c and not vL.c,
|
fixed = {
|
||||||
b = rL.d and not vL.d,
|
{ -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 },
|
||||||
c = rL.a and not vL.a,
|
{ -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 },
|
||||||
d = rL.b and not vL.b,
|
{ -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 },
|
||||||
}
|
{ -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 },
|
||||||
newname = "mesecons_extrawires:crossing"
|
{ -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 },
|
||||||
if L.a then newname = newname .. "A" end
|
{ -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
|
||||||
if L.b then newname = newname .. "B" end
|
},
|
||||||
if L.c then newname = newname .. "C" end
|
},
|
||||||
if L.d then newname = newname .. "D" end
|
groups = {dig_immediate=3, mesecon=3, mesecon_conductor_craftable=1, not_in_creative_inventory=1},
|
||||||
if newname ~= name then
|
mesecons = {
|
||||||
minetest.env:add_node(pos, {name = newname})
|
receptor = {
|
||||||
end
|
state = mesecon.state.on,
|
||||||
if L.a ~= vL.a then
|
rules = crossing_get_rules,
|
||||||
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({
|
minetest.register_craft({
|
||||||
type = "shapeless",
|
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").."/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 },
|
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", {
|
minetest.register_node("mesecons_extrawires:tjunction_on", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {
|
tiles = {
|
||||||
"jeija_insulated_wire_sides.png",
|
"jeija_insulated_wire_tjunction_tb_on.png",
|
||||||
"jeija_insulated_wire_sides.png",
|
"jeija_insulated_wire_tjunction_tb_on.png^[transformR180",
|
||||||
"jeija_insulated_wire_ends_on.png",
|
"jeija_insulated_wire_ends_on.png",
|
||||||
"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"
|
"jeija_insulated_wire_ends_on.png"
|
||||||
},
|
},
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
@ -25,20 +38,25 @@ minetest.register_node("mesecons_extrawires:tjunction_on", {
|
|||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
selection_box = tjunction_selectionbox,
|
selection_box = tjunction_selectionbox,
|
||||||
node_box = tjunction_nodebox,
|
node_box = tjunction_nodebox,
|
||||||
groups = {dig_immediate = 3, mesecon = 3, mesecon_conductor_craftable=1, not_in_creative_inventory = 1},
|
groups = {dig_immediate = 3, mesecon_conductor_craftable=1, not_in_creative_inventory = 1},
|
||||||
drop = "mesecons_insulated:insulated_off",
|
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", {
|
minetest.register_node("mesecons_extrawires:tjunction_off", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
description = "T-junction",
|
description = "T-junction",
|
||||||
tiles = {
|
tiles = {
|
||||||
"jeija_insulated_wire_sides.png",
|
"jeija_insulated_wire_tjunction_tb_off.png",
|
||||||
"jeija_insulated_wire_sides.png",
|
"jeija_insulated_wire_tjunction_tb_off.png^[transformR180",
|
||||||
"jeija_insulated_wire_ends_off.png",
|
"jeija_insulated_wire_ends_off.png",
|
||||||
"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"
|
"jeija_insulated_wire_ends_off.png"
|
||||||
},
|
},
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
@ -47,39 +65,20 @@ minetest.register_node("mesecons_extrawires:tjunction_off", {
|
|||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
selection_box = tjunction_selectionbox,
|
selection_box = tjunction_selectionbox,
|
||||||
node_box = tjunction_nodebox,
|
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({
|
minetest.register_craft({
|
||||||
output = '"mesecons_extrawires:tjunction_off" 3',
|
output = "mesecons_extrawires:tjunction_off 3",
|
||||||
recipe = {
|
recipe = {
|
||||||
{"", "", ""},
|
{"", "", ""},
|
||||||
{"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"},
|
{"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"},
|
||||||
{"", "mesecons_insulated:insulated_off", ""},
|
{"", "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","wires_full_on.png","wires_vertical_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","wires_full_off.png","wires_vertical_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","wires_full_on.png","wires_vertical_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","wires_full_off.png","wires_vertical_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 = {
|
function gate_rotate_rules(node)
|
||||||
{x=1, y=0, z=0},
|
for rotations = 0, node.param2 - 1 do
|
||||||
}
|
|
||||||
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
|
|
||||||
rules = mesecon:rotate_rules_left(rules)
|
rules = mesecon:rotate_rules_left(rules)
|
||||||
end
|
end
|
||||||
return rules
|
return rules
|
||||||
end
|
end
|
||||||
|
|
||||||
function get_gate_rules_one(param2) return get_gate_rules(param2, false, true) end
|
function gate_get_output_rules(node)
|
||||||
function get_gate_rules_two(param2) return get_gate_rules(param2, false, false) end
|
rules = {{x=1, y=0, z=0}}
|
||||||
function get_gate_rules_out(param2) return get_gate_rules(param2, true) end
|
return gate_rotate_rules(node)
|
||||||
gates = {"diode", "not", "nand", "and", "xor"}
|
end
|
||||||
for g in ipairs(gates) do gate = gates[g]
|
|
||||||
if g < 3 then
|
function gate_get_input_rules_oneinput(node)
|
||||||
get_rules = get_gate_rules_one
|
rules = {{x=-1, y=0, z=0}, {x=1, y=0, z=0}}
|
||||||
else
|
return gate_rotate_rules(node)
|
||||||
get_rules = get_gate_rules_two
|
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
|
||||||
for on=0,1 do
|
end
|
||||||
nodename = "mesecons_gates:"..gate
|
|
||||||
|
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
|
||||||
|
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.name
|
||||||
if on == 1 then
|
if on == 1 then
|
||||||
onoff = "on"
|
onoff = "on"
|
||||||
drop = nodename.."_off"
|
drop = nodename.."_off"
|
||||||
nodename = nodename.."_"..onoff
|
nodename = nodename.."_"..onoff
|
||||||
description = "You hacker you!"
|
description = "You hacker you!"
|
||||||
groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon = 3}
|
groups = {dig_immediate=2, not_in_creative_inventory=1}
|
||||||
mesecon:add_receptor_node(nodename, get_rules, get_gate_rules_out)
|
|
||||||
--mesecon:add_receptor_node(nodename, mesecon:get_rules("insulated_all"))
|
|
||||||
else
|
else
|
||||||
onoff = "off"
|
onoff = "off"
|
||||||
|
drop = nil
|
||||||
nodename = nodename.."_"..onoff
|
nodename = nodename.."_"..onoff
|
||||||
description = gate.." Gate"
|
description = gate.name.." Gate"
|
||||||
groups = {dig_immediate=2, mesecon = 3}
|
groups = {dig_immediate=2}
|
||||||
--mesecon:add_receptor_node_off(nodename, get_gate_rules_out)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
tiles = "jeija_microcontroller_bottom.png^"..
|
tiles = "jeija_microcontroller_bottom.png^"..
|
||||||
"jeija_gate_"..onoff..".png^"..
|
"jeija_gate_"..onoff..".png^"..
|
||||||
"jeija_gate_"..gate..".png"
|
"jeija_gate_"..gate.name..".png"
|
||||||
|
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "fixed",
|
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, {
|
minetest.register_node(nodename, {
|
||||||
description = description,
|
description = description,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
@ -82,103 +156,25 @@ for g in ipairs(gates) do gate = gates[g]
|
|||||||
end,
|
end,
|
||||||
groups = groups,
|
groups = groups,
|
||||||
drop = drop,
|
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
|
||||||
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({
|
minetest.register_craft({
|
||||||
output = 'mesecons_gates:diode_off',
|
output = 'mesecons_gates:diode_off',
|
||||||
recipe = {
|
recipe = {
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
-- HYDRO_TURBINE
|
-- HYDRO_TURBINE
|
||||||
|
-- Water turbine:
|
||||||
|
-- Active if flowing >water< above it
|
||||||
|
-- (does not work with other liquids)
|
||||||
|
|
||||||
minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
|
minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {"jeija_hydro_turbine_off.png"},
|
tiles = {"jeija_hydro_turbine_off.png"},
|
||||||
groups = {dig_immediate=2, mesecon = 2},
|
groups = {dig_immediate=2},
|
||||||
description="Water Turbine",
|
description="Water Turbine",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
selection_box = {
|
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.45, 1.15, -0.1, 0.45, 1.45, 0.1},
|
||||||
{-0.1, 1.15, -0.45, 0.1, 1.45, 0.45}},
|
{-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", {
|
minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {"jeija_hydro_turbine_on.png"},
|
tiles = {"jeija_hydro_turbine_on.png"},
|
||||||
drop = '"mesecons_hydroturbine:hydro_turbine_off" 1',
|
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",
|
description="Water Turbine",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
selection_box = {
|
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.5, 1.15, -0.1, 0.5, 1.45, 0.1},
|
||||||
{-0.1, 1.15, -0.5, 0.1, 1.45, 0.5}},
|
{-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,15 +85,12 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_on"},
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
mesecon:add_receptor_node("mesecons_hydroturbine:hydro_turbine_on")
|
|
||||||
mesecon:add_receptor_node_off("mesecons_hydroturbine:hydro_turbine_off")
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = '"mesecons_hydroturbine:hydro_turbine_off" 2',
|
output = "mesecons_hydroturbine:hydro_turbine_off 2",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'','"default:stick"', ''},
|
{"","default:stick", ""},
|
||||||
{'"default:stick"', '"default:steel_ingot"', '"default:stick"'},
|
{"default:stick", "default:steel_ingot", "default:stick"},
|
||||||
{'','"default:stick"', ''},
|
{"","default:stick", ""},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -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", {
|
minetest.register_node("mesecons_insulated:insulated_on", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
description = "insulated mesecons",
|
description = "Insulated Mesecon",
|
||||||
tiles = {
|
tiles = {
|
||||||
"jeija_insulated_wire_sides.png",
|
"jeija_insulated_wire_sides_on.png",
|
||||||
"jeija_insulated_wire_sides.png",
|
"jeija_insulated_wire_sides_on.png",
|
||||||
"jeija_insulated_wire_ends_on.png",
|
"jeija_insulated_wire_ends_on.png",
|
||||||
"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_sides.png"
|
"jeija_insulated_wire_sides_on.png"
|
||||||
},
|
},
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
@ -21,21 +30,25 @@ minetest.register_node("mesecons_insulated:insulated_on", {
|
|||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }
|
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",
|
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", {
|
minetest.register_node("mesecons_insulated:insulated_off", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
description = "insulated mesecons",
|
description = "insulated mesecons",
|
||||||
tiles = {
|
tiles = {
|
||||||
"jeija_insulated_wire_sides.png",
|
"jeija_insulated_wire_sides_off.png",
|
||||||
"jeija_insulated_wire_sides.png",
|
"jeija_insulated_wire_sides_off.png",
|
||||||
"jeija_insulated_wire_ends_off.png",
|
"jeija_insulated_wire_ends_off.png",
|
||||||
"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_sides.png"
|
"jeija_insulated_wire_sides_off.png"
|
||||||
},
|
},
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
@ -49,11 +62,16 @@ minetest.register_node("mesecons_insulated:insulated_off", {
|
|||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }
|
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({
|
minetest.register_craft({
|
||||||
output = '"mesecons_insulated:insulated_off" 3',
|
output = "mesecons_insulated:insulated_off 3",
|
||||||
recipe = {
|
recipe = {
|
||||||
{"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"},
|
{"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"},
|
||||||
{"mesecons:wire_00000000_off", "mesecons:wire_00000000_off", "mesecons:wire_00000000_off"},
|
{"mesecons:wire_00000000_off", "mesecons:wire_00000000_off", "mesecons:wire_00000000_off"},
|
||||||
@ -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", {
|
mesecon:add_rules("insulated", {
|
||||||
{x = 1, y = 0, z = 0},
|
{x = 1, y = 0, z = 0},
|
||||||
{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)
|
|
||||||
|
@ -1,4 +1,14 @@
|
|||||||
-- MESELAMPS
|
-- 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", {
|
minetest.register_node("mesecons_lamp:lamp_on", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {"jeija_meselamp_on.png"},
|
tiles = {"jeija_meselamp_on.png"},
|
||||||
@ -8,20 +18,16 @@ minetest.register_node("mesecons_lamp:lamp_on", {
|
|||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
walkable = true,
|
walkable = true,
|
||||||
light_source = LIGHT_MAX,
|
light_source = LIGHT_MAX,
|
||||||
node_box = {
|
node_box = mesecon_lamp_box,
|
||||||
type = "wallmounted",
|
selection_box = mesecon_lamp_box,
|
||||||
wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
|
groups = {dig_immediate=3,not_in_creative_inventory=1, mesecon_effector_on = 1},
|
||||||
wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125},
|
drop="mesecons_lamp:lamp_off 1",
|
||||||
wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
|
sounds = default.node_sound_glass_defaults(),
|
||||||
},
|
mesecons = {effector = {
|
||||||
selection_box = {
|
action_off = function (pos, node)
|
||||||
type = "wallmounted",
|
mesecon:swap_node(pos, "mesecons_lamp:lamp_off")
|
||||||
wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
|
end
|
||||||
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},
|
|
||||||
drop='"mesecons_lamp:lamp_off" 1',
|
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_node("mesecons_lamp:lamp_off", {
|
minetest.register_node("mesecons_lamp:lamp_off", {
|
||||||
@ -33,43 +39,23 @@ minetest.register_node("mesecons_lamp:lamp_off", {
|
|||||||
paramtype2 = "wallmounted",
|
paramtype2 = "wallmounted",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
walkable = true,
|
walkable = true,
|
||||||
node_box = {
|
node_box = mesecon_lamp_box,
|
||||||
type = "wallmounted",
|
selection_box = mesecon_lamp_box,
|
||||||
wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125},
|
groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1},
|
||||||
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},
|
|
||||||
description="Meselamp",
|
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({
|
minetest.register_craft({
|
||||||
output = '"mesecons_lamp:lamp_off" 1',
|
output = "mesecons_lamp:lamp_off 1",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'', '"default:glass"', ''},
|
{"", "default:glass", ""},
|
||||||
{'"group:mesecon_conductor_craftable"', '"default:steel_ingot"', '"group:mesecon_conductor_craftable"'},
|
{"group:mesecon_conductor_craftable", "default:steel_ingot", "group:mesecon_conductor_craftable"},
|
||||||
{'', '"default:glass"', ''},
|
{"", "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")
|
|
||||||
|
@ -1,44 +1,42 @@
|
|||||||
function mesecon:lightstone_add(name, base_item, texture_off, texture_on)
|
function mesecon:lightstone_add(name, base_item, texture_off, texture_on)
|
||||||
minetest.register_node("mesecons_lightstone:lightstone_" .. name .. "_off", {
|
minetest.register_node("mesecons_lightstone:lightstone_" .. name .. "_off", {
|
||||||
tiles = {texture_off},
|
tiles = {texture_off},
|
||||||
inventory_image = minetest.inventorycube(texture_off),
|
groups = {cracky=2, mesecon_effector_off = 1, mesecon = 2},
|
||||||
groups = {cracky=2, mesecon_effector_off = 1, mesecon = 2},
|
description=name.." Lightstone",
|
||||||
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", {
|
minetest.register_node("mesecons_lightstone:lightstone_" .. name .. "_on", {
|
||||||
tiles = {texture_on},
|
tiles = {texture_on},
|
||||||
inventory_image = minetest.inventorycube(texture_on),
|
groups = {cracky=2,not_in_creative_inventory=1, mesecon = 2},
|
||||||
groups = {cracky=2,not_in_creative_inventory=1, mesecon = 2},
|
drop = "mesecons_lightstone:lightstone_" .. name .. "_off",
|
||||||
drop = "node mesecons_lightstone:lightstone_" .. name .. "_off 1",
|
light_source = LIGHT_MAX-2,
|
||||||
light_source = LIGHT_MAX-2,
|
sounds = default.node_sound_stone_defaults(),
|
||||||
description=name.." Lightstone",
|
mesecons = {effector = {
|
||||||
})
|
action_off = function (pos, node)
|
||||||
assert(loadstring('mesecon:register_on_signal_on(function(pos, node) \n \
|
mesecon:swap_node(pos, "mesecons_lightstone:lightstone_" .. name .. "_off")
|
||||||
if node.name == "mesecons_lightstone:lightstone_' .. name .. '_off" then \n \
|
end
|
||||||
minetest.env:add_node(pos, {name="mesecons_lightstone:lightstone_' .. name .. '_on"}) \n \
|
}}
|
||||||
nodeupdate(pos) \n \
|
})
|
||||||
end \n \
|
|
||||||
end)'))()
|
minetest.register_craft({
|
||||||
assert(loadstring('mesecon:register_on_signal_off(function(pos, node) \n \
|
output = "mesecons_lightstone:lightstone_" .. name .. "_off",
|
||||||
if node.name == "mesecons_lightstone:lightstone_' .. name .. '_on" then \n \
|
recipe = {
|
||||||
minetest.env:add_node(pos, {name="mesecons_lightstone:lightstone_' .. name .. '_off"}) \n \
|
{"",base_item,""},
|
||||||
nodeupdate(pos) \n \
|
{base_item,"default:torch",base_item},
|
||||||
end \n \
|
{"","group:mesecon_conductor_craftable",""}
|
||||||
end)'))()
|
}
|
||||||
minetest.register_craft({
|
})
|
||||||
output = "node mesecons_lightstone:lightstone_" .. name .. "_off 1",
|
|
||||||
recipe = {
|
|
||||||
{'',base_item,''},
|
|
||||||
{base_item,'default:torch',base_item},
|
|
||||||
{'','group:mesecon_conductor_craftable',''},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
mesecon:register_effector("mesecons_lightstone:lightstone_" .. name .. "_on", "mesecons_lightstone:lightstone_" .. name .. "_off")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
mesecon:lightstone_add("red", "craft default:clay_brick 1", "jeija_lightstone_red_off.png", "jeija_lightstone_red_on.png")
|
mesecon:lightstone_add("red", "default:clay_brick", "jeija_lightstone_red_off.png", "jeija_lightstone_red_on.png")
|
||||||
mesecon:lightstone_add("green", "node default:cactus 1", "jeija_lightstone_green_off.png", "jeija_lightstone_green_on.png")
|
mesecon:lightstone_add("green", "default:cactus", "jeija_lightstone_green_off.png", "jeija_lightstone_green_on.png")
|
||||||
mesecon:lightstone_add("blue", "node mesecons_materials:fiber 1", "jeija_lightstone_blue_off.png", "jeija_lightstone_blue_on.png")
|
mesecon:lightstone_add("blue", "mesecons_materials:fiber", "jeija_lightstone_blue_off.png", "jeija_lightstone_blue_on.png")
|
||||||
mesecon:lightstone_add("gray", "node default:cobble 1", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png")
|
mesecon:lightstone_add("gray", "default:cobble", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png")
|
||||||
mesecon:lightstone_add("darkgray", "node default:gravel 1", "jeija_lightstone_darkgray_off.png", "jeija_lightstone_darkgray_on.png")
|
mesecon:lightstone_add("darkgray", "default:gravel", "jeija_lightstone_darkgray_off.png", "jeija_lightstone_darkgray_on.png")
|
||||||
|
mesecon:lightstone_add("yellow", "default:mese_crystal_fragment", "jeija_lightstone_yellow_off.png", "jeija_lightstone_yellow_on.png")
|
||||||
|
1
mesecons_luacontroller/depends.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
mesecons
|
534
mesecons_luacontroller/init.lua
Normal file
@ -0,0 +1,534 @@
|
|||||||
|
-- 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, rule, state): 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)
|
||||||
|
local overwrite = overwrite or {}
|
||||||
|
local d = ports.d and 1 or 0
|
||||||
|
local c = ports.c and 1 or 0
|
||||||
|
local b = ports.b and 1 or 0
|
||||||
|
local a = ports.a and 1 or 0
|
||||||
|
return BASENAME..d..c..b..a
|
||||||
|
end
|
||||||
|
|
||||||
|
local setport = function (pos, rule, state)
|
||||||
|
if state then
|
||||||
|
mesecon:receptor_on(pos, {rule})
|
||||||
|
else
|
||||||
|
mesecon:receptor_off(pos, {rule})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local action = function (pos, ports)
|
||||||
|
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 = {}
|
||||||
|
|
||||||
|
mesecon:swap_node(pos, newname)
|
||||||
|
|
||||||
|
if ports.a ~= vports.a then setport(pos, rules.a, ports.a) end
|
||||||
|
if ports.b ~= vports.b then setport(pos, rules.b, ports.b) end
|
||||||
|
if ports.c ~= vports.c then setport(pos, rules.c, ports.c) end
|
||||||
|
if ports.d ~= vports.d then setport(pos, rules.d, ports.d) end
|
||||||
|
end
|
||||||
|
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 {}
|
||||||
|
local found = false
|
||||||
|
for _, i in ipairs(interrupts) do
|
||||||
|
if minetest.serialize(i) == minetest.serialize(iid) then
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not found then
|
||||||
|
table.insert(interrupts, iid)
|
||||||
|
meta:set_string("lc_interrupts", minetest.serialize(interrupts))
|
||||||
|
end
|
||||||
|
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
|
||||||
|
mesecon:swap_node(pos, BASENAME.."_burnt")
|
||||||
|
minetest.env:get_meta(pos):set_string("lc_interrupts", "")
|
||||||
|
minetest.after(0.2, overheat_off, pos) -- wait for pending operations
|
||||||
|
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, action, pos, 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, 1 do -- 0 = off; 1 = on
|
||||||
|
for b = 0, 1 do
|
||||||
|
for c = 0, 1 do
|
||||||
|
for d = 0, 1 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
|
||||||
|
|
||||||
|
--overheated luacontroller
|
||||||
|
minetest.register_node(BASENAME .. "_burnt", {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {
|
||||||
|
"jeija_luacontroller_burnt_top.png",
|
||||||
|
"jeija_microcontroller_bottom.png",
|
||||||
|
"jeija_microcontroller_sides.png",
|
||||||
|
"jeija_microcontroller_sides.png",
|
||||||
|
"jeija_microcontroller_sides.png",
|
||||||
|
"jeija_microcontroller_sides.png"
|
||||||
|
},
|
||||||
|
inventory_image = "jeija_luacontroller_burnt_top.png",
|
||||||
|
paramtype = "light",
|
||||||
|
groups = {dig_immediate=2, not_in_creative_inventory=1},
|
||||||
|
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(),
|
||||||
|
is_luacontroller = true,
|
||||||
|
virtual_portstates = {a = false, b = false, c = false, d = false},
|
||||||
|
})
|
||||||
|
|
||||||
|
------------------------
|
||||||
|
-- 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', ''},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
@ -12,14 +12,14 @@ minetest.register_craftitem("mesecons_materials:fiber", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = '"mesecons_materials:glue" 2',
|
output = "mesecons_materials:glue 2",
|
||||||
type = "cooking",
|
type = "cooking",
|
||||||
recipe = "default:sapling",
|
recipe = "default:sapling",
|
||||||
cooktime = 2
|
cooktime = 2
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = '"mesecons_materials:fiber" 6',
|
output = "mesecons_materials:fiber 6",
|
||||||
type = "cooking",
|
type = "cooking",
|
||||||
recipe = "mesecons_materials:glue",
|
recipe = "mesecons_materials:glue",
|
||||||
cooktime = 4
|
cooktime = 4
|
||||||
@ -33,9 +33,9 @@ minetest.register_craftitem("mesecons_materials:silicon", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = '"mesecons_materials:silicon" 4',
|
output = "mesecons_materials:silicon 4",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'"default:sand"', '"default:sand"'},
|
{"default:sand", "default:sand"},
|
||||||
{'"default:sand"', '"default:steel_ingot"'},
|
{"default:sand", "default:steel_ingot"},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -23,6 +23,33 @@ if tostring(d)..tostring(c)..tostring(b)..tostring(a) ~= "0000" then
|
|||||||
else
|
else
|
||||||
groups = {dig_immediate=2, mesecon = 3}
|
groups = {dig_immediate=2, mesecon = 3}
|
||||||
end
|
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, {
|
minetest.register_node(nodename, {
|
||||||
description = "Microcontroller",
|
description = "Microcontroller",
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
@ -39,7 +66,7 @@ minetest.register_node(nodename, {
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
walkable = true,
|
walkable = true,
|
||||||
groups = groups,
|
groups = groups,
|
||||||
drop = '"mesecons_microcontroller:microcontroller0000" 1',
|
drop = "mesecons_microcontroller:microcontroller0000 1",
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 },
|
fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 },
|
||||||
@ -101,25 +128,13 @@ minetest.register_node(nodename, {
|
|||||||
yc_reset (pos)
|
yc_reset (pos)
|
||||||
update_yc(pos)
|
update_yc(pos)
|
||||||
end,
|
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
|
end
|
||||||
end
|
end
|
||||||
@ -570,14 +585,12 @@ end
|
|||||||
--Real I/O functions
|
--Real I/O functions
|
||||||
function yc_action(pos, L) --L-->Lvirtual
|
function yc_action(pos, L) --L-->Lvirtual
|
||||||
local Lv = yc_get_virtual_portstates(pos)
|
local Lv = yc_get_virtual_portstates(pos)
|
||||||
local metatable = minetest.env:get_meta(pos):to_table()
|
|
||||||
local name = "mesecons_microcontroller:microcontroller"
|
local name = "mesecons_microcontroller:microcontroller"
|
||||||
..tonumber(L.d and 1 or 0)
|
..tonumber(L.d and 1 or 0)
|
||||||
..tonumber(L.c and 1 or 0)
|
..tonumber(L.c and 1 or 0)
|
||||||
..tonumber(L.b and 1 or 0)
|
..tonumber(L.b and 1 or 0)
|
||||||
..tonumber(L.a and 1 or 0)
|
..tonumber(L.a and 1 or 0)
|
||||||
minetest.env:add_node(pos, {name=name})
|
mesecon:swap_node(pos, name)
|
||||||
minetest.env:get_meta(pos):from_table(metatable)
|
|
||||||
|
|
||||||
yc_action_setports(pos, L, Lv)
|
yc_action_setports(pos, L, Lv)
|
||||||
end
|
end
|
||||||
@ -616,7 +629,7 @@ function yc_set_portstate(port, state, L)
|
|||||||
return L
|
return L
|
||||||
end
|
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")
|
rulesA = mesecon:get_rules("mesecons_microcontroller:microcontroller0001")
|
||||||
rulesB = mesecon:get_rules("mesecons_microcontroller:microcontroller0010")
|
rulesB = mesecon:get_rules("mesecons_microcontroller:microcontroller0010")
|
||||||
rulesC = mesecon:get_rules("mesecons_microcontroller:microcontroller0100")
|
rulesC = mesecon:get_rules("mesecons_microcontroller:microcontroller0100")
|
||||||
@ -630,7 +643,7 @@ function yc_get_real_portstates(pos)
|
|||||||
return L
|
return L
|
||||||
end
|
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
|
name = minetest.env:get_node(pos).name
|
||||||
b, a = string.find(name, ":microcontroller")
|
b, a = string.find(name, ":microcontroller")
|
||||||
if a == nil then return nil end
|
if a == nil then return nil end
|
||||||
@ -682,16 +695,3 @@ function yc_overheat_off(pos)
|
|||||||
rules = mesecon:get_rules("mesecons_microcontroller:microcontroller1111")
|
rules = mesecon:get_rules("mesecons_microcontroller:microcontroller1111")
|
||||||
mesecon:receptor_off(pos, rules)
|
mesecon:receptor_off(pos, rules)
|
||||||
end
|
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,33 +1,53 @@
|
|||||||
-- MOVESTONE
|
-- 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)
|
function mesecon:get_movestone_direction(pos)
|
||||||
getactivated=0
|
getactivated = 0
|
||||||
local lpos
|
local lpos
|
||||||
local getactivated=0
|
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}
|
lpos = {x=pos.x+1, y=pos.y, z=pos.z}
|
||||||
for n=1, 3 do
|
for n = 1, 3 do
|
||||||
if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then
|
if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then
|
||||||
return {x=0, y=0, z=-1}
|
return {x=0, y=0, z=-1}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
lpos={x=pos.x-1, y=pos.y, z=pos.z}
|
lpos = {x = pos.x-1, y = pos.y, z = pos.z}
|
||||||
for n=4, 6 do
|
for n=4, 6 do
|
||||||
if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then
|
if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then
|
||||||
return {x=0, y=0, z=1}
|
return {x=0, y=0, z=1}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
lpos={x=pos.x, y=pos.y, z=pos.z+1}
|
lpos = {x = pos.x, y = pos.y, z = pos.z+1}
|
||||||
for n=7, 9 do
|
for n=7, 9 do
|
||||||
if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then
|
if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then
|
||||||
return {x=-1, y=0, z=0}
|
return {x=-1, y=0, z=0}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
lpos={x=pos.x, y=pos.y, z=pos.z-1}
|
lpos = {x = pos.x, y = pos.y, z = pos.z-1}
|
||||||
for n=10, 12 do
|
for n=10, 12 do
|
||||||
if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then
|
if mesecon:is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then
|
||||||
return {x=1, y=0, z=0}
|
return {x=1, y=0, z=0}
|
||||||
@ -41,19 +61,25 @@ minetest.register_node("mesecons_movestones:movestone", {
|
|||||||
legacy_facedir_simple = true,
|
legacy_facedir_simple = true,
|
||||||
groups = {cracky=3},
|
groups = {cracky=3},
|
||||||
description="Movestone",
|
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", {
|
minetest.register_entity("mesecons_movestones:movestone_entity", {
|
||||||
physical = false,
|
physical = false,
|
||||||
visual = "sprite",
|
visual = "sprite",
|
||||||
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"},
|
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},
|
collisionbox = {-0.5,-0.5,-0.5, 0.5, 0.5, 0.5},
|
||||||
visual = "cube",
|
visual = "cube",
|
||||||
--on_activate = function(self, staticdata)
|
lastdir = {x=0, y=0, z=0},
|
||||||
--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)
|
on_punch = function(self, hitter)
|
||||||
self.object:remove()
|
self.object:remove()
|
||||||
@ -62,51 +88,45 @@ minetest.register_entity("mesecons_movestones:movestone_entity", {
|
|||||||
|
|
||||||
on_step = function(self, dtime)
|
on_step = function(self, dtime)
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
local direction=mesecon:get_movestone_direction(pos)
|
pos.x, pos.y, pos.z = math.floor(pos.x+0.5), math.floor(pos.y+0.5), math.floor(pos.z+0.5)
|
||||||
|
local direction = mesecon:get_movestone_direction(pos)
|
||||||
|
|
||||||
if not direction then
|
if not direction then -- no mesecon power
|
||||||
|
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, self.lastdir, MOVESTONE_MAXIMUM_PUSH)
|
||||||
|
end
|
||||||
minetest.env:add_node(pos, {name="mesecons_movestones:movestone"})
|
minetest.env:add_node(pos, {name="mesecons_movestones:movestone"})
|
||||||
self.object:remove()
|
self.object:remove()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
self.object:setvelocity({x=direction.x*3, y=direction.y*3, z=direction.z*3})
|
local success, stack, oldstack =
|
||||||
|
mesecon:mvps_push(pos, direction, MOVESTONE_MAXIMUM_PUSH)
|
||||||
|
if not success then -- Too large stack/stopper in the way
|
||||||
|
minetest.env:add_node(pos, {name="mesecons_movestones:movestone"})
|
||||||
|
self.object:remove()
|
||||||
|
return
|
||||||
|
else
|
||||||
|
mesecon:mvps_process_stack (stack)
|
||||||
|
mesecon:mvps_move_objects (pos, direction, oldstack)
|
||||||
|
self.lastdir = direction
|
||||||
|
end
|
||||||
|
|
||||||
mesecon:mvps_push(pos, direction)
|
self.object:setvelocity({x=direction.x*2, y=direction.y*2, z=direction.z*2})
|
||||||
end
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = '"mesecons_movestones:movestone" 2',
|
output = "mesecons_movestones:movestone 2",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'"default:stone"', '"default:stone"', '"default:stone"'},
|
{"default:stone", "default:stone", "default:stone"},
|
||||||
{'"group:mesecon_conductor_craftable"', '"group:mesecon_conductor_craftable"', '"group:mesecon_conductor_craftable"'},
|
{"group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable"},
|
||||||
{'"default:stone"', '"default:stone"', '"default:stone"'},
|
{"default:stone", "default:stone", "default:stone"},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
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
|
-- STICKY_MOVESTONE
|
||||||
@ -118,13 +138,22 @@ minetest.register_node("mesecons_movestones:sticky_movestone", {
|
|||||||
legacy_facedir_simple = true,
|
legacy_facedir_simple = true,
|
||||||
groups = {cracky=3},
|
groups = {cracky=3},
|
||||||
description="Sticky Movestone",
|
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({
|
minetest.register_craft({
|
||||||
output = '"mesecons_movestones:sticky_movestone" 2',
|
output = "mesecons_movestones:sticky_movestone 2",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'"mesecons_materials:glue"', '"mesecons_movestones:movestone"', '"mesecons_materials:glue"'},
|
{"mesecons_materials:glue", "mesecons_movestones:movestone", "mesecons_materials:glue"},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -132,8 +161,9 @@ minetest.register_entity("mesecons_movestones:sticky_movestone_entity", {
|
|||||||
physical = false,
|
physical = false,
|
||||||
visual = "sprite",
|
visual = "sprite",
|
||||||
textures = {"jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_sticky_movestone.png", "jeija_sticky_movestone.png"},
|
textures = {"jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_sticky_movestone.png", "jeija_sticky_movestone.png"},
|
||||||
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
|
collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
|
||||||
visual = "cube",
|
visual = "cube",
|
||||||
|
lastdir = {x=0, y=0, z=0},
|
||||||
|
|
||||||
on_punch = function(self, hitter)
|
on_punch = function(self, hitter)
|
||||||
self.object:remove()
|
self.object:remove()
|
||||||
@ -142,66 +172,41 @@ minetest.register_entity("mesecons_movestones:sticky_movestone_entity", {
|
|||||||
|
|
||||||
on_step = function(self, dtime)
|
on_step = function(self, dtime)
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
local colp = pos
|
pos.x, pos.y, pos.z = math.floor(pos.x+0.5), math.floor(pos.y+0.5), math.floor(pos.z+0.5)
|
||||||
local direction=mesecon:get_movestone_direction(colp)
|
local direction = mesecon:get_movestone_direction(pos)
|
||||||
|
|
||||||
if not direction then
|
if not direction then -- no mesecon power
|
||||||
--or (minetest.env:get_node_or_nil(pos).name ~="air"
|
local name = minetest.env:get_node(pos).name
|
||||||
--and minetest.env:get_node_or_nil(pos).name ~= nil) then
|
if name ~= "air" and name ~= "ignore"
|
||||||
|
and minetest.registered_nodes[name].liquidtype == "none" then
|
||||||
|
mesecon:mvps_push(pos, self.lastdir, MOVESTONE_MAXIMUM_PUSH)
|
||||||
|
--STICKY
|
||||||
|
mesecon:mvps_pull_all(pos, self.lastdir)
|
||||||
|
end
|
||||||
minetest.env:add_node(pos, {name="mesecons_movestones:sticky_movestone"})
|
minetest.env:add_node(pos, {name="mesecons_movestones:sticky_movestone"})
|
||||||
self.object:remove()
|
self.object:remove()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
self.object:setvelocity({x=direction.x*3, y=direction.y*3, z=direction.z*3})
|
local success, stack, oldstack =
|
||||||
|
mesecon:mvps_push(pos, direction, MOVESTONE_MAXIMUM_PUSH)
|
||||||
|
if not success then -- Too large stack/stopper in the way
|
||||||
|
minetest.env:add_node(pos, {name="mesecons_movestones:sticky_movestone"})
|
||||||
|
self.object:remove()
|
||||||
|
return
|
||||||
|
else
|
||||||
|
mesecon:mvps_process_stack (stack)
|
||||||
|
mesecon:mvps_move_objects (pos, direction, oldstack)
|
||||||
|
self.lastdir = direction
|
||||||
|
end
|
||||||
|
|
||||||
mesecon:mvps_push(pos, direction)
|
self.object:setvelocity({x=direction.x*2, y=direction.y*2, z=direction.z*2})
|
||||||
|
|
||||||
--STICKY
|
--STICKY
|
||||||
mesecon:mvps_pull_all(pos, direction)
|
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", {
|
mesecon:register_mvps_unmov("mesecons_movestones:movestone_entity")
|
||||||
{x=0, y=1, z=-1},
|
mesecon:register_mvps_unmov("mesecons_movestones:sticky_movestone_entity")
|
||||||
{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}})
|
|
||||||
|
@ -1,67 +1,189 @@
|
|||||||
--register stoppers for movestones/pistons
|
--register stoppers for movestones/pistons
|
||||||
|
|
||||||
mesecon.mvps_stoppers={}
|
mesecon.mvps_stoppers = {}
|
||||||
|
mesecon.mvps_unmov = {}
|
||||||
|
|
||||||
function mesecon:is_mvps_stopper(nodename)
|
function mesecon:is_mvps_stopper(node, pushdir, stack, stackid)
|
||||||
local i=1
|
local get_stopper = mesecon.mvps_stoppers[node.name]
|
||||||
repeat
|
if type (get_stopper) == "function" then
|
||||||
i=i+1
|
get_stopper = get_stopper(node, pushdir, stack, stackid)
|
||||||
if mesecon.mvps_stoppers[i]==nodename then return true end
|
end
|
||||||
until mesecon.mvps_stoppers[i]==nil
|
return get_stopper
|
||||||
return false
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:register_mvps_stopper(nodename)
|
function mesecon:register_mvps_stopper(nodename, get_stopper)
|
||||||
local i=1
|
if get_stopper == nil then
|
||||||
repeat
|
get_stopper = true
|
||||||
i=i+1
|
end
|
||||||
if mesecon.mvps_stoppers[i]==nil then break end
|
mesecon.mvps_stoppers[nodename] = get_stopper
|
||||||
until false
|
|
||||||
mesecon.mvps_stoppers[i]=nodename
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:mvps_push(pos, direction) -- pos: pos of mvps; direction: direction of push
|
-- Objects that cannot be moved (e.g. movestones)
|
||||||
pos.x=pos.x+direction.x
|
function mesecon:register_mvps_unmov(objectname)
|
||||||
pos.y=pos.y+direction.y
|
mesecon.mvps_unmov[objectname] = true;
|
||||||
pos.z=pos.z+direction.z
|
end
|
||||||
|
|
||||||
local lpos = {x=pos.x, y=pos.y, z=pos.z}
|
function mesecon:is_mvps_unmov(objectname)
|
||||||
local lnode = minetest.env:get_node(lpos)
|
return mesecon.mvps_unmov[objectname]
|
||||||
local newnode
|
end
|
||||||
minetest.env:remove_node(lpos)
|
|
||||||
while not(lnode.name == "ignore" or lnode.name == "air" or not(minetest.registered_nodes[lnode.name].liquidtype == "none")) do
|
function mesecon:mvps_process_stack(stack)
|
||||||
lpos.x=lpos.x+direction.x
|
-- update mesecons for placed nodes ( has to be done after all nodes have been added )
|
||||||
lpos.y=lpos.y+direction.y
|
for _, n in ipairs(stack) do
|
||||||
lpos.z=lpos.z+direction.z
|
nodeupdate(n.pos)
|
||||||
newnode = lnode
|
mesecon.on_placenode(n.pos, minetest.env:get_node(n.pos))
|
||||||
lnode = minetest.env:get_node(lpos)
|
mesecon:update_autoconnect(n.pos)
|
||||||
minetest.env:add_node(lpos, newnode)
|
end
|
||||||
nodeupdate(lpos)
|
end
|
||||||
|
|
||||||
|
function mesecon:mvps_get_stack(pos, dir, maximum)
|
||||||
|
-- determine the number of nodes to be pushed
|
||||||
|
local np = {x = pos.x, y = pos.y, z = pos.z}
|
||||||
|
local nodes = {}
|
||||||
|
while true do
|
||||||
|
local 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 nil
|
||||||
end
|
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
|
||||||
|
return nodes
|
||||||
|
end
|
||||||
|
|
||||||
|
function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: direction of push; maximum: maximum nodes to be pushed
|
||||||
|
local nodes = mesecon:mvps_get_stack(pos, dir, maximum)
|
||||||
|
|
||||||
|
if not nodes then return 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
|
||||||
|
|
||||||
|
local oldstack = mesecon:tablecopy(nodes)
|
||||||
|
for i in ipairs(nodes) do
|
||||||
|
nodes[i].pos = mesecon:addPosRule(nodes[i].pos, dir)
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, n in ipairs(nodes) do
|
||||||
|
mesecon.on_placenode(n.pos, n.node)
|
||||||
|
mesecon:update_autoconnect(n.pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
return true, nodes, oldstack
|
||||||
|
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)
|
||||||
|
mesecon:update_autoconnect(pos)
|
||||||
|
mesecon.on_placenode(pos, nn)
|
||||||
|
end
|
||||||
|
return {{pos = np, node = {param2 = 0, name = "air"}}, {pos = pos, node = nn}}
|
||||||
end
|
end
|
||||||
|
|
||||||
function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: direction of pull
|
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 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)
|
local lnode = minetest.env:get_node(lpos)
|
||||||
local lpos2 = {x=pos.x-direction.x*2, y=pos.y-direction.y*2, z=pos.z-direction.z*2} -- 2 away
|
local lpos2 = {x=pos.x-direction.x*2, y=pos.y-direction.y*2, z=pos.z-direction.z*2} -- 2 away
|
||||||
local lnode2 = minetest.env:get_node(lpos2)
|
local lnode2 = minetest.env:get_node(lpos2)
|
||||||
|
|
||||||
if lnode.name ~= "ignore" and lnode.name ~= "air" and minetest.registered_nodes[lnode.name].liquidtype == "none" then return end
|
if lnode.name ~= "ignore" and lnode.name ~= "air" and minetest.registered_nodes[lnode.name].liquidtype == "none" then return end
|
||||||
if lnode2.name == "ignore" or lnode2.name == "air" or not(minetest.registered_nodes[lnode2.name].liquidtype == "none") then return end
|
if lnode2.name == "ignore" or lnode2.name == "air" or not(minetest.registered_nodes[lnode2.name].liquidtype == "none") then return end
|
||||||
|
|
||||||
local oldpos = {x=lpos2.x+direction.x, y=lpos2.y+direction.y, z=lpos2.z+direction.z}
|
local oldpos = {x=lpos2.x+direction.x, y=lpos2.y+direction.y, z=lpos2.z+direction.z}
|
||||||
repeat
|
repeat
|
||||||
minetest.env:add_node(oldpos, {name=minetest.env:get_node(lpos2).name})
|
lnode2 = minetest.env:get_node(lpos2)
|
||||||
nodeupdate(oldpos)
|
minetest.env:add_node(oldpos, {name=lnode2.name})
|
||||||
oldpos = {x=lpos2.x, y=lpos2.y, z=lpos2.z}
|
nodeupdate(oldpos)
|
||||||
lpos2.x = lpos2.x-direction.x
|
oldpos = {x=lpos2.x, y=lpos2.y, z=lpos2.z}
|
||||||
lpos2.y = lpos2.y-direction.y
|
lpos2.x = lpos2.x-direction.x
|
||||||
lpos2.z = lpos2.z-direction.z
|
lpos2.y = lpos2.y-direction.y
|
||||||
lnode = minetest.env:get_node(lpos2)
|
lpos2.z = lpos2.z-direction.z
|
||||||
until lnode.name=="air" or lnode.name=="ignore" or not(minetest.registered_nodes[lnode2.name].liquidtype == "none")
|
lnode = minetest.env:get_node(lpos2)
|
||||||
minetest.env:remove_node(oldpos)
|
until lnode.name=="air" or lnode.name=="ignore" or not(minetest.registered_nodes[lnode2.name].liquidtype == "none")
|
||||||
|
minetest.env:remove_node(oldpos)
|
||||||
|
end
|
||||||
|
|
||||||
|
function mesecon:mvps_move_objects(pos, dir, nodestack)
|
||||||
|
local objects_to_move = {}
|
||||||
|
|
||||||
|
-- Move object at tip of stack
|
||||||
|
local pushpos = mesecon:addPosRule(pos, -- get pos at tip of stack
|
||||||
|
{x = dir.x * (#nodestack),
|
||||||
|
y = dir.y * (#nodestack),
|
||||||
|
z = dir.z * (#nodestack)})
|
||||||
|
|
||||||
|
|
||||||
|
local objects = minetest.env:get_objects_inside_radius(pushpos, 1)
|
||||||
|
for _, obj in ipairs(objects) do
|
||||||
|
table.insert(objects_to_move, obj)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Move objects lying/standing on the stack (before it was pushed - oldstack)
|
||||||
|
if tonumber(minetest.setting_get("movement_gravity")) > 0 and dir.y == 0 then
|
||||||
|
-- If gravity positive and dir horizontal, push players standing on the stack
|
||||||
|
for _, n in ipairs(nodestack) do
|
||||||
|
local p_above = mesecon:addPosRule(n.pos, {x=0, y=1, z=0})
|
||||||
|
local objects = minetest.env:get_objects_inside_radius(p_above, 1)
|
||||||
|
for _, obj in ipairs(objects) do
|
||||||
|
table.insert(objects_to_move, obj)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, obj in ipairs(objects_to_move) do
|
||||||
|
local entity = obj:get_luaentity()
|
||||||
|
if not entity or not mesecon:is_mvps_unmov(entity.name) then
|
||||||
|
local np = mesecon:addPosRule(obj:getpos(), dir)
|
||||||
|
local nn = minetest.env:get_node(np)
|
||||||
|
if not minetest.registered_nodes[nn.name].walkable then
|
||||||
|
obj:setpos(np)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
mesecon:register_mvps_stopper("default:chest")
|
|
||||||
mesecon:register_mvps_stopper("default:chest_locked")
|
mesecon:register_mvps_stopper("default:chest_locked")
|
||||||
mesecon:register_mvps_stopper("default:furnace")
|
mesecon:register_mvps_stopper("default:furnace")
|
||||||
|
@ -1,18 +1,29 @@
|
|||||||
minetest.register_node("mesecons_noteblock:noteblock", {
|
minetest.register_node("mesecons_noteblock:noteblock", {
|
||||||
description = "Noteblock",
|
description = "Noteblock",
|
||||||
tiles = {"mesecons_noteblock.png"},
|
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",
|
drawtype = "allfaces_optional",
|
||||||
visual_scale = 1.3,
|
visual_scale = 1.3,
|
||||||
paramtype="light",
|
paramtype="light",
|
||||||
after_place_node = function(pos)
|
after_place_node = function(pos)
|
||||||
minetest.env:add_node(pos, {name="mesecons_noteblock:noteblock", param2=0})
|
minetest.env:add_node(pos, {name="mesecons_noteblock:noteblock", param2=0})
|
||||||
end
|
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({
|
minetest.register_craft({
|
||||||
output = '"mesecons_noteblock:noteblock" 1',
|
output = "mesecons_noteblock:noteblock 1",
|
||||||
recipe = {
|
recipe = {
|
||||||
{"default:wood", "default:wood", "default:wood"},
|
{"default:wood", "default:wood", "default:wood"},
|
||||||
{"group:mesecon_conductor_craftable", "default:steel_ingot", "group:mesecon_conductor_craftable"},
|
{"group:mesecon_conductor_craftable", "default:steel_ingot", "group:mesecon_conductor_craftable"},
|
||||||
@ -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)
|
mesecon.noteblock_play = function (pos, param2)
|
||||||
local soundname
|
local soundname
|
||||||
if param2==8 then
|
if param2==8 then
|
||||||
@ -75,9 +77,3 @@ mesecon.noteblock_play = function (pos, param2)
|
|||||||
minetest.sound_play(soundname,
|
minetest.sound_play(soundname,
|
||||||
{pos = pos, gain = 1.0, max_hear_distance = 32,})
|
{pos = pos, gain = 1.0, max_hear_distance = 32,})
|
||||||
end
|
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
|
||||||
mesecons_materials
|
|
||||||
mesecons_mvps
|
mesecons_mvps
|
||||||
|
@ -1,63 +1,736 @@
|
|||||||
--PISTONS
|
-- Get mesecon rules of pistons
|
||||||
|
piston_rules =
|
||||||
|
{{x=0, y=0, z=1}, --everything apart from z- (pusher side)
|
||||||
|
{x=1, y=0, z=0},
|
||||||
|
{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=0, y=1, z=1},
|
||||||
|
{x=0, y=-1, z=1}}
|
||||||
|
|
||||||
minetest.register_node("mesecons_pistons:piston_normal", {
|
local piston_up_rules =
|
||||||
|
{{x=0, y=0, z=-1}, --everything apart from y+ (pusher side)
|
||||||
|
{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=0, y=-1, z=1},
|
||||||
|
{x=0, y=-1, z=-1}}
|
||||||
|
|
||||||
|
local piston_down_rules =
|
||||||
|
{{x=0, y=0, z=-1}, --everything apart from y- (pusher side)
|
||||||
|
{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=0, y=1, z=1},
|
||||||
|
{x=0, y=1, z=-1}}
|
||||||
|
|
||||||
|
local piston_get_rules = function (node)
|
||||||
|
local rules = piston_rules
|
||||||
|
for i = 1, node.param2 do
|
||||||
|
rules = mesecon:rotate_rules_left(rules)
|
||||||
|
end
|
||||||
|
return rules
|
||||||
|
end
|
||||||
|
|
||||||
|
piston_facedir_direction = function (node)
|
||||||
|
local rules = {{x = 0, y = 0, z = -1}}
|
||||||
|
for i = 1, node.param2 do
|
||||||
|
rules = mesecon:rotate_rules_left(rules)
|
||||||
|
end
|
||||||
|
return rules[1]
|
||||||
|
end
|
||||||
|
|
||||||
|
piston_get_direction = function (dir, node)
|
||||||
|
if type(dir) == "function" then
|
||||||
|
return dir(node)
|
||||||
|
else
|
||||||
|
return dir
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local piston_remove_pusher = function (pos, node)
|
||||||
|
pistonspec = minetest.registered_nodes[node.name].mesecons_piston
|
||||||
|
|
||||||
|
dir = piston_get_direction(pistonspec.dir, 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
|
||||||
|
|
||||||
|
local dir = piston_get_direction(pistonspec.dir, node)
|
||||||
|
local np = mesecon:addPosRule(pos, dir)
|
||||||
|
local success, stack, oldstack = 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)
|
||||||
|
mesecon:mvps_move_objects (np, dir, oldstack)
|
||||||
|
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_get_direction(pistonspec.dir, node)
|
||||||
|
pullpos = mesecon:addPosRule(pos, dir)
|
||||||
|
stack = mesecon:mvps_pull_single(pullpos, dir)
|
||||||
|
mesecon:mvps_process_stack(pos, dir, 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)
|
||||||
|
local pistonspec = minetest.registered_nodes[node.name].mesecons_piston
|
||||||
|
if pitch > 55 then --looking upwards
|
||||||
|
minetest.env:add_node(pos, {name=pistonspec.piston_down})
|
||||||
|
elseif pitch < -55 then --looking downwards
|
||||||
|
minetest.env:add_node(pos, {name=pistonspec.piston_up})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Horizontal pistons
|
||||||
|
|
||||||
|
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",
|
||||||
|
dir = piston_facedir_direction,
|
||||||
|
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",
|
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"},
|
tiles = {
|
||||||
groups = {cracky=3, mesecon=2},
|
"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",
|
paramtype2 = "facedir",
|
||||||
after_destruct = function(pos, oldnode)
|
after_place_node = piston_orientate,
|
||||||
local dir = mesecon:piston_get_direction(oldnode)
|
mesecons_piston = pistonspec_normal,
|
||||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
mesecons = {effector={
|
||||||
--ensure piston is extended
|
action_on = piston_on,
|
||||||
local checknode = minetest.env:get_node(pos)
|
rules = piston_get_rules
|
||||||
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,
|
|
||||||
})
|
})
|
||||||
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",
|
||||||
|
dir = piston_facedir_direction,
|
||||||
|
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",
|
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"},
|
tiles = {
|
||||||
groups = {cracky=3, mesecon=2},
|
"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",
|
paramtype2 = "facedir",
|
||||||
after_destruct = function(pos, oldnode)
|
after_place_node = piston_orientate,
|
||||||
local dir = mesecon:piston_get_direction(oldnode)
|
mesecons_piston = pistonspec_sticky,
|
||||||
pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
mesecons = {effector={
|
||||||
|
action_on = piston_on,
|
||||||
|
rules = piston_get_rules
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
|
||||||
--ensure piston is extended
|
-- onstate
|
||||||
local checknode = minetest.env:get_node(pos)
|
minetest.register_node("mesecons_pistons:piston_sticky_on", {
|
||||||
if checknode.name == "mesecons_pistons:piston_pusher_sticky" then
|
drawtype = "nodebox",
|
||||||
if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston
|
tiles = {
|
||||||
minetest.env:remove_node(pos) --remove the pusher
|
"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,
|
||||||
|
})
|
||||||
|
|
||||||
|
--
|
||||||
|
--
|
||||||
|
-- UP
|
||||||
|
--
|
||||||
|
--
|
||||||
|
|
||||||
|
local piston_up_pusher_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {
|
||||||
|
{-2/16, -.5 - pt, -2/16, 2/16, .5 - pt, 2/16},
|
||||||
|
{-.5 , .5 - pt, -.5 , .5 , .5 , .5},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
local piston_up_on_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {
|
||||||
|
{-.5, -.5, -.5 , .5, .5-pt, .5}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Normal
|
||||||
|
|
||||||
|
local pistonspec_normal_up = {
|
||||||
|
offname = "mesecons_pistons:piston_up_normal_off",
|
||||||
|
onname = "mesecons_pistons:piston_up_normal_on",
|
||||||
|
dir = {x = 0, y = 1, z = 0},
|
||||||
|
pusher = "mesecons_pistons:piston_up_pusher_normal"
|
||||||
|
}
|
||||||
|
|
||||||
|
-- offstate
|
||||||
|
minetest.register_node("mesecons_pistons:piston_up_normal_off", {
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_pusher_front.png",
|
||||||
|
"mesecons_piston_back.png",
|
||||||
|
"mesecons_piston_left.png^[transformR270",
|
||||||
|
"mesecons_piston_right.png^[transformR90",
|
||||||
|
"mesecons_piston_bottom.png",
|
||||||
|
"mesecons_piston_top.png^[transformR180",
|
||||||
|
},
|
||||||
|
inventory_image = "mesecons_piston_top.png",
|
||||||
|
wield_image = "mesecons_piston_top.png",
|
||||||
|
groups = {cracky = 3, not_in_creative_inventory = 1},
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
drop = "mesecons_pistons:piston_normal_off",
|
||||||
|
mesecons_piston = pistonspec_normal_up,
|
||||||
|
mesecons = {effector={
|
||||||
|
action_on = piston_on,
|
||||||
|
rules = piston_up_rules,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- onstate
|
||||||
|
minetest.register_node("mesecons_pistons:piston_up_normal_on", {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_on_front.png",
|
||||||
|
"mesecons_piston_back.png",
|
||||||
|
"mesecons_piston_left.png^[transformR270",
|
||||||
|
"mesecons_piston_right.png^[transformR90",
|
||||||
|
"mesecons_piston_bottom.png",
|
||||||
|
"mesecons_piston_top.png^[transformR180",
|
||||||
|
},
|
||||||
|
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_up_on_box,
|
||||||
|
selection_box = piston_up_on_box,
|
||||||
|
mesecons_piston = pistonspec_normal_up,
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
mesecons = {effector={
|
||||||
|
action_off = piston_off,
|
||||||
|
rules = piston_up_rules,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- pusher
|
||||||
|
minetest.register_node("mesecons_pistons:piston_up_pusher_normal", {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_pusher_front.png",
|
||||||
|
"mesecons_piston_pusher_back.png",
|
||||||
|
"mesecons_piston_pusher_left.png^[transformR270",
|
||||||
|
"mesecons_piston_pusher_right.png^[transformR90",
|
||||||
|
"mesecons_piston_pusher_bottom.png",
|
||||||
|
"mesecons_piston_pusher_top.png^[transformR180",
|
||||||
|
},
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
diggable = false,
|
||||||
|
corresponding_piston = "mesecons_pistons:piston_up_normal_on",
|
||||||
|
selection_box = piston_up_pusher_box,
|
||||||
|
node_box = piston_up_pusher_box,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Sticky
|
||||||
|
|
||||||
|
|
||||||
|
local pistonspec_sticky_up = {
|
||||||
|
offname = "mesecons_pistons:piston_up_sticky_off",
|
||||||
|
onname = "mesecons_pistons:piston_up_sticky_on",
|
||||||
|
dir = {x = 0, y = 1, z = 0},
|
||||||
|
pusher = "mesecons_pistons:piston_up_pusher_sticky",
|
||||||
|
sticky = true
|
||||||
|
}
|
||||||
|
|
||||||
|
-- offstate
|
||||||
|
minetest.register_node("mesecons_pistons:piston_up_sticky_off", {
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_pusher_front_sticky.png",
|
||||||
|
"mesecons_piston_back.png",
|
||||||
|
"mesecons_piston_left.png^[transformR270",
|
||||||
|
"mesecons_piston_right.png^[transformR90",
|
||||||
|
"mesecons_piston_bottom.png",
|
||||||
|
"mesecons_piston_top.png^[transformR180",
|
||||||
|
"mesecons_piston_tb.png"
|
||||||
|
},
|
||||||
|
inventory_image = "mesecons_piston_top.png",
|
||||||
|
wield_image = "mesecons_piston_top.png",
|
||||||
|
groups = {cracky = 3, not_in_creative_inventory = 1},
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
drop = "mesecons_pistons:piston_sticky_off",
|
||||||
|
mesecons_piston = pistonspec_sticky_up,
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
mesecons = {effector={
|
||||||
|
action_on = piston_on,
|
||||||
|
rules = piston_up_rules,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- onstate
|
||||||
|
minetest.register_node("mesecons_pistons:piston_up_sticky_on", {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_on_front.png",
|
||||||
|
"mesecons_piston_back.png",
|
||||||
|
"mesecons_piston_left.png^[transformR270",
|
||||||
|
"mesecons_piston_right.png^[transformR90",
|
||||||
|
"mesecons_piston_bottom.png",
|
||||||
|
"mesecons_piston_top.png^[transformR180",
|
||||||
|
},
|
||||||
|
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_up_on_box,
|
||||||
|
selection_box = piston_up_on_box,
|
||||||
|
mesecons_piston = pistonspec_sticky_up,
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
mesecons = {effector={
|
||||||
|
action_off = piston_off,
|
||||||
|
rules = piston_up_rules,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- pusher
|
||||||
|
minetest.register_node("mesecons_pistons:piston_up_pusher_sticky", {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_pusher_front_sticky.png",
|
||||||
|
"mesecons_piston_pusher_back.png",
|
||||||
|
"mesecons_piston_pusher_left.png^[transformR270",
|
||||||
|
"mesecons_piston_pusher_right.png^[transformR90",
|
||||||
|
"mesecons_piston_pusher_bottom.png",
|
||||||
|
"mesecons_piston_pusher_top.png^[transformR180",
|
||||||
|
},
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
diggable = false,
|
||||||
|
corresponding_piston = "mesecons_pistons:piston_up_sticky_on",
|
||||||
|
selection_box = piston_up_pusher_box,
|
||||||
|
node_box = piston_up_pusher_box,
|
||||||
|
})
|
||||||
|
|
||||||
|
--
|
||||||
|
--
|
||||||
|
-- DOWN
|
||||||
|
--
|
||||||
|
--
|
||||||
|
|
||||||
|
local piston_down_pusher_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {
|
||||||
|
{-2/16, -.5 + pt, -2/16, 2/16, .5 + pt, 2/16},
|
||||||
|
{-.5 , -.5 , -.5 , .5 , -.5 + pt, .5},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
local piston_down_on_box = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = {
|
||||||
|
{-.5, -.5+pt, -.5 , .5, .5, .5}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Normal
|
||||||
|
|
||||||
|
local pistonspec_normal_down = {
|
||||||
|
offname = "mesecons_pistons:piston_down_normal_off",
|
||||||
|
onname = "mesecons_pistons:piston_down_normal_on",
|
||||||
|
dir = {x = 0, y = -1, z = 0},
|
||||||
|
pusher = "mesecons_pistons:piston_down_pusher_normal",
|
||||||
|
}
|
||||||
|
|
||||||
|
-- offstate
|
||||||
|
minetest.register_node("mesecons_pistons:piston_down_normal_off", {
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_back.png",
|
||||||
|
"mesecons_piston_pusher_front.png",
|
||||||
|
"mesecons_piston_left.png^[transformR90",
|
||||||
|
"mesecons_piston_right.png^[transformR270",
|
||||||
|
"mesecons_piston_bottom.png^[transformR180",
|
||||||
|
"mesecons_piston_top.png",
|
||||||
|
},
|
||||||
|
inventory_image = "mesecons_piston_top.png",
|
||||||
|
wield_image = "mesecons_piston_top.png",
|
||||||
|
groups = {cracky = 3, not_in_creative_inventory = 1},
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
drop = "mesecons_pistons:piston_normal_off",
|
||||||
|
mesecons_piston = pistonspec_normal_down,
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
mesecons = {effector={
|
||||||
|
action_on = piston_on,
|
||||||
|
rules = piston_down_rules,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- onstate
|
||||||
|
minetest.register_node("mesecons_pistons:piston_down_normal_on", {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_back.png",
|
||||||
|
"mesecons_piston_on_front.png",
|
||||||
|
"mesecons_piston_left.png^[transformR90",
|
||||||
|
"mesecons_piston_right.png^[transformR270",
|
||||||
|
"mesecons_piston_bottom.png^[transformR180",
|
||||||
|
"mesecons_piston_top.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_down_on_box,
|
||||||
|
selection_box = piston_down_on_box,
|
||||||
|
mesecons_piston = pistonspec_normal_down,
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
mesecons = {effector={
|
||||||
|
action_off = piston_off,
|
||||||
|
rules = piston_down_rules,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- pusher
|
||||||
|
minetest.register_node("mesecons_pistons:piston_down_pusher_normal", {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_pusher_back.png",
|
||||||
|
"mesecons_piston_pusher_front.png",
|
||||||
|
"mesecons_piston_pusher_left.png^[transformR90",
|
||||||
|
"mesecons_piston_pusher_right.png^[transformR270",
|
||||||
|
"mesecons_piston_pusher_bottom.png^[transformR180",
|
||||||
|
"mesecons_piston_pusher_top.png",
|
||||||
|
},
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
diggable = false,
|
||||||
|
corresponding_piston = "mesecons_pistons:piston_down_normal_on",
|
||||||
|
selection_box = piston_down_pusher_box,
|
||||||
|
node_box = piston_down_pusher_box,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Sticky
|
||||||
|
|
||||||
|
local pistonspec_sticky_down = {
|
||||||
|
onname = "mesecons_pistons:piston_down_sticky_on",
|
||||||
|
offname = "mesecons_pistons:piston_down_sticky_off",
|
||||||
|
dir = {x = 0, y = -1, z = 0},
|
||||||
|
pusher = "mesecons_pistons:piston_down_pusher_sticky",
|
||||||
|
sticky = true
|
||||||
|
}
|
||||||
|
|
||||||
|
-- offstate
|
||||||
|
minetest.register_node("mesecons_pistons:piston_down_sticky_off", {
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_back.png",
|
||||||
|
"mesecons_piston_pusher_front_sticky.png",
|
||||||
|
"mesecons_piston_left.png^[transformR90",
|
||||||
|
"mesecons_piston_right.png^[transformR270",
|
||||||
|
"mesecons_piston_bottom.png^[transformR180",
|
||||||
|
"mesecons_piston_top.png",
|
||||||
|
},
|
||||||
|
inventory_image = "mesecons_piston_top.png",
|
||||||
|
wield_image = "mesecons_piston_top.png",
|
||||||
|
groups = {cracky = 3, not_in_creative_inventory = 1},
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
drop = "mesecons_pistons:piston_sticky_off",
|
||||||
|
mesecons_piston = pistonspec_sticky_down,
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
mesecons = {effector={
|
||||||
|
action_on = piston_on,
|
||||||
|
rules = piston_down_rules,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- onstate
|
||||||
|
minetest.register_node("mesecons_pistons:piston_down_sticky_on", {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_back.png",
|
||||||
|
"mesecons_piston_on_front.png",
|
||||||
|
"mesecons_piston_left.png^[transformR90",
|
||||||
|
"mesecons_piston_right.png^[transformR270",
|
||||||
|
"mesecons_piston_bottom.png^[transformR180",
|
||||||
|
"mesecons_piston_top.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_sticky_off",
|
||||||
|
after_dig_node = piston_remove_pusher,
|
||||||
|
node_box = piston_down_on_box,
|
||||||
|
selection_box = piston_down_on_box,
|
||||||
|
mesecons_piston = pistonspec_sticky_down,
|
||||||
|
sounds = default.node_sound_wood_defaults(),
|
||||||
|
mesecons = {effector={
|
||||||
|
action_off = piston_off,
|
||||||
|
rules = piston_down_rules,
|
||||||
|
}}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- pusher
|
||||||
|
minetest.register_node("mesecons_pistons:piston_down_pusher_sticky", {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {
|
||||||
|
"mesecons_piston_pusher_back.png",
|
||||||
|
"mesecons_piston_pusher_front_sticky.png",
|
||||||
|
"mesecons_piston_pusher_left.png^[transformR90",
|
||||||
|
"mesecons_piston_pusher_right.png^[transformR270",
|
||||||
|
"mesecons_piston_pusher_bottom.png^[transformR180",
|
||||||
|
"mesecons_piston_pusher_top.png",
|
||||||
|
},
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
diggable = false,
|
||||||
|
corresponding_piston = "mesecons_pistons:piston_down_sticky_on",
|
||||||
|
selection_box = piston_down_pusher_box,
|
||||||
|
node_box = piston_down_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)
|
||||||
|
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal", piston_pusher_up_down_get_stopper)
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky", piston_pusher_up_down_get_stopper)
|
||||||
|
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal", piston_pusher_up_down_get_stopper)
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky", piston_pusher_up_down_get_stopper)
|
||||||
|
|
||||||
|
|
||||||
|
-- Register pistons as stoppers if they would be seperated from the stopper
|
||||||
|
local piston_up_down_get_stopper = function (node, dir, stack, stackid)
|
||||||
|
if (stack[stackid + 1]
|
||||||
|
and stack[stackid + 1].node.name == minetest.registered_nodes[node.name].mesecons_piston.pusher)
|
||||||
|
or (stack[stackid - 1]
|
||||||
|
and stack[stackid - 1].node.name == minetest.registered_nodes[node.name].mesecons_piston.pusher) then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local piston_get_stopper = function (node, dir, stack, stackid)
|
||||||
|
pistonspec = minetest.registered_nodes[node.name].mesecons_piston
|
||||||
|
dir = piston_get_direction(pistonspec.dir, 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
|
end
|
||||||
end,
|
end
|
||||||
on_timer = function(pos, elapsed)
|
return true
|
||||||
if mesecon:is_powered(pos) then
|
end
|
||||||
mesecon:piston_push(pos)
|
|
||||||
else
|
|
||||||
mesecon:piston_pull(pos)
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
mesecon:register_effector("mesecons_pistons:piston_sticky", "mesecons_pistons:piston_sticky")
|
|
||||||
|
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_stopper)
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper)
|
||||||
|
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_up_normal_on", piston_up_down_get_stopper)
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_up_sticky_on", piston_up_down_get_stopper)
|
||||||
|
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_down_normal_on", piston_up_down_get_stopper)
|
||||||
|
mesecon:register_mvps_stopper("mesecons_pistons:piston_down_sticky_on", piston_up_down_get_stopper)
|
||||||
|
|
||||||
|
--craft recipes
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = '"mesecons_pistons:piston_normal" 2',
|
output = "mesecons_pistons:piston_normal_off 2",
|
||||||
recipe = {
|
recipe = {
|
||||||
{"default:wood", "default:wood", "default:wood"},
|
{"default:wood", "default:wood", "default:wood"},
|
||||||
{"default:cobble", "default:steel_ingot", "default:cobble"},
|
{"default:cobble", "default:steel_ingot", "default:cobble"},
|
||||||
@ -66,188 +739,9 @@ minetest.register_craft({
|
|||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "mesecons_pistons:piston_sticky",
|
output = "mesecons_pistons:piston_sticky_off",
|
||||||
recipe = {
|
recipe = {
|
||||||
{"mesecons_materials:glue"},
|
{"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
|
-- The POWER_PLANT
|
||||||
|
-- Just emits power. always.
|
||||||
|
|
||||||
minetest.register_node("mesecons_powerplant:power_plant", {
|
minetest.register_node("mesecons_powerplant:power_plant", {
|
||||||
drawtype = "plantlike",
|
drawtype = "plantlike",
|
||||||
@ -12,17 +13,19 @@ minetest.register_node("mesecons_powerplant:power_plant", {
|
|||||||
description="Power Plant",
|
description="Power Plant",
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
|
fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},
|
||||||
},
|
},
|
||||||
|
sounds = default.node_sound_leaves_defaults(),
|
||||||
|
mesecons = {receptor = {
|
||||||
|
state = mesecon.state.on
|
||||||
|
}}
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = '"mesecons_powerplant:power_plant" 1',
|
output = "mesecons_powerplant:power_plant 1",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'"group:mesecon_conductor_craftable"'},
|
{"group:mesecon_conductor_craftable"},
|
||||||
{'"group:mesecon_conductor_craftable"'},
|
{"group:mesecon_conductor_craftable"},
|
||||||
{'"default:sapling"'},
|
{"default:sapling"},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
mesecon:add_receptor_node("mesecons_powerplant:power_plant")
|
|
||||||
|
@ -1,174 +1,127 @@
|
|||||||
-- PRESSURE PLATE WOOD
|
local pp_box_off = {
|
||||||
|
type = "fixed",
|
||||||
|
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
||||||
|
}
|
||||||
|
|
||||||
minetest.register_node("mesecons_pressureplates:pressure_plate_wood_off", {
|
local pp_box_on = {
|
||||||
drawtype = "nodebox",
|
type = "fixed",
|
||||||
tiles = {"jeija_pressure_plate_wood_off.png"},
|
fixed = { -7/16, -8/16, -7/16, 7/16, -7.5/16, 7/16 },
|
||||||
inventory_image = "jeija_pressure_plate_wood_off.png",
|
}
|
||||||
wield_image = "jeija_pressure_plate_wood_off.png",
|
|
||||||
paramtype = "light",
|
pp_on_timer = function (pos, elapsed)
|
||||||
is_ground_content = true,
|
local node = minetest.env:get_node(pos)
|
||||||
walkable = true,
|
local ppspec = minetest.registered_nodes[node.name].pressureplate
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
-- This is a workaround for a strange bug that occurs when the server is started
|
||||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
-- For some reason the first time on_timer is called, the pos is wrong
|
||||||
},
|
if not ppspec then return end
|
||||||
node_box = {
|
|
||||||
type = "fixed",
|
local objs = minetest.env:get_objects_inside_radius(pos, 1)
|
||||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
local two_below = mesecon:addPosRule(pos, {x = 0, y = -2, z = 0})
|
||||||
},
|
|
||||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3, mesecon = 2},
|
if objs[1] == nil and node.name == ppspec.onstate then
|
||||||
description="Wood Pressure Plate",
|
minetest.env:add_node(pos, {name = ppspec.offstate})
|
||||||
|
mesecon:receptor_off(pos)
|
||||||
on_timer = function(pos, elapsed)
|
-- force deactivation of mesecon two blocks below (hacky)
|
||||||
local objs = minetest.env:get_objects_inside_radius(pos, 1)
|
if not mesecon:connected_to_receptor(two_below) then
|
||||||
|
mesecon:turnoff(two_below)
|
||||||
|
end
|
||||||
|
else
|
||||||
for k, obj in pairs(objs) do
|
for k, obj in pairs(objs) do
|
||||||
local objpos=obj:getpos()
|
local objpos = obj:getpos()
|
||||||
if objpos.y>pos.y-1 and objpos.y<pos.y then
|
if objpos.y > pos.y-1 and objpos.y < pos.y then
|
||||||
minetest.env:add_node(pos, {name="mesecons_pressureplates:pressure_plate_wood_on"})
|
minetest.env:add_node(pos, {name=ppspec.onstate})
|
||||||
mesecon:receptor_on(pos, mesecon:get_rules("pressureplate"))
|
mesecon:receptor_on(pos)
|
||||||
|
-- force activation of mesecon two blocks below (hacky)
|
||||||
|
mesecon:turnon(two_below)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true
|
end
|
||||||
end,
|
return true
|
||||||
|
end
|
||||||
on_construct = function(pos)
|
|
||||||
minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("mesecons_pressureplates:pressure_plate_wood_on", {
|
-- Register a Pressure Plate
|
||||||
drawtype = "nodebox",
|
-- offstate: name of the pressure plate when inactive
|
||||||
tiles = {"jeija_pressure_plate_wood_on.png"},
|
-- onstate: name of the pressure plate when active
|
||||||
paramtype = "light",
|
-- description: description displayed in the player's inventory
|
||||||
is_ground_content = true,
|
-- tiles_off: textures of the pressure plate when inactive
|
||||||
walkable = true,
|
-- tiles_on: textures of the pressure plate when active
|
||||||
selection_box = {
|
-- image: inventory and wield image of the pressure plate
|
||||||
type = "fixed",
|
-- recipe: crafting recipe of the pressure plate
|
||||||
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,
|
|
||||||
|
|
||||||
on_construct = function(pos)
|
|
||||||
minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
function mesecon:register_pressure_plate(offstate, onstate, description, textures_off, textures_on, image_w, image_i, recipe)
|
||||||
output = '"mesecons_pressureplates:pressure_plate_wood_off" 1',
|
local ppspec = {
|
||||||
recipe = {
|
offstate = offstate,
|
||||||
{'"default:wood"', '"default:wood"'},
|
onstate = onstate
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
|
||||||
-- PRESSURE PLATE STONE
|
minetest.register_node(offstate, {
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = textures_off,
|
||||||
|
inventory_image = image_i,
|
||||||
|
wield_image = image_w,
|
||||||
|
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_stone_off", {
|
minetest.register_node(onstate, {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {"jeija_pressure_plate_stone_off.png"},
|
tiles = textures_on,
|
||||||
inventory_image = "jeija_pressure_plate_stone_off.png",
|
paramtype = "light",
|
||||||
wield_image = "jeija_pressure_plate_stone_off.png",
|
selection_box = pp_box_on,
|
||||||
paramtype = "light",
|
node_box = pp_box_on,
|
||||||
is_ground_content = true,
|
groups = {snappy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1},
|
||||||
walkable = true,
|
drop = offstate,
|
||||||
selection_box = {
|
pressureplate = ppspec,
|
||||||
type = "fixed",
|
on_timer = pp_on_timer,
|
||||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
sounds = default.node_sound_wood_defaults(),
|
||||||
},
|
mesecons = {receptor = {
|
||||||
node_box = {
|
state = mesecon.state.on
|
||||||
type = "fixed",
|
}},
|
||||||
fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 },
|
on_construct = function(pos)
|
||||||
},
|
minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
|
||||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3, mesecon = 2},
|
end,
|
||||||
description="Stone Pressure Plate",
|
after_dig_node = function(pos)
|
||||||
|
local two_below = mesecon:addPosRule(pos, {x = 0, y = -2, z = 0})
|
||||||
on_timer = function(pos, elapsed)
|
if not mesecon:connected_to_receptor(two_below) then
|
||||||
local objs = minetest.env:get_objects_inside_radius(pos, 1)
|
mesecon:turnoff(two_below)
|
||||||
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
|
||||||
end
|
end
|
||||||
return true
|
})
|
||||||
end,
|
|
||||||
|
|
||||||
on_construct = function(pos)
|
|
||||||
minetest.env:get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("mesecons_pressureplates:pressure_plate_stone_on", {
|
minetest.register_craft({
|
||||||
drawtype = "nodebox",
|
output = offstate,
|
||||||
tiles = {"jeija_pressure_plate_stone_on.png"},
|
recipe = recipe,
|
||||||
paramtype = "light",
|
})
|
||||||
is_ground_content = true,
|
end
|
||||||
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({
|
mesecon:register_pressure_plate(
|
||||||
output = '"mesecons_pressureplates:pressure_plate_stone_off" 1',
|
"mesecons_pressureplates:pressure_plate_wood_off",
|
||||||
recipe = {
|
"mesecons_pressureplates:pressure_plate_wood_on",
|
||||||
{'"default:cobble"', '"default:cobble"'},
|
"Wooden Pressure Plate",
|
||||||
}
|
{"jeija_pressure_plate_wood_off.png","jeija_pressure_plate_wood_off.png","jeija_pressure_plate_wood_off_edges.png"},
|
||||||
})
|
{"jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on_edges.png"},
|
||||||
|
"jeija_pressure_plate_wood_wield.png",
|
||||||
|
"jeija_pressure_plate_wood_inv.png",
|
||||||
|
{{"default:wood", "default:wood"}})
|
||||||
|
|
||||||
mesecon:add_rules("pressureplate",
|
mesecon:register_pressure_plate(
|
||||||
{{x=0, y=1, z=-1},
|
"mesecons_pressureplates:pressure_plate_stone_off",
|
||||||
{x=0, y=0, z=-1},
|
"mesecons_pressureplates:pressure_plate_stone_on",
|
||||||
{x=0, y=-1, z=-1},
|
"Stone Pressure Plate",
|
||||||
{x=0, y=1, z=1},
|
{"jeija_pressure_plate_stone_off.png","jeija_pressure_plate_stone_off.png","jeija_pressure_plate_stone_off_edges.png"},
|
||||||
{x=0, y=-1, z=1},
|
{"jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on_edges.png"},
|
||||||
{x=0, y=0, z=1},
|
"jeija_pressure_plate_stone_wield.png",
|
||||||
{x=1, y=0, z=0},
|
"jeija_pressure_plate_stone_inv.png",
|
||||||
{x=1, y=1, z=0},
|
{{"default:cobble", "default:cobble"}})
|
||||||
{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"))
|
|
||||||
|
@ -3,12 +3,17 @@
|
|||||||
minetest.register_node("mesecons_random:removestone", {
|
minetest.register_node("mesecons_random:removestone", {
|
||||||
tiles = {"jeija_removestone.png"},
|
tiles = {"jeija_removestone.png"},
|
||||||
inventory_image = minetest.inventorycube("jeija_removestone_inv.png"),
|
inventory_image = minetest.inventorycube("jeija_removestone_inv.png"),
|
||||||
groups = {cracky=3, mesecon=2},
|
groups = {cracky=3},
|
||||||
description="Removestone",
|
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({
|
minetest.register_craft({
|
||||||
output = 'mesecons_random:removestone 4',
|
output = 'mesecons_random:removestone 4',
|
||||||
recipe = {
|
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
|
-- GHOSTSTONE
|
||||||
|
|
||||||
minetest.register_node("mesecons_random:ghoststone", {
|
minetest.register_node("mesecons_random:ghoststone", {
|
||||||
@ -31,8 +30,20 @@ minetest.register_node("mesecons_random:ghoststone", {
|
|||||||
tiles = {"jeija_ghoststone.png"},
|
tiles = {"jeija_ghoststone.png"},
|
||||||
is_ground_content = true,
|
is_ground_content = true,
|
||||||
inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"),
|
inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"),
|
||||||
groups = {cracky=3, mesecon=2},
|
groups = {cracky=3},
|
||||||
sounds = default.node_sound_stone_defaults(),
|
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", {
|
minetest.register_node("mesecons_random:ghoststone_active", {
|
||||||
@ -41,10 +52,28 @@ minetest.register_node("mesecons_random:ghoststone_active", {
|
|||||||
walkable = false,
|
walkable = false,
|
||||||
diggable = false,
|
diggable = false,
|
||||||
sunlight_propagates = true,
|
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({
|
minetest.register_craft({
|
||||||
output = 'mesecons_random:ghoststone 4',
|
output = 'mesecons_random:ghoststone 4',
|
||||||
@ -54,17 +83,3 @@ minetest.register_craft({
|
|||||||
{"default:steel_ingot", "default:cobble", "default:steel_ingot"},
|
{"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 = {
|
rcvboxes = {
|
||||||
{ -3/16, -3/16 , -8/16 , 3/16, 3/16, -13/32 }, -- the smaller bump
|
{ -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
|
{ -1/32, -1/32 , -3/2 , 1/32, 1/32, -1/2 }, -- the wire through the block
|
||||||
{ -3/32, -.5-1/32, -.5 , 3/32, 0 , -.5002+3/32 }, -- the vertical wire bit
|
{ -2/32, -.5-1/32, -.5 , 2/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
|
{ -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", {
|
minetest.register_node("mesecons_receiver:receiver_on", {
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
tiles = {
|
tiles = {
|
||||||
@ -18,6 +31,7 @@ minetest.register_node("mesecons_receiver:receiver_on", {
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
|
walkable = false,
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 }
|
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",
|
type = "fixed",
|
||||||
fixed = rcvboxes
|
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",
|
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", {
|
minetest.register_node("mesecons_receiver:receiver_off", {
|
||||||
@ -45,6 +63,7 @@ minetest.register_node("mesecons_receiver:receiver_off", {
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
|
walkable = false,
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 }
|
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",
|
type = "fixed",
|
||||||
fixed = rcvboxes
|
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",
|
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}})
|
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},
|
||||||
{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)
|
function mesecon:receiver_get_pos_from_rcpt(pos, param2)
|
||||||
local rules = mesecon:get_rules("receiver_pos")
|
local rules = mesecon:get_rules("receiver_pos")
|
||||||
if param2 == nil then param2 = minetest.env:get_node(pos).param2 end
|
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)
|
minetest.env:dig_node(pos)
|
||||||
if mesecon:is_power_on(rcpt_pos) then
|
if mesecon:is_power_on(rcpt_pos) then
|
||||||
minetest.env:add_node(pos, {name = "mesecons_receiver:receiver_on", param2 = node.param2})
|
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
|
else
|
||||||
minetest.env:add_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2})
|
minetest.env:add_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2})
|
||||||
end
|
end
|
||||||
@ -132,8 +128,10 @@ function mesecon:receiver_remove(rcpt_pos, dugnode)
|
|||||||
local nn = minetest.env:get_node(pos)
|
local nn = minetest.env:get_node(pos)
|
||||||
if string.find(nn.name, "mesecons_receiver:receiver_") ~=nil then
|
if string.find(nn.name, "mesecons_receiver:receiver_") ~=nil then
|
||||||
minetest.env:dig_node(pos)
|
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:update_autoconnect(pos)
|
||||||
|
mesecon.on_placenode(pos, node)
|
||||||
end
|
end
|
||||||
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 },
|
wall_side = { -8/16, -7/16, -7/16, -7/16, 7/16, 7/16 },
|
||||||
},
|
},
|
||||||
drop = "mesecons_solarpanel:solar_panel_off",
|
drop = "mesecons_solarpanel:solar_panel_off",
|
||||||
groups = {dig_immediate=3, mesecon = 2, not_in_creative_inventory = 1},
|
groups = {dig_immediate=3, not_in_creative_inventory = 1},
|
||||||
description="Solar Panel",
|
sounds = default.node_sound_glass_defaults(),
|
||||||
|
mesecons = {receptor = {
|
||||||
|
state = mesecon.state.on
|
||||||
|
}}
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Solar Panel
|
-- Solar Panel
|
||||||
@ -47,15 +50,19 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", {
|
|||||||
wall_top = { -7/16, 7/16, -7/16, 7/16, 8/16, 7/16 },
|
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 },
|
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",
|
description="Solar Panel",
|
||||||
|
sounds = default.node_sound_glass_defaults(),
|
||||||
|
mesecons = {receptor = {
|
||||||
|
state = mesecon.state.off
|
||||||
|
}}
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = '"mesecons_solarpanel:solar_panel_off" 1',
|
output = "mesecons_solarpanel:solar_panel_off 1",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'"mesecons_materials:silicon"', '"mesecons_materials:silicon"'},
|
{"mesecons_materials:silicon", "mesecons_materials:silicon"},
|
||||||
{'"mesecons_materials:silicon"', '"mesecons_materials:silicon"'},
|
{"mesecons_materials:silicon", "mesecons_materials:silicon"},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -86,6 +93,3 @@ minetest.register_abm(
|
|||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
mesecon:add_receptor_node("mesecons_solarpanel:solar_panel_on")
|
|
||||||
mesecon:add_receptor_node_off("mesecons_solarpanel:solar_panel_off")
|
|
||||||
|
@ -3,37 +3,39 @@
|
|||||||
minetest.register_node("mesecons_switch:mesecon_switch_off", {
|
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"},
|
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",
|
paramtype2="facedir",
|
||||||
groups = {dig_immediate=2, mesecon = 2},
|
groups = {dig_immediate=2},
|
||||||
description="Switch",
|
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", {
|
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"},
|
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",
|
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',
|
drop="mesecons_switch:mesecon_switch_off 1",
|
||||||
description="Switch",
|
sounds = default.node_sound_stone_defaults(),
|
||||||
})
|
mesecons = {receptor = {
|
||||||
|
state = mesecon.state.on
|
||||||
mesecon:register_receptor("mesecons_switch:mesecon_switch_on", "mesecons_switch:mesecon_switch_off")
|
}},
|
||||||
|
on_punch = function(pos, node)
|
||||||
minetest.register_on_punchnode(function(pos, node, puncher)
|
mesecon:swap_node(pos, "mesecons_switch:mesecon_switch_off")
|
||||||
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)
|
|
||||||
mesecon:receptor_off(pos)
|
mesecon:receptor_off(pos)
|
||||||
|
minetest.sound_play("mesecons_switch", {pos=pos})
|
||||||
end
|
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({
|
minetest.register_craft({
|
||||||
output = '"mesecons_switch:mesecon_switch_off" 2',
|
output = "mesecons_switch:mesecon_switch_off 2",
|
||||||
recipe = {
|
recipe = {
|
||||||
{'"default:steel_ingot"', '"default:cobble"', '"default:steel_ingot"'},
|
{"default:steel_ingot", "default:cobble", "default:steel_ingot"},
|
||||||
{'"group:mesecon_conductor_craftable"','', '"group:mesecon_conductor_craftable"'},
|
{"group:mesecon_conductor_craftable","", "group:mesecon_conductor_craftable"},
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
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_lightstone_yellow_off.png
Normal file
After Width: | Height: | Size: 291 B |
BIN
mesecons_textures/textures/jeija_lightstone_yellow_on.png
Normal file
After Width: | Height: | Size: 486 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_burnt_top.png
Normal file
After Width: | Height: | Size: 8.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 |
BIN
mesecons_textures/textures/jeija_pressure_plate_stone_inv.png
Normal file
After Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 648 B After Width: | Height: | Size: 555 B |
After Width: | Height: | Size: 292 B |
Before Width: | Height: | Size: 680 B After Width: | Height: | Size: 579 B |
After Width: | Height: | Size: 336 B |
BIN
mesecons_textures/textures/jeija_pressure_plate_stone_wield.png
Normal file
After Width: | Height: | Size: 604 B |
BIN
mesecons_textures/textures/jeija_pressure_plate_wood_inv.png
Normal file
After Width: | Height: | Size: 716 B |
Before Width: | Height: | Size: 750 B After Width: | Height: | Size: 663 B |
After Width: | Height: | Size: 295 B |
Before Width: | Height: | Size: 772 B After Width: | Height: | Size: 675 B |
After Width: | Height: | Size: 336 B |
BIN
mesecons_textures/textures/jeija_pressure_plate_wood_wield.png
Normal file
After Width: | Height: | Size: 716 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 |