add 'on_block_removed' event

This commit is contained in:
MihailRis
2025-11-18 22:11:44 +03:00
parent b3e5f2a1c0
commit f721731ecc
12 changed files with 61 additions and 16 deletions
+27 -14
View File
@@ -1,8 +1,9 @@
local updating_blocks = {}
local present_queues = {}
local TYPE_REGISTER = 1
local TYPE_UPDATING = 2
local TYPE_PRESENT = 4
local REGISTER_BIT = 0x1
local UPDATING_BIT = 0x2
local PRESENT_BIT = 0x4
local REMOVED_BIT = 0x8
block.__perform_ticks = function(delta)
for id, entry in pairs(updating_blocks) do
@@ -25,7 +26,7 @@ block.__perform_ticks = function(delta)
end
for id, queue in pairs(present_queues) do
queue.timer = queue.timer + delta
local steps = math.floor(queue.timer / queue.delta * #queue / 4)
local steps = math.floor(queue.timer / queue.delta * #queue / 3)
if steps == 0 then
goto continue
end
@@ -33,16 +34,15 @@ block.__perform_ticks = function(delta)
local event = queue.event
local update_list = updating_blocks[id]
for i=1, steps do
local index = #queue - 3
local index = #queue - 2
if index <= 0 then
break
end
local is_register = queue[index]
local x = queue[index + 1]
local y = queue[index + 2]
local z = queue[index + 3]
local x = queue[index]
local y = queue[index + 1]
local z = queue[index + 2]
for j=1,4 do
for j=1,3 do
table.remove(queue, index)
end
events.emit(event, x, y, z)
@@ -65,6 +65,10 @@ block.__process_register_events = function()
if not register_events then
return
end
local emit_event = events.emit
local removed_events = {}
for i=1, #register_events, 4 do
local header = register_events[i]
local event_bits = bit.band(header, 0xFFFF)
@@ -73,11 +77,21 @@ block.__process_register_events = function()
local y = register_events[i + 2]
local z = register_events[i + 3]
local is_register = bit.band(event_bits, TYPE_REGISTER) ~= 0
local is_updating = bit.band(event_bits, TYPE_UPDATING) ~= 0
local is_present = bit.band(event_bits, TYPE_PRESENT) ~= 0
local is_register = bit.band(event_bits, REGISTER_BIT) ~= 0
local is_updating = bit.band(event_bits, UPDATING_BIT) ~= 0
local is_present = bit.band(event_bits, PRESENT_BIT) ~= 0
local is_removed = bit.band(event_bits, REMOVED_BIT) ~= 0
local list = updating_blocks[id]
if not is_register and is_removed then
local rm_event = removed_events[id]
if not rm_event then
rm_event = block.name(id) .. ".blockremoved"
removed_events[id] = rm_event
end
emit_event(rm_event, x, y, z)
end
if not list and is_register and is_updating then
list = {}
list.event = block.name(id) .. ".blocktick"
@@ -100,7 +114,6 @@ block.__process_register_events = function()
present_queue.updating = is_updating
present_queues[id] = present_queue
end
table.insert(present_queue, is_register)
table.insert(present_queue, x)
table.insert(present_queue, y)
table.insert(present_queue, z)
+4
View File
@@ -357,6 +357,10 @@ function __vc_on_world_tick(tps)
time.schedules.world:tick(1.0 / tps)
end
function __vc_process_before_quit()
block.__process_register_events()
end
function __vc_on_world_save()
local rule_values = {}
for name, rule in pairs(rules.rules) do