Объекты блоков

From Vintage Story Wiki
Jump to navigation Jump to search
This page is written for Vintage Story version 1.9

Введение

Block entity - это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, такую ​​как содержимое сундука, вам нужна Block entity. Настоятельно рекомендуется прочитать руководство по Basic Blocks и Block Class, чтобы правильно понять это руководство.

Флиппер текстуры

Давайте создадим блок, который переключает свою текстуру каждые 3 секунды. У него должно быть два варианта: "on" и "off" . Дополнительно нам нужно определить класс blockentity следующим образом:

	entityClass: "tickingcounter",

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

BlockEntity

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

Прежде всего вам нужно создать сам класс blockentity. Поэтому вам нужно расширить BlockEntity :

    public class TickingBlockEntity : BlockEntity
    {
    
    }

Этот класс должен иметь таймер, как только таймер достигает 3 секунд, он должен заменить текущий блок другим состоянием.

Чтобы создать таймер, нам нужно зарегистрировать тиковый счетчик. Поэтому нам нужно переопределить Initialize (ICoreAPI) :

        public override void Initialize(ICoreAPI api)
        {
            base.Initialize(api);
        }

добавить счетчик (который должен увеличиваться за тик) ...

        public int timer;

... and the actual ticking method ...

        public void onTick(float par)
        {
        
        }

Чтобы зарегистрировать метод тика, мы можем использовать RegisterGameTickListener в Inizialize

        public override void Initialize(ICoreAPI api)
        {
            base.Initialize(api);
            RegisterGameTickListener(onTick, 20);
        }

Сам таймер должен увеличиваться за такт. Он тикает 20 раз в секунду, что означает, что прошло 3 секунды после того, как таймер достиг 60. Поэтому, если он больше 60, он должен заменить блок:

        public void onTick(float par)
        {
            timer++;
            if(timer > 60)
            {
                Block block = api.World.BlockAccessor.GetBlock(pos);
                if (block.Code.Path.EndsWith("-on"))
                    block = api.World.GetBlock(block.CodeWithParts("off"));
                else
                    block = api.World.GetBlock(block.CodeWithParts("on"));
                api.World.BlockAccessor.SetBlock(block.BlockId, pos);
            }
        }

Кроме того, нам нужно сохранить текущее время:

        public override void ToTreeAttributes(ITreeAttribute tree)
        {
            base.ToTreeAttributes(tree);
            tree.SetInt("timer", timer);
        }

        public override void FromTreeAtributes(ITreeAttribute tree)
        {
            base.FromTreeAtributes(tree);
            timer = tree.GetInt("timer");
        }


Регистрация Block Entity

Зарегистрировать Block Entity довольно просто (довольно похоже на регистрацию block class). Вам нужен класс мода и переопределить Start (ICoreAPI) :

    public class Ticking : ModSystem
    {

        public override void Start(ICoreAPI api)
        {
            base.Start(api);
            api.RegisterBlockEntityClass("tickingcounter", typeof(TickingBlockEntity));
        }

    }

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

Теперь все готово для запуска первого теста:


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

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

Скачать мод


Vintage Story: 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