|
|
|
@@ -6,9 +6,9 @@
|
|
|
|
|
|
|
|
|
|
+ // CraftBukkit start
|
|
|
|
|
+ ServerLevel serverLevel = blockSource.level();
|
|
|
|
|
+ ItemStack itemstack1 = item.copyWithCount(1); // Paper - shrink below and single item in event
|
|
|
|
|
+ ItemStack singleItemStack = item.copyWithCount(1); // Paper - shrink below and single item in event
|
|
|
|
|
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(serverLevel, blockSource.pos());
|
|
|
|
|
+ org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack1);
|
|
|
|
|
+ org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(singleItemStack);
|
|
|
|
|
+
|
|
|
|
|
+ org.bukkit.event.block.BlockDispenseEvent event = new org.bukkit.event.block.BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
|
|
|
|
|
+ if (!DispenserBlock.eventFired) {
|
|
|
|
@@ -25,20 +25,20 @@
|
|
|
|
|
+ shrink = false; // Paper - shrink below
|
|
|
|
|
+ // Chain to handler for new item
|
|
|
|
|
+ ItemStack eventStack = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getItem());
|
|
|
|
|
+ DispenseItemBehavior idispensebehavior = DispenserBlock.getDispenseBehavior(blockSource, eventStack); // Paper - Fix NPE with equippable and items without behavior
|
|
|
|
|
+ if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != this) {
|
|
|
|
|
+ idispensebehavior.dispense(blockSource, eventStack);
|
|
|
|
|
+ DispenseItemBehavior dispenseBehavior = DispenserBlock.getDispenseBehavior(blockSource, eventStack); // Paper - Fix NPE with equippable and items without behavior
|
|
|
|
|
+ if (dispenseBehavior != DispenseItemBehavior.NOOP && dispenseBehavior != this) {
|
|
|
|
|
+ dispenseBehavior.dispense(blockSource, eventStack);
|
|
|
|
|
+ return item;
|
|
|
|
|
+ }
|
|
|
|
|
+ // Paper start - track changed items in the dispense event
|
|
|
|
|
+ itemstack1 = org.bukkit.craftbukkit.inventory.CraftItemStack.unwrap(event.getItem()); // unwrap is safe because the stack won't be modified
|
|
|
|
|
+ type = ((SpawnEggItem) itemstack1.getItem()).getType(serverLevel.registryAccess(), itemstack1);
|
|
|
|
|
+ singleItemStack = org.bukkit.craftbukkit.inventory.CraftItemStack.unwrap(event.getItem()); // unwrap is safe because the stack won't be modified
|
|
|
|
|
+ type = ((SpawnEggItem) singleItemStack.getItem()).getType(serverLevel.registryAccess(), singleItemStack);
|
|
|
|
|
+ // Paper end - track changed item from dispense event
|
|
|
|
|
+ }
|
|
|
|
|
try {
|
|
|
|
|
type.spawn(
|
|
|
|
|
- blockSource.level(), item, null, blockSource.pos().relative(direction), EntitySpawnReason.DISPENSER, direction != Direction.UP, false
|
|
|
|
|
+ blockSource.level(), itemstack1, null, blockSource.pos().relative(direction), EntitySpawnReason.DISPENSER, direction != Direction.UP, false // Paper - track changed item in dispense event
|
|
|
|
|
+ blockSource.level(), singleItemStack, null, blockSource.pos().relative(direction), EntitySpawnReason.DISPENSER, direction != Direction.UP, false // Paper - track changed item in dispense event
|
|
|
|
|
);
|
|
|
|
|
} catch (Exception var6) {
|
|
|
|
|
LOGGER.error("Error while dispensing spawn egg from dispenser at {}", blockSource.pos(), var6);
|
|
|
|
@@ -56,9 +56,9 @@
|
|
|
|
|
BlockPos blockPos = blockSource.pos().relative(direction);
|
|
|
|
|
ServerLevel serverLevel = blockSource.level();
|
|
|
|
|
+ // CraftBukkit start
|
|
|
|
|
+ ItemStack itemstack1 = item.copyWithCount(1); // Paper - shrink below and single item in event
|
|
|
|
|
+ ItemStack singleItemStack = item.copyWithCount(1); // Paper - shrink below and single item in event
|
|
|
|
|
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(serverLevel, blockSource.pos());
|
|
|
|
|
+ org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack1);
|
|
|
|
|
+ org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(singleItemStack);
|
|
|
|
|
+
|
|
|
|
|
+ org.bukkit.event.block.BlockDispenseEvent event = new org.bukkit.event.block.BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
|
|
|
|
|
+ if (!DispenserBlock.eventFired) {
|
|
|
|
@@ -100,10 +100,10 @@
|
|
|
|
|
if (!entitiesOfClass.isEmpty()) {
|
|
|
|
|
- ((Saddleable)entitiesOfClass.get(0)).equipSaddle(item.split(1), SoundSource.BLOCKS);
|
|
|
|
|
+ // CraftBukkit start
|
|
|
|
|
+ ItemStack itemstack1 = item.copyWithCount(1); // Paper - shrink below and single item in event
|
|
|
|
|
+ ItemStack singleItemStack = item.copyWithCount(1); // Paper - shrink below and single item in event
|
|
|
|
|
+ ServerLevel world = blockSource.level();
|
|
|
|
|
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(world, blockSource.pos());
|
|
|
|
|
+ org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack1);
|
|
|
|
|
+ org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(singleItemStack);
|
|
|
|
|
+
|
|
|
|
|
+ org.bukkit.event.block.BlockDispenseArmorEvent event = new org.bukkit.event.block.BlockDispenseArmorEvent(block, craftItem.clone(), entitiesOfClass.get(0).getBukkitLivingEntity());
|
|
|
|
|
+ if (!DispenserBlock.eventFired) {
|
|
|
|
@@ -120,9 +120,9 @@
|
|
|
|
|
+ shrink = false; // Paper - shrink below
|
|
|
|
|
+ // Chain to handler for new item
|
|
|
|
|
+ ItemStack eventStack = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getItem());
|
|
|
|
|
+ DispenseItemBehavior idispensebehavior = DispenserBlock.getDispenseBehavior(blockSource, eventStack); // Paper - Fix NPE with equippable and items without behavior
|
|
|
|
|
+ if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != this) { // Paper - fix possible StackOverflowError
|
|
|
|
|
+ idispensebehavior.dispense(blockSource, eventStack);
|
|
|
|
|
+ DispenseItemBehavior dispenseBehavior = DispenserBlock.getDispenseBehavior(blockSource, eventStack); // Paper - Fix NPE with equippable and items without behavior
|
|
|
|
|
+ if (dispenseBehavior != DispenseItemBehavior.NOOP && dispenseBehavior != this) { // Paper - fix possible StackOverflowError
|
|
|
|
|
+ dispenseBehavior.dispense(blockSource, eventStack);
|
|
|
|
|
+ return item;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
@@ -379,9 +379,9 @@
|
|
|
|
|
BlockPos blockPos = blockSource.pos().relative(blockSource.state().getValue(DispenserBlock.FACING));
|
|
|
|
|
- PrimedTnt primedTnt = new PrimedTnt(level, blockPos.getX() + 0.5, blockPos.getY(), blockPos.getZ() + 0.5, null);
|
|
|
|
|
+ // CraftBukkit start
|
|
|
|
|
+ ItemStack itemstack1 = item.copyWithCount(1); // Paper - shrink at end and single item in event
|
|
|
|
|
+ ItemStack singleItemStack = item.copyWithCount(1); // Paper - shrink at end and single item in event
|
|
|
|
|
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, blockSource.pos());
|
|
|
|
|
+ org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack1);
|
|
|
|
|
+ org.bukkit.craftbukkit.inventory.CraftItemStack craftItem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(singleItemStack);
|
|
|
|
|
+
|
|
|
|
|
+ org.bukkit.event.block.BlockDispenseEvent event = new org.bukkit.event.block.BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) blockPos.getX() + 0.5D, (double) blockPos.getY(), (double) blockPos.getZ() + 0.5D));
|
|
|
|
|
+ if (!DispenserBlock.eventFired) {
|
|
|
|
@@ -557,9 +557,9 @@
|
|
|
|
|
+ if (!event.getItem().equals(craftItem)) {
|
|
|
|
|
+ // Chain to handler for new item
|
|
|
|
|
+ ItemStack eventStack = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getItem());
|
|
|
|
|
+ DispenseItemBehavior idispensebehavior = DispenserBlock.getDispenseBehavior(blockSource, eventStack); // Paper - Fix NPE with equippable and items without behavior
|
|
|
|
|
+ if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != this) { // Paper - fix possible StackOverflowError
|
|
|
|
|
+ idispensebehavior.dispense(blockSource, eventStack);
|
|
|
|
|
+ DispenseItemBehavior dispenseBehavior = DispenserBlock.getDispenseBehavior(blockSource, eventStack); // Paper - Fix NPE with equippable and items without behavior
|
|
|
|
|
+ if (dispenseBehavior != DispenseItemBehavior.NOOP && dispenseBehavior != this) { // Paper - fix possible StackOverflowError
|
|
|
|
|
+ dispenseBehavior.dispense(blockSource, eventStack);
|
|
|
|
|
+ return item;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|