This should do the job ;)
public static RS2Object getClosest(Script script, String name, String action, Integer minDistance, Integer maxDistance, Area mandatoryArea, Area illegalArea, Position mandatoryPosition, Position illegalPosition, boolean mustBeReachable) {
RS2Object closestObject = null;
double lowestDistance = Double.MAX_VALUE;
List<RS2Object> objectList = script.objects.getAll();
int size = objectList.size();
int index = 0;
for (RS2Object object : objectList) {
index++;
if (object == null) {
continue;
}
if (!object.exists()) {
continue;
}
if (!object.getName().toLowerCase().equalsIgnoreCase(name)) {
continue;
}
if (object.getDefinition() == null) {
continue;
}
if (!Arrays.asList(object.getDefinition().getActions()).contains(action)) {
continue;
}
if (minDistance != null && object.getPosition().distance(script.myPosition()) < minDistance) {
continue;
}
if (maxDistance != null && object.getPosition().distance(script.myPosition()) > maxDistance) {
continue;
}
if (mandatoryArea != null && !mandatoryArea.contains(object.getPosition())) {
continue;
}
if (illegalArea != null && illegalArea.contains(object.getPosition())) {
continue;
}
if (mandatoryPosition != null && !object.getPosition().equals(mandatoryPosition)) {
continue;
}
if (illegalPosition != null && object.getPosition().equals(illegalPosition)) {
continue;
}
if (mustBeReachable && !script.map.canReach(object)) {
continue;
}
if (object.getPosition().distance(script.myPosition()) < lowestDistance) {
closestObject = object;
lowestDistance = object.getPosition().distance(script.myPosition());
}
if (object.getPosition().distance(script.myPosition()) == lowestDistance) {
if (new Random().nextInt(size - index + 1) == 0) {
closestObject = object;
lowestDistance = object.getPosition().distance(script.myPosition());
}
}
}
return closestObject;
}