From 5404ec638b0b01d68caff7af9763383060de256e Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Sun, 18 Oct 2020 20:44:43 +0200 Subject: moved Dispenser behavior to own package --- .../re/jag/parquet/BucketDispenserBehavior.java | 55 ----------------- .../re/jag/parquet/DyeItemDispenserBehavior.java | 64 -------------------- .../jag/parquet/GlassBottleDispenserBehavior.java | 68 ---------------------- .../re/jag/parquet/MusicDiscDispenserBehavior.java | 36 ------------ src/main/java/re/jag/parquet/Parquet.java | 8 +-- .../re/jag/parquet/PotionDispenserBehavior.java | 40 ------------- .../parquet/ShulkerPlacementDispenserBehavior.java | 52 ----------------- .../jag/parquet/WaterBucketDispenserBehavior.java | 48 --------------- .../parquet/dispenser/BucketDispenserBehavior.java | 55 +++++++++++++++++ .../dispenser/DyeItemDispenserBehavior.java | 64 ++++++++++++++++++++ .../dispenser/GlassBottleDispenserBehavior.java | 68 ++++++++++++++++++++++ .../dispenser/MusicDiscDispenserBehavior.java | 36 ++++++++++++ .../parquet/dispenser/PotionDispenserBehavior.java | 40 +++++++++++++ .../ShulkerPlacementDispenserBehavior.java | 52 +++++++++++++++++ .../dispenser/WaterBucketDispenserBehavior.java | 48 +++++++++++++++ 15 files changed, 365 insertions(+), 369 deletions(-) delete mode 100644 src/main/java/re/jag/parquet/BucketDispenserBehavior.java delete mode 100644 src/main/java/re/jag/parquet/DyeItemDispenserBehavior.java delete mode 100644 src/main/java/re/jag/parquet/GlassBottleDispenserBehavior.java delete mode 100644 src/main/java/re/jag/parquet/MusicDiscDispenserBehavior.java delete mode 100644 src/main/java/re/jag/parquet/PotionDispenserBehavior.java delete mode 100644 src/main/java/re/jag/parquet/ShulkerPlacementDispenserBehavior.java delete mode 100644 src/main/java/re/jag/parquet/WaterBucketDispenserBehavior.java create mode 100644 src/main/java/re/jag/parquet/dispenser/BucketDispenserBehavior.java create mode 100644 src/main/java/re/jag/parquet/dispenser/DyeItemDispenserBehavior.java create mode 100644 src/main/java/re/jag/parquet/dispenser/GlassBottleDispenserBehavior.java create mode 100644 src/main/java/re/jag/parquet/dispenser/MusicDiscDispenserBehavior.java create mode 100644 src/main/java/re/jag/parquet/dispenser/PotionDispenserBehavior.java create mode 100644 src/main/java/re/jag/parquet/dispenser/ShulkerPlacementDispenserBehavior.java create mode 100644 src/main/java/re/jag/parquet/dispenser/WaterBucketDispenserBehavior.java (limited to 'src/main/java/re/jag') diff --git a/src/main/java/re/jag/parquet/BucketDispenserBehavior.java b/src/main/java/re/jag/parquet/BucketDispenserBehavior.java deleted file mode 100644 index e4bd88d..0000000 --- a/src/main/java/re/jag/parquet/BucketDispenserBehavior.java +++ /dev/null @@ -1,55 +0,0 @@ -package re.jag.parquet; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CauldronBlock; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.FluidDrainable; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - -public class BucketDispenserBehavior extends FallibleItemDispenserBehavior { - public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - //this.success = false; - World world = pointer.getWorld(); - Item item; - BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); - BlockState state = world.getBlockState(block_pos); - Block block = state.getBlock(); - if (block instanceof FluidDrainable) { - Fluid fluid = ((FluidDrainable)block).tryDrainFluid(world, block_pos, state); - - if (!(fluid instanceof net.minecraft.fluid.FlowableFluid/*BaseFluid*/)) { - return super.dispenseSilently(pointer, stack); - } - - item = fluid.getBucketItem(); - } else if (block instanceof CauldronBlock) { - if(state.get(CauldronBlock.LEVEL) >= 3) { - ((CauldronBlock)block).setLevel(world, block_pos, state, 0); - //this.success = true; - this.setSuccess(true); - item = Items.WATER_BUCKET; - } else { - return stack; - } - } else { - return super.dispenseSilently(pointer, stack); - } - - stack.decrement(1); - if (stack.isEmpty()) - return new ItemStack(item); - if (((DispenserBlockEntity)pointer.getBlockEntity()).addToFirstFreeSlot(new ItemStack(item)) < 0) - this.dispense(pointer, new ItemStack(item)); - return stack; - } -} diff --git a/src/main/java/re/jag/parquet/DyeItemDispenserBehavior.java b/src/main/java/re/jag/parquet/DyeItemDispenserBehavior.java deleted file mode 100644 index 8075914..0000000 --- a/src/main/java/re/jag/parquet/DyeItemDispenserBehavior.java +++ /dev/null @@ -1,64 +0,0 @@ -package re.jag.parquet; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.ShulkerBoxBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.item.AutomaticItemPlacementContext; -import net.minecraft.item.BlockItem; -import net.minecraft.item.DyeItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.ActionResult; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - -public class DyeItemDispenserBehavior extends FallibleItemDispenserBehavior{ - public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - //this.success = false; - World world = pointer.getWorld(); - BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); - BlockState state = world.getBlockState(block_pos); - Block block = state.getBlock(); - Item item = stack.getItem(); - - if (block instanceof ShulkerBoxBlock && item instanceof DyeItem && world instanceof ServerWorld) { - if ( ((ShulkerBoxBlock)block).getColor() != null ) - return stack; - - BlockEntity block_entity = world.getBlockEntity(block_pos); - List dropped_stacks = ShulkerBoxBlock.getDroppedStacks(state, (ServerWorld)world, block_pos, block_entity); - - if (dropped_stacks.size() == 1) { - ItemStack dropped_stack = dropped_stacks.get(0); - ItemStack new_stack = new ItemStack(ShulkerBoxBlock.get(((DyeItem)item).getColor())); - - if (dropped_stack.hasTag()) { - new_stack.setTag(dropped_stack.getTag().copy()); - } - - world.setBlockState(block_pos, Blocks.AIR.getDefaultState()); - - Direction direction = (Direction)pointer.getBlockState().get(DispenserBlock.FACING); - Direction direction2 = pointer.getWorld().isAir(block_pos.down()) ? direction : Direction.UP; - //this.success = (((BlockItem)new_stack.getItem()).place(new AutomaticItemPlacementContext(pointer.getWorld(), block_pos, direction, new_stack, direction2)) == ActionResult.SUCCESS); - this.setSuccess((((BlockItem)new_stack.getItem()).place(new AutomaticItemPlacementContext(pointer.getWorld(), block_pos, direction, new_stack, direction2)) == ActionResult.SUCCESS)); - stack.decrement(1); - } - return stack; - } - - //this.success = true; - this.setSuccess(true); - return super.dispenseSilently(pointer, stack); - } - -} diff --git a/src/main/java/re/jag/parquet/GlassBottleDispenserBehavior.java b/src/main/java/re/jag/parquet/GlassBottleDispenserBehavior.java deleted file mode 100644 index 30f31cf..0000000 --- a/src/main/java/re/jag/parquet/GlassBottleDispenserBehavior.java +++ /dev/null @@ -1,68 +0,0 @@ -package re.jag.parquet; - -import net.minecraft.block.BeehiveBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CauldronBlock; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.block.entity.BeehiveBlockEntity; -import net.minecraft.block.entity.DispenserBlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.potion.PotionUtil; -import net.minecraft.potion.Potions; -import net.minecraft.tag.BlockTags; -import net.minecraft.tag.FluidTags; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - -public class GlassBottleDispenserBehavior extends FallibleItemDispenserBehavior { - - //TODO Port over to bucket? - private ItemStack insert_first_free_or_drop(BlockPointer blockPointer, ItemStack emptyBottleStack, ItemStack filledBottleStack) { - emptyBottleStack.decrement(1); - if (emptyBottleStack.isEmpty()) { - return filledBottleStack.copy(); - } - if (((DispenserBlockEntity)blockPointer.getBlockEntity()).addToFirstFreeSlot(filledBottleStack.copy()) < 0) { - this.dispense(blockPointer, filledBottleStack.copy()); - } - return emptyBottleStack; - } - - public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - //this.success = false; - World world = pointer.getWorld(); - BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); - BlockState state = world.getBlockState(block_pos); - Block block = state.getBlock(); - //if (block.matches(BlockTags.BEEHIVES) && ... - if (state.method_27851(BlockTags.BEEHIVES, (abstractBlockState) -> { return abstractBlockState.contains(BeehiveBlock.HONEY_LEVEL); }) - && ((Integer)state.get(BeehiveBlock.HONEY_LEVEL)).intValue() >= 5) { - ((BeehiveBlock)state.getBlock()).takeHoney(world, state, block_pos, null, BeehiveBlockEntity.BeeState.BEE_RELEASED); - //this.success = true; - this.setSuccess(true); - return insert_first_free_or_drop(pointer, stack, new ItemStack(Items.HONEY_BOTTLE)); - } - if (block instanceof CauldronBlock) { - int fill_level = state.get(CauldronBlock.LEVEL); - if(fill_level > 0) { - ((CauldronBlock)block).setLevel(world, block_pos, state, fill_level - 1); - //this.success = true; - this.setSuccess(true); - return insert_first_free_or_drop(pointer, stack, PotionUtil.setPotion( new ItemStack(Items.POTION), Potions.WATER ) ); - } - return stack; - } - if (world.getFluidState(block_pos).isIn(FluidTags.WATER)) { - //this.success = true; - this.setSuccess(true); - return insert_first_free_or_drop(pointer, stack, PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)); - } - return super.dispenseSilently(pointer, stack); - } -} - diff --git a/src/main/java/re/jag/parquet/MusicDiscDispenserBehavior.java b/src/main/java/re/jag/parquet/MusicDiscDispenserBehavior.java deleted file mode 100644 index 4a64e3a..0000000 --- a/src/main/java/re/jag/parquet/MusicDiscDispenserBehavior.java +++ /dev/null @@ -1,36 +0,0 @@ -package re.jag.parquet; - -import net.minecraft.block.*; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - -public class MusicDiscDispenserBehavior extends FallibleItemDispenserBehavior { - - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - World world = pointer.getWorld(); - Direction direction = (Direction)pointer.getBlockState().get(DispenserBlock.FACING); - BlockPos block_pos = pointer.getBlockPos().offset(direction); - BlockState state = world.getBlockState(block_pos); - - if (state.isOf(Blocks.JUKEBOX)) { - JukeboxBlock block = (JukeboxBlock)state.getBlock(); - ItemStack disc_stack = stack.split(1); - - if (state.get(JukeboxBlock.HAS_RECORD)) // Remove record if present - block.onUse(state, world, block_pos, null, null, null); - - block.setRecord(world, block_pos, state, disc_stack); - world.syncWorldEvent((PlayerEntity)null, 1010, block_pos, Item.getRawId(disc_stack.getItem())); - - return stack; - } - - return super.dispenseSilently(pointer, stack); - } -} diff --git a/src/main/java/re/jag/parquet/Parquet.java b/src/main/java/re/jag/parquet/Parquet.java index 123ac23..617faf7 100644 --- a/src/main/java/re/jag/parquet/Parquet.java +++ b/src/main/java/re/jag/parquet/Parquet.java @@ -1,10 +1,6 @@ package re.jag.parquet; import net.minecraft.item.MusicDiscItem; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.Identifier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -20,7 +16,7 @@ import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.DyeColor; import re.jag.parquet.commands.*; -import net.minecraft.util.registry.Registry; +import re.jag.parquet.dispenser.*; public class Parquet implements ModInitializer { public static final Logger LOG = LogManager.getLogger(); @@ -45,7 +41,7 @@ public class Parquet implements ModInitializer { //refactor CauldronBlock onUse //This is a rather hacky implementation - DispenserBlock.registerBehavior(Blocks.SHULKER_BOX.asItem(), new ShulkerPlacementDispenserBehavior()); + DispenserBlock.registerBehavior(Blocks.SHULKER_BOX.asItem(), new ShulkerPlacementDispenserBehavior()); for (DyeColor dye_color : DyeColor.values()) { DispenserBlock.registerBehavior(ShulkerBoxBlock.get(dye_color).asItem(), new ShulkerPlacementDispenserBehavior()); diff --git a/src/main/java/re/jag/parquet/PotionDispenserBehavior.java b/src/main/java/re/jag/parquet/PotionDispenserBehavior.java deleted file mode 100644 index 90c4c6b..0000000 --- a/src/main/java/re/jag/parquet/PotionDispenserBehavior.java +++ /dev/null @@ -1,40 +0,0 @@ -package re.jag.parquet; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CauldronBlock; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.potion.PotionUtil; -import net.minecraft.potion.Potions; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - -public class PotionDispenserBehavior extends FallibleItemDispenserBehavior { - public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - //this.success = false; - World world = pointer.getWorld(); - BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); - BlockState state = world.getBlockState(block_pos); - Block block = state.getBlock(); - - - if (PotionUtil.getPotion(stack) == Potions.WATER) { - if (block instanceof CauldronBlock) { - int fill_level = state.get(CauldronBlock.LEVEL); - if(fill_level < 3) { - ((CauldronBlock)block).setLevel(world, block_pos, state, fill_level + 1); - //this.success = true; - this.setSuccess(true); - return new ItemStack(Items.GLASS_BOTTLE, 1); - } - return stack; - } - } - return super.dispenseSilently(pointer, stack); - } -} diff --git a/src/main/java/re/jag/parquet/ShulkerPlacementDispenserBehavior.java b/src/main/java/re/jag/parquet/ShulkerPlacementDispenserBehavior.java deleted file mode 100644 index dc048b3..0000000 --- a/src/main/java/re/jag/parquet/ShulkerPlacementDispenserBehavior.java +++ /dev/null @@ -1,52 +0,0 @@ -package re.jag.parquet; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.CauldronBlock; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.ShulkerBoxBlock; -import net.minecraft.block.dispenser.BlockPlacementDispenserBehavior; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; - -public class ShulkerPlacementDispenserBehavior extends BlockPlacementDispenserBehavior{ - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - //this.success = false; - - Item item = stack.getItem(); - - if (item instanceof BlockItem) { - Direction direction = (Direction)pointer.getBlockState().get(DispenserBlock.FACING); - BlockPos block_pos = pointer.getBlockPos().offset(direction); - Block block = ((BlockItem)item).getBlock(); - - if (block instanceof ShulkerBoxBlock && !pointer.getWorld().isClient()) { - BlockState state = pointer.getWorld().getBlockState(block_pos); - if (state.getBlock() instanceof CauldronBlock) { - int fill_level = state.get(CauldronBlock.LEVEL); - if (fill_level > 0) { - ItemStack itemStack5 = new ItemStack(Blocks.SHULKER_BOX, 1); - if (stack.hasTag()) { - itemStack5.setTag(stack.getTag().copy()); - } - ((CauldronBlock)state.getBlock()).setLevel(pointer.getWorld(), block_pos, state, fill_level - 1); - - //this.success = true; - this.setSuccess(true); - return itemStack5; - } - - //fail if cauldron empty - return stack; - } - } - } - - return super.dispenseSilently(pointer, stack); - } -} diff --git a/src/main/java/re/jag/parquet/WaterBucketDispenserBehavior.java b/src/main/java/re/jag/parquet/WaterBucketDispenserBehavior.java deleted file mode 100644 index 336ffda..0000000 --- a/src/main/java/re/jag/parquet/WaterBucketDispenserBehavior.java +++ /dev/null @@ -1,48 +0,0 @@ -package re.jag.parquet; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CauldronBlock; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; -import net.minecraft.item.BucketItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - -public class WaterBucketDispenserBehavior extends FallibleItemDispenserBehavior{ - - public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - //this.success = false; - - BucketItem bucket_item = (BucketItem)stack.getItem(); - BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); - World world = pointer.getWorld(); - if (bucket_item.placeFluid(null, world, block_pos, null)) { - bucket_item.onEmptied(world, stack, block_pos); - //this.success = true; - this.setSuccess(true); - return new ItemStack(Items.BUCKET); - } - - BlockState state = pointer.getWorld().getBlockState(block_pos); - Block facing_block = state.getBlock(); - - if ( facing_block instanceof CauldronBlock) { - if (state.get(CauldronBlock.LEVEL) >= 3) { - return stack; - } - ((CauldronBlock)facing_block).setLevel(world, block_pos, state, 3); - - //this.success = true; - this.setSuccess(true); - return new ItemStack(Items.BUCKET, 1); - } - - this.setSuccess(true); - return this.dispense(pointer, stack); - } -} diff --git a/src/main/java/re/jag/parquet/dispenser/BucketDispenserBehavior.java b/src/main/java/re/jag/parquet/dispenser/BucketDispenserBehavior.java new file mode 100644 index 0000000..ad7a6ca --- /dev/null +++ b/src/main/java/re/jag/parquet/dispenser/BucketDispenserBehavior.java @@ -0,0 +1,55 @@ +package re.jag.parquet.dispenser; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CauldronBlock; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.FluidDrainable; +import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; +import net.minecraft.block.entity.DispenserBlockEntity; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class BucketDispenserBehavior extends FallibleItemDispenserBehavior { + public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + //this.success = false; + World world = pointer.getWorld(); + Item item; + BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); + BlockState state = world.getBlockState(block_pos); + Block block = state.getBlock(); + if (block instanceof FluidDrainable) { + Fluid fluid = ((FluidDrainable)block).tryDrainFluid(world, block_pos, state); + + if (!(fluid instanceof net.minecraft.fluid.FlowableFluid/*BaseFluid*/)) { + return super.dispenseSilently(pointer, stack); + } + + item = fluid.getBucketItem(); + } else if (block instanceof CauldronBlock) { + if(state.get(CauldronBlock.LEVEL) >= 3) { + ((CauldronBlock)block).setLevel(world, block_pos, state, 0); + //this.success = true; + this.setSuccess(true); + item = Items.WATER_BUCKET; + } else { + return stack; + } + } else { + return super.dispenseSilently(pointer, stack); + } + + stack.decrement(1); + if (stack.isEmpty()) + return new ItemStack(item); + if (((DispenserBlockEntity)pointer.getBlockEntity()).addToFirstFreeSlot(new ItemStack(item)) < 0) + this.dispense(pointer, new ItemStack(item)); + return stack; + } +} diff --git a/src/main/java/re/jag/parquet/dispenser/DyeItemDispenserBehavior.java b/src/main/java/re/jag/parquet/dispenser/DyeItemDispenserBehavior.java new file mode 100644 index 0000000..a62a1c9 --- /dev/null +++ b/src/main/java/re/jag/parquet/dispenser/DyeItemDispenserBehavior.java @@ -0,0 +1,64 @@ +package re.jag.parquet.dispenser; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.ShulkerBoxBlock; +import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.item.AutomaticItemPlacementContext; +import net.minecraft.item.BlockItem; +import net.minecraft.item.DyeItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.ActionResult; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class DyeItemDispenserBehavior extends FallibleItemDispenserBehavior{ + public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + //this.success = false; + World world = pointer.getWorld(); + BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); + BlockState state = world.getBlockState(block_pos); + Block block = state.getBlock(); + Item item = stack.getItem(); + + if (block instanceof ShulkerBoxBlock && item instanceof DyeItem && world instanceof ServerWorld) { + if ( ((ShulkerBoxBlock)block).getColor() != null ) + return stack; + + BlockEntity block_entity = world.getBlockEntity(block_pos); + List dropped_stacks = ShulkerBoxBlock.getDroppedStacks(state, (ServerWorld)world, block_pos, block_entity); + + if (dropped_stacks.size() == 1) { + ItemStack dropped_stack = dropped_stacks.get(0); + ItemStack new_stack = new ItemStack(ShulkerBoxBlock.get(((DyeItem)item).getColor())); + + if (dropped_stack.hasTag()) { + new_stack.setTag(dropped_stack.getTag().copy()); + } + + world.setBlockState(block_pos, Blocks.AIR.getDefaultState()); + + Direction direction = (Direction)pointer.getBlockState().get(DispenserBlock.FACING); + Direction direction2 = pointer.getWorld().isAir(block_pos.down()) ? direction : Direction.UP; + //this.success = (((BlockItem)new_stack.getItem()).place(new AutomaticItemPlacementContext(pointer.getWorld(), block_pos, direction, new_stack, direction2)) == ActionResult.SUCCESS); + this.setSuccess((((BlockItem)new_stack.getItem()).place(new AutomaticItemPlacementContext(pointer.getWorld(), block_pos, direction, new_stack, direction2)) == ActionResult.SUCCESS)); + stack.decrement(1); + } + return stack; + } + + //this.success = true; + this.setSuccess(true); + return super.dispenseSilently(pointer, stack); + } + +} diff --git a/src/main/java/re/jag/parquet/dispenser/GlassBottleDispenserBehavior.java b/src/main/java/re/jag/parquet/dispenser/GlassBottleDispenserBehavior.java new file mode 100644 index 0000000..a0c5844 --- /dev/null +++ b/src/main/java/re/jag/parquet/dispenser/GlassBottleDispenserBehavior.java @@ -0,0 +1,68 @@ +package re.jag.parquet.dispenser; + +import net.minecraft.block.BeehiveBlock; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CauldronBlock; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; +import net.minecraft.block.entity.BeehiveBlockEntity; +import net.minecraft.block.entity.DispenserBlockEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.potion.PotionUtil; +import net.minecraft.potion.Potions; +import net.minecraft.tag.BlockTags; +import net.minecraft.tag.FluidTags; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class GlassBottleDispenserBehavior extends FallibleItemDispenserBehavior { + + //TODO Port over to bucket? + private ItemStack insert_first_free_or_drop(BlockPointer blockPointer, ItemStack emptyBottleStack, ItemStack filledBottleStack) { + emptyBottleStack.decrement(1); + if (emptyBottleStack.isEmpty()) { + return filledBottleStack.copy(); + } + if (((DispenserBlockEntity)blockPointer.getBlockEntity()).addToFirstFreeSlot(filledBottleStack.copy()) < 0) { + this.dispense(blockPointer, filledBottleStack.copy()); + } + return emptyBottleStack; + } + + public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + //this.success = false; + World world = pointer.getWorld(); + BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); + BlockState state = world.getBlockState(block_pos); + Block block = state.getBlock(); + //if (block.matches(BlockTags.BEEHIVES) && ... + if (state.method_27851(BlockTags.BEEHIVES, (abstractBlockState) -> { return abstractBlockState.contains(BeehiveBlock.HONEY_LEVEL); }) + && ((Integer)state.get(BeehiveBlock.HONEY_LEVEL)).intValue() >= 5) { + ((BeehiveBlock)state.getBlock()).takeHoney(world, state, block_pos, null, BeehiveBlockEntity.BeeState.BEE_RELEASED); + //this.success = true; + this.setSuccess(true); + return insert_first_free_or_drop(pointer, stack, new ItemStack(Items.HONEY_BOTTLE)); + } + if (block instanceof CauldronBlock) { + int fill_level = state.get(CauldronBlock.LEVEL); + if(fill_level > 0) { + ((CauldronBlock)block).setLevel(world, block_pos, state, fill_level - 1); + //this.success = true; + this.setSuccess(true); + return insert_first_free_or_drop(pointer, stack, PotionUtil.setPotion( new ItemStack(Items.POTION), Potions.WATER ) ); + } + return stack; + } + if (world.getFluidState(block_pos).isIn(FluidTags.WATER)) { + //this.success = true; + this.setSuccess(true); + return insert_first_free_or_drop(pointer, stack, PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER)); + } + return super.dispenseSilently(pointer, stack); + } +} + diff --git a/src/main/java/re/jag/parquet/dispenser/MusicDiscDispenserBehavior.java b/src/main/java/re/jag/parquet/dispenser/MusicDiscDispenserBehavior.java new file mode 100644 index 0000000..9d9f109 --- /dev/null +++ b/src/main/java/re/jag/parquet/dispenser/MusicDiscDispenserBehavior.java @@ -0,0 +1,36 @@ +package re.jag.parquet.dispenser; + +import net.minecraft.block.*; +import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class MusicDiscDispenserBehavior extends FallibleItemDispenserBehavior { + + protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + World world = pointer.getWorld(); + Direction direction = (Direction)pointer.getBlockState().get(DispenserBlock.FACING); + BlockPos block_pos = pointer.getBlockPos().offset(direction); + BlockState state = world.getBlockState(block_pos); + + if (state.isOf(Blocks.JUKEBOX)) { + JukeboxBlock block = (JukeboxBlock)state.getBlock(); + ItemStack disc_stack = stack.split(1); + + if (state.get(JukeboxBlock.HAS_RECORD)) // Remove record if present + block.onUse(state, world, block_pos, null, null, null); + + block.setRecord(world, block_pos, state, disc_stack); + world.syncWorldEvent((PlayerEntity)null, 1010, block_pos, Item.getRawId(disc_stack.getItem())); + + return stack; + } + + return super.dispenseSilently(pointer, stack); + } +} diff --git a/src/main/java/re/jag/parquet/dispenser/PotionDispenserBehavior.java b/src/main/java/re/jag/parquet/dispenser/PotionDispenserBehavior.java new file mode 100644 index 0000000..a31ab3e --- /dev/null +++ b/src/main/java/re/jag/parquet/dispenser/PotionDispenserBehavior.java @@ -0,0 +1,40 @@ +package re.jag.parquet.dispenser; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CauldronBlock; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.potion.PotionUtil; +import net.minecraft.potion.Potions; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class PotionDispenserBehavior extends FallibleItemDispenserBehavior { + public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + //this.success = false; + World world = pointer.getWorld(); + BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); + BlockState state = world.getBlockState(block_pos); + Block block = state.getBlock(); + + + if (PotionUtil.getPotion(stack) == Potions.WATER) { + if (block instanceof CauldronBlock) { + int fill_level = state.get(CauldronBlock.LEVEL); + if(fill_level < 3) { + ((CauldronBlock)block).setLevel(world, block_pos, state, fill_level + 1); + //this.success = true; + this.setSuccess(true); + return new ItemStack(Items.GLASS_BOTTLE, 1); + } + return stack; + } + } + return super.dispenseSilently(pointer, stack); + } +} diff --git a/src/main/java/re/jag/parquet/dispenser/ShulkerPlacementDispenserBehavior.java b/src/main/java/re/jag/parquet/dispenser/ShulkerPlacementDispenserBehavior.java new file mode 100644 index 0000000..42c5f10 --- /dev/null +++ b/src/main/java/re/jag/parquet/dispenser/ShulkerPlacementDispenserBehavior.java @@ -0,0 +1,52 @@ +package re.jag.parquet.dispenser; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.CauldronBlock; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.ShulkerBoxBlock; +import net.minecraft.block.dispenser.BlockPlacementDispenserBehavior; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; + +public class ShulkerPlacementDispenserBehavior extends BlockPlacementDispenserBehavior{ + protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + //this.success = false; + + Item item = stack.getItem(); + + if (item instanceof BlockItem) { + Direction direction = (Direction)pointer.getBlockState().get(DispenserBlock.FACING); + BlockPos block_pos = pointer.getBlockPos().offset(direction); + Block block = ((BlockItem)item).getBlock(); + + if (block instanceof ShulkerBoxBlock && !pointer.getWorld().isClient()) { + BlockState state = pointer.getWorld().getBlockState(block_pos); + if (state.getBlock() instanceof CauldronBlock) { + int fill_level = state.get(CauldronBlock.LEVEL); + if (fill_level > 0) { + ItemStack itemStack5 = new ItemStack(Blocks.SHULKER_BOX, 1); + if (stack.hasTag()) { + itemStack5.setTag(stack.getTag().copy()); + } + ((CauldronBlock)state.getBlock()).setLevel(pointer.getWorld(), block_pos, state, fill_level - 1); + + //this.success = true; + this.setSuccess(true); + return itemStack5; + } + + //fail if cauldron empty + return stack; + } + } + } + + return super.dispenseSilently(pointer, stack); + } +} diff --git a/src/main/java/re/jag/parquet/dispenser/WaterBucketDispenserBehavior.java b/src/main/java/re/jag/parquet/dispenser/WaterBucketDispenserBehavior.java new file mode 100644 index 0000000..d11e1e5 --- /dev/null +++ b/src/main/java/re/jag/parquet/dispenser/WaterBucketDispenserBehavior.java @@ -0,0 +1,48 @@ +package re.jag.parquet.dispenser; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.CauldronBlock; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.dispenser.FallibleItemDispenserBehavior; +import net.minecraft.item.BucketItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; + +public class WaterBucketDispenserBehavior extends FallibleItemDispenserBehavior{ + + public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + //this.success = false; + + BucketItem bucket_item = (BucketItem)stack.getItem(); + BlockPos block_pos = pointer.getBlockPos().offset((Direction)pointer.getBlockState().get(DispenserBlock.FACING)); + World world = pointer.getWorld(); + if (bucket_item.placeFluid(null, world, block_pos, null)) { + bucket_item.onEmptied(world, stack, block_pos); + //this.success = true; + this.setSuccess(true); + return new ItemStack(Items.BUCKET); + } + + BlockState state = pointer.getWorld().getBlockState(block_pos); + Block facing_block = state.getBlock(); + + if ( facing_block instanceof CauldronBlock) { + if (state.get(CauldronBlock.LEVEL) >= 3) { + return stack; + } + ((CauldronBlock)facing_block).setLevel(world, block_pos, state, 3); + + //this.success = true; + this.setSuccess(true); + return new ItemStack(Items.BUCKET, 1); + } + + this.setSuccess(true); + return this.dispense(pointer, stack); + } +} -- cgit v1.2.3