SPIGOT-7923: Fix Dispenser logic to avoid firing empty projectiles
This commit is contained in:
parent
18b8ae1839
commit
c7aab7fa7f
@ -1,11 +1,10 @@
|
|||||||
--- a/net/minecraft/core/dispenser/DispenseBehaviorProjectile.java
|
--- a/net/minecraft/core/dispenser/DispenseBehaviorProjectile.java
|
||||||
+++ b/net/minecraft/core/dispenser/DispenseBehaviorProjectile.java
|
+++ b/net/minecraft/core/dispenser/DispenseBehaviorProjectile.java
|
||||||
@@ -9,6 +9,13 @@
|
@@ -9,6 +9,12 @@
|
||||||
import net.minecraft.world.item.ProjectileItem;
|
import net.minecraft.world.item.ProjectileItem;
|
||||||
import net.minecraft.world.level.block.BlockDispenser;
|
import net.minecraft.world.level.block.BlockDispenser;
|
||||||
|
|
||||||
+// CraftBukkit start
|
+// CraftBukkit start
|
||||||
+import net.minecraft.world.entity.Entity;
|
|
||||||
+import org.bukkit.craftbukkit.block.CraftBlock;
|
+import org.bukkit.craftbukkit.block.CraftBlock;
|
||||||
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
||||||
+import org.bukkit.event.block.BlockDispenseEvent;
|
+import org.bukkit.event.block.BlockDispenseEvent;
|
||||||
@ -14,14 +13,14 @@
|
|||||||
public class DispenseBehaviorProjectile extends DispenseBehaviorItem {
|
public class DispenseBehaviorProjectile extends DispenseBehaviorItem {
|
||||||
|
|
||||||
private final ProjectileItem projectileItem;
|
private final ProjectileItem projectileItem;
|
||||||
@@ -31,8 +38,37 @@
|
@@ -31,8 +37,40 @@
|
||||||
EnumDirection enumdirection = (EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING);
|
EnumDirection enumdirection = (EnumDirection) sourceblock.state().getValue(BlockDispenser.FACING);
|
||||||
IPosition iposition = this.dispenseConfig.positionFunction().getDispensePosition(sourceblock, enumdirection);
|
IPosition iposition = this.dispenseConfig.positionFunction().getDispensePosition(sourceblock, enumdirection);
|
||||||
|
|
||||||
- IProjectile.spawnProjectileUsingShoot(this.projectileItem.asProjectile(worldserver, iposition, itemstack, enumdirection), worldserver, itemstack, (double) enumdirection.getStepX(), (double) enumdirection.getStepY(), (double) enumdirection.getStepZ(), this.dispenseConfig.power(), this.dispenseConfig.uncertainty());
|
- IProjectile.spawnProjectileUsingShoot(this.projectileItem.asProjectile(worldserver, iposition, itemstack, enumdirection), worldserver, itemstack, (double) enumdirection.getStepX(), (double) enumdirection.getStepY(), (double) enumdirection.getStepZ(), this.dispenseConfig.power(), this.dispenseConfig.uncertainty());
|
||||||
- itemstack.shrink(1);
|
- itemstack.shrink(1);
|
||||||
+ // CraftBukkit start
|
+ // CraftBukkit start
|
||||||
+ // this.projectileItem.shoot(iprojectile, (double) enumdirection.getStepX(), (double) enumdirection.getStepY(), (double) enumdirection.getStepZ(), this.dispenseConfig.power(), this.dispenseConfig.uncertainty());
|
+ // IProjectile.spawnProjectileUsingShoot(this.projectileItem.asProjectile(worldserver, iposition, itemstack, enumdirection), worldserver, itemstack, (double) enumdirection.getStepX(), (double) enumdirection.getStepY(), (double) enumdirection.getStepZ(), this.dispenseConfig.power(), this.dispenseConfig.uncertainty()); // CraftBukkit - call when finish the BlockDispenseEvent
|
||||||
+ ItemStack itemstack1 = itemstack.split(1);
|
+ ItemStack itemstack1 = itemstack.split(1);
|
||||||
+ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos());
|
+ org.bukkit.block.Block block = CraftBlock.at(worldserver, sourceblock.pos());
|
||||||
+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
|
+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
|
||||||
@ -47,8 +46,11 @@
|
|||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ IProjectile iprojectile = IProjectile.spawnProjectileUsingShoot(this.projectileItem.asProjectile(worldserver, iposition, itemstack, enumdirection), worldserver, itemstack, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.dispenseConfig.power(), this.dispenseConfig.uncertainty());
|
+ // SPIGOT-7923: Avoid create projectiles with empty item
|
||||||
+ ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource(sourceblock.blockEntity());
|
+ if (!itemstack1.isEmpty()) {
|
||||||
|
+ IProjectile iprojectile = IProjectile.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());
|
||||||
|
+ iprojectile.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource(sourceblock.blockEntity());
|
||||||
|
+ }
|
||||||
+ // itemstack.shrink(1); // CraftBukkit - Handled during event processing
|
+ // itemstack.shrink(1); // CraftBukkit - Handled during event processing
|
||||||
+ // CraftBukkit end
|
+ // CraftBukkit end
|
||||||
return itemstack;
|
return itemstack;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user