From 1342326e70dba51467ab2df586bf3f640893bc62 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Fri, 16 Jul 2021 23:50:58 +0300 Subject: [PATCH] Anvils fix --- .../ru/betterend/blocks/AeterniumAnvil.java | 11 ---- .../betterend/blocks/basis/EndAnvilBlock.java | 14 ++--- .../blocks/complex/MetalMaterial.java | 4 +- .../integration/rei/REIAnvilCategory.java | 11 ++-- .../integration/rei/REIAnvilDisplay.java | 22 +++---- .../betterend/integration/rei/REIPlugin.java | 59 ++++++++----------- .../ru/betterend/recipe/SmithingRecipes.java | 4 +- .../java/ru/betterend/registry/EndBlocks.java | 22 +++---- .../java/ru/betterend/tab/CreativeTabs.java | 12 ++-- 9 files changed, 62 insertions(+), 97 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java index b74848dd..93a3f962 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -1,20 +1,14 @@ package ru.betterend.blocks; -import net.minecraft.world.item.Item; import net.minecraft.world.level.block.state.properties.IntegerProperty; import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.item.EndAnvilItem; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.registry.EndBlocks; -import ru.betterend.registry.EndItems; public class AeterniumAnvil extends EndAnvilBlock { - protected final Item anvilItem; - public AeterniumAnvil() { super(EndBlocks.AETERNIUM_BLOCK.defaultMaterialColor(), EndToolMaterial.AETERNIUM.getLevel()); - this.anvilItem = EndItems.registerEndItem("aeternuim_anvil_item", new EndAnvilItem(this)); } @Override @@ -25,9 +19,4 @@ public class AeterniumAnvil extends EndAnvilBlock { } return durability; } - - @Override - public Item asItem() { - return anvilItem; - } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index e1599f80..a4577659 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -10,6 +10,7 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.storage.loot.LootContext; +import org.jetbrains.annotations.NotNull; import ru.bclib.blocks.BaseAnvilBlock; import ru.betterend.blocks.complex.MetalMaterial; import ru.betterend.item.EndAnvilItem; @@ -20,12 +21,14 @@ import java.util.Objects; public class EndAnvilBlock extends BaseAnvilBlock { protected final int level; + protected final Item anvilItem; protected IntegerProperty durability; protected MetalMaterial metalMaterial; protected int maxDurability; public EndAnvilBlock(MaterialColor color, int level) { super(color); + this.anvilItem = new EndAnvilItem(this); this.level = level; } @@ -63,16 +66,12 @@ public class EndAnvilBlock extends BaseAnvilBlock { } @Override - @SuppressWarnings("deprecation") public Item asItem() { - if (metalMaterial != null) { - return metalMaterial.anvilItem; - } - return Item.byBlock(this); + return anvilItem; } @Override - public BlockState getStateForPlacement(BlockPlaceContext blockPlaceContext) { + public BlockState getStateForPlacement(@NotNull BlockPlaceContext blockPlaceContext) { return Objects.requireNonNull(super.getStateForPlacement(blockPlaceContext)).setValue(durability, maxDurability); } @@ -88,8 +87,7 @@ public class EndAnvilBlock extends BaseAnvilBlock { public static BlockState applyDamage(BlockState blockState) { Block anvilBlock = blockState.getBlock(); - if (anvilBlock instanceof EndAnvilBlock) { - EndAnvilBlock endAnvilBlock = (EndAnvilBlock) anvilBlock; + if (anvilBlock instanceof EndAnvilBlock endAnvilBlock) { IntegerProperty durability = endAnvilBlock.getDurability(); int damage = blockState.getValue(durability) - 1; if (damage > 0) { diff --git a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java index a729dfed..d892c7e6 100644 --- a/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/MetalMaterial.java @@ -66,7 +66,6 @@ public class MetalMaterial { public final ColoredMaterial bulb_lantern_colored; public final Block anvilBlock; - public final Item anvilItem; public final Item rawOre; public final Item nugget; @@ -158,8 +157,7 @@ public class MetalMaterial { leggings = EndItems.registerEndItem(name + "_leggings", new EndArmorItem(armor, EquipmentSlot.LEGS, itemSettings)); boots = EndItems.registerEndItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); - anvilBlock = EndBlocks.registerBlock(name + "_anvil", new EndAnvilBlock(this, block.defaultMaterialColor(), level)); - anvilItem = EndItems.registerEndItem(name + "_anvil_item", new EndAnvilItem(anvilBlock)); + anvilBlock = EndBlocks.registerAnvil(name + "_anvil", new EndAnvilBlock(this, block.defaultMaterialColor(), level)); if (hasOre) { FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_ore", ore, ingot).checkConfig(Configs.RECIPE_CONFIG).setGroup("end_ingot").buildWithBlasting(); diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index d65067ba..215ef9a5 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -26,14 +26,14 @@ import java.util.List; import java.util.stream.Collectors; public class REIAnvilCategory implements TransferDisplayCategory { - private final EntryStack[] ANVILS; + private final EntryStack[] ANVILS; - REIAnvilCategory(EntryStack[] anvils) { + REIAnvilCategory(EntryStack[] anvils) { ANVILS = anvils; } @Override - public @NotNull CategoryIdentifier getCategoryIdentifier() { + public CategoryIdentifier getCategoryIdentifier() { return REIPlugin.SMITHING; } @@ -43,7 +43,7 @@ public class REIAnvilCategory implements TransferDisplayCategory getIcon() { return ANVILS[0]; } @@ -59,7 +59,7 @@ public class REIAnvilCategory implements TransferDisplayCategory inputEntries = display.getInputEntries(); EntryIngredient materials = inputEntries.get(1); int anvilLevel = display.getAnvilLevel(); - List anvils = Arrays.stream(ANVILS).filter(anvil -> { + List> anvils = Arrays.stream(ANVILS).filter(anvil -> { Object value = anvil.getValue(); if (value instanceof ItemStack) { value = ((ItemStack) value).getItem(); @@ -70,7 +70,6 @@ public class REIAnvilCategory implements TransferDisplayCategory entryStack.setAmount(display.getInputCount())); widgets.add(Widgets.createArrow(new Point(x + 24, y + 4))); widgets.add(Widgets.createLabel(new Point(bounds.x + bounds.width - 7, bounds.y + bounds.height - 15), new TranslatableComponent("category.rei.damage.amount&dmg", display.getDamage())).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); widgets.add(Widgets.createSlot(new Point(x - 20, y + 4)).entries(materials).markInput()); diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java index fd4d01c6..9b75c356 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilDisplay.java @@ -5,6 +5,7 @@ import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; import me.shedaniel.rei.api.common.display.basic.BasicDisplay; import me.shedaniel.rei.api.common.util.EntryIngredients; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; import org.jetbrains.annotations.NotNull; import ru.betterend.recipe.builders.AnvilRecipe; @@ -19,16 +20,18 @@ public class REIAnvilDisplay extends BasicDisplay implements SimpleGridMenuDispl public REIAnvilDisplay(AnvilRecipe recipe) { super(EntryIngredients.ofIngredients(recipe.getIngredients()), Collections.singletonList(EntryIngredients.of(recipe.getResultItem()))); this.recipe = recipe; + + inputs.get(1).forEach(entryStack -> { + if (entryStack.getValue() instanceof ItemStack itemStack) { + itemStack.setCount(recipe.getInputCount()); + } + }); } public int getDamage() { return recipe.getDamage(); } - public int getInputCount() { - return recipe.getInputCount(); - } - public int getAnvilLevel() { return recipe.getAnvilLevel(); } @@ -43,11 +46,6 @@ public class REIAnvilDisplay extends BasicDisplay implements SimpleGridMenuDispl return REIPlugin.SMITHING; } - // @Override - // public @NotNull List> getRequiredEntries() { - // return input; - // } - @Override public int getWidth() { return 2; @@ -57,10 +55,4 @@ public class REIAnvilDisplay extends BasicDisplay implements SimpleGridMenuDispl public int getHeight() { return 1; } - - // @Override - // public List> getOrganisedInputEntries(ContainerInfo containerInfo, - // AbstractContainerMenu container) { - // return input; - // } } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index a273294a..196146c1 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -5,6 +5,7 @@ import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryIngredients; @@ -12,6 +13,7 @@ import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.plugin.common.DefaultPlugin; import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.BlastingRecipe; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.Blocks; @@ -24,38 +26,17 @@ import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; //https://github.com/shedaniel/RoughlyEnoughItems/blob/6.x-1.17/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java public class REIPlugin implements REIClientPlugin { public final static ResourceLocation PLUGIN_ID = BetterEnd.makeID("rei_plugin"); - public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel"); - public final static CategoryIdentifier ALLOYING = CategoryIdentifier.of(BetterEnd.MOD_ID, AlloyingRecipe.GROUP); - public final static CategoryIdentifier SMITHING = CategoryIdentifier.of(BetterEnd.MOD_ID, AnvilRecipe.ID.getPath()); - public final static CategoryIdentifier INFUSION = CategoryIdentifier.of(BetterEnd.MOD_ID, InfusionRecipe.GROUP); - - private EntryStack END_STONE_SMELTER; - private EntryStack INFUSION_RITUAL; - private EntryStack[] ANVILS; - private EntryStack[] FURNACES; - - void init() { - //we need to initialize those variables after the static initialization - //otherwise the registry does not know the BlockItems - if (END_STONE_SMELTER != null) { - return; - } - - END_STONE_SMELTER = EntryStacks.of(EndBlocks.END_STONE_SMELTER); - INFUSION_RITUAL = EntryStacks.of(EndBlocks.INFUSION_PEDESTAL); - - List anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream().filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList()))); - anvils.add(0, EntryStacks.of(Blocks.ANVIL)); - ANVILS = anvils.toArray(new EntryStack[0]); - - FURNACES = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream().filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))).toArray(new EntryStack[0]); - } + public final static CategoryIdentifier ALLOYING_FUEL = CategoryIdentifier.of(BetterEnd.MOD_ID, "alloying_fuel"); + public final static CategoryIdentifier ALLOYING = CategoryIdentifier.of(BetterEnd.MOD_ID, AlloyingRecipe.GROUP); + public final static CategoryIdentifier SMITHING = CategoryIdentifier.of(BetterEnd.MOD_ID, AnvilRecipe.ID.getPath()); + public final static CategoryIdentifier INFUSION = CategoryIdentifier.of(BetterEnd.MOD_ID, InfusionRecipe.GROUP); @Override public void registerDisplays(DisplayRegistry registry) { @@ -66,7 +47,7 @@ public class REIPlugin implements REIClientPlugin { FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { if (time >= 2000) { - final List list = Arrays.asList(EntryIngredients.of(item)); + final List list = Collections.singletonList(EntryIngredients.of(item)); registry.add(new REIAlloyingFuelDisplay(list, time)); } }); @@ -74,18 +55,24 @@ public class REIPlugin implements REIClientPlugin { @Override public void registerCategories(CategoryRegistry registry) { - init(); + EntryStack endStoneSmelter = EntryStacks.of(EndBlocks.END_STONE_SMELTER); + EntryStack infusionRitual = EntryStacks.of(EndBlocks.INFUSION_PEDESTAL); + List> anvils = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream().filter(EndAnvilBlock.class::isInstance).collect(Collectors.toList()))); + anvils.add(0, EntryStacks.of(Blocks.ANVIL)); + List> furnaces = Lists.newArrayList(EntryIngredients.ofItems(EndBlocks.getModBlocks().stream().filter(BaseFurnaceBlock.class::isInstance).collect(Collectors.toList()))); + EntryStack[] anvilsArray = anvils.toArray(new EntryStack[0]); + EntryStack[] furnacesArray = furnaces.toArray(new EntryStack[0]); + + registry.add(new REIAlloyingFuelCategory(), new REIAlloyingCategory(endStoneSmelter), new REIInfusionCategory(infusionRitual), new REIAnvilCategory(anvilsArray)); - registry.add(new REIAlloyingFuelCategory(), new REIAlloyingCategory(END_STONE_SMELTER), new REIInfusionCategory(INFUSION_RITUAL), new REIAnvilCategory(ANVILS)); - - registry.addWorkstations(ALLOYING_FUEL, END_STONE_SMELTER); - registry.addWorkstations(ALLOYING, END_STONE_SMELTER); - registry.addWorkstations(INFUSION, INFUSION_RITUAL); - registry.addWorkstations(SMITHING, ANVILS); + registry.addWorkstations(ALLOYING_FUEL, endStoneSmelter); + registry.addWorkstations(ALLOYING, endStoneSmelter); + registry.addWorkstations(INFUSION, infusionRitual); + registry.addWorkstations(SMITHING, anvilsArray); registry.removePlusButton(ALLOYING_FUEL); registry.removePlusButton(SMITHING); - registry.addWorkstations(DefaultPlugin.SMELTING, FURNACES); - registry.addWorkstations(DefaultPlugin.FUEL, FURNACES); + registry.addWorkstations(DefaultPlugin.SMELTING, furnacesArray); + registry.addWorkstations(DefaultPlugin.FUEL, furnacesArray); } } diff --git a/src/main/java/ru/betterend/recipe/SmithingRecipes.java b/src/main/java/ru/betterend/recipe/SmithingRecipes.java index 64bf7913..88235e42 100644 --- a/src/main/java/ru/betterend/recipe/SmithingRecipes.java +++ b/src/main/java/ru/betterend/recipe/SmithingRecipes.java @@ -26,8 +26,8 @@ public class SmithingRecipes { SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_leggings").checkConfig(Configs.RECIPE_CONFIG).setResult(EndItems.AETERNIUM_LEGGINGS).setBase(EndBlocks.TERMINITE.leggings).setAddition(EndItems.AETERNIUM_FORGED_PLATE).build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "aeternium_boots").checkConfig(Configs.RECIPE_CONFIG).setResult(EndItems.AETERNIUM_BOOTS).setBase(EndBlocks.TERMINITE.boots).setAddition(EndItems.AETERNIUM_FORGED_PLATE).build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, "thallasium_anvil_updrade").checkConfig(Configs.RECIPE_CONFIG).setResult(EndBlocks.TERMINITE.anvilBlock).setBase(EndBlocks.THALLASIUM.anvilBlock).setAddition(EndBlocks.TERMINITE.block).build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, "terminite_anvil_updrade").checkConfig(Configs.RECIPE_CONFIG).setResult(EndBlocks.AETERNIUM_ANVIL).setBase(EndBlocks.TERMINITE.anvilBlock).setAddition(EndItems.AETERNIUM_INGOT).build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, "thallasium_anvil_updrade").checkConfig(Configs.RECIPE_CONFIG).setResult(EndBlocks.TERMINITE.anvilBlock.asItem()).setBase(EndBlocks.THALLASIUM.anvilBlock.asItem()).setAddition(EndBlocks.TERMINITE.block).build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, "terminite_anvil_updrade").checkConfig(Configs.RECIPE_CONFIG).setResult(EndBlocks.AETERNIUM_ANVIL.asItem()).setBase(EndBlocks.TERMINITE.anvilBlock.asItem()).setAddition(EndItems.AETERNIUM_INGOT).build(); SmithingTableRecipe.create(BetterEnd.MOD_ID, "armored_elytra").checkConfig(Configs.RECIPE_CONFIG).setResult(EndItems.ARMORED_ELYTRA).setBase(Items.ELYTRA).setAddition(EndItems.AETERNIUM_INGOT).build(); } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 490752f3..f8371344 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -125,15 +125,7 @@ import ru.betterend.blocks.UmbrellaTreeClusterEmptyBlock; import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.blocks.UmbrellaTreeSaplingBlock; import ru.betterend.blocks.VentBubbleColumnBlock; -import ru.betterend.blocks.basis.EndTerrainBlock; -import ru.betterend.blocks.basis.EndTripleTerrain; -import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; -import ru.betterend.blocks.basis.EndWallMushroom; -import ru.betterend.blocks.basis.EndWallPlantBlock; -import ru.betterend.blocks.basis.FurBlock; -import ru.betterend.blocks.basis.PottableCropBlock; -import ru.betterend.blocks.basis.PottableLeavesBlock; -import ru.betterend.blocks.basis.StoneLanternBlock; +import ru.betterend.blocks.basis.*; import ru.betterend.blocks.complex.ColoredMaterial; import ru.betterend.blocks.complex.CrystalSubblocksMaterial; import ru.betterend.blocks.complex.MetalMaterial; @@ -422,7 +414,7 @@ public class EndBlocks extends BlocksRegistry { public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); public static final Block INFUSION_PEDESTAL = registerBlock("infusion_pedestal", new InfusionPedestal()); - public static final Block AETERNIUM_ANVIL = registerBlock("aeternium_anvil", new AeterniumAnvil()); + public static final Block AETERNIUM_ANVIL = registerAnvil("aeternium_anvil", new AeterniumAnvil()); // Technical public static final Block END_PORTAL_BLOCK = registerEndBlockOnly("end_portal_block", new EndPortalBlock()); @@ -436,6 +428,16 @@ public class EndBlocks extends BlocksRegistry { public static List getModBlocks() { return getModBlocks(BetterEnd.MOD_ID).stream().filter(BlockItem.class::isInstance).map(item -> ((BlockItem) item).getBlock()).collect(Collectors.toList()); } + + public static Block registerAnvil(String name, EndAnvilBlock anvilBlock) { + if (!Configs.BLOCK_CONFIG.getBooleanRoot(name, true)) { + return anvilBlock; + } + BlocksRegistry registry = getBlockRegistry(); + registry.registerBlockOnly(name, anvilBlock); + registry.registerBlockItem(BetterEnd.makeID(name + "_item"), anvilBlock.asItem()); + return anvilBlock; + } public static Block registerBlock(ResourceLocation id, Block block) { if (!Configs.BLOCK_CONFIG.getBooleanRoot(id.getPath(), true)) { diff --git a/src/main/java/ru/betterend/tab/CreativeTabs.java b/src/main/java/ru/betterend/tab/CreativeTabs.java index 2ac6cea8..f0fb6dc2 100644 --- a/src/main/java/ru/betterend/tab/CreativeTabs.java +++ b/src/main/java/ru/betterend/tab/CreativeTabs.java @@ -15,11 +15,11 @@ public class CreativeTabs { public static final CreativeModeTab TAB_ITEMS; static { - TAB_BLOCKS = FabricItemGroupBuilder.create(BetterEnd.makeID("end_blocks")).icon(() -> new ItemStack(EndBlocks.END_MYCELIUM)).appendItems(stacks -> { - stacks.addAll(EndBlocks.getModBlocks().stream().map(ItemStack::new).collect(Collectors.toList())); - }).build(); - TAB_ITEMS = FabricItemGroupBuilder.create(BetterEnd.makeID("end_items")).icon(() -> new ItemStack(EndItems.ETERNAL_CRYSTAL)).appendItems(stacks -> { - stacks.addAll(EndItems.getModItems().stream().map(ItemStack::new).collect(Collectors.toList())); - }).build(); + TAB_BLOCKS = FabricItemGroupBuilder.create(BetterEnd.makeID("end_blocks")).icon(() -> new ItemStack(EndBlocks.END_MYCELIUM)) + .appendItems(stacks -> stacks.addAll(EndBlocks.getModBlocks().stream().map(ItemStack::new).collect(Collectors.toList()))) + .build(); + TAB_ITEMS = FabricItemGroupBuilder.create(BetterEnd.makeID("end_items")).icon(() -> new ItemStack(EndItems.ETERNAL_CRYSTAL)) + .appendItems(stacks -> stacks.addAll(EndItems.getModItems().stream().map(ItemStack::new).collect(Collectors.toList()))) + .build(); } }