mirror of https://github.com/PaperMC/Paper.git
59 lines
3.1 KiB
Diff
59 lines
3.1 KiB
Diff
--- 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;
|
|
}
|
|
|