From 7b43748f18651b98b55ce1a72b5feb2fc21be4c8 Mon Sep 17 00:00:00 2001 From: Ukendio Date: Thu, 24 Jul 2025 02:24:25 +0200 Subject: [PATCH] Fix types issues --- addons/observers.luau | 50 ++++++++++--------- demo/src/ReplicatedStorage/collect.luau | 19 ++++--- demo/src/ReplicatedStorage/remotes.luau | 24 +++------ .../systems/receive_replication.luau | 3 -- .../systems/replication.luau | 3 +- 5 files changed, 48 insertions(+), 51 deletions(-) diff --git a/addons/observers.luau b/addons/observers.luau index 99fc090..72264ba 100755 --- a/addons/observers.luau +++ b/addons/observers.luau @@ -2,42 +2,46 @@ local jecs = require("@jecs") -type Description = jecs.Query +export type Iter = (query: Query) -> () -> (jecs.Entity, T...) -type ObserverArm = (( - PatchedWorld, - { - query: jecs.Query, - callback: ((jecs.Entity) -> ())? +type Id = jecs.Id + +type Query = typeof(setmetatable( + {} :: { + iter: Iter, + with: ((Query, Id) -> Query) + & ((Query, Id, Id) -> Query) + & ((Query, Id, Id, Id) -> Query) + & ((Query, Id, Id, Id) -> Query) + & ((Query, Id, Id, Id, Id) -> Query), + without: ((Query, Id) -> Query) + & ((Query, Id, Id) -> Query) + & ((Query, Id, Id, Id) -> Query) + & ((Query, Id, Id, Id) -> Query) + & ((Query, Id, Id, Id, Id) -> Query), + archetypes: (self: Query) -> { jecs.Archetype }, + cached: (self: Query) -> Query, + }, + {} :: { + __iter: Iter, } -) -> () -> () -> (jecs.Entity)) & (( - PatchedWorld, - { - query: jecs.Query, - callback: ((jecs.Entity) -> ())? - } -) -> () -> () -> (jecs.Entity)) & (( - PatchedWorld, - { - query: jecs.Query, - callback: ((jecs.Entity) -> ())? - } -) -> () -> () -> (jecs.Entity)) +)) export type PatchedWorld = jecs.World & { added: (PatchedWorld, jecs.Id, (e: jecs.Entity, id: jecs.Id, value: T?) -> ()) -> () -> (), removed: (PatchedWorld, jecs.Id, (e: jecs.Entity, id: jecs.Id) -> ()) -> () -> (), changed: (PatchedWorld, jecs.Id, (e: jecs.Entity, id: jecs.Id, value: T) -> ()) -> () -> (), - observer: ObserverArm & any, - monitor: ObserverArm & any + observer: (PatchedWorld, Query, callback: ((jecs.Entity, jecs.Id, any?) -> ())?) -> () -> () -> (jecs.Entity), + monitor: (PatchedWorld, Query, callback: ((jecs.Entity, jecs.Id, any?) -> ())?) -> () -> () -> (jecs.Entity) } -local function observers_new( +local function observers_new( world: PatchedWorld, - query: any, + query: Query, callback: ((jecs.Entity, jecs.Id, value: a?) -> ())? ) query = query:cached() + callback = callback local archetypes = {} local terms = query.ids diff --git a/demo/src/ReplicatedStorage/collect.luau b/demo/src/ReplicatedStorage/collect.luau index d6df981..43bfd61 100755 --- a/demo/src/ReplicatedStorage/collect.luau +++ b/demo/src/ReplicatedStorage/collect.luau @@ -1,13 +1,11 @@ -local function collect( - signal: { - Connect: (RBXScriptSignal, fn: (T...) -> ()) -> RBXScriptConnection - } -): () -> (T...) + +--!strict +local function collect(signal) local enqueued = {} local i = 0 - local connection = (signal :: any):Connect(function(...) + local connection = signal:Connect(function(...) table.insert(enqueued, { ... }) i += 1 end) @@ -25,4 +23,11 @@ local function collect( end, connection end -return collect +type Signal = { + Connect: (self: Signal, callback: (T...) -> ()) -> RBXScriptConnection, + ConnectParallel: (self: Signal, callback: (T...) -> ()) -> RBXScriptConnection, + Once: (self: Signal, callback: (T...) -> ()) -> RBXScriptConnection, + Wait: (self: Signal) -> (T...) +} + +return collect :: (Signal) -> (() -> (T...), RBXScriptConnection) diff --git a/demo/src/ReplicatedStorage/remotes.luau b/demo/src/ReplicatedStorage/remotes.luau index 4838770..1c2077f 100755 --- a/demo/src/ReplicatedStorage/remotes.luau +++ b/demo/src/ReplicatedStorage/remotes.luau @@ -1,40 +1,32 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") local types = require("../ReplicatedStorage/types") -type Signal = { - Connect: (Signal, fn: (T...) -> ()) -> RBXScriptConnection -} type Remote = { - FireClient: (Remote, T...) -> (), + FireClient: (Remote, Player, T...) -> (), FireAllClients: (Remote, T...) -> (), - FireServer: (Remote) -> (), - OnServerEvent: { - Connect: (any, fn: (Player, T...) -> () ) -> () - }, - OnClientEvent: { - Connect: (any, fn: (T...) -> () ) -> () - } - + FireServer: (Remote, T...) -> (), + OnServerEvent: RBXScriptSignal<(Player, T...)>, + OnClientEvent: RBXScriptSignal } -local function stream_ensure(name): Remote +local function stream_ensure(name) local remote = ReplicatedStorage:FindFirstChild(name) if not remote then remote = Instance.new("RemoteEvent") remote.Name = name remote.Parent = ReplicatedStorage end - return remote :: any + return remote end -local function datagram_ensure(name): Remote +local function datagram_ensure(name) local remote = ReplicatedStorage:FindFirstChild(name) if not remote then remote = Instance.new("UnreliableRemoteEvent") remote.Name = name remote.Parent = ReplicatedStorage end - return remote :: any + return remote end return { diff --git a/demo/src/ReplicatedStorage/systems/receive_replication.luau b/demo/src/ReplicatedStorage/systems/receive_replication.luau index febed9c..661d028 100755 --- a/demo/src/ReplicatedStorage/systems/receive_replication.luau +++ b/demo/src/ReplicatedStorage/systems/receive_replication.luau @@ -88,9 +88,6 @@ return function(world: types.World) if removed then for _, entity in removed do entity = ecs_ensure_entity(world, entity) - if not world:contains(entity) then - continue - end world:remove(entity, id) end end diff --git a/demo/src/ServerScriptService/systems/replication.luau b/demo/src/ServerScriptService/systems/replication.luau index 20c7d52..5ae440e 100755 --- a/demo/src/ServerScriptService/systems/replication.luau +++ b/demo/src/ServerScriptService/systems/replication.luau @@ -1,4 +1,3 @@ - --!strict local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") @@ -177,7 +176,7 @@ return function(world: ty.World) set_n += 1 set_ids[set_n] = e set_values[set_n] = v or true - elseif not world:contains(e) then + elseif world:contains(e) then removed_n += 1 removed_ids[removed_n] = e end