Перейти к содержанию

Предмет с временем горения#

Автор статьи — Doc.

Рабочий, тестовый мод с материалами данной статьи можно скачать здесь.

Данный мини-ресурс дает возможность добавить свой предмет как вид топлива для печки или механизма, который использует TileEntityFurnace#getItemBurnTime. Почти вся основная информация расписана в самом коде. Как минимум нужно знать как зарегистрировать событие/предмет/блок!

Начнем.

Для добавления времени топлива к предмету есть 3 разных варианта. Разберем все 3. Но какой лучше - скорее всего 1-ый.

Вариант 1#

Переопределение метода getItemBurnTime у предмета.

@Override
public int getItemBurnTime(ItemStack itemStack) { // Переопределение времени горения.
    return 200; //200 - это кол-во тиков за 1 предмет. 400 - это 2 предмета, 600 - это 3 и так далее!
}

Вариант 2#

Изменение через событие получения времени горения.

@SubscribeEvent
public static void fuel(FurnaceFuelBurnTimeEvent e) { // Эвент получения времени горения.
    if (e.getItemStack().getItem() == TMRegistry.itemWithFuel) // Проверка на наш предмет.
        e.setBurnTime(200); // Установка времени горения. Отменять эвент не нужно, т.к. он сам это уже делает.
}

Вариант 3#

Изменение через унаследования IFuelHandler. В 1.12.2 данный метод считается Deprecated. Для данного метода нужно создать класс, который будет наследован от IFuelHandler, так же его нужно регистрировать. Класс:

public class FuelHandler implements IFuelHandler { // Унаследование от обработчика времени топлива.
    @Override
    public int getBurnTime(ItemStack fuel) { // Сюда передается сам предмет, который проверяется на горение.
        if (fuel.getItem() == TMRegistry.itemWithFuel) // Проверка на наш предмет.
            return 200; // Установка времени горения.
        return 0;
    }
}

И сама регистрация. Она должна быть в инициализации мода. (FMLInitializationEvent)

GameRegistry.registerFuelHandler(new FuelHandler()); // Регистрация самого обработчика времени топлива.

Так же что бы удалить предмет, как топливо можно использовать вариант 2.

@SubscribeEvent
public static void fuel(FurnaceFuelBurnTimeEvent e) { // Эвент получения времени горения.
    if (e.getItemStack().getItem() == Items.COAL) // Проверка на удаляемый предмет.
        e.setBurnTime(0); // Установка времени горения.
}

Блок#

Для добавления блоку время горения нужно заменить: if (fuel.getItem() == TMRegistry.itemWithFuel) На if (fuel.getItem() == Item.getItemFromBlock(BLOCK)) Вместо BLOCK указать Ваш блок. Если делать через вариант 1, то переопределять метод нужно у ItemBlock.

Итог#

Для проверки можно просто попробовать "запустить" печку или же использовать JEI:

Демонстрация предмета с временем горения - 1

Демонстрация предмета с временем горения - 2