Merge remote-tracking branch 'upstream/master'

This commit is contained in:
bri cassa 2024-09-15 09:20:32 +02:00
commit 2d973fb77b
100 changed files with 625 additions and 220 deletions

View File

@ -1,10 +1,10 @@
on: [push, pull_request] on: [push, pull_request]
name: Check & Release name: "Check"
jobs: jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: "Luacheck"
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: apt - name: apt
@ -14,9 +14,9 @@ jobs:
- name: luacheck run - name: luacheck run
run: $HOME/.luarocks/bin/luacheck ./ run: $HOME/.luarocks/bin/luacheck ./
test: mineunit:
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: "Mineunit tests"
steps: steps:
- uses: actions/checkout@main - uses: actions/checkout@main
- name: apt - name: apt

26
.github/workflows/test.yml vendored Normal file
View File

@ -0,0 +1,26 @@
on: [push, pull_request]
name: "Test"
jobs:
test:
name: "Smoke Test ${{ matrix.cfg.image }}"
runs-on: ubuntu-latest
timeout-minutes: 5
strategy:
matrix:
cfg:
- { image: 'registry.gitlab.com/minetest/minetest/server:5.0.1', mtg: false }
- { image: 'ghcr.io/minetest/minetest:5.9.0', mtg: true }
steps:
- uses: actions/checkout@main
- uses: actions/checkout@main
with:
repository: 'minetest/minetest_game'
path: ./.test/minetest_game
if: ${{ matrix.cfg.mtg }}
- name: Run tests
run: ./.test/run.sh
env:
DOCKER_IMAGE: "${{ matrix.cfg.image }}"

View File

@ -27,6 +27,8 @@ read_globals = {
"table.insert_all", "table.insert_all",
"vector", "vector",
"VoxelArea", "VoxelArea",
"mcl_dyes",
"mcl_sounds",
} }
globals = {"mesecon"} globals = {"mesecon"}

3
.test/minetest.conf Normal file
View File

@ -0,0 +1,3 @@
mg_name = singlenode
mesecon.internal_test = true
random_mod_load_order = true

31
.test/run.sh Executable file
View File

@ -0,0 +1,31 @@
#!/bin/bash
tempdir=$(mktemp -d)
confpath=$tempdir/minetest.conf
worldpath=$tempdir/world
trap 'rm -rf "$tempdir" || :' EXIT
[ -f mesecons/mod.conf ] || { echo "Must be run in modpack root folder." >&2; exit 1; }
command -v docker >/dev/null || { echo "Docker is not installed." >&2; exit 1; }
mtg=.test/minetest_game
[ -d $mtg ] || echo "A source checkout of minetest_game was not found. This can fail if your docker image does not ship a game." >&2
mkdir "$worldpath"
cp -v .test/minetest.conf "$confpath"
chmod -R 777 "$tempdir"
args=(
-v "$confpath":/etc/minetest/minetest.conf
-v "$tempdir":/var/lib/minetest/.minetest
-v "$PWD":/var/lib/minetest/.minetest/world/worldmods/mesecons
)
[ -d $mtg ] && args+=(
-v "$(realpath $mtg)":/var/lib/minetest/.minetest/games/minetest_game
)
args+=("$DOCKER_IMAGE")
[ -d $mtg ] && args+=(--gameid minetest)
docker run --rm -i "${args[@]}"
ls -la "$worldpath"
test -f "$worldpath/mesecon_actionqueue" || exit 1
exit 0

View File

@ -12,6 +12,7 @@ MESECONS by Jeija and contributors
Mezzee-what? Mezzee-what?
------------ ------------
[Mesecons](https://mesecons.net/)! They're yellow, they're conductive, and they'll add a whole new dimension to Minetest's gameplay. [Mesecons](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](https://www.minetest.net/) that implements a ton of items related to digital circuitry, such as wires, buttons, lights, and even programmable controllers. Among other things, there are also pistons, solar panels, pressure plates, and note blocks. Mesecons is a mod for [Minetest](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.
@ -20,15 +21,18 @@ Mesecons has a similar goal to Redstone in Minecraft, but works in its own way,
OK, I want in. OK, I want in.
-------------- --------------
Go get it! Go get it!
[DOWNLOAD IT NOW](https://github.com/minetest-mods/mesecons/archive/master.zip) [![ContentDB](https://content.minetest.net/packages/Jeija/mesecons/shields/downloads/)](https://content.minetest.net/packages/Jeija/mesecons/)
Now go ahead and install it like any other Minetest mod. Don't know how? Check out [the wonderful page about it](https://wiki.minetest.net/Mods) over at the official Minetest Wiki. For your convenience, here's a quick summary: Install it directly from your client by searching it in the Online Content tab.
**Or** if you've downloaded a ZIP file check out [this page](https://wiki.minetest.net/Mods) over at the official Minetest Wiki. For your convenience, here's a quick summary:
1. If Mesecons is still in a ZIP file, extract the folder inside to somewhere on the computer. 1. If Mesecons is still in a ZIP file, extract the folder inside to somewhere on the computer.
2. Make sure that when you open the folder, you can directly find `README.md` in the listing. If you just see another folder, move that folder up one level and delete the old one. 2. Make sure that when you open the folder, you can directly find `README.md` in the listing. If you just see another folder, move that folder up one level and delete the old one.
3. Open up the Minetest mods folder - usually `/mods/`. If you see the `minetest` or folder inside of that, that is your mod folder instead. 3. Open up the Minetest mods folder - called `mods`.
4. Copy the Mesecons folder into the mods folder. 4. Copy the Mesecons folder into the mods folder.
Don't like some parts of Mesecons? Open up the Mesecons folder and delete the subfolder containing the mod you don't want. If you didn't want movestones, for example, all you have to do is delete the `mesecons_movestones` folder and they will no longer be available. Don't like some parts of Mesecons? Open up the Mesecons folder and delete the subfolder containing the mod you don't want. If you didn't want movestones, for example, all you have to do is delete the `mesecons_movestones` folder and they will no longer be available.
@ -37,21 +41,21 @@ There are no dependencies - it will work right after installing!
How do I use this thing? How do I use this thing?
------------------------ ------------------------
How about a [quick overview video](https://www.youtube.com/watch?v=6kmeQj6iW5k)? How about a [quick overview video](https://www.youtube.com/watch?v=6kmeQj6iW5k)?
Or maybe a [comprehensive reference](http://mesecons.net/items.html) is your style? Or maybe a [comprehensive reference](https://mesecons.net/items.html) is your style?
An overview for the very newest of new beginners? How does [this one](http://uberi.mesecons.net/projects/MeseconsBasics/index.html) look? An overview for the very newest of new beginners? How does [this one](https://uberi.mesecons.net/projects/MeseconsBasics/index.html) look?
There is also a [wiki page](https://wiki.minetest.net/Mods/Mesecons) dedicated to this mod. Want to get more into building? Why not check out the [Mesecons Laboratory](https://uberi.mesecons.net/), a website dedicated to advanced Mesecons builders?
Want to get more into building? Why not check out the [Mesecons Laboratory](http://uberi.mesecons.net/), a website dedicated to advanced Mesecons builders?
Want to contribute to Mesecons itself? Check out the [source code](https://github.com/minetest-mods/mesecons)! Want to contribute to Mesecons itself? Check out the [source code](https://github.com/minetest-mods/mesecons)!
Who wrote it anyways? Who wrote it anyways?
--------------------- ---------------------
These awesome people made Mesecons possible!
These awesome people made Mesecons possible! (as of 2016)
| Contributor | Contribution | | Contributor | Contribution |
| --------------- | -------------------------------- | | --------------- | -------------------------------- |
@ -72,8 +76,11 @@ These awesome people made Mesecons possible!
There are also a whole bunch of other people helping with everything from code to testing and feedback. Mesecons would also not be possible without their help! There are also a whole bunch of other people helping with everything from code to testing and feedback. Mesecons would also not be possible without their help!
Check out the [entire contributor list](https://github.com/minetest-mods/mesecons/graphs/contributors) on GitHub.
Alright, how can I use it? Alright, how can I use it?
-------------------------- --------------------------
All textures in this project are licensed under the CC-BY-SA 3.0 (Creative Commons Attribution-ShareAlike 3.0 Generic). All textures in this project are licensed under the CC-BY-SA 3.0 (Creative Commons Attribution-ShareAlike 3.0 Generic).
That means you can distribute and remix them as much as you want to, under the condition that you give credit to the authors and the project, and that if you remix and release them, they must be under the same or similar license to this one. That means you can distribute and remix them as much as you want to, under the condition that you give credit to the authors and the project, and that if you remix and release them, they must be under the same or similar license to this one.

View File

@ -42,6 +42,7 @@
}, },
"Logic" : { "Logic" : {
"Luacontroller" : "mesecons_luacontroller/doc/luacontroller", "Luacontroller" : "mesecons_luacontroller/doc/luacontroller",
"Microcontroller" : "mesecons_microcontroller/doc/microcontroler",
"FPGA" : "mesecons_fpga/doc/fpga", "FPGA" : "mesecons_fpga/doc/fpga",
"FPGA Programmer" : "mesecons_fpga/doc/programmer", "FPGA Programmer" : "mesecons_fpga/doc/programmer",
"Torch" : "mesecons_torch/doc/torch", "Torch" : "mesecons_torch/doc/torch",

View File

@ -70,7 +70,17 @@ end
-- However, even that does not work in some cases, that's why we delay the time the globalsteps -- However, even that does not work in some cases, that's why we delay the time the globalsteps
-- start to be execute by 4 seconds -- start to be execute by 4 seconds
local m_time = 0
local resumetime = mesecon.setting("resumetime", 4)
local function globalstep_func(dtime) local function globalstep_func(dtime)
-- don't even try if server has not been running for XY seconds; resumetime = time to wait
-- after starting the server before processing the ActionQueue, don't set this too low
if m_time < resumetime then
m_time = m_time + dtime
return
end
local actions = queue.actions local actions = queue.actions
-- split into two categories: -- split into two categories:
-- actions_now: actions to execute now -- actions_now: actions to execute now
@ -112,23 +122,7 @@ local function globalstep_func(dtime)
end end
end end
-- delay the time the globalsteps start to be execute by 4 seconds minetest.register_globalstep(globalstep_func)
do
local m_time = 0
local resumetime = mesecon.setting("resumetime", 4)
local globalstep_func_index = #minetest.registered_globalsteps + 1
minetest.register_globalstep(function(dtime)
m_time = m_time + dtime
-- don't even try if server has not been running for XY seconds; resumetime = time to wait
-- after starting the server before processing the ActionQueue, don't set this too low
if m_time < resumetime then
return
end
-- replace this globalstep function
minetest.registered_globalsteps[globalstep_func_index] = globalstep_func
end)
end
function queue:execute(action) function queue:execute(action)
-- ignore if action queue function name doesn't exist, -- ignore if action queue function name doesn't exist,

View File

@ -123,3 +123,11 @@ dofile(minetest.get_modpath("mesecons").."/legacy.lua");
--Services like turnoff receptor on dignode and so on --Services like turnoff receptor on dignode and so on
dofile(minetest.get_modpath("mesecons").."/services.lua"); dofile(minetest.get_modpath("mesecons").."/services.lua");
-- Automated test run
if mesecon.setting("internal_test", false) then
-- currently does nothing, we only fail if some error happens right on startup
minetest.after(5, function()
minetest.request_shutdown()
end)
end

View File

@ -51,27 +51,18 @@ mesecon.fifo_queue = dofile(minetest.get_modpath("mesecons").."/fifo_queue.lua")
-- General -- General
function mesecon.get_effector(nodename) function mesecon.get_effector(nodename)
if minetest.registered_nodes[nodename] local def = minetest.registered_nodes[nodename]
and minetest.registered_nodes[nodename].mesecons return def and def.mesecons and def.mesecons.effector
and minetest.registered_nodes[nodename].mesecons.effector then
return minetest.registered_nodes[nodename].mesecons.effector
end
end end
function mesecon.get_receptor(nodename) function mesecon.get_receptor(nodename)
if minetest.registered_nodes[nodename] local def = minetest.registered_nodes[nodename]
and minetest.registered_nodes[nodename].mesecons return def and def.mesecons and def.mesecons.receptor
and minetest.registered_nodes[nodename].mesecons.receptor then
return minetest.registered_nodes[nodename].mesecons.receptor
end
end end
function mesecon.get_conductor(nodename) function mesecon.get_conductor(nodename)
if minetest.registered_nodes[nodename] local def = minetest.registered_nodes[nodename]
and minetest.registered_nodes[nodename].mesecons return def and def.mesecons and def.mesecons.conductor
and minetest.registered_nodes[nodename].mesecons.conductor then
return minetest.registered_nodes[nodename].mesecons.conductor
end
end end
function mesecon.get_any_outputrules(node) function mesecon.get_any_outputrules(node)

View File

@ -0,0 +1,4 @@
# textdomain: mesecons
### oldwires.lua ###
Mesecons=Mesecons

View File

Before

Width:  |  Height:  |  Size: 844 B

After

Width:  |  Height:  |  Size: 844 B

View File

Before

Width:  |  Height:  |  Size: 838 B

After

Width:  |  Height:  |  Size: 838 B

View File

Before

Width:  |  Height:  |  Size: 851 B

After

Width:  |  Height:  |  Size: 851 B

View File

Before

Width:  |  Height:  |  Size: 846 B

After

Width:  |  Height:  |  Size: 846 B

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_blinkyplant
### init.lua ###
Blinky Plant=Plante clignotante

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_button
### init.lua ###
Button=Bouton

View File

@ -0,0 +1,7 @@
# textdomain: mesecons_commandblock
### init.lua ###
Say <text> as the server=Dire <text> au serveur
Say <text> to <name> privately=Dire <text> à <name> en privé
Set health of <name> to <value> hitpoints=Définir la vie de <name> sur <value> cœurs
Command Block=Bloc de commandes

View File

@ -27,20 +27,6 @@ local delaytime = { 0.1, 0.3, 0.5, 1.0 }
for i = 1, 4 do for i = 1, 4 do
local boxes = {
{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab
{ -2/16, -7/16, -4/16, 2/16, -26/64, -3/16 }, -- the jeweled "on" indicator
{ -3/16, -7/16, -3/16, 3/16, -26/64, -2/16 },
{ -4/16, -7/16, -2/16, 4/16, -26/64, 2/16 },
{ -3/16, -7/16, 2/16, 3/16, -26/64, 3/16 },
{ -2/16, -7/16, 3/16, 2/16, -26/64, 4/16 },
{ -6/16, -7/16, -6/16, -4/16, -27/64, -4/16 }, -- the timer indicator
{ -8/16, -8/16, -1/16, -6/16, -7/16, 1/16 }, -- the two wire stubs
{ 6/16, -8/16, -1/16, 8/16, -7/16, 1/16 }
}
-- Delayer definition defaults -- Delayer definition defaults
local def = { local def = {
drawtype = "nodebox", drawtype = "nodebox",
@ -48,11 +34,14 @@ local def = {
walkable = true, walkable = true,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, fixed = { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 },
}, },
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = boxes fixed = {
{ -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, -- bottom slab
{ -6/16, -7/16, -6/16, 6/16, -6/16, 6/16 }
},
}, },
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
@ -62,6 +51,8 @@ local def = {
sounds = mesecon.node_sound.stone, sounds = mesecon.node_sound.stone,
on_blast = mesecon.on_blastnode, on_blast = mesecon.on_blastnode,
drop = "mesecons_delayer:delayer_off_1", drop = "mesecons_delayer:delayer_off_1",
delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i),
delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i),
} }
-- Deactivated delayer definition defaults -- Deactivated delayer definition defaults
@ -72,16 +63,17 @@ end
local off_state = { local off_state = {
description = S("Delayer"), description = S("Delayer"),
inventory_image = "jeija_gate_off.png^jeija_delayer.png",
wield_image = "jeija_gate_off.png^jeija_delayer.png",
tiles = { tiles = {
"mesecons_delayer_off_"..tostring(i)..".png", "jeija_microcontroller_bottom.png^jeija_gate_output_off.png^jeija_gate_off.png^"..
"mesecons_delayer_bottom.png", "jeija_delayer.png^mesecons_delayer_"..tostring(i)..".png",
"mesecons_delayer_ends_off.png", "jeija_microcontroller_bottom.png^jeija_gate_output_off.png",
"mesecons_delayer_ends_off.png", "jeija_gate_side.png^jeija_gate_side_output_off.png",
"mesecons_delayer_sides_off.png", "jeija_gate_side.png",
"mesecons_delayer_sides_off.png" "jeija_gate_side.png",
"jeija_gate_side.png",
}, },
inventory_image = "mesecons_delayer_off_1.png",
wield_image = "mesecons_delayer_off_1.png",
groups = off_groups, groups = off_groups,
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then if minetest.is_protected(pos, puncher and puncher:get_player_name() or "") then
@ -93,7 +85,6 @@ local off_state = {
param2 = node.param2 param2 = node.param2
}) })
end, end,
delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i),
mesecons = { mesecons = {
receptor = receptor =
{ {
@ -103,6 +94,7 @@ local off_state = {
effector = effector =
{ {
rules = delayer_get_input_rules, rules = delayer_get_input_rules,
action_off = delayer_deactivate,
action_on = delayer_activate action_on = delayer_activate
} }
}, },
@ -115,13 +107,16 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), off_state)
-- Activated delayer definition defaults -- Activated delayer definition defaults
local on_state = { local on_state = {
description = S("You hacker you"), description = S("You hacker you"),
inventory_image = "jeija_gate_on.png^jeija_delayer.png",
wield_image = "jeija_gate_on.png^jeija_delayer.png",
tiles = { tiles = {
"mesecons_delayer_on_"..tostring(i)..".png", "jeija_microcontroller_bottom.png^jeija_gate_output_on.png^jeija_gate_on.png^"..
"mesecons_delayer_bottom.png", "jeija_delayer.png^mesecons_delayer_"..tostring(i)..".png",
"mesecons_delayer_ends_on.png", "jeija_microcontroller_bottom.png^jeija_gate_output_on.png",
"mesecons_delayer_ends_on.png", "jeija_gate_side.png^jeija_gate_side_output_on.png",
"mesecons_delayer_sides_on.png", "jeija_gate_side.png",
"mesecons_delayer_sides_on.png" "jeija_gate_side.png",
"jeija_gate_side.png",
}, },
groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1}, groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1},
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
@ -134,7 +129,6 @@ local on_state = {
param2 = node.param2 param2 = node.param2
}) })
end, end,
delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i),
mesecons = { mesecons = {
receptor = receptor =
{ {
@ -144,7 +138,8 @@ local on_state = {
effector = effector =
{ {
rules = delayer_get_input_rules, rules = delayer_get_input_rules,
action_off = delayer_deactivate action_off = delayer_deactivate,
action_on = delayer_activate
} }
}, },
} }

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_delayer
### init.lua ###
Delayer=Retardateur
You hacker you=Vous êtes un pirate informatique

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

View File

Before

Width:  |  Height:  |  Size: 84 B

After

Width:  |  Height:  |  Size: 84 B

View File

Before

Width:  |  Height:  |  Size: 84 B

After

Width:  |  Height:  |  Size: 84 B

View File

Before

Width:  |  Height:  |  Size: 98 B

After

Width:  |  Height:  |  Size: 98 B

View File

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 99 B

View File

Before

Width:  |  Height:  |  Size: 136 B

After

Width:  |  Height:  |  Size: 136 B

View File

Before

Width:  |  Height:  |  Size: 109 B

After

Width:  |  Height:  |  Size: 109 B

View File

Before

Width:  |  Height:  |  Size: 110 B

After

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 538 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 B

View File

@ -4,6 +4,16 @@ local side_texture = mesecon.texture.steel_block or "mesecons_detector_side.png"
local GET_COMMAND = "GET" local GET_COMMAND = "GET"
local function comma_list_to_table(comma_list)
local tbl = {}
for _, str in ipairs(string.split(comma_list:gsub("%s", ""), ",")) do
tbl[str] = true
end
return tbl
end
-- Object detector -- Object detector
-- Detects players in a certain radius -- Detects players in a certain radius
-- The radius can be specified in mesecons/settings.lua -- The radius can be specified in mesecons/settings.lua
@ -35,10 +45,7 @@ local function object_detector_scan(pos)
if next(objs) == nil then return false end if next(objs) == nil then return false end
local scanname = minetest.get_meta(pos):get_string("scanname") local scanname = minetest.get_meta(pos):get_string("scanname")
local scan_for = {} local scan_for = comma_list_to_table(scanname)
for _, str in pairs(string.split(scanname:gsub(" ", ""), ",")) do
scan_for[str] = true
end
local every_player = scanname == "" local every_player = scanname == ""
for _, obj in pairs(objs) do for _, obj in pairs(objs) do
@ -188,8 +195,9 @@ local function node_detector_scan(pos)
vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1)) vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1))
).name ).name
local scanname = meta:get_string("scanname") local scanname = meta:get_string("scanname")
local scan_for = comma_list_to_table(scanname)
return (frontname == scanname) or return (scan_for[frontname]) or
(frontname ~= "air" and frontname ~= "ignore" and scanname == "") (frontname ~= "air" and frontname ~= "ignore" and scanname == "")
end end
@ -215,10 +223,10 @@ local node_detector_digiline = {
if type(msg) == "table" then if type(msg) == "table" then
if msg.distance or msg.scanname then if msg.distance or msg.scanname then
if msg.distance then if type(msg.distance) == "number" or type(msg.distance) == "string" then
meta:set_string("distance", msg.distance) meta:set_string("distance", msg.distance)
end end
if msg.scanname then if type(msg.scanname) == "string" then
meta:set_string("scanname", msg.scanname) meta:set_string("scanname", msg.scanname)
end end
node_detector_make_formspec(pos) node_detector_make_formspec(pos)
@ -232,7 +240,7 @@ local node_detector_digiline = {
else else
if msg == GET_COMMAND then if msg == GET_COMMAND then
node_detector_send_node_name(pos, node, channel, meta) node_detector_send_node_name(pos, node, channel, meta)
else elseif type(msg) == "string" then
meta:set_string("scanname", msg) meta:set_string("scanname", msg)
node_detector_make_formspec(pos) node_detector_make_formspec(pos)
end end

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_detector
### init.lua ###
Player Detector=Détecteur de joueur
Node Detector=Détecteur de bloc

View File

@ -73,29 +73,34 @@ local function meseconify_door(name)
end end
end end
meseconify_door("doors:door_wood") local doors_list = {
meseconify_door("doors:door_steel") "doors:door_wood",
meseconify_door("doors:door_glass") "doors:door_steel",
meseconify_door("doors:door_obsidian_glass") "doors:door_glass",
meseconify_door("xpanes:door_steel_bar") "doors:door_obsidian_glass",
"xpanes:door_steel_bar",
}
for i=1,#doors_list do meseconify_door(doors_list[i]) end
-- Trapdoor -- Trapdoor
local function trapdoor_switch(pos, node) local function trapdoor_switch(name)
return function(pos, node)
local state = minetest.get_meta(pos):get_int("state") local state = minetest.get_meta(pos):get_int("state")
if state == 1 then if state == 1 then
minetest.sound_play("doors_door_close", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true) minetest.sound_play("doors_door_close", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true)
minetest.set_node(pos, {name="doors:trapdoor", param2 = node.param2}) minetest.set_node(pos, {name=name, param2 = node.param2})
else else
minetest.sound_play("doors_door_open", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true) minetest.sound_play("doors_door_open", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true)
minetest.set_node(pos, {name="doors:trapdoor_open", param2 = node.param2}) minetest.set_node(pos, {name=name.."_open", param2 = node.param2})
end end
minetest.get_meta(pos):set_int("state", state == 1 and 0 or 1) minetest.get_meta(pos):set_int("state", state == 1 and 0 or 1)
end
end end
if doors and doors.get then local function meseconify_trapdoor(name)
local override = { local override
if doors and doors.get then
override = {
mesecons = {effector = { mesecons = {effector = {
action_on = function(pos) action_on = function(pos)
local door = doors.get(pos) local door = doors.get(pos)
@ -111,30 +116,24 @@ if doors and doors.get then
end, end,
}}, }},
} }
minetest.override_item("doors:trapdoor", override) else
minetest.override_item("doors:trapdoor_open", override) override = {
minetest.override_item("doors:trapdoor_steel", override) mesecons = {effector = {
minetest.override_item("doors:trapdoor_steel_open", override) action_on = trapdoor_switch(name),
action_off = trapdoor_switch(name)
if minetest.registered_items["xpanes:trapdoor_steel_bar"] then }},
minetest.override_item("xpanes:trapdoor_steel_bar", override) }
minetest.override_item("xpanes:trapdoor_steel_bar_open", override)
end end
else if minetest.registered_items[name] then
if minetest.registered_nodes["doors:trapdoor"] then minetest.override_item(name, override)
minetest.override_item("doors:trapdoor", { minetest.override_item(name.."_open", override)
mesecons = {effector = {
action_on = trapdoor_switch,
action_off = trapdoor_switch
}},
})
minetest.override_item("doors:trapdoor_open", {
mesecons = {effector = {
action_on = trapdoor_switch,
action_off = trapdoor_switch
}},
})
end end
end end
local trapdoors_list = {
"doors:trapdoor",
"doors:trapdoor_steel",
"xpanes:trapdoor_steel_bar"
}
for i=1,#trapdoors_list do meseconify_trapdoor(trapdoors_list[i]) end

View File

@ -0,0 +1,20 @@
# textdomain: mesecons_extrawires
### corner.lua ###
Insulated Mesecon Corner=Coin de Mesecon isolé
### crossover.lua ###
Insulated Mesecon Crossover=Croisement de Mesecon isolé
You hacker you!=Vous êtes un pirate informatique !
### doublecorner.lua ###
Insulated Mesecon Double Corner=Double coin de Mesecon isolé
### mesewire.lua ###
Mese Wire=Câble de Mesecon
### tjunction.lua ###
Insulated Mesecon T-junction=Croisement en T de Mesecon isolé
### vertical.lua ###
Vertical Mesecon=Mesecon vertical

View File

@ -40,17 +40,22 @@ local bottom_rules = {
{x=0, y=2, z=0} -- receive power from pressure plate / detector / ... 2 nodes above {x=0, y=2, z=0} -- receive power from pressure plate / detector / ... 2 nodes above
} }
local function is_vertical_conductor(nodename)
local def = minetest.registered_nodes[nodename]
return def and def.is_vertical_conductor
end
local vertical_updatepos = function (pos) local vertical_updatepos = function (pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if minetest.registered_nodes[node.name] if not is_vertical_conductor(node.name) then
and minetest.registered_nodes[node.name].is_vertical_conductor then return
end
local node_above = minetest.get_node(vector.add(pos, vertical_rules[1])) local node_above = minetest.get_node(vector.add(pos, vertical_rules[1]))
local node_below = minetest.get_node(vector.add(pos, vertical_rules[2])) local node_below = minetest.get_node(vector.add(pos, vertical_rules[2]))
local above = minetest.registered_nodes[node_above.name] local above = is_vertical_conductor(node_above.name)
and minetest.registered_nodes[node_above.name].is_vertical_conductor local below = is_vertical_conductor(node_below.name)
local below = minetest.registered_nodes[node_below.name]
and minetest.registered_nodes[node_below.name].is_vertical_conductor
mesecon.on_dignode(pos, node) mesecon.on_dignode(pos, node)
@ -68,7 +73,6 @@ local vertical_updatepos = function (pos)
minetest.set_node(pos, {name = newname}) minetest.set_node(pos, {name = newname})
mesecon.on_placenode(pos, {name = newname}) mesecon.on_placenode(pos, {name = newname})
end
end end
local vertical_update = function (pos) local vertical_update = function (pos)

View File

@ -20,10 +20,10 @@ plg.register_nodes = function(template)
-- build top texture string -- build top texture string
local texture = "jeija_fpga_top.png" local texture = "jeija_fpga_top.png"
if a == 1 then texture = texture .. "^jeija_microcontroller_LED_A.png" end if a == 1 then texture = texture .. "^jeija_luacontroller_LED_A.png" end
if b == 1 then texture = texture .. "^jeija_microcontroller_LED_B.png" end if b == 1 then texture = texture .. "^jeija_luacontroller_LED_B.png" end
if c == 1 then texture = texture .. "^jeija_microcontroller_LED_C.png" end if c == 1 then texture = texture .. "^jeija_luacontroller_LED_C.png" end
if d == 1 then texture = texture .. "^jeija_microcontroller_LED_D.png" end if d == 1 then texture = texture .. "^jeija_luacontroller_LED_D.png" end
ndef.tiles[1] = texture ndef.tiles[1] = texture
ndef.inventory_image = texture ndef.inventory_image = texture

View File

@ -0,0 +1,7 @@
# textdomain: mesecons_fpga
### init.lua ###
FPGA=Circuit logique programmable (FPGA)
### tool.lua ###
FPGA Programmer=Programmateur de circuit logique

View File

@ -0,0 +1,43 @@
--Aliases
minetest.register_alias("mesecons_gamecompat:chest", "mcl_chests:chest")
minetest.register_alias("mesecons_gamecompat:chest_locked", "mcl_chests:chest")
minetest.register_alias("mesecons_gamecompat:coalblock", "mcl_core:coalblock")
minetest.register_alias("mesecons_gamecompat:cobble", "mcl_core:cobble")
minetest.register_alias("mesecons_gamecompat:glass", "mcl_core:glass")
minetest.register_alias("mesecons_gamecompat:lava_source", "mcl_core:lava_source")
minetest.register_alias("mesecons_gamecompat:mese", "mesecons:redstoneblock")
minetest.register_alias("mesecons_gamecompat:mese_crystal", "mesecoms:redstone")
minetest.register_alias("mesecons_gamecompat:mese_crystal_fragment", "mesecons:redstone")
minetest.register_alias("mesecons_gamecompat:obsidian_glass", "mcl_core:glass")
minetest.register_alias("mesecons_gamecompat:stone", "mcl_core:stone")
minetest.register_alias("mesecons_gamecompat:steel_ingot", "mcl_core:iron_ingot")
minetest.register_alias("mesecons_gamecompat:steelblock", "mcl_core:steelblock")
minetest.register_alias("mesecons_gamecompat:torch", "mcl_torches:torch")
if minetest.get_modpath("mcl_dyes") then
for color, def in ipairs(mcl_dyes.colors) do
minetest.register_alias("mesecons_gamecompat:dye_" .. def.mcl2, "mcl_dyes:" .. color)
end
end
-- Sounds
mesecon.node_sound.default = mcl_sounds.node_sound_defaults()
mesecon.node_sound.glass = mcl_sounds.node_sound_glass_defaults()
mesecon.node_sound.leaves = mcl_sounds.node_sound_leaves_defaults()
mesecon.node_sound.stone = mcl_sounds.node_sound_stone_defaults()
mesecon.node_sound.wood = mcl_sounds.node_sound_wood_defaults()
if minetest.get_modpath("mcl_fire") then
mesecon.sound_name.fire = "fire_fire"
end
if minetest.get_modpath("mcl_tnt") then
mesecon.sound_name.explode = "tnt_explode"
end
-- Textures
mesecon.texture.steel_block = "default_steel_block.png"

View File

@ -59,6 +59,10 @@ if minetest.get_modpath("mesecons_mvps") then
"doors:hidden", "doors:hidden",
"doors:trapdoor_steel", "doors:trapdoor_steel",
"doors:trapdoor_steel_open", "doors:trapdoor_steel_open",
"beds:bed_bottom",
"beds:bed_top",
"beds:fancy_bed_bottom",
"beds:fancy_bed_top",
"xpanes:door_steel_bar_a", "xpanes:door_steel_bar_a",
"xpanes:door_steel_bar_b", "xpanes:door_steel_bar_b",
"xpanes:door_steel_bar_c", "xpanes:door_steel_bar_c",

View File

@ -13,3 +13,8 @@ if minetest.get_modpath("default") then
minetest.log("info", "Mesecons: detected Minetest Game for game compatibility") minetest.log("info", "Mesecons: detected Minetest Game for game compatibility")
dofile(minetest.get_modpath("mesecons_gamecompat").."/compat_mtg.lua") dofile(minetest.get_modpath("mesecons_gamecompat").."/compat_mtg.lua")
end end
if minetest.get_modpath("mcl_core") then
minetest.log("info", "Mesecons: detected MineClonia Game for game compatibility")
dofile(minetest.get_modpath("mesecons_gamecompat").."/compat_mcl.lua")
end

View File

@ -1,3 +1,3 @@
name = mesecons_gamecompat name = mesecons_gamecompat
depends = mesecons depends = mesecons
optional_depends = fire, default, dye, mesecons_mvps, tnt optional_depends = fire, default, dye, mesecons_mvps, tnt, mcl_fire, mcl_core, mcl_dye, mcl_tnt

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_hydroturbine
### init.lua ###
Water Turbine=Détecteur de courant

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_insulated
### init.lua ###
Straight Insulated Mesecon=Mesecon isolé droit

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_lamp
### init.lua ###
Mesecon Lamp=Lampe de Mesecon

View File

@ -0,0 +1,15 @@
# textdomain: mesecons_lightstone
### init.lua ###
Red Lightstone=Pierre lumineuse rouge
Green Lightstone=Pierre lumineuse verte
Blue Lightstone=Pierre lumineuse bleue
Grey Lightstone=Pierre lumineuse grise
Dark Grey Lightstone=Pierre lumineuse gris foncée
Yellow Lightstone=Pierre lumineuse jaune
Orange Lightstone=Pierre lumineuse orange
White Lightstone=Pierre lumineuse blanche
Pink Lightstone=Pierre lumineuse rose
Magenta Lightstone=Pierre lumineuse magenta
Cyan Lightstone=Pierre lumineuse bleu clair
Violet Lightstone=Pierre lumineuse violette

View File

@ -388,7 +388,10 @@ local function clean_and_weigh_digiline_message(msg, back_references)
return msg, #msg + 25 return msg, #msg + 25
elseif t == "number" then elseif t == "number" then
-- Numbers are passed by value so need not be touched, and cost 8 bytes -- Numbers are passed by value so need not be touched, and cost 8 bytes
-- as all numbers in Lua are doubles. -- as all numbers in Lua are doubles. NaN values are removed.
if msg ~= msg then
return nil, 0
end
return msg, 8 return msg, 8
elseif t == "boolean" then elseif t == "boolean" then
-- Booleans are passed by value so need not be touched, and cost 1 -- Booleans are passed by value so need not be touched, and cost 1

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_luacontroller
### init.lua ###
Luacontroller=Programmateur LUA

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,6 @@
# textdomain: mesecons_materials
### init.lua ###
Glue=Colle
Fiber=Fibre
Silicon=Silicone

View File

@ -0,0 +1,64 @@
<!-- Generate `description.html` from this by using `$ md2html -o description.html description.md`. -->
<p>The Microcontroller is a semi-advanced programmable component with a persistent
256 bit EEPROM memory.</p>
<p>Warning: This device is largely considered deprecated and might contain bugs. It
is recommended to use a Luacontroller instead.</p>
<p>Detailed documentation can be found below:</p>
<ul>
<li>The Microcontroller's code is executed whenever any of the following events
happens:<ul>
<li>The Microcontroller is programmed. In this case the EEPROM and ports are all
reset to <code>0</code> before.</li>
<li>An incoming signal changes its state.</li>
<li>An <code>after</code> event happens (see command <code>after</code> below).</li>
</ul>
</li>
<li>There are 4 I/O ports (ABCD) and 256 EEPROM bits (1 to 256).</li>
<li>The code consists of a sequence of commands.</li>
<li>Everything after <code>:</code> is a comment.</li>
<li>Strings are enclosed in <code>&quot;</code>s.</li>
<li>Spaces and tabs outside of strings are ignored.</li>
<li>Basic command syntax:<pre><code> command_name`(`param1`,` param2`,` ...`)`
</code></pre>
</li>
<li>Commands:<ul>
<li><code>if(condition) commands [&gt; else_commands];</code>:
Evaluates the given condition and takes the corresponding branch.
The else branch is optional (as indicated by the <code>[</code> and <code>]</code>). The <code>&gt;</code> is part
of the syntax and indicates the start of the else branch. The <code>;</code> marks the
end of the if command.</li>
<li><code>on(port1, port2, ...)</code>:
Sets the given ports to <code>1</code>.</li>
<li><code>off(port1, port2, ...)</code>:
Sets the given ports to <code>0</code>.</li>
<li><code>print(&quot;string&quot; or codition, ...)</code>:
Evaluates the conditions and prints the concatenation of all params to stdout
(only useful in singleplayer).</li>
<li><code>after(time, &quot;more commands&quot;)</code>:
Executes the commands in the string after the given time in seconds.
There can only be one waiting <code>after</code> event at once.
Warning: This is not reliable, ie. <code>minetest.after</code> is used.</li>
<li><code>sbi(port_or_eeprom, condition)</code>:
Evaluates the condition and sets the port or EEPROM bit to the resulting value.
Note: EEPROM indices don't use <code>#</code> here, ie. it's <code>sbi(1, #2)</code>, not <code>sbi(#1, #2)</code>.</li>
</ul>
</li>
<li>Conditions (sorted by descending precedence; they are all evaluated from left
to right):<ul>
<li><code>0</code>, <code>1</code>: constant</li>
<li><code>A</code>, ..., <code>D</code>: value of a port. Takes writes that already happened during the
current execution into account.</li>
<li><code>#1</code>, ..., <code>#256</code>: value of an EEPROM bit. Takes writes that already happened
during the current execution into account.</li>
<li><code>!condition</code>: negation (can only be applied once, ie. not <code>!!1</code>)</li>
<li><code>condition1 = condition2</code>: XNOR (equality)</li>
<li><code>condition1 op condition2</code> where <code>op</code> is one of:<ul>
<li><code>&amp;</code>: AND</li>
<li><code>|</code>: OR</li>
<li><code>~</code>: XOR (inequality)</li>
</ul>
</li>
<li>Note: Explicit precedence using parentheses is not supported.</li>
</ul>
</li>
</ul>

View File

@ -0,0 +1,59 @@
<!-- Generate `description.html` from this by using `$ md2html -o description.html description.md`. -->
The Microcontroller is a semi-advanced programmable component with a persistent
256 bit EEPROM memory.
Warning: This device is largely considered deprecated and might contain bugs. It
is recommended to use a Luacontroller instead.
Detailed documentation can be found below:
* The Microcontroller's code is executed whenever any of the following events
happens:
* The Microcontroller is programmed. In this case the EEPROM and ports are all
reset to `0` before.
* An incoming signal changes its state.
* An `after` event happens (see command `after` below).
* There are 4 I/O ports (ABCD) and 256 EEPROM bits (1 to 256).
* The code consists of a sequence of commands.
* Everything after `:` is a comment.
* Strings are enclosed in `"`s.
* Spaces and tabs outside of strings are ignored.
* Basic command syntax:
```
command_name`(`param1`,` param2`,` ...`)`
```
* Commands:
* `if(condition) commands [> else_commands];`:
Evaluates the given condition and takes the corresponding branch.
The else branch is optional (as indicated by the `[` and `]`). The `>` is part
of the syntax and indicates the start of the else branch. The `;` marks the
end of the if command.
* `on(port1, port2, ...)`:
Sets the given ports to `1`.
* `off(port1, port2, ...)`:
Sets the given ports to `0`.
* `print("string" or codition, ...)`:
Evaluates the conditions and prints the concatenation of all params to stdout
(only useful in singleplayer).
* `after(time, "more commands")`:
Executes the commands in the string after the given time in seconds.
There can only be one waiting `after` event at once.
Warning: This is not reliable, ie. `minetest.after` is used.
* `sbi(port_or_eeprom, condition)`:
Evaluates the condition and sets the port or EEPROM bit to the resulting value.
Note: EEPROM indices don't use `#` here, ie. it's `sbi(1, #2)`, not `sbi(#1, #2)`.
* Conditions (sorted by descending precedence; they are all evaluated from left
to right):
* `0`, `1`: constant
* `A`, ..., `D`: value of a port. Takes writes that already happened during the
current execution into account.
* `#1`, ..., `#256`: value of an EEPROM bit. Takes writes that already happened
during the current execution into account.
* `!condition`: negation (can only be applied once, ie. not `!!1`)
* `condition1 = condition2`: XNOR (equality)
* `condition1 op condition2` where `op` is one of:
* `&`: AND
* `|`: OR
* `~`: XOR (inequality)
* Note: Explicit precedence using parentheses is not supported.

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -12,16 +12,16 @@ for d = 0, 1 do
local nodename = "mesecons_microcontroller:microcontroller"..tostring(d)..tostring(c)..tostring(b)..tostring(a) local nodename = "mesecons_microcontroller:microcontroller"..tostring(d)..tostring(c)..tostring(b)..tostring(a)
local top = "jeija_microcontroller_top.png" local top = "jeija_microcontroller_top.png"
if tostring(a) == "1" then if tostring(a) == "1" then
top = top.."^jeija_microcontroller_LED_A.png" top = top.."^jeija_luacontroller_LED_A.png"
end end
if tostring(b) == "1" then if tostring(b) == "1" then
top = top.."^jeija_microcontroller_LED_B.png" top = top.."^jeija_luacontroller_LED_B.png"
end end
if tostring(c) == "1" then if tostring(c) == "1" then
top = top.."^jeija_microcontroller_LED_C.png" top = top.."^jeija_luacontroller_LED_C.png"
end end
if tostring(d) == "1" then if tostring(d) == "1" then
top = top.."^jeija_microcontroller_LED_D.png" top = top.."^jeija_luacontroller_LED_D.png"
end end
local groups local groups
if tostring(d)..tostring(c)..tostring(b)..tostring(a) ~= "0000" then if tostring(d)..tostring(c)..tostring(b)..tostring(a) ~= "0000" then
@ -122,7 +122,7 @@ minetest.register_node(nodename, {
elseif fields.bnand then elseif fields.bnand then
fields.code = "sbi(C, !A|!B) :A and B are inputs, C is output" fields.code = "sbi(C, !A|!B) :A and B are inputs, C is output"
elseif fields.btflop then elseif fields.btflop then
fields.code = "if(A)sbi(1,1);if(!A&#1)sbi(B,!B)sbi(1,0); if(C)off(B,1); :A is input, B is output (Q), C is reset, toggles with falling edge" fields.code = "if(A)sbi(1,1);if(!A&#1)sbi(B,!B)sbi(1,0); if(C)off(B); :A is input, B is output (Q), C is reset, toggles with falling edge"
elseif fields.brsflop then elseif fields.brsflop then
fields.code = "if(A)on(C);if(B)off(C); :A is S (Set), B is R (Reset), C is output (R dominates)" fields.code = "if(A)on(C);if(B)off(C); :A is S (Set), B is R (Reset), C is output (R dominates)"
end end

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_microcontroller
### init.lua ###
Microcontroller=Micro-controlleur

View File

@ -0,0 +1,7 @@
# textdomain: mesecons_movestones
### init.lua ###
Movestone=Pierre mouvante
Sticky Movestone=Pierre collante mouvante
Vertical Movestone=Pierre mouvante verticalement
Vertical Sticky Movestone=Pierre collante mouvante verticalement

View File

@ -81,9 +81,9 @@ function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky)
if #nodes > maximum then return nil end if #nodes > maximum then return nil end
-- add connected nodes to frontiers -- add connected nodes to frontiers
if minetest.registered_nodes[nn.name] local nndef = minetest.registered_nodes[nn.name]
and minetest.registered_nodes[nn.name].mvps_sticky then if nndef and nndef.mvps_sticky then
local connected = minetest.registered_nodes[nn.name].mvps_sticky(np, nn) local connected = nndef.mvps_sticky(np, nn)
for _, cp in ipairs(connected) do for _, cp in ipairs(connected) do
frontiers:add(cp) frontiers:add(cp)
end end
@ -96,10 +96,9 @@ function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky)
for _, r in ipairs(mesecon.rules.alldirs) do for _, r in ipairs(mesecon.rules.alldirs) do
local adjpos = vector.add(np, r) local adjpos = vector.add(np, r)
local adjnode = minetest.get_node(adjpos) local adjnode = minetest.get_node(adjpos)
if minetest.registered_nodes[adjnode.name] local adjdef = minetest.registered_nodes[adjnode.name]
and minetest.registered_nodes[adjnode.name].mvps_sticky then if adjdef and adjdef.mvps_sticky then
local sticksto = minetest.registered_nodes[adjnode.name] local sticksto = adjdef.mvps_sticky(adjpos, adjnode)
.mvps_sticky(adjpos, adjnode)
-- connects to this position? -- connects to this position?
for _, link in ipairs(sticksto) do for _, link in ipairs(sticksto) do

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_noteblock
### init.lua ###
Noteblock=Bloc de musique

View File

@ -270,9 +270,9 @@ minetest.register_node("mesecons_pistons:piston_normal_off", {
description = S("Piston"), description = S("Piston"),
tiles = { tiles = {
"mesecons_piston_top.png", "mesecons_piston_top.png",
"mesecons_piston_bottom.png", "mesecons_piston_top.png^[transform2",
"mesecons_piston_left.png", "mesecons_piston_top.png^[transform3",
"mesecons_piston_right.png", "mesecons_piston_top.png^[transform1",
"mesecons_piston_back.png", "mesecons_piston_back.png",
"mesecons_piston_pusher_front.png" "mesecons_piston_pusher_front.png"
}, },
@ -296,9 +296,9 @@ minetest.register_node("mesecons_pistons:piston_normal_on", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
"mesecons_piston_top.png", "mesecons_piston_top.png",
"mesecons_piston_bottom.png", "mesecons_piston_top.png^[transform2",
"mesecons_piston_left.png", "mesecons_piston_top.png^[transform3",
"mesecons_piston_right.png", "mesecons_piston_top.png^[transform1",
"mesecons_piston_back.png", "mesecons_piston_back.png",
"mesecons_piston_on_front.png" "mesecons_piston_on_front.png"
}, },
@ -325,9 +325,9 @@ minetest.register_node("mesecons_pistons:piston_pusher_normal", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
"mesecons_piston_pusher_top.png", "mesecons_piston_pusher_top.png",
"mesecons_piston_pusher_bottom.png", "mesecons_piston_pusher_top.png^[transform2",
"mesecons_piston_pusher_left.png", "mesecons_piston_pusher_top.png^[transform3",
"mesecons_piston_pusher_right.png", "mesecons_piston_pusher_top.png^[transform1",
"mesecons_piston_pusher_back.png", "mesecons_piston_pusher_back.png",
"mesecons_piston_pusher_front.png" "mesecons_piston_pusher_front.png"
}, },
@ -349,9 +349,9 @@ minetest.register_node("mesecons_pistons:piston_sticky_off", {
description = S("Sticky Piston"), description = S("Sticky Piston"),
tiles = { tiles = {
"mesecons_piston_top.png", "mesecons_piston_top.png",
"mesecons_piston_bottom.png", "mesecons_piston_top.png^[transform2",
"mesecons_piston_left.png", "mesecons_piston_top.png^[transform3",
"mesecons_piston_right.png", "mesecons_piston_top.png^[transform1",
"mesecons_piston_back.png", "mesecons_piston_back.png",
"mesecons_piston_pusher_front_sticky.png" "mesecons_piston_pusher_front_sticky.png"
}, },
@ -375,9 +375,9 @@ minetest.register_node("mesecons_pistons:piston_sticky_on", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
"mesecons_piston_top.png", "mesecons_piston_top.png",
"mesecons_piston_bottom.png", "mesecons_piston_top.png^[transform2",
"mesecons_piston_left.png", "mesecons_piston_top.png^[transform3",
"mesecons_piston_right.png", "mesecons_piston_top.png^[transform1",
"mesecons_piston_back.png", "mesecons_piston_back.png",
"mesecons_piston_on_front.png" "mesecons_piston_on_front.png"
}, },
@ -404,9 +404,9 @@ minetest.register_node("mesecons_pistons:piston_pusher_sticky", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
"mesecons_piston_pusher_top.png", "mesecons_piston_pusher_top.png",
"mesecons_piston_pusher_bottom.png", "mesecons_piston_pusher_top.png^[transform2",
"mesecons_piston_pusher_left.png", "mesecons_piston_pusher_top.png^[transform3",
"mesecons_piston_pusher_right.png", "mesecons_piston_pusher_top.png^[transform1",
"mesecons_piston_pusher_back.png", "mesecons_piston_pusher_back.png",
"mesecons_piston_pusher_front_sticky.png" "mesecons_piston_pusher_front_sticky.png"
}, },

View File

@ -0,0 +1,9 @@
# textdomain: mesecons_pistons
### init.lua ###
Piston=Piston
Activated Piston Base=Base de piston activé
Piston Pusher=Bras de piston
Sticky Piston=Piston collant
Activated Sticky Piston Base=Base de piston collant activé
Sticky Piston Pusher=Bras de piston collant

Binary file not shown.

Before

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 720 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 751 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 733 B

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_powerplant
### init.lua ###
Power Plant=Centrale à signal actif

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_pressureplates
### init.lua ###
Wooden Pressure Plate=Plaque de pression en bois
Stone Pressure Plate=Plaque de pression en pierre

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_random
### init.lua ###
Removestone=Pierre de suppression
Ghoststone=Pierre fantôme

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_solarpanel
### init.lua ###
Solar Panel=Détecteur solaire

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_stickyblocks
### init.lua ###
Sticky Block=Bloc collant

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_switch
### init.lua ###
Switch=Commutateur

View File

@ -56,8 +56,8 @@ local torch_selectionbox =
} }
minetest.register_node("mesecons_torch:mesecon_torch_off", { minetest.register_node("mesecons_torch:mesecon_torch_off", {
drawtype = "torchlike", drawtype = "plantlike",
tiles = {"jeija_torches_off.png", "jeija_torches_off_ceiling.png", "jeija_torches_off_side.png"}, tiles = {"jeija_torches_off.png"},
inventory_image = "jeija_torches_off.png", inventory_image = "jeija_torches_off.png",
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
@ -75,8 +75,8 @@ minetest.register_node("mesecons_torch:mesecon_torch_off", {
}) })
minetest.register_node("mesecons_torch:mesecon_torch_on", { minetest.register_node("mesecons_torch:mesecon_torch_on", {
drawtype = "torchlike", drawtype = "plantlike",
tiles = {"jeija_torches_on.png", "jeija_torches_on_ceiling.png", "jeija_torches_on_side.png"}, tiles = {"jeija_torches_on.png"},
inventory_image = "jeija_torches_on.png", inventory_image = "jeija_torches_on.png",
wield_image = "jeija_torches_on.png", wield_image = "jeija_torches_on.png",
paramtype = "light", paramtype = "light",

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_torch
### init.lua ###
Mesecon Torch=Torche de Mesecon

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 B

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_walllever
### init.lua ###
Lever=Levier

View File

@ -13,11 +13,11 @@ local S = minetest.get_translator(minetest.get_current_modname())
-- self_pos = pos of any mesecon node, from_pos = pos of conductor to getconnect for -- self_pos = pos of any mesecon node, from_pos = pos of conductor to getconnect for
local wire_getconnect = function (from_pos, self_pos) local wire_getconnect = function (from_pos, self_pos)
local node = minetest.get_node(self_pos) local node = minetest.get_node(self_pos)
if minetest.registered_nodes[node.name] local def = minetest.registered_nodes[node.name]
and minetest.registered_nodes[node.name].mesecons then if def and def.mesecons then
-- rules of node to possibly connect to -- rules of node to possibly connect to
local rules local rules
if (minetest.registered_nodes[node.name].mesecon_wire) then if def.mesecon_wire then
rules = mesecon.rules.default rules = mesecon.rules.default
else else
rules = mesecon.get_any_rules(node) rules = mesecon.get_any_rules(node)
@ -68,16 +68,18 @@ end
local update_on_place_dig = function (pos, node) local update_on_place_dig = function (pos, node)
-- Update placed node (get_node again as it may have been dug) -- Update placed node (get_node again as it may have been dug)
do
local nn = minetest.get_node(pos) local nn = minetest.get_node(pos)
if (minetest.registered_nodes[nn.name]) local def = minetest.registered_nodes[nn.name]
and (minetest.registered_nodes[nn.name].mesecon_wire) then if def and def.mesecon_wire then
wire_updateconnect(pos) wire_updateconnect(pos)
end end
end
-- Update nodes around it -- Update nodes around it
local rules local rules
if minetest.registered_nodes[node.name] local ndef = minetest.registered_nodes[node.name]
and minetest.registered_nodes[node.name].mesecon_wire then if ndef and ndef.mesecon_wire then
rules = mesecon.rules.default rules = mesecon.rules.default
else else
rules = mesecon.get_any_rules(node) rules = mesecon.get_any_rules(node)
@ -86,8 +88,8 @@ local update_on_place_dig = function (pos, node)
for _, r in ipairs(mesecon.flattenrules(rules)) do for _, r in ipairs(mesecon.flattenrules(rules)) do
local np = vector.add(pos, r) local np = vector.add(pos, r)
if minetest.registered_nodes[minetest.get_node(np).name] local rdef = minetest.registered_nodes[minetest.get_node(np).name]
and minetest.registered_nodes[minetest.get_node(np).name].mesecon_wire then if rdef and rdef.mesecon_wire then
wire_updateconnect(np) wire_updateconnect(np)
end end
end end

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_wires
### init.lua ###
Mesecon=Mesecon

View File

@ -1 +1,3 @@
name = mesecons name = mesecons
description = Mod that implements a ton of items related to digital circuitry.
min_minetest_version = 5.0