roblox-opencode 1.0.0 → 1.0.1
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 +863 -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 +1519 -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,15 +1,15 @@
|
|
|
1
|
-
declare namespace Tree {
|
|
2
|
-
interface Constructor {
|
|
3
|
-
Find(parent: Instance, path: string): Instance;
|
|
4
|
-
Find<T extends keyof Instances>(parent: Instance, path: string, assertIsA: T): Instances[T];
|
|
5
|
-
|
|
6
|
-
Await(parent: Instance, path: string, timeout?: number): Instance;
|
|
7
|
-
Await<T extends keyof Instances>(parent: Instance, path: string, timeout: number, assertIsA: T): Instances[T];
|
|
8
|
-
|
|
9
|
-
Exists(parent: Instance, path: string, assertIsA?: keyof Instances): boolean;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
declare const Tree: Tree.Constructor;
|
|
14
|
-
|
|
15
|
-
export = Tree;
|
|
1
|
+
declare namespace Tree {
|
|
2
|
+
interface Constructor {
|
|
3
|
+
Find(parent: Instance, path: string): Instance;
|
|
4
|
+
Find<T extends keyof Instances>(parent: Instance, path: string, assertIsA: T): Instances[T];
|
|
5
|
+
|
|
6
|
+
Await(parent: Instance, path: string, timeout?: number): Instance;
|
|
7
|
+
Await<T extends keyof Instances>(parent: Instance, path: string, timeout: number, assertIsA: T): Instances[T];
|
|
8
|
+
|
|
9
|
+
Exists(parent: Instance, path: string, assertIsA?: keyof Instances): boolean;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare const Tree: Tree.Constructor;
|
|
14
|
+
|
|
15
|
+
export = Tree;
|
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
local DELIM = "/"
|
|
2
|
-
|
|
3
|
-
local function FullNameToPath(instance: Instance): string
|
|
4
|
-
return instance:GetFullName():gsub("%.", DELIM)
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
--[=[
|
|
8
|
-
@class Tree
|
|
9
|
-
]=]
|
|
10
|
-
local Tree = {}
|
|
11
|
-
|
|
12
|
-
--[=[
|
|
13
|
-
Similar to FindFirstChild, with a few key differences:
|
|
14
|
-
- An error is thrown if the instance is not found
|
|
15
|
-
- A path to the instance can be provided, delimited by forward slashes (e.g. `Path/To/Child`)
|
|
16
|
-
- Optionally, the instance's type can be asserted using `IsA`
|
|
17
|
-
|
|
18
|
-
```lua
|
|
19
|
-
-- Find "Child" directly under parent:
|
|
20
|
-
local instance = Tree.Find(parent, "Child")
|
|
21
|
-
|
|
22
|
-
-- Find "Child" descendant:
|
|
23
|
-
local instance = Tree.Find(parent, "Path/To/Child")
|
|
24
|
-
|
|
25
|
-
-- Find "Child" descendant and assert that it's a BasePart:
|
|
26
|
-
local instance = Tree.Find(parent, "Path/To/Child", "BasePart") :: BasePart
|
|
27
|
-
```
|
|
28
|
-
]=]
|
|
29
|
-
function Tree.Find(parent: Instance, path: string, assertIsA: string?): Instance
|
|
30
|
-
local instance = parent
|
|
31
|
-
local paths = path:split(DELIM)
|
|
32
|
-
|
|
33
|
-
for _, p in paths do
|
|
34
|
-
-- Error for empty path parts:
|
|
35
|
-
if p == "" then
|
|
36
|
-
error(`Invalid path: {path}`, 2)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
instance = instance:FindFirstChild(p)
|
|
40
|
-
|
|
41
|
-
-- Error if instance is not found:
|
|
42
|
-
if instance == nil then
|
|
43
|
-
error(`Failed to find {path} in {FullNameToPath(parent)}`, 2)
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
-- Assert class type if argument is supplied:
|
|
48
|
-
if assertIsA and not instance:IsA(assertIsA) then
|
|
49
|
-
error(`Got class {instance.ClassName}; expected to be of type {assertIsA}`, 2)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
return instance
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
--[=[
|
|
56
|
-
Returns `true` if the instance is found. Similar to `Tree.Find`, except this returns `true|false`. No error is thrown unless the path is invalid.
|
|
57
|
-
|
|
58
|
-
```lua
|
|
59
|
-
-- Check if "Child" exists directly in `parent`:
|
|
60
|
-
if Tree.Exists(parent, "Child") then ... end
|
|
61
|
-
|
|
62
|
-
-- Check if "Child" descendant exists at `parent.Path.To.Child`:
|
|
63
|
-
if Tree.Exists(parent, "Path/To/Child") then ... end
|
|
64
|
-
|
|
65
|
-
-- Check if "Child" descendant exists at `parent.Path.To.Child` and is a BasePart:
|
|
66
|
-
if Tree.Exists(parent, "Path/To/Child", "BasePart") then ... end
|
|
67
|
-
```
|
|
68
|
-
]=]
|
|
69
|
-
function Tree.Exists(parent: Instance, path: string, assertIsA: string?): boolean
|
|
70
|
-
local instance = parent
|
|
71
|
-
local paths = path:split(DELIM)
|
|
72
|
-
|
|
73
|
-
for _, p in paths do
|
|
74
|
-
-- Error for empty path parts:
|
|
75
|
-
if p == "" then
|
|
76
|
-
error(`Invalid path: {path}`, 2)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
instance = instance:FindFirstChild(p)
|
|
80
|
-
|
|
81
|
-
if instance == nil then
|
|
82
|
-
return false
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
if assertIsA and not instance:IsA(assertIsA) then
|
|
87
|
-
return false
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
return true
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
--[=[
|
|
94
|
-
@yields
|
|
95
|
-
Waits for the path to exist within the parent instance. Similar to `Tree.Find`, except `WaitForChild`
|
|
96
|
-
is used internally. An optional `timeout` can be supplied, which is passed along to each call to
|
|
97
|
-
`WaitForChild`.
|
|
98
|
-
|
|
99
|
-
An error is thrown if the path fails to resolve. This will only happen if the path is invalid _or_ if
|
|
100
|
-
the supplied timeout is reached.
|
|
101
|
-
|
|
102
|
-
:::caution Indefinite Yield Possible
|
|
103
|
-
If the `timeout` parameter is not supplied, then the internal call to `WaitForChild` will yield
|
|
104
|
-
indefinitely until the child is found. It is good practice to supply a timeout parameter.
|
|
105
|
-
:::
|
|
106
|
-
|
|
107
|
-
```lua
|
|
108
|
-
local child = Tree.Await(parent, "Path/To/Child", 30)
|
|
109
|
-
```
|
|
110
|
-
]=]
|
|
111
|
-
function Tree.Await(parent: Instance, path: string, timeout: number?, assertIsA: string?): Instance
|
|
112
|
-
local instance = parent
|
|
113
|
-
local paths = path:split(DELIM)
|
|
114
|
-
|
|
115
|
-
for _, p in paths do
|
|
116
|
-
-- Error for empty path parts:
|
|
117
|
-
if p == "" then
|
|
118
|
-
error(`Invalid path: {path}`, 2)
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
instance = instance:WaitForChild(p, timeout)
|
|
122
|
-
|
|
123
|
-
-- Error if instance is not found:
|
|
124
|
-
if instance == nil then
|
|
125
|
-
error(`Failed to await {path} in {FullNameToPath(parent)} (timeout reached)`, 2)
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
-- Assert class type if argument is supplied:
|
|
130
|
-
if assertIsA and not instance:IsA(assertIsA) then
|
|
131
|
-
error(`Got class {instance.ClassName}; expected to be of type {assertIsA}`, 2)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
return instance
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
return Tree
|
|
1
|
+
local DELIM = "/"
|
|
2
|
+
|
|
3
|
+
local function FullNameToPath(instance: Instance): string
|
|
4
|
+
return instance:GetFullName():gsub("%.", DELIM)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
--[=[
|
|
8
|
+
@class Tree
|
|
9
|
+
]=]
|
|
10
|
+
local Tree = {}
|
|
11
|
+
|
|
12
|
+
--[=[
|
|
13
|
+
Similar to FindFirstChild, with a few key differences:
|
|
14
|
+
- An error is thrown if the instance is not found
|
|
15
|
+
- A path to the instance can be provided, delimited by forward slashes (e.g. `Path/To/Child`)
|
|
16
|
+
- Optionally, the instance's type can be asserted using `IsA`
|
|
17
|
+
|
|
18
|
+
```lua
|
|
19
|
+
-- Find "Child" directly under parent:
|
|
20
|
+
local instance = Tree.Find(parent, "Child")
|
|
21
|
+
|
|
22
|
+
-- Find "Child" descendant:
|
|
23
|
+
local instance = Tree.Find(parent, "Path/To/Child")
|
|
24
|
+
|
|
25
|
+
-- Find "Child" descendant and assert that it's a BasePart:
|
|
26
|
+
local instance = Tree.Find(parent, "Path/To/Child", "BasePart") :: BasePart
|
|
27
|
+
```
|
|
28
|
+
]=]
|
|
29
|
+
function Tree.Find(parent: Instance, path: string, assertIsA: string?): Instance
|
|
30
|
+
local instance = parent
|
|
31
|
+
local paths = path:split(DELIM)
|
|
32
|
+
|
|
33
|
+
for _, p in paths do
|
|
34
|
+
-- Error for empty path parts:
|
|
35
|
+
if p == "" then
|
|
36
|
+
error(`Invalid path: {path}`, 2)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
instance = instance:FindFirstChild(p)
|
|
40
|
+
|
|
41
|
+
-- Error if instance is not found:
|
|
42
|
+
if instance == nil then
|
|
43
|
+
error(`Failed to find {path} in {FullNameToPath(parent)}`, 2)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
-- Assert class type if argument is supplied:
|
|
48
|
+
if assertIsA and not instance:IsA(assertIsA) then
|
|
49
|
+
error(`Got class {instance.ClassName}; expected to be of type {assertIsA}`, 2)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
return instance
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
--[=[
|
|
56
|
+
Returns `true` if the instance is found. Similar to `Tree.Find`, except this returns `true|false`. No error is thrown unless the path is invalid.
|
|
57
|
+
|
|
58
|
+
```lua
|
|
59
|
+
-- Check if "Child" exists directly in `parent`:
|
|
60
|
+
if Tree.Exists(parent, "Child") then ... end
|
|
61
|
+
|
|
62
|
+
-- Check if "Child" descendant exists at `parent.Path.To.Child`:
|
|
63
|
+
if Tree.Exists(parent, "Path/To/Child") then ... end
|
|
64
|
+
|
|
65
|
+
-- Check if "Child" descendant exists at `parent.Path.To.Child` and is a BasePart:
|
|
66
|
+
if Tree.Exists(parent, "Path/To/Child", "BasePart") then ... end
|
|
67
|
+
```
|
|
68
|
+
]=]
|
|
69
|
+
function Tree.Exists(parent: Instance, path: string, assertIsA: string?): boolean
|
|
70
|
+
local instance = parent
|
|
71
|
+
local paths = path:split(DELIM)
|
|
72
|
+
|
|
73
|
+
for _, p in paths do
|
|
74
|
+
-- Error for empty path parts:
|
|
75
|
+
if p == "" then
|
|
76
|
+
error(`Invalid path: {path}`, 2)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
instance = instance:FindFirstChild(p)
|
|
80
|
+
|
|
81
|
+
if instance == nil then
|
|
82
|
+
return false
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
if assertIsA and not instance:IsA(assertIsA) then
|
|
87
|
+
return false
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
return true
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
--[=[
|
|
94
|
+
@yields
|
|
95
|
+
Waits for the path to exist within the parent instance. Similar to `Tree.Find`, except `WaitForChild`
|
|
96
|
+
is used internally. An optional `timeout` can be supplied, which is passed along to each call to
|
|
97
|
+
`WaitForChild`.
|
|
98
|
+
|
|
99
|
+
An error is thrown if the path fails to resolve. This will only happen if the path is invalid _or_ if
|
|
100
|
+
the supplied timeout is reached.
|
|
101
|
+
|
|
102
|
+
:::caution Indefinite Yield Possible
|
|
103
|
+
If the `timeout` parameter is not supplied, then the internal call to `WaitForChild` will yield
|
|
104
|
+
indefinitely until the child is found. It is good practice to supply a timeout parameter.
|
|
105
|
+
:::
|
|
106
|
+
|
|
107
|
+
```lua
|
|
108
|
+
local child = Tree.Await(parent, "Path/To/Child", 30)
|
|
109
|
+
```
|
|
110
|
+
]=]
|
|
111
|
+
function Tree.Await(parent: Instance, path: string, timeout: number?, assertIsA: string?): Instance
|
|
112
|
+
local instance = parent
|
|
113
|
+
local paths = path:split(DELIM)
|
|
114
|
+
|
|
115
|
+
for _, p in paths do
|
|
116
|
+
-- Error for empty path parts:
|
|
117
|
+
if p == "" then
|
|
118
|
+
error(`Invalid path: {path}`, 2)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
instance = instance:WaitForChild(p, timeout)
|
|
122
|
+
|
|
123
|
+
-- Error if instance is not found:
|
|
124
|
+
if instance == nil then
|
|
125
|
+
error(`Failed to await {path} in {FullNameToPath(parent)} (timeout reached)`, 2)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
-- Assert class type if argument is supplied:
|
|
130
|
+
if assertIsA and not instance:IsA(assertIsA) then
|
|
131
|
+
error(`Got class {instance.ClassName}; expected to be of type {assertIsA}`, 2)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
return instance
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
return Tree
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
name = "sleitnick/tree"
|
|
3
|
-
description = "Utility functions for accessing instances in the game hierarchy"
|
|
4
|
-
version = "1.1.0"
|
|
5
|
-
license = "MIT"
|
|
6
|
-
authors = ["Stephen Leitnick"]
|
|
7
|
-
registry = "https://github.com/UpliftGames/wally-index"
|
|
8
|
-
realm = "shared"
|
|
1
|
+
[package]
|
|
2
|
+
name = "sleitnick/tree"
|
|
3
|
+
description = "Utility functions for accessing instances in the game hierarchy"
|
|
4
|
+
version = "1.1.0"
|
|
5
|
+
license = "MIT"
|
|
6
|
+
authors = ["Stephen Leitnick"]
|
|
7
|
+
registry = "https://github.com/UpliftGames/wally-index"
|
|
8
|
+
realm = "shared"
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
interface ConnectionLike {
|
|
2
|
-
Disconnect(this: ConnectionLike): void;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
type Trackable =
|
|
6
|
-
| Instance
|
|
7
|
-
| RBXScriptConnection
|
|
8
|
-
| ConnectionLike
|
|
9
|
-
| Promise<unknown>
|
|
10
|
-
| thread
|
|
11
|
-
| ((...args: unknown[]) => unknown)
|
|
12
|
-
| { destroy: () => void }
|
|
13
|
-
| { disconnect: () => void }
|
|
14
|
-
| { Destroy: () => void }
|
|
15
|
-
| { Disconnect: () => void };
|
|
16
|
-
|
|
17
|
-
declare namespace Trove {
|
|
18
|
-
interface Constructor {
|
|
19
|
-
new (): Trove;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
interface Trove {
|
|
24
|
-
Extend(): Trove;
|
|
25
|
-
Clone<T extends Instance>(): T;
|
|
26
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
-
Construct<T extends { new (...args: any[]): InstanceType<T> }>(
|
|
28
|
-
cls: T,
|
|
29
|
-
...args: ConstructorParameters<T>
|
|
30
|
-
): InstanceType<T>;
|
|
31
|
-
Connect<T extends Callback = Callback>(signal: RBXScriptSignal<T>, fn: T): RBXScriptConnection;
|
|
32
|
-
Once<T extends Callback = Callback>(signal: RBXScriptSignal<T>, fn: T): RBXScriptConnection;
|
|
33
|
-
BindToRenderStep(name: string, priority: number, fn: (dt: number) => void): void;
|
|
34
|
-
AddPromise<T>(promise: Promise<T>): Promise<T>;
|
|
35
|
-
Add<T extends Trackable>(object: T, cleanupMethod?: string): T;
|
|
36
|
-
Remove<T extends Trackable>(object: T): boolean;
|
|
37
|
-
Pop<T extends Trackable>(object: T): boolean;
|
|
38
|
-
AttachToInstance(instance: Instance): RBXScriptConnection;
|
|
39
|
-
Clean(): void;
|
|
40
|
-
WrapClean(): () => void;
|
|
41
|
-
Destroy(): void;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
declare const Trove: Trove.Constructor;
|
|
45
|
-
|
|
46
|
-
export = Trove;
|
|
1
|
+
interface ConnectionLike {
|
|
2
|
+
Disconnect(this: ConnectionLike): void;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
type Trackable =
|
|
6
|
+
| Instance
|
|
7
|
+
| RBXScriptConnection
|
|
8
|
+
| ConnectionLike
|
|
9
|
+
| Promise<unknown>
|
|
10
|
+
| thread
|
|
11
|
+
| ((...args: unknown[]) => unknown)
|
|
12
|
+
| { destroy: () => void }
|
|
13
|
+
| { disconnect: () => void }
|
|
14
|
+
| { Destroy: () => void }
|
|
15
|
+
| { Disconnect: () => void };
|
|
16
|
+
|
|
17
|
+
declare namespace Trove {
|
|
18
|
+
interface Constructor {
|
|
19
|
+
new (): Trove;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface Trove {
|
|
24
|
+
Extend(): Trove;
|
|
25
|
+
Clone<T extends Instance>(): T;
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
Construct<T extends { new (...args: any[]): InstanceType<T> }>(
|
|
28
|
+
cls: T,
|
|
29
|
+
...args: ConstructorParameters<T>
|
|
30
|
+
): InstanceType<T>;
|
|
31
|
+
Connect<T extends Callback = Callback>(signal: RBXScriptSignal<T>, fn: T): RBXScriptConnection;
|
|
32
|
+
Once<T extends Callback = Callback>(signal: RBXScriptSignal<T>, fn: T): RBXScriptConnection;
|
|
33
|
+
BindToRenderStep(name: string, priority: number, fn: (dt: number) => void): void;
|
|
34
|
+
AddPromise<T>(promise: Promise<T>): Promise<T>;
|
|
35
|
+
Add<T extends Trackable>(object: T, cleanupMethod?: string): T;
|
|
36
|
+
Remove<T extends Trackable>(object: T): boolean;
|
|
37
|
+
Pop<T extends Trackable>(object: T): boolean;
|
|
38
|
+
AttachToInstance(instance: Instance): RBXScriptConnection;
|
|
39
|
+
Clean(): void;
|
|
40
|
+
WrapClean(): () => void;
|
|
41
|
+
Destroy(): void;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
declare const Trove: Trove.Constructor;
|
|
45
|
+
|
|
46
|
+
export = Trove;
|