diff --git a/src/init.luau b/src/init.luau index 4ccb761..521a551 100644 --- a/src/init.luau +++ b/src/init.luau @@ -669,6 +669,32 @@ do end end +local world_has: () -> boolean +do + function world_has(world, entity_id, ...) + local id = entity_id + local record = world.entityIndex.sparse[id] + if not record then + return false + end + + local archetype = record.archetype + if not archetype then + return false + end + + local tr = archetype.records + + for i = 1, select("#", ...) do + if not tr[select(i, ...)] then + return false + end + end + + return true + end +end + type Item = () -> (number, ...any) export type Query = typeof({ __iter = function(): Item @@ -1077,6 +1103,7 @@ World.component = world_component World.add = world_add World.set = world_set World.get = world_get +World.has = world_has World.target = world_target World.parent = world_parent diff --git a/test/tests.luau b/test/tests.luau index 67559cb..508648c 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -530,6 +530,34 @@ TEST("world", function() CHECK(withoutCount == 0) end + + do CASE "should find Tag on entity" + local world = jecs.World.new() + + local Tag = world:component() + + local e = world:entity() + world:add(e, Tag) + + CHECK(world:has(e, Tag)) + end + + do CASE "should return false when missing one tag" + local world = jecs.World.new() + + local A = world:component() + local B = world:component() + local C = world:component() + local D = world:component() + + local e = world:entity() + world:add(e, A) + world:add(e, C) + world:add(e, D) + + CHECK(world:has(e, A, B, C, D) == false) + end + end)