
When a block placement happens we currently update physics on the attempted placement and update again if the placement is cancelled. To correct the first one we simply set the block without applying physics. To correct the second we have to add a new method to BlockState that lets us update without applying physics and use this method method when putting the block back.
52 lines
1.4 KiB
Java
52 lines
1.4 KiB
Java
package org.bukkit.craftbukkit.block;
|
|
|
|
import java.util.Random;
|
|
import net.minecraft.server.BlockDispenser;
|
|
import net.minecraft.server.TileEntityDispenser;
|
|
import org.bukkit.Material;
|
|
import org.bukkit.block.Block;
|
|
import org.bukkit.block.Dispenser;
|
|
import org.bukkit.craftbukkit.CraftWorld;
|
|
import org.bukkit.craftbukkit.inventory.CraftInventory;
|
|
import org.bukkit.inventory.Inventory;
|
|
|
|
public class CraftDispenser extends CraftBlockState implements Dispenser {
|
|
private final CraftWorld world;
|
|
private final TileEntityDispenser dispenser;
|
|
|
|
public CraftDispenser(final Block block) {
|
|
super(block);
|
|
|
|
world = (CraftWorld) block.getWorld();
|
|
dispenser = (TileEntityDispenser) world.getTileEntityAt(getX(), getY(), getZ());
|
|
}
|
|
|
|
public Inventory getInventory() {
|
|
return new CraftInventory(dispenser);
|
|
}
|
|
|
|
public boolean dispense() {
|
|
Block block = getBlock();
|
|
|
|
if (block.getType() == Material.DISPENSER) {
|
|
BlockDispenser dispense = (BlockDispenser) net.minecraft.server.Block.DISPENSER;
|
|
|
|
dispense.dispense(world.getHandle(), getX(), getY(), getZ());
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean update(boolean force, boolean applyPhysics) {
|
|
boolean result = super.update(force, applyPhysics);
|
|
|
|
if (result) {
|
|
dispenser.update();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|