diff --git a/src/events/internal-events.ts b/src/events/internal-events.ts index 1e12bea..5937c15 100644 --- a/src/events/internal-events.ts +++ b/src/events/internal-events.ts @@ -1,10 +1,20 @@ import type {ISystem} from "../system/system.spec.ts"; import type {TObjectProto} from "../_.spec.ts"; -import type {IIStateProto, IState} from "../state/state.spec.ts"; +import type {IState} from "../state/state.spec.ts"; +import type {IEntity} from "../entity/entity.spec.ts"; export class SimECSEvent {} +class SimECSEntityEvent extends SimECSEvent { + constructor( + public readonly entity: Readonly, + ) { super() } +} + +export class SimECSEntityAddEvent extends SimECSEntityEvent {} +export class SimECSEntityRemoveEvent extends SimECSEntityEvent {} + class SimECSPDAEvent extends SimECSEvent { constructor( public readonly state: Readonly | undefined, diff --git a/src/world/runtime/runtime-world_entities.ts b/src/world/runtime/runtime-world_entities.ts index f5e33c1..8d66796 100644 --- a/src/world/runtime/runtime-world_entities.ts +++ b/src/world/runtime/runtime-world_entities.ts @@ -1,6 +1,7 @@ import {type RuntimeWorld} from "./runtime-world.ts"; import type {IEntity} from "../../entity/entity.spec.ts"; import {addEntitySym, removeEntitySym} from "../../query/_.ts"; +import {SimECSEntityAddEvent, SimECSEntityRemoveEvent} from "../../events/internal-events.ts"; export function addEntity(this: RuntimeWorld, entity: Readonly): void { this.data.entities.add(entity); @@ -11,6 +12,9 @@ export function addEntity(this: RuntimeWorld, entity: Readonly): void { query[addEntitySym](entity); } } + + // todo: await in 0.7.0 + this.eventBus.publish(new SimECSEntityAddEvent(entity)); } export function hasEntity(this: RuntimeWorld, entity: Readonly): boolean { @@ -26,4 +30,7 @@ export function removeEntity(this: RuntimeWorld, entity: Readonly): voi query[removeEntitySym](entity); } } + + // todo: await in 0.7.0 + this.eventBus.publish(new SimECSEntityRemoveEvent(entity)); } \ No newline at end of file