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,278 +1,278 @@
|
|
|
1
|
-
-- Mouse
|
|
2
|
-
-- Stephen Leitnick
|
|
3
|
-
-- November 07, 2020
|
|
4
|
-
|
|
5
|
-
local Signal = require(script.Parent.Parent.Signal)
|
|
6
|
-
local Trove = require(script.Parent.Parent.Trove)
|
|
7
|
-
|
|
8
|
-
local UserInputService = game:GetService("UserInputService")
|
|
9
|
-
|
|
10
|
-
local RAY_DISTANCE = 1000
|
|
11
|
-
|
|
12
|
-
--[=[
|
|
13
|
-
@class Mouse
|
|
14
|
-
@client
|
|
15
|
-
|
|
16
|
-
The Mouse class is part of the Input package.
|
|
17
|
-
|
|
18
|
-
```lua
|
|
19
|
-
local Mouse = require(packages.Input).Mouse
|
|
20
|
-
```
|
|
21
|
-
]=]
|
|
22
|
-
local Mouse = {}
|
|
23
|
-
Mouse.__index = Mouse
|
|
24
|
-
|
|
25
|
-
--[=[
|
|
26
|
-
@within Mouse
|
|
27
|
-
@prop LeftDown Signal<boolean>
|
|
28
|
-
@tag Event
|
|
29
|
-
]=]
|
|
30
|
-
--[=[
|
|
31
|
-
@within Mouse
|
|
32
|
-
@prop LeftUp Signal<boolean>
|
|
33
|
-
@tag Event
|
|
34
|
-
]=]
|
|
35
|
-
--[=[
|
|
36
|
-
@within Mouse
|
|
37
|
-
@prop RightDown Signal<boolean>
|
|
38
|
-
@tag Event
|
|
39
|
-
]=]
|
|
40
|
-
--[=[
|
|
41
|
-
@within Mouse
|
|
42
|
-
@prop RightUp Signal<boolean>
|
|
43
|
-
@tag Event
|
|
44
|
-
]=]
|
|
45
|
-
--[=[
|
|
46
|
-
@within Mouse
|
|
47
|
-
@prop MiddleDown Signal<boolean>
|
|
48
|
-
@tag Event
|
|
49
|
-
]=]
|
|
50
|
-
--[=[
|
|
51
|
-
@within Mouse
|
|
52
|
-
@prop MiddleUp Signal<boolean>
|
|
53
|
-
@tag Event
|
|
54
|
-
]=]
|
|
55
|
-
--[=[
|
|
56
|
-
@within Mouse
|
|
57
|
-
@prop Moved Signal<Vector2, boolean>
|
|
58
|
-
@tag Event
|
|
59
|
-
```lua
|
|
60
|
-
mouse.Moved:Connect(function(position, processed) ... end)
|
|
61
|
-
```
|
|
62
|
-
]=]
|
|
63
|
-
--[=[
|
|
64
|
-
@within Mouse
|
|
65
|
-
@prop Scrolled Signal<number, boolean>
|
|
66
|
-
@tag Event
|
|
67
|
-
```lua
|
|
68
|
-
mouse.Scrolled:Connect(function(scrollAmount, processed) ... end)
|
|
69
|
-
```
|
|
70
|
-
]=]
|
|
71
|
-
|
|
72
|
-
--[=[
|
|
73
|
-
@return Mouse
|
|
74
|
-
|
|
75
|
-
Constructs a new mouse input capturer.
|
|
76
|
-
|
|
77
|
-
```lua
|
|
78
|
-
local mouse = Mouse.new()
|
|
79
|
-
```
|
|
80
|
-
]=]
|
|
81
|
-
function Mouse.new()
|
|
82
|
-
local self = setmetatable({}, Mouse)
|
|
83
|
-
|
|
84
|
-
self._trove = Trove.new()
|
|
85
|
-
|
|
86
|
-
self.LeftDown = self._trove:Construct(Signal)
|
|
87
|
-
self.LeftUp = self._trove:Construct(Signal)
|
|
88
|
-
self.RightDown = self._trove:Construct(Signal)
|
|
89
|
-
self.RightUp = self._trove:Construct(Signal)
|
|
90
|
-
self.MiddleDown = self._trove:Construct(Signal)
|
|
91
|
-
self.MiddleUp = self._trove:Construct(Signal)
|
|
92
|
-
self.Scrolled = self._trove:Construct(Signal)
|
|
93
|
-
self.Moved = self._trove:Construct(Signal)
|
|
94
|
-
|
|
95
|
-
self._trove:Connect(UserInputService.InputBegan, function(input, processed)
|
|
96
|
-
if input.UserInputType == Enum.UserInputType.MouseButton1 then
|
|
97
|
-
self.LeftDown:Fire(processed)
|
|
98
|
-
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
|
|
99
|
-
self.RightDown:Fire(processed)
|
|
100
|
-
elseif input.UserInputType == Enum.UserInputType.MouseButton3 then
|
|
101
|
-
self.MiddleDown:Fire(processed)
|
|
102
|
-
end
|
|
103
|
-
end)
|
|
104
|
-
|
|
105
|
-
self._trove:Connect(UserInputService.InputEnded, function(input, processed)
|
|
106
|
-
if input.UserInputType == Enum.UserInputType.MouseButton1 then
|
|
107
|
-
self.LeftUp:Fire(processed)
|
|
108
|
-
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
|
|
109
|
-
self.RightUp:Fire(processed)
|
|
110
|
-
elseif input.UserInputType == Enum.UserInputType.MouseButton3 then
|
|
111
|
-
self.MiddleUp:Fire(processed)
|
|
112
|
-
end
|
|
113
|
-
end)
|
|
114
|
-
|
|
115
|
-
self._trove:Connect(UserInputService.InputChanged, function(input, processed)
|
|
116
|
-
if input.UserInputType == Enum.UserInputType.MouseMovement then
|
|
117
|
-
local position = input.Position
|
|
118
|
-
self.Moved:Fire(Vector2.new(position.X, position.Y), processed)
|
|
119
|
-
elseif input.UserInputType == Enum.UserInputType.MouseWheel then
|
|
120
|
-
self.Scrolled:Fire(input.Position.Z, processed)
|
|
121
|
-
end
|
|
122
|
-
end)
|
|
123
|
-
|
|
124
|
-
return self
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
--[=[
|
|
128
|
-
Checks if the left mouse button is down.
|
|
129
|
-
]=]
|
|
130
|
-
function Mouse:IsLeftDown(): boolean
|
|
131
|
-
return UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
--[=[
|
|
135
|
-
Checks if the right mouse button is down.
|
|
136
|
-
]=]
|
|
137
|
-
function Mouse:IsRightDown(): boolean
|
|
138
|
-
return UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton2)
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
--[=[
|
|
142
|
-
Checks if the middle mouse button is down.
|
|
143
|
-
]=]
|
|
144
|
-
function Mouse:IsMiddleDown(): boolean
|
|
145
|
-
return UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton3)
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
--[=[
|
|
149
|
-
Gets the screen position of the mouse.
|
|
150
|
-
]=]
|
|
151
|
-
function Mouse:GetPosition(): Vector2
|
|
152
|
-
return UserInputService:GetMouseLocation()
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
--[=[
|
|
156
|
-
Gets the delta screen position of the mouse. In other words, the
|
|
157
|
-
distance the mouse has traveled away from its locked position in
|
|
158
|
-
a given frame (see note about mouse locking below).
|
|
159
|
-
|
|
160
|
-
:::info Only When Mouse Locked
|
|
161
|
-
Getting the mouse delta is only intended for when the mouse is locked. If the
|
|
162
|
-
mouse is _not_ locked, this will return a zero Vector2. The mouse can be locked
|
|
163
|
-
using the `mouse:Lock()` and `mouse:LockCenter()` method.
|
|
164
|
-
:::
|
|
165
|
-
]=]
|
|
166
|
-
function Mouse:GetDelta(): Vector2
|
|
167
|
-
return UserInputService:GetMouseDelta()
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
--[=[
|
|
171
|
-
Returns the viewport point ray for the mouse at the current mouse
|
|
172
|
-
position (or the override position if provided).
|
|
173
|
-
]=]
|
|
174
|
-
function Mouse:GetRay(overridePos: Vector2?): Ray
|
|
175
|
-
local mousePos = overridePos or UserInputService:GetMouseLocation()
|
|
176
|
-
local viewportMouseRay = workspace.CurrentCamera:ViewportPointToRay(mousePos.X, mousePos.Y)
|
|
177
|
-
return viewportMouseRay
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
--[=[
|
|
181
|
-
Performs a raycast operation out from the mouse position (or the
|
|
182
|
-
`overridePos` if provided) into world space. The ray will go
|
|
183
|
-
`distance` studs forward (or 1000 studs if not provided).
|
|
184
|
-
|
|
185
|
-
Returns the `RaycastResult` if something was hit, else returns `nil`.
|
|
186
|
-
|
|
187
|
-
Use `Raycast` if it is important to capture any objects that could be
|
|
188
|
-
hit along the projected ray. If objects can be ignored and only the
|
|
189
|
-
final position of the ray is needed, use `Project` instead.
|
|
190
|
-
|
|
191
|
-
```lua
|
|
192
|
-
local params = RaycastParams.new()
|
|
193
|
-
local result = mouse:Raycast(params)
|
|
194
|
-
if result then
|
|
195
|
-
print(result.Instance)
|
|
196
|
-
else
|
|
197
|
-
print("Mouse raycast did not hit anything")
|
|
198
|
-
end
|
|
199
|
-
```
|
|
200
|
-
]=]
|
|
201
|
-
function Mouse:Raycast(raycastParams: RaycastParams, distance: number?, overridePos: Vector2?): RaycastResult?
|
|
202
|
-
local viewportMouseRay = self:GetRay(overridePos)
|
|
203
|
-
local result = workspace:Raycast(
|
|
204
|
-
viewportMouseRay.Origin,
|
|
205
|
-
viewportMouseRay.Direction * (distance or RAY_DISTANCE),
|
|
206
|
-
raycastParams
|
|
207
|
-
)
|
|
208
|
-
return result
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
--[=[
|
|
212
|
-
Gets the 3D world position of the mouse when projected forward. This would be the
|
|
213
|
-
end-position of a raycast if nothing was hit. Similar to `Raycast`, optional
|
|
214
|
-
`distance` and `overridePos` arguments are allowed.
|
|
215
|
-
|
|
216
|
-
Use `Project` if you want to get the 3D world position of the mouse at a given
|
|
217
|
-
distance but don't care about any objects that could be in the way. It is much
|
|
218
|
-
faster to project a position into 3D space than to do a full raycast operation.
|
|
219
|
-
|
|
220
|
-
```lua
|
|
221
|
-
local params = RaycastParams.new()
|
|
222
|
-
local distance = 200
|
|
223
|
-
|
|
224
|
-
local result = mouse:Raycast(params, distance)
|
|
225
|
-
if result then
|
|
226
|
-
-- Do something with result
|
|
227
|
-
else
|
|
228
|
-
-- Raycast failed, but still get the world position of the mouse:
|
|
229
|
-
local worldPosition = mouse:Project(distance)
|
|
230
|
-
end
|
|
231
|
-
```
|
|
232
|
-
]=]
|
|
233
|
-
function Mouse:Project(distance: number?, overridePos: Vector2?): Vector3
|
|
234
|
-
local viewportMouseRay = self:GetRay(overridePos)
|
|
235
|
-
return viewportMouseRay.Origin + (viewportMouseRay.Direction.Unit * (distance or RAY_DISTANCE))
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
--[=[
|
|
239
|
-
Locks the mouse in its current position on screen. Call `mouse:Unlock()`
|
|
240
|
-
to unlock the mouse.
|
|
241
|
-
|
|
242
|
-
:::caution Must explicitly unlock
|
|
243
|
-
Be sure to explicitly call `mouse:Unlock()` before cleaning up the mouse.
|
|
244
|
-
The `Destroy` method does _not_ unlock the mouse since there is no way
|
|
245
|
-
to guarantee who "owns" the mouse lock.
|
|
246
|
-
:::
|
|
247
|
-
]=]
|
|
248
|
-
function Mouse:Lock()
|
|
249
|
-
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
--[=[
|
|
253
|
-
Locks the mouse in the center of the screen. Call `mouse:Unlock()`
|
|
254
|
-
to unlock the mouse.
|
|
255
|
-
|
|
256
|
-
:::caution Must explicitly unlock
|
|
257
|
-
See cautionary in `Lock` method above.
|
|
258
|
-
:::
|
|
259
|
-
]=]
|
|
260
|
-
function Mouse:LockCenter()
|
|
261
|
-
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
--[=[
|
|
265
|
-
Unlocks the mouse.
|
|
266
|
-
]=]
|
|
267
|
-
function Mouse:Unlock()
|
|
268
|
-
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
--[=[
|
|
272
|
-
Destroys the mouse.
|
|
273
|
-
]=]
|
|
274
|
-
function Mouse:Destroy()
|
|
275
|
-
self._trove:Destroy()
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
return Mouse
|
|
1
|
+
-- Mouse
|
|
2
|
+
-- Stephen Leitnick
|
|
3
|
+
-- November 07, 2020
|
|
4
|
+
|
|
5
|
+
local Signal = require(script.Parent.Parent.Signal)
|
|
6
|
+
local Trove = require(script.Parent.Parent.Trove)
|
|
7
|
+
|
|
8
|
+
local UserInputService = game:GetService("UserInputService")
|
|
9
|
+
|
|
10
|
+
local RAY_DISTANCE = 1000
|
|
11
|
+
|
|
12
|
+
--[=[
|
|
13
|
+
@class Mouse
|
|
14
|
+
@client
|
|
15
|
+
|
|
16
|
+
The Mouse class is part of the Input package.
|
|
17
|
+
|
|
18
|
+
```lua
|
|
19
|
+
local Mouse = require(packages.Input).Mouse
|
|
20
|
+
```
|
|
21
|
+
]=]
|
|
22
|
+
local Mouse = {}
|
|
23
|
+
Mouse.__index = Mouse
|
|
24
|
+
|
|
25
|
+
--[=[
|
|
26
|
+
@within Mouse
|
|
27
|
+
@prop LeftDown Signal<boolean>
|
|
28
|
+
@tag Event
|
|
29
|
+
]=]
|
|
30
|
+
--[=[
|
|
31
|
+
@within Mouse
|
|
32
|
+
@prop LeftUp Signal<boolean>
|
|
33
|
+
@tag Event
|
|
34
|
+
]=]
|
|
35
|
+
--[=[
|
|
36
|
+
@within Mouse
|
|
37
|
+
@prop RightDown Signal<boolean>
|
|
38
|
+
@tag Event
|
|
39
|
+
]=]
|
|
40
|
+
--[=[
|
|
41
|
+
@within Mouse
|
|
42
|
+
@prop RightUp Signal<boolean>
|
|
43
|
+
@tag Event
|
|
44
|
+
]=]
|
|
45
|
+
--[=[
|
|
46
|
+
@within Mouse
|
|
47
|
+
@prop MiddleDown Signal<boolean>
|
|
48
|
+
@tag Event
|
|
49
|
+
]=]
|
|
50
|
+
--[=[
|
|
51
|
+
@within Mouse
|
|
52
|
+
@prop MiddleUp Signal<boolean>
|
|
53
|
+
@tag Event
|
|
54
|
+
]=]
|
|
55
|
+
--[=[
|
|
56
|
+
@within Mouse
|
|
57
|
+
@prop Moved Signal<Vector2, boolean>
|
|
58
|
+
@tag Event
|
|
59
|
+
```lua
|
|
60
|
+
mouse.Moved:Connect(function(position, processed) ... end)
|
|
61
|
+
```
|
|
62
|
+
]=]
|
|
63
|
+
--[=[
|
|
64
|
+
@within Mouse
|
|
65
|
+
@prop Scrolled Signal<number, boolean>
|
|
66
|
+
@tag Event
|
|
67
|
+
```lua
|
|
68
|
+
mouse.Scrolled:Connect(function(scrollAmount, processed) ... end)
|
|
69
|
+
```
|
|
70
|
+
]=]
|
|
71
|
+
|
|
72
|
+
--[=[
|
|
73
|
+
@return Mouse
|
|
74
|
+
|
|
75
|
+
Constructs a new mouse input capturer.
|
|
76
|
+
|
|
77
|
+
```lua
|
|
78
|
+
local mouse = Mouse.new()
|
|
79
|
+
```
|
|
80
|
+
]=]
|
|
81
|
+
function Mouse.new()
|
|
82
|
+
local self = setmetatable({}, Mouse)
|
|
83
|
+
|
|
84
|
+
self._trove = Trove.new()
|
|
85
|
+
|
|
86
|
+
self.LeftDown = self._trove:Construct(Signal)
|
|
87
|
+
self.LeftUp = self._trove:Construct(Signal)
|
|
88
|
+
self.RightDown = self._trove:Construct(Signal)
|
|
89
|
+
self.RightUp = self._trove:Construct(Signal)
|
|
90
|
+
self.MiddleDown = self._trove:Construct(Signal)
|
|
91
|
+
self.MiddleUp = self._trove:Construct(Signal)
|
|
92
|
+
self.Scrolled = self._trove:Construct(Signal)
|
|
93
|
+
self.Moved = self._trove:Construct(Signal)
|
|
94
|
+
|
|
95
|
+
self._trove:Connect(UserInputService.InputBegan, function(input, processed)
|
|
96
|
+
if input.UserInputType == Enum.UserInputType.MouseButton1 then
|
|
97
|
+
self.LeftDown:Fire(processed)
|
|
98
|
+
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
|
|
99
|
+
self.RightDown:Fire(processed)
|
|
100
|
+
elseif input.UserInputType == Enum.UserInputType.MouseButton3 then
|
|
101
|
+
self.MiddleDown:Fire(processed)
|
|
102
|
+
end
|
|
103
|
+
end)
|
|
104
|
+
|
|
105
|
+
self._trove:Connect(UserInputService.InputEnded, function(input, processed)
|
|
106
|
+
if input.UserInputType == Enum.UserInputType.MouseButton1 then
|
|
107
|
+
self.LeftUp:Fire(processed)
|
|
108
|
+
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
|
|
109
|
+
self.RightUp:Fire(processed)
|
|
110
|
+
elseif input.UserInputType == Enum.UserInputType.MouseButton3 then
|
|
111
|
+
self.MiddleUp:Fire(processed)
|
|
112
|
+
end
|
|
113
|
+
end)
|
|
114
|
+
|
|
115
|
+
self._trove:Connect(UserInputService.InputChanged, function(input, processed)
|
|
116
|
+
if input.UserInputType == Enum.UserInputType.MouseMovement then
|
|
117
|
+
local position = input.Position
|
|
118
|
+
self.Moved:Fire(Vector2.new(position.X, position.Y), processed)
|
|
119
|
+
elseif input.UserInputType == Enum.UserInputType.MouseWheel then
|
|
120
|
+
self.Scrolled:Fire(input.Position.Z, processed)
|
|
121
|
+
end
|
|
122
|
+
end)
|
|
123
|
+
|
|
124
|
+
return self
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
--[=[
|
|
128
|
+
Checks if the left mouse button is down.
|
|
129
|
+
]=]
|
|
130
|
+
function Mouse:IsLeftDown(): boolean
|
|
131
|
+
return UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
--[=[
|
|
135
|
+
Checks if the right mouse button is down.
|
|
136
|
+
]=]
|
|
137
|
+
function Mouse:IsRightDown(): boolean
|
|
138
|
+
return UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton2)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
--[=[
|
|
142
|
+
Checks if the middle mouse button is down.
|
|
143
|
+
]=]
|
|
144
|
+
function Mouse:IsMiddleDown(): boolean
|
|
145
|
+
return UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton3)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
--[=[
|
|
149
|
+
Gets the screen position of the mouse.
|
|
150
|
+
]=]
|
|
151
|
+
function Mouse:GetPosition(): Vector2
|
|
152
|
+
return UserInputService:GetMouseLocation()
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
--[=[
|
|
156
|
+
Gets the delta screen position of the mouse. In other words, the
|
|
157
|
+
distance the mouse has traveled away from its locked position in
|
|
158
|
+
a given frame (see note about mouse locking below).
|
|
159
|
+
|
|
160
|
+
:::info Only When Mouse Locked
|
|
161
|
+
Getting the mouse delta is only intended for when the mouse is locked. If the
|
|
162
|
+
mouse is _not_ locked, this will return a zero Vector2. The mouse can be locked
|
|
163
|
+
using the `mouse:Lock()` and `mouse:LockCenter()` method.
|
|
164
|
+
:::
|
|
165
|
+
]=]
|
|
166
|
+
function Mouse:GetDelta(): Vector2
|
|
167
|
+
return UserInputService:GetMouseDelta()
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
--[=[
|
|
171
|
+
Returns the viewport point ray for the mouse at the current mouse
|
|
172
|
+
position (or the override position if provided).
|
|
173
|
+
]=]
|
|
174
|
+
function Mouse:GetRay(overridePos: Vector2?): Ray
|
|
175
|
+
local mousePos = overridePos or UserInputService:GetMouseLocation()
|
|
176
|
+
local viewportMouseRay = workspace.CurrentCamera:ViewportPointToRay(mousePos.X, mousePos.Y)
|
|
177
|
+
return viewportMouseRay
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
--[=[
|
|
181
|
+
Performs a raycast operation out from the mouse position (or the
|
|
182
|
+
`overridePos` if provided) into world space. The ray will go
|
|
183
|
+
`distance` studs forward (or 1000 studs if not provided).
|
|
184
|
+
|
|
185
|
+
Returns the `RaycastResult` if something was hit, else returns `nil`.
|
|
186
|
+
|
|
187
|
+
Use `Raycast` if it is important to capture any objects that could be
|
|
188
|
+
hit along the projected ray. If objects can be ignored and only the
|
|
189
|
+
final position of the ray is needed, use `Project` instead.
|
|
190
|
+
|
|
191
|
+
```lua
|
|
192
|
+
local params = RaycastParams.new()
|
|
193
|
+
local result = mouse:Raycast(params)
|
|
194
|
+
if result then
|
|
195
|
+
print(result.Instance)
|
|
196
|
+
else
|
|
197
|
+
print("Mouse raycast did not hit anything")
|
|
198
|
+
end
|
|
199
|
+
```
|
|
200
|
+
]=]
|
|
201
|
+
function Mouse:Raycast(raycastParams: RaycastParams, distance: number?, overridePos: Vector2?): RaycastResult?
|
|
202
|
+
local viewportMouseRay = self:GetRay(overridePos)
|
|
203
|
+
local result = workspace:Raycast(
|
|
204
|
+
viewportMouseRay.Origin,
|
|
205
|
+
viewportMouseRay.Direction * (distance or RAY_DISTANCE),
|
|
206
|
+
raycastParams
|
|
207
|
+
)
|
|
208
|
+
return result
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
--[=[
|
|
212
|
+
Gets the 3D world position of the mouse when projected forward. This would be the
|
|
213
|
+
end-position of a raycast if nothing was hit. Similar to `Raycast`, optional
|
|
214
|
+
`distance` and `overridePos` arguments are allowed.
|
|
215
|
+
|
|
216
|
+
Use `Project` if you want to get the 3D world position of the mouse at a given
|
|
217
|
+
distance but don't care about any objects that could be in the way. It is much
|
|
218
|
+
faster to project a position into 3D space than to do a full raycast operation.
|
|
219
|
+
|
|
220
|
+
```lua
|
|
221
|
+
local params = RaycastParams.new()
|
|
222
|
+
local distance = 200
|
|
223
|
+
|
|
224
|
+
local result = mouse:Raycast(params, distance)
|
|
225
|
+
if result then
|
|
226
|
+
-- Do something with result
|
|
227
|
+
else
|
|
228
|
+
-- Raycast failed, but still get the world position of the mouse:
|
|
229
|
+
local worldPosition = mouse:Project(distance)
|
|
230
|
+
end
|
|
231
|
+
```
|
|
232
|
+
]=]
|
|
233
|
+
function Mouse:Project(distance: number?, overridePos: Vector2?): Vector3
|
|
234
|
+
local viewportMouseRay = self:GetRay(overridePos)
|
|
235
|
+
return viewportMouseRay.Origin + (viewportMouseRay.Direction.Unit * (distance or RAY_DISTANCE))
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
--[=[
|
|
239
|
+
Locks the mouse in its current position on screen. Call `mouse:Unlock()`
|
|
240
|
+
to unlock the mouse.
|
|
241
|
+
|
|
242
|
+
:::caution Must explicitly unlock
|
|
243
|
+
Be sure to explicitly call `mouse:Unlock()` before cleaning up the mouse.
|
|
244
|
+
The `Destroy` method does _not_ unlock the mouse since there is no way
|
|
245
|
+
to guarantee who "owns" the mouse lock.
|
|
246
|
+
:::
|
|
247
|
+
]=]
|
|
248
|
+
function Mouse:Lock()
|
|
249
|
+
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
--[=[
|
|
253
|
+
Locks the mouse in the center of the screen. Call `mouse:Unlock()`
|
|
254
|
+
to unlock the mouse.
|
|
255
|
+
|
|
256
|
+
:::caution Must explicitly unlock
|
|
257
|
+
See cautionary in `Lock` method above.
|
|
258
|
+
:::
|
|
259
|
+
]=]
|
|
260
|
+
function Mouse:LockCenter()
|
|
261
|
+
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
--[=[
|
|
265
|
+
Unlocks the mouse.
|
|
266
|
+
]=]
|
|
267
|
+
function Mouse:Unlock()
|
|
268
|
+
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
--[=[
|
|
272
|
+
Destroys the mouse.
|
|
273
|
+
]=]
|
|
274
|
+
function Mouse:Destroy()
|
|
275
|
+
self._trove:Destroy()
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
return Mouse
|