1 Commits

Author SHA1 Message Date
78b10c505f Version MFF. 2018-09-08 01:14:03 +02:00
244 changed files with 576 additions and 530 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
*~

0
LICENSE.txt Normal file → Executable file
View File

1
README.md Normal file → Executable file
View File

@ -53,7 +53,6 @@ These awesome people made Mesecons possible!
| Contributor | Contribution | | Contributor | Contribution |
| --------------- | -------------------------------- | | --------------- | -------------------------------- |
| Hawk777 | Code for VoxelManip caching |
| Jat15 | Various tweaks. | | Jat15 | Various tweaks. |
| Jeija | **Main developer! Everything.** | | Jeija | **Main developer! Everything.** |
| Jordach | Noteblock sounds. | | Jordach | Noteblock sounds. |

View File

@ -1,6 +1,6 @@
{ {
"Conductors" : { "Conductors" : {
"Mesecon" : "mesecons_wires/doc/mesecon", "Mesecon" : "mesecons/doc/mesecon",
"Insulated Wire" : "mesecons_insulated/doc/insulated", "Insulated Wire" : "mesecons_insulated/doc/insulated",
"T-Junction" : "mesecons_extrawires/doc/tjunction", "T-Junction" : "mesecons_extrawires/doc/tjunction",
"Crossing" : "mesecons_extrawires/doc/crossing", "Crossing" : "mesecons_extrawires/doc/crossing",

6
mesecons/actionqueue.lua Normal file → Executable file
View File

@ -87,11 +87,7 @@ minetest.register_globalstep(function (dtime)
end) end)
function mesecon.queue:execute(action) function mesecon.queue:execute(action)
-- ignore if action queue function name doesn't exist, mesecon.queue.funcs[action.func](action.pos, unpack(action.params))
-- (e.g. in case the action queue savegame was written by an old mesecons version)
if mesecon.queue.funcs[action.func] then
mesecon.queue.funcs[action.func](action.pos, unpack(action.params))
end
end end

0
mesecons/depends.txt Normal file → Executable file
View File

View File

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

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

47
mesecons/init.lua Normal file → Executable file
View File

@ -3,7 +3,7 @@
-- | \/ | |___ ____ |___ | | | | \ | |____ -- | \/ | |___ ____ |___ | | | | \ | |____
-- | | | | | | | | | \ | | -- | | | | | | | | | \ | |
-- | | |___ ____| |___ |____ |____| | \| ____| -- | | |___ ____| |___ |____ |____| | \| ____|
-- by Jeija, Uberi (Temperest), sfan5, VanessaE, Hawk777 and contributors -- by Jeija, Uberi (Temperest), sfan5, VanessaE
-- --
-- --
-- --
@ -11,7 +11,7 @@
-- 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 basic development resources, see http://mesecons.net/developers.html -- For developer documentation see the Developers' section on mesecons.TK
-- --
-- --
-- --
@ -70,11 +70,19 @@ dofile(minetest.get_modpath("mesecons").."/internal.lua");
-- these are the only functions you need to remember -- these are the only functions you need to remember
mesecon.queue:add_function("receptor_on", function (pos, rules) mesecon.queue:add_function("receptor_on", function (pos, rules)
mesecon.vm_begin()
rules = rules or mesecon.rules.default rules = rules or mesecon.rules.default
-- Call turnon on all linking positions -- 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
local np = vector.add(pos, rule)
-- if area is not loaded, keep trying
if minetest.get_node_or_nil(np) == nil then
mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules)
return
end
end
-- execute action
for _, rule in ipairs(mesecon.flattenrules(rules)) do for _, rule in ipairs(mesecon.flattenrules(rules)) do
local np = vector.add(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)
@ -82,8 +90,6 @@ mesecon.queue:add_function("receptor_on", function (pos, rules)
mesecon.turnon(np, rulename) mesecon.turnon(np, rulename)
end end
end end
mesecon.vm_commit()
end) end)
function mesecon.receptor_on(pos, rules) function mesecon.receptor_on(pos, rules)
@ -93,21 +99,23 @@ end
mesecon.queue:add_function("receptor_off", function (pos, rules) mesecon.queue:add_function("receptor_off", function (pos, rules)
rules = rules or mesecon.rules.default rules = rules or mesecon.rules.default
-- Call turnoff on all linking positions -- 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
local np = vector.add(pos, rule)
if minetest.get_node_or_nil(np) == nil then
mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules)
return
end
end
for _, rule in ipairs(mesecon.flattenrules(rules)) do for _, rule in ipairs(mesecon.flattenrules(rules)) do
local np = vector.add(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.vm_begin() if not mesecon.connected_to_receptor(np, mesecon.invertRule(rule)) then
mesecon.changesignal(np, minetest.get_node(np), rulename, mesecon.state.off, 2) mesecon.turnoff(np, rulename)
-- Turnoff returns true if turnoff process was successful, no onstate receptor
-- was found along the way. Commit changes that were made in voxelmanip. If turnoff
-- returns true, an onstate receptor was found, abort voxelmanip transaction.
if (mesecon.turnoff(np, rulename)) then
mesecon.vm_commit()
else else
mesecon.vm_abort() mesecon.changesignal(np, minetest.get_node(np), rulename, mesecon.state.off, 2)
end end
end end
end end
@ -118,11 +126,14 @@ function mesecon.receptor_off(pos, rules)
end end
print("[OK] Mesecons") minetest.log("action", "[OK] Mesecons")
-- Deprecated stuff -- Deprecated stuff
-- To be removed in future releases -- To be removed in future releases
dofile(minetest.get_modpath("mesecons").."/legacy.lua"); dofile(minetest.get_modpath("mesecons").."/legacy.lua");
--The actual wires
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");

220
mesecons/internal.lua Normal file → Executable file
View File

@ -37,6 +37,11 @@
-- HIGH-LEVEL Internals -- HIGH-LEVEL Internals
-- mesecon.is_power_on(pos) --> Returns true if pos emits power in any way -- 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.is_power_off(pos) --> Returns true if pos does not emit power in any way
-- mesecon.turnon(pos, link) --> link is the input rule that caused calling turnon, turns on every connected node, iterative
-- mesecon.turnoff(pos, link) --> link is the input rule that caused calling turnoff, turns off every connected node, iterative
-- mesecon.connected_to_receptor(pos, link) --> Returns true if pos is connected to a receptor directly or via conductors, iterative
-- 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 -- mesecon.is_powered(pos) --> Returns true if pos is powered by a receptor or a conductor
-- RULES ROTATION helpers -- RULES ROTATION helpers
@ -366,32 +371,52 @@ function mesecon.is_power_off(pos, rulename)
return false return false
end end
-- Turn off an equipotential section starting at `pos`, which outputs in the direction of `link`.
-- Breadth-first search. Map is abstracted away in a voxelmanip.
-- Follow all all conductor paths replacing conductors that were already
-- looked at, activating / changing all effectors along the way.
function mesecon.turnon(pos, link) function mesecon.turnon(pos, link)
local frontiers = {{pos = pos, link = link}} local frontiers = {{pos = pos, link = link}}
local depth = 1 local depth = 1
while frontiers[1] do while frontiers[depth] do
local f = table.remove(frontiers, 1) local f = frontiers[depth]
local node = mesecon.get_node_force(f.pos) local node = mesecon.get_node_force(f.pos)
-- area not loaded, postpone action
if not node then if not node then
-- Area does not exist; do nothing mesecon.queue:add_action(f.pos, "turnon", {f.link}, nil, true)
elseif mesecon.is_conductor_off(node, f.link) then elseif mesecon.is_conductor_off(node, f.link) then
local rules = mesecon.conductor_get_rules(node) local rules = mesecon.conductor_get_rules(node)
-- Call turnon on neighbors -- Success: If false, at least one neighboring node is unloaded,
-- postpone turning on action
local success = true
local neighborlinks = {}
-- call turnon on neighbors
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
local np = vector.add(f.pos, r) local np = vector.add(f.pos, r)
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
table.insert(frontiers, {pos = np, link = l}) -- Neighboring node not loaded, postpone turning on current node
-- since we can't even know if neighboring node has matching rules
if not mesecon.get_node_force(np) then
success = false
break
else
neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r)
end end
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link)) if success then
minetest.swap_node(f.pos, {name = mesecon.get_conductor_on(node, f.link),
param2 = node.param2})
for npos, links in pairs(neighborlinks) do
-- links = all links to node, l = each single link
for _, l in ipairs(links) do
table.insert(frontiers, {pos = minetest.get_position_from_hash(npos), link = l})
end
end
else
mesecon.queue:add_action(f.pos, "turnon", {f.link}, nil, true)
end
elseif mesecon.is_effector(node.name) then elseif mesecon.is_effector(node.name) then
mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth) mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth)
if mesecon.is_effector_off(node.name) then if mesecon.is_effector_off(node.name) then
@ -402,77 +427,151 @@ function mesecon.turnon(pos, link)
end end
end end
-- Turn on an equipotential section starting at `pos`, which outputs in the direction of `link`. mesecon.queue:add_function("turnon", function(pos, rulename, recdepth)
-- Breadth-first search. Map is abstracted away in a voxelmanip. mesecon.turnon(pos, rulename, recdepth)
-- Follow all all conductor paths replacing conductors that were already end)
-- looked at, deactivating / changing all effectors along the way.
-- In case an onstate receptor is discovered, abort the process by returning false, which will
-- cause `receptor_off` to discard all changes made in the voxelmanip.
-- Contrary to turnon, turnoff has to cache all change and deactivate signals so that they will only
-- be called in the very end when we can be sure that no conductor was found along the path.
--
-- Signal table entry structure:
-- {
-- pos = position of effector,
-- node = node descriptor (name, param1 and param2),
-- link = link the effector is connected to,
-- depth = indicates order in which signals wire fired, higher is later
-- }
function mesecon.turnoff(pos, link) function mesecon.turnoff(pos, link)
local frontiers = {{pos = pos, link = link}} local frontiers = {{pos = pos, link = link}}
local signals = {}
local depth = 1 local depth = 1
while frontiers[1] do while frontiers[depth] do
local f = table.remove(frontiers, 1) local f = frontiers[depth]
local node = mesecon.get_node_force(f.pos) local node = mesecon.get_node_force(f.pos)
-- area not loaded, postpone action
if not node then if not node then
-- Area does not exist; do nothing mesecon.queue:add_action(f.pos, "turnoff", {f.link}, nil, true)
elseif mesecon.is_conductor_on(node, f.link) then elseif mesecon.is_conductor_on(node, f.link) then
local rules = mesecon.conductor_get_rules(node) local rules = mesecon.conductor_get_rules(node)
-- Success: If false, at least one neighboring node is unloaded,
-- postpone turning on action
local success = true
local neighborlinks = {}
-- call turnoff on neighbors
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
local np = vector.add(f.pos, r) local np = vector.add(f.pos, r)
-- Check if an onstate receptor is connected. If that is the case, -- Neighboring node not loaded, postpone turning off current node
-- abort this turnoff process by returning false. `receptor_off` will -- since we can't even know if neighboring node has matching rules
-- discard all the changes that we made in the voxelmanip: if not mesecon.get_node_force(np) then
for _, l in ipairs(mesecon.rules_link_rule_all_inverted(f.pos, r)) do success = false
if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then break
return false else
end neighborlinks[minetest.hash_node_position(np)] = mesecon.rules_link_rule_all(f.pos, r)
end
-- Call turnoff on neighbors
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
table.insert(frontiers, {pos = np, link = l})
end end
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link)) if success then
minetest.swap_node(f.pos, {name = mesecon.get_conductor_off(node, f.link),
param2 = node.param2})
for npos, links in pairs(neighborlinks) do
-- links = all links to node, l = each single link
for _, l in ipairs(links) do
table.insert(frontiers, {pos = minetest.get_position_from_hash(npos), link = l})
end
end
else
mesecon.queue:add_action(f.pos, "turnoff", {f.link}, nil, true)
end
elseif mesecon.is_effector(node.name) then elseif mesecon.is_effector(node.name) then
table.insert(signals, { mesecon.changesignal(f.pos, node, f.link, mesecon.state.off, depth)
pos = f.pos, if mesecon.is_effector_on(node.name) and not mesecon.is_powered(f.pos) then
node = node, mesecon.deactivate(f.pos, node, f.link, depth)
link = f.link, end
depth = depth
})
end end
depth = depth + 1 depth = depth + 1
end end
end
for _, sig in ipairs(signals) do mesecon.queue:add_function("turnoff", function(pos, rulename, recdepth)
mesecon.changesignal(sig.pos, sig.node, sig.link, mesecon.state.off, sig.depth) mesecon.turnoff(pos, rulename, recdepth)
if mesecon.is_effector_on(sig.node.name) and not mesecon.is_powered(sig.pos) then end)
mesecon.deactivate(sig.pos, sig.node, sig.link, sig.depth)
function mesecon.connected_to_receptor(pos, link)
local node = mesecon.get_node_force(pos)
if not node then return false end
-- Check if conductors around are connected
local rules = mesecon.get_any_inputrules(node)
if not rules then return false end
for _, rule in ipairs(mesecon.rule2meta(link, rules)) do
local links = mesecon.rules_link_rule_all_inverted(pos, rule)
for _, l in ipairs(links) do
local np = vector.add(pos, l)
if mesecon.find_receptor_on(np, mesecon.invertRule(l)) then
return true
end
end end
end end
return true return false
end
function mesecon.find_receptor_on(pos, link)
local frontiers = {{pos = pos, link = link}}
local checked = {}
-- List of positions that have been searched for onstate receptors
local depth = 1
while frontiers[depth] do
local f = frontiers[depth]
local node = mesecon.get_node_force(f.pos)
if not node then return false end
if mesecon.is_receptor_on(node.name) then return true end
if mesecon.is_conductor_on(node, f.link) then
local rules = mesecon.conductor_get_rules(node)
-- call turnoff on neighbors: normal rules
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
local np = vector.add(f.pos, r)
local links = mesecon.rules_link_rule_all_inverted(f.pos, r)
for _, l in ipairs(links) do
local checkedstring = np.x..np.y..np.z..l.x..l.y..l.z
if not checked[checkedstring] then
table.insert(frontiers, {pos = np, link = l})
checked[checkedstring] = true
end
end
end
end
depth = depth + 1
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
local outputnode = mesecon.get_node_force(output)
local inputnode = mesecon.get_node_force(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(mesecon.flattenrules(outputrules)) do
-- Check if output sends to input
if vector.equals(vector.add(output, outputrule), input) then
for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do
-- Check if input accepts from output
if vector.equals(vector.add(input, inputrule), output) then
return true, inputrule
end
end
end
end
return false
end end
-- Get all linking inputrules of inputnode (effector or conductor) that is connected to
-- outputnode (receptor or conductor) at position `output` and has an output in direction `rule`
function mesecon.rules_link_rule_all(output, rule) function mesecon.rules_link_rule_all(output, rule)
local input = vector.add(output, rule) local input = vector.add(output, rule)
local inputnode = mesecon.get_node_force(input) local inputnode = mesecon.get_node_force(input)
@ -492,9 +591,8 @@ function mesecon.rules_link_rule_all(output, rule)
return rules return rules
end end
-- Get all linking outputnodes of outputnode (receptor or conductor) that is connected to
-- inputnode (effector or conductor) at position `input` and has an input in direction `rule`
function mesecon.rules_link_rule_all_inverted(input, rule) function mesecon.rules_link_rule_all_inverted(input, rule)
--local irule = mesecon.invertRule(rule)
local output = vector.add(input, rule) local output = vector.add(input, rule)
local outputnode = mesecon.get_node_force(output) local outputnode = mesecon.get_node_force(output)
local outputrules = mesecon.get_any_outputrules(outputnode) local outputrules = mesecon.get_any_outputrules(outputnode)
@ -511,6 +609,10 @@ function mesecon.rules_link_rule_all_inverted(input, rule)
return rules return rules
end end
function mesecon.rules_link_anydir(pos1, pos2)
return mesecon.rules_link(pos1, pos2) or mesecon.rules_link(pos2, pos1)
end
function mesecon.is_powered(pos, rule) function mesecon.is_powered(pos, rule)
local node = mesecon.get_node_force(pos) local node = mesecon.get_node_force(pos)
local rules = mesecon.get_any_inputrules(node) local rules = mesecon.get_any_inputrules(node)

38
mesecons/legacy.lua Normal file → Executable file
View File

@ -1,14 +1,30 @@
-- Un-forceload any forceloaded mapblocks from older versions of Mesecons which -- Ugly hack to prevent breaking compatibility with other mods
-- used forceloading instead of VoxelManipulators. -- Just remove the following two functions to delete the hack, to be done when other mods have updated
local BLOCKSIZE = 16 function mesecon.receptor_on(self, pos, rules)
if (self.receptor_on) then
-- convert block hash --> node position print("[Mesecons] Warning: A mod with mesecon support called mesecon:receptor_on.")
local function unhash_blockpos(hash) print("[Mesecons] If you are the programmer of this mod, please update it ")
return vector.multiply(minetest.get_position_from_hash(hash), BLOCKSIZE) print("[Mesecons] to use mesecon.receptor_on instead. mesecon:* is deprecated")
print("[Mesecons] Otherwise, please make sure you're running the latest version")
print("[Mesecons] of that mod and inform the mod creator.")
else
rules = pos
pos = self
end
mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules)
end end
local old_forceloaded_blocks = mesecon.file2table("mesecon_forceloaded") function mesecon.receptor_off(self, pos, rules)
for hash, _ in pairs(old_forceloaded_blocks) do if (self.receptor_off) then
minetest.forceload_free_block(unhash_blockpos(hash)) print("[Mesecons] Warning: A mod with mesecon support called mesecon:receptor_off.")
print("[Mesecons] If you are the programmer of this mod, please update it ")
print("[Mesecons] to use mesecon.receptor_off instead. mesecon:* is deprecated")
print("[Mesecons] Otherwise, please make sure you're running the latest version")
print("[Mesecons] of that mod and inform the mod creator.")
else
rules = pos
pos = self
end
mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules)
end end
os.remove(minetest.get_worldpath()..DIR_DELIM.."mesecon_forceloaded")

4
mesecons/oldwires.lua Normal file → Executable file
View File

@ -10,7 +10,7 @@ minetest.register_node("mesecons:mesecon_off", {
type = "fixed", type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
}, },
groups = {dig_immediate=3, mesecon=1, mesecon_conductor_craftable=1}, groups = {dig_immediate=2, mesecon=1, mesecon_conductor_craftable=1}, --MFF
description="Mesecons", description="Mesecons",
mesecons = {conductor={ mesecons = {conductor={
state = mesecon.state.off, state = mesecon.state.off,
@ -28,7 +28,7 @@ minetest.register_node("mesecons:mesecon_on", {
type = "fixed", type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
}, },
groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1}, groups = {dig_immediate=2, not_in_creaive_inventory=1, mesecon=1}, --MFF
drop = "mesecons:mesecon_off 1", drop = "mesecons:mesecon_off 1",
light_source = default.LIGHT_MAX-11, light_source = default.LIGHT_MAX-11,
mesecons = {conductor={ mesecons = {conductor={

0
mesecons/presets.lua Normal file → Executable file
View File

11
mesecons/services.lua Normal file → Executable file
View File

@ -1,7 +1,7 @@
-- Dig and place services -- Dig and place services
mesecon.on_placenode = function(pos, node) mesecon.on_placenode = function (pos, node)
mesecon.execute_autoconnect_hooks_now(pos, node) mesecon.update_autoconnect(pos, node)
-- Receptors: Send on signal when active -- Receptors: Send on signal when active
if mesecon.is_receptor_on(node.name) then if mesecon.is_receptor_on(node.name) then
@ -52,16 +52,17 @@ mesecon.on_placenode = function(pos, node)
end end
end end
mesecon.on_dignode = function(pos, node) mesecon.on_dignode = function (pos, node)
if mesecon.is_conductor_on(node) then if mesecon.is_conductor_on(node) then
mesecon.receptor_off(pos, mesecon.conductor_get_rules(node)) mesecon.receptor_off(pos, mesecon.conductor_get_rules(node))
elseif mesecon.is_receptor_on(node.name) then elseif mesecon.is_receptor_on(node.name) then
mesecon.receptor_off(pos, mesecon.receptor_get_rules(node)) mesecon.receptor_off(pos, mesecon.receptor_get_rules(node))
end end
mesecon.queue:add_action(pos, "update_autoconnect", {node})
mesecon.execute_autoconnect_hooks_queue(pos, node)
end end
mesecon.queue:add_function("update_autoconnect", mesecon.update_autoconnect)
minetest.register_on_placenode(mesecon.on_placenode) minetest.register_on_placenode(mesecon.on_placenode)
minetest.register_on_dignode(mesecon.on_dignode) minetest.register_on_dignode(mesecon.on_dignode)

30
mesecons/settings.lua Normal file → Executable file
View File

@ -1,15 +1,15 @@
-- SETTINGS -- SETTINGS
function mesecon.setting(setting, default) function mesecon.setting(setting, default)
if type(default) == "boolean" then if type(default) == "boolean" then
local read = minetest.setting_getbool("mesecon."..setting) local read = minetest.setting_getbool("mesecon."..setting)
if read == nil then if read == nil then
return default return default
else else
return read return read
end 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
return tonumber(minetest.setting_get("mesecon."..setting) or default) return tonumber(minetest.setting_get("mesecon."..setting) or default)
end end
end end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 550 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 613 B

BIN
mesecons/textures/mesecons_wire_inv.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 B

After

Width:  |  Height:  |  Size: 186 B

BIN
mesecons/textures/mesecons_wire_off.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 465 B

After

Width:  |  Height:  |  Size: 378 B

BIN
mesecons/textures/mesecons_wire_on.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 464 B

After

Width:  |  Height:  |  Size: 366 B

178
mesecons/util.lua Normal file → Executable file
View File

@ -219,7 +219,7 @@ function mesecon.table2file(filename, table)
f:close() f:close()
end end
-- Block position "hashing" (convert to integer) functions for voxelmanip cache -- Forceloading: Force server to load area if node is nil
local BLOCKSIZE = 16 local BLOCKSIZE = 16
-- convert node position --> block hash -- convert node position --> block hash
@ -236,160 +236,40 @@ local function unhash_blockpos(hash)
return vector.multiply(minetest.get_position_from_hash(hash), BLOCKSIZE) return vector.multiply(minetest.get_position_from_hash(hash), BLOCKSIZE)
end end
-- Maps from a hashed mapblock position (as returned by hash_blockpos) to a mesecon.forceloaded_blocks = {}
-- table.
--
-- Contents of the table are:
-- “vm” → the VoxelManipulator
-- “va” → the VoxelArea
-- “data” → the data array
-- “param1” → the param1 array
-- “param2” → the param2 array
-- “dirty” → true if data has been modified
--
-- Nil if no VM-based transaction is in progress.
local vm_cache = nil
-- Starts a VoxelManipulator-based transaction. -- get node and force-load area
--
-- During a VM transaction, calls to vm_get_node and vm_swap_node operate on a
-- cached copy of the world loaded via VoxelManipulators. That cache can later
-- be committed to the real map by means of vm_commit or discarded by means of
-- vm_abort.
function mesecon.vm_begin()
vm_cache = {}
end
-- Finishes a VoxelManipulator-based transaction, freeing the VMs and map data
-- and writing back any modified areas.
function mesecon.vm_commit()
for hash, tbl in pairs(vm_cache) do
if tbl.dirty then
local vm = tbl.vm
vm:set_data(tbl.data)
vm:write_to_map()
vm:update_map()
end
end
vm_cache = nil
end
-- Finishes a VoxelManipulator-based transaction, freeing the VMs and throwing
-- away any modified areas.
function mesecon.vm_abort()
vm_cache = nil
end
-- Gets the cache entry covering a position, populating it if necessary.
local function vm_get_or_create_entry(pos)
local hash = hash_blockpos(pos)
local tbl = vm_cache[hash]
if not tbl then
local vm = minetest.get_voxel_manip(pos, pos)
local min_pos, max_pos = vm:get_emerged_area()
local va = VoxelArea:new{MinEdge = min_pos, MaxEdge = max_pos}
tbl = {vm = vm, va = va, data = vm:get_data(), param1 = vm:get_light_data(), param2 = vm:get_param2_data(), dirty = false}
vm_cache[hash] = tbl
end
return tbl
end
-- Gets the node at a given position during a VoxelManipulator-based
-- transaction.
function mesecon.vm_get_node(pos)
local tbl = vm_get_or_create_entry(pos)
local index = tbl.va:indexp(pos)
local node_value = tbl.data[index]
if node_value == core.CONTENT_IGNORE then
return nil
else
local node_param1 = tbl.param1[index]
local node_param2 = tbl.param2[index]
return {name = minetest.get_name_from_content_id(node_value), param1 = node_param1, param2 = node_param2}
end
end
-- Sets a nodes name during a VoxelManipulator-based transaction.
--
-- Existing param1, param2, and metadata are left alone.
function mesecon.vm_swap_node(pos, name)
local tbl = vm_get_or_create_entry(pos)
local index = tbl.va:indexp(pos)
tbl.data[index] = minetest.get_content_id(name)
tbl.dirty = true
end
-- Gets the node at a given position, regardless of whether it is loaded or
-- not, respecting a transaction if one is in progress.
--
-- Outside a VM transaction, if the mapblock is not loaded, it is pulled into
-- the servers main map data cache and then accessed from there.
--
-- Inside a VM transaction, the transactions VM cache is used.
function mesecon.get_node_force(pos) function mesecon.get_node_force(pos)
if vm_cache then local hash = hash_blockpos(pos)
return mesecon.vm_get_node(pos)
else if mesecon.forceloaded_blocks[hash] == nil then
local node = minetest.get_node_or_nil(pos) -- if no more forceload spaces are available, try again next time
if node == nil then if minetest.forceload_block(pos) then
-- Node is not currently loaded; use a VoxelManipulator to prime mesecon.forceloaded_blocks[hash] = 0
-- the mapblock cache and try again.
minetest.get_voxel_manip(pos, pos)
node = minetest.get_node_or_nil(pos)
end end
return node
end
end
-- Swaps the node at a given position, regardless of whether it is loaded or
-- not, respecting a transaction if one is in progress.
--
-- Outside a VM transaction, if the mapblock is not loaded, it is pulled into
-- the servers main map data cache and then accessed from there.
--
-- Inside a VM transaction, the transactions VM cache is used.
--
-- This function can only be used to change the nodes name, not its parameters
-- or metadata.
function mesecon.swap_node_force(pos, name)
if vm_cache then
return mesecon.vm_swap_node(pos, name)
else else
-- This serves to both ensure the mapblock is loaded and also hand us mesecon.forceloaded_blocks[hash] = 0
-- the old node table so we can preserve param2.
local node = mesecon.get_node_force(pos)
node.name = name
minetest.swap_node(pos, node)
end end
return minetest.get_node_or_nil(pos)
end end
-- Autoconnect Hooks minetest.register_globalstep(function (dtime)
-- Nodes like conductors may change their appearance and their connection rules for hash, time in pairs(mesecon.forceloaded_blocks) do
-- right after being placed or after being dug, e.g. the default wires use this -- unload forceloaded blocks after 10 minutes without usage
-- to automatically connect to linking nodes after placement. if (time > mesecon.setting("forceload_timeout", 600)) then
-- After placement, the update function will be executed immediately so that the minetest.forceload_free_block(unhash_blockpos(hash))
-- possibly changed rules can be taken into account when recalculating the circuit. mesecon.forceloaded_blocks[hash] = nil
-- After digging, the update function will be queued and executed after else
-- recalculating the circuit. The update function must take care of updating the mesecon.forceloaded_blocks[hash] = time + dtime
-- node at the given position itself, but also all of the other nodes the given end
-- position may have (had) a linking connection to.
mesecon.autoconnect_hooks = {}
-- name: A unique name for the hook, e.g. "foowire". Used to name the actionqueue function.
-- fct: The update function with parameters function(pos, node)
function mesecon.register_autoconnect_hook(name, fct)
mesecon.autoconnect_hooks[name] = fct
mesecon.queue:add_function("autoconnect_hook_"..name, fct)
end
function mesecon.execute_autoconnect_hooks_now(pos, node)
for _, fct in pairs(mesecon.autoconnect_hooks) do
fct(pos, node)
end end
end end)
function mesecon.execute_autoconnect_hooks_queue(pos, node) -- Store and read the forceloaded blocks to / from a file
for name in pairs(mesecon.autoconnect_hooks) do -- so that those blocks are remembered when the game
mesecon.queue:add_action(pos, "autoconnect_hook_"..name, {node}) -- is restarted
end mesecon.forceloaded_blocks = mesecon.file2table("mesecon_forceloaded")
end minetest.register_on_shutdown(function()
mesecon.table2file("mesecon_forceloaded", mesecon.forceloaded_blocks)
end)

13
mesecons_wires/init.lua → mesecons/wires.lua Normal file → Executable file
View File

@ -91,7 +91,10 @@ local update_on_place_dig = function (pos, node)
end end
end end
mesecon.register_autoconnect_hook("wire", update_on_place_dig) function mesecon.update_autoconnect(pos, node)
if (not node) then node = minetest.get_node(pos) end
update_on_place_dig(pos, node)
end
-- ############################ -- ############################
-- ## Wire node registration ## -- ## Wire node registration ##
@ -194,14 +197,14 @@ register_wires = function()
offstate = "mesecons:wire_"..nodeid.."_off" offstate = "mesecons:wire_"..nodeid.."_off"
}} }}
local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1, local groups_on = {dig_immediate = 2, mesecon_conductor_craftable = 1,
not_in_creative_inventory = 1} not_in_creative_inventory = 1} --MFF
local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1} local groups_off = {dig_immediate = 2, mesecon_conductor_craftable = 1} --MFF
if nodeid ~= "00000000" then if nodeid ~= "00000000" then
groups_off["not_in_creative_inventory"] = 1 groups_off["not_in_creative_inventory"] = 1
end end
mesecon.register_node(":mesecons:wire_"..nodeid, { mesecon.register_node("mesecons:wire_"..nodeid, {
description = "Mesecon", description = "Mesecon",
drawtype = "nodebox", drawtype = "nodebox",
inventory_image = "mesecons_wire_inv.png", inventory_image = "mesecons_wire_inv.png",

0
mesecons_alias/depends.txt Normal file → Executable file
View File

0
mesecons_alias/init.lua Normal file → Executable file
View File

0
mesecons_blinkyplant/depends.txt Normal file → Executable file
View File

24
mesecons_blinkyplant/init.lua Normal file → Executable file
View File

@ -10,11 +10,25 @@ local toggle_timer = function (pos)
end end
local on_timer = function (pos) local on_timer = function (pos)
local node = minetest.get_node(pos) -- DO NOT TOUCH OR.. THREATS! Thanks, MFF
if(mesecon.flipstate(pos, node) == "on") then local activate = false
mesecon.receptor_on(pos) for _, player in pairs(minetest.get_connected_players()) do
else local p = player:getpos()
mesecon.receptor_off(pos) local dist = ((p.x-pos.x)^2 + (p.y-pos.y)^2 + (p.z-pos.z)^2)^0.5
if dist < 40 then
activate = true
break
end
end
if activate then
local node = minetest.get_node(pos)
if(mesecon.flipstate(pos, node) == "on") then
mesecon.receptor_on(pos)
else
mesecon.receptor_off(pos)
end
-- Our modification stops there, thank you, @crabman77
end end
toggle_timer(pos) toggle_timer(pos)
end end

BIN
mesecons_blinkyplant/textures/jeija_blinky_plant_off.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 454 B

After

Width:  |  Height:  |  Size: 370 B

BIN
mesecons_blinkyplant/textures/jeija_blinky_plant_on.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 B

After

Width:  |  Height:  |  Size: 395 B

0
mesecons_button/depends.txt Normal file → Executable file
View File

0
mesecons_button/init.lua Normal file → Executable file
View File

0
mesecons_button/sounds/mesecons_button_pop.ogg Normal file → Executable file
View File

0
mesecons_button/sounds/mesecons_button_push.ogg Normal file → Executable file
View File

0
mesecons_button/textures/jeija_wall_button_off.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 411 B

After

Width:  |  Height:  |  Size: 411 B

0
mesecons_button/textures/jeija_wall_button_on.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 449 B

BIN
mesecons_button/textures/jeija_wall_button_sides.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 434 B

After

Width:  |  Height:  |  Size: 220 B

0
mesecons_commandblock/depends.txt Normal file → Executable file
View File

416
mesecons_commandblock/init.lua Normal file → Executable file
View File

@ -1,208 +1,208 @@
minetest.register_chatcommand("say", { minetest.register_chatcommand("say", {
params = "<text>", params = "<text>",
description = "Say <text> as the server", description = "Say <text> as the server",
privs = {server=true}, privs = {server=true},
func = function(name, param) func = function(name, param)
minetest.chat_send_all(name .. ": " .. param) minetest.chat_send_all(name .. ": " .. param)
end end
}) })
minetest.register_chatcommand("tell", { minetest.register_chatcommand("tell", {
params = "<name> <text>", params = "<name> <text>",
description = "Say <text> to <name> privately", description = "Say <text> to <name> privately",
func = function(name, param) func = function(name, param)
local found, _, target, message = param:find("^([^%s]+)%s+(.*)$") local found, _, target, message = param:find("^([^%s]+)%s+(.*)$")
if found == nil then if found == nil then
minetest.chat_send_player(name, "Invalid usage: " .. param) minetest.chat_send_player(name, "Invalid usage: " .. param)
return return
end end
if not minetest.get_player_by_name(target) then if not minetest.get_player_by_name(target) then
minetest.chat_send_player(name, "Invalid target: " .. target) minetest.chat_send_player(name, "Invalid target: " .. target)
end end
minetest.chat_send_player(target, name .. " whispers: " .. message, false) minetest.chat_send_player(target, name .. " whispers: " .. message, false)
end end
}) })
minetest.register_chatcommand("hp", { minetest.register_chatcommand("hp", {
params = "<name> <value>", params = "<name> <value>",
description = "Set health of <name> to <value> hitpoints", description = "Set health of <name> to <value> hitpoints",
privs = {ban=true}, privs = {ban=true},
func = function(name, param) func = function(name, param)
local found, _, target, value = param:find("^([^%s]+)%s+(%d+)$") local found, _, target, value = param:find("^([^%s]+)%s+(%d+)$")
if found == nil then if found == nil then
minetest.chat_send_player(name, "Invalid usage: " .. param) minetest.chat_send_player(name, "Invalid usage: " .. param)
return return
end end
local player = minetest.get_player_by_name(target) local player = minetest.get_player_by_name(target)
if player then if player then
player:set_hp(value) player:set_hp(value)
else else
minetest.chat_send_player(name, "Invalid target: " .. target) minetest.chat_send_player(name, "Invalid target: " .. target)
end end
end end
}) })
local function initialize_data(meta) local function initialize_data(meta)
local commands = minetest.formspec_escape(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.."]" ..
"label[1,3.8;@nearest, @farthest, and @random are replaced by the respective player names]" .. "label[1,3.8;@nearest, @farthest, and @random are replaced by the respective player names]" ..
"button_exit[3.3,4.5;2,1;submit;Submit]") "button_exit[3.3,4.5;2,1;submit;Submit]")
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
if owner == "" then if owner == "" then
owner = "not owned" owner = "not owned"
else else
owner = "owned by " .. owner owner = "owned by " .. owner
end end
meta:set_string("infotext", "Command Block\n" .. meta:set_string("infotext", "Command Block\n" ..
"(" .. owner .. ")\n" .. "(" .. owner .. ")\n" ..
"Commands: "..commands) "Commands: "..commands)
end end
local function construct(pos) local function construct(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("commands", "tell @nearest Commandblock unconfigured") meta:set_string("commands", "tell @nearest Commandblock unconfigured")
meta:set_string("owner", "") meta:set_string("owner", "")
initialize_data(meta) initialize_data(meta)
end end
local function after_place(pos, placer) local function after_place(pos, placer)
if placer then if placer then
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("owner", placer:get_player_name()) meta:set_string("owner", placer:get_player_name())
initialize_data(meta) initialize_data(meta)
end end
end end
local function receive_fields(pos, formname, fields, sender) local function receive_fields(pos, formname, fields, sender)
if not fields.submit then if not fields.submit then
return return
end end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
if owner ~= "" and sender:get_player_name() ~= owner then if owner ~= "" and sender:get_player_name() ~= owner then
return return
end end
meta:set_string("commands", fields.commands) meta:set_string("commands", fields.commands)
initialize_data(meta) initialize_data(meta)
end end
local function resolve_commands(commands, pos) local function resolve_commands(commands, pos)
local players = minetest.get_connected_players() local players = minetest.get_connected_players()
-- No players online: remove all commands containing -- No players online: remove all commands containing
-- @nearest, @farthest and @random -- @nearest, @farthest and @random
if #players == 0 then if #players == 0 then
commands = commands:gsub("[^\r\n]+", function (line) commands = commands:gsub("[^\r\n]+", function (line)
if line:find("@nearest") then return "" end if line:find("@nearest") then return "" end
if line:find("@farthest") then return "" end if line:find("@farthest") then return "" end
if line:find("@random") then return "" end if line:find("@random") then return "" end
return line return line
end) end)
return commands return commands
end end
local nearest, farthest = nil, nil local nearest, farthest = nil, nil
local min_distance, max_distance = math.huge, -1 local min_distance, max_distance = math.huge, -1
for index, player in pairs(players) do for index, player in pairs(players) do
local distance = vector.distance(pos, player:getpos()) local distance = vector.distance(pos, player:getpos())
if distance < min_distance then if distance < min_distance then
min_distance = distance min_distance = distance
nearest = player:get_player_name() nearest = player:get_player_name()
end end
if distance > max_distance then if distance > max_distance then
max_distance = distance max_distance = distance
farthest = player:get_player_name() farthest = player:get_player_name()
end end
end end
local random = players[math.random(#players)]:get_player_name() local random = players[math.random(#players)]:get_player_name()
commands = commands:gsub("@nearest", nearest) commands = commands:gsub("@nearest", nearest)
commands = commands:gsub("@farthest", farthest) commands = commands:gsub("@farthest", farthest)
commands = commands:gsub("@random", random) commands = commands:gsub("@random", random)
return commands return commands
end end
local function commandblock_action_on(pos, node) local function commandblock_action_on(pos, node)
if node.name ~= "mesecons_commandblock:commandblock_off" then if node.name ~= "mesecons_commandblock:commandblock_off" then
return return
end end
minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_on"}) minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_on"})
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
if owner == "" then if owner == "" then
return return
end end
local commands = resolve_commands(meta:get_string("commands"), pos) local commands = resolve_commands(meta:get_string("commands"), pos)
for _, command in pairs(commands:split("\n")) do for _, command in pairs(commands:split("\n")) do
local pos = command:find(" ") local pos = command:find(" ")
local cmd, param = command, "" local cmd, param = command, ""
if pos then if pos then
cmd = command:sub(1, pos - 1) cmd = command:sub(1, pos - 1)
param = command:sub(pos + 1) param = command:sub(pos + 1)
end end
local cmddef = minetest.chatcommands[cmd] local cmddef = minetest.chatcommands[cmd]
if not cmddef then if not cmddef then
minetest.chat_send_player(owner, "The command "..cmd.." does not exist") minetest.chat_send_player(owner, "The command "..cmd.." does not exist")
return return
end end
local has_privs, missing_privs = minetest.check_player_privs(owner, cmddef.privs) local has_privs, missing_privs = minetest.check_player_privs(owner, cmddef.privs)
if not has_privs then if not has_privs then
minetest.chat_send_player(owner, "You don't have permission " minetest.chat_send_player(owner, "You don't have permission "
.."to run "..cmd .."to run "..cmd
.." (missing privileges: " .." (missing privileges: "
..table.concat(missing_privs, ", ")..")") ..table.concat(missing_privs, ", ")..")")
return return
end end
cmddef.func(owner, param) cmddef.func(owner, param)
end end
end end
local function commandblock_action_off(pos, node) local function commandblock_action_off(pos, node)
if node.name == "mesecons_commandblock:commandblock_on" then if node.name == "mesecons_commandblock:commandblock_on" then
minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_off"}) minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_off"})
end end
end end
local function can_dig(pos, player) local function can_dig(pos, player)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
return owner == "" or owner == player:get_player_name() return owner == "" or owner == player:get_player_name()
end end
minetest.register_node("mesecons_commandblock:commandblock_off", { minetest.register_node("mesecons_commandblock:commandblock_off", {
description = "Command Block", description = "Command Block",
tiles = {"jeija_commandblock_off.png"}, tiles = {"jeija_commandblock_off.png"},
inventory_image = minetest.inventorycube("jeija_commandblock_off.png"), inventory_image = minetest.inventorycube("jeija_commandblock_off.png"),
groups = {cracky=2, mesecon_effector_off=1}, groups = {cracky=2, mesecon_effector_off=1},
on_construct = construct, on_construct = construct,
after_place_node = after_place, after_place_node = after_place,
on_receive_fields = receive_fields, on_receive_fields = receive_fields,
can_dig = can_dig, can_dig = can_dig,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
mesecons = {effector = { mesecons = {effector = {
action_on = commandblock_action_on action_on = commandblock_action_on
}} }}
}) })
minetest.register_node("mesecons_commandblock:commandblock_on", { minetest.register_node("mesecons_commandblock:commandblock_on", {
tiles = {"jeija_commandblock_on.png"}, tiles = {"jeija_commandblock_on.png"},
groups = {cracky=2, mesecon_effector_on=1, not_in_creative_inventory=1}, groups = {cracky=2, mesecon_effector_on=1, not_in_creative_inventory=1},
light_source = 10, light_source = 10,
drop = "mesecons_commandblock:commandblock_off", drop = "mesecons_commandblock:commandblock_off",
on_construct = construct, on_construct = construct,
after_place_node = after_place, after_place_node = after_place,
on_receive_fields = receive_fields, on_receive_fields = receive_fields,
can_dig = can_dig, can_dig = can_dig,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
mesecons = {effector = { mesecons = {effector = {
action_off = commandblock_action_off action_off = commandblock_action_off
}} }}
}) })

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

BIN
mesecons_commandblock/textures/jeija_commandblock_off.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

After

Width:  |  Height:  |  Size: 183 B

BIN
mesecons_commandblock/textures/jeija_commandblock_on.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B

After

Width:  |  Height:  |  Size: 183 B

0
mesecons_delayer/depends.txt Normal file → Executable file
View File

0
mesecons_delayer/init.lua Normal file → Executable file
View File

BIN
mesecons_delayer/textures/mesecons_delayer_bottom.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 438 B

After

Width:  |  Height:  |  Size: 261 B

BIN
mesecons_delayer/textures/mesecons_delayer_ends_off.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

After

Width:  |  Height:  |  Size: 204 B

BIN
mesecons_delayer/textures/mesecons_delayer_ends_on.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 B

After

Width:  |  Height:  |  Size: 204 B

BIN
mesecons_delayer/textures/mesecons_delayer_off_1.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 562 B

After

Width:  |  Height:  |  Size: 448 B

BIN
mesecons_delayer/textures/mesecons_delayer_off_2.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 558 B

After

Width:  |  Height:  |  Size: 449 B

BIN
mesecons_delayer/textures/mesecons_delayer_off_3.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 561 B

After

Width:  |  Height:  |  Size: 448 B

BIN
mesecons_delayer/textures/mesecons_delayer_off_4.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 556 B

After

Width:  |  Height:  |  Size: 446 B

BIN
mesecons_delayer/textures/mesecons_delayer_on_1.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 635 B

After

Width:  |  Height:  |  Size: 544 B

BIN
mesecons_delayer/textures/mesecons_delayer_on_2.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 632 B

After

Width:  |  Height:  |  Size: 544 B

BIN
mesecons_delayer/textures/mesecons_delayer_on_3.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 635 B

After

Width:  |  Height:  |  Size: 544 B

BIN
mesecons_delayer/textures/mesecons_delayer_on_4.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 630 B

After

Width:  |  Height:  |  Size: 539 B

BIN
mesecons_delayer/textures/mesecons_delayer_sides_off.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 B

After

Width:  |  Height:  |  Size: 204 B

BIN
mesecons_delayer/textures/mesecons_delayer_sides_on.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

After

Width:  |  Height:  |  Size: 204 B

0
mesecons_detector/depends.txt Normal file → Executable file
View File

48
mesecons_detector/init.lua Normal file → Executable file
View File

@ -4,10 +4,12 @@ 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 function object_detector_make_formspec(pos) -- The following file was modified to detect multiple players
minetest.get_meta(pos):set_string("formspec", "size[9,2.5]" .. local object_detector_make_formspec = function (pos)
"field[0.3, 0;9,2;scanname;Name of player to scan for (empty for any):;${scanname}]".. local meta = minetest.get_meta(pos)
"field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]".. meta:set_string("formspec", "size[9,2.5]" ..
"field[0.3, 0;12,2;scanname;Name of player(s) to scan for (empty for any, separate with comma):;${scanname}]"..
"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
@ -23,34 +25,36 @@ end
-- returns true if player was found, false if not -- returns true if player was found, false if not
local function object_detector_scan(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
-- abort if no scan results were found local isname = obj:get_player_name() -- "" is returned if it is not a player; "" ~= nil!
if next(objs) == nil then return false end local scanname = minetest.get_meta(pos):get_string("scanname"):gsub(' ', "")
if (scanname == "" and isname ~= "") then
local scanname = minetest.get_meta(pos):get_string("scanname") minetest.get_meta(pos):set_string("scanedname", "")
local every_player = scanname == "" return true
for _, obj in pairs(objs) do end
-- "" is returned if it is not a player; "" ~= nil; so only handle objects with foundname ~= "" local founds = {}
local foundname = obj:get_player_name() for _, name in pairs(scanname:split(',')) do
if (isname == name and isname ~= "") then
if foundname ~= "" then table.insert(founds, isname)
-- return true if scanning for any player or if specific playername was detected
if scanname == "" or foundname == scanname then
return true
end end
end end
if #founds > 0 then
minetest.get_meta(pos):set_string("scannedname", table.concat(founds, ','))
return true
end
end end
minetest.get_meta(pos):set_string("scanedname", "")
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)
if channel == meta:get_string("digiline_channel") then local active_channel = meta:get_string("digiline_channel")
meta:set_string("scanname", msg) if channel == active_channel then
meta:set_string("scanedname", msg)
object_detector_make_formspec(pos) object_detector_make_formspec(pos)
end end
end, end,

BIN
mesecons_detector/textures/jeija_node_detector_off.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 717 B

After

Width:  |  Height:  |  Size: 680 B

0
mesecons_detector/textures/jeija_node_detector_on.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 727 B

After

Width:  |  Height:  |  Size: 727 B

BIN
mesecons_detector/textures/jeija_object_detector_off.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 655 B

BIN
mesecons_detector/textures/jeija_object_detector_on.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 735 B

After

Width:  |  Height:  |  Size: 733 B

0
mesecons_doors/depends.txt Normal file → Executable file
View File

13
mesecons_doors/init.lua Normal file → Executable file
View File

@ -74,6 +74,19 @@ meseconify_door("doors:door_steel")
meseconify_door("doors:door_glass") meseconify_door("doors:door_glass")
meseconify_door("doors:door_obsidian_glass") meseconify_door("doors:door_obsidian_glass")
--MFF meseconify all doors, crabman 12/06/2016
meseconify_door("doors:door_cherry")
meseconify_door("doors:door_tin")
meseconify_door("doors:door_prison")
meseconify_door("doors:door_gardengate_white")
meseconify_door("doors:door3_wood")
meseconify_door("doors:door3_steel")
meseconify_door("doors:door3_glass")
meseconify_door("doors:door3_obsidian_glass")
meseconify_door("doors:door3_cherry")
meseconify_door("doors:door3_prison")
-- Trapdoor -- Trapdoor
local function trapdoor_switch(pos, node) local function trapdoor_switch(pos, node)
local state = minetest.get_meta(pos):get_int("state") local state = minetest.get_meta(pos):get_int("state")

4
mesecons_extrawires/corner.lua Normal file → Executable file
View File

@ -37,7 +37,7 @@ minetest.register_node("mesecons_extrawires:corner_on", {
sunlight_propagates = true, sunlight_propagates = true,
selection_box = corner_selectionbox, selection_box = corner_selectionbox,
node_box = corner_nodebox, node_box = corner_nodebox,
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 2, not_in_creative_inventory = 1}, -- MFF
drop = "mesecons_extrawires:corner_off", drop = "mesecons_extrawires:corner_off",
mesecons = {conductor = mesecons = {conductor =
{ {
@ -64,7 +64,7 @@ minetest.register_node("mesecons_extrawires:corner_off", {
sunlight_propagates = true, sunlight_propagates = true,
selection_box = corner_selectionbox, selection_box = corner_selectionbox,
node_box = corner_nodebox, node_box = corner_nodebox,
groups = {dig_immediate = 3}, groups = {dig_immediate = 2}, --MFF
mesecons = {conductor = mesecons = {conductor =
{ {
state = mesecon.state.off, state = mesecon.state.off,

4
mesecons_extrawires/crossover.lua Normal file → Executable file
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}, groups = {dig_immediate=2, mesecon=3}, --MFF
mesecons = { mesecons = {
conductor = { conductor = {
states = crossover_states, states = crossover_states,
@ -77,7 +77,7 @@ minetest.register_node("mesecons_extrawires:crossover_01", {
{ -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, not_in_creative_inventory=1}, groups = {dig_immediate=2, mesecon=3, not_in_creative_inventory=1}, --MFF
mesecons = { mesecons = {
conductor = { conductor = {
states = crossover_states, states = crossover_states,

0
mesecons_extrawires/depends.txt Normal file → Executable file
View File

0
mesecons_extrawires/init.lua Normal file → Executable file
View File

0
mesecons_extrawires/mesewire.lua Normal file → Executable file
View File

4
mesecons_extrawires/tjunction.lua Normal file → Executable file
View File

@ -38,7 +38,7 @@ 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, not_in_creative_inventory = 1}, groups = {dig_immediate = 2, not_in_creative_inventory = 1}, --MFF
drop = "mesecons_extrawires:tjunction_off", drop = "mesecons_extrawires:tjunction_off",
mesecons = {conductor = mesecons = {conductor =
{ {
@ -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}, groups = {dig_immediate = 2}, --MFF
mesecons = {conductor = mesecons = {conductor =
{ {
state = mesecon.state.off, state = mesecon.state.off,

8
mesecons_extrawires/vertical.lua Normal file → Executable file
View File

@ -90,7 +90,7 @@ mesecon.register_node("mesecons_extrawires:vertical", {
after_dig_node = vertical_update after_dig_node = vertical_update
},{ },{
tiles = {"mesecons_wire_off.png"}, tiles = {"mesecons_wire_off.png"},
groups = {dig_immediate=3}, groups = {dig_immediate=2}, --MFF
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.off, state = mesecon.state.off,
onstate = "mesecons_extrawires:vertical_on", onstate = "mesecons_extrawires:vertical_on",
@ -98,7 +98,7 @@ 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=2, not_in_creative_inventory=1}, --MFF
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.on, state = mesecon.state.on,
offstate = "mesecons_extrawires:vertical_off", offstate = "mesecons_extrawires:vertical_off",
@ -113,7 +113,7 @@ mesecon.register_node("mesecons_extrawires:vertical_top", {
walkable = false, walkable = false,
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
groups = {dig_immediate=3, not_in_creative_inventory=1}, groups = {dig_immediate=2, not_in_creative_inventory=1}, --MFF
selection_box = top_box, selection_box = top_box,
node_box = top_box, node_box = top_box,
is_vertical_conductor = true, is_vertical_conductor = true,
@ -143,7 +143,7 @@ mesecon.register_node("mesecons_extrawires:vertical_bottom", {
walkable = false, walkable = false,
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 2, not_in_creative_inventory = 1}, --MFF
selection_box = bottom_box, selection_box = bottom_box,
node_box = bottom_box, node_box = bottom_box,
is_vertical_conductor = true, is_vertical_conductor = true,

0
mesecons_gates/depends.txt Normal file → Executable file
View File

0
mesecons_gates/init.lua Normal file → Executable file
View File

BIN
mesecons_gates/textures/jeija_gate_and.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 B

After

Width:  |  Height:  |  Size: 129 B

BIN
mesecons_gates/textures/jeija_gate_diode.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

After

Width:  |  Height:  |  Size: 134 B

BIN
mesecons_gates/textures/jeija_gate_nand.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 127 B

BIN
mesecons_gates/textures/jeija_gate_not.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 B

After

Width:  |  Height:  |  Size: 133 B

BIN
mesecons_gates/textures/jeija_gate_off.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 B

After

Width:  |  Height:  |  Size: 105 B

BIN
mesecons_gates/textures/jeija_gate_on.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 B

After

Width:  |  Height:  |  Size: 109 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

After

Width:  |  Height:  |  Size: 127 B

BIN
mesecons_gates/textures/jeija_gate_xor.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 136 B

0
mesecons_hydroturbine/depends.txt Normal file → Executable file
View File

4
mesecons_hydroturbine/init.lua Normal file → Executable file
View File

@ -59,7 +59,7 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_off"},
chance = 1, chance = 1,
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" or minetest.get_node(waterpos).name == "default:river_water_flowing" then
minetest.set_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)
@ -73,7 +73,7 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_on"},
chance = 1, chance = 1,
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" or minetest.get_node(waterpos).name ~= "default:river_water_flowing" then
minetest.set_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)

0
mesecons_hydroturbine/models/jeija_hydro_turbine.obj Normal file → Executable file
View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 782 B

After

Width:  |  Height:  |  Size: 776 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 758 B

After

Width:  |  Height:  |  Size: 754 B

View File

Before

Width:  |  Height:  |  Size: 564 B

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 820 B

After

Width:  |  Height:  |  Size: 729 B

View File

Before

Width:  |  Height:  |  Size: 496 B

After

Width:  |  Height:  |  Size: 496 B

0
mesecons_insulated/depends.txt Normal file → Executable file
View File

4
mesecons_insulated/init.lua Normal file → Executable file
View File

@ -30,7 +30,7 @@ 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, not_in_creative_inventory = 1}, groups = {dig_immediate = 2, not_in_creative_inventory = 1}, --MFF
drop = "mesecons_insulated:insulated_off", drop = "mesecons_insulated:insulated_off",
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.on, state = mesecon.state.on,
@ -62,7 +62,7 @@ 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}, groups = {dig_immediate = 2}, --MFF
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.off, state = mesecon.state.off,
onstate = "mesecons_insulated:insulated_on", onstate = "mesecons_insulated:insulated_on",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 B

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 B

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B

After

Width:  |  Height:  |  Size: 156 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 B

After

Width:  |  Height:  |  Size: 136 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 B

After

Width:  |  Height:  |  Size: 136 B

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