Классы блоков

From Vintage Story Wiki
Jump to navigation Jump to search


«Мод написан для Vintage Story версии 1.9 »

Настоятельно рекомендуется сначала прочитать Базовые блоки. Кроме того, это руководство требует среды разработки. Если у вас её еще нет, вам следует прочитать руководство Настройка среды для разработки.

Батут

В этом уроке мы создадим что-то более продвинутое. Блок с функциональностью ... батута!

Assets блоков

Первое, что нам понадобится, - это assets блока. Это довольно просто.

Единственное новое свойство - это class :

	class: "trampoline",

Мы создадим этот класс, чтобы дать блоку желаемую функциональность, поэтому убедитесь, что если вы выберете другое имя, оно будет соответствовать приведенному ниже. Вы можете скачать assets этого мода тут Все, что вам нужно сделать, это поместить этот zip-файл в каталог assets вашего проекта разработки.

Class Блока

Теперь нам нужно зарегистрировать наш class и, следовательно, нам нужно создать новый файл *. Cs в нашем проекте. Я назову это Trampoline.cs .

Система мода

Для создания мода вашему классу необходимо расширить ModSystem . Это позволит использовать для регистрации все виды обращений, но сейчас мы будем придерживаться нашего примера класса блока.

public class TrampolineMod : ModSystem
{
    
}

Теперь вам нужно переопределить метод Start (ICoreAPI) и зарегистрировать класс. Если вы выбрали другое имя класса, вы должны использовать его вместо Trampoline.

public class TrampolineMod : ModSystem
{
    public override void Start(ICoreAPI api)
    {
        base.Start(api);
        api.RegisterBlockClass("trampoline", typeof(TrampolineBlock));
    }
}

Это должно быть помечено как синтаксическая ошибка, потому что еще нет класса TrampolineBlock .

Класс Блока

Давайте создадим наш класс блоков, который, конечно, должен расширять Block :

public class TrampolineBlock : Block
{

}

Это должно решить все синтаксические ошибки.

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

Метод void onEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, bool isImpact) кажется хорошим способом реализации оживленной функциональности.

Когда объект должен отскочить?

  1. Сущность должна отскочить в тот момент, когда она приземляется на вершину блока, а не, когда она уже стоит на нем. Поэтому isImpact должно быть true
  2. Если объект сталкивается вертикально. Стороны блока не должны отталкивать объект. Таким образом, axis of the facing, должна быть Y.


Как мы можем заставить объект подпрыгивать? Чтобы заставить объект отскочить, нам нужно изменить его направление. Поэтому мы можем просто вернуть ему движение. Чем быстрее объект будет, во время столкновения, тем дальше он будет отталкиваться. Но просто возвращать движение было бы не верным. Объект никогда не потеряет своего движения и Будет отскакивать бесконечно. Итак, давайте перейдем к чему-то меньшему и заставим сущность терять 20% своей скорости и движения при каждом отскоке:

entity.Pos.Motion.Y *= -0.8;

Если мы соберем все вместе, это должно выглядеть так:

public class TrampolineBlock : Block
{
    public override void OnEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, Vec3d collideSpeed, bool isImpact)
    {
        if (isImpact && facing.Axis == EnumAxis.Y)
        {
            world.PlaySoundAt(tickSound, entity.Pos.X, entity.Pos.Y, entity.Pos.Z);
            entity.Pos.Motion.Y *= -0.8;
        }
    }
}

Although this code works already, some sound effects would be rather nice. We can implement it by adding a sound link field to our block, which can use to play the game:tick sound.

public AssetLocation tickSound = new AssetLocation("game", "tick");

This tickSound will played every time an entity bounces:

world.PlaySoundAt(tickSound, entity.Pos.X, entity.Pos.Y, entity.Pos.Z);

Если вы все сделали правильно, ваш файл должен выглядеть примерно так:

using Vintagestory.API.Common;
using Vintagestory.API.Common.Entities;
using Vintagestory.API.MathTools;

namespace VSExampleMods
{
    public class TrampolineMod : ModSystem
    {

        public override void Start(ICoreAPI api)
        {
            base.Start(api);
            api.RegisterBlockClass("trampoline", typeof(TrampolineBlock));
        }
    }

    public class TrampolineBlock : Block
    {
        public AssetLocation tickSound = new AssetLocation("game", "tick");

        public override void OnEntityCollide(IWorldAccessor world, Entity entity, BlockPos pos, BlockFacing facing, Vec3d collideSpeed, bool isImpact)
        {
            if (isImpact && facing.Axis == EnumAxis.Y)
            {
                world.PlaySoundAt(tickSound, entity.Pos.X, entity.Pos.Y, entity.Pos.Z);
                entity.Pos.Motion.Y *= -0.8;
            }
        }
    }
}


Конечно, вы можете загрузить файл напрямую Trampoline.cs.

Тестирование

Наконец мы можем запустить наш первый тест. Выглядит неплохо, правда?

Подсказка: используйте клиентскую команду .tfedit , если вы хотите отрегулировать положение блока, его вращение и масштаб в руках, в графическом интерфейсе, при падении на землю или в режиме от третьего лица.

Распределение

Чтобы всё закончить, откройте modtools и введите pack <ваш mod id> . Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку mods .

Загрузка модов

Вот моя версия:


Main Page: Modding
Basics Mod Types | Asset System | Textures | Items | Recipes | Blocks | Model Creator | Release
Advanced Setup(Windows,Linux) | Items (Code, JSON) | Blocks | Item-Block interactions | Block Behaviors | Block Entities | Particles | World Access
Worldgen Terrain | Ores | Trees | WorldGen API
Rendering Shaders and Renderers
Property Overview Item | Block | Block Behaviors | Block Classes | Block Entities | Block Entity Behaviors