Compare commits

..

1 Commits

Author SHA1 Message Date
numzero
a38f37d1ee Enforce checks for ignore
It is `buildable_to` so the standard check didn’t work
2020-10-23 20:37:40 +03:00
84 changed files with 1079 additions and 854 deletions

@ -1,15 +0,0 @@
on: [push, pull_request]
name: Check & Release
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: apt
run: sudo apt-get install -y luarocks
- name: luacheck install
run: luarocks install --local luacheck
- name: luacheck run
run: $HOME/.luarocks/bin/luacheck ./

@ -1,36 +0,0 @@
std = "lua51c"
ignore = {
"21/_+", -- Unused variable, except "_", "__", etc.
"213", -- Unused loop variable
"421", -- Shadowing a local variable
"422", -- Shadowing an argument
"423", -- Shadowing a loop variable
"431", -- Shadowing an upvalue
"432", -- Shadowing an upvalue argument
"433", -- Shadowing an upvalue loop variable
"542", -- Empty if branch
}
max_line_length = 200
read_globals = {
"default",
"digiline",
"doors",
"dump",
"jit",
"minetest",
"screwdriver",
"string.split",
"table.copy",
"table.insert_all",
"vector",
"VoxelArea",
}
globals = {"mesecon"}
files["mesecons/actionqueue.lua"] = {
globals = {"minetest.registered_globalsteps"},
}

@ -1,12 +1,6 @@
The LGPLv3 applies to all code in this project. The LGPLv3 applies to all code in this project.
The CC-BY-SA-3.0 license applies to textures and any other content in this project which is not source code. The CC-BY-SA-3.0 license applies to textures and any other content in this project which is not source code.
The file mesecons_detector/textures/mesecons_detector_side.png is an unmodified copy of
"default_steel_block.png" by Jean-Patrick Guerrero <https://github.com/kilbith>, which can be found at
<https://github.com/minetest/minetest_game/blob/9528c0f8b93d6934930e99c3c116df275fb0e4bc/mods/default/textures/default_steel_block.png>.
"default_steel_block.png" is licensed under a CC BY-SA 3.0 license. This license can be found later in this document, and can also be found at
<https://creativecommons.org/licenses/by-sa/3.0/>. The artwork is reportedly copyright (C) 2010-2018 kilbith.
================================================================= =================================================================
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE

@ -12,9 +12,9 @@ MESECONS by Jeija and contributors
Mezzee-what? Mezzee-what?
------------ ------------
[Mesecons](https://mesecons.net/)! They're yellow, they're conductive, and they'll add a whole new dimension to Minetest's gameplay. [Mesecons](http://mesecons.net/)! They're yellow, they're conductive, and they'll add a whole new dimension to Minetest's gameplay.
Mesecons is a mod for [Minetest](https://www.minetest.net/) that implements a ton of items related to digital circuitry, such as wires, buttons, lights, and even programmable controllers. Among other things, there are also pistons, solar panels, pressure plates, and note blocks. Mesecons is a mod for [Minetest](http://minetest.net/) that implements a ton of items related to digital circuitry, such as wires, buttons, lights, and even programmable controllers. Among other things, there are also pistons, solar panels, pressure plates, and note blocks.
Mesecons has a similar goal to Redstone in Minecraft, but works in its own way, with different rules and mechanics. Mesecons has a similar goal to Redstone in Minecraft, but works in its own way, with different rules and mechanics.
@ -74,10 +74,8 @@ There are also a whole bunch of other people helping with everything from code t
Alright, how can I use it? Alright, how can I use it?
-------------------------- --------------------------
All textures in this project are licensed under the CC-BY-SA 3.0 (Creative Commons Attribution-ShareAlike 3.0 Generic). All textures in this project are licensed under the CC-BY-SA 3.0 (Creative Commons Attribution-ShareAlike 3.0 Generic). That means you can distribute and remix them as much as you want to, under the condition that you give credit to the authors and the project, and that if you remix and release them, they must be under the same or similar license to this one.
That means you can distribute and remix them as much as you want to, under the condition that you give credit to the authors and the project, and that if you remix and release them, they must be under the same or similar license to this one.
All code in this project is licensed under the LGPL version 3. All code in this project is licensed under the LGPL version 3 or later. That means you have unlimited freedom to distribute and modify the work however you see fit, provided that if you decide to distribute it or any modified versions of it, you must also use the same license. The LGPL also grants the additional freedom to write extensions for the software and distribute them without the extensions being subject to the terms of the LGPL, although the software itself retains its license.
That means you have unlimited freedom to distribute and modify the work however you see fit, provided that if you decide to distribute it or any modified versions of it, you must also use the same license. The LGPL also grants the additional freedom to write extensions for the software and distribute them without the extensions being subject to the terms of the LGPL, although the software itself retains its license.
No warranty is provided, express or implied, for any part of the project. No warranty is provided, express or implied, for any part of the project.

@ -1,9 +1,9 @@
{ {
"name": "mesecons", "name": "mesecons",
"description": "Mesecons is a mod for Minetest that implements items related to digital circuitry: wires, buttons, lights, and programmable controllers.", "description": "Mesecons is a mod for Minetest that implements items related to digital circuitry: wires, buttons, lights, and programmable controllers.",
"homepage": "https://mesecons.net", "homepage": "http://mesecons.net",
"authors": ["Jeija"], "authors": "Jeija",
"license": "LGPL-3.0", "license": "LGPL-3.0+",
"keywords": [ "keywords": [
"mesecons", "mesecons",
"minetest", "minetest",

@ -29,7 +29,7 @@ local queue = mesecon.queue
queue.actions = {} -- contains all ActionQueue actions queue.actions = {} -- contains all ActionQueue actions
function queue:add_function(name, func) function queue:add_function(name, func)
self.funcs[name] = func queue.funcs[name] = func
end end
-- If add_action with twice the same overwritecheck and same position are called, the first one is overwritten -- If add_action with twice the same overwritecheck and same position are called, the first one is overwritten
@ -51,17 +51,17 @@ function queue:add_action(pos, func, params, time, overwritecheck, priority)
-- check if old action has to be overwritten / removed: -- check if old action has to be overwritten / removed:
if overwritecheck then if overwritecheck then
for i, ac in ipairs(self.actions) do for i, ac in ipairs(queue.actions) do
if vector.equals(pos, ac.pos) if vector.equals(pos, ac.pos)
and mesecon.cmpAny(overwritecheck, ac.owcheck) then and mesecon.cmpAny(overwritecheck, ac.owcheck) then
-- remove the old action -- remove the old action
table.remove(self.actions, i) table.remove(queue.actions, i)
break break
end end
end end
end end
table.insert(self.actions, action) table.insert(queue.actions, action)
end end
-- execute the stored functions on a globalstep -- execute the stored functions on a globalstep
@ -133,8 +133,8 @@ end
function queue:execute(action) function queue:execute(action)
-- ignore if action queue function name doesn't exist, -- ignore if action queue function name doesn't exist,
-- (e.g. in case the action queue savegame was written by an old mesecons version) -- (e.g. in case the action queue savegame was written by an old mesecons version)
if self.funcs[action.func] then if queue.funcs[action.func] then
self.funcs[action.func](action.pos, unpack(action.params)) queue.funcs[action.func](action.pos, unpack(action.params))
end end
end end

@ -1,62 +0,0 @@
-- a simple first-in-first-out queue
-- very similar to the one in https://github.com/minetest/minetest/pull/7683
local fifo_queue = {}
local metatable = {__index = fifo_queue}
-- creates a new empty queue
function fifo_queue.new()
local q = {n_in = 0, n_out = 0, i_out = 1, buf_in = {}, buf_out = {}}
setmetatable(q, metatable)
return q
end
-- adds an element to the queue
function fifo_queue.add(self, v)
local n = self.n_in + 1
self.n_in = n
self.buf_in[n] = v
end
-- removes and returns the next element, or nil of empty
function fifo_queue.take(self)
local i_out = self.i_out
if i_out <= self.n_out then
local v = self.buf_out[i_out]
self.i_out = i_out + 1
self.buf_out[i_out] = true
return v
end
-- buf_out is empty, try to swap
self.i_out = 1
self.n_out = 0
if self.n_in == 0 then
return nil -- empty
end
-- swap
self.n_out = self.n_in
self.n_in = 0
self.buf_out, self.buf_in = self.buf_in, self.buf_out
local v = self.buf_out[1]
self.i_out = 2
self.buf_out[1] = true
return v
end
-- returns whether the queue is empty
function fifo_queue.is_empty(self)
return self.n_out == self.i_out + 1 and self.n_in == 0
end
-- returns stuff for iteration in a for loop, like pairs
-- adding new elements while iterating is no problem
function fifo_queue.iter(self)
return fifo_queue.take, self, nil
end
return fifo_queue

@ -11,7 +11,7 @@
-- RECEPTORS -- RECEPTORS
-- mesecon.is_receptor(nodename) --> Returns true if nodename is a receptor -- mesecon.is_receptor(nodename) --> Returns true if nodename is a receptor
-- mesecon.is_receptor_on(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.on -- mesecon.is_receptor_on(nodename --> Returns true if nodename is an receptor with state = mesecon.state.on
-- mesecon.is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off -- mesecon.is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off
-- mesecon.receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified) -- mesecon.receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified)
@ -46,9 +46,6 @@
-- mesecon.rotate_rules_down(rules) -- mesecon.rotate_rules_down(rules)
-- These functions return rules that have been rotated in the specific direction -- These functions return rules that have been rotated in the specific direction
-- See fifo_queue.lua for documentation.
mesecon.fifo_queue = dofile(minetest.get_modpath("mesecons").."/fifo_queue.lua")
-- General -- General
function mesecon.get_effector(nodename) function mesecon.get_effector(nodename)
if minetest.registered_nodes[nodename] if minetest.registered_nodes[nodename]
@ -95,8 +92,8 @@ function mesecon.get_any_inputrules(node)
end end
function mesecon.get_any_rules(node) function mesecon.get_any_rules(node)
return mesecon.merge_rule_sets(mesecon.get_any_inputrules(node), return mesecon.mergetable(mesecon.get_any_inputrules(node) or {},
mesecon.get_any_outputrules(node)) mesecon.get_any_outputrules(node) or {})
end end
-- Receptors -- Receptors
@ -319,7 +316,7 @@ function mesecon.get_conductor_on(node_off, rulename)
return conductor.states[tonumber(binstate,2)+1] return conductor.states[tonumber(binstate,2)+1]
end end
end end
return nil return offstate
end end
function mesecon.get_conductor_off(node_on, rulename) function mesecon.get_conductor_off(node_on, rulename)
@ -335,7 +332,7 @@ function mesecon.get_conductor_off(node_on, rulename)
return conductor.states[tonumber(binstate,2)+1] return conductor.states[tonumber(binstate,2)+1]
end end
end end
return nil return onstate
end end
function mesecon.conductor_get_rules(node) function mesecon.conductor_get_rules(node)
@ -369,98 +366,37 @@ function mesecon.is_power_off(pos, rulename)
return false return false
end end
-- The set of conductor states which require light updates when they change.
local light_update_conductors
-- Calculate the contents of the above set if they have not been calculated.
local function find_light_update_conductors()
-- The expensive calculation is only done the first time.
if light_update_conductors then return end
light_update_conductors = {}
-- Find conductors whose lighting characteristics change depending on their state.
local checked = {}
for name, def in pairs(minetest.registered_nodes) do
local conductor = mesecon.get_conductor(name)
if conductor and not checked[name] then
-- Find the other states of the conductor besides the current one.
local other_states
if conductor.onstate then
other_states = {conductor.onstate}
elseif conductor.offstate then
other_states = {conductor.offstate}
else
other_states = conductor.states
end
-- Check the conductor. Other states are marked as checked.
for _, other_state in ipairs(other_states) do
local other_def = minetest.registered_nodes[other_state]
if (def.paramtype == "light") ~= (other_def.paramtype == "light")
or def.sunlight_propagates ~= other_def.sunlight_propagates
or def.light_source ~= other_def.light_source then
-- The light characteristics change depending on the state.
-- The states are added to the set.
light_update_conductors[name] = true
for _, other_state in ipairs(other_states) do
light_update_conductors[other_state] = true
checked[other_state] = true
end
break
end
checked[other_state] = true
end
end
end
end
-- Turn off an equipotential section starting at `pos`, which outputs in the direction of `link`. -- 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. -- Breadth-first search. Map is abstracted away in a voxelmanip.
-- Follow all all conductor paths replacing conductors that were already -- Follow all all conductor paths replacing conductors that were already
-- looked at, activating / changing all effectors along the way. -- looked at, activating / changing all effectors along the way.
function mesecon.turnon(pos, link) function mesecon.turnon(pos, link)
find_light_update_conductors() local frontiers = {{pos = pos, link = link}}
local frontiers = mesecon.fifo_queue.new()
frontiers:add({pos = pos, link = link})
local pos_can_be_skipped = {}
local depth = 1 local depth = 1
for f in frontiers:iter() do while frontiers[1] do
local f = table.remove(frontiers, 1)
local node = mesecon.get_node_force(f.pos) local node = mesecon.get_node_force(f.pos)
if not node then if not node then
-- Area does not exist; do nothing -- Area does not exist; do nothing
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true elseif mesecon.is_conductor_off(node, f.link) then
elseif mesecon.is_conductor(node.name) then
local rules = mesecon.conductor_get_rules(node) local rules = mesecon.conductor_get_rules(node)
if mesecon.is_conductor_off(node, f.link) then
-- Call turnon on neighbors -- 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)
if not pos_can_be_skipped[minetest.hash_node_position(np)] then
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
frontiers:add({pos = np, link = l}) table.insert(frontiers, {pos = np, link = l})
end
end end
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link), light_update_conductors[node.name] ~= nil) mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link))
end
-- Only conductors with flat rules can be reliably skipped later
if not rules[1] or rules[1].x then
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = 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
mesecon.activate(f.pos, node, f.link, depth) mesecon.activate(f.pos, node, f.link, depth)
end end
else
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
end end
depth = depth + 1 depth = depth + 1
end end
@ -483,32 +419,25 @@ end
-- depth = indicates order in which signals wire fired, higher is later -- depth = indicates order in which signals wire fired, higher is later
-- } -- }
function mesecon.turnoff(pos, link) function mesecon.turnoff(pos, link)
find_light_update_conductors() local frontiers = {{pos = pos, link = link}}
local frontiers = mesecon.fifo_queue.new()
frontiers:add({pos = pos, link = link})
local signals = {} local signals = {}
local pos_can_be_skipped = {}
local depth = 1 local depth = 1
for f in frontiers:iter() do while frontiers[1] do
local f = table.remove(frontiers, 1)
local node = mesecon.get_node_force(f.pos) local node = mesecon.get_node_force(f.pos)
if not node then if not node then
-- Area does not exist; do nothing -- Area does not exist; do nothing
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true elseif mesecon.is_conductor_on(node, f.link) then
elseif mesecon.is_conductor(node.name) then
local rules = mesecon.conductor_get_rules(node) local rules = mesecon.conductor_get_rules(node)
if mesecon.is_conductor_on(node, f.link) then
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)
if not pos_can_be_skipped[minetest.hash_node_position(np)] then
-- Check if an onstate receptor is connected. If that is the case, -- Check if an onstate receptor is connected. If that is the case,
-- abort this turnoff process by returning false. `receptor_off` will -- abort this turnoff process by returning false. `receptor_off` will
-- discard all the changes that we made in the voxelmanip: -- discard all the changes that we made in the voxelmanip:
if mesecon.rules_link_rule_all_inverted(f.pos, r)[1] then for _, l in ipairs(mesecon.rules_link_rule_all_inverted(f.pos, r)) do
if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then
return false return false
end end
@ -516,18 +445,11 @@ function mesecon.turnoff(pos, link)
-- Call turnoff on neighbors -- Call turnoff on neighbors
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
frontiers:add({pos = np, link = l}) table.insert(frontiers, {pos = np, link = l})
end
end end
end end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link), light_update_conductors[node.name] ~= nil) mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link))
end
-- Only conductors with flat rules can be reliably skipped later
if not rules[1] or rules[1].x then
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
end
elseif mesecon.is_effector(node.name) then elseif mesecon.is_effector(node.name) then
table.insert(signals, { table.insert(signals, {
pos = f.pos, pos = f.pos,
@ -535,8 +457,6 @@ function mesecon.turnoff(pos, link)
link = f.link, link = f.link,
depth = depth depth = depth
}) })
else
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
end end
depth = depth + 1 depth = depth + 1
end end

@ -11,4 +11,4 @@ local old_forceloaded_blocks = mesecon.file2table("mesecon_forceloaded")
for hash, _ in pairs(old_forceloaded_blocks) do for hash, _ in pairs(old_forceloaded_blocks) do
minetest.forceload_free_block(unhash_blockpos(hash)) minetest.forceload_free_block(unhash_blockpos(hash))
end end
os.remove(minetest.get_worldpath().."/mesecon_forceloaded") os.remove(minetest.get_worldpath()..DIR_DELIM.."mesecon_forceloaded")

@ -1,3 +1,2 @@
name = mesecons name = mesecons
# default is an optional dependency as some mods may expect it as a transitory depends = default
# dependency when they depend on mesecons.

@ -16,9 +16,9 @@ mesecon.rules.default = {
{x = 0, y = -1, z = -1}, {x = 0, y = -1, z = -1},
} }
mesecon.rules.floor = mesecon.merge_rule_sets(mesecon.rules.default, {{x = 0, y = -1, z = 0}}) mesecon.rules.floor = mesecon.mergetable(mesecon.rules.default, {{x = 0, y = -1, z = 0}})
mesecon.rules.pplate = mesecon.merge_rule_sets(mesecon.rules.floor, {{x = 0, y = -2, z = 0}}) mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.floor, {{x = 0, y = -2, z = 0}})
mesecon.rules.buttonlike = { mesecon.rules.buttonlike = {
{x = 1, y = 0, z = 0}, {x = 1, y = 0, z = 0},

@ -2,7 +2,6 @@
mesecon.on_placenode = function(pos, node) mesecon.on_placenode = function(pos, node)
mesecon.execute_autoconnect_hooks_now(pos, node) mesecon.execute_autoconnect_hooks_now(pos, node)
node = minetest.get_node(pos) -- Update the node in case it was just changed.
-- 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
@ -12,20 +11,18 @@ mesecon.on_placenode = function(pos, node)
-- Conductors: Send turnon signal when powered or replace by respective offstate conductor -- Conductors: Send turnon signal when powered or replace by respective offstate conductor
-- if placed conductor is an onstate one -- if placed conductor is an onstate one
if mesecon.is_conductor(node.name) then if mesecon.is_conductor(node.name) then
local conductor = mesecon.get_conductor(node.name)
if conductor.state ~= mesecon.state.off then
-- Turn the conductor off.
node.name = conductor.offstate or conductor.states[1]
minetest.swap_node(pos, node)
end
local sources = mesecon.is_powered(pos) local sources = mesecon.is_powered(pos)
if sources then if sources then
mesecon.vm_begin() -- also call receptor_on if itself is powered already, so that neighboring
-- 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 = vector.subtract(s, pos) local rule = vector.subtract(pos, s)
mesecon.turnon(pos, rule) mesecon.turnon(pos, rule)
end end
mesecon.vm_commit() --mesecon.receptor_on (pos, mesecon.conductor_get_rules(node))
elseif mesecon.is_conductor_on(node) then
node.name = mesecon.get_conductor_off(node)
minetest.swap_node(pos, node)
end end
end end
@ -66,7 +63,7 @@ mesecon.on_dignode = function(pos, node)
mesecon.execute_autoconnect_hooks_queue(pos, node) mesecon.execute_autoconnect_hooks_queue(pos, node)
end end
function mesecon.on_blastnode(pos) function mesecon.on_blastnode(pos, intensity)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
minetest.remove_node(pos) minetest.remove_node(pos)
mesecon.on_dignode(pos, node) mesecon.on_dignode(pos, node)

@ -6,24 +6,6 @@ function mesecon.move_node(pos, newpos)
minetest.get_meta(pos):from_table(meta) minetest.get_meta(pos):from_table(meta)
end end
-- An on_rotate callback for mesecons components.
function mesecon.on_rotate(pos, node, _, _, new_param2)
local new_node = {name = node.name, param1 = node.param1, param2 = new_param2}
minetest.swap_node(pos, new_node)
mesecon.on_dignode(pos, node)
mesecon.on_placenode(pos, new_node)
minetest.check_for_falling(pos)
return true
end
-- An on_rotate callback for components which stay horizontal.
function mesecon.on_rotate_horiz(pos, node, user, mode, new_param2)
if not minetest.global_exists("screwdriver") or mode ~= screwdriver.ROTATE_FACE then
return false
end
return mesecon.on_rotate(pos, node, user, mode, new_param2)
end
-- Rules rotation Functions: -- Rules rotation Functions:
function mesecon.rotate_rules_right(rules) function mesecon.rotate_rules_right(rules)
local nr = {} local nr = {}
@ -72,28 +54,7 @@ function mesecon.rotate_rules_up(rules)
end end
return nr return nr
end end
--
-- Returns a rules getter function that returns different rules depending on the node's horizontal rotation.
-- If param2 % 4 == 0, then the rules returned by the getter are a copy of base_rules.
function mesecon.horiz_rules_getter(base_rules)
local rotations = {mesecon.tablecopy(base_rules)}
for i = 2, 4 do
local right_rules = rotations[i - 1]
if not right_rules[1] or right_rules[1].x then
-- flat rules
rotations[i] = mesecon.rotate_rules_left(right_rules)
else
-- not flat
rotations[i] = {}
for j, rules in ipairs(right_rules) do
rotations[i][j] = mesecon.rotate_rules_left(rules)
end
end
end
return function(node)
return rotations[node.param2 % 4 + 1]
end
end
function mesecon.flattenrules(allrules) function mesecon.flattenrules(allrules)
--[[ --[[
@ -203,9 +164,7 @@ end
function mesecon.get_bit(binary,bit) function mesecon.get_bit(binary,bit)
bit = bit or 1 bit = bit or 1
local len = binary:len() local c = binary:len()-(bit-1)
if bit > len then return false end
local c = len-(bit-1)
return binary:sub(c,c) == "1" return binary:sub(c,c) == "1"
end end
@ -254,9 +213,8 @@ function mesecon.cmpAny(t1, t2)
return true return true
end end
-- Deprecated. Use `merge_tables` or `merge_rule_sets` as appropriate. -- does not overwrite values; number keys (ipairs) are appended, not overwritten
function mesecon.mergetable(source, dest) function mesecon.mergetable(source, dest)
minetest.log("warning", debug.traceback("Deprecated call to mesecon.mergetable"))
local rval = mesecon.tablecopy(dest) local rval = mesecon.tablecopy(dest)
for k, v in pairs(source) do for k, v in pairs(source) do
@ -269,32 +227,6 @@ function mesecon.mergetable(source, dest)
return rval return rval
end end
-- Merges several rule sets in one. Order may not be preserved. Nil arguments
-- are ignored.
-- The rule sets must be of the same kind (either all single-level or all two-level).
-- The function may be changed to normalize the resulting set in some way.
function mesecon.merge_rule_sets(...)
local rval = {}
for _, t in pairs({...}) do -- ignores nils automatically
table.insert_all(rval, mesecon.tablecopy(t))
end
return rval
end
-- Merges two tables, with entries from `replacements` taking precedence over
-- those from `base`. Returns the new table.
-- Values are deep-copied from either table, keys are referenced.
-- Numerical indices arent handled specially.
function mesecon.merge_tables(base, replacements)
local ret = mesecon.tablecopy(replacements) -- these are never overriden so have to be copied in any case
for k, v in pairs(base) do
if ret[k] == nil then -- it could be `false`
ret[k] = mesecon.tablecopy(v)
end
end
return ret
end
function mesecon.register_node(name, spec_common, spec_off, spec_on) function mesecon.register_node(name, spec_common, spec_off, spec_on)
spec_common.drop = spec_common.drop or name .. "_off" spec_common.drop = spec_common.drop or name .. "_off"
spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode
@ -302,8 +234,8 @@ function mesecon.register_node(name, spec_common, spec_off, spec_on)
spec_on.__mesecon_state = "on" spec_on.__mesecon_state = "on"
spec_off.__mesecon_state = "off" spec_off.__mesecon_state = "off"
spec_on = mesecon.merge_tables(spec_common, spec_on); spec_on = mesecon.mergetable(spec_common, spec_on);
spec_off = mesecon.merge_tables(spec_common, spec_off); spec_off = mesecon.mergetable(spec_common, spec_off);
minetest.register_node(name .. "_on", spec_on) minetest.register_node(name .. "_on", spec_on)
minetest.register_node(name .. "_off", spec_off) minetest.register_node(name .. "_off", spec_off)
@ -325,7 +257,7 @@ end
-- File writing / reading utilities -- File writing / reading utilities
local wpath = minetest.get_worldpath() local wpath = minetest.get_worldpath()
function mesecon.file2table(filename) function mesecon.file2table(filename)
local f = io.open(wpath.."/"..filename, "r") local f = io.open(wpath..DIR_DELIM..filename, "r")
if f == nil then return {} end if f == nil then return {} end
local t = f:read("*all") local t = f:read("*all")
f:close() f:close()
@ -334,7 +266,7 @@ function mesecon.file2table(filename)
end end
function mesecon.table2file(filename, table) function mesecon.table2file(filename, table)
local f = io.open(wpath.."/"..filename, "w") local f = io.open(wpath..DIR_DELIM..filename, "w")
f:write(minetest.serialize(table)) f:write(minetest.serialize(table))
f:close() f:close()
end end
@ -356,17 +288,15 @@ end
-- --
-- Contents of the table are: -- Contents of the table are:
-- “vm” → the VoxelManipulator -- “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 -- “dirty” → true if data has been modified
-- --
-- Nil if no VM-based transaction is in progress. -- Nil if no VM-based transaction is in progress.
local vm_cache = nil local vm_cache = nil
-- Cache from node position hashes to nodes (represented as tables).
local vm_node_cache = nil
-- Whether the current transaction will need a light update afterward.
local vm_update_light = false
-- Starts a VoxelManipulator-based transaction. -- Starts a VoxelManipulator-based transaction.
-- --
-- During a VM transaction, calls to vm_get_node and vm_swap_node operate on a -- During a VM transaction, calls to vm_get_node and vm_swap_node operate on a
@ -375,8 +305,6 @@ local vm_update_light = false
-- vm_abort. -- vm_abort.
function mesecon.vm_begin() function mesecon.vm_begin()
vm_cache = {} vm_cache = {}
vm_node_cache = {}
vm_update_light = false
end end
-- Finishes a VoxelManipulator-based transaction, freeing the VMs and map data -- Finishes a VoxelManipulator-based transaction, freeing the VMs and map data
@ -385,19 +313,18 @@ function mesecon.vm_commit()
for hash, tbl in pairs(vm_cache) do for hash, tbl in pairs(vm_cache) do
if tbl.dirty then if tbl.dirty then
local vm = tbl.vm local vm = tbl.vm
vm:write_to_map(vm_update_light) vm:set_data(tbl.data)
vm:write_to_map()
vm:update_map() vm:update_map()
end end
end end
vm_cache = nil vm_cache = nil
vm_node_cache = nil
end end
-- Finishes a VoxelManipulator-based transaction, freeing the VMs and throwing -- Finishes a VoxelManipulator-based transaction, freeing the VMs and throwing
-- away any modified areas. -- away any modified areas.
function mesecon.vm_abort() function mesecon.vm_abort()
vm_cache = nil vm_cache = nil
vm_node_cache = nil
end end
-- Gets the cache entry covering a position, populating it if necessary. -- Gets the cache entry covering a position, populating it if necessary.
@ -405,7 +332,10 @@ local function vm_get_or_create_entry(pos)
local hash = hash_blockpos(pos) local hash = hash_blockpos(pos)
local tbl = vm_cache[hash] local tbl = vm_cache[hash]
if not tbl then if not tbl then
tbl = {vm = minetest.get_voxel_manip(pos, pos), dirty = false} 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 vm_cache[hash] = tbl
end end
return tbl return tbl
@ -414,34 +344,25 @@ end
-- Gets the node at a given position during a VoxelManipulator-based -- Gets the node at a given position during a VoxelManipulator-based
-- transaction. -- transaction.
function mesecon.vm_get_node(pos) function mesecon.vm_get_node(pos)
local hash = minetest.hash_node_position(pos) local tbl = vm_get_or_create_entry(pos)
local node = vm_node_cache[hash] local index = tbl.va:indexp(pos)
if not node then local node_value = tbl.data[index]
node = vm_get_or_create_entry(pos).vm:get_node_at(pos) if node_value == core.CONTENT_IGNORE then
vm_node_cache[hash] = node 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
return node.name ~= "ignore" and {name = node.name, param1 = node.param1, param2 = node.param2} or nil
end end
-- Sets a nodes name during a VoxelManipulator-based transaction. -- Sets a nodes name during a VoxelManipulator-based transaction.
-- --
-- Existing param1, param2, and metadata are left alone. -- Existing param1, param2, and metadata are left alone.
-- function mesecon.vm_swap_node(pos, name)
-- The swap will necessitate a light update unless update_light equals false.
function mesecon.vm_swap_node(pos, name, update_light)
-- If one node needs a light update, all VMs should use light updates to
-- prevent newly calculated light from being overwritten by other VMs.
vm_update_light = vm_update_light or update_light ~= false
local tbl = vm_get_or_create_entry(pos) local tbl = vm_get_or_create_entry(pos)
local hash = minetest.hash_node_position(pos) local index = tbl.va:indexp(pos)
local node = vm_node_cache[hash] tbl.data[index] = minetest.get_content_id(name)
if not node then
node = tbl.vm:get_node_at(pos)
vm_node_cache[hash] = node
end
node.name = name
tbl.vm:set_node_at(pos, node)
tbl.dirty = true tbl.dirty = true
end end
@ -477,11 +398,9 @@ end
-- --
-- This function can only be used to change the nodes name, not its parameters -- This function can only be used to change the nodes name, not its parameters
-- or metadata. -- or metadata.
-- function mesecon.swap_node_force(pos, name)
-- The swap will necessitate a light update unless update_light equals false.
function mesecon.swap_node_force(pos, name, update_light)
if vm_cache then if vm_cache then
return mesecon.vm_swap_node(pos, name, update_light) return mesecon.vm_swap_node(pos, name)
else else
-- This serves to both ensure the mapblock is loaded and also hand us -- This serves to both ensure the mapblock is loaded and also hand us
-- the old node table so we can preserve param2. -- the old node table so we can preserve param2.

@ -26,19 +26,13 @@ mesecon.register_node("mesecons_blinkyplant:blinky_plant", {
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
walkable = false, walkable = false,
sounds = mesecon.node_sound.leaves, sounds = default.node_sound_leaves_defaults(),
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},
}, },
on_timer = on_timer, on_timer = on_timer,
on_rightclick = function(pos, _, clicker) on_rightclick = toggle_timer,
if minetest.is_protected(pos, clicker and clicker:get_player_name() or "") then
return
end
toggle_timer(pos)
end,
on_construct = toggle_timer on_construct = toggle_timer
},{ },{
tiles = {"jeija_blinky_plant_off.png"}, tiles = {"jeija_blinky_plant_off.png"},
@ -49,3 +43,10 @@ mesecon.register_node("mesecons_blinkyplant:blinky_plant", {
groups = {dig_immediate=3, not_in_creative_inventory=1}, groups = {dig_immediate=3, not_in_creative_inventory=1},
mesecons = {receptor = { state = mesecon.state.on }} mesecons = {receptor = { state = mesecon.state.on }}
}) })
minetest.register_craft({
output = "mesecons_blinkyplant:blinky_plant_off 1",
recipe = { {"","group:mesecon_conductor_craftable",""},
{"","group:mesecon_conductor_craftable",""},
{"group:sapling","group:sapling","group:sapling"}}
})

@ -1,2 +1,2 @@
name = mesecons_blinkyplant name = mesecons_blinkyplant
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -13,8 +13,6 @@ mesecon.button_turnoff = function (pos)
mesecon.receptor_off(pos, rules) mesecon.receptor_off(pos, rules)
end end
local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil
minetest.register_node("mesecons_button:button_off", { minetest.register_node("mesecons_button:button_off", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
@ -25,7 +23,6 @@ minetest.register_node("mesecons_button:button_off", {
"jeija_wall_button_sides.png", "jeija_wall_button_sides.png",
"jeija_wall_button_off.png" "jeija_wall_button_off.png"
}, },
use_texture_alpha = use_texture_alpha,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
@ -52,7 +49,7 @@ minetest.register_node("mesecons_button:button_off", {
minetest.sound_play("mesecons_button_push", { pos = pos }, true) minetest.sound_play("mesecons_button_push", { pos = pos }, true)
minetest.get_node_timer(pos):start(1) minetest.get_node_timer(pos):start(1)
end, end,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = {receptor = { mesecons = {receptor = {
state = mesecon.state.off, state = mesecon.state.off,
rules = mesecon.rules.buttonlike_get rules = mesecon.rules.buttonlike_get
@ -70,7 +67,6 @@ minetest.register_node("mesecons_button:button_on", {
"jeija_wall_button_sides.png", "jeija_wall_button_sides.png",
"jeija_wall_button_on.png" "jeija_wall_button_on.png"
}, },
use_texture_alpha = use_texture_alpha,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
@ -93,7 +89,7 @@ minetest.register_node("mesecons_button:button_on", {
groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon_needs_receiver = 1}, groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon_needs_receiver = 1},
drop = 'mesecons_button:button_off', drop = 'mesecons_button:button_off',
description = "Button", description = "Button",
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = {receptor = { mesecons = {receptor = {
state = mesecon.state.on, state = mesecon.state.on,
rules = mesecon.rules.buttonlike_get rules = mesecon.rules.buttonlike_get
@ -101,3 +97,10 @@ minetest.register_node("mesecons_button:button_on", {
on_timer = mesecon.button_turnoff, on_timer = mesecon.button_turnoff,
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
output = "mesecons_button:button_off 2",
recipe = {
{"group:mesecon_conductor_craftable","default:stone"},
}
})

@ -1,2 +1,2 @@
name = mesecons_button name = mesecons_button
depends = mesecons, mesecons_gamecompat, mesecons_receiver depends = mesecons, mesecons_receiver

@ -10,7 +10,6 @@ minetest.register_chatcommand("say", {
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",
privs = {shout=true},
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
@ -79,7 +78,7 @@ local function after_place(pos, placer)
end end
end end
local function receive_fields(pos, _, fields, sender) local function receive_fields(pos, formname, fields, sender)
if not fields.submit then if not fields.submit then
return return
end end
@ -189,7 +188,7 @@ minetest.register_node("mesecons_commandblock:commandblock_off", {
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 = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = {effector = { mesecons = {effector = {
action_on = commandblock_action_on action_on = commandblock_action_on
}}, }},
@ -206,7 +205,7 @@ minetest.register_node("mesecons_commandblock:commandblock_on", {
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 = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = {effector = { mesecons = {effector = {
action_off = commandblock_action_off action_off = commandblock_action_off
}}, }},

@ -1,2 +1,2 @@
name = mesecons_commandblock name = mesecons_commandblock
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -1,7 +1,19 @@
-- Function that get the input/output rules of the delayer -- Function that get the input/output rules of the delayer
local delayer_get_output_rules = mesecon.horiz_rules_getter({{x = 1, y = 0, z = 0}}) local delayer_get_output_rules = function(node)
local rules = {{x = 0, y = 0, z = 1}}
for i = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules)
end
return rules
end
local delayer_get_input_rules = mesecon.horiz_rules_getter({{x = -1, y = 0, z = 0}}) local delayer_get_input_rules = function(node)
local rules = {{x = 0, y = 0, z = -1}}
for i = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules)
end
return rules
end
-- Functions that are called after the delay time -- Functions that are called after the delay time
@ -42,7 +54,6 @@ local boxes = {
-- Delayer definition defaults -- Delayer definition defaults
local def = { local def = {
drawtype = "nodebox", drawtype = "nodebox",
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil,
walkable = true, walkable = true,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
@ -57,7 +68,7 @@ local def = {
sunlight_propagates = true, sunlight_propagates = true,
is_ground_content = false, is_ground_content = false,
delayer_time = delaytime[i], delayer_time = delaytime[i],
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
drop = "mesecons_delayer:delayer_off_1", drop = "mesecons_delayer:delayer_off_1",
} }
@ -82,7 +93,7 @@ local off_state = {
wield_image = "mesecons_delayer_off_1.png", wield_image = "mesecons_delayer_off_1.png",
groups = off_groups, groups = off_groups,
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then if minetest.is_protected(pos, puncher and puncher:get_player_name()) then
return return
end end
@ -123,7 +134,7 @@ local on_state = {
}, },
groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1}, groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1},
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then if minetest.is_protected(pos, puncher and puncher:get_player_name()) then
return return
end end
@ -152,3 +163,11 @@ end
minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), on_state) minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), on_state)
end end
minetest.register_craft({
output = "mesecons_delayer:delayer_off_1",
recipe = {
{"mesecons_torch:mesecon_torch_on", "group:mesecon_conductor_craftable", "mesecons_torch:mesecon_torch_on"},
{"default:cobble","default:cobble", "default:cobble"},
}
})

@ -1,2 +1,2 @@
name = mesecons_delayer name = mesecons_delayer
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -1,5 +1,3 @@
local side_texture = "mesecons_detector_side.png"
local GET_COMMAND = "GET" local GET_COMMAND = "GET"
-- Object detector -- Object detector
@ -14,7 +12,7 @@ local function object_detector_make_formspec(pos)
"button_exit[7,0.75;2,3;;Save]") "button_exit[7,0.75;2,3;;Save]")
end end
local function object_detector_on_receive_fields(pos, _, fields, sender) local function object_detector_on_receive_fields(pos, formname, fields, sender)
if not fields.scanname or not fields.digiline_channel then return end if not fields.scanname or not fields.digiline_channel then return end
if minetest.is_protected(pos, sender:get_player_name()) then return end if minetest.is_protected(pos, sender:get_player_name()) then return end
@ -55,7 +53,7 @@ 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, _, 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 if channel == meta:get_string("digiline_channel") then
meta:set_string("scanname", msg) meta:set_string("scanname", msg)
@ -66,7 +64,7 @@ local object_detector_digiline = {
} }
minetest.register_node("mesecons_detector:object_detector_off", { minetest.register_node("mesecons_detector:object_detector_off", {
tiles = {side_texture, side_texture, "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png"}, tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png"},
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
walkable = true, walkable = true,
@ -78,13 +76,13 @@ minetest.register_node("mesecons_detector:object_detector_off", {
}}, }},
on_construct = object_detector_make_formspec, on_construct = object_detector_make_formspec,
on_receive_fields = object_detector_on_receive_fields, on_receive_fields = object_detector_on_receive_fields,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
digiline = object_detector_digiline, digiline = object_detector_digiline,
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_node("mesecons_detector:object_detector_on", { minetest.register_node("mesecons_detector:object_detector_on", {
tiles = {side_texture, side_texture, "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png"}, tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png"},
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
walkable = true, walkable = true,
@ -96,11 +94,29 @@ minetest.register_node("mesecons_detector:object_detector_on", {
}}, }},
on_construct = object_detector_make_formspec, on_construct = object_detector_make_formspec,
on_receive_fields = object_detector_on_receive_fields, on_receive_fields = object_detector_on_receive_fields,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
digiline = object_detector_digiline, digiline = object_detector_digiline,
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
output = 'mesecons_detector:object_detector_off',
recipe = {
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "default:steel_ingot"},
{"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"},
}
})
minetest.register_craft({
output = 'mesecons_detector:object_detector_off',
recipe = {
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "mesecons_microcontroller:microcontroller0000", "default:steel_ingot"},
{"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"},
}
})
minetest.register_abm({ minetest.register_abm({
nodenames = {"mesecons_detector:object_detector_off"}, nodenames = {"mesecons_detector:object_detector_off"},
interval = 1, interval = 1,
@ -140,7 +156,7 @@ local function node_detector_make_formspec(pos)
"button_exit[7,0.75;2,3;;Save]") "button_exit[7,0.75;2,3;;Save]")
end end
local function node_detector_on_receive_fields(pos, _, fields, sender) local function node_detector_on_receive_fields(pos, fieldname, fields, sender)
if not fields.scanname or not fields.digiline_channel then return end if not fields.scanname or not fields.digiline_channel then return end
if minetest.is_protected(pos, sender:get_player_name()) then return end if minetest.is_protected(pos, sender:get_player_name()) then return end
@ -222,8 +238,25 @@ local node_detector_digiline = {
receptor = {} receptor = {}
} }
local function after_place_node_detector(pos, placer)
local placer_pos = placer:get_pos()
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 = {side_texture, side_texture, side_texture, side_texture, side_texture, "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",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
@ -235,13 +268,13 @@ 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,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
digiline = node_detector_digiline, digiline = node_detector_digiline,
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_node("mesecons_detector:node_detector_on", { minetest.register_node("mesecons_detector:node_detector_on", {
tiles = {side_texture, side_texture, side_texture, side_texture, side_texture, "jeija_node_detector_on.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_on.png"},
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
@ -253,10 +286,29 @@ 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,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
digiline = node_detector_digiline, digiline = node_detector_digiline,
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
output = 'mesecons_detector:node_detector_off',
recipe = {
{"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"},
{"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "default:steel_ingot"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
}
})
minetest.register_craft({
output = 'mesecons_detector:node_detector_off',
recipe = {
{"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"},
{"default:steel_ingot", "mesecons_microcontroller:microcontroller0000", "default:steel_ingot"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
}
})
minetest.register_abm({ minetest.register_abm({
nodenames = {"mesecons_detector:node_detector_off"}, nodenames = {"mesecons_detector:node_detector_off"},
interval = 1, interval = 1,

@ -1,2 +1,2 @@
name = mesecons_detector name = mesecons_detector
depends = mesecons, mesecons_gamecompat, mesecons_materials depends = mesecons, mesecons_materials

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 B

136
mesecons_doors/init.lua Normal file

@ -0,0 +1,136 @@
-- Modified, from minetest_game/mods/doors/init.lua
local function on_rightclick(pos, dir, check_name, replace, replace_dir, params)
pos.y = pos.y + dir
if not minetest.get_node(pos).name == check_name then
return
end
local p2 = minetest.get_node(pos).param2
p2 = params[p2 + 1]
minetest.swap_node(pos, {name = replace_dir, param2 = p2})
pos.y = pos.y - dir
minetest.swap_node(pos, {name = replace, param2 = p2})
if (minetest.get_meta(pos):get_int("right") ~= 0) == (params[1] ~= 3) then
minetest.sound_play("doors_door_close", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true)
else
minetest.sound_play("doors_door_open", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true)
end
end
local function meseconify_door(name)
if minetest.registered_items[name .. "_b_1"] then
-- old style double-node doors
local function toggle_state1 (pos, node)
on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
end
local function toggle_state2 (pos, node)
on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
end
minetest.override_item(name.."_b_1", {
mesecons = {effector = {
action_on = toggle_state1,
action_off = toggle_state1,
rules = mesecon.rules.pplate
}}
})
minetest.override_item(name.."_b_2", {
mesecons = {effector = {
action_on = toggle_state2,
action_off = toggle_state2,
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
meseconify_door("doors:door_wood")
meseconify_door("doors:door_steel")
meseconify_door("doors:door_glass")
meseconify_door("doors:door_obsidian_glass")
meseconify_door("xpanes:door_steel_bar")
-- Trapdoor
local function trapdoor_switch(pos, node)
local state = minetest.get_meta(pos):get_int("state")
if state == 1 then
minetest.sound_play("doors_door_close", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true)
minetest.set_node(pos, {name="doors:trapdoor", param2 = node.param2})
else
minetest.sound_play("doors_door_open", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true)
minetest.set_node(pos, {name="doors:trapdoor_open", param2 = node.param2})
end
minetest.get_meta(pos):set_int("state", state == 1 and 0 or 1)
end
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)
if minetest.registered_items["xpanes:trapdoor_steel_bar"] then
minetest.override_item("xpanes:trapdoor_steel_bar", override)
minetest.override_item("xpanes:trapdoor_steel_bar_open", override)
end
else
if minetest.registered_nodes["doors:trapdoor"] then
minetest.override_item("doors:trapdoor", {
mesecons = {effector = {
action_on = trapdoor_switch,
action_off = trapdoor_switch
}},
})
minetest.override_item("doors:trapdoor_open", {
mesecons = {effector = {
action_on = trapdoor_switch,
action_off = trapdoor_switch
}},
})
end
end

3
mesecons_doors/mod.conf Normal file

@ -0,0 +1,3 @@
name = mesecons_doors
depends = mesecons, doors
optional_depends = xpanes

@ -1,12 +1,21 @@
local screwdriver_exists = minetest.global_exists("screwdriver")
local corner_selectionbox = { local corner_selectionbox = {
type = "fixed", type = "fixed",
fixed = { -16/32, -16/32, -16/32, 5/32, -12/32, 5/32 }, fixed = { -16/32, -16/32, -16/32, 5/32, -12/32, 5/32 },
} }
local corner_get_rules = mesecon.horiz_rules_getter({ local corner_get_rules = function (node)
{x = 0, y = 0, z = -1}, local rules =
{x = -1, y = 0, z = 0}, {{x = 1, y = 0, z = 0},
}) {x = 0, y = 0, z = -1}}
for i = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules)
end
return rules
end
minetest.register_node("mesecons_extrawires:corner_on", { minetest.register_node("mesecons_extrawires:corner_on", {
drawtype = "mesh", drawtype = "mesh",
@ -21,9 +30,10 @@ minetest.register_node("mesecons_extrawires:corner_on", {
walkable = false, walkable = false,
sunlight_propagates = true, sunlight_propagates = true,
selection_box = corner_selectionbox, selection_box = corner_selectionbox,
node_box = corner_nodebox,
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_extrawires:corner_off", drop = "mesecons_extrawires:corner_off",
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = {conductor = mesecons = {conductor =
{ {
state = mesecon.state.on, state = mesecon.state.on,
@ -31,7 +41,7 @@ minetest.register_node("mesecons_extrawires:corner_on", {
offstate = "mesecons_extrawires:corner_off" offstate = "mesecons_extrawires:corner_off"
}}, }},
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
on_rotate = mesecon.on_rotate_horiz, on_rotate = screwdriver_exists and screwdriver.rotate_simple,
}) })
minetest.register_node("mesecons_extrawires:corner_off", { minetest.register_node("mesecons_extrawires:corner_off", {
@ -48,8 +58,9 @@ minetest.register_node("mesecons_extrawires:corner_off", {
walkable = false, walkable = false,
sunlight_propagates = true, sunlight_propagates = true,
selection_box = corner_selectionbox, selection_box = corner_selectionbox,
node_box = corner_nodebox,
groups = {dig_immediate = 3}, groups = {dig_immediate = 3},
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = {conductor = mesecons = {conductor =
{ {
state = mesecon.state.off, state = mesecon.state.off,
@ -57,5 +68,13 @@ minetest.register_node("mesecons_extrawires:corner_off", {
onstate = "mesecons_extrawires:corner_on" onstate = "mesecons_extrawires:corner_on"
}}, }},
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
on_rotate = mesecon.on_rotate_horiz, on_rotate = screwdriver_exists and screwdriver.rotate_simple,
})
minetest.register_craft({
output = "mesecons_extrawires:corner_off 3",
recipe = {
{"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"},
{"", "mesecons_insulated:insulated_off"},
}
}) })

@ -1,4 +1,5 @@
local crossover_rules = { local function crossover_get_rules(node)
return {
{--first wire {--first wire
{x=-1,y=0,z=0}, {x=-1,y=0,z=0},
{x=1,y=0,z=0}, {x=1,y=0,z=0},
@ -7,7 +8,8 @@ local crossover_rules = {
{x=0,y=0,z=-1}, {x=0,y=0,z=-1},
{x=0,y=0,z=1}, {x=0,y=0,z=1},
}, },
} }
end
local crossover_states = { local crossover_states = {
"mesecons_extrawires:crossover_off", "mesecons_extrawires:crossover_off",
@ -32,11 +34,11 @@ minetest.register_node("mesecons_extrawires:crossover_off", {
stack_max = 99, stack_max = 99,
selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}}, selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}},
groups = {dig_immediate=3, mesecon=3}, groups = {dig_immediate=3, mesecon=3},
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = { mesecons = {
conductor = { conductor = {
states = crossover_states, states = crossover_states,
rules = crossover_rules, rules = crossover_get_rules(),
} }
}, },
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
@ -59,11 +61,11 @@ minetest.register_node("mesecons_extrawires:crossover_01", {
stack_max = 99, stack_max = 99,
selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}}, selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}},
groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1}, groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1},
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = { mesecons = {
conductor = { conductor = {
states = crossover_states, states = crossover_states,
rules = crossover_rules, rules = crossover_get_rules(),
} }
}, },
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
@ -86,11 +88,11 @@ minetest.register_node("mesecons_extrawires:crossover_10", {
stack_max = 99, stack_max = 99,
selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}}, selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}},
groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1}, groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1},
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = { mesecons = {
conductor = { conductor = {
states = crossover_states, states = crossover_states,
rules = crossover_rules, rules = crossover_get_rules(),
} }
}, },
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
@ -113,12 +115,29 @@ minetest.register_node("mesecons_extrawires:crossover_on", {
stack_max = 99, stack_max = 99,
selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}}, selection_box = {type="fixed", fixed={-16/32, -16/32, -16/32, 16/32, -5/32, 16/32}},
groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1}, groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1},
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = { mesecons = {
conductor = { conductor = {
states = crossover_states, states = crossover_states,
rules = crossover_rules, rules = crossover_get_rules(),
} }
}, },
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
type = "shapeless",
output = "mesecons_extrawires:crossover_off",
recipe = {
"mesecons_insulated:insulated_off",
"mesecons_insulated:insulated_off",
},
})
minetest.register_craft({
type = "shapeless",
output = "mesecons_insulated:insulated_off 2",
recipe = {
"mesecons_extrawires:crossover_off",
},
})

@ -1,9 +1,12 @@
local rotate
if minetest.global_exists("screwdriver") then rotate = screwdriver.rotate_simple end
local doublecorner_selectionbox = { local doublecorner_selectionbox = {
type = "fixed", type = "fixed",
fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
} }
local doublecorner_get_rules = mesecon.horiz_rules_getter({ local rules = {
{ {
{ x = 1, y = 0, z = 0 }, { x = 1, y = 0, z = 0 },
{ x = 0, y = 0, z = 1 }, { x = 0, y = 0, z = 1 },
@ -12,7 +15,19 @@ local doublecorner_get_rules = mesecon.horiz_rules_getter({
{ x = -1, y = 0, z = 0 }, { x = -1, y = 0, z = 0 },
{ x = 0, y = 0, z = -1 }, { x = 0, y = 0, z = -1 },
}, },
}) }
local doublecorner_rules = {}
for k = 1, 4 do
doublecorner_rules[k] = table.copy(rules)
for i, r in ipairs(rules) do
rules[i] = mesecon.rotate_rules_left(r)
end
end
local function doublecorner_get_rules(node)
return doublecorner_rules[node.param2 % 4 + 1]
end
local doublecorner_states = { local doublecorner_states = {
"mesecons_extrawires:doublecorner_00", "mesecons_extrawires:doublecorner_00",
@ -46,7 +61,7 @@ for k, state in ipairs(doublecorner_states) do
selection_box = doublecorner_selectionbox, selection_box = doublecorner_selectionbox,
groups = groups, groups = groups,
drop = doublecorner_states[1], drop = doublecorner_states[1],
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = { mesecons = {
conductor = { conductor = {
states = doublecorner_states, states = doublecorner_states,
@ -54,6 +69,23 @@ for k, state in ipairs(doublecorner_states) do
}, },
}, },
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
on_rotate = mesecon.on_rotate_horiz, on_rotate = rotate,
}) })
end end
minetest.register_craft({
type = "shapeless",
output = "mesecons_extrawires:doublecorner_00",
recipe = {
"mesecons_extrawires:corner_off",
"mesecons_extrawires:corner_off",
},
})
minetest.register_craft({
type = "shapeless",
output = "mesecons_extrawires:corner_off 2",
recipe = {
"mesecons_extrawires:doublecorner_00",
},
})

@ -1,20 +1,3 @@
local mese_nodename = minetest.registered_aliases["mesecons_gamecompat:mese"]
if mese_nodename then
-- Convert placeholders.
minetest.register_alias("mesecons_extrawires:mese", mese_nodename)
else
-- Register placeholder.
mese_nodename = "mesecons_extrawires:mese"
minetest.register_node("mesecons_extrawires:mese", {
description = "Mese Wire",
tiles = {"mesecons_wire_off.png"},
paramtype = "light",
light_source = 3,
groups = {cracky = 1},
sounds = mesecon.node_sound.stone,
})
end
local mesewire_rules = local mesewire_rules =
{ {
{x = 1, y = 0, z = 0}, {x = 1, y = 0, z = 0},
@ -25,7 +8,7 @@ local mesewire_rules =
{x = 0, y = 0, z =-1}, {x = 0, y = 0, z =-1},
} }
minetest.override_item(mese_nodename, { minetest.override_item("default:mese", {
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.off, state = mesecon.state.off,
onstate = "mesecons_extrawires:mese_powered", onstate = "mesecons_extrawires:mese_powered",
@ -35,17 +18,15 @@ minetest.override_item(mese_nodename, {
-- Copy node definition of powered mese from normal mese -- Copy node definition of powered mese from normal mese
-- and brighten texture tiles to indicate mese is powered -- and brighten texture tiles to indicate mese is powered
local unpowered_def = minetest.registered_nodes[mese_nodename] local powered_def = mesecon.mergetable(minetest.registered_nodes["default:mese"], {
local powered_def = mesecon.merge_tables(unpowered_def, { drop = "default:mese",
drop = mese_nodename, light_source = 5,
paramtype = "light",
light_source = math.min(unpowered_def.light_source + 2, minetest.LIGHT_MAX),
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.on, state = mesecon.state.on,
offstate = mese_nodename, offstate = "default:mese",
rules = mesewire_rules rules = mesewire_rules
}}, }},
groups = mesecon.merge_tables(unpowered_def.groups or {}, {not_in_creative_inventory = 1}), groups = {cracky = 1, not_in_creative_inventory = 1},
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })

@ -1,2 +1,3 @@
name = mesecons_extrawires name = mesecons_extrawires
depends = mesecons, mesecons_gamecompat depends = default, mesecons
optional_depends = screwdriver

@ -1,3 +1,5 @@
local screwdriver_exists = minetest.global_exists("screwdriver")
local tjunction_nodebox = { local tjunction_nodebox = {
type = "fixed", type = "fixed",
-- ±0.001 is to prevent z-fighting -- ±0.001 is to prevent z-fighting
@ -10,11 +12,18 @@ local tjunction_selectionbox = {
fixed = { -16/32, -16/32, -16/32, 16/32, -12/32, 7/32 }, fixed = { -16/32, -16/32, -16/32, 16/32, -12/32, 7/32 },
} }
local tjunction_get_rules = mesecon.horiz_rules_getter({ local tjunction_get_rules = function (node)
local rules =
{{x = 0, y = 0, z = 1},
{x = 1, y = 0, z = 0}, {x = 1, y = 0, z = 0},
{x = 0, y = 0, z = -1}, {x = 0, y = 0, z = -1}}
{x = -1, y = 0, z = 0},
}) for i = 0, node.param2 do
rules = mesecon.rotate_rules_left(rules)
end
return rules
end
minetest.register_node("mesecons_extrawires:tjunction_on", { minetest.register_node("mesecons_extrawires:tjunction_on", {
drawtype = "nodebox", drawtype = "nodebox",
@ -35,7 +44,7 @@ minetest.register_node("mesecons_extrawires:tjunction_on", {
node_box = tjunction_nodebox, node_box = tjunction_nodebox,
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_extrawires:tjunction_off", drop = "mesecons_extrawires:tjunction_off",
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = {conductor = mesecons = {conductor =
{ {
state = mesecon.state.on, state = mesecon.state.on,
@ -43,7 +52,7 @@ minetest.register_node("mesecons_extrawires:tjunction_on", {
offstate = "mesecons_extrawires:tjunction_off" offstate = "mesecons_extrawires:tjunction_off"
}}, }},
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
on_rotate = mesecon.on_rotate_horiz, on_rotate = screwdriver_exists and screwdriver.rotate_simple,
}) })
minetest.register_node("mesecons_extrawires:tjunction_off", { minetest.register_node("mesecons_extrawires:tjunction_off", {
@ -65,7 +74,7 @@ minetest.register_node("mesecons_extrawires:tjunction_off", {
selection_box = tjunction_selectionbox, selection_box = tjunction_selectionbox,
node_box = tjunction_nodebox, node_box = tjunction_nodebox,
groups = {dig_immediate = 3}, groups = {dig_immediate = 3},
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = {conductor = mesecons = {conductor =
{ {
state = mesecon.state.off, state = mesecon.state.off,
@ -73,5 +82,13 @@ minetest.register_node("mesecons_extrawires:tjunction_off", {
onstate = "mesecons_extrawires:tjunction_on" onstate = "mesecons_extrawires:tjunction_on"
}}, }},
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
on_rotate = mesecon.on_rotate_horiz, on_rotate = screwdriver_exists and screwdriver.rotate_simple,
})
minetest.register_craft({
output = "mesecons_extrawires:tjunction_off 3",
recipe = {
{"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"},
{"", "mesecons_insulated:insulated_off", ""},
}
}) })

@ -69,7 +69,7 @@ local vertical_updatepos = function (pos)
end end
end end
local vertical_update = function (pos) local vertical_update = function (pos, node)
vertical_updatepos(pos) -- this one vertical_updatepos(pos) -- this one
vertical_updatepos(vector.add(pos, vertical_rules[1])) -- above vertical_updatepos(vector.add(pos, vertical_rules[1])) -- above
vertical_updatepos(vector.add(pos, vertical_rules[2])) -- below vertical_updatepos(vector.add(pos, vertical_rules[2])) -- below
@ -89,7 +89,7 @@ mesecon.register_node("mesecons_extrawires:vertical", {
drop = "mesecons_extrawires:vertical_off", drop = "mesecons_extrawires:vertical_off",
after_place_node = vertical_update, after_place_node = vertical_update,
after_dig_node = vertical_update, after_dig_node = vertical_update,
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
},{ },{
tiles = {"mesecons_wire_off.png"}, tiles = {"mesecons_wire_off.png"},
groups = {dig_immediate=3}, groups = {dig_immediate=3},
@ -123,7 +123,7 @@ mesecon.register_node("mesecons_extrawires:vertical_top", {
drop = "mesecons_extrawires:vertical_off", drop = "mesecons_extrawires:vertical_off",
after_place_node = vertical_update, after_place_node = vertical_update,
after_dig_node = vertical_update, after_dig_node = vertical_update,
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
},{ },{
tiles = {"mesecons_wire_off.png"}, tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = { mesecons = {conductor = {
@ -155,7 +155,7 @@ mesecon.register_node("mesecons_extrawires:vertical_bottom", {
drop = "mesecons_extrawires:vertical_off", drop = "mesecons_extrawires:vertical_off",
after_place_node = vertical_update, after_place_node = vertical_update,
after_dig_node = vertical_update, after_dig_node = vertical_update,
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
},{ },{
tiles = {"mesecons_wire_off.png"}, tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = { mesecons = {conductor = {
@ -171,3 +171,17 @@ mesecon.register_node("mesecons_extrawires:vertical_bottom", {
rules = bottom_rules, rules = bottom_rules,
}} }}
}) })
minetest.register_craft({
output = "mesecons_extrawires:vertical_off 3",
recipe = {
{"mesecons:wire_00000000_off"},
{"mesecons:wire_00000000_off"},
{"mesecons:wire_00000000_off"}
}
})
minetest.register_craft({
output = "mesecons:wire_00000000_off",
recipe = {{"mesecons_extrawires:vertical_off"}}
})

@ -96,7 +96,7 @@ plg.register_nodes({
meta:set_int("valid", 0) meta:set_int("valid", 0)
meta:set_string("infotext", "FPGA") meta:set_string("infotext", "FPGA")
end, end,
on_rightclick = function(pos, _, clicker) on_rightclick = function(pos, node, clicker)
if not minetest.is_player(clicker) then if not minetest.is_player(clicker) then
return return
end end
@ -109,15 +109,14 @@ plg.register_nodes({
local is = lcore.deserialize(meta:get_string("instr")) local is = lcore.deserialize(meta:get_string("instr"))
minetest.show_formspec(name, "mesecons:fpga", plg.to_formspec_string(is, nil)) minetest.show_formspec(name, "mesecons:fpga", plg.to_formspec_string(is, nil))
end, end,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = { mesecons = {
effector = { effector = {
rules = {}, -- replaced later rules = {}, -- replaced later
action_change = function(pos, _, rule, newstate) action_change = function(pos, node, rule, newstate)
if plg.ports_changed(pos, rule, newstate) then plg.ports_changed(pos, rule, newstate)
plg.update(pos) plg.update(pos)
end end
end
} }
}, },
after_dig_node = function(pos, node) after_dig_node = function(pos, node)
@ -130,7 +129,7 @@ plg.register_nodes({
end end
end, end,
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
on_rotate = function(pos, _, user, mode) on_rotate = function(pos, node, user, mode)
local abcd1 = {"A", "B", "C", "D"} local abcd1 = {"A", "B", "C", "D"}
local abcd2 = {A = 1, B = 2, C = 3, D = 4} local abcd2 = {A = 1, B = 2, C = 3, D = 4}
local ops = {"op1", "op2", "dst"} local ops = {"op1", "op2", "dst"}
@ -327,10 +326,8 @@ plg.update = function(pos)
plg.setports(pos, A, B, C, D) plg.setports(pos, A, B, C, D)
end end
-- Updates the port states according to the signal change.
-- Returns whether the port states actually changed.
plg.ports_changed = function(pos, rule, newstate) plg.ports_changed = function(pos, rule, newstate)
if rule == nil then return false end if rule == nil then return end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local states local states
@ -350,14 +347,10 @@ plg.ports_changed = function(pos, rule, newstate)
local portno = ({4, 1, nil, 3, 2})[3 + rule.x + 2*rule.z] local portno = ({4, 1, nil, 3, 2})[3 + rule.x + 2*rule.z]
states[portno] = (newstate == "on") states[portno] = (newstate == "on")
local new_portstates = meta:set_string("portstates",
(states[1] and "1" or "0") .. (states[2] and "1" or "0") .. (states[1] and "1" or "0") .. (states[2] and "1" or "0") ..
(states[3] and "1" or "0") .. (states[4] and "1" or "0") (states[3] and "1" or "0") .. (states[4] and "1" or "0")
if new_portstates ~= s then )
meta:set_string("portstates", new_portstates)
return true
end
return false
end end
plg.getports = function(pos) -- gets merged states of INPUT & OUTPUT plg.getports = function(pos) -- gets merged states of INPUT & OUTPUT
@ -451,3 +444,12 @@ end)
minetest.register_on_leaveplayer(function(player) minetest.register_on_leaveplayer(function(player)
plg.open_formspecs[player:get_player_name()] = nil plg.open_formspecs[player:get_player_name()] = nil
end) end)
minetest.register_craft({
output = "mesecons_fpga:fpga0000 2",
recipe = {
{'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable'},
{'mesecons_materials:silicon', 'mesecons_materials:silicon'},
{'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable'},
}
})

@ -10,10 +10,10 @@ local operations = {
-- unary: Whether this gate only has one input -- unary: Whether this gate only has one input
{ gate = "and", short = "&", fs_name = " AND", func = function(a, b) return a and b end }, { gate = "and", short = "&", fs_name = " AND", func = function(a, b) return a and b end },
{ gate = "or", short = "|", fs_name = " OR", func = function(a, b) return a or b end }, { gate = "or", short = "|", fs_name = " OR", func = function(a, b) return a or b end },
{ gate = "not", short = "~", fs_name = " NOT", func = function(_, b) return not b end, unary = true }, { gate = "not", short = "~", fs_name = " NOT", func = function(a, b) return not b end, unary = true },
{ gate = "xor", short = "^", fs_name = " XOR", func = function(a, b) return a ~= b end }, { gate = "xor", short = "^", fs_name = " XOR", func = function(a, b) return a ~= b end },
{ gate = "nand", short = "?", fs_name = "NAND", func = function(a, b) return not (a and b) end }, { gate = "nand", short = "?", fs_name = "NAND", func = function(a, b) return not (a and b) end },
{ gate = "buf", short = "_", fs_name = " =", func = function(_, b) return b end, unary = true }, { gate = "buf", short = "_", fs_name = " =", func = function(a, b) return b end, unary = true },
{ gate = "xnor", short = "=", fs_name = "XNOR", func = function(a, b) return a == b end }, { gate = "xnor", short = "=", fs_name = "XNOR", func = function(a, b) return a == b end },
{ gate = "nor", short = "!", fs_name = " NOR", func = function(a, b) return not (a or b) end }, { gate = "nor", short = "!", fs_name = " NOR", func = function(a, b) return not (a or b) end },
} }

@ -1,2 +1,3 @@
name = mesecons_fpga name = mesecons_fpga
depends = mesecons, mesecons_gamecompat depends = mesecons
optional_depends = screwdriver

@ -59,4 +59,13 @@ minetest.register_tool("mesecons_fpga:programmer", {
end end
}) })
minetest.register_craft({
output = "mesecons_fpga:programmer",
recipe = {
{'group:mesecon_conductor_craftable'},
{'mesecons_materials:silicon'},
}
})
end end

@ -1,67 +0,0 @@
--Aliases
minetest.register_alias("mesecons_gamecompat:chest", "default:chest")
minetest.register_alias("mesecons_gamecompat:chest_locked", "default:chest_locked")
minetest.register_alias("mesecons_gamecompat:coalblock", "default:coalblock")
minetest.register_alias("mesecons_gamecompat:cobble", "default:cobble")
minetest.register_alias("mesecons_gamecompat:glass", "default:glass")
minetest.register_alias("mesecons_gamecompat:lava_source", "default:lava_source")
minetest.register_alias("mesecons_gamecompat:mese", "default:mese")
minetest.register_alias("mesecons_gamecompat:mese_crystal", "default:mese_crystal")
minetest.register_alias("mesecons_gamecompat:mese_crystal_fragment", "default:mese_crystal_fragment")
minetest.register_alias("mesecons_gamecompat:obsidian_glass", "default:obsidian_glass")
minetest.register_alias("mesecons_gamecompat:stone", "default:stone")
minetest.register_alias("mesecons_gamecompat:steel_ingot", "default:steel_ingot")
minetest.register_alias("mesecons_gamecompat:steelblock", "default:steelblock")
minetest.register_alias("mesecons_gamecompat:torch", "default:torch")
if minetest.get_modpath("dye") then
for _, color in ipairs(mesecon.dye_colors) do
minetest.register_alias("mesecons_gamecompat:dye_" .. color, "dye:" .. color)
end
end
-- Sounds
mesecon.node_sound.default = default.node_sound_defaults()
mesecon.node_sound.glass = default.node_sound_glass_defaults()
mesecon.node_sound.leaves = default.node_sound_leaves_defaults()
mesecon.node_sound.stone = default.node_sound_stone_defaults()
mesecon.node_sound.wood = default.node_sound_wood_defaults()
if minetest.get_modpath("fire") then
mesecon.sound_name.fire = "fire_fire"
end
if minetest.get_modpath("tnt") then
mesecon.sound_name.explode = "tnt_explode"
end
-- MVPS stoppers
if minetest.get_modpath("mesecons_mvps") then
-- All of the locked and internal nodes in Minetest Game
for _, name in ipairs({
"default:chest_locked",
"default:chest_locked_open",
"doors:door_steel_b_1", -- old style doors
"doors:door_steel_b_2", --
"doors:door_steel_t_1", --
"doors:door_steel_t_2", --
"doors:door_steel_a", -- new style doors
"doors:door_steel_b", --
"doors:door_steel_c", --
"doors:door_steel_d", --
"doors:hidden",
"doors:trapdoor_steel",
"doors:trapdoor_steel_open",
"xpanes:door_steel_bar_a",
"xpanes:door_steel_bar_b",
"xpanes:door_steel_bar_c",
"xpanes:door_steel_bar_d",
"xpanes:trapdoor_steel_bar",
"xpanes:trapdoor_steel_bar_open",
}) do
mesecon.register_mvps_stopper(name)
end
end

@ -1,15 +0,0 @@
mesecon.node_sound = {}
mesecon.sound_name = {}
mesecon.texture = {}
mesecon.dye_colors = {
"red", "green", "blue", "grey", "dark_grey", "yellow",
"orange", "white", "pink", "magenta", "cyan", "violet",
}
if minetest.get_modpath("default") then
minetest.log("info", "Mesecons: detected Minetest Game for game compatibility")
dofile(minetest.get_modpath("mesecons_gamecompat").."/compat_mtg.lua")
end

@ -1,2 +0,0 @@
name = mesecons_gamecompat
depends = mesecons,mesecons_mvps

@ -11,14 +11,25 @@ local nodebox = {
}, },
} }
local gate_get_output_rules = mesecon.horiz_rules_getter({{x = 1, y = 0, z = 0}}) local function gate_rotate_rules(node, rules)
for rotations = 0, node.param2 - 1 do
rules = mesecon.rotate_rules_left(rules)
end
return rules
end
local gate_get_input_rules_oneinput = mesecon.horiz_rules_getter({{x =-1, y = 0, z = 0}}) local function gate_get_output_rules(node)
return gate_rotate_rules(node, {{x=1, y=0, z=0}})
end
local gate_get_input_rules_twoinputs = mesecon.horiz_rules_getter({ local function gate_get_input_rules_oneinput(node)
{x = 0, y = 0, z = 1, name = "input1"}, return gate_rotate_rules(node, {{x=-1, y=0, z=0}})
{x = 0, y = 0, z = -1, name = "input2"}, end
})
local function gate_get_input_rules_twoinputs(node)
return gate_rotate_rules(node, {{x=0, y=0, z=1, name="input1"},
{x=0, y=0, z=-1, name="input2"}})
end
local function set_gate(pos, node, state) local function set_gate(pos, node, state)
local gate = minetest.registered_nodes[node.name] local gate = minetest.registered_nodes[node.name]
@ -54,6 +65,7 @@ end
local function register_gate(name, inputnumber, assess, recipe, description) local function register_gate(name, inputnumber, assess, recipe, description)
local get_inputrules = inputnumber == 2 and gate_get_input_rules_twoinputs or local get_inputrules = inputnumber == 2 and gate_get_input_rules_twoinputs or
gate_get_input_rules_oneinput gate_get_input_rules_oneinput
description = "Logic Gate: "..name
local basename = "mesecons_gates:"..name local basename = "mesecons_gates:"..name
mesecon.register_node(basename, { mesecon.register_node(basename, {
@ -67,13 +79,12 @@ local function register_gate(name, inputnumber, assess, recipe, description)
selection_box = selection_box, selection_box = selection_box,
node_box = nodebox, node_box = nodebox,
walkable = true, walkable = true,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
assess = assess, assess = assess,
onstate = basename.."_on", onstate = basename.."_on",
offstate = basename.."_off", offstate = basename.."_off",
inputnumber = inputnumber, inputnumber = inputnumber,
after_dig_node = mesecon.do_cooldown, after_dig_node = mesecon.do_cooldown,
on_rotate = mesecon.on_rotate_horiz,
},{ },{
tiles = { tiles = {
"jeija_microcontroller_bottom.png^".."jeija_gate_off.png^".. "jeija_microcontroller_bottom.png^".."jeija_gate_off.png^"..
@ -113,6 +124,8 @@ local function register_gate(name, inputnumber, assess, recipe, description)
action_change = update_gate action_change = update_gate
}} }}
}) })
minetest.register_craft({output = basename.."_off", recipe = recipe})
end end
register_gate("diode", 1, function (input) return input end, register_gate("diode", 1, function (input) return input end,

@ -1,2 +1,2 @@
name = mesecons_gates name = mesecons_gates
depends = mesecons, mesecons_gamecompat, mesecons_microcontroller, mesecons_delayer, mesecons_torch, mesecons_materials depends = mesecons, mesecons_microcontroller, mesecons_delayer, mesecons_torch, mesecons_materials

@ -12,7 +12,6 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
"jeija_hydro_turbine_turbine_top_bottom_off.png", "jeija_hydro_turbine_turbine_top_bottom_off.png",
"jeija_hydro_turbine_turbine_misc_off.png" "jeija_hydro_turbine_turbine_misc_off.png"
}, },
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil,
inventory_image = "jeija_hydro_turbine_inv.png", inventory_image = "jeija_hydro_turbine_inv.png",
is_ground_content = false, is_ground_content = false,
wield_scale = {x=0.75, y=0.75, z=0.75}, wield_scale = {x=0.75, y=0.75, z=0.75},
@ -23,7 +22,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
type = "fixed", type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 }, fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 },
}, },
sounds = mesecon.node_sound.metal, sounds = default.node_sound_metal_defaults(),
mesecons = {receptor = { mesecons = {receptor = {
state = mesecon.state.off state = mesecon.state.off
}}, }},
@ -43,7 +42,6 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
{ name = "jeija_hydro_turbine_turbine_misc_on.png", { name = "jeija_hydro_turbine_turbine_misc_on.png",
animation = {type = "vertical_frames", aspect_w = 256, aspect_h = 32, length = 0.4} } animation = {type = "vertical_frames", aspect_w = 256, aspect_h = 32, length = 0.4} }
}, },
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or nil,
inventory_image = "jeija_hydro_turbine_inv.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},
@ -53,7 +51,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
type = "fixed", type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 }, fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 },
}, },
sounds = mesecon.node_sound.metal, sounds = default.node_sound_metal_defaults(),
mesecons = {receptor = { mesecons = {receptor = {
state = mesecon.state.on state = mesecon.state.on
}}, }},
@ -64,15 +62,15 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
local function is_flowing_water(pos) local function is_flowing_water(pos)
local name = minetest.get_node(pos).name local name = minetest.get_node(pos).name
local is_water = minetest.get_item_group(name, "water") > 0 local is_water = minetest.get_item_group(name, "water") > 0
local def = minetest.registered_items[name] local is_flowing = minetest.registered_items[name].liquidtype == "flowing"
return is_water and (def and def.liquidtype == "flowing") return (is_water and is_flowing)
end end
minetest.register_abm({ minetest.register_abm({
nodenames = {"mesecons_hydroturbine:hydro_turbine_off"}, nodenames = {"mesecons_hydroturbine:hydro_turbine_off"},
interval = 1, interval = 1,
chance = 1, chance = 1,
action = function(pos) 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 is_flowing_water(waterpos) then if is_flowing_water(waterpos) then
minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_on"}) minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_on"})
@ -85,7 +83,7 @@ minetest.register_abm({
nodenames = {"mesecons_hydroturbine:hydro_turbine_on"}, nodenames = {"mesecons_hydroturbine:hydro_turbine_on"},
interval = 1, interval = 1,
chance = 1, chance = 1,
action = function(pos) 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 not is_flowing_water(waterpos) then if not is_flowing_water(waterpos) then
minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_off"}) minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_off"})
@ -94,3 +92,12 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_on"},
end, end,
}) })
minetest.register_craft({
output = "mesecons_hydroturbine:hydro_turbine_off 2",
recipe = {
{"","default:stick", ""},
{"default:stick", "default:steel_ingot", "default:stick"},
{"","default:stick", ""},
}
})

@ -1,2 +1,2 @@
name = mesecons_hydroturbine name = mesecons_hydroturbine
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -1,7 +1,13 @@
local insulated_wire_get_rules = mesecon.horiz_rules_getter({ local screwdriver_exists = minetest.global_exists("screwdriver")
{x = 1, y = 0, z = 0},
{x = -1, y = 0, z = 0}, local function insulated_wire_get_rules(node)
}) local rules = {{x = 1, y = 0, z = 0},
{x =-1, y = 0, z = 0}}
if node.param2 == 1 or node.param2 == 3 then
return mesecon.rotate_rules_right(rules)
end
return rules
end
minetest.register_node("mesecons_insulated:insulated_on", { minetest.register_node("mesecons_insulated:insulated_on", {
drawtype = "nodebox", drawtype = "nodebox",
@ -30,14 +36,14 @@ minetest.register_node("mesecons_insulated:insulated_on", {
}, },
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_insulated:insulated_off", drop = "mesecons_insulated:insulated_off",
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.on, state = mesecon.state.on,
offstate = "mesecons_insulated:insulated_off", offstate = "mesecons_insulated:insulated_off",
rules = insulated_wire_get_rules rules = insulated_wire_get_rules
}}, }},
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
on_rotate = mesecon.on_rotate_horiz, on_rotate = screwdriver_exists and screwdriver.rotate_simple,
}) })
minetest.register_node("mesecons_insulated:insulated_off", { minetest.register_node("mesecons_insulated:insulated_off", {
@ -66,13 +72,21 @@ minetest.register_node("mesecons_insulated:insulated_off", {
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 = 3},
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.off, state = mesecon.state.off,
onstate = "mesecons_insulated:insulated_on", onstate = "mesecons_insulated:insulated_on",
rules = insulated_wire_get_rules rules = insulated_wire_get_rules
}}, }},
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
on_rotate = mesecon.on_rotate_horiz, on_rotate = screwdriver_exists and screwdriver.rotate_simple,
}) })
minetest.register_craft({
output = "mesecons_insulated:insulated_off 3",
recipe = {
{"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"},
{"mesecons:wire_00000000_off", "mesecons:wire_00000000_off", "mesecons:wire_00000000_off"},
{"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"},
}
})

@ -1,2 +1,3 @@
name = mesecons_insulated name = mesecons_insulated
depends = mesecons, mesecons_gamecompat depends = mesecons
optional_depends = screwdriver

@ -9,12 +9,9 @@ local mesecon_lamp_box = {
wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125}, wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125},
} }
local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or nil
minetest.register_node("mesecons_lamp:lamp_on", { minetest.register_node("mesecons_lamp:lamp_on", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = {"jeija_meselamp_on.png"}, tiles = {"jeija_meselamp_on.png"},
use_texture_alpha = use_texture_alpha,
paramtype = "light", paramtype = "light",
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
is_ground_content = false, is_ground_content = false,
@ -26,7 +23,7 @@ minetest.register_node("mesecons_lamp:lamp_on", {
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},
drop = "mesecons_lamp:lamp_off 1", drop = "mesecons_lamp:lamp_off 1",
sounds = mesecon.node_sound.glass, sounds = default.node_sound_glass_defaults(),
mesecons = {effector = { mesecons = {effector = {
action_off = function (pos, node) action_off = function (pos, node)
minetest.swap_node(pos, {name = "mesecons_lamp:lamp_off", param2 = node.param2}) minetest.swap_node(pos, {name = "mesecons_lamp:lamp_off", param2 = node.param2})
@ -39,7 +36,6 @@ minetest.register_node("mesecons_lamp:lamp_on", {
minetest.register_node("mesecons_lamp:lamp_off", { minetest.register_node("mesecons_lamp:lamp_off", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = {"jeija_meselamp_off.png"}, tiles = {"jeija_meselamp_off.png"},
use_texture_alpha = use_texture_alpha,
inventory_image = "jeija_meselamp.png", inventory_image = "jeija_meselamp.png",
wield_image = "jeija_meselamp.png", wield_image = "jeija_meselamp.png",
paramtype = "light", paramtype = "light",
@ -51,7 +47,7 @@ minetest.register_node("mesecons_lamp:lamp_off", {
selection_box = mesecon_lamp_box, selection_box = mesecon_lamp_box,
groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1}, groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1},
description = "Mesecon Lamp", description = "Mesecon Lamp",
sounds = mesecon.node_sound.glass, sounds = default.node_sound_glass_defaults(),
mesecons = {effector = { mesecons = {effector = {
action_on = function (pos, node) action_on = function (pos, node)
minetest.swap_node(pos, {name = "mesecons_lamp:lamp_on", param2 = node.param2}) minetest.swap_node(pos, {name = "mesecons_lamp:lamp_on", param2 = node.param2})
@ -60,3 +56,12 @@ minetest.register_node("mesecons_lamp:lamp_off", {
}}, }},
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
output = "mesecons_lamp:lamp_off 1",
recipe = {
{"", "default:glass", ""},
{"group:mesecon_conductor_craftable", "default:steel_ingot", "group:mesecon_conductor_craftable"},
{"", "default:glass", ""},
}
})

@ -1,2 +1,2 @@
name = mesecons_lamp name = mesecons_lamp
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -23,7 +23,7 @@ function mesecon.lightstone_add(name, base_item, texture_off, texture_on, desc)
is_ground_content = false, is_ground_content = false,
groups = {cracky = 2, mesecon_effector_off = 1, mesecon = 2}, groups = {cracky = 2, mesecon_effector_off = 1, mesecon = 2},
description = desc, description = desc,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = {effector = { mesecons = {effector = {
rules = lightstone_rules, rules = lightstone_rules,
action_on = function (pos, node) action_on = function (pos, node)
@ -38,7 +38,7 @@ function mesecon.lightstone_add(name, base_item, texture_off, texture_on, desc)
groups = {cracky = 2, not_in_creative_inventory = 1, mesecon = 2}, groups = {cracky = 2, not_in_creative_inventory = 1, mesecon = 2},
drop = "mesecons_lightstone:lightstone_" .. name .. "_off", drop = "mesecons_lightstone:lightstone_" .. name .. "_off",
light_source = minetest.LIGHT_MAX - 2, light_source = minetest.LIGHT_MAX - 2,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = {effector = { mesecons = {effector = {
rules = lightstone_rules, rules = lightstone_rules,
action_off = function (pos, node) action_off = function (pos, node)
@ -48,18 +48,26 @@ function mesecon.lightstone_add(name, base_item, texture_off, texture_on, desc)
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
output = "mesecons_lightstone:lightstone_" .. name .. "_off",
recipe = {
{"",base_item,""},
{base_item,"default:torch",base_item},
{"","group:mesecon_conductor_craftable",""}
}
})
end end
mesecon.lightstone_add("red", "mesecons_gamecompat:dye_red", "jeija_lightstone_red_off.png", "jeija_lightstone_red_on.png", "Red Lightstone") mesecon.lightstone_add("red", "dye:red", "jeija_lightstone_red_off.png", "jeija_lightstone_red_on.png", "Red Lightstone")
mesecon.lightstone_add("green", "mesecons_gamecompat:dye_green", "jeija_lightstone_green_off.png", "jeija_lightstone_green_on.png", "Green Lightstone") mesecon.lightstone_add("green", "dye:green", "jeija_lightstone_green_off.png", "jeija_lightstone_green_on.png", "Green Lightstone")
mesecon.lightstone_add("blue", "mesecons_gamecompat:dye_blue", "jeija_lightstone_blue_off.png", "jeija_lightstone_blue_on.png", "Blue Lightstone") mesecon.lightstone_add("blue", "dye:blue", "jeija_lightstone_blue_off.png", "jeija_lightstone_blue_on.png", "Blue Lightstone")
mesecon.lightstone_add("gray", "mesecons_gamecompat:dye_grey", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png", "Grey Lightstone") mesecon.lightstone_add("gray", "dye:grey", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png", "Grey Lightstone")
mesecon.lightstone_add("darkgray", "mesecons_gamecompat:dye_dark_grey", "jeija_lightstone_darkgray_off.png", "jeija_lightstone_darkgray_on.png", "Dark Grey Lightstone") mesecon.lightstone_add("darkgray", "dye:dark_grey", "jeija_lightstone_darkgray_off.png", "jeija_lightstone_darkgray_on.png", "Dark Grey Lightstone")
mesecon.lightstone_add("yellow", "mesecons_gamecompat:dye_yellow", "jeija_lightstone_yellow_off.png", "jeija_lightstone_yellow_on.png", "Yellow Lightstone") mesecon.lightstone_add("yellow", "dye:yellow", "jeija_lightstone_yellow_off.png", "jeija_lightstone_yellow_on.png", "Yellow Lightstone")
mesecon.lightstone_add("orange", "mesecons_gamecompat:dye_orange", "jeija_lightstone_orange_off.png", "jeija_lightstone_orange_on.png", "Orange Lightstone") mesecon.lightstone_add("orange", "dye:orange", "jeija_lightstone_orange_off.png", "jeija_lightstone_orange_on.png", "Orange Lightstone")
mesecon.lightstone_add("white", "mesecons_gamecompat:dye_white", "jeija_lightstone_white_off.png", "jeija_lightstone_white_on.png", "White Lightstone") mesecon.lightstone_add("white", "dye:white", "jeija_lightstone_white_off.png", "jeija_lightstone_white_on.png", "White Lightstone")
mesecon.lightstone_add("pink", "mesecons_gamecompat:dye_pink", "jeija_lightstone_pink_off.png", "jeija_lightstone_pink_on.png", "Pink Lightstone") mesecon.lightstone_add("pink", "dye:pink", "jeija_lightstone_pink_off.png", "jeija_lightstone_pink_on.png", "Pink Lightstone")
mesecon.lightstone_add("magenta", "mesecons_gamecompat:dye_magenta", "jeija_lightstone_magenta_off.png", "jeija_lightstone_magenta_on.png", "Magenta Lightstone") mesecon.lightstone_add("magenta", "dye:magenta", "jeija_lightstone_magenta_off.png", "jeija_lightstone_magenta_on.png", "Magenta Lightstone")
mesecon.lightstone_add("cyan", "mesecons_gamecompat:dye_cyan", "jeija_lightstone_cyan_off.png", "jeija_lightstone_cyan_on.png", "Cyan Lightstone") mesecon.lightstone_add("cyan", "dye:cyan", "jeija_lightstone_cyan_off.png", "jeija_lightstone_cyan_on.png", "Cyan Lightstone")
mesecon.lightstone_add("violet", "mesecons_gamecompat:dye_violet", "jeija_lightstone_violet_off.png", "jeija_lightstone_violet_on.png", "Violet Lightstone") mesecon.lightstone_add("violet", "dye:violet", "jeija_lightstone_violet_off.png", "jeija_lightstone_violet_on.png", "Violet Lightstone")

@ -1,2 +1,2 @@
name = mesecons_lightstone name = mesecons_lightstone
depends = mesecons, mesecons_gamecompat depends = mesecons, dye

@ -43,16 +43,13 @@ local rules = {
------------------ ------------------
-- These helpers are required to set the port states of the luacontroller -- These helpers are required to set the port states of the luacontroller
-- Updates the real port states according to the signal change.
-- Returns whether the real port states actually changed.
local function update_real_port_states(pos, rule_name, new_state) local function update_real_port_states(pos, rule_name, new_state)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if rule_name == nil then if rule_name == nil then
meta:set_int("real_portstates", 1) meta:set_int("real_portstates", 1)
return true return
end end
local real_portstates = meta:get_int("real_portstates") local n = meta:get_int("real_portstates") - 1
local n = real_portstates - 1
local L = {} local L = {}
for i = 1, 4 do for i = 1, 4 do
L[i] = n % 2 L[i] = n % 2
@ -63,18 +60,18 @@ local function update_real_port_states(pos, rule_name, new_state)
if rule_name.x == nil then if rule_name.x == nil then
for _, rname in ipairs(rule_name) do for _, rname in ipairs(rule_name) do
local port = pos_to_side[rname.x + (2 * rname.z) + 3] local port = pos_to_side[rname.x + (2 * rname.z) + 3]
L[port] = (new_state == "on") and 1 or 0 L[port] = (newstate == "on") and 1 or 0
end end
else else
local port = pos_to_side[rule_name.x + (2 * rule_name.z) + 3] local port = pos_to_side[rule_name.x + (2 * rule_name.z) + 3]
L[port] = (new_state == "on") and 1 or 0 L[port] = (new_state == "on") and 1 or 0
end end
local new_portstates = 1 + 1 * L[1] + 2 * L[2] + 4 * L[3] + 8 * L[4] meta:set_int("real_portstates",
if new_portstates ~= real_portstates then 1 +
meta:set_int("real_portstates", new_portstates) 1 * L[1] +
return true 2 * L[2] +
end 4 * L[3] +
return false 8 * L[4])
end end
@ -175,7 +172,7 @@ local function burn_controller(pos)
minetest.after(0.2, mesecon.receptor_off, pos, mesecon.rules.flat) minetest.after(0.2, mesecon.receptor_off, pos, mesecon.rules.flat)
end end
local function overheat(pos) local function overheat(pos, meta)
if mesecon.do_overheat(pos) then -- If too hot if mesecon.do_overheat(pos) then -- If too hot
burn_controller(pos) burn_controller(pos)
return true return true
@ -470,12 +467,7 @@ local safe_globals = {
local function create_environment(pos, mem, event, itbl, send_warning) local function create_environment(pos, mem, event, itbl, send_warning)
-- Gather variables for the environment -- Gather variables for the environment
local node_def = minetest.registered_nodes[minetest.get_node(pos).name] local vports = minetest.registered_nodes[minetest.get_node(pos).name].virtual_portstates
if not node_def then return end
local vports = node_def.virtual_portstates
if not vports then return end
local vports_copy = {} local vports_copy = {}
for k, v in pairs(vports) do vports_copy[k] = v end for k, v in pairs(vports) do vports_copy[k] = v end
local rports = get_real_port_states(pos) local rports = get_real_port_states(pos)
@ -620,8 +612,9 @@ local function run_inner(pos, code, event)
if overheat(pos) then return true, "" end if overheat(pos) then return true, "" end
if ignore_event(event, meta) then return true, "" end if ignore_event(event, meta) then return true, "" end
-- Load mem from meta -- Load code & mem from meta
local mem = load_memory(meta) local mem = load_memory(meta)
local code = meta:get_string("code")
-- 'Last warning' label. -- 'Last warning' label.
local warning = "" local warning = ""
@ -632,19 +625,16 @@ local function run_inner(pos, code, event)
-- Create environment -- Create environment
local itbl = {} local itbl = {}
local env = create_environment(pos, mem, event, itbl, send_warning) local env = create_environment(pos, mem, event, itbl, send_warning)
if not env then return false, "Env does not exist. Controller has been moved?" end
local success, msg
-- Create the sandbox and execute code -- Create the sandbox and execute code
local f local f, msg = create_sandbox(code, env)
f, msg = create_sandbox(code, env)
if not f then return false, msg end if not f then return false, msg end
-- Start string true sandboxing -- Start string true sandboxing
local onetruestring = getmetatable("") local onetruestring = getmetatable("")
-- If a string sandbox is already up yet inconsistent, something is very wrong -- If a string sandbox is already up yet inconsistent, something is very wrong
assert(onetruestring.__index == string) assert(onetruestring.__index == string)
onetruestring.__index = env.string onetruestring.__index = env.string
success, msg = pcall(f) local success, msg = pcall(f)
onetruestring.__index = string onetruestring.__index = string
-- End string true sandboxing -- End string true sandboxing
if not success then return false, msg end if not success then return false, msg end
@ -758,7 +748,7 @@ local selection_box = {
local digiline = { local digiline = {
receptor = {}, receptor = {},
effector = { effector = {
action = function(pos, _, channel, msg) action = function(pos, node, channel, msg)
msg = clean_and_weigh_digiline_message(msg) msg = clean_and_weigh_digiline_message(msg)
run(pos, {type = "digiline", channel = channel, msg = msg}) run(pos, {type = "digiline", channel = channel, msg = msg})
end end
@ -776,7 +766,7 @@ local function set_program(pos, code)
return run(pos, {type="program"}) return run(pos, {type="program"})
end end
local function on_receive_fields(pos, _, fields, sender) local function on_receive_fields(pos, form_name, fields, sender)
if not fields.program then if not fields.program then
return return
end end
@ -835,9 +825,8 @@ for d = 0, 1 do
effector = { effector = {
rules = input_rules[cid], rules = input_rules[cid],
action_change = function (pos, _, rule_name, new_state) action_change = function (pos, _, rule_name, new_state)
if update_real_port_states(pos, rule_name, new_state) then update_real_port_states(pos, rule_name, new_state)
run(pos, {type=new_state, pin=rule_name}) run(pos, {type=new_state, pin=rule_name})
end
end, end,
}, },
receptor = { receptor = {
@ -871,7 +860,7 @@ for d = 0, 1 do
node_box = node_box, node_box = node_box,
on_construct = reset_meta, on_construct = reset_meta,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = mesecons, mesecons = mesecons,
digiline = digiline, digiline = digiline,
-- Virtual portstates are the ports that -- Virtual portstates are the ports that
@ -882,7 +871,7 @@ for d = 0, 1 do
c = c == 1, c = c == 1,
d = d == 1, d = d == 1,
}, },
after_dig_node = function (pos) after_dig_node = function (pos, node)
mesecon.do_cooldown(pos) mesecon.do_cooldown(pos)
mesecon.receptor_off(pos, output_rules) mesecon.receptor_off(pos, output_rules)
end, end,
@ -920,7 +909,7 @@ minetest.register_node(BASENAME .. "_burnt", {
node_box = node_box, node_box = node_box,
on_construct = reset_meta, on_construct = reset_meta,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
virtual_portstates = {a = false, b = false, c = false, d = false}, virtual_portstates = {a = false, b = false, c = false, d = false},
mesecons = { mesecons = {
effector = { effector = {
@ -932,3 +921,16 @@ minetest.register_node(BASENAME .. "_burnt", {
}, },
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
------------------------
-- Craft Registration --
------------------------
minetest.register_craft({
output = BASENAME.."0000 2",
recipe = {
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
{'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''},
}
})

@ -1,2 +1,2 @@
name = mesecons_luacontroller name = mesecons_luacontroller
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -10,9 +10,32 @@ minetest.register_craftitem("mesecons_materials:fiber", {
on_place_on_ground = minetest.craftitem_place_item, on_place_on_ground = minetest.craftitem_place_item,
description="Fiber", description="Fiber",
}) })
minetest.register_craft({
output = "mesecons_materials:glue 2",
type = "cooking",
recipe = "group:sapling",
cooktime = 2
})
minetest.register_craft({
output = "mesecons_materials:fiber 6",
type = "cooking",
recipe = "mesecons_materials:glue",
cooktime = 4
})
-- Silicon -- Silicon
minetest.register_craftitem("mesecons_materials:silicon", { minetest.register_craftitem("mesecons_materials:silicon", {
image = "mesecons_silicon.png", image = "mesecons_silicon.png",
on_place_on_ground = minetest.craftitem_place_item, on_place_on_ground = minetest.craftitem_place_item,
description="Silicon", description="Silicon",
}) })
minetest.register_craft({
output = "mesecons_materials:silicon 4",
recipe = {
{"group:sand", "group:sand"},
{"group:sand", "default:steel_ingot"},
}
})

@ -1,2 +1,2 @@
name = mesecons_materials name = mesecons_materials
depends = mesecons_gamecompat depends = mesecons

@ -44,10 +44,9 @@ local mesecons = {effector =
{ {
rules = input_rules, rules = input_rules,
action_change = function (pos, node, rulename, newstate) action_change = function (pos, node, rulename, newstate)
if yc.update_real_portstates(pos, node, rulename, newstate) then yc.update_real_portstates(pos, node, rulename, newstate)
yc.update(pos) yc.update(pos)
end end
end
}} }}
if nodename ~= "mesecons_microcontroller:microcontroller0000" then if nodename ~= "mesecons_microcontroller:microcontroller0000" then
mesecons.receptor = { mesecons.receptor = {
@ -103,7 +102,7 @@ minetest.register_node(nodename, {
for i=1, EEPROM_SIZE+1 do r=r.."0" end --Generate a string with EEPROM_SIZE*"0" for i=1, EEPROM_SIZE+1 do r=r.."0" end --Generate a string with EEPROM_SIZE*"0"
meta:set_string("eeprom", r) meta:set_string("eeprom", r)
end, end,
on_receive_fields = function(pos, _, fields, sender) on_receive_fields = function(pos, formanme, fields, sender)
local player_name = sender:get_player_name() local player_name = sender:get_player_name()
if minetest.is_protected(pos, player_name) and if minetest.is_protected(pos, player_name) and
not minetest.check_player_privs(player_name, {protection_bypass=true}) then not minetest.check_player_privs(player_name, {protection_bypass=true}) then
@ -140,7 +139,7 @@ minetest.register_node(nodename, {
yc.reset (pos) yc.reset (pos)
yc.update(pos) yc.update(pos)
end, end,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = mesecons, mesecons = mesecons,
after_dig_node = function (pos, node) after_dig_node = function (pos, node)
rules = microc_rules[node.name] rules = microc_rules[node.name]
@ -153,6 +152,28 @@ end
end end
end end
if minetest.get_modpath("mesecons_luacontroller") then
minetest.register_craft({
type = "shapeless",
output = "mesecons_microcontroller:microcontroller0000",
recipe = {"mesecons_luacontroller:luacontroller0000"},
})
minetest.register_craft({
type = "shapeless",
output = "mesecons_luacontroller:luacontroller0000",
recipe = {"mesecons_microcontroller:microcontroller0000"},
})
else
minetest.register_craft({
output = 'craft "mesecons_microcontroller:microcontroller0000" 2',
recipe = {
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
{'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'},
{'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''},
}
})
end
yc.reset = function(pos) yc.reset = function(pos)
yc.action(pos, {a=false, b=false, c=false, d=false}) yc.action(pos, {a=false, b=false, c=false, d=false})
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -204,6 +225,7 @@ yc.parsecode = function(code, pos)
local Lreal = yc.get_real_portstates(pos) local Lreal = yc.get_real_portstates(pos)
local Lvirtual = yc.get_virtual_portstates(pos) local Lvirtual = yc.get_virtual_portstates(pos)
if Lvirtual == nil then return nil end if Lvirtual == nil then return nil end
local c
local eeprom = meta:get_string("eeprom") local eeprom = meta:get_string("eeprom")
while true do while true do
local command, params local command, params
@ -229,9 +251,9 @@ yc.parsecode = function(code, pos)
if not params then return nil end if not params then return nil end
end end
if command == "on" then if command == "on" then
Lvirtual = yc.command_on (params, Lvirtual) L = yc.command_on (params, Lvirtual)
elseif command == "off" then elseif command == "off" then
Lvirtual = yc.command_off(params, Lvirtual) L = yc.command_off(params, Lvirtual)
elseif command == "print" then elseif command == "print" then
local su = yc.command_print(params, eeprom, yc.merge_portstates(Lreal, Lvirtual)) local su = yc.command_print(params, eeprom, yc.merge_portstates(Lreal, Lvirtual))
if su ~= true then return nil end if su ~= true then return nil end
@ -362,6 +384,7 @@ end
--Commands --Commands
yc.command_on = function(params, L) yc.command_on = function(params, L)
local rules = {}
for i, port in ipairs(params) do for i, port in ipairs(params) do
L = yc.set_portstate (port, true, L) L = yc.set_portstate (port, true, L)
end end
@ -369,6 +392,7 @@ yc.command_on = function(params, L)
end end
yc.command_off = function(params, L) yc.command_off = function(params, L)
local rules = {}
for i, port in ipairs(params) do for i, port in ipairs(params) do
L = yc.set_portstate (port, false, L) L = yc.set_portstate (port, false, L)
end end
@ -381,7 +405,7 @@ yc.command_print = function(params, eeprom, L)
if param:sub(1,1) == '"' and param:sub(#param, #param) == '"' then if param:sub(1,1) == '"' and param:sub(#param, #param) == '"' then
s = s..param:sub(2, #param-1) s = s..param:sub(2, #param-1)
else else
local r = yc.command_parsecondition(param, L, eeprom) r = yc.command_parsecondition(param, L, eeprom)
if r == "1" or r == "0" then if r == "1" or r == "0" then
s = s..r s = s..r
else return nil end else return nil end
@ -445,8 +469,8 @@ yc.command_after_execute = function(params)
if yc.parsecode(params.code, params.pos) == nil then if yc.parsecode(params.code, params.pos) == nil then
meta:set_string("infotext", "Code in after() not valid!") meta:set_string("infotext", "Code in after() not valid!")
else else
if params.code ~= nil then if code ~= nil then
meta:set_string("infotext", "Working Microcontroller\n"..params.code) meta:set_string("infotext", "Working Microcontroller\n"..code)
else else
meta:set_string("infotext", "Working Microcontroller") meta:set_string("infotext", "Working Microcontroller")
end end
@ -519,8 +543,8 @@ yc.command_parsecondition = function(cond, L, eeprom)
cond = string.gsub(cond, "!0", "1") cond = string.gsub(cond, "!0", "1")
cond = string.gsub(cond, "!1", "0") cond = string.gsub(cond, "!1", "0")
i = 2 local i = 2
l = string.len(cond) local l = string.len(cond)
while i<=l do while i<=l do
local s = cond:sub(i,i) local s = cond:sub(i,i)
local b = tonumber(cond:sub(i-1, i-1)) local b = tonumber(cond:sub(i-1, i-1))
@ -529,7 +553,8 @@ yc.command_parsecondition = function(cond, L, eeprom)
if s == "=" then if s == "=" then
if a==nil then return nil end if a==nil then return nil end
if b==nil then return nil end if b==nil then return nil end
local buf = a == b and "1" or "0" if a == b then buf = "1" end
if a ~= b then buf = "0" end
cond = string.gsub(cond, b..s..a, buf) cond = string.gsub(cond, b..s..a, buf)
i = 1 i = 1
l = string.len(cond) l = string.len(cond)
@ -537,8 +562,8 @@ yc.command_parsecondition = function(cond, L, eeprom)
i = i + 1 i = i + 1
end end
i = 2 local i = 2
l = string.len(cond) local l = string.len(cond)
while i<=l do while i<=l do
local s = cond:sub(i,i) local s = cond:sub(i,i)
local b = tonumber(cond:sub(i-1, i-1)) local b = tonumber(cond:sub(i-1, i-1))
@ -634,16 +659,13 @@ yc.set_portstate = function(port, state, L)
return L return L
end end
-- Updates the real port states according to the signal change. yc.update_real_portstates = function(pos, node, rulename, newstate)
-- Returns whether the real port states actually changed.
yc.update_real_portstates = function(pos, _, rulename, newstate)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if rulename == nil then if rulename == nil then
meta:set_int("real_portstates", 1) meta:set_int("real_portstates", 1)
return true return
end end
local real_portstates = meta:get_int("real_portstates") local n = meta:get_int("real_portstates") - 1
local n = real_portstates - 1
local L = {} local L = {}
for i = 1, 4 do for i = 1, 4 do
L[i] = n%2 L[i] = n%2
@ -658,12 +680,7 @@ yc.update_real_portstates = function(pos, _, rulename, newstate)
local port = ({4, 1, nil, 3, 2})[rulename.x+2*rulename.z+3] local port = ({4, 1, nil, 3, 2})[rulename.x+2*rulename.z+3]
L[port] = (newstate == "on") and 1 or 0 L[port] = (newstate == "on") and 1 or 0
end end
local new_portstates = 1 + L[1] + 2*L[2] + 4*L[3] + 8*L[4] meta:set_int("real_portstates", 1 + L[1] + 2*L[2] + 4*L[3] + 8*L[4])
if new_portstates ~= real_portstates then
meta:set_int("real_portstates", new_portstates)
return true
end
return false
end end
yc.get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside) yc.get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside)
@ -679,7 +696,7 @@ end
yc.get_virtual_portstates = function(pos) -- portstates according to the name yc.get_virtual_portstates = function(pos) -- portstates according to the name
local name = minetest.get_node(pos).name local name = minetest.get_node(pos).name
local _, a = string.find(name, ":microcontroller") local b, a = string.find(name, ":microcontroller")
if a == nil then return nil end if a == nil then return nil end
a = a + 1 a = a + 1

@ -1,2 +1,2 @@
name = mesecons_microcontroller name = mesecons_microcontroller
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -71,7 +71,7 @@ function mesecon.register_movestone(name, def, is_sticky, is_vertical)
-- ### Step 3: If sticky, pull stack behind ### -- ### Step 3: If sticky, pull stack behind ###
if is_sticky then if is_sticky then
local backpos = vector.subtract(pos, direction) local backpos = vector.subtract(pos, direction)
local success, _, oldstack = mesecon.mvps_pull_all(backpos, direction, max_pull, owner) success, stack, oldstack = mesecon.mvps_pull_all(backpos, direction, max_pull, owner)
if success then if success then
mesecon.mvps_move_objects(backpos, vector.multiply(direction, -1), oldstack, -1) mesecon.mvps_move_objects(backpos, vector.multiply(direction, -1), oldstack, -1)
end end
@ -94,7 +94,7 @@ function mesecon.register_movestone(name, def, is_sticky, is_vertical)
def.after_place_node = mesecon.mvps_set_owner def.after_place_node = mesecon.mvps_set_owner
def.on_punch = function(pos, _, player) def.on_punch = function(pos, node, player)
local player_name = player and player.get_player_name and player:get_player_name() local player_name = player and player.get_player_name and player:get_player_name()
if mesecon.mvps_claim(pos, player_name) then if mesecon.mvps_claim(pos, player_name) then
minetest.get_node_timer(pos):start(timer_interval) minetest.get_node_timer(pos):start(timer_interval)
@ -102,7 +102,7 @@ function mesecon.register_movestone(name, def, is_sticky, is_vertical)
end end
end end
def.on_timer = function(pos) def.on_timer = function(pos, elapsed)
local sourcepos = mesecon.is_powered(pos) local sourcepos = mesecon.is_powered(pos)
if not sourcepos then if not sourcepos then
return return
@ -129,7 +129,7 @@ mesecon.register_movestone("mesecons_movestones:movestone", {
}, },
groups = {cracky = 3}, groups = {cracky = 3},
description = "Movestone", description = "Movestone",
sounds = mesecon.node_sound.stone sounds = default.node_sound_stone_defaults()
}, false, false) }, false, false)
mesecon.register_movestone("mesecons_movestones:sticky_movestone", { mesecon.register_movestone("mesecons_movestones:sticky_movestone", {
@ -143,7 +143,7 @@ mesecon.register_movestone("mesecons_movestones:sticky_movestone", {
}, },
groups = {cracky = 3}, groups = {cracky = 3},
description = "Sticky Movestone", description = "Sticky Movestone",
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
}, true, false) }, true, false)
mesecon.register_movestone("mesecons_movestones:movestone_vertical", { mesecon.register_movestone("mesecons_movestones:movestone_vertical", {
@ -157,7 +157,7 @@ mesecon.register_movestone("mesecons_movestones:movestone_vertical", {
}, },
groups = {cracky = 3}, groups = {cracky = 3},
description = "Vertical Movestone", description = "Vertical Movestone",
sounds = mesecon.node_sound.stone sounds = default.node_sound_stone_defaults()
}, false, true) }, false, true)
mesecon.register_movestone("mesecons_movestones:sticky_movestone_vertical", { mesecon.register_movestone("mesecons_movestones:sticky_movestone_vertical", {
@ -171,10 +171,64 @@ mesecon.register_movestone("mesecons_movestones:sticky_movestone_vertical", {
}, },
groups = {cracky = 3}, groups = {cracky = 3},
description = "Vertical Sticky Movestone", description = "Vertical Sticky Movestone",
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
}, true, true) }, true, true)
-- crafting:
-- base recipe:
minetest.register_craft({
output = "mesecons_movestones:movestone 2",
recipe = {
{"default:stone", "default:stone", "default:stone"},
{"group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable"},
{"default:stone", "default:stone", "default:stone"},
}
})
-- conversation:
minetest.register_craft({
type = "shapeless",
output = "mesecons_movestones:movestone",
recipe = {"mesecons_movestones:movestone_vertical"},
})
minetest.register_craft({
type = "shapeless",
output = "mesecons_movestones:movestone_vertical",
recipe = {"mesecons_movestones:movestone"},
})
minetest.register_craft({
type = "shapeless",
output = "mesecons_movestones:sticky_movestone",
recipe = {"mesecons_movestones:sticky_movestone_vertical"},
})
minetest.register_craft({
type = "shapeless",
output = "mesecons_movestones:sticky_movestone_vertical",
recipe = {"mesecons_movestones:sticky_movestone"},
})
-- make sticky:
minetest.register_craft({
output = "mesecons_movestones:sticky_movestone",
recipe = {
{"mesecons_materials:glue", "mesecons_movestones:movestone", "mesecons_materials:glue"},
}
})
minetest.register_craft({
output = "mesecons_movestones:sticky_movestone_vertical",
recipe = {
{"mesecons_materials:glue"},
{"mesecons_movestones:movestone_vertical"},
{"mesecons_materials:glue"},
}
})
-- legacy code: -- legacy code:
minetest.register_alias("mesecons_movestones:movestone_active", minetest.register_alias("mesecons_movestones:movestone_active",
"mesecons_movestones:movestone") "mesecons_movestones:movestone")

@ -1,2 +1,2 @@
name = mesecons_movestones name = mesecons_movestones
depends = mesecons, mesecons_gamecompat, mesecons_materials, mesecons_mvps depends = mesecons, mesecons_materials, mesecons_mvps

@ -29,6 +29,9 @@ function mesecon.is_mvps_stopper(node, pushdir, stack, stackid)
end end
function mesecon.register_mvps_stopper(nodename, get_stopper) function mesecon.register_mvps_stopper(nodename, get_stopper)
if minetest.registered_nodes[nodename] and minetest.registered_nodes[nodename].buildable_to then
minetest.log("warning", ("Registering a buildable-to node \"%s\" as a mesecon stopper, this is not supported"):format(nodename))
end
if get_stopper == nil then if get_stopper == nil then
get_stopper = true get_stopper = true
end end
@ -46,9 +49,11 @@ local function on_mvps_move(moved_nodes)
end end
end end
function mesecon.mvps_process_stack() function mesecon.mvps_process_stack(stack)
-- This function is kept for compatibility. -- update mesecons for placed nodes ( has to be done after all nodes have been added )
-- It used to call on_placenode on moved nodes, but that is now done automatically. for _, n in ipairs(stack) do
mesecon.on_placenode(n.pos, minetest.get_node(n.pos))
end
end end
-- tests if the node can be pushed into, e.g. air, water, grass -- tests if the node can be pushed into, e.g. air, water, grass
@ -63,31 +68,32 @@ end
function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky) function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky)
-- determine the number of nodes to be pushed -- determine the number of nodes to be pushed
local nodes = {} local nodes = {}
local pos_set = {} local frontiers = {pos}
local frontiers = mesecon.fifo_queue.new()
frontiers:add(vector.new(pos))
for np in frontiers:iter() do while #frontiers > 0 do
local np_hash = minetest.hash_node_position(np) local np = frontiers[1]
local nn = not pos_set[np_hash] and minetest.get_node(np) local nn = minetest.get_node(np)
if nn and not node_replaceable(nn.name) then
pos_set[np_hash] = true -- Never push into unloaded blocks. Dont try to pull from them, either.
-- TODO: load blocks instead, as with wires.
if nn.name == "ignore" then return nil end
if not node_replaceable(nn.name) then
table.insert(nodes, {node = nn, pos = np}) table.insert(nodes, {node = nn, pos = np})
if #nodes > maximum then return nil end if #nodes > maximum then return nil end
-- add connected nodes to frontiers -- add connected nodes to frontiers, connected is a vector list
-- the vectors must be absolute positions
local connected = {}
if minetest.registered_nodes[nn.name] if minetest.registered_nodes[nn.name]
and minetest.registered_nodes[nn.name].mvps_sticky then and minetest.registered_nodes[nn.name].mvps_sticky then
local connected = minetest.registered_nodes[nn.name].mvps_sticky(np, nn) connected = minetest.registered_nodes[nn.name].mvps_sticky(np, nn)
for _, cp in ipairs(connected) do
frontiers:add(cp)
end
end end
frontiers:add(vector.add(np, dir)) table.insert(connected, vector.add(np, dir))
-- If adjacent node is sticky block and connects add that -- If adjacent node is sticky block and connects add that
-- position -- position to the connected table
for _, r in ipairs(mesecon.rules.alldirs) do for _, r in ipairs(mesecon.rules.alldirs) do
local adjpos = vector.add(np, r) local adjpos = vector.add(np, r)
local adjnode = minetest.get_node(adjpos) local adjnode = minetest.get_node(adjpos)
@ -99,16 +105,36 @@ function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky)
-- connects to this position? -- connects to this position?
for _, link in ipairs(sticksto) do for _, link in ipairs(sticksto) do
if vector.equals(link, np) then if vector.equals(link, np) then
frontiers:add(adjpos) table.insert(connected, adjpos)
end end
end end
end end
end end
if all_pull_sticky then if all_pull_sticky then
frontiers:add(vector.subtract(np, dir)) table.insert(connected, vector.subtract(np, dir))
end
-- Make sure there are no duplicates in frontiers / nodes before
-- adding nodes in "connected" to frontiers
for _, cp in ipairs(connected) do
local duplicate = false
for _, rp in ipairs(nodes) do
if vector.equals(cp, rp.pos) then
duplicate = true
end end
end end
for _, fp in ipairs(frontiers) do
if vector.equals(cp, fp) then
duplicate = true
end
end
if not duplicate then
table.insert(frontiers, cp)
end
end
end
table.remove(frontiers, 1)
end end
return nodes return nodes
@ -220,8 +246,6 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti
minetest.remove_node(n.pos) minetest.remove_node(n.pos)
end end
local oldstack = mesecon.tablecopy(nodes)
-- update mesecons for removed nodes ( has to be done after all nodes have been removed ) -- update mesecons for removed nodes ( has to be done after all nodes have been removed )
for _, n in ipairs(nodes) do for _, n in ipairs(nodes) do
mesecon.on_dignode(n.pos, n.node) mesecon.on_dignode(n.pos, n.node)
@ -231,12 +255,6 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti
for _, n in ipairs(nodes) do for _, n in ipairs(nodes) do
local np = vector.add(n.pos, movedir) local np = vector.add(n.pos, movedir)
-- Turn off conductors in transit
local conductor = mesecon.get_conductor(n.node.name)
if conductor and conductor.state ~= mesecon.state.off then
n.node.name = conductor.offstate or conductor.states[1]
end
minetest.set_node(np, n.node) minetest.set_node(np, n.node)
minetest.get_meta(np):from_table(n.meta) minetest.get_meta(np):from_table(n.meta)
if n.node_timer then if n.node_timer then
@ -245,6 +263,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti
end end
local moved_nodes = {} local moved_nodes = {}
local oldstack = mesecon.tablecopy(nodes)
for i in ipairs(nodes) do for i in ipairs(nodes) do
moved_nodes[i] = {} moved_nodes[i] = {}
moved_nodes[i].oldpos = nodes[i].pos moved_nodes[i].oldpos = nodes[i].pos
@ -261,6 +280,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti
end end
function mesecon.mvps_move_objects(pos, dir, nodestack, movefactor) function mesecon.mvps_move_objects(pos, dir, nodestack, movefactor)
local objects_to_move = {}
local dir_k local dir_k
local dir_l local dir_l
for k, v in pairs(dir) do for k, v in pairs(dir) do
@ -314,10 +334,11 @@ function mesecon.mvps_move_objects(pos, dir, nodestack, movefactor)
end end
end end
-- Never push into unloaded blocks. Dont try to pull from them, either. mesecon.register_mvps_stopper("doors:door_steel_b_1")
-- TODO: load blocks instead, as with wires. mesecon.register_mvps_stopper("doors:door_steel_t_1")
mesecon.register_mvps_stopper("ignore") mesecon.register_mvps_stopper("doors:door_steel_b_2")
mesecon.register_mvps_stopper("doors:door_steel_t_2")
mesecon.register_mvps_stopper("default:chest_locked")
mesecon.register_on_mvps_move(mesecon.move_hot_nodes) mesecon.register_on_mvps_move(mesecon.move_hot_nodes)
mesecon.register_on_mvps_move(function(moved_nodes) mesecon.register_on_mvps_move(function(moved_nodes)
for i = 1, #moved_nodes do for i = 1, #moved_nodes do

@ -3,16 +3,12 @@ minetest.register_node("mesecons_noteblock:noteblock", {
tiles = {"mesecons_noteblock.png"}, tiles = {"mesecons_noteblock.png"},
is_ground_content = false, is_ground_content = false,
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}, groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
on_punch = function(pos, node, puncher) -- change sound when punched on_punch = function(pos, node) -- change sound when punched
if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then
return
end
node.param2 = (node.param2+1)%12 node.param2 = (node.param2+1)%12
mesecon.noteblock_play(pos, node.param2) mesecon.noteblock_play(pos, node.param2)
minetest.set_node(pos, node) minetest.set_node(pos, node)
end, end,
sounds = mesecon.node_sound.wood, sounds = default.node_sound_wood_defaults(),
mesecons = {effector = { -- play sound when activated mesecons = {effector = { -- play sound when activated
action_on = function(pos, node) action_on = function(pos, node)
mesecon.noteblock_play(pos, node.param2) mesecon.noteblock_play(pos, node.param2)
@ -21,6 +17,15 @@ minetest.register_node("mesecons_noteblock:noteblock", {
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
output = "mesecons_noteblock:noteblock 1",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"group:mesecon_conductor_craftable", "default:steel_ingot", "group:mesecon_conductor_craftable"},
{"group:wood", "group:wood", "group:wood"},
}
})
local soundnames = { local soundnames = {
[0] = "mesecons_noteblock_csharp", [0] = "mesecons_noteblock_csharp",
"mesecons_noteblock_d", "mesecons_noteblock_d",
@ -37,20 +42,14 @@ local soundnames = {
"mesecons_noteblock_c" "mesecons_noteblock_c"
} }
local node_sounds = {} local node_sounds = {
for alias, sound in pairs({ ["default:lava_source"] = "fire_fire",
["mesecons_gamecompat:lava_source"] = mesecon.sound_name.fire, ["default:chest"] = "mesecons_noteblock_snare",
["mesecons_gamecompat:chest"] = "mesecons_noteblock_snare", ["default:chest_locked"] = "mesecons_noteblock_snare",
["mesecons_gamecompat:chest_locked"] = "mesecons_noteblock_snare", ["default:coalblock"] = "tnt_explode",
["mesecons_gamecompat:coalblock"] = mesecon.sound_name.explode, ["default:glass"] = "mesecons_noteblock_hihat",
["mesecons_gamecompat:glass"] = "mesecons_noteblock_hihat", ["default:obsidian_glass"] = "mesecons_noteblock_hihat",
["mesecons_gamecompat:obsidian_glass"] = "mesecons_noteblock_hihat", }
}) do
local nodename = minetest.registered_aliases[alias]
if nodename then
node_sounds[nodename] = sound
end
end
local node_sounds_group = { local node_sounds_group = {
["stone"] = "mesecons_noteblock_kick", ["stone"] = "mesecons_noteblock_kick",
@ -58,7 +57,6 @@ local node_sounds_group = {
["wood"] = "mesecons_noteblock_litecrash", ["wood"] = "mesecons_noteblock_litecrash",
} }
local steelblock_nodename = minetest.registered_aliases["mesecons_gamecompat:steelblock"]
mesecon.noteblock_play = function(pos, param2) mesecon.noteblock_play = function(pos, param2)
pos.y = pos.y-1 pos.y = pos.y-1
local nodeunder = minetest.get_node(pos).name local nodeunder = minetest.get_node(pos).name
@ -78,7 +76,7 @@ mesecon.noteblock_play = function(pos, param2)
minetest.log("error", "[mesecons_noteblock] No soundname found, test param2") minetest.log("error", "[mesecons_noteblock] No soundname found, test param2")
return return
end end
if nodeunder == steelblock_nodename then if nodeunder == "default:steelblock" then
soundname = soundname.. 2 soundname = soundname.. 2
end end
end end

@ -1,2 +1,2 @@
name = mesecons_noteblock name = mesecons_noteblock
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -93,6 +93,7 @@ local piston_on = function(pos, node)
minetest.swap_node(pos, {param2 = node.param2, name = pistonspec.onname}) minetest.swap_node(pos, {param2 = node.param2, name = pistonspec.onname})
minetest.set_node(pusher_pos, {param2 = node.param2, name = pistonspec.pusher}) minetest.set_node(pusher_pos, {param2 = node.param2, name = pistonspec.pusher})
minetest.sound_play("piston_extend", { pos = pos, max_hear_distance = 20, gain = 0.3 }, true) minetest.sound_play("piston_extend", { pos = pos, max_hear_distance = 20, gain = 0.3 }, true)
mesecon.mvps_process_stack(stack)
mesecon.mvps_move_objects(pusher_pos, dir, oldstack) mesecon.mvps_move_objects(pusher_pos, dir, oldstack)
end end
@ -107,7 +108,7 @@ local function piston_off(pos, node)
local dir = minetest.facedir_to_dir(node.param2) local dir = minetest.facedir_to_dir(node.param2)
local pullpos = vector.add(pos, vector.multiply(dir, -2)) local pullpos = vector.add(pos, vector.multiply(dir, -2))
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local success, _, oldstack = mesecon.mvps_pull_single(pullpos, dir, max_pull, meta:get_string("owner")) local success, stack, oldstack = mesecon.mvps_pull_single(pullpos, dir, max_pull, meta:get_string("owner"))
if success then if success then
mesecon.mvps_move_objects(pullpos, vector.multiply(dir, -1), oldstack, -1) mesecon.mvps_move_objects(pullpos, vector.multiply(dir, -1), oldstack, -1)
end end
@ -234,7 +235,7 @@ local function piston_rotate_pusher(pos, node, player, mode)
return piston_rotate_on(piston_pos, piston_node, player, mode) return piston_rotate_on(piston_pos, piston_node, player, mode)
end end
local function piston_punch(pos, _, player) local function piston_punch(pos, node, player)
local player_name = player and player.get_player_name and player:get_player_name() local player_name = player and player.get_player_name and player:get_player_name()
if mesecon.mvps_claim(pos, player_name) then if mesecon.mvps_claim(pos, player_name) then
minetest.chat_send_player(player_name, "Reclaimed piston") minetest.chat_send_player(player_name, "Reclaimed piston")
@ -278,7 +279,7 @@ minetest.register_node("mesecons_pistons:piston_normal_off", {
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
after_place_node = piston_orientate, after_place_node = piston_orientate,
sounds = mesecon.node_sound.wood, sounds = default.node_sound_wood_defaults(),
mesecons = {effector={ mesecons = {effector={
action_on = piston_on, action_on = piston_on,
rules = piston_get_rules, rules = piston_get_rules,
@ -308,7 +309,7 @@ minetest.register_node("mesecons_pistons:piston_normal_on", {
after_dig_node = piston_after_dig, after_dig_node = piston_after_dig,
node_box = piston_on_box, node_box = piston_on_box,
selection_box = piston_on_box, selection_box = piston_on_box,
sounds = mesecon.node_sound.wood, sounds = default.node_sound_wood_defaults(),
mesecons = {effector={ mesecons = {effector={
action_off = piston_off, action_off = piston_off,
rules = piston_get_rules, rules = piston_get_rules,
@ -338,7 +339,7 @@ minetest.register_node("mesecons_pistons:piston_pusher_normal", {
node_box = piston_pusher_box, node_box = piston_pusher_box,
on_rotate = piston_rotate_pusher, on_rotate = piston_rotate_pusher,
drop = "", drop = "",
sounds = mesecon.node_sound.wood, sounds = default.node_sound_wood_defaults(),
}) })
-- Sticky ones -- Sticky ones
@ -357,7 +358,7 @@ minetest.register_node("mesecons_pistons:piston_sticky_off", {
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
after_place_node = piston_orientate, after_place_node = piston_orientate,
sounds = mesecon.node_sound.wood, sounds = default.node_sound_wood_defaults(),
mesecons = {effector={ mesecons = {effector={
action_on = piston_on, action_on = piston_on,
rules = piston_get_rules, rules = piston_get_rules,
@ -387,7 +388,7 @@ minetest.register_node("mesecons_pistons:piston_sticky_on", {
after_dig_node = piston_after_dig, after_dig_node = piston_after_dig,
node_box = piston_on_box, node_box = piston_on_box,
selection_box = piston_on_box, selection_box = piston_on_box,
sounds = mesecon.node_sound.wood, sounds = default.node_sound_wood_defaults(),
mesecons = {effector={ mesecons = {effector={
action_off = piston_off, action_off = piston_off,
rules = piston_get_rules, rules = piston_get_rules,
@ -417,12 +418,12 @@ minetest.register_node("mesecons_pistons:piston_pusher_sticky", {
node_box = piston_pusher_box, node_box = piston_pusher_box,
on_rotate = piston_rotate_pusher, on_rotate = piston_rotate_pusher,
drop = "", drop = "",
sounds = mesecon.node_sound.wood, sounds = default.node_sound_wood_defaults(),
}) })
-- Register pushers as stoppers if they would be seperated from the piston -- Register pushers as stoppers if they would be seperated from the piston
local function piston_pusher_get_stopper(node, _, stack, stackid) local function piston_pusher_get_stopper(node, dir, stack, stackid)
if (stack[stackid + 1] if (stack[stackid + 1]
and stack[stackid + 1].node.name == get_pistonspec(node.name, "pusher").onname and stack[stackid + 1].node.name == get_pistonspec(node.name, "pusher").onname
and stack[stackid + 1].node.param2 == node.param2) and stack[stackid + 1].node.param2 == node.param2)
@ -434,12 +435,32 @@ local function piston_pusher_get_stopper(node, _, stack, stackid)
return true return true
end end
local function piston_pusher_up_down_get_stopper(node, dir, stack, stackid)
if (stack[stackid + 1]
and stack[stackid + 1].node.name == get_pistonspec(node.name, "pusher").onname)
or (stack[stackid - 1]
and stack[stackid - 1].node.name == get_pistonspec(node.name, "pusher").onname) then
return false
end
return true
end
mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper) mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper)
mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper) mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper)
-- Register pistons as stoppers if they would be seperated from the stopper -- Register pistons as stoppers if they would be seperated from the stopper
local function piston_get_stopper(node, _, stack, stackid) local piston_up_down_get_stopper = function (node, dir, stack, stackid)
if (stack[stackid + 1]
and stack[stackid + 1].node.name == get_pistonspec(node.name, "onname").pusher)
or (stack[stackid - 1]
and stack[stackid - 1].node.name == get_pistonspec(node.name, "onname").pusher) then
return false
end
return true
end
local function piston_get_stopper(node, dir, stack, stackid)
local pistonspec = get_pistonspec(node.name, "onname") local pistonspec = get_pistonspec(node.name, "onname")
local dir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) local dir = vector.multiply(minetest.facedir_to_dir(node.param2), -1)
local pusherpos = vector.add(stack[stackid].pos, dir) local pusherpos = vector.add(stack[stackid].pos, dir)
@ -459,5 +480,24 @@ mesecon.register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_st
mesecon.register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper) mesecon.register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper)
--craft recipes
minetest.register_craft({
output = "mesecons_pistons:piston_normal_off 2",
recipe = {
{"group:wood", "group:wood", "group:wood"},
{"default:cobble", "default:steel_ingot", "default:cobble"},
{"default:cobble", "group:mesecon_conductor_craftable", "default:cobble"},
}
})
minetest.register_craft({
output = "mesecons_pistons:piston_sticky_off",
recipe = {
{"mesecons_materials:glue"},
{"mesecons_pistons:piston_normal_off"},
}
})
-- load legacy code -- load legacy code
dofile(minetest.get_modpath("mesecons_pistons").."/legacy.lua") dofile(minetest.get_modpath("mesecons_pistons")..DIR_DELIM.."legacy.lua")

@ -1,2 +1,2 @@
name = mesecons_pistons name = mesecons_pistons
depends = mesecons, mesecons_gamecompat, mesecons_mvps depends = mesecons, mesecons_mvps

@ -16,9 +16,18 @@ minetest.register_node("mesecons_powerplant:power_plant", {
type = "fixed", type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},
}, },
sounds = mesecon.node_sound.leaves, sounds = default.node_sound_leaves_defaults(),
mesecons = {receptor = { mesecons = {receptor = {
state = mesecon.state.on state = mesecon.state.on
}}, }},
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
output = "mesecons_powerplant:power_plant 1",
recipe = {
{"group:mesecon_conductor_craftable"},
{"group:mesecon_conductor_craftable"},
{"group:sapling"},
}
})

@ -1,2 +1,2 @@
name = mesecons_powerplant name = mesecons_powerplant
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -8,7 +8,7 @@ local pp_box_on = {
fixed = { -7/16, -8/16, -7/16, 7/16, -7.5/16, 7/16 }, fixed = { -7/16, -8/16, -7/16, 7/16, -7.5/16, 7/16 },
} }
local function pp_on_timer(pos) local function pp_on_timer(pos, elapsed)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local basename = minetest.registered_nodes[node.name].pressureplate_basename local basename = minetest.registered_nodes[node.name].pressureplate_basename
@ -17,6 +17,7 @@ local function pp_on_timer(pos)
if not basename then return end if not basename then return end
local objs = minetest.get_objects_inside_radius(pos, 1) local objs = minetest.get_objects_inside_radius(pos, 1)
local two_below = vector.add(pos, vector.new(0, -2, 0))
if objs[1] == nil and node.name == basename .. "_on" then if objs[1] == nil and node.name == basename .. "_on" then
minetest.set_node(pos, {name = basename .. "_off"}) minetest.set_node(pos, {name = basename .. "_off"})
@ -45,6 +46,7 @@ end
-- sounds: sound table -- sounds: sound table
function mesecon.register_pressure_plate(basename, description, textures_off, textures_on, image_w, image_i, recipe, groups, sounds) function mesecon.register_pressure_plate(basename, description, textures_off, textures_on, image_w, image_i, recipe, groups, sounds)
local groups_off, groups_on
if not groups then if not groups then
groups = {} groups = {}
end end
@ -78,6 +80,11 @@ function mesecon.register_pressure_plate(basename, description, textures_off, te
groups = groups_on, groups = groups_on,
tiles = textures_on tiles = textures_on
}) })
minetest.register_craft({
output = basename .. "_off",
recipe = recipe,
})
end end
mesecon.register_pressure_plate( mesecon.register_pressure_plate(
@ -89,7 +96,7 @@ mesecon.register_pressure_plate(
"jeija_pressure_plate_wood_inv.png", "jeija_pressure_plate_wood_inv.png",
{{"group:wood", "group:wood"}}, {{"group:wood", "group:wood"}},
{ choppy = 3, oddly_breakable_by_hand = 3 }, { choppy = 3, oddly_breakable_by_hand = 3 },
mesecon.node_sound.wood) default.node_sound_wood_defaults())
mesecon.register_pressure_plate( mesecon.register_pressure_plate(
"mesecons_pressureplates:pressure_plate_stone", "mesecons_pressureplates:pressure_plate_stone",
@ -98,6 +105,6 @@ mesecon.register_pressure_plate(
{"jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on_edges.png"}, {"jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on_edges.png"},
"jeija_pressure_plate_stone_wield.png", "jeija_pressure_plate_stone_wield.png",
"jeija_pressure_plate_stone_inv.png", "jeija_pressure_plate_stone_inv.png",
{{"mesecons_gamecompat:cobble", "mesecons_gamecompat:cobble"}}, {{"default:cobble", "default:cobble"}},
{ cracky = 3, oddly_breakable_by_hand = 3 }, { cracky = 3, oddly_breakable_by_hand = 3 },
mesecon.node_sound.stone) default.node_sound_stone_defaults())

@ -1,2 +1,2 @@
name = mesecons_pressureplates name = mesecons_pressureplates
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -6,7 +6,7 @@ minetest.register_node("mesecons_random:removestone", {
inventory_image = minetest.inventorycube("jeija_removestone_inv.png"), inventory_image = minetest.inventorycube("jeija_removestone_inv.png"),
groups = {cracky=3}, groups = {cracky=3},
description="Removestone", description="Removestone",
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = {effector = { mesecons = {effector = {
action_on = function (pos, node) action_on = function (pos, node)
minetest.remove_node(pos) minetest.remove_node(pos)
@ -17,6 +17,14 @@ minetest.register_node("mesecons_random:removestone", {
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
output = 'mesecons_random:removestone 4',
recipe = {
{"", "default:cobble", ""},
{"default:cobble", "group:mesecon_conductor_craftable", "default:cobble"},
{"", "default:cobble", ""},
}
})
-- GHOSTSTONE -- GHOSTSTONE
@ -26,7 +34,7 @@ minetest.register_node("mesecons_random:ghoststone", {
is_ground_content = false, is_ground_content = false,
inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"), inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"),
groups = {cracky=3}, groups = {cracky=3},
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
mesecons = {conductor = { mesecons = {conductor = {
state = mesecon.state.off, state = mesecon.state.off,
rules = mesecon.rules.alldirs, rules = mesecon.rules.alldirs,
@ -51,7 +59,7 @@ minetest.register_node("mesecons_random:ghoststone_active", {
}}, }},
on_construct = function(pos) on_construct = function(pos)
-- remove shadow -- remove shadow
local shadowpos = vector.add(pos, vector.new(0, 1, 0)) shadowpos = vector.add(pos, vector.new(0, 1, 0))
if (minetest.get_node(shadowpos).name == "air") then if (minetest.get_node(shadowpos).name == "air") then
minetest.dig_node(shadowpos) minetest.dig_node(shadowpos)
end end
@ -59,3 +67,12 @@ minetest.register_node("mesecons_random:ghoststone_active", {
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
}) })
minetest.register_craft({
output = 'mesecons_random:ghoststone 4',
recipe = {
{"default:steel_ingot", "default:cobble", "default:steel_ingot"},
{"default:cobble", "group:mesecon_conductor_craftable", "default:cobble"},
{"default:steel_ingot", "default:cobble", "default:steel_ingot"},
}
})

@ -1,2 +1,2 @@
name = mesecons_random name = mesecons_random
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -25,10 +25,18 @@ local up_rcvboxes = {
{6/16, -8/16, 1/16, 8/16, -7/16, -1/16}, -- Plate extension (East) {6/16, -8/16, 1/16, 8/16, -7/16, -1/16}, -- Plate extension (East)
} }
local receiver_get_rules = mesecon.horiz_rules_getter({ local receiver_get_rules = function (node)
{x = 0, y = 0, z = 1}, local rules = { {x = 1, y = 0, z = 0},
{x = 0, y = 0, z = -2}, {x = -2, y = 0, z = 0}}
}) if node.param2 == 2 then
rules = mesecon.rotate_rules_left(rules)
elseif node.param2 == 3 then
rules = mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules))
elseif node.param2 == 0 then
rules = mesecon.rotate_rules_right(rules)
end
return rules
end
mesecon.register_node("mesecons_receiver:receiver", { mesecon.register_node("mesecons_receiver:receiver", {
drawtype = "nodebox", drawtype = "nodebox",
@ -48,7 +56,7 @@ mesecon.register_node("mesecons_receiver:receiver", {
}, },
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons:wire_00000000_off", drop = "mesecons:wire_00000000_off",
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
}, { }, {
tiles = { tiles = {
"receiver_top_off.png", "receiver_top_off.png",
@ -97,7 +105,7 @@ mesecon.register_node("mesecons_receiver:receiver_up", {
}, },
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons:wire_00000000_off", drop = "mesecons:wire_00000000_off",
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
}, { }, {
tiles = {"mesecons_wire_off.png"}, tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = { mesecons = {conductor = {
@ -142,7 +150,7 @@ mesecon.register_node("mesecons_receiver:receiver_down", {
}, },
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons:wire_00000000_off", drop = "mesecons:wire_00000000_off",
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
}, { }, {
tiles = {"mesecons_wire_off.png"}, tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = { mesecons = {conductor = {
@ -201,10 +209,8 @@ function mesecon.receiver_place(rcpt_pos)
local param2 = minetest.dir_to_facedir(minetest.facedir_to_dir(node.param2)) local param2 = minetest.dir_to_facedir(minetest.facedir_to_dir(node.param2))
if string.find(nn.name, "mesecons:wire_") ~= nil then if string.find(nn.name, "mesecons:wire_") ~= nil then
local rcv_node = {name = rcvtype, param2 = param2} minetest.set_node(pos, {name = rcvtype, param2 = param2})
minetest.set_node(pos, rcv_node) mesecon.on_placenode(pos, nn)
mesecon.on_dignode(pos, nn)
mesecon.on_placenode(pos, rcv_node)
end end
end end
@ -214,7 +220,6 @@ function mesecon.receiver_remove(rcpt_pos, dugnode)
if string.find(nn.name, "mesecons_receiver:receiver_") ~= nil then if string.find(nn.name, "mesecons_receiver:receiver_") ~= nil then
local node = {name = "mesecons:wire_00000000_off"} local node = {name = "mesecons:wire_00000000_off"}
minetest.set_node(pos, node) minetest.set_node(pos, node)
mesecon.on_dignode(pos, nn)
mesecon.on_placenode(pos, node) mesecon.on_placenode(pos, node)
end end
end end
@ -252,13 +257,7 @@ minetest.register_on_placenode(function (pos, node)
end end
end) end)
function mesecon.buttonlike_onrotate(pos, node, _, _, new_param2) function mesecon.buttonlike_onrotate(pos, node)
local new_node = {name = node.name, param1 = node.param1, param2 = new_param2} minetest.after(0, mesecon.receiver_remove, pos, node)
minetest.swap_node(pos, new_node) minetest.after(0, mesecon.receiver_place, pos)
mesecon.receiver_remove(pos, node)
mesecon.on_dignode(pos, node)
mesecon.on_placenode(pos, new_node)
mesecon.receiver_place(pos)
minetest.check_for_falling(pos)
return true
end end

@ -1,2 +1,2 @@
name = mesecons_receiver name = mesecons_receiver
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -15,7 +15,7 @@ mesecon.register_node("mesecons_solarpanel:solar_panel", {
wall_top = {-7/16, 7/16, -7/16, 7/16, 8/16, 7/16}, wall_top = {-7/16, 7/16, -7/16, 7/16, 8/16, 7/16},
wall_side = {-8/16, -7/16, -7/16, -7/16, 7/16, 7/16}, wall_side = {-8/16, -7/16, -7/16, -7/16, 7/16, 7/16},
}, },
sounds = mesecon.node_sound.glass, sounds = default.node_sound_glass_defaults(),
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
},{ },{
groups = {dig_immediate = 3}, groups = {dig_immediate = 3},
@ -31,6 +31,14 @@ mesecon.register_node("mesecons_solarpanel:solar_panel", {
}}, }},
}) })
minetest.register_craft({
output = "mesecons_solarpanel:solar_panel_off",
recipe = {
{"mesecons_materials:silicon", "mesecons_materials:silicon"},
{"mesecons_materials:silicon", "mesecons_materials:silicon"},
}
})
minetest.register_abm({ minetest.register_abm({
label = "Solar Panel On/Off", label = "Solar Panel On/Off",
nodenames = { nodenames = {

@ -1,2 +1,2 @@
name = mesecons_solarpanel name = mesecons_solarpanel
depends = mesecons, mesecons_gamecompat, mesecons_materials depends = mesecons, mesecons_materials

@ -8,12 +8,12 @@ minetest.register_node("mesecons_stickyblocks:sticky_block_all", {
tiles = {"mesecons_stickyblocks_sticky.png"}, tiles = {"mesecons_stickyblocks_sticky.png"},
is_ground_content = false, is_ground_content = false,
groups = {choppy=3, oddly_breakable_by_hand=2}, groups = {choppy=3, oddly_breakable_by_hand=2},
mvps_sticky = function (pos) mvps_sticky = function (pos, node)
local connected = {} local connected = {}
for _, r in ipairs(mesecon.rules.alldirs) do for _, r in ipairs(mesecon.rules.alldirs) do
table.insert(connected, vector.add(pos, r)) table.insert(connected, vector.add(pos, r))
end end
return connected return connected
end, end,
sounds = mesecon.node_sound.wood, sounds = default.node_sound_wood_defaults(),
}) })

@ -1,2 +1,2 @@
name = mesecons_stickyblocks name = mesecons_stickyblocks
depends = mesecons, mesecons_gamecompat, mesecons_mvps depends = mesecons, mesecons_mvps

@ -4,7 +4,7 @@ mesecon.register_node("mesecons_switch:mesecon_switch", {
paramtype2="facedir", paramtype2="facedir",
description="Switch", description="Switch",
is_ground_content = false, is_ground_content = false,
sounds = mesecon.node_sound.stone, sounds = default.node_sound_stone_defaults(),
on_rightclick = function (pos, node) on_rightclick = function (pos, node)
if(mesecon.flipstate(pos, node) == "on") then if(mesecon.flipstate(pos, node) == "on") then
mesecon.receptor_on(pos) mesecon.receptor_on(pos)
@ -26,3 +26,11 @@ mesecon.register_node("mesecons_switch:mesecon_switch", {
"mesecons_switch_side.png", "mesecons_switch_on.png"}, "mesecons_switch_side.png", "mesecons_switch_on.png"},
mesecons = {receptor = { state = mesecon.state.on }} mesecons = {receptor = { state = mesecon.state.on }}
}) })
minetest.register_craft({
output = "mesecons_switch:mesecon_switch_off 2",
recipe = {
{"default:steel_ingot", "default:cobble", "default:steel_ingot"},
{"group:mesecon_conductor_craftable","", "group:mesecon_conductor_craftable"},
}
})

@ -1,2 +1,2 @@
name = mesecons_switch name = mesecons_switch
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -27,17 +27,20 @@ local torch_get_output_rules = function(node)
return rotate_torch_rules(rules, node.param2) return rotate_torch_rules(rules, node.param2)
end end
local torch_input_rules_unrotated_horizontal = {vector.new(-2, 0, 0), vector.new(-1, 1, 0)}
local torch_input_rules_unrotated_vertical = {vector.new(-2, 0, 0)}
local torch_get_input_rules = function(node) local torch_get_input_rules = function(node)
local rules = (node.param2 == 0 or node.param2 == 1) local rules = {{x = -2, y = 0, z = 0},
and torch_input_rules_unrotated_vertical {x = -1, y = 1, z = 0}}
or torch_input_rules_unrotated_horizontal
return rotate_torch_rules(rules, node.param2) return rotate_torch_rules(rules, node.param2)
end end
minetest.register_craft({
output = "mesecons_torch:mesecon_torch_on 4",
recipe = {
{"group:mesecon_conductor_craftable"},
{"default:stick"},}
})
local torch_selectionbox = local torch_selectionbox =
{ {
type = "wallmounted", type = "wallmounted",
@ -57,7 +60,7 @@ minetest.register_node("mesecons_torch:mesecon_torch_off", {
selection_box = torch_selectionbox, selection_box = torch_selectionbox,
groups = {dig_immediate = 3, not_in_creative_inventory = 1}, groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_torch:mesecon_torch_on", drop = "mesecons_torch:mesecon_torch_on",
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = {receptor = { mesecons = {receptor = {
state = mesecon.state.off, state = mesecon.state.off,
rules = torch_get_output_rules rules = torch_get_output_rules
@ -79,7 +82,7 @@ minetest.register_node("mesecons_torch:mesecon_torch_on", {
groups = {dig_immediate=3}, groups = {dig_immediate=3},
light_source = minetest.LIGHT_MAX-5, light_source = minetest.LIGHT_MAX-5,
description="Mesecon Torch", description="Mesecon Torch",
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
mesecons = {receptor = { mesecons = {receptor = {
state = mesecon.state.on, state = mesecon.state.on,
rules = torch_get_output_rules rules = torch_get_output_rules

@ -1,2 +1,2 @@
name = mesecons_torch name = mesecons_torch
depends = mesecons, mesecons_gamecompat depends = mesecons

@ -15,7 +15,7 @@ mesecon.register_node("mesecons_walllever:wall_lever", {
type = "fixed", type = "fixed",
fixed = { -8/16, -8/16, 3/16, 8/16, 8/16, 8/16 }, fixed = { -8/16, -8/16, 3/16, 8/16, 8/16, 8/16 },
}, },
sounds = mesecon.node_sound.wood, sounds = default.node_sound_wood_defaults(),
on_rightclick = function (pos, node) on_rightclick = function (pos, node)
if(mesecon.flipstate(pos, node) == "on") then if(mesecon.flipstate(pos, node) == "on") then
mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node)) mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node))
@ -53,3 +53,12 @@ mesecon.register_node("mesecons_walllever:wall_lever", {
}}, }},
groups = {dig_immediate = 2, mesecon_needs_receiver = 1, not_in_creative_inventory = 1} groups = {dig_immediate = 2, mesecon_needs_receiver = 1, not_in_creative_inventory = 1}
}) })
minetest.register_craft({
output = "mesecons_walllever:wall_lever_off 2",
recipe = {
{"group:mesecon_conductor_craftable"},
{"default:stone"},
{"default:stick"},
}
})

@ -1,2 +1,2 @@
name = mesecons_walllever name = mesecons_walllever
depends = mesecons, mesecons_gamecompat, mesecons_receiver depends = mesecons, mesecons_receiver

@ -14,7 +14,7 @@ local wire_getconnect = function (from_pos, self_pos)
if minetest.registered_nodes[node.name] if minetest.registered_nodes[node.name]
and minetest.registered_nodes[node.name].mesecons then and minetest.registered_nodes[node.name].mesecons then
-- rules of node to possibly connect to -- rules of node to possibly connect to
local rules local rules = {}
if (minetest.registered_nodes[node.name].mesecon_wire) then if (minetest.registered_nodes[node.name].mesecon_wire) then
rules = mesecon.rules.default rules = mesecon.rules.default
else else
@ -73,7 +73,7 @@ local update_on_place_dig = function (pos, node)
end end
-- Update nodes around it -- Update nodes around it
local rules local rules = {}
if minetest.registered_nodes[node.name] if minetest.registered_nodes[node.name]
and minetest.registered_nodes[node.name].mesecon_wire then and minetest.registered_nodes[node.name].mesecon_wire then
rules = mesecon.rules.default rules = mesecon.rules.default
@ -123,6 +123,7 @@ local selectionbox =
} }
-- go to the next nodeid (ex.: 01000011 --> 01000100) -- go to the next nodeid (ex.: 01000011 --> 01000100)
local nid_inc = function() end
nid_inc = function (nid) nid_inc = function (nid)
local i = 0 local i = 0
while nid[i-1] ~= 1 do while nid[i-1] ~= 1 do
@ -194,11 +195,10 @@ local function register_wires()
}} }}
local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1, local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1,
not_in_creative_inventory = 1, not_in_craft_guide = 1} not_in_creative_inventory = 1}
local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1} local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1}
if nodeid ~= "00000000" then if nodeid ~= "00000000" then
groups_off["not_in_creative_inventory"] = 1 groups_off["not_in_creative_inventory"] = 1
groups_off["not_in_craft_guide"] = 1
end end
mesecon.register_node(":mesecons:wire_"..nodeid, { mesecon.register_node(":mesecons:wire_"..nodeid, {
@ -215,7 +215,7 @@ local function register_wires()
walkable = false, walkable = false,
drop = "mesecons:wire_00000000_off", drop = "mesecons:wire_00000000_off",
mesecon_wire = true, mesecon_wire = true,
sounds = mesecon.node_sound.default, sounds = default.node_sound_defaults(),
on_rotate = false, on_rotate = false,
}, {tiles = tiles_off, mesecons = meseconspec_off, groups = groups_off}, }, {tiles = tiles_off, mesecons = meseconspec_off, groups = groups_off},
{tiles = tiles_on, mesecons = meseconspec_on, groups = groups_on}) {tiles = tiles_on, mesecons = meseconspec_on, groups = groups_on})
@ -224,3 +224,27 @@ local function register_wires()
end end
end end
register_wires() register_wires()
-- ##############
-- ## Crafting ##
-- ##############
minetest.register_craft({
type = "cooking",
output = "mesecons:wire_00000000_off 2",
recipe = "default:mese_crystal_fragment",
cooktime = 3,
})
minetest.register_craft({
type = "cooking",
output = "mesecons:wire_00000000_off 18",
recipe = "default:mese_crystal",
cooktime = 15,
})
minetest.register_craft({
type = "cooking",
output = "mesecons:wire_00000000_off 162",
recipe = "default:mese",
cooktime = 30,
})

@ -1,2 +1,2 @@
name = mesecons_wires name = mesecons_wires
depends = mesecons, mesecons_gamecompat depends = mesecons