Итак, я пытаюсь создать рекурсивный метод, который поместит большое количество блоков в DeferredRegister с очень небольшим вводом, но я думаю, что, возможно, я не понимаю чего-то важного в инициализации. Обычно вы добавляете блок, который делает что-то вроде этого:
public static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS, WipLash.MOD_ID);***
public static final RegistryObject<Block> BLOCK_NAME = BLOCKS.register("registry_name", () ->
new Block(Block.Properties)
Я создал набор классов и методов, которые, в общем, делают что-то вроде следующего:
ClassThatDoesTheThing<C extends AbstractBaseBlock>
C rootBaseBlock;
public ClassThatDoesTheThing(C baseBlock)
{
this.rootBaseBlock
addToRegister(this.rootBaseBlock.getRegistryName(), this.rootBaseBlock().blockConstructor());
ArrayList<Extension> extensions = this.rootBaseBlock.getTemplate().getExtensionList();
for(Extension extension : extensions)
new ClassThatDoesTheThing(new BaseBlock(this.rootBaseBlock.getRegistryName() + extension.getRegistryName(), this.rootBaseBlock.getBlockProperties(), extension.getTemplate());
}
BaseBlock содержит поле для обычного Minecraft Block.Properties, имя реестра и шаблон. Каждый класс BaseBlock также имеет конструктор блока, который возвращает новый блок minecraft того или иного типа в зависимости от класса. BaseSlab вернет, например, SlabBlock, который является расширением Block. Вы должны объявить BaseBlock следующим образом:
new BaseBlock("green_stone", Block.Properties.from(Blocks.STONE), aTemplate);
Шаблон содержит ArrayList с потенциально большим количеством расширений, которые представляют собой просто BaseBlocks с парой дополнительных полей, которые помогают определить, как блок должен называться в ClassThatDoesTheThing . Идея состоит в том, что для каждого объявленного BaseBlock рекурсивный метод добавит его в отложенный реестр, а затем добавит каждое расширение в реестр с соответствующим именем, например "green_stone_bricks", если бы мы использовали приведенный выше пример.
У меня версия работает частично. Он добавит первый блок в реестр и добавит расширения , если расширения также не имеют расширений . Если бы у расширения было собственное расширение, скажем "green_stone_bricks_slab", я получил бы исключение NullPointerException. Мне здесь не хватает какого-то базового принципа c java? Или это что-то не слишком очевидное с информацией, которую я опубликовал?