5 Commits

Author SHA1 Message Date
HybridDog
e1f07e048d Fix timegate's dependency on utils
The addition of dependencies in commit 52fc535d26
was incomplete, so loading the moremesecons_timegate mod can fail.

This change adds the moremesecons_utils dependency to those mods which
require the moremesecons table as reported by luacheck.
I've also made .luacheckrc more strict so that it sets globals per mod
and allows reading the moremesecons table only in mods which also have
the moremesecons_utils dependency.
2025-12-25 12:42:43 +01:00
tour
3c3fc6749a prevent invalid rotations and add on_rotate callbacks 2025-11-15 09:57:45 +01:00
tour
46d1f500bf entity_detactor: detect stacks of dropped items 2025-11-15 09:57:45 +01:00
tour
3b0d06569d rewrite timegate to make use of nodetimers
- fixes a crash with timer=NaN
- fixes 1-tick circels with timer=0
- fixes timegates getting stuck when unloaded in on-state
2025-11-15 09:57:45 +01:00
tour
52fc535d26 Add missing dependencies (#41)
Some dependencies are technically not necessary but should help to avoid issues in the future.
2025-07-17 19:22:07 +02:00
32 changed files with 67 additions and 77 deletions

View File

@@ -1,9 +1,17 @@
read_globals = {
-- Defined by Minetest
"minetest", "vector", "PseudoRandom", "VoxelArea", "table",
-- Defined by Luanti
"minetest", "vector", "PseudoRandom", "VoxelArea", "table", "ItemStack",
-- Mods
"digiline", "default", "creative",
"digiline", "default", "creative", "mesecon"
}
globals = {"moremesecons", "mesecon"}
files.moremesecons_utils = {globals = {"moremesecons"}}
local utils_depender = {"adjustable_blinkyplant", "adjustable_player_detector",
"commandblock", "entity_detector", "jammer", "luablock", "playerkiller",
"sayer", "teleporter", "timegate", "wireless"}
for _, folder_suffix in ipairs(utils_depender) do
files["moremesecons_" .. folder_suffix] = {read_globals = {"moremesecons"}}
end
files.moremesecons_jammer.globals = {"mesecon"}
ignore = {"212", "631", "422", "432"}

View File

@@ -64,5 +64,3 @@ minetest.register_craft({
recipe = { {"mesecons_blinkyplant:blinky_plant_off"},
{"default:mese_crystal_fragment"},}
})
minetest.log("action", "[moremesecons_adjustable_blinky_plant] loaded.")

View File

@@ -1,3 +1,3 @@
name = moremesecons_adjustable_blinkyplant
depends = mesecons,moremesecons_utils
depends = mesecons,moremesecons_utils,default
optional_depends = craft_guide

View File

@@ -158,5 +158,3 @@ minetest.register_abm({
end
end,
})
minetest.log("action", "[moremesecons_adjustable_player_detector] loaded.")

View File

@@ -1,3 +1,3 @@
name = moremesecons_adjustable_player_detector
depends = mesecons
depends = mesecons,moremesecons_utils,default
optional_depends = craft_guide

View File

@@ -178,5 +178,3 @@ minetest.register_craft({
{"group:mesecon_conductor_craftable","default:mese_crystal","group:mesecon_conductor_craftable"}
}
})
minetest.log("action", "[moremesecons_commandblock] loaded.")

View File

@@ -1,3 +1,3 @@
name = moremesecons_commandblock
depends = mesecons,moremesecons_utils
depends = mesecons,moremesecons_utils,default
optional_depends = craft_guide

View File

@@ -45,10 +45,11 @@ mesecon.register_node("moremesecons_conductor_signalchanger:conductor_signalchan
inventory_image = "moremesecons_conductor_signalchanger_off.png",
groups = {dig_immediate = 2},
paramtype = "light",
paramtype2 = "facedir",
paramtype2 = "4dir",
drawtype = "nodebox",
selection_box = nodebox,
node_box = nodebox,
on_rotate = mesecon.on_rotate,
},{
groups = {dig_immediate = 2},
mesecons = {
@@ -79,5 +80,3 @@ minetest.register_craft({
output = "moremesecons_conductor_signalchanger:conductor_signalchanger_off",
recipe = {{"group:mesecon_conductor_craftable","moremesecons_signalchanger:signalchanger_off"}}
})
minetest.log("action", "[moremesecons_conductor_signalchanger] loaded.")

View File

@@ -68,7 +68,7 @@ for n,i in pairs({{0,0},{1,0},{1,1}}) do
inventory_image = top_texture,
wield_image = top_texture,
paramtype = "light",
paramtype2 = "facedir",
paramtype2 = "4dir",
drawtype = "nodebox",
node_box = {
type = "fixed",
@@ -79,6 +79,7 @@ for n,i in pairs({{0,0},{1,0},{1,1}}) do
groups = groups,
tiles = {top_texture, "moremesecons_dual_delayer_bottom.png", "moremesecons_dual_delayer_side_left.png", "moremesecons_dual_delayer_side_right.png", "moremesecons_dual_delayer_ends.png", "moremesecons_dual_delayer_ends.png"},
use_texture_alpha = use_texture_alpha,
on_rotate = mesecon.on_rotate,
mesecons = {
receptor = {
state = mesecon.state.off,
@@ -98,5 +99,3 @@ minetest.register_craft({
output = "moremesecons_dual_delayer:dual_delayer_00 2",
recipe = {"mesecons_delayer:delayer_off_1", "mesecons_delayer:delayer_off_1"}
})
minetest.log("action", "[moremesecons_dual_delayer] loaded.")

View File

@@ -46,9 +46,14 @@ local object_detector_scan = function (pos)
return true
end
local isname = luaentity.name
-- If the item is present as dropped item entity:
local bitemname = (isname == "__builtin:item" and ItemStack(luaentity.itemstring):get_name())
for _, name in ipairs(scan_names) do
if isname == name or (isname == "__builtin:item" and luaentity.itemstring == name) then
return true
if name == isname then
return true -- object name matches
end
if name == bitemname then
return true -- item of the item entity matches
end
end
end
@@ -136,5 +141,3 @@ minetest.register_abm({
end
end,
})
minetest.log("action", "[moremesecons_entity_detector] loaded.")

View File

@@ -1,3 +1,3 @@
name = moremesecons_entity_detector
depends = mesecons
depends = mesecons,moremesecons_utils,default
optional_depends = craft_guide

View File

@@ -46,5 +46,3 @@ minetest.register_craft({
recipe = { {"default:torch"},
{"default:mese_crystal_fragment"},}
})
minetest.log("action", "[moremesecons_igniter] loaded.")

View File

@@ -58,6 +58,7 @@ mesecon.register_node("moremesecons_induction_transmitter:induction_transmitter"
{-0.25, -0.25, -0.5, 0.25, 0.25, -0.1875},
},
},
on_rotate = mesecon.on_rotate,
}, {
tiles = {"default_mese_block.png"},
groups = {cracky = 3},
@@ -98,5 +99,3 @@ minetest.register_craft({
{"", "default:mese_crystal_fragment", ""}
}
})
minetest.log("action", "[moremesecons_induction_transmitter] loaded.")

View File

@@ -42,12 +42,13 @@ mesecon.register_node("moremesecons_injector_controller:injector_controller", {
drawtype = "nodebox",
inventory_image = "moremesecons_injector_controller_off.png",
paramtype = "light",
paramtype2 = "facedir",
paramtype2 = "4dir",
node_box = {
type = "fixed",
fixed = {{-8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }},
},
on_timer = on_timer,
on_rotate = mesecon.on_rotate,
},{
tiles = {"moremesecons_injector_controller_off.png", "moremesecons_injector_controller_side.png", "moremesecons_injector_controller_side.png"},
groups = {dig_immediate=2},
@@ -82,5 +83,3 @@ minetest.register_craft({
output = "moremesecons_injector_controller:injector_controller_off",
recipe = {{"mesecons_blinkyplant:blinky_plant_off","mesecons_gates:and_off"}}
})
minetest.log("action", "[moremesecons_injector_controller] loaded.")

View File

@@ -131,5 +131,3 @@ if moremesecons.setting("jammer", "enable_lbm", false) then
action = add_jammer
})
end
minetest.log("action", "[moremesecons_jammer] loaded.")

View File

@@ -158,5 +158,3 @@ minetest.register_node("moremesecons_luablock:luablock", {
end
}}
})
minetest.log("action", "[moremesecons_luablock] loaded.")

View File

@@ -355,5 +355,3 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return
end
end)
minetest.log("action", "[moremesecons_luacontroller_tool] loaded.")

View File

@@ -1,2 +1,2 @@
name = moremesecons_luacontroller_tool
depends = mesecons,mesecons_luacontroller,moremesecons_utils
depends = mesecons,mesecons_luacontroller

View File

@@ -118,5 +118,3 @@ minetest.register_alias("default:mesechest", "moremesecons_mesechest:mesechest")
minetest.register_alias("mesechest", "moremesecons_mesechest:mesechest")
minetest.register_alias("default:mesechest_locked", "moremesecons_mesechest:mesechest")
minetest.register_alias("mesechest_locked", "moremesecons_mesechest:mesechest_locked")
minetest.log("action", "[moremesecons_mesechest] loaded.")

View File

@@ -60,5 +60,3 @@ minetest.register_node("moremesecons_playerkiller:playerkiller", {
end,
sounds = default.node_sound_stone_defaults(),
})
minetest.log("action", "[moremesecons_playerkiller] loaded.")

View File

@@ -1,3 +1,3 @@
name = moremesecons_playerkiller
depends = mesecons,mesecons_materials,moremesecons_utils
depends = mesecons,mesecons_materials,moremesecons_utils,default
optional_depends = craft_guide

View File

@@ -121,5 +121,3 @@ minetest.register_craft({
recipe = {{"mesecons_luacontroller:luacontroller0000", "mesecons_noteblock:noteblock"},
{"group:wood", "group:wood"}}
})
minetest.log("action", "[moremesecons_sayer] loaded.")

View File

@@ -41,10 +41,11 @@ mesecon.register_node("moremesecons_signalchanger:signalchanger", {
inventory_image = "moremesecons_signalchanger_off.png",
groups = {dig_immediate = 2},
paramtype = "light",
paramtype2 = "facedir",
paramtype2 = "4dir",
drawtype = "nodebox",
selection_box = nodebox,
node_box = nodebox,
on_rotate = mesecon.on_rotate,
},{
groups = {dig_immediate = 2},
mesecons = {
@@ -79,5 +80,3 @@ minetest.register_craft({
output = "moremesecons_signalchanger:signalchanger_off",
recipe = {{"group:mesecon_conductor_craftable","moremesecons_switchtorch:switchtorch_off","group:mesecon_conductor_craftable"}}
})
minetest.log("action", "[moremesecons_signalchanger] loaded.")

View File

@@ -127,5 +127,3 @@ minetest.register_abm({
-- 2 = x+1
-- 0 = y+1
-- 1 = y-1
minetest.log("action", "[moremesecons_switchtorch] loaded.")

View File

@@ -106,5 +106,3 @@ if moremesecons.setting("teleporter", "enable_lbm", false) then
action = register
})
end
minetest.log("action", "[moremesecons_teleporter] loaded.")

View File

@@ -1,3 +1,3 @@
name = moremesecons_teleporter
depends = mesecons,moremesecons_utils
depends = mesecons,moremesecons_utils,default
optional_depends = craft_guide

View File

@@ -1,3 +1,5 @@
local MIN_DELAY = moremesecons.setting("timegate", "min_delay", 0.5)
local timegate_get_output_rules = function(node)
local rules = {{x = 0, y = 0, z = 1}}
for _ = 0, node.param2 do
@@ -14,25 +16,28 @@ local timegate_get_input_rules = function(node)
return rules
end
-- Functions that are called after the delay time
local function turnoff(pos, _, node)
if mesecon.is_receptor_on(node.name) then
node.name = "moremesecons_timegate:timegate_off"
minetest.swap_node(pos, node)
mesecon.receptor_off(pos)
end
end
local function timegate_activate(pos, node)
local function turnon(pos, node)
-- using a meta string allows writing the time in hexadecimals
local time = tonumber(minetest.get_meta(pos):get_string("time"))
if not time then
if not (time and time >= MIN_DELAY) then
return
end
node.name = "moremesecons_timegate:timegate_on"
minetest.swap_node(pos, node)
mesecon.receptor_on(pos)
minetest.after(time, function()
local node = minetest.get_node(pos)
if node.name == "moremesecons_timegate:timegate_on" then
mesecon.receptor_off(pos)
node.name = "moremesecons_timegate:timegate_off"
minetest.swap_node(pos, node)
end
end)
-- restart the timer when the input was turned off and on again
minetest.get_node_timer(pos):start(time)
if mesecon.is_receptor_off(node.name) then
node.name = "moremesecons_timegate:timegate_on"
minetest.swap_node(pos, node)
mesecon.receptor_on(pos)
end
end
local boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab
@@ -66,7 +71,7 @@ mesecon.register_node("moremesecons_timegate:timegate", {
fixed = boxes
},
paramtype = "light",
paramtype2 = "facedir",
paramtype2 = "4dir",
sunlight_propagates = true,
is_ground_content = true,
sounds = default.node_sound_stone_defaults(),
@@ -78,7 +83,9 @@ mesecon.register_node("moremesecons_timegate:timegate", {
and not minetest.is_protected(pos, player:get_player_name()) then
minetest.get_meta(pos):set_string("time", fields.time)
end
end
end,
on_timer = turnoff,
on_rotate = mesecon.on_rotate
},{
tiles = {
"moremesecons_timegate_off.png",
@@ -99,7 +106,7 @@ mesecon.register_node("moremesecons_timegate:timegate", {
effector =
{
rules = timegate_get_input_rules,
action_on = timegate_activate
action_on = turnon
}
},
},{
@@ -120,6 +127,7 @@ mesecon.register_node("moremesecons_timegate:timegate", {
},
effector = {
rules = timegate_get_input_rules,
action_on = turnon
}
},
})
@@ -134,5 +142,3 @@ minetest.register_craft({
minetest.register_alias("moremesecons_temporarygate:temporarygate_off", "moremesecons_timegate:timegate_off")
minetest.register_alias("moremesecons_temporarygate:temporarygate_on", "moremesecons_timegate:timegate_on")
minetest.log("action", "[moremesecons_timegate] loaded.")

View File

@@ -1,3 +1,3 @@
name = moremesecons_timegate
depends = mesecons
depends = mesecons,moremesecons_utils,default
optional_depends = craft_guide

View File

@@ -379,4 +379,3 @@ local function do_test()
end
do_test()
--]]
minetest.log("action", "[moremesecons_utils] loaded.")

View File

@@ -498,5 +498,3 @@ if storage:get_string("wireless_meta_2") == "" then
end
minetest.log("action", "[moremesecons_wireless] Done!")
end
minetest.log("action", "[moremesecons_wireless] loaded.")

View File

@@ -1,3 +1,3 @@
name = moremesecons_wireless
depends = mesecons,moremesecons_utils
depends = mesecons,moremesecons_utils,default
optional_depends = digilines,craft_guide

View File

@@ -69,6 +69,11 @@ moremesecons_teleporter.max_p2t_distance (Maximum Player To Teleporter distance)
# from an older version which did not use it.
moremesecons_teleporter.enable_lbm (Enable Registration LBM) bool false
[Timegate]
# Minimum authorized length for the timegate signal. Timegates with a shorter time will not respond.
moremesecons_timegate.min_delay (Minimum timegate delay) float 0.5
[Wireless]
# Whether to enable the wireless jammer node