--- a/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java +++ b/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java @@ -7,6 +6,13 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.DispenserBlock; +// CraftBukkit start +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.projectile.Projectile; +import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.BlockDispenseEvent; +// CraftBukkit end public abstract class AbstractProjectileDispenseBehavior extends DefaultDispenseItemBehavior { @@ -20,9 +25,38 @@ Direction direction = (Direction) blocksource.state().getValue(DispenserBlock.FACING); Projectile projectile = this.getProjectile(serverlevel, position, itemstack); - projectile.shoot((double) direction.getStepX(), (double) ((float) direction.getStepY() + 0.1F), (double) direction.getStepZ(), this.getPower(), this.getUncertainty()); - serverlevel.addFreshEntity(projectile); - itemstack.shrink(1); + // CraftBukkit start + // iprojectile.shoot((double) enumdirection.getStepX(), (double) ((float) enumdirection.getStepY() + 0.1F), (double) enumdirection.getStepZ(), this.getPower(), this.getUncertainty()); + ItemStack itemstack1 = itemstack.split(1); + org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) enumdirection.getStepX(), (double) ((float) enumdirection.getStepY() + 0.1F), (double) enumdirection.getStepZ())); + if (!DispenserBlock.eventFired) { + worldserver.getCraftServer().getPluginManager().callEvent(event); + } + + if (event.isCancelled()) { + itemstack.grow(1); + return itemstack; + } + + if (!event.getItem().equals(craftItem)) { + itemstack.grow(1); + // Chain to handler for new item + ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); + DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem()); + if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != this) { + idispensebehavior.dispense(sourceblock, eventStack); + return itemstack; + } + } + + iprojectile.shoot(event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.getPower(), this.getUncertainty()); + ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource(sourceblock.blockEntity()); + // CraftBukkit end + worldserver.addFreshEntity(iprojectile); + // itemstack.shrink(1); // CraftBukkit - Handled during event processing return itemstack; }