18 Commits

Author SHA1 Message Date
a9feea1b32 Merge remote-tracking branch 'upstream/master' 2025-03-20 11:47:30 +01:00
4bd59137a2 Add Ukrainian localization (#703) 2025-03-15 13:46:27 +01:00
a0580f9f20 mesecons_gamecompat: Fix Mineclonia support
Fix node aliases
Synchronize unmovable_by_piston (node group)
Synchronize _mcl_pistons_unmovable (entity definition)
Use mcl_redstone_torch:redstoneblock (doesn't seem to interfere with the redstone functionality)
Automatic bed and door mvps stopper registration
2025-02-11 19:16:53 +01:00
93751a9014 mesecons_gamecompat: Add redstone <--> mesecon wire crafting recipes 2025-02-11 19:15:38 +01:00
786094ec06 mesecons_pistons: Fix impercise placement orientation
Piston placement used to be finicky and not map correctly to the viewing angle
2025-02-11 19:10:53 +01:00
55359c7a0b mesecons_extrawires: Fix Mineclonia compatibility 2025-02-11 19:10:53 +01:00
28467fc3cb Move mesecons_doors to mesecons_gamecompat 2025-02-11 19:10:53 +01:00
4eeab8f6f5 mesecons_gamecompat: Automatically register mvps stoppers
- registered doors
- registered beds
- metal trapdoors
2025-02-11 19:05:01 +01:00
1f9e86c3da Make the detector recipe from luacontroller optional (#696) 2025-01-02 10:19:16 +01:00
dd073d2e83 Add missing use_texture_alpha (#697) 2024-12-28 15:23:18 +01:00
320ec93544 Limit chatcommand parameter length in command blocks (#695) 2024-12-22 19:08:44 +01:00
8051129f82 Russian translation, gates localization (#692) 2024-12-19 22:03:34 +01:00
5883a0ce65 Change test workflow to Luanti 5.10 2024-12-10 15:17:58 +01:00
d547f5fe43 Added sha256 function to lua controller (#690) 2024-12-07 15:53:20 +01:00
5c82089146 Detector: Ignore unexpected digiline data types 2024-12-06 18:50:44 +01:00
31b56063a0 commandblock: replace deprecated formspec element "invsize" 2024-11-15 11:04:14 +01:00
b46c589a38 Support doors and trapdoors from mods (#683)
* Support doors and trapdoors from mods

Removed hardcoded door names and instead now use the API of the door mod to meseconify all doors and trapdoors that have been registered after the mods are finished loading.

* indentation as described by sfan5
2024-10-16 00:27:20 +02:00
ac83dead50 mesecons_doors: Don't modify doors that are already mesecon-enabled 2024-10-08 20:30:26 +02:00
76 changed files with 488 additions and 83 deletions

View File

@ -10,7 +10,7 @@ jobs:
matrix:
cfg:
- { image: 'registry.gitlab.com/minetest/minetest/server:5.0.1', mtg: false }
- { image: 'ghcr.io/minetest/minetest:5.9.0', mtg: true }
- { image: 'ghcr.io/minetest/minetest:5.10.0', mtg: true }
steps:
- uses: actions/checkout@main

View File

@ -15,6 +15,7 @@ ignore = {
max_line_length = 200
read_globals = {
"core",
"default",
"digiline",
"doors",

View File

@ -0,0 +1,4 @@
# textdomain: mesecons
### oldwires.lua ###
Mesecons=Мезеконы

View File

@ -0,0 +1,5 @@
# textdomain: mesecons
### oldwires.lua ###
Mesecons=Месекони
Mod that implements a ton of items related to digital circuitry.=Мод, який реалізує масу елементів, пов’язаних із цифровою схемою.

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_blinkyplant
### init.lua ###
Blinky Plant=Мигающий цветок

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_blinkyplant
### init.lua ###
Blinky Plant=Миготлива квітка

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_button
### init.lua ###
Button=Кнопка

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_button
### init.lua ###
Button=Кнопка

View File

@ -1,4 +1,5 @@
local S = minetest.get_translator(minetest.get_current_modname())
local param_maxlen = mesecon.setting("commandblock_param_maxlen", 10000)
minetest.register_chatcommand("say", {
params = "<text>",
@ -48,7 +49,7 @@ minetest.register_chatcommand("hp", {
local function initialize_data(meta)
local commands = minetest.formspec_escape(meta:get_string("commands"))
meta:set_string("formspec",
"invsize[9,5;]" ..
"size[9,5]" ..
"textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" ..
"label[1,3.8;@nearest, @farthest, and @random are replaced by the respective player names]" ..
"button_exit[3.3,4.5;2,1;submit;Submit]")
@ -156,6 +157,11 @@ local function commandblock_action_on(pos, node)
minetest.chat_send_player(owner, "The command "..cmd.." does not exist")
return
end
if #param > param_maxlen then
minetest.chat_send_player(owner, "Command parameters are limited to max. " ..
param_maxlen .. " bytes.")
return
end
local has_privs, missing_privs = minetest.check_player_privs(owner, cmddef.privs)
if not has_privs then
minetest.chat_send_player(owner, "You don't have permission "

View File

@ -0,0 +1,7 @@
# textdomain: mesecons_commandblock
### init.lua ###
Say <text> as the server=Сказать <текст> от имени сервера
Say <text> to <name> privately=Сказать <текст> игроку <имя> в личном сообщении
Set health of <name> to <value> hitpoints=Установить здоровье игрока <имя> на <значение> хитпоинтов
Command Block=Комадный блок

View File

@ -0,0 +1,7 @@
# textdomain: mesecons_commandblock
### init.lua ###
Say <text> as the server=Сказати <текст> від імені сервера
Say <text> to <name> privately=Сказати <текст> гравцю <ім'я> в приватному повідомленні
Set health of <name> to <value> hitpoints=Встановити здоров'я гравця <ім'я> на <значення> ХП
Command Block=Командний блок

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_delayer
### init.lua ###
Delayer=Элемент задержки
You hacker you=Ти хакер, ти

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_delayer
### init.lua ###
Delayer=Затримувач
You hacker you=Ти хакер, ти

View File

@ -66,7 +66,8 @@ local object_detector_digiline = {
effector = {
action = function(pos, _, channel, msg)
local meta = minetest.get_meta(pos)
if channel == meta:get_string("digiline_channel") then
if channel == meta:get_string("digiline_channel") and
(type(msg) == "string" or type(msg) == "number") then
meta:set_string("scanname", msg)
object_detector_make_formspec(pos)
end
@ -110,14 +111,16 @@ minetest.register_node("mesecons_detector:object_detector_on", {
on_blast = mesecon.on_blastnode,
})
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"},
}
})
if minetest.get_modpath("mesecons_luacontroller") then
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"},
}
})
end
minetest.register_craft({
output = 'mesecons_detector:object_detector_off',
@ -286,14 +289,16 @@ minetest.register_node("mesecons_detector:node_detector_on", {
on_blast = mesecon.on_blastnode,
})
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"},
}
})
if minetest.get_modpath("mesecons_luacontroller") then
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"},
}
})
end
minetest.register_craft({
output = 'mesecons_detector:node_detector_off',

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_detector
### init.lua ###
Player Detector=Детектор игрока
Node Detector=Детектор блока

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_detector
### init.lua ###
Player Detector=Детектор гравця
Node Detector=Детектор блоку

View File

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

View File

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

View File

@ -3,4 +3,6 @@ dofile(minetest.get_modpath("mesecons_extrawires").."/tjunction.lua");
dofile(minetest.get_modpath("mesecons_extrawires").."/corner.lua");
dofile(minetest.get_modpath("mesecons_extrawires").."/doublecorner.lua");
dofile(minetest.get_modpath("mesecons_extrawires").."/vertical.lua");
dofile(minetest.get_modpath("mesecons_extrawires").."/mesewire.lua");
if core.registered_nodes["mesecons_gamecompat:mese"] then
dofile(minetest.get_modpath("mesecons_extrawires").."/mesewire.lua");
end

View File

@ -0,0 +1,20 @@
# 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=Вертикальный мезекон

View File

@ -0,0 +1,20 @@
# 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=Ізольований месекон (T-з'єднання)
### vertical.lua ###
Vertical Mesecon=Вертикальний месекон

View File

@ -40,6 +40,8 @@ local bottom_rules = {
{x=0, y=2, z=0} -- receive power from pressure plate / detector / ... 2 nodes above
}
local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or nil
local function is_vertical_conductor(nodename)
local def = minetest.registered_nodes[nodename]
return def and def.is_vertical_conductor
@ -96,6 +98,7 @@ mesecon.register_node("mesecons_extrawires:vertical", {
after_place_node = vertical_update,
after_dig_node = vertical_update,
sounds = mesecon.node_sound.default,
use_texture_alpha = use_texture_alpha,
},{
tiles = {"mesecons_wire_off.png"},
groups = {dig_immediate=3},
@ -130,6 +133,7 @@ mesecon.register_node("mesecons_extrawires:vertical_top", {
after_place_node = vertical_update,
after_dig_node = vertical_update,
sounds = mesecon.node_sound.default,
use_texture_alpha = use_texture_alpha,
},{
tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = {
@ -162,6 +166,7 @@ mesecon.register_node("mesecons_extrawires:vertical_bottom", {
after_place_node = vertical_update,
after_dig_node = vertical_update,
sounds = mesecon.node_sound.default,
use_texture_alpha = use_texture_alpha,
},{
tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = {

View File

@ -0,0 +1,7 @@
# textdomain: mesecons_fpga
### init.lua ###
FPGA=ПЛИС
### tool.lua ###
FPGA Programmer=ПЛИС-программер

View File

@ -0,0 +1,7 @@
# textdomain: mesecons_fpga
### init.lua ###
FPGA=ПКВМ
### tool.lua ###
FPGA Programmer=ПКВМ-программер

View File

@ -7,13 +7,13 @@ minetest.register_alias("mesecons_gamecompat:coalblock", "mcl_core:coalblock")
minetest.register_alias("mesecons_gamecompat:cobble", "mcl_core:cobble")
minetest.register_alias("mesecons_gamecompat:glass", "mcl_core:glass")
minetest.register_alias("mesecons_gamecompat:lava_source", "mcl_core:lava_source")
minetest.register_alias("mesecons_gamecompat:mese", "mesecons:redstoneblock")
minetest.register_alias("mesecons_gamecompat:mese_crystal", "mesecoms:redstone")
minetest.register_alias("mesecons_gamecompat:mese_crystal_fragment", "mesecons:redstone")
minetest.register_alias("mesecons_gamecompat:mese", "mcl_redstone_torch:redstoneblock")
minetest.register_alias("mesecons_gamecompat:mese_crystal", "mcl_redstone:redstone")
minetest.register_alias("mesecons_gamecompat:mese_crystal_fragment", "mcl_redstone:redstone")
minetest.register_alias("mesecons_gamecompat:obsidian_glass", "mcl_core:glass")
minetest.register_alias("mesecons_gamecompat:stone", "mcl_core:stone")
minetest.register_alias("mesecons_gamecompat:steel_ingot", "mcl_core:iron_ingot")
minetest.register_alias("mesecons_gamecompat:steelblock", "mcl_core:steelblock")
minetest.register_alias("mesecons_gamecompat:steelblock", "mcl_core:ironblock")
minetest.register_alias("mesecons_gamecompat:torch", "mcl_torches:torch")
if minetest.get_modpath("mcl_dyes") then
@ -41,3 +41,48 @@ end
-- Textures
mesecon.texture.steel_block = "default_steel_block.png"
if minetest.get_modpath("mesecons_mvps") then
for k,v in pairs(core.registered_nodes) do
local is_stopper = mesecon.mvps_stoppers[k]
if v.groups and v.groups.unmovable_by_piston then
mesecon.register_mvps_stopper(k)
end
if is_stopper then
local groups = table.copy(v.groups or {})
groups.unmovable_by_piston = 1
v.groups = groups
core.register_node(":"..k, v)
end
end
for k,v in pairs(core.registered_entities) do
local is_unmov = mesecon.mvps_unmov[k]
if v._mcl_pistons_unmovable then
mesecon.register_mvps_unmov(k)
end
if is_unmov then
v._mcl_pistons_unmovable = true
core.register_entity(":"..k, v)
end
end
core.register_on_mods_loaded(function()
for _,v in pairs(core.registered_nodes) do
if v.groups and v.groups.bed then
mesecon.register_mvps_stopper(v.name)
end
if v.groups and v.groups.door then
mesecon.register_mvps_stopper(v.name)
end
end
end)
end
core.register_craft({
output = "mesecons:wire_00000000_off",
recipe = {{"mcl_redstone:redstone"}}
})
core.register_craft({
output = "mcl_redstone:redstone",
recipe = {{"mesecons:wire_00000000_off"}}
})

View File

@ -48,28 +48,26 @@ if minetest.get_modpath("mesecons_mvps") then
for _, name in ipairs({
"default:chest_locked",
"default:chest_locked_open",
"doors:door_steel_b_1", -- old style doors
"doors:door_steel_b_2", --
"doors:door_steel_t_1", --
"doors:door_steel_t_2", --
"doors:door_steel_a", -- new style doors
"doors:door_steel_b", --
"doors:door_steel_c", --
"doors:door_steel_d", --
"doors:hidden",
"doors:trapdoor_steel",
"doors:trapdoor_steel_open",
"beds:bed_bottom",
"beds:bed_top",
"beds:fancy_bed_bottom",
"beds:fancy_bed_top",
"xpanes:door_steel_bar_a",
"xpanes:door_steel_bar_b",
"xpanes:door_steel_bar_c",
"xpanes:door_steel_bar_d",
"xpanes:trapdoor_steel_bar",
"xpanes:trapdoor_steel_bar_open",
}) do
mesecon.register_mvps_stopper(name)
end
core.register_on_mods_loaded(function()
if minetest.get_modpath("doors") then
for k,_ in pairs(doors.registered_doors) do
mesecon.register_mvps_stopper(k)
end
end
if minetest.get_modpath("beds") then
for _,v in pairs(core.registered_nodes) do
if v.groups and v.groups.bed then
mesecon.register_mvps_stopper(v.name)
end
end
end
end)
end

View File

@ -22,6 +22,11 @@ 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
@ -47,6 +52,10 @@ 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)
@ -73,15 +82,6 @@ local function meseconify_door(name)
end
end
local doors_list = {
"doors:door_wood",
"doors:door_steel",
"doors:door_glass",
"doors:door_obsidian_glass",
"xpanes:door_steel_bar",
}
for i=1,#doors_list do meseconify_door(doors_list[i]) end
-- Trapdoor
local function trapdoor_switch(name)
return function(pos, node)
@ -131,9 +131,15 @@ local function meseconify_trapdoor(name)
end
end
local trapdoors_list = {
"doors:trapdoor",
"doors:trapdoor_steel",
"xpanes:trapdoor_steel_bar"
}
for i=1,#trapdoors_list do meseconify_trapdoor(trapdoors_list[i]) end
minetest.register_on_mods_loaded(function()
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)

View File

@ -14,7 +14,11 @@ if minetest.get_modpath("default") then
dofile(minetest.get_modpath("mesecons_gamecompat").."/compat_mtg.lua")
end
if minetest.get_modpath("mcl_core") then
if minetest.get_modpath("mcl_redstone") then
minetest.log("info", "Mesecons: detected MineClonia Game for game compatibility")
dofile(minetest.get_modpath("mesecons_gamecompat").."/compat_mcl.lua")
dofile(minetest.get_modpath("mesecons_gamecompat").."/compat_mcla.lua")
end
if minetest.get_modpath("doors") then
dofile(minetest.get_modpath("mesecons_gamecompat").."/doors.lua")
end

View File

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

View File

@ -1,3 +1,5 @@
local S = minetest.get_translator(minetest.get_current_modname())
local selection_box = {
type = "fixed",
fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }
@ -146,38 +148,38 @@ end
register_gate("diode", 1, function (input) return input end,
{{"mesecons:mesecon", "mesecons_torch:mesecon_torch_on", "mesecons_torch:mesecon_torch_on"}},
"Diode")
S("Diode"))
register_gate("not", 1, function (input) return not input end,
{{"mesecons:mesecon", "mesecons_torch:mesecon_torch_on", "mesecons:mesecon"}},
"NOT Gate")
S("NOT Gate"))
register_gate("and", 2, function (val1, val2) return val1 and val2 end,
{{"mesecons:mesecon", "", ""},
{"", "mesecons_materials:silicon", "mesecons:mesecon"},
{"mesecons:mesecon", "", ""}},
"AND Gate")
S("AND Gate"))
register_gate("nand", 2, function (val1, val2) return not (val1 and val2) end,
{{"mesecons:mesecon", "", ""},
{"", "mesecons_materials:silicon", "mesecons_torch:mesecon_torch_on"},
{"mesecons:mesecon", "", ""}},
"NAND Gate")
S("NAND Gate"))
register_gate("xor", 2, function (val1, val2) return (val1 or val2) and not (val1 and val2) end,
{{"mesecons:mesecon", "", ""},
{"", "mesecons_materials:silicon", "mesecons_materials:silicon"},
{"mesecons:mesecon", "", ""}},
"XOR Gate")
S("XOR Gate"))
register_gate("nor", 2, function (val1, val2) return not (val1 or val2) end,
{{"mesecons:mesecon", "", ""},
{"", "mesecons:mesecon", "mesecons_torch:mesecon_torch_on"},
{"mesecons:mesecon", "", ""}},
"NOR Gate")
S("NOR Gate"))
register_gate("or", 2, function (val1, val2) return (val1 or val2) end,
{{"mesecons:mesecon", "", ""},
{"", "mesecons:mesecon", "mesecons:mesecon"},
{"mesecons:mesecon", "", ""}},
"OR Gate")
S("OR Gate"))

View File

@ -0,0 +1,8 @@
# textdomain: mesecons_gates
Diode=Диод
NOT Gate=НЕ-шлюз
AND Gate=И-шлюз
NAND Gate=NAND-шлюз
XOR Gate=XOR-шлюз
NOR Gate=NOR-шлюз
OR Gate=ИЛИ-шлюз

View File

@ -0,0 +1,8 @@
# textdomain: mesecons_gates
Diode=Діод
NOT Gate=NOT перехідник
AND Gate=AND перехідник
NAND Gate=NAND перехідник
XOR Gate=XOR перехідник
NOR Gate=NOR перехідник
OR Gate=OR перехідник

View File

@ -0,0 +1,8 @@
# textdomain: mesecons_gates
Diode=
NOT Gate=
AND Gate=
NAND Gate=
XOR Gate=
NOR Gate=
OR Gate=

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_hydroturbine
### init.lua ###
Water Turbine=Гидротурбина

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_hydroturbine
### init.lua ###
Water Turbine=Гідротурбіна

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_insulated
### init.lua ###
Straight Insulated Mesecon=Прямой изолированный мезекон

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_insulated
### init.lua ###
Straight Insulated Mesecon=Прямий ізольований месекон

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_lamp
### init.lua ###
Mesecon Lamp=Мезеконовая лампа

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_lamp
### init.lua ###
Mesecon Lamp=Месеконова лампа

View File

@ -0,0 +1,15 @@
# textdomain: mesecons_lightstone
### init.lua ###
Red Lightstone=Красный светящийся камень
Green Lightstone=Зеленый светящийся камень
Blue Lightstone=Синий светящийся камень
Grey Lightstone=Серый светящийся камень
Dark Grey Lightstone=Темно-серый светящийся камень
Yellow Lightstone=Желтый светящийся камень
Orange Lightstone=Оранжевый светящийся камень
White Lightstone=Белый светящийся камень
Pink Lightstone=Розовый светящийся камень
Magenta Lightstone=Пурпурный светящийся камень
Cyan Lightstone=Голубой светящийся камень
Violet Lightstone=Фиолетовый светящийся камень

View File

@ -0,0 +1,15 @@
# textdomain: mesecons_lightstone
### init.lua ###
Red Lightstone=Червоний світловий камінь
Green Lightstone=Зелений світловий камінь
Blue Lightstone=Синій світловий камінь
Grey Lightstone=Сірий світловий камінь
Dark Grey Lightstone=Темно-сірий світловий камінь
Yellow Lightstone=Жовтий світловий камінь
Orange Lightstone=Оранжевий світловий камінь
White Lightstone=Білий світловий камінь
Pink Lightstone=Рожевий світловий камінь
Magenta Lightstone=Пурпуровий світловий камінь
Cyan Lightstone=Блакитний світловий камінь
Violet Lightstone=Фіолетовий світловий камінь

View File

@ -509,6 +509,7 @@ local function create_environment(pos, mem, event, itbl, send_warning)
print = safe_print,
interrupt = get_interrupt(pos, itbl, send_warning),
digiline_send = get_digiline_send(pos, itbl, send_warning),
sha256sum = minetest.sha256,
string = {
byte = string.byte,
char = string.char,

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_luacontroller
### init.lua ###
Luacontroller=Lua-контроллер

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_luacontroller
### init.lua ###
Luacontroller=Lua-контролер

View File

@ -0,0 +1,6 @@
# textdomain: mesecons_materials
### init.lua ###
Glue=Клей
Fiber=Волокно
Silicon=Кремний

View File

@ -0,0 +1,6 @@
# textdomain: mesecons_materials
### init.lua ###
Glue=Клей
Fiber=Волокно
Silicon=Кремній

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_microcontroller
### init.lua ###
Microcontroller=Микроконтроллер

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_microcontroller
### init.lua ###
Microcontroller=Мікроконтролер

View File

@ -0,0 +1,7 @@
# textdomain: mesecons_movestones
### init.lua ###
Movestone=Ходовой камень
Sticky Movestone=Липкий ходовой камень
Vertical Movestone=Вертикальный ходовой камень
Vertical Sticky Movestone=Вертикальный липкий ходовой камень

View File

@ -0,0 +1,7 @@
# textdomain: mesecons_movestones
### init.lua ###
Movestone=Ходовий камінь
Sticky Movestone=Липкий ходовий камінь
Vertical Movestone=Вертикальний ходовий камінь
Vertical Sticky Movestone=Вертикальний липкий ходовий камінь

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_noteblock
### init.lua ###
Noteblock=Нотный блок

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_noteblock
### init.lua ###
Noteblock=Нотний блок

View File

@ -115,27 +115,13 @@ local function piston_off(pos, node)
end
end
local orientations = {
[0] = { 4, 8},
{13, 17},
{10, 6},
{20, 15},
}
local function piston_orientate(pos, placer)
mesecon.mvps_set_owner(pos, placer)
if not placer then
return
end
local pitch = math.deg(placer:get_look_vertical())
local node = minetest.get_node(pos)
if pitch > 55 then
node.param2 = orientations[node.param2][1]
elseif pitch < -55 then
node.param2 = orientations[node.param2][2]
else
return
end
node.param2 = core.dir_to_facedir(placer:get_look_dir(), true)
minetest.swap_node(pos, node)
-- minetest.after, because on_placenode for unoriented piston must be processed first
minetest.after(0, mesecon.on_placenode, pos, node)

View File

@ -0,0 +1,9 @@
# textdomain: mesecons_pistons
### init.lua ###
Piston=Поршень
Activated Piston Base=Основание активированного поршня
Piston Pusher=Толкающая часть поршня
Sticky Piston=Липкий поршень
Activated Sticky Piston Base=Основание активированного липкого поршня
Sticky Piston Pusher=Толкающая часть липкого поршня

View File

@ -0,0 +1,9 @@
# textdomain: mesecons_pistons
### init.lua ###
Piston=Поршень
Activated Piston Base=Основа активованого поршня
Piston Pusher=Штовхаюча частина поршня
Sticky Piston=Липкий поршень
Activated Sticky Piston Base=Основа активованого липкого поршня
Sticky Piston Pusher=Штовхаюча частина липкого поршня

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_powerplant
### init.lua ###
Power Plant=Энергоцветок

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_powerplant
### init.lua ###
Power Plant=Енергоквітка

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_pressureplates
### init.lua ###
Wooden Pressure Plate=Деревянная нажимная пластина
Stone Pressure Plate=Каменная нажимная пластина

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_pressureplates
### init.lua ###
Wooden Pressure Plate=Дерев'яна натискна плита
Stone Pressure Plate=Кам'яна натискна плита

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_random
### init.lua ###
Removestone=Исчезающий камень
Ghoststone=Призрачный камень

View File

@ -0,0 +1,5 @@
# textdomain: mesecons_random
### init.lua ###
Removestone=Зникаючий камінь
Ghoststone=Примарний камінь

View File

@ -30,6 +30,8 @@ local receiver_get_rules = mesecon.horiz_rules_getter({
{x = 0, y = 0, z = -2},
})
local use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or nil
mesecon.register_node("mesecons_receiver:receiver", {
drawtype = "nodebox",
paramtype = "light",
@ -98,6 +100,7 @@ mesecon.register_node("mesecons_receiver:receiver_up", {
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons:wire_00000000_off",
sounds = mesecon.node_sound.default,
use_texture_alpha = use_texture_alpha,
}, {
tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = {
@ -143,6 +146,7 @@ mesecon.register_node("mesecons_receiver:receiver_down", {
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
drop = "mesecons:wire_00000000_off",
sounds = mesecon.node_sound.default,
use_texture_alpha = use_texture_alpha,
}, {
tiles = {"mesecons_wire_off.png"},
mesecons = {conductor = {

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_solarpanel
### init.lua ###
Solar Panel=Солнечная панель

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_solarpanel
### init.lua ###
Solar Panel=Сонячна панель

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_stickyblocks
### init.lua ###
Sticky Block=Липкий блок

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_stickyblocks
### init.lua ###
Sticky Block=Липкий блок

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_switch
### init.lua ###
Switch=Выключатель

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_switch
### init.lua ###
Switch=Перемикач

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_torch
### init.lua ###
Mesecon Torch=Мезе-факел

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_torch
### init.lua ###
Mesecon Torch=Месескип

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_walllever
### init.lua ###
Lever=Рычаг

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_walllever
### init.lua ###
Lever=Важіль

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_wires
### init.lua ###
Mesecon=Мезекон

View File

@ -0,0 +1,4 @@
# textdomain: mesecons_wires
### init.lua ###
Mesecon=Месекон

View File

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

View File

@ -11,6 +11,11 @@ mesecon.cooldown_granularity (Cooldown step length) float 0.5 0.0 1.0
mesecon.blinky_plant_interval (Plant blinking interval) int 3 1 5
[mesecons_commandblock]
mesecon.commandblock_param_maxlen (Maximum command parameter length) int 10000 100 1000000
[mesecons_detector]
mesecon.detector_radius (Player detector scanning radius) int 6 3 16