This commit is contained in:
Ukendio 2025-06-28 20:54:17 +02:00
parent bee92f489c
commit 1ff2afc97c
5 changed files with 72 additions and 10 deletions

4
jecs.d.ts vendored
View file

@ -105,7 +105,7 @@ export class World {
/** /**
* Creates a new World. * Creates a new World.
*/ */
constructor(); private constructor();
/** /**
* Enforces a check for entities to be created within a desired range. * Enforces a check for entities to be created within a desired range.
@ -249,6 +249,8 @@ export class World {
query<T extends Id[]>(...components: T): Query<InferComponents<T>>; query<T extends Id[]>(...components: T): Query<InferComponents<T>>;
} }
export function world(): World;
export function component<T>(): Entity<T>; export function component<T>(): Entity<T>;
export function tag(): Tag; export function tag(): Tag;

View file

@ -52,6 +52,8 @@ export type Query<T...> = typeof(setmetatable(
} }
)) ))
type QueryArm<T...> = () -> ()
export type Observer = { export type Observer = {
callback: (archetype: Archetype) -> (), callback: (archetype: Archetype) -> (),
query: QueryInner, query: QueryInner,
@ -658,6 +660,9 @@ local function id_record_ensure(world: World, id: Entity): ComponentRecord
local relation = id local relation = id
local target = 0 local target = 0
local is_pair = ECS_IS_PAIR(id :: number) local is_pair = ECS_IS_PAIR(id :: number)
local has_delete = false
if is_pair then if is_pair then
relation = entity_index_get_alive(entity_index, ECS_PAIR_FIRST(id :: number)) :: i53 relation = entity_index_get_alive(entity_index, ECS_PAIR_FIRST(id :: number)) :: i53
ecs_assert(relation and entity_index_is_alive( ecs_assert(relation and entity_index_is_alive(
@ -665,16 +670,19 @@ local function id_record_ensure(world: World, id: Entity): ComponentRecord
target = entity_index_get_alive(entity_index, ECS_PAIR_SECOND(id :: number)) :: i53 target = entity_index_get_alive(entity_index, ECS_PAIR_SECOND(id :: number)) :: i53
ecs_assert(target and entity_index_is_alive( ecs_assert(target and entity_index_is_alive(
entity_index, target), ECS_INTERNAL_ERROR) entity_index, target), ECS_INTERNAL_ERROR)
end
local cleanup_policy = world_target(world, relation, EcsOnDelete, 0)
local cleanup_policy_target = world_target(world, relation, EcsOnDeleteTarget, 0) local cleanup_policy_target = world_target(world, relation, EcsOnDeleteTarget, 0)
local has_delete = false if cleanup_policy_target == EcsDelete then
if cleanup_policy == EcsDelete or cleanup_policy_target == EcsDelete then
has_delete = true has_delete = true
end end
else
local cleanup_policy = world_target(world, relation, EcsOnDelete, 0)
if cleanup_policy == EcsDelete then
has_delete = true
end
end
local on_add, on_change, on_remove = world_get(world, local on_add, on_change, on_remove = world_get(world,
relation, EcsOnAdd, EcsOnChange, EcsOnRemove) relation, EcsOnAdd, EcsOnChange, EcsOnRemove)
@ -2533,6 +2541,7 @@ local function world_new()
end end
end end
end end
end end
local function inner_world_delete<T>(world: World, entity: Entity<T>) local function inner_world_delete<T>(world: World, entity: Entity<T>)

View file

@ -1,6 +1,6 @@
{ {
"name": "@rbxts/jecs", "name": "@rbxts/jecs",
"version": "0.7.2", "version": "0.7.3",
"description": "Stupidly fast Entity Component System", "description": "Stupidly fast Entity Component System",
"main": "jecs.luau", "main": "jecs.luau",
"repository": { "repository": {

View file

@ -25,6 +25,57 @@ local entity_visualiser = require("@tools/entity_visualiser")
local lifetime_tracker_add = require("@tools/lifetime_tracker") local lifetime_tracker_add = require("@tools/lifetime_tracker")
local dwi = entity_visualiser.stringify local dwi = entity_visualiser.stringify
TEST("repro#", function()
do CASE "pair(OnDelete, Delete)"
local world = jecs.world()
local ct = world:component()
world:add(ct, jecs.pair(jecs.OnDelete, jecs.Delete))
local e1 = world:entity()
local e2 = world:entity()
local dummy = world:entity()
world:add(e1, ct)
world:add(e2, jecs.pair(ct, dummy))
world:delete(dummy)
CHECK(world:contains(e2))
world:delete(ct)
CHECK(not world:contains(e1))
end
do CASE "pair(OnDeleteTarget, Delete)"
print("start")
local world = jecs.world()
local ct = world:component()
world:add(ct, jecs.pair(jecs.OnDeleteTarget, jecs.Delete))
local e1 = world:entity()
local e2 = world:entity()
-- local dummy = world:entity()
print("flags")
world:add(e1, ct)
print(world.component_index[ct].flags)
-- world:add(e2, jecs.pair(ct, dummy))
-- world:delete(dummy)
-- CHECK(not world:contains(e2))
world:delete(ct)
CHECK(world:contains(e1))
end
end)
TEST("bulk", function() TEST("bulk", function()
local world = jecs.world() local world = jecs.world()
local A = world:component() local A = world:component()
@ -441,7 +492,7 @@ TEST("world:delete()", function()
local A = world:entity() local A = world:entity()
local B = world:entity() local B = world:entity()
world:add(Relation, pair(jecs.OnDelete, jecs.Delete)) world:add(Relation, pair(jecs.OnDeleteTarget, jecs.Delete))
local entity = world:entity() local entity = world:entity()

View file

@ -1,6 +1,6 @@
[package] [package]
name = "ukendio/jecs" name = "ukendio/jecs"
version = "0.7.2" version = "0.7.3"
registry = "https://github.com/UpliftGames/wally-index" registry = "https://github.com/UpliftGames/wally-index"
realm = "shared" realm = "shared"
license = "MIT" license = "MIT"