From ef0f69ac6d3a28df38ae326373f182b219b3db99 Mon Sep 17 00:00:00 2001 From: Ukendio Date: Tue, 22 Apr 2025 04:49:52 +0200 Subject: [PATCH 1/2] Set signal with hook --- addons/observers.luau | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/addons/observers.luau b/addons/observers.luau index cffce81..be27d89 100644 --- a/addons/observers.luau +++ b/addons/observers.luau @@ -104,13 +104,12 @@ local function observers_add(world: jecs.World & { [string]: any }): PatchedWorl if not listeners then listeners = {} signals.added[component] = listeners - local idr = jecs.id_record_ensure(world, component) - idr.hooks.on_add = function(entity) - for _, listener in listeners do - listener(entity, component) + local function on_add(entity: number, id: number, value: any) + for _, listener in listeners :: any do + listener(entity, id, value) end end - end + world:set(component, jecs.OnAdd, on_add) end table.insert(listeners, fn) end @@ -119,12 +118,12 @@ local function observers_add(world: jecs.World & { [string]: any }): PatchedWorl if not listeners then listeners = {} signals.emplaced[component] = listeners - local idr = jecs.id_record_ensure(world, component) - idr.hooks.on_change = function(entity, value) - for _, listener in listeners do - listener(entity, component, value) + local function on_change(entity: number, id: number, value: any) + for _, listener in listeners :: any do + listener(entity, id, value) end end + world:set(component, jecs.OnChange, on_change) end table.insert(listeners, fn) end @@ -134,12 +133,12 @@ local function observers_add(world: jecs.World & { [string]: any }): PatchedWorl if not listeners then listeners = {} signals.removed[component] = listeners - local idr = jecs.id_record_ensure(world, component) - idr.hooks.on_remove = function(entity) - for _, listener in listeners do - listener(entity, component) + local function on_remove(entity: number, id: number, value: any) + for _, listener in listeners :: any do + listener(entity, id, value) end end + world:set(component, jecs.OnRemove, on_remove) end table.insert(listeners, fn) end @@ -150,7 +149,7 @@ local function observers_add(world: jecs.World & { [string]: any }): PatchedWorl world.monitor = monitors_new - return world + return world :: PatchedWorld end return observers_add From 8822be58a965c6ce062b441b3ed1096dc0a7c22a Mon Sep 17 00:00:00 2001 From: Ukendio Date: Tue, 22 Apr 2025 04:52:21 +0200 Subject: [PATCH 2/2] Add assertion against existing idr --- addons/observers.luau | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/observers.luau b/addons/observers.luau index be27d89..a7a8191 100644 --- a/addons/observers.luau +++ b/addons/observers.luau @@ -101,6 +101,8 @@ local function observers_add(world: jecs.World & { [string]: any }): PatchedWorl world.added = function(_, component, fn) local listeners = signals.added[component] + local component_index = world.component_index :: jecs.ComponentIndex + assert(component_index[component] == nil, "You cannot use hooks on components you intend to use this signal with") if not listeners then listeners = {} signals.added[component] = listeners @@ -115,6 +117,8 @@ local function observers_add(world: jecs.World & { [string]: any }): PatchedWorl world.changed = function(_, component, fn) local listeners = signals.emplaced[component] + local component_index = world.component_index :: jecs.ComponentIndex + assert(component_index[component] == nil, "You cannot use hooks on components you intend to use this signal with") if not listeners then listeners = {} signals.emplaced[component] = listeners @@ -130,6 +134,8 @@ local function observers_add(world: jecs.World & { [string]: any }): PatchedWorl world.removed = function(_, component, fn) local listeners = signals.removed[component] + local component_index = world.component_index :: jecs.ComponentIndex + assert(component_index[component] == nil, "You cannot use hooks on components you intend to use this signal with") if not listeners then listeners = {} signals.removed[component] = listeners