|
1 | 1 | --- a/net/minecraft/core/dispenser/DefaultDispenseItemBehavior.java
|
2 | 2 | +++ b/net/minecraft/core/dispenser/DefaultDispenseItemBehavior.java
|
3 |
| -@@ -10,23 +_,46 @@ |
| 3 | +@@ -9,24 +_,37 @@ |
| 4 | + |
4 | 5 | public class DefaultDispenseItemBehavior implements DispenseItemBehavior {
|
5 | 6 | private static final int DEFAULT_ACCURACY = 6;
|
6 |
| - |
7 |
| -+ // CraftBukkit start |
8 | 7 | + private Direction direction; // Paper - cache facing direction
|
9 |
| -+ private boolean dropper; |
10 |
| -+ |
11 |
| -+ public DefaultDispenseItemBehavior(boolean dropper) { |
12 |
| -+ this.dropper = dropper; |
13 |
| -+ } |
14 |
| -+ |
15 |
| -+ public DefaultDispenseItemBehavior() {} |
16 |
| -+ // CraftBukkit end |
17 |
| -+ |
| 8 | + |
18 | 9 | @Override
|
19 | 10 | public final ItemStack dispense(BlockSource blockSource, ItemStack item) {
|
20 | 11 | + this.direction = blockSource.state().getValue(DispenserBlock.FACING); // Paper - cache facing direction
|
|
32 | 23 | ItemStack itemStack = item.split(1);
|
33 | 24 | - spawnItem(blockSource.level(), itemStack, 6, direction, dispensePosition);
|
34 | 25 | + // CraftBukkit start
|
35 |
| -+ if (!DefaultDispenseItemBehavior.spawnItem(blockSource.level(), itemStack, 6, this.direction, dispensePosition, blockSource, this.dropper)) { |
| 26 | ++ if (!DefaultDispenseItemBehavior.spawnItem(blockSource.level(), itemStack, 6, this.direction, dispensePosition, blockSource)) { |
36 | 27 | + item.grow(1);
|
37 | 28 | + }
|
38 | 29 | + // CraftBukkit end
|
|
50 | 41 | double d = position.x();
|
51 | 42 | double d1 = position.y();
|
52 | 43 | double d2 = position.z();
|
53 |
| -@@ -43,7 +_,45 @@ |
| 44 | +@@ -43,7 +_,43 @@ |
54 | 45 | level.random.triangle(0.2, 0.0172275 * speed),
|
55 | 46 | level.random.triangle(facing.getStepZ() * d3, 0.0172275 * speed)
|
56 | 47 | );
|
57 | 48 | + return itemEntity; // CraftBukkit
|
58 | 49 | + }
|
59 | 50 | +
|
60 |
| -+ // CraftBukkit - void -> boolean return, IPosition -> ISourceBlock last argument, dropper |
61 |
| -+ public static boolean spawnItem(Level level, ItemStack stack, int speed, Direction facing, Position dispensePosition, BlockSource blockSource, boolean dropper) { |
| 51 | ++ // CraftBukkit start - void -> boolean return |
| 52 | ++ public static boolean spawnItem(Level level, ItemStack stack, int speed, Direction facing, Position position, BlockSource blockSource) { |
62 | 53 | + if (stack.isEmpty()) return true;
|
63 |
| -+ ItemEntity itemEntity = DefaultDispenseItemBehavior.prepareItem(level, stack, speed, facing, dispensePosition); |
| 54 | ++ ItemEntity itemEntity = DefaultDispenseItemBehavior.prepareItem(level, stack, speed, facing, position); |
64 | 55 | +
|
65 | 56 | + org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, blockSource.pos());
|
66 | 57 | + org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack);
|
67 | 58 | +
|
68 | 59 | + org.bukkit.event.block.BlockDispenseEvent event = new org.bukkit.event.block.BlockDispenseEvent(block, craftItem.clone(), org.bukkit.craftbukkit.util.CraftVector.toBukkit(itemEntity.getDeltaMovement()));
|
69 |
| -+ if (!DispenserBlock.eventFired) { |
70 |
| -+ level.getCraftServer().getPluginManager().callEvent(event); |
71 |
| -+ } |
| 60 | ++ level.getCraftServer().getPluginManager().callEvent(event); |
72 | 61 | +
|
73 | 62 | + if (event.isCancelled()) {
|
74 | 63 | + return false;
|
|
77 | 66 | + itemEntity.setItem(org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getItem()));
|
78 | 67 | + itemEntity.setDeltaMovement(org.bukkit.craftbukkit.util.CraftVector.toVec3(event.getVelocity()));
|
79 | 68 | +
|
80 |
| -+ if (!dropper && !event.getItem().getType().equals(craftItem.getType())) { |
| 69 | ++ if (blockSource.state().is(net.minecraft.world.level.block.Blocks.DISPENSER) && !event.getItem().getType().equals(craftItem.getType())) { |
81 | 70 | + // Chain to handler for new item
|
82 | 71 | + ItemStack eventStack = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getItem());
|
83 |
| -+ DispenseItemBehavior dispenseBehavior = DispenserBlock.getDispenseBehavior(blockSource, eventStack); // Paper - Fix NPE with equippable and items without behavior |
| 72 | ++ DispenseItemBehavior dispenseBehavior = DispenserBlock.getDispenseBehavior(blockSource, eventStack); |
84 | 73 | + if (dispenseBehavior != DispenseItemBehavior.NOOP && dispenseBehavior.getClass() != DefaultDispenseItemBehavior.class) {
|
85 | 74 | + dispenseBehavior.dispense(blockSource, eventStack);
|
86 | 75 | + } else {
|
|
0 commit comments