|
|
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}}
| |