Files
GTNHLib/models_uk.md
T

7.2 KiB
Raw Blame History

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 працює у три кроки:

  1. BlockProperty реєструється для блоку (і опціонально для його предмета).
  2. Властивість надає значення з:
    • Світу + TileEntity
    • ItemStack
  3. Завантажувач 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-координат.