From 4bb7e64edddb99eea392ff928831afbc945ce2c1 Mon Sep 17 00:00:00 2001 From: Ukendio Date: Thu, 8 May 2025 23:21:38 +0200 Subject: [PATCH] Define behaviour for world:entity(id) --- addons/observers.luau | 14 +++++++------- jecs.luau | 10 +++++++--- test/addons/observers.luau | 1 - test/tests.luau | 12 ++++++------ 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/addons/observers.luau b/addons/observers.luau index ef85d85..0175060 100644 --- a/addons/observers.luau +++ b/addons/observers.luau @@ -1,16 +1,16 @@ local jecs = require("@jecs") -type Observer = { +type Observer = { callback: (jecs.Entity) -> (), - query: jecs.Query, + query: jecs.Query<...jecs.Id>, } export type PatchedWorld = jecs.World & { - added: (PatchedWorld, jecs.Id, (e: jecs.Entity, id: jecs.Id, value: T) -> ()) -> () -> (), - removed: (PatchedWorld, jecs.Id, (e: jecs.Entity, id: jecs.Id) -> ()) -> () -> (), - changed: (PatchedWorld, jecs.Id, (e: jecs.Entity, id: jecs.Id, value: T) -> ()) -> () -> (), - observer: (PatchedWorld, Observer) -> (), - monitor: (PatchedWorld, Observer) -> (), + added: (PatchedWorld, jecs.Id, (jecs.Entity, jecs.Id, T) -> ()) -> () -> (), + removed: (PatchedWorld, jecs.Id, (jecs.Entity, jecs.Id) -> ()) -> () -> (), + changed: (PatchedWorld, jecs.Id, (jecs.Entity, jecs.Id, T) -> ()) -> () -> (), + observer: (PatchedWorld, Observer) -> (), + monitor: (PatchedWorld, Observer) -> (), } local function observers_new(world, description) diff --git a/jecs.luau b/jecs.luau index 35cf16a..f705f0e 100644 --- a/jecs.luau +++ b/jecs.luau @@ -780,7 +780,11 @@ local function world_entity(world: ecs_world_t, entity: i53?): i53 local any = dense_array[dense] if dense <= alive_count then - return any + if any ~= entity then + error("Entity ID is already in use with a different generation") + else + return entity + end end local e_swap = dense_array[dense] @@ -790,9 +794,9 @@ local function world_entity(world: ecs_world_t, entity: i53?): i53 r_swap.dense = dense r.dense = alive_count dense_array[dense] = e_swap - dense_array[alive_count] = any + dense_array[alive_count] = entity - return any + return entity else for i = max_id + 1, index do sparse_array[i] = { dense = i } :: ecs_record_t diff --git a/test/addons/observers.luau b/test/addons/observers.luau index 1d5a99e..b255625 100644 --- a/test/addons/observers.luau +++ b/test/addons/observers.luau @@ -23,7 +23,6 @@ TEST("addons/observers", function() world:set(world:entity(), A, true) CHECK(count == 3) - print(count) end do CASE "Ensure ordering between signals and observers" diff --git a/test/tests.luau b/test/tests.luau index 61c089d..9ce5023 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -672,7 +672,7 @@ TEST("world:range()", function() local e2v1 = world:entity(399) CHECK(world:contains(e2v1)) CHECK(ECS_ID(e2v1) == 399) - CHECK(ECS_GENERATION(e2v1) == 1) + CHECK(ECS_GENERATION(e2v1) == 0) end do CASE "over range start" @@ -685,12 +685,12 @@ TEST("world:range()", function() local e2v1 = world:entity(405) CHECK(world:contains(e2v1)) CHECK(ECS_ID(e2v1) == 405) - CHECK(ECS_GENERATION(e2v1) == 1) + CHECK(ECS_GENERATION(e2v1) == 0) - do - local _e2v1 = world:entity(405) - CHECK(_e2v1 == e2v1) - end + world:delete(e2v1) + local e2v2 = world:entity(e2v1) + CHECK(ECS_ID(e2v2) == 405) + CHECK(ECS_GENERATION(e2v2) == 0) end end)