Skip to content

Commit 17b6a5f

Browse files
committed
fix: update setChanged logic to correctly populate changedMask
1 parent 6995fb3 commit 17b6a5f

File tree

3 files changed

+41
-3
lines changed

3 files changed

+41
-3
lines changed

packages/core/src/query/modifiers/changed.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,21 @@ export function setChanged(world: World, entity: Entity, trait: Trait) {
3434
// This is used for filling initial values for Changed modifiers.
3535
for (const changedMask of ctx.changedMasks.values()) {
3636
const eid = getEntityId(entity);
37-
if (!changedMask[eid]) changedMask[eid] = [];
38-
const traitId = trait[$internal].id;
39-
changedMask[eid][traitId] = 1;
37+
const data = ctx.traitData.get(trait)!;
38+
const { generationId, bitflag } = data;
39+
40+
// Ensure the generation array exists
41+
if (!changedMask[generationId]) {
42+
changedMask[generationId] = [];
43+
}
44+
45+
// Ensure the entity mask exists
46+
if (!changedMask[generationId][eid]) {
47+
changedMask[generationId][eid] = 0;
48+
}
49+
50+
// Set the bit for this trait
51+
changedMask[generationId][eid] |= bitflag;
4052
}
4153

4254
// Update queries.

packages/core/tests/query-modifiers.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,4 +498,17 @@ describe('Query modifiers', () => {
498498
entity.remove(Foo);
499499
expect(world.queryFirst(Changed(Position), Not(Foo))).toBeUndefined();
500500
});
501+
502+
it('should correctly populate Changed query when trait changes happen before query initialization', () => {
503+
// Create change modifier and spawn an entity
504+
const Changed = createChanged();
505+
const entity = world.spawn(Foo, Bar);
506+
507+
// Mark Bar as changed
508+
entity.changed(Bar);
509+
510+
// Even if the query wasn't executed before,
511+
// it should pick up the trait change
512+
expect(world.queryFirst(Changed(Bar))).toBe(entity);
513+
});
501514
});

packages/publish/tests/core/query-modifiers.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,4 +498,17 @@ describe('Query modifiers', () => {
498498
entity.remove(Foo);
499499
expect(world.queryFirst(Changed(Position), Not(Foo))).toBeUndefined();
500500
});
501+
502+
it('should correctly populate Changed query when trait changes happen before query initialization', () => {
503+
// Create change modifier and spawn an entity
504+
const Changed = createChanged();
505+
const entity = world.spawn(Foo, Bar);
506+
507+
// Mark Bar as changed
508+
entity.changed(Bar);
509+
510+
// Even if the query wasn't executed before,
511+
// it should pick up the trait change
512+
expect(world.queryFirst(Changed(Bar))).toBe(entity);
513+
});
501514
});

0 commit comments

Comments
 (0)