From 27e48d1a8acc65f5ba168bdc47a3ecf4032e47d8 Mon Sep 17 00:00:00 2001 From: EERussianguy Date: Thu, 1 Jul 2021 23:59:14 -0400 Subject: [PATCH] implement bonsai fruit trees, optimize some code, scooping pumpkins now gives seeds, chunking pumpkins now gives 4, slightly nerfed pumpkin food stats --- .../firmalife/ClientRegisterEventsFL.java | 6 + .../firmalife/blocks/BlockBonsai.java | 142 +++++++++++ .../firmalife/blocks/BlockCheesewheel.java | 23 +- .../firmalife/blocks/BlockHangingPlanter.java | 121 +-------- .../firmalife/blocks/BlockJars.java | 2 + .../firmalife/blocks/BlockLargePlanter.java | 3 + .../firmalife/blocks/BlockNonCube.java | 21 +- .../firmalife/init/FoodDataFL.java | 2 +- .../firmalife/registry/BlocksFL.java | 88 +++---- .../firmalife/registry/TFCRegistry.java | 6 +- .../render/LargePlanterBakedModel.java | 13 +- .../render/QuadPlanterBakedModel.java | 5 +- .../firmalife/render/RenderHandler.java | 2 +- .../firmalife/te/TEHangingPlanter.java | 12 +- .../firmalife/util/HelpersFL.java | 5 +- .../blockstates/banana_bonsai_pot.json | 38 +++ .../blockstates/cherry_bonsai_pot.json | 38 +++ .../blockstates/cocoa_bonsai_pot.json | 38 +++ .../blockstates/green_apple_bonsai_pot.json | 38 +++ .../blockstates/lemon_bonsai_pot.json | 38 +++ .../blockstates/olive_bonsai_pot.json | 38 +++ .../blockstates/orange_bonsai_pot.json | 38 +++ .../blockstates/peach_bonsai_pot.json | 38 +++ .../blockstates/plum_bonsai_pot.json | 38 +++ .../blockstates/red_apple_bonsai_pot.json | 38 +++ .../assets/firmalife/lang/en_us.lang | 12 + .../firmalife/models/block/bonsai_tree.json | 236 ++++++++++++++++++ .../firmalife/recipes/banana_bonsai.json | 15 ++ .../firmalife/recipes/cherry_bonsai.json | 15 ++ .../firmalife/recipes/cocoa_bonsai.json | 15 ++ .../firmalife/recipes/green_apple_bonsai.json | 15 ++ .../firmalife/recipes/lemon_bonsai.json | 15 ++ .../firmalife/recipes/olive_bonsai.json | 15 ++ .../firmalife/recipes/orange_bonsai.json | 15 ++ .../firmalife/recipes/peach_bonsai.json | 15 ++ .../assets/firmalife/recipes/plum_bonsai.json | 15 ++ .../firmalife/recipes/red_apple_bonsai.json | 15 ++ 37 files changed, 1033 insertions(+), 196 deletions(-) create mode 100644 src/main/java/com/eerussianguy/firmalife/blocks/BlockBonsai.java create mode 100644 src/main/resources/assets/firmalife/blockstates/banana_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/blockstates/cherry_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/blockstates/cocoa_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/blockstates/green_apple_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/blockstates/lemon_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/blockstates/olive_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/blockstates/orange_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/blockstates/peach_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/blockstates/plum_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/blockstates/red_apple_bonsai_pot.json create mode 100644 src/main/resources/assets/firmalife/models/block/bonsai_tree.json create mode 100644 src/main/resources/assets/firmalife/recipes/banana_bonsai.json create mode 100644 src/main/resources/assets/firmalife/recipes/cherry_bonsai.json create mode 100644 src/main/resources/assets/firmalife/recipes/cocoa_bonsai.json create mode 100644 src/main/resources/assets/firmalife/recipes/green_apple_bonsai.json create mode 100644 src/main/resources/assets/firmalife/recipes/lemon_bonsai.json create mode 100644 src/main/resources/assets/firmalife/recipes/olive_bonsai.json create mode 100644 src/main/resources/assets/firmalife/recipes/orange_bonsai.json create mode 100644 src/main/resources/assets/firmalife/recipes/peach_bonsai.json create mode 100644 src/main/resources/assets/firmalife/recipes/plum_bonsai.json create mode 100644 src/main/resources/assets/firmalife/recipes/red_apple_bonsai.json diff --git a/src/main/java/com/eerussianguy/firmalife/ClientRegisterEventsFL.java b/src/main/java/com/eerussianguy/firmalife/ClientRegisterEventsFL.java index 36fb2df6..2457a117 100644 --- a/src/main/java/com/eerussianguy/firmalife/ClientRegisterEventsFL.java +++ b/src/main/java/com/eerussianguy/firmalife/ClientRegisterEventsFL.java @@ -29,6 +29,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.eerussianguy.firmalife.blocks.BlockBonsai; import com.eerussianguy.firmalife.blocks.BlockFruitDoor; import com.eerussianguy.firmalife.blocks.BlockFruitFenceGate; import com.eerussianguy.firmalife.blocks.BlockStemCrop; @@ -149,6 +150,10 @@ public static void registerColorHandlerItems(ColorHandlerEvent.Item event) event.getBlockColors().colorMultiplier(((ItemBlock) stack.getItem()).getBlock().getStateFromMeta(stack.getMetadata()), null, null, tintIndex), BlocksFL.getAllFruitLeaves().toArray(new BlockFruitTreeLeaves[0]) ); + itemColors.registerItemColorHandler((stack, tintIndex) -> + event.getBlockColors().colorMultiplier(((ItemBlock) stack.getItem()).getBlock().getStateFromMeta(stack.getMetadata()), null, null, tintIndex), + BlocksFL.getAllBonsai().toArray(new BlockBonsai[0]) + ); itemColors.registerItemColorHandler((stack, tintIndex) -> event.getBlockColors().colorMultiplier(((ItemBlock) stack.getItem()).getBlock().getStateFromMeta(stack.getMetadata()), null, null, tintIndex), @@ -163,6 +168,7 @@ public static void registerColorHandlerBlocks(ColorHandlerEvent.Block event) IBlockColor foliageColor = GrassColorHandler::computeGrassColor; blockColors.registerBlockColorHandler(foliageColor, BlocksFL.getAllFruitLeaves().toArray(new Block[0])); + blockColors.registerBlockColorHandler(foliageColor, BlocksFL.getAllBonsai().toArray(new Block[0])); //use vanilla stem coloring for stemcrops for (BlockStemCrop block : BlocksFL.getAllCropBlocks()) diff --git a/src/main/java/com/eerussianguy/firmalife/blocks/BlockBonsai.java b/src/main/java/com/eerussianguy/firmalife/blocks/BlockBonsai.java new file mode 100644 index 00000000..d98212ad --- /dev/null +++ b/src/main/java/com/eerussianguy/firmalife/blocks/BlockBonsai.java @@ -0,0 +1,142 @@ +package com.eerussianguy.firmalife.blocks; + +import java.util.Random; +import java.util.function.Supplier; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +import net.minecraft.block.material.Material; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import com.eerussianguy.firmalife.te.TEHangingPlanter; +import mcp.MethodsReturnNonnullByDefault; +import net.dries007.tfc.Constants; +import net.dries007.tfc.objects.te.TETickCounter; +import net.dries007.tfc.util.Helpers; +import net.dries007.tfc.util.calendar.ICalendar; + +import static com.eerussianguy.firmalife.init.StatePropertiesFL.STAGE; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class BlockBonsai extends BlockNonCube +{ + protected final Supplier fruit; + protected final Supplier seed; + protected final long period; + protected final int tier; + + public BlockBonsai(Supplier fruit, Supplier seed, int period, int tier, Material material) + { + super(material); + setHardness(2.0f); + setResistance(3.0f); + setLightOpacity(0); + setTickRandomly(true); + this.seed = seed; + this.fruit = fruit; + this.period = period; + this.tier = tier; + setDefaultState(getBlockState().getBaseState().withProperty(STAGE, 0)); + } + + @Override + @SuppressWarnings("deprecation") + public IBlockState getStateFromMeta(int meta) + { + return getDefaultState().withProperty(STAGE, meta); + } + + @Override + public int getMetaFromState(IBlockState state) + { + return state.getValue(STAGE); + } + + @Override + public void randomTick(World world, BlockPos pos, IBlockState state, Random random) + { + if (!world.isRemote) + { + TEHangingPlanter te = Helpers.getTE(world, pos, TEHangingPlanter.class); + int stage = state.getValue(STAGE); + if (te != null && te.isClimateValid(tier) && te.getTicksSinceUpdate() >= (ICalendar.TICKS_IN_DAY * period) && stage < 2) + { + world.setBlockState(pos, state.withProperty(STAGE, stage + 1)); + te.reduceCounter(ICalendar.TICKS_IN_DAY * period); + te.markForSync(); + } + } + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) + { + if (!world.isRemote) + { + TEHangingPlanter te = Helpers.getTE(world, pos, TEHangingPlanter.class); + if (te == null) return false; + ItemStack held = player.getHeldItem(hand); + if (held.isEmpty() && state.getValue(STAGE) == 2) + { + BlockPos spawnPos = tier == 4 ? pos.up() : pos.down(); // who let me learn to code??? + Helpers.spawnItemStack(world, spawnPos, new ItemStack(fruit.get(), tier == 4 ? 3 : 1)); + if (Constants.RNG.nextInt(7) == 0) + Helpers.spawnItemStack(world, spawnPos, new ItemStack(seed.get())); + world.setBlockState(pos, state.withProperty(STAGE, 0)); + te.resetCounter(); + return true; + } + } + return false; + } + + @Override + public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) + { + TETickCounter tile = Helpers.getTE(worldIn, pos, TETickCounter.class); + if (tile != null) + { + tile.resetCounter(); + } + super.onBlockPlacedBy(worldIn, pos, state, placer, stack); + } + + @Override + @SuppressWarnings("deprecation") + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) + { + return BlockLargePlanter.HALF_BLOCK_SHAPE; + } + + @Override + protected BlockStateContainer createBlockState() + { + return new BlockStateContainer(this, STAGE); + } + + @Override + public boolean hasTileEntity(IBlockState state) + { + return true; + } + + @Override + @Nullable + public TileEntity createTileEntity(World world, IBlockState state) + { + return new TEHangingPlanter(); + } +} diff --git a/src/main/java/com/eerussianguy/firmalife/blocks/BlockCheesewheel.java b/src/main/java/com/eerussianguy/firmalife/blocks/BlockCheesewheel.java index 1a08d7cc..22878106 100644 --- a/src/main/java/com/eerussianguy/firmalife/blocks/BlockCheesewheel.java +++ b/src/main/java/com/eerussianguy/firmalife/blocks/BlockCheesewheel.java @@ -44,7 +44,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class BlockCheesewheel extends Block implements IItemSize +public class BlockCheesewheel extends BlockNonCube implements IItemSize { public static final PropertyInteger WEDGES = StatePropertiesFL.WEDGES; public static final PropertyEnum AGE = StatePropertiesFL.AGE; @@ -121,32 +121,11 @@ public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Bloc } } - @SuppressWarnings("deprecation") - @Override - public boolean isOpaqueCube(IBlockState state) - { - return false; - } - - @SuppressWarnings("deprecation") - @Override - public boolean isFullCube(IBlockState state) - { - return false; - } - private boolean canBlockStay(World worldIn, BlockPos pos) { return worldIn.getBlockState(pos.down()).getMaterial().isSolid(); } - @SideOnly(Side.CLIENT) - @Override - public BlockRenderLayer getRenderLayer() - { - return BlockRenderLayer.CUTOUT; - } - public void randomTick(World worldIn, BlockPos pos, IBlockState state, Random random) { TETickCounter te = Helpers.getTE(worldIn, pos, TETickCounter.class); diff --git a/src/main/java/com/eerussianguy/firmalife/blocks/BlockHangingPlanter.java b/src/main/java/com/eerussianguy/firmalife/blocks/BlockHangingPlanter.java index c32507eb..683ba161 100644 --- a/src/main/java/com/eerussianguy/firmalife/blocks/BlockHangingPlanter.java +++ b/src/main/java/com/eerussianguy/firmalife/blocks/BlockHangingPlanter.java @@ -1,69 +1,43 @@ package com.eerussianguy.firmalife.blocks; -import java.util.Random; import java.util.function.Supplier; import javax.annotation.Nonnull; -import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockHorizontal; -import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyEnum; -import net.minecraft.block.properties.PropertyInteger; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import com.eerussianguy.firmalife.init.StatePropertiesFL; -import com.eerussianguy.firmalife.te.TEHangingPlanter; import mcp.MethodsReturnNonnullByDefault; -import net.dries007.tfc.Constants; import net.dries007.tfc.api.capability.size.IItemSize; -import net.dries007.tfc.api.capability.size.Size; -import net.dries007.tfc.api.capability.size.Weight; -import net.dries007.tfc.objects.te.TETickCounter; -import net.dries007.tfc.util.Helpers; -import net.dries007.tfc.util.calendar.ICalendar; + +import static com.eerussianguy.firmalife.init.StatePropertiesFL.STAGE; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class BlockHangingPlanter extends BlockNonCube implements IItemSize +public class BlockHangingPlanter extends BlockBonsai { public static final PropertyEnum AXIS = StatePropertiesFL.XZ; - public static final PropertyInteger STAGE = StatePropertiesFL.STAGE; - private static final AxisAlignedBB SHAPE = new AxisAlignedBB(0.0D, 0.75D, 0.0D, 1.0D, 1.0D, 1.0D); - private final Supplier fruit; - private final Supplier seed; - - public BlockHangingPlanter(Supplier fruit, Supplier seed) + public BlockHangingPlanter(Supplier fruit, Supplier seed, int period) { - super(Material.IRON); - setHardness(2.0f); - setResistance(3.0f); - setLightOpacity(0); - setSoundType(SoundType.METAL); - setTickRandomly(true); - this.fruit = fruit; - this.seed = seed; + super(fruit, seed, period, 0, Material.IRON); this.setDefaultState(this.getBlockState().getBaseState().withProperty(AXIS, EnumFacing.Axis.X).withProperty(STAGE, 0)); } @Override - @SuppressWarnings("deprecation") @Nonnull public IBlockState getStateFromMeta(int meta) { @@ -85,26 +59,16 @@ public int getMetaFromState(IBlockState state) } @Override - @SuppressWarnings("deprecation") @Nonnull - public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) + protected BlockStateContainer createBlockState() { - return SHAPE; + return new BlockStateContainer(this, AXIS, STAGE); } @Override - public void randomTick(World world, BlockPos pos, IBlockState state, Random random) + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { - if (!world.isRemote) - { - TEHangingPlanter te = Helpers.getTE(world, pos, TEHangingPlanter.class); - int stage = state.getValue(STAGE); - if (te != null && te.isClimateValid() && te.getTicksSinceUpdate() >= (ICalendar.TICKS_IN_DAY * 13) && stage < 2) - { - world.setBlockState(pos, state.withProperty(STAGE, stage + 1)); - te.reduceCounter(ICalendar.TICKS_IN_DAY * 10); - } - } + return SHAPE; } @Override @@ -122,28 +86,6 @@ public void neighborChanged(IBlockState state, World world, BlockPos pos, Block } } - - @Override - public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) - { - if (!world.isRemote) - { - TEHangingPlanter te = Helpers.getTE(world, pos, TEHangingPlanter.class); - if (te == null) return false; - ItemStack held = player.getHeldItem(hand); - if (held.isEmpty() && state.getValue(STAGE) == 2) - { - Helpers.spawnItemStack(world, pos.down(), new ItemStack(fruit.get())); - if (Constants.RNG.nextInt(7) == 0) - Helpers.spawnItemStack(world, pos.down(), new ItemStack(seed.get())); - world.setBlockState(pos, state.withProperty(STAGE, 0)); - te.resetCounter(); - return true; - } - } - return false; - } - @Override @SuppressWarnings("deprecation") @Nonnull @@ -165,49 +107,4 @@ else if (block instanceof BlockHangingPlanter) } return getDefaultState().withProperty(AXIS, facing.getAxis()); } - - @Override - public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) - { - TETickCounter tile = Helpers.getTE(worldIn, pos, TETickCounter.class); - if (tile != null) - { - tile.resetCounter(); - } - super.onBlockPlacedBy(worldIn, pos, state, placer, stack); - } - - @Override - @Nonnull - protected BlockStateContainer createBlockState() - { - return new BlockStateContainer(this, AXIS, STAGE); - } - - @Override - public boolean hasTileEntity(IBlockState state) - { - return true; - } - - @Override - @Nullable - public TileEntity createTileEntity(World world, IBlockState state) - { - return new TEHangingPlanter(); - } - - @Nonnull - @Override - public Size getSize(@Nonnull ItemStack stack) - { - return Size.NORMAL; - } - - @Nonnull - @Override - public Weight getWeight(@Nonnull ItemStack stack) - { - return Weight.MEDIUM; - } } diff --git a/src/main/java/com/eerussianguy/firmalife/blocks/BlockJars.java b/src/main/java/com/eerussianguy/firmalife/blocks/BlockJars.java index fca11652..195d901a 100644 --- a/src/main/java/com/eerussianguy/firmalife/blocks/BlockJars.java +++ b/src/main/java/com/eerussianguy/firmalife/blocks/BlockJars.java @@ -117,12 +117,14 @@ protected BlockStateContainer createBlockState() } @Override + @Nonnull public Size getSize(@Nonnull ItemStack stack) { return Size.VERY_LARGE; } @Override + @Nonnull public Weight getWeight(@Nonnull ItemStack stack) { return Weight.MEDIUM; diff --git a/src/main/java/com/eerussianguy/firmalife/blocks/BlockLargePlanter.java b/src/main/java/com/eerussianguy/firmalife/blocks/BlockLargePlanter.java index 3ad345a4..08d25414 100644 --- a/src/main/java/com/eerussianguy/firmalife/blocks/BlockLargePlanter.java +++ b/src/main/java/com/eerussianguy/firmalife/blocks/BlockLargePlanter.java @@ -1,5 +1,6 @@ package com.eerussianguy.firmalife.blocks; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -201,12 +202,14 @@ public IBlockState getExtendedState(IBlockState state, IBlockAccess world, Block } @Override + @Nonnull public Size getSize(ItemStack stack) { return Size.NORMAL; } @Override + @Nonnull public Weight getWeight(ItemStack stack) { return Weight.HEAVY; diff --git a/src/main/java/com/eerussianguy/firmalife/blocks/BlockNonCube.java b/src/main/java/com/eerussianguy/firmalife/blocks/BlockNonCube.java index b699f80e..25c160c0 100644 --- a/src/main/java/com/eerussianguy/firmalife/blocks/BlockNonCube.java +++ b/src/main/java/com/eerussianguy/firmalife/blocks/BlockNonCube.java @@ -1,11 +1,13 @@ package com.eerussianguy.firmalife.blocks; +import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.BlockFaceShape; import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; @@ -15,13 +17,16 @@ import net.minecraftforge.fml.relauncher.SideOnly; import mcp.MethodsReturnNonnullByDefault; +import net.dries007.tfc.api.capability.size.IItemSize; +import net.dries007.tfc.api.capability.size.Size; +import net.dries007.tfc.api.capability.size.Weight; /** * 1.12 is so wack */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public abstract class BlockNonCube extends Block +public abstract class BlockNonCube extends Block implements IItemSize { public BlockNonCube(Material materialIn) { @@ -55,4 +60,18 @@ public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.CUTOUT; } + + @Override + @Nonnull + public Size getSize(@Nonnull ItemStack itemStack) + { + return Size.NORMAL; + } + + @Override + @Nonnull + public Weight getWeight(@Nonnull ItemStack itemStack) + { + return Weight.MEDIUM; + } } diff --git a/src/main/java/com/eerussianguy/firmalife/init/FoodDataFL.java b/src/main/java/com/eerussianguy/firmalife/init/FoodDataFL.java index 985961df..4f97a48e 100644 --- a/src/main/java/com/eerussianguy/firmalife/init/FoodDataFL.java +++ b/src/main/java/com/eerussianguy/firmalife/init/FoodDataFL.java @@ -8,7 +8,7 @@ public class FoodDataFL public static final FoodData CHOCOLATE = new FoodData(4, 0.0F, 0.2F, 0.2F, 0.0F, 0.0F, 0.0F, 0.8F, 1.1F); public static final FoodData COCOA_BEANS = new FoodData(4, 0.0F, 0.1F, 0.1F, 0.0F, 0.0F, 0.1F, 0.0F, 0.5F); //copied from squash - public static final FoodData PUMPKIN = new FoodData(4, 1F, 0F, 0F, 1.5F, 0F, 0F, 0F, 1.67F); + public static final FoodData PUMPKIN = new FoodData(4, 1F, 0F, 0F, 1.4F, 0F, 0F, 0F, 1.8F); public static final FoodData DRIED_COCOA_BEANS = new FoodData(4, 0.0F, 0.1F, 0.1F, 0.0F, 0.0F, 0.1F, 0.0F, 0.5F); diff --git a/src/main/java/com/eerussianguy/firmalife/registry/BlocksFL.java b/src/main/java/com/eerussianguy/firmalife/registry/BlocksFL.java index c66e5d85..31142bb2 100644 --- a/src/main/java/com/eerussianguy/firmalife/registry/BlocksFL.java +++ b/src/main/java/com/eerussianguy/firmalife/registry/BlocksFL.java @@ -1,6 +1,9 @@ package com.eerussianguy.firmalife.registry; +import java.util.Optional; + import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableList.Builder; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; @@ -24,6 +27,7 @@ import net.dries007.tfc.objects.blocks.BlockFluidTFC; import net.dries007.tfc.objects.blocks.BlockTorchTFC; import net.dries007.tfc.objects.blocks.agriculture.*; +import net.dries007.tfc.objects.blocks.wood.BlockSaplingTFC; import net.dries007.tfc.objects.fluids.FluidsTFC; import net.dries007.tfc.objects.fluids.properties.FluidWrapper; import net.dries007.tfc.objects.items.ItemSeedsTFC; @@ -104,60 +108,52 @@ public class BlocksFL private static ImmutableList allCropBlocks = Helpers.getNull(); private static ImmutableList allJackOLanterns = Helpers.getNull(); private static ImmutableList allInventoryIBs = Helpers.getNull(); + private static ImmutableList allBonsai = Helpers.getNull(); public static ImmutableList getAllIBs() { return allIBs; } - public static ImmutableList getAllNormalIBs() { return allNormalIBs; } - public static ImmutableList getAllFoodIBs() { return allFoodIBs; } - public static ImmutableList getAllFruitLeaves() { return allFruitLeaves; } - + public static ImmutableList getAllBonsai() + { + return allBonsai; + } public static ImmutableList getAllFruitSaps() { return allFruitSaps; } - public static ImmutableList getAllFruitFences() { return allFruitFences; } - public static ImmutableList getAllFruitFenceGates() { return allFruitFenceGates; } - public static ImmutableList getAllFruitDoors() { return allFruitDoors; } - public static ImmutableList getAllFruitTrapdoors() { return allFruitTrapDoors; } - public static ImmutableList getAllDeadCrops() { return allDeadCrops; } - public static ImmutableList getAllCropBlocks() { return allCropBlocks; } - public static ImmutableList getAllFluidBlocks() { return allFluidBlocks; } - public static ImmutableList getAllJackOLanterns() { return allJackOLanterns; } - public static ImmutableList getAllInventoryIBs() { return allInventoryIBs; @@ -169,19 +165,20 @@ public static void registerBlocks(RegistryEvent.Register event) FluidsFL.registerFluids();//this has to come first IForgeRegistry r = event.getRegistry(); - ImmutableList.Builder IBs = ImmutableList.builder(); - ImmutableList.Builder normalIBs = ImmutableList.builder(); - ImmutableList.Builder foodIBs = ImmutableList.builder(); - ImmutableList.Builder fruitLeaves = ImmutableList.builder(); - ImmutableList.Builder fruitSaps = ImmutableList.builder(); - ImmutableList.Builder fruitFences = ImmutableList.builder(); - ImmutableList.Builder fruitFenceGates = ImmutableList.builder(); - ImmutableList.Builder fruitDoors = ImmutableList.builder(); - ImmutableList.Builder fruitTrapdoors = ImmutableList.builder(); - ImmutableList.Builder deadCrops = ImmutableList.builder(); - ImmutableList.Builder cropBlocks = ImmutableList.builder(); - ImmutableList.Builder jackOLanterns = ImmutableList.builder(); - ImmutableList.Builder invIBs = ImmutableList.builder(); + Builder IBs = ImmutableList.builder(); + Builder normalIBs = ImmutableList.builder(); + Builder foodIBs = ImmutableList.builder(); + Builder fruitLeaves = ImmutableList.builder(); + Builder fruitSaps = ImmutableList.builder(); + Builder fruitFences = ImmutableList.builder(); + Builder fruitFenceGates = ImmutableList.builder(); + Builder fruitDoors = ImmutableList.builder(); + Builder fruitTrapdoors = ImmutableList.builder(); + Builder deadCrops = ImmutableList.builder(); + Builder cropBlocks = ImmutableList.builder(); + Builder jackOLanterns = ImmutableList.builder(); + Builder invIBs = ImmutableList.builder(); + Builder bonsais = ImmutableList.builder(); for (FruitTreeFL fruitTree : FruitTreeFL.values()) { @@ -190,24 +187,13 @@ public static void registerBlocks(RegistryEvent.Register event) fruitLeaves.add(register(r, name + "_leaves", new BlockFruitTreeLeaves(fruitTree), CT_WOOD)); fruitSaps.add(register(r, name + "_sapling", new BlockFruitTreeSapling(fruitTree), CT_WOOD)); register(r, name + "_trunk", new BlockFruitTreeTrunk(fruitTree)); - fruitFences.add(register(r, name + "_fence", new BlockFruitFence(), CT_DECORATIONS)); - fruitFenceGates.add(register(r, name + "_fence_gate", new BlockFruitFenceGate(), CT_DECORATIONS)); - fruitDoors.add(register(r, name + "_door", new BlockFruitDoor(), CT_DECORATIONS)); - fruitTrapdoors.add(register(r, name + "_trapdoor", new BlockFruitTrapDoor(), CT_DECORATIONS)); + doFruitAdditions(r, name, fruitFences, fruitFenceGates, fruitDoors, fruitTrapdoors, bonsais, Optional.of(fruitTree)); } - - fruitFences.add(register(r, "cinnamon_fence", new BlockFruitFence(), CT_DECORATIONS)); - fruitFenceGates.add(register(r, "cinnamon_fence_gate", new BlockFruitFenceGate(), CT_DECORATIONS)); - fruitDoors.add(register(r, "cinnamon_door", new BlockFruitDoor(), CT_DECORATIONS)); - fruitTrapdoors.add(register(r, "cinnamon_trapdoor", new BlockFruitTrapDoor(), CT_DECORATIONS)); - + doFruitAdditions(r, "cinnamon", fruitFences, fruitFenceGates, fruitDoors, fruitTrapdoors, bonsais, Optional.empty()); for (IFruitTree fruitTree : FruitTree.values()) { String name = fruitTree.getName().toLowerCase(); - fruitFences.add(register(r, name + "_fence", new BlockFruitFence(), CT_DECORATIONS)); - fruitFenceGates.add(register(r, name + "_fence_gate", new BlockFruitFenceGate(), CT_DECORATIONS)); - fruitDoors.add(register(r, name + "_door", new BlockFruitDoor(), CT_DECORATIONS)); - fruitTrapdoors.add(register(r, name + "_trapdoor", new BlockFruitTrapDoor(), CT_DECORATIONS)); + doFruitAdditions(r, name, fruitFences, fruitFenceGates, fruitDoors, fruitTrapdoors, bonsais, Optional.of(fruitTree)); } normalIBs.add(register(r, "oven", new BlockOven(), CT_DECORATIONS)); @@ -225,9 +211,9 @@ public static void registerBlocks(RegistryEvent.Register event) normalIBs.add(register(r, "climate_station_" + i, new BlockClimateStation(i), CT_DECORATIONS)); register(r, "quad_planter", new BlockQuadPlanter(), CT_DECORATIONS); register(r, "large_planter", new BlockLargePlanter(), CT_DECORATIONS); - normalIBs.add(register(r, "pumpkin_hanging_planter", new BlockHangingPlanter(() -> Item.getItemFromBlock(BlocksFL.PUMPKIN_FRUIT), () -> ItemSeedsTFC.get(StemCrop.PUMPKIN)), CT_DECORATIONS)); - normalIBs.add(register(r, "melon_hanging_planter", new BlockHangingPlanter(() -> Item.getItemFromBlock(BlocksFL.MELON_FRUIT), () -> ItemSeedsTFC.get(StemCrop.MELON)), CT_DECORATIONS)); - normalIBs.add(register(r, "squash_hanging_planter", new BlockHangingPlanter(() -> ItemFoodTFC.get(Food.SQUASH), () -> ItemSeedsTFC.get(Crop.SQUASH)), CT_DECORATIONS)); + normalIBs.add(register(r, "pumpkin_hanging_planter", new BlockHangingPlanter(() -> Item.getItemFromBlock(BlocksFL.PUMPKIN_FRUIT), () -> ItemSeedsTFC.get(StemCrop.PUMPKIN), 13), CT_DECORATIONS)); + normalIBs.add(register(r, "melon_hanging_planter", new BlockHangingPlanter(() -> Item.getItemFromBlock(BlocksFL.MELON_FRUIT), () -> ItemSeedsTFC.get(StemCrop.MELON), 13), CT_DECORATIONS)); + normalIBs.add(register(r, "squash_hanging_planter", new BlockHangingPlanter(() -> ItemFoodTFC.get(Food.SQUASH), () -> ItemSeedsTFC.get(Crop.SQUASH), 13), CT_DECORATIONS)); register(r, "wool_string", new BlockString(() -> ItemsTFC.WOOL_YARN)); normalIBs.add(register(r, "trellis", new BlockTrellis(), CT_DECORATIONS)); normalIBs.add(register(r, "beehive", new BlockBeehive(), CT_DECORATIONS)); @@ -270,7 +256,7 @@ public static void registerBlocks(RegistryEvent.Register event) cropBlocks.add(register(r, "crop/" + crop.name().toLowerCase(), BlockStemCrop.create(crop))); } - ImmutableList.Builder fluids = ImmutableList.builder(); + Builder fluids = ImmutableList.builder(); for (FluidWrapper wrapper : FluidsFL.getAllFiniteFluids()) { fluids.add(register(r, wrapper.get().getName(), new BlockFluidTFC(wrapper.get(), Material.WATER))); @@ -293,6 +279,10 @@ public static void registerBlocks(RegistryEvent.Register event) allFruitLeaves.forEach((x) -> { IBs.add(new ItemBlockTFC(x)); }); + allBonsai = bonsais.build(); + allBonsai.forEach((x) -> { + IBs.add(new ItemBlockTFC(x)); + }); allFruitSaps = fruitSaps.build(); allFruitSaps.forEach((x) -> { ItemBlock ib = new ItemBlockTFC(x); @@ -330,6 +320,16 @@ public static void registerBlocks(RegistryEvent.Register event) FluidsTFC.getWrapper(FluidsFL.ZEBU_MILK.get()); } + private static void doFruitAdditions(IForgeRegistry r, String name, Builder fruitFences, Builder fruitFenceGates, Builder fruitDoors, Builder fruitTrapdoors, Builder bonsais, Optional optionalTree) + { + fruitFences.add(register(r, name + "_fence", new BlockFruitFence(), CT_DECORATIONS)); + fruitFenceGates.add(register(r, name + "_fence_gate", new BlockFruitFenceGate(), CT_DECORATIONS)); + fruitDoors.add(register(r, name + "_door", new BlockFruitDoor(), CT_DECORATIONS)); + fruitTrapdoors.add(register(r, name + "_trapdoor", new BlockFruitTrapDoor(), CT_DECORATIONS)); + optionalTree.ifPresent(tree -> bonsais.add(register(r, name + "_bonsai_pot", new BlockBonsai(() -> tree.getFoodDrop().getItem(), () -> Item.getItemFromBlock(BlockFruitTreeSapling.get(tree)), 19, 4, Material.CLAY), CT_DECORATIONS)) + ); + } + private static T register(IForgeRegistry r, String name, T block, CreativeTabs ct) { block.setCreativeTab(ct); diff --git a/src/main/java/com/eerussianguy/firmalife/registry/TFCRegistry.java b/src/main/java/com/eerussianguy/firmalife/registry/TFCRegistry.java index 00a6f8c8..6edb3cdb 100644 --- a/src/main/java/com/eerussianguy/firmalife/registry/TFCRegistry.java +++ b/src/main/java/com/eerussianguy/firmalife/registry/TFCRegistry.java @@ -17,6 +17,7 @@ import com.eerussianguy.firmalife.init.FoodFL; import com.eerussianguy.firmalife.init.KnappingFL; import com.eerussianguy.firmalife.init.PlantsFL; +import com.eerussianguy.firmalife.init.StemCrop; import com.eerussianguy.firmalife.recipe.KnappingRecipeFood; import net.dries007.tfc.TerraFirmaCraft; import net.dries007.tfc.api.capability.food.FoodTrait; @@ -40,6 +41,7 @@ import net.dries007.tfc.objects.inventory.ingredient.IIngredient; import net.dries007.tfc.objects.inventory.ingredient.IngredientItemFood; import net.dries007.tfc.objects.items.ItemPowder; +import net.dries007.tfc.objects.items.ItemSeedsTFC; import net.dries007.tfc.objects.items.food.ItemFoodTFC; import net.dries007.tfc.objects.items.metal.ItemMetal; import net.dries007.tfc.util.agriculture.Food; @@ -99,8 +101,8 @@ public static void onRegisterKnappingRecipeEvent(RegistryEvent.Register new KnappingRecipeSimple(KnappingFL.PUMPKIN, true, new ItemStack(Item.getItemFromBlock(j)), j.getCarving().getCraftPattern()).setRegistryName("pumpkin_carve_" + j.getCarving().getName())).toArray(KnappingRecipe[]::new)); diff --git a/src/main/java/com/eerussianguy/firmalife/render/LargePlanterBakedModel.java b/src/main/java/com/eerussianguy/firmalife/render/LargePlanterBakedModel.java index f0f22295..a7af974d 100644 --- a/src/main/java/com/eerussianguy/firmalife/render/LargePlanterBakedModel.java +++ b/src/main/java/com/eerussianguy/firmalife/render/LargePlanterBakedModel.java @@ -45,17 +45,15 @@ public LargePlanterBakedModel() { } @Override public List getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { - if (state == null || !(state.getBlock() instanceof BlockLargePlanter)) return dummy.bake(dummy.getDefaultState(), DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()).getQuads(state, side, rand); + if (state == null || !(state.getBlock() instanceof BlockLargePlanter)) return bake(dummy).getQuads(state, side, rand); Map sprites = new HashMap<>(); sprites.put("soil", MOD_ID + (state.getValue(StatePropertiesFL.WET) ? ":blocks/potting_soil_wet" : ":blocks/potting_soil_dry")); if (state instanceof IExtendedBlockState) { - IExtendedBlockState extendedState = (IExtendedBlockState) state; - sprites.put("crop1", resolveTexture(extendedState, BlockLargePlanter.CROP)); + sprites.put("crop1", resolveTexture((IExtendedBlockState) state, BlockLargePlanter.CROP)); } IModel newModel = dummy.retexture(ImmutableMap.copyOf(sprites)); - IBakedModel bakedModel = newModel.bake(newModel.getDefaultState(), DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()); - return bakedModel.getQuads(state, side, rand); + return bake(newModel).getQuads(state, side, rand); } protected String resolveTexture(IExtendedBlockState state, UnlistedCropProperty property) @@ -70,6 +68,11 @@ protected String resolveTexture(IExtendedBlockState state, UnlistedCropProperty return "tfc:blocks/empty"; } + protected static IBakedModel bake(IModel model) + { + return model.bake(model.getDefaultState(), DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()); + } + @Override public boolean isAmbientOcclusion() { diff --git a/src/main/java/com/eerussianguy/firmalife/render/QuadPlanterBakedModel.java b/src/main/java/com/eerussianguy/firmalife/render/QuadPlanterBakedModel.java index e1c5281a..4835fa9b 100644 --- a/src/main/java/com/eerussianguy/firmalife/render/QuadPlanterBakedModel.java +++ b/src/main/java/com/eerussianguy/firmalife/render/QuadPlanterBakedModel.java @@ -41,7 +41,7 @@ public QuadPlanterBakedModel() { } @Override public List getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { - if (state == null || !(state.getBlock() instanceof BlockQuadPlanter)) return dummy.bake(dummy.getDefaultState(), DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()).getQuads(state, side, rand); + if (state == null || !(state.getBlock() instanceof BlockQuadPlanter)) return bake(dummy).getQuads(state, side, rand); Map sprites = new HashMap<>(); sprites.put("soil", MOD_ID + (state.getValue(StatePropertiesFL.WET) ? ":blocks/potting_soil_wet" : ":blocks/potting_soil_dry")); if (state instanceof IExtendedBlockState) @@ -53,7 +53,6 @@ public List getQuads(@Nullable IBlockState state, @Nullable EnumFacin sprites.put("crop4", resolveTexture(extendedState, BlockQuadPlanter.CROP_4)); } IModel newModel = dummy.retexture(ImmutableMap.copyOf(sprites)); - IBakedModel bakedModel = newModel.bake(newModel.getDefaultState(), DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()); - return bakedModel.getQuads(state, side, rand); + return bake(newModel).getQuads(state, side, rand); } } diff --git a/src/main/java/com/eerussianguy/firmalife/render/RenderHandler.java b/src/main/java/com/eerussianguy/firmalife/render/RenderHandler.java index ff3557c9..51712d4a 100644 --- a/src/main/java/com/eerussianguy/firmalife/render/RenderHandler.java +++ b/src/main/java/com/eerussianguy/firmalife/render/RenderHandler.java @@ -71,7 +71,7 @@ public static void onItemTooltip(ItemTooltipEvent event) event.getToolTip().add("Right click to show either the protected region, or the incorrect block."); break; case 2: - event.getToolTip().add("Currently Unused"); + event.getToolTip().add("Upgrade Currently Unused"); break; case 3: event.getToolTip().add("Enables growing grains in the greenhouse."); diff --git a/src/main/java/com/eerussianguy/firmalife/te/TEHangingPlanter.java b/src/main/java/com/eerussianguy/firmalife/te/TEHangingPlanter.java index 3b44ce95..da111f75 100644 --- a/src/main/java/com/eerussianguy/firmalife/te/TEHangingPlanter.java +++ b/src/main/java/com/eerussianguy/firmalife/te/TEHangingPlanter.java @@ -10,17 +10,20 @@ public class TEHangingPlanter extends TETickCounter implements GreenhouseHelpers.IGreenhouseReceiver { private boolean isClimateValid; + private int tier; public TEHangingPlanter() { super(); isClimateValid = false; + tier = 0; } @Override - public void setValidity(boolean approvalStatus, int tier) + public void setValidity(boolean approvalStatus, int tierIn) { isClimateValid = approvalStatus; + tier = tierIn; markForSync(); } @@ -29,10 +32,16 @@ public boolean isClimateValid() return isClimateValid; } + public boolean isClimateValid(int tierMinimum) + { + return isClimateValid && tier >= tierMinimum; + } + @Override public void readFromNBT(NBTTagCompound nbt) { isClimateValid = nbt.getBoolean("isClimateValid"); + tier = nbt.getInteger("tier"); super.readFromNBT(nbt); } @@ -41,6 +50,7 @@ public void readFromNBT(NBTTagCompound nbt) public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt.setBoolean("isClimateValid", isClimateValid); + nbt.setInteger("tier", tier); return super.writeToNBT(nbt); } } diff --git a/src/main/java/com/eerussianguy/firmalife/util/HelpersFL.java b/src/main/java/com/eerussianguy/firmalife/util/HelpersFL.java index 9f46d25a..6031ade9 100644 --- a/src/main/java/com/eerussianguy/firmalife/util/HelpersFL.java +++ b/src/main/java/com/eerussianguy/firmalife/util/HelpersFL.java @@ -1,9 +1,6 @@ package com.eerussianguy.firmalife.util; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Random; -import java.util.Set; +import java.util.*; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumParticleTypes; diff --git a/src/main/resources/assets/firmalife/blockstates/banana_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/banana_bonsai_pot.json new file mode 100644 index 00000000..0c7307e1 --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/banana_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "tfc:blocks/fruit_trees/leaves/banana", + "log": "tfc:blocks/fruit_trees/bark/banana", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/flowers/banana" + } + }, + "2": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/fruit/banana" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/blockstates/cherry_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/cherry_bonsai_pot.json new file mode 100644 index 00000000..337244c3 --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/cherry_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "tfc:blocks/fruit_trees/leaves/cherry", + "log": "tfc:blocks/fruit_trees/bark/cherry", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/flowers/cherry" + } + }, + "2": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/fruit/cherry" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/blockstates/cocoa_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/cocoa_bonsai_pot.json new file mode 100644 index 00000000..80382397 --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/cocoa_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "firmalife:blocks/cocoa_leaves", + "log": "firmalife:blocks/cocoa_bark", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "firmalife:blocks/cocoa_flowers" + } + }, + "2": { + "textures": { + "overlay": "firmalife:blocks/cocoa_fruit" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/blockstates/green_apple_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/green_apple_bonsai_pot.json new file mode 100644 index 00000000..c02b5782 --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/green_apple_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "tfc:blocks/fruit_trees/leaves/green_apple", + "log": "tfc:blocks/fruit_trees/bark/green_apple", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/flowers/green_apple" + } + }, + "2": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/fruit/green_apple" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/blockstates/lemon_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/lemon_bonsai_pot.json new file mode 100644 index 00000000..3f0abea3 --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/lemon_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "tfc:blocks/fruit_trees/leaves/lemon", + "log": "tfc:blocks/fruit_trees/bark/lemon", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/flowers/lemon" + } + }, + "2": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/fruit/lemon" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/blockstates/olive_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/olive_bonsai_pot.json new file mode 100644 index 00000000..c612cd20 --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/olive_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "tfc:blocks/fruit_trees/leaves/olive", + "log": "tfc:blocks/fruit_trees/bark/olive", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/flowers/olive" + } + }, + "2": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/fruit/olive" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/blockstates/orange_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/orange_bonsai_pot.json new file mode 100644 index 00000000..3cc9e60f --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/orange_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "tfc:blocks/fruit_trees/leaves/orange", + "log": "tfc:blocks/fruit_trees/bark/orange", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/flowers/orange" + } + }, + "2": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/fruit/orange" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/blockstates/peach_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/peach_bonsai_pot.json new file mode 100644 index 00000000..a15af80b --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/peach_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "tfc:blocks/fruit_trees/leaves/peach", + "log": "tfc:blocks/fruit_trees/bark/peach", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/flowers/peach" + } + }, + "2": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/fruit/peach" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/blockstates/plum_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/plum_bonsai_pot.json new file mode 100644 index 00000000..78bc5f1d --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/plum_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "tfc:blocks/fruit_trees/leaves/plum", + "log": "tfc:blocks/fruit_trees/bark/plum", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/flowers/plum" + } + }, + "2": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/fruit/plum" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/blockstates/red_apple_bonsai_pot.json b/src/main/resources/assets/firmalife/blockstates/red_apple_bonsai_pot.json new file mode 100644 index 00000000..9790319d --- /dev/null +++ b/src/main/resources/assets/firmalife/blockstates/red_apple_bonsai_pot.json @@ -0,0 +1,38 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "firmalife:bonsai_tree", + "textures": { + "leaves": "tfc:blocks/fruit_trees/leaves/red_apple", + "log": "tfc:blocks/fruit_trees/bark/red_apple", + "overlay": "tfc:blocks/empty" + } + }, + "variants": { + "stage": { + "0": { + "textures": { + "overlay": "tfc:blocks/empty" + } + }, + "1": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/flowers/red_apple" + } + }, + "2": { + "textures": { + "overlay": "tfc:blocks/fruit_trees/fruit/red_apple" + } + } + }, + "inventory": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }], + "normal": [{ + "transform": "forge:default-block", + "model": "firmalife:bonsai_tree" + }] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/lang/en_us.lang b/src/main/resources/assets/firmalife/lang/en_us.lang index 7731c658..6abc1c95 100644 --- a/src/main/resources/assets/firmalife/lang/en_us.lang +++ b/src/main/resources/assets/firmalife/lang/en_us.lang @@ -150,6 +150,18 @@ tile.firmalife.peach_door.name=Peach Door tile.firmalife.plum_door.name=Plum Door tile.firmalife.red_apple_door.name=Red Apple Door +tile.firmalife.banana_bonsai_pot.name=Banana Bonsai Pot +tile.firmalife.cherry_bonsai_pot.name=Cherry Bonsai Pot +tile.firmalife.cinnamon_bonsai_pot.name=Cinnamon Bonsai Pot +tile.firmalife.cocoa_bonsai_pot.name=Cocoa Bonsai Pot +tile.firmalife.green_apple_bonsai_pot.name=Green Apple Bonsai Pot +tile.firmalife.lemon_bonsai_pot.name=Lemon Bonsai Pot +tile.firmalife.olive_bonsai_pot.name=Olive Bonsai Pot +tile.firmalife.orange_bonsai_pot.name=Orange Bonsai Pot +tile.firmalife.peach_bonsai_pot.name=Peach Bonsai Pot +tile.firmalife.plum_bonsai_pot.name=Plum Bonsai Pot +tile.firmalife.red_apple_bonsai_pot.name=Red Apple Bonsai Pot + tile.firmalife.banana_trapdoor.name=Banana Trapdoor tile.firmalife.cherry_trapdoor.name=Cherry Trapdoor tile.firmalife.cinnamon_trapdoor.name=Cinnamon Trapdoor diff --git a/src/main/resources/assets/firmalife/models/block/bonsai_tree.json b/src/main/resources/assets/firmalife/models/block/bonsai_tree.json new file mode 100644 index 00000000..6aaf2504 --- /dev/null +++ b/src/main/resources/assets/firmalife/models/block/bonsai_tree.json @@ -0,0 +1,236 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "log": "#log", + "leaves": "#leaves", + "overlay": "#overlay", + "particle": "blocks/hardened_clay", + "pot": "blocks/hardened_clay", + "soil": "firmalife:blocks/potting_soil_wet" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [15, 1, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 9]}, + "faces": { + "down": {"uv": [0, 0, 14, 14], "texture": "#pot"} + } + }, + { + "from": [0, 0, 0], + "to": [1, 8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]}, + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#pot"}, + "east": {"uv": [0, 0, 16, 8], "texture": "#pot"}, + "south": {"uv": [0, 0, 1, 8], "texture": "#pot"}, + "west": {"uv": [0, 0, 16, 8], "texture": "#pot"}, + "up": {"uv": [0, 0, 1, 16], "texture": "#pot"}, + "down": {"uv": [0, 0, 1, 16], "texture": "#pot"} + } + }, + { + "from": [15, 0, 0], + "to": [16, 8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [23, 13, 8]}, + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#pot"}, + "east": {"uv": [0, 0, 16, 8], "texture": "#pot"}, + "south": {"uv": [0, 0, 1, 8], "texture": "#pot"}, + "west": {"uv": [0, 0, 16, 8], "texture": "#pot"}, + "up": {"uv": [0, 0, 1, 16], "texture": "#pot"}, + "down": {"uv": [0, 0, 1, 16], "texture": "#pot"} + } + }, + { + "from": [1, 0, 0], + "to": [15, 8, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 13, 8]}, + "faces": { + "north": {"uv": [0, 0, 14, 8], "texture": "#pot"}, + "south": {"uv": [0, 0, 14, 8], "texture": "#pot"}, + "up": {"uv": [0, 0, 1, 14], "rotation": 90, "texture": "#pot"}, + "down": {"uv": [0, 0, 1, 14], "rotation": 270, "texture": "#pot"} + } + }, + { + "from": [1, 0, 15], + "to": [15, 8, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 13, 23]}, + "faces": { + "north": {"uv": [0, 0, 14, 8], "texture": "#pot"}, + "south": {"uv": [0, 0, 14, 8], "texture": "#pot"}, + "up": {"uv": [0, 0, 1, 14], "rotation": 90, "texture": "#pot"}, + "down": {"uv": [0, 0, 1, 14], "rotation": 270, "texture": "#pot"} + } + }, + { + "from": [1, 3, 1], + "to": [15, 7, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 11, 9]}, + "faces": { + "up": {"uv": [0, 0, 14, 14], "texture": "#soil"} + } + }, + { + "from": [7, 7, 7], + "to": [9, 18, 9], + "faces": { + "north": {"uv": [0, 0, 2, 11], "texture": "#log"}, + "east": {"uv": [0, 0, 2, 11], "texture": "#log"}, + "south": {"uv": [0, 0, 2, 11], "texture": "#log"}, + "west": {"uv": [0, 0, 2, 11], "texture": "#log"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#log"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#log"} + } + }, + { + "from": [2.9, 12, 4.9], + "to": [11.05, 21.1, 11.1], + "faces": { + "north": {"uv": [0, 0, 8.15, 9.1], "texture": "#overlay"}, + "east": {"uv": [0, 0, 6.2, 9.1], "texture": "#overlay"}, + "south": {"uv": [0, 0, 8.15, 9.1], "texture": "#overlay"}, + "west": {"uv": [0, 0, 6.2, 9.1], "texture": "#overlay"}, + "up": {"uv": [0, 0, 8.15, 6.2], "texture": "#overlay"}, + "down": {"uv": [0, 0, 8.15, 6.2], "texture": "#overlay"} + } + }, + { + "from": [3.3, 10.2, 0.95], + "to": [12.5, 17.1, 7.05], + "faces": { + "north": {"uv": [0, 0, 8.2, 6.9], "texture": "#overlay"}, + "east": {"uv": [0, 0, 6.1, 6.9], "texture": "#overlay"}, + "south": {"uv": [0, 0, 8.2, 6.9], "texture": "#overlay"}, + "west": {"uv": [0, 0, 6.1, 6.9], "texture": "#overlay"}, + "up": {"uv": [0, 0, 8.2, 6.1], "texture": "#overlay"}, + "down": {"uv": [0, 0, 8.2, 6.1], "texture": "#overlay"} + } + }, + { + "from": [3.9, 11.9, 10.1], + "to": [10.1, 19.1, 16.1], + "faces": { + "north": {"uv": [0, 0, 6.2, 7.2], "texture": "#overlay"}, + "east": {"uv": [0, 0, 6, 7.2], "texture": "#overlay"}, + "south": {"uv": [0, 0, 6.2, 7.2], "texture": "#overlay"}, + "west": {"uv": [0, 0, 6, 7.2], "texture": "#overlay"}, + "up": {"uv": [0, 0, 6.2, 6], "texture": "#overlay"}, + "down": {"uv": [0, 0, 6.2, 6], "texture": "#overlay"} + } + }, + { + "from": [7, 12, 4], + "to": [9, 14, 7], + "faces": { + "north": {"uv": [0, 0, 2, 2], "texture": "#log"}, + "east": {"uv": [0, 0, 3, 2], "texture": "#log"}, + "south": {"uv": [0, 0, 2, 2], "texture": "#log"}, + "west": {"uv": [0, 0, 3, 2], "texture": "#log"}, + "up": {"uv": [0, 0, 2, 3], "texture": "#log"}, + "down": {"uv": [0, 0, 2, 3], "texture": "#log"} + } + }, + { + "from": [5, 14, 8], + "to": [7, 16, 12], + "faces": { + "north": {"uv": [0, 0, 2, 2], "texture": "#log"}, + "east": {"uv": [0, 0, 4, 2], "texture": "#log"}, + "south": {"uv": [0, 0, 2, 2], "texture": "#log"}, + "west": {"uv": [0, 0, 4, 2], "texture": "#log"}, + "up": {"uv": [0, 0, 2, 4], "texture": "#log"}, + "down": {"uv": [0, 0, 2, 4], "texture": "#log"} + } + }, + { + "from": [10, 12, 6], + "to": [10, 15, 12], + "faces": { + "north": {"uv": [0, 0, 0, 3], "texture": "#leaves", "tintindex": 0}, + "east": {"uv": [0, 0, 6, 3], "texture": "#leaves", "tintindex": 0}, + "south": {"uv": [0, 0, 0, 3], "texture": "#leaves", "tintindex": 0}, + "west": {"uv": [0, 0, 6, 3], "texture": "#leaves", "tintindex": 0}, + "up": {"uv": [0, 0, 0, 6], "texture": "#leaves", "tintindex": 0}, + "down": {"uv": [0, 0, 0, 6], "texture": "#leaves", "tintindex": 0} + } + }, + { + "from": [4, 12, 10], + "to": [10, 19, 16], + "faces": { + "north": {"uv": [0, 0, 6, 7], "texture": "#leaves", "tintindex": 0}, + "east": {"uv": [0, 0, 6, 7], "texture": "#leaves", "tintindex": 0}, + "south": {"uv": [0, 0, 6, 7], "texture": "#leaves", "tintindex": 0}, + "west": {"uv": [0, 0, 6, 7], "texture": "#leaves", "tintindex": 0}, + "up": {"uv": [0, 0, 6, 6], "texture": "#leaves", "tintindex": 0}, + "down": {"uv": [0, 0, 6, 6], "texture": "#leaves", "tintindex": 0} + } + }, + { + "from": [3, 11, 5], + "to": [11, 21, 11], + "faces": { + "north": {"uv": [0, 0, 8, 10], "texture": "#leaves", "tintindex": 0}, + "east": {"uv": [0, 0, 6, 10], "texture": "#leaves", "tintindex": 0}, + "south": {"uv": [0, 0, 8, 10], "texture": "#leaves", "tintindex": 0}, + "west": {"uv": [0, 0, 6, 10], "texture": "#leaves", "tintindex": 0}, + "up": {"uv": [0, 0, 8, 6], "texture": "#leaves", "tintindex": 0}, + "down": {"uv": [0, 0, 8, 6], "texture": "#leaves", "tintindex": 0} + } + }, + { + "from": [4, 10, 1], + "to": [12, 17, 7], + "faces": { + "north": {"uv": [0, 0, 8, 7], "texture": "#leaves", "tintindex": 0}, + "east": {"uv": [0, 0, 6, 7], "texture": "#leaves", "tintindex": 0}, + "south": {"uv": [0, 0, 8, 7], "texture": "#leaves", "tintindex": 0}, + "west": {"uv": [0, 0, 6, 7], "texture": "#leaves", "tintindex": 0}, + "up": {"uv": [0, 0, 8, 6], "texture": "#leaves", "tintindex": 0}, + "down": {"uv": [0, 0, 8, 6], "texture": "#leaves", "tintindex": 0} + } + } + ], + "groups": [ + { + "name": "large_planter", + "origin": [8, 8, 8], + "color": 0, + "children": [ + { + "name": "group", + "origin": [9, 13, 23], + "color": 0, + "children": [0, 1, 2, 3, 4] + }, + { + "name": "quad_planter_dirt", + "origin": [8, 8, 8], + "color": 0, + "children": [5] + }, + { + "name": "crop1", + "origin": [4, 6, 4], + "color": 0, + "children": [] + } + ] + }, 6, + { + "name": "overlay", + "origin": [0, 0, 0], + "color": 0, + "children": [7, 8, 9] + }, 10, 11, + { + "name": "leaves", + "origin": [0, 0, 0], + "color": 0, + "children": [12, 13, 14, 15] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/banana_bonsai.json b/src/main/resources/assets/firmalife/recipes/banana_bonsai.json new file mode 100644 index 00000000..1404befa --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/banana_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "tfc:fruit_trees/sapling/banana" + } + ], + "result": { + "item": "firmalife:banana_bonsai_pot", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/cherry_bonsai.json b/src/main/resources/assets/firmalife/recipes/cherry_bonsai.json new file mode 100644 index 00000000..fdc9821e --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/cherry_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "tfc:fruit_trees/sapling/cherry" + } + ], + "result": { + "item": "firmalife:cherry_bonsai_pot", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/cocoa_bonsai.json b/src/main/resources/assets/firmalife/recipes/cocoa_bonsai.json new file mode 100644 index 00000000..c9a6133f --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/cocoa_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "firmalife:cocoa_sapling" + } + ], + "result": { + "item": "firmalife:cocoa_bonsai_pot", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/green_apple_bonsai.json b/src/main/resources/assets/firmalife/recipes/green_apple_bonsai.json new file mode 100644 index 00000000..17792998 --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/green_apple_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "tfc:fruit_trees/sapling/green_apple" + } + ], + "result": { + "item": "firmalife:green_apple_bonsai_pot", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/lemon_bonsai.json b/src/main/resources/assets/firmalife/recipes/lemon_bonsai.json new file mode 100644 index 00000000..3362e388 --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/lemon_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "tfc:fruit_trees/sapling/lemon" + } + ], + "result": { + "item": "firmalife:lemon_bonsai_pot", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/olive_bonsai.json b/src/main/resources/assets/firmalife/recipes/olive_bonsai.json new file mode 100644 index 00000000..eb94bca8 --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/olive_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "tfc:fruit_trees/sapling/olive" + } + ], + "result": { + "item": "firmalife:olive_bonsai_pot", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/orange_bonsai.json b/src/main/resources/assets/firmalife/recipes/orange_bonsai.json new file mode 100644 index 00000000..884dac79 --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/orange_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "tfc:fruit_trees/sapling/orange" + } + ], + "result": { + "item": "firmalife:orange_bonsai_pot", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/peach_bonsai.json b/src/main/resources/assets/firmalife/recipes/peach_bonsai.json new file mode 100644 index 00000000..f61b2d15 --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/peach_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "tfc:fruit_trees/sapling/peach" + } + ], + "result": { + "item": "firmalife:peach_bonsai_pot", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/plum_bonsai.json b/src/main/resources/assets/firmalife/recipes/plum_bonsai.json new file mode 100644 index 00000000..5efd1f47 --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/plum_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "tfc:fruit_trees/sapling/plum" + } + ], + "result": { + "item": "firmalife:plum_bonsai_pot", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/firmalife/recipes/red_apple_bonsai.json b/src/main/resources/assets/firmalife/recipes/red_apple_bonsai.json new file mode 100644 index 00000000..1ea4725d --- /dev/null +++ b/src/main/resources/assets/firmalife/recipes/red_apple_bonsai.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "item": "firmalife:large_planter" + }, + { + "item": "tfc:fruit_trees/sapling/red_apple" + } + ], + "result": { + "item": "firmalife:red_apple_bonsai_pot", + "count": 1 + } +} \ No newline at end of file