Я в кратце расскажу как писать собственные моды под игру Space Engineers на языке C# (Sharp).
Статья больше ориентирована на более менее опытных людей, знакомых с азами программирования на одном из объектно ориентированных языков.
В статье будет описаны лишь базовые вещи для того, чтобы начать писать, будут показаны пара примеров.
Если нужны подробности, пишите комментарии, сделаю более подробный обзор для начинающих.
Открываем видео от разработчиков: http://www.youtube.com/watch?v=gAh1bNfRLPw
По видео мы повторяем все до момента когда придет пора писать код.
Вот тут мы остановимся по подробнее.
По первых: убедитесь что вы импортировали все необходимые пространства имен как указано в видео, начала вашего кода будет выглядеть как то так:
Далее мы указываем пространство имен и имя нашего класса.
There are several ways to this
You add handler on MyAPIGateway.Utils.MessageEntered and execute your code depending on player input to chat
You can subclass MySessionComponentBase, add Attribute and it will get loaded before world and then updated each frame.
You can subclass MyGameLogicComponent, add Attribute and it will get hooked to any object
1) Можно повесить обработчик события MyAPIGateway.Utils.MessageEntered (отправлено сообщение в чат) и по срабатыванию триггера этого события вызывать вашу функцию с кодом.
2) Можно расширить класс MySessionComponentBase, в таком случае ваш код может выполняться при каждой перерисовке, либо при загрузке единожды, что мы и сделаем в примере ниже.
3) И можно расширить класс MyGameLogicComponent который позволит привящать к любому игровому объекту. Об этом напишу если будут желающие.
И так представляю полную версию кода примитивного мода, который лишь дублирует наши сообщения в чате и выводит уведомление.
public class Bot : MySessionComponentBase - Мы расширили базовый класс
public override void BeforeStart() - переопределили базовый метод
MyAPIGateway.Utilities.MessageEntered += new MessageEnteredDel((string messageText, ref bool sendToOthers) => onMessage(messageText)); - И добавили обработчик событий, который при появлении сообщения в чате вызывает метод onMessage
Внутри метода onMessage мы обращаемся к 2 методам:
1) MyAPIGateway.Utilities.ShowMessage() - Пишет сообщение в чат, в качестве первого аргумента принимается имя отправителя (ник), второй аргумент - само сообщение.
2) MyAPIGateway.Utilities.ShowNotification() - Отображает текстовое уведомление на экране игрока.
Сохраняем полученный код, как bot.cs,
Заходим по пути - (У вас буква диска может быть другой)C:\Users\[Ваш пользователь]\AppData\Roaming\Space Engineers\
Создаем папку Mods, если ее еще нет, в ней создаем папки Bot\Data\Scripts\BotScript\ сюда кладем наш bot.cs
Полный путь у меня выглядит так:
C:\Users\sudoroot\AppData\Roaming\Space Engineers\Bot\Data\Scripts\BotScript\bot.cs
Запускаем игру, либо создаем новый мир, либо загружаем уже созданный, до загрузки вам надо лишь зайти в настройки этого мира - mods - и добавить наш мод.
Вот такой небольшой и нехитрый код, позволил нам обратится к игровому API.
Если эта статья понравится, напишу более подробно и более детально.
Статья больше ориентирована на более менее опытных людей, знакомых с азами программирования на одном из объектно ориентированных языков.
В статье будет описаны лишь базовые вещи для того, чтобы начать писать, будут показаны пара примеров.
Если нужны подробности, пишите комментарии, сделаю более подробный обзор для начинающих.
Открываем видео от разработчиков: http://www.youtube.com/watch?v=gAh1bNfRLPw
По видео мы повторяем все до момента когда придет пора писать код.
Вот тут мы остановимся по подробнее.
По первых: убедитесь что вы импортировали все необходимые пространства имен как указано в видео, начала вашего кода будет выглядеть как то так:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Linq;
using Sandbox.ModAPI;
using Sandbox.Common;
using Sandbox.Common.ObjectBuilders;
using Sandbox.Common.Components;
Далее мы указываем пространство имен и имя нашего класса.
namespace Bot
{
public class Bot : MySessionComponentBase
{
}
}
И тут разработчики предлагают нам на выбор несколько вариантов как можно активировать свой код.There are several ways to this
You add handler on MyAPIGateway.Utils.MessageEntered and execute your code depending on player input to chat
You can subclass MySessionComponentBase, add Attribute and it will get loaded before world and then updated each frame.
You can subclass MyGameLogicComponent, add Attribute and it will get hooked to any object
1) Можно повесить обработчик события MyAPIGateway.Utils.MessageEntered (отправлено сообщение в чат) и по срабатыванию триггера этого события вызывать вашу функцию с кодом.
2) Можно расширить класс MySessionComponentBase, в таком случае ваш код может выполняться при каждой перерисовке, либо при загрузке единожды, что мы и сделаем в примере ниже.
3) И можно расширить класс MyGameLogicComponent который позволит привящать к любому игровому объекту. Об этом напишу если будут желающие.
И так представляю полную версию кода примитивного мода, который лишь дублирует наши сообщения в чате и выводит уведомление.
using Sandbox.ModAPI;
using Sandbox.Common;
using Sandbox.Common.ObjectBuilders;
using Sandbox.Common.Components;
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Linq;
namespace Bot
{
[Sandbox.Common.MySessionComponentDescriptor(Sandbox.Common.MyUpdateOrder.BeforeSimulation)]
public class Bot : MySessionComponentBase
{
public override void BeforeStart()
{
base.BeforeStart();
MyAPIGateway.Utilities.MessageEntered += new MessageEnteredDel((string messageText, ref bool sendToOthers) => onMessage(messageText));
}
private void onMessage(String messageText)
{
MyAPIGateway.Utilities.ShowMessage("Bot", "player say: " + messageText);
MyAPIGateway.Utilities.ShowNotification("My notification!");
}
}
}
Давайте теперь разберем более подробно.public class Bot : MySessionComponentBase - Мы расширили базовый класс
public override void BeforeStart() - переопределили базовый метод
MyAPIGateway.Utilities.MessageEntered += new MessageEnteredDel((string messageText, ref bool sendToOthers) => onMessage(messageText)); - И добавили обработчик событий, который при появлении сообщения в чате вызывает метод onMessage
Внутри метода onMessage мы обращаемся к 2 методам:
1) MyAPIGateway.Utilities.ShowMessage() - Пишет сообщение в чат, в качестве первого аргумента принимается имя отправителя (ник), второй аргумент - само сообщение.
2) MyAPIGateway.Utilities.ShowNotification() - Отображает текстовое уведомление на экране игрока.
Сохраняем полученный код, как bot.cs,
Заходим по пути - (У вас буква диска может быть другой)C:\Users\[Ваш пользователь]\AppData\Roaming\Space Engineers\
Создаем папку Mods, если ее еще нет, в ней создаем папки Bot\Data\Scripts\BotScript\ сюда кладем наш bot.cs
Полный путь у меня выглядит так:
C:\Users\sudoroot\AppData\Roaming\Space Engineers\Bot\Data\Scripts\BotScript\bot.cs
Запускаем игру, либо создаем новый мир, либо загружаем уже созданный, до загрузки вам надо лишь зайти в настройки этого мира - mods - и добавить наш мод.
Вот такой небольшой и нехитрый код, позволил нам обратится к игровому API.
Если эта статья понравится, напишу более подробно и более детально.
Хороший гайд!)
ОтветитьУдалитьСпасибо!
УдалитьХороший гайд! , но я не как не пойму можно ли добавить к функциям сенсора переключатель реагировать на вражеских игроков!
ОтветитьУдалитьХороший вопрос. Я постараюсь в ближайшее время на него вам ответить. Не стоит забывать что API в стадии даже не бета, а альфа тестирования. Я думаю функционал добавится с патчами.
УдалитьОпишите пожалуйста поподробней о 3-м варианте через расширение класса MyGameLogicComponent. Очень интересно...
ОтветитьУдалитьИ как сделать проверку на наличие компонента, например если сообщение
ОтветитьУдалить"/it me" или "/it him"
То в обоих случаях срабатывал метод.
Сделайте гайд по логике и подробнее по чату, как сделать обработку определенного сообщения, а не любого?
ОтветитьУдалить