package miscperipherals.external;
import miscperipherals.safe.Reflector;
import mods.railcraft.api.tracks.ITrackInstance;
import dan200.computer.api.IComputerAccess;
public abstract class ExtTrackNumber extends ExtTrack {
private final String field;
private final Class fieldType;
private final int min;
private final int max;
public ExtTrackNumber(ITrackInstance track, String field, Class fieldType, int min, int max) {
super(track);
this.field = field;
this.fieldType = fieldType;
this.min = min;
this.max = max;
}
@Override
public abstract String getType();
@Override
public String[] getMethodNames() {
return new String[] {"get", "set"};
}
@Override
public Object[] callMethod(IComputerAccess computer, int method, Object[] arguments) throws Exception {
switch (method) {
case 0: {
if (arguments.length < 1) throw new Exception("too few arguments");
else if (!(arguments[0] instanceof Double)) throw new Exception("bad argument #1 (expected number)");
int num = (int)Math.floor((Double)arguments[0]);
if (num < min || num > max) throw new Exception("invalid value "+num+" (expected "+min+"-"+max+")");
Reflector.setField(track, field, Reflector.construct(fieldType.getName(), fieldType, Integer.toString(num)));
return callMethod(computer, 1, arguments);
}
case 1: {
return new Object[] {Reflector.getField(track, field, fieldType)};
}
}
return null;
}
}