From 4c4881e7e58d25d47ac5666a53e89cf7af9d6de4 Mon Sep 17 00:00:00 2001 From: drcrazy Date: Mon, 20 Sep 2021 05:38:43 +0300 Subject: [PATCH] Cells should work on caludron. Closes #2490 --- src/main/java/techreborn/TechReborn.java | 1 + .../techreborn/init/TRCauldronBehavior.java | 75 +++++++++++++++++++ .../techreborn/items/DynamicCellItem.java | 1 + 3 files changed, 77 insertions(+) create mode 100644 src/main/java/techreborn/init/TRCauldronBehavior.java diff --git a/src/main/java/techreborn/TechReborn.java b/src/main/java/techreborn/TechReborn.java index f2e23f2f3..233f72deb 100644 --- a/src/main/java/techreborn/TechReborn.java +++ b/src/main/java/techreborn/TechReborn.java @@ -93,6 +93,7 @@ public class TechReborn implements ModInitializer { //noinspection ResultOfMethodCallIgnored GuiType.AESU.getIdentifier(); TRDispenserBehavior.init(); + TRCauldronBehavior.init(); PoweredCraftingHandler.setup(); UseBlockHandler.init(); ApplyArmorToDamageHandler.init(); diff --git a/src/main/java/techreborn/init/TRCauldronBehavior.java b/src/main/java/techreborn/init/TRCauldronBehavior.java new file mode 100644 index 000000000..3fa37f04d --- /dev/null +++ b/src/main/java/techreborn/init/TRCauldronBehavior.java @@ -0,0 +1,75 @@ +package techreborn.init; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.LeveledCauldronBlock; +import net.minecraft.block.cauldron.CauldronBehavior; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUsage; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.event.GameEvent; +import techreborn.items.DynamicCellItem; +import techreborn.utils.FluidUtils; + +public class TRCauldronBehavior { + public static void init() { + CauldronBehavior FILL_CELL_WITH_LAVA = (state, world, pos, player, hand, stack) -> { + if (!FluidUtils.isContainerEmpty(stack)) { + return ActionResult.PASS; + } + + return CauldronBehavior.emptyCauldron(state, world, pos, player, hand, stack, + DynamicCellItem.getCellWithFluid(Fluids.LAVA), (statex) -> true, SoundEvents.ITEM_BUCKET_FILL); + }; + + CauldronBehavior FILL_CELL_WITH_WATER = (state, world, pos, player, hand, stack) -> { + if (!FluidUtils.isContainerEmpty(stack)) { + return ActionResult.PASS; + } + + return CauldronBehavior.emptyCauldron(state, world, pos, player, hand, stack, + DynamicCellItem.getCellWithFluid(Fluids.WATER), (statex) -> true, SoundEvents.ITEM_BUCKET_FILL_LAVA); + }; + + CauldronBehavior FILL_FROM_CELL = (state, world, pos, player, hand, stack) -> { + Fluid cellFluid = ((DynamicCellItem) stack.getItem()).getFluid(stack); + if (cellFluid == Fluids.WATER) { + return fillCauldronFromCell(world, pos, player, hand, stack, + Blocks.WATER_CAULDRON.getDefaultState().with(LeveledCauldronBlock.LEVEL, 3), + SoundEvents.ITEM_BUCKET_EMPTY); + } else if (cellFluid == Fluids.LAVA) { + return fillCauldronFromCell(world, pos, player, hand, stack, + Blocks.LAVA_CAULDRON.getDefaultState(), + SoundEvents.ITEM_BUCKET_EMPTY_LAVA); + } + + return ActionResult.PASS; + }; + + CauldronBehavior.LAVA_CAULDRON_BEHAVIOR.put(TRContent.CELL, FILL_CELL_WITH_LAVA); + CauldronBehavior.WATER_CAULDRON_BEHAVIOR.put(TRContent.CELL, FILL_CELL_WITH_WATER); + CauldronBehavior.EMPTY_CAULDRON_BEHAVIOR.put(TRContent.CELL, FILL_FROM_CELL); + } + + static ActionResult fillCauldronFromCell(World world, BlockPos pos, PlayerEntity player, Hand hand, ItemStack stack, BlockState state, SoundEvent soundEvent) { + if (!world.isClient) { + player.setStackInHand(hand, ItemUsage.exchangeStack(stack, player, new ItemStack(TRContent.CELL))); + player.incrementStat(Stats.FILL_CAULDRON); + world.setBlockState(pos, state); + world.playSound(null, pos, soundEvent, SoundCategory.BLOCKS, 1.0F, 1.0F); + world.emitGameEvent(null, GameEvent.FLUID_PLACE, pos); + } + + return ActionResult.success(world.isClient); + } +} diff --git a/src/main/java/techreborn/items/DynamicCellItem.java b/src/main/java/techreborn/items/DynamicCellItem.java index 733d56e7a..a67ed67dd 100644 --- a/src/main/java/techreborn/items/DynamicCellItem.java +++ b/src/main/java/techreborn/items/DynamicCellItem.java @@ -186,6 +186,7 @@ public class DynamicCellItem extends Item implements ItemFluidInfo { ItemStack itemStack = ((FluidDrainable) hitState.getBlock()).tryDrainFluid(world, hitPos, hitState); if (!itemStack.isEmpty() && itemStack.getItem() instanceof ItemFluidInfo) { Fluid drainFluid = ((ItemFluidInfo) itemStack.getItem()).getFluid(itemStack); + // TODO: Change to ItemUsage.exchangeStack if (stack.getCount() == 1) { stack = getCellWithFluid(drainFluid, 1); } else {