roblox-opencode 1.0.0 → 1.0.2
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/README.md +112 -122
- package/commands/setup-game.md +108 -108
- package/commands/sync-check.md +53 -53
- package/core/roblox-core.md +93 -93
- package/dist/server.js +189 -167
- package/package.json +35 -35
- package/skills/roblox-analytics/SKILL.md +277 -277
- package/skills/roblox-analytics/references/event-batcher.luau +75 -75
- package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
- package/skills/roblox-architecture/SKILL.md +877 -863
- package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
- package/skills/roblox-code-review/SKILL.md +686 -686
- package/skills/roblox-data/SKILL.md +889 -889
- package/skills/roblox-data/references/inventory-systems.md +1729 -1729
- package/skills/roblox-debug/SKILL.md +98 -98
- package/skills/roblox-gui/SKILL.md +1103 -1103
- package/skills/roblox-gui-fusion/SKILL.md +150 -150
- package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
- package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
- package/skills/roblox-gui-fusion/references/shop.luau +411 -411
- package/skills/roblox-luau-mastery/SKILL.md +1618 -1519
- package/skills/roblox-monetization/SKILL.md +1084 -1084
- package/skills/roblox-monetization/references/process-receipt.luau +131 -131
- package/skills/roblox-networking/SKILL.md +669 -669
- package/skills/roblox-networking/references/remote-validator.luau +193 -193
- package/skills/roblox-publish-checklist/SKILL.md +127 -127
- package/skills/roblox-runtime/SKILL.md +753 -753
- package/skills/roblox-sharp-edges/SKILL.md +294 -294
- package/skills/roblox-sync/SKILL.md +126 -126
- package/skills/roblox-testing/SKILL.md +943 -943
- package/skills/roblox-tooling/SKILL.md +149 -149
- package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
- package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
- package/vendor/LICENSES/promise-LICENSE +20 -20
- package/vendor/LICENSES/t-LICENSE +21 -21
- package/vendor/LICENSES/testez-LICENSE +200 -200
- package/vendor/README.md +83 -83
- package/vendor/fusion/Animation/ExternalTime.luau +83 -83
- package/vendor/fusion/Animation/Spring.luau +321 -321
- package/vendor/fusion/Animation/Stopwatch.luau +127 -127
- package/vendor/fusion/Animation/Tween.luau +187 -187
- package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
- package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
- package/vendor/fusion/Animation/lerpType.luau +163 -163
- package/vendor/fusion/Animation/packType.luau +99 -99
- package/vendor/fusion/Animation/springCoefficients.luau +80 -80
- package/vendor/fusion/Animation/unpackType.luau +102 -102
- package/vendor/fusion/Colour/Oklab.luau +70 -70
- package/vendor/fusion/Colour/sRGB.luau +54 -54
- package/vendor/fusion/External.luau +167 -167
- package/vendor/fusion/ExternalDebug.luau +69 -69
- package/vendor/fusion/Graph/Observer.luau +113 -113
- package/vendor/fusion/Graph/castToGraph.luau +28 -28
- package/vendor/fusion/Graph/change.luau +80 -80
- package/vendor/fusion/Graph/depend.luau +32 -32
- package/vendor/fusion/Graph/evaluate.luau +55 -55
- package/vendor/fusion/Instances/Attribute.luau +57 -57
- package/vendor/fusion/Instances/AttributeChange.luau +46 -46
- package/vendor/fusion/Instances/AttributeOut.luau +63 -63
- package/vendor/fusion/Instances/Child.luau +21 -21
- package/vendor/fusion/Instances/Children.luau +147 -147
- package/vendor/fusion/Instances/Hydrate.luau +32 -32
- package/vendor/fusion/Instances/New.luau +52 -52
- package/vendor/fusion/Instances/OnChange.luau +49 -49
- package/vendor/fusion/Instances/OnEvent.luau +53 -53
- package/vendor/fusion/Instances/Out.luau +69 -69
- package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
- package/vendor/fusion/Instances/defaultProps.luau +194 -194
- package/vendor/fusion/LICENSE +21 -21
- package/vendor/fusion/Logging/formatError.luau +48 -48
- package/vendor/fusion/Logging/messages.luau +51 -51
- package/vendor/fusion/Logging/parseError.luau +24 -24
- package/vendor/fusion/Memory/checkLifetime.luau +133 -133
- package/vendor/fusion/Memory/deriveScope.luau +23 -23
- package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
- package/vendor/fusion/Memory/doCleanup.luau +78 -78
- package/vendor/fusion/Memory/innerScope.luau +33 -33
- package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
- package/vendor/fusion/Memory/needsDestruction.luau +16 -16
- package/vendor/fusion/Memory/poisonScope.luau +33 -33
- package/vendor/fusion/Memory/scopePool.luau +54 -54
- package/vendor/fusion/Memory/scoped.luau +26 -26
- package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
- package/vendor/fusion/RobloxExternal.luau +97 -97
- package/vendor/fusion/State/Computed.luau +138 -138
- package/vendor/fusion/State/For/Disassembly.luau +210 -210
- package/vendor/fusion/State/For/ForTypes.luau +30 -30
- package/vendor/fusion/State/For/init.luau +109 -109
- package/vendor/fusion/State/ForKeys.luau +93 -93
- package/vendor/fusion/State/ForPairs.luau +96 -96
- package/vendor/fusion/State/ForValues.luau +93 -93
- package/vendor/fusion/State/Value.luau +87 -87
- package/vendor/fusion/State/castToState.luau +25 -25
- package/vendor/fusion/State/peek.luau +30 -30
- package/vendor/fusion/Types.luau +314 -314
- package/vendor/fusion/Utility/Contextual.luau +90 -90
- package/vendor/fusion/Utility/Safe.luau +22 -22
- package/vendor/fusion/Utility/isSimilar.luau +29 -29
- package/vendor/fusion/Utility/merge.luau +35 -35
- package/vendor/fusion/Utility/nameOf.luau +34 -34
- package/vendor/fusion/Utility/never.luau +13 -13
- package/vendor/fusion/Utility/nicknames.luau +10 -10
- package/vendor/fusion/Utility/xtypeof.luau +26 -26
- package/vendor/fusion/init.luau +82 -82
- package/vendor/profilestore/init.luau +2242 -2242
- package/vendor/promise/init.luau +1982 -1982
- package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
- package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
- package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
- package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
- package/vendor/rbxutil/buffer-util/Types.luau +60 -60
- package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
- package/vendor/rbxutil/buffer-util/init.luau +41 -41
- package/vendor/rbxutil/buffer-util/package.json +16 -16
- package/vendor/rbxutil/buffer-util/wally.toml +9 -9
- package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
- package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
- package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
- package/vendor/rbxutil/comm/Client/init.luau +135 -135
- package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
- package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
- package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
- package/vendor/rbxutil/comm/Server/init.luau +140 -140
- package/vendor/rbxutil/comm/Types.luau +18 -18
- package/vendor/rbxutil/comm/Util.luau +27 -27
- package/vendor/rbxutil/comm/init.luau +35 -35
- package/vendor/rbxutil/comm/wally.toml +13 -13
- package/vendor/rbxutil/component/init.luau +759 -759
- package/vendor/rbxutil/component/init.test.luau +311 -311
- package/vendor/rbxutil/component/wally.toml +14 -14
- package/vendor/rbxutil/concur/init.luau +542 -542
- package/vendor/rbxutil/concur/init.test.luau +364 -364
- package/vendor/rbxutil/concur/wally.toml +8 -8
- package/vendor/rbxutil/enum-list/init.luau +101 -101
- package/vendor/rbxutil/enum-list/init.test.luau +91 -91
- package/vendor/rbxutil/enum-list/wally.toml +8 -8
- package/vendor/rbxutil/find/index.d.ts +20 -20
- package/vendor/rbxutil/find/init.luau +44 -44
- package/vendor/rbxutil/find/package.json +17 -17
- package/vendor/rbxutil/find/wally.toml +8 -8
- package/vendor/rbxutil/input/Gamepad.luau +559 -559
- package/vendor/rbxutil/input/Keyboard.luau +124 -124
- package/vendor/rbxutil/input/Mouse.luau +278 -278
- package/vendor/rbxutil/input/PreferredInput.luau +91 -91
- package/vendor/rbxutil/input/Touch.luau +120 -120
- package/vendor/rbxutil/input/init.luau +33 -33
- package/vendor/rbxutil/input/wally.toml +12 -12
- package/vendor/rbxutil/loader/index.d.ts +15 -15
- package/vendor/rbxutil/loader/init.luau +137 -137
- package/vendor/rbxutil/loader/wally.toml +8 -8
- package/vendor/rbxutil/log/index.d.ts +38 -38
- package/vendor/rbxutil/log/init.luau +746 -746
- package/vendor/rbxutil/log/wally.toml +8 -8
- package/vendor/rbxutil/net/init.luau +190 -190
- package/vendor/rbxutil/net/wally.toml +8 -8
- package/vendor/rbxutil/option/index.d.ts +44 -44
- package/vendor/rbxutil/option/init.luau +489 -489
- package/vendor/rbxutil/option/init.test.luau +342 -342
- package/vendor/rbxutil/option/wally.toml +8 -8
- package/vendor/rbxutil/pid/index.d.ts +53 -53
- package/vendor/rbxutil/pid/init.luau +195 -195
- package/vendor/rbxutil/pid/package.json +16 -16
- package/vendor/rbxutil/pid/wally.toml +9 -9
- package/vendor/rbxutil/quaternion/index.d.ts +117 -117
- package/vendor/rbxutil/quaternion/init.luau +570 -570
- package/vendor/rbxutil/quaternion/package.json +16 -16
- package/vendor/rbxutil/quaternion/wally.toml +9 -9
- package/vendor/rbxutil/query/index.d.ts +43 -43
- package/vendor/rbxutil/query/init.luau +117 -117
- package/vendor/rbxutil/query/package.json +18 -18
- package/vendor/rbxutil/query/wally.toml +9 -9
- package/vendor/rbxutil/sequent/index.d.ts +28 -28
- package/vendor/rbxutil/sequent/init.luau +340 -340
- package/vendor/rbxutil/sequent/package.json +16 -16
- package/vendor/rbxutil/sequent/wally.toml +9 -9
- package/vendor/rbxutil/ser/init.luau +175 -175
- package/vendor/rbxutil/ser/init.test.luau +50 -50
- package/vendor/rbxutil/ser/wally.toml +11 -11
- package/vendor/rbxutil/shake/index.d.ts +36 -36
- package/vendor/rbxutil/shake/init.luau +532 -532
- package/vendor/rbxutil/shake/init.test.luau +267 -267
- package/vendor/rbxutil/shake/package.json +16 -16
- package/vendor/rbxutil/shake/wally.toml +9 -9
- package/vendor/rbxutil/signal/index.d.ts +100 -100
- package/vendor/rbxutil/signal/init.luau +432 -432
- package/vendor/rbxutil/signal/init.test.luau +190 -190
- package/vendor/rbxutil/signal/package.json +17 -17
- package/vendor/rbxutil/signal/wally.toml +9 -9
- package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
- package/vendor/rbxutil/silo/Util.luau +55 -55
- package/vendor/rbxutil/silo/init.luau +338 -338
- package/vendor/rbxutil/silo/init.test.luau +215 -215
- package/vendor/rbxutil/silo/wally.toml +8 -8
- package/vendor/rbxutil/spring/index.d.ts +40 -40
- package/vendor/rbxutil/spring/init.luau +97 -97
- package/vendor/rbxutil/spring/package.json +17 -17
- package/vendor/rbxutil/spring/wally.toml +8 -8
- package/vendor/rbxutil/stream/index.d.ts +88 -88
- package/vendor/rbxutil/stream/init.luau +597 -597
- package/vendor/rbxutil/stream/package.json +18 -18
- package/vendor/rbxutil/stream/wally.toml +9 -9
- package/vendor/rbxutil/streamable/Streamable.luau +202 -202
- package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
- package/vendor/rbxutil/streamable/init.luau +8 -8
- package/vendor/rbxutil/streamable/wally.toml +12 -12
- package/vendor/rbxutil/symbol/init.luau +56 -56
- package/vendor/rbxutil/symbol/init.test.luau +37 -37
- package/vendor/rbxutil/symbol/wally.toml +8 -8
- package/vendor/rbxutil/table-util/init.luau +938 -938
- package/vendor/rbxutil/table-util/init.test.luau +439 -439
- package/vendor/rbxutil/task-queue/index.d.ts +27 -27
- package/vendor/rbxutil/task-queue/init.luau +97 -97
- package/vendor/rbxutil/task-queue/wally.toml +8 -8
- package/vendor/rbxutil/timer/index.d.ts +81 -81
- package/vendor/rbxutil/timer/init.luau +249 -249
- package/vendor/rbxutil/timer/init.test.luau +73 -73
- package/vendor/rbxutil/timer/wally.toml +11 -11
- package/vendor/rbxutil/tree/index.d.ts +15 -15
- package/vendor/rbxutil/tree/init.luau +137 -137
- package/vendor/rbxutil/tree/wally.toml +8 -8
- package/vendor/rbxutil/trove/index.d.ts +46 -46
- package/vendor/rbxutil/trove/init.luau +787 -787
- package/vendor/rbxutil/trove/init.test.luau +203 -203
- package/vendor/rbxutil/trove/wally.toml +8 -8
- package/vendor/rbxutil/typed-remote/init.luau +196 -196
- package/vendor/rbxutil/typed-remote/wally.toml +8 -8
- package/vendor/rbxutil/wait-for/index.d.ts +17 -17
- package/vendor/rbxutil/wait-for/init.luau +257 -257
- package/vendor/rbxutil/wait-for/init.test.luau +182 -182
- package/vendor/rbxutil/wait-for/wally.toml +11 -11
- package/vendor/t/t.lua +1350 -1350
- package/vendor/testez/Context.lua +26 -26
- package/vendor/testez/Expectation.lua +311 -311
- package/vendor/testez/ExpectationContext.lua +38 -38
- package/vendor/testez/LifecycleHooks.lua +89 -89
- package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
- package/vendor/testez/Reporters/TextReporter.lua +105 -105
- package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
- package/vendor/testez/TestBootstrap.lua +146 -146
- package/vendor/testez/TestEnum.lua +27 -27
- package/vendor/testez/TestPlan.lua +304 -304
- package/vendor/testez/TestPlanner.lua +39 -39
- package/vendor/testez/TestResults.lua +111 -111
- package/vendor/testez/TestRunner.lua +188 -188
- package/vendor/testez/TestSession.lua +243 -243
- package/vendor/testez/init.lua +39 -39
|
@@ -1,156 +1,156 @@
|
|
|
1
|
-
-- ClientRemoteProperty
|
|
2
|
-
-- Stephen Leitnick
|
|
3
|
-
-- December 20, 2021
|
|
4
|
-
|
|
5
|
-
local Promise = require(script.Parent.Parent.Parent.Promise)
|
|
6
|
-
local Signal = require(script.Parent.Parent.Parent.Signal)
|
|
7
|
-
local ClientRemoteSignal = require(script.Parent.ClientRemoteSignal)
|
|
8
|
-
local Types = require(script.Parent.Parent.Types)
|
|
9
|
-
|
|
10
|
-
--[=[
|
|
11
|
-
@within ClientRemoteProperty
|
|
12
|
-
@prop Changed Signal<any>
|
|
13
|
-
|
|
14
|
-
Fires when the property receives an updated value
|
|
15
|
-
from the server.
|
|
16
|
-
|
|
17
|
-
```lua
|
|
18
|
-
clientRemoteProperty.Changed:Connect(function(value)
|
|
19
|
-
print("New value", value)
|
|
20
|
-
end)
|
|
21
|
-
```
|
|
22
|
-
]=]
|
|
23
|
-
|
|
24
|
-
--[=[
|
|
25
|
-
@class ClientRemoteProperty
|
|
26
|
-
@client
|
|
27
|
-
Created via `ClientComm:GetProperty()`.
|
|
28
|
-
]=]
|
|
29
|
-
local ClientRemoteProperty = {}
|
|
30
|
-
ClientRemoteProperty.__index = ClientRemoteProperty
|
|
31
|
-
|
|
32
|
-
function ClientRemoteProperty.new(
|
|
33
|
-
re: RemoteEvent,
|
|
34
|
-
inboundMiddleware: Types.ClientMiddleware?,
|
|
35
|
-
outboudMiddleware: Types.ClientMiddleware?
|
|
36
|
-
)
|
|
37
|
-
local self = setmetatable({}, ClientRemoteProperty)
|
|
38
|
-
self._rs = ClientRemoteSignal.new(re, inboundMiddleware, outboudMiddleware)
|
|
39
|
-
self._ready = false
|
|
40
|
-
self._value = nil
|
|
41
|
-
self.Changed = Signal.new()
|
|
42
|
-
self._rs:Fire()
|
|
43
|
-
|
|
44
|
-
local resolveOnReadyPromise
|
|
45
|
-
self._readyPromise = Promise.new(function(resolve)
|
|
46
|
-
resolveOnReadyPromise = resolve
|
|
47
|
-
end)
|
|
48
|
-
self._changed = self._rs:Connect(function(value)
|
|
49
|
-
local changed = value ~= self._value
|
|
50
|
-
self._value = value
|
|
51
|
-
if not self._ready then
|
|
52
|
-
self._ready = true
|
|
53
|
-
resolveOnReadyPromise(value)
|
|
54
|
-
end
|
|
55
|
-
if changed then
|
|
56
|
-
self.Changed:Fire(value)
|
|
57
|
-
end
|
|
58
|
-
end)
|
|
59
|
-
|
|
60
|
-
return self
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
--[=[
|
|
64
|
-
Gets the value of the property object.
|
|
65
|
-
|
|
66
|
-
:::caution
|
|
67
|
-
This value might not be ready right away. Use `OnReady()` or `IsReady()`
|
|
68
|
-
before calling `Get()`. If not ready, this value will return `nil`.
|
|
69
|
-
:::
|
|
70
|
-
]=]
|
|
71
|
-
function ClientRemoteProperty:Get(): any
|
|
72
|
-
return self._value
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
--[=[
|
|
76
|
-
@return Promise<any>
|
|
77
|
-
Returns a Promise which resolves once the property object is
|
|
78
|
-
ready to be used. The resolved promise will also contain the
|
|
79
|
-
value of the property.
|
|
80
|
-
|
|
81
|
-
```lua
|
|
82
|
-
-- Use andThen clause:
|
|
83
|
-
clientRemoteProperty:OnReady():andThen(function(initialValue)
|
|
84
|
-
print(initialValue)
|
|
85
|
-
end)
|
|
86
|
-
|
|
87
|
-
-- Use await:
|
|
88
|
-
local success, initialValue = clientRemoteProperty:OnReady():await()
|
|
89
|
-
if success then
|
|
90
|
-
print(initialValue)
|
|
91
|
-
end
|
|
92
|
-
```
|
|
93
|
-
]=]
|
|
94
|
-
function ClientRemoteProperty:OnReady()
|
|
95
|
-
return self._readyPromise
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
--[=[
|
|
99
|
-
Returns `true` if the property object is ready to be
|
|
100
|
-
used. In other words, it has successfully gained
|
|
101
|
-
connection to the server-side version and has synced
|
|
102
|
-
in the initial value.
|
|
103
|
-
|
|
104
|
-
```lua
|
|
105
|
-
if clientRemoteProperty:IsReady() then
|
|
106
|
-
local value = clientRemoteProperty:Get()
|
|
107
|
-
end
|
|
108
|
-
```
|
|
109
|
-
]=]
|
|
110
|
-
function ClientRemoteProperty:IsReady(): boolean
|
|
111
|
-
return self._ready
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
--[=[
|
|
115
|
-
@param observer (any) -> nil
|
|
116
|
-
@return Connection
|
|
117
|
-
Observes the value of the property. The observer will
|
|
118
|
-
be called right when the value is first ready, and
|
|
119
|
-
every time the value changes. This is safe to call
|
|
120
|
-
immediately (i.e. no need to use `IsReady` or `OnReady`
|
|
121
|
-
before using this method).
|
|
122
|
-
|
|
123
|
-
Observing is essentially listening to `Changed`, but
|
|
124
|
-
also sends the initial value right away (or at least
|
|
125
|
-
once `OnReady` is completed).
|
|
126
|
-
|
|
127
|
-
```lua
|
|
128
|
-
local function ObserveValue(value)
|
|
129
|
-
print(value)
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
clientRemoteProperty:Observe(ObserveValue)
|
|
133
|
-
```
|
|
134
|
-
]=]
|
|
135
|
-
function ClientRemoteProperty:Observe(observer: (any) -> ())
|
|
136
|
-
if self._ready then
|
|
137
|
-
task.defer(observer, self._value)
|
|
138
|
-
end
|
|
139
|
-
return self.Changed:Connect(observer)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
--[=[
|
|
143
|
-
Destroys the ClientRemoteProperty object.
|
|
144
|
-
]=]
|
|
145
|
-
function ClientRemoteProperty:Destroy()
|
|
146
|
-
self._rs:Destroy()
|
|
147
|
-
if self._readyPromise then
|
|
148
|
-
self._readyPromise:cancel()
|
|
149
|
-
end
|
|
150
|
-
if self._changed then
|
|
151
|
-
self._changed:Disconnect()
|
|
152
|
-
end
|
|
153
|
-
self.Changed:Destroy()
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
return ClientRemoteProperty
|
|
1
|
+
-- ClientRemoteProperty
|
|
2
|
+
-- Stephen Leitnick
|
|
3
|
+
-- December 20, 2021
|
|
4
|
+
|
|
5
|
+
local Promise = require(script.Parent.Parent.Parent.Promise)
|
|
6
|
+
local Signal = require(script.Parent.Parent.Parent.Signal)
|
|
7
|
+
local ClientRemoteSignal = require(script.Parent.ClientRemoteSignal)
|
|
8
|
+
local Types = require(script.Parent.Parent.Types)
|
|
9
|
+
|
|
10
|
+
--[=[
|
|
11
|
+
@within ClientRemoteProperty
|
|
12
|
+
@prop Changed Signal<any>
|
|
13
|
+
|
|
14
|
+
Fires when the property receives an updated value
|
|
15
|
+
from the server.
|
|
16
|
+
|
|
17
|
+
```lua
|
|
18
|
+
clientRemoteProperty.Changed:Connect(function(value)
|
|
19
|
+
print("New value", value)
|
|
20
|
+
end)
|
|
21
|
+
```
|
|
22
|
+
]=]
|
|
23
|
+
|
|
24
|
+
--[=[
|
|
25
|
+
@class ClientRemoteProperty
|
|
26
|
+
@client
|
|
27
|
+
Created via `ClientComm:GetProperty()`.
|
|
28
|
+
]=]
|
|
29
|
+
local ClientRemoteProperty = {}
|
|
30
|
+
ClientRemoteProperty.__index = ClientRemoteProperty
|
|
31
|
+
|
|
32
|
+
function ClientRemoteProperty.new(
|
|
33
|
+
re: RemoteEvent,
|
|
34
|
+
inboundMiddleware: Types.ClientMiddleware?,
|
|
35
|
+
outboudMiddleware: Types.ClientMiddleware?
|
|
36
|
+
)
|
|
37
|
+
local self = setmetatable({}, ClientRemoteProperty)
|
|
38
|
+
self._rs = ClientRemoteSignal.new(re, inboundMiddleware, outboudMiddleware)
|
|
39
|
+
self._ready = false
|
|
40
|
+
self._value = nil
|
|
41
|
+
self.Changed = Signal.new()
|
|
42
|
+
self._rs:Fire()
|
|
43
|
+
|
|
44
|
+
local resolveOnReadyPromise
|
|
45
|
+
self._readyPromise = Promise.new(function(resolve)
|
|
46
|
+
resolveOnReadyPromise = resolve
|
|
47
|
+
end)
|
|
48
|
+
self._changed = self._rs:Connect(function(value)
|
|
49
|
+
local changed = value ~= self._value
|
|
50
|
+
self._value = value
|
|
51
|
+
if not self._ready then
|
|
52
|
+
self._ready = true
|
|
53
|
+
resolveOnReadyPromise(value)
|
|
54
|
+
end
|
|
55
|
+
if changed then
|
|
56
|
+
self.Changed:Fire(value)
|
|
57
|
+
end
|
|
58
|
+
end)
|
|
59
|
+
|
|
60
|
+
return self
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
--[=[
|
|
64
|
+
Gets the value of the property object.
|
|
65
|
+
|
|
66
|
+
:::caution
|
|
67
|
+
This value might not be ready right away. Use `OnReady()` or `IsReady()`
|
|
68
|
+
before calling `Get()`. If not ready, this value will return `nil`.
|
|
69
|
+
:::
|
|
70
|
+
]=]
|
|
71
|
+
function ClientRemoteProperty:Get(): any
|
|
72
|
+
return self._value
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
--[=[
|
|
76
|
+
@return Promise<any>
|
|
77
|
+
Returns a Promise which resolves once the property object is
|
|
78
|
+
ready to be used. The resolved promise will also contain the
|
|
79
|
+
value of the property.
|
|
80
|
+
|
|
81
|
+
```lua
|
|
82
|
+
-- Use andThen clause:
|
|
83
|
+
clientRemoteProperty:OnReady():andThen(function(initialValue)
|
|
84
|
+
print(initialValue)
|
|
85
|
+
end)
|
|
86
|
+
|
|
87
|
+
-- Use await:
|
|
88
|
+
local success, initialValue = clientRemoteProperty:OnReady():await()
|
|
89
|
+
if success then
|
|
90
|
+
print(initialValue)
|
|
91
|
+
end
|
|
92
|
+
```
|
|
93
|
+
]=]
|
|
94
|
+
function ClientRemoteProperty:OnReady()
|
|
95
|
+
return self._readyPromise
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
--[=[
|
|
99
|
+
Returns `true` if the property object is ready to be
|
|
100
|
+
used. In other words, it has successfully gained
|
|
101
|
+
connection to the server-side version and has synced
|
|
102
|
+
in the initial value.
|
|
103
|
+
|
|
104
|
+
```lua
|
|
105
|
+
if clientRemoteProperty:IsReady() then
|
|
106
|
+
local value = clientRemoteProperty:Get()
|
|
107
|
+
end
|
|
108
|
+
```
|
|
109
|
+
]=]
|
|
110
|
+
function ClientRemoteProperty:IsReady(): boolean
|
|
111
|
+
return self._ready
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
--[=[
|
|
115
|
+
@param observer (any) -> nil
|
|
116
|
+
@return Connection
|
|
117
|
+
Observes the value of the property. The observer will
|
|
118
|
+
be called right when the value is first ready, and
|
|
119
|
+
every time the value changes. This is safe to call
|
|
120
|
+
immediately (i.e. no need to use `IsReady` or `OnReady`
|
|
121
|
+
before using this method).
|
|
122
|
+
|
|
123
|
+
Observing is essentially listening to `Changed`, but
|
|
124
|
+
also sends the initial value right away (or at least
|
|
125
|
+
once `OnReady` is completed).
|
|
126
|
+
|
|
127
|
+
```lua
|
|
128
|
+
local function ObserveValue(value)
|
|
129
|
+
print(value)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
clientRemoteProperty:Observe(ObserveValue)
|
|
133
|
+
```
|
|
134
|
+
]=]
|
|
135
|
+
function ClientRemoteProperty:Observe(observer: (any) -> ())
|
|
136
|
+
if self._ready then
|
|
137
|
+
task.defer(observer, self._value)
|
|
138
|
+
end
|
|
139
|
+
return self.Changed:Connect(observer)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
--[=[
|
|
143
|
+
Destroys the ClientRemoteProperty object.
|
|
144
|
+
]=]
|
|
145
|
+
function ClientRemoteProperty:Destroy()
|
|
146
|
+
self._rs:Destroy()
|
|
147
|
+
if self._readyPromise then
|
|
148
|
+
self._readyPromise:cancel()
|
|
149
|
+
end
|
|
150
|
+
if self._changed then
|
|
151
|
+
self._changed:Disconnect()
|
|
152
|
+
end
|
|
153
|
+
self.Changed:Destroy()
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
return ClientRemoteProperty
|
|
@@ -1,109 +1,109 @@
|
|
|
1
|
-
-- ClientRemoteSignal
|
|
2
|
-
-- Stephen Leitnick
|
|
3
|
-
-- December 20, 2021
|
|
4
|
-
|
|
5
|
-
local Signal = require(script.Parent.Parent.Parent.Signal)
|
|
6
|
-
local Types = require(script.Parent.Parent.Types)
|
|
7
|
-
|
|
8
|
-
--[=[
|
|
9
|
-
@class ClientRemoteSignal
|
|
10
|
-
@client
|
|
11
|
-
Created via `ClientComm:GetSignal()`.
|
|
12
|
-
]=]
|
|
13
|
-
local ClientRemoteSignal = {}
|
|
14
|
-
ClientRemoteSignal.__index = ClientRemoteSignal
|
|
15
|
-
|
|
16
|
-
--[=[
|
|
17
|
-
@within ClientRemoteSignal
|
|
18
|
-
@interface Connection
|
|
19
|
-
.Disconnect () -> ()
|
|
20
|
-
|
|
21
|
-
Represents a connection.
|
|
22
|
-
]=]
|
|
23
|
-
|
|
24
|
-
function ClientRemoteSignal.new(
|
|
25
|
-
re: RemoteEvent | UnreliableRemoteEvent,
|
|
26
|
-
inboundMiddleware: Types.ClientMiddleware?,
|
|
27
|
-
outboudMiddleware: Types.ClientMiddleware?
|
|
28
|
-
)
|
|
29
|
-
local self = setmetatable({}, ClientRemoteSignal)
|
|
30
|
-
self._re = re
|
|
31
|
-
if outboudMiddleware and #outboudMiddleware > 0 then
|
|
32
|
-
self._hasOutbound = true
|
|
33
|
-
self._outbound = outboudMiddleware
|
|
34
|
-
else
|
|
35
|
-
self._hasOutbound = false
|
|
36
|
-
end
|
|
37
|
-
if inboundMiddleware and #inboundMiddleware > 0 then
|
|
38
|
-
self._directConnect = false
|
|
39
|
-
self._signal = Signal.new()
|
|
40
|
-
self._reConn = self._re.OnClientEvent:Connect(function(...)
|
|
41
|
-
local args = table.pack(...)
|
|
42
|
-
for _, middlewareFunc in inboundMiddleware do
|
|
43
|
-
local middlewareResult = table.pack(middlewareFunc(args))
|
|
44
|
-
if not middlewareResult[1] then
|
|
45
|
-
return
|
|
46
|
-
end
|
|
47
|
-
args.n = #args
|
|
48
|
-
end
|
|
49
|
-
self._signal:Fire(table.unpack(args, 1, args.n))
|
|
50
|
-
end)
|
|
51
|
-
else
|
|
52
|
-
self._directConnect = true
|
|
53
|
-
end
|
|
54
|
-
return self
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
function ClientRemoteSignal:_processOutboundMiddleware(...: any)
|
|
58
|
-
local args = table.pack(...)
|
|
59
|
-
for _, middlewareFunc in self._outbound do
|
|
60
|
-
local middlewareResult = table.pack(middlewareFunc(args))
|
|
61
|
-
if not middlewareResult[1] then
|
|
62
|
-
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
63
|
-
end
|
|
64
|
-
args.n = #args
|
|
65
|
-
end
|
|
66
|
-
return table.unpack(args, 1, args.n)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
--[=[
|
|
70
|
-
@param fn (...: any) -> ()
|
|
71
|
-
@return Connection
|
|
72
|
-
Connects a function to the remote signal. The function will be
|
|
73
|
-
called anytime the equivalent server-side RemoteSignal is
|
|
74
|
-
fired at this specific client that created this client signal.
|
|
75
|
-
]=]
|
|
76
|
-
function ClientRemoteSignal:Connect(fn: (...any) -> ())
|
|
77
|
-
if self._directConnect then
|
|
78
|
-
return self._re.OnClientEvent:Connect(fn)
|
|
79
|
-
else
|
|
80
|
-
return self._signal:Connect(fn)
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
--[=[
|
|
85
|
-
Fires the equivalent server-side signal with the given arguments.
|
|
86
|
-
|
|
87
|
-
:::note Outbound Middleware
|
|
88
|
-
All arguments pass through any outbound middleware before being
|
|
89
|
-
sent to the server.
|
|
90
|
-
:::
|
|
91
|
-
]=]
|
|
92
|
-
function ClientRemoteSignal:Fire(...: any)
|
|
93
|
-
if self._hasOutbound then
|
|
94
|
-
self._re:FireServer(self:_processOutboundMiddleware(...))
|
|
95
|
-
else
|
|
96
|
-
self._re:FireServer(...)
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
--[=[
|
|
101
|
-
Destroys the ClientRemoteSignal object.
|
|
102
|
-
]=]
|
|
103
|
-
function ClientRemoteSignal:Destroy()
|
|
104
|
-
if self._signal then
|
|
105
|
-
self._signal:Destroy()
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
return ClientRemoteSignal
|
|
1
|
+
-- ClientRemoteSignal
|
|
2
|
+
-- Stephen Leitnick
|
|
3
|
+
-- December 20, 2021
|
|
4
|
+
|
|
5
|
+
local Signal = require(script.Parent.Parent.Parent.Signal)
|
|
6
|
+
local Types = require(script.Parent.Parent.Types)
|
|
7
|
+
|
|
8
|
+
--[=[
|
|
9
|
+
@class ClientRemoteSignal
|
|
10
|
+
@client
|
|
11
|
+
Created via `ClientComm:GetSignal()`.
|
|
12
|
+
]=]
|
|
13
|
+
local ClientRemoteSignal = {}
|
|
14
|
+
ClientRemoteSignal.__index = ClientRemoteSignal
|
|
15
|
+
|
|
16
|
+
--[=[
|
|
17
|
+
@within ClientRemoteSignal
|
|
18
|
+
@interface Connection
|
|
19
|
+
.Disconnect () -> ()
|
|
20
|
+
|
|
21
|
+
Represents a connection.
|
|
22
|
+
]=]
|
|
23
|
+
|
|
24
|
+
function ClientRemoteSignal.new(
|
|
25
|
+
re: RemoteEvent | UnreliableRemoteEvent,
|
|
26
|
+
inboundMiddleware: Types.ClientMiddleware?,
|
|
27
|
+
outboudMiddleware: Types.ClientMiddleware?
|
|
28
|
+
)
|
|
29
|
+
local self = setmetatable({}, ClientRemoteSignal)
|
|
30
|
+
self._re = re
|
|
31
|
+
if outboudMiddleware and #outboudMiddleware > 0 then
|
|
32
|
+
self._hasOutbound = true
|
|
33
|
+
self._outbound = outboudMiddleware
|
|
34
|
+
else
|
|
35
|
+
self._hasOutbound = false
|
|
36
|
+
end
|
|
37
|
+
if inboundMiddleware and #inboundMiddleware > 0 then
|
|
38
|
+
self._directConnect = false
|
|
39
|
+
self._signal = Signal.new()
|
|
40
|
+
self._reConn = self._re.OnClientEvent:Connect(function(...)
|
|
41
|
+
local args = table.pack(...)
|
|
42
|
+
for _, middlewareFunc in inboundMiddleware do
|
|
43
|
+
local middlewareResult = table.pack(middlewareFunc(args))
|
|
44
|
+
if not middlewareResult[1] then
|
|
45
|
+
return
|
|
46
|
+
end
|
|
47
|
+
args.n = #args
|
|
48
|
+
end
|
|
49
|
+
self._signal:Fire(table.unpack(args, 1, args.n))
|
|
50
|
+
end)
|
|
51
|
+
else
|
|
52
|
+
self._directConnect = true
|
|
53
|
+
end
|
|
54
|
+
return self
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
function ClientRemoteSignal:_processOutboundMiddleware(...: any)
|
|
58
|
+
local args = table.pack(...)
|
|
59
|
+
for _, middlewareFunc in self._outbound do
|
|
60
|
+
local middlewareResult = table.pack(middlewareFunc(args))
|
|
61
|
+
if not middlewareResult[1] then
|
|
62
|
+
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
63
|
+
end
|
|
64
|
+
args.n = #args
|
|
65
|
+
end
|
|
66
|
+
return table.unpack(args, 1, args.n)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
--[=[
|
|
70
|
+
@param fn (...: any) -> ()
|
|
71
|
+
@return Connection
|
|
72
|
+
Connects a function to the remote signal. The function will be
|
|
73
|
+
called anytime the equivalent server-side RemoteSignal is
|
|
74
|
+
fired at this specific client that created this client signal.
|
|
75
|
+
]=]
|
|
76
|
+
function ClientRemoteSignal:Connect(fn: (...any) -> ())
|
|
77
|
+
if self._directConnect then
|
|
78
|
+
return self._re.OnClientEvent:Connect(fn)
|
|
79
|
+
else
|
|
80
|
+
return self._signal:Connect(fn)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
--[=[
|
|
85
|
+
Fires the equivalent server-side signal with the given arguments.
|
|
86
|
+
|
|
87
|
+
:::note Outbound Middleware
|
|
88
|
+
All arguments pass through any outbound middleware before being
|
|
89
|
+
sent to the server.
|
|
90
|
+
:::
|
|
91
|
+
]=]
|
|
92
|
+
function ClientRemoteSignal:Fire(...: any)
|
|
93
|
+
if self._hasOutbound then
|
|
94
|
+
self._re:FireServer(self:_processOutboundMiddleware(...))
|
|
95
|
+
else
|
|
96
|
+
self._re:FireServer(...)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
--[=[
|
|
101
|
+
Destroys the ClientRemoteSignal object.
|
|
102
|
+
]=]
|
|
103
|
+
function ClientRemoteSignal:Destroy()
|
|
104
|
+
if self._signal then
|
|
105
|
+
self._signal:Destroy()
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
return ClientRemoteSignal
|