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
|
-
-- ServerComm
|
|
2
|
-
-- Stephen Leitnick
|
|
3
|
-
-- December 20, 2021
|
|
4
|
-
|
|
5
|
-
local Comm = require(script.Parent)
|
|
6
|
-
local Types = require(script.Parent.Parent.Types)
|
|
7
|
-
local Util = require(script.Parent.Parent.Util)
|
|
8
|
-
|
|
9
|
-
--[=[
|
|
10
|
-
@class ServerComm
|
|
11
|
-
@server
|
|
12
|
-
]=]
|
|
13
|
-
local ServerComm = {}
|
|
14
|
-
ServerComm.__index = ServerComm
|
|
15
|
-
|
|
16
|
-
--[=[
|
|
17
|
-
@within ServerComm
|
|
18
|
-
@type ServerMiddlewareFn (player: Player, args: {any}) -> (shouldContinue: boolean, ...: any)
|
|
19
|
-
The middleware function takes the client player and the arguments (as a table array), and should
|
|
20
|
-
return `true|false` to indicate if the process should continue.
|
|
21
|
-
|
|
22
|
-
If returning `false`, the optional varargs after the `false` are used as the new return values
|
|
23
|
-
to whatever was calling the middleware.
|
|
24
|
-
]=]
|
|
25
|
-
--[=[
|
|
26
|
-
@within ServerComm
|
|
27
|
-
@type ServerMiddleware {ServerMiddlewareFn}
|
|
28
|
-
Array of middleware functions.
|
|
29
|
-
]=]
|
|
30
|
-
|
|
31
|
-
--[=[
|
|
32
|
-
@return ServerComm
|
|
33
|
-
Constructs a ServerComm object. The `namespace` parameter is used
|
|
34
|
-
in cases where more than one ServerComm object may be bound
|
|
35
|
-
to the same object. Otherwise, a default namespace is used.
|
|
36
|
-
|
|
37
|
-
```lua
|
|
38
|
-
local serverComm = ServerComm.new(game:GetService("ReplicatedStorage"))
|
|
39
|
-
|
|
40
|
-
-- If many might exist in the given parent, use a unique namespace:
|
|
41
|
-
local serverComm = ServerComm.new(game:GetService("ReplicatedStorage"), "MyNamespace")
|
|
42
|
-
```
|
|
43
|
-
]=]
|
|
44
|
-
function ServerComm.new(parent: Instance, namespace: string?)
|
|
45
|
-
assert(Util.IsServer, "ServerComm must be constructed from the server")
|
|
46
|
-
assert(typeof(parent) == "Instance", "Parent must be of type Instance")
|
|
47
|
-
local ns = Util.DefaultCommFolderName
|
|
48
|
-
if namespace then
|
|
49
|
-
ns = namespace
|
|
50
|
-
end
|
|
51
|
-
assert(not parent:FindFirstChild(ns), "Parent already has another ServerComm bound to namespace " .. ns)
|
|
52
|
-
local self = setmetatable({}, ServerComm)
|
|
53
|
-
self._instancesFolder = Instance.new("Folder")
|
|
54
|
-
self._instancesFolder.Name = ns
|
|
55
|
-
self._instancesFolder.Parent = parent
|
|
56
|
-
return self
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
--[=[
|
|
60
|
-
@param name string
|
|
61
|
-
@param fn (player: Player, ...: any) -> ...: any
|
|
62
|
-
@param inboundMiddleware ServerMiddleware?
|
|
63
|
-
@param outboundMiddleware ServerMiddleware?
|
|
64
|
-
@return RemoteFunction
|
|
65
|
-
Creates a RemoteFunction and binds the given function to it. Inbound
|
|
66
|
-
and outbound middleware can be applied if desired.
|
|
67
|
-
|
|
68
|
-
```lua
|
|
69
|
-
local function GetSomething(player: Player)
|
|
70
|
-
return "Something"
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
serverComm:BindFunction("GetSomething", GetSomething)
|
|
74
|
-
```
|
|
75
|
-
]=]
|
|
76
|
-
function ServerComm:BindFunction(
|
|
77
|
-
name: string,
|
|
78
|
-
fn: Types.FnBind,
|
|
79
|
-
inboundMiddleware: Types.ServerMiddleware?,
|
|
80
|
-
outboundMiddleware: Types.ServerMiddleware?
|
|
81
|
-
): RemoteFunction
|
|
82
|
-
return Comm.BindFunction(self._instancesFolder, name, fn, inboundMiddleware, outboundMiddleware)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
--[=[
|
|
86
|
-
@param tbl table
|
|
87
|
-
@param name string
|
|
88
|
-
@param inboundMiddleware ServerMiddleware?
|
|
89
|
-
@param outboundMiddleware ServerMiddleware?
|
|
90
|
-
@return RemoteFunction
|
|
91
|
-
|
|
92
|
-
Binds a function to a table method. The name must match the
|
|
93
|
-
name of the method in the table. The same name will be used
|
|
94
|
-
on the client to access the given function.
|
|
95
|
-
|
|
96
|
-
```lua
|
|
97
|
-
local MyObject = {
|
|
98
|
-
_Data = 10,
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function MyObject:GetData(player: Player)
|
|
102
|
-
return self._Data
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
serverComm:WrapMethod(MyObject, "GetData")
|
|
106
|
-
```
|
|
107
|
-
]=]
|
|
108
|
-
function ServerComm:WrapMethod(
|
|
109
|
-
tbl: {},
|
|
110
|
-
name: string,
|
|
111
|
-
inboundMiddleware: Types.ServerMiddleware?,
|
|
112
|
-
outboundMiddleware: Types.ServerMiddleware?
|
|
113
|
-
): RemoteFunction
|
|
114
|
-
return Comm.WrapMethod(self._instancesFolder, tbl, name, inboundMiddleware, outboundMiddleware)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
--[=[
|
|
118
|
-
@param name string
|
|
119
|
-
@param unreliable boolean?
|
|
120
|
-
@param inboundMiddleware ServerMiddleware?
|
|
121
|
-
@param outboundMiddleware ServerMiddleware?
|
|
122
|
-
@return RemoteSignal
|
|
123
|
-
|
|
124
|
-
Creates a signal that can be used to fire data to the clients
|
|
125
|
-
or receive data from the clients.
|
|
126
|
-
|
|
127
|
-
By default, signals use RemoteEvents internally. However, if
|
|
128
|
-
the `unreliable` argument is set to `true`, then an
|
|
129
|
-
UnreliableRemoteEvent will be used instead.
|
|
130
|
-
|
|
131
|
-
```lua
|
|
132
|
-
local mySignal = serverComm:CreateSignal("MySignal")
|
|
133
|
-
|
|
134
|
-
-- Examples of firing in different ways (see docs for RemoteSignal for further info):
|
|
135
|
-
mySignal:Fire(somePlayer, "Hello world")
|
|
136
|
-
mySignal:FireAll("Hi there")
|
|
137
|
-
mySignal:FireExcept(somePlayer, "Hello everyone except " .. somePlayer.Name)
|
|
138
|
-
mySignal:FireFilter(function(player) return player.Team == someCoolTeam end, "Hello cool team")
|
|
139
|
-
|
|
140
|
-
-- Example of listening for clients to send data:
|
|
141
|
-
mySignal:Connect(function(player, message)
|
|
142
|
-
print("Got a message from " .. player.Name .. ":", message)
|
|
143
|
-
end)
|
|
144
|
-
```
|
|
145
|
-
]=]
|
|
146
|
-
function ServerComm:CreateSignal(
|
|
147
|
-
name: string,
|
|
148
|
-
unreliable: boolean?,
|
|
149
|
-
inboundMiddleware: Types.ServerMiddleware?,
|
|
150
|
-
outboundMiddleware: Types.ServerMiddleware?
|
|
151
|
-
)
|
|
152
|
-
return Comm.CreateSignal(self._instancesFolder, name, unreliable, inboundMiddleware, outboundMiddleware)
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
--[=[
|
|
156
|
-
@param name string
|
|
157
|
-
@param initialValue any
|
|
158
|
-
@param inboundMiddleware ServerMiddleware?
|
|
159
|
-
@param outboundMiddleware ServerMiddleware?
|
|
160
|
-
@return RemoteProperty
|
|
161
|
-
|
|
162
|
-
Create a property object which will replicate its property value to
|
|
163
|
-
the clients. Optionally, specific clients can be targeted with
|
|
164
|
-
different property values.
|
|
165
|
-
|
|
166
|
-
```lua
|
|
167
|
-
local comm = Comm.ServerComm.new(game:GetService("ReplicatedStorage"))
|
|
168
|
-
|
|
169
|
-
local mapInfo = comm:CreateProperty("MapInfo", {
|
|
170
|
-
MapName = "TheAwesomeMap",
|
|
171
|
-
MapDuration = 60,
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
-- Change the data:
|
|
175
|
-
mapInfo:Set({
|
|
176
|
-
MapName = "AnotherMap",
|
|
177
|
-
MapDuration = 30,
|
|
178
|
-
})
|
|
179
|
-
|
|
180
|
-
-- Change the data for one player:
|
|
181
|
-
mapInfo:SetFor(somePlayer, {
|
|
182
|
-
MapName = "ASpecialMapForYou",
|
|
183
|
-
MapDuration = 90,
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
-- Change data based on a predicate function:
|
|
187
|
-
mapInfo:SetFilter(function(player)
|
|
188
|
-
return player.Team == game.Teams.SomeSpecialTeam
|
|
189
|
-
end, {
|
|
190
|
-
MapName = "TeamMap",
|
|
191
|
-
MapDuration = 20,
|
|
192
|
-
})
|
|
193
|
-
```
|
|
194
|
-
]=]
|
|
195
|
-
function ServerComm:CreateProperty(
|
|
196
|
-
name: string,
|
|
197
|
-
initialValue: any,
|
|
198
|
-
inboundMiddleware: Types.ServerMiddleware?,
|
|
199
|
-
outboundMiddleware: Types.ServerMiddleware?
|
|
200
|
-
)
|
|
201
|
-
return Comm.CreateProperty(self._instancesFolder, name, initialValue, inboundMiddleware, outboundMiddleware)
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
--[=[
|
|
205
|
-
Destroy the ServerComm object.
|
|
206
|
-
]=]
|
|
207
|
-
function ServerComm:Destroy()
|
|
208
|
-
self._instancesFolder:Destroy()
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
return ServerComm
|
|
1
|
+
-- ServerComm
|
|
2
|
+
-- Stephen Leitnick
|
|
3
|
+
-- December 20, 2021
|
|
4
|
+
|
|
5
|
+
local Comm = require(script.Parent)
|
|
6
|
+
local Types = require(script.Parent.Parent.Types)
|
|
7
|
+
local Util = require(script.Parent.Parent.Util)
|
|
8
|
+
|
|
9
|
+
--[=[
|
|
10
|
+
@class ServerComm
|
|
11
|
+
@server
|
|
12
|
+
]=]
|
|
13
|
+
local ServerComm = {}
|
|
14
|
+
ServerComm.__index = ServerComm
|
|
15
|
+
|
|
16
|
+
--[=[
|
|
17
|
+
@within ServerComm
|
|
18
|
+
@type ServerMiddlewareFn (player: Player, args: {any}) -> (shouldContinue: boolean, ...: any)
|
|
19
|
+
The middleware function takes the client player and the arguments (as a table array), and should
|
|
20
|
+
return `true|false` to indicate if the process should continue.
|
|
21
|
+
|
|
22
|
+
If returning `false`, the optional varargs after the `false` are used as the new return values
|
|
23
|
+
to whatever was calling the middleware.
|
|
24
|
+
]=]
|
|
25
|
+
--[=[
|
|
26
|
+
@within ServerComm
|
|
27
|
+
@type ServerMiddleware {ServerMiddlewareFn}
|
|
28
|
+
Array of middleware functions.
|
|
29
|
+
]=]
|
|
30
|
+
|
|
31
|
+
--[=[
|
|
32
|
+
@return ServerComm
|
|
33
|
+
Constructs a ServerComm object. The `namespace` parameter is used
|
|
34
|
+
in cases where more than one ServerComm object may be bound
|
|
35
|
+
to the same object. Otherwise, a default namespace is used.
|
|
36
|
+
|
|
37
|
+
```lua
|
|
38
|
+
local serverComm = ServerComm.new(game:GetService("ReplicatedStorage"))
|
|
39
|
+
|
|
40
|
+
-- If many might exist in the given parent, use a unique namespace:
|
|
41
|
+
local serverComm = ServerComm.new(game:GetService("ReplicatedStorage"), "MyNamespace")
|
|
42
|
+
```
|
|
43
|
+
]=]
|
|
44
|
+
function ServerComm.new(parent: Instance, namespace: string?)
|
|
45
|
+
assert(Util.IsServer, "ServerComm must be constructed from the server")
|
|
46
|
+
assert(typeof(parent) == "Instance", "Parent must be of type Instance")
|
|
47
|
+
local ns = Util.DefaultCommFolderName
|
|
48
|
+
if namespace then
|
|
49
|
+
ns = namespace
|
|
50
|
+
end
|
|
51
|
+
assert(not parent:FindFirstChild(ns), "Parent already has another ServerComm bound to namespace " .. ns)
|
|
52
|
+
local self = setmetatable({}, ServerComm)
|
|
53
|
+
self._instancesFolder = Instance.new("Folder")
|
|
54
|
+
self._instancesFolder.Name = ns
|
|
55
|
+
self._instancesFolder.Parent = parent
|
|
56
|
+
return self
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
--[=[
|
|
60
|
+
@param name string
|
|
61
|
+
@param fn (player: Player, ...: any) -> ...: any
|
|
62
|
+
@param inboundMiddleware ServerMiddleware?
|
|
63
|
+
@param outboundMiddleware ServerMiddleware?
|
|
64
|
+
@return RemoteFunction
|
|
65
|
+
Creates a RemoteFunction and binds the given function to it. Inbound
|
|
66
|
+
and outbound middleware can be applied if desired.
|
|
67
|
+
|
|
68
|
+
```lua
|
|
69
|
+
local function GetSomething(player: Player)
|
|
70
|
+
return "Something"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
serverComm:BindFunction("GetSomething", GetSomething)
|
|
74
|
+
```
|
|
75
|
+
]=]
|
|
76
|
+
function ServerComm:BindFunction(
|
|
77
|
+
name: string,
|
|
78
|
+
fn: Types.FnBind,
|
|
79
|
+
inboundMiddleware: Types.ServerMiddleware?,
|
|
80
|
+
outboundMiddleware: Types.ServerMiddleware?
|
|
81
|
+
): RemoteFunction
|
|
82
|
+
return Comm.BindFunction(self._instancesFolder, name, fn, inboundMiddleware, outboundMiddleware)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
--[=[
|
|
86
|
+
@param tbl table
|
|
87
|
+
@param name string
|
|
88
|
+
@param inboundMiddleware ServerMiddleware?
|
|
89
|
+
@param outboundMiddleware ServerMiddleware?
|
|
90
|
+
@return RemoteFunction
|
|
91
|
+
|
|
92
|
+
Binds a function to a table method. The name must match the
|
|
93
|
+
name of the method in the table. The same name will be used
|
|
94
|
+
on the client to access the given function.
|
|
95
|
+
|
|
96
|
+
```lua
|
|
97
|
+
local MyObject = {
|
|
98
|
+
_Data = 10,
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function MyObject:GetData(player: Player)
|
|
102
|
+
return self._Data
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
serverComm:WrapMethod(MyObject, "GetData")
|
|
106
|
+
```
|
|
107
|
+
]=]
|
|
108
|
+
function ServerComm:WrapMethod(
|
|
109
|
+
tbl: {},
|
|
110
|
+
name: string,
|
|
111
|
+
inboundMiddleware: Types.ServerMiddleware?,
|
|
112
|
+
outboundMiddleware: Types.ServerMiddleware?
|
|
113
|
+
): RemoteFunction
|
|
114
|
+
return Comm.WrapMethod(self._instancesFolder, tbl, name, inboundMiddleware, outboundMiddleware)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
--[=[
|
|
118
|
+
@param name string
|
|
119
|
+
@param unreliable boolean?
|
|
120
|
+
@param inboundMiddleware ServerMiddleware?
|
|
121
|
+
@param outboundMiddleware ServerMiddleware?
|
|
122
|
+
@return RemoteSignal
|
|
123
|
+
|
|
124
|
+
Creates a signal that can be used to fire data to the clients
|
|
125
|
+
or receive data from the clients.
|
|
126
|
+
|
|
127
|
+
By default, signals use RemoteEvents internally. However, if
|
|
128
|
+
the `unreliable` argument is set to `true`, then an
|
|
129
|
+
UnreliableRemoteEvent will be used instead.
|
|
130
|
+
|
|
131
|
+
```lua
|
|
132
|
+
local mySignal = serverComm:CreateSignal("MySignal")
|
|
133
|
+
|
|
134
|
+
-- Examples of firing in different ways (see docs for RemoteSignal for further info):
|
|
135
|
+
mySignal:Fire(somePlayer, "Hello world")
|
|
136
|
+
mySignal:FireAll("Hi there")
|
|
137
|
+
mySignal:FireExcept(somePlayer, "Hello everyone except " .. somePlayer.Name)
|
|
138
|
+
mySignal:FireFilter(function(player) return player.Team == someCoolTeam end, "Hello cool team")
|
|
139
|
+
|
|
140
|
+
-- Example of listening for clients to send data:
|
|
141
|
+
mySignal:Connect(function(player, message)
|
|
142
|
+
print("Got a message from " .. player.Name .. ":", message)
|
|
143
|
+
end)
|
|
144
|
+
```
|
|
145
|
+
]=]
|
|
146
|
+
function ServerComm:CreateSignal(
|
|
147
|
+
name: string,
|
|
148
|
+
unreliable: boolean?,
|
|
149
|
+
inboundMiddleware: Types.ServerMiddleware?,
|
|
150
|
+
outboundMiddleware: Types.ServerMiddleware?
|
|
151
|
+
)
|
|
152
|
+
return Comm.CreateSignal(self._instancesFolder, name, unreliable, inboundMiddleware, outboundMiddleware)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
--[=[
|
|
156
|
+
@param name string
|
|
157
|
+
@param initialValue any
|
|
158
|
+
@param inboundMiddleware ServerMiddleware?
|
|
159
|
+
@param outboundMiddleware ServerMiddleware?
|
|
160
|
+
@return RemoteProperty
|
|
161
|
+
|
|
162
|
+
Create a property object which will replicate its property value to
|
|
163
|
+
the clients. Optionally, specific clients can be targeted with
|
|
164
|
+
different property values.
|
|
165
|
+
|
|
166
|
+
```lua
|
|
167
|
+
local comm = Comm.ServerComm.new(game:GetService("ReplicatedStorage"))
|
|
168
|
+
|
|
169
|
+
local mapInfo = comm:CreateProperty("MapInfo", {
|
|
170
|
+
MapName = "TheAwesomeMap",
|
|
171
|
+
MapDuration = 60,
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
-- Change the data:
|
|
175
|
+
mapInfo:Set({
|
|
176
|
+
MapName = "AnotherMap",
|
|
177
|
+
MapDuration = 30,
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
-- Change the data for one player:
|
|
181
|
+
mapInfo:SetFor(somePlayer, {
|
|
182
|
+
MapName = "ASpecialMapForYou",
|
|
183
|
+
MapDuration = 90,
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
-- Change data based on a predicate function:
|
|
187
|
+
mapInfo:SetFilter(function(player)
|
|
188
|
+
return player.Team == game.Teams.SomeSpecialTeam
|
|
189
|
+
end, {
|
|
190
|
+
MapName = "TeamMap",
|
|
191
|
+
MapDuration = 20,
|
|
192
|
+
})
|
|
193
|
+
```
|
|
194
|
+
]=]
|
|
195
|
+
function ServerComm:CreateProperty(
|
|
196
|
+
name: string,
|
|
197
|
+
initialValue: any,
|
|
198
|
+
inboundMiddleware: Types.ServerMiddleware?,
|
|
199
|
+
outboundMiddleware: Types.ServerMiddleware?
|
|
200
|
+
)
|
|
201
|
+
return Comm.CreateProperty(self._instancesFolder, name, initialValue, inboundMiddleware, outboundMiddleware)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
--[=[
|
|
205
|
+
Destroy the ServerComm object.
|
|
206
|
+
]=]
|
|
207
|
+
function ServerComm:Destroy()
|
|
208
|
+
self._instancesFolder:Destroy()
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
return ServerComm
|