62 Commits

Author SHA1 Message Date
ed3964da80 Remove microcontroller documentation files from the source tree
The files are still available for download in a GitHub release
2016-05-15 19:04:18 +02:00
6cae381c27 Luacontroller: Fix remove_functions stack overflow bug 2016-04-26 20:40:12 +02:00
4249ed4986 Mese as conductor: Fix light source, make code more flexible
Closes #265
2016-04-26 19:44:05 +02:00
c4f0c5c169 Merge pull request #264 from cheapie/master
Escape command block commands for formspec
2016-04-21 19:26:28 +02:00
2dea21f9ef Escape command block commands for formspec 2016-04-21 02:15:54 -05:00
b487783c23 Disable JIT optimization for user code and allow string.find in plain mode
Disabling LuaJIT for user code enables normal working of debug.sethook() even for loops. The drawback is that that code will run more slowly.

The fourth parameter of string.find indicates whether the second parameter should be interpreted literally (true) or as a pattern (false). Allowing patterns enables DoS attacks, but it's possible to
allow literal matching with little effort, by disallowing the function only if the fourth parameter (plain mode) is not `true`.
2016-04-02 17:31:40 +02:00
72e513ecbd Luacontroller: Put clearing debug hook before throwing error back in 2016-03-14 12:51:57 +01:00
1e77b193dd Luacontroller: Add safe version of string.rep and remove string.gsub,
fixes #255
2016-03-13 22:01:46 +01:00
08b14e3af0 Luacontroller: Fix function usage in LuaJIT, make 'do' no longer
prohibited, remove pcall and xpcall, fix global lookup of "jit"
variable, correct error locations

Thanks to @ShadowNinja and @gamemanj for fixing this in #241
2016-03-13 21:16:16 +01:00
e5dba66c21 Revert "Toggle trapdoors on signal, workaround for #252"
Please use the screwdriver if you want to rotate trapdoors.
This reverts commit 417a136c5e.
2016-02-28 07:16:45 +01:00
417a136c5e Toggle trapdoors on signal, workaround for #252 2016-02-27 20:40:16 +01:00
2dc8101fa1 Merge branch 'ssieb-master' 2016-02-23 10:20:09 +01:00
4b9039266e Fix crash due to force loading changes. 2016-02-22 15:47:18 -08:00
c7428d8135 Remove unused VERSION file
and remove debug output
2016-02-19 12:20:52 +01:00
cfd4f7c287 Force-load areas with mesecon usage
This is a major speedup for large mesecon machines / structures.
Force-loaded areas are stored in a file to be persistent over server
reboots. By default, areas are unloaded after 10 minutes (600s) without
usage, this can be customized with the mesecon.forceload_timeout
setting. Please turn max_forceloaded_blocks up for better performance.
2016-02-19 12:11:38 +01:00
f099b43e11 Update documentation: Fix mesecons.net links 2016-02-16 19:55:46 +01:00
7b84105512 Consistently use UNIX line endings (LF instead of CR LF) 2016-02-15 23:05:21 +01:00
80f72b2621 Fix vertical wires not updating power when adding to / removing from a vertical line
Call mesecon.on_dignode / mesecon.on_placenode to take care of that.
2016-02-15 22:52:56 +01:00
fe9c6871de Fix pistons not connecting to wire and not activating when placing
up/down pistons from certain directions
2016-02-15 16:36:27 +01:00
7865d42834 Always use minetest.set_node instead of minetest.add_node for consistency 2016-02-14 21:00:37 +01:00
809192f353 Use vector helper functions instead of old builtin cmpPos and addPosRule functions 2016-02-14 20:55:50 +01:00
6b54f025c1 Merge branch 'playerdetector_update' of https://github.com/HybridDog/minetest-mod-mesecons into HybridDog-playerdetector_update 2016-02-14 13:41:48 +01:00
c98805a5b5 Merge branch 'fix_pistons' of https://github.com/HybridDog/minetest-mod-mesecons into HybridDog-fix_pistons 2016-02-14 12:55:18 +01:00
fb4c440265 Doors: Use new mesh door API if available
I've implemented a new door API in minetest_game that
performs all the needed things to assure doors are
properly openend and closed, without mods needing to
know the inner details of what needs to be done.

Mesecons can just fetch a reference to the door object
and call the appropriate open or close method, which
simplifies this code a lot.

For compatibility, this code retains the old code path
and tests whether the new API is available, so this
code remains functional if the new API is not available.

Since the metal trapdoor was only recently added, I added
it to the new API codepath only, it's unlikely to be
present on older versions of minetest_game anyway.

As a benefit from the new door API, there is now
absolutely no more accidental switching closed trapdoors
to open on power off, which could happen with the
old method - since that was just a simple toggle.
2016-02-14 11:30:52 +01:00
cf45e24c57 this way it works better because unknown nodes may not stay unknown 2016-02-09 16:58:49 +01:00
3f00c1d1cb fix pistons not working in every buildable_to node 2016-02-09 11:32:09 +01:00
c1d0481f8f playerdetector: short code and don't get scanname for every object 2016-01-03 14:56:32 +01:00
f56c4ce35c Merge branch 'HybridDog-noteblock_update' 2016-01-02 23:01:08 +01:00
0ec503f32c Noteblock: Code cleanup 2016-01-02 22:58:08 +01:00
35b647ed4a Add os.datetable(), a (very) limited wrapper for os.date(). Fixes #246. 2016-01-02 01:13:38 -06:00
eab09b9d73 Merge branch 'sofar-sound' 2015-12-29 22:20:42 +01:00
2682d09291 Fix sound volume level of noteblock.
Playing stereo sounds positionally in OpenAL causes it to play
the sounds unattenuated - same volume for all distances. This
shouldn't happen, and makes noteblocks unneccesarily loud from
very far away.

Convert all noteblock samples to mono, 22kHz 64kbit.
2015-12-26 22:41:16 -08:00
a6b28d1f11 Gates: Update nor gate craft recipe, fixes #243 2015-12-15 22:25:39 +01:00
0ec771bf7d Major change: Documentation is now included with mesecons, the website just extracts the documentation in a more readable format
This makes development of new features easier, as documentation can automatically be updated on the website without modifying the website's code!
Every mod that has nodes in the mesecons modpack has a "doc" folder that contains subfolders with recipe, description and preview of the block. The website will discover which documentation is available
by reading the documentation.json file.
2015-11-20 20:14:50 +01:00
75bd081a67 Gates: Add OR and NOR gate 2015-11-20 20:13:59 +01:00
b89fe52469 Luacontroller: Add configurable size limit for mem table, 100kBytes by default, fixes #240
If size limit is exceeded, the luacontroller overheats. Overheating will cause the memory
to be erased.
2015-10-18 11:28:35 +02:00
97f7b5745f Remove trailing whitespace 2015-10-04 13:30:34 +02:00
24958e253b Revert "Do not send action_off signal when newly placing nodes"
This caused #238, reverting that commit fixes #238.

This reverts commit 30468b09cf.
2015-10-04 12:30:04 +02:00
0e7f68ea92 Doors: Use new sound name (fixes #236) 2015-10-04 12:21:35 +02:00
6ef3b965df Merge pull request #239 from beyondlimits/master
Use right mouse button instead of left to press button and change state of switch and lever.
2015-10-04 12:09:15 +02:00
6e326a6a03 Use right mouse button instead of left to press button and change state of switch and lever. 2015-10-01 19:13:12 +02:00
d95ccf86f8 update "sticky block" to use 0.4.13-style footprints 2015-08-25 20:23:23 -04:00
d0354d0dab Fix #234 2015-07-27 11:51:02 +02:00
fec43a3243 reworked hydroturbine model for the same reasons
also shrunk the base part down by a very tiny amount to help avoid z-fighting with neighboring
water (scaled to 0.9995 percent)
2015-05-20 03:40:59 -04:00
5612f84243 revamp wall lever models
corrected misaligned verticies, removed doubles, made better UV maps that use multiple
materials (allows to use multiple small textures)
2015-05-20 03:00:06 -04:00
3066346d75 Merge pull request #233 from technomancy/default-light-max
Don't refer to LIGHT_MAX global; use default.
2015-05-11 07:08:24 +02:00
52ea2c3c66 Don't refer to LIGHT_MAX global; use default.
The LIGHT_MAX global is created in the legacy.lua file in the default
mod; it states that it's there for backwards compatibility, but it would
be better to reference the proper value inside the default table.
2015-05-11 11:28:56 +07:00
b6ae419b00 Return if invalid parameters are given to node_detector_scan (e.g. unloaded area), should fix #228 2015-03-26 07:29:34 +01:00
a6d0a523ba Add support for sticky blocks for pistons and a a sample sticky block 2015-02-28 13:42:39 +01:00
aa5538a734 Fix pressure plates calling receptor_on on a regular basis 2015-02-25 21:01:00 +01:00
eb416475cc Re-add mesecon.register_mvps_unmov(objectname) since other mods (pipeworks) are using it 2015-02-19 14:27:20 +01:00
1ee3b2107d Fix movestones sometimes not starting to move again when they are at the
end of the wire
2015-02-17 20:02:24 +01:00
1df6e5a03b Rewrite movestones, make them nodes instead of entities 2015-02-14 13:35:50 +01:00
b7076e635c Merge pull request #222 from MT-Modder/stoppers-2
Register only locked nodes as stoppers
2015-02-14 09:22:56 +01:00
6d9f44455c Register only locked nodes as stoppers
This was suggested here:
https://github.com/Jeija/minetest-mod-mesecons/pull/216
2015-02-13 23:58:36 -05:00
8bf5b7d0e4 Fix #219, do not try to override unregistered doors 2015-02-14 00:02:19 +01:00
14281a1bd4 Merge pull request #221 from MT-Modder/remove-from-group
Remove insulated t-junction and crossover from craftable group
2015-02-13 23:51:42 +01:00
1d93a51f6e Remove insulated t-junction and crossover from craftable group 2015-02-13 17:02:09 -05:00
639fc8988e Fix onstate sticky piston drop: Must be sticky instead of normal piston
Thanks to HybridDog for spotting that
2015-02-05 20:26:51 +01:00
a9ec0a10c0 Merge pull request #216 from MT-Modder/mvps-additions
Register chests and bookshelves as stoppers
2015-02-05 16:23:58 +01:00
775d250112 Add meshes for water turbine and and wall lever instead of nodeboxes
Adjust textures and inventory images to it
2015-02-05 15:40:08 +01:00
3c06da7908 Register chests and bookshelves as stoppers 2015-02-05 00:57:33 -05:00
242 changed files with 2130 additions and 1022 deletions

View File

@ -22,7 +22,7 @@ OK, I want in.
-------------- --------------
Go get it! Go get it!
[DOWNLOADS PAGE](http://mesecons.net/downloads.php) [DOWNLOAD IT NOW](https://github.com/Jeija/minetest-mod-mesecons/archive/master.zip)
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: 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:
@ -39,7 +39,7 @@ How do I use this thing?
------------------------ ------------------------
How about a [quick overview video](https://www.youtube.com/watch?v=6kmeQj6iW5k)? 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? Or maybe a [comprehensive reference](http://mesecons.net/items.html) 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? An overview for the very newest of new beginners? How does [this one](http://uberi.mesecons.net/projects/MeseconsBasics/index.html) look?

62
documentation.json Normal file
View File

@ -0,0 +1,62 @@
{
"Conductors" : {
"Mesecon" : "mesecons/doc/mesecon",
"Insulated Wire" : "mesecons_insulated/doc/insulated",
"T-Junction" : "mesecons_extrawires/doc/tjunction",
"Crossing" : "mesecons_extrawires/doc/crossing",
"Corner" : "mesecons_extrawires/doc/corner",
"Vertical Wire" : "mesecons_extrawires/doc/vertical",
"Mese" : "mesecons_extrawires/doc/mese"
},
"Receptors" : {
"Power Plant" : "mesecons_powerplant/doc/powerplant",
"Blinky Plant" : "mesecons_blinkyplant/doc/blinkyplant",
"Switch" : "mesecons_switch/doc/switch",
"Object Detector" : "mesecons_detector/doc/objectdetector",
"Node Detector" : "mesecons_detector/doc/nodedetector",
"Wall Lever" : "mesecons_walllever/doc/walllever",
"Pressure Plate" : "mesecons_pressureplates/doc/pressureplate_wood",
"Pressure Plate" : "mesecons_pressureplates/doc/pressureplate_stone",
"Water Turbine" : "mesecons_hydroturbine/doc/waterturbine",
"Solar Panel" : "mesecons_solarpanel/doc/solarpanel",
"Wall Button" : "mesecons_button/doc/button"
},
"Effectors" : {
"Noteblock" : "mesecons_noteblock/doc/noteblock",
"Lamp" : "mesecons_lamp/doc/lamp",
"Piston" : "mesecons_pistons/doc/piston",
"Sticky Piston" : "mesecons_pistons/doc/piston_sticky",
"Movestone" : "mesecons_movestones/doc/movestone",
"Sticky Movestone" : "mesecons_movestones/doc/movestone_sticky",
"Removestone" : "mesecons_random/doc/removestone",
"Ghoststone" : "mesecons_random/doc/ghoststone",
"Command Block" : "mesecons_commandblock/doc/commandblock",
"Lightstones" : {
"Dark Grey" : "mesecons_lightstone/doc/lightstone_darkgrey",
"Light Grey" : "mesecons_lightstone/doc/lightstone_lightgrey",
"Green" : "mesecons_lightstone/doc/lightstone_green",
"Red" : "mesecons_lightstone/doc/lightstone_red",
"Blue" : "mesecons_lightstone/doc/lightstone_blue",
"Yellow" : "mesecons_lightstone/doc/lightstone_yellow"
}
},
"Logic" : {
"Luacontroller" : "mesecons_luacontroller/doc/luacontroller",
"Torch" : "mesecons_torch/doc/torch",
"Delayer" : "mesecons_delayer/doc/delayer",
"Gates" : {
"Diode" : "mesecons_gates/doc/diode",
"NOT Gate" : "mesecons_gates/doc/not",
"AND Gate" : "mesecons_gates/doc/and",
"NAND Gate" : "mesecons_gates/doc/nand",
"OR Gate" : "mesecons_gates/doc/or",
"NOR Gate" : "mesecons_gates/doc/nor",
"XOR Gate" : "mesecons_gates/doc/xor"
}
},
"Crafts" : {
"Silicon" : "mesecons_materials/doc/silicon",
"Glue" : "mesecons_materials/doc/glue",
"Fiber" : "mesecons_materials/doc/fiber"
}
}

View File

@ -1 +0,0 @@
0.41 DEV

View File

@ -23,7 +23,7 @@ function mesecon.queue:add_action(pos, func, params, time, overwritecheck, prior
-- Otherwise, add the action to the queue -- Otherwise, add the action to the queue
if overwritecheck then -- check if old action has to be overwritten / removed: if overwritecheck then -- check if old action has to be overwritten / removed:
for i, ac in ipairs(mesecon.queue.actions) do for i, ac in ipairs(mesecon.queue.actions) do
if(mesecon.cmpPos(pos, ac.pos) if(vector.equals(pos, ac.pos)
and mesecon.cmpAny(overwritecheck, ac.owcheck)) then and mesecon.cmpAny(overwritecheck, ac.owcheck)) then
toremove = i toremove = i
break break
@ -94,25 +94,8 @@ end
-- Store and read the ActionQueue to / from a file -- Store and read the ActionQueue to / from a file
-- so that upcoming actions are remembered when the game -- so that upcoming actions are remembered when the game
-- is restarted -- is restarted
mesecon.queue.actions = mesecon.file2table("mesecon_actionqueue")
local wpath = minetest.get_worldpath()
local function file2table(filename)
local f = io.open(filename, "r")
if f==nil then return {} end
local t = f:read("*all")
f:close()
if t=="" or t==nil then return {} end
return minetest.deserialize(t)
end
local function table2file(filename, table)
local f = io.open(filename, "w")
f:write(minetest.serialize(table))
f:close()
end
mesecon.queue.actions = file2table(wpath.."/mesecon_actionqueue")
minetest.register_on_shutdown(function() minetest.register_on_shutdown(function()
mesecon.queue.actions = table2file(wpath.."/mesecon_actionqueue", mesecon.queue.actions) mesecon.table2file("mesecon_actionqueue", mesecon.queue.actions)
end) end)

View File

@ -0,0 +1 @@
Mesecons are the wires, use them to connect effectors with receptors.

BIN
mesecons/doc/mesecon/preview.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -74,7 +74,7 @@ mesecon.queue:add_function("receptor_on", function (pos, rules)
-- if area (any of the rule targets) is not loaded, keep trying and call this again later -- if area (any of the rule targets) is not loaded, keep trying and call this again later
for _, rule in ipairs(mesecon.flattenrules(rules)) do for _, rule in ipairs(mesecon.flattenrules(rules)) do
local np = mesecon.addPosRule(pos, rule) local np = vector.add(pos, rule)
-- if area is not loaded, keep trying -- if area is not loaded, keep trying
if minetest.get_node_or_nil(np) == nil then if minetest.get_node_or_nil(np) == nil then
mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules) mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules)
@ -84,7 +84,7 @@ mesecon.queue:add_function("receptor_on", function (pos, rules)
-- execute action -- execute action
for _, rule in ipairs(mesecon.flattenrules(rules)) do for _, rule in ipairs(mesecon.flattenrules(rules)) do
local np = mesecon.addPosRule(pos, rule) local np = vector.add(pos, rule)
local rulenames = mesecon.rules_link_rule_all(pos, rule) local rulenames = mesecon.rules_link_rule_all(pos, rule)
for _, rulename in ipairs(rulenames) do for _, rulename in ipairs(rulenames) do
mesecon.turnon(np, rulename) mesecon.turnon(np, rulename)
@ -101,7 +101,7 @@ mesecon.queue:add_function("receptor_off", function (pos, rules)
-- if area (any of the rule targets) is not loaded, keep trying and call this again later -- if area (any of the rule targets) is not loaded, keep trying and call this again later
for _, rule in ipairs(mesecon.flattenrules(rules)) do for _, rule in ipairs(mesecon.flattenrules(rules)) do
local np = mesecon.addPosRule(pos, rule) local np = vector.add(pos, rule)
if minetest.get_node_or_nil(np) == nil then if minetest.get_node_or_nil(np) == nil then
mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules) mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules)
return return
@ -109,7 +109,7 @@ mesecon.queue:add_function("receptor_off", function (pos, rules)
end end
for _, rule in ipairs(mesecon.flattenrules(rules)) do for _, rule in ipairs(mesecon.flattenrules(rules)) do
local np = mesecon.addPosRule(pos, rule) local np = vector.add(pos, rule)
local rulenames = mesecon.rules_link_rule_all(pos, rule) local rulenames = mesecon.rules_link_rule_all(pos, rule)
for _, rulename in ipairs(rulenames) do for _, rulename in ipairs(rulenames) do
if not mesecon.connected_to_receptor(np, mesecon.invertRule(rule)) then if not mesecon.connected_to_receptor(np, mesecon.invertRule(rule)) then

View File

@ -77,6 +77,8 @@ function mesecon.get_conductor(nodename)
end end
function mesecon.get_any_outputrules (node) function mesecon.get_any_outputrules (node)
if not node then return nil end
if mesecon.is_conductor(node.name) then if mesecon.is_conductor(node.name) then
return mesecon.conductor_get_rules(node) return mesecon.conductor_get_rules(node)
elseif mesecon.is_receptor(node.name) then elseif mesecon.is_receptor(node.name) then
@ -85,6 +87,8 @@ function mesecon.get_any_outputrules (node)
end end
function mesecon.get_any_inputrules (node) function mesecon.get_any_inputrules (node)
if not node then return nil end
if mesecon.is_conductor(node.name) then if mesecon.is_conductor(node.name) then
return mesecon.conductor_get_rules(node) return mesecon.conductor_get_rules(node)
elseif mesecon.is_effector(node.name) then elseif mesecon.is_effector(node.name) then
@ -182,7 +186,9 @@ end
-- Activation: -- Activation:
mesecon.queue:add_function("activate", function (pos, rulename) mesecon.queue:add_function("activate", function (pos, rulename)
local node = minetest.get_node(pos) local node = mesecon.get_node_force(pos)
if not node then return end
local effector = mesecon.get_effector(node.name) local effector = mesecon.get_effector(node.name)
if effector and effector.action_on then if effector and effector.action_on then
@ -203,7 +209,9 @@ end
-- Deactivation -- Deactivation
mesecon.queue:add_function("deactivate", function (pos, rulename) mesecon.queue:add_function("deactivate", function (pos, rulename)
local node = minetest.get_node(pos) local node = mesecon.get_node_force(pos)
if not node then return end
local effector = mesecon.get_effector(node.name) local effector = mesecon.get_effector(node.name)
if effector and effector.action_off then if effector and effector.action_off then
@ -224,7 +232,9 @@ end
-- Change -- Change
mesecon.queue:add_function("change", function (pos, rulename, changetype) mesecon.queue:add_function("change", function (pos, rulename, changetype)
local node = minetest.get_node(pos) local node = mesecon.get_node_force(pos)
if not node then return end
local effector = mesecon.get_effector(node.name) local effector = mesecon.get_effector(node.name)
if effector and effector.action_change then if effector and effector.action_change then
@ -249,6 +259,8 @@ end
-- Conductors -- Conductors
function mesecon.is_conductor_on(node, rulename) function mesecon.is_conductor_on(node, rulename)
if not node then return false end
local conductor = mesecon.get_conductor(node.name) local conductor = mesecon.get_conductor(node.name)
if conductor then if conductor then
if conductor.state then if conductor.state then
@ -263,10 +275,13 @@ function mesecon.is_conductor_on(node, rulename)
return mesecon.get_bit(binstate, bit) return mesecon.get_bit(binstate, bit)
end end
end end
return false return false
end end
function mesecon.is_conductor_off(node, rulename) function mesecon.is_conductor_off(node, rulename)
if not node then return false end
local conductor = mesecon.get_conductor(node.name) local conductor = mesecon.get_conductor(node.name)
if conductor then if conductor then
if conductor.state then if conductor.state then
@ -281,6 +296,7 @@ function mesecon.is_conductor_off(node, rulename)
return not mesecon.get_bit(binstate, bit) return not mesecon.get_bit(binstate, bit)
end end
end end
return false return false
end end
@ -340,16 +356,16 @@ end
-- some more general high-level stuff -- some more general high-level stuff
function mesecon.is_power_on(pos, rulename) function mesecon.is_power_on(pos, rulename)
local node = minetest.get_node(pos) local node = mesecon.get_node_force(pos)
if mesecon.is_conductor_on(node, rulename) or mesecon.is_receptor_on(node.name) then if node and (mesecon.is_conductor_on(node, rulename) or mesecon.is_receptor_on(node.name)) then
return true return true
end end
return false return false
end end
function mesecon.is_power_off(pos, rulename) function mesecon.is_power_off(pos, rulename)
local node = minetest.get_node(pos) local node = mesecon.get_node_force(pos)
if mesecon.is_conductor_off(node, rulename) or mesecon.is_receptor_off(node.name) then if node and (mesecon.is_conductor_off(node, rulename) or mesecon.is_receptor_off(node.name)) then
return true return true
end end
return false return false
@ -361,7 +377,7 @@ function mesecon.turnon(pos, link)
local depth = 1 local depth = 1
while frontiers[depth] do while frontiers[depth] do
local f = frontiers[depth] local f = frontiers[depth]
local node = minetest.get_node_or_nil(f.pos) local node = mesecon.get_node_force(f.pos)
-- area not loaded, postpone action -- area not loaded, postpone action
if not node then if not node then
@ -374,10 +390,10 @@ function mesecon.turnon(pos, link)
-- call turnon on neighbors: normal rules -- call turnon on neighbors: normal rules
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
local np = mesecon.addPosRule(f.pos, r) local np = vector.add(f.pos, r)
-- area not loaded, postpone action -- area not loaded, postpone action
if not minetest.get_node_or_nil(np) then if not mesecon.get_node_force(np) then
mesecon.queue:add_action(np, "turnon", {rulename}, mesecon.queue:add_action(np, "turnon", {rulename},
nil, true) nil, true)
else else
@ -407,7 +423,7 @@ function mesecon.turnoff(pos, link)
local depth = 1 local depth = 1
while frontiers[depth] do while frontiers[depth] do
local f = frontiers[depth] local f = frontiers[depth]
local node = minetest.get_node_or_nil(f.pos) local node = mesecon.get_node_force(f.pos)
-- area not loaded, postpone action -- area not loaded, postpone action
if not node then if not node then
@ -420,10 +436,10 @@ function mesecon.turnoff(pos, link)
-- call turnoff on neighbors: normal rules -- call turnoff on neighbors: normal rules
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
local np = mesecon.addPosRule(f.pos, r) local np = vector.add(f.pos, r)
-- area not loaded, postpone action -- area not loaded, postpone action
if not minetest.get_node_or_nil(np) then if not mesecon.get_node_force(np) then
mesecon.queue:add_action(np, "turnoff", {rulename}, mesecon.queue:add_action(np, "turnoff", {rulename},
nil, true) nil, true)
else else
@ -449,7 +465,8 @@ end)
function mesecon.connected_to_receptor(pos, link) function mesecon.connected_to_receptor(pos, link)
local node = minetest.get_node(pos) local node = mesecon.get_node_force(pos)
if not node then return false end
-- Check if conductors around are connected -- Check if conductors around are connected
local rules = mesecon.get_any_inputrules(node) local rules = mesecon.get_any_inputrules(node)
@ -458,7 +475,7 @@ function mesecon.connected_to_receptor(pos, link)
for _, rule in ipairs(mesecon.rule2meta(link, rules)) do for _, rule in ipairs(mesecon.rule2meta(link, rules)) do
local links = mesecon.rules_link_rule_all_inverted(pos, rule) local links = mesecon.rules_link_rule_all_inverted(pos, rule)
for _, l in ipairs(links) do for _, l in ipairs(links) do
local np = mesecon.addPosRule(pos, l) local np = vector.add(pos, l)
if mesecon.find_receptor_on(np, mesecon.invertRule(l)) then if mesecon.find_receptor_on(np, mesecon.invertRule(l)) then
return true return true
end end
@ -476,7 +493,7 @@ function mesecon.find_receptor_on(pos, link)
local depth = 1 local depth = 1
while frontiers[depth] do while frontiers[depth] do
local f = frontiers[depth] local f = frontiers[depth]
local node = minetest.get_node_or_nil(f.pos) local node = mesecon.get_node_force(f.pos)
if not node then return false end if not node then return false end
if mesecon.is_receptor_on(node.name) then return true end if mesecon.is_receptor_on(node.name) then return true end
@ -485,7 +502,7 @@ function mesecon.find_receptor_on(pos, link)
-- call turnoff on neighbors: normal rules -- call turnoff on neighbors: normal rules
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
local np = mesecon.addPosRule(f.pos, r) local np = vector.add(f.pos, r)
local links = mesecon.rules_link_rule_all_inverted(f.pos, r) local links = mesecon.rules_link_rule_all_inverted(f.pos, r)
for _, l in ipairs(links) do for _, l in ipairs(links) do
@ -503,8 +520,9 @@ function mesecon.find_receptor_on(pos, link)
end 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 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.get_node(output) local outputnode = mesecon.get_node_force(output)
local inputnode = minetest.get_node(input) local inputnode = mesecon.get_node_force(input)
local outputrules = dug_outputrules or mesecon.get_any_outputrules (outputnode) local outputrules = dug_outputrules or mesecon.get_any_outputrules (outputnode)
local inputrules = mesecon.get_any_inputrules (inputnode) local inputrules = mesecon.get_any_inputrules (inputnode)
if not outputrules or not inputrules then if not outputrules or not inputrules then
@ -513,21 +531,22 @@ function mesecon.rules_link(output, input, dug_outputrules) --output/input are p
for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do
-- Check if output sends to input -- Check if output sends to input
if mesecon.cmpPos(mesecon.addPosRule(output, outputrule), input) then if vector.equals(vector.add(output, outputrule), input) then
for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do
-- Check if input accepts from output -- Check if input accepts from output
if mesecon.cmpPos(mesecon.addPosRule(input, inputrule), output) then if vector.equals(vector.add(input, inputrule), output) then
return true, inputrule return true, inputrule
end end
end end
end end
end end
return false return false
end end
function mesecon.rules_link_rule_all(output, rule) function mesecon.rules_link_rule_all(output, rule)
local input = mesecon.addPosRule(output, rule) local input = vector.add(output, rule)
local inputnode = minetest.get_node(input) local inputnode = mesecon.get_node_force(input)
local inputrules = mesecon.get_any_inputrules (inputnode) local inputrules = mesecon.get_any_inputrules (inputnode)
if not inputrules then if not inputrules then
return {} return {}
@ -536,17 +555,18 @@ function mesecon.rules_link_rule_all(output, rule)
for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do
-- Check if input accepts from output -- Check if input accepts from output
if mesecon.cmpPos(mesecon.addPosRule(input, inputrule), output) then if vector.equals(vector.add(input, inputrule), output) then
table.insert(rules, inputrule) table.insert(rules, inputrule)
end end
end end
return rules return rules
end end
function mesecon.rules_link_rule_all_inverted(input, rule) function mesecon.rules_link_rule_all_inverted(input, rule)
--local irule = mesecon.invertRule(rule) --local irule = mesecon.invertRule(rule)
local output = mesecon.addPosRule(input, rule) local output = vector.add(input, rule)
local outputnode = minetest.get_node(output) local outputnode = mesecon.get_node_force(output)
local outputrules = mesecon.get_any_outputrules (outputnode) local outputrules = mesecon.get_any_outputrules (outputnode)
if not outputrules then if not outputrules then
return {} return {}
@ -554,7 +574,7 @@ function mesecon.rules_link_rule_all_inverted(input, rule)
local rules = {} local rules = {}
for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do
if mesecon.cmpPos(mesecon.addPosRule(output, outputrule), input) then if vector.equals(vector.add(output, outputrule), input) then
table.insert(rules, mesecon.invertRule(outputrule)) table.insert(rules, mesecon.invertRule(outputrule))
end end
end end
@ -566,7 +586,7 @@ function mesecon.rules_link_anydir(pos1, pos2)
end end
function mesecon.is_powered(pos, rule) function mesecon.is_powered(pos, rule)
local node = minetest.get_node(pos) local node = mesecon.get_node_force(pos)
local rules = mesecon.get_any_inputrules(node) local rules = mesecon.get_any_inputrules(node)
if not rules then return false end if not rules then return false end
@ -577,10 +597,11 @@ function mesecon.is_powered(pos, rule)
for _, rule in ipairs(mesecon.flattenrules(rules)) do for _, rule in ipairs(mesecon.flattenrules(rules)) do
local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule) local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule)
for _, rname in ipairs(rulenames) do for _, rname in ipairs(rulenames) do
local np = mesecon.addPosRule(pos, rname) local np = vector.add(pos, rname)
local nn = minetest.get_node(np) local nn = mesecon.get_node_force(np)
if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname))
or mesecon.is_receptor_on (nn.name)) then if (mesecon.is_conductor_on(nn, mesecon.invertRule(rname))
or mesecon.is_receptor_on(nn.name)) then
table.insert(sourcepos, np) table.insert(sourcepos, np)
end end
end end
@ -588,8 +609,8 @@ function mesecon.is_powered(pos, rule)
else else
local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule) local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule)
for _, rname in ipairs(rulenames) do for _, rname in ipairs(rulenames) do
local np = mesecon.addPosRule(pos, rname) local np = vector.add(pos, rname)
local nn = minetest.get_node(np) local nn = mesecon.get_node_force(np)
if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname)) if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname))
or mesecon.is_receptor_on (nn.name)) then or mesecon.is_receptor_on (nn.name)) then
table.insert(sourcepos, np) table.insert(sourcepos, np)

View File

@ -30,7 +30,7 @@ minetest.register_node("mesecons:mesecon_on", {
}, },
groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1}, groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1},
drop = "mesecons:mesecon_off 1", drop = "mesecons:mesecon_off 1",
light_source = LIGHT_MAX-11, light_source = default.LIGHT_MAX-11,
mesecons = {conductor={ mesecons = {conductor={
state = mesecon.state.on, state = mesecon.state.on,
offstate = "mesecons:mesecon_off" offstate = "mesecons:mesecon_off"

View File

@ -31,6 +31,14 @@ mesecon.rules.flat =
{x = 0, y = 0, z = 1}, {x = 0, y = 0, z = 1},
{x = 0, y = 0, z =-1}} {x = 0, y = 0, z =-1}}
mesecon.rules.alldirs =
{{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}}
mesecon.rules.buttonlike_get = function(node) mesecon.rules.buttonlike_get = function(node)
local rules = mesecon.rules.buttonlike local rules = mesecon.rules.buttonlike
if node.param2 == 2 then if node.param2 == 2 then

View File

@ -16,7 +16,7 @@ mesecon.on_placenode = function (pos, node)
-- also call receptor_on if itself is powered already, so that neighboring -- also call receptor_on if itself is powered already, so that neighboring
-- conductors will be activated (when pushing an on-conductor with a piston) -- conductors will be activated (when pushing an on-conductor with a piston)
for _, s in ipairs(sources) do for _, s in ipairs(sources) do
local rule = {x = pos.x - s.x, y = pos.y - s.y, z = pos.z - s.z} local rule = vector.subtract(pos, s)
mesecon.turnon(pos, rule) mesecon.turnon(pos, rule)
end end
--mesecon.receptor_on (pos, mesecon.conductor_get_rules(node)) --mesecon.receptor_on (pos, mesecon.conductor_get_rules(node))
@ -28,11 +28,13 @@ mesecon.on_placenode = function (pos, node)
-- Effectors: Send changesignal and activate or deactivate -- Effectors: Send changesignal and activate or deactivate
if mesecon.is_effector(node.name) then if mesecon.is_effector(node.name) then
local powered_rules = {} local powered_rules = {}
local unpowered_rules = {}
-- for each input rule, check if powered -- for each input rule, check if powered
for _, r in ipairs(mesecon.effector_get_rules(node)) do for _, r in ipairs(mesecon.effector_get_rules(node)) do
local powered = mesecon.is_powered(pos, r) local powered = mesecon.is_powered(pos, r)
if powered then table.insert(powered_rules, r) end if powered then table.insert(powered_rules, r)
else table.insert(unpowered_rules, r) end
local state = powered and mesecon.state.on or mesecon.state.off local state = powered and mesecon.state.on or mesecon.state.off
mesecon.changesignal(pos, node, r, state, 1) mesecon.changesignal(pos, node, r, state, 1)
@ -42,6 +44,10 @@ mesecon.on_placenode = function (pos, node)
for _, r in ipairs(powered_rules) do for _, r in ipairs(powered_rules) do
mesecon.activate(pos, node, r, 1) mesecon.activate(pos, node, r, 1)
end end
else
for _, r in ipairs(unpowered_rules) do
mesecon.deactivate(pos, node, r, 1)
end
end end
end end
end end

View File

@ -1,7 +1,12 @@
-- SETTINGS -- SETTINGS
function mesecon.setting(setting, default) function mesecon.setting(setting, default)
if type(default) == "bool" then if type(default) == "boolean" then
return minetest.setting_getbool("mesecon."..setting) or default local read = minetest.setting_getbool("mesecon."..setting)
if read == nil then
return default
else
return read
end
elseif type(default) == "string" then elseif type(default) == "string" then
return minetest.setting_get("mesecon."..setting) or default return minetest.setting_get("mesecon."..setting) or default
elseif type(default) == "number" then elseif type(default) == "number" then

View File

@ -2,7 +2,7 @@ function mesecon.move_node(pos, newpos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos):to_table() local meta = minetest.get_meta(pos):to_table()
minetest.remove_node(pos) minetest.remove_node(pos)
minetest.add_node(newpos, node) minetest.set_node(newpos, node)
minetest.get_meta(pos):from_table(meta) minetest.get_meta(pos):from_table(meta)
end end
@ -50,7 +50,7 @@ function mesecon.rule2bit(findrule, allrules)
end end
for m,metarule in ipairs( allrules) do for m,metarule in ipairs( allrules) do
for _, rule in ipairs(metarule ) do for _, rule in ipairs(metarule ) do
if mesecon.cmpPos(findrule, rule) then if vector.equals(findrule, rule) then
return m return m
end end
end end
@ -69,7 +69,7 @@ function mesecon.rule2metaindex(findrule, allrules)
for m, metarule in ipairs( allrules) do for m, metarule in ipairs( allrules) do
for _, rule in ipairs(metarule ) do for _, rule in ipairs(metarule ) do
if mesecon.cmpPos(findrule, rule) then if vector.equals(findrule, rule) then
return m return m
end end
end end
@ -133,15 +133,7 @@ function mesecon.set_bit(binary,bit,value)
end end
function mesecon.invertRule(r) function mesecon.invertRule(r)
return {x = -r.x, y = -r.y, z = -r.z} return vector.multiply(r, -1)
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 end
function mesecon.tablecopy(table) -- deep table copy function mesecon.tablecopy(table) -- deep table copy
@ -209,3 +201,75 @@ function mesecon.flipstate(pos, node)
return newstate return newstate
end end
-- File writing / reading utilities
local wpath = minetest.get_worldpath()
function mesecon.file2table(filename)
local f = io.open(wpath..DIR_DELIM..filename, "r")
if f == nil then return {} end
local t = f:read("*all")
f:close()
if t == "" or t == nil then return {} end
return minetest.deserialize(t)
end
function mesecon.table2file(filename, table)
local f = io.open(wpath..DIR_DELIM..filename, "w")
f:write(minetest.serialize(table))
f:close()
end
-- Forceloading: Force server to load area if node is nil
local BLOCKSIZE = 16
-- convert node position --> block hash
local function hash_blockpos(pos)
return minetest.hash_node_position({
x = math.floor(pos.x/BLOCKSIZE),
y = math.floor(pos.y/BLOCKSIZE),
z = math.floor(pos.z/BLOCKSIZE)
})
end
-- convert block hash --> node position
local function unhash_blockpos(hash)
return vector.multiply(minetest.get_position_from_hash(hash), BLOCKSIZE)
end
mesecon.forceloaded_blocks = {}
-- get node and force-load area
function mesecon.get_node_force(pos)
local hash = hash_blockpos(pos)
if mesecon.forceloaded_blocks[hash] == nil then
-- if no more forceload spaces are available, try again next time
if minetest.forceload_block(pos) then
mesecon.forceloaded_blocks[hash] = 0
end
else
mesecon.forceloaded_blocks[hash] = 0
end
return minetest.get_node_or_nil(pos)
end
minetest.register_globalstep(function (dtime)
for hash, time in pairs(mesecon.forceloaded_blocks) do
-- unload forceloaded blocks after 10 minutes without usage
if (time > mesecon.setting("forceload_timeout", 600)) then
minetest.forceload_free_block(unhash_blockpos(hash))
mesecon.forceloaded_blocks[hash] = nil
else
mesecon.forceloaded_blocks[hash] = time + dtime
end
end
end)
-- Store and read the forceloaded blocks to / from a file
-- so that those blocks are remembered when the game
-- is restarted
mesecon.forceloaded_blocks = mesecon.file2table("mesecon_forceloaded")
minetest.register_on_shutdown(function()
mesecon.table2file("mesecon_forceloaded", mesecon.forceloaded_blocks)
end)

View File

@ -22,7 +22,7 @@ local wire_getconnect = function (from_pos, self_pos)
end end
for _, r in ipairs(mesecon.flattenrules(rules)) do for _, r in ipairs(mesecon.flattenrules(rules)) do
if (mesecon.cmpPos(mesecon.addPosRule(self_pos, r), from_pos)) then if (vector.equals(vector.add(self_pos, r), from_pos)) then
return true return true
end end
end end
@ -35,7 +35,7 @@ local wire_updateconnect = function (pos)
local connections = {} local connections = {}
for _, r in ipairs(mesecon.rules.default) do for _, r in ipairs(mesecon.rules.default) do
if wire_getconnect(pos, mesecon.addPosRule(pos, r)) then if wire_getconnect(pos, vector.add(pos, r)) then
table.insert(connections, r) table.insert(connections, r)
end end
end end
@ -83,7 +83,7 @@ local update_on_place_dig = function (pos, node)
if (not rules) then return end if (not rules) then return end
for _, r in ipairs(mesecon.flattenrules(rules)) do for _, r in ipairs(mesecon.flattenrules(rules)) do
local np = mesecon.addPosRule(pos, r) local np = vector.add(pos, r)
if minetest.registered_nodes[minetest.get_node(np).name] if minetest.registered_nodes[minetest.get_node(np).name]
and minetest.registered_nodes[minetest.get_node(np).name].mesecon_wire then and minetest.registered_nodes[minetest.get_node(np).name].mesecon_wire then
wire_updateconnect(np) wire_updateconnect(np)

View File

@ -0,0 +1 @@
The blinky plants toggles between on and off state every three seconds. Can be used to make clocks. Also works after having restarted the game.

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1 @@
This receptor can be attached to walls. It turns on for 1 second if it's punched.

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -40,7 +40,7 @@ minetest.register_node("mesecons_button:button_off", {
}, },
groups = {dig_immediate=2, mesecon_needs_receiver = 1}, groups = {dig_immediate=2, mesecon_needs_receiver = 1},
description = "Button", description = "Button",
on_punch = function (pos, node) on_rightclick = function (pos, node)
minetest.swap_node(pos, {name = "mesecons_button:button_on", param2=node.param2}) minetest.swap_node(pos, {name = "mesecons_button:button_on", param2=node.param2})
mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node)) mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node))
minetest.sound_play("mesecons_button_push", {pos=pos}) minetest.sound_play("mesecons_button_push", {pos=pos})
@ -67,7 +67,7 @@ minetest.register_node("mesecons_button:button_on", {
paramtype2 = "facedir", paramtype2 = "facedir",
legacy_wallmounted = true, legacy_wallmounted = true,
walkable = false, walkable = false,
light_source = LIGHT_MAX-7, light_source = default.LIGHT_MAX-7,
sunlight_propagates = true, sunlight_propagates = true,
selection_box = { selection_box = {
type = "fixed", type = "fixed",

View File

@ -0,0 +1 @@
There is no crafting recipe as this should only be available for server admins. Quite similar to the Minecraft counterpart. Executes server commands.

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -43,7 +43,7 @@ minetest.register_chatcommand("hp", {
}) })
local function initialize_data(meta) local function initialize_data(meta)
local commands = meta:get_string("commands") local commands = minetest.formspec_escape(meta:get_string("commands"))
meta:set_string("formspec", meta:set_string("formspec",
"invsize[9,5;]" .. "invsize[9,5;]" ..
"textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" .. "textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" ..

View File

@ -0,0 +1 @@
The delayer delays the signal from the input for a determined time. The time can be set by punching the delayer. Possible delays are: 0.1 seconds, 0.3 seconds, 0.5 seconds and 1 second. You may try to use it for creating songs with the noteblock.

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -0,0 +1,6 @@
The node detector is a receptor. It changes its state when either any node
or a specific node is detected. Right-click it to set a nodename to scan for.
It can also receive digiline signals. You can either send "GET" and it will
respond with the detected nodename or you can send any other string and it will
set this string as the node to scan for.
Nodenames must include the mod they reside in, so for instance default:dirt, not just dirt.

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -0,0 +1,3 @@
The object detector is a receptor. It changes its state when a player approaches.
Right-click it to set a name to scan for.
It can also receive digiline signals which are the name to scan for on the specified channel in the right-click menu.

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -4,16 +4,15 @@ local GET_COMMAND = "GET"
-- Detects players in a certain radius -- Detects players in a certain radius
-- The radius can be specified in mesecons/settings.lua -- The radius can be specified in mesecons/settings.lua
local object_detector_make_formspec = function (pos) local function object_detector_make_formspec(pos)
local meta = minetest.get_meta(pos) minetest.get_meta(pos):set_string("formspec", "size[9,2.5]" ..
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, 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}]".. "field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]"..
"button_exit[7,0.75;2,3;;Save]") "button_exit[7,0.75;2,3;;Save]")
end end
local object_detector_on_receive_fields = function(pos, formname, fields) local function object_detector_on_receive_fields(pos, _, fields)
if not fields.scanname or not fields.digiline_channel then return end; if not fields.scanname or not fields.digiline_channel then return end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("scanname", fields.scanname) meta:set_string("scanname", fields.scanname)
@ -22,25 +21,35 @@ local object_detector_on_receive_fields = function(pos, formname, fields)
end end
-- returns true if player was found, false if not -- returns true if player was found, false if not
local object_detector_scan = function (pos) local function object_detector_scan(pos)
local objs = minetest.get_objects_inside_radius(pos, mesecon.setting("detector_radius", 6)) local objs = minetest.get_objects_inside_radius(pos, mesecon.setting("detector_radius", 6))
for k, obj in pairs(objs) do
local isname = obj:get_player_name() -- "" is returned if it is not a player; "" ~= nil! -- abort if no scan results were found
if next(objs) == nil then return false end
local scanname = minetest.get_meta(pos):get_string("scanname") local scanname = minetest.get_meta(pos):get_string("scanname")
if (isname == scanname and isname ~= "") or (isname ~= "" and scanname == "") then -- player with scanname found or not scanname specified local every_player = scanname == ""
for _, obj in pairs(objs) do
-- "" is returned if it is not a player; "" ~= nil; so only handle objects with foundname ~= ""
local foundname = obj:get_player_name()
if foundname ~= "" then
-- return true if scanning for any player or if specific playername was detected
if scanname == "" or foundname == scanname then
return true return true
end end
end end
end
return false return false
end end
-- set player name when receiving a digiline signal on a specific channel -- set player name when receiving a digiline signal on a specific channel
local object_detector_digiline = { local object_detector_digiline = {
effector = { effector = {
action = function (pos, node, channel, msg) action = function(pos, node, channel, msg)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local active_channel = meta:get_string("digiline_channel") if channel == meta:get_string("digiline_channel") then
if channel == active_channel then
meta:set_string("scanname", msg) meta:set_string("scanname", msg)
object_detector_make_formspec(pos) object_detector_make_formspec(pos)
end end
@ -89,43 +98,44 @@ minetest.register_craft({
} }
}) })
minetest.register_abm( minetest.register_abm({
{nodenames = {"mesecons_detector:object_detector_off"}, nodenames = {"mesecons_detector:object_detector_off"},
interval = 1.0, interval = 1,
chance = 1, chance = 1,
action = function(pos) action = function(pos, node)
if object_detector_scan(pos) then if not object_detector_scan(pos) then return end
minetest.swap_node(pos, {name = "mesecons_detector:object_detector_on"})
node.name = "mesecons_detector:object_detector_on"
minetest.swap_node(pos, node)
mesecon.receptor_on(pos, mesecon.rules.pplate) mesecon.receptor_on(pos, mesecon.rules.pplate)
end
end, end,
}) })
minetest.register_abm( minetest.register_abm({
{nodenames = {"mesecons_detector:object_detector_on"}, nodenames = {"mesecons_detector:object_detector_on"},
interval = 1.0, interval = 1,
chance = 1, chance = 1,
action = function(pos) action = function(pos, node)
if not object_detector_scan(pos) then if object_detector_scan(pos) then return end
minetest.swap_node(pos, {name = "mesecons_detector:object_detector_off"})
node.name = "mesecons_detector:object_detector_off"
minetest.swap_node(pos, node)
mesecon.receptor_off(pos, mesecon.rules.pplate) mesecon.receptor_off(pos, mesecon.rules.pplate)
end
end, end,
}) })
-- Node detector -- Node detector
-- Detects the node in front of it -- Detects the node in front of it
local node_detector_make_formspec = function (pos) local function node_detector_make_formspec(pos)
local meta = minetest.get_meta(pos) minetest.get_meta(pos):set_string("formspec", "size[9,2.5]" ..
meta:set_string("formspec", "size[9,2.5]" ..
"field[0.3, 0;9,2;scanname;Name of node to scan for (empty for any):;${scanname}]".. "field[0.3, 0;9,2;scanname;Name of node to scan for (empty for any):;${scanname}]"..
"field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]".. "field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]"..
"button_exit[7,0.75;2,3;;Save]") "button_exit[7,0.75;2,3;;Save]")
end end
local node_detector_on_receive_fields = function(pos, formname, fields) local function node_detector_on_receive_fields(pos, _, fields)
if not fields.scanname or not fields.digiline_channel then return end; if not fields.scanname or not fields.digiline_channel then return end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("scanname", fields.scanname) meta:set_string("scanname", fields.scanname)
@ -133,37 +143,59 @@ local node_detector_on_receive_fields = function(pos, formname, fields)
node_detector_make_formspec(pos) node_detector_make_formspec(pos)
end end
-- returns true if player was found, false if not -- returns true if node was found, false if not
local node_detector_scan = function (pos) local function node_detector_scan(pos)
local node = minetest.get_node(pos) local node = minetest.get_node_or_nil(pos)
local frontpos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) if not node then return end
local frontnode = minetest.get_node(frontpos)
local meta = minetest.get_meta(pos) local frontname = minetest.get_node(
return (frontnode.name == meta:get_string("scanname")) or vector.subtract(pos, minetest.facedir_to_dir(node.param2))
(frontnode.name ~= "air" and frontnode.name ~= "ignore" and meta:get_string("scanname") == "") ).name
local scanname = minetest.get_meta(pos):get_string("scanname")
return (frontname == scanname) or
(frontname ~= "air" and frontname ~= "ignore" and scanname == "")
end end
-- set player name when receiving a digiline signal on a specific channel -- set player name when receiving a digiline signal on a specific channel
local node_detector_digiline = { local node_detector_digiline = {
effector = { effector = {
action = function (pos, node, channel, msg) action = function(pos, node, channel, msg)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local active_channel = meta:get_string("digiline_channel") if channel ~= meta:get_string("digiline_channel") then return end
if channel == active_channel then
if msg == GET_COMMAND then if msg == GET_COMMAND then
local frontpos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) local nodename = minetest.get_node(
local name = minetest.get_node(frontpos).name vector.subtract(pos, minetest.facedir_to_dir(node.param2))
digiline:receptor_send(pos, digiline.rules.default, channel, name) ).name
digiline:receptor_send(pos, digiline.rules.default, channel, nodename)
else else
meta:set_string("scanname", msg) meta:set_string("scanname", msg)
node_detector_make_formspec(pos) node_detector_make_formspec(pos)
end end
end
end, end,
}, },
receptor = {} receptor = {}
} }
local function after_place_node_detector(pos, placer)
local placer_pos = placer:getpos()
if not placer_pos then
return
end
--correct for the player's height
if placer:is_player() then
placer_pos.y = placer_pos.y + 1.625
end
--correct for 6d facedir
local node = minetest.get_node(pos)
node.param2 = minetest.dir_to_facedir(vector.subtract(pos, placer_pos), true)
minetest.set_node(pos, node)
end
minetest.register_node("mesecons_detector:node_detector_off", { minetest.register_node("mesecons_detector:node_detector_off", {
tiles = {"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "jeija_node_detector_off.png"}, tiles = {"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "jeija_node_detector_off.png"},
paramtype = "light", paramtype = "light",
@ -176,25 +208,7 @@ minetest.register_node("mesecons_detector:node_detector_off", {
}}, }},
on_construct = node_detector_make_formspec, on_construct = node_detector_make_formspec,
on_receive_fields = node_detector_on_receive_fields, on_receive_fields = node_detector_on_receive_fields,
after_place_node = function (pos, placer) after_place_node = after_place_node_detector,
local placer_pos = placer:getpos()
--correct for the player's height
if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end
--correct for 6d facedir
if placer_pos then
local dir = {
x = pos.x - placer_pos.x,
y = pos.y - placer_pos.y,
z = pos.z - placer_pos.z
}
local node = minetest.get_node(pos)
node.param2 = minetest.dir_to_facedir(dir, true)
minetest.set_node(pos, node)
minetest.log("action", "real (6d) facedir: " .. node.param2)
end
end,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
digiline = node_detector_digiline digiline = node_detector_digiline
}) })
@ -211,25 +225,7 @@ minetest.register_node("mesecons_detector:node_detector_on", {
}}, }},
on_construct = node_detector_make_formspec, on_construct = node_detector_make_formspec,
on_receive_fields = node_detector_on_receive_fields, on_receive_fields = node_detector_on_receive_fields,
after_place_node = function (pos, placer) after_place_node = after_place_node_detector,
local placer_pos = placer:getpos()
--correct for the player's height
if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end
--correct for 6d facedir
if placer_pos then
local dir = {
x = pos.x - placer_pos.x,
y = pos.y - placer_pos.y,
z = pos.z - placer_pos.z
}
local node = minetest.get_node(pos)
node.param2 = minetest.dir_to_facedir(dir, true)
minetest.set_node(pos, node)
minetest.log("action", "real (6d) facedir: " .. node.param2)
end
end,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
digiline = node_detector_digiline digiline = node_detector_digiline
}) })
@ -243,26 +239,28 @@ minetest.register_craft({
} }
}) })
minetest.register_abm( minetest.register_abm({
{nodenames = {"mesecons_detector:node_detector_off"}, nodenames = {"mesecons_detector:node_detector_off"},
interval = 1.0, interval = 1,
chance = 1, chance = 1,
action = function(pos, node) action = function(pos, node)
if node_detector_scan(pos) then if not node_detector_scan(pos) then return end
minetest.swap_node(pos, {name = "mesecons_detector:node_detector_on", param2 = node.param2})
node.name = "mesecons_detector:node_detector_on"
minetest.swap_node(pos, node)
mesecon.receptor_on(pos) mesecon.receptor_on(pos)
end
end, end,
}) })
minetest.register_abm( minetest.register_abm({
{nodenames = {"mesecons_detector:node_detector_on"}, nodenames = {"mesecons_detector:node_detector_on"},
interval = 1.0, interval = 1,
chance = 1, chance = 1,
action = function(pos, node) action = function(pos, node)
if not node_detector_scan(pos) then if node_detector_scan(pos) then return end
minetest.swap_node(pos, {name = "mesecons_detector:node_detector_off", param2 = node.param2})
node.name = "mesecons_detector:node_detector_off"
minetest.swap_node(pos, node)
mesecon.receptor_off(pos) mesecon.receptor_off(pos)
end
end, end,
}) })

View File

@ -13,13 +13,15 @@ local function on_rightclick(pos, dir, check_name, replace, replace_dir, params)
minetest.swap_node(pos, {name = replace, param2 = p2}) minetest.swap_node(pos, {name = replace, param2 = p2})
if (minetest.get_meta(pos):get_int("right") ~= 0) == (params[1] ~= 3) then if (minetest.get_meta(pos):get_int("right") ~= 0) == (params[1] ~= 3) then
minetest.sound_play("door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) minetest.sound_play("doors_door_close", {pos = pos, gain = 0.3, max_hear_distance = 10})
else else
minetest.sound_play("door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) minetest.sound_play("doors_door_open", {pos = pos, gain = 0.3, max_hear_distance = 10})
end end
end end
local function meseconify_door(name) local function meseconify_door(name)
if minetest.registered_items[name .. "_b_1"] then
-- old style double-node doors
local function toggle_state1 (pos, node) local function toggle_state1 (pos, node)
on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
end end
@ -33,7 +35,7 @@ local function meseconify_door(name)
action_on = toggle_state1, action_on = toggle_state1,
action_off = toggle_state1, action_off = toggle_state1,
rules = mesecon.rules.pplate rules = mesecon.rules.pplate
}}, }}
}) })
minetest.override_item(name.."_b_2", { minetest.override_item(name.."_b_2", {
@ -41,8 +43,30 @@ local function meseconify_door(name)
action_on = toggle_state2, action_on = toggle_state2,
action_off = toggle_state2, action_off = toggle_state2,
rules = mesecon.rules.pplate rules = mesecon.rules.pplate
}}, }}
}) })
elseif minetest.registered_items[name .. "_a"] then
-- new style mesh node based doors
local override = {
mesecons = {effector = {
action_on = function(pos, node)
local door = doors.get(pos)
if door then
door:open()
end
end,
action_off = function(pos, node)
local door = doors.get(pos)
if door then
door:close()
end
end,
rules = mesecon.rules.pplate
}}
}
minetest.override_item(name .. "_a", override)
minetest.override_item(name .. "_b", override)
end
end end
meseconify_door("doors:door_wood") meseconify_door("doors:door_wood")
@ -65,16 +89,41 @@ local function trapdoor_switch(pos, node)
minetest.get_meta(pos):set_int("state", state == 1 and 0 or 1) minetest.get_meta(pos):set_int("state", state == 1 and 0 or 1)
end end
minetest.override_item("doors:trapdoor", { if doors and doors.get then
local override = {
mesecons = {effector = {
action_on = function(pos, node)
local door = doors.get(pos)
if door then
door:open()
end
end,
action_off = function(pos, node)
local door = doors.get(pos)
if door then
door:close()
end
end,
}},
}
minetest.override_item("doors:trapdoor", override)
minetest.override_item("doors:trapdoor_open", override)
minetest.override_item("doors:trapdoor_steel", override)
minetest.override_item("doors:trapdoor_steel_open", override)
else
if minetest.registered_nodes["doors:trapdoor"] then
minetest.override_item("doors:trapdoor", {
mesecons = {effector = { mesecons = {effector = {
action_on = trapdoor_switch, action_on = trapdoor_switch,
action_off = trapdoor_switch action_off = trapdoor_switch
}}, }},
}) })
minetest.override_item("doors:trapdoor_open", { minetest.override_item("doors:trapdoor_open", {
mesecons = {effector = { mesecons = {effector = {
action_on = trapdoor_switch, action_on = trapdoor_switch,
action_off = trapdoor_switch action_off = trapdoor_switch
}}, }},
}) })
end
end

View File

@ -41,7 +41,7 @@ minetest.register_node("mesecons_extrawires:crossover_off", {
{ -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 }, { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 },
}, },
}, },
groups = {dig_immediate=3, mesecon=3, mesecon_conductor_craftable=1}, groups = {dig_immediate=3, mesecon=3},
mesecons = { mesecons = {
conductor = { conductor = {
states = crossover_states, states = crossover_states,

View File

@ -0,0 +1 @@
Insulated corners are conductors that only conduct between the inputs (also not up or down). When placing they always point to the left in direction of your vision.

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1 @@
Insulated crossing are conductors that conduct two signals between the opposing sides, the signals are insulated to each other.

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1 @@
The basic prerequesite for mesecons, can be crafted into wires and other stuff. Have a look at the <a href="http://wiki.minetest.net/Mese">Minetest Wiki</a> for more information. Mese is a conductor. It conducts in all six directions: Up/Down/Left/Right/Forward/Backward

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -0,0 +1 @@
Insulated T-Junctions are conductors that only conduct between the inputs (also not up or down).

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1 @@
Vertical Mesecons only conduct up and down. Plates appear at the ends, at that place they also conduct to the side.

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -16,15 +16,21 @@ minetest.override_item("default:mese", {
}} }}
}) })
minetest.register_node("mesecons_extrawires:mese_powered", { -- Copy node definition of powered mese from normal mese
tiles = {minetest.registered_nodes["default:mese"].tiles[1].."^[brighten"}, -- and brighten texture tiles to indicate mese is powered
is_ground_content = true, local powered_def = mesecon.mergetable(minetest.registered_nodes["default:mese"], {
groups = {cracky=1, not_in_creative_inventory = 1}, drop = "default:mese",
sounds = default.node_sound_stone_defaults(), light_source = 5,
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.on, state = mesecon.state.on,
offstate = "default:mese", offstate = "default:mese",
rules = mesewire_rules rules = mesewire_rules
}}, }},
drop = "default:mese" groups = {cracky = 1, not_in_creative_inventory = 1}
}) })
for i, v in pairs(powered_def.tiles) do
powered_def.tiles[i] = v .. "^[brighten"
end
minetest.register_node("mesecons_extrawires:mese_powered", powered_def)

View File

@ -65,7 +65,7 @@ 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_conductor_craftable=1}, groups = {dig_immediate = 3},
mesecons = {conductor = mesecons = {conductor =
{ {
state = mesecon.state.off, state = mesecon.state.off,

View File

@ -42,33 +42,37 @@ local vertical_updatepos = function (pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if minetest.registered_nodes[node.name] if minetest.registered_nodes[node.name]
and minetest.registered_nodes[node.name].is_vertical_conductor then and minetest.registered_nodes[node.name].is_vertical_conductor then
local node_above = minetest.get_node(mesecon.addPosRule(pos, vertical_rules[1])) local node_above = minetest.get_node(vector.add(pos, vertical_rules[1]))
local node_below = minetest.get_node(mesecon.addPosRule(pos, vertical_rules[2])) local node_below = minetest.get_node(vector.add(pos, vertical_rules[2]))
local namestate = minetest.registered_nodes[node.name].vertical_conductor_state
local above = minetest.registered_nodes[node_above.name] local above = minetest.registered_nodes[node_above.name]
and minetest.registered_nodes[node_above.name].is_vertical_conductor and minetest.registered_nodes[node_above.name].is_vertical_conductor
local below = minetest.registered_nodes[node_below.name] local below = minetest.registered_nodes[node_below.name]
and minetest.registered_nodes[node_below.name].is_vertical_conductor and minetest.registered_nodes[node_below.name].is_vertical_conductor
local basename = "mesecons_extrawires:vertical_" mesecon.on_dignode(pos, node)
-- Always place offstate conductor and let mesecon.on_placenode take care
local newname = "mesecons_extrawires:vertical_"
if above and below then -- above and below: vertical mesecon if above and below then -- above and below: vertical mesecon
minetest.add_node(pos, {name = basename .. namestate}) newname = newname .. "off"
elseif above and not below then -- above only: bottom elseif above and not below then -- above only: bottom
minetest.add_node(pos, {name = basename .. "bottom_" .. namestate}) newname = newname .. "bottom_off"
elseif not above and below then -- below only: top elseif not above and below then -- below only: top
minetest.add_node(pos, {name = basename .. "top_" .. namestate}) newname = newname .. "top_off"
else -- no vertical wire above, no vertical wire below: use bottom else -- no vertical wire above, no vertical wire below: use bottom
minetest.add_node(pos, {name = basename .. "bottom_" .. namestate}) newname = newname .. "bottom_off"
end end
mesecon.update_autoconnect(pos)
minetest.set_node(pos, {name = newname})
mesecon.on_placenode(pos, {name = newname})
end end
end end
local vertical_update = function (pos, node) local vertical_update = function (pos, node)
vertical_updatepos(pos) -- this one vertical_updatepos(pos) -- this one
vertical_updatepos(mesecon.addPosRule(pos, vertical_rules[1])) -- above vertical_updatepos(vector.add(pos, vertical_rules[1])) -- above
vertical_updatepos(mesecon.addPosRule(pos, vertical_rules[2])) -- below vertical_updatepos(vector.add(pos, vertical_rules[2])) -- below
end end
-- Vertical wire -- Vertical wire
@ -87,7 +91,6 @@ mesecon.register_node("mesecons_extrawires:vertical", {
},{ },{
tiles = {"mesecons_wire_off.png"}, tiles = {"mesecons_wire_off.png"},
groups = {dig_immediate=3}, groups = {dig_immediate=3},
vertical_conductor_state = "off",
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.off, state = mesecon.state.off,
onstate = "mesecons_extrawires:vertical_on", onstate = "mesecons_extrawires:vertical_on",
@ -96,7 +99,6 @@ mesecon.register_node("mesecons_extrawires:vertical", {
},{ },{
tiles = {"mesecons_wire_on.png"}, tiles = {"mesecons_wire_on.png"},
groups = {dig_immediate=3, not_in_creative_inventory=1}, groups = {dig_immediate=3, not_in_creative_inventory=1},
vertical_conductor_state = "on",
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.on, state = mesecon.state.on,
offstate = "mesecons_extrawires:vertical_off", offstate = "mesecons_extrawires:vertical_off",
@ -120,7 +122,6 @@ mesecon.register_node("mesecons_extrawires:vertical_top", {
after_dig_node = vertical_update after_dig_node = vertical_update
},{ },{
tiles = {"mesecons_wire_off.png"}, tiles = {"mesecons_wire_off.png"},
vertical_conductor_state = "off",
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.off, state = mesecon.state.off,
onstate = "mesecons_extrawires:vertical_top_on", onstate = "mesecons_extrawires:vertical_top_on",
@ -128,7 +129,6 @@ mesecon.register_node("mesecons_extrawires:vertical_top", {
}} }}
},{ },{
tiles = {"mesecons_wire_on.png"}, tiles = {"mesecons_wire_on.png"},
vertical_conductor_state = "on",
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.on, state = mesecon.state.on,
offstate = "mesecons_extrawires:vertical_top_off", offstate = "mesecons_extrawires:vertical_top_off",
@ -152,7 +152,6 @@ mesecon.register_node("mesecons_extrawires:vertical_bottom", {
after_dig_node = vertical_update after_dig_node = vertical_update
},{ },{
tiles = {"mesecons_wire_off.png"}, tiles = {"mesecons_wire_off.png"},
vertical_conductor_state = "off",
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.off, state = mesecon.state.off,
onstate = "mesecons_extrawires:vertical_bottom_on", onstate = "mesecons_extrawires:vertical_bottom_on",
@ -160,7 +159,6 @@ mesecon.register_node("mesecons_extrawires:vertical_bottom", {
}} }}
},{ },{
tiles = {"mesecons_wire_on.png"}, tiles = {"mesecons_wire_on.png"},
vertical_conductor_state = "on",
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.on, state = mesecon.state.on,
offstate = "mesecons_extrawires:vertical_bottom_off", offstate = "mesecons_extrawires:vertical_bottom_off",

View File

@ -0,0 +1 @@
And gates power their output if both inputs (from left and right) are powered.

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1 @@
Mesecon diodes, just like real ones, only transfer power (signals) in one direction only.

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1 @@
Nand gates do not power their output if both inputs (from left and right) are powered, but power it in every other case.

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1 @@
Nor gates only power their output if none of their two inputs is powered. They are basically or gates with a not gate at their output.

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1 @@
Not gates invert signals, just like a mesecon torch does, but faster. The input is at the opposite side of the output.

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1 @@
Or gates power their output if either of their inputs (or both) are powered. You could basically get the same behaviour with two diodes, but or gates save some space.

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1 @@
XOR gates power their output if only one input is powered, they're off if either both or none of the inputs is powered.

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -122,3 +122,13 @@ register_gate("xor", 2, function (val1, val2) return (val1 or val2) and not (val
{{"mesecons:mesecon", "", ""}, {{"mesecons:mesecon", "", ""},
{"", "mesecons_materials:silicon", "mesecons_materials:silicon"}, {"", "mesecons_materials:silicon", "mesecons_materials:silicon"},
{"mesecons:mesecon", "", ""}}) {"mesecons:mesecon", "", ""}})
register_gate("nor", 2, function (val1, val2) return not (val1 or val2) end,
{{"mesecons:mesecon", "", ""},
{"", "mesecons:mesecon", "mesecons_torch:mesecon_torch_on"},
{"mesecons:mesecon", "", ""}})
register_gate("or", 2, function (val1, val2) return (val1 or val2) end,
{{"mesecons:mesecon", "", ""},
{"", "mesecons:mesecon", "mesecons:mesecon"},
{"mesecons:mesecon", "", ""}})

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

View File

@ -0,0 +1 @@
Water turbines are receptors that turn on if flowing water is above them.

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -4,24 +4,22 @@
-- (does not work with other liquids) -- (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 = "mesh",
tiles = {"jeija_hydro_turbine_off.png"}, mesh = "jeija_hydro_turbine.obj",
tiles = {
"jeija_hydro_turbine_sides_off.png",
"jeija_hydro_turbine_top_bottom.png",
"jeija_hydro_turbine_turbine_top_bottom.png",
"jeija_hydro_turbine_turbine_misc.png"
},
inventory_image = "jeija_hydro_turbine_inv.png",
wield_scale = {x=0.75, y=0.75, z=0.75},
groups = {dig_immediate=2}, groups = {dig_immediate=2},
description="Water Turbine", description="Water Turbine",
paramtype = "light", paramtype = "light",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 },
{-0.15, 0.5, -0.15, 0.15, 1.45, 0.15},
{-0.45, 1.15, -0.1, 0.45, 1.45, 0.1},
{-0.1, 1.15, -0.45, 0.1, 1.45, 0.45}},
},
node_box = {
type = "fixed",
fixed = {{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.15, 0.5, -0.15, 0.15, 1.45, 0.15},
{-0.45, 1.15, -0.1, 0.45, 1.45, 0.1},
{-0.1, 1.15, -0.45, 0.1, 1.45, 0.45}},
}, },
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
mesecons = {receptor = { mesecons = {receptor = {
@ -30,25 +28,23 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
}) })
minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", { minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
drawtype = "nodebox", drawtype = "mesh",
tiles = {"jeija_hydro_turbine_on.png"}, mesh = "jeija_hydro_turbine.obj",
wield_scale = {x=0.75, y=0.75, z=0.75},
tiles = {
"jeija_hydro_turbine_sides_on.png",
"jeija_hydro_turbine_top_bottom.png",
"jeija_hydro_turbine_turbine_top_bottom.png",
"jeija_hydro_turbine_turbine_misc.png"
},
inventory_image = "jeija_hydro_turbine_inv.png",
drop = "mesecons_hydroturbine:hydro_turbine_off 1", drop = "mesecons_hydroturbine:hydro_turbine_off 1",
groups = {dig_immediate=2,not_in_creative_inventory=1}, groups = {dig_immediate=2,not_in_creative_inventory=1},
description="Water Turbine", description="Water Turbine",
paramtype = "light", paramtype = "light",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 },
{-0.15, 0.5, -0.15, 0.15, 1.45, 0.15},
{-0.5, 1.15, -0.1, 0.5, 1.45, 0.1},
{-0.1, 1.15, -0.5, 0.1, 1.45, 0.5}},
},
node_box = {
type = "fixed",
fixed = {{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.15, 0.5, -0.15, 0.15, 1.45, 0.15},
{-0.5, 1.15, -0.1, 0.5, 1.45, 0.1},
{-0.1, 1.15, -0.5, 0.1, 1.45, 0.5}},
}, },
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
mesecons = {receptor = { mesecons = {receptor = {
@ -64,7 +60,7 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_off"},
action = function(pos, node, active_object_count, active_object_count_wider) action = function(pos, node, active_object_count, active_object_count_wider)
local waterpos={x=pos.x, y=pos.y+1, z=pos.z} local waterpos={x=pos.x, y=pos.y+1, z=pos.z}
if minetest.get_node(waterpos).name=="default:water_flowing" then if minetest.get_node(waterpos).name=="default:water_flowing" then
minetest.add_node(pos, {name="mesecons_hydroturbine:hydro_turbine_on"}) minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_on"})
nodeupdate(pos) nodeupdate(pos)
mesecon.receptor_on(pos) mesecon.receptor_on(pos)
end end
@ -78,7 +74,7 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_on"},
action = function(pos, node, active_object_count, active_object_count_wider) action = function(pos, node, active_object_count, active_object_count_wider)
local waterpos={x=pos.x, y=pos.y+1, z=pos.z} local waterpos={x=pos.x, y=pos.y+1, z=pos.z}
if minetest.get_node(waterpos).name~="default:water_flowing" then if minetest.get_node(waterpos).name~="default:water_flowing" then
minetest.add_node(pos, {name="mesecons_hydroturbine:hydro_turbine_off"}) minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_off"})
nodeupdate(pos) nodeupdate(pos)
mesecon.receptor_off(pos) mesecon.receptor_off(pos)
end end

View File

@ -0,0 +1,429 @@
# Blender v2.73 (sub 0) OBJ File: 'mesecons-water-turbine.blend'
# www.blender.org
o Cylinder.002_Cylinder.003
v 0.000000 0.500000 -0.150000
v 0.000000 0.562500 -0.150000
v 0.106066 0.500000 -0.106066
v 0.106066 0.562500 -0.106066
v 0.150000 0.500000 0.000000
v 0.150000 0.562500 0.000000
v 0.106066 0.500000 0.106066
v 0.106066 0.562500 0.106066
v -0.000000 0.500000 0.150000
v -0.000000 0.562500 0.150000
v -0.106066 0.500000 0.106066
v -0.106066 0.562500 0.106066
v -0.150000 0.500000 -0.000000
v -0.150000 0.562500 -0.000000
v -0.106066 0.500000 -0.106066
v -0.106066 0.562500 -0.106066
v 0.097545 0.625000 -0.490393
v -0.097545 0.625000 -0.490393
v -0.277785 0.625000 -0.415735
v -0.415735 0.625000 -0.277785
v -0.490393 0.625000 -0.097545
v -0.490393 0.625000 0.097545
v -0.415735 0.625000 0.277785
v -0.277785 0.625000 0.415735
v -0.097545 0.625000 0.490393
v 0.097545 0.625000 0.490393
v 0.277785 0.625000 0.415735
v 0.415735 0.625000 0.277785
v 0.490393 0.625000 0.097545
v 0.490393 0.625000 -0.097545
v 0.415735 0.625000 -0.277785
v 0.277785 0.625000 -0.415735
v 0.097545 0.656250 -0.490393
v -0.097545 0.656250 -0.490393
v -0.277785 0.656250 -0.415735
v -0.415735 0.656250 -0.277785
v -0.490393 0.656250 -0.097545
v -0.490393 0.656250 0.097545
v -0.415735 0.656250 0.277785
v -0.277785 0.656250 0.415735
v -0.097545 0.656250 0.490393
v 0.097545 0.656250 0.490393
v 0.277785 0.656250 0.415735
v 0.415735 0.656250 0.277785
v 0.490393 0.656250 0.097545
v 0.490393 0.656250 -0.097545
v 0.415735 0.656250 -0.277785
v 0.277785 0.656250 -0.415735
v 0.116233 0.634645 -0.436100
v 0.116233 1.482640 -0.436100
v 0.299524 0.634645 -0.186124
v 0.299524 1.482640 -0.186124
v 0.343405 0.634645 0.080186
v 0.343405 1.482640 0.080186
v 0.186124 0.634645 0.299524
v 0.186124 1.482640 0.299524
v -0.080186 0.634645 0.343405
v -0.080186 1.482640 0.343405
v -0.299524 0.634645 0.186124
v -0.299524 1.482640 0.186124
v -0.343405 0.634645 -0.080186
v -0.343405 1.482640 -0.080186
v -0.186124 0.634645 -0.299524
v -0.186124 1.482640 -0.299524
v 0.080186 0.634645 -0.343405
v 0.080186 1.482640 -0.343405
v 0.390559 1.482640 -0.226180
v 0.390559 0.634645 -0.226180
v 0.436100 1.482640 0.116233
v 0.436100 0.634645 0.116233
v 0.226180 1.482640 0.390559
v 0.226180 0.634645 0.390559
v -0.116233 1.482640 0.436100
v -0.116233 0.634645 0.436100
v -0.390559 1.482640 0.226180
v -0.390559 0.634645 0.226180
v -0.436100 1.482640 -0.116233
v -0.436100 0.634645 -0.116233
v -0.226180 1.482640 -0.390559
v -0.226180 0.634645 -0.390559
v 0.108975 0.634645 -0.430778
v 0.292266 0.634645 -0.180802
v 0.292266 1.482640 -0.180802
v 0.108975 1.482640 -0.430778
v 0.381664 0.634645 -0.227549
v 0.334509 0.634645 0.078817
v 0.334509 1.482640 0.078817
v 0.381664 1.482640 -0.227549
v 0.430778 0.634645 0.108975
v 0.180802 0.634645 0.292266
v 0.180802 1.482640 0.292266
v 0.430778 1.482640 0.108975
v 0.227549 0.634645 0.381664
v -0.078817 0.634645 0.334509
v -0.078817 1.482640 0.334509
v 0.227549 1.482640 0.381664
v -0.108975 0.634645 0.430778
v -0.292266 0.634645 0.180802
v -0.292266 1.482640 0.180802
v -0.108975 1.482640 0.430778
v -0.381664 0.634645 0.227549
v -0.334509 0.634645 -0.078817
v -0.334509 1.482640 -0.078817
v -0.381664 1.482640 0.227549
v -0.227549 0.634645 -0.381663
v 0.078817 0.634645 -0.334509
v 0.078817 1.482640 -0.334509
v -0.227549 1.482640 -0.381663
v -0.430779 0.634645 -0.108975
v -0.180802 0.634645 -0.292266
v -0.180802 1.482640 -0.292266
v -0.430779 1.482640 -0.108975
v 0.097545 1.500000 -0.490393
v -0.097545 1.500000 -0.490393
v -0.277785 1.500000 -0.415735
v -0.415735 1.500000 -0.277785
v -0.490393 1.500000 -0.097545
v -0.490393 1.500000 0.097545
v -0.415735 1.500000 0.277785
v -0.277785 1.500000 0.415735
v -0.097545 1.500000 0.490393
v 0.097545 1.500000 0.490393
v 0.277785 1.500000 0.415735
v 0.415735 1.500000 0.277785
v 0.490393 1.500000 0.097545
v 0.490393 1.500000 -0.097545
v 0.415735 1.500000 -0.277785
v 0.277785 1.500000 -0.415735
v 0.097545 1.468750 -0.490393
v -0.097545 1.468750 -0.490393
v -0.277785 1.468750 -0.415735
v -0.415735 1.468750 -0.277785
v -0.490393 1.468750 -0.097545
v -0.490393 1.468750 0.097545
v -0.415735 1.468750 0.277785
v -0.277785 1.468750 0.415735
v -0.097545 1.468750 0.490393
v 0.097545 1.468750 0.490393
v 0.277785 1.468750 0.415735
v 0.415735 1.468750 0.277785
v 0.490393 1.468750 0.097545
v 0.490393 1.468750 -0.097545
v 0.415735 1.468750 -0.277785
v 0.277785 1.468750 -0.415735
v 0.025624 0.559630 -0.061863
v 0.025624 1.481372 -0.061863
v 0.061863 0.559630 -0.025624
v 0.061863 1.481372 -0.025624
v 0.061863 0.559630 0.025624
v 0.061863 1.481372 0.025624
v 0.025624 0.559630 0.061863
v 0.025624 1.481372 0.061863
v -0.025624 0.559630 0.061863
v -0.025624 1.481372 0.061863
v -0.061863 0.559630 0.025624
v -0.061863 1.481372 0.025624
v -0.061863 0.559630 -0.025624
v -0.061863 1.481372 -0.025624
v -0.025624 0.559630 -0.061863
v -0.025624 1.481372 -0.061863
v 0.499775 -0.499550 -0.499775
v 0.499775 -0.499550 0.499775
v -0.499775 -0.499550 0.499775
v -0.499775 -0.499550 -0.499775
v 0.499775 0.500000 -0.499775
v 0.499775 0.500000 0.499775
v -0.499775 0.500000 0.499775
v -0.499775 0.500000 -0.499775
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 0.400544 1.000000
vt 0.599456 1.000000
vt 0.783227 0.923880
vt 0.923880 0.783227
vt 1.000000 0.599456
vt 1.000000 0.400544
vt 0.923880 0.216773
vt 0.783227 0.076120
vt 0.599456 0.000000
vt 0.400544 0.000000
vt 0.216773 0.076121
vt 0.076120 0.216773
vt 0.000000 0.400544
vt 0.000000 0.599456
vt 0.076121 0.783227
vt 0.216773 0.923880
vt 0.500000 0.343750
vt 0.531250 0.343750
vt 0.531250 0.375000
vt 0.500000 0.375000
vt 0.531250 0.406250
vt 0.500000 0.406250
vt 0.500000 0.531250
vt 0.531250 0.531250
vt 0.531250 0.500000
vt 0.500000 0.500000
vt 0.531250 0.468750
vt 0.500000 0.468750
vt 0.531250 0.437500
vt 0.500000 0.437500
vt 0.593750 0.468750
vt 0.625000 0.437500
vt 0.656250 0.437500
vt 0.687500 0.468750
vt 0.687500 0.500000
vt 0.656250 0.531250
vt 0.625000 0.531250
vt 0.593750 0.500000
vt 0.500000 0.312500
vt 0.531250 0.312500
vt 0.500000 0.281250
vt 0.531250 0.281250
vt 0.156250 0.750000
vt 0.156250 0.875000
vt 0.125000 0.875000
vt 0.125000 0.750000
vt 0.156250 0.625000
vt 0.125000 0.625000
vt 0.156250 0.500000
vt 0.125000 0.500000
vt 0.156250 0.375000
vt 0.125000 0.375000
vt 0.156250 0.250000
vt 0.125000 0.250000
vt 0.250000 0.500000
vt 0.250000 0.625000
vt 0.218750 0.625000
vt 0.218750 0.500000
vt 0.156250 0.125000
vt 0.125000 0.125000
vt 0.156250 -0.000000
vt 0.125000 -0.000000
vt 0.250000 0.375000
vt 0.218750 0.375000
vt 0.250000 0.875000
vt 0.250000 1.000000
vt 0.218750 1.000000
vt 0.218750 0.875000
vt 0.250000 0.250000
vt 0.218750 0.250000
vt 0.250000 0.750000
vt 0.218750 0.750000
vt 0.250000 0.125000
vt 0.218750 0.125000
vt 0.250000 -0.000000
vt 0.218750 -0.000000
vt 0.156250 1.000000
vt 0.125000 1.000000
vt 0.781250 0.593750
vt 0.781250 0.968750
vt 0.656250 0.968750
vt 0.656250 0.593750
vt 0.625000 0.593750
vt 0.625000 0.968750
vt 0.500000 0.968750
vt 0.500000 0.593750
vt 0.406250 -0.000000
vt 0.437500 -0.000000
vt 0.437500 0.125000
vt 0.406250 0.125000
vt 0.312500 0.875000
vt 0.343750 0.875000
vt 0.343750 1.000000
vt 0.312500 1.000000
vt 0.312500 0.750000
vt 0.343750 0.750000
vt 0.312500 0.625000
vt 0.343750 0.625000
vt 0.312500 0.500000
vt 0.343750 0.500000
vt 0.406250 0.750000
vt 0.437500 0.750000
vt 0.437500 0.875000
vt 0.406250 0.875000
vt 0.312500 0.375000
vt 0.343750 0.375000
vt 0.312500 0.250000
vt 0.343750 0.250000
vt 0.406250 0.625000
vt 0.437500 0.625000
vt 0.312500 0.125000
vt 0.343750 0.125000
vt 0.406250 0.500000
vt 0.437500 0.500000
vt 0.312500 -0.000000
vt 0.343750 -0.000000
vt 0.406250 0.375000
vt 0.437500 0.375000
vt 0.437500 1.000000
vt 0.406250 1.000000
vt 0.406250 0.250000
vt 0.437500 0.250000
vt 0.031250 0.937500
vt 0.062500 0.937500
vt 0.062500 0.968750
vt 0.031250 0.968750
vt 0.031250 0.718750
vt 0.062500 0.718750
vt 0.062500 0.750000
vt 0.031250 0.750000
vt 0.062500 0.781250
vt 0.031250 0.781250
vt 0.062500 0.812500
vt 0.031250 0.812500
vt 0.062500 0.843750
vt 0.031250 0.843750
vt 0.062500 0.875000
vt 0.031250 0.875000
vt 0.031250 0.906250
vt 0.062500 0.906250
vn 1.000000 0.000000 0.000000
vn -0.000000 -0.000000 1.000000
vn -1.000000 -0.000000 -0.000000
vn 0.000000 0.000000 -1.000000
vn 0.000000 -1.000000 -0.000000
vn 0.000000 1.000000 0.000000
vn 0.382700 0.000000 -0.923900
vn 0.923900 0.000000 -0.382700
vn 0.923900 0.000000 0.382700
vn 0.382700 0.000000 0.923900
vn -0.382700 0.000000 0.923900
vn -0.923900 0.000000 0.382700
vn -0.382700 0.000000 -0.923900
vn -0.923900 0.000000 -0.382700
vn 0.707100 0.000000 0.707100
vn -0.707100 0.000000 0.707100
vn 0.707100 0.000000 -0.707100
vn -0.707100 0.000000 -0.707100
vn 0.806400 0.000000 -0.591300
vn 0.988400 0.000000 0.152100
vn 0.591300 0.000000 0.806400
vn -0.152100 0.000000 0.988400
vn -0.806400 0.000000 0.591300
vn -0.988400 0.000000 -0.152100
vn 0.152100 0.000000 -0.988400
vn -0.591300 0.000000 -0.806400
g Cylinder.002_Cylinder.003_sides
s off
f 161/1/1 165/2/1 166/3/1 162/4/1
f 162/1/2 166/2/2 167/3/2 163/4/2
f 163/4/3 167/3/3 168/2/3 164/1/3
f 165/2/4 161/1/4 164/4/4 168/3/4
g Cylinder.002_Cylinder.003_top-bottom
f 161/2/5 162/1/5 163/4/5 164/3/5
f 165/2/6 168/3/6 167/4/6 166/1/6
g Cylinder.002_Cylinder.003_turbine-top-bottom
f 130/5/5 129/6/5 144/7/5 143/8/5 142/9/5 141/10/5 140/11/5 139/12/5 138/13/5 137/14/5 136/15/5 135/16/5 134/17/5 133/18/5 132/19/5 131/20/5
f 18/5/5 17/6/5 32/7/5 31/8/5 30/9/5 29/10/5 28/11/5 27/12/5 26/13/5 25/14/5 24/15/5 23/16/5 22/17/5 21/18/5 20/19/5 19/20/5
f 33/6/6 34/5/6 35/20/6 36/19/6 37/18/6 38/17/6 39/16/6 40/15/6 41/14/6 42/13/6 43/12/6 44/11/6 45/10/6 46/9/6 47/8/6 48/7/6
f 113/6/6 114/5/6 115/20/6 116/19/6 117/18/6 118/17/6 119/16/6 120/15/6 121/14/6 122/13/6 123/12/6 124/11/6 125/10/6 126/9/6 127/8/6 128/7/6
g Cylinder.002_Cylinder.003_turbine-blades-etc
f 1/21/7 2/22/7 4/23/7 3/24/7
f 3/24/8 4/23/8 6/25/8 5/26/8
f 5/27/9 6/28/9 8/29/9 7/30/9
f 7/30/10 8/29/10 10/31/10 9/32/10
f 9/32/11 10/31/11 12/33/11 11/34/11
f 11/34/12 12/33/12 14/25/12 13/26/12
f 4/35/6 2/36/6 16/37/6 14/38/6 12/39/6 10/40/6 8/41/6 6/42/6
f 15/43/13 16/44/13 2/22/13 1/21/13
f 13/45/14 14/46/14 16/44/14 15/43/14
f 27/47/15 28/48/15 44/49/15 43/50/15
f 26/51/10 27/47/10 43/50/10 42/52/10
f 25/53/2 26/51/2 42/52/2 41/54/2
f 24/55/11 25/53/11 41/54/11 40/56/11
f 23/57/16 24/55/16 40/56/16 39/58/16
f 17/59/4 18/60/4 34/61/4 33/62/4
f 22/63/12 23/57/12 39/58/12 38/64/12
f 21/65/3 22/63/3 38/64/3 37/66/3
f 32/67/7 17/59/7 33/62/7 48/68/7
f 20/69/14 21/70/14 37/71/14 36/72/14
f 31/73/17 32/67/17 48/68/17 47/74/17
f 19/75/18 20/69/18 36/72/18 35/76/18
f 30/77/8 31/73/8 47/74/8 46/78/8
f 18/60/13 19/75/13 35/76/13 34/61/13
f 29/79/1 30/77/1 46/78/1 45/80/1
f 28/48/9 29/81/9 45/82/9 44/49/9
f 49/83/19 50/84/19 52/85/19 51/86/19
f 68/86/20 67/83/20 54/84/20 53/85/20
f 70/83/21 69/84/21 56/85/21 55/86/21
f 72/84/22 71/85/22 58/86/22 57/83/22
f 74/83/23 73/84/23 60/85/23 59/86/23
f 76/83/24 75/84/24 62/85/24 61/86/24
f 80/84/25 79/85/25 66/86/25 65/83/25
f 78/83/26 77/84/26 64/85/26 63/86/26
f 81/87/23 82/88/23 83/89/23 84/90/23
f 85/88/24 86/89/24 87/90/24 88/87/24
f 89/89/26 90/90/26 91/87/26 92/88/26
f 93/90/25 94/87/25 95/88/25 96/89/25
f 97/90/19 98/87/19 99/88/19 100/89/19
f 101/87/20 102/88/20 103/89/20 104/90/20
f 105/90/22 106/87/22 107/88/22 108/89/22
f 109/89/21 110/90/21 111/87/21 112/88/21
f 75/88/22 76/87/22 101/86/22 104/85/22
f 71/88/20 72/87/20 93/86/20 96/85/20
f 67/86/25 68/85/25 85/88/25 88/87/25
f 79/86/24 80/85/24 105/88/24 108/87/24
f 77/88/23 78/87/23 109/86/23 112/85/23
f 73/88/21 74/87/21 97/86/21 100/85/21
f 69/86/19 70/85/19 89/88/19 92/87/19
f 50/86/26 49/85/26 81/88/26 84/87/26
f 123/91/15 139/92/15 140/93/15 124/94/15
f 122/95/10 138/96/10 139/97/10 123/98/10
f 121/99/2 137/100/2 138/96/2 122/95/2
f 120/101/11 136/102/11 137/100/11 121/99/11
f 119/103/16 135/104/16 136/102/16 120/101/16
f 113/105/4 129/106/4 130/107/4 114/108/4
f 118/109/12 134/110/12 135/104/12 119/103/12
f 117/111/3 133/112/3 134/110/3 118/109/3
f 128/113/7 144/114/7 129/106/7 113/105/7
f 116/115/14 132/116/14 133/112/14 117/111/14
f 127/117/17 143/118/17 144/114/17 128/113/17
f 115/119/18 131/120/18 132/116/18 116/115/18
f 126/121/8 142/122/8 143/118/8 127/117/8
f 114/108/13 130/107/13 131/123/13 115/124/13
f 125/125/1 141/126/1 142/122/1 126/121/1
f 124/94/9 140/93/9 141/126/9 125/125/9
f 145/127/17 146/128/17 148/129/17 147/130/17
f 147/131/1 148/132/1 150/133/1 149/134/1
f 149/134/15 150/133/15 152/135/15 151/136/15
f 151/136/2 152/135/2 154/137/2 153/138/2
f 153/138/16 154/137/16 156/139/16 155/140/16
f 155/140/3 156/139/3 158/141/3 157/142/3
f 159/143/4 160/144/4 146/128/4 145/127/4
f 157/142/18 158/141/18 160/144/18 159/143/18

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 817 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

View File

@ -0,0 +1 @@
Insulated mesecons are conductors that only conduct in one direction (and also not up or down).

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -0,0 +1 @@
Lamps are effectors that if powered emit light.

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -17,7 +17,7 @@ minetest.register_node("mesecons_lamp:lamp_on", {
legacy_wallmounted = true, legacy_wallmounted = true,
sunlight_propagates = true, sunlight_propagates = true,
walkable = true, walkable = true,
light_source = LIGHT_MAX, light_source = default.LIGHT_MAX,
node_box = mesecon_lamp_box, node_box = mesecon_lamp_box,
selection_box = mesecon_lamp_box, selection_box = mesecon_lamp_box,
groups = {dig_immediate=3,not_in_creative_inventory=1, mesecon_effector_on = 1}, groups = {dig_immediate=3,not_in_creative_inventory=1, mesecon_effector_on = 1},

View File

@ -0,0 +1 @@
Effector, glows blue when powered.

Some files were not shown because too many files have changed in this diff Show More