mirror of
https://github.com/barkeser2002/CatServer.git
synced 2026-09-25 10:06:11 +03:00
92 lines
4.3 KiB
Diff
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)
|