package amidst.minecraft;
import java.lang.reflect.Field;
import amidst.logging.Log;
public class MinecraftProperty {
private String name, internalName;
private MinecraftClass parent;
private Field property;
private boolean isMinecraftClass = true;
private MinecraftClass type;
public MinecraftProperty(MinecraftClass parent, String name, String propertyName) {
this.parent = parent;
this.name = name;
this.internalName = propertyName;
}
@Override
public String toString() {
return "[Method " + name +" (" + internalName +") of class " + parent.getName() + "]";
}
public String getName() {
return name;
}
public String getInternalName() {
return internalName;
}
public void setValue(Object obj, Object val) {
try {
property.set(obj, val);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public void load(Minecraft mc, MinecraftClass mcClass) {
Class<?> clazz = mcClass.getClazz();
try {
property = clazz.getDeclaredField(internalName);
String propType = property.getType().getName();
if (propType.contains(".")) {
String[] typeSplit = propType.split("\\.");
propType = typeSplit[typeSplit.length-1];
}
type = mc.getClassByType(propType);
if (type == null)
isMinecraftClass = false;
property.setAccessible(true);
} catch (SecurityException e) {
Log.crash(e, "SecurityException on (" + mcClass.getName() + " / " + mcClass.getClassName() + ") property (" + name + " / " + internalName +")");
e.printStackTrace();
} catch (NoSuchFieldException e) {
Log.crash(e, "Unable to find class property (" + mcClass.getName() + " / " + mcClass.getClassName() + ") (" + name + " / " + internalName +")");
e.printStackTrace();
}
}
public Object getValue(MinecraftObject mcObject) {
Object object = mcObject.get();
Object value = getValue(object);
if (isMinecraftClass)
return new MinecraftObject(type, value);
return value;
}
public Object getStaticValue() {
Object value = getValue((Object)null);
if (isMinecraftClass) {
return new MinecraftObject(type, value);
}
return value;
}
private Object getValue(Object obj) {
try {
return property.get(obj);
} catch (IllegalArgumentException e) { // TODO : Add error text.
e.printStackTrace();
Log.crash(e, "Error [IllegalArgumentException] loading property (" + toString() + ")");
} catch (IllegalAccessException e) {
e.printStackTrace();
Log.crash(e, "Error [IllegalAccessException] loading property (" + toString() + ")");
}
return null;
}
public String getParentName() {
return parent.getName();
}
}