Modding:Блочная сущность

From Vintage Story Wiki
This page is a translated version of the page Modding:Block Entity and the translation is 100% complete.

Эта страница проверялась в последний раз для версии Vintage Story 1.16.

Other languages:

Введение

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

Переключатель текстур

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

	entityClass: "tickingcounter",

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

Сущность блока

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

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

    public class TickingBlockEntity : BlockEntity
    {
    
    }

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

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

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

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

        public float timer;

... и собственно метод тиканья...

        public void OnGameTick(float dt)
        {
        
        }

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

        public override void Initialize(ICoreAPI api)
        {
            base.Initialize(api);
            RegisterGameTickListener(OnGameTick, 50);
        }

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

        public void OnGameTick(float dt)
        {
            timer += dt;
            if(timer >= 3)
            {
                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.SetFloat("timer", timer);
        }

        public override void FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldForResolving)
        {
            base.FromTreeAttributes(tree, worldForResolving);
            timer = tree.GetFloat("timer");
        }

Регистрация объекта блока

Регистрация класса блочной сущности довольно проста (скорее похожа на регистрацию блочного класса). Вам нужен класс мода и переопределить Start(ICoreAPI):

    public class Ticking : ModSystem
    {

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

    }

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

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

Распространение

Чтобы все закончить, откройте modtools и введите pack <your 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.

Modding
Modding Introduction Getting Started Пакет тем
Content Modding Content Mods Developing a Content Mod Basic Tutorials Intermediate Tutorials Advanced Tutorials Content Mod Concepts
Code Modding Code Mods Setting up your Development Environment
Property Overview ItemEntityBlockBlock BehaviorsBlock ClassesBlock EntitiesBlock Entity BehaviorsWorld properties
Workflows & Infrastructure Modding Efficiency TipsMod-engine compatibilityMod ExtensibilityVS Engine
Additional Resources Community Resources Modding API Updates Programming Languages List of server commandsList of client commandsClient startup parametersServer startup parameters
Example ModsAPI DocsGitHub Repository