@rbxts/covenant 1.3.3 → 1.4.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 -1
- package/src/covenant.luau +101 -47
- package/src/helpers.d.ts +2 -2
- package/src/helpers.luau +3 -2
package/package.json
CHANGED
package/src/covenant.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ export declare class Covenant {
|
|
|
19
19
|
private undefinedStringifiedComponents;
|
|
20
20
|
private replicatedStringifiedComponents;
|
|
21
21
|
private predictedStringifiedComponents;
|
|
22
|
+
private internalStringifiedComponents;
|
|
22
23
|
private started;
|
|
23
24
|
private stringifiedComponentSubscribers;
|
|
24
25
|
private stringifiedComponentValidators;
|
|
@@ -29,6 +30,7 @@ export declare class Covenant {
|
|
|
29
30
|
private predictionConnect;
|
|
30
31
|
constructor({ replicationSend, replicationConnect, replicationSendAll, predictionSend, predictionConnect, }: CovenantProps);
|
|
31
32
|
private setupPredictionClient;
|
|
33
|
+
private forEachComponentChanges;
|
|
32
34
|
private setupPredictionServer;
|
|
33
35
|
private setupPrediction;
|
|
34
36
|
private setupReplicationServer;
|
|
@@ -59,7 +61,7 @@ export declare class Covenant {
|
|
|
59
61
|
childIdentityComponent: Entity<T>;
|
|
60
62
|
getIdentifier: (state: T) => Discriminator;
|
|
61
63
|
queriedComponents: Entity[][];
|
|
62
|
-
recipe: (entity: Entity, lastChildrenStates:
|
|
64
|
+
recipe: (entity: Entity, lastChildrenStates: ReadonlySet<T>, updateId: number, hooks: CovenantHooks) => ReadonlySet<T>;
|
|
63
65
|
}): void;
|
|
64
66
|
defineStaticEntity<T extends defined>({ identityComponent, recipe, replicated, }: {
|
|
65
67
|
replicated: boolean;
|
package/src/covenant.luau
CHANGED
|
@@ -13,7 +13,7 @@ local Remove = _stringEnums.Remove
|
|
|
13
13
|
local Delete = _stringEnums.Delete
|
|
14
14
|
local _helpers = TS.import(script, script.Parent, "helpers")
|
|
15
15
|
local compareMaps = _helpers.compareMaps
|
|
16
|
-
local
|
|
16
|
+
local turnSetWithIdentifierToMap = _helpers.turnSetWithIdentifierToMap
|
|
17
17
|
local EventMap = TS.import(script, script.Parent, "dataStructureWithEvents").EventMap
|
|
18
18
|
-- Map<Entity, Delete | Map<Component, state | Remove>>
|
|
19
19
|
-- Map<Component, Map<Entity, state | Remove>>
|
|
@@ -52,6 +52,7 @@ do
|
|
|
52
52
|
self.undefinedStringifiedComponents = {}
|
|
53
53
|
self.replicatedStringifiedComponents = {}
|
|
54
54
|
self.predictedStringifiedComponents = {}
|
|
55
|
+
self.internalStringifiedComponents = {}
|
|
55
56
|
self.started = false
|
|
56
57
|
self.stringifiedComponentSubscribers = {}
|
|
57
58
|
self.stringifiedComponentValidators = {}
|
|
@@ -73,58 +74,81 @@ do
|
|
|
73
74
|
self.predictionSend(currentWorldChanges)
|
|
74
75
|
end, math.huge)
|
|
75
76
|
end
|
|
77
|
+
function Covenant:forEachComponentChanges(player, worldReconciliation, componentChanges, stringifiedComponent)
|
|
78
|
+
local component = tonumber(stringifiedComponent)
|
|
79
|
+
local _stringifiedComponentValidators = self.stringifiedComponentValidators
|
|
80
|
+
local _stringifiedComponent = stringifiedComponent
|
|
81
|
+
local validator = _stringifiedComponentValidators[_stringifiedComponent]
|
|
82
|
+
if not validator then
|
|
83
|
+
return nil
|
|
84
|
+
end
|
|
85
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
86
|
+
local _callback = function(state, stringifiedEntity)
|
|
87
|
+
local entity = tonumber(stringifiedEntity)
|
|
88
|
+
if not self:worldContains(entity) then
|
|
89
|
+
return nil
|
|
90
|
+
end
|
|
91
|
+
local newState = if state == Remove then nil else state
|
|
92
|
+
local lastState = self:worldGet(entity, component)
|
|
93
|
+
local valid = validator(player, entity, newState, lastState)
|
|
94
|
+
if valid then
|
|
95
|
+
self:worldSet(entity, component, newState)
|
|
96
|
+
else
|
|
97
|
+
local _worldReconciliation = worldReconciliation
|
|
98
|
+
local _stringifiedEntity = stringifiedEntity
|
|
99
|
+
local entityReconciliations = _worldReconciliation[_stringifiedEntity]
|
|
100
|
+
local _arg0 = entityReconciliations ~= Delete
|
|
101
|
+
assert(_arg0)
|
|
102
|
+
if entityReconciliations == nil then
|
|
103
|
+
entityReconciliations = {}
|
|
104
|
+
local _worldReconciliation_1 = worldReconciliation
|
|
105
|
+
local _stringifiedEntity_1 = stringifiedEntity
|
|
106
|
+
local _entityReconciliations = entityReconciliations
|
|
107
|
+
_worldReconciliation_1[_stringifiedEntity_1] = _entityReconciliations
|
|
108
|
+
end
|
|
109
|
+
local _entityReconciliations = entityReconciliations
|
|
110
|
+
local _exp = stringifiedComponent
|
|
111
|
+
local _condition = self:worldGet(entity, component)
|
|
112
|
+
if _condition == nil then
|
|
113
|
+
_condition = Remove
|
|
114
|
+
end
|
|
115
|
+
_entityReconciliations[_exp] = _condition
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
for _k, _v in componentChanges do
|
|
119
|
+
_callback(_v, _k, componentChanges)
|
|
120
|
+
end
|
|
121
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
122
|
+
end
|
|
76
123
|
function Covenant:setupPredictionServer()
|
|
77
124
|
self.predictionConnect(function(player, worldChanges)
|
|
78
125
|
local worldReconciliation = {}
|
|
79
126
|
-- ▼ ReadonlyMap.forEach ▼
|
|
80
127
|
local _callback = function(componentChanges, stringifiedComponent)
|
|
81
|
-
local
|
|
82
|
-
local _stringifiedComponentValidators = self.stringifiedComponentValidators
|
|
128
|
+
local _internalStringifiedComponents = self.internalStringifiedComponents
|
|
83
129
|
local _stringifiedComponent = stringifiedComponent
|
|
84
|
-
|
|
85
|
-
if not validator then
|
|
130
|
+
if not (_internalStringifiedComponents[_stringifiedComponent] ~= nil) then
|
|
86
131
|
return nil
|
|
87
132
|
end
|
|
88
|
-
|
|
89
|
-
local _callback_1 = function(state, stringifiedEntity)
|
|
90
|
-
local entity = tonumber(stringifiedEntity)
|
|
91
|
-
if not self:worldContains(entity) then
|
|
92
|
-
return nil
|
|
93
|
-
end
|
|
94
|
-
local newState = if state == Remove then nil else state
|
|
95
|
-
local lastState = self:worldGet(entity, component)
|
|
96
|
-
local valid = validator(player, entity, newState, lastState)
|
|
97
|
-
if valid then
|
|
98
|
-
self:worldSet(entity, component, newState)
|
|
99
|
-
else
|
|
100
|
-
local _stringifiedEntity = stringifiedEntity
|
|
101
|
-
local entityReconciliations = worldReconciliation[_stringifiedEntity]
|
|
102
|
-
local _arg0 = entityReconciliations ~= Delete
|
|
103
|
-
assert(_arg0)
|
|
104
|
-
if entityReconciliations == nil then
|
|
105
|
-
entityReconciliations = {}
|
|
106
|
-
local _stringifiedEntity_1 = stringifiedEntity
|
|
107
|
-
local _entityReconciliations = entityReconciliations
|
|
108
|
-
worldReconciliation[_stringifiedEntity_1] = _entityReconciliations
|
|
109
|
-
end
|
|
110
|
-
local _entityReconciliations = entityReconciliations
|
|
111
|
-
local _exp = stringifiedComponent
|
|
112
|
-
local _condition = self:worldGet(entity, component)
|
|
113
|
-
if _condition == nil then
|
|
114
|
-
_condition = Remove
|
|
115
|
-
end
|
|
116
|
-
_entityReconciliations[_exp] = _condition
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
for _k, _v in componentChanges do
|
|
120
|
-
_callback_1(_v, _k, componentChanges)
|
|
121
|
-
end
|
|
122
|
-
-- ▲ ReadonlyMap.forEach ▲
|
|
133
|
+
self:forEachComponentChanges(player, worldReconciliation, componentChanges, stringifiedComponent)
|
|
123
134
|
end
|
|
124
135
|
for _k, _v in worldChanges do
|
|
125
136
|
_callback(_v, _k, worldChanges)
|
|
126
137
|
end
|
|
127
138
|
-- ▲ ReadonlyMap.forEach ▲
|
|
139
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
140
|
+
local _callback_1 = function(componentChanges, stringifiedComponent)
|
|
141
|
+
local _internalStringifiedComponents = self.internalStringifiedComponents
|
|
142
|
+
local _stringifiedComponent = stringifiedComponent
|
|
143
|
+
if _internalStringifiedComponents[_stringifiedComponent] ~= nil then
|
|
144
|
+
return nil
|
|
145
|
+
end
|
|
146
|
+
self:forEachComponentChanges(player, worldReconciliation, componentChanges, stringifiedComponent)
|
|
147
|
+
end
|
|
148
|
+
for _k, _v in worldChanges do
|
|
149
|
+
_callback_1(_v, _k, worldChanges)
|
|
150
|
+
end
|
|
151
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
128
152
|
if not (next(worldReconciliation) == nil) then
|
|
129
153
|
self.replicationSend(player, worldReconciliation)
|
|
130
154
|
end
|
|
@@ -206,6 +230,11 @@ do
|
|
|
206
230
|
end
|
|
207
231
|
-- ▼ ReadonlyMap.forEach ▼
|
|
208
232
|
local _callback_1 = function(state, stringifiedComponent)
|
|
233
|
+
local _internalStringifiedComponents = self.internalStringifiedComponents
|
|
234
|
+
local _stringifiedComponent = stringifiedComponent
|
|
235
|
+
if not (_internalStringifiedComponents[_stringifiedComponent] ~= nil) then
|
|
236
|
+
return nil
|
|
237
|
+
end
|
|
209
238
|
local component = tonumber(stringifiedComponent)
|
|
210
239
|
if state == Remove then
|
|
211
240
|
self:worldSet(entity, component, nil, true)
|
|
@@ -217,6 +246,24 @@ do
|
|
|
217
246
|
_callback_1(_v, _k, entityData)
|
|
218
247
|
end
|
|
219
248
|
-- ▲ ReadonlyMap.forEach ▲
|
|
249
|
+
-- ▼ ReadonlyMap.forEach ▼
|
|
250
|
+
local _callback_2 = function(state, stringifiedComponent)
|
|
251
|
+
local _internalStringifiedComponents = self.internalStringifiedComponents
|
|
252
|
+
local _stringifiedComponent = stringifiedComponent
|
|
253
|
+
if _internalStringifiedComponents[_stringifiedComponent] ~= nil then
|
|
254
|
+
return nil
|
|
255
|
+
end
|
|
256
|
+
local component = tonumber(stringifiedComponent)
|
|
257
|
+
if state == Remove then
|
|
258
|
+
self:worldSet(entity, component, nil, true)
|
|
259
|
+
else
|
|
260
|
+
self:worldSet(entity, component, state, true)
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
for _k, _v in entityData do
|
|
264
|
+
_callback_2(_v, _k, entityData)
|
|
265
|
+
end
|
|
266
|
+
-- ▲ ReadonlyMap.forEach ▲
|
|
220
267
|
end
|
|
221
268
|
for _k, _v in worldChanges do
|
|
222
269
|
_callback(_v, _k, worldChanges)
|
|
@@ -438,7 +485,11 @@ do
|
|
|
438
485
|
end
|
|
439
486
|
function Covenant:worldInternalComponent()
|
|
440
487
|
self:preventPostStartCall()
|
|
441
|
-
|
|
488
|
+
local c = self._world:component()
|
|
489
|
+
local _internalStringifiedComponents = self.internalStringifiedComponents
|
|
490
|
+
local _arg0 = tostring(c)
|
|
491
|
+
_internalStringifiedComponents[_arg0] = true
|
|
492
|
+
return c
|
|
442
493
|
end
|
|
443
494
|
function Covenant:checkComponentDefined(component)
|
|
444
495
|
local _undefinedStringifiedComponents = self.undefinedStringifiedComponents
|
|
@@ -593,6 +644,7 @@ do
|
|
|
593
644
|
local parentEntityTrackerComponent = self:worldInternalComponent()
|
|
594
645
|
local parentComponent = self:worldInternalComponent()
|
|
595
646
|
self:defineComponentNetworkBehavior(parentComponent, replicated, predictionValidator)
|
|
647
|
+
self:defineComponentNetworkBehavior(parentEntityTrackerComponent, replicated, predictionValidator)
|
|
596
648
|
local queryParentComponent = self:worldQuery(parentComponent):cached()
|
|
597
649
|
local willUpdate = true
|
|
598
650
|
local function indicateUpdate()
|
|
@@ -657,8 +709,8 @@ do
|
|
|
657
709
|
-- ▲ ReadonlyArray.forEach ▲
|
|
658
710
|
local lastUpdateId = 0
|
|
659
711
|
self:subscribeComponent(parentComponent, function(entity, newState, lastState)
|
|
660
|
-
local lastStateMap =
|
|
661
|
-
local newStateMap =
|
|
712
|
+
local lastStateMap = turnSetWithIdentifierToMap(lastState or {}, getIdentifier)
|
|
713
|
+
local newStateMap = turnSetWithIdentifierToMap(newState or {}, getIdentifier)
|
|
662
714
|
local entityTracker = self:worldGet(entity, parentEntityTrackerComponent)
|
|
663
715
|
if entityTracker == nil then
|
|
664
716
|
entityTracker = {}
|
|
@@ -686,9 +738,10 @@ do
|
|
|
686
738
|
local key = _param_1.key
|
|
687
739
|
local value = _param_1.value
|
|
688
740
|
local childEntity = entityTracker[key]
|
|
689
|
-
|
|
690
|
-
local _arg0 = self:worldContains(childEntity)
|
|
741
|
+
local _arg0 = childEntity ~= nil
|
|
691
742
|
assert(_arg0)
|
|
743
|
+
local _arg0_1 = self:worldContains(childEntity)
|
|
744
|
+
assert(_arg0_1)
|
|
692
745
|
self:worldSet(childEntity, childIdentityComponent, value)
|
|
693
746
|
end
|
|
694
747
|
for _k, _v in entriesChanged do
|
|
@@ -700,9 +753,10 @@ do
|
|
|
700
753
|
local _entityTracker = entityTracker
|
|
701
754
|
local _key = key
|
|
702
755
|
local childEntity = _entityTracker[_key]
|
|
703
|
-
|
|
704
|
-
local _arg0 = self:worldContains(childEntity)
|
|
756
|
+
local _arg0 = childEntity ~= nil
|
|
705
757
|
assert(_arg0)
|
|
758
|
+
local _arg0_1 = self:worldContains(childEntity)
|
|
759
|
+
assert(_arg0_1)
|
|
706
760
|
self:worldDelete(childEntity)
|
|
707
761
|
local _entityTracker_1 = entityTracker
|
|
708
762
|
local _key_1 = key
|
package/src/helpers.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Discriminator } from "./hooks";
|
|
2
2
|
|
|
3
|
-
export declare function
|
|
4
|
-
|
|
3
|
+
export declare function turnSetWithIdentifierToMap<T extends defined>(
|
|
4
|
+
set: ReadonlySet<T>,
|
|
5
5
|
getIdentifier: (state: T) => Discriminator,
|
|
6
6
|
): Map<defined, T>;
|
|
7
7
|
export declare function compareMaps<
|
package/src/helpers.luau
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
-- Compiled with roblox-ts v3.0.0
|
|
2
|
-
|
|
2
|
+
-- Manually modified
|
|
3
|
+
local function turnSetWithIdentifierToMap(set, getIdentifier)
|
|
3
4
|
local newMap = {}
|
|
4
5
|
-- ▼ ReadonlyArray.forEach ▼
|
|
5
6
|
local _callback = function(value)
|
|
@@ -7,7 +8,7 @@ local function turnArrayWithIdentifierToMap(array, getIdentifier)
|
|
|
7
8
|
local _value = value
|
|
8
9
|
newMap[identifier] = _value
|
|
9
10
|
end
|
|
10
|
-
for
|
|
11
|
+
for _v, _ in set do
|
|
11
12
|
_callback(_v)
|
|
12
13
|
end
|
|
13
14
|
-- ▲ ReadonlyArray.forEach ▲
|