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()