package openmods.network.event; import com.google.common.base.Preconditions; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.LoaderState; import openmods.datastore.DataStoreBuilder; import openmods.datastore.IDataVisitor; import openmods.network.IdSyncManager; import openmods.utils.io.TypeRW; public class NetworkEventManager { public static class RegistrationContext { private int currentId = 0; private final DataStoreBuilder<String, Integer> builder; private RegistrationContext() { this.builder = IdSyncManager.INSTANCE.createDataStore("events", String.class, Integer.class); this.builder.setDefaultKeyReaderWriter(); this.builder.setValueReaderWriter(TypeRW.VLI_SERIALIZABLE); } public RegistrationContext register(Class<? extends NetworkEvent> cls) { Preconditions.checkState(Loader.instance().isInState(LoaderState.PREINITIALIZATION), "This method can only be called in pre-initialization state"); builder.addEntry(cls.getName(), currentId++); return this; } void register(IDataVisitor<String, Integer> eventIdVisitor) { builder.addVisitor(eventIdVisitor); builder.register(); } } private NetworkEventManager() {} public static final NetworkEventManager INSTANCE = new NetworkEventManager(); private final NetworkEventRegistry registry = new NetworkEventRegistry(); private final NetworkEventDispatcher dispatcher = new NetworkEventDispatcher(registry); private RegistrationContext registrationContext = new RegistrationContext(); public RegistrationContext startRegistration() { Preconditions.checkState(Loader.instance().isInState(LoaderState.PREINITIALIZATION), "This method can only be called in pre-initialization state"); return registrationContext; } public void finalizeRegistration() { registrationContext.register(registry); registrationContext = null; } public NetworkEventDispatcher dispatcher() { return dispatcher; } }