Add type annotations, fix typo in mesecons_mvps, drop using custom mvps handler for existing mechanism, rewrite observer node registration to no longer use mesecon.register_node()

This commit is contained in:
teknomunk
2025-01-01 15:06:48 -06:00
parent b061b4a8b2
commit 1deebc49b9
4 changed files with 181 additions and 147 deletions
mods
CORE/vl_block_update
ITEMS
REDSTONE
mcl_observers
mesecons_mvps
mcl_ocean

@ -3,6 +3,10 @@ local mod = {
}
vl_block_update = mod
---@class core.NodeDef
---@field vl_block_update? fun(pos : vector.Vector, node : core.Node, def : core.NodeDef)
---@field _onload? fun(pos : vector.Vector)
local PROFILE = false
local lookaside_cache = {}
local pending_block_updates = {}
@ -29,7 +33,6 @@ local function queue_block_updates(pos)
}
if type(core.hash_node_position(vector.zero())) == "number" then
local offset = core.hash_node_position(vector.zero())
for i = 1,#block_update_pattern do
local hash_diff = core.hash_node_position(block_update_pattern[i]) - core.hash_node_position(vector.zero())
if hash_diff < 0 then
@ -43,7 +46,7 @@ local function queue_block_updates(pos)
code = code .. "\tlocal np = vector.offset(pos,"..p.x..","..p.y..","..p.z..")\n"
code = code .. "\tpending_block_updates[core.hash_node_position(np)]=true\n"
for i = 2,#block_update_pattern do
local p = block_update_pattern[i]
p = block_update_pattern[i]
code = code .. "\tnp.x = pos.x+("..p.x..")\n"
code = code .. "\tnp.y = pos.y+("..p.x..")\n"
code = code .. "\tnp.z = pos.z+("..p.x..")\n"
@ -53,7 +56,7 @@ local function queue_block_updates(pos)
>>>
end
core.register_globalstep(function(dtime)
core.register_globalstep(function()
if not has_block_updates then return end
local start = core.get_us_time()
@ -92,24 +95,28 @@ local function node_changed(pos)
end
local old_add_node = core.add_node
---@diagnostic disable-next-line:duplicate-set-field
function core.add_node(pos, node)
old_add_node(pos, node)
node_changed(pos)
end
local old_set_node = core.set_node
---@diagnostic disable-next-line:duplicate-set-field
function core.set_node(pos, node)
old_set_node(pos, node)
node_changed(pos)
end
local old_remove_node = core.remove_node
---@diagnostic disable-next-line:duplicate-set-field
function core.remove_node(pos)
old_remove_node(pos)
node_changed(pos)
end
local old_bulk_set_node = core.bulk_set_node
---@diagnostic disable-next-line:duplicate-set-field
function core.bulk_set_node(lst, node)
old_bulk_set_node(lst, node)
for i=1,#lst do

@ -2,6 +2,10 @@ local S = core.get_translator(core.get_current_modname())
local core_get_node = core.get_node
---@class core.NodeDef
---@field _mcl_observer_on_name? string
---@field _mcl_observer_off_name? string
local rules_down = {{ x = 0, y = 1, z = 0, spread = true }}
local rules_up = {{ x = 0, y = -1, z = 0, spread = true }}
local function get_rules_flat(node)
@ -11,7 +15,7 @@ local function get_rules_flat(node)
end
local function observer_look_position(pos, node)
local node = node or core_get_node(pos)
node = node or core_get_node(pos)
if node.name == "mcl_observers:observer_up_off" or node.name == "mcl_observers:observer_up_on" then
return vector.offset(pos, 0, 1, 0)
@ -39,6 +43,7 @@ local function observer_orientate(pos, placer)
end
end
---@param node core.Node
local function update_observer(pos, node, def, force_activate)
local front = observer_look_position(pos, node)
if not force_activate and not vl_block_update.updated[core.hash_node_position(front)] then
@ -47,20 +52,16 @@ local function update_observer(pos, node, def, force_activate)
-- Node state changed! Activate observer
core.after(0,function()
if node.name == "mcl_observers:observer_off" then
core.set_node(pos, {name = "mcl_observers:observer_on", param2 = node.param2})
mesecon.receptor_on(pos, get_rules_flat(node))
elseif node.name == "mcl_observers:observer_down_off" then
core.set_node(pos, {name = "mcl_observers:observer_down_on"})
mesecon.receptor_on(pos, rules_down)
elseif node.name == "mcl_observers:observer_up_off" then
core.set_node(pos, {name = "mcl_observers:observer_up_on"})
mesecon.receptor_on(pos, rules_up)
def = core.registered_nodes[node.name]
if def and def._mcl_observer_on_name then
node.name = def._mcl_observer_on_name
core.set_node(pos, node)
mesecon.receptor_on(pos)
end
end)
end
local function activate_observer(pos, node, def)
update_observer(pos, node, def, true)
local function on_move(pos, node)
update_observer(pos, node, core.registered_nodes[node.name], true)
end
local function on_load(pos)
local node = core_get_node(pos)
@ -79,142 +80,164 @@ local function decay_on_observer(pos)
end)
end
mesecon.register_node("mcl_observers:observer", {
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
paramtype2 = "facedir",
on_rotate = false,
_mcl_blast_resistance = 3,
_mcl_hardness = 3,
vl_block_update = update_observer,
}, {
description = S("Observer"),
_tt_help = S("Emits redstone pulse when block in front changes"),
_doc_items_longdesc = S("An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes."),
_doc_items_usagehelp = S("Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here."),
core.register_node("mcl_observers:observer_off",{
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
paramtype2 = "facedir",
on_rotate = false,
_mcl_blast_resistance = 3,
_mcl_hardness = 3,
vl_block_update = update_observer,
description = S("Observer"),
_tt_help = S("Emits redstone pulse when block in front changes"),
_doc_items_longdesc = S("An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes."),
_doc_items_usagehelp = S("Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here."),
groups = {pickaxey=1, material_stone=1, not_opaque=1, },
tiles = {
"mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png",
"mcl_observers_observer_side.png", "mcl_observers_observer_side.png",
"mcl_observers_observer_front.png", "mcl_observers_observer_back.png",
},
mesecons = {
receptor = {
state = mesecon.state.off,
rules = get_rules_flat,
},
},
after_place_node = observer_orientate,
_onmove = activate_observer,
_onload = on_load,
}, {
_doc_items_create_entry = false,
groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 },
tiles = {
"mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png",
"mcl_observers_observer_side.png", "mcl_observers_observer_side.png",
"mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png",
},
mesecons = {
receptor = {
state = mesecon.state.on,
rules = get_rules_flat,
}
},
_mcl_observer_off_name = "mcl_observers:observer_off",
on_construct = decay_on_observer,
_onload = decay_on_observer,
}
)
groups = {pickaxey=1, material_stone=1, not_opaque=1, },
tiles = {
"mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png",
"mcl_observers_observer_side.png", "mcl_observers_observer_side.png",
"mcl_observers_observer_front.png", "mcl_observers_observer_back.png",
},
mesecon.register_node("mcl_observers:observer_down", {
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 },
on_rotate = false,
_mcl_blast_resistance = 3,
_mcl_hardness = 3,
drop = "mcl_observers:observer_off",
}, {
tiles = {
"mcl_observers_observer_back.png", "mcl_observers_observer_front.png",
"mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90",
"mcl_observers_observer_top.png", "mcl_observers_observer_top.png",
},
vl_block_update = update_observer,
mesecons = {
receptor = {
state = mesecon.state.off,
rules = rules_down,
},
mesecons = {
receptor = {
state = mesecon.state.off,
rules = get_rules_flat,
},
on_mvps_move = on_move,
},
_onmove = activate_observer,
_onload = on_load,
}, {
_doc_items_create_entry = false,
tiles = {
"mcl_observers_observer_back_lit.png", "mcl_observers_observer_front.png",
"mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90",
"mcl_observers_observer_top.png", "mcl_observers_observer_top.png",
},
mesecons = {
receptor = {
state = mesecon.state.on,
rules = rules_down,
},
after_place_node = observer_orientate,
_mcl_observer_on_name = "mcl_observers:observer_on",
_onload = on_load,
})
core.register_node("mcl_observers:observer_on",{
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
paramtype2 = "facedir",
on_rotate = false,
_mcl_blast_resistance = 3,
_mcl_hardness = 3,
vl_block_update = update_observer,
_doc_items_create_entry = false,
groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 },
tiles = {
"mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png",
"mcl_observers_observer_side.png", "mcl_observers_observer_side.png",
"mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png",
},
mesecons = {
receptor = {
state = mesecon.state.on,
rules = get_rules_flat,
}
},
_mcl_observer_off_name = "mcl_observers:observer_off",
on_construct = decay_on_observer,
_onload = decay_on_observer,
})
core.register_node("mcl_observers:observer_down_off",{
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 },
on_rotate = false,
_mcl_blast_resistance = 3,
_mcl_hardness = 3,
drop = "mcl_observers:observer_off",
tiles = {
"mcl_observers_observer_back.png", "mcl_observers_observer_front.png",
"mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90",
"mcl_observers_observer_top.png", "mcl_observers_observer_top.png",
},
vl_block_update = update_observer,
mesecons = {
receptor = {
state = mesecon.state.off,
rules = rules_down,
},
on_mvps_move = on_move,
},
_mcl_observer_off_name = "mcl_observers:observer_down_off",
on_construct = decay_on_observer,
_onload = decay_on_observer,
}
)
_mcl_observer_on_name = "mcl_observers:observer_down_on",
_onload = on_load,
})
core.register_node("mcl_observers:observer_down_on",{
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 },
on_rotate = false,
_mcl_blast_resistance = 3,
_mcl_hardness = 3,
drop = "mcl_observers:observer_off",
_doc_items_create_entry = false,
tiles = {
"mcl_observers_observer_back_lit.png", "mcl_observers_observer_front.png",
"mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90",
"mcl_observers_observer_top.png", "mcl_observers_observer_top.png",
},
mesecons = {
receptor = {
state = mesecon.state.on,
rules = rules_down,
},
},
mesecon.register_node("mcl_observers:observer_up", {
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 },
on_rotate = false,
_mcl_blast_resistance = 3,
_mcl_hardness = 3,
drop = "mcl_observers:observer_off",
vl_block_update = update_observer,
}, {
tiles = {
"mcl_observers_observer_front.png", "mcl_observers_observer_back.png",
"mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270",
"mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180",
},
mesecons = {
receptor = {
state = mesecon.state.off,
rules = rules_up,
},
_mcl_observer_off_name = "mcl_observers:observer_down_off",
on_construct = decay_on_observer,
_onload = decay_on_observer,
})
core.register_node("mcl_observers:observer_up_off",{
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 },
on_rotate = false,
_mcl_blast_resistance = 3,
_mcl_hardness = 3,
drop = "mcl_observers:observer_off",
vl_block_update = update_observer,
tiles = {
"mcl_observers_observer_front.png", "mcl_observers_observer_back.png",
"mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270",
"mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180",
},
mesecons = {
receptor = {
state = mesecon.state.off,
rules = rules_up,
},
on_mvps_move = on_move,
},
_onmove = activate_observer,
_onload = on_load,
}, {
_doc_items_create_entry = false,
tiles = {
"mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png",
"mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270",
"mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180",
},
mesecons = {
receptor = {
state = mesecon.state.on,
rules = rules_up,
},
_mcl_observer_on_name = "mcl_observers:observer_up_on",
_onload = on_load,
})
core.register_node("mcl_observers:observer_up_on",{
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 },
on_rotate = false,
_mcl_blast_resistance = 3,
_mcl_hardness = 3,
drop = "mcl_observers:observer_off",
vl_block_update = update_observer,
_doc_items_create_entry = false,
tiles = {
"mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png",
"mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270",
"mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180",
},
mesecons = {
receptor = {
state = mesecon.state.on,
rules = rules_up,
},
},
_mcl_observer_off_name = "mcl_observers:observer_up_off",
on_construct = decay_on_observer,
_onload = decay_on_observer,
}
)
_mcl_observer_off_name = "mcl_observers:observer_up_off",
on_construct = decay_on_observer,
_onload = decay_on_observer,
})
core.register_craft({
output = "mcl_observers:observer_off",

@ -1,6 +1,12 @@
local GRAVITY = tonumber(minetest.settings:get("movement_gravity"))
local table = table
---@class mesecons.BaseDef
---@field on_mvps_move? fun(pos : vector.Vector, node : core.Node, oldpos : vector.Vector, meta)
---@class core.NodeDef
---@field mesecons mesecons.BaseDef?
--register stoppers for movestones/pistons
mesecon.mvps_stoppers = {}
@ -148,7 +154,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos)
if not node_replaceable(nn.name) then
table.insert(nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}})
if #nodes > maximum then return nil, nil, false, true end
-- add connected nodes to frontiers, connected is a vector list
-- the vectors must be absolute positions
local connected = {}
@ -160,7 +166,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos)
end
end
table.insert(connected, vector.add(np, dir))
-- Make sure there are no duplicates in frontiers / nodes before
-- adding nodes in "connected" to frontiers
for _, cp in ipairs(connected) do
@ -326,8 +332,6 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name,
if n.node_timer then
minetest.get_node_timer(np):set(unpack(n.node_timer))
end
local def = core.registered_nodes[n.node.name]
if def and def._onmove then def._onmove(np, n.node, def) end
end
local moved_nodes = {}
@ -955,8 +959,8 @@ mesecon.register_on_mvps_move(function(moved_nodes)
-- Callback for on_mvps_move stored in nodedef
local node_def = minetest.registered_nodes[moved_node.node.name]
if node_def and node_def.mesecon and node_def.mesecon.on_mvps_move then
node_def.mesecon.on_mvps_move(moved_node.pos, moved_node.node,
if node_def and node_def.mesecons and node_def.mesecons.on_mvps_move then
node_def.mesecons.on_mvps_move(moved_node.pos, moved_node.node,
moved_node.oldpos, moved_node.meta)
end
end

@ -545,7 +545,7 @@ kelp.surface_deftemplate = {
on_destruct = kelp.surface_on_destruct,
on_dig = kelp.surface_on_dig,
after_dig_node = kelp.surface_after_dig_node,
mesecon = { on_mvps_move = kelp.surface_on_mvps_move, },
mesecons = { on_mvps_move = kelp.surface_on_mvps_move, },
drop = "", -- drops are handled in on_dig
--_mcl_falling_node_alternative = is_falling and nodename or nil,
_mcl_hardness = 0,