diff --git a/src/main/java/carpetextra/dispenser/CarpetExtraDispenserBehaviors.java b/src/main/java/carpetextra/dispenser/CarpetExtraDispenserBehaviors.java index add91ac9..0c96def5 100644 --- a/src/main/java/carpetextra/dispenser/CarpetExtraDispenserBehaviors.java +++ b/src/main/java/carpetextra/dispenser/CarpetExtraDispenserBehaviors.java @@ -243,9 +243,14 @@ else if(CauldronWaterDispenserBehavior.isWaterCauldronItem(stack)) { } // dispensersPlaceBoatsOnIce - if (CarpetExtraSettings.dispensersPlaceBoatsOnIce && item instanceof BoatItem && frontBlock == Blocks.AIR) { - BlockPos blockBelowFrontBlockPos = frontBlockPos.down(); - if (world.getBlockState(blockBelowFrontBlockPos).isIn(BlockTags.ICE)) { + if (CarpetExtraSettings.dispensersPlaceBoatsOnIce && item instanceof BoatItem) { + BlockState frontState = world.getBlockState(frontBlockPos); + + boolean iceInFront = frontState.isIn(BlockTags.ICE); + boolean airInFront = frontState.isAir(); + boolean iceBelowFront = world.getBlockState(frontBlockPos.down()).isIn(BlockTags.ICE); + + if (iceInFront || (airInFront && iceBelowFront)) { return PLACE_BOAT_ON_ICE; } } diff --git a/src/main/java/carpetextra/dispenser/behaviors/PlaceBoatOnIceDispenserBehavior.java b/src/main/java/carpetextra/dispenser/behaviors/PlaceBoatOnIceDispenserBehavior.java index 713ba12a..8eb3b2ee 100644 --- a/src/main/java/carpetextra/dispenser/behaviors/PlaceBoatOnIceDispenserBehavior.java +++ b/src/main/java/carpetextra/dispenser/behaviors/PlaceBoatOnIceDispenserBehavior.java @@ -1,9 +1,6 @@ package carpetextra.dispenser.behaviors; import carpetextra.mixins.BoatItemAccessorMixin; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.block.DispenserBlock; import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; import net.minecraft.entity.EntityType; @@ -21,10 +18,10 @@ public class PlaceBoatOnIceDispenserBehavior extends FallibleItemDispenserBehavi @Override public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - this.setSuccess(true); + this.setSuccess(false); ServerWorld world = pointer.world(); Direction facing = pointer.state().get(DispenserBlock.FACING); - + BoatItemAccessorMixin boatInfo = (BoatItemAccessorMixin) stack.getItem(); EntityType boatType = boatInfo.getType(); @@ -34,24 +31,27 @@ public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { double y = vec3d.getY() + facing.getOffsetY() * 1.125F; double z = vec3d.getZ() + facing.getOffsetZ() * d; - BlockPos frontBlockPos = pointer.pos().offset(facing); - Block frontBlock = world.getBlockState(frontBlockPos).getBlock(); - BlockState stateBelowFront = world.getBlockState(frontBlockPos.down()); + BlockPos frontPos = pointer.pos().offset(facing); + boolean iceInFront = world.getBlockState(frontPos).isIn(BlockTags.ICE); + boolean airInFront = world.getBlockState(frontPos).isAir(); + boolean iceBelowFront = world.getBlockState(frontPos.down()).isIn(BlockTags.ICE); - if (frontBlock == Blocks.AIR && stateBelowFront.isIn(BlockTags.ICE)) { - AbstractBoatEntity boatEntity = boatType.create(world, SpawnReason.DISPENSER); + if (!(iceInFront || (airInFront && iceBelowFront))) { + return stack; + } - boatEntity.initPosition(x, y, z); - EntityType.copier(world, stack, null).accept(boatEntity); - boatEntity.setYaw(facing.getPositiveHorizontalDegrees()); + double h = iceInFront ? 1.0 : 0.0; - world.spawnEntity(boatEntity); + AbstractBoatEntity boat = boatType.create(world, SpawnReason.DISPENSER); + if (boat != null) { + boat.initPosition(x, y + h, z); + EntityType.copier(world, stack, null).accept(boat); + boat.setYaw(facing.getPositiveHorizontalDegrees()); + world.spawnEntity(boat); stack.decrement(1); - return stack; + this.setSuccess(true); } - // fail to dispense - this.setSuccess(false); return stack; } }