public <T> T getFieldValue(String fieldName, Object instance, Class<T> type) throws IllegalAccessException { return type.cast(getField(fieldName).get(instance)); }
public <T> T invokeMethod(Class<T> type, String methodName, Object instance, Object... args) throws InvocationTargetException, IllegalAccessException { return type.cast(getMethod(methodName).invoke(instance, args)); }
private void scanFields(Class<?> host, boolean recursive) { if (host.getSuperclass() != null && recursive) { scanFields(host.getSuperclass(), true); } for (Field field : host.getDeclaredFields()) { field.setAccessible(true); fields.put(field.getName(), field); } }
List<Object> list = Lists.newArrayList(); try { int[] xcoords = mapChunkBulkRef.getFieldValue("a", packet, int[].class); int[] zcoords = mapChunkBulkRef.getFieldValue("b", packet, int[].class); Object[] chunkMaps = mapChunkBulkRef.getFieldValue("c", packet, Object[].class); Object world = mapChunkBulkRef.getFieldValue("world", packet, Object.class); Object spigotConfig = ReflectionUtil.getPublic(world, "spigotConfig", Object.class); Object antiXrayInstance = ReflectionUtil.getPublic(spigotConfig, "antiXrayInstance", Object.class); int z = zcoords[i]; Object chunkMap = chunkMaps[i]; Object chunkPacket = mapChunkRef.newInstance(); mapChunkRef.setFieldValue("a", chunkPacket, x); mapChunkRef.setFieldValue("b", chunkPacket, z); mapChunkRef.setFieldValue("c", chunkPacket, chunkMap); mapChunkRef.setFieldValue("d", chunkPacket, true); // Chunk bulk chunks are always ground-up
@Override public List<Object> transformMapChunkBulk(Object packet, ClientChunks clientChunks) { List<Object> list = Lists.newArrayList(); try { int[] xcoords = mapChunkBulkRef.getFieldValue("field_149266_a", packet, int[].class); int[] zcoords = mapChunkBulkRef.getFieldValue("field_149264_b", packet, int[].class); Object[] chunkMaps = mapChunkBulkRef.getFieldValue("field_179755_c", packet, Object[].class); for (int i = 0; i < chunkMaps.length; i++) { int x = xcoords[i]; int z = zcoords[i]; Object chunkMap = chunkMaps[i]; Object chunkPacket = mapChunkRef.newInstance(); mapChunkRef.setFieldValue("field_149284_a", chunkPacket, x); mapChunkRef.setFieldValue("field_149282_b", chunkPacket, z); mapChunkRef.setFieldValue("field_179758_c", chunkPacket, chunkMap); mapChunkRef.setFieldValue("field_149279_g", chunkPacket, true); // Chunk bulk chunks are always ground-up clientChunks.getBulkChunks().add(ClientChunks.toLong(x, z)); // Store for later list.add(chunkPacket); } } catch (Exception e) { Via.getPlatform().getLogger().log(Level.WARNING, "Failed to transform chunks bulk", e); } return list; }
public void setFieldValue(String fieldName, Object instance, Object value) throws IllegalAccessException { getField(fieldName).set(instance, value); }
private void scanMethods(Class<?> host, boolean recursive) { if (host.getSuperclass() != null && recursive) { scanMethods(host.getSuperclass(), true); } for (Method method : host.getDeclaredMethods()) { method.setAccessible(true); methods.put(method.getName(), method); } }
public ClassReflection(Class<?> handle, boolean recursive) { this.handle = handle; scanFields(handle, recursive); scanMethods(handle, recursive); }