package de.take_weiland.mods.commons.internal; import com.google.common.collect.ImmutableList; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import com.google.common.reflect.Reflection; import cpw.mods.fml.client.FMLFileResourcePack; import cpw.mods.fml.client.FMLFolderResourcePack; import cpw.mods.fml.common.*; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLStateEvent; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.TickRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import de.take_weiland.mods.commons.internal.client.ClientProxy; import de.take_weiland.mods.commons.internal.exclude.ClassInfoUtil; import de.take_weiland.mods.commons.internal.sync.PacketSync; import de.take_weiland.mods.commons.internal.sync.builtin.BuiltinSyncers; import de.take_weiland.mods.commons.internal.tonbt.ToNbtFactories; import de.take_weiland.mods.commons.internal.tonbt.builtin.DefaultNBTSerializers; import de.take_weiland.mods.commons.net.Network; import de.take_weiland.mods.commons.net.PacketHandler; import de.take_weiland.mods.commons.sync.Syncing; import de.take_weiland.mods.commons.util.Logging; import de.take_weiland.mods.commons.util.Scheduler; import net.minecraftforge.common.Configuration; import java.io.File; import java.util.ArrayList; import java.util.EnumMap; import java.util.EnumSet; import java.util.List; import java.util.logging.Logger; public final class SevenCommons extends DummyModContainer { public static final Logger LOGGER = Logging.getLogger("SevenCommons"); public static final String VERSION = "1.0"; public static long clientMainThreadID; public static SevenCommonsProxy proxy; public static SevenCommons instance; // @GetProperty(comment = "Set to false to disable the auto-updating feature of SevenCommons") // TODO public static boolean updaterEnabled = true; public static PacketHandler packets; public static final int SYNC_PACKET_ID = 0; private static EnumMap<LoaderState.ModState, List<Runnable>> stateCallbacks = new EnumMap<>(LoaderState.ModState.class); private static EnumSet<LoaderState.ModState> reachedStates = EnumSet.noneOf(LoaderState.ModState.class); public SevenCommons() { super(new ModMetadata()); ModMetadata meta = getMetadata(); meta.name = "SevenCommons"; meta.modId = "sevencommons"; meta.authorList = ImmutableList.of("diesieben07"); meta.version = VERSION; meta.description = "Provides various Utilities for other mods."; meta.autogenerated = false; instance = this; } @Override public boolean registerBus(EventBus bus, LoadController controller) { bus.register(this); return true; } @SideOnly(Side.CLIENT) @Subscribe public void clientPreInit(FMLPreInitializationEvent event) { proxy = new ClientProxy(); clientMainThreadID = Thread.currentThread().getId(); universalPreInit(event); } @SideOnly(Side.SERVER) @Subscribe public void serverPreInit(FMLPreInitializationEvent event) { proxy = new ServerProxy(); universalPreInit(event); } public void universalPreInit(FMLPreInitializationEvent event) { Configuration config = new Configuration(event.getSuggestedConfigurationFile()); packets = Network.newChannel("SevenCommons") .register(PacketSync.class, SYNC_PACKET_ID) .register(PacketInventoryName.class) .register(PacketContainerButton.class) .build(); ClassInfoUtil.preInit(); // initialize the lazy statics in the scheduler class Reflection.initialize(Scheduler.class); TickRegistry.registerTickHandler(new SCPlayerTicker(), Side.SERVER); GameRegistry.registerPlayerTracker(new SCPlayerTracker()); proxy.preInit(event); Syncing.registerFactory(Object.class, new BuiltinSyncers()); ToNbtFactories.registerFactory(Object.class, new DefaultNBTSerializers()); } @Override public File getSource() { return SevenCommonsLoader.source; } @Override public Class<?> getCustomResourcePackClass() { return getSource().isDirectory() ? FMLFolderResourcePack.class : FMLFileResourcePack.class; } @Subscribe public void doStateCallback(FMLStateEvent event) { synchronized (SevenCommons.class) { if (stateCallbacks != null) { List<Runnable> list = stateCallbacks.remove(event.getModState()); if (list != null) { for (Runnable runnable : list) { runnable.run(); } } reachedStates.add(event.getModState()); if (event.getModState() == LoaderState.ModState.POSTINITIALIZED) { stateCallbacks = null; reachedStates = null; } } } } public static void registerStateCallback(LoaderState.ModState state, Runnable callback) { synchronized (SevenCommons.class) { if (stateCallbacks == null || reachedStates.contains(state)) { callback.run(); } else { List<Runnable> list = stateCallbacks.get(state); if (list == null) { stateCallbacks.put(state, list = new ArrayList<>()); } list.add(callback); } } } }