Объекты блоков
Contents
Введение
Block entity - это конструкция, которую вы можете прикрепить к существующему блоку, чтобы придать ему дополнительную функциональность. Всякий раз, когда блок должен что-то делать через регулярные промежутки времени или хранить дополнительную информацию, такую как содержимое сундука, вам нужна Block entity. Настоятельно рекомендуется прочитать руководство по Basic Blocks и Block Class, чтобы правильно понять это руководство.
Флиппер текстуры
Давайте создадим блок, который переключает свою текстуру каждые 3 секунды. У него должно быть два варианта: "on"
и "off"
. Дополнительно нам нужно определить класс blockentity следующим образом:
entityClass: "tickingcounter",
Вы можете скачать ресурсы здесь и поместить их в свой каталог модов.
BlockEntity
Теперь нам нужно зарегистрировать наш класс blockentity и, следовательно, нам нужно создать новый файл * .cs в нашем проекте. Давайте назовем это Ticking.cs
.
Прежде всего вам нужно создать сам класс blockentity. Поэтому вам нужно расширить BlockEntity
:
public class TickingBlockEntity : BlockEntity
{
}
Этот класс должен иметь таймер, как только таймер достигает 3 секунд, он должен заменить текущий блок другим состоянием.
Чтобы создать таймер, нам нужно зарегистрировать тиковый счетчик. Поэтому нам нужно переопределить Initialize (ICoreAPI)
:
public override void Initialize(ICoreAPI api)
{
base.Initialize(api);
}
добавить счетчик (который должен увеличиваться за тик) ...
public int timer;
... and the actual ticking method ...
public void onTick(float par)
{
}
Чтобы зарегистрировать метод тика, мы можем использовать RegisterGameTickListener
в Inizialize
public override void Initialize(ICoreAPI api)
{
base.Initialize(api);
RegisterGameTickListener(onTick, 20);
}
Сам таймер должен увеличиваться за такт. Он тикает 20 раз в секунду, что означает, что прошло 3 секунды после того, как таймер достиг 60. Поэтому, если он больше 60, он должен заменить блок:
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);
}
}
Кроме того, нам нужно сохранить текущее время:
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");
}
Регистрация Block Entity
Зарегистрировать Block Entity довольно просто (довольно похоже на регистрацию block class). Вам нужен класс мода и переопределить Start (ICoreAPI)
:
public class Ticking : ModSystem
{
public override void Start(ICoreAPI api)
{
base.Start(api);
api.RegisterBlockEntityClass("tickingcounter", typeof(TickingBlockEntity));
}
}
Тестирование
Теперь все готово для запуска первого теста:
Распределение
Чтобы закончить все, откройте modtools и введите pack <ваш mod id>
. Теперь вы можете взять zip-файл и поделиться им с другими людьми. Он будет работать так же, как и обычные моды, вы можете установить его, скопировав его в папку модов.
Скачать мод
- Для VS 1.9: Ticking_v1.0.0.zip
- Для VS 1.6: Ticking.zip
Main Page: Modding |
Basics | Mod Types | Asset System | Textures | Items | Recipes | Blocks | Model Creator | Release |
Advanced | Setup(Windows,Linux) | Items (Code, JSON) | Blocks | Item-Block interactions | Block Behaviors | Block Entities | Particles | World Access |
Worldgen | Terrain | Ores | Trees | WorldGen API |
Rendering | Shaders and Renderers |
Property Overview | Item | Block | Block Behaviors | Block Classes | Block Entities | Block Entity Behaviors |