use of buildcraft.core.marker.volume.EnumAddonSlot 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;
}
Aggregations