package jas.spawner.modern.spawner.creature.handler.parsing.settings;
import jas.common.JASLog;
import jas.spawner.modern.spawner.creature.handler.parsing.TypeValuePair;
import jas.spawner.modern.spawner.creature.handler.parsing.keys.Key;
import jas.spawner.modern.spawner.creature.handler.parsing.keys.KeyParser.KeyType;
import java.util.EnumSet;
import net.minecraft.entity.EntityLiving;
import net.minecraft.world.World;
/**
* For style see {@link OptionalSettings}
*/
public abstract class OptionalSettingsBase extends OptionalSettings {
public static int defaultBlockRange = 3;
public static int defaultSpawnRate = 40;
public OptionalSettingsBase(String parseableString, EnumSet<Key> validKeys) {
super(parseableString, validKeys);
parseString();
}
@Override
public boolean isOptionalEnabled() {
return isEnabled;
}
@Override
public boolean isInverted() {
return isInverted;
}
@Override
protected final void parseString() {
if (stringParsed || parseableString.equals("")) {
return;
}
stringParsed = true;
String[] masterParts = parseableString.split(":");
for (int i = 0; i < masterParts.length; i++) {
if (i == 0) {
for (Key key : validKeys) {
if (key.keyParser == null || key.keyParser.getKeyType() != KeyType.PARENT) {
continue;
}
if (key.keyParser.isMatch(masterParts[i])) {
isEnabled = true;
if (key.keyParser.isInvertable() && key.keyParser.isInverted(masterParts[i])) {
isInverted = true;
} else {
isInverted = false;
}
/* The isOperand operation is not needed since isMatch return false for invalid characters */
operand = key.keyParser.parseOperand(masterParts[i]);
}
}
} else {
String[] childParts = masterParts[i].split(",", 2);
boolean foundMatch = false;
for (Key key : validKeys) {
if (key.keyParser == null) {
continue;
}
if (key.keyParser.isMatch(childParts[0])) {
foundMatch = true;
if (key.keyParser.getKeyType() == KeyType.CHAINABLE) {
if (!key.keyParser.parseChainable(masterParts[i], parsedChainable, operandvalue)) {
JASLog.log().severe("Failed to Parse Chainable from %s", masterParts[i]);
}
} else if (key.keyParser.getKeyType() == KeyType.VALUE) {
if (!key.keyParser.parseValue(masterParts[i], valueCache)) {
JASLog.log().severe("Failed to Parse Value from %s", masterParts[i]);
}
}
break;
}
}
if (!foundMatch) {
JASLog.log().severe("Could Not Recognize any valid %s properties from %s", this.getClass()
.getSimpleName(), masterParts[i]);
}
}
}
}
/**
*
* @param world World being evaluated
* @param entity Entity being processed. May be null where not applicable.
* @param xCoord X coord location in the world
* @param yCoord Y coord location in the world
* @param zCoord Z coord location in the world
* @return
*/
public boolean isValidLocation(World world, EntityLiving entity, int xCoord, int yCoord, int zCoord) {
boolean outcome = true;
for (int i = 0; i < parsedChainable.size(); i++) {
TypeValuePair typeValuePair = parsedChainable.get(i);
if (i != 0) {
if (operandvalue.get(i) == Operand.AND && outcome == true) {
continue;
} else if (operandvalue.get(i) == Operand.OR && outcome == false) {
return false;
}
}
Key key = typeValuePair.getType();
outcome = key.keyParser.isValidLocation(world, entity, xCoord, yCoord, zCoord, typeValuePair, valueCache);
}
return outcome;
}
/**
* Checks if the Distance to
*
* @param playerDistance Distance to the playe rin [m^2]
* @param defaultCutoff Default Range in [m]
* @return True to Continue as Normal, False to Interrupt
*/
public boolean isMidDistance(int playerDistance, int defaultCutoff) {
parseString();
Integer tempCutoff = (Integer) valueCache.get(Key.spawnRange.key);
defaultCutoff = tempCutoff == null ? defaultCutoff : tempCutoff;
return playerDistance > defaultCutoff * defaultCutoff;
}
protected boolean canBlockSeeTheSky(World world, int xCoord, int yCoord, int zCoord) {
int blockHeight = world.getTopSolidOrLiquidBlock(xCoord, zCoord);
return blockHeight <= yCoord;
}
}