@rbxts/covenant 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/covenant.d.ts +3 -5
- package/src/covenant.luau +17 -28
- package/src/dataStructureWithEvents.d.ts +27 -0
- package/src/dataStructureWithEvents.luau +207 -0
- package/src/hooks.d.ts +2 -2
- package/src/hooks.luau +28 -28
package/package.json
CHANGED
package/src/covenant.d.ts
CHANGED
|
@@ -42,6 +42,7 @@ export declare class Covenant {
|
|
|
42
42
|
subscribeComponent<T>(component: Entity<T>, subscriber: (entity: Entity, state: T | undefined, previousState: T | undefined) => void): () => void;
|
|
43
43
|
private worldDelete;
|
|
44
44
|
worldComponent<T extends defined>(): Entity<T>;
|
|
45
|
+
worldTag(): Entity<undefined>;
|
|
45
46
|
private worldInternalComponent;
|
|
46
47
|
private checkComponentDefined;
|
|
47
48
|
private defineComponentNetworkBehavior;
|
|
@@ -60,13 +61,10 @@ export declare class Covenant {
|
|
|
60
61
|
queriedComponents: Entity[][];
|
|
61
62
|
recipe: (entity: Entity, lastChildrenStates: ReadonlyArray<T>, updateId: number, hooks: CovenantHooks) => ReadonlyArray<T>;
|
|
62
63
|
}): void;
|
|
63
|
-
|
|
64
|
+
defineStaticEntity<T extends defined>({ identityComponent, recipe, replicated, }: {
|
|
64
65
|
replicated: boolean;
|
|
65
66
|
identityComponent: Entity<T>;
|
|
66
|
-
recipe: (updateId: number, hooks: CovenantHooks) =>
|
|
67
|
-
statesToCreate?: ReadonlyArray<T>;
|
|
68
|
-
entitiesToDelete?: ReadonlyArray<Entity>;
|
|
69
|
-
};
|
|
67
|
+
recipe: (updateId: number, hooks: CovenantHooks) => T[];
|
|
70
68
|
}): void;
|
|
71
69
|
private worldEntity;
|
|
72
70
|
worldQuery<T extends Id[]>(...components: T): import("@rbxts/jecs").Query<import("@rbxts/jecs").InferComponents<T>>;
|
package/src/covenant.luau
CHANGED
|
@@ -428,6 +428,14 @@ do
|
|
|
428
428
|
_undefinedStringifiedComponents[_arg0] = true
|
|
429
429
|
return c
|
|
430
430
|
end
|
|
431
|
+
function Covenant:worldTag()
|
|
432
|
+
self:preventPostStartCall()
|
|
433
|
+
local c = self._world:component()
|
|
434
|
+
local _undefinedStringifiedComponents = self.undefinedStringifiedComponents
|
|
435
|
+
local _arg0 = tostring(c)
|
|
436
|
+
_undefinedStringifiedComponents[_arg0] = true
|
|
437
|
+
return c
|
|
438
|
+
end
|
|
431
439
|
function Covenant:worldInternalComponent()
|
|
432
440
|
self:preventPostStartCall()
|
|
433
441
|
return self._world:component()
|
|
@@ -762,7 +770,7 @@ do
|
|
|
762
770
|
updater()
|
|
763
771
|
end)
|
|
764
772
|
end
|
|
765
|
-
function Covenant:
|
|
773
|
+
function Covenant:defineStaticEntity(_param)
|
|
766
774
|
local identityComponent = _param.identityComponent
|
|
767
775
|
local recipe = _param.recipe
|
|
768
776
|
local replicated = _param.replicated
|
|
@@ -781,35 +789,16 @@ do
|
|
|
781
789
|
local lastUpdateId = 0
|
|
782
790
|
local updater = function()
|
|
783
791
|
lastUpdateId += 1
|
|
784
|
-
local
|
|
785
|
-
|
|
786
|
-
local
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
-- ▼ ReadonlyArray.forEach ▼
|
|
790
|
-
local _callback = function(state)
|
|
791
|
-
local entity = self:worldEntity()
|
|
792
|
-
self:worldSet(entity, identityComponent, state)
|
|
793
|
-
end
|
|
794
|
-
for _k, _v in _result do
|
|
795
|
-
_callback(_v, _k - 1, _result)
|
|
796
|
-
end
|
|
797
|
-
-- ▲ ReadonlyArray.forEach ▲
|
|
792
|
+
local states = recipe(lastUpdateId, hooks)
|
|
793
|
+
-- ▼ ReadonlyArray.forEach ▼
|
|
794
|
+
local _callback = function(state)
|
|
795
|
+
local entity = self:worldEntity()
|
|
796
|
+
self:worldSet(entity, identityComponent, state)
|
|
798
797
|
end
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
-- ▼ ReadonlyArray.forEach ▼
|
|
802
|
-
local _callback = function(entity)
|
|
803
|
-
if not self:worldHas(entity, identityComponent) then
|
|
804
|
-
return nil
|
|
805
|
-
end
|
|
806
|
-
self:worldDelete(entity)
|
|
807
|
-
end
|
|
808
|
-
for _k, _v in _result_1 do
|
|
809
|
-
_callback(_v, _k - 1, _result_1)
|
|
810
|
-
end
|
|
811
|
-
-- ▲ ReadonlyArray.forEach ▲
|
|
798
|
+
for _k, _v in states do
|
|
799
|
+
_callback(_v, _k - 1, states)
|
|
812
800
|
end
|
|
801
|
+
-- ▲ ReadonlyArray.forEach ▲
|
|
813
802
|
end
|
|
814
803
|
self:schedule(RunService.Heartbeat, function()
|
|
815
804
|
if not willUpdate then
|
|
@@ -11,6 +11,20 @@ export declare class EventMap<T extends defined> {
|
|
|
11
11
|
has(key: RBXScriptSignal): boolean;
|
|
12
12
|
get(key: RBXScriptSignal): T | undefined;
|
|
13
13
|
}
|
|
14
|
+
export declare class EventMapWithInstance<T extends defined> {
|
|
15
|
+
private instanceEventMaps;
|
|
16
|
+
constructor();
|
|
17
|
+
set(instance: Instance, key: RBXScriptSignal, value: T): this;
|
|
18
|
+
delete(instance: Instance, key: RBXScriptSignal): boolean;
|
|
19
|
+
clear(): void;
|
|
20
|
+
deletedInstance(instance: Instance): boolean;
|
|
21
|
+
isEmpty(): boolean;
|
|
22
|
+
isInstanceEmpty(instance: Instance): boolean;
|
|
23
|
+
forEach(callbackfn: (value: T, key: RBXScriptSignal) => void): void;
|
|
24
|
+
size(): number;
|
|
25
|
+
has(instance: Instance, key: RBXScriptSignal): boolean;
|
|
26
|
+
get(instance: Instance, key: RBXScriptSignal): T | undefined;
|
|
27
|
+
}
|
|
14
28
|
export declare class EventSet {
|
|
15
29
|
private stringifiedEventToEvent;
|
|
16
30
|
constructor();
|
|
@@ -22,3 +36,16 @@ export declare class EventSet {
|
|
|
22
36
|
size(): number;
|
|
23
37
|
has(value: RBXScriptSignal<Callback>): boolean;
|
|
24
38
|
}
|
|
39
|
+
export declare class EventSetWithInstance {
|
|
40
|
+
private instanceEventSets;
|
|
41
|
+
constructor();
|
|
42
|
+
add(instance: Instance, value: RBXScriptSignal<Callback>): this;
|
|
43
|
+
delete(instance: Instance, value: RBXScriptSignal<Callback>): boolean;
|
|
44
|
+
deleteInstance(instance: Instance): boolean;
|
|
45
|
+
clear(): void;
|
|
46
|
+
isEmpty(): boolean;
|
|
47
|
+
isInstanceEmpty(instance: Instance): boolean;
|
|
48
|
+
forEach(callbackfn: (value: RBXScriptSignal) => void): void;
|
|
49
|
+
size(): number;
|
|
50
|
+
has(instance: Instance, value: RBXScriptSignal<Callback>): boolean;
|
|
51
|
+
}
|
|
@@ -89,6 +89,113 @@ do
|
|
|
89
89
|
return self.stringifiedEventToValue[stringifiedEvent]
|
|
90
90
|
end
|
|
91
91
|
end
|
|
92
|
+
local EventMapWithInstance
|
|
93
|
+
do
|
|
94
|
+
EventMapWithInstance = setmetatable({}, {
|
|
95
|
+
__tostring = function()
|
|
96
|
+
return "EventMapWithInstance"
|
|
97
|
+
end,
|
|
98
|
+
})
|
|
99
|
+
EventMapWithInstance.__index = EventMapWithInstance
|
|
100
|
+
function EventMapWithInstance.new(...)
|
|
101
|
+
local self = setmetatable({}, EventMapWithInstance)
|
|
102
|
+
return self:constructor(...) or self
|
|
103
|
+
end
|
|
104
|
+
function EventMapWithInstance:constructor()
|
|
105
|
+
self.instanceEventMaps = {}
|
|
106
|
+
end
|
|
107
|
+
function EventMapWithInstance:set(instance, key, value)
|
|
108
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
109
|
+
local _instance = instance
|
|
110
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
111
|
+
if eventMap == nil then
|
|
112
|
+
eventMap = EventMap.new()
|
|
113
|
+
local _instanceEventMaps_1 = self.instanceEventMaps
|
|
114
|
+
local _instance_1 = instance
|
|
115
|
+
local _eventMap = eventMap
|
|
116
|
+
_instanceEventMaps_1[_instance_1] = _eventMap
|
|
117
|
+
end
|
|
118
|
+
eventMap:set(key, value)
|
|
119
|
+
return self
|
|
120
|
+
end
|
|
121
|
+
function EventMapWithInstance:delete(instance, key)
|
|
122
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
123
|
+
local _instance = instance
|
|
124
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
125
|
+
if eventMap == nil then
|
|
126
|
+
return false
|
|
127
|
+
end
|
|
128
|
+
return eventMap:delete(key)
|
|
129
|
+
end
|
|
130
|
+
function EventMapWithInstance:clear()
|
|
131
|
+
table.clear(self.instanceEventMaps)
|
|
132
|
+
end
|
|
133
|
+
function EventMapWithInstance:deletedInstance(instance)
|
|
134
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
135
|
+
local _instance = instance
|
|
136
|
+
-- ▼ Map.delete ▼
|
|
137
|
+
local _valueExisted = _instanceEventMaps[_instance] ~= nil
|
|
138
|
+
_instanceEventMaps[_instance] = nil
|
|
139
|
+
-- ▲ Map.delete ▲
|
|
140
|
+
return _valueExisted
|
|
141
|
+
end
|
|
142
|
+
function EventMapWithInstance:isEmpty()
|
|
143
|
+
return next(self.instanceEventMaps) == nil
|
|
144
|
+
end
|
|
145
|
+
function EventMapWithInstance:isInstanceEmpty(instance)
|
|
146
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
147
|
+
local _instance = instance
|
|
148
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
149
|
+
if eventMap == nil then
|
|
150
|
+
return true
|
|
151
|
+
end
|
|
152
|
+
return eventMap:isEmpty()
|
|
153
|
+
end
|
|
154
|
+
function EventMapWithInstance:forEach(callbackfn)
|
|
155
|
+
local _exp = self.instanceEventMaps
|
|
156
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
157
|
+
local _callback = function(eventMap)
|
|
158
|
+
eventMap:forEach(function(value, event)
|
|
159
|
+
callbackfn(value, event)
|
|
160
|
+
end)
|
|
161
|
+
end
|
|
162
|
+
for _k, _v in _exp do
|
|
163
|
+
_callback(_v, _k, _exp)
|
|
164
|
+
end
|
|
165
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
166
|
+
end
|
|
167
|
+
function EventMapWithInstance:size()
|
|
168
|
+
local size = 0
|
|
169
|
+
local _exp = self.instanceEventMaps
|
|
170
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
171
|
+
local _callback = function(eventMap)
|
|
172
|
+
size += eventMap:size()
|
|
173
|
+
end
|
|
174
|
+
for _k, _v in _exp do
|
|
175
|
+
_callback(_v, _k, _exp)
|
|
176
|
+
end
|
|
177
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
178
|
+
return size
|
|
179
|
+
end
|
|
180
|
+
function EventMapWithInstance:has(instance, key)
|
|
181
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
182
|
+
local _instance = instance
|
|
183
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
184
|
+
if eventMap == nil then
|
|
185
|
+
return false
|
|
186
|
+
end
|
|
187
|
+
return eventMap:has(key)
|
|
188
|
+
end
|
|
189
|
+
function EventMapWithInstance:get(instance, key)
|
|
190
|
+
local _instanceEventMaps = self.instanceEventMaps
|
|
191
|
+
local _instance = instance
|
|
192
|
+
local eventMap = _instanceEventMaps[_instance]
|
|
193
|
+
if eventMap == nil then
|
|
194
|
+
return nil
|
|
195
|
+
end
|
|
196
|
+
return eventMap:get(key)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
92
199
|
local EventSet
|
|
93
200
|
do
|
|
94
201
|
EventSet = setmetatable({}, {
|
|
@@ -153,7 +260,107 @@ do
|
|
|
153
260
|
return self.stringifiedEventToEvent[stringifiedEvent] ~= nil
|
|
154
261
|
end
|
|
155
262
|
end
|
|
263
|
+
local EventSetWithInstance
|
|
264
|
+
do
|
|
265
|
+
EventSetWithInstance = setmetatable({}, {
|
|
266
|
+
__tostring = function()
|
|
267
|
+
return "EventSetWithInstance"
|
|
268
|
+
end,
|
|
269
|
+
})
|
|
270
|
+
EventSetWithInstance.__index = EventSetWithInstance
|
|
271
|
+
function EventSetWithInstance.new(...)
|
|
272
|
+
local self = setmetatable({}, EventSetWithInstance)
|
|
273
|
+
return self:constructor(...) or self
|
|
274
|
+
end
|
|
275
|
+
function EventSetWithInstance:constructor()
|
|
276
|
+
self.instanceEventSets = {}
|
|
277
|
+
end
|
|
278
|
+
function EventSetWithInstance:add(instance, value)
|
|
279
|
+
local _instanceEventSets = self.instanceEventSets
|
|
280
|
+
local _instance = instance
|
|
281
|
+
local eventSet = _instanceEventSets[_instance]
|
|
282
|
+
if eventSet == nil then
|
|
283
|
+
eventSet = EventSet.new()
|
|
284
|
+
local _instanceEventSets_1 = self.instanceEventSets
|
|
285
|
+
local _instance_1 = instance
|
|
286
|
+
local _eventSet = eventSet
|
|
287
|
+
_instanceEventSets_1[_instance_1] = _eventSet
|
|
288
|
+
end
|
|
289
|
+
eventSet:add(value)
|
|
290
|
+
return self
|
|
291
|
+
end
|
|
292
|
+
function EventSetWithInstance:delete(instance, value)
|
|
293
|
+
local _instanceEventSets = self.instanceEventSets
|
|
294
|
+
local _instance = instance
|
|
295
|
+
local eventSet = _instanceEventSets[_instance]
|
|
296
|
+
if eventSet == nil then
|
|
297
|
+
return false
|
|
298
|
+
end
|
|
299
|
+
return eventSet:delete(value)
|
|
300
|
+
end
|
|
301
|
+
function EventSetWithInstance:deleteInstance(instance)
|
|
302
|
+
local _instanceEventSets = self.instanceEventSets
|
|
303
|
+
local _instance = instance
|
|
304
|
+
-- ▼ Map.delete ▼
|
|
305
|
+
local _valueExisted = _instanceEventSets[_instance] ~= nil
|
|
306
|
+
_instanceEventSets[_instance] = nil
|
|
307
|
+
-- ▲ Map.delete ▲
|
|
308
|
+
return _valueExisted
|
|
309
|
+
end
|
|
310
|
+
function EventSetWithInstance:clear()
|
|
311
|
+
table.clear(self.instanceEventSets)
|
|
312
|
+
end
|
|
313
|
+
function EventSetWithInstance:isEmpty()
|
|
314
|
+
return next(self.instanceEventSets) == nil
|
|
315
|
+
end
|
|
316
|
+
function EventSetWithInstance:isInstanceEmpty(instance)
|
|
317
|
+
local _instanceEventSets = self.instanceEventSets
|
|
318
|
+
local _instance = instance
|
|
319
|
+
local eventSet = _instanceEventSets[_instance]
|
|
320
|
+
if eventSet == nil then
|
|
321
|
+
return true
|
|
322
|
+
end
|
|
323
|
+
return eventSet:isEmpty()
|
|
324
|
+
end
|
|
325
|
+
function EventSetWithInstance:forEach(callbackfn)
|
|
326
|
+
local _exp = self.instanceEventSets
|
|
327
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
328
|
+
local _callback = function(eventSet)
|
|
329
|
+
eventSet:forEach(function(event)
|
|
330
|
+
callbackfn(event)
|
|
331
|
+
end)
|
|
332
|
+
end
|
|
333
|
+
for _k, _v in _exp do
|
|
334
|
+
_callback(_v, _k, _exp)
|
|
335
|
+
end
|
|
336
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
337
|
+
end
|
|
338
|
+
function EventSetWithInstance:size()
|
|
339
|
+
local size = 0
|
|
340
|
+
local _exp = self.instanceEventSets
|
|
341
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
342
|
+
local _callback = function(eventSet)
|
|
343
|
+
size += eventSet:size()
|
|
344
|
+
end
|
|
345
|
+
for _k, _v in _exp do
|
|
346
|
+
_callback(_v, _k, _exp)
|
|
347
|
+
end
|
|
348
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
349
|
+
return size
|
|
350
|
+
end
|
|
351
|
+
function EventSetWithInstance:has(instance, value)
|
|
352
|
+
local _instanceEventSets = self.instanceEventSets
|
|
353
|
+
local _instance = instance
|
|
354
|
+
local eventSet = _instanceEventSets[_instance]
|
|
355
|
+
if eventSet == nil then
|
|
356
|
+
return false
|
|
357
|
+
end
|
|
358
|
+
return eventSet:has(value)
|
|
359
|
+
end
|
|
360
|
+
end
|
|
156
361
|
return {
|
|
157
362
|
EventMap = EventMap,
|
|
363
|
+
EventMapWithInstance = EventMapWithInstance,
|
|
158
364
|
EventSet = EventSet,
|
|
365
|
+
EventSetWithInstance = EventSetWithInstance,
|
|
159
366
|
}
|
package/src/hooks.d.ts
CHANGED
|
@@ -6,8 +6,8 @@ type AsyncResult<T = unknown> = {
|
|
|
6
6
|
};
|
|
7
7
|
export type Discriminator = Exclude<defined, number>;
|
|
8
8
|
export interface CovenantHooks {
|
|
9
|
-
useEvent: <T extends Array<unknown>>(updateId: number, event: RBXScriptSignal<(...args: T) => void>) => T[];
|
|
10
|
-
useEventImmediately: <T extends Array<unknown>, TReturn extends defined>(updateId: number, event: RBXScriptSignal<(...args: T) => void>, callback: (...args: T) => TReturn) => TReturn[];
|
|
9
|
+
useEvent: <T extends Array<unknown>>(updateId: number, instance: Instance, event: RBXScriptSignal<(...args: T) => void>) => T[];
|
|
10
|
+
useEventImmediately: <T extends Array<unknown>, TReturn extends defined>(updateId: number, instance: Instance, event: RBXScriptSignal<(...args: T) => void>, callback: (...args: T) => TReturn) => TReturn[];
|
|
11
11
|
useComponentChange: <T extends defined>(updateId: number, component: Entity<T>) => {
|
|
12
12
|
entity: Entity;
|
|
13
13
|
state: T | undefined;
|
package/src/hooks.luau
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
1
|
-- Compiled with roblox-ts v3.0.0
|
|
2
2
|
local TS = _G[script]
|
|
3
3
|
local _dataStructureWithEvents = TS.import(script, script.Parent, "dataStructureWithEvents")
|
|
4
|
-
local
|
|
5
|
-
local
|
|
4
|
+
local EventMapWithInstance = _dataStructureWithEvents.EventMapWithInstance
|
|
5
|
+
local EventSetWithInstance = _dataStructureWithEvents.EventSetWithInstance
|
|
6
6
|
-- TODO: make events available for dynamic instances
|
|
7
7
|
local function createUseEvent(_param)
|
|
8
8
|
local indicateUpdate = _param.indicateUpdate
|
|
9
|
-
local queues =
|
|
10
|
-
local watchedEvents =
|
|
11
|
-
local caches =
|
|
9
|
+
local queues = EventMapWithInstance.new()
|
|
10
|
+
local watchedEvents = EventSetWithInstance.new()
|
|
11
|
+
local caches = EventMapWithInstance.new()
|
|
12
12
|
local lastUpdateId = -1
|
|
13
|
-
return function(updateId, event)
|
|
13
|
+
return function(updateId, instance, event)
|
|
14
14
|
if lastUpdateId ~= updateId then
|
|
15
15
|
caches:clear()
|
|
16
16
|
lastUpdateId = updateId
|
|
17
17
|
end
|
|
18
|
-
local cache = caches:get(event)
|
|
18
|
+
local cache = caches:get(instance, event)
|
|
19
19
|
if cache ~= nil then
|
|
20
20
|
return cache
|
|
21
21
|
end
|
|
22
|
-
if not watchedEvents:has(event) then
|
|
23
|
-
watchedEvents:add(event)
|
|
24
|
-
queues:set(event, {})
|
|
22
|
+
if not watchedEvents:has(instance, event) then
|
|
23
|
+
watchedEvents:add(instance, event)
|
|
24
|
+
queues:set(instance, event, {})
|
|
25
25
|
event:Connect(function(...)
|
|
26
26
|
local args = { ... }
|
|
27
|
-
local _exp = queues:get(event)
|
|
27
|
+
local _exp = queues:get(instance, event)
|
|
28
28
|
local _args = args
|
|
29
29
|
table.insert(_exp, _args)
|
|
30
30
|
indicateUpdate()
|
|
31
31
|
end)
|
|
32
|
-
caches:set(event, {})
|
|
32
|
+
caches:set(instance, event, {})
|
|
33
33
|
return {}
|
|
34
34
|
end
|
|
35
|
-
local queue = queues:get(event)
|
|
35
|
+
local queue = queues:get(instance, event)
|
|
36
36
|
if not (#queue == 0) then
|
|
37
|
-
queues:set(event, {})
|
|
37
|
+
queues:set(instance, event, {})
|
|
38
38
|
end
|
|
39
|
-
caches:set(event, queue)
|
|
39
|
+
caches:set(instance, event, queue)
|
|
40
40
|
return queue
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
local function createUseEventImmediately(_param)
|
|
44
44
|
local indicateUpdate = _param.indicateUpdate
|
|
45
|
-
local queues =
|
|
46
|
-
local watchedEvents =
|
|
47
|
-
local caches =
|
|
45
|
+
local queues = EventMapWithInstance.new()
|
|
46
|
+
local watchedEvents = EventSetWithInstance.new()
|
|
47
|
+
local caches = EventMapWithInstance.new()
|
|
48
48
|
local lastUpdateId = -1
|
|
49
|
-
return function(updateId, event, callback)
|
|
49
|
+
return function(updateId, instance, event, callback)
|
|
50
50
|
if lastUpdateId ~= updateId then
|
|
51
51
|
caches:clear()
|
|
52
52
|
lastUpdateId = updateId
|
|
53
53
|
end
|
|
54
|
-
local cache = caches:get(event)
|
|
54
|
+
local cache = caches:get(instance, event)
|
|
55
55
|
if cache ~= nil then
|
|
56
56
|
return cache
|
|
57
57
|
end
|
|
58
|
-
if not watchedEvents:has(event) then
|
|
59
|
-
watchedEvents:add(event)
|
|
60
|
-
queues:set(event, {})
|
|
58
|
+
if not watchedEvents:has(instance, event) then
|
|
59
|
+
watchedEvents:add(instance, event)
|
|
60
|
+
queues:set(instance, event, {})
|
|
61
61
|
event:Connect(function(...)
|
|
62
62
|
local args = { ... }
|
|
63
|
-
local _exp = queues:get(event)
|
|
63
|
+
local _exp = queues:get(instance, event)
|
|
64
64
|
local _arg0 = callback(unpack(args))
|
|
65
65
|
table.insert(_exp, _arg0)
|
|
66
66
|
indicateUpdate()
|
|
67
67
|
end)
|
|
68
|
-
caches:set(event, {})
|
|
68
|
+
caches:set(instance, event, {})
|
|
69
69
|
return {}
|
|
70
70
|
end
|
|
71
|
-
local queue = queues:get(event)
|
|
71
|
+
local queue = queues:get(instance, event)
|
|
72
72
|
if not (#queue == 0) then
|
|
73
|
-
queues:set(event, {})
|
|
73
|
+
queues:set(instance, event, {})
|
|
74
74
|
end
|
|
75
|
-
caches:set(event, queue)
|
|
75
|
+
caches:set(instance, event, queue)
|
|
76
76
|
return queue
|
|
77
77
|
end
|
|
78
78
|
end
|