как писать скрипты для space engineers

Как писать скрипты для space engineers

camera 50

Ну вот и обещанный гайд по программированию или скриптингу в 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.

Так же можно делить: /
Умножать: *
Складывать: +

deactivated 50

Всем доброго времени суток. У вас не бомбит по поводу отсутствия обещанных гайдов? А у меня припекло.
//Так что, возьму на себя смелость написать гайд. Тему возьмём обещанную “Ветвление и циклы”. Как и положено зазнайке, я буду слегка выпендриваться большим количеством теории, но всё же
постараюсь сократить её до необходимого минимума.//

Ветвление.
//C# представленный нам для создания скриптов в SE, представлен в виде ФЯП (функционального языка программирования), а он является линейным. Это значит, что программа выполняется последовательно и её можно представить в виде БСА (Базовой структуры алгоритма). Для того чтобы программа имела возможность нескольких решений, и используют ветвление. Что же такое ветвление? Это своеобразный выбор между возможностями решений, в зависимости от условий.

deactivated 50

———————————————————————————————-—
В качестве примера мы с вами разберём кодовый замок, сделанный на основе сенсора. Сенсор будет выполнять в данном случае функцию ячейки памяти. (Поясняю, у сенсора 6 параметров которые мы можем изменять и проверять) Всё что нам надо также знать это увеличение сенсора и метод кодирвоания (экспериментальным, увеличение сенсора-2,45 за одно нажатие кнопки. Максимально значение 50, минимальное 1, значит диапазон возможных значений- 20. Следовательно, мы сделаем код из 3 ячеек, с 20-ю значениями в каждой). Одна из особенностей данной системы в том, что для правильной комбинации может быть множество вариантов. Это может быть сумма чисел, их разность и т.д. Мы будем использовать метод сравнение чисел.

Источник

Как писать скрипты для 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);
>
>

9b511406c0ff98188ebb7699b7ad334a72ded8fa

3c32164026e0a2c2c909908f4392e61f4eec1247

Но все по прежнему.

Пробовал и в таком:

В таком случае прожектор включается и не выключается вообще.
Т.е. значения true и false в нашем случае не работают? И почему? Или они вообще в игровом коде не задействуются?
Подумал о такой вещи как бездействие сенсора, т.е. код отсутствия действия, или состояние бездействия как еще одно действие. Например: Sensor.NotDetect
Но такого не нашел.

Т.к. я далек от знания языков программирования, дописать выключение прожектора не получается. Есть у кого какие мысли?

9b511406c0ff98188ebb7699b7ad334a72ded8fa

9b511406c0ff98188ebb7699b7ad334a72ded8fa

888d3650adffe9954ec72abaec779f03540b6aad

cdf5889107c2d449018ed5dcd744d784832569dc

7ca6a78a99dbd8edc41195f1df6db843905439eb

Если кому-то поможет сделать скрипт проще и короче.

В данном примере есть создание новой переменной блока «Поршня»

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);

7ca6a78a99dbd8edc41195f1df6db843905439eb

. да и еще не совсем понятно куда делся оператор ELSE или в данной версии языка он отсутствует?

Оператор else в коде работает и он записывается так:

7ca6a78a99dbd8edc41195f1df6db843905439eb

Продолжим рассматривать всё тот же поршень DoorPiston.

В различных источниках можно найти все возможные действия и значения для каждого типа блока. Вот весь список типов переменных полей и действий для блока «Поршень»

Fields:
float Velocity
float MinLimit
float MaxLimit

Источник

Scripting

Contents

Layout

On first opening the code editor you will see 3 methods already in place:

Main() will hold most of the functionality for the script.

Block Types

To interact with a block, it has to be read into a local variable as an object. There are a number of classes used to represent various kinds of blocks, with different public methods and properties. All blocks are subclasses of the IMyTerminalBlock class. For example, a Refinery is represented by the IMyRefinery object which includes specialised functions like IsProducing() and NextItemInQueue(), but also inherits generic functions and properties like ‘CustomName’ from IMyTerminalBlock.

The main block classes worth mentioning are:

GridTerminalSystem

All interaction with in-game blocks has to take place through the GridTerminalSystem interface. It provides access to all blocks connected to the same in-game grid as the programmable block being used.

In order to start using a block, a local reference to the object must be intialised from the GridTerminalSystem. For example, to intialise an LCD Panel with the name ‘LCD Panel 1’:

Note that the value returned by GridTerminalSystem has to be cast into the relevant type (including IMyTerminalBlock).

Fetching block by name

Fetching blocks of type

Fetching blocks by group

Searching for blocks by name

Block Actions

This section is a work in progress

Using LCD Screens

This section is a work in progress

There are 2 types of LCD screens. IMyTextSurface (Normal LCD’s) and IMyTextSurfaceProvider (Any block with multiple screens, like a cockpit or a programmable block).

Using an LCD screen

Using Multi-Screen Blocks

Unlike the normal LCD, an IMyTextSurfaceProvider requires a number to indicate which screen to use. In the block terminal, you can see a list of screens (A programmable block has 2: Large Display and Keyboard). The topmost screen is 0, and the second screen is 1. In the cockpit, there are more, but the list always starts at 0.

Displaying Text

Using Both Types In The Same Variable

In order to use the 2 types of screens in the same variable, we will need to check which type of screen it is. The following code is an example of how to tackle this problem.

After this code, you can write anything to the screen using textSurface.WriteText(); Despite the different screen types.

More Actions

You can find more actions at Malware’s Development Kit for Space Engineers (Search IMyTextSurface and IMyTextSurfaceProvider)

Источник

Программируемый блок

Contents

Ограничения

Ниже вы найдете список известных ограничений о которых мы знаем, а так же возможные их решения.

Обзор интерфейса

Программируемый блок

500px Steamworkshop webupload previewfile 360966557 preview

Панель программируемого блока на данный момент содержит следующие кнопки:

Edit – открыть редактор для редактирования скриптов и возможности сохранения/загрузки их на диск.

Также вы можете загрузить свои скрипты в «workshop» или загрузить себе скрипты, на которые вы подписаны.

Run – запустить скрипт сохраненный в редакторе. Скрипт будет запущен один раз. Однако эта кнопка является действием в терминале и вы можете соединить ее с сенсором, таймером или добавить на панель быстрого доступа.

Редактор

500px Steamworkshop webupload previewfile 360966557 preview %281%29
Редактор кода содержит следующие кнопки:
Help – открыть мануал по программированию в игре.
Check code – проверить код на наличие ошибок, а так же возможность использовать данный код.
Remember & Exit – сохранить ваш код, закрывает экран редактора и переведет к панели терминала.
Remember code – сохранить ваш код и оставит экран редактора открытым.
Browse Workshop – открыть окно для управления скриптами, вы можете сохранить/загрузить скрипты на диск, загрузить свои скрипты в «workshop» или загрузить себе скрипты, на которые вы подписаны.
Line counter – отобразить текущую строку кода и общее количество строк в коде.

Экран «Workshop»

200px Browse workshop
Этот экран аналогичный экрану с чертежами и содержит следующие кнопки:
Ok – загрузить выбранный скрипт в редактор и закроет экран.
Cancel – закрыть экран (изменения не будут внесены в редактор)
Details – открыть экран «детали», где вы можете увидеть описание скрипта.
Rename (только для локальных скриптов) – переименовать выбранный скрипт, если вы попытаетесь переименовать существующий скрипт, игра попросит подтверждение.
Delete (только для локальных скриптов) – удалить выбранный скрипт, после подтверждения.
Create from editor – создать новый скрипт с именем по умолчанию Script_XX, которое начинается с 0, и если скрипт с уже выбранным именем существует, то числовое значение в названии будет повышено. Для примера, первым будет Script_0, далее Script_1 и т.д.
Replace from editor (только для локальных скриптов) – заменить (после подтверждения пользователя) выбранный скрипт на скрипт из редактора.
Refresh Scripts – обновить локальные скрипты и скрипты на которые вы подписаны.

Детали (локальный скрипт)

500px Details %28local script%29
Этот экран показывает детали для локальных скриптов и содержит следующие кнопки:
Rename – переименовать выбранный скрипт, если вы попытаетесь переименовать существующий скрипт, игра попросит подтверждение.
Delete – удалить выбранный скрипт, после подтверждения.
Publish – опубликовать выбранный скрипт в «workshop» и показать странницу с опубликованным скриптом.
Browse Workshop – открыть экран «workshop» для просмотра, а также подписаться на скрипты.
Close – закрыть экран.

Детали («workshop» скрипт)

500px Details %28workshop script%29
Этот экран показывает детали для скриптов из «workshop» и содержит следующие кнопки:
Open in Workshop – открыть «workshop» страницу скрипта.
Close – закрыть экран.

Гайд по программированию

Доступ к редактору

Только один игрок может редактировать скрипт. Если кто-нибудь откроет занятый программируемый блок и попытается открыть редактор, он получит уведомление о том, что редактор уже открыт.

Метод Main

Видимость переменных

Компиляция

Когда вы нажмете кнопку “Check code”, код будет скомпилирован, также будет показан результат компиляции.
Процесс компиляции состоит из двух этапов:
-Во первых, код внутри редактора будет проверен на синтаксические ошибки, внутри языка C#
Если во время компиляции возникнут какие-либо ошибки, компиляция будет прервана и вы получите уведомление:
500px Compilation failed 1

К примеру «ааа» строка была помещена перед главным методом. Это неправильное языковое построение, поэтому компиляция будет прервана.
Также в сообщении об ошибке будет показана строка, в которой допущена ошибка и описание ошибки.

-Во-вторых, код будет проверен на наличие недопустимых имен или типов. Если во время компиляции возникнут какие-либо ошибки, компиляция будет прервана и вы получите уведомление:
500px Compilation failed 2
К примеру System.IO.Directory был использован для удаления другого каталога. Это запрещено, и вы получите уведомление: “Not allowed type was used in script”.

-Если компиляция и проверка проходит успешно, вы получите уведомление:
500px Compilation sucessfull
Это означает, что код не содержит ошибок в языке или неразрешенные методы.

Выполнение скрипта

Когда вы нажимаете кнопку «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

Вы здесь

left| Игровые Скрипты

Gray

Так как пока что нету отдельно форума для скриптов, где бы мы могли делиться наработками и прочим. Создам пока такую тему. Будем тут обмениваться знаниями.
Разработчики ввели «Прогрммируемы Блок» в нем мы можем писать код на С# (Си-шарп).

AlisaraDemon
Скорость физического объекта в SE хранится в свойствах Speed, AngularVelocity и AngularAcceleration объекта Sandbox.Common.Components.MyPhysicsComponentBase. Доступ к нему из объекта есть только через интерфейс IMyEntity недоступный из программируемого блока. Отмечу, что модописцы имеют полный доступ, как к MyPhysicsCompomemtBase, так и к IMyEntity.
Масса хранится так же в MyPhysicsComponentBase в поле Mass. Соответственно она доступна только модописцам.​
Из вышесказанного следует, что для нормальной работы скрипта-автопилота требуется заранее выяснить, какое ускорение создают установленные на корабле двигатели. Аналогичная ситуация со скоростью вращения корабля гиростабилизаторами.

Анимация: /workshop/3734
2015 03 10 00001

// Make a list for all GGs and fill it.
List blocks = new List ();
GridTerminalSystem.SearchBlocksOfName(gravityGeneratorNames, blocks, filterGGs);

// Check if we got enough blocks to go through
if(blocks.Count Автоматическаяф сцепка ротора: http://forums.keenswh.com/post/automatic-rotor-attach-like-in-the-good-o.

// ================================================================== //
// =====>>>>> Automatic rotor attach script
// This script is intended to restore the good old way of connecting
// rotors by simply moving base and head together, like in the good old days.
// Use this script with two self-trigger-now-repeating timers for best results.
// ============================================================= //

// temporary storage list of all blocks
List blocks = new List ();

Источник

Общеобразовательный справочник
Adblock
detector