на каком языке пишутся скрипты в space engineers
На каком языке пишутся скрипты в space engineers
Ну вот и обещанный гайд по программированию или скриптингу в Space Engineers. Это первая часть гайда и в ней мы рассмотрим объвление переменных и типы переменных.
И так, для начала мы установим Programmable block на нашу станцию/корабль.Открываем панель управления блока и жмякаем на кнопку «Edit». Мы сразу же видим:
Данный код создаёт метод Main в нашей внутриигровой «программе» в которой и будут происходить наши действия.Без него код не запуститься.
Писать код мы будем между строк, для этого кликаем ЛКМ после скобочки < и жмём Enter.
Объявим переменную.Что-бы объявить переменную в C# нужно перед названием переменной указать её тип, существует много типов переменных, но я сейчас перечислю самые популярные, а это:
Создадим переменную one типа int и зададим ей значение 100, для этого пишем в коде int one = 100
У нас должно получиться так:
Создадим ещё две переменных типа int.
Что мы сделали?Мы создали две переменные «one» и «two», значение one = 100, значение two = 50, создали ещё одну переменную zn, значение которой равняется разности двух переменных.То-есть 100-50, значение переменной zn будет равняться 50.
Так же можно делить: /
Умножать: *
Складывать: +
Ветвление.
//C# представленный нам для создания скриптов в SE, представлен в виде ФЯП (функционального языка программирования), а он является линейным. Это значит, что программа выполняется последовательно и её можно представить в виде БСА (Базовой структуры алгоритма). Для того чтобы программа имела возможность нескольких решений, и используют ветвление. Что же такое ветвление? Это своеобразный выбор между возможностями решений, в зависимости от условий.
case второ условие:
Действие(я);
break;
На каком языке пишутся скрипты в 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 и false в нашем случае не работают? И почему? Или они вообще в игровом коде не задействуются?
Подумал о такой вещи как бездействие сенсора, т.е. код отсутствия действия, или состояние бездействия как еще одно действие. Например: Sensor.NotDetect
Но такого не нашел.
Т.к. я далек от знания языков программирования, дописать выключение прожектора не получается. Есть у кого какие мысли?
Если кому-то поможет сделать скрипт проще и короче.
В данном примере есть создание новой переменной блока «Поршня»
IMyPistonBase DoorPiston = GridTerminalSystem.GetBlockWithName(«DoorPiston») as IMyPistonBase
Вот теперь у нас есть переменная DoorPiston, готовая к применению и отвечающая исключительно за нужный блок. Так вот тут далее, когда остальным переменным присваиваются необходимые блоки идёт условие и действие, если данное условие верно
Внутри есть строка действия:
Данная строка долгая для написания и занимает много символов (а запас символов в программном блоке ограничен), да и получается какая-то нелепость с ненужным поиском действия (ведь мы его знаем. зачем его искать в списке?) поэтому лучше использовать несколько другой способ, реализующий абсолютно точно такое же действие напрямую:
Читается так: блок DoorPiston, произведи действие Reverse.
Дело в том, что действие является некоторым методом для блока (Методы, процедуры и функции в конце имеют круглые скобки со значением или без, но они обязательны). Для любого блока будет верным писать действия в такой формулировке:
IMyPistonBase DoorPiston = GridTerminalSystem.GetBlockWithName(«DoorPiston») as IMyPistonBase;
DoorPiston.Reverse();
//вместо DoorPiston.GetActionWithName(«Reverse»).Apply(DoorPiston);
IMyLargeInteriorTurret DoorTurret= GridTerminalSystem.GetBlockWithName(«DoorTurret») as IMyLargeInteriorTurret;
DoorTurret.OnOff();
//вместо DoorTurret.GetActionWithName(«OnOff»).Apply(DoorTurret);
IMySoundBlock SoundMessage = GridTerminalSystem.GetBlockWithName(«SoundMessage») as IMySoundBlock;
SoundMessage.PlaySound();
//вместо SoundMessage.GetActionWithName(«PlaySound»).Apply(SoundMessage);
. да и еще не совсем понятно куда делся оператор ELSE или в данной версии языка он отсутствует?
Оператор else в коде работает и он записывается так:
Продолжим рассматривать всё тот же поршень DoorPiston.
В различных источниках можно найти все возможные действия и значения для каждого типа блока. Вот весь список типов переменных полей и действий для блока «Поршень»
Fields:
float Velocity
float MinLimit
float MaxLimit
На каком языке пишутся скрипты в space engineers
Ну вот и обещанный гайд по программированию или скриптингу в Space Engineers. Это первая часть гайда и в ней мы рассмотрим объвление переменных и типы переменных.
И так, для начала мы установим Programmable block на нашу станцию/корабль.Открываем панель управления блока и жмякаем на кнопку «Edit». Мы сразу же видим:
Данный код создаёт метод Main в нашей внутриигровой «программе» в которой и будут происходить наши действия.Без него код не запуститься.
Писать код мы будем между строк, для этого кликаем ЛКМ после скобочки < и жмём Enter.
Объявим переменную.Что-бы объявить переменную в C# нужно перед названием переменной указать её тип, существует много типов переменных, но я сейчас перечислю самые популярные, а это:
Создадим переменную one типа int и зададим ей значение 100, для этого пишем в коде int one = 100
У нас должно получиться так:
Создадим ещё две переменных типа int.
Что мы сделали?Мы создали две переменные «one» и «two», значение one = 100, значение two = 50, создали ещё одну переменную zn, значение которой равняется разности двух переменных.То-есть 100-50, значение переменной zn будет равняться 50.
Так же можно делить: /
Умножать: *
Складывать: +
Всем доброго времени суток. У вас не бомбит по поводу отсутствия обещанных гайдов? А у меня припекло.
//Так что, возьму на себя смелость написать гайд. Тему возьмём обещанную “Ветвление и циклы”. Как и положено зазнайке, я буду слегка выпендриваться большим количеством теории, но всё же
постараюсь сократить её до необходимого минимума.//
Ветвление.
//C# представленный нам для создания скриптов в SE, представлен в виде ФЯП (функционального языка программирования), а он является линейным. Это значит, что программа выполняется последовательно и её можно представить в виде БСА (Базовой структуры алгоритма). Для того чтобы программа имела возможность нескольких решений, и используют ветвление. Что же такое ветвление? Это своеобразный выбор между возможностями решений, в зависимости от условий.
———————————————————————————————-—
В качестве примера мы с вами разберём кодовый замок, сделанный на основе сенсора. Сенсор будет выполнять в данном случае функцию ячейки памяти. (Поясняю, у сенсора 6 параметров которые мы можем изменять и проверять) Всё что нам надо также знать это увеличение сенсора и метод кодирвоания (экспериментальным, увеличение сенсора-2,45 за одно нажатие кнопки. Максимально значение 50, минимальное 1, значит диапазон возможных значений- 20. Следовательно, мы сделаем код из 3 ячеек, с 20-ю значениями в каждой). Одна из особенностей данной системы в том, что для правильной комбинации может быть множество вариантов. Это может быть сумма чисел, их разность и т.д. Мы будем использовать метод сравнение чисел.
Программируемый блок
Contents
Ограничения
Ниже вы найдете список известных ограничений о которых мы знаем, а так же возможные их решения.
Обзор интерфейса
Программируемый блок
Панель программируемого блока на данный момент содержит следующие кнопки:
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
Видимость переменных
Компиляция
Когда вы нажмете кнопку “Check code”, код будет скомпилирован, также будет показан результат компиляции.
Процесс компиляции состоит из двух этапов:
-Во первых, код внутри редактора будет проверен на синтаксические ошибки, внутри языка C#
Если во время компиляции возникнут какие-либо ошибки, компиляция будет прервана и вы получите уведомление:
К примеру «ааа» строка была помещена перед главным методом. Это неправильное языковое построение, поэтому компиляция будет прервана.
Также в сообщении об ошибке будет показана строка, в которой допущена ошибка и описание ошибки.
-Во-вторых, код будет проверен на наличие недопустимых имен или типов. Если во время компиляции возникнут какие-либо ошибки, компиляция будет прервана и вы получите уведомление:
К примеру System.IO.Directory был использован для удаления другого каталога. Это запрещено, и вы получите уведомление: “Not allowed type was used in script”.
-Если компиляция и проверка проходит успешно, вы получите уведомление:
Это означает, что код не содержит ошибок в языке или неразрешенные методы.
Выполнение скрипта
Когда вы нажимаете кнопку «Run» или добавляете действие на панель быстрого доступа, скрипт будет выполнен. На данный момент «Run» должен быть использован вручную, т.е. пользователю нужно нажать кнопку «Run» или добавить действие на панель быстрого доступа.
Скрипт будет выполнен только на сервере, даже если был запущен из клиента, все клиенты будут уведомлены, если запуск скрипта будет прерван.
В случае, если работа скрипта будет прервана, скрипт не запустится до того момента, пока пользователь не откроет редактор и не отредактирует скрипт.
Вычисление команд
Каждый раз, когда скрипт будет запущен, происходит расчет каждой команды внутри скрипта.
Если количество команд внутри скрипта превышает лимит, запуск будет приостановлен и пользователь получит уведомление о том, что скрипт слишком сложный для выполнения.
Лимит помогает избежать «заморозки» игры при выполнении скрипта.
Доступные интерфейсы
Возможные действия
На данный момент в скрипте вы можете использовать только действия, доступные в панели управления.
Пользователь имеет доступ только к объектам, расположенным в одной сети, где находится программируемый блок.
Переменная GridTerminalSystem
В настоящее время, кроме «встроенных» переменных, пользователь может использовать переменную GridTerminalSystem.
Она является точкой входа во всю сеть корабля, и имеет следующие доступные методы:
List Blocks
List BlockGroups
void GetBlocksOfType (List blocks, Func collect = null);
void SearchBlocksOfName(string name,List blocks, Func collect = null);
IMyTerminalBlock GetBlockWithName(string name);
С помощью этих методов все «терминальные» блоки внутри сети могут быть собраны.
IMyCubeBlock
IMyCubeBlock это базовый класс для каждого «терминального» блока. Он имеет следующие свойства и методы:
BOOL IsBeingHacked
BOOL IsFunctional
BOOL IsWorking
VRageMath.Vector3I Position
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 resultList, Func collect = null);
void SearchActionsOfName(string name,List resultList, Func collect = null);
Sandbox.ModAPI.Interfaces.ITerminalAction GetActionWithName(string name);
ITerminalAction
ITerminalAction предоставляет определенные действия, которые могут быть выполнены.
Он имеет следующие свойства и методы:
string Id < get; >
StringBuilder Name < get; >
void Apply(Sandbox.ModAPI.Ingame.IMyCubeBlock block);
IMyFunctionalBlock
Блоки и действия
Дисклеймер
Родитель
Каждый блок имеет родителя (все блоки имеют «IMyTerminalBlock» как родителя), это нужно для того, чтобы получить все блоки одного типа, вместо конкретного блока.
К примеру, если вы хотите получить все блоки света, следует использовать «IMyLightningBlock», а если вы хотите использовать только блок ламы, вы используете «IMyInteriorLight».
Данное свойство блока доступно только для чтения.
К примеру из «IMyBeacon» вы можете получить свойство радиуса. И основываясь на этом свойстве вы можете увеличить/уменьшить радиус маяка.
Действия
Все действия, которые вы можете применить к блоку, доступны вам в скрипте, так что если вы хотите уменьшить радиус вещания антенны, вам нужно использовать «DecreaseRadius» действие для блока.
Свойства терминала
Это свойства терминала, которые вы можете получить или выставить. Эти свойства аналогичные значениям, которые находятся внутри терминала. Для установки плавающих значений, таких как радиус антенны, используйте GetValueFloat(String propertyName). Вы можете найти названия свойств для каждого блока в этом руководстве. Чтобы установить значение, используйте SetValueFloat(String propertyName,float value).
Пример: для антенны GetValueFloat(“Radius”) вы получите текущий радиус (аналогично использованию Радиуса в антенне) и SetValueFloat(“Radius”,10) установит значение радиуса на 10.
Вы также можете использовать void GetProperties(List resultList, Func collect = null) чтобы получить все свойства этого блока.
Субтип
Одинаковые блоки, которые имеют тех же родителей (к примеру в файле «cubeblocks.sbc») и различаются только по субтипу (к примеру ).
Это значит, что различия между этими блоками в коде нет.
Примером таких блоков являются грузовые контейнеры: в игре есть три типа грузовых контейнеров: малый, средний и большой. Они различаются только по субтипу, но имеют общий тип.
К примеру «Id» большого контейнера:
CargoContainer
LargeBlockLargeContainer
Средний контейнер:
CargoContainer
SmallBlockMediumContainer
Малый контейенер:
CargoContainer
LargeBlockSmallContainer
В этом случае есть только один класс «IMyCargoContainer» для всех типов грузовых контейнеров.
Список блоков и действий
Малый грузовой контейнер
Средний грузовой контейнер
Большой грузовой контейнер
Сферический генератор гравитации
Подвеска колес 1×1
Подвеска колес 3×3
Подвеска колес 5×5
На каком языке пишутся скрипты в space engineers
Начать постройку корабля, самолета или иного транспорта я могу посоветовать с аппаратуры:
Кабина
Энергоснабжение(реакторы или батареи, может быть солнечные)
Гироскопы
Конвеерная система и контейнеры
Далее можно создать основу корпуса и уже на ней ставить:
Ускорители или колеса и иные средства для передвежения
Турели(опц.)
Антену(опц.)
Разное(опц.)
Броня
Я советую использовать на гражданских судах в основном легкую броню, а военные судна или например самолеты из легкой брони для меня спорны, самолеты из фальги ещё как-то канают, хоть их и можно сбить с очереди из турели гатлинга, а вот корабль из ЛБ(легкой брони), предназначенный для ближнего боя развалится на месте, учтите.
Оружее
Используйте креативные методы вооружения, например Радио управляемые ракеты, кинетические бомбы, которые состоят из блоков(лучше всего ТБ) и сбрасываются на землю и иные способы, которые вы можете найти в мастерской, либо придумать самому.
Будем рассматривать стандартное выживание как в космосе, так и на планете(земле).
Для того чтобы использовать лёд в качестве топлива для генератора или ускорителя, или для производства кислорода нужен генератор кислорода. Когда вы установили его, он должен быть присоеденен конвеерами к водородным генераторам, ускорителям, вентеляциям, бакам с водородом/кислородом.
Лёд является легкодоступным ресурсом, однако тратится он очень быстро и для того, чтобы использовать его в больших кораблях например, нужно сначала добыть достаточное количество льда, который в отличии от урана имеет огромный вес, уменьшая маневренность корабля.
Вот примеры доступных в мастерской скриптов, которые могут вам пригодиться: