use of buildcraft.core.marker.volume.VolumeBox in project BuildCraft by BuildCraft.
the class TileFiller method readPayload.
@Override
public void readPayload(int id, PacketBufferBC buffer, Side side, MessageContext ctx) throws IOException {
super.readPayload(id, buffer, side, ctx);
if (side == Side.CLIENT) {
if (id == NET_RENDER_DATA) {
builder.readFromByteBuf(buffer);
readPayload(NET_BOX, buffer, side, ctx);
} else if (id == NET_GUI_DATA || id == NET_GUI_TICK) {
readPayload(NET_CAN_EXCAVATE, buffer, side, ctx);
readPayload(NET_INVERT, buffer, side, ctx);
readPayload(NET_PATTERN, buffer, side, ctx);
builder.readFromByteBuf(buffer);
finished = buffer.readBoolean();
lockedTicks = buffer.readBoolean() ? (byte) 1 : (byte) 0;
mode = buffer.readEnumValue(Mode.class);
} else if (id == NET_BOX) {
box.readData(buffer);
markerBox = buffer.readBoolean();
if (buffer.readBoolean()) {
UUID volumeBoxId = buffer.readUniqueId();
VolumeBox volumeBox = world.isRemote ? ClientVolumeBoxes.INSTANCE.volumeBoxes.stream().filter(localVolumeBox -> localVolumeBox.id.equals(volumeBoxId)).findFirst().orElseThrow(NullPointerException::new) : WorldSavedDataVolumeBoxes.get(world).getVolumeBoxFromId(volumeBoxId);
addon = (AddonFillerPlanner) volumeBox.addons.get(buffer.readEnumValue(EnumAddonSlot.class));
}
} else if (id == NET_CAN_EXCAVATE) {
canExcavate = buffer.readBoolean();
} else if (id == NET_INVERT) {
inverted = buffer.readBoolean();
} else if (id == NET_PATTERN) {
patternStatement.readFromBuffer(buffer);
}
}
if (side == Side.SERVER) {
if (id == NET_CAN_EXCAVATE) {
canExcavate = buffer.readBoolean();
sendNetworkGuiUpdate(NET_CAN_EXCAVATE);
}
}
}
use of buildcraft.core.marker.volume.VolumeBox in project BuildCraft by BuildCraft.
the class ItemMarkerConnector method onItemRightClickVolumeBoxes.
private EnumActionResult onItemRightClickVolumeBoxes(World world, EntityPlayer player) {
if (world.isRemote) {
return EnumActionResult.PASS;
}
WorldSavedDataVolumeBoxes volumeBoxes = WorldSavedDataVolumeBoxes.get(world);
VolumeBox currentEditing = volumeBoxes.getCurrentEditing(player);
Vec3d start = player.getPositionVector().addVector(0, player.getEyeHeight(), 0);
Vec3d end = start.add(player.getLookVec().scale(4));
Pair<VolumeBox, EnumAddonSlot> selectingVolumeBoxAndSlot = EnumAddonSlot.getSelectingVolumeBoxAndSlot(player, volumeBoxes.volumeBoxes);
VolumeBox addonVolumeBox = selectingVolumeBoxAndSlot.getLeft();
EnumAddonSlot addonSlot = selectingVolumeBoxAndSlot.getRight();
if (addonVolumeBox != null && addonSlot != null) {
if (addonVolumeBox.addons.containsKey(addonSlot) && addonVolumeBox.getLockTargetsStream().noneMatch(target -> target instanceof Lock.Target.TargetAddon && ((Lock.Target.TargetAddon) target).slot == addonSlot)) {
if (player.isSneaking()) {
addonVolumeBox.addons.get(addonSlot).onRemoved();
addonVolumeBox.addons.remove(addonSlot);
volumeBoxes.markDirty();
} else {
addonVolumeBox.addons.get(addonSlot).onPlayerRightClick(player);
volumeBoxes.markDirty();
}
}
} else if (player.isSneaking()) {
if (currentEditing == null) {
for (Iterator<VolumeBox> iterator = volumeBoxes.volumeBoxes.iterator(); iterator.hasNext(); ) {
VolumeBox volumeBox = iterator.next();
if (volumeBox.box.getBoundingBox().calculateIntercept(start, end) != null) {
if (volumeBox.getLockTargetsStream().noneMatch(Lock.Target.TargetResize.class::isInstance)) {
volumeBox.addons.values().forEach(Addon::onRemoved);
iterator.remove();
volumeBoxes.markDirty();
return EnumActionResult.SUCCESS;
} else {
return EnumActionResult.FAIL;
}
}
}
} else {
currentEditing.cancelEditing();
volumeBoxes.markDirty();
return EnumActionResult.SUCCESS;
}
} else {
if (currentEditing == null) {
VolumeBox bestVolumeBox = null;
double bestDist = Double.MAX_VALUE;
BlockPos editing = null;
for (VolumeBox volumeBox : volumeBoxes.volumeBoxes.stream().filter(box -> box.getLockTargetsStream().noneMatch(Lock.Target.TargetResize.class::isInstance)).collect(Collectors.toList())) {
for (BlockPos p : PositionUtil.getCorners(volumeBox.box.min(), volumeBox.box.max())) {
RayTraceResult ray = new AxisAlignedBB(p).calculateIntercept(start, end);
if (ray != null) {
double dist = ray.hitVec.distanceTo(start);
if (bestDist > dist) {
bestDist = dist;
bestVolumeBox = volumeBox;
editing = p;
}
}
}
}
if (bestVolumeBox != null) {
bestVolumeBox.setPlayer(player);
BlockPos min = bestVolumeBox.box.min();
BlockPos max = bestVolumeBox.box.max();
BlockPos held = min;
if (editing.getX() == min.getX()) {
held = VecUtil.replaceValue(held, EnumFacing.Axis.X, max.getX());
}
if (editing.getY() == min.getY()) {
held = VecUtil.replaceValue(held, EnumFacing.Axis.Y, max.getY());
}
if (editing.getZ() == min.getZ()) {
held = VecUtil.replaceValue(held, EnumFacing.Axis.Z, max.getZ());
}
bestVolumeBox.setHeldDistOldMinOldMax(held, Math.max(1.5, bestDist + 0.5), bestVolumeBox.box.min(), bestVolumeBox.box.max());
volumeBoxes.markDirty();
return EnumActionResult.SUCCESS;
}
} else {
currentEditing.confirmEditing();
volumeBoxes.markDirty();
return EnumActionResult.SUCCESS;
}
}
return EnumActionResult.FAIL;
}
use of buildcraft.core.marker.volume.VolumeBox in project BuildCraft by BuildCraft.
the class TileArchitectTable method onPlacedBy.
@Override
public void onPlacedBy(EntityLivingBase placer, ItemStack stack) {
super.onPlacedBy(placer, stack);
if (placer.world.isRemote) {
return;
}
WorldSavedDataVolumeBoxes volumeBoxes = WorldSavedDataVolumeBoxes.get(world);
IBlockState blockState = world.getBlockState(pos);
BlockPos offsetPos = pos.offset(blockState.getValue(BlockArchitectTable.PROP_FACING).getOpposite());
VolumeBox volumeBox = volumeBoxes.getVolumeBoxAt(offsetPos);
TileEntity tile = world.getTileEntity(offsetPos);
if (volumeBox != null) {
box.reset();
box.setMin(volumeBox.box.min());
box.setMax(volumeBox.box.max());
isValid = true;
volumeBox.locks.add(new Lock(new Lock.Cause.CauseBlock(pos, blockState.getBlock()), new Lock.Target.TargetRemove(), new Lock.Target.TargetResize(), new Lock.Target.TargetUsedByMachine(Lock.Target.TargetUsedByMachine.EnumType.STRIPES_READ)));
volumeBoxes.markDirty();
sendNetworkUpdate(NET_BOX);
} else if (tile instanceof IAreaProvider) {
IAreaProvider provider = (IAreaProvider) tile;
box.reset();
box.setMin(provider.min());
box.setMax(provider.max());
markerBox = true;
isValid = true;
provider.removeFromWorld();
} else {
isValid = false;
IBlockState state = world.getBlockState(pos);
state = state.withProperty(BlockArchitectTable.PROP_VALID, Boolean.FALSE);
world.setBlockState(pos, state);
}
}
use of buildcraft.core.marker.volume.VolumeBox in project BuildCraft by BuildCraft.
the class ItemVolumeBox method onItemUse.
@Override
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
if (world.isRemote) {
return EnumActionResult.PASS;
}
BlockPos offset = pos.offset(facing);
WorldSavedDataVolumeBoxes volumeBoxes = WorldSavedDataVolumeBoxes.get(world);
VolumeBox current = volumeBoxes.getVolumeBoxAt(offset);
if (current == null) {
volumeBoxes.addVolumeBox(offset);
volumeBoxes.markDirty();
return EnumActionResult.SUCCESS;
}
return EnumActionResult.FAIL;
}
use of buildcraft.core.marker.volume.VolumeBox in project BuildCraft by BuildCraft.
the class TileFiller method onPlacedBy.
@Override
public void onPlacedBy(EntityLivingBase placer, ItemStack stack) {
super.onPlacedBy(placer, stack);
if (world.isRemote) {
return;
}
IBlockState blockState = world.getBlockState(pos);
WorldSavedDataVolumeBoxes volumeBoxes = WorldSavedDataVolumeBoxes.get(world);
BlockPos offsetPos = pos.offset(blockState.getValue(BlockBCBase_Neptune.PROP_FACING).getOpposite());
VolumeBox volumeBox = volumeBoxes.getVolumeBoxAt(offsetPos);
TileEntity tile = world.getTileEntity(offsetPos);
if (volumeBox != null) {
addon = (AddonFillerPlanner) volumeBox.addons.values().stream().filter(AddonFillerPlanner.class::isInstance).findFirst().orElse(null);
if (addon != null) {
volumeBox.locks.add(new Lock(new Lock.Cause.CauseBlock(pos, blockState.getBlock()), new Lock.Target.TargetAddon(addon.getSlot()), new Lock.Target.TargetRemove(), new Lock.Target.TargetResize(), new Lock.Target.TargetUsedByMachine(Lock.Target.TargetUsedByMachine.EnumType.STRIPES_WRITE)));
volumeBoxes.markDirty();
addon.updateBuildingInfo();
markerBox = false;
} else {
box.reset();
box.setMin(volumeBox.box.min());
box.setMax(volumeBox.box.max());
volumeBox.locks.add(new Lock(new Lock.Cause.CauseBlock(pos, blockState.getBlock()), new Lock.Target.TargetRemove(), new Lock.Target.TargetResize(), new Lock.Target.TargetUsedByMachine(Lock.Target.TargetUsedByMachine.EnumType.STRIPES_WRITE)));
volumeBoxes.markDirty();
markerBox = false;
}
} else if (tile instanceof IAreaProvider) {
IAreaProvider provider = (IAreaProvider) tile;
box.reset();
box.setMin(provider.min());
box.setMax(provider.max());
provider.removeFromWorld();
}
updateBuildingInfo();
sendNetworkUpdate(NET_RENDER_DATA);
}
Aggregations