Окрашивание текстуры

Версия Minecraft
1.12.2
205
12
103
Ahoy! o/

Смоделируем ситуацию:
Есть условный предмет. Пусть это будет.. Мм.. Кирпич. Этот кирпич нужно метой разбить на 16 видов, каждый вид окрасить в свой цвет, имея при этом всего 1 текстурку (по дефолту в таких случаях их делают белыми). Если с разделением я еще могу справиться, то с окрашиванием - уже не очень. Почитал доки форжа, это не помогло, ибо информация довольно сжатая, и примеров толком нет. Решился поискать аналогов в ванили, по памяти вспомнил о наличии зелек, стрел с эффектами и яиц спавна. И там, и там, все представлено достаточно сложно(из-за наличия второстепенного функционала), из-за чего анализ кода дается не очень. Из модов я, внезапно, тоже ничего такого не нашел, кроме FairyLights, но там ситуация еще сложнее.

Собственной, быстро набросал код условного кирпича с метой:

ItemBrick:
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;

import java.util.Arrays;

public class ItemBrick extends ItemBase {
    public ItemBrick(String name) {
        super(name);

        this.setHasSubtypes(true);
    }

    @Override
    public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) {
        if (tab == CreativeTab.HHTAB) {
            for (BrickTypes type : BrickTypes.values()) {
                items.add(new ItemStack(this, 1, type.ordinal()));
            }
        }
    }

    public enum BrickTypes {
        WHITE, RED, BLUE; //Далее идут остальные цвета по ванильной палитре EnumDyeColor

        public static BrickTypes getByMeta(int meta) {
            for (BrickTypes type : values()) {
                if (type.ordinal() == meta)
                    return type;
            }
            return null;
        }
    }

    @Override
    public String[] itemTypes() {
        return Arrays.stream(BrickTypes.values()).map(x -> x.name().toLowerCase()).toArray(String[]::new);
    }
}

Метод itemTypes используется для дальнейшей регистрации самих предметов, на это можете не обращать внимание.

Итоговый вопрос: Как научить предмет (и себя заодно, ага) окрашивать собственную текстуру в зависимости от меты? В идеале хотелось бы использовать ванильный энум цветов, дабы не регистрировать лишние элементы палитры.
Примеры реализации только приветствуются, почитать непонятные документации форжа я и сам могу.
 
Последнее редактирование:
205
12
103
Вот мод с данными методами окрашивания с открытым кодом: тык.
Насколько я понимаю, тут окрашиваются блоки (в случае с предметами там getItemFromBlock). Это у меня получилось сделать, пилил по примеру шалкеровых ящиков, а вот с предметом все сложнее(по крайней мере у меня), я вообще не могу догнать как это делается.

Знаю что для реализации нужна имплементация IItemColor и оверрайд множителя цветового кода. Что-то вроде этого:

Java:
    @Override
    public int colorMultiplier(ItemStack stack, int tintIndex) {
        return 0x00FF0000;
    }

А вот как быть дальше - хз
 
Последнее редактирование:

WantaSanchez

Опоздун
633
17
150
Вообще-то в GTCE куча пыли и прочего с шаблонами. Там модель предмета использует два слоя, первый - твой черно белый шаблон, второй слой - цвет наложения, остаётся понять, как этот цвет подставлять в коде. Ищи в исходниках.
 
205
12
103
Решил следующим образом:


Java:
    @SubscribeEvent
    public static void onItemColor(ColorHandlerEvent.Item event) {
        for (ItemBase item : ModItems.ITEMS) {
            if (item.isColored()) {
                for (int i = 0; i < item.itemTypes().length; i++) {
                    ModelLoader.setCustomModelResourceLocation(item, i, new ModelResourceLocation(item.getRegistryName(), "inventory"));

                    event.getItemColors().registerItemColorHandler((stack, s) -> ColorMap, ItemArray);
                }
            }
        }
    }

item.isColored() - проверка на наличие цветов у предмета, тип переменной - boolean. Используется для того, чтобы методы окраски не красили всё подряд, а только помеченные предметы.
ColorMap/ItemArray - те места, где хранится список предметов и хешмапы цветов (я собираю автоматическую регистрацию, потому у меня так).
 
Сверху