From c1e11cf84400482a737811152891a77c863837e0 Mon Sep 17 00:00:00 2001 From: EncodedVenom Date: Mon, 23 Sep 2024 08:13:46 -0400 Subject: [PATCH] Allow nil index in world:target --- src/index.d.ts | 10 ++++++++++ src/init.luau | 3 ++- test/tests.luau | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/index.d.ts b/src/index.d.ts index 8dbbc72..6d62f68 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -95,11 +95,21 @@ export class World { * Gets the target of a relationship. For example, when a user calls * `world.target(entity, ChildOf(parent))`, you will obtain the parent entity. * @param entity Entity + * @param index Target index * @param relation The Relationship * @returns The Parent Entity if it exists */ target(entity: Entity, relation: Entity, index: number): Entity | undefined; + /** + * Gets the target of a relationship. For example, when a user calls + * `world.target(entity, ChildOf(parent))`, you will obtain the parent entity. + * @param entity Entity + * @param relation The Relationship + * @returns The Parent Entity if it exists + */ + target(entity: Entity, relation: Entity): Entity | undefined; + /** * Clears an entity from the world. * @param entity Entity to be cleared diff --git a/src/init.luau b/src/init.luau index ef8c6b5..90767fb 100644 --- a/src/init.luau +++ b/src/init.luau @@ -389,7 +389,8 @@ local function world_has(world: World, entity: number, ...: i53): boolean return true end -local function world_target(world: World, entity: i53, relation: i24, index: number): i24? +local function world_target(world: World, entity: i53, relation: i24, index_opt: number?): i24? + local index = if index_opt then index_opt else 0 local record = world.entityIndex.sparse[entity] local archetype = record.archetype if not archetype then diff --git a/test/tests.luau b/test/tests.luau index 503ebd8..595afd0 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -1012,6 +1012,28 @@ TEST("world:target", function() CHECK(world:target(e, C, 1) == nil) end + do CASE "infer index when unspecified" + local world = 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, pair(A, B)) + world:add(e, pair(A, C)) + world:add(e, pair(B, C)) + world:add(e, pair(B, D)) + world:add(e, pair(C, D)) + + CHECK(world:target(e, A) == B) + CHECK(world:target(e, A, 1) == C) + CHECK(world:target(e, B) == C) + CHECK(world:target(e, B, 1) == D) + CHECK(world:target(e, C) == D) + CHECK(world:target(e, C, 1) == nil) + end + do CASE "loop until no target" local world = world_new()