Почему не работает этот рекурсивный метод? - PullRequest
0 голосов
/ 05 мая 2020

Итак, я пытаюсь создать рекурсивный метод, который поместит большое количество блоков в 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? Или это что-то не слишком очевидное с информацией, которую я опубликовал?

...