From c95e40c28b6984a75102479cf4be3c2eaa9675f9 Mon Sep 17 00:00:00 2001 From: metatablecat <132796135+metatablecat@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:41:46 +0100 Subject: [PATCH 1/4] Remove welcome message for Lune usage --- .darklua.json | 3 ++- src/init.lua | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.darklua.json b/.darklua.json index 7240bd1..2bec2dc 100644 --- a/.darklua.json +++ b/.darklua.json @@ -13,6 +13,7 @@ "rojo_sourcemap": "sourcemap.json", "indexing_style": "property" } - } + }, + "remove_unused_if_branch" ] } \ No newline at end of file diff --git a/src/init.lua b/src/init.lua index d14d664..6f5f065 100644 --- a/src/init.lua +++ b/src/init.lua @@ -56,5 +56,5 @@ Catwork = setmetatable({ table.freeze(Catwork) type Catwork = typeof(Catwork) -if not Catwork.Plugin then print(Common.WelcomeMessage) end +if game and not Catwork.Plugin then print(Common.WelcomeMessage) end return Catwork \ No newline at end of file From 448bcc4023a51a4835477816fcb38393be0ececd Mon Sep 17 00:00:00 2001 From: metatablecat <132796135+metatablecat@users.noreply.github.com> Date: Sun, 21 Jul 2024 14:03:30 +0100 Subject: [PATCH 2/4] Speed up object creation Switched to task.defer, this might break things so use carefully --- src/lib/Dispatcher.lua | 17 +++++++---------- src/lib/Object.lua | 4 ++-- src/lib/Service.lua | 2 +- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/lib/Dispatcher.lua b/src/lib/Dispatcher.lua index 6f19293..fd39d4f 100644 --- a/src/lib/Dispatcher.lua +++ b/src/lib/Dispatcher.lua @@ -52,21 +52,18 @@ local function free(state, ok, err, o, service) local held = state.HeldThreads; state.HeldThreads = {} for _, v in dispatchers do - task.spawn(v, ok, err) + task.defer(v, ok, err) end for _, v in held do - task.spawn(v, ok, err) + task.defer(v, ok, err) end end local function timeoutTracker(o, state): thread? if state.TimeoutDisabled then return end - return task.spawn(function(self) - task.wait(5) - ERROR.DISPATCHER_TIMEOUT(self:GetID(true)) - end, o) + return task.delay(5, ERROR.DISPATCHER_TIMEOUT, o:GetID(true)) end local function serviceStartup(service) @@ -94,7 +91,7 @@ local function serviceStartup(service) serviceState.State = "finished" for _, t in serviceState.HeldThreads do - task.spawn(t) + task.defer(t) end end end @@ -120,7 +117,7 @@ local function runObjectAction( free(state, ok, err) if service.Updating and o.Update then - task.spawn(doServiceLoopForObject, o, service, state) + task.defer(doServiceLoopForObject, o, service, state) end return ok, err @@ -156,7 +153,7 @@ local function spawnObject(object, service, state, asyncMode) object:HandleAsync(asyncMode) end - task.spawn(runObjectAction, object, spawnSignal, service, state) + task.defer(runObjectAction, object, spawnSignal, service, state) if not asyncMode then return object:Await() @@ -206,7 +203,7 @@ end function Dispatcher.slotHandleAsync(o, asyncHandler) local state = Dispatcher.getObjectState(o) - if not state then task.spawn(asyncHandler, false, "The object was destroyed") end + if not state then task.defer(asyncHandler, false, "The object was destroyed") end if state.ErrMsg then asyncHandler(false, state.ErrMsg) diff --git a/src/lib/Object.lua b/src/lib/Object.lua index 7daaecd..ca76dd4 100644 --- a/src/lib/Object.lua +++ b/src/lib/Object.lua @@ -80,8 +80,8 @@ return function(params: {[string]: any}, service) local destroying = self.Destroying local fragRemoved = service.ObjectRemoved - if destroying then task.spawn(destroying, self) end - if fragRemoved then task.spawn(fragRemoved, service, self) end + if destroying then task.defer(destroying, self) end + if fragRemoved then task.defer(fragRemoved, service, self) end Dispatcher.stop(self, state) end diff --git a/src/lib/Service.lua b/src/lib/Service.lua index 12bb305..9948fc2 100644 --- a/src/lib/Service.lua +++ b/src/lib/Service.lua @@ -37,7 +37,7 @@ local function createObjectForService(params, service) if not Common.AnalysisMode then Dispatcher.initObjectState(o) local objAdded = service.ObjectAdded - if objAdded then task.spawn(objAdded, service, o) end + if objAdded then task.defer(objAdded, service, o) end end return o From 634d551854fabf4fff213f9d332c383ad9b44127 Mon Sep 17 00:00:00 2001 From: metatablecat <132796135+metatablecat@users.noreply.github.com> Date: Sun, 21 Jul 2024 15:06:41 +0100 Subject: [PATCH 3/4] Runtime fixes --- src/lib/Dispatcher.lua | 4 ++-- src/lib/Error.lua | 1 + src/lib/Object.lua | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lib/Dispatcher.lua b/src/lib/Dispatcher.lua index fd39d4f..74422fc 100644 --- a/src/lib/Dispatcher.lua +++ b/src/lib/Dispatcher.lua @@ -102,7 +102,6 @@ local function runObjectAction( service, state ) - state.Spawned = true state.Thread = coroutine.running() for _, v in state.AwaitFor do @@ -153,6 +152,7 @@ local function spawnObject(object, service, state, asyncMode) object:HandleAsync(asyncMode) end + state.Spawned = true task.defer(runObjectAction, object, spawnSignal, service, state) if not asyncMode then @@ -169,7 +169,7 @@ function Dispatcher.spawnObject(o, fPrivate, xpcallHandler, asyncHandler) -- basically new logic for Spawn if state.Spawned then - ERROR:DISPATCHER_ALREADY_SPAWNED(o) + ERROR.DISPATCHER_ALREADY_SPAWNED(o:GetID(true)) end if xpcallHandler then diff --git a/src/lib/Error.lua b/src/lib/Error.lua index fc86636..4ee9a81 100644 --- a/src/lib/Error.lua +++ b/src/lib/Error.lua @@ -77,6 +77,7 @@ local ErrorBuffer = { ANALYSIS_MODE_NOT_AVAILABLE = e("ANALYSIS_MODE_NOT_AVAILABLE", "Analysis mode cannot be used in %s", "E"), + DESTROYED_BEFORE_SPAWNED = e("DESTROYED_BEFORE_SPAWNED", "Attempted to destroy object %s before its spawned", "E"), DISPATCHER_ALREADY_SPAWNED = e("DISPATCHER_ALREADY_SPAWNED", "Object %s has already been spawned.", "E"), DISPATCHER_DESTROYED_OBJECT = e("DISPATCHER_DESTROYED_OBJECT", "Object %s cannot be spawned because it has been destroyed.", "E"), DISPATCHER_SPAWN_ERR = e("DISPATCHER_SPAWN_ERR", "An object experienced an error while spawning: %s", "W"), diff --git a/src/lib/Object.lua b/src/lib/Object.lua index ca76dd4..fd65ed7 100644 --- a/src/lib/Object.lua +++ b/src/lib/Object.lua @@ -73,6 +73,10 @@ return function(params: {[string]: any}, service) local service = OBJECT_PRIVATE[self].Service local state = Dispatcher.getObjectState(self) + if not state.Spawned then + ERROR.DESTROYED_BEFORE_SPAWNED(self:GetID(true)) + end + if Dispatcher.getObjectState(self) then Dispatcher.cleanObjectState(self) OBJECT_PRIVATE[self] = nil From a7bfc4d3469f54aa04063487d211ee096d2dce05 Mon Sep 17 00:00:00 2001 From: metatablecat <132796135+metatablecat@users.noreply.github.com> Date: Sun, 21 Jul 2024 15:19:50 +0100 Subject: [PATCH 4/4] Rollback Yeah this breaks too much stuff, rolled back to task.spawn even if its slower --- src/lib/Dispatcher.lua | 21 +++++++++------------ src/lib/Error.lua | 1 + src/lib/Object.lua | 8 ++++++-- src/lib/Service.lua | 2 +- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/lib/Dispatcher.lua b/src/lib/Dispatcher.lua index 6f19293..74422fc 100644 --- a/src/lib/Dispatcher.lua +++ b/src/lib/Dispatcher.lua @@ -52,21 +52,18 @@ local function free(state, ok, err, o, service) local held = state.HeldThreads; state.HeldThreads = {} for _, v in dispatchers do - task.spawn(v, ok, err) + task.defer(v, ok, err) end for _, v in held do - task.spawn(v, ok, err) + task.defer(v, ok, err) end end local function timeoutTracker(o, state): thread? if state.TimeoutDisabled then return end - return task.spawn(function(self) - task.wait(5) - ERROR.DISPATCHER_TIMEOUT(self:GetID(true)) - end, o) + return task.delay(5, ERROR.DISPATCHER_TIMEOUT, o:GetID(true)) end local function serviceStartup(service) @@ -94,7 +91,7 @@ local function serviceStartup(service) serviceState.State = "finished" for _, t in serviceState.HeldThreads do - task.spawn(t) + task.defer(t) end end end @@ -105,7 +102,6 @@ local function runObjectAction( service, state ) - state.Spawned = true state.Thread = coroutine.running() for _, v in state.AwaitFor do @@ -120,7 +116,7 @@ local function runObjectAction( free(state, ok, err) if service.Updating and o.Update then - task.spawn(doServiceLoopForObject, o, service, state) + task.defer(doServiceLoopForObject, o, service, state) end return ok, err @@ -156,7 +152,8 @@ local function spawnObject(object, service, state, asyncMode) object:HandleAsync(asyncMode) end - task.spawn(runObjectAction, object, spawnSignal, service, state) + state.Spawned = true + task.defer(runObjectAction, object, spawnSignal, service, state) if not asyncMode then return object:Await() @@ -172,7 +169,7 @@ function Dispatcher.spawnObject(o, fPrivate, xpcallHandler, asyncHandler) -- basically new logic for Spawn if state.Spawned then - ERROR:DISPATCHER_ALREADY_SPAWNED(o) + ERROR.DISPATCHER_ALREADY_SPAWNED(o:GetID(true)) end if xpcallHandler then @@ -206,7 +203,7 @@ end function Dispatcher.slotHandleAsync(o, asyncHandler) local state = Dispatcher.getObjectState(o) - if not state then task.spawn(asyncHandler, false, "The object was destroyed") end + if not state then task.defer(asyncHandler, false, "The object was destroyed") end if state.ErrMsg then asyncHandler(false, state.ErrMsg) diff --git a/src/lib/Error.lua b/src/lib/Error.lua index fc86636..4ee9a81 100644 --- a/src/lib/Error.lua +++ b/src/lib/Error.lua @@ -77,6 +77,7 @@ local ErrorBuffer = { ANALYSIS_MODE_NOT_AVAILABLE = e("ANALYSIS_MODE_NOT_AVAILABLE", "Analysis mode cannot be used in %s", "E"), + DESTROYED_BEFORE_SPAWNED = e("DESTROYED_BEFORE_SPAWNED", "Attempted to destroy object %s before its spawned", "E"), DISPATCHER_ALREADY_SPAWNED = e("DISPATCHER_ALREADY_SPAWNED", "Object %s has already been spawned.", "E"), DISPATCHER_DESTROYED_OBJECT = e("DISPATCHER_DESTROYED_OBJECT", "Object %s cannot be spawned because it has been destroyed.", "E"), DISPATCHER_SPAWN_ERR = e("DISPATCHER_SPAWN_ERR", "An object experienced an error while spawning: %s", "W"), diff --git a/src/lib/Object.lua b/src/lib/Object.lua index 7daaecd..fd65ed7 100644 --- a/src/lib/Object.lua +++ b/src/lib/Object.lua @@ -73,6 +73,10 @@ return function(params: {[string]: any}, service) local service = OBJECT_PRIVATE[self].Service local state = Dispatcher.getObjectState(self) + if not state.Spawned then + ERROR.DESTROYED_BEFORE_SPAWNED(self:GetID(true)) + end + if Dispatcher.getObjectState(self) then Dispatcher.cleanObjectState(self) OBJECT_PRIVATE[self] = nil @@ -80,8 +84,8 @@ return function(params: {[string]: any}, service) local destroying = self.Destroying local fragRemoved = service.ObjectRemoved - if destroying then task.spawn(destroying, self) end - if fragRemoved then task.spawn(fragRemoved, service, self) end + if destroying then task.defer(destroying, self) end + if fragRemoved then task.defer(fragRemoved, service, self) end Dispatcher.stop(self, state) end diff --git a/src/lib/Service.lua b/src/lib/Service.lua index 12bb305..9948fc2 100644 --- a/src/lib/Service.lua +++ b/src/lib/Service.lua @@ -37,7 +37,7 @@ local function createObjectForService(params, service) if not Common.AnalysisMode then Dispatcher.initObjectState(o) local objAdded = service.ObjectAdded - if objAdded then task.spawn(objAdded, service, o) end + if objAdded then task.defer(objAdded, service, o) end end return o