From 345c4e618187818732174d35cd8d8d2cec393654 Mon Sep 17 00:00:00 2001 From: noeppi_noeppi Date: Sun, 10 Dec 2023 20:56:27 +0100 Subject: [PATCH] Add an interface for creative tab filling logic on items. --- .../org/moddingx/libx/base/BlockBase.java | 46 +++++++++++-------- .../java/org/moddingx/libx/base/ItemBase.java | 9 ++-- .../org/moddingx/libx/codec/MoreCodecs.java | 4 +- .../creativetab/CreativeTabItemProvider.java | 19 ++++++++ .../libx/creativetab/CreativeTabX.java | 8 +--- 5 files changed, 53 insertions(+), 33 deletions(-) create mode 100644 src/main/java/org/moddingx/libx/creativetab/CreativeTabItemProvider.java diff --git a/src/main/java/org/moddingx/libx/base/BlockBase.java b/src/main/java/org/moddingx/libx/base/BlockBase.java index c8ec506c..fe6e6687 100644 --- a/src/main/java/org/moddingx/libx/base/BlockBase.java +++ b/src/main/java/org/moddingx/libx/base/BlockBase.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.Block; import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.registries.ForgeRegistries; -import org.moddingx.libx.creativetab.CreativeTabX; +import org.moddingx.libx.creativetab.CreativeTabItemProvider; import org.moddingx.libx.mod.ModX; import org.moddingx.libx.mod.ModXRegistration; import org.moddingx.libx.registration.Registerable; @@ -24,7 +24,7 @@ * Base class for {@link Block blocks} for mods using {@link ModXRegistration}. This will automatically set the * creative tab if it's defined in the mod and register a {@link BlockItem block item}. */ -public class BlockBase extends Block implements Registerable { +public class BlockBase extends Block implements Registerable, CreativeTabItemProvider { protected final ModX mod; @@ -52,18 +52,7 @@ public BlockBase(ModX mod, Properties properties, @Nullable Item.Properties item this.item = null; } else { this.hasItem = true; - this.item = new BlockItem(this, itemProperties) { - - @Override - public void initializeClient(@Nonnull Consumer consumer) { - BlockBase.this.initializeItemClient(consumer); - } - - @Override - public int getBurnTime(ItemStack stack, @Nullable RecipeType recipeType) { - return BlockBase.this.getBurnTime(stack, recipeType); - } - }; + this.item = new BaseBlockItem(this, itemProperties); } } @@ -78,11 +67,8 @@ public void initializeItemClient(@Nonnull Consumer consum public int getBurnTime(ItemStack stack, @Nullable RecipeType recipeType) { return -1; } - - /** - * Returns a {@link Stream} of {@link ItemStack item stacks} to add to a creative tab. - * {@link CreativeTabX} respects these by default. - */ + + @Override public Stream makeCreativeTabStacks() { return Stream.of(new ItemStack(this)); } @@ -102,4 +88,26 @@ public void initTracking(RegistrationContext ctx, TrackingCollector builder) thr builder.track(ForgeRegistries.ITEMS, BlockBase.class.getDeclaredField("item")); } } + + private class BaseBlockItem extends BlockItem implements CreativeTabItemProvider { + + public BaseBlockItem(Block block, Properties itemProperties) { + super(block, itemProperties); + } + + @Override + public void initializeClient(@Nonnull Consumer consumer) { + BlockBase.this.initializeItemClient(consumer); + } + + @Override + public int getBurnTime(ItemStack stack, @Nullable RecipeType recipeType) { + return BlockBase.this.getBurnTime(stack, recipeType); + } + + @Override + public Stream makeCreativeTabStacks() { + return BlockBase.this.makeCreativeTabStacks(); + } + } } diff --git a/src/main/java/org/moddingx/libx/base/ItemBase.java b/src/main/java/org/moddingx/libx/base/ItemBase.java index d99681c4..6e4e2763 100644 --- a/src/main/java/org/moddingx/libx/base/ItemBase.java +++ b/src/main/java/org/moddingx/libx/base/ItemBase.java @@ -2,7 +2,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import org.moddingx.libx.creativetab.CreativeTabX; +import org.moddingx.libx.creativetab.CreativeTabItemProvider; import org.moddingx.libx.mod.ModX; import org.moddingx.libx.mod.ModXRegistration; @@ -12,7 +12,7 @@ * Base class for {@link Item items} for mods using {@link ModXRegistration}. This will automatically set the * creative tab if it's defined in the mod. */ -public class ItemBase extends Item { +public class ItemBase extends Item implements CreativeTabItemProvider { protected final ModX mod; @@ -21,10 +21,7 @@ public ItemBase(ModX mod, Properties properties) { this.mod = mod; } - /** - * Returns a {@link Stream} of {@link ItemStack item stacks} to add to a creative tab. - * {@link CreativeTabX} respects these by default. - */ + @Override public Stream makeCreativeTabStacks() { return Stream.of(new ItemStack(this)); } diff --git a/src/main/java/org/moddingx/libx/codec/MoreCodecs.java b/src/main/java/org/moddingx/libx/codec/MoreCodecs.java index 52c3aa6f..50a35c9f 100644 --- a/src/main/java/org/moddingx/libx/codec/MoreCodecs.java +++ b/src/main/java/org/moddingx/libx/codec/MoreCodecs.java @@ -123,7 +123,7 @@ public static Codec lazy(Supplier> codec) { /** * Behaves the same as {@link Codec#optionalFieldOf(String)} but instead of silently using the default value - * if decoding the element prodices an error, propagates the error through. The only way this yields an empty + * if decoding the element produces an error, propagates the error through. The only way this yields an empty * {@link Optional} is if the key is completely missing. */ public static MapCodec> optionalFieldOf(Codec codec, String name) { @@ -132,7 +132,7 @@ public static MapCodec> optionalFieldOf(Codec codec, String n /** * Behaves the same as {@link Codec#optionalFieldOf(String, Object)} but instead of silently using the default - * value if decoding the element prodices an error, propagates the error through. The only way this yields an + * value if decoding the element produces an error, propagates the error through. The only way this yields an * empty {@link Optional} is if the key is completely missing. */ public static MapCodec optionalFieldOf(Codec codec, String name, T defaultValue) { diff --git a/src/main/java/org/moddingx/libx/creativetab/CreativeTabItemProvider.java b/src/main/java/org/moddingx/libx/creativetab/CreativeTabItemProvider.java new file mode 100644 index 00000000..cf15f371 --- /dev/null +++ b/src/main/java/org/moddingx/libx/creativetab/CreativeTabItemProvider.java @@ -0,0 +1,19 @@ +package org.moddingx.libx.creativetab; + +import net.minecraft.world.item.ItemStack; +import org.moddingx.libx.base.BlockBase; +import org.moddingx.libx.base.ItemBase; + +import java.util.stream.Stream; + +/** + * Can be implemented on items to provide custom logic on how {@link CreativeTabX} should fill them by default. + * Both {@link ItemBase} and the block item generated by {@link BlockBase} implement this by default. + */ +public interface CreativeTabItemProvider { + + /** + * Returns a {@link Stream} of {@link ItemStack item stacks} to add to a creative tab. + */ + Stream makeCreativeTabStacks(); +} diff --git a/src/main/java/org/moddingx/libx/creativetab/CreativeTabX.java b/src/main/java/org/moddingx/libx/creativetab/CreativeTabX.java index 2ad54d02..f9c982b1 100644 --- a/src/main/java/org/moddingx/libx/creativetab/CreativeTabX.java +++ b/src/main/java/org/moddingx/libx/creativetab/CreativeTabX.java @@ -8,8 +8,6 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.RegisterEvent; -import org.moddingx.libx.base.BlockBase; -import org.moddingx.libx.base.ItemBase; import org.moddingx.libx.impl.ModInternal; import org.moddingx.libx.mod.ModX; @@ -129,10 +127,8 @@ private void registerCreativeTab(RegisterEvent event) { } private Stream itemStream(Item item) { - if (item instanceof ItemBase base) { - return base.makeCreativeTabStacks(); - } else if (item instanceof BlockItem blockItem && blockItem.getBlock() instanceof BlockBase base) { - return base.makeCreativeTabStacks(); + if (item instanceof CreativeTabItemProvider provider) { + return provider.makeCreativeTabStacks(); } else { return Stream.of(new ItemStack(item)); }