@el4cteo/rbx-studio-mcp 0.7.0 → 0.7.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/dist/tools/input.js +9 -7
- package/dist/tools/input.js.map +1 -1
- package/package.json +1 -1
- package/plugin/src/Config.luau +1 -1
- package/plugin/src/handlers/Input.luau +43 -9
- package/plugin/src/init.server.luau +939 -883
package/dist/tools/input.js
CHANGED
|
@@ -73,9 +73,13 @@ export function registerInputTools(context) {
|
|
|
73
73
|
"events a person pressing the keys would produce.\n\n" +
|
|
74
74
|
"This is how to test what `character` cannot reach. `character` drives " +
|
|
75
75
|
"the Humanoid directly, which answers 'can it get to the door'; this " +
|
|
76
|
-
"answers 'does pressing E open it', 'does the sprint key work'
|
|
77
|
-
"
|
|
78
|
-
"
|
|
76
|
+
"answers 'does pressing E open it', 'does the sprint key work' — " +
|
|
77
|
+
"anything bound to input rather than to movement. Use `character` for " +
|
|
78
|
+
"going places and this for controls.\n\n" +
|
|
79
|
+
"Roblox reserves some keys for its own menus and refuses to send them — " +
|
|
80
|
+
"Escape, Tab, F9, and others depending on the place (One is the backpack " +
|
|
81
|
+
"hotbar). A refused key comes back as a WARNING naming it; the other steps " +
|
|
82
|
+
"still run.\n\n" +
|
|
79
83
|
"Steps run in order, so a sequence is one call: tap E, wait, click at a " +
|
|
80
84
|
"point, type a name. `hold` is how long a key or button stays down, " +
|
|
81
85
|
"`after` is how long to wait before the next step — a jump held for a " +
|
|
@@ -123,7 +127,7 @@ export function registerInputTools(context) {
|
|
|
123
127
|
key: z
|
|
124
128
|
.string()
|
|
125
129
|
.optional()
|
|
126
|
-
.describe('key only: an Enum.KeyCode name — "W", "Space", "E", "LeftShift"
|
|
130
|
+
.describe('key only: an Enum.KeyCode name — "W", "Space", "E", "LeftShift".'),
|
|
127
131
|
action: z
|
|
128
132
|
.enum(["tap", "press", "release"])
|
|
129
133
|
.optional()
|
|
@@ -218,9 +222,7 @@ export function registerInputTools(context) {
|
|
|
218
222
|
* it go at the front where they cannot be skimmed past.
|
|
219
223
|
*/
|
|
220
224
|
if (Array.isArray(response.notes)) {
|
|
221
|
-
|
|
222
|
-
parts.unshift(`WARNING: ${line}`);
|
|
223
|
-
}
|
|
225
|
+
parts.unshift(...response.notes.map((line) => `WARNING: ${line}`));
|
|
224
226
|
}
|
|
225
227
|
const note = parts.join(" ");
|
|
226
228
|
return json(response, note);
|
package/dist/tools/input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/tools/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAoB,MAAM,gBAAgB,CAAC;AAqB9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,SAAS,WAAW,CAAC,MAA4C;IAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,iCAAiC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,4EAA4E,CAAC;IACtJ,CAAC;IACD;;;;;;;;;;;;;OAaG;IACH,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACb,OAAO,CACL,cAAc,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,6BAA6B,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;YAC/G,mBAAmB,CAAC,EAAE,6GAA6G;YACnI,oIAAoI,CACrI,CAAC;IACJ,CAAC;IACD,OAAO,CACL,yCAAyC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;QACpI,WAAW,EAAE,KAAK,EAAE,sEAAsE;QAC1F,2IAA2I;QAC3I,uEAAuE,CACxE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAoB;IACrD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,UAAU,CACR,OAAO,EACP;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,+BAA+B;QACtC,WAAW,EACT,uEAAuE;YACvE,sDAAsD;YACtD,wEAAwE;YACxE,sEAAsE;YACtE,uEAAuE;YACvE,
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/tools/input.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/plugin/src/Config.luau
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
local Config = {}
|
|
11
11
|
|
|
12
|
-
Config.PLUGIN_VERSION = "0.7.
|
|
12
|
+
Config.PLUGIN_VERSION = "0.7.1"
|
|
13
13
|
|
|
14
14
|
-- Fingerprint of plugin/src, stamped in by scripts/build-plugin.mjs. The server
|
|
15
15
|
-- computes the same hash from its own copy of the sources and compares, so a
|
|
@@ -301,18 +301,42 @@ end
|
|
|
301
301
|
|
|
302
302
|
makeCursor()
|
|
303
303
|
|
|
304
|
-
|
|
304
|
+
--[[
|
|
305
|
+
Some keys cannot be sent at all. Roblox keeps them for its own menus --
|
|
306
|
+
Escape, Tab, F9, and in this place's case also One -- and `SendKey` THROWS
|
|
307
|
+
for them ("permanently bound to a CoreGUI core action"). Uncaught, that
|
|
308
|
+
killed this script mid-plan: the rest of the steps never ran, nothing was
|
|
309
|
+
reported, and the tool gave up with NO_ACK after its full timeout while the
|
|
310
|
+
error sat in Studio's Output. Which keys are reserved depends on the place
|
|
311
|
+
(One is the backpack hotbar), so it is caught here rather than listed.
|
|
312
|
+
]]
|
|
313
|
+
local function refusedKey(key, err)
|
|
314
|
+
local message = tostring(err)
|
|
315
|
+
if string.find(message, "CoreGUI", 1, true) then
|
|
316
|
+
return string.format(
|
|
317
|
+
"%s was not sent: Roblox reserves it for its own menus, so no script can press it. "
|
|
318
|
+
.. "Test what the game does on that key by calling its handler another way.",
|
|
319
|
+
key
|
|
320
|
+
)
|
|
321
|
+
end
|
|
322
|
+
return string.format("%s was not sent: %s", key, message)
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
local function runStep(step): boolean
|
|
305
326
|
local kind = step.kind
|
|
306
327
|
if kind == "key" then
|
|
307
328
|
local code = Enum.KeyCode[step.key]
|
|
308
|
-
|
|
329
|
+
local down = step.action ~= "release"
|
|
330
|
+
local sent, err = pcall(function()
|
|
331
|
+
virtual:SendKey(down, code, false)
|
|
332
|
+
end)
|
|
333
|
+
if not sent then
|
|
334
|
+
table.insert(notes, refusedKey(step.key, err))
|
|
335
|
+
return false
|
|
336
|
+
end
|
|
337
|
+
if down and step.action ~= "press" then
|
|
338
|
+
task.wait(step.hold or 0.08)
|
|
309
339
|
virtual:SendKey(false, code, false)
|
|
310
|
-
else
|
|
311
|
-
virtual:SendKey(true, code, false)
|
|
312
|
-
if step.action ~= "press" then
|
|
313
|
-
task.wait(step.hold or 0.08)
|
|
314
|
-
virtual:SendKey(false, code, false)
|
|
315
|
-
end
|
|
316
340
|
end
|
|
317
341
|
elseif kind == "move" then
|
|
318
342
|
moveCursor(step.x, step.y, 0.3)
|
|
@@ -364,7 +388,17 @@ for _, step in plan do
|
|
|
364
388
|
virtual:SendTextInput(step.text)
|
|
365
389
|
end
|
|
366
390
|
end
|
|
367
|
-
|
|
391
|
+
return true
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
for index, step in plan do
|
|
395
|
+
-- Guarded so one failing step can never stop the report going back.
|
|
396
|
+
local ok, done = pcall(runStep, step)
|
|
397
|
+
if not ok then
|
|
398
|
+
table.insert(notes, string.format("step %d (%s) failed: %s", index - 1, tostring(step.kind), tostring(done)))
|
|
399
|
+
elseif done then
|
|
400
|
+
table.insert(performed, step.kind)
|
|
401
|
+
end
|
|
368
402
|
if step.after ~= nil and step.after > 0 then
|
|
369
403
|
task.wait(step.after)
|
|
370
404
|
end
|