Как сделать торпеду в space engineers

Обновлено: 02.07.2024

Smash&Crash.rar (0)

Принцип работы:
1) Запуск торпеды в цель с расстояния 1500 метров. (В панели управления просто активировать Таймер 1)
2) Через 15 секунд полета торпеда разделится на 5 частей: боевую часть и 4 крыла-обманки.
3) 4 обманки отвлекут огонь туррелей на себя, пока боевая часть летит вперед по инерции. За счет работающих двигателей, они будут ближе к туррелям, да и не будут уничтожены сразу за счет высокой скорости.
4) Когда до цели останется 5 метров, 3 сенсора (2 из них запасные) подорвут боевую часть.

Начинка:
2 большие боеголовки, покрытые легкой броней. Это не даст туррелям подорвать заряды случайным попаданием, и также не ограничит мощность взрыва боеголовок (в отличии от тяжелой брони)
4 двигателя.
3 Сенсора для подрыва.
Таймер блоки для разделения торпеды.

Эта торпеда умеет обходить оборону вражеской цели, и поражать ее мощным зарядом.
Плюсы:
- Обманывает туррели, и безнаказанно поражает цель. Даже если туррели стреляли с 800м.
- Быстрая.
- Имунна к гравитационным щитам.
- Мощная.

Минусы:
- Затратно строить.
- Громоздкая.
- Необходимо запускать с определенной дистанции (1500 метров), либо перенастраивать торпеду под другие дистанции.
- Против тяжелой брони бесполезна. Впрочем после последнего патча против тяжелой брони хорош только таран.

Сразу отвечу на вопросы: А как она подрывается?
- Подрывается сенсором, когда цель на расстоянии 5 метров от торпеды.

PS Скрины немного хреновые, ибо фотал издалека. Если есть интерес, попробуйте торпеду в игре, сохранение прилагается.

Как сделать торпеду в space engineers

Space Engineers

Александр Недбаев

Александр Недбаев запись закреплена

Здравствуйте. Не давно скачал данную игру (пиратку) знаю,плохо так делать,но сперва хочу разобраться,что да как. так вот как на эту пиратину поставить чертеж корабля? Знаю конечно,что в лицензии куда проще

Валентин Кравченко

Короче тебе нужно скачать сам чертёж. Дальше нажми win+R и напиши в строке appdata, затем открой папку Roaming и найди там папку Space enginners. В этой папке будет папка Blueprints и в эту папку нужно запихивать чертежи. Вот тебе пару чертежей

Валентин Кравченко

Валентин Кравченко

Александр Недбаев

Валентин, Собственно файл sbb распаковываю и содержимое в Blueprints?)

Александр Недбаев

Валентин, Да,и в данной паке у меня еще 2 папки, это local и workshop,мне куда?

Валентин Кравченко

Александр, то что я тебе скинул их собственно не надо открывать, просто скачиваешь и кидаешь в папку Blueprints

Валентин Кравченко

Александр, а папки local и workshop должны находится в папке space engineers(эта папка в Roaming) ну скинь короче файлы в Blueprints

Александр Недбаев

Александр Недбаев

Валентин, в общем вот как выглядит указанный вами путь у меня, именно сюда класть файл?

Валентин Кравченко

Александр, ну попробуй сначала сюда, если не заработает то в папку workshop скинь

Александр Недбаев

Валентин Кравченко

Александр, не имея лицензии никак, но когда домой прийду могу скачать. И лучше в личку пиши

Yuki Kaze

Санёк Шальнев

Чувак тебе 300 р жалко? На платиру стимовскую купи и все играй на ровне со всеми и не надо мозги ипать с модами, чертежами и т.д.

Александр Недбаев

Санёк, Дак ясен пень,н оя пока в этой игре ни фигашечки не понимаю..я только научился корабль мелкий строить ни одного механизма не знаю, как панели управления эти работают,да и железка моя старовата, последняя версия на минимуме идет,так,что я пока смысла не вижу ее покупать. я так в 12 или 13 году rust купил,он шел на средних,а в прошлом году стал жутко тормозить,сис требования повысились,а оптимизация упала. Так,что может позже

Как сделать торпеду в 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 программируемого блока.

ОЧЕНЬ ВАЖНО: главное правильно поставить соответствия между программируемым блоком, поршнем и шасси. Ибо может выйти так: "когда шасси1 закреплено остановить поршень2" - сами понимаете такой вариант не катит никаким образом))

p.s. в воркшоп выставлю позже, когда будет готов прототип и видеодемонстрация.

Для работы ЛЮБОГО количества шлюзов требуется ОДИН программируемый блок.

Отображение провреждённых/недостоенных блоков.
Само собой автоматическое :)

Закрытие дверей при падении давления (разгерметизации).
Возможна поблочная настройка, тогда двери где давление выровнялось откроются - закрытым останется только сектор с утечкой.

p.s.
Обращайте внимание - если включить в основную группу ВНЕШНИЕ двери то после стабилизации давления они откроются :D будьте внимательны.

Михаил Сметанкин

Невероятно полезный скрипт, который позволяет с помощью одного нажатия кнопки выбрать положение ротора или поршня. За подробностями смотрите видео по ссылке.

Павел Гусаров

Скрипт предназначен для ведения огня очередями, для этого он попеременно отключает заряженные орудия - здорово повышает огневую мощь и удобство стрельбы. Поддерживает автоматизацию огня. Автор не я.

Ставите необходимое количество оружия, прогблок, таймер и еще какой-нибудь блок, у которого есть опция включить-выключить (обычно это лампа).

Переименовываете все орудия одинаково, к примеру "Пушка", без номеров и всего остального.

Загружаете в прогблок скрипт, меняете значение GUN_NAME на "Пушка". Выставляете задержку стрельбы - значение TIME_STEP, чем больше, тем быстрее стреляет, для некоторых орудий максимальная указана в самом скрипте в комментариях, никогда не ставьте отрицательное значение и ноль. Поставите слишком большое значение TIME_STEP - скрипт будет работать быстрее, чем у орудий задержка между выстрелами, и они будут стрелять как попало. Компилируете и сохраняете.

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

Запускаете прогблок. Включаете блок с именем "sequencerToggle".

Заряжаете орудия жмете на гашетку. Для автоматизации стрельбы просто соберите заскриптованные орудия в группу, и повесьте на горячую клавишу вкл/выкл стрельбы.

Если не все орудия заряжены полностью, то стрелять будет как попало.

При начале стрельбы бывает стреляет сразу из двух орудий.

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

Александр Михайлов

Михаил Сметанкин

Михаил Сметанкин

Jin Roh

Никита Селиванов

Адам, не совсем мод - плагин, выводит изображения с камер и турелей на любые LCD

Олег Резанков

Простой скрипт, который на левый дисплей выводит предупреждения о повреждениях, заканчивающемся боезапасе и малом количестве ресурсов. На правый дисплей выводится содержимое всех хранилищ корабля. Центральный дисплей отображает визуальное предупреждение (картинкой).
Имеет возможность небольшой настройки под себя в самом начале скрипта, где необходимо будет прописать свои ЖК панели для работы скрипта. По-умолчанию стоит: ЖК панель слева, ЖК панель справа, ЖК панель центр

Работает на версии 01_171_003 без модов на пиратке.

Побудило написать свой скрипт, так как большинство сложных скриптов у меня не работает. Да и скучно было.

Олег Резанков

Иван,
public void Main(string argument)
<
IMyOxygenTank hTank = GridTerminalSystem.GetBlockWithName("Hydrogen Tank") as IMyOxygenTank;
IMyTextPanel disp = GridTerminalSystem.GetBlockWithName("LCD 1") as IMyTextPanel;
disp.WritePublicText(hTank.GetOxygenLevel().ToString(), false); //заполненность бака
>
выдает значение float от 0 до 1, где 1 - полный бак

Олег Резанков

В программируемом блоке появилась возможность сохранять переменные.
Если заметили, по-умолчанию кроме Main() в редакторе появились две функции public Program() и public void Save().

Конструктор Program() автоматически запускается при первом запуске компьютера. Туда можно запихнуть инициализацию всех переменных и первоначальную настройку оборудования, чтобы не тратить на это время при очередном запуске скрипта.

Функция Save() так же автоматически запускается и сохраняет предоставленное строковое значение. Сохранение происходит не каждый запуск скрипта. Заметил, что сохраняется, когда открываю редактор программируемого блока или сохраняю игру, других триггеров для срабатывания этой функции я не обнаружил.

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

Переменная сохраняется после редактирования скрипта, отключения бортового питания и перезапуска игры (пока не нашел случая, в котором переменная бы не загрузилась).

Пример прикреплен ниже.

Insane Engineer

Может быть и не самый полезный , но прикольный =) Это музыкальный плеер. Проект старый, но оригинальный. Думаю Доп. информации не надо . Ссылка:

Андрей Луцюк

Описание: Скрипт подсчитывает содержимое инвентарей, перемещает позицию, которая не строится в конец очереди сборщика.
Умеет сортировать содержимое по контейнерам и дозаказывать компоненты в ассемблере на основании установленных лимитов.

Настройка:
в поле CustomData вносятся параметры для инициализации скрипта: (любая из строк может быть пустой и будет пропущена)

первая строка - название сборщика из которого берутся лимиты (останавливаем сборщик заказываем компоненты в том количестве,
в каком они всегда должны быть и прописываем название в эту строку)

все последующие строки устанавливают настройки контейнеров, в формате МаскаПоискаКонтейнера:ЧтоВНемЛежит,ЧтоВНемЛежит
что лежит можно указывать частично, типы указываются со * сначала,
например: *контейнер:Строительный - будет складывать Строительный компонент в контейнеры, заканчивающиеся на «контейнер»
*готовая продукция*:*компон,*боепри - все компоненты и боеприпасы будут перемещены в контейнеры в названии которых встречается «готовая продукция»

При первом запуске скрипта инициализация производится автоматически, далее по команде.

Команды: Скрипт поддерживает команды с параметрами. Команда и параметр разделяются «:»

Доступные команды и параметры:
init:panel,limit,storage,reload
производит переинициализацию скрипта из CustomData программного блока, параметрами можно ограничивать что инициализировать
panel - заново ищет текстовые панелей
limit - ищет сборщик из которого берутся лимиты
storage - перенастройка контейнеров
reload - поиск и запись доступных ассемблеров и блоков в которых будет в дальнейшем происходит поиск

? - Выводит информацию о текущих ассемблерах, лимитам и тестовым панелям, с любым параметром также выведет все обслуживаемые блоки с инвентарями

limit:название ассемблера - добавляет к существующим, лимиты из ассемблера. без параметров - очищает все установленные ранее лимиты

>:МаскаПоискаКонтейнера:ЧтоВНемЛежит,ЧтоВНемЛежит
устанавливает отбор для сортировки элементов в контейнере. Если перед первым параметром добавить +, будут добавлены доступные элементы иначе заменены

mask:маска поиска блоков
Устанавливает маску которая применяется при поиске обрабатываемых инвентарей, если маска пустая строка обрабатываются все доступные инвентари

reload:bloc,ass
Находит и запоминает все ассемблеры и блоки в которых будет в дальнейшем происходить поиск. Параметрами можно ограничивать что нужно искать. Без параметров ищет все.
Unload:маска
Производит единоразовое перемещение элементов из блоков подходящих под маску в установленные контейнеры. Полезно при разгрузке бурового корабля.

Скрипт находит все блоки ассемблеров и инвентаре, а затем обходит эти списки. Поэтому если необходимо заново найти инвентари или ассемблеры вызовите команду reload. Если необходимо переинициализировать текстовые панели воспользуйтесь командой init. Это поможет при разрушении готовых или достройке новых блоков.

Все настройки скрипт сохраняет и восстанавливает автоматически, при перезагрузке ничего перенастраивать не нужно

Как я строил гексапод в Space Engineers. Часть 1

Здравствуйте. Я хочу рассказать про проектирование и программирование системы управления конечностями в гексаподе, построенном в Space Engineers.

Забегая вперед скажу, что всё, что касается программирования в Space Engineer, будет в следующей статье. В этой я расскажу про обратную кинематику и покажу прототип на HTML Canvas в котором я занимался отладкой алгоритмов.


Предыстория и постановка задачи.

Изначально было построено сочлененное шасси, а затем на нем копательный агрегат. Такая конфигурация обеспечивала контакт всх колес с поверхностью на больших неровностях, в том числе и при скручивании.

image

Вроде такого

Но я столкнулся с невозожностью его точно разместить на месторождении, так-как колеса часто соскальзывали вниз (проблема физики — большинство блоков (в том числе и колеса) имеют слишком малый коэффициент трения). Колесная платформа с цельноповоротными колесными модулями оказалась слишком громоздкой и страдала от периодических physics explosion. В результате было решено строить шагающего робота — а именно — гексапод, как самую стабильную шагаюшую платфрому.

С чего начнет строить гексапод нормальный человек? Наверное зайдет в игру и начнет строить тело робота с конечностями, а потом думать как это всё оживлять. Но это не наш метод (ц)

Я начал с теории

Для строения ноги была выбрана следующая схема:

Inner joint — внутренний сустав, качающийся по оси рысканья (yaw)
Mid joint и outer joint — внешние суставы, качающиеся по оси тангажа (pitch). Направление отсчета — от основания ноги к концу ноги.


Угол 0 для всех суставов означает, что нога полностью выпрямлена (прямую ногу будет проще строить в игре).

Задача — при заданной целевой точке найти такие углы поворота сустовов, что-бы конец ноги оказался в заданной точке. Значит время вспоминать тригонометрию.

Угол внутреннего сустава можно найти через арктангенс горизонтальных координат цели.


С двумя другими суставами посложнее. У нас есть длина всех суставов. Можно найти угол к горизонту и расстояние между средним суставом и землей, а так-же расстояние до целевой точки.

Дальше через теорему косинусов нужно найти углы треугольника по известным сторонам.

image

Так это выглядит в коде:

Движение

Далее. Робот должен ходить, верно? То-есть мы должны передавать N раз в секунду каждой ноге координаты заданной позиции. С учетом того, что ног 6 и 3 из них двигаются в противофазе получается как-то сложно. Нужно ввести новый уровень абстракции.

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

Пока достаточно

Обдумывая как всё будет работать я понял, что задача слишком сложная для того, что-бы всё заработало с первого раза (с дебагом в Space Engineers всё плохо, но об этом в следующей части).

Поэтому я решил написать визуализатор. Мне хотелось его сделать без дополнительных библиотек и иметь возможность запускать его в один клик и без привязки к окружению.
Поэтому был выбран JS + HTML Canvas.

А сейчас нарисуем сову.


Шаг — структура данных для управления ногой:


Но для отрисовки понадобятся еще несколько классов:

Обертка над Canvas:


В классе Leg есть метод для получения текущих координат суставов. Вот эти координаты мы и будем отрисовывать.

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

И наконец Worker, который будет запускать симуляцию:

Правда миленько?

Здесь видно, что траектория движения ног отличается от окружности. Движение по вертикали напоминает урезанную синусоиду, а движение по горизонтали линейно. Это должно уменьшить нагрузку на ноги.

Теперь несколько пояснений, что происходит в коде.

Как научить робота поворачивать?

Для поворота я рассмотрел 2 ситуации:

Если робот стоит — ноги двигаются по окружности.

Единственное но — движение именно по окружности сильно усложнило-бы код с текущей реализацией. Поэтому ноги двигаются по касательной к окружности.

Когда робот двигается нужно реализовать что-то вроде Ackermann steering geometry с дифференциалом.

image

То-есть длина шага ног, двигающихся по меньшему радиусу, — меньше. А угол поворота — больше.

Что-бы реализовать изменение угла поворота для каждой ноги я придумал следующий алгоритм:

1. Считаем угол от изначального положения ноги к центру робота:


2. Считаем угол от изначального положения ноги к (центру робота + смещение, которое отвечает за поворот — это изменяемый параметр):


3. Поворачиваем шаг на разницу этих углов:


Но это не всё. Еще нужно изменять длину шага. Реализация в лоб — домножать длину шага на изменение расстояния до центра — имело фатальный недостаток — внешние ноги слишком широко шагали и начинали задевать друг друга.

Поэтому пришлось усложнить реализацию:

1. Считаем изменение расстояния до центра для каждой ноги:


0.3 — магическое число

2. Находим отношение между минимальным и максимальным изменением


Этот множитель отражает разницу между минимальным и максимальным изменением расстояния до центра. Он всегда меньше 1 и если на него домножать длину шага — она при повороте не будет увеличиваться даже для внешних по отношению к направлению поворота ног.


Вот как это работает (gif 2 мегабайта):

→ Поиграться с результатом можно тут

Для более пристального изучения рекомендую сохранить содержимое в html файл и продолжить в любимом текстовом редакторе.

Читайте также: