Перейти к основному содержанию
Эта страница находится в разработке! Некоторая информация может быть неполной или устаревшей.
Toolshed — один из трёх основных встроенных отладочных инструментов (наряду с scsi и View Variables) для RobustToolbox, функционирующий как консоль разработки игры. Чтобы использовать Toolshed, откройте отладочную консоль или используйте отладочную консоль в devwindow.
Toolshed пока недоступен на клиенте, поэтому вам нужно использовать префиксную команду > на клиенте, чтобы выполнять команды на стороне сервера. Пропуск этого префикса часто приводит к ошибке о том, что у вас нет разрешения на выполнение команды, даже если на самом деле это не так.
Toolshed — это pipeline shell, и основной способ выполнения сложных действий — композиция команд. Вы можете просто написать несколько команд одну за другой, и, пока они совместимы, их входные данные будут последовательно передаваться друг другу. Для тех, кто знаком с оболочками вроде bash, это обычно делается с помощью явного символа pipe |. Однако в Toolshed оператор pipe является опциональным. Например, возьмём следующий command run:
entities with Item count
который также можно записать с явными операторами pipe:
entities | with Item | count
Это три команды: entities, with и count. Вместе они образуют command run, набор последовательных команд. В данном случае их совместный эффект — возврат общего количества сущностей, имеющих ItemComponent.
Для удобства некоторые примеры, используемые в документации, могут использовать типы или команды, специфичные для SS14 (например, ItemComponent), хотя Toolshed является частью RobustToolbox и не привязан к SS14.

Subcommands

Некоторые команды сгруппированы в «команду» с «подкомандами». Это просто наборы связанных команд, имена которых состоят из двух частей, разделённых двоеточием: имени команды и имени подкоманды. Например, есть команды для добавления, удаления, обеспечения и проверки компонентов, и все они сгруппированы как часть команды «comp»:
  • comp:get
  • comp:has
  • comp:add
  • comp:rm
  • comp:ensure
В настоящее время это в основном организационное соглашение. Для пользователей подкоманды ведут себя как обычные команды. Они не имеют особых отношений друг с другом, и самой команды «comp» на самом деле не существует.

Help

Команда help может использоваться для отображения описания и общих сигнатур команд. Например:
> help count

count - Counts the amount of entries in it's input, returning an integer.
Usage:
  <input (IEnumerable<T>)> → count → Int32
Блок usage показывает синтаксис для всех реализаций этой команды. В данном случае есть только одна. Синтаксис usage состоит из максимум трёх частей для каждой реализации:
  • Имя и тип входного аргумента pipe. Здесь это часть <input (IEnumerable<T>)> → . Опускается, если нет pipe-входа.
  • Сама команда, с любыми префиксами и аргументами. Поскольку у команды count нет аргументов, здесь это просто count.
  • Тип вывода, который может быть передан в другие команды через pipe. Здесь это часть → Int32. Опускается, если команда ничего не возвращает.
Синтаксис pipe-аргументов и аргументов команды: <Name (Type)>, где имя и тип аргумента берутся из метода C#, связанного с этой командой. Если аргумент команды опционален, используются квадратные скобки (т.е. [Name (Type)]). Некоторые команды также принимают бесконечно повторяемые аргументы, которые обозначаются многоточием (т.е. [Name (Type)]...). Такие аргументы всегда будут последними, и это означает, что команду нужно завершить явным pipe |, если вы хотите передать вывод команды в другую команду. Для более сложного примера давайте рассмотрим команду with, которая использовалась в предыдущем разделе. Она может принимать либо сущность, либо прототип сущности, поэтому у неё есть несколько реализаций. Она также требует один аргумент и поддерживает префиксы:
> help with

with - Filters the input entities by whether or not they have the given component.
The behaviour of this command can be inverted using the "not" prefix.
Usage:
  <input (IEnumerable<EntityUid>)> → [not] with <component (Type)> → IEnumerable<EntityUid>
  <input (IEnumerable<EntityPrototype>)> → [not] with <component (Type)> → IEnumerable<EntityPrototype>
  <input (IEnumerable<ProtoId<T>>)> → [not] with <protoId (ProtoId<T>)> → IEnumerable<ProtoId<T>>
Обратите внимание, что в целом каждая реализация может иметь разное количество и типы аргументов, хотя в данном случае у каждой реализации ровно один аргумент. Как объясняется в выводе help выше, команде with можно дать опциональный префикс «not», чтобы инвертировать её поведение. Итак, если бы мы хотели получить количество всех сущностей, не имеющих компонента item, мы могли бы использовать entities not with Item count. Если команда поддерживает префиксы, на странице help должно быть об этом сказано.

Имена аргументов

Имя аргумента в синтаксисе команды также может помочь разрешить некоторые неоднозначности относительно порядка, в котором аргументы должны быть указаны. Например, команда tp:to телепортирует одну сущность к другой. Если вы не уверены, является ли целевая сущность входом pipe или первым аргументом, вы можете проверить имя аргумента, выводимое командой help.
> help tp:to

tp:to - Teleports the given entities to the target entity.
Usage:
  <teleporter (EntityUid)> → tp:to <target (EntityUid)> → EntityUid
  <teleporters (IEnumerable<EntityUid>)> → tp:to <target (EntityUid)> → IEnumerable<EntityUid> 
Обратите внимание, что использование имён аргументов C# для автогенерации строк справки — относительно новая функция, и у некоторых команд аргументы могут быть плохо названы.

Explain

Вы можете использовать команду explain для получения информации о потоке command run. Настоятельно рекомендуется explain command runs, которые вы не понимаете, чтобы получить представление об их потоке. Она разобьёт любой допустимый command run на составляющие команды и для каждой команды предоставит:
  • Краткое описание команды
  • Конкретные типы ввода и вывода в контексте данного command run
  • Сигнатуру команды, включая имя и тип всех разобранных аргументов.
Обратите внимание, что команда explain работает только с допустимыми командами. Она не может быть использована для диагностики недопустимых команд. Если вы не уверены, как использовать команду, возможно, используйте команду help.
Сгенерированное объяснение может быть полезно для понимания того, как каждая команда в прогоне преобразует данные, передаваемые по pipe, а сигнатура команды, надеюсь, проясняет, что делает каждый аргумент. Например, объяснение команды из предыдущего раздела даёт:
> explain entities with Item count

entities - Returns all entities on the server.
Pipe input: [none]
Pipe output: IEnumerable<EntityUid>
Signature:
  entities

with - Filters the input entities by whether or not they have the given component.
Pipe input: IEnumerable<EntityUid>
Pipe output: IEnumerable<EntityUid>
Signature:
  <input> → with <component (Type)>

count - Counts the amount of entries in it's input, returning an integer.
Pipe input: IEnumerable<EntityUid>
Pipe output: Int32
Signature:
  <input> → count
Обратите внимание, что здесь тип входного аргумента pipe для команды count — IEnumerable<EntityUid>, в отличие от примера help, где использовался обобщённый тип (IEnumerable<T>). Команда explain будет показывать только тип и синтаксис для конкретной реализации команды, которая соответствует объясняемому command run.

Распространённые команды

В этом разделе кратко описаны некоторые простые команды, которые часто используются для построения более сложных command runs. Они могут использоваться в документации при приведении примеров использования других команд. Описание некоторых других часто используемых команд см. в разделе commands. Примеры объединения команд Toolshed см. в toolshed examples.

Константы

Эти команды часто используются в начале command run для предоставления начального значения, которое передаётся в другие команды через pipe:
  • i, возвращает целое число. Пример: i 2.
  • f, возвращает число с плавающей точкой. Пример: f 2.1.
  • b, возвращает bool. Пример: b true.
  • s, возвращает строку. Пример: s "foo".
  • ent, возвращает EntityUid. Пример: ent 123.
  • fpi, dpi возвращает Pi, в одинарной или двойной точности.

Математика

Toolshed поддерживает множество видов математических операций, включая, но не ограничиваясь:
  • Простые операции: +, -, \*, /, %
  • Распространённые функции: sin, abs, min, pow, ceil
  • Векторные операции (например, умножение списка на число): +/, -/, \*/, //, %/
  • Побитовые операции: &, ^, bitor, ~, &~ ^~, bitornot (обратите внимание, что | — это явный символ pipe, поэтому он не используется для команд побитового ИЛИ)

Диапазоны и последовательности

Есть несколько команд, полезных для создания списков/последовательностей или управления ими:
  • count возвращает общее количество элементов в последовательности
  • to используется для создания диапазона чисел. Пример: i 3 to 5 возвращает [3,4,5]
  • iota используется для создания диапазона чисел до определённого значения. Пример: i 3 iota возвращает [1, 2, 3].
  • rep повторяет входное значение. Пример: i 5 rep 3 возвращает [5, 5, 5].
  • append добавляет число в конец последовательности.
  • join объединяет две последовательности (или строки). Также может использоваться для добавления одного элемента в начало.
  • first выбирает первый элемент в последовательности
  • take берёт первые N элементов в последовательности
  • select случайным образом выбирает N элементов или процент элементов из последовательности

Терминаторы

Разбор аргументов команды может быть прерван с помощью явного символа pipe | или символа терминатора ;. Первое в первую очередь полезно, если команда имеет опциональные или повторяемые аргументы, или чтобы сделать некоторые команды более читаемыми и понятными. Второе полезно в основном тем, что отбрасывает выходное значение pipe, что можно использовать для объединения иначе несовместимых команд. Например:
> f 2 * 1.5; i 1 + 1
2
Без ; приведённая выше команда не будет разобрана, так как команда i не принимает никаких значений через pipe.

Ошибки и недопустимые команды

Прежде чем Toolshed попытается выполнить command run, он должен сначала успешно его разобрать. Если ему не удаётся разобрать команду, он должен попытаться вывести полезное сообщение об ошибке, указывающее на конкретную часть команды, которую Toolshed не смог разобрать. Обратите внимание, что команда explain работает только с допустимым command run и не может быть использована для выяснения того, почему command run не работает.
Toolshed часто выводит длинные stacktrace при неправильном использовании команды. Но обычно в консоли есть более понятное сообщение об ошибке над stacktrace, хотя, возможно, придётся прокрутить вверх, чтобы его увидеть.
Например, в одном из предыдущих примеров есть команда with, которая ожидает на входе EntityUid или Prototype. Если мы вместо этого передадим ей целое число, она сообщит нам, что нет команды with, принимающей этот тип:
> entities count with Items

entities count with Items
               ^^^^
Could not find an implementation of the 'with' command given the input type 'Int32'.
Accepted types: 'IEnumerable<EntityUid>','IEnumerable<EntityPrototype>','IEnumerable<ProtoId<T>>'.

   at Robust.Shared.Toolshed.ToolshedCommandImplementor.TryParse(ParserContext ctx, Func`2& invocable, Nullable`1& method)
   at Robust.Shared.Toolshed.Syntax.ParsedCommand.TryParseCommand(ParserContext ctx, Func`2& invocable, Nullable`1& method, ToolshedCommandImplementor& implementor)
   at Robust.Shared.Toolshed.Syntax.ParsedCommand.TryParse(ParserContext ctx, Type piped, ParsedCommand& result)
   at Robust.Shared.Toolshed.Syntax.CommandRun.TryParse(ParserContext ctx, Type pipedType, Type targetOutput, CommandRun& expr)
   at Robust.Shared.Toolshed.ToolshedManager.InvokeCommand(IInvocationContext ctx, String command, Object input, Object& result)
   at Robust.Shared.Toolshed.ToolshedManager.InvokeCommand(IConsoleShell session, String command, Object input, Object& result, IInvocationContext& ctx)
   at Robust.Server.Console.ServerConsoleHost.ExecuteInShell(IConsoleShell shell, String command)
   at Robust.Server.Console.ServerConsoleHost.ExecuteCommand(ICommonSession session, String command)
   at Robust.Server.Console.ServerConsoleHost.ProcessCommand(MsgConCmd message)
   at Robust.Shared.Network.NetManager.<>c__DisplayClass109_0`1.<RegisterNetMessage>b__0(NetMessage msg)
   at Robust.Shared.Network.NetManager.DispatchNetMessage(NetIncomingMessage msg)
   at Robust.Shared.Network.NetManager.ProcessPackets()
   at Robust.Server.BaseServer.Input(FrameEventArgs args)
   at Robust.Server.BaseServer.<SetupMainLoop>b__67_0(Object sender, FrameEventArgs args)
   at Robust.Shared.Timing.GameLoop.Run()
   at Robust.Server.BaseServer.MainLoop()

Поиск команд

Вы можете использовать команду cmd:list для получения списка всех команд. Затем вы можете объединить её с командой search для поиска по этому списку. Например:
> cmd:list search "awn"

spawn:at,
spawn:on,
spawn:attached
Если вы пытаетесь найти команду, которая может принимать вывод какой-либо другой команды, вы можете использовать команду types:consumers. Например, ent 1 types:consumers выведет все типы, которые могут принимать EntityUid. Обратите внимание, что команда types:consumers в настоящее время несколько несовершенна, особенно в отношении методов C#, использующих обобщённые ограничения. Например, она часто ошибочно сообщает, что различные математические команды принимают любой тип, хотя на самом деле они принимают только числа.
Последнее изменение 21 июня 2026 г.