From cabf4162ca95969ed91540fb18810813fbbca15b Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Wed, 25 Mar 2020 17:03:44 -0400 Subject: [PATCH] Improve Dispenser Behavior --- .../slightlyvanilla/SlightlyVanilla.java | 50 ++----------------- .../dispenser/SlimeballDispenserBehavior.java | 35 +++++++++++++ .../dispenser/SpawnEggDispenserBehavior.java | 48 ++++++++++++++++++ 3 files changed, 87 insertions(+), 46 deletions(-) create mode 100644 src/main/java/com/thebrokenrail/slightlyvanilla/dispenser/SlimeballDispenserBehavior.java create mode 100644 src/main/java/com/thebrokenrail/slightlyvanilla/dispenser/SpawnEggDispenserBehavior.java diff --git a/src/main/java/com/thebrokenrail/slightlyvanilla/SlightlyVanilla.java b/src/main/java/com/thebrokenrail/slightlyvanilla/SlightlyVanilla.java index 4f978b0..aa740d3 100644 --- a/src/main/java/com/thebrokenrail/slightlyvanilla/SlightlyVanilla.java +++ b/src/main/java/com/thebrokenrail/slightlyvanilla/SlightlyVanilla.java @@ -1,5 +1,7 @@ package com.thebrokenrail.slightlyvanilla; +import com.thebrokenrail.slightlyvanilla.dispenser.SlimeballDispenserBehavior; +import com.thebrokenrail.slightlyvanilla.dispenser.SpawnEggDispenserBehavior; import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity; import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity; import me.sargunvohra.mcmods.autoconfig1u.AutoConfig; @@ -9,26 +11,17 @@ import net.fabricmc.fabric.api.entity.FabricEntityTypeBuilder; import net.fabricmc.fabric.api.tag.TagRegistry; import net.minecraft.block.Block; import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.ItemDispenserBehavior; -import net.minecraft.block.dispenser.ProjectileDispenserBehavior; import net.minecraft.entity.EntityCategory; import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnType; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.ProjectileEntity; -import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.SpawnEggItem; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.tag.Tag; import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Position; import net.minecraft.util.registry.Registry; -import net.minecraft.world.World; import java.util.Random; @@ -54,45 +47,10 @@ public class SlightlyVanilla implements ModInitializer { Registry.register(Registry.ENTITY_TYPE, new Identifier(NAMESPACE, "slimeball"), SLIMEBALL_ENTITY); Registry.register(Registry.ENTITY_TYPE, new Identifier(NAMESPACE, "spawn_egg"), SPAWN_EGG_ENTITY); - DispenserBlock.registerBehavior(Items.SLIME_BALL, (pointer, stack) -> { - if (getConfig().throwableSlimeballs.dispenser) { - return new ProjectileDispenserBehavior() { - @Override - protected ProjectileEntity createProjectile(World position, Position stack, ItemStack itemStack) { - SlimeballEntity entity = new SlimeballEntity(position, stack.getX(), stack.getY(), stack.getZ()); - entity.setItem(itemStack); - return entity; - } - }.dispense(pointer, stack); - } else { - return new ItemDispenserBehavior().dispense(pointer, stack); - } - }); + DispenserBlock.registerBehavior(Items.SLIME_BALL, new SlimeballDispenserBehavior()); for (SpawnEggItem spawnEgg : SpawnEggItem.getAll()) { - DispenserBlock.registerBehavior(spawnEgg, (pointer, stack) -> { - if (getConfig().throwableSpawnEggs.dispenser) { - return new ProjectileDispenserBehavior() { - @Override - protected ProjectileEntity createProjectile(World position, Position stack, ItemStack itemStack) { - SpawnEggEntity entity = new SpawnEggEntity(position, stack.getX(), stack.getY(), stack.getZ()); - entity.setItem(itemStack); - return entity; - } - }.dispense(pointer, stack); - } else { - return new ItemDispenserBehavior() { - @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); - EntityType entityType = ((SpawnEggItem)stack.getItem()).getEntityType(stack.getTag()); - entityType.spawnFromItemStack(pointer.getWorld(), stack, null, pointer.getBlockPos().offset(direction), SpawnType.DISPENSER, direction != Direction.UP, false); - stack.decrement(1); - return stack; - } - }.dispense(pointer, stack); - } - }); + DispenserBlock.registerBehavior(spawnEgg, new SpawnEggDispenserBehavior()); } } diff --git a/src/main/java/com/thebrokenrail/slightlyvanilla/dispenser/SlimeballDispenserBehavior.java b/src/main/java/com/thebrokenrail/slightlyvanilla/dispenser/SlimeballDispenserBehavior.java new file mode 100644 index 0000000..74734a9 --- /dev/null +++ b/src/main/java/com/thebrokenrail/slightlyvanilla/dispenser/SlimeballDispenserBehavior.java @@ -0,0 +1,35 @@ +package com.thebrokenrail.slightlyvanilla.dispenser; + +import com.thebrokenrail.slightlyvanilla.SlightlyVanilla; +import com.thebrokenrail.slightlyvanilla.entity.SlimeballEntity; +import net.minecraft.block.dispenser.DispenserBehavior; +import net.minecraft.block.dispenser.ItemDispenserBehavior; +import net.minecraft.block.dispenser.ProjectileDispenserBehavior; +import net.minecraft.entity.projectile.ProjectileEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.Position; +import net.minecraft.world.World; + +public class SlimeballDispenserBehavior implements DispenserBehavior { + private static class Default extends ItemDispenserBehavior { + } + + private static class Modified extends ProjectileDispenserBehavior { + @Override + protected ProjectileEntity createProjectile(World position, Position stack, ItemStack itemStack) { + SlimeballEntity entity = new SlimeballEntity(position, stack.getX(), stack.getY(), stack.getZ()); + entity.setItem(itemStack); + return entity; + } + } + + @Override + public ItemStack dispense(BlockPointer pointer, ItemStack stack) { + if (SlightlyVanilla.getConfig().throwableSlimeballs.dispenser) { + return new Modified().dispense(pointer, stack); + } else { + return new Default().dispense(pointer, stack); + } + } +} diff --git a/src/main/java/com/thebrokenrail/slightlyvanilla/dispenser/SpawnEggDispenserBehavior.java b/src/main/java/com/thebrokenrail/slightlyvanilla/dispenser/SpawnEggDispenserBehavior.java new file mode 100644 index 0000000..5e9aa34 --- /dev/null +++ b/src/main/java/com/thebrokenrail/slightlyvanilla/dispenser/SpawnEggDispenserBehavior.java @@ -0,0 +1,48 @@ +package com.thebrokenrail.slightlyvanilla.dispenser; + +import com.thebrokenrail.slightlyvanilla.SlightlyVanilla; +import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity; +import net.minecraft.block.DispenserBlock; +import net.minecraft.block.dispenser.DispenserBehavior; +import net.minecraft.block.dispenser.ItemDispenserBehavior; +import net.minecraft.block.dispenser.ProjectileDispenserBehavior; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.SpawnType; +import net.minecraft.entity.projectile.ProjectileEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.util.math.BlockPointer; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Position; +import net.minecraft.world.World; + +public class SpawnEggDispenserBehavior implements DispenserBehavior { + private static class Default extends ItemDispenserBehavior { + @Override + protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { + Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); + EntityType entityType = ((SpawnEggItem)stack.getItem()).getEntityType(stack.getTag()); + entityType.spawnFromItemStack(pointer.getWorld(), stack, null, pointer.getBlockPos().offset(direction), SpawnType.DISPENSER, direction != Direction.UP, false); + stack.decrement(1); + return stack; + } + } + + private static class Modified extends ProjectileDispenserBehavior { + @Override + protected ProjectileEntity createProjectile(World position, Position stack, ItemStack itemStack) { + SpawnEggEntity entity = new SpawnEggEntity(position, stack.getX(), stack.getY(), stack.getZ()); + entity.setItem(itemStack); + return entity; + } + } + + @Override + public ItemStack dispense(BlockPointer pointer, ItemStack stack) { + if (SlightlyVanilla.getConfig().throwableSpawnEggs.dispenser) { + return new Modified().dispense(pointer, stack); + } else { + return new Default().dispense(pointer, stack); + } + } +}