use of cn.nukkit.math.BlockFace in project Nukkit by Nukkit.
the class BlockDispenser method getDispensePosition.
public Vector3 getDispensePosition() {
BlockFace facing = getFacing();
double x = this.getX() + 0.7 * facing.getXOffset();
double y = this.getY() + 0.7 * facing.getYOffset();
double z = this.getZ() + 0.7 * facing.getZOffset();
return new Vector3(x, y, z);
}
use of cn.nukkit.math.BlockFace in project Nukkit by Nukkit.
the class BlockRail method place.
// Information from http://minecraft.gamepedia.com/Rail
@Override
public boolean place(Item item, Block block, Block target, BlockFace face, double fx, double fy, double fz, Player player) {
Block down = this.down();
if (down == null || down.isTransparent()) {
return false;
}
Map<BlockRail, BlockFace> railsAround = this.checkRailsAroundAffected();
List<BlockRail> rails = new ArrayList<>(railsAround.keySet());
List<BlockFace> faces = new ArrayList<>(railsAround.values());
if (railsAround.size() == 1) {
BlockRail other = rails.get(0);
this.setDamage(this.connect(other, railsAround.get(other)).metadata());
} else if (railsAround.size() == 4) {
if (this.isAbstract()) {
this.setDamage(this.connect(rails.get(faces.indexOf(SOUTH)), SOUTH, rails.get(faces.indexOf(EAST)), EAST).metadata());
} else {
this.setDamage(this.connect(rails.get(faces.indexOf(EAST)), EAST, rails.get(faces.indexOf(WEST)), WEST).metadata());
}
} else if (!railsAround.isEmpty()) {
if (this.isAbstract()) {
if (railsAround.size() == 2) {
BlockRail rail1 = rails.get(0);
BlockRail rail2 = rails.get(1);
this.setDamage(this.connect(rail1, railsAround.get(rail1), rail2, railsAround.get(rail2)).metadata());
} else {
List<BlockFace> cd = Stream.of(CURVED_SOUTH_EAST, CURVED_NORTH_EAST, CURVED_SOUTH_WEST).filter(o -> o.connectingDirections().stream().allMatch(faces::contains)).findFirst().get().connectingDirections();
BlockFace f1 = cd.get(0);
BlockFace f2 = cd.get(1);
this.setDamage(this.connect(rails.get(faces.indexOf(f1)), f1, rails.get(faces.indexOf(f2)), f2).metadata());
}
} else {
BlockFace f = faces.stream().sorted((f1, f2) -> (f1.getIndex() < f2.getIndex()) ? 1 : ((x == y) ? 0 : -1)).findFirst().get();
BlockFace fo = f.getOpposite();
if (faces.contains(fo)) {
// Opposite connectable
this.setDamage(this.connect(rails.get(faces.indexOf(f)), f, rails.get(faces.indexOf(fo)), fo).metadata());
} else {
this.setDamage(this.connect(rails.get(faces.indexOf(f)), f).metadata());
}
}
}
this.level.setBlock(this, this, true, true);
if (!isAbstract()) {
level.scheduleUpdate(this, this, 0);
}
return true;
}
use of cn.nukkit.math.BlockFace in project Nukkit by Nukkit.
the class BlockRedstoneComparator method calculateInputStrength.
protected int calculateInputStrength() {
int power = super.calculateInputStrength();
BlockFace face = getFacing();
Block block = this.getSide(face);
if (block.hasComparatorInputOverride()) {
power = block.getComparatorInputOverride();
} else if (power < 15 && block.isNormalBlock()) {
block = block.getSide(face);
if (block.hasComparatorInputOverride()) {
power = block.getComparatorInputOverride();
}
}
return power;
}
use of cn.nukkit.math.BlockFace in project Nukkit by Nukkit.
the class BlockLever method onActivate.
@Override
public boolean onActivate(Item item, Player player) {
this.level.getServer().getPluginManager().callEvent(new BlockRedstoneEvent(this, isPowerOn() ? 15 : 0, isPowerOn() ? 0 : 15));
this.setDamage(this.getDamage() ^ 0x08);
this.getLevel().setBlock(this, this, false, true);
// TODO: coorect pitcj
this.getLevel().addSound(this, Sound.RANDOM_CLICK);
LeverOrientation orientation = LeverOrientation.byMetadata(this.isPowerOn() ? this.getDamage() ^ 0x08 : this.getDamage());
BlockFace face = orientation.getFacing();
// this.level.updateAroundRedstone(this, null);
this.level.updateAroundRedstone(this.getLocation().getSide(face.getOpposite()), isPowerOn() ? face : null);
return true;
}
use of cn.nukkit.math.BlockFace in project Nukkit by Nukkit.
the class BlockLever method onBreak.
@Override
public boolean onBreak(Item item) {
this.getLevel().setBlock(this, new BlockAir(), true, true);
if (isPowerOn()) {
BlockFace face = LeverOrientation.byMetadata(this.isPowerOn() ? this.getDamage() ^ 0x08 : this.getDamage()).getFacing();
this.level.updateAround(this.getLocation().getSide(face.getOpposite()));
}
return true;
}
Aggregations