diff --git a/build.gradle b/build.gradle index a2db9252..014906cc 100644 --- a/build.gradle +++ b/build.gradle @@ -145,6 +145,7 @@ dependencies { //modImplementation("curse.maven:inventorysorter-240633:4655091") modImplementation("curse.maven:cyclic-239286:4994392") modImplementation("curse.maven:flib-661261:4724762") + modImplementation("curse.maven:thirst-was-taken-679270:6660408") // DEV ONLY compileOnly('org.jetbrains:annotations:23.0.0') diff --git a/src/main/java/thedarkcolour/exdeorum/blockentity/BarrelBlockEntity.java b/src/main/java/thedarkcolour/exdeorum/blockentity/BarrelBlockEntity.java index 8c7c45b4..65ca7b1d 100644 --- a/src/main/java/thedarkcolour/exdeorum/blockentity/BarrelBlockEntity.java +++ b/src/main/java/thedarkcolour/exdeorum/blockentity/BarrelBlockEntity.java @@ -226,6 +226,54 @@ public class BarrelBlockEntity extends ETankBlockEntity { var wasBurning = isBurning(); this.isBeingFilledByPlayer = true; + var playerItem = player.getItemInHand(hand); + + // Insert water bucket with NBT + if (playerItem.getItem() == Items.WATER_BUCKET && playerItem.hasTag()) { + var fluid = new FluidStack(Fluids.WATER, 1000, playerItem.getTag().copy()); + if (this.tank.fill(fluid, IFluidHandler.FluidAction.SIMULATE) == 1000) { + this.tank.fill(fluid, IFluidHandler.FluidAction.EXECUTE); + if (!player.getAbilities().instabuild) { + playerItem.shrink(1); + if (!player.addItem(new ItemStack(Items.BUCKET))) { + player.drop(new ItemStack(Items.BUCKET), false); + } + } + level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.BUCKET_EMPTY, SoundSource.NEUTRAL, 1.0F, 1.0F); + this.isBeingFilledByPlayer = false; + tryInWorldFluidMixing(); + markUpdated(); + + if (wasBurning && !isHotFluid(this.tank.getFluid().getFluid().getFluidType())) { + this.progress = 0.0f; + } + + return InteractionResult.sidedSuccess(level.isClientSide); + } + } + + // Extract liquid with NBT + if (playerItem.getItem() == Items.BUCKET) { + var currentFluid = this.tank.getFluid(); + if (currentFluid.getFluid() == Fluids.WATER && currentFluid.hasTag() && currentFluid.getAmount() >= 1000) { + if (this.tank.drain(1000, IFluidHandler.FluidAction.SIMULATE).getAmount() == 1000) { + this.tank.drain(1000, IFluidHandler.FluidAction.EXECUTE); + var filledBucket = new ItemStack(Items.WATER_BUCKET); + filledBucket.setTag(currentFluid.getTag().copy()); + if (!player.getAbilities().instabuild) { + playerItem.shrink(1); + if (!player.addItem(filledBucket)) { + player.drop(filledBucket, false); + } + } + level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.BUCKET_FILL, SoundSource.NEUTRAL, 1.0F, 1.0F); + this.isBeingFilledByPlayer = false; + tryInWorldFluidMixing(); + markUpdated(); + return InteractionResult.sidedSuccess(level.isClientSide); + } + } + } if (FluidUtil.interactWithFluidHandler(player, hand, this.tank)) { this.isBeingFilledByPlayer = false; @@ -241,7 +289,6 @@ public class BarrelBlockEntity extends ETankBlockEntity { } else { this.isBeingFilledByPlayer = false; // try one more time to transfer fluids between item and barrel - var playerItem = player.getItemInHand(hand); if (EConfig.SERVER.allowWaterBottleTransfer.get()) { var fluid = new FluidStack(Fluids.WATER, 250); @@ -249,6 +296,7 @@ public class BarrelBlockEntity extends ETankBlockEntity { // Transfer any extra NBT tags from other mods to the fluid var nbt = playerItem.getTag().copy(); nbt.remove("Potion"); + if (nbt.isEmpty()) nbt = null; fluid = new FluidStack(Fluids.WATER, 250, nbt); if (this.tank.fill(fluid, IFluidHandler.FluidAction.SIMULATE) > 0) { @@ -335,13 +383,15 @@ public class BarrelBlockEntity extends ETankBlockEntity { if (!player.getAbilities().instabuild) { playerItem.shrink(1); } + tank.drain(fluid, IFluidHandler.FluidAction.EXECUTE); var bottle = PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER); - var nbt = bottle.getOrCreateTag(); - nbt.merge(fluid.getOrCreateTag()); + if (fluid.hasTag()) { + var nbt = bottle.getOrCreateTag(); + nbt.merge(fluid.getTag()); + } if (!player.addItem(bottle)) { player.drop(bottle, false); } - tank.drain(fluid, IFluidHandler.FluidAction.EXECUTE); level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.BOTTLE_EMPTY, SoundSource.NEUTRAL, 1.0F, 1.0F); } diff --git a/src/main/java/thedarkcolour/exdeorum/registry/EBlocks.java b/src/main/java/thedarkcolour/exdeorum/registry/EBlocks.java index b40dea57..587a5bd8 100644 --- a/src/main/java/thedarkcolour/exdeorum/registry/EBlocks.java +++ b/src/main/java/thedarkcolour/exdeorum/registry/EBlocks.java @@ -41,7 +41,7 @@ public class EBlocks { public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, ExDeorum.ID); // Materials - public static final RegistryObject DUST = BLOCKS.register("dust", () -> new FallingBlock(of().sound(SoundType.SAND).strength(0.4f))); + public static final RegistryObject DUST = BLOCKS.register("dust", () -> new FallingBlock(of().mapColor(MapColor.SAND).sound(SoundType.SAND).strength(0.4f))); public static final RegistryObject CRUSHED_NETHERRACK = BLOCKS.register("crushed_netherrack", () -> new FallingBlock(of().mapColor(MapColor.NETHER).sound(SoundType.SAND).strength(0.6f))); public static final RegistryObject CRUSHED_END_STONE = BLOCKS.register("crushed_end_stone", () -> new FallingBlock(of().mapColor(MapColor.SAND).sound(SoundType.SAND).strength(0.6f))); public static final RegistryObject CRUSHED_DEEPSLATE = BLOCKS.register("crushed_deepslate", () -> new FallingBlock(of().mapColor(DyeColor.GRAY).sound(SoundType.SAND).strength(0.8f)));