Объекты блоков: Difference between revisions

From Vintage Story Wiki
(Created page with "__FORCETOC__ {{GameVersion|1.9}} = Введение = Block entity - это конструкция, которую вы можете прикрепить к существу...")
 
(Mark for deletion)
Tag: Replaced
 
Line 1: Line 1:
__FORCETOC__
{{Delete|Duplicate of [[Modding:Block_Entity/ru]]}}
{{GameVersion|1.9}}
 
= Введение =
 
Block entity - это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, такую ​​как содержимое сундука, вам нужна Block entity. Настоятельно рекомендуется прочитать руководство по [[Basic Modding | Basic Blocks]] и [[Advanced Blocks | Block Class]], чтобы правильно понять это руководство.
 
== Флиппер текстуры ==
Давайте создадим блок, который переключает свою текстуру каждые 3 секунды. У него должно быть два варианта: <code> "on" </code> и <code> "off" </code>. Дополнительно нам нужно определить класс blockentity следующим образом:
 
<syntaxhighlight lang="json">
entityClass: "tickingcounter",
</syntaxhighlight>
 
Вы можете скачать ресурсы [https://wiki.vintagestory.at/images/d/d4/Ticking_-_No_CS_File.zip здесь] и поместить их в свой каталог модов.
 
== BlockEntity ==
 
Теперь нам нужно зарегистрировать наш класс blockentity и, следовательно, нам нужно создать новый файл * .cs в нашем проекте. Давайте назовем это <code> Ticking.cs </code>.
 
Прежде всего вам нужно создать сам класс blockentity. Поэтому вам нужно расширить <code> BlockEntity </code>:
 
<syntaxhighlight lang="c#">
    public class TickingBlockEntity : BlockEntity
    {
   
    }
</syntaxhighlight>
 
----
 
Этот класс должен иметь таймер, как только таймер достигает 3 секунд, он должен заменить текущий блок другим состоянием.
 
Чтобы создать таймер, нам нужно зарегистрировать тиковый счетчик. Поэтому нам нужно переопределить <code> Initialize (ICoreAPI) </code>:
 
<syntaxhighlight lang="c#">
        public override void Initialize(ICoreAPI api)
        {
            base.Initialize(api);
        }
</syntaxhighlight>
 
добавить счетчик (который должен увеличиваться за тик) ...
 
<syntaxhighlight lang="c#">
        public int timer;
</syntaxhighlight>
 
... and the actual ticking method ...
 
<syntaxhighlight lang="c#">
        public void onTick(float par)
        {
       
        }
</syntaxhighlight>
 
Чтобы зарегистрировать метод тика, мы можем использовать <code> RegisterGameTickListener </code> в <code> Inizialize </code>
 
<syntaxhighlight lang="c#">
        public override void Initialize(ICoreAPI api)
        {
            base.Initialize(api);
            RegisterGameTickListener(onTick, 20);
        }
</syntaxhighlight>
 
Сам таймер должен увеличиваться за такт. Он тикает 20 раз в секунду, что означает, что прошло 3 секунды после того, как таймер достиг 60. Поэтому, если он больше 60, он должен заменить блок:
 
<syntaxhighlight lang="c#">
        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);
            }
        }
</syntaxhighlight>
 
----
 
Кроме того, нам нужно сохранить текущее время:
 
<syntaxhighlight lang="c#">
        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");
        }
</syntaxhighlight>
 
 
== Регистрация Block Entity ==
 
Зарегистрировать Block Entity довольно просто (довольно похоже на регистрацию block class). Вам нужен класс мода и переопределить <code> Start (ICoreAPI) </code>:
 
<syntaxhighlight lang="c#">
    public class Ticking : ModSystem
    {
 
        public override void Start(ICoreAPI api)
        {
            base.Start(api);
            api.RegisterBlockEntityClass("tickingcounter", typeof(TickingBlockEntity));
        }
 
    }
</syntaxhighlight>
 
== Тестирование ==
 
Теперь все готово для запуска первого теста:
 
<youtube>QQUibC4H9TI</youtube>
 
 
== Распределение ==
 
Чтобы закончить все, откройте modtools и введите <code> pack <ваш mod id> </code>. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав его в папку модов.
 
= Скачать мод =
 
* Для VS 1.9: [https://wiki.vintagestory.at/images/8/80/Ticking_v1.0.0.zip Ticking_v1.0.0.zip]
* Для VS 1.6: [https://wiki.vintagestory.at/images/6/65/Ticking.zip Ticking.zip]
 
{{Navbox/modding|Vintage Story}}

Latest revision as of 11:17, 8 December 2023

Delete.png

This article is a candidate for deletion.
Reason: Duplicate of Modding:Block_Entity/ru
Before deletion, check what links to this page, the page history, and the page log.