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, представлен в виде ФЯП (функционального языка программирования), а он является линейным. Это значит, что программа выполняется последовательно и её можно представить в виде БСА (Базовой структуры алгоритма). Для того чтобы программа имела возможность нескольких решений, и используют ветвление. Что же такое ветвление? Это своеобразный выбор между возможностями решений, в зависимости от условий.
———————————————————————————————-—
В качестве примера мы с вами разберём кодовый замок, сделанный на основе сенсора. Сенсор будет выполнять в данном случае функцию ячейки памяти. (Поясняю, у сенсора 6 параметров которые мы можем изменять и проверять) Всё что нам надо также знать это увеличение сенсора и метод кодирвоания (экспериментальным, увеличение сенсора-2,45 за одно нажатие кнопки. Максимально значение 50, минимальное 1, значит диапазон возможных значений- 20. Следовательно, мы сделаем код из 3 ячеек, с 20-ю значениями в каждой). Одна из особенностей данной системы в том, что для правильной комбинации может быть множество вариантов. Это может быть сумма чисел, их разность и т.д. Мы будем использовать метод сравнение чисел.
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 код программы
/* Управление гироскопами
Выравнивание по вектору гравитации через арктангенс
*/
//объявляем блоки «Уд. управления» и «гироскоп»
IMyShipController DrillShip;
List Gyros;
float Kg = 2;
public Program()
<
//находим эти блоки
Vector3D GravityVector = DrillShip.GetNaturalGravity();
Vector3D GravNorm = Vector3D.Normalize(GravityVector);
// получаем вектора относительно блока уд. управления
float VecForward = (float)GravNorm.Dot(DrillShip.WorldMatrix.Forward);
float VecLeft = (float)GravNorm.Dot(DrillShip.WorldMatrix.Left);
float VecUp = (float)GravNorm.Dot(DrillShip.WorldMatrix.Up);
//получаем сигналы на крен и тангаж скалярным произведением.(!Тангаж перевернут!)
// на рысканье можно напроимер вывести сигнал с контроллера
float YawInput = DrillShip.RotationIndicator.Y;
// устанавливаем гироскопу текущие значения по тангажу и крену
foreach (IMyGyro gyro in Gyros)
<
gyro.GyroOverride = true;
gyro.Yaw = YawInput;
gyro.Roll = RollInput * Kg;
gyro.Pitch = PitchInput * Kg;
/* Если сигнал слабый, можно ввести коэффицент и умножить его на значения по тангажу и крену */
>
Space engineers код программы
Скрипт для посадки на планеты.
Аля «Остановить поршень когда посадочное шасси зацепится за астероид»
================================================================
void Main(string argument)
<
IMyPistonBase LandingPiston = GridTerminalSystem.GetBlockWithName(«LandingPistonName») as IMyPistonBase;
IMyLandingGear LandingGear = GridTerminalSystem.GetBlockWithName(«LandingGearName») as IMyLandingGear;
if(LandingGear.IsLocked)
<
LandingPiston.GetActionWithName(«ResetVelocity»).Apply(LandingPiston);
LandingPiston.GetActionWithName(«IncreaseVelocity»).Apply(LandingPiston);;
>
КАК заставить это работать:
LandingPistonName и LandingGearName это названия в панели управления (в терминале) поршня и шасси соответственно. Желательно использовать англ.язык и названия без пробелов. К примеру: LandPiston_1; Gear2 и т.п. Я не ручаюсь за работу с кирилицей)
Это все, что вам нужно заменить в скрипте.
Далее таймер: выставляем задержку таймера в 1 секунду (на минимум), ставим в Setup Action запуск отчета таймера и Run программируемого блока.
ВАЖНО!:
Это скрипт только для одной системы поршень-шасси. Если хотите больше, советую натыкать программируемых блоков и таймеров для корректной работы.
p.s. в воркшоп выставлю позже, когда будет готов прототип и видеодемонстрация.
Автоматический шлюз.
Звуковая и световая сигнализация, вывод состояния на LCD панель, автоматическое переключение откачки/накачки воздуха, автоматическое открытие/закрытие/блокировка дверей.
http://steamcommunity.com/sharedfiles/filedetails/?id..
Для работы ЛЮБОГО количества шлюзов требуется ОДИН программируемый блок.
Отображение провреждённых/недостоенных блоков.
Само собой автоматическое 🙂
Невероятно полезный скрипт, который позволяет с помощью одного нажатия кнопки выбрать положение ротора или поршня. За подробностями смотрите видео по ссылке.
Переименовываете все орудия одинаково, к примеру «Пушка», без номеров и всего остального.
Запускаете прогблок. Включаете блок с именем «sequencerToggle».
Заряжаете орудия жмете на гашетку. Для автоматизации стрельбы просто соберите заскриптованные орудия в группу, и повесьте на горячую клавишу вкл/выкл стрельбы.
При начале стрельбы бывает стреляет сразу из двух орудий.
Простой скрипт, который на левый дисплей выводит предупреждения о повреждениях, заканчивающемся боезапасе и малом количестве ресурсов. На правый дисплей выводится содержимое всех хранилищ корабля. Центральный дисплей отображает визуальное предупреждение (картинкой).
Имеет возможность небольшой настройки под себя в самом начале скрипта, где необходимо будет прописать свои ЖК панели для работы скрипта. По-умолчанию стоит: ЖК панель слева, ЖК панель справа, ЖК панель центр
Работает на версии 01_171_003 без модов на пиратке.
Побудило написать свой скрипт, так как большинство сложных скриптов у меня не работает. Да и скучно было.
В программируемом блоке появилась возможность сохранять переменные.
Если заметили, по-умолчанию кроме Main() в редакторе появились две функции public Program() и public void Save().
Конструктор Program() автоматически запускается при первом запуске компьютера. Туда можно запихнуть инициализацию всех переменных и первоначальную настройку оборудования, чтобы не тратить на это время при очередном запуске скрипта.
Функция Save() так же автоматически запускается и сохраняет предоставленное строковое значение. Сохранение происходит не каждый запуск скрипта. Заметил, что сохраняется, когда открываю редактор программируемого блока или сохраняю игру, других триггеров для срабатывания этой функции я не обнаружил.
Если снести программируемый блок, построить другой и вставить туда идентичный код, сохранения не восстанавливаются.
Переменная сохраняется после редактирования скрипта, отключения бортового питания и перезапуска игры (пока не нашел случая, в котором переменная бы не загрузилась).
Пример прикреплен ниже.
Описание: Скрипт подсчитывает содержимое инвентарей, перемещает позицию, которая не строится в конец очереди сборщика.
Умеет сортировать содержимое по контейнерам и дозаказывать компоненты в ассемблере на основании установленных лимитов.
Настройка:
в поле CustomData вносятся параметры для инициализации скрипта: (любая из строк может быть пустой и будет пропущена)
При первом запуске скрипта инициализация производится автоматически, далее по команде.
Команды: Скрипт поддерживает команды с параметрами. Команда и параметр разделяются «:»
>:МаскаПоискаКонтейнера:ЧтоВНемЛежит,ЧтоВНемЛежит
устанавливает отбор для сортировки элементов в контейнере. Если перед первым параметром добавить +, будут добавлены доступные элементы иначе заменены
mask:маска поиска блоков
Устанавливает маску которая применяется при поиске обрабатываемых инвентарей, если маска пустая строка обрабатываются все доступные инвентари
reload:bloc,ass
Находит и запоминает все ассемблеры и блоки в которых будет в дальнейшем происходить поиск. Параметрами можно ограничивать что нужно искать. Без параметров ищет все.
Unload:маска
Производит единоразовое перемещение элементов из блоков подходящих под маску в установленные контейнеры. Полезно при разгрузке бурового корабля.
Скрипт находит все блоки ассемблеров и инвентаре, а затем обходит эти списки. Поэтому если необходимо заново найти инвентари или ассемблеры вызовите команду reload. Если необходимо переинициализировать текстовые панели воспользуйтесь командой init. Это поможет при разрушении готовых или достройке новых блоков.
Все настройки скрипт сохраняет и восстанавливает автоматически, при перезагрузке ничего перенастраивать не нужно