Space engineers список команд для блоков
void Main()
// varitables
IMyPistonBase DoorPiston = GridTerminalSystem.GetBlockWithName("DoorPiston") as IMyPistonBase;
IMySensorBlock DoorSensor = GridTerminalSystem.GetBlockWithName("DoorSensor") as IMySensorBlock;
IMySensorBlock CloseSensor = GridTerminalSystem.GetBlockWithName("CloseSensor") as IMySensorBlock;
IMySoundBlock SoundMessage = GridTerminalSystem.GetBlockWithName("SoundMessage") as IMySoundBlock;
IMyLargeInteriorTurret DoorTurret= GridTerminalSystem.GetBlockWithName("DoorTurret") as IMyLargeInteriorTurret; //
IMyLargeInteriorTurret DoorTurret2= GridTerminalSystem.GetBlockWithName("DoorTurret2") as IMyLargeInteriorTurret; //
if (DoorSensor.DetectOwner == true || CloseSensor.DetectOwner == true)
DoorPiston.GetActionWithName("Reverse").Apply(DoorPiston);
DoorTurret.GetActionWithName("OnOff").Apply(DoorTurret);
DoorTurret2.GetActionWithName("OnOff").Apply(DoorTurret2);
SoundMessage.GetActionWithName("PlaySound").Apply(SoundMessage);
>
>
Я далек от программирования, однако любопытство взяло верх над полным отсутствием грамотности в этом вопросе. Решил по аналогии запилить освещение.
Суть: Подходишь к прожектору (в зону досягаемости сенсора) - он включается. Отходишь (в зону недосягаемости сенсора) - выключается.
Первое действие получилось - прожектор включается. А вот с выключением не выходит.
Для того чтобы прожектор погас, нужно выйти из зоны действия прожектора и зайти в нее обратно. Причем значение "true" для сенсора совсем не обязательно и сенсор вызывает действие скрипта на прог.блоке без него.
Но все по прежнему.
Пробовал и в таком:
В таком случае прожектор включается и не выключается вообще.
Т.е. значения true и false в нашем случае не работают? И почему? Или они вообще в игровом коде не задействуются?
Подумал о такой вещи как бездействие сенсора, т.е. код отсутствия действия, или состояние бездействия как еще одно действие. Например: Sensor.NotDetect
Но такого не нашел.
Т.к. я далек от знания языков программирования, дописать выключение прожектора не получается. Есть у кого какие мысли?
Получается при этом условии ты заходишь в поле сенсора, он проверят ты овнер или нет. если ты овнер - срабатывает первое условие, если не овнер - второе. а если ты овнер и не находишься в поле то ничего не срабатывает и он горит всегла, как-то так походу) Сам не так давно начал играть и разбираться в игре но на мой скромный взгляд тут не хватает таймера с запуском проверки наличия владельца в зоне досягаемости сенсора. да и еще не совсем понятно куда делся оператор ELSE или в данной версии языка он отсутствует?
Если кому-то поможет сделать скрипт проще и короче.
В данном примере есть создание новой переменной блока "Поршня"
IMyPistonBase DoorPiston = GridTerminalSystem.GetBlockWithName("DoorPiston") as IMyPistonBase
IMyPistonBase - тип переменной блока;
DoorPiston - имя переменной; (лучше его задавать одноимённым с названием блока в терминале, дабы избежать путаницы)
"DoorPiston" - то, что в скобках после GetBlockWithName(), есть название блока в терминале
as IMyPistonBase - данное выражение говорит о том, что всю строку после знака "=" надо считать как тип данных IMyPistonBase (важно, иначе присвоение значения переменной не произойдёт);
Вот теперь у нас есть переменная DoorPiston, готовая к применению и отвечающая исключительно за нужный блок. Так вот тут далее, когда остальным переменным присваиваются необходимые блоки идёт условие и действие, если данное условие верно
Внутри есть строка действия:
Данный код понимается так: блок DoorPiston, произведи поиск действия в своём списке действий по точному названию "Reverse" (GetActionWithName() - поиск и получения действия из списка действий, доступных блоку по точному названию) и примени его к блоку DoorPiston (Apply() - применить к блоку в скобках действие, которое мы получили).
Данная строка долгая для написания и занимает много символов (а запас символов в программном блоке ограничен), да и получается какая-то нелепость с ненужным поиском действия (ведь мы его знаем. зачем его искать в списке?) поэтому лучше использовать несколько другой способ, реализующий абсолютно точно такое же действие напрямую:
Читается так: блок DoorPiston, произведи действие Reverse.
Дело в том, что действие является некоторым методом для блока (Методы, процедуры и функции в конце имеют круглые скобки со значением или без, но они обязательны). Для любого блока будет верным писать действия в такой формулировке:
Доступные интерфейсы
Возможные действия
На данный момент в скрипте вы можете использовать только действия, доступные в панели управления.
Пользователь имеет доступ только к объектам, расположенным в одной сети, где находится программируемый блок.
Переменная GridTerminalSystem
В настоящее время, кроме "встроенных" переменных, пользователь может использовать переменную GridTerminalSystem.
Она является точкой входа во всю сеть корабля, и имеет следующие доступные методы:
List<IMyTerminalBlock> Blocks
List<IMyBlockGroup> BlockGroups
void GetBlocksOfType<T>(List<IMyTerminalBlock> blocks, Func<IMyTerminalBlock, bool> collect = null);
void SearchBlocksOfName(string name,List<IMyTerminalBlock> blocks, Func<IMyTerminalBlock, bool> collect = null);
IMyTerminalBlock GetBlockWithName(string name);
С помощью этих методов все "терминальные" блоки внутри сети могут быть собраны.
Blocks - данное свойство возвращает все блоки из сети терминала, данный метод внутренне выделяет новую память.
BlockGroups - возвращает все группы блоков из сети терминала, этот метод внутренне выделяет новую память.
GetBlocksOfType - возвращает все блоки указанного типа.
SearchBlocksOfName - данный метод является полнотекстовым поиском между всеми блоками и возвращает блок, который содержит искомую строку, поиск не чувствителен к регистру.
GetBlockWithName - данный метод возвращает первый блок с точным названием, которое было задано, поиск чувствителен к регистру.
Func<IMyTerminalBlock, BOOL> - данный "collect" метод определяет условие поиска внутри другого метода поиска. ( для примера: метод передается как параметр в метод поиска GetBlocksOfType или SearchBlocksOfName).
Метод "collect" интерфейса "IMyRadioAntenna" может использоваться для поиска включенных антенн или антенн с необходимым вам радиусом вещания.
IMyCubeBlock
IMyCubeBlock это базовый класс для каждого "терминального" блока. Он имеет следующие свойства и методы:
BOOL IsBeingHacked
BOOL IsFunctional
BOOL IsWorking
VRageMath.Vector3I Position
IsFunctional - свойство сообщает, если блок достроен до уровня, когда он может работать.
IsWorking - свойство сообщает, имеет ли данный блок достаточное питание для работы.
IMyTerminalBlock
IMyTerminalBlock это базовый класс для каждого "терминального" блока. Он имеет следующие свойства и методы:
string CustomName
string CustomNameWithFaction
string DetailedInfo
bool HasLocalPlayerAccess()
bool HasPlayerAccess(long playerId)
void RequestShowOnHUD(bool enable)
void SetCustomName(string text)
void SetCustomName(StringBuilder text)
bool ShowOnHUD
void GetActions(List<Sandbox.ModAPI.Interfaces.ITerminalAction> resultList, Func<Sandbox.ModAPI.Interfaces.ITerminalAction, bool> collect = null);
void SearchActionsOfName(string name,List<Sandbox.ModAPI.Interfaces.ITerminalAction> resultList, Func<Sandbox.ModAPI.Interfaces.ITerminalAction, bool> collect = null);
Sandbox.ModAPI.Interfaces.ITerminalAction GetActionWithName(string name);
GetActions - данный метод возвращает все доступные действия для текущего блока.
SearchActionsOfName - данный метод является полнотекстовым поиском между всеми действиями блока и возвращает действия, название которых содержит искомую строку, например, если блок имеет действия: "OnOff, OnOff_On, OnOff_Off".
SearchActionsOfName с "OnOff" - вернет все действия
SearchActionsOfName с "_On" - вернется только "OnOff_On", поиск "On" вернет все действия. Поиск не чувствителен к регистру.
GetActionWithName - данный метод вернет первое найденное действие с точно заданным названием, поиск чувствителен к регистру.
ITerminalAction
ITerminalAction предоставляет определенные действия, которые могут быть выполнены.
Он имеет следующие свойства и методы:
string Id < get; >
StringBuilder Name < get; >
void Apply(Sandbox.ModAPI.Ingame.IMyCubeBlock block);
Id - это обозначение действия, к примеру: "OnOff", "OnOff_On"
Name - это название действия, которое будет показано в интерфейсе, к примеру: "Toggle block On/Off ,Toggle block On"
Apply - применяет действие к выбранному блоку (вам нужно определить блок, из которого вы берете действие).
IMyFunctionalBlock
IMyFunctionalBlock - это базовый класс для каждого блока, который может быть включен или выключен, он наследуется от "IMyTerminalBlock". Для примера, каждый блок имеющий функции, является "терминальным", но не все "терминальные" блоки могут быть включены или выключены.
Он имеет одно свойство:
bool Enabled
Это свойство отображает: включен или выключен данный блок пользователем.
Contents
Большие и малые блоки
Блоки делятся на два типа: малые, предназначенные для малых кораблей, и большие, предназначенные для больших кораблей и станций. Большинство блоков (но не все) доступны в обоих вариантах, которые различаются по массе, объёму и требуемым для постройки компонентам. Поэтому при производстве компонентов важно помнить требуемые типы блоков, иначе можно ошибиться в расчётах на один-два порядка.
Некоторые блоки (к примеру, средний контейнер) доступны только для малых кораблей, в то время как другие (например, очистительный завод) доступны только для больших кораблей и станций.
Размеры блоков
Блоки и действия
Дисклеймер
Все "терминальные" блоки имеют следующие свойства:
Имя интерфейса: это имя определенного блока в коде, название может отличаться от названия отображаемого на экране постройки. К примеру антенна имеет имя интерфейса "IMyRadioAntenna" - вам нужно использовать этот интерфейс, если вы хотите получить все антенны.
Родитель
Каждый блок имеет родителя (все блоки имеют "IMyTerminalBlock" как родителя), это нужно для того, чтобы получить все блоки одного типа, вместо конкретного блока.
К примеру, если вы хотите получить все блоки света, следует использовать "IMyLightningBlock", а если вы хотите использовать только блок ламы, вы используете "IMyInteriorLight".
Данное свойство блока доступно только для чтения.
К примеру из "IMyBeacon" вы можете получить свойство радиуса. И основываясь на этом свойстве вы можете увеличить/уменьшить радиус маяка.
Действия
Все действия, которые вы можете применить к блоку, доступны вам в скрипте, так что если вы хотите уменьшить радиус вещания антенны, вам нужно использовать "DecreaseRadius" действие для блока.
Свойства терминала
Это свойства терминала, которые вы можете получить или выставить. Эти свойства аналогичные значениям, которые находятся внутри терминала. Для установки плавающих значений, таких как радиус антенны, используйте GetValueFloat(String propertyName). Вы можете найти названия свойств для каждого блока в этом руководстве. Чтобы установить значение, используйте SetValueFloat(String propertyName,float value).
Пример: для антенны GetValueFloat(“Radius”) вы получите текущий радиус (аналогично использованию Радиуса в антенне) и SetValueFloat(“Radius”,10) установит значение радиуса на 10.
Вы также можете использовать void GetProperties(List<ITerminalProperty> resultList, Func<ITerminalProperty, bool> collect = null) чтобы получить все свойства этого блока.
Субтип
Одинаковые блоки, которые имеют тех же родителей (к примеру <TypeId> в файле "cubeblocks.sbc") и различаются только по субтипу (к примеру<SubtypeId>).
Это значит, что различия между этими блоками в коде нет.
Примером таких блоков являются грузовые контейнеры: в игре есть три типа грузовых контейнеров: малый, средний и большой. Они различаются только по субтипу, но имеют общий тип.
К примеру "Id" большого контейнера:
<Id>
<TypeId>CargoContainer</TypeId>
<SubtypeId>LargeBlockLargeContainer</SubtypeId>
</Id>
Средний контейнер:
<Id>
<TypeId>CargoContainer</TypeId>
<SubtypeId>SmallBlockMediumContainer</SubtypeId>
</Id>
Малый контейенер:
<Id>
<TypeId>CargoContainer</TypeId>
<SubtypeId>LargeBlockSmallContainer</SubtypeId>
</Id>
В этом случае есть только один класс "IMyCargoContainer" для всех типов грузовых контейнеров.
В "Космических инженерах" под блоком понимается любое сооружение, построенное как часть корабля или станции. Блоки делятся на множество типов, начиная от простых строительных элементов (таких как блоки лёгкой брони) и заканчивая производственным оборудованием (очистительный завод) и блоками управления (кабина). Блоки собираются из компонентов в процессе сварки.
Contents
Список блоков
Ниже приведён автоматически собранный список всех блоков, присутствующих в текущей версии "Космических инженеров":
2,981 | уникальных посетителей |
30 | добавили в избранное |
1.Открываем Панель управления на кнопку К.
2.Выбираем верхний из нужных блоков.
3.Зажимаем Shift и кликаем на последний из ряда объединяемых блоков.
4.Называем Группу по вашему желанию и сохраняем.
Ограничения
Ниже вы найдете список известных ограничений о которых мы знаем, а так же возможные их решения.
Обзор интерфейса
Программируемый блок
Панель программируемого блока на данный момент содержит следующие кнопки:
Edit – открыть редактор для редактирования скриптов и возможности сохранения/загрузки их на диск.
Также вы можете загрузить свои скрипты в "workshop" или загрузить себе скрипты, на которые вы подписаны.
Run – запустить скрипт сохраненный в редакторе. Скрипт будет запущен один раз. Однако эта кнопка является действием в терминале и вы можете соединить ее с сенсором, таймером или добавить на панель быстрого доступа.
Редактор
Редактор кода содержит следующие кнопки:
Help – открыть мануал по программированию в игре.
Check code – проверить код на наличие ошибок, а так же возможность использовать данный код.
Remember & Exit – сохранить ваш код, закрывает экран редактора и переведет к панели терминала.
Remember code – сохранить ваш код и оставит экран редактора открытым.
Browse Workshop – открыть окно для управления скриптами, вы можете сохранить/загрузить скрипты на диск, загрузить свои скрипты в "workshop" или загрузить себе скрипты, на которые вы подписаны.
Line counter – отобразить текущую строку кода и общее количество строк в коде.
Экран "Workshop"
Этот экран аналогичный экрану с чертежами и содержит следующие кнопки:
Ok – загрузить выбранный скрипт в редактор и закроет экран.
Cancel – закрыть экран (изменения не будут внесены в редактор)
Details – открыть экран "детали", где вы можете увидеть описание скрипта.
Rename (только для локальных скриптов) – переименовать выбранный скрипт, если вы попытаетесь переименовать существующий скрипт, игра попросит подтверждение.
Delete (только для локальных скриптов) – удалить выбранный скрипт, после подтверждения.
Create from editor – создать новый скрипт с именем по умолчанию Script_XX, которое начинается с 0, и если скрипт с уже выбранным именем существует, то числовое значение в названии будет повышено. Для примера, первым будет Script_0, далее Script_1 и т.д.
Replace from editor (только для локальных скриптов) – заменить (после подтверждения пользователя) выбранный скрипт на скрипт из редактора.
Refresh Scripts – обновить локальные скрипты и скрипты на которые вы подписаны.
Детали (локальный скрипт)
Этот экран показывает детали для локальных скриптов и содержит следующие кнопки:
Rename – переименовать выбранный скрипт, если вы попытаетесь переименовать существующий скрипт, игра попросит подтверждение.
Delete – удалить выбранный скрипт, после подтверждения.
Publish – опубликовать выбранный скрипт в "workshop" и показать странницу с опубликованным скриптом.
Browse Workshop – открыть экран "workshop" для просмотра, а также подписаться на скрипты.
Close – закрыть экран.
Детали ("workshop" скрипт)
Этот экран показывает детали для скриптов из "workshop" и содержит следующие кнопки:
Open in Workshop – открыть "workshop" страницу скрипта.
Close – закрыть экран.
Гайд по программированию
Доступ к редактору
Только один игрок может редактировать скрипт. Если кто-нибудь откроет занятый программируемый блок и попытается открыть редактор, он получит уведомление о том, что редактор уже открыт.
Метод Main
Метод Main - создается при первом открытии редактора, этот метод является основной точкой входа в ваш скрипт. При переименовании или удалении этого метода скрипт не запустится и вы получите уведомление.
Пользовательские методы/переменные могут быть определены, но использованы только внутри главного метода "main".
Видимость переменных
Есть два типа переменных для скрипта:
-Local (внутри методов) - эти переменные будут хранить значение только во время выполнения метода.
Подробнее - локальная переменная находится в области видимости до тех пор, пока закрывающая фигурная скобка не укажет конец блока операторов или метода, в котором она объявлена.А так же, объявленная в операторах цикла "for", "while" или подобных им, видима в пределах тела цикла.
-Global (за пределами методов) - эти переменные будут хранить значения при работе всего скрипта.
Подробнее - если переменная должна сохранить значение между отдельными блоками программы, она должна быть определена вне этих методов т.е. глобально.
-После нажатия "Remember & Exit" или "Remember" кнопки, предыдущий скрипт будет переписан и все глобальные переменные будут потеряны.
Компиляция
-Во-вторых, код будет проверен на наличие недопустимых имен или типов. Если во время компиляции возникнут какие-либо ошибки, компиляция будет прервана и вы получите уведомление:
К примеру System.IO.Directory был использован для удаления другого каталога. Это запрещено, и вы получите уведомление: “Not allowed type was used in script”.
-Если компиляция и проверка проходит успешно, вы получите уведомление:
Это означает, что код не содержит ошибок в языке или неразрешенные методы.
Выполнение скрипта
Когда вы нажимаете кнопку "Run" или добавляете действие на панель быстрого доступа, скрипт будет выполнен. На данный момент "Run" должен быть использован вручную, т.е. пользователю нужно нажать кнопку "Run" или добавить действие на панель быстрого доступа.
Скрипт будет выполнен только на сервере, даже если был запущен из клиента, все клиенты будут уведомлены, если запуск скрипта будет прерван.
В случае, если работа скрипта будет прервана, скрипт не запустится до того момента, пока пользователь не откроет редактор и не отредактирует скрипт.
Вычисление команд
Каждый раз, когда скрипт будет запущен, происходит расчет каждой команды внутри скрипта.
Если количество команд внутри скрипта превышает лимит, запуск будет приостановлен и пользователь получит уведомление о том, что скрипт слишком сложный для выполнения.
Лимит помогает избежать "заморозки" игры при выполнении скрипта.
Читайте также: