7.2 KiB
Model API
🌐 Мови: English | Українська
Загалом цей API розроблений так, щоб імітувати поведінку новіших версій Minecraft.
Свідомі відхилення
Наразі відсутні.
Колишні відхилення
Посилання на текстури більше не вважаються прив’язаними до розташувань 1.7.10. Замість цього вони обробляються з assets/namespace/textures, як у сучасних версіях. Це також означає, що тепер ви можете використовувати будь-яку текстуру у своєму ISBRH, і GTNHLib впровадить її в атлас блоків. Будь ласка, використовуйте цю можливість відповідально.
Ресурспаки тепер можуть замінювати більшість блоків, аналогічно до сучасних версій. Зверніть увагу: це працює насамперед для блоків із ISBRH — якщо для блоку в коді зареєстровано TESR, це призведе до рендерингу як моделі, так і TESR.
Приклади
BlockColor
Використовуйте для застосування кольору до TintIndex.
Приклад: Використання реєстрації BlockColor
BlockColor.registerBlockColors(new IBlockColor() {
@Override
public int colorMultiplier(IBlockAccess world, int x, int y, int z, int tintIndex) {
// Повертає червоний колір для основного шару, зелений — для додаткового
return tintIndex == 0 ? 0xFF0000 : 0x00FF00;
}
@Override
public int colorMultiplier(ItemStack stack, int tintIndex) {
// Повертає синій колір для основного шару, жовтий — для додаткового
return tintIndex == 0 ? 0x0000FF : 0xFFFF00;
}
}, ModBlocks.MY_CUSTOM_BLOCK);
Приклад: Реалізація IBlockColor безпосередньо у класі блоку
public class BlockTestTint extends Block implements IBlockColor {
public BlockTestTint() {
super(Material.wood);
}
@Override
public int colorMultiplier(IBlockAccess world, int x, int y, int z, int tintIndex) {
return switch(tintIndex) {
case 0 -> 0xFF0000; // червоний
case 1 -> 0x00FF00; // зелений
case 2 -> 0x0000FF; // синій
case 3 -> 0xFFFF00; // жовтий
case 4 -> 0xFF00FF; // пурпуровий
case 5 -> 0x00FFFF; // блакитний
default -> 0xFFFFFF; // білий
};
}
@Override
public int colorMultiplier(ItemStack stack, int tintIndex) {
return colorMultiplier(null, 0, 0, 0, tintIndex);
}
}
BlockState API
Замість використання 4-бітових метаданих, вибір моделі можна визначити на основі повних даних про стан блоку за допомогою зареєстрованого BlockProperty.
Це дозволяє:
- Необмежену кількість логічних станів (без обмеження в 16 значень метаданих);
- Варіанти моделей на основі даних
TileEntity; - Визначення стану з урахуванням
ItemStack; - Динамічну поведінку рендерингу.
Визначення BlockState працює у три кроки:
BlockPropertyреєструється для блоку (і опціонально для його предмета).- Властивість надає значення з:
- Світу +
TileEntity ItemStack
- Світу +
- Завантажувач
JsonModelвизначає варіанти моделей, використовуючи ці значення властивостей.
1. Створення BlockProperty
Приклад: Властивість напрямку, яка базується на TileEntity.
DirectionBlockProperty property = new DirectionBlockProperty() {
@Override
public String getName() {
return "facing";
}
@Override
public boolean hasTrait(BlockPropertyTrait trait) {
return switch (trait) {
case SupportsWorld, WorldMutable, StackMutable, SupportsStacks -> true;
default -> false;
};
}
@Override
public ForgeDirection getValue(IBlockAccess world, int x, int y, int z) {
TileEntity te = world.getTileEntity(x, y, z);
if (te instanceof TileTestTintMul tile) {
return tile.getFacing();
}
return ForgeDirection.NORTH;
}
@Override
public void setValue(World world, int x, int y, int z, ForgeDirection value) {
TileEntity te = world.getTileEntity(x, y, z);
if (te instanceof TileTestTintMul tile) {
tile.setFacing(value);
}
}
@Override
public ForgeDirection getValue(ItemStack stack) {
return ForgeDirection.NORTH;
}
};
2. Реєстрація властивості
BlockPropertyRegistry.registerProperty(block, property); BlockPropertyRegistry.registerProperty(Item.getItemFromBlock(block), property);
Ви повинні зареєструвати властивість:
- Для блоку (стан у світі);
- Для предмета (відображення в інвентарі).
3. Визначення JSON-файлу blockstate
Приклад:
{
"variants": {
"facing=north": { "model": "modid:block/machine_north" },
"facing=south": { "model": "modid:block/machine_south" },
"facing=west": { "model": "modid:block/machine_west" },
"facing=east": { "model": "modid:block/machine_east" }
}
}
Завантажувач виконає такі дії:
- Надішле запит до
property.getValue(...); - Сформує рядок стану, наприклад:
facing=north; - Визначить відповідний варіант моделі.
Підтримувані атрибути
BlockPropertyTrait керує тим, де саме працює властивість:
SupportsWorld→ використовується під час рендерингу у світі;SupportsStacks→ використовується під час рендерингу предмета в інвентарі;WorldMutable→ значення можна змінювати у світі;StackMutable→ значення можна змінювати в ItemStack.
Реалізовуйте лише ті атрибути, які вам необхідні.
Заплановано
- Додавання м’якого затінення до ModelISBRH.
- Додавання відсікання граней для моделей.
- Реалізація фіксації UV-координат.