Compare commits
9 Commits
fix_crash
...
69a4b6b332
Author | SHA1 | Date | |
---|---|---|---|
69a4b6b332 | |||
e38e4fe0c5 | |||
5ad1e6bc4d | |||
b91fe92d13 | |||
6a87290ead | |||
1963bfcc0d | |||
6936c8c2e4 | |||
2fc1682c04 | |||
9b835053c2 |
15
.github/workflows/check-release.yml
vendored
Normal 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 ./
|
41
.github/workflows/check.yml
vendored
@ -1,41 +0,0 @@
|
||||
on: [push, pull_request]
|
||||
name: "Check"
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
name: "Luacheck"
|
||||
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 ./
|
||||
|
||||
mineunit:
|
||||
runs-on: ubuntu-latest
|
||||
name: "Mineunit tests"
|
||||
steps:
|
||||
- uses: actions/checkout@main
|
||||
- name: apt
|
||||
run: sudo apt-get install -y luarocks
|
||||
- name: busted install
|
||||
run: luarocks install --local busted
|
||||
- name: luacov install
|
||||
run: luarocks install --local luacov
|
||||
- name: mineunit install
|
||||
run: luarocks install --server=https://luarocks.org/dev --local mineunit
|
||||
- name: run mesecons tests
|
||||
working-directory: ./mesecons/
|
||||
run: $HOME/.luarocks/bin/mineunit -q
|
||||
- name: run mesecons_mvps tests
|
||||
working-directory: ./mesecons_mvps/
|
||||
run: $HOME/.luarocks/bin/mineunit -q
|
||||
- name: run mesecons_fpga tests
|
||||
working-directory: ./mesecons_fpga/
|
||||
run: $HOME/.luarocks/bin/mineunit -q
|
||||
- name: run mesecons_luacontroller tests
|
||||
working-directory: ./mesecons_luacontroller/
|
||||
run: $HOME/.luarocks/bin/mineunit -q
|
26
.github/workflows/test.yml
vendored
@ -1,26 +0,0 @@
|
||||
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 }}"
|
25
.luacheckrc
@ -27,8 +27,6 @@ read_globals = {
|
||||
"table.insert_all",
|
||||
"vector",
|
||||
"VoxelArea",
|
||||
"mcl_dyes",
|
||||
"mcl_sounds",
|
||||
}
|
||||
|
||||
globals = {"mesecon"}
|
||||
@ -36,26 +34,3 @@ globals = {"mesecon"}
|
||||
files["mesecons/actionqueue.lua"] = {
|
||||
globals = {"minetest.registered_globalsteps"},
|
||||
}
|
||||
|
||||
-- Test-specific stuff follows.
|
||||
|
||||
local test_conf = {
|
||||
read_globals = {
|
||||
"assert",
|
||||
"fixture",
|
||||
"mineunit",
|
||||
"Player",
|
||||
"sourcefile",
|
||||
"world",
|
||||
},
|
||||
}
|
||||
files["*/spec/*.lua"] = test_conf
|
||||
files[".test_fixtures/*.lua"] = test_conf
|
||||
|
||||
files[".test_fixtures/screwdriver.lua"] = {
|
||||
globals = {"screwdriver"},
|
||||
}
|
||||
|
||||
files[".test_fixtures/mesecons_fpga.lua"] = {
|
||||
globals = {"minetest.register_on_player_receive_fields"},
|
||||
}
|
||||
|
@ -1,3 +0,0 @@
|
||||
mg_name = singlenode
|
||||
mesecon.internal_test = true
|
||||
random_mod_load_order = true
|
31
.test/run.sh
@ -1,31 +0,0 @@
|
||||
#!/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
|
@ -1,156 +0,0 @@
|
||||
mineunit("core")
|
||||
mineunit("server")
|
||||
mineunit("voxelmanip")
|
||||
|
||||
mineunit:set_current_modname("mesecons")
|
||||
mineunit:set_modpath("mesecons", "../mesecons")
|
||||
sourcefile("../mesecons/init")
|
||||
|
||||
-- Utility node: this conductor is used to test the connectivity and state of adjacent wires.
|
||||
do
|
||||
local off_spec = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
rules = mesecon.rules.alldirs,
|
||||
onstate = "mesecons:test_conductor_on",
|
||||
}}
|
||||
local on_spec = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
rules = mesecon.rules.alldirs,
|
||||
offstate = "mesecons:test_conductor_off",
|
||||
}}
|
||||
mesecon.register_node("mesecons:test_conductor", {
|
||||
description = "Test Conductor",
|
||||
}, {mesecons = off_spec}, {mesecons = on_spec})
|
||||
end
|
||||
|
||||
-- Utility node: this receptor is used to test power sources.
|
||||
do
|
||||
local off_spec = {receptor = {
|
||||
state = mesecon.state.off,
|
||||
rules = mesecon.rules.alldirs,
|
||||
}}
|
||||
local on_spec = {receptor = {
|
||||
state = mesecon.state.on,
|
||||
rules = mesecon.rules.alldirs,
|
||||
}}
|
||||
mesecon.register_node("mesecons:test_receptor", {
|
||||
description = "Test Receptor",
|
||||
}, {mesecons = off_spec}, {mesecons = on_spec})
|
||||
end
|
||||
|
||||
-- Utility node: this effector is used to test circuit outputs.
|
||||
do
|
||||
-- This is a list of actions in the form {<kind>, <pos>},
|
||||
-- where <kind> is "on", "off", or "overheat".
|
||||
mesecon._test_effector_events = {}
|
||||
local function action_on(pos, node)
|
||||
table.insert(mesecon._test_effector_events, {"on", pos})
|
||||
node.param2 = node.param2 % 64 + 128 -- Turn on bit 7
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
local function action_off(pos, node)
|
||||
table.insert(mesecon._test_effector_events, {"off", pos})
|
||||
node.param2 = node.param2 % 64 -- Turn off bit 7
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
local function action_change(pos, node, rule_name, new_state)
|
||||
if mesecon.do_overheat(pos) then
|
||||
table.insert(mesecon._test_effector_events, {"overheat", pos})
|
||||
minetest.remove_node(pos)
|
||||
return
|
||||
end
|
||||
-- Set the value of a bit in param2 according to the rule name and new state.
|
||||
local bit = tonumber(rule_name.name, 2)
|
||||
local bits_above = node.param2 - node.param2 % (bit * 2)
|
||||
local bits_below = node.param2 % bit
|
||||
local bits_flipped = new_state == mesecon.state.on and bit or 0
|
||||
node.param2 = bits_above + bits_flipped + bits_below
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
minetest.register_node("mesecons:test_effector", {
|
||||
description = "Test Effector",
|
||||
mesecons = {effector = {
|
||||
action_on = action_on,
|
||||
action_off = action_off,
|
||||
action_change = action_change,
|
||||
rules = {
|
||||
{x = 1, y = 0, z = 0, name = "000001"},
|
||||
{x = -1, y = 0, z = 0, name = "000010"},
|
||||
{x = 0, y = 1, z = 0, name = "000100"},
|
||||
{x = 0, y = -1, z = 0, name = "001000"},
|
||||
{x = 0, y = 0, z = 1, name = "010000"},
|
||||
{x = 0, y = 0, z = -1, name = "100000"},
|
||||
}
|
||||
}},
|
||||
})
|
||||
end
|
||||
|
||||
-- Utility node: this conductor is used to test rotation.
|
||||
do
|
||||
local get_rules = mesecon.horiz_rules_getter({{x = 1, y = 0, z = 0}, {x = -1, y = 0, z = 0}})
|
||||
local off_spec = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
rules = get_rules,
|
||||
onstate = "mesecons:test_conductor_rot_on",
|
||||
}}
|
||||
local on_spec = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
rules = get_rules,
|
||||
offstate = "mesecons:test_conductor_rot_off",
|
||||
}}
|
||||
mesecon.register_node("mesecons:test_conductor_rot", {
|
||||
description = "Rotatable Test Conductor",
|
||||
on_rotate = mesecon.on_rotate_horiz,
|
||||
}, {mesecons = off_spec}, {mesecons = on_spec})
|
||||
end
|
||||
|
||||
-- Utility node: this is used to test multiple conductors within a single node.
|
||||
do
|
||||
local mesecons_spec = {conductor = {
|
||||
rules = {
|
||||
{{x = 1, y = 0, z = 0}, {x = 0, y = -1, z = 0}},
|
||||
{{x = 0, y = 1, z = 0}, {x = 0, y = 0, z = -1}},
|
||||
{{x = 0, y = 0, z = 1}, {x = -1, y = 0, z = 0}},
|
||||
},
|
||||
states = {
|
||||
"mesecons:test_multiconductor_off", "mesecons:test_multiconductor_001",
|
||||
"mesecons:test_multiconductor_010", "mesecons:test_multiconductor_011",
|
||||
"mesecons:test_multiconductor_100", "mesecons:test_multiconductor_101",
|
||||
"mesecons:test_multiconductor_110", "mesecons:test_multiconductor_on",
|
||||
},
|
||||
}}
|
||||
for _, state in ipairs(mesecons_spec.conductor.states) do
|
||||
minetest.register_node(state, {
|
||||
description = "Test Multiconductor",
|
||||
mesecons = mesecons_spec,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
mesecon._test_autoconnects = {}
|
||||
mesecon.register_autoconnect_hook("test", function(pos, node)
|
||||
table.insert(mesecon._test_autoconnects, {pos, node})
|
||||
end)
|
||||
|
||||
function mesecon._test_dig(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
minetest.remove_node(pos)
|
||||
mesecon.on_dignode(pos, node)
|
||||
end
|
||||
|
||||
function mesecon._test_place(pos, node)
|
||||
world.set_node(pos, node)
|
||||
mesecon.on_placenode(pos, minetest.get_node(pos))
|
||||
end
|
||||
|
||||
function mesecon._test_reset()
|
||||
-- First let circuits settle by simulating many globalsteps.
|
||||
for i = 1, 10 do
|
||||
mineunit:execute_globalstep(60)
|
||||
end
|
||||
mesecon.queue.actions = {}
|
||||
mesecon._test_effector_events = {}
|
||||
mesecon._test_autoconnects = {}
|
||||
end
|
||||
|
||||
mineunit:execute_globalstep(mesecon.setting("resumetime", 4) + 1)
|
@ -1,59 +0,0 @@
|
||||
mineunit("player")
|
||||
|
||||
fixture("mesecons")
|
||||
fixture("mesecons_gamecompat")
|
||||
|
||||
local registered_on_player_receive_fields = {}
|
||||
local old_register_on_player_receive_fields = minetest.register_on_player_receive_fields
|
||||
function minetest.register_on_player_receive_fields(func)
|
||||
old_register_on_player_receive_fields(func)
|
||||
table.insert(registered_on_player_receive_fields, func)
|
||||
end
|
||||
|
||||
mineunit:set_current_modname("mesecons_fpga")
|
||||
mineunit:set_modpath("mesecons_fpga", "../mesecons_fpga")
|
||||
sourcefile("../mesecons_fpga/init")
|
||||
|
||||
local fpga_user = Player("mesecons_fpga_user")
|
||||
|
||||
function mesecon._test_program_fpga(pos, program)
|
||||
local node = minetest.get_node(pos)
|
||||
assert.equal("mesecons_fpga:fpga", node.name:sub(1, 18))
|
||||
|
||||
local fields = {program = true}
|
||||
for i, instr in ipairs(program) do
|
||||
-- Translate the instruction into formspec fields.
|
||||
local op1, act, op2, dst
|
||||
if #instr == 3 then
|
||||
act, op2, dst = unpack(instr)
|
||||
else
|
||||
assert.equal(4, #instr)
|
||||
op1, act, op2, dst = unpack(instr)
|
||||
end
|
||||
fields[i .. "op1"] = op1
|
||||
fields[i .. "act"] = (" "):rep(4 - #act) .. act
|
||||
fields[i .. "op2"] = op2
|
||||
fields[i .. "dst"] = dst
|
||||
end
|
||||
|
||||
minetest.registered_nodes[node.name].on_rightclick(pos, node, fpga_user)
|
||||
|
||||
for _, func in ipairs(registered_on_player_receive_fields) do
|
||||
if func(fpga_user, "mesecons:fpga", fields) then
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon._test_copy_fpga_program(pos)
|
||||
fpga_user:get_inventory():set_stack("main", 1, "mesecons_fpga:programmer")
|
||||
local pt = {type = "node", under = vector.new(pos), above = vector.offset(pos, 0, 1, 0)}
|
||||
fpga_user:do_place(pt)
|
||||
return fpga_user:get_wielded_item()
|
||||
end
|
||||
|
||||
function mesecon._test_paste_fpga_program(pos, tool)
|
||||
fpga_user:get_inventory():set_stack("main", 1, tool)
|
||||
local pt = {type = "node", under = vector.new(pos), above = vector.offset(pos, 0, 1, 0)}
|
||||
fpga_user:do_use(pt)
|
||||
end
|
@ -1,5 +0,0 @@
|
||||
fixture("mesecons")
|
||||
|
||||
mineunit:set_current_modname("mesecons_gamecompat")
|
||||
mineunit:set_modpath("mesecons_gamecompat", "../mesecons_gamecompat")
|
||||
sourcefile("../mesecons_gamecompat/init")
|
@ -1,12 +0,0 @@
|
||||
fixture("mesecons")
|
||||
fixture("mesecons_gamecompat")
|
||||
|
||||
mineunit:set_current_modname("mesecons_luacontroller")
|
||||
mineunit:set_modpath("mesecons_luacontroller", "../mesecons_luacontroller")
|
||||
sourcefile("../mesecons_luacontroller/init")
|
||||
|
||||
function mesecon._test_program_luac(pos, code)
|
||||
local node = minetest.get_node(pos)
|
||||
assert.equal("mesecons_luacontroller:luacontroller", node.name:sub(1, 36))
|
||||
return minetest.registered_nodes[node.name].mesecons.luacontroller.set_program(pos, code)
|
||||
end
|
@ -1,45 +0,0 @@
|
||||
mineunit("protection")
|
||||
|
||||
fixture("mesecons")
|
||||
|
||||
mineunit:set_current_modname("mesecons_mvps")
|
||||
mineunit:set_modpath("mesecons_mvps", "../mesecons_mvps")
|
||||
sourcefile("../mesecons_mvps/init")
|
||||
|
||||
minetest.register_node("mesecons_mvps:test_stopper", {
|
||||
description = "Test Stopper",
|
||||
})
|
||||
mesecon.register_mvps_stopper("mesecons_mvps:test_stopper")
|
||||
|
||||
minetest.register_node("mesecons_mvps:test_stopper_cond", {
|
||||
description = "Test Stopper (Conditional)",
|
||||
})
|
||||
mesecon.register_mvps_stopper("mesecons_mvps:test_stopper_cond", function(node)
|
||||
return node.param2 == 0
|
||||
end)
|
||||
|
||||
minetest.register_node("mesecons_mvps:test_sticky", {
|
||||
description = "Test Sticky",
|
||||
mvps_sticky = function(pos)
|
||||
local connected = {}
|
||||
for i, rule in ipairs(mesecon.rules.alldirs) do
|
||||
connected[i] = vector.add(pos, rule)
|
||||
end
|
||||
return connected
|
||||
end,
|
||||
})
|
||||
|
||||
mesecon._test_moves = {}
|
||||
minetest.register_node("mesecons_mvps:test_on_move", {
|
||||
description = "Test Moveable",
|
||||
mesecon = {
|
||||
on_mvps_move = function(pos, node, oldpos, meta)
|
||||
table.insert(mesecon._test_moves, {pos, node, oldpos, meta})
|
||||
end
|
||||
},
|
||||
})
|
||||
local old_reset = mesecon._test_reset
|
||||
function mesecon._test_reset()
|
||||
mesecon._test_moves = {}
|
||||
old_reset()
|
||||
end
|
@ -1,6 +0,0 @@
|
||||
mineunit:set_current_modname("screwdriver")
|
||||
|
||||
screwdriver = {}
|
||||
|
||||
screwdriver.ROTATE_FACE = 1
|
||||
screwdriver.ROTATE_AXIS = 2
|
@ -1,12 +1,6 @@
|
||||
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
|
||||
|
25
README.md
@ -12,7 +12,6 @@ MESECONS by Jeija and contributors
|
||||
|
||||
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 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.
|
||||
@ -21,18 +20,15 @@ Mesecons has a similar goal to Redstone in Minecraft, but works in its own way,
|
||||
|
||||
OK, I want in.
|
||||
--------------
|
||||
|
||||
Go get it!
|
||||
|
||||
[](https://content.minetest.net/packages/Jeija/mesecons/)
|
||||
[DOWNLOAD IT NOW](https://github.com/minetest-mods/mesecons/archive/master.zip)
|
||||
|
||||
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:
|
||||
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:
|
||||
|
||||
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.
|
||||
3. Open up the Minetest mods folder - called `mods`.
|
||||
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.
|
||||
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.
|
||||
@ -41,21 +37,21 @@ There are no dependencies - it will work right after installing!
|
||||
|
||||
How do I use this thing?
|
||||
------------------------
|
||||
|
||||
How about a [quick overview video](https://www.youtube.com/watch?v=6kmeQj6iW5k)?
|
||||
|
||||
Or maybe a [comprehensive reference](https://mesecons.net/items.html) is your style?
|
||||
Or maybe a [comprehensive reference](http://mesecons.net/items.html) is your style?
|
||||
|
||||
An overview for the very newest of new beginners? How does [this one](https://uberi.mesecons.net/projects/MeseconsBasics/index.html) look?
|
||||
An overview for the very newest of new beginners? How does [this one](http://uberi.mesecons.net/projects/MeseconsBasics/index.html) look?
|
||||
|
||||
Want to get more into building? Why not check out the [Mesecons Laboratory](https://uberi.mesecons.net/), a website dedicated to advanced Mesecons builders?
|
||||
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](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)!
|
||||
|
||||
Who wrote it anyways?
|
||||
---------------------
|
||||
|
||||
These awesome people made Mesecons possible! (as of 2016)
|
||||
These awesome people made Mesecons possible!
|
||||
|
||||
| Contributor | Contribution |
|
||||
| --------------- | -------------------------------- |
|
||||
@ -76,11 +72,8 @@ These awesome people made Mesecons possible! (as of 2016)
|
||||
|
||||
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?
|
||||
--------------------------
|
||||
|
||||
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.
|
||||
|
||||
|
@ -42,7 +42,6 @@
|
||||
},
|
||||
"Logic" : {
|
||||
"Luacontroller" : "mesecons_luacontroller/doc/luacontroller",
|
||||
"Microcontroller" : "mesecons_microcontroller/doc/microcontroler",
|
||||
"FPGA" : "mesecons_fpga/doc/fpga",
|
||||
"FPGA Programmer" : "mesecons_fpga/doc/programmer",
|
||||
"Torch" : "mesecons_torch/doc/torch",
|
||||
|
@ -70,17 +70,7 @@ end
|
||||
-- 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
|
||||
|
||||
local m_time = 0
|
||||
local resumetime = mesecon.setting("resumetime", 4)
|
||||
|
||||
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
|
||||
-- split into two categories:
|
||||
-- actions_now: actions to execute now
|
||||
@ -122,7 +112,23 @@ local function globalstep_func(dtime)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_globalstep(globalstep_func)
|
||||
-- delay the time the globalsteps start to be execute by 4 seconds
|
||||
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)
|
||||
-- ignore if action queue function name doesn't exist,
|
||||
|
@ -99,6 +99,7 @@ mesecon.queue:add_function("receptor_off", function (pos, rules)
|
||||
local rulenames = mesecon.rules_link_rule_all(pos, rule)
|
||||
for _, rulename in ipairs(rulenames) do
|
||||
mesecon.vm_begin()
|
||||
mesecon.changesignal(np, minetest.get_node(np), rulename, mesecon.state.off, 2)
|
||||
|
||||
-- Turnoff returns true if turnoff process was successful, no onstate receptor
|
||||
-- was found along the way. Commit changes that were made in voxelmanip. If turnoff
|
||||
@ -117,17 +118,11 @@ function mesecon.receptor_off(pos, rules)
|
||||
end
|
||||
|
||||
|
||||
print("[OK] Mesecons")
|
||||
|
||||
-- Deprecated stuff
|
||||
-- To be removed in future releases
|
||||
dofile(minetest.get_modpath("mesecons").."/legacy.lua");
|
||||
|
||||
--Services like turnoff receptor on dignode and so on
|
||||
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
|
||||
|
@ -46,23 +46,31 @@
|
||||
-- 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")
|
||||
local fifo_queue = dofile(minetest.get_modpath("mesecons").."/fifo_queue.lua")
|
||||
|
||||
-- General
|
||||
function mesecon.get_effector(nodename)
|
||||
local def = minetest.registered_nodes[nodename]
|
||||
return def and def.mesecons and def.mesecons.effector
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.effector then
|
||||
return minetest.registered_nodes[nodename].mesecons.effector
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon.get_receptor(nodename)
|
||||
local def = minetest.registered_nodes[nodename]
|
||||
return def and def.mesecons and def.mesecons.receptor
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.receptor then
|
||||
return minetest.registered_nodes[nodename].mesecons.receptor
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon.get_conductor(nodename)
|
||||
local def = minetest.registered_nodes[nodename]
|
||||
return def and def.mesecons and def.mesecons.conductor
|
||||
if minetest.registered_nodes[nodename]
|
||||
and minetest.registered_nodes[nodename].mesecons
|
||||
and minetest.registered_nodes[nodename].mesecons.conductor then
|
||||
return minetest.registered_nodes[nodename].mesecons.conductor
|
||||
end
|
||||
end
|
||||
|
||||
function mesecon.get_any_outputrules(node)
|
||||
@ -413,7 +421,7 @@ end
|
||||
function mesecon.turnon(pos, link)
|
||||
find_light_update_conductors()
|
||||
|
||||
local frontiers = mesecon.fifo_queue.new()
|
||||
local frontiers = fifo_queue.new()
|
||||
frontiers:add({pos = pos, link = link})
|
||||
local pos_can_be_skipped = {}
|
||||
|
||||
@ -476,7 +484,7 @@ end
|
||||
function mesecon.turnoff(pos, link)
|
||||
find_light_update_conductors()
|
||||
|
||||
local frontiers = mesecon.fifo_queue.new()
|
||||
local frontiers = fifo_queue.new()
|
||||
frontiers:add({pos = pos, link = link})
|
||||
local signals = {}
|
||||
local pos_can_be_skipped = {}
|
||||
@ -533,14 +541,11 @@ function mesecon.turnoff(pos, link)
|
||||
end
|
||||
|
||||
for _, sig in ipairs(signals) do
|
||||
-- If sig.depth is 1, it has not yet been checked that the power source is actually off.
|
||||
if sig.depth > 1 or not mesecon.is_powered(sig.pos, sig.link) then
|
||||
mesecon.changesignal(sig.pos, sig.node, sig.link, mesecon.state.off, sig.depth)
|
||||
if mesecon.is_effector_on(sig.node.name) and not mesecon.is_powered(sig.pos) then
|
||||
mesecon.deactivate(sig.pos, sig.node, sig.link, sig.depth)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
@ -1,3 +0,0 @@
|
||||
# textdomain: mesecons
|
||||
|
||||
Mesecons=Mesecons
|
@ -1,4 +0,0 @@
|
||||
# textdomain: mesecons
|
||||
|
||||
### oldwires.lua ###
|
||||
Mesecons=Mesekonduktilo
|
@ -1,4 +0,0 @@
|
||||
# textdomain: mesecons
|
||||
|
||||
### oldwires.lua ###
|
||||
Mesecons=Mesecons
|
@ -1,4 +0,0 @@
|
||||
# textdomain: mesecons
|
||||
|
||||
### oldwires.lua ###
|
||||
Mesecons=
|
@ -1,5 +1,3 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
minetest.register_node("mesecons:mesecon_off", {
|
||||
drawtype = "raillike",
|
||||
tiles = {"jeija_mesecon_off.png", "jeija_mesecon_curved_off.png", "jeija_mesecon_t_junction_off.png", "jeija_mesecon_crossing_off.png"},
|
||||
@ -13,7 +11,7 @@ minetest.register_node("mesecons:mesecon_off", {
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
|
||||
},
|
||||
groups = {dig_immediate=3, mesecon=1, mesecon_conductor_craftable=1},
|
||||
description= S("Mesecons"),
|
||||
description="Mesecons",
|
||||
mesecons = {conductor={
|
||||
state = mesecon.state.off,
|
||||
onstate = "mesecons:mesecon_on"
|
||||
|
@ -64,8 +64,6 @@ local rules_buttonlike = {
|
||||
}
|
||||
|
||||
local function rules_from_dir(ruleset, dir)
|
||||
if not dir then return {} end
|
||||
|
||||
if dir.x == 1 then return ruleset.xp end
|
||||
if dir.y == 1 then return ruleset.yp end
|
||||
if dir.z == 1 then return ruleset.zp end
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
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
|
||||
@ -12,20 +11,18 @@ 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
|
||||
mesecon.vm_begin()
|
||||
-- also call receptor_on if itself is powered already, so that neighboring
|
||||
-- conductors will be activated (when pushing an on-conductor with a piston)
|
||||
for _, s in ipairs(sources) do
|
||||
local rule = vector.subtract(s, pos)
|
||||
mesecon.turnon(pos, rule)
|
||||
end
|
||||
mesecon.vm_commit()
|
||||
--mesecon.receptor_on (pos, mesecon.conductor_get_rules(node))
|
||||
elseif mesecon.is_conductor_on(node) then
|
||||
node.name = mesecon.get_conductor_off(node)
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -1,62 +0,0 @@
|
||||
require("mineunit")
|
||||
|
||||
fixture("mesecons")
|
||||
|
||||
describe("action queue", function()
|
||||
local layout = {
|
||||
{{x = 1, y = 0, z = 0}, "mesecons:test_receptor_off"},
|
||||
{{x = 0, y = 0, z = 0}, "mesecons:test_conductor_off"},
|
||||
{{x = -1, y = 0, z = 0}, "mesecons:test_conductor_off"},
|
||||
{{x = 0, y = 1, z = 0}, "mesecons:test_effector"},
|
||||
{{x = -1, y = 1, z = 0}, "mesecons:test_effector"},
|
||||
}
|
||||
|
||||
before_each(function()
|
||||
world.layout(layout)
|
||||
end)
|
||||
|
||||
after_each(function()
|
||||
mesecon._test_reset()
|
||||
world.clear()
|
||||
end)
|
||||
|
||||
it("executes in order", function()
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
mineunit:execute_globalstep() -- Execute activate/change actions
|
||||
assert.equal(2, #mesecon._test_effector_events)
|
||||
assert.same({"on", layout[4][1]}, mesecon._test_effector_events[1])
|
||||
assert.same({"on", layout[5][1]}, mesecon._test_effector_events[2])
|
||||
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_off")
|
||||
mesecon.receptor_off(layout[1][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_off action
|
||||
mineunit:execute_globalstep() -- Execute deactivate/change actions
|
||||
assert.equal(4, #mesecon._test_effector_events)
|
||||
assert.same({"off", layout[4][1]}, mesecon._test_effector_events[3])
|
||||
assert.same({"off", layout[5][1]}, mesecon._test_effector_events[4])
|
||||
end)
|
||||
|
||||
it("discards outdated/overwritten node events", function()
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs)
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_off")
|
||||
mesecon.receptor_off(layout[1][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_off action
|
||||
mineunit:execute_globalstep() -- Execute deactivate/change actions
|
||||
assert.equal(0, #mesecon._test_effector_events)
|
||||
end)
|
||||
|
||||
it("delays actions", function()
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_on")
|
||||
mesecon.queue:add_action(layout[1][1], "receptor_on", {mesecon.rules.alldirs}, 1, nil)
|
||||
mineunit:execute_globalstep(0.1)
|
||||
mineunit:execute_globalstep(1)
|
||||
assert.equal(0, #mesecon._test_effector_events)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
assert.equal(0, #mesecon._test_effector_events)
|
||||
mineunit:execute_globalstep() -- Execute activate/change actions
|
||||
assert.equal(2, #mesecon._test_effector_events)
|
||||
end)
|
||||
end)
|
@ -1 +0,0 @@
|
||||
fixture_paths = {"../.test_fixtures"}
|
@ -1,192 +0,0 @@
|
||||
require("mineunit")
|
||||
|
||||
fixture("mesecons")
|
||||
fixture("screwdriver")
|
||||
|
||||
describe("placement/digging service", function()
|
||||
local layout = {
|
||||
{{x = 1, y = 0, z = 0}, "mesecons:test_receptor_on"},
|
||||
{{x = 0, y = 0, z = 0}, "mesecons:test_conductor_on"},
|
||||
{{x = -1, y = 0, z = 0}, "mesecons:test_conductor_on"},
|
||||
{{x = 0, y = 1, z = 0}, "mesecons:test_effector"},
|
||||
{{x = -2, y = 0, z = 0}, "mesecons:test_effector"},
|
||||
{{x = 2, y = 0, z = 0}, "mesecons:test_effector"},
|
||||
}
|
||||
|
||||
before_each(function()
|
||||
world.layout(layout)
|
||||
end)
|
||||
|
||||
after_each(function()
|
||||
mesecon._test_reset()
|
||||
world.clear()
|
||||
end)
|
||||
|
||||
it("updates components when a receptor changes", function()
|
||||
-- Dig then replace a receptor and check that the connected effectors changed.
|
||||
|
||||
mesecon._test_dig(layout[1][1])
|
||||
mineunit:execute_globalstep() -- Execute receptor_off action
|
||||
assert.equal("mesecons:test_conductor_off", world.get_node(layout[2][1]).name)
|
||||
mineunit:execute_globalstep() -- Execute deactivate/change actions
|
||||
assert.equal(3, #mesecon._test_effector_events)
|
||||
|
||||
mesecon._test_place(layout[1][1], "mesecons:test_receptor_on")
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[2][1]).name)
|
||||
mineunit:execute_globalstep() -- Execute activate/change action
|
||||
assert.equal(6, #mesecon._test_effector_events)
|
||||
end)
|
||||
|
||||
it("updates components when a conductor changes", function()
|
||||
-- Dig then replace a powered conductor and check that the connected effectors changed.
|
||||
|
||||
mesecon._test_dig(layout[2][1])
|
||||
mineunit:execute_globalstep() -- Execute receptor_off action
|
||||
assert.equal("mesecons:test_conductor_off", world.get_node(layout[3][1]).name)
|
||||
mineunit:execute_globalstep() -- Execute deactivate/change actions
|
||||
assert.equal(2, #mesecon._test_effector_events)
|
||||
|
||||
mesecon._test_place(layout[2][1], "mesecons:test_conductor_off")
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[2][1]).name)
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name)
|
||||
mineunit:execute_globalstep() -- Execute activate/change actions
|
||||
assert.equal(4, #mesecon._test_effector_events)
|
||||
end)
|
||||
|
||||
it("updates effectors on placement", function()
|
||||
local pos = {x = 0, y = 0, z = 1}
|
||||
mesecon._test_place(pos, "mesecons:test_effector")
|
||||
mineunit:execute_globalstep() -- Execute activate/change actions
|
||||
assert.equal(tonumber("10100000", 2), world.get_node(pos).param2)
|
||||
end)
|
||||
|
||||
it("updates multiconductors on placement", function()
|
||||
local pos = {x = 0, y = 0, z = 1}
|
||||
mesecon._test_place(pos, "mesecons:test_multiconductor_off")
|
||||
assert.equal("mesecons:test_multiconductor_010", world.get_node(pos).name)
|
||||
end)
|
||||
|
||||
it("turns off conductors on placement", function()
|
||||
local pos = {x = 3, y = 0, z = 0}
|
||||
mesecon._test_place(pos, "mesecons:test_conductor_on")
|
||||
assert.equal("mesecons:test_conductor_off", world.get_node(pos).name)
|
||||
end)
|
||||
|
||||
it("turns off multiconductors on placement", function()
|
||||
local pos = {x = 3, y = 0, z = 0}
|
||||
mesecon._test_place(pos, "mesecons:test_multiconductor_on")
|
||||
assert.equal("mesecons:test_multiconductor_off", world.get_node(pos).name)
|
||||
end)
|
||||
|
||||
it("triggers autoconnect hooks", function()
|
||||
mesecon._test_dig(layout[2][1])
|
||||
mineunit:execute_globalstep() -- Execute delayed hook
|
||||
assert.equal(1, #mesecon._test_autoconnects)
|
||||
|
||||
mesecon._test_place(layout[2][1], layout[2][2])
|
||||
assert.equal(2, #mesecon._test_autoconnects)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe("overheating service", function()
|
||||
local layout = {
|
||||
{{x = 0, y = 0, z = 0}, "mesecons:test_receptor_off"},
|
||||
{{x = 1, y = 0, z = 0}, "mesecons:test_effector"},
|
||||
{{x = 2, y = 0, z = 0}, "mesecons:test_receptor_on"},
|
||||
}
|
||||
|
||||
before_each(function()
|
||||
world.layout(layout)
|
||||
end)
|
||||
|
||||
after_each(function()
|
||||
mesecon._test_reset()
|
||||
world.clear()
|
||||
end)
|
||||
|
||||
it("tracks heat", function()
|
||||
mesecon.do_overheat(layout[2][1])
|
||||
assert.equal(1, mesecon.get_heat(layout[2][1]))
|
||||
mesecon.do_cooldown(layout[2][1])
|
||||
assert.equal(0, mesecon.get_heat(layout[2][1]))
|
||||
end)
|
||||
|
||||
it("cools over time", function()
|
||||
mesecon.do_overheat(layout[2][1])
|
||||
assert.equal(1, mesecon.get_heat(layout[2][1]))
|
||||
mineunit:execute_globalstep(60)
|
||||
mineunit:execute_globalstep(60)
|
||||
mineunit:execute_globalstep(60)
|
||||
assert.equal(0, mesecon.get_heat(layout[2][1]))
|
||||
end)
|
||||
|
||||
it("tracks movement", function()
|
||||
local oldpos = layout[2][1]
|
||||
local pos = vector.offset(oldpos, 0, 1, 0)
|
||||
mesecon.do_overheat(oldpos)
|
||||
mesecon.move_hot_nodes({{pos = pos, oldpos = oldpos}})
|
||||
assert.equal(0, mesecon.get_heat(oldpos))
|
||||
assert.equal(1, mesecon.get_heat(pos))
|
||||
end)
|
||||
|
||||
it("causes overheating", function()
|
||||
-- Switch the first receptor on and off until it overheats/breaks a receptor.
|
||||
repeat
|
||||
if mesecon.flipstate(layout[1][1], minetest.get_node(layout[1][1])) == "on" then
|
||||
mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs)
|
||||
else
|
||||
mesecon.receptor_off(layout[1][1], mesecon.rules.alldirs)
|
||||
end
|
||||
mineunit:execute_globalstep(0) -- Execute receptor_on/receptor_off/activate/deactivate/change actions
|
||||
until minetest.get_node(layout[2][1]).name ~= "mesecons:test_effector"
|
||||
assert.same({"overheat", layout[2][1]}, mesecon._test_effector_events[#mesecon._test_effector_events])
|
||||
assert.equal(0, mesecon.get_heat(layout[2][1]))
|
||||
end)
|
||||
end)
|
||||
|
||||
describe("screwdriver service", function()
|
||||
local layout = {
|
||||
{{x = 0, y = 0, z = 0}, "mesecons:test_conductor_rot_on"},
|
||||
{{x = 1, y = 0, z = 0}, "mesecons:test_receptor_on"},
|
||||
{{x = -1, y = 0, z = 0}, "mesecons:test_conductor_on"},
|
||||
{{x = 0, y = 0, z = 1}, "mesecons:test_receptor_on"},
|
||||
{{x = 0, y = 0, z = -1}, "mesecons:test_conductor_off"},
|
||||
}
|
||||
|
||||
local function rotate(new_param2)
|
||||
local pos = layout[1][1]
|
||||
local node = world.get_node(pos)
|
||||
local on_rotate = minetest.registered_nodes[node.name].on_rotate
|
||||
on_rotate(pos, node, nil, screwdriver.ROTATE_FACE, new_param2)
|
||||
end
|
||||
|
||||
before_each(function()
|
||||
world.layout(layout)
|
||||
end)
|
||||
|
||||
after_each(function()
|
||||
mesecon._test_reset()
|
||||
world.clear()
|
||||
end)
|
||||
|
||||
it("updates conductors", function()
|
||||
-- Rotate a conductor and see that the circuit state changes.
|
||||
rotate(1)
|
||||
mineunit:execute_globalstep() -- Execute receptor_off action
|
||||
assert.equal("mesecons:test_conductor_off", world.get_node(layout[3][1]).name)
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[5][1]).name)
|
||||
rotate(2)
|
||||
mineunit:execute_globalstep() -- Execute receptor_off action
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name)
|
||||
assert.equal("mesecons:test_conductor_off", world.get_node(layout[5][1]).name)
|
||||
rotate(3)
|
||||
mineunit:execute_globalstep() -- Execute receptor_off action
|
||||
assert.equal("mesecons:test_conductor_off", world.get_node(layout[3][1]).name)
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[5][1]).name)
|
||||
rotate(0)
|
||||
mineunit:execute_globalstep() -- Execute receptor_off action
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name)
|
||||
assert.equal("mesecons:test_conductor_off", world.get_node(layout[5][1]).name)
|
||||
end)
|
||||
end)
|
@ -1,147 +0,0 @@
|
||||
require("mineunit")
|
||||
|
||||
fixture("mesecons")
|
||||
|
||||
describe("state", function()
|
||||
local layout = {
|
||||
{{x = 1, y = 0, z = 0}, "mesecons:test_receptor_off"},
|
||||
{{x = 0, y = 1, z = 0}, "mesecons:test_receptor_off"},
|
||||
{{x = 0, y = 0, z = 0}, "mesecons:test_conductor_off"},
|
||||
{{x = -1, y = 0, z = 0}, "mesecons:test_effector"},
|
||||
{{x = 2, y = 0, z = 0}, "mesecons:test_effector"},
|
||||
{{x = 0, y = -1, z = 0}, "mesecons:test_effector"},
|
||||
}
|
||||
|
||||
before_each(function()
|
||||
world.layout(layout)
|
||||
end)
|
||||
|
||||
after_each(function()
|
||||
mesecon._test_reset()
|
||||
world.clear()
|
||||
end)
|
||||
|
||||
it("turns on", function()
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
mineunit:execute_globalstep() -- Execute activate/change actions
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name)
|
||||
assert.equal(tonumber("10000001", 2), world.get_node(layout[4][1]).param2)
|
||||
assert.equal(tonumber("10000010", 2), world.get_node(layout[5][1]).param2)
|
||||
assert.equal(tonumber("10000100", 2), world.get_node(layout[6][1]).param2)
|
||||
|
||||
world.set_node(layout[2][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[2][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
mineunit:execute_globalstep() -- Execute activate/change actions
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name)
|
||||
assert.equal(tonumber("10000001", 2), world.get_node(layout[4][1]).param2)
|
||||
assert.equal(tonumber("10000010", 2), world.get_node(layout[5][1]).param2)
|
||||
assert.equal(tonumber("10000100", 2), world.get_node(layout[6][1]).param2)
|
||||
end)
|
||||
|
||||
it("turns off", function()
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_on")
|
||||
world.set_node(layout[2][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs)
|
||||
mesecon.receptor_on(layout[2][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on actions
|
||||
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_off")
|
||||
mesecon.receptor_off(layout[1][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_off and activate/change actions
|
||||
mineunit:execute_globalstep() -- Execute deactivate/change actions
|
||||
assert.equal("mesecons:test_conductor_on", world.get_node(layout[3][1]).name)
|
||||
assert.equal(tonumber("10000001", 2), world.get_node(layout[4][1]).param2)
|
||||
assert.equal(tonumber("00000000", 2), world.get_node(layout[5][1]).param2)
|
||||
assert.equal(tonumber("10000100", 2), world.get_node(layout[6][1]).param2)
|
||||
|
||||
world.set_node(layout[2][1], "mesecons:test_receptor_off")
|
||||
mesecon.receptor_off(layout[2][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_off action
|
||||
mineunit:execute_globalstep() -- Execute deactivate/change actions
|
||||
assert.equal("mesecons:test_conductor_off", world.get_node(layout[3][1]).name)
|
||||
assert.equal(tonumber("00000000", 2), world.get_node(layout[4][1]).param2)
|
||||
assert.equal(tonumber("00000000", 2), world.get_node(layout[5][1]).param2)
|
||||
assert.equal(tonumber("00000000", 2), world.get_node(layout[6][1]).param2)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe("rotation", function()
|
||||
local layout = {
|
||||
{{x = 0, y = 0, z = 0}, "mesecons:test_receptor_off"},
|
||||
{{x = 1, y = 0, z = 0}, {name = "mesecons:test_conductor_rot_off", param2 = 0}},
|
||||
{{x = 0, y = 0, z = 1}, {name = "mesecons:test_conductor_rot_off", param2 = 1}},
|
||||
{{x = -1, y = 0, z = 0}, {name = "mesecons:test_conductor_rot_off", param2 = 2}},
|
||||
{{x = 0, y = 0, z = -1}, {name = "mesecons:test_conductor_rot_off", param2 = 3}},
|
||||
}
|
||||
|
||||
before_each(function()
|
||||
for _, entry in ipairs(layout) do
|
||||
world.set_node(entry[1], entry[2])
|
||||
end
|
||||
end)
|
||||
|
||||
after_each(function()
|
||||
mesecon._test_reset()
|
||||
world.clear()
|
||||
end)
|
||||
|
||||
it("works", function()
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
assert.equal("mesecons:test_conductor_rot_on", world.get_node(layout[2][1]).name)
|
||||
assert.equal("mesecons:test_conductor_rot_on", world.get_node(layout[3][1]).name)
|
||||
assert.equal("mesecons:test_conductor_rot_on", world.get_node(layout[4][1]).name)
|
||||
assert.equal("mesecons:test_conductor_rot_on", world.get_node(layout[5][1]).name)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe("multiconductor", function()
|
||||
local layout = {
|
||||
{{x = 1, y = 0, z = 0}, "mesecons:test_receptor_off"},
|
||||
{{x = 0, y = 1, z = 0}, "mesecons:test_receptor_off"},
|
||||
{{x = 0, y = 0, z = 1}, "mesecons:test_receptor_off"},
|
||||
{{x = 0, y = 0, z = 0}, "mesecons:test_multiconductor_off"},
|
||||
}
|
||||
|
||||
before_each(function()
|
||||
world.layout(layout)
|
||||
end)
|
||||
|
||||
after_each(function()
|
||||
world.clear()
|
||||
mesecon._test_reset()
|
||||
end)
|
||||
|
||||
it("separates its subparts", function()
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
assert.equal("mesecons:test_multiconductor_001", world.get_node(layout[4][1]).name)
|
||||
|
||||
world.set_node(layout[2][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[2][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
assert.equal("mesecons:test_multiconductor_011", world.get_node(layout[4][1]).name)
|
||||
|
||||
world.set_node(layout[3][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[3][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
assert.equal("mesecons:test_multiconductor_on", world.get_node(layout[4][1]).name)
|
||||
end)
|
||||
|
||||
it("loops through itself", function()
|
||||
-- Make a loop.
|
||||
world.set_node({x = 0, y = -1, z = 0}, "mesecons:test_conductor_off")
|
||||
world.set_node({x = -1, y = -1, z = 0}, "mesecons:test_conductor_off")
|
||||
world.set_node({x = -1, y = 0, z = 0}, "mesecons:test_conductor_off")
|
||||
|
||||
world.set_node(layout[1][1], "mesecons:test_receptor_on")
|
||||
mesecon.receptor_on(layout[1][1], mesecon.rules.alldirs)
|
||||
mineunit:execute_globalstep() -- Execute receptor_on action
|
||||
assert.equal("mesecons:test_multiconductor_101", world.get_node(layout[4][1]).name)
|
||||
end)
|
||||
end)
|
Before Width: | Height: | Size: 844 B After Width: | Height: | Size: 844 B |
Before Width: | Height: | Size: 838 B After Width: | Height: | Size: 838 B |
Before Width: | Height: | Size: 851 B After Width: | Height: | Size: 851 B |
Before Width: | Height: | Size: 846 B After Width: | Height: | Size: 846 B |
@ -6,24 +6,6 @@ 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 = {}
|
||||
@ -72,28 +54,7 @@ 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)
|
||||
--[[
|
||||
@ -356,14 +317,15 @@ 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
|
||||
|
||||
@ -375,7 +337,6 @@ local vm_update_light = false
|
||||
-- vm_abort.
|
||||
function mesecon.vm_begin()
|
||||
vm_cache = {}
|
||||
vm_node_cache = {}
|
||||
vm_update_light = false
|
||||
end
|
||||
|
||||
@ -385,19 +346,18 @@ function mesecon.vm_commit()
|
||||
for hash, tbl in pairs(vm_cache) do
|
||||
if tbl.dirty then
|
||||
local vm = tbl.vm
|
||||
vm:set_data(tbl.data)
|
||||
vm:write_to_map(vm_update_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.
|
||||
@ -405,7 +365,10 @@ local function vm_get_or_create_entry(pos)
|
||||
local hash = hash_blockpos(pos)
|
||||
local tbl = vm_cache[hash]
|
||||
if not tbl then
|
||||
tbl = {vm = minetest.get_voxel_manip(pos, pos), dirty = false}
|
||||
local vm = minetest.get_voxel_manip(pos, pos)
|
||||
local min_pos, max_pos = vm:get_emerged_area()
|
||||
local va = VoxelArea:new{MinEdge = min_pos, MaxEdge = max_pos}
|
||||
tbl = {vm = vm, va = va, data = vm:get_data(), param1 = vm:get_light_data(), param2 = vm:get_param2_data(), dirty = false}
|
||||
vm_cache[hash] = tbl
|
||||
end
|
||||
return tbl
|
||||
@ -414,13 +377,16 @@ end
|
||||
-- Gets the node at a given position during a VoxelManipulator-based
|
||||
-- transaction.
|
||||
function mesecon.vm_get_node(pos)
|
||||
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
|
||||
local tbl = vm_get_or_create_entry(pos)
|
||||
local index = tbl.va:indexp(pos)
|
||||
local node_value = tbl.data[index]
|
||||
if node_value == minetest.CONTENT_IGNORE then
|
||||
return nil
|
||||
else
|
||||
local node_param1 = tbl.param1[index]
|
||||
local node_param2 = tbl.param2[index]
|
||||
return {name = minetest.get_name_from_content_id(node_value), param1 = node_param1, param2 = node_param2}
|
||||
end
|
||||
return node.name ~= "ignore" and {name = node.name, param1 = node.param1, param2 = node.param2} or nil
|
||||
end
|
||||
|
||||
-- Sets a node’s name during a VoxelManipulator-based transaction.
|
||||
@ -434,14 +400,8 @@ function mesecon.vm_swap_node(pos, name, update_light)
|
||||
vm_update_light = vm_update_light or update_light ~= false
|
||||
|
||||
local tbl = vm_get_or_create_entry(pos)
|
||||
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)
|
||||
local index = tbl.va:indexp(pos)
|
||||
tbl.data[index] = minetest.get_content_id(name)
|
||||
tbl.dirty = true
|
||||
end
|
||||
|
||||
|
@ -1,7 +1,5 @@
|
||||
-- The BLINKY_PLANT
|
||||
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local toggle_timer = function (pos)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
if timer:is_started() then
|
||||
@ -22,13 +20,13 @@ local on_timer = function (pos)
|
||||
end
|
||||
|
||||
mesecon.register_node("mesecons_blinkyplant:blinky_plant", {
|
||||
description= S("Blinky Plant"),
|
||||
description="Blinky Plant",
|
||||
drawtype = "plantlike",
|
||||
inventory_image = "jeija_blinky_plant_off.png",
|
||||
paramtype = "light",
|
||||
is_ground_content = false,
|
||||
walkable = false,
|
||||
sounds = mesecon.node_sound.leaves,
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3},
|
||||
|
@ -1,2 +0,0 @@
|
||||
# textdomain: mesecons_blinkyplant
|
||||
Blinky Plant=Blinkpflanze
|
@ -1,4 +0,0 @@
|
||||
# textdomain: mesecons_blinkyplant
|
||||
|
||||
### init.lua ###
|
||||
Blinky Plant=Palpebruma Planto
|
@ -1,4 +0,0 @@
|
||||
# textdomain: mesecons_blinkyplant
|
||||
|
||||
### init.lua ###
|
||||
Blinky Plant=Plante clignotante
|
@ -1,4 +0,0 @@
|
||||
# textdomain: mesecons_blinkyplant
|
||||
|
||||
### init.lua ###
|
||||
Blinky Plant=
|
@ -1,2 +1,2 @@
|
||||
name = mesecons_blinkyplant
|
||||
depends = mesecons, mesecons_gamecompat
|
||||
depends = default, mesecons
|
||||
|
@ -1,7 +1,6 @@
|
||||
-- WALL BUTTON
|
||||
-- A button that when pressed emits power for 1 second
|
||||
-- and then turns off again
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
mesecon.button_turnoff = function (pos)
|
||||
local node = minetest.get_node(pos)
|
||||
@ -46,14 +45,14 @@ minetest.register_node("mesecons_button:button_off", {
|
||||
}
|
||||
},
|
||||
groups = {dig_immediate=2, mesecon_needs_receiver = 1},
|
||||
description = S("Button"),
|
||||
description = "Button",
|
||||
on_rightclick = function (pos, node)
|
||||
minetest.swap_node(pos, {name = "mesecons_button:button_on", param2=node.param2})
|
||||
mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node))
|
||||
minetest.sound_play("mesecons_button_push", { pos = pos }, true)
|
||||
minetest.get_node_timer(pos):start(1)
|
||||
end,
|
||||
sounds = mesecon.node_sound.stone,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off,
|
||||
rules = mesecon.rules.buttonlike_get
|
||||
@ -93,8 +92,8 @@ 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 = S("Button"),
|
||||
sounds = mesecon.node_sound.stone,
|
||||
description = "Button",
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.on,
|
||||
rules = mesecon.rules.buttonlike_get
|
||||
@ -106,6 +105,6 @@ minetest.register_node("mesecons_button:button_on", {
|
||||
minetest.register_craft({
|
||||
output = "mesecons_button:button_off 2",
|
||||
recipe = {
|
||||
{"group:mesecon_conductor_craftable","mesecons_gamecompat:stone"},
|
||||
{"group:mesecon_conductor_craftable","default:stone"},
|
||||
}
|
||||
})
|
||||
|
@ -1,2 +0,0 @@
|
||||
# textdomain: mesecons_button
|
||||
Button=Taster
|
@ -1,4 +0,0 @@
|
||||
# textdomain: mesecons_button
|
||||
|
||||
### init.lua ###
|
||||
Button=Butono
|
@ -1,4 +0,0 @@
|
||||
# textdomain: mesecons_button
|
||||
|
||||
### init.lua ###
|
||||
Button=Bouton
|
@ -1,4 +0,0 @@
|
||||
# textdomain: mesecons_button
|
||||
|
||||
### init.lua ###
|
||||
Button=
|
@ -1,2 +1,2 @@
|
||||
name = mesecons_button
|
||||
depends = mesecons, mesecons_gamecompat, mesecons_receiver
|
||||
depends = default, mesecons, mesecons_receiver
|
||||
|
@ -1,8 +1,6 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
minetest.register_chatcommand("say", {
|
||||
params = "<text>",
|
||||
description = S("Say <text> as the server"),
|
||||
description = "Say <text> as the server",
|
||||
privs = {server=true},
|
||||
func = function(name, param)
|
||||
minetest.chat_send_all(name .. ": " .. param)
|
||||
@ -11,7 +9,7 @@ minetest.register_chatcommand("say", {
|
||||
|
||||
minetest.register_chatcommand("tell", {
|
||||
params = "<name> <text>",
|
||||
description = S("Say <text> to <name> privately"),
|
||||
description = "Say <text> to <name> privately",
|
||||
privs = {shout=true},
|
||||
func = function(name, param)
|
||||
local found, _, target, message = param:find("^([^%s]+)%s+(.*)$")
|
||||
@ -28,7 +26,7 @@ minetest.register_chatcommand("tell", {
|
||||
|
||||
minetest.register_chatcommand("hp", {
|
||||
params = "<name> <value>",
|
||||
description = S("Set health of <name> to <value> hitpoints"),
|
||||
description = "Set health of <name> to <value> hitpoints",
|
||||
privs = {ban=true},
|
||||
func = function(name, param)
|
||||
local found, _, target, value = param:find("^([^%s]+)%s+(%d+)$")
|
||||
@ -182,7 +180,7 @@ local function can_dig(pos, player)
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_commandblock:commandblock_off", {
|
||||
description = S("Command Block"),
|
||||
description = "Command Block",
|
||||
tiles = {"jeija_commandblock_off.png"},
|
||||
inventory_image = minetest.inventorycube("jeija_commandblock_off.png"),
|
||||
is_ground_content = false,
|
||||
@ -191,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 = mesecon.node_sound.stone,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_on = commandblock_action_on
|
||||
}},
|
||||
@ -208,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 = mesecon.node_sound.stone,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {effector = {
|
||||
action_off = commandblock_action_off
|
||||
}},
|
||||
|
@ -1,5 +0,0 @@
|
||||
# textdomain: mesecons_commandblock
|
||||
Say <text> as the server=<Text> als Server sagen
|
||||
Say <text> to <name> privately=<Text> an <Name> privat senden
|
||||
Set health of <name> to <value> hitpoints=Gesundheit von <Name> auf <Wert> Trefferpunkte setzen
|
||||
Command Block=Befehlsblock
|
@ -1,7 +0,0 @@
|
||||
# textdomain: mesecons_commandblock
|
||||
|
||||
### init.lua ###
|
||||
Say <text> as the server=Diru <teksto> kiel la servilo
|
||||
Say <text> to <name> privately=Diru <teksto> al <nomo> private
|
||||
Set health of <name> to <value> hitpoints=Agordu sanon de <nomo> al <valoro>
|
||||
Command Block=Komando-Bloko
|
@ -1,7 +0,0 @@
|
||||
# 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
|
@ -1,7 +0,0 @@
|
||||
# textdomain: mesecons_commandblock
|
||||
|
||||
### init.lua ###
|
||||
Say <text> as the server=
|
||||
Say <text> to <name> privately=
|
||||
Set health of <name> to <value> hitpoints=
|
||||
Command Block=
|
@ -1,2 +1,2 @@
|
||||
name = mesecons_commandblock
|
||||
depends = mesecons, mesecons_gamecompat
|
||||
depends = default, mesecons
|
||||
|
@ -1,9 +1,19 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
-- Function that get the input/output rules of the delayer
|
||||
local delayer_get_output_rules = mesecon.horiz_rules_getter({{x = 1, y = 0, z = 0}})
|
||||
local delayer_get_output_rules = function(node)
|
||||
local rules = {{x = 0, y = 0, z = 1}}
|
||||
for i = 0, node.param2 do
|
||||
rules = mesecon.rotate_rules_left(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
local delayer_get_input_rules = mesecon.horiz_rules_getter({{x = -1, y = 0, z = 0}})
|
||||
local delayer_get_input_rules = function(node)
|
||||
local rules = {{x = 0, y = 0, z = -1}}
|
||||
for i = 0, node.param2 do
|
||||
rules = mesecon.rotate_rules_left(rules)
|
||||
end
|
||||
return rules
|
||||
end
|
||||
|
||||
-- Functions that are called after the delay time
|
||||
|
||||
@ -27,6 +37,20 @@ local delaytime = { 0.1, 0.3, 0.5, 1.0 }
|
||||
|
||||
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
|
||||
local def = {
|
||||
drawtype = "nodebox",
|
||||
@ -34,25 +58,20 @@ local def = {
|
||||
walkable = true,
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 },
|
||||
fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
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 }
|
||||
},
|
||||
fixed = boxes
|
||||
},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
delayer_time = delaytime[i],
|
||||
sounds = mesecon.node_sound.stone,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
on_blast = mesecon.on_blastnode,
|
||||
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
|
||||
@ -62,18 +81,17 @@ if i > 1 then
|
||||
end
|
||||
|
||||
local off_state = {
|
||||
description = S("Delayer"),
|
||||
inventory_image = "jeija_gate_off.png^jeija_delayer.png",
|
||||
wield_image = "jeija_gate_off.png^jeija_delayer.png",
|
||||
description = "Delayer",
|
||||
tiles = {
|
||||
"jeija_microcontroller_bottom.png^jeija_gate_output_off.png^jeija_gate_off.png^"..
|
||||
"jeija_delayer.png^mesecons_delayer_"..tostring(i)..".png",
|
||||
"jeija_microcontroller_bottom.png^jeija_gate_output_off.png",
|
||||
"jeija_gate_side.png^jeija_gate_side_output_off.png",
|
||||
"jeija_gate_side.png",
|
||||
"jeija_gate_side.png",
|
||||
"jeija_gate_side.png",
|
||||
"mesecons_delayer_off_"..tostring(i)..".png",
|
||||
"mesecons_delayer_bottom.png",
|
||||
"mesecons_delayer_ends_off.png",
|
||||
"mesecons_delayer_ends_off.png",
|
||||
"mesecons_delayer_sides_off.png",
|
||||
"mesecons_delayer_sides_off.png"
|
||||
},
|
||||
inventory_image = "mesecons_delayer_off_1.png",
|
||||
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() or "") then
|
||||
@ -85,6 +103,7 @@ local off_state = {
|
||||
param2 = node.param2
|
||||
})
|
||||
end,
|
||||
delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i),
|
||||
mesecons = {
|
||||
receptor =
|
||||
{
|
||||
@ -94,7 +113,6 @@ local off_state = {
|
||||
effector =
|
||||
{
|
||||
rules = delayer_get_input_rules,
|
||||
action_off = delayer_deactivate,
|
||||
action_on = delayer_activate
|
||||
}
|
||||
},
|
||||
@ -106,17 +124,14 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), off_state)
|
||||
|
||||
-- Activated delayer definition defaults
|
||||
local on_state = {
|
||||
description = S("You hacker you"),
|
||||
inventory_image = "jeija_gate_on.png^jeija_delayer.png",
|
||||
wield_image = "jeija_gate_on.png^jeija_delayer.png",
|
||||
description = "You hacker you",
|
||||
tiles = {
|
||||
"jeija_microcontroller_bottom.png^jeija_gate_output_on.png^jeija_gate_on.png^"..
|
||||
"jeija_delayer.png^mesecons_delayer_"..tostring(i)..".png",
|
||||
"jeija_microcontroller_bottom.png^jeija_gate_output_on.png",
|
||||
"jeija_gate_side.png^jeija_gate_side_output_on.png",
|
||||
"jeija_gate_side.png",
|
||||
"jeija_gate_side.png",
|
||||
"jeija_gate_side.png",
|
||||
"mesecons_delayer_on_"..tostring(i)..".png",
|
||||
"mesecons_delayer_bottom.png",
|
||||
"mesecons_delayer_ends_on.png",
|
||||
"mesecons_delayer_ends_on.png",
|
||||
"mesecons_delayer_sides_on.png",
|
||||
"mesecons_delayer_sides_on.png"
|
||||
},
|
||||
groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1},
|
||||
on_punch = function(pos, node, puncher)
|
||||
@ -129,6 +144,7 @@ local on_state = {
|
||||
param2 = node.param2
|
||||
})
|
||||
end,
|
||||
delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i),
|
||||
mesecons = {
|
||||
receptor =
|
||||
{
|
||||
@ -138,8 +154,7 @@ local on_state = {
|
||||
effector =
|
||||
{
|
||||
rules = delayer_get_input_rules,
|
||||
action_off = delayer_deactivate,
|
||||
action_on = delayer_activate
|
||||
action_off = delayer_deactivate
|
||||
}
|
||||
},
|
||||
}
|
||||
@ -154,6 +169,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"},
|
||||
{"mesecons_gamecompat:cobble","mesecons_gamecompat:cobble", "mesecons_gamecompat:cobble"},
|
||||
{"default:cobble","default:cobble", "default:cobble"},
|
||||
}
|
||||
})
|
||||
|
@ -1,3 +0,0 @@
|
||||
# textdomain: mesecons_delayer
|
||||
Delayer=Verzögerer
|
||||
You hacker you=Du Hacker, Du
|
@ -1,5 +0,0 @@
|
||||
# textdomain: mesecons_delayer
|
||||
|
||||
### init.lua ###
|
||||
Delayer=Prokrasto
|
||||
You hacker you=Vi hakisto
|
@ -1,5 +0,0 @@
|
||||
# textdomain: mesecons_delayer
|
||||
|
||||
### init.lua ###
|
||||
Delayer=Retardateur
|
||||
You hacker you=Vous êtes un pirate informatique
|
@ -1,5 +0,0 @@
|
||||
# textdomain: mesecons_delayer
|
||||
|
||||
### init.lua ###
|
||||
Delayer=
|
||||
You hacker you=
|
@ -1,2 +1,2 @@
|
||||
name = mesecons_delayer
|
||||
depends = mesecons, mesecons_gamecompat
|
||||
depends = default, mesecons
|
||||
|
Before Width: | Height: | Size: 149 B |
Before Width: | Height: | Size: 338 B |
Before Width: | Height: | Size: 337 B |
Before Width: | Height: | Size: 339 B |
Before Width: | Height: | Size: 334 B |
BIN
mesecons_delayer/textures/mesecons_delayer_bottom.png
Normal file
After Width: | Height: | Size: 221 B |
BIN
mesecons_delayer/textures/mesecons_delayer_ends_off.png
Normal file
After Width: | Height: | Size: 176 B |
BIN
mesecons_delayer/textures/mesecons_delayer_ends_on.png
Normal file
After Width: | Height: | Size: 187 B |
BIN
mesecons_delayer/textures/mesecons_delayer_off_1.png
Normal file
After Width: | Height: | Size: 448 B |
BIN
mesecons_delayer/textures/mesecons_delayer_off_2.png
Normal file
After Width: | Height: | Size: 449 B |
BIN
mesecons_delayer/textures/mesecons_delayer_off_3.png
Normal file
After Width: | Height: | Size: 448 B |
BIN
mesecons_delayer/textures/mesecons_delayer_off_4.png
Normal file
After Width: | Height: | Size: 446 B |
BIN
mesecons_delayer/textures/mesecons_delayer_on_1.png
Normal file
After Width: | Height: | Size: 541 B |
BIN
mesecons_delayer/textures/mesecons_delayer_on_2.png
Normal file
After Width: | Height: | Size: 541 B |
BIN
mesecons_delayer/textures/mesecons_delayer_on_3.png
Normal file
After Width: | Height: | Size: 541 B |
BIN
mesecons_delayer/textures/mesecons_delayer_on_4.png
Normal file
After Width: | Height: | Size: 538 B |
BIN
mesecons_delayer/textures/mesecons_delayer_sides_off.png
Normal file
After Width: | Height: | Size: 173 B |
BIN
mesecons_delayer/textures/mesecons_delayer_sides_on.png
Normal file
After Width: | Height: | Size: 181 B |
@ -1,19 +1,5 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local side_texture = mesecon.texture.steel_block or "mesecons_detector_side.png"
|
||||
|
||||
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
|
||||
-- Detects players in a certain radius
|
||||
-- The radius can be specified in mesecons/settings.lua
|
||||
@ -45,7 +31,10 @@ local function object_detector_scan(pos)
|
||||
if next(objs) == nil then return false end
|
||||
|
||||
local scanname = minetest.get_meta(pos):get_string("scanname")
|
||||
local scan_for = comma_list_to_table(scanname)
|
||||
local scan_for = {}
|
||||
for _, str in pairs(string.split(scanname:gsub(" ", ""), ",")) do
|
||||
scan_for[str] = true
|
||||
end
|
||||
|
||||
local every_player = scanname == ""
|
||||
for _, obj in pairs(objs) do
|
||||
@ -75,25 +64,25 @@ local object_detector_digiline = {
|
||||
}
|
||||
|
||||
minetest.register_node("mesecons_detector:object_detector_off", {
|
||||
tiles = {side_texture, side_texture, "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png"},
|
||||
tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png"},
|
||||
paramtype = "light",
|
||||
is_ground_content = false,
|
||||
walkable = true,
|
||||
groups = {cracky=3},
|
||||
description= S("Player Detector"),
|
||||
description="Player Detector",
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off,
|
||||
rules = mesecon.rules.pplate
|
||||
}},
|
||||
on_construct = object_detector_make_formspec,
|
||||
on_receive_fields = object_detector_on_receive_fields,
|
||||
sounds = mesecon.node_sound.stone,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
digiline = object_detector_digiline,
|
||||
on_blast = mesecon.on_blastnode,
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_detector:object_detector_on", {
|
||||
tiles = {side_texture, side_texture, "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png"},
|
||||
tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png"},
|
||||
paramtype = "light",
|
||||
is_ground_content = false,
|
||||
walkable = true,
|
||||
@ -105,7 +94,7 @@ minetest.register_node("mesecons_detector:object_detector_on", {
|
||||
}},
|
||||
on_construct = object_detector_make_formspec,
|
||||
on_receive_fields = object_detector_on_receive_fields,
|
||||
sounds = mesecon.node_sound.stone,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
digiline = object_detector_digiline,
|
||||
on_blast = mesecon.on_blastnode,
|
||||
})
|
||||
@ -113,18 +102,18 @@ minetest.register_node("mesecons_detector:object_detector_on", {
|
||||
minetest.register_craft({
|
||||
output = 'mesecons_detector:object_detector_off',
|
||||
recipe = {
|
||||
{"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"},
|
||||
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
|
||||
{"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "default:steel_ingot"},
|
||||
{"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'mesecons_detector:object_detector_off',
|
||||
recipe = {
|
||||
{"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"},
|
||||
{"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"},
|
||||
}
|
||||
})
|
||||
|
||||
@ -195,9 +184,8 @@ local function node_detector_scan(pos)
|
||||
vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1))
|
||||
).name
|
||||
local scanname = meta:get_string("scanname")
|
||||
local scan_for = comma_list_to_table(scanname)
|
||||
|
||||
return (scan_for[frontname]) or
|
||||
return (frontname == scanname) or
|
||||
(frontname ~= "air" and frontname ~= "ignore" and scanname == "")
|
||||
end
|
||||
|
||||
@ -223,10 +211,10 @@ local node_detector_digiline = {
|
||||
|
||||
if type(msg) == "table" then
|
||||
if msg.distance or msg.scanname then
|
||||
if type(msg.distance) == "number" or type(msg.distance) == "string" then
|
||||
if msg.distance then
|
||||
meta:set_string("distance", msg.distance)
|
||||
end
|
||||
if type(msg.scanname) == "string" then
|
||||
if msg.scanname then
|
||||
meta:set_string("scanname", msg.scanname)
|
||||
end
|
||||
node_detector_make_formspec(pos)
|
||||
@ -240,7 +228,7 @@ local node_detector_digiline = {
|
||||
else
|
||||
if msg == GET_COMMAND then
|
||||
node_detector_send_node_name(pos, node, channel, meta)
|
||||
elseif type(msg) == "string" then
|
||||
else
|
||||
meta:set_string("scanname", msg)
|
||||
node_detector_make_formspec(pos)
|
||||
end
|
||||
@ -251,25 +239,25 @@ local node_detector_digiline = {
|
||||
}
|
||||
|
||||
minetest.register_node("mesecons_detector:node_detector_off", {
|
||||
tiles = {side_texture, side_texture, side_texture, side_texture, side_texture, "jeija_node_detector_off.png"},
|
||||
tiles = {"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "jeija_node_detector_off.png"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
walkable = true,
|
||||
groups = {cracky=3},
|
||||
description = S("Node Detector"),
|
||||
description="Node Detector",
|
||||
mesecons = {receptor = {
|
||||
state = mesecon.state.off
|
||||
}},
|
||||
on_construct = node_detector_make_formspec,
|
||||
on_receive_fields = node_detector_on_receive_fields,
|
||||
sounds = mesecon.node_sound.stone,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
digiline = node_detector_digiline,
|
||||
on_blast = mesecon.on_blastnode,
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_detector:node_detector_on", {
|
||||
tiles = {side_texture, side_texture, side_texture, side_texture, side_texture, "jeija_node_detector_on.png"},
|
||||
tiles = {"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "jeija_node_detector_on.png"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
@ -281,7 +269,7 @@ minetest.register_node("mesecons_detector:node_detector_on", {
|
||||
}},
|
||||
on_construct = node_detector_make_formspec,
|
||||
on_receive_fields = node_detector_on_receive_fields,
|
||||
sounds = mesecon.node_sound.stone,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
digiline = node_detector_digiline,
|
||||
on_blast = mesecon.on_blastnode,
|
||||
})
|
||||
@ -289,18 +277,18 @@ minetest.register_node("mesecons_detector:node_detector_on", {
|
||||
minetest.register_craft({
|
||||
output = 'mesecons_detector:node_detector_off',
|
||||
recipe = {
|
||||
{"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"},
|
||||
{"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"},
|
||||
{"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "default:steel_ingot"},
|
||||
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'mesecons_detector:node_detector_off',
|
||||
recipe = {
|
||||
{"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"},
|
||||
{"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"},
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -1,3 +0,0 @@
|
||||
# textdomain: mesecons_detector
|
||||
Player Detector=Spielerdetektor
|
||||
Node Detector=Blockdetektor
|
@ -1,5 +0,0 @@
|
||||
# textdomain: mesecons_detector
|
||||
|
||||
### init.lua ###
|
||||
Player Detector=Ludanta Detektilo
|
||||
Node Detector=Noda Detektilo
|
@ -1,5 +0,0 @@
|
||||
# textdomain: mesecons_detector
|
||||
|
||||
### init.lua ###
|
||||
Player Detector=Détecteur de joueur
|
||||
Node Detector=Détecteur de bloc
|
@ -1,5 +0,0 @@
|
||||
# textdomain: mesecons_detector
|
||||
|
||||
### init.lua ###
|
||||
Player Detector=
|
||||
Node Detector=
|
@ -1,2 +1,2 @@
|
||||
name = mesecons_detector
|
||||
depends = mesecons, mesecons_gamecompat, mesecons_materials
|
||||
depends = default, mesecons, mesecons_materials
|
||||
|
Before Width: | Height: | Size: 350 B |
@ -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 minetest.get_node(pos).name ~= check_name then
|
||||
if not minetest.get_node(pos).name == check_name then
|
||||
return
|
||||
end
|
||||
local p2 = minetest.get_node(pos).param2
|
||||
@ -22,11 +22,6 @@ end
|
||||
local function meseconify_door(name)
|
||||
if minetest.registered_items[name .. "_b_1"] then
|
||||
-- old style double-node doors
|
||||
if minetest.registered_items[name .. "_b_1"].mesecons then
|
||||
minetest.log("info", "[mesecons_doors] Not touching door " .. name)
|
||||
return
|
||||
end
|
||||
|
||||
local function toggle_state1 (pos)
|
||||
on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
|
||||
end
|
||||
@ -52,10 +47,6 @@ local function meseconify_door(name)
|
||||
})
|
||||
elseif minetest.registered_items[name .. "_a"] then
|
||||
-- new style mesh node based doors
|
||||
if minetest.registered_items[name .. "_a"].mesecons then
|
||||
minetest.log("info", "[mesecons_doors] Not touching door " .. name)
|
||||
return
|
||||
end
|
||||
local override = {
|
||||
mesecons = {effector = {
|
||||
action_on = function(pos)
|
||||
@ -75,32 +66,32 @@ 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
|
||||
|
||||
meseconify_door("doors:door_wood")
|
||||
meseconify_door("doors:door_steel")
|
||||
meseconify_door("doors:door_glass")
|
||||
meseconify_door("doors:door_obsidian_glass")
|
||||
meseconify_door("xpanes:door_steel_bar")
|
||||
|
||||
-- Trapdoor
|
||||
local function trapdoor_switch(name)
|
||||
return function(pos, node)
|
||||
local function trapdoor_switch(pos, node)
|
||||
local state = minetest.get_meta(pos):get_int("state")
|
||||
|
||||
if state == 1 then
|
||||
minetest.sound_play("doors_door_close", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true)
|
||||
minetest.set_node(pos, {name=name, param2 = node.param2})
|
||||
minetest.set_node(pos, {name="doors:trapdoor", param2 = node.param2})
|
||||
else
|
||||
minetest.sound_play("doors_door_open", { pos = pos, gain = 0.3, max_hear_distance = 10 }, true)
|
||||
minetest.set_node(pos, {name=name.."_open", param2 = node.param2})
|
||||
end
|
||||
minetest.get_meta(pos):set_int("state", state == 1 and 0 or 1)
|
||||
end
|
||||
minetest.set_node(pos, {name="doors:trapdoor_open", param2 = node.param2})
|
||||
end
|
||||
|
||||
minetest.get_meta(pos):set_int("state", state == 1 and 0 or 1)
|
||||
end
|
||||
|
||||
local function meseconify_trapdoor(name)
|
||||
local override
|
||||
if doors and doors.get then
|
||||
override = {
|
||||
local override = {
|
||||
mesecons = {effector = {
|
||||
action_on = function(pos)
|
||||
local door = doors.get(pos)
|
||||
@ -116,32 +107,30 @@ local function meseconify_trapdoor(name)
|
||||
end,
|
||||
}},
|
||||
}
|
||||
minetest.override_item("doors:trapdoor", override)
|
||||
minetest.override_item("doors:trapdoor_open", override)
|
||||
minetest.override_item("doors:trapdoor_steel", override)
|
||||
minetest.override_item("doors:trapdoor_steel_open", override)
|
||||
|
||||
if minetest.registered_items["xpanes:trapdoor_steel_bar"] then
|
||||
minetest.override_item("xpanes:trapdoor_steel_bar", override)
|
||||
minetest.override_item("xpanes:trapdoor_steel_bar_open", override)
|
||||
end
|
||||
|
||||
else
|
||||
override = {
|
||||
if minetest.registered_nodes["doors:trapdoor"] then
|
||||
minetest.override_item("doors:trapdoor", {
|
||||
mesecons = {effector = {
|
||||
action_on = trapdoor_switch(name),
|
||||
action_off = trapdoor_switch(name)
|
||||
action_on = trapdoor_switch,
|
||||
action_off = trapdoor_switch
|
||||
}},
|
||||
}
|
||||
end
|
||||
})
|
||||
|
||||
if minetest.registered_items[name] then
|
||||
minetest.override_item(name, override)
|
||||
minetest.override_item(name.."_open", override)
|
||||
minetest.override_item("doors:trapdoor_open", {
|
||||
mesecons = {effector = {
|
||||
action_on = trapdoor_switch,
|
||||
action_off = trapdoor_switch
|
||||
}},
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_mods_loaded(function()
|
||||
if doors.registered_doors ~= nil then -- registered_doors is not always available
|
||||
for k,_ in pairs(doors.registered_doors) do
|
||||
if k:find("_a$") then
|
||||
meseconify_door(k:sub(1,-3))
|
||||
end
|
||||
end
|
||||
for k,_ in pairs(doors.registered_trapdoors) do
|
||||
if not k:find("_open$") then
|
||||
meseconify_trapdoor(k)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
@ -1,14 +1,21 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
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 = mesecon.horiz_rules_getter({
|
||||
{x = 0, y = 0, z = -1},
|
||||
{x = -1, y = 0, z = 0},
|
||||
})
|
||||
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
|
||||
|
||||
minetest.register_node("mesecons_extrawires:corner_on", {
|
||||
drawtype = "mesh",
|
||||
@ -25,7 +32,7 @@ minetest.register_node("mesecons_extrawires:corner_on", {
|
||||
selection_box = corner_selectionbox,
|
||||
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
|
||||
drop = "mesecons_extrawires:corner_off",
|
||||
sounds = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {conductor =
|
||||
{
|
||||
state = mesecon.state.on,
|
||||
@ -33,12 +40,12 @@ minetest.register_node("mesecons_extrawires:corner_on", {
|
||||
offstate = "mesecons_extrawires:corner_off"
|
||||
}},
|
||||
on_blast = mesecon.on_blastnode,
|
||||
on_rotate = mesecon.on_rotate_horiz,
|
||||
on_rotate = screwdriver_exists and screwdriver.rotate_simple,
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:corner_off", {
|
||||
drawtype = "mesh",
|
||||
description = S("Insulated Mesecon Corner"),
|
||||
description = "Insulated Mesecon Corner",
|
||||
mesh = "mesecons_extrawires_corner.obj",
|
||||
tiles = {
|
||||
{ name = "jeija_insulated_wire_sides_off.png", backface_culling = true },
|
||||
@ -51,7 +58,7 @@ minetest.register_node("mesecons_extrawires:corner_off", {
|
||||
sunlight_propagates = true,
|
||||
selection_box = corner_selectionbox,
|
||||
groups = {dig_immediate = 3},
|
||||
sounds = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {conductor =
|
||||
{
|
||||
state = mesecon.state.off,
|
||||
@ -59,7 +66,7 @@ minetest.register_node("mesecons_extrawires:corner_off", {
|
||||
onstate = "mesecons_extrawires:corner_on"
|
||||
}},
|
||||
on_blast = mesecon.on_blastnode,
|
||||
on_rotate = mesecon.on_rotate_horiz,
|
||||
on_rotate = screwdriver_exists and screwdriver.rotate_simple,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -69,9 +76,3 @@ minetest.register_craft({
|
||||
{"", "mesecons_insulated:insulated_off"},
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mesecons_insulated:insulated_off",
|
||||
type = "shapeless",
|
||||
recipe = {"mesecons_extrawires:corner_off"}
|
||||
})
|
||||
|
@ -1,5 +1,3 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local crossover_rules = {
|
||||
{--first wire
|
||||
{x=-1,y=0,z=0},
|
||||
@ -19,7 +17,7 @@ local crossover_states = {
|
||||
}
|
||||
|
||||
minetest.register_node("mesecons_extrawires:crossover_off", {
|
||||
description = S("Insulated Mesecon Crossover"),
|
||||
description = "Insulated Mesecon Crossover",
|
||||
drawtype = "mesh",
|
||||
mesh = "mesecons_extrawires_crossover.b3d",
|
||||
tiles = {
|
||||
@ -34,7 +32,7 @@ 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 = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {
|
||||
conductor = {
|
||||
states = crossover_states,
|
||||
@ -45,7 +43,7 @@ minetest.register_node("mesecons_extrawires:crossover_off", {
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:crossover_01", {
|
||||
description = S("You hacker you!"),
|
||||
description = "You hacker you!",
|
||||
drop = "mesecons_extrawires:crossover_off",
|
||||
drawtype = "mesh",
|
||||
mesh = "mesecons_extrawires_crossover.b3d",
|
||||
@ -61,7 +59,7 @@ 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 = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {
|
||||
conductor = {
|
||||
states = crossover_states,
|
||||
@ -72,7 +70,7 @@ minetest.register_node("mesecons_extrawires:crossover_01", {
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:crossover_10", {
|
||||
description = S("You hacker you!"),
|
||||
description = "You hacker you!",
|
||||
drop = "mesecons_extrawires:crossover_off",
|
||||
drawtype = "mesh",
|
||||
mesh = "mesecons_extrawires_crossover.b3d",
|
||||
@ -88,7 +86,7 @@ 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 = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {
|
||||
conductor = {
|
||||
states = crossover_states,
|
||||
@ -99,7 +97,7 @@ minetest.register_node("mesecons_extrawires:crossover_10", {
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:crossover_on", {
|
||||
description = S("You hacker you!"),
|
||||
description = "You hacker you!",
|
||||
drop = "mesecons_extrawires:crossover_off",
|
||||
drawtype = "mesh",
|
||||
mesh = "mesecons_extrawires_crossover.b3d",
|
||||
@ -115,7 +113,7 @@ 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 = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {
|
||||
conductor = {
|
||||
states = crossover_states,
|
||||
|
@ -1,11 +1,12 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
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 doublecorner_get_rules = mesecon.horiz_rules_getter({
|
||||
local rules = {
|
||||
{
|
||||
{ x = 1, y = 0, z = 0 },
|
||||
{ x = 0, y = 0, z = 1 },
|
||||
@ -14,7 +15,19 @@ local doublecorner_get_rules = mesecon.horiz_rules_getter({
|
||||
{ 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",
|
||||
@ -33,7 +46,7 @@ for k, state in ipairs(doublecorner_states) do
|
||||
minetest.register_node(state, {
|
||||
drawtype = "mesh",
|
||||
mesh = "mesecons_extrawires_doublecorner.obj",
|
||||
description = S("Insulated Mesecon Double Corner"),
|
||||
description = "Insulated Mesecon Double Corner",
|
||||
tiles = {
|
||||
{ name = "jeija_insulated_wire_sides_" .. w1 .. ".png", backface_culling = true },
|
||||
{ name = "jeija_insulated_wire_ends_" .. w1 .. ".png", backface_culling = true },
|
||||
@ -48,7 +61,7 @@ for k, state in ipairs(doublecorner_states) do
|
||||
selection_box = doublecorner_selectionbox,
|
||||
groups = groups,
|
||||
drop = doublecorner_states[1],
|
||||
sounds = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {
|
||||
conductor = {
|
||||
states = doublecorner_states,
|
||||
@ -56,7 +69,7 @@ for k, state in ipairs(doublecorner_states) do
|
||||
},
|
||||
},
|
||||
on_blast = mesecon.on_blastnode,
|
||||
on_rotate = mesecon.on_rotate_horiz,
|
||||
on_rotate = rotate,
|
||||
})
|
||||
end
|
||||
|
||||
|
@ -1,8 +0,0 @@
|
||||
# textdomain: mesecons_extrawires
|
||||
Insulated Mesecon Corner=Isolierte Meseconecke
|
||||
Insulated Mesecon Crossover=Isolierter Meseconübergang
|
||||
You hacker you!=Sie Hacker!
|
||||
Insulated Mesecon Double Corner=Isolierte Mesecondoppelecke
|
||||
Mese Wire=Mesedraht
|
||||
Insulated Mesecon T-junction=Isolierte Mesecongabelung
|
||||
Vertical Mesecon=Vertikaler Mesecon
|
@ -1,20 +0,0 @@
|
||||
# textdomain: mesecons_extrawires
|
||||
|
||||
### corner.lua ###
|
||||
Insulated Mesecon Corner=Izolita Mesekonduktila Angulo
|
||||
|
||||
### crossover.lua ###
|
||||
Insulated Mesecon Crossover=Izolita Mesekonduktila Interkruciĝo
|
||||
You hacker you!=Vi hakisto
|
||||
|
||||
### doublecorner.lua ###
|
||||
Insulated Mesecon Double Corner=Izolita Mesekonduktila Duobla Angulo
|
||||
|
||||
### mesewire.lua ###
|
||||
Mese Wire=Mesea Drato
|
||||
|
||||
### tjunction.lua ###
|
||||
Insulated Mesecon T-junction=Izolita Mesekonduktila T-Kruciĝo
|
||||
|
||||
### vertical.lua ###
|
||||
Vertical Mesecon=Vertikala Mesekonduktilo
|
@ -1,20 +0,0 @@
|
||||
# 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
|
@ -1,20 +0,0 @@
|
||||
# textdomain: mesecons_extrawires
|
||||
|
||||
### corner.lua ###
|
||||
Insulated Mesecon Corner=
|
||||
|
||||
### crossover.lua ###
|
||||
Insulated Mesecon Crossover=
|
||||
You hacker you!=
|
||||
|
||||
### doublecorner.lua ###
|
||||
Insulated Mesecon Double Corner=
|
||||
|
||||
### mesewire.lua ###
|
||||
Mese Wire=
|
||||
|
||||
### tjunction.lua ###
|
||||
Insulated Mesecon T-junction=
|
||||
|
||||
### vertical.lua ###
|
||||
Vertical Mesecon=
|
@ -1,22 +1,3 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
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 = S("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},
|
||||
@ -27,7 +8,7 @@ local mesewire_rules =
|
||||
{x = 0, y = 0, z =-1},
|
||||
}
|
||||
|
||||
minetest.override_item(mese_nodename, {
|
||||
minetest.override_item("default:mese", {
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.off,
|
||||
onstate = "mesecons_extrawires:mese_powered",
|
||||
@ -37,17 +18,15 @@ minetest.override_item(mese_nodename, {
|
||||
|
||||
-- Copy node definition of powered mese from normal mese
|
||||
-- and brighten texture tiles to indicate mese is powered
|
||||
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),
|
||||
local powered_def = mesecon.merge_tables(minetest.registered_nodes["default:mese"], {
|
||||
drop = "default:mese",
|
||||
light_source = 5,
|
||||
mesecons = {conductor = {
|
||||
state = mesecon.state.on,
|
||||
offstate = mese_nodename,
|
||||
offstate = "default:mese",
|
||||
rules = mesewire_rules
|
||||
}},
|
||||
groups = mesecon.merge_tables(unpowered_def.groups or {}, {not_in_creative_inventory = 1}),
|
||||
groups = {cracky = 1, not_in_creative_inventory = 1},
|
||||
on_blast = mesecon.on_blastnode,
|
||||
})
|
||||
|
||||
|
@ -1,2 +1,3 @@
|
||||
name = mesecons_extrawires
|
||||
depends = mesecons, mesecons_gamecompat
|
||||
depends = default, mesecons
|
||||
optional_depends = screwdriver
|
||||
|
@ -1,4 +1,4 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
local screwdriver_exists = minetest.global_exists("screwdriver")
|
||||
|
||||
local tjunction_nodebox = {
|
||||
type = "fixed",
|
||||
@ -12,11 +12,18 @@ local tjunction_selectionbox = {
|
||||
fixed = { -16/32, -16/32, -16/32, 16/32, -12/32, 7/32 },
|
||||
}
|
||||
|
||||
local tjunction_get_rules = mesecon.horiz_rules_getter({
|
||||
local tjunction_get_rules = function (node)
|
||||
local rules =
|
||||
{{x = 0, y = 0, z = 1},
|
||||
{x = 1, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = -1},
|
||||
{x = -1, y = 0, z = 0},
|
||||
})
|
||||
{x = 0, y = 0, z = -1}}
|
||||
|
||||
for i = 0, node.param2 do
|
||||
rules = mesecon.rotate_rules_left(rules)
|
||||
end
|
||||
|
||||
return rules
|
||||
end
|
||||
|
||||
minetest.register_node("mesecons_extrawires:tjunction_on", {
|
||||
drawtype = "nodebox",
|
||||
@ -37,7 +44,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 = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {conductor =
|
||||
{
|
||||
state = mesecon.state.on,
|
||||
@ -45,12 +52,12 @@ minetest.register_node("mesecons_extrawires:tjunction_on", {
|
||||
offstate = "mesecons_extrawires:tjunction_off"
|
||||
}},
|
||||
on_blast = mesecon.on_blastnode,
|
||||
on_rotate = mesecon.on_rotate_horiz,
|
||||
on_rotate = screwdriver_exists and screwdriver.rotate_simple,
|
||||
})
|
||||
|
||||
minetest.register_node("mesecons_extrawires:tjunction_off", {
|
||||
drawtype = "nodebox",
|
||||
description = S("Insulated Mesecon T-junction"),
|
||||
description = "Insulated Mesecon T-junction",
|
||||
tiles = {
|
||||
"jeija_insulated_wire_tjunction_tb_off.png",
|
||||
"jeija_insulated_wire_tjunction_tb_off.png^[transformR180",
|
||||
@ -67,7 +74,7 @@ minetest.register_node("mesecons_extrawires:tjunction_off", {
|
||||
selection_box = tjunction_selectionbox,
|
||||
node_box = tjunction_nodebox,
|
||||
groups = {dig_immediate = 3},
|
||||
sounds = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
mesecons = {conductor =
|
||||
{
|
||||
state = mesecon.state.off,
|
||||
@ -75,7 +82,7 @@ minetest.register_node("mesecons_extrawires:tjunction_off", {
|
||||
onstate = "mesecons_extrawires:tjunction_on"
|
||||
}},
|
||||
on_blast = mesecon.on_blastnode,
|
||||
on_rotate = mesecon.on_rotate_horiz,
|
||||
on_rotate = screwdriver_exists and screwdriver.rotate_simple,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
|
@ -1,5 +1,3 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local vertical_box = {
|
||||
type = "fixed",
|
||||
fixed = {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16}
|
||||
@ -40,22 +38,17 @@ local bottom_rules = {
|
||||
{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 node = minetest.get_node(pos)
|
||||
if not is_vertical_conductor(node.name) then
|
||||
return
|
||||
end
|
||||
|
||||
if minetest.registered_nodes[node.name]
|
||||
and minetest.registered_nodes[node.name].is_vertical_conductor then
|
||||
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 above = is_vertical_conductor(node_above.name)
|
||||
local below = is_vertical_conductor(node_below.name)
|
||||
local above = minetest.registered_nodes[node_above.name]
|
||||
and minetest.registered_nodes[node_above.name].is_vertical_conductor
|
||||
local below = minetest.registered_nodes[node_below.name]
|
||||
and minetest.registered_nodes[node_below.name].is_vertical_conductor
|
||||
|
||||
mesecon.on_dignode(pos, node)
|
||||
|
||||
@ -74,6 +67,7 @@ local vertical_updatepos = function (pos)
|
||||
minetest.set_node(pos, {name = newname})
|
||||
mesecon.on_placenode(pos, {name = newname})
|
||||
end
|
||||
end
|
||||
|
||||
local vertical_update = function (pos)
|
||||
vertical_updatepos(pos) -- this one
|
||||
@ -83,7 +77,7 @@ end
|
||||
|
||||
-- Vertical wire
|
||||
mesecon.register_node("mesecons_extrawires:vertical", {
|
||||
description = S("Vertical Mesecon"),
|
||||
description = "Vertical Mesecon",
|
||||
drawtype = "nodebox",
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
@ -95,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 = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
},{
|
||||
tiles = {"mesecons_wire_off.png"},
|
||||
groups = {dig_immediate=3},
|
||||
@ -116,7 +110,7 @@ mesecon.register_node("mesecons_extrawires:vertical", {
|
||||
|
||||
-- Vertical wire top
|
||||
mesecon.register_node("mesecons_extrawires:vertical_top", {
|
||||
description = S("Vertical Mesecon"),
|
||||
description = "Vertical mesecon",
|
||||
drawtype = "nodebox",
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
@ -129,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 = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
},{
|
||||
tiles = {"mesecons_wire_off.png"},
|
||||
mesecons = {conductor = {
|
||||
@ -148,7 +142,7 @@ mesecon.register_node("mesecons_extrawires:vertical_top", {
|
||||
|
||||
-- Vertical wire bottom
|
||||
mesecon.register_node("mesecons_extrawires:vertical_bottom", {
|
||||
description = S("Vertical Mesecon"),
|
||||
description = "Vertical mesecon",
|
||||
drawtype = "nodebox",
|
||||
walkable = false,
|
||||
paramtype = "light",
|
||||
@ -161,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 = mesecon.node_sound.default,
|
||||
sounds = default.node_sound_defaults(),
|
||||
},{
|
||||
tiles = {"mesecons_wire_off.png"},
|
||||
mesecons = {conductor = {
|
||||
|
@ -1,5 +1,3 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local plg = {}
|
||||
plg.rules = {}
|
||||
-- per-player formspec positions
|
||||
@ -20,10 +18,10 @@ plg.register_nodes = function(template)
|
||||
|
||||
-- build top texture string
|
||||
local texture = "jeija_fpga_top.png"
|
||||
if a == 1 then texture = texture .. "^jeija_luacontroller_LED_A.png" end
|
||||
if b == 1 then texture = texture .. "^jeija_luacontroller_LED_B.png" end
|
||||
if c == 1 then texture = texture .. "^jeija_luacontroller_LED_C.png" end
|
||||
if d == 1 then texture = texture .. "^jeija_luacontroller_LED_D.png" end
|
||||
if a == 1 then texture = texture .. "^jeija_microcontroller_LED_A.png" end
|
||||
if b == 1 then texture = texture .. "^jeija_microcontroller_LED_B.png" end
|
||||
if c == 1 then texture = texture .. "^jeija_microcontroller_LED_C.png" end
|
||||
if d == 1 then texture = texture .. "^jeija_microcontroller_LED_D.png" end
|
||||
ndef.tiles[1] = texture
|
||||
ndef.inventory_image = texture
|
||||
|
||||
@ -61,7 +59,7 @@ plg.register_nodes = function(template)
|
||||
end
|
||||
|
||||
plg.register_nodes({
|
||||
description = S("FPGA"),
|
||||
description = "FPGA",
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
"", -- replaced later
|
||||
@ -111,7 +109,7 @@ 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 = mesecon.node_sound.stone,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
mesecons = {
|
||||
effector = {
|
||||
rules = {}, -- replaced later
|
||||
|
@ -1,3 +0,0 @@
|
||||
# textdomain: mesecons_fpga
|
||||
FPGA=FPGA
|
||||
FPGA Programmer=FPGA-Programmierer
|
@ -1,7 +0,0 @@
|
||||
# textdomain: mesecons_fpga
|
||||
|
||||
### init.lua ###
|
||||
FPGA=FPGA
|
||||
|
||||
### tool.lua ###
|
||||
FPGA Programmer=FPGA Programilo
|
@ -1,7 +0,0 @@
|
||||
# textdomain: mesecons_fpga
|
||||
|
||||
### init.lua ###
|
||||
FPGA=Circuit logique programmable (FPGA)
|
||||
|
||||
### tool.lua ###
|
||||
FPGA Programmer=Programmateur de circuit logique
|
@ -1,7 +0,0 @@
|
||||
# textdomain: mesecons_fpga
|
||||
|
||||
### init.lua ###
|
||||
FPGA=
|
||||
|
||||
### tool.lua ###
|
||||
FPGA Programmer=
|