Modding:Block Entity/ru: Difference between revisions
Mirotworez (talk | contribs) (Created page with "Чтобы создать таймер, нам нужно зарегистрировать прослушиватель тиков. Поэтому нам нужно переопределить <code>Initialize(ICoreAPI)</code>:") Tags: Mobile edit Mobile web edit |
No edit summary Tags: Mobile edit Mobile web edit |
||
(10 intermediate revisions by one other user not shown) | |||
Line 4: | Line 4: | ||
= Введение = | = Введение = | ||
Блочная сущность — это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, например содержимое блока сундука, вам нужна сущность блока. Настоятельно рекомендуется прочитать руководство по [[ | Блочная сущность — это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, например содержимое блока сундука, вам нужна сущность блока. Настоятельно рекомендуется прочитать руководство по [[Modding:Asset System/ru|базовым блокам]] и [[Modding:Advanced Blocks/ru|классам блоков]], чтобы правильно понять это руководство. | ||
== Переключатель текстур == | == Переключатель текстур == | ||
Line 66: | Line 66: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Сам таймер должен увеличиваться на dt, разницу во времени в секундах между текущим тиком и предыдущим тиком. Он тикает примерно каждые 50 мс или реже, если игра медленная. Поэтому, если таймер больше 3, он должен заменить блок: | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
public void OnGameTick(float dt) | public void OnGameTick(float dt) | ||
Line 86: | 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 110: | 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}} |
Latest revision as of 11:15, 8 December 2023
Эта страница проверялась в последний раз для версии Vintage Story 1.16.
Введение
Блочная сущность — это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, например содержимое блока сундука, вам нужна сущность блока. Настоятельно рекомендуется прочитать руководство по базовым блокам и классам блоков, чтобы правильно понять это руководство.
Переключатель текстур
Давайте создадим блок, который меняет свою текстуру каждые 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-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав в папку с модами.
Скачать мод
- для VS 1.12 (только исходник): GitHub
- для VS 1.9: Ticking_v1.0.0.zip
- для VS 1.6: Ticking.zip
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 | Item • Entity • Block • Block Behaviors • Block Classes • Block Entities • Block Entity Behaviors • World properties |
Workflows & Infrastructure | Modding Efficiency Tips • Mod-engine compatibility • Mod Extensibility • VS Engine |
Additional Resources | Community Resources • Modding API Updates • Programming Languages • List of server commands • List of client commands • Client startup parameters • Server startup parameters Example Mods • API Docs • GitHub Repository |