Files
CatServer/patches/net/minecraft/dispenser/BehaviorDefaultDispenseItem.java.patch
2018-09-08 09:15:34 +08:00

92 lines
4.3 KiB
Diff

--- ../src-base/minecraft/net/minecraft/dispenser/BehaviorDefaultDispenseItem.java
+++ ../src-work/minecraft/net/minecraft/dispenser/BehaviorDefaultDispenseItem.java
@@ -1,5 +1,8 @@
package net.minecraft.dispenser;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.event.block.BlockDispenseEvent;
+
import net.minecraft.block.BlockDispenser;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
@@ -21,11 +24,40 @@
EnumFacing enumfacing = (EnumFacing)source.getBlockState().getValue(BlockDispenser.FACING);
IPosition iposition = BlockDispenser.getDispensePosition(source);
ItemStack itemstack = stack.splitStack(1);
- doDispense(source.getWorld(), itemstack, 6, enumfacing, iposition);
+ // CraftBukkit start
+ if (!doDispense(source.getWorld(), itemstack, 6, enumfacing, iposition, source)) {
+ stack.stackSize++;
+ }
+ // CraftBukkit end
return stack;
}
+
+ public static void doDispense(World worldIn, ItemStack stack, int speed, EnumFacing facing, IPosition position) { // CatServer - mods compatibility
+ double d0 = position.getX();
+ double d1 = position.getY();
+ double d2 = position.getZ();
- public static void doDispense(World worldIn, ItemStack stack, int speed, EnumFacing facing, IPosition position)
+ if (facing.getAxis() == EnumFacing.Axis.Y)
+ {
+ d1 = d1 - 0.125D;
+ }
+ else
+ {
+ d1 = d1 - 0.15625D;
+ }
+
+ EntityItem entityitem = new EntityItem(worldIn, d0, d1, d2, stack);
+ double d3 = worldIn.rand.nextDouble() * 0.1D + 0.2D;
+ entityitem.motionX = (double)facing.getFrontOffsetX() * d3;
+ entityitem.motionY = 0.20000000298023224D;
+ entityitem.motionZ = (double)facing.getFrontOffsetZ() * d3;
+ entityitem.motionX += worldIn.rand.nextGaussian() * 0.007499999832361937D * (double)speed;
+ entityitem.motionY += worldIn.rand.nextGaussian() * 0.007499999832361937D * (double)speed;
+ entityitem.motionZ += worldIn.rand.nextGaussian() * 0.007499999832361937D * (double)speed;
+ worldIn.spawnEntityInWorld(entityitem);
+ }
+
+ public static boolean doDispense(World worldIn, ItemStack stack, int speed, EnumFacing facing, IPosition position, IBlockSource source)
{
double d0 = position.getX();
double d1 = position.getY();
@@ -48,7 +80,36 @@
entityitem.motionX += worldIn.rand.nextGaussian() * 0.007499999832361937D * (double)speed;
entityitem.motionY += worldIn.rand.nextGaussian() * 0.007499999832361937D * (double)speed;
entityitem.motionZ += worldIn.rand.nextGaussian() * 0.007499999832361937D * (double)speed;
+
+ org.bukkit.block.Block block = worldIn.getWorld().getBlockAt(source.getBlockPos().getX(), source.getBlockPos().getY(), source.getBlockPos().getZ());
+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack);
+
+ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(entityitem.motionX, entityitem.motionY, entityitem.motionZ));
+ worldIn.getServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
+ return false;
+ }
+
+ entityitem.setEntityItemStack(CraftItemStack.asNMSCopy(event.getItem()));
+ entityitem.motionX = event.getVelocity().getX();
+ entityitem.motionY = event.getVelocity().getY();
+ entityitem.motionZ = event.getVelocity().getZ();
+
+ if (!event.getItem().getType().equals(craftItem.getType())) {
+ // Chain to handler for new item
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IBehaviorDispenseItem idispensebehavior = BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.getObject(eventStack.getItem());
+ if (idispensebehavior != IBehaviorDispenseItem.DEFAULT_BEHAVIOR && idispensebehavior.getClass() != BehaviorDefaultDispenseItem.class) {
+ idispensebehavior.dispense(source, eventStack);
+ } else {
+ worldIn.spawnEntityInWorld(entityitem);
+ }
+ return false;
+ }
+
worldIn.spawnEntityInWorld(entityitem);
+ return true;
}
protected void playDispenseSound(IBlockSource source)