Confirmedusers
1,783
edits
Mirotworez (talk | contribs) 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: | ||
= Введение = | = Введение = | ||
Блочная сущность — это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, например содержимое блока сундука, вам нужна сущность блока. Настоятельно рекомендуется прочитать руководство по [[ | Блочная сущность — это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, например содержимое блока сундука, вам нужна сущность блока. Настоятельно рекомендуется прочитать руководство по [[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 здесь] и поместить их в папку с модами. | ||
== Сущность блока == | |||
= | |||
Теперь нам нужно зарегистрировать наш класс blockentity и поэтому нам нужно создать новый файл *.cs в нашем проекте. Назовем его <code>Ticking.cs</code>. | |||
Прежде всего вам нужно создать сам класс blockentity. Поэтому вам нужно расширить <code>BlockEntity</code>: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public class TickingBlockEntity : BlockEntity | public class TickingBlockEntity : BlockEntity | ||
Line 34: | Line 27: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
---- | ---- | ||
Этот класс должен иметь таймер, когда таймер достигает 3 секунд, он должен заменить текущий блок другим состоянием. | |||
Чтобы создать таймер, нам нужно зарегистрировать прослушиватель тиков. Поэтому нам нужно переопределить <code>Initialize(ICoreAPI)</code>: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public override void Initialize(ICoreAPI api) | public override void Initialize(ICoreAPI api) | ||
Line 55: | Line 40: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
добавить счетчик (который должен увеличиваться за тик)... | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public float timer; | public float timer; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
... и собственно метод тиканья... | |||
... | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public void OnGameTick(float dt) | public void OnGameTick(float dt) | ||
Line 78: | Line 55: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Чтобы зарегистрировать метод тиканья, мы можем использовать <code>RegisterGameTickListener</code> в <code>Initialize</code>. | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public override void Initialize(ICoreAPI api) | public override void Initialize(ICoreAPI api) | ||
Line 92: | Line 65: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Сам таймер должен увеличиваться на dt, разницу во времени в секундах между текущим тиком и предыдущим тиком. Он тикает примерно каждые 50 мс или реже, если игра медленная. Поэтому, если таймер больше 3, он должен заменить блок: | |||
<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")); | ||
} | } | ||
Api.World.BlockAccessor.SetBlock(block.BlockId, Pos); | |||
Api.World.BlockAccessor.SetBlock(block.BlockId, Pos); | |||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
---- | ---- | ||
Кроме того, нам нужно сохранить текущее время: | |||
<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); | ||
} | } | ||
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"); | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Регистрация объекта блока == | |||
= | |||
Регистрация класса блочной сущности довольно проста (скорее похожа на регистрацию блочного класса). Вам нужен класс мода и переопределить <code>Start(ICoreAPI)</code>: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public class Ticking : ModSystem | public class Ticking : ModSystem | ||
{ | { | ||
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)); | ||
} | } | ||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Тестирование == | |||
= | |||
Теперь все готово для запуска первого теста: | |||
<youtube>QQUibC4H9TI</youtube> | <youtube>QQUibC4H9TI</youtube> | ||
== Распространение == | |||
= | |||
Чтобы все закончить, откройте modtools и введите <code>pack <your mod id></code>. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку с модами. | |||
= Скачать мод = | |||
* для VS 1.12 (только исходник): [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] | ||
* | * для VS 1.6: [https://wiki.vintagestory.at/images/6/65/Ticking.zip Ticking.zip] | ||
* | |||
{{Navbox/modding|Vintage Story}} | {{Navbox/modding|Vintage Story}} |