package jas.spawner.modern.spawner.creature.handler.parsing.keys;
import jas.common.JASLog;
import jas.spawner.modern.spawner.creature.handler.parsing.ParsingHelper;
import jas.spawner.modern.spawner.creature.handler.parsing.TypeValuePair;
import jas.spawner.modern.spawner.creature.handler.parsing.settings.OptionalSettings;
import jas.spawner.modern.spawner.creature.handler.parsing.settings.OptionalSettings.Operand;
import java.util.ArrayList;
import java.util.HashMap;
import net.minecraft.entity.EntityLiving;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
public class KeyParserSolidSide extends KeyParserBase {
public KeyParserSolidSide(Key key) {
super(key, true, KeyType.CHAINABLE);
}
@Override
public boolean parseChainable(String parseable, ArrayList<TypeValuePair> parsedChainable,
ArrayList<Operand> operandvalue) {
boolean isInverted = false;
if (isInverted(parseable)) {
isInverted = true;
}
String[] pieces = parseable.split(",");
Operand operand = parseOperand(pieces);
TypeValuePair typeValue = null;
if (pieces.length == 3 || pieces.length == 4) {
int side = ParsingHelper.parseFilteredInteger(pieces[1], 0, "side");
int rangeX, rangeY, rangeZ;
rangeX = rangeY = rangeZ = 0;
String[] rangePieces = pieces[2].split("/");
if (rangePieces.length == 3) {
rangeX = ParsingHelper.parseFilteredInteger(rangePieces[0], 0, key.key + "BlockRangeX");
rangeY = ParsingHelper.parseFilteredInteger(rangePieces[1], 0, key.key + "BlockRangeY");
rangeZ = ParsingHelper.parseFilteredInteger(rangePieces[2], 0, key.key + "BlockRangeZ");
} else if (rangePieces.length == 1) {
rangeX = ParsingHelper.parseFilteredInteger(rangePieces[0], 0, key.key + "BlockRange");
rangeY = rangeX;
rangeZ = rangeX;
} else {
JASLog.log().severe("Error Parsing Range of %s. Invalid Argument Length of %s.", key.key,
rangePieces.length);
}
if (pieces.length == 4) {
String[] offsetPieces = pieces[3].split("/");
int offsetX = ParsingHelper.parseFilteredInteger(offsetPieces[0], 0, key.key + "OffsetX");
int offsetY = ParsingHelper.parseFilteredInteger(offsetPieces[1], 0, key.key + "OffsetY");
int offsetZ = ParsingHelper.parseFilteredInteger(offsetPieces[2], 0, key.key + "OffsetZ");
typeValue = new TypeValuePair(key, new Object[] { isInverted, side, rangeX, rangeY, rangeZ, offsetX,
offsetY, offsetZ });
} else {
typeValue = new TypeValuePair(key, new Object[] { isInverted, side, rangeX, rangeY, rangeZ });
}
} else {
JASLog.log().severe("Error Parsing %s Block Parameter. Invalid Argument Length of %s.", key.key,
pieces.length);
return false;
}
if (typeValue != null && typeValue.getValue() != null) {
parsedChainable.add(typeValue);
operandvalue.add(operand);
return true;
}
return false;
}
@Override
public boolean parseValue(String parseable, HashMap<String, Object> valueCache) {
throw new UnsupportedOperationException();
}
@Override
public boolean isValidLocation(World world, EntityLiving entity, int xCoord, int yCoord, int zCoord,
TypeValuePair typeValuePair, HashMap<String, Object> valueCache) {
Object[] values = (Object[]) typeValuePair.getValue();
boolean isInverted = (Boolean) values[0];
int side = (Integer) values[1];
if (values.length == 5 || values.length == 8) {
int rangeX = (Integer) values[2];
int rangeY = (Integer) values[3];
int rangeZ = (Integer) values[4];
int offsetX, offsetY, offsetZ;
offsetX = offsetY = offsetZ = 0;
if (values.length == 8) {
offsetX = (Integer) values[5];
offsetY = (Integer) values[6];
offsetZ = (Integer) values[7];
}
for (int i = -rangeX; i <= rangeX; i++) {
for (int k = -rangeZ; k <= rangeZ; k++) {
for (int j = -rangeY; j <= rangeY; j++) {
boolean isSolid = world.getBlock(xCoord + offsetX + i, yCoord + offsetY + j,
zCoord + offsetZ + k).isSideSolid(world, xCoord + offsetX + i, yCoord + offsetY + j,
zCoord + offsetZ + k, ForgeDirection.getOrientation(side));
if (!isInverted && isSolid || isInverted && !isSolid) {
return false;
}
}
}
}
}
return true;
}
@Override
public String toExpression(String parseable) {
ArrayList<TypeValuePair> parsedChainable = new ArrayList<TypeValuePair>();
ArrayList<Operand> operandvalue = new ArrayList<OptionalSettings.Operand>();
boolean parsedSuccessfully = parseChainable(parseable, parsedChainable, operandvalue);
Object[] values = (Object[]) parsedChainable.get(0).getValue();
int side = (Integer) values[1];
if (values.length == 5 || values.length == 8) {
int rangeX = (Integer) values[2];
int rangeY = (Integer) values[3];
int rangeZ = (Integer) values[4];
int offsetX, offsetY, offsetZ;
offsetX = offsetY = offsetZ = 0;
if (values.length == 8) {
offsetX = (Integer) values[5];
offsetY = (Integer) values[6];
offsetZ = (Integer) values[7];
}
StringBuilder expBuilder = new StringBuilder(15);
expBuilder.append("solidside(").append(side);
expBuilder.append(",{").append(rangeX).append(",").append(rangeY).append(",").append(rangeZ).append("}");
expBuilder.append(",{").append(offsetX).append(",").append(offsetY).append(",").append(offsetZ).append("}");
expBuilder.append(")");
return expBuilder.toString();
}
return "";
}
}