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

From Vintage Story Wiki
Revision as of 12:26, 14 May 2020 by Akellagray (talk | contribs) (Created page with "__FORCETOC__ {{GameVersion|1.9}} = Введение = Block entity - это конструкция, которую вы можете прикрепить к существу...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

This page was last verified 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-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав его в папку модов.

Скачать мод

Icon Sign.png

Wondering where some links have gone?
The modding navbox is going through some changes! Check out Navigation Box Updates for more info and help finding specific pages.