use of net.minecraft.util.Direction in project BluePower by Qmunity.
the class TileBlockBreaker method redstoneChanged.
@Override
protected void redstoneChanged(boolean newValue) {
super.redstoneChanged(newValue);
if (!level.isClientSide && newValue) {
Direction direction = getFacingDirection();
BlockState breakState = level.getBlockState(worldPosition.relative(direction));
if (!canBreakBlock(breakState.getBlock(), level, breakState, worldPosition.relative(direction)))
return;
List<ItemStack> breakStacks = breakState.getBlock().getDrops(breakState, (ServerWorld) level, worldPosition.relative(direction), this);
// destroyBlock
level.destroyBlock(worldPosition.relative(direction), false);
addItemsToOutputBuffer(breakStacks);
}
}
use of net.minecraft.util.Direction in project BluePower by Qmunity.
the class TileDeployer method rightClick.
/**
* Be sure to set up the fake player's hotbar with the right clicked items. starting with hotbar slot 0.
* @param player
* @param useItems this method will set the current selected slot of the fake player to 0, and move on to the next slot useItems - 1 times.
* So to use the first slot only, pass 1, to use the full hotbar, 9.
* @return
*/
protected boolean rightClick(FakePlayer player, int useItems) {
if (useItems > 9)
throw new IllegalArgumentException("Hotbar is 9 items in width! You're trying " + useItems + "!");
Direction faceDir = getFacingDirection();
int dx = faceDir.getStepX();
int dy = faceDir.getStepY();
int dz = faceDir.getStepZ();
int x = worldPosition.getX() + dx;
int y = worldPosition.getY() + dy;
int z = worldPosition.getZ() + dz;
player.setPos(x + 0.5, y + 0.5 - player.getEyeHeight(), z + 0.5);
player.xRot = faceDir.getStepY() * -90;
switch(faceDir) {
case NORTH:
player.yRot = 180;
break;
case SOUTH:
player.yRot = 0;
break;
case WEST:
player.yRot = 90;
break;
case EAST:
player.yRot = -90;
}
try {
PlayerInteractEvent event = new PlayerInteractEvent.RightClickEmpty(player, Hand.MAIN_HAND);
if (event.isCanceled())
return false;
Block block = level.getBlockState(new BlockPos(x, y, z)).getBlock();
List<LivingEntity> detectedEntities = level.getEntitiesOfClass(LivingEntity.class, new AxisAlignedBB(x, y, z, x + 1, y + 1, z + 1));
Entity entity = detectedEntities.isEmpty() ? null : detectedEntities.get(level.random.nextInt(detectedEntities.size()));
if (entity != null) {
for (int i = 0; i < useItems; i++) {
player.inventory.selected = i;
ItemStack stack = player.getMainHandItem();
if (canDeployItem(stack) && stack.getItem().interactLivingEntity(stack, player, (LivingEntity) entity, Hand.MAIN_HAND).shouldSwing())
return true;
if (entity instanceof AnimalEntity && ((AnimalEntity) entity).mobInteract(player, Hand.MAIN_HAND).shouldSwing())
return true;
}
}
for (int i = 0; i < useItems; i++) {
player.inventory.selected = i;
ItemStack stack = player.getMainHandItem();
if (canDeployItem(stack) && stack.getItem().onItemUseFirst(stack, new ItemUseContext(player, Hand.MAIN_HAND, new BlockRayTraceResult(new Vector3d(dx, dy, dz), faceDir, new BlockPos(x, y, z), false))) == ActionResultType.SUCCESS)
return true;
}
for (int i = 0; i < useItems; i++) {
player.inventory.selected = i;
if (!level.isEmptyBlock(new BlockPos(x, y, z)) && block.use(level.getBlockState(new BlockPos(x, y, z)), level, new BlockPos(x, y, z), player, Hand.MAIN_HAND, new BlockRayTraceResult(new Vector3d(dx, dy, dz), faceDir, new BlockPos(x, y, z), false)) == ActionResultType.SUCCESS)
return true;
}
for (int i = 0; i < useItems; i++) {
player.inventory.selected = i;
ItemStack stack = player.getMainHandItem();
boolean isGoingToShift = false;
if (!stack.isEmpty()) {
if (stack.getItem() == Items.SUGAR_CANE || stack.getItem() == Items.REDSTONE) {
isGoingToShift = true;
}
}
int useX = isGoingToShift ? worldPosition.getX() : x;
int useY = isGoingToShift ? worldPosition.getY() : y;
int useZ = isGoingToShift ? worldPosition.getZ() : z;
if (canDeployItem(stack) && stack.getItem().useOn(new ItemUseContext(player, Hand.MAIN_HAND, new BlockRayTraceResult(new Vector3d(dx, dy, dz), faceDir, new BlockPos(x, y, z), false))) == ActionResultType.SUCCESS)
return true;
}
for (int i = 0; i < useItems; i++) {
player.inventory.selected = i;
ItemStack stack = player.getMainHandItem();
if (canDeployItem(stack)) {
ItemStack copy = stack.copy();
// TODO Check this
player.setItemInHand(Hand.MAIN_HAND, stack.getItem().use(level, player, Hand.MAIN_HAND).getObject());
if (!copy.sameItem(stack))
return true;
}
}
return false;
} catch (Throwable e) {
BluePower.log.error("Deployer crashed! Stacktrace: ");
e.printStackTrace();
return true;
}
}
use of net.minecraft.util.Direction in project BluePower by Qmunity.
the class TileBattery method tick.
@Override
public void tick() {
if (!level.isClientSide) {
storage.resetCurrent();
// Balance power of attached blulectric blocks.
for (Direction facing : Direction.values()) {
TileEntity tile = level.getBlockEntity(worldPosition.relative(facing));
if (tile != null)
tile.getCapability(CapabilityBlutricity.BLUTRICITY_CAPABILITY, facing.getOpposite()).ifPresent(exStorage -> EnergyHelper.balancePower(exStorage, storage));
}
double energy = storage.getEnergy();
int batteryLevel = (int) ((energy / MAX_ENERGY) * 6);
BlockState state = getBlockState();
if (state.getValue(BlockBattery.LEVEL) != batteryLevel) {
this.level.setBlockAndUpdate(worldPosition, state.setValue(BlockBattery.LEVEL, batteryLevel));
markForRenderUpdate();
setChanged();
}
}
}
use of net.minecraft.util.Direction in project BluePower by Qmunity.
the class TileBlulectricCable method getCapability.
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
List<Direction> directions = new ArrayList<>(BlockBlulectricCable.FACING.getPossibleValues());
if (level != null) {
BlockState state = getBlockState();
if (state.getBlock() instanceof BlockBlulectricCable) {
// Remove upward connections
directions.remove(state.getValue(BlockBlulectricCable.FACING));
// Make sure the cable is on the same side of the block
directions.removeIf(d -> level.getBlockState(worldPosition.relative(d)).getBlock() instanceof BlockBlulectricCable && level.getBlockState(worldPosition.relative(d)).getValue(BlockBlulectricCable.FACING) != state.getValue(BlockBlulectricCable.FACING));
}
}
if (cap == CapabilityBlutricity.BLUTRICITY_CAPABILITY && (side == null || directions.contains(side))) {
if (blutricityCap == null)
blutricityCap = LazyOptional.of(() -> storage);
return blutricityCap.cast();
}
return LazyOptional.empty();
}
use of net.minecraft.util.Direction in project BluePower by Qmunity.
the class TileBlulectricCable method tick.
@Override
public void tick() {
storage.resetCurrent();
if (level != null && !level.isClientSide) {
BlockState state = getBlockState();
if (state.getBlock() instanceof BlockBlulectricCable) {
List<Direction> directions = new ArrayList<>(BlockBlulectricCable.FACING.getPossibleValues());
// Check the side has capability
directions.removeIf(d -> !getCapability(CapabilityBlutricity.BLUTRICITY_CAPABILITY, d).isPresent());
// Balance power of attached blulectric blocks.
for (Direction facing : directions) {
Block fBlock = level.getBlockState(worldPosition.relative(facing)).getBlock();
if (fBlock != Blocks.AIR && fBlock != Blocks.WATER) {
TileEntity tile = level.getBlockEntity(worldPosition.relative(facing));
if (tile != null)
tile.getCapability(CapabilityBlutricity.BLUTRICITY_CAPABILITY, facing.getOpposite()).ifPresent(exStorage -> EnergyHelper.balancePower(exStorage, storage));
} else {
TileEntity tile = level.getBlockEntity(worldPosition.relative(facing).relative(state.getValue(BlockBlulectricCable.FACING).getOpposite()));
if (tile != null)
tile.getCapability(CapabilityBlutricity.BLUTRICITY_CAPABILITY, state.getValue(BlockBlulectricCable.FACING)).ifPresent(exStorage -> EnergyHelper.balancePower(exStorage, storage));
}
}
}
}
}
Aggregations