/** * Helper to attach a given object to the mod container event bus. * * @param obj Object to register. */ private void attachToContainerEventBus(Object obj) { ModContainer cnt = Loader.instance().activeModContainer(); log.debug("Attaching [" + obj + "] to event bus for container [" + cnt + "]"); try { FMLModContainer mc = (FMLModContainer)cnt; Field ebf = mc.getClass().getDeclaredField("eventBus"); boolean access = ebf.isAccessible(); ebf.setAccessible(true); EventBus eb = (EventBus)ebf.get(mc); ebf.setAccessible(access); eb.register(obj); } catch (NoSuchFieldException nsfe) { throw new RuntimeException("Pulsar >> Incompatible FML mod container (missing eventBus field) - wrong Forge version?"); } catch (IllegalAccessException iae) { throw new RuntimeException("Pulsar >> Security Manager blocked access to eventBus on mod container. Cannot continue."); } catch (ClassCastException cce) { throw new RuntimeException("Pulsar >> Something in the mod container had the wrong type? " + cce.getMessage()); } }
/** * Get a version.properties file as a {@link Properties} object from the mod file. * This can be used to load build-type information * such as a unique version number from a properties file shipped as part of the distributable. * @return A properties object if one exists, else null */ public Properties getVersionProperties() { if (this.modContainer instanceof FMLModContainer) { return ((FMLModContainer)this.modContainer).searchForVersionProperties(); } return null; }
@SuppressWarnings("unchecked") private static void addModEventHandlerMethods(FMLModContainer modContainer) { ListMultimap<Class<? extends FMLEvent>, Method> methodMap = getModEventMap(modContainer); for(Method method : METHODS) { Class<? extends FMLEvent> paramClass = (Class<? extends FMLEvent>) method.getParameterTypes()[0]; methodMap.put(paramClass, method); } }
@SuppressWarnings("unchecked") private static ListMultimap<Class<? extends FMLEvent>, Method> getModEventMap(FMLModContainer modContainer) { try { return (ListMultimap<Class<? extends FMLEvent>, Method>) FIELD.get(modContainer); } catch(Exception e) { e.printStackTrace(); //Should not ever happen throw new RuntimeException("CAUGHT ERROR WHEN TRYING TO RETRIEVE FMLMODCONTAINER EVENT METHODS MAP"); } }
private static Field getField() { Field[] fields = FMLModContainer.class.getDeclaredFields(); for(Field field : fields) { if(field.getType() == ListMultimap.class) { field.setAccessible(true); return field; } } //Should not ever happen throw new RuntimeException("COULD NOT RETRIEVE FMLMODCONTAINER EVENT METHODS FIELD"); }
public static void doHack(InfinityMod instance) { Loader.instance().getModList().stream() .filter(modContainer -> modContainer instanceof FMLModContainer) .filter(modContainer -> modContainer.getModId().equals(instance.getModId())) .forEach(modContainer -> addModEventHandlerMethods((FMLModContainer) modContainer)); }