move block ticks register to separate script

This commit is contained in:
MihailRis
2025-11-17 21:33:44 +03:00
parent 9653b18143
commit 473f9f1a6a
6 changed files with 109 additions and 92 deletions
+1 -1
View File
@@ -730,7 +730,7 @@ static int l_pull_register_events(lua::State* L) {
lua::createtable(L, events.size() * 4, 0);
for (int i = 0; i < events.size(); i++) {
const auto& event = events[i];
lua::pushinteger(L, static_cast<int>(event.type) | event.id << 16);
lua::pushinteger(L, static_cast<int>(event.bits) | event.id << 16);
lua::rawseti(L, i * 4 + 1);
for (int j = 0; j < 3; j++) {
+1
View File
@@ -72,6 +72,7 @@ void scripting::initialize(Engine* engine) {
load_script(io::path("stdlib.lua"), true);
load_script(io::path("classes.lua"), true);
load_script(io::path("internal_events.lua"), true);
}
class LuaCoroutine : public Process {
+37 -19
View File
@@ -14,39 +14,46 @@ std::vector<BlockRegisterEvent> blocks_agent::pull_register_events() {
return events;
}
static uint16_t get_events_bits(bool present, const Block& def) {
uint16_t bits = 0;
if (def.rt.funcsset.onblocktick) {
bits |= present ? BlockRegisterEvent::REGISTER_UPDATING_BIT
: BlockRegisterEvent::UNREGISTER_UPDATING_BIT;
}
return bits;
}
static void on_chunk_register_event(
const ContentIndices& indices,
const Chunk& chunk,
BlockRegisterEvent::Type type
bool present
) {
for (int i = 0; i < CHUNK_VOL; i++) {
const auto& def =
indices.blocks.require(chunk.voxels[i].id);
if (def.rt.funcsset.onblocktick) {
int x = i % CHUNK_W + chunk.x * CHUNK_W;
int z = (i / CHUNK_W) % CHUNK_D + chunk.z * CHUNK_D;
int y = (i / CHUNK_W / CHUNK_D);
block_register_events.push_back(BlockRegisterEvent {
type, def.rt.id, {x, y, z}
});
uint16_t bits = get_events_bits(present, def);
if (bits == 0) {
continue;
}
int x = i % CHUNK_W + chunk.x * CHUNK_W;
int z = (i / CHUNK_W) % CHUNK_D + chunk.z * CHUNK_D;
int y = (i / CHUNK_W / CHUNK_D);
block_register_events.push_back(BlockRegisterEvent {
bits, def.rt.id, {x, y, z}
});
}
}
void blocks_agent::on_chunk_present(
const ContentIndices& indices, const Chunk& chunk
) {
on_chunk_register_event(
indices, chunk, BlockRegisterEvent::Type::REGISTER_UPDATING
);
on_chunk_register_event(indices, chunk, true);
}
void blocks_agent::on_chunk_remove(
const ContentIndices& indices, const Chunk& chunk
) {
on_chunk_register_event(
indices, chunk, BlockRegisterEvent::Type::UNREGISTER_UPDATING
);
on_chunk_register_event(indices, chunk, false);
}
template <class Storage>
@@ -101,11 +108,14 @@ static void finalize_block(
chunk.flags.blocksData = true;
}
}
if (def.rt.funcsset.onblocktick) {
block_register_events.push_back(BlockRegisterEvent {
BlockRegisterEvent::Type::UNREGISTER_UPDATING, def.rt.id, {x, y, z}
});
uint16_t bits = get_events_bits(false, def);
if (bits == 0) {
return;
}
block_register_events.push_back(BlockRegisterEvent {
bits, def.rt.id, {x, y, z}
});
}
template <class Storage>
@@ -131,9 +141,17 @@ static void initialize_block(
refresh_chunk_heights(chunk, id == BLOCK_AIR, y);
mark_neighboirs_modified(chunks, cx, cz, lx, lz);
uint16_t bits = get_events_bits(true, def);
if (bits == 0) {
return;
}
block_register_events.push_back(BlockRegisterEvent {
bits, def.rt.id, {x, y, z}
});
if (def.rt.funcsset.onblocktick) {
block_register_events.push_back(BlockRegisterEvent {
BlockRegisterEvent::Type::REGISTER_UPDATING, def.rt.id, {x, y, z}
bits, def.rt.id, {x, y, z}
});
}
}
+4 -5
View File
@@ -25,11 +25,10 @@ struct AABB;
namespace blocks_agent {
struct BlockRegisterEvent {
enum class Type : uint16_t {
REGISTER_UPDATING,
UNREGISTER_UPDATING,
};
Type type;
static inline constexpr uint16_t REGISTER_UPDATING_BIT = 0x1;
static inline constexpr uint16_t UNREGISTER_UPDATING_BIT = 0x2;
static inline constexpr uint16_t PRESENT_EVENT_BIT = 0x4;
uint16_t bits;
blockid_t id;
glm::ivec3 coord;
};