Modding:Block Entity/ru: Difference between revisions
Mirotworez (talk | contribs) (Created page with "Регистрация класса блочной сущности довольно проста (скорее похожа на регистрацию блочного класса). Вам нужен класс мода и переопределить <code>Start(ICoreAPI)</code>:") |
Mirotworez (talk | contribs) (Created page with "Теперь все готово для запуска первого теста:") |
||
Line 133: | Line 133: | ||
== Распространение == | == Распространение == | ||
Чтобы все закончить, откройте 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}} |
Revision as of 06:53, 17 October 2022
Эта страница проверялась в последний раз для версии 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 |