48 Commits

Author SHA1 Message Date
4ecc694518 Merge remote-tracking branch 'upstream/master' 2022-08-26 15:11:33 +02:00
68171b3d8d Store gate inputs in param2 instead of metadata (#583) 2022-08-25 16:55:03 +02:00
da57a6214a microcontroller: fix unsafe pattern usage (#620) 2022-08-01 17:27:05 +02:00
3dd0eb7e4f Merge remote-tracking branch 'upstream/master' 2022-06-25 16:50:22 +02:00
c4f9336a26 Exit with error if vports do not exist for any reason (#618)
Make sure node is registered before attempting to access the vports
2022-06-16 11:56:49 +02:00
0a4a88b1b9 Consolidate horizontal rules getters (#602) 2022-06-05 11:19:18 +02:00
58305f52bc Add missing nil check in hydroturbine code 2022-06-05 11:11:47 +02:00
e4d7c07962 Merge remote-tracking branch 'upstream/master' 2022-05-27 18:37:05 +02:00
27c3c515b4 Fix mesecon cooking recipes 2022-05-11 08:57:19 +02:00
960b7c4915 Make some fixes to movement and rotation (#584) 2022-05-07 22:24:58 +02:00
dfa43d6c0c Make modpack mostly independent from MTG (#607) 2022-05-05 16:57:53 +02:00
f4070d3e64 Use FIFO queue for mvps (#599) 2022-04-01 23:33:41 +02:00
21ac966ee2 Fix MTG doors not reacting correctly to Mesecon power 2022-04-01 23:27:35 +02:00
b630ff9443 Fix error prone negation reported by luacheck 2022-03-30 23:25:18 +02:00
399ee9f5b5 Avoid duplicating VManip data in Lua memory (#600) 2022-03-08 18:15:30 +01:00
69a4b6b332 Merge remote-tracking branch 'upstream/master' 2022-03-05 11:22:46 +01:00
0d9e0274ae Prevent extra pin events with luacontrollers, microcontrollers, and FPGAs (#593) 2022-02-27 21:12:37 +01:00
fef5c8cf68 Resolve license information inconsistency
Although the addition of "version 3 or later" to the README [1] predates the
commit that added LICENSE.txt with the description "LGPLv3 for code" [2]
I think it's safe to go with the latter since the terms were clarified
again by the original author explicitly without the "or later" clause [3].
closes #575

[1]: May 2013 8be0d0e1d9
[2]: Sep 2013 c3082f6601
[3]: May 2016 85bc62a65d
2022-02-19 18:20:06 +01:00
f6b0de64b8 Update list of MVPS stoppers 2022-02-19 18:01:58 +01:00
1d30891349 Move default dependency to individual mods that need it 2022-02-19 17:13:31 +01:00
4dfadd9276 Fix luacheck warning 2022-02-13 19:48:51 +01:00
3c27bb9350 Fix VM light update issue (#590) 2022-02-13 00:19:33 +01:00
fb255d292e Add .luacheckrc and fix issues it pointed out (#589) 2022-02-12 20:12:12 +01:00
c9dd323207 Remove redundant on_placenode calls after movement (#586) 2022-02-12 20:11:26 +01:00
4c5b13a347 Fix conductor lighting when aliases are used (#582) 2022-01-30 01:23:53 +01:00
DS
4eea0834b5 Fix torch rules (#581) 2022-01-30 01:23:05 +01:00
e38e4fe0c5 Merge remote-tracking branch 'upstream/master' 2021-12-10 21:37:44 +01:00
ecea0a2896 Optimize light updates when turning conductors on and off (#578) 2021-11-27 16:28:13 +01:00
5ad1e6bc4d Merge remote-tracking branch 'upstream/master' 2021-08-31 19:47:43 +02:00
9323445182 Only skip conductors with flat rules in turnon/off 2021-08-21 13:30:28 +02:00
b91fe92d13 Merge remote-tracking branch 'upstream/master' 2021-08-04 21:42:16 +02:00
e15c55c066 Handle getting out-of-bounds bits in get_bit (#574)
The binary state is not padded with zeroes, so they must be inferred.
2021-08-02 21:33:45 +02:00
6a87290ead Merge remote-tracking branch 'upstream/master' 2021-07-26 22:19:21 +02:00
db5879706d Fix on_placenode conductor turnon link direction (#572) 2021-07-24 18:40:43 +02:00
1963bfcc0d Merge remote-tracking branch 'upstream/master' 2021-04-17 13:50:01 +02:00
DS
65793514fe Fix use_texture_alpha warnings (#563) 2021-04-09 20:24:41 +02:00
6936c8c2e4 Merge remote-tracking branch 'upstream/master' 2021-04-04 21:01:12 +02:00
f5c3f798be Compatibility with mtg_craft_guide (#555)
Use group instead of wire when possible

Fixes https://github.com/minetest/minetest_game/issues/2843.
2021-04-01 18:56:08 +02:00
69d4a9584d Fix on-state effector-receptor combos (eg. gates) recepting to everywhere 2021-03-25 23:21:37 +01:00
DS
3f75c06a3b Improve performance of mesecon.turnon and mesecon.turnoff (#556) 2021-03-25 16:53:51 +01:00
2fc1682c04 Merge remote-tracking branch 'upstream/master' 2021-03-12 12:22:52 +01:00
93aa24dc42 Remove undeclared global variable corner_nodebox (#554)
To avoid warning message at load time.

Co-authored-by: sys4 <admin@sys4.fr>
2021-02-27 16:19:46 +01:00
93f155f604 Make /tell need shout priv (#553) 2021-02-27 16:12:51 +01:00
9b835053c2 Remove undeclared global variable corner_nodebox
To avoid warning message at load time.
2021-02-27 03:22:08 +01:00
583d2c1441 Replace mesecon.mergetable (#533) 2020-12-19 23:12:00 +03:00
397d449f1e Use empty string for protection check if puncher or clicker is nil. 2020-12-19 23:11:20 +03:00
29ec26a4c8 Prevent unauthorized players from toggling blinky plant. 2020-12-19 23:11:20 +03:00
0d86f2c45e Prevent unauthorized players from changing the noteblock sound. (#547) 2020-11-12 19:26:02 +01:00
82 changed files with 986 additions and 617 deletions

15
.github/workflows/check-release.yml vendored Normal file
View File

@ -0,0 +1,15 @@
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 ./

36
.luacheckrc Normal file
View File

@ -0,0 +1,36 @@
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"},
}

View File

@ -1,6 +1,12 @@
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 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

View File

@ -12,9 +12,9 @@ MESECONS by Jeija and contributors
Mezzee-what?
------------
[Mesecons](http://mesecons.net/)! They're yellow, they're conductive, and they'll add a whole new dimension to Minetest's gameplay.
[Mesecons](https://mesecons.net/)! They're yellow, they're conductive, and they'll add a whole new dimension to Minetest's gameplay.
Mesecons is a mod for [Minetest](http://minetest.net/) that implements a ton of items related to digital circuitry, such as wires, buttons, lights, and even programmable controllers. Among other things, there are also pistons, solar panels, pressure plates, and note blocks.
Mesecons 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 has a similar goal to Redstone in Minecraft, but works in its own way, with different rules and mechanics.
@ -74,8 +74,10 @@ There are also a whole bunch of other people helping with everything from code t
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). 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 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.
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.
All code in this project is licensed under the LGPL version 3.
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.

View File

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

View File

@ -29,7 +29,7 @@ local queue = mesecon.queue
queue.actions = {} -- contains all ActionQueue actions
function queue:add_function(name, func)
queue.funcs[name] = func
self.funcs[name] = func
end
-- 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:
if overwritecheck then
for i, ac in ipairs(queue.actions) do
for i, ac in ipairs(self.actions) do
if vector.equals(pos, ac.pos)
and mesecon.cmpAny(overwritecheck, ac.owcheck) then
-- remove the old action
table.remove(queue.actions, i)
table.remove(self.actions, i)
break
end
end
end
table.insert(queue.actions, action)
table.insert(self.actions, action)
end
-- execute the stored functions on a globalstep
@ -133,8 +133,8 @@ end
function queue:execute(action)
-- ignore if action queue function name doesn't exist,
-- (e.g. in case the action queue savegame was written by an old mesecons version)
if queue.funcs[action.func] then
queue.funcs[action.func](action.pos, unpack(action.params))
if self.funcs[action.func] then
self.funcs[action.func](action.pos, unpack(action.params))
end
end

62
mesecons/fifo_queue.lua Normal file
View File

@ -0,0 +1,62 @@
-- 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

View File

@ -11,7 +11,7 @@
-- RECEPTORS
-- mesecon.is_receptor(nodename) --> Returns true if nodename is a receptor
-- mesecon.is_receptor_on(nodename --> Returns true if nodename is an receptor with state = mesecon.state.on
-- mesecon.is_receptor_on(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.on
-- mesecon.is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off
-- mesecon.receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified)
@ -46,6 +46,9 @@
-- mesecon.rotate_rules_down(rules)
-- 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
function mesecon.get_effector(nodename)
if minetest.registered_nodes[nodename]
@ -92,8 +95,8 @@ function mesecon.get_any_inputrules(node)
end
function mesecon.get_any_rules(node)
return mesecon.mergetable(mesecon.get_any_inputrules(node) or {},
mesecon.get_any_outputrules(node) or {})
return mesecon.merge_rule_sets(mesecon.get_any_inputrules(node),
mesecon.get_any_outputrules(node))
end
-- Receptors
@ -316,7 +319,7 @@ function mesecon.get_conductor_on(node_off, rulename)
return conductor.states[tonumber(binstate,2)+1]
end
end
return offstate
return nil
end
function mesecon.get_conductor_off(node_on, rulename)
@ -332,7 +335,7 @@ function mesecon.get_conductor_off(node_on, rulename)
return conductor.states[tonumber(binstate,2)+1]
end
end
return onstate
return nil
end
function mesecon.conductor_get_rules(node)
@ -366,37 +369,98 @@ function mesecon.is_power_off(pos, rulename)
return false
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`.
-- Breadth-first search. Map is abstracted away in a voxelmanip.
-- Follow all all conductor paths replacing conductors that were already
-- looked at, activating / changing all effectors along the way.
function mesecon.turnon(pos, link)
local frontiers = {{pos = pos, link = link}}
find_light_update_conductors()
local frontiers = mesecon.fifo_queue.new()
frontiers:add({pos = pos, link = link})
local pos_can_be_skipped = {}
local depth = 1
while frontiers[1] do
local f = table.remove(frontiers, 1)
for f in frontiers:iter() do
local node = mesecon.get_node_force(f.pos)
if not node then
-- Area does not exist; do nothing
elseif mesecon.is_conductor_off(node, f.link) then
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
elseif mesecon.is_conductor(node.name) then
local rules = mesecon.conductor_get_rules(node)
if mesecon.is_conductor_off(node, f.link) then
-- Call turnon on neighbors
for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do
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
table.insert(frontiers, {pos = np, link = l})
frontiers:add({pos = np, link = l})
end
end
end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link))
mesecon.swap_node_force(f.pos, mesecon.get_conductor_on(node, f.link), light_update_conductors[node.name] ~= nil)
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
mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth)
if mesecon.is_effector_off(node.name) then
mesecon.activate(f.pos, node, f.link, depth)
end
else
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
end
depth = depth + 1
end
@ -419,25 +483,32 @@ end
-- depth = indicates order in which signals wire fired, higher is later
-- }
function mesecon.turnoff(pos, link)
local frontiers = {{pos = pos, link = link}}
find_light_update_conductors()
local frontiers = mesecon.fifo_queue.new()
frontiers:add({pos = pos, link = link})
local signals = {}
local pos_can_be_skipped = {}
local depth = 1
while frontiers[1] do
local f = table.remove(frontiers, 1)
for f in frontiers:iter() do
local node = mesecon.get_node_force(f.pos)
if not node then
-- Area does not exist; do nothing
elseif mesecon.is_conductor_on(node, f.link) then
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
elseif mesecon.is_conductor(node.name) then
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
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,
-- abort this turnoff process by returning false. `receptor_off` will
-- discard all the changes that we made in the voxelmanip:
for _, l in ipairs(mesecon.rules_link_rule_all_inverted(f.pos, r)) do
if mesecon.rules_link_rule_all_inverted(f.pos, r)[1] then
if mesecon.is_receptor_on(mesecon.get_node_force(np).name) then
return false
end
@ -445,11 +516,18 @@ function mesecon.turnoff(pos, link)
-- Call turnoff on neighbors
for _, l in ipairs(mesecon.rules_link_rule_all(f.pos, r)) do
table.insert(frontiers, {pos = np, link = l})
frontiers:add({pos = np, link = l})
end
end
end
mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link))
mesecon.swap_node_force(f.pos, mesecon.get_conductor_off(node, f.link), light_update_conductors[node.name] ~= nil)
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
table.insert(signals, {
pos = f.pos,
@ -457,6 +535,8 @@ function mesecon.turnoff(pos, link)
link = f.link,
depth = depth
})
else
pos_can_be_skipped[minetest.hash_node_position(f.pos)] = true
end
depth = depth + 1
end

View File

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

View File

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

View File

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

View File

@ -2,6 +2,7 @@
mesecon.on_placenode = function(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
if mesecon.is_receptor_on(node.name) then
@ -11,18 +12,20 @@ mesecon.on_placenode = function(pos, node)
-- Conductors: Send turnon signal when powered or replace by respective offstate conductor
-- if placed conductor is an onstate one
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)
if sources then
-- also call receptor_on if itself is powered already, so that neighboring
-- conductors will be activated (when pushing an on-conductor with a piston)
mesecon.vm_begin()
for _, s in ipairs(sources) do
local rule = vector.subtract(pos, s)
local rule = vector.subtract(s, pos)
mesecon.turnon(pos, rule)
end
--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)
mesecon.vm_commit()
end
end
@ -63,7 +66,7 @@ mesecon.on_dignode = function(pos, node)
mesecon.execute_autoconnect_hooks_queue(pos, node)
end
function mesecon.on_blastnode(pos, intensity)
function mesecon.on_blastnode(pos)
local node = minetest.get_node(pos)
minetest.remove_node(pos)
mesecon.on_dignode(pos, node)

View File

@ -6,6 +6,24 @@ function mesecon.move_node(pos, newpos)
minetest.get_meta(pos):from_table(meta)
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:
function mesecon.rotate_rules_right(rules)
local nr = {}
@ -54,7 +72,28 @@ function mesecon.rotate_rules_up(rules)
end
return nr
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)
--[[
@ -164,7 +203,9 @@ end
function mesecon.get_bit(binary,bit)
bit = bit or 1
local c = binary:len()-(bit-1)
local len = binary:len()
if bit > len then return false end
local c = len-(bit-1)
return binary:sub(c,c) == "1"
end
@ -213,8 +254,9 @@ function mesecon.cmpAny(t1, t2)
return true
end
-- does not overwrite values; number keys (ipairs) are appended, not overwritten
-- Deprecated. Use `merge_tables` or `merge_rule_sets` as appropriate.
function mesecon.mergetable(source, dest)
minetest.log("warning", debug.traceback("Deprecated call to mesecon.mergetable"))
local rval = mesecon.tablecopy(dest)
for k, v in pairs(source) do
@ -227,6 +269,32 @@ function mesecon.mergetable(source, dest)
return rval
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)
spec_common.drop = spec_common.drop or name .. "_off"
spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode
@ -234,8 +302,8 @@ function mesecon.register_node(name, spec_common, spec_off, spec_on)
spec_on.__mesecon_state = "on"
spec_off.__mesecon_state = "off"
spec_on = mesecon.mergetable(spec_common, spec_on);
spec_off = mesecon.mergetable(spec_common, spec_off);
spec_on = mesecon.merge_tables(spec_common, spec_on);
spec_off = mesecon.merge_tables(spec_common, spec_off);
minetest.register_node(name .. "_on", spec_on)
minetest.register_node(name .. "_off", spec_off)
@ -257,7 +325,7 @@ end
-- File writing / reading utilities
local wpath = minetest.get_worldpath()
function mesecon.file2table(filename)
local f = io.open(wpath..DIR_DELIM..filename, "r")
local f = io.open(wpath.."/"..filename, "r")
if f == nil then return {} end
local t = f:read("*all")
f:close()
@ -266,7 +334,7 @@ function mesecon.file2table(filename)
end
function mesecon.table2file(filename, table)
local f = io.open(wpath..DIR_DELIM..filename, "w")
local f = io.open(wpath.."/"..filename, "w")
f:write(minetest.serialize(table))
f:close()
end
@ -288,15 +356,17 @@ end
--
-- Contents of the table are:
-- “vm” → the VoxelManipulator
-- “va” → the VoxelArea
-- “data” → the data array
-- “param1” → the param1 array
-- “param2” → the param2 array
-- “dirty” → true if data has been modified
--
-- Nil if no VM-based transaction is in progress.
local vm_cache = nil
-- 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.
--
-- During a VM transaction, calls to vm_get_node and vm_swap_node operate on a
@ -305,6 +375,8 @@ local vm_cache = nil
-- vm_abort.
function mesecon.vm_begin()
vm_cache = {}
vm_node_cache = {}
vm_update_light = false
end
-- Finishes a VoxelManipulator-based transaction, freeing the VMs and map data
@ -313,18 +385,19 @@ function mesecon.vm_commit()
for hash, tbl in pairs(vm_cache) do
if tbl.dirty then
local vm = tbl.vm
vm:set_data(tbl.data)
vm:write_to_map()
vm:write_to_map(vm_update_light)
vm:update_map()
end
end
vm_cache = nil
vm_node_cache = nil
end
-- Finishes a VoxelManipulator-based transaction, freeing the VMs and throwing
-- away any modified areas.
function mesecon.vm_abort()
vm_cache = nil
vm_node_cache = nil
end
-- Gets the cache entry covering a position, populating it if necessary.
@ -332,10 +405,7 @@ local function vm_get_or_create_entry(pos)
local hash = hash_blockpos(pos)
local tbl = vm_cache[hash]
if not tbl then
local vm = minetest.get_voxel_manip(pos, pos)
local min_pos, max_pos = vm:get_emerged_area()
local va = VoxelArea:new{MinEdge = min_pos, MaxEdge = max_pos}
tbl = {vm = vm, va = va, data = vm:get_data(), param1 = vm:get_light_data(), param2 = vm:get_param2_data(), dirty = false}
tbl = {vm = minetest.get_voxel_manip(pos, pos), dirty = false}
vm_cache[hash] = tbl
end
return tbl
@ -344,25 +414,34 @@ end
-- Gets the node at a given position during a VoxelManipulator-based
-- transaction.
function mesecon.vm_get_node(pos)
local tbl = vm_get_or_create_entry(pos)
local index = tbl.va:indexp(pos)
local node_value = tbl.data[index]
if node_value == core.CONTENT_IGNORE then
return nil
else
local node_param1 = tbl.param1[index]
local node_param2 = tbl.param2[index]
return {name = minetest.get_name_from_content_id(node_value), param1 = node_param1, param2 = node_param2}
local hash = minetest.hash_node_position(pos)
local node = vm_node_cache[hash]
if not node then
node = vm_get_or_create_entry(pos).vm:get_node_at(pos)
vm_node_cache[hash] = node
end
return node.name ~= "ignore" and {name = node.name, param1 = node.param1, param2 = node.param2} or nil
end
-- Sets a nodes name during a VoxelManipulator-based transaction.
--
-- Existing param1, param2, and metadata are left alone.
function mesecon.vm_swap_node(pos, name)
--
-- 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 index = tbl.va:indexp(pos)
tbl.data[index] = minetest.get_content_id(name)
local hash = minetest.hash_node_position(pos)
local node = vm_node_cache[hash]
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
end
@ -398,9 +477,11 @@ end
--
-- This function can only be used to change the nodes name, not its parameters
-- 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
return mesecon.vm_swap_node(pos, name)
return mesecon.vm_swap_node(pos, name, update_light)
else
-- This serves to both ensure the mapblock is loaded and also hand us
-- the old node table so we can preserve param2.

View File

@ -26,13 +26,19 @@ mesecon.register_node("mesecons_blinkyplant:blinky_plant", {
paramtype = "light",
is_ground_content = false,
walkable = false,
sounds = default.node_sound_leaves_defaults(),
sounds = mesecon.node_sound.leaves,
selection_box = {
type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},
},
on_timer = on_timer,
on_rightclick = toggle_timer,
on_rightclick = function(pos, _, clicker)
if minetest.is_protected(pos, clicker and clicker:get_player_name() or "") then
return
end
toggle_timer(pos)
end,
on_construct = toggle_timer
},{
tiles = {"jeija_blinky_plant_off.png"},

View File

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

View File

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

View File

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

View File

@ -10,6 +10,7 @@ minetest.register_chatcommand("say", {
minetest.register_chatcommand("tell", {
params = "<name> <text>",
description = "Say <text> to <name> privately",
privs = {shout=true},
func = function(name, param)
local found, _, target, message = param:find("^([^%s]+)%s+(.*)$")
if found == nil then
@ -78,7 +79,7 @@ local function after_place(pos, placer)
end
end
local function receive_fields(pos, formname, fields, sender)
local function receive_fields(pos, _, fields, sender)
if not fields.submit then
return
end
@ -188,7 +189,7 @@ minetest.register_node("mesecons_commandblock:commandblock_off", {
after_place_node = after_place,
on_receive_fields = receive_fields,
can_dig = can_dig,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
mesecons = {effector = {
action_on = commandblock_action_on
}},
@ -205,7 +206,7 @@ minetest.register_node("mesecons_commandblock:commandblock_on", {
after_place_node = after_place,
on_receive_fields = receive_fields,
can_dig = can_dig,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
mesecons = {effector = {
action_off = commandblock_action_off
}},

View File

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

View File

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

View File

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

View File

@ -1,3 +1,5 @@
local side_texture = mesecon.texture.steel_block or "mesecons_detector_side.png"
local GET_COMMAND = "GET"
-- Object detector
@ -12,7 +14,7 @@ local function object_detector_make_formspec(pos)
"button_exit[7,0.75;2,3;;Save]")
end
local function object_detector_on_receive_fields(pos, formname, fields, sender)
local function object_detector_on_receive_fields(pos, _, fields, sender)
if not fields.scanname or not fields.digiline_channel then return end
if minetest.is_protected(pos, sender:get_player_name()) then return end
@ -53,7 +55,7 @@ end
-- set player name when receiving a digiline signal on a specific channel
local object_detector_digiline = {
effector = {
action = function(pos, node, channel, msg)
action = function(pos, _, channel, msg)
local meta = minetest.get_meta(pos)
if channel == meta:get_string("digiline_channel") then
meta:set_string("scanname", msg)
@ -64,7 +66,7 @@ local object_detector_digiline = {
}
minetest.register_node("mesecons_detector:object_detector_off", {
tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png"},
tiles = {side_texture, side_texture, "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png"},
paramtype = "light",
is_ground_content = false,
walkable = true,
@ -76,13 +78,13 @@ minetest.register_node("mesecons_detector:object_detector_off", {
}},
on_construct = object_detector_make_formspec,
on_receive_fields = object_detector_on_receive_fields,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
digiline = object_detector_digiline,
on_blast = mesecon.on_blastnode,
})
minetest.register_node("mesecons_detector:object_detector_on", {
tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png"},
tiles = {side_texture, side_texture, "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png"},
paramtype = "light",
is_ground_content = false,
walkable = true,
@ -94,7 +96,7 @@ minetest.register_node("mesecons_detector:object_detector_on", {
}},
on_construct = object_detector_make_formspec,
on_receive_fields = object_detector_on_receive_fields,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
digiline = object_detector_digiline,
on_blast = mesecon.on_blastnode,
})
@ -102,18 +104,18 @@ minetest.register_node("mesecons_detector:object_detector_on", {
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"},
{"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot"},
{"mesecons_gamecompat:steel_ingot", "mesecons_luacontroller:luacontroller0000", "mesecons_gamecompat:steel_ingot"},
{"mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable", "mesecons_gamecompat: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"},
{"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot"},
{"mesecons_gamecompat:steel_ingot", "mesecons_microcontroller:microcontroller0000", "mesecons_gamecompat:steel_ingot"},
{"mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot"},
}
})
@ -156,7 +158,7 @@ local function node_detector_make_formspec(pos)
"button_exit[7,0.75;2,3;;Save]")
end
local function node_detector_on_receive_fields(pos, fieldname, fields, sender)
local function node_detector_on_receive_fields(pos, _, fields, sender)
if not fields.scanname or not fields.digiline_channel then return end
if minetest.is_protected(pos, sender:get_player_name()) then return end
@ -238,25 +240,8 @@ local node_detector_digiline = {
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", {
tiles = {"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "jeija_node_detector_off.png"},
tiles = {side_texture, side_texture, side_texture, side_texture, side_texture, "jeija_node_detector_off.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
@ -268,13 +253,13 @@ minetest.register_node("mesecons_detector:node_detector_off", {
}},
on_construct = node_detector_make_formspec,
on_receive_fields = node_detector_on_receive_fields,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
digiline = node_detector_digiline,
on_blast = mesecon.on_blastnode,
})
minetest.register_node("mesecons_detector:node_detector_on", {
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"},
tiles = {side_texture, side_texture, side_texture, side_texture, side_texture, "jeija_node_detector_on.png"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
@ -286,7 +271,7 @@ minetest.register_node("mesecons_detector:node_detector_on", {
}},
on_construct = node_detector_make_formspec,
on_receive_fields = node_detector_on_receive_fields,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
digiline = node_detector_digiline,
on_blast = mesecon.on_blastnode,
})
@ -294,18 +279,18 @@ minetest.register_node("mesecons_detector:node_detector_on", {
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"},
{"mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot"},
{"mesecons_gamecompat:steel_ingot", "mesecons_luacontroller:luacontroller0000", "mesecons_gamecompat:steel_ingot"},
{"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot", "mesecons_gamecompat: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"},
{"mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot"},
{"mesecons_gamecompat:steel_ingot", "mesecons_microcontroller:microcontroller0000", "mesecons_gamecompat:steel_ingot"},
{"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:steel_ingot"},
}
})

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

View File

@ -1,7 +1,7 @@
-- 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
if minetest.get_node(pos).name ~= check_name then
return
end
local p2 = minetest.get_node(pos).param2
@ -22,11 +22,11 @@ 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)
local function toggle_state1 (pos)
on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
end
local function toggle_state2 (pos, node)
local function toggle_state2 (pos)
on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
end
@ -49,13 +49,13 @@ local function meseconify_door(name)
-- new style mesh node based doors
local override = {
mesecons = {effector = {
action_on = function(pos, node)
action_on = function(pos)
local door = doors.get(pos)
if door then
door:open()
end
end,
action_off = function(pos, node)
action_off = function(pos)
local door = doors.get(pos)
if door then
door:close()
@ -66,6 +66,10 @@ local function meseconify_door(name)
}
minetest.override_item(name .. "_a", override)
minetest.override_item(name .. "_b", override)
if minetest.registered_items[name .. "_c"] then
minetest.override_item(name .. "_c", override)
minetest.override_item(name .. "_d", override)
end
end
end
@ -93,13 +97,13 @@ end
if doors and doors.get then
local override = {
mesecons = {effector = {
action_on = function(pos, node)
action_on = function(pos)
local door = doors.get(pos)
if door then
door:open()
end
end,
action_off = function(pos, node)
action_off = function(pos)
local door = doors.get(pos)
if door then
door:close()

View File

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

View File

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

View File

@ -1,12 +1,9 @@
local rotate
if minetest.global_exists("screwdriver") then rotate = screwdriver.rotate_simple end
local doublecorner_selectionbox = {
type = "fixed",
fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
}
local rules = {
local doublecorner_get_rules = mesecon.horiz_rules_getter({
{
{ x = 1, y = 0, z = 0 },
{ x = 0, y = 0, z = 1 },
@ -15,19 +12,7 @@ local rules = {
{ x = -1, y = 0, z = 0 },
{ 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 = {
"mesecons_extrawires:doublecorner_00",
@ -61,7 +46,7 @@ for k, state in ipairs(doublecorner_states) do
selection_box = doublecorner_selectionbox,
groups = groups,
drop = doublecorner_states[1],
sounds = default.node_sound_defaults(),
sounds = mesecon.node_sound.default,
mesecons = {
conductor = {
states = doublecorner_states,
@ -69,7 +54,7 @@ for k, state in ipairs(doublecorner_states) do
},
},
on_blast = mesecon.on_blastnode,
on_rotate = rotate,
on_rotate = mesecon.on_rotate_horiz,
})
end

View File

@ -1,3 +1,20 @@
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 =
{
{x = 1, y = 0, z = 0},
@ -8,7 +25,7 @@ local mesewire_rules =
{x = 0, y = 0, z =-1},
}
minetest.override_item("default:mese", {
minetest.override_item(mese_nodename, {
mesecons = {conductor = {
state = mesecon.state.off,
onstate = "mesecons_extrawires:mese_powered",
@ -18,15 +35,17 @@ minetest.override_item("default:mese", {
-- Copy node definition of powered mese from normal mese
-- and brighten texture tiles to indicate mese is powered
local powered_def = mesecon.mergetable(minetest.registered_nodes["default:mese"], {
drop = "default:mese",
light_source = 5,
local unpowered_def = minetest.registered_nodes[mese_nodename]
local powered_def = mesecon.merge_tables(unpowered_def, {
drop = mese_nodename,
paramtype = "light",
light_source = math.min(unpowered_def.light_source + 2, minetest.LIGHT_MAX),
mesecons = {conductor = {
state = mesecon.state.on,
offstate = "default:mese",
offstate = mese_nodename,
rules = mesewire_rules
}},
groups = {cracky = 1, not_in_creative_inventory = 1},
groups = mesecon.merge_tables(unpowered_def.groups or {}, {not_in_creative_inventory = 1}),
on_blast = mesecon.on_blastnode,
})

View File

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

View File

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

View File

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

View File

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

View File

@ -10,10 +10,10 @@ local operations = {
-- unary: Whether this gate only has one input
{ 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 = "not", short = "~", fs_name = " NOT", func = function(a, b) return not b end, unary = true },
{ gate = "not", short = "~", fs_name = " NOT", func = function(_, b) return not b end, unary = true },
{ 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 = "buf", short = "_", fs_name = " =", func = function(a, b) return b end, unary = true },
{ gate = "buf", short = "_", fs_name = " =", func = function(_, b) return b end, unary = true },
{ 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 },
}

View File

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

View File

@ -0,0 +1,71 @@
--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
-- Textures
mesecon.texture.steel_block = "default_steel_block.png"
-- 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

View File

@ -0,0 +1,15 @@
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

View File

@ -0,0 +1,3 @@
name = mesecons_gamecompat
depends = mesecons
optional_depends = fire, default, dye, mesecons_mvps, tnt

View File

@ -11,40 +11,31 @@ local nodebox = {
},
}
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_output_rules = 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_oneinput = mesecon.horiz_rules_getter({{x =-1, y = 0, z = 0}})
local function gate_get_input_rules_oneinput(node)
return gate_rotate_rules(node, {{x=-1, y=0, z=0}})
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 gate_get_input_rules_twoinputs = mesecon.horiz_rules_getter({
{x = 0, y = 0, z = 1, name = "input1"},
{x = 0, y = 0, z = -1, name = "input2"},
})
local function set_gate(pos, node, state)
local gate = minetest.registered_nodes[node.name]
local new_nodename = state and gate.onstate or gate.offstate
minetest.swap_node(pos, {name = new_nodename, param2 = node.param2})
if new_nodename ~= node.name then
if mesecon.do_overheat(pos) then
minetest.remove_node(pos)
mesecon.receptor_off(pos, gate_get_output_rules(node))
minetest.add_item(pos, gate.drop)
elseif state then
minetest.swap_node(pos, {name = gate.onstate, param2=node.param2})
mesecon.receptor_on(pos, gate_get_output_rules(node))
else
minetest.swap_node(pos, {name = gate.offstate, param2=node.param2})
mesecon.receptor_off(pos, gate_get_output_rules(node))
end
end
end
local function update_gate(pos, node, link, newstate)
@ -53,11 +44,36 @@ local function update_gate(pos, node, link, newstate)
if gate.inputnumber == 1 then
set_gate(pos, node, gate.assess(newstate == "on"))
elseif gate.inputnumber == 2 then
-- Inputs are stored in param2. Bit 5 is always set.
-- input1 is bit 6 and input2 is bit 7.
local val1, val2
if node.param2 >= 32 then
-- Bit 5 is set, so param2 is in the proper format.
if link.name == "input1" then
val1 = newstate == "on"
val2 = node.param2 >= 128
else
val1 = node.param2 % 128 >= 64
val2 = newstate == "on"
end
else
-- Migrate old gates where the inputs are stored as metadata.
-- This also triggers for newly placed gates.
local meta = minetest.get_meta(pos)
meta:set_int(link.name, newstate == "on" and 1 or 0)
local val1 = meta:get_int("input1") == 1
local val2 = meta:get_int("input2") == 1
if link.name == "input1" then
val1 = newstate == "on"
val2 = meta:get_int("input2") == 1
else
val1 = meta:get_int("input1") == 1
val2 = newstate == "on"
end
-- Set bit 5 so this won't happen again.
node.param2 = node.param2 + 32
-- Clear the metadata.
meta:set_string("input1", "")
meta:set_string("input2", "")
end
node.param2 = node.param2 % 64 + (val1 and 64 or 0) + (val2 and 128 or 0)
set_gate(pos, node, gate.assess(val1, val2))
end
end
@ -65,7 +81,6 @@ end
local function register_gate(name, inputnumber, assess, recipe, description)
local get_inputrules = inputnumber == 2 and gate_get_input_rules_twoinputs or
gate_get_input_rules_oneinput
description = "Logic Gate: "..name
local basename = "mesecons_gates:"..name
mesecon.register_node(basename, {
@ -79,12 +94,13 @@ local function register_gate(name, inputnumber, assess, recipe, description)
selection_box = selection_box,
node_box = nodebox,
walkable = true,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
assess = assess,
onstate = basename.."_on",
offstate = basename.."_off",
inputnumber = inputnumber,
after_dig_node = mesecon.do_cooldown,
on_rotate = mesecon.on_rotate_horiz,
},{
tiles = {
"jeija_microcontroller_bottom.png^".."jeija_gate_off.png^"..

View File

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

View File

@ -12,6 +12,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
"jeija_hydro_turbine_turbine_top_bottom_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",
is_ground_content = false,
wield_scale = {x=0.75, y=0.75, z=0.75},
@ -22,7 +23,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 },
},
sounds = default.node_sound_metal_defaults(),
sounds = mesecon.node_sound.metal,
mesecons = {receptor = {
state = mesecon.state.off
}},
@ -42,6 +43,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
{ name = "jeija_hydro_turbine_turbine_misc_on.png",
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",
drop = "mesecons_hydroturbine:hydro_turbine_off 1",
groups = {dig_immediate=2,not_in_creative_inventory=1},
@ -51,7 +53,7 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 },
},
sounds = default.node_sound_metal_defaults(),
sounds = mesecon.node_sound.metal,
mesecons = {receptor = {
state = mesecon.state.on
}},
@ -62,15 +64,15 @@ minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", {
local function is_flowing_water(pos)
local name = minetest.get_node(pos).name
local is_water = minetest.get_item_group(name, "water") > 0
local is_flowing = minetest.registered_items[name].liquidtype == "flowing"
return (is_water and is_flowing)
local def = minetest.registered_items[name]
return is_water and (def and def.liquidtype == "flowing")
end
minetest.register_abm({
nodenames = {"mesecons_hydroturbine:hydro_turbine_off"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
action = function(pos)
local waterpos={x=pos.x, y=pos.y+1, z=pos.z}
if is_flowing_water(waterpos) then
minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_on"})
@ -83,7 +85,7 @@ minetest.register_abm({
nodenames = {"mesecons_hydroturbine:hydro_turbine_on"},
interval = 1,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
action = function(pos)
local waterpos={x=pos.x, y=pos.y+1, z=pos.z}
if not is_flowing_water(waterpos) then
minetest.set_node(pos, {name="mesecons_hydroturbine:hydro_turbine_off"})
@ -95,9 +97,9 @@ nodenames = {"mesecons_hydroturbine:hydro_turbine_on"},
minetest.register_craft({
output = "mesecons_hydroturbine:hydro_turbine_off 2",
recipe = {
{"","default:stick", ""},
{"default:stick", "default:steel_ingot", "default:stick"},
{"","default:stick", ""},
{"","grup:stick", ""},
{"group:stick", "mesecons_gamecompat:steel_ingot", "group:stick"},
{"","group:stick", ""},
}
})

View File

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

View File

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

View File

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

View File

@ -9,9 +9,12 @@ local mesecon_lamp_box = {
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", {
drawtype = "nodebox",
tiles = {"jeija_meselamp_on.png"},
use_texture_alpha = use_texture_alpha,
paramtype = "light",
paramtype2 = "wallmounted",
is_ground_content = false,
@ -23,7 +26,7 @@ minetest.register_node("mesecons_lamp:lamp_on", {
selection_box = mesecon_lamp_box,
groups = {dig_immediate = 3,not_in_creative_inventory = 1, mesecon_effector_on = 1},
drop = "mesecons_lamp:lamp_off 1",
sounds = default.node_sound_glass_defaults(),
sounds = mesecon.node_sound.glass,
mesecons = {effector = {
action_off = function (pos, node)
minetest.swap_node(pos, {name = "mesecons_lamp:lamp_off", param2 = node.param2})
@ -36,6 +39,7 @@ minetest.register_node("mesecons_lamp:lamp_on", {
minetest.register_node("mesecons_lamp:lamp_off", {
drawtype = "nodebox",
tiles = {"jeija_meselamp_off.png"},
use_texture_alpha = use_texture_alpha,
inventory_image = "jeija_meselamp.png",
wield_image = "jeija_meselamp.png",
paramtype = "light",
@ -47,7 +51,7 @@ minetest.register_node("mesecons_lamp:lamp_off", {
selection_box = mesecon_lamp_box,
groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1},
description = "Mesecon Lamp",
sounds = default.node_sound_glass_defaults(),
sounds = mesecon.node_sound.glass,
mesecons = {effector = {
action_on = function (pos, node)
minetest.swap_node(pos, {name = "mesecons_lamp:lamp_on", param2 = node.param2})
@ -60,8 +64,8 @@ minetest.register_node("mesecons_lamp:lamp_off", {
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", ""},
{"", "mesecons_gamecompat:glass", ""},
{"group:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable"},
{"", "mesecons_gamecompat:glass", ""},
}
})

View File

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

View File

@ -23,7 +23,7 @@ function mesecon.lightstone_add(name, base_item, texture_off, texture_on, desc)
is_ground_content = false,
groups = {cracky = 2, mesecon_effector_off = 1, mesecon = 2},
description = desc,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
mesecons = {effector = {
rules = lightstone_rules,
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},
drop = "mesecons_lightstone:lightstone_" .. name .. "_off",
light_source = minetest.LIGHT_MAX - 2,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
mesecons = {effector = {
rules = lightstone_rules,
action_off = function (pos, node)
@ -52,22 +52,22 @@ function mesecon.lightstone_add(name, base_item, texture_off, texture_on, desc)
output = "mesecons_lightstone:lightstone_" .. name .. "_off",
recipe = {
{"",base_item,""},
{base_item,"default:torch",base_item},
{base_item,"mesecons_gamecompat:torch",base_item},
{"","group:mesecon_conductor_craftable",""}
}
})
end
mesecon.lightstone_add("red", "dye:red", "jeija_lightstone_red_off.png", "jeija_lightstone_red_on.png", "Red Lightstone")
mesecon.lightstone_add("green", "dye:green", "jeija_lightstone_green_off.png", "jeija_lightstone_green_on.png", "Green Lightstone")
mesecon.lightstone_add("blue", "dye:blue", "jeija_lightstone_blue_off.png", "jeija_lightstone_blue_on.png", "Blue Lightstone")
mesecon.lightstone_add("gray", "dye:grey", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png", "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", "dye:yellow", "jeija_lightstone_yellow_off.png", "jeija_lightstone_yellow_on.png", "Yellow Lightstone")
mesecon.lightstone_add("orange", "dye:orange", "jeija_lightstone_orange_off.png", "jeija_lightstone_orange_on.png", "Orange Lightstone")
mesecon.lightstone_add("white", "dye:white", "jeija_lightstone_white_off.png", "jeija_lightstone_white_on.png", "White Lightstone")
mesecon.lightstone_add("pink", "dye:pink", "jeija_lightstone_pink_off.png", "jeija_lightstone_pink_on.png", "Pink Lightstone")
mesecon.lightstone_add("magenta", "dye:magenta", "jeija_lightstone_magenta_off.png", "jeija_lightstone_magenta_on.png", "Magenta Lightstone")
mesecon.lightstone_add("cyan", "dye:cyan", "jeija_lightstone_cyan_off.png", "jeija_lightstone_cyan_on.png", "Cyan Lightstone")
mesecon.lightstone_add("violet", "dye:violet", "jeija_lightstone_violet_off.png", "jeija_lightstone_violet_on.png", "Violet Lightstone")
mesecon.lightstone_add("red", "mesecons_gamecompat: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("blue", "mesecons_gamecompat: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("darkgray", "mesecons_gamecompat: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("orange", "mesecons_gamecompat: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("pink", "mesecons_gamecompat: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("cyan", "mesecons_gamecompat: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")

View File

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

View File

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

View File

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

View File

@ -36,6 +36,6 @@ minetest.register_craft({
output = "mesecons_materials:silicon 4",
recipe = {
{"group:sand", "group:sand"},
{"group:sand", "default:steel_ingot"},
{"group:sand", "mesecons_gamecompat:steel_ingot"},
}
})

View File

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

View File

@ -44,9 +44,10 @@ local mesecons = {effector =
{
rules = input_rules,
action_change = function (pos, node, rulename, newstate)
yc.update_real_portstates(pos, node, rulename, newstate)
if yc.update_real_portstates(pos, node, rulename, newstate) then
yc.update(pos)
end
end
}}
if nodename ~= "mesecons_microcontroller:microcontroller0000" then
mesecons.receptor = {
@ -102,7 +103,7 @@ minetest.register_node(nodename, {
for i=1, EEPROM_SIZE+1 do r=r.."0" end --Generate a string with EEPROM_SIZE*"0"
meta:set_string("eeprom", r)
end,
on_receive_fields = function(pos, formanme, fields, sender)
on_receive_fields = function(pos, _, fields, sender)
local player_name = sender:get_player_name()
if minetest.is_protected(pos, player_name) and
not minetest.check_player_privs(player_name, {protection_bypass=true}) then
@ -139,7 +140,7 @@ minetest.register_node(nodename, {
yc.reset (pos)
yc.update(pos)
end,
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
mesecons = mesecons,
after_dig_node = function (pos, node)
rules = microc_rules[node.name]
@ -225,7 +226,6 @@ yc.parsecode = function(code, pos)
local Lreal = yc.get_real_portstates(pos)
local Lvirtual = yc.get_virtual_portstates(pos)
if Lvirtual == nil then return nil end
local c
local eeprom = meta:get_string("eeprom")
while true do
local command, params
@ -251,9 +251,9 @@ yc.parsecode = function(code, pos)
if not params then return nil end
end
if command == "on" then
L = yc.command_on (params, Lvirtual)
Lvirtual = yc.command_on (params, Lvirtual)
elseif command == "off" then
L = yc.command_off(params, Lvirtual)
Lvirtual = yc.command_off(params, Lvirtual)
elseif command == "print" then
local su = yc.command_print(params, eeprom, yc.merge_portstates(Lreal, Lvirtual))
if su ~= true then return nil end
@ -332,7 +332,8 @@ yc.parse_get_eeprom_param = function(cond, starti)
local addr
while s ~= "" do
s = string.sub(cond, i, i)
if string.find("0123456789", s) == nil or s == "" then
local b = s:byte()
if s == "" or 48 > b or b > 57 then
addr = string.sub(cond, starti, i-1) -- i: last number i+1 after last number
return addr, i
end
@ -384,7 +385,6 @@ end
--Commands
yc.command_on = function(params, L)
local rules = {}
for i, port in ipairs(params) do
L = yc.set_portstate (port, true, L)
end
@ -392,7 +392,6 @@ yc.command_on = function(params, L)
end
yc.command_off = function(params, L)
local rules = {}
for i, port in ipairs(params) do
L = yc.set_portstate (port, false, L)
end
@ -405,7 +404,7 @@ yc.command_print = function(params, eeprom, L)
if param:sub(1,1) == '"' and param:sub(#param, #param) == '"' then
s = s..param:sub(2, #param-1)
else
r = yc.command_parsecondition(param, L, eeprom)
local r = yc.command_parsecondition(param, L, eeprom)
if r == "1" or r == "0" then
s = s..r
else return nil end
@ -421,7 +420,9 @@ yc.command_sbi = function(params, eeprom, L, Lv)
if status == nil then return nil, nil end
if string.find("ABCD", params[1])~=nil and #params[1]==1 then --is a port
if #params[1]==1 then
local b = params[1]:byte()
if 65 <= b and b <= 68 then -- is a port
if status == "1" then
Lv = yc.set_portstate (params[1], true, Lv)
else
@ -429,6 +430,7 @@ yc.command_sbi = function(params, eeprom, L, Lv)
end
return eeprom, Lv;
end
end
--is an eeprom address
local new_eeprom = "";
@ -469,8 +471,8 @@ yc.command_after_execute = function(params)
if yc.parsecode(params.code, params.pos) == nil then
meta:set_string("infotext", "Code in after() not valid!")
else
if code ~= nil then
meta:set_string("infotext", "Working Microcontroller\n"..code)
if params.code ~= nil then
meta:set_string("infotext", "Working Microcontroller\n"..params.code)
else
meta:set_string("infotext", "Working Microcontroller")
end
@ -543,8 +545,8 @@ yc.command_parsecondition = function(cond, L, eeprom)
cond = string.gsub(cond, "!0", "1")
cond = string.gsub(cond, "!1", "0")
local i = 2
local l = string.len(cond)
i = 2
l = string.len(cond)
while i<=l do
local s = cond:sub(i,i)
local b = tonumber(cond:sub(i-1, i-1))
@ -553,8 +555,7 @@ yc.command_parsecondition = function(cond, L, eeprom)
if s == "=" then
if a==nil then return nil end
if b==nil then return nil end
if a == b then buf = "1" end
if a ~= b then buf = "0" end
local buf = a == b and "1" or "0"
cond = string.gsub(cond, b..s..a, buf)
i = 1
l = string.len(cond)
@ -562,8 +563,8 @@ yc.command_parsecondition = function(cond, L, eeprom)
i = i + 1
end
local i = 2
local l = string.len(cond)
i = 2
l = string.len(cond)
while i<=l do
local s = cond:sub(i,i)
local b = tonumber(cond:sub(i-1, i-1))
@ -659,13 +660,16 @@ yc.set_portstate = function(port, state, L)
return L
end
yc.update_real_portstates = function(pos, node, rulename, newstate)
-- Updates the real port states according to the signal change.
-- Returns whether the real port states actually changed.
yc.update_real_portstates = function(pos, _, rulename, newstate)
local meta = minetest.get_meta(pos)
if rulename == nil then
meta:set_int("real_portstates", 1)
return
return true
end
local n = meta:get_int("real_portstates") - 1
local real_portstates = meta:get_int("real_portstates")
local n = real_portstates - 1
local L = {}
for i = 1, 4 do
L[i] = n%2
@ -680,7 +684,12 @@ yc.update_real_portstates = function(pos, node, rulename, newstate)
local port = ({4, 1, nil, 3, 2})[rulename.x+2*rulename.z+3]
L[port] = (newstate == "on") and 1 or 0
end
meta:set_int("real_portstates", 1 + L[1] + 2*L[2] + 4*L[3] + 8*L[4])
local new_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
yc.get_real_portstates = function(pos) -- determine if ports are powered (by itself or from outside)
@ -696,7 +705,7 @@ end
yc.get_virtual_portstates = function(pos) -- portstates according to the name
local name = minetest.get_node(pos).name
local b, a = string.find(name, ":microcontroller")
local _, a = string.find(name, ":microcontroller")
if a == nil then return nil end
a = a + 1

View File

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

View File

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

View File

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

View File

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

View File

@ -3,12 +3,16 @@ minetest.register_node("mesecons_noteblock:noteblock", {
tiles = {"mesecons_noteblock.png"},
is_ground_content = false,
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
on_punch = function(pos, node) -- change sound when punched
on_punch = function(pos, node, puncher) -- 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
mesecon.noteblock_play(pos, node.param2)
minetest.set_node(pos, node)
end,
sounds = default.node_sound_wood_defaults(),
sounds = mesecon.node_sound.wood,
mesecons = {effector = { -- play sound when activated
action_on = function(pos, node)
mesecon.noteblock_play(pos, node.param2)
@ -21,7 +25,7 @@ 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:mesecon_conductor_craftable", "mesecons_gamecompat:steel_ingot", "group:mesecon_conductor_craftable"},
{"group:wood", "group:wood", "group:wood"},
}
})
@ -42,14 +46,20 @@ local soundnames = {
"mesecons_noteblock_c"
}
local node_sounds = {
["default:lava_source"] = "fire_fire",
["default:chest"] = "mesecons_noteblock_snare",
["default:chest_locked"] = "mesecons_noteblock_snare",
["default:coalblock"] = "tnt_explode",
["default:glass"] = "mesecons_noteblock_hihat",
["default:obsidian_glass"] = "mesecons_noteblock_hihat",
}
local node_sounds = {}
for alias, sound in pairs({
["mesecons_gamecompat:lava_source"] = mesecon.sound_name.fire,
["mesecons_gamecompat:chest"] = "mesecons_noteblock_snare",
["mesecons_gamecompat:chest_locked"] = "mesecons_noteblock_snare",
["mesecons_gamecompat:coalblock"] = mesecon.sound_name.explode,
["mesecons_gamecompat: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 = {
["stone"] = "mesecons_noteblock_kick",
@ -57,6 +67,7 @@ local node_sounds_group = {
["wood"] = "mesecons_noteblock_litecrash",
}
local steelblock_nodename = minetest.registered_aliases["mesecons_gamecompat:steelblock"]
mesecon.noteblock_play = function(pos, param2)
pos.y = pos.y-1
local nodeunder = minetest.get_node(pos).name
@ -76,7 +87,7 @@ mesecon.noteblock_play = function(pos, param2)
minetest.log("error", "[mesecons_noteblock] No soundname found, test param2")
return
end
if nodeunder == "default:steelblock" then
if nodeunder == steelblock_nodename then
soundname = soundname.. 2
end
end

View File

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

View File

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

View File

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

View File

@ -16,7 +16,7 @@ minetest.register_node("mesecons_powerplant:power_plant", {
type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},
},
sounds = default.node_sound_leaves_defaults(),
sounds = mesecon.node_sound.leaves,
mesecons = {receptor = {
state = mesecon.state.on
}},

View File

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

View File

@ -8,7 +8,7 @@ local pp_box_on = {
fixed = { -7/16, -8/16, -7/16, 7/16, -7.5/16, 7/16 },
}
local function pp_on_timer(pos, elapsed)
local function pp_on_timer(pos)
local node = minetest.get_node(pos)
local basename = minetest.registered_nodes[node.name].pressureplate_basename
@ -17,7 +17,6 @@ local function pp_on_timer(pos, elapsed)
if not basename then return end
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
minetest.set_node(pos, {name = basename .. "_off"})
@ -46,7 +45,6 @@ end
-- sounds: sound table
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
groups = {}
end
@ -96,7 +94,7 @@ mesecon.register_pressure_plate(
"jeija_pressure_plate_wood_inv.png",
{{"group:wood", "group:wood"}},
{ choppy = 3, oddly_breakable_by_hand = 3 },
default.node_sound_wood_defaults())
mesecon.node_sound.wood)
mesecon.register_pressure_plate(
"mesecons_pressureplates:pressure_plate_stone",
@ -105,6 +103,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_wield.png",
"jeija_pressure_plate_stone_inv.png",
{{"default:cobble", "default:cobble"}},
{{"mesecons_gamecompat:cobble", "mesecons_gamecompat:cobble"}},
{ cracky = 3, oddly_breakable_by_hand = 3 },
default.node_sound_stone_defaults())
mesecon.node_sound.stone)

View File

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

View File

@ -6,7 +6,7 @@ minetest.register_node("mesecons_random:removestone", {
inventory_image = minetest.inventorycube("jeija_removestone_inv.png"),
groups = {cracky=3},
description="Removestone",
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
mesecons = {effector = {
action_on = function (pos, node)
minetest.remove_node(pos)
@ -20,9 +20,9 @@ minetest.register_node("mesecons_random:removestone", {
minetest.register_craft({
output = 'mesecons_random:removestone 4',
recipe = {
{"", "default:cobble", ""},
{"default:cobble", "group:mesecon_conductor_craftable", "default:cobble"},
{"", "default:cobble", ""},
{"", "mesecons_gamecompat:cobble", ""},
{"mesecons_gamecompat:cobble", "group:mesecon_conductor_craftable", "mesecons_gamecompat:cobble"},
{"", "mesecons_gamecompat:cobble", ""},
}
})
@ -34,7 +34,7 @@ minetest.register_node("mesecons_random:ghoststone", {
is_ground_content = false,
inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"),
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
sounds = mesecon.node_sound.stone,
mesecons = {conductor = {
state = mesecon.state.off,
rules = mesecon.rules.alldirs,
@ -59,7 +59,7 @@ minetest.register_node("mesecons_random:ghoststone_active", {
}},
on_construct = function(pos)
-- remove shadow
shadowpos = vector.add(pos, vector.new(0, 1, 0))
local shadowpos = vector.add(pos, vector.new(0, 1, 0))
if (minetest.get_node(shadowpos).name == "air") then
minetest.dig_node(shadowpos)
end
@ -71,8 +71,8 @@ minetest.register_node("mesecons_random:ghoststone_active", {
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"},
{"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:cobble", "mesecons_gamecompat:steel_ingot"},
{"mesecons_gamecompat:cobble", "group:mesecon_conductor_craftable", "mesecons_gamecompat:cobble"},
{"mesecons_gamecompat:steel_ingot", "mesecons_gamecompat:cobble", "mesecons_gamecompat:steel_ingot"},
}
})

View File

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

View File

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

View File

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

View File

@ -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_side = {-8/16, -7/16, -7/16, -7/16, 7/16, 7/16},
},
sounds = default.node_sound_glass_defaults(),
sounds = mesecon.node_sound.glass,
on_blast = mesecon.on_blastnode,
},{
groups = {dig_immediate = 3},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -27,9 +27,13 @@ local torch_get_output_rules = function(node)
return rotate_torch_rules(rules, node.param2)
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 rules = {{x = -2, y = 0, z = 0},
{x = -1, y = 1, z = 0}}
local rules = (node.param2 == 0 or node.param2 == 1)
and torch_input_rules_unrotated_vertical
or torch_input_rules_unrotated_horizontal
return rotate_torch_rules(rules, node.param2)
end
@ -38,7 +42,7 @@ minetest.register_craft({
output = "mesecons_torch:mesecon_torch_on 4",
recipe = {
{"group:mesecon_conductor_craftable"},
{"default:stick"},}
{"group:stick"},}
})
local torch_selectionbox =
@ -60,7 +64,7 @@ minetest.register_node("mesecons_torch:mesecon_torch_off", {
selection_box = torch_selectionbox,
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons_torch:mesecon_torch_on",
sounds = default.node_sound_defaults(),
sounds = mesecon.node_sound.default,
mesecons = {receptor = {
state = mesecon.state.off,
rules = torch_get_output_rules
@ -82,7 +86,7 @@ minetest.register_node("mesecons_torch:mesecon_torch_on", {
groups = {dig_immediate=3},
light_source = minetest.LIGHT_MAX-5,
description="Mesecon Torch",
sounds = default.node_sound_defaults(),
sounds = mesecon.node_sound.default,
mesecons = {receptor = {
state = mesecon.state.on,
rules = torch_get_output_rules

View File

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

View File

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

View File

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

View File

@ -14,7 +14,7 @@ local wire_getconnect = function (from_pos, self_pos)
if minetest.registered_nodes[node.name]
and minetest.registered_nodes[node.name].mesecons then
-- rules of node to possibly connect to
local rules = {}
local rules
if (minetest.registered_nodes[node.name].mesecon_wire) then
rules = mesecon.rules.default
else
@ -73,7 +73,7 @@ local update_on_place_dig = function (pos, node)
end
-- Update nodes around it
local rules = {}
local rules
if minetest.registered_nodes[node.name]
and minetest.registered_nodes[node.name].mesecon_wire then
rules = mesecon.rules.default
@ -195,10 +195,11 @@ local function register_wires()
}}
local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1,
not_in_creative_inventory = 1}
not_in_creative_inventory = 1, not_in_craft_guide = 1}
local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1}
if nodeid ~= "00000000" then
groups_off["not_in_creative_inventory"] = 1
groups_off["not_in_craft_guide"] = 1
end
mesecon.register_node(":mesecons:wire_"..nodeid, {
@ -215,7 +216,7 @@ local function register_wires()
walkable = false,
drop = "mesecons:wire_00000000_off",
mesecon_wire = true,
sounds = default.node_sound_defaults(),
sounds = mesecon.node_sound.default,
on_rotate = false,
}, {tiles = tiles_off, mesecons = meseconspec_off, groups = groups_off},
{tiles = tiles_on, mesecons = meseconspec_on, groups = groups_on})
@ -228,23 +229,31 @@ register_wires()
-- ##############
-- ## Crafting ##
-- ##############
minetest.register_craft({
-- (Resolve aliases to avoid bug with cooking/fuel recipes.)
if minetest.registered_aliases["mesecons_gamecompat:mese_crystal_fragment"] then
minetest.register_craft({
type = "cooking",
output = "mesecons:wire_00000000_off 2",
recipe = "default:mese_crystal_fragment",
recipe = minetest.registered_aliases["mesecons_gamecompat:mese_crystal_fragment"],
cooktime = 3,
})
})
end
minetest.register_craft({
if minetest.registered_aliases["mesecons_gamecompat:mese_crystal"] then
minetest.register_craft({
type = "cooking",
output = "mesecons:wire_00000000_off 18",
recipe = "default:mese_crystal",
recipe = minetest.registered_aliases["mesecons_gamecompat:mese_crystal"],
cooktime = 15,
})
})
end
minetest.register_craft({
if minetest.registered_aliases["mesecons_gamecompat:mese"] then
minetest.register_craft({
type = "cooking",
output = "mesecons:wire_00000000_off 162",
recipe = "default:mese",
recipe = minetest.registered_aliases["mesecons_gamecompat:mese"],
cooktime = 30,
})
})
end

View File

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