Check some method signatures with MCAccess implementations.

Minimum safeguard: Check the getMinX etc. methods for proper signatures,
to avoid use with mods that have incomplete CraftBukkit mappings.
This commit is contained in:
asofold 2013-07-13 09:52:06 +02:00
parent c30105d6b7
commit c00117a0ad
10 changed files with 44 additions and 0 deletions

View File

@ -26,6 +26,31 @@ public class ReflectionUtil {
}
}
/**
* Check for the given names if the method returns the desired type of result (exact check).
* @param methodNames
* @param returnType
*/
public static void checkMethodReturnTypesNoArgs(Class<?> objClass, String[] methodNames, Class<?> returnType){
// TODO: Add check: boolean isStatic.
try {
for (String methodName : methodNames){
Method m = objClass.getMethod(methodName);
if (m.getParameterTypes().length != 0){
throw new RuntimeException("Expect method without arguments for " + objClass.getName() + "." + methodName);
}
if (m.getReturnType() != returnType){
throw new RuntimeException("Wrong return type for: " + objClass.getName() + "." + methodName);
}
}
} catch (SecurityException e) {
// Let this one pass.
//throw new RuntimeException(e);
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
/**
* Dirty method to call a declared method with a generic parameter type. Does try.catch and return null insome cases for method invocation. Purpose for this is generic factory registration, having methods with type Object alongside methods with more specialized types.
* @param obj

View File

@ -33,6 +33,8 @@ public class MCAccessCB2511 implements MCAccess {
getCommandMap();
ReflectionUtil.checkMembers("net.minecraft.server.", new String[]{"Entity" , "dead"});
ReflectionUtil.checkMembers("net.minecraft.server.", new String[]{"EntityPlayer" , "netServerHandler"});
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.Block.class,
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
}
@Override

View File

@ -31,6 +31,8 @@ public class MCAccessCB2512 implements MCAccess{
public MCAccessCB2512(){
getCommandMap();
ReflectionUtil.checkMembers("net.minecraft.server.v1_4_5.", new String[]{"Entity" , "dead"});
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_4_5.Block.class,
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
}
@Override

View File

@ -31,6 +31,8 @@ public class MCAccessCB2545 implements MCAccess{
public MCAccessCB2545(){
getCommandMap();
ReflectionUtil.checkMembers("net.minecraft.server.v1_4_6.", new String[]{"Entity" , "dead"});
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_4_6.Block.class,
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
}
@Override

View File

@ -31,6 +31,8 @@ public class MCAccessCB2602 implements MCAccess{
public MCAccessCB2602(){
getCommandMap();
ReflectionUtil.checkMembers("net.minecraft.server.v1_4_R1.", new String[]{"Entity" , "dead"});
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_4_R1.Block.class,
new String[]{"v", "w", "x", "y", "z", "A"}, double.class);
}
@Override

View File

@ -31,6 +31,8 @@ public class MCAccessCB2645 implements MCAccess{
public MCAccessCB2645(){
getCommandMap();
ReflectionUtil.checkMembers("net.minecraft.server.v1_5_R1.", new String[]{"Entity" , "dead"});
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_5_R1.Block.class,
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
}
@Override

View File

@ -31,6 +31,8 @@ public class MCAccessCB2691 implements MCAccess{
public MCAccessCB2691(){
getCommandMap();
ReflectionUtil.checkMembers("net.minecraft.server.v1_5_R2.", new String[]{"Entity" , "dead"});
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_5_R2.Block.class,
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
}
@Override

View File

@ -31,6 +31,8 @@ public class MCAccessCB2763 implements MCAccess{
public MCAccessCB2763(){
getCommandMap();
ReflectionUtil.checkMembers("net.minecraft.server.v1_5_R3.", new String[]{"Entity" , "dead"});
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_5_R3.Block.class,
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
}
@Override

View File

@ -31,6 +31,8 @@ public class MCAccessCB2794 implements MCAccess{
public MCAccessCB2794(){
getCommandMap();
ReflectionUtil.checkMembers("net.minecraft.server.v1_6_R1.", new String[]{"Entity" , "dead"});
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_6_R1.Block.class,
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
}
@Override

View File

@ -31,6 +31,9 @@ public class MCAccessCBDev implements MCAccess{
public MCAccessCBDev(){
getCommandMap();
ReflectionUtil.checkMembers("net.minecraft.server.v1_6_R2.", new String[]{"Entity" , "dead"});
ReflectionUtil.checkMethodReturnTypesNoArgs(net.minecraft.server.v1_6_R2.Block.class,
new String[]{"u", "v", "w", "x", "y", "z"}, double.class);
// TODO: Nail it down further.
}
@Override