Modding:Block Entity/ru: Difference between revisions

From Vintage Story Wiki
no edit summary
No edit summary
No edit summary
Tags: Mobile edit Mobile web edit
 
(15 intermediate revisions by one other user not shown)
Line 4: Line 4:
= Введение =
= Введение =


Блочная сущность — это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, например содержимое блока сундука, вам нужна сущность блока. Настоятельно рекомендуется прочитать руководство по [[Basic Modding/ru|базовым блокам]] и [[Advanced Blocks/ru|классам блоков]], чтобы правильно понять это руководство.
Блочная сущность — это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, например содержимое блока сундука, вам нужна сущность блока. Настоятельно рекомендуется прочитать руководство по [[Modding:Asset System/ru|базовым блокам]] и [[Modding:Advanced Blocks/ru|классам блоков]], чтобы правильно понять это руководство.


== Переключатель текстур ==
== Переключатель текстур ==
Line 15: Line 15:
Вы можете загрузить ассеты [https://wiki.vintagestory.at/images/d/d4/Ticking_-_No_CS_File.zip здесь] и поместить их в папку с модами.
Вы можете загрузить ассеты [https://wiki.vintagestory.at/images/d/d4/Ticking_-_No_CS_File.zip здесь] и поместить их в папку с модами.


<div lang="en" dir="ltr" class="mw-content-ltr">
== Сущность блока ==
== The BlockEntity ==
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Теперь нам нужно зарегистрировать наш класс blockentity и поэтому нам нужно создать новый файл *.cs в нашем проекте. Назовем его <code>Ticking.cs</code>.
Now we need to register our blockentity class and therefore we need to create a new *.cs file in our project. Let's name it <code>Ticking.cs</code>.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Прежде всего вам нужно создать сам класс blockentity. Поэтому вам нужно расширить <code>BlockEntity</code>:
First of all you need to create the blockentity class itself. Therefore you need to extend <code>BlockEntity</code>:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
     public class TickingBlockEntity : BlockEntity
     public class TickingBlockEntity : BlockEntity
Line 34: Line 27:
     }
     }
</syntaxhighlight>
</syntaxhighlight>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
----
----
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Этот класс должен иметь таймер, когда таймер достигает 3 секунд, он должен заменить текущий блок другим состоянием.
This class needs to have a timer, once the timer reaches 3 seconds it should replace the current block with the different state.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Чтобы создать таймер, нам нужно зарегистрировать прослушиватель тиков. Поэтому нам нужно переопределить <code>Initialize(ICoreAPI)</code>:
In order to create a timer we need to register a tick listener. Therefore we need to override <code>Initialize(ICoreAPI)</code>:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
         public override void Initialize(ICoreAPI api)
         public override void Initialize(ICoreAPI api)
Line 55: Line 40:
         }
         }
</syntaxhighlight>
</syntaxhighlight>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
добавить счетчик (который должен увеличиваться за тик)...
add a counter (which should increase per tick) ...
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
         public float timer;
         public float timer;
</syntaxhighlight>
</syntaxhighlight>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
... и собственно метод тиканья...
... and the actual ticking method ...
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
         public void OnGameTick(float dt)
         public void OnGameTick(float dt)
Line 78: Line 55:
         }
         }
</syntaxhighlight>
</syntaxhighlight>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Чтобы зарегистрировать метод тиканья, мы можем использовать <code>RegisterGameTickListener</code> в <code>Initialize</code>.
To register the ticking method we can use <code>RegisterGameTickListener</code> in <code>Initialize</code>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
         public override void Initialize(ICoreAPI api)
         public override void Initialize(ICoreAPI api)
Line 92: Line 65:
         }
         }
</syntaxhighlight>
</syntaxhighlight>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Сам таймер должен увеличиваться на dt, разницу во времени в секундах между текущим тиком и предыдущим тиком. Он тикает примерно каждые 50 мс или реже, если игра медленная. Поэтому, если таймер больше 3, он должен заменить блок:
The timer itself should increment by dt, the time difference in seconds between the current tick and the previous tick. It ticks about every 50ms or less often if the game is slow. So if the timer is greater than 3, it should replace the block:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
         public void OnGameTick(float dt)
         public void OnGameTick(float dt)
Line 114: Line 83:
                     block = Api.World.GetBlock(block.CodeWithParts("on"));
                     block = Api.World.GetBlock(block.CodeWithParts("on"));
                 }
                 }
</div>


                 <div lang="en" dir="ltr" class="mw-content-ltr">
                 Api.World.BlockAccessor.SetBlock(block.BlockId, Pos);
Api.World.BlockAccessor.SetBlock(block.BlockId, Pos);
             }
             }
         }
         }
</syntaxhighlight>
</syntaxhighlight>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
----
----
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Кроме того, нам нужно сохранить текущее время:
Furthermore we need to save the current time:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
         public override void ToTreeAttributes(ITreeAttribute tree)
         public override void ToTreeAttributes(ITreeAttribute tree)
Line 138: Line 99:
             tree.SetFloat("timer", timer);
             tree.SetFloat("timer", timer);
         }
         }
</div>


         <div lang="en" dir="ltr" class="mw-content-ltr">
         public override void FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldForResolving)
public override void FromTreeAttributes(ITreeAttribute tree, IWorldAccessor worldForResolving)
         {
         {
             base.FromTreeAttributes(tree, worldForResolving);
             base.FromTreeAttributes(tree, worldForResolving);
             timer = tree.GetFloat("timer");
             timer = tree.GetFloat("timer");
         }
         }
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
</syntaxhighlight>
</syntaxhighlight>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
== Регистрация объекта блока ==
== Registering the Block Entity ==
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Регистрация класса блочной сущности довольно проста (скорее похожа на регистрацию блочного класса). Вам нужен класс мода и переопределить <code>Start(ICoreAPI)</code>:
Registering the blockentity class is rather simple (rather similar to registering a block class). You need a mod class and override <code>Start(ICoreAPI)</code>:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<syntaxhighlight lang="c#">
<syntaxhighlight lang="c#">
     public class Ticking : ModSystem
     public class Ticking : ModSystem
     {
     {
</div>


         <div lang="en" dir="ltr" class="mw-content-ltr">
         public override void Start(ICoreAPI api)
public override void Start(ICoreAPI api)
         {
         {
             base.Start(api);
             base.Start(api);
             api.RegisterBlockEntityClass("tickingcounter", typeof(TickingBlockEntity));
             api.RegisterBlockEntityClass("tickingcounter", typeof(TickingBlockEntity));
         }
         }
</div>


     <div lang="en" dir="ltr" class="mw-content-ltr">
     }
}
</syntaxhighlight>
</syntaxhighlight>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
== Тестирование ==
== Testing ==
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Теперь все готово для запуска первого теста:
Now everything is ready to run the first test:
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<youtube>QQUibC4H9TI</youtube>
<youtube>QQUibC4H9TI</youtube>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
== Распространение ==
== Distribution ==
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
Чтобы все закончить, откройте modtools и введите <code>pack <your mod id></code>. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку с модами.
In order to finish everything, open the modtools and type in <code>pack <your mod id></code>. Now you can take the zip file and share it with other people. It will work in the same way as ordinary mods, you can install it by copying it into the mods folder.
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
= Скачать мод =
= Mod Download =
* для VS 1.12 (только исходник): [https://github.com/anegostudios/vsmodexamples/tree/ac7eeaed597b8a25dcfc2366b9c51cd92850d2b9/Mods/Ticking GitHub]
* for VS 1.12 (Source only): [https://github.com/anegostudios/vsmodexamples/tree/ac7eeaed597b8a25dcfc2366b9c51cd92850d2b9/Mods/Ticking GitHub]
* для VS 1.9: [https://wiki.vintagestory.at/images/8/80/Ticking_v1.0.0.zip Ticking_v1.0.0.zip]
* for 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]
* for VS 1.6: [https://wiki.vintagestory.at/images/6/65/Ticking.zip Ticking.zip]
</div>




{{Navbox/modding|Vintage Story}}
{{Navbox/modding|Vintage Story}}
Confirmedusers
1,783

edits