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,211 +1,211 @@
|
|
|
1
|
-
-- RemoteSignal
|
|
2
|
-
-- Stephen Leitnick
|
|
3
|
-
-- December 20, 2021
|
|
4
|
-
|
|
5
|
-
local Players = game:GetService("Players")
|
|
6
|
-
|
|
7
|
-
local Signal = require(script.Parent.Parent.Parent.Signal)
|
|
8
|
-
local Types = require(script.Parent.Parent.Types)
|
|
9
|
-
|
|
10
|
-
--[=[
|
|
11
|
-
@class RemoteSignal
|
|
12
|
-
@server
|
|
13
|
-
Created via `ServerComm:CreateSignal()`.
|
|
14
|
-
]=]
|
|
15
|
-
local RemoteSignal = {}
|
|
16
|
-
RemoteSignal.__index = RemoteSignal
|
|
17
|
-
|
|
18
|
-
--[=[
|
|
19
|
-
@within RemoteSignal
|
|
20
|
-
@interface Connection
|
|
21
|
-
.Disconnect () -> nil
|
|
22
|
-
.Connected boolean
|
|
23
|
-
|
|
24
|
-
Represents a connection.
|
|
25
|
-
]=]
|
|
26
|
-
|
|
27
|
-
function RemoteSignal.new(
|
|
28
|
-
parent: Instance,
|
|
29
|
-
name: string,
|
|
30
|
-
unreliable: boolean?,
|
|
31
|
-
inboundMiddleware: Types.ServerMiddleware?,
|
|
32
|
-
outboundMiddleware: Types.ServerMiddleware?
|
|
33
|
-
)
|
|
34
|
-
local self = setmetatable({}, RemoteSignal)
|
|
35
|
-
self._re = if unreliable == true then Instance.new("UnreliableRemoteEvent") else Instance.new("RemoteEvent")
|
|
36
|
-
self._re.Name = name
|
|
37
|
-
self._re.Parent = parent
|
|
38
|
-
if outboundMiddleware and #outboundMiddleware > 0 then
|
|
39
|
-
self._hasOutbound = true
|
|
40
|
-
self._outbound = outboundMiddleware
|
|
41
|
-
else
|
|
42
|
-
self._hasOutbound = false
|
|
43
|
-
end
|
|
44
|
-
if inboundMiddleware and #inboundMiddleware > 0 then
|
|
45
|
-
self._directConnect = false
|
|
46
|
-
self._signal = Signal.new()
|
|
47
|
-
self._re.OnServerEvent:Connect(function(player, ...)
|
|
48
|
-
local args = table.pack(...)
|
|
49
|
-
for _, middlewareFunc in inboundMiddleware do
|
|
50
|
-
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
51
|
-
if not middlewareResult[1] then
|
|
52
|
-
return
|
|
53
|
-
end
|
|
54
|
-
args.n = #args
|
|
55
|
-
end
|
|
56
|
-
self._signal:Fire(player, table.unpack(args, 1, args.n))
|
|
57
|
-
end)
|
|
58
|
-
else
|
|
59
|
-
self._directConnect = true
|
|
60
|
-
end
|
|
61
|
-
return self
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
--[=[
|
|
65
|
-
@return boolean
|
|
66
|
-
Returns `true` if the underlying RemoteSignal is bound to an
|
|
67
|
-
UnreliableRemoteEvent object.
|
|
68
|
-
]=]
|
|
69
|
-
function RemoteSignal:IsUnreliable(): boolean
|
|
70
|
-
return self._re:IsA("UnreliableRemoteEvent")
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
--[=[
|
|
74
|
-
@param fn (player: Player, ...: any) -> nil -- The function to connect
|
|
75
|
-
@return Connection
|
|
76
|
-
Connect a function to the signal. Anytime a matching ClientRemoteSignal
|
|
77
|
-
on a client fires, the connected function will be invoked with the
|
|
78
|
-
arguments passed by the client.
|
|
79
|
-
]=]
|
|
80
|
-
function RemoteSignal:Connect(fn)
|
|
81
|
-
if self._directConnect then
|
|
82
|
-
return self._re.OnServerEvent:Connect(fn)
|
|
83
|
-
else
|
|
84
|
-
return self._signal:Connect(fn)
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
function RemoteSignal:_processOutboundMiddleware(player: Player?, ...: any)
|
|
89
|
-
if not self._hasOutbound then
|
|
90
|
-
return ...
|
|
91
|
-
end
|
|
92
|
-
local args = table.pack(...)
|
|
93
|
-
for _, middlewareFunc in self._outbound do
|
|
94
|
-
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
95
|
-
if not middlewareResult[1] then
|
|
96
|
-
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
97
|
-
end
|
|
98
|
-
args.n = #args
|
|
99
|
-
end
|
|
100
|
-
return table.unpack(args, 1, args.n)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
--[=[
|
|
104
|
-
@param player Player -- The target client
|
|
105
|
-
@param ... any -- Arguments passed to the client
|
|
106
|
-
Fires the signal at the specified client with any arguments.
|
|
107
|
-
|
|
108
|
-
:::note Outbound Middleware
|
|
109
|
-
All arguments pass through any outbound middleware (if any)
|
|
110
|
-
before being sent to the clients.
|
|
111
|
-
:::
|
|
112
|
-
]=]
|
|
113
|
-
function RemoteSignal:Fire(player: Player, ...: any)
|
|
114
|
-
self._re:FireClient(player, self:_processOutboundMiddleware(player, ...))
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
--[=[
|
|
118
|
-
@param ... any
|
|
119
|
-
Fires the signal at _all_ clients with any arguments.
|
|
120
|
-
|
|
121
|
-
:::note Outbound Middleware
|
|
122
|
-
All arguments pass through any outbound middleware (if any)
|
|
123
|
-
before being sent to the clients.
|
|
124
|
-
:::
|
|
125
|
-
]=]
|
|
126
|
-
function RemoteSignal:FireAll(...: any)
|
|
127
|
-
self._re:FireAllClients(self:_processOutboundMiddleware(nil, ...))
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
--[=[
|
|
131
|
-
@param ignorePlayer Player -- The client to ignore
|
|
132
|
-
@param ... any -- Arguments passed to the other clients
|
|
133
|
-
Fires the signal to all clients _except_ the specified
|
|
134
|
-
client.
|
|
135
|
-
|
|
136
|
-
:::note Outbound Middleware
|
|
137
|
-
All arguments pass through any outbound middleware (if any)
|
|
138
|
-
before being sent to the clients.
|
|
139
|
-
:::
|
|
140
|
-
]=]
|
|
141
|
-
function RemoteSignal:FireExcept(ignorePlayer: Player, ...: any)
|
|
142
|
-
self:FireFilter(function(plr)
|
|
143
|
-
return plr ~= ignorePlayer
|
|
144
|
-
end, ...)
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
--[=[
|
|
148
|
-
@param predicate (player: Player, argsFromFire: ...) -> boolean
|
|
149
|
-
@param ... any -- Arguments to pass to the clients (and to the predicate)
|
|
150
|
-
Fires the signal at any clients that pass the `predicate`
|
|
151
|
-
function test. This can be used to fire signals with much
|
|
152
|
-
more control logic.
|
|
153
|
-
|
|
154
|
-
:::note Outbound Middleware
|
|
155
|
-
All arguments pass through any outbound middleware (if any)
|
|
156
|
-
before being sent to the clients.
|
|
157
|
-
:::
|
|
158
|
-
|
|
159
|
-
:::caution Predicate Before Middleware
|
|
160
|
-
The arguments sent to the predicate are sent _before_ getting
|
|
161
|
-
transformed by any middleware.
|
|
162
|
-
:::
|
|
163
|
-
|
|
164
|
-
```lua
|
|
165
|
-
-- Fire signal to players of the same team:
|
|
166
|
-
remoteSignal:FireFilter(function(player)
|
|
167
|
-
return player.Team.Name == "Best Team"
|
|
168
|
-
end)
|
|
169
|
-
```
|
|
170
|
-
]=]
|
|
171
|
-
function RemoteSignal:FireFilter(predicate: (Player, ...any) -> boolean, ...: any)
|
|
172
|
-
for _, player in Players:GetPlayers() do
|
|
173
|
-
if predicate(player, ...) then
|
|
174
|
-
self._re:FireClient(player, self:_processOutboundMiddleware(nil, ...))
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
--[=[
|
|
180
|
-
Fires a signal at the clients within the `players` table. This is
|
|
181
|
-
useful when signals need to fire for a specific set of players.
|
|
182
|
-
|
|
183
|
-
For more complex firing, see `FireFilter`.
|
|
184
|
-
|
|
185
|
-
:::note Outbound Middleware
|
|
186
|
-
All arguments pass through any outbound middleware (if any)
|
|
187
|
-
before being sent to the clients.
|
|
188
|
-
:::
|
|
189
|
-
|
|
190
|
-
```lua
|
|
191
|
-
local players = {somePlayer1, somePlayer2, somePlayer3}
|
|
192
|
-
remoteSignal:FireFor(players, "Hello, players!")
|
|
193
|
-
```
|
|
194
|
-
]=]
|
|
195
|
-
function RemoteSignal:FireFor(players: { Player }, ...: any)
|
|
196
|
-
for _, player in players do
|
|
197
|
-
self._re:FireClient(player, self:_processOutboundMiddleware(nil, ...))
|
|
198
|
-
end
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
--[=[
|
|
202
|
-
Destroys the RemoteSignal object.
|
|
203
|
-
]=]
|
|
204
|
-
function RemoteSignal:Destroy()
|
|
205
|
-
self._re:Destroy()
|
|
206
|
-
if self._signal then
|
|
207
|
-
self._signal:Destroy()
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
return RemoteSignal
|
|
1
|
+
-- RemoteSignal
|
|
2
|
+
-- Stephen Leitnick
|
|
3
|
+
-- December 20, 2021
|
|
4
|
+
|
|
5
|
+
local Players = game:GetService("Players")
|
|
6
|
+
|
|
7
|
+
local Signal = require(script.Parent.Parent.Parent.Signal)
|
|
8
|
+
local Types = require(script.Parent.Parent.Types)
|
|
9
|
+
|
|
10
|
+
--[=[
|
|
11
|
+
@class RemoteSignal
|
|
12
|
+
@server
|
|
13
|
+
Created via `ServerComm:CreateSignal()`.
|
|
14
|
+
]=]
|
|
15
|
+
local RemoteSignal = {}
|
|
16
|
+
RemoteSignal.__index = RemoteSignal
|
|
17
|
+
|
|
18
|
+
--[=[
|
|
19
|
+
@within RemoteSignal
|
|
20
|
+
@interface Connection
|
|
21
|
+
.Disconnect () -> nil
|
|
22
|
+
.Connected boolean
|
|
23
|
+
|
|
24
|
+
Represents a connection.
|
|
25
|
+
]=]
|
|
26
|
+
|
|
27
|
+
function RemoteSignal.new(
|
|
28
|
+
parent: Instance,
|
|
29
|
+
name: string,
|
|
30
|
+
unreliable: boolean?,
|
|
31
|
+
inboundMiddleware: Types.ServerMiddleware?,
|
|
32
|
+
outboundMiddleware: Types.ServerMiddleware?
|
|
33
|
+
)
|
|
34
|
+
local self = setmetatable({}, RemoteSignal)
|
|
35
|
+
self._re = if unreliable == true then Instance.new("UnreliableRemoteEvent") else Instance.new("RemoteEvent")
|
|
36
|
+
self._re.Name = name
|
|
37
|
+
self._re.Parent = parent
|
|
38
|
+
if outboundMiddleware and #outboundMiddleware > 0 then
|
|
39
|
+
self._hasOutbound = true
|
|
40
|
+
self._outbound = outboundMiddleware
|
|
41
|
+
else
|
|
42
|
+
self._hasOutbound = false
|
|
43
|
+
end
|
|
44
|
+
if inboundMiddleware and #inboundMiddleware > 0 then
|
|
45
|
+
self._directConnect = false
|
|
46
|
+
self._signal = Signal.new()
|
|
47
|
+
self._re.OnServerEvent:Connect(function(player, ...)
|
|
48
|
+
local args = table.pack(...)
|
|
49
|
+
for _, middlewareFunc in inboundMiddleware do
|
|
50
|
+
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
51
|
+
if not middlewareResult[1] then
|
|
52
|
+
return
|
|
53
|
+
end
|
|
54
|
+
args.n = #args
|
|
55
|
+
end
|
|
56
|
+
self._signal:Fire(player, table.unpack(args, 1, args.n))
|
|
57
|
+
end)
|
|
58
|
+
else
|
|
59
|
+
self._directConnect = true
|
|
60
|
+
end
|
|
61
|
+
return self
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
--[=[
|
|
65
|
+
@return boolean
|
|
66
|
+
Returns `true` if the underlying RemoteSignal is bound to an
|
|
67
|
+
UnreliableRemoteEvent object.
|
|
68
|
+
]=]
|
|
69
|
+
function RemoteSignal:IsUnreliable(): boolean
|
|
70
|
+
return self._re:IsA("UnreliableRemoteEvent")
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
--[=[
|
|
74
|
+
@param fn (player: Player, ...: any) -> nil -- The function to connect
|
|
75
|
+
@return Connection
|
|
76
|
+
Connect a function to the signal. Anytime a matching ClientRemoteSignal
|
|
77
|
+
on a client fires, the connected function will be invoked with the
|
|
78
|
+
arguments passed by the client.
|
|
79
|
+
]=]
|
|
80
|
+
function RemoteSignal:Connect(fn)
|
|
81
|
+
if self._directConnect then
|
|
82
|
+
return self._re.OnServerEvent:Connect(fn)
|
|
83
|
+
else
|
|
84
|
+
return self._signal:Connect(fn)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
function RemoteSignal:_processOutboundMiddleware(player: Player?, ...: any)
|
|
89
|
+
if not self._hasOutbound then
|
|
90
|
+
return ...
|
|
91
|
+
end
|
|
92
|
+
local args = table.pack(...)
|
|
93
|
+
for _, middlewareFunc in self._outbound do
|
|
94
|
+
local middlewareResult = table.pack(middlewareFunc(player, args))
|
|
95
|
+
if not middlewareResult[1] then
|
|
96
|
+
return table.unpack(middlewareResult, 2, middlewareResult.n)
|
|
97
|
+
end
|
|
98
|
+
args.n = #args
|
|
99
|
+
end
|
|
100
|
+
return table.unpack(args, 1, args.n)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
--[=[
|
|
104
|
+
@param player Player -- The target client
|
|
105
|
+
@param ... any -- Arguments passed to the client
|
|
106
|
+
Fires the signal at the specified client with any arguments.
|
|
107
|
+
|
|
108
|
+
:::note Outbound Middleware
|
|
109
|
+
All arguments pass through any outbound middleware (if any)
|
|
110
|
+
before being sent to the clients.
|
|
111
|
+
:::
|
|
112
|
+
]=]
|
|
113
|
+
function RemoteSignal:Fire(player: Player, ...: any)
|
|
114
|
+
self._re:FireClient(player, self:_processOutboundMiddleware(player, ...))
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
--[=[
|
|
118
|
+
@param ... any
|
|
119
|
+
Fires the signal at _all_ clients with any arguments.
|
|
120
|
+
|
|
121
|
+
:::note Outbound Middleware
|
|
122
|
+
All arguments pass through any outbound middleware (if any)
|
|
123
|
+
before being sent to the clients.
|
|
124
|
+
:::
|
|
125
|
+
]=]
|
|
126
|
+
function RemoteSignal:FireAll(...: any)
|
|
127
|
+
self._re:FireAllClients(self:_processOutboundMiddleware(nil, ...))
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
--[=[
|
|
131
|
+
@param ignorePlayer Player -- The client to ignore
|
|
132
|
+
@param ... any -- Arguments passed to the other clients
|
|
133
|
+
Fires the signal to all clients _except_ the specified
|
|
134
|
+
client.
|
|
135
|
+
|
|
136
|
+
:::note Outbound Middleware
|
|
137
|
+
All arguments pass through any outbound middleware (if any)
|
|
138
|
+
before being sent to the clients.
|
|
139
|
+
:::
|
|
140
|
+
]=]
|
|
141
|
+
function RemoteSignal:FireExcept(ignorePlayer: Player, ...: any)
|
|
142
|
+
self:FireFilter(function(plr)
|
|
143
|
+
return plr ~= ignorePlayer
|
|
144
|
+
end, ...)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
--[=[
|
|
148
|
+
@param predicate (player: Player, argsFromFire: ...) -> boolean
|
|
149
|
+
@param ... any -- Arguments to pass to the clients (and to the predicate)
|
|
150
|
+
Fires the signal at any clients that pass the `predicate`
|
|
151
|
+
function test. This can be used to fire signals with much
|
|
152
|
+
more control logic.
|
|
153
|
+
|
|
154
|
+
:::note Outbound Middleware
|
|
155
|
+
All arguments pass through any outbound middleware (if any)
|
|
156
|
+
before being sent to the clients.
|
|
157
|
+
:::
|
|
158
|
+
|
|
159
|
+
:::caution Predicate Before Middleware
|
|
160
|
+
The arguments sent to the predicate are sent _before_ getting
|
|
161
|
+
transformed by any middleware.
|
|
162
|
+
:::
|
|
163
|
+
|
|
164
|
+
```lua
|
|
165
|
+
-- Fire signal to players of the same team:
|
|
166
|
+
remoteSignal:FireFilter(function(player)
|
|
167
|
+
return player.Team.Name == "Best Team"
|
|
168
|
+
end)
|
|
169
|
+
```
|
|
170
|
+
]=]
|
|
171
|
+
function RemoteSignal:FireFilter(predicate: (Player, ...any) -> boolean, ...: any)
|
|
172
|
+
for _, player in Players:GetPlayers() do
|
|
173
|
+
if predicate(player, ...) then
|
|
174
|
+
self._re:FireClient(player, self:_processOutboundMiddleware(nil, ...))
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
--[=[
|
|
180
|
+
Fires a signal at the clients within the `players` table. This is
|
|
181
|
+
useful when signals need to fire for a specific set of players.
|
|
182
|
+
|
|
183
|
+
For more complex firing, see `FireFilter`.
|
|
184
|
+
|
|
185
|
+
:::note Outbound Middleware
|
|
186
|
+
All arguments pass through any outbound middleware (if any)
|
|
187
|
+
before being sent to the clients.
|
|
188
|
+
:::
|
|
189
|
+
|
|
190
|
+
```lua
|
|
191
|
+
local players = {somePlayer1, somePlayer2, somePlayer3}
|
|
192
|
+
remoteSignal:FireFor(players, "Hello, players!")
|
|
193
|
+
```
|
|
194
|
+
]=]
|
|
195
|
+
function RemoteSignal:FireFor(players: { Player }, ...: any)
|
|
196
|
+
for _, player in players do
|
|
197
|
+
self._re:FireClient(player, self:_processOutboundMiddleware(nil, ...))
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
--[=[
|
|
202
|
+
Destroys the RemoteSignal object.
|
|
203
|
+
]=]
|
|
204
|
+
function RemoteSignal:Destroy()
|
|
205
|
+
self._re:Destroy()
|
|
206
|
+
if self._signal then
|
|
207
|
+
self._signal:Destroy()
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
return RemoteSignal
|