mirror of
https://git.minetest.land/MineClone2/MineClone2.git
synced 2025-03-13 17:42:29 +01:00
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:
@ -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,
|
||||
|
Reference in New Issue
Block a user