Определение блоков и предметов в Java
Главной целью обновления KernelExtension RELEASE 4.0
было создание возможности для разработчиков модов писать код своего мода только на Java (и на C++ дополнительно), без JavaScript/Typescript.
Используя innercore_mod_toolchain, вы можете легко частично разрабатывать свой мод на Java. Ключевое слово - частично. Множество основных возможностей Inner Core заточены чисто под разработку на JavaScript, некоторые из них имплементированы прямо в JS-коде.
Одна из таких JavaScript-only возможностей в Inner Core — это регистрация кастомных блоков и предметов. KernelExtension начиная с RELEASE 4.0
решает эту проблему, теперь вы можете легко и удобно регистрировать новые блоки и предметы без необходимости писать какой-либо код на JavaScript/TypeScript.
Создание элементарных блоков и предметов
Базовый Java-класс для кастомного блока - vsdum.kex.japi.blocks.Block
.
Базовый Java-класс для кастомного предмета - vsdum.kex.japi.items.Item
.
Они оба не абстрактные, так что вы можете создать примитивный блок или предмет без объявления своего собственного класса, наследованного от базового. Например:
package visualstudiodan.kextest;
import vsdum.kex.japi.blocks.Block;
import vsdum.kex.japi.items.Item;
public class TestKEXDependentMod {
public static void main(String[] args)
{
int testBlockID = new Block("my_block").getId();
int testItemID = new Item("my_item").getId();
}
}
Регистрация
Помимо инициализации объекта блока или предмета, вы должны зарегистрировать его, используя соответствующий модуль регистрации (vsdum.kex.japi.blocks.BlockRegistry
для блоков и vsdum.kex.japi.items.ItemRegistry
для предметов).
Итак, для того чтобы уже иметь один новый блок и один новый предмет в игре, код выше должен выглядеть так:
package visualstudiodan.kextest;
import vsdum.kex.japi.blocks.Block;
import vsdum.kex.japi.blocks.BlockRegistry;
import vsdum.kex.japi.items.Item;
import vsdum.kex.japi.items.ItemRegistry;
public class TestKEXDependentMod {
public static void main(String[] args)
{
int testBlockID = BlockRegistry.register(new Block("my_block")).getId();
int testItemID = ItemRegistry.register(new Item("my_item")).getId();
}
}
Установка основных свойств
Блоки
У класса Block
есть метод addVariation(variationJson)
для установки текстуры, отображаемого имени и видимости единственной вариации блока (один блок может иметь до 16 вариаций), и setDefineData(variationsJsonArr)
для установки всего массива описания всех вариаций блока. JSON-объект вариации должен иметь такой же формат, как интерфейс BlockVariation, используемый в JS-методе Inner Core Block.createBlock.
new Block("my_block")
.addVariation(new JSONObject()
.put("name", "My Block")
.put("texture", new JSONArray()
.add(new JSONArray()
.put("my_block")
.put(0)))
.put("inCreative", true));
new Block("my_other_block")
.setDefineData(new JSONArray()
.put(new JSONObject()
.put("name", "My Block 2")
.put("texture", new JSONArray()
.add(new JSONArray()
.put("my_other_block")
.put(0))
.add(new JSONArray()
.put("my_other_block")
.put(1))
.add(new JSONArray()
.put("my_other_block")
.put(2)))
.put("inCreative", true)));
Без преувеличения, это решение невероятно громоздкое и не рекомендуется к использованию. Гораздо более простой, читабельный и легковесный метод установки данных определения блока показан здесь.
Предметы
Установка текстур для предметов гораздо менее громоздкая, в классе Item
есть просто методы setIcon(iconName[, iconIndex])
и setDisplayedName(name)
.
Кстати, вызов setDisplayedName
необязателен, так как отображаемое имя по умолчанию устанавливается "item.yourItemNameID.name"
. Поэтому, скажем, вы создали предмет со строковым ID "my_item"
, тогда вам просто нужно добавить перевод ключа "item.my_item.name"
.
new Item("my_item")
.setIcon("my_item"); // индекс иконки необязателен, по умолчанию 0
new Item("my_other_item")
.setIcon("my_item", 1)
.setDisplayedName("MOY DRUGOY PREDMET");
Статические дополнительные свойства
И класс Block
, и класс Item
имеют публичное константное поле properties
- объект для кастомизации широкого набора дополнительных свойств блока или предмета, тех свойств которые устанавливаются как постоянные значения.
Вы можете увидеть все методы BlockProperties
и ItemProperties
здесь и здесь соответственно. Все эти методы возвращают сам объект свойств, для написания последовательных вызовов.