mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-28 23:38:25 +01:00
29b207245f
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 97c59261 PR-1073: Make Biome an interface a38581aa Fix further javadoc errors 8271c490 Fix javadoc error 8a9ecf29 PR-1072: Fix bad naming for Vault State methods 6dd58108 PR-1071: Make Fluid an interface and add missing entry ed2cdfc3 PR-1070: Make Attribute an interface and align names with the new minecraft ones 63472efb PR-1069: Add missing winter drop experimental annotation to pale boats CraftBukkit Changes: 7235ad7b0 PR-1501: Make Biome an interface 602904003 PR-1500: Rename implementation for Vault State methods 75f26f79f PR-1499: Make Fluid an interface and add missing entry 4cfd87adc PR-1498: Make Attribute an interface and align names with the new minecraft ones 6bb0db5cb SPIGOT-7928: ExactChoice acts as MaterialChoice 3eaf3a13c SPIGOT-7929: Error when setting EquippableComponent abbf57bac SPIGOT-7930: Fix spawning entities with SummonEntityEffect 92d6ab6cf PR-1497: Move boat field rename entries to below key renaming, so that keys are also renamed abfe292aa PR-1496: Use correct Fluid class on Tags type check c7aab7fa7 SPIGOT-7923: Fix Dispenser logic to avoid firing empty projectiles
104 lines
8.3 KiB
Diff
104 lines
8.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Mon, 12 Dec 2022 12:14:03 -0800
|
|
Subject: [PATCH] Properly track the changed item from dispense events
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
|
+++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
|
@@ -0,0 +0,0 @@ public interface DispenseItemBehavior {
|
|
idispensebehavior.dispense(pointer, eventStack);
|
|
return stack;
|
|
}
|
|
+ // Paper start - track changed items in the dispense event
|
|
+ itemstack1 = CraftItemStack.unwrap(event.getItem()); // unwrap is safe because the stack won't be modified
|
|
+ entitytypes = ((SpawnEggItem) itemstack1.getItem()).getType(itemstack1);
|
|
+ // Paper end - track changed item from dispense event
|
|
}
|
|
|
|
try {
|
|
- entitytypes.spawn(pointer.level(), stack, (Player) null, pointer.pos().relative(enumdirection), EntitySpawnReason.DISPENSER, enumdirection != Direction.UP, false);
|
|
+ entitytypes.spawn(pointer.level(), itemstack1, (Player) null, pointer.pos().relative(enumdirection), EntitySpawnReason.DISPENSER, enumdirection != Direction.UP, false); // Paper - track changed item in dispense event
|
|
} catch (Exception exception) {
|
|
DispenseItemBehavior.LOGGER.error("Error while dispensing spawn egg from dispenser at {}", pointer.pos(), exception); // CraftBukkit - decompile error
|
|
return ItemStack.EMPTY;
|
|
@@ -0,0 +0,0 @@ public interface DispenseItemBehavior {
|
|
}
|
|
// CraftBukkit end
|
|
|
|
+ final ItemStack newStack = CraftItemStack.unwrap(event.getItem()); // Paper - use event itemstack (unwrap is fine here because the stack won't be modified)
|
|
Consumer<ArmorStand> consumer = EntityType.appendDefaultStackConfig((entityarmorstand) -> {
|
|
entityarmorstand.setYRot(enumdirection.toYRot());
|
|
- }, worldserver, stack, (Player) null);
|
|
+ }, worldserver, newStack, (Player) null); // Paper - track changed items in the dispense event
|
|
ArmorStand entityarmorstand = (ArmorStand) EntityType.ARMOR_STAND.spawn(worldserver, consumer, blockposition, EntitySpawnReason.DISPENSER, false, false);
|
|
|
|
if (entityarmorstand != null) {
|
|
@@ -0,0 +0,0 @@ public interface DispenseItemBehavior {
|
|
return stack;
|
|
}
|
|
}
|
|
- ((Saddleable) list.get(0)).equipSaddle(itemstack1, SoundSource.BLOCKS);
|
|
+ ((Saddleable) list.get(0)).equipSaddle(CraftItemStack.asNMSCopy(event.getItem()), SoundSource.BLOCKS); // Paper - track changed items in dispense event
|
|
// CraftBukkit end
|
|
this.setSuccess(true);
|
|
return stack;
|
|
@@ -0,0 +0,0 @@ public interface DispenseItemBehavior {
|
|
int y = blockposition.getY();
|
|
int z = blockposition.getZ();
|
|
BlockState iblockdata = worldserver.getBlockState(blockposition);
|
|
+ ItemStack dispensedItem = stack; // Paper - track changed item from the dispense event
|
|
// Paper start - correctly check if the bucket place will succeed
|
|
/* Taken from SolidBucketItem#emptyContents */
|
|
boolean willEmptyContentsSolidBucketItem = dispensiblecontaineritem instanceof net.minecraft.world.item.SolidBucketItem && worldserver.isInWorldBounds(blockposition) && iblockdata.isAir();
|
|
@@ -0,0 +0,0 @@ public interface DispenseItemBehavior {
|
|
}
|
|
}
|
|
|
|
- dispensiblecontaineritem = (DispensibleContainerItem) CraftItemStack.asNMSCopy(event.getItem()).getItem();
|
|
+ // Paper start - track changed item from dispense event
|
|
+ dispensedItem = CraftItemStack.unwrap(event.getItem()); // unwrap is safe here as the stack isn't mutated
|
|
+ dispensiblecontaineritem = (DispensibleContainerItem) dispensedItem.getItem();
|
|
+ // Paper end - track changed item from dispense event
|
|
}
|
|
// CraftBukkit end
|
|
|
|
if (dispensiblecontaineritem.emptyContents((Player) null, worldserver, blockposition, (BlockHitResult) null)) {
|
|
- dispensiblecontaineritem.checkExtraContent((Player) null, worldserver, stack, blockposition);
|
|
+ dispensiblecontaineritem.checkExtraContent((Player) null, worldserver, dispensedItem, blockposition); // Paper - track changed item from dispense event
|
|
return this.consumeWithRemainder(pointer, stack, new ItemStack(Items.BUCKET));
|
|
} else {
|
|
return this.defaultDispenseItemBehavior.dispense(pointer, stack);
|
|
diff --git a/src/main/java/net/minecraft/core/dispenser/ProjectileDispenseBehavior.java b/src/main/java/net/minecraft/core/dispenser/ProjectileDispenseBehavior.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/core/dispenser/ProjectileDispenseBehavior.java
|
|
+++ b/src/main/java/net/minecraft/core/dispenser/ProjectileDispenseBehavior.java
|
|
@@ -0,0 +0,0 @@ public class ProjectileDispenseBehavior extends DefaultDispenseItemBehavior {
|
|
|
|
// SPIGOT-7923: Avoid create projectiles with empty item
|
|
if (!itemstack1.isEmpty()) {
|
|
- Projectile iprojectile = Projectile.spawnProjectileUsingShoot(this.projectileItem.asProjectile(worldserver, iposition, itemstack1, enumdirection), worldserver, itemstack1, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.dispenseConfig.power(), this.dispenseConfig.uncertainty());
|
|
+ Projectile iprojectile = Projectile.spawnProjectileUsingShoot(this.projectileItem.asProjectile(worldserver, iposition, CraftItemStack.unwrap(event.getItem()), enumdirection), worldserver, itemstack1, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.dispenseConfig.power(), this.dispenseConfig.uncertainty()); // Paper - track changed items in the dispense event; unwrap is safe here because all uses of the stack make their own copies
|
|
iprojectile.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource(pointer.blockEntity());
|
|
}
|
|
// itemstack.shrink(1); // CraftBukkit - Handled during event processing
|
|
diff --git a/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java b/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java
|
|
+++ b/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java
|
|
@@ -0,0 +0,0 @@ public class ShulkerBoxDispenseBehavior extends OptionalDispenseItemBehavior {
|
|
// CraftBukkit end
|
|
|
|
try {
|
|
- this.setSuccess(((BlockItem) item).place(new DirectionalPlaceContext(pointer.level(), blockposition, enumdirection, stack, enumdirection1)).consumesAction());
|
|
+ // Paper start - track changed items in the dispense event
|
|
+ this.setSuccess(((BlockItem) item).place(new DirectionalPlaceContext(pointer.level(), blockposition, enumdirection, CraftItemStack.asNMSCopy(event.getItem()), enumdirection1)).consumesAction());
|
|
+ if (this.isSuccess()) {
|
|
+ stack.shrink(1); // vanilla shrink is in the place function above, manually handle it here
|
|
+ }
|
|
+ // Paper end - track changed items in the dispense event
|
|
} catch (Exception exception) {
|
|
ShulkerBoxDispenseBehavior.LOGGER.error("Error trying to place shulker box at {}", blockposition, exception);
|
|
}
|