Как добавить уровень света блоку Minecraft? Forge Modding 1.20.1

Рейтинг: 0Ответов: 1Опубликовано: 26.08.2023

Я в Java совсем недавно, поэтому вопросы глупые наверное и поэтому не могу найти ответ на них в интернете, буду рад если вы сможете помочь с этим

Когда пытаюсь добавить lightLevel к блоку, он говорит что нужно добавить аргумент ToIntFunction

Когда я вроде бы добавляю этот аргумент

public static final RegistryObject<Block> GLOWING_WHITE_CONCRETE = registerBlock("glowing_white_concrete",
            () -> new GlowingBlock(BlockBehaviour.Properties.of().lightLevel(ToIntFunction)));

Он просит добавить поле

    private static java.util.function.ToIntFunction<BlockState> ToIntFunction;

Я добавлю и его, и вот дальше совсем не понимаю чего от меня хотят Мне банально нужно чтобы блок испускал свет в нужном мне значении от 1 до 15 и всё

Ответы

▲ 1

ToIntFunction в Java – функциональный интерфейс. В качестве аргумента, реализующий этот интерфейс можно использовать лямбда-выражение, принимающее параметр любого типа и производящее любое действие с ним, например, a -> (int)(a * 10), если a числового типа, или не задействующее его, например, a -> 10. В данном случае задание уровня света 15 будет выглядеть так:

public static final RegistryObject<Block> GLOWING_WHITE_CONCRETE = registerBlock("glowing_white_concrete",
        () -> new GlowingBlock(BlockBehaviour.Properties.of().lightLevel((state) -> 15)));

В такой реализации блок будет всегда испускать тот уровень света, который задан при регистрации.

Для динамического изменения уровня света, функцией следует передать уже существующую для этого LightBlock.LIGHT_EMISSION. Для его работы необходимо задать поле public static final IntegerProperty LEVEL = BlockStateProperties.LEVEL в классе целевого блока (в данном случае, в классе GlowingBlock) и менять его в методах класса или через метод класса Level setBlock. Можно не задавать это поле, а наследовать класс целевого блока от класса LightBlock, но это не рекомендуется из-за специфики реализации методов последнего.

Реализация RegistryObject для такого случая:

public static final RegistryObject<Block> GLOWING_WHITE_CONCRETE = registerBlock("glowing_white_concrete",
        () -> new GlowingBlock(BlockBehaviour.Properties.of().lightLevel(LightBlock.LIGHT_EMISSION)));