Modding:Блочная сущность
Эта страница проверялась в последний раз для версии 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));
}
}
Testing
Now everything is ready to run the first test:
Distribution
In order to finish everything, open the modtools and type in pack <your mod id>
. 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.
Mod Download
- for VS 1.12 (Source only): GitHub
- for VS 1.9: Ticking_v1.0.0.zip
- for 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 |