From 3b2a2d429407ab4f358de78c4e2d3fd9d3d3920d Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 21 May 2023 15:12:48 +0200 Subject: [PATCH] [Feature] New Block Behaviour Interfaces --- .../org/betterx/bclib/api/v2/PostInitAPI.java | 32 ++++++++++++++++++- .../betterx/bclib/blocks/BaseLadderBlock.java | 3 +- .../betterx/bclib/blocks/BaseLeavesBlock.java | 16 +++------- .../bclib/blocks/SimpleLeavesBlock.java | 19 +++-------- .../bclib/blocks/UpDownPlantBlock.java | 3 +- .../complexmaterials/set/wood/Ladder.java | 2 +- .../behaviours/BehaviourClimable.java | 10 ++++++ .../behaviours/BehaviourClimableVine.java | 9 ++++++ .../behaviours/BehaviourCompostable.java | 22 +++++++++++++ .../behaviours/BehaviourLeaves.java | 16 ++++++++++ .../interfaces/behaviours/BehaviourVine.java | 12 +++++++ .../betterx/bclib/registry/BlockRegistry.java | 14 +------- .../together/tag/v3/CommonItemTags.java | 2 ++ 13 files changed, 118 insertions(+), 42 deletions(-) create mode 100644 src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourClimable.java create mode 100644 src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourClimableVine.java create mode 100644 src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourCompostable.java create mode 100644 src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourLeaves.java create mode 100644 src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourVine.java diff --git a/src/main/java/org/betterx/bclib/api/v2/PostInitAPI.java b/src/main/java/org/betterx/bclib/api/v2/PostInitAPI.java index 17061e26..ac9dfe20 100644 --- a/src/main/java/org/betterx/bclib/api/v2/PostInitAPI.java +++ b/src/main/java/org/betterx/bclib/api/v2/PostInitAPI.java @@ -12,16 +12,24 @@ import org.betterx.bclib.interfaces.Fuel; import org.betterx.bclib.interfaces.PostInitable; import org.betterx.bclib.interfaces.RenderLayerProvider; import org.betterx.bclib.interfaces.TagProvider; +import org.betterx.bclib.interfaces.behaviours.BehaviourClimable; +import org.betterx.bclib.interfaces.behaviours.BehaviourCompostable; +import org.betterx.bclib.interfaces.behaviours.BehaviourLeaves; import org.betterx.bclib.interfaces.tools.*; import org.betterx.bclib.networking.VersionChecker; import org.betterx.bclib.registry.BaseBlockEntities; +import org.betterx.worlds.together.tag.v3.CommonBlockTags; +import org.betterx.worlds.together.tag.v3.CommonItemTags; import org.betterx.worlds.together.tag.v3.MineableTags; import org.betterx.worlds.together.tag.v3.TagManager; import net.minecraft.client.renderer.RenderType; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.fabricmc.api.EnvType; @@ -104,6 +112,7 @@ public class PostInitAPI { } private static void processBlockCommon(Block block) { + final Item item = block.asItem(); if (block instanceof PostInitable) { ((PostInitable) block).postInit(); } @@ -137,10 +146,31 @@ public class PostInitAPI { TagManager.BLOCKS.add(block, MineableTags.HAMMER); } } + + if (block instanceof BehaviourCompostable c) { + if (item != null && item != Items.AIR) { + TagManager.ITEMS.add(block, CommonItemTags.COMPOSTABLE); + ComposterAPI.allowCompost(c.compostingChance(), item); + } else if (BCLib.isDatagen() && Configs.MAIN_CONFIG.verboseLogging()) { + BCLib.LOGGER.warning("Block " + block + " has compostable behaviour but no item!"); + } + } + + if (block instanceof BehaviourClimable c) { + TagManager.BLOCKS.add(block, BlockTags.CLIMBABLE); + } + + if (block instanceof BehaviourLeaves) { + TagManager.BLOCKS.add(block, BlockTags.LEAVES, CommonBlockTags.LEAVES); + if (item != null && item != Items.AIR) + TagManager.ITEMS.add(item, ItemTags.LEAVES, CommonItemTags.LEAVES); + } + if (block instanceof TagProvider) { ((TagProvider) block).addTags(blockTags, itemTags); blockTags.forEach(tag -> TagManager.BLOCKS.add(tag, block)); - itemTags.forEach(tag -> TagManager.ITEMS.add(tag, block.asItem())); + if (item != null && item != Items.AIR) + itemTags.forEach(tag -> TagManager.ITEMS.add(tag, item)); blockTags.clear(); itemTags.clear(); } diff --git a/src/main/java/org/betterx/bclib/blocks/BaseLadderBlock.java b/src/main/java/org/betterx/bclib/blocks/BaseLadderBlock.java index d0bddcd8..d2171b5e 100644 --- a/src/main/java/org/betterx/bclib/blocks/BaseLadderBlock.java +++ b/src/main/java/org/betterx/bclib/blocks/BaseLadderBlock.java @@ -6,6 +6,7 @@ import org.betterx.bclib.client.models.PatternsHelper; import org.betterx.bclib.client.render.BCLRenderLayer; import org.betterx.bclib.interfaces.BlockModelProvider; import org.betterx.bclib.interfaces.RenderLayerProvider; +import org.betterx.bclib.interfaces.behaviours.BehaviourClimable; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.resources.model.UnbakedModel; @@ -26,7 +27,7 @@ import java.util.Map; import java.util.Optional; import org.jetbrains.annotations.Nullable; -public class BaseLadderBlock extends LadderBlock implements RenderLayerProvider, BlockModelProvider { +public class BaseLadderBlock extends LadderBlock implements RenderLayerProvider, BlockModelProvider, BehaviourClimable { public BaseLadderBlock(Block block) { this(Properties.copy(block).noOcclusion()); } diff --git a/src/main/java/org/betterx/bclib/blocks/BaseLeavesBlock.java b/src/main/java/org/betterx/bclib/blocks/BaseLeavesBlock.java index 0386550b..6af43d15 100644 --- a/src/main/java/org/betterx/bclib/blocks/BaseLeavesBlock.java +++ b/src/main/java/org/betterx/bclib/blocks/BaseLeavesBlock.java @@ -4,18 +4,12 @@ import org.betterx.bclib.client.render.BCLRenderLayer; import org.betterx.bclib.complexmaterials.BehaviourBuilders; import org.betterx.bclib.interfaces.BlockModelProvider; import org.betterx.bclib.interfaces.RenderLayerProvider; -import org.betterx.bclib.interfaces.TagProvider; -import org.betterx.bclib.interfaces.tools.AddMineableHoe; -import org.betterx.bclib.interfaces.tools.AddMineableShears; +import org.betterx.bclib.interfaces.behaviours.BehaviourLeaves; import org.betterx.bclib.items.tool.BaseShearsItem; import org.betterx.bclib.util.MHelper; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.Enchantments; @@ -34,7 +28,7 @@ import java.util.Collections; import java.util.List; import java.util.function.Consumer; -public class BaseLeavesBlock extends LeavesBlock implements BlockModelProvider, RenderLayerProvider, TagProvider, AddMineableShears, AddMineableHoe { +public class BaseLeavesBlock extends LeavesBlock implements BlockModelProvider, RenderLayerProvider, BehaviourLeaves { protected final Block sapling; public BaseLeavesBlock( @@ -123,9 +117,9 @@ public class BaseLeavesBlock extends LeavesBlock implements BlockModelProvider, return getBlockModel(resourceLocation, defaultBlockState()); } + @Override - public void addTags(List> blockTags, List> itemTags) { - blockTags.add(BlockTags.LEAVES); - itemTags.add(ItemTags.LEAVES); + public float compostingChance() { + return 0.3f; } } diff --git a/src/main/java/org/betterx/bclib/blocks/SimpleLeavesBlock.java b/src/main/java/org/betterx/bclib/blocks/SimpleLeavesBlock.java index 40e04ea3..b36dc121 100644 --- a/src/main/java/org/betterx/bclib/blocks/SimpleLeavesBlock.java +++ b/src/main/java/org/betterx/bclib/blocks/SimpleLeavesBlock.java @@ -3,22 +3,13 @@ package org.betterx.bclib.blocks; import org.betterx.bclib.client.render.BCLRenderLayer; import org.betterx.bclib.complexmaterials.BehaviourBuilders; import org.betterx.bclib.interfaces.RenderLayerProvider; -import org.betterx.bclib.interfaces.TagProvider; -import org.betterx.bclib.interfaces.tools.AddMineableHoe; -import org.betterx.bclib.interfaces.tools.AddMineableShears; +import org.betterx.bclib.interfaces.behaviours.BehaviourLeaves; -import net.minecraft.tags.BlockTags; -import net.minecraft.tags.ItemTags; -import net.minecraft.tags.TagKey; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.MapColor; -import java.util.List; - -public class SimpleLeavesBlock extends BaseBlockNotFull implements RenderLayerProvider, TagProvider, AddMineableShears, AddMineableHoe { +public class SimpleLeavesBlock extends BaseBlockNotFull implements RenderLayerProvider, BehaviourLeaves { public SimpleLeavesBlock(MapColor color) { this( BehaviourBuilders @@ -45,9 +36,9 @@ public class SimpleLeavesBlock extends BaseBlockNotFull implements RenderLayerPr return BCLRenderLayer.CUTOUT; } + @Override - public void addTags(List> blockTags, List> itemTags) { - blockTags.add(BlockTags.LEAVES); - itemTags.add(ItemTags.LEAVES); + public float compostingChance() { + return 0.3f; } } \ No newline at end of file diff --git a/src/main/java/org/betterx/bclib/blocks/UpDownPlantBlock.java b/src/main/java/org/betterx/bclib/blocks/UpDownPlantBlock.java index d4efabac..071b1769 100644 --- a/src/main/java/org/betterx/bclib/blocks/UpDownPlantBlock.java +++ b/src/main/java/org/betterx/bclib/blocks/UpDownPlantBlock.java @@ -3,6 +3,7 @@ package org.betterx.bclib.blocks; import org.betterx.bclib.client.render.BCLRenderLayer; import org.betterx.bclib.complexmaterials.BehaviourBuilders; import org.betterx.bclib.interfaces.RenderLayerProvider; +import org.betterx.bclib.interfaces.behaviours.BehaviourCompostable; import org.betterx.bclib.interfaces.tools.AddMineableHoe; import org.betterx.bclib.interfaces.tools.AddMineableShears; import org.betterx.bclib.items.tool.BaseShearsItem; @@ -31,7 +32,7 @@ import com.google.common.collect.Lists; import java.util.List; -public abstract class UpDownPlantBlock extends BaseBlockNotFull implements RenderLayerProvider, AddMineableShears, AddMineableHoe { +public abstract class UpDownPlantBlock extends BaseBlockNotFull implements RenderLayerProvider, AddMineableShears, AddMineableHoe, BehaviourCompostable { private static final VoxelShape SHAPE = box(4, 0, 4, 12, 16, 12); public UpDownPlantBlock() { diff --git a/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Ladder.java b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Ladder.java index 0a1a0228..7ea18d2b 100644 --- a/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Ladder.java +++ b/src/main/java/org/betterx/bclib/complexmaterials/set/wood/Ladder.java @@ -31,7 +31,7 @@ public class Ladder extends SimpleMaterialSlot { @Override protected void modifyBlockEntry(WoodenComplexMaterial parentMaterial, @NotNull BlockEntry entry) { - entry.setBlockTags(BlockTags.MINEABLE_WITH_AXE, BlockTags.CLIMBABLE); + entry.setBlockTags(BlockTags.MINEABLE_WITH_AXE); } @Override diff --git a/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourClimable.java b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourClimable.java new file mode 100644 index 00000000..6fe63f6c --- /dev/null +++ b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourClimable.java @@ -0,0 +1,10 @@ +package org.betterx.bclib.interfaces.behaviours; + +/** + * Interface for blocks that can be climbed. + *

+ * {@link org.betterx.bclib.api.v2.PostInitAPI} will add the {@link net.minecraft.tags.BlockTags#CLIMBABLE} tag to all blocks that + * implement this interface. + */ +public interface BehaviourClimable { +} diff --git a/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourClimableVine.java b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourClimableVine.java new file mode 100644 index 00000000..40fa9f82 --- /dev/null +++ b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourClimableVine.java @@ -0,0 +1,9 @@ +package org.betterx.bclib.interfaces.behaviours; + +/** + * Interface for blocks that can be climbed and are vines. + *

+ * This will combine the {@link BehaviourClimable} behaviours with all {@link BehaviourVine} behaviours. + */ +public interface BehaviourClimableVine extends BehaviourClimable, BehaviourVine { +} diff --git a/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourCompostable.java b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourCompostable.java new file mode 100644 index 00000000..053758d4 --- /dev/null +++ b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourCompostable.java @@ -0,0 +1,22 @@ +package org.betterx.bclib.interfaces.behaviours; + +/** + * Interface for blocks that can be composted. + *

+ * {@link org.betterx.bclib.api.v2.PostInitAPI} will add the + * {@link org.betterx.worlds.together.tag.v3.CommonItemTags#COMPOSTABLE} tag to the items of all blocks that + * implement this interface. It will also register the Block with the {@link org.betterx.bclib.api.v2.ComposterAPI} + */ +public interface BehaviourCompostable { + + /** + * The chance that this block will be composted. + *

+ * The default value is 0.1f. + * + * @return The chance that this block will be composted. + */ + default float compostingChance() { + return 0.1f; + } +} diff --git a/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourLeaves.java b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourLeaves.java new file mode 100644 index 00000000..741408a3 --- /dev/null +++ b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourLeaves.java @@ -0,0 +1,16 @@ +package org.betterx.bclib.interfaces.behaviours; + +import org.betterx.bclib.interfaces.tools.AddMineableHoe; +import org.betterx.bclib.interfaces.tools.AddMineableShears; + +/** + * Interface for leaves blocks. + *

+ * Adds composting chance, mineable with shears and hoe. + */ +public interface BehaviourLeaves extends AddMineableShears, AddMineableHoe, BehaviourCompostable { + @Override + default float compostingChance() { + return 0.3f; + } +} diff --git a/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourVine.java b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourVine.java new file mode 100644 index 00000000..b793eeec --- /dev/null +++ b/src/main/java/org/betterx/bclib/interfaces/behaviours/BehaviourVine.java @@ -0,0 +1,12 @@ +package org.betterx.bclib.interfaces.behaviours; + +import org.betterx.bclib.interfaces.tools.AddMineableHoe; +import org.betterx.bclib.interfaces.tools.AddMineableShears; + +/** + * Interface for blocks that are vines. + *

+ * This will add the {@link AddMineableShears}, {@link AddMineableHoe} and {@link BehaviourCompostable} behaviours. + */ +public interface BehaviourVine extends AddMineableShears, AddMineableHoe, BehaviourCompostable { +} diff --git a/src/main/java/org/betterx/bclib/registry/BlockRegistry.java b/src/main/java/org/betterx/bclib/registry/BlockRegistry.java index f1072df7..e8b8be5c 100644 --- a/src/main/java/org/betterx/bclib/registry/BlockRegistry.java +++ b/src/main/java/org/betterx/bclib/registry/BlockRegistry.java @@ -1,7 +1,6 @@ package org.betterx.bclib.registry; import org.betterx.bclib.BCLib; -import org.betterx.bclib.blocks.BaseLeavesBlock; import org.betterx.bclib.blocks.BaseOreBlock; import org.betterx.bclib.blocks.FeatureSaplingBlock; import org.betterx.bclib.config.PathConfig; @@ -52,18 +51,7 @@ public class BlockRegistry extends BaseRegistry { block = Registry.register(BuiltInRegistries.BLOCK, id, block); getModBlocks(id.getNamespace()).add(block); - if (block instanceof BaseLeavesBlock) { - TagManager.BLOCKS.add( - block, - BlockTags.LEAVES, - CommonBlockTags.LEAVES, - MineableTags.HOE, - MineableTags.SHEARS - ); - if (item != null) { - TagManager.ITEMS.add(item, CommonItemTags.LEAVES, ItemTags.LEAVES); - } - } else if (block instanceof BaseOreBlock) { + if (block instanceof BaseOreBlock) { TagManager.BLOCKS.add(block, MineableTags.PICKAXE); } else if (block instanceof FeatureSaplingBlock) { TagManager.BLOCKS.add(block, CommonBlockTags.SAPLINGS, BlockTags.SAPLINGS); diff --git a/src/main/java/org/betterx/worlds/together/tag/v3/CommonItemTags.java b/src/main/java/org/betterx/worlds/together/tag/v3/CommonItemTags.java index fcc3c32a..143d00f2 100644 --- a/src/main/java/org/betterx/worlds/together/tag/v3/CommonItemTags.java +++ b/src/main/java/org/betterx/worlds/together/tag/v3/CommonItemTags.java @@ -20,6 +20,8 @@ public class CommonItemTags { public static final TagKey WORKBENCHES = TagManager.ITEMS.makeCommonTag("workbench"); public static final TagKey WATER_BOTTLES = TagManager.ITEMS.makeCommonTag("water_bottles"); + public static final TagKey COMPOSTABLE = TagManager.ITEMS.makeCommonTag("compostable"); + ; static void prepareTags() { TagManager.ITEMS.add(SOUL_GROUND, Blocks.SOUL_SAND.asItem(), Blocks.SOUL_SOIL.asItem());