package joshie.progression.criteria.filters.location;
import joshie.progression.Progression;
import joshie.progression.api.special.ICustomDescription;
import joshie.progression.api.special.IEnum;
import joshie.progression.lib.WorldLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.math.BlockPos;
import static joshie.progression.criteria.filters.location.FilterLocationBase.LocationOperator.*;
public abstract class FilterRandomCoordinate extends FilterLocationBase implements ICustomDescription, IEnum {
public LocationOperator operator = LocationOperator.RADIUS;
public int coordinate = 8;
public int distance = 32;
public String coordstring;
public FilterRandomCoordinate(String name) {
this.coordstring = name;
}
@Override
public String getDescription() {
return Progression.format("filter.location." + coordstring + "description", coordinate);
}
public boolean isInCircle(int coord) {
for(int i = -distance; i <= distance; i++) {
for (int k = -distance; k <= distance; k++) {
int position = i * i + k * k;
if (position >= (distance + 0.50f) * (distance + 0.50f)) {
continue; //Outside of the circle?
}
if (coord >= -position && coord <= +position) return true;
}
}
return false;
}
@Override
public WorldLocation getRandom(EntityPlayer player) {
int random = 0;
if (operator == THISORMORE) random = distance >= 1 ? player.worldObj.rand.nextInt(distance): random;
else if (operator == THISORLESS) random = distance >= 1 ? - player.worldObj.rand.nextInt(distance): random;
else if (operator == RADIUS) random = distance >= 1 ? player.worldObj.rand.nextInt(distance * 2) - distance : 0;
return new WorldLocation(player.dimension, getLocation(player, random));
}
public abstract BlockPos getLocation(EntityPlayer player, int random);
public abstract int getCoordinate(WorldLocation location);
@Override
public boolean matches(WorldLocation location) {
int check = getCoordinate(location);
if (operator == THISORMORE) return check >= coordinate - distance;
else if (operator == THISORLESS) return check <= coordinate + distance;
else if (operator == RADIUS) {
if (check < coordinate - distance || check > coordinate + distance) return false;
return true; //Now we return true as we aren't outside the defined boundary
}
return false;
}
@Override
public Enum next(String name) {
int id = operator.ordinal() + 1;
if (id < LocationOperator.values().length) {
return LocationOperator.values()[id];
}
return LocationOperator.values()[0];
}
@Override
public boolean isEnum(String name) {
return name.equals("operator");
}
}