From c354a29fb1ceb0220879f9543349c7ced34cd5bb Mon Sep 17 00:00:00 2001 From: Intrinsic <96358358+Intrinsic-zyx@users.noreply.github.com> Date: Thu, 16 Jan 2025 15:45:29 -0800 Subject: [PATCH] Fixed world:delete() not invoking OnRemove hooks. (#178) * Fixed cached wildcard queries * Fixed world:delete() not calling OnRemove hook * Typo in hooks fix * Fixed test case * Fixed test case (again) * Fixed test case (again 2x) * Now it should work --- jecs.luau | 4 +++- test/tests.luau | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/jecs.luau b/jecs.luau index bc8cb59..099ffdb 100644 --- a/jecs.luau +++ b/jecs.luau @@ -957,8 +957,10 @@ local function archetype_delete(world: World, archetype: Archetype, row: number, -- TODO: if last == 0 then deactivate table + local component_index = world.componentIndex for _, id in id_types do - local on_remove: (entity: i53) -> () = world_get_one_inline(world, id, EcsOnRemove) + local idr = component_index[id] + local on_remove = idr.hooks.on_remove if on_remove then on_remove(delete) end diff --git a/test/tests.luau b/test/tests.luau index e775b98..1842975 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -1659,4 +1659,47 @@ TEST("wildcard query", function() CHECK(counter == 1) end end) + +TEST("world:delete() invokes OnRemove hook", function() + do CASE "#1" + local world = world_new() + + local A = world:entity() + local entity = world:entity() + + local called = false + world:set(A, jecs.OnRemove, function(e) + called = true + end) + + world:add(entity, A) + world:delete(entity) + + CHECK(called) + end + do CASE "#2" + local world = world_new() + local pair = jecs.pair + + local Relation = world:entity() + local A = world:entity() + local B = world:entity() + + world:add(Relation, pair(jecs.OnDelete, jecs.Delete)) + + local entity = world:entity() + + local called = false + world:set(A, jecs.OnRemove, function(e) + called = true + end) + + world:add(entity, A) + world:add(entity, pair(Relation, B)) + + world:delete(B) + + CHECK(called) + end +end) FINISH()