From baa9dfe55a683bf64a80d1537fa352be94bbec2c Mon Sep 17 00:00:00 2001 From: cpw Date: Fri, 15 Jun 2018 15:03:35 -0400 Subject: [PATCH] Things. they work. Obviously still WAY more to do. --- .../client/gui/ForgeGuiFactory.java | 2 +- .../common/ForgeChunkManager.java | 2 +- .../net/minecraftforge/common/ForgeHooks.java | 2 +- .../common/crafting/CraftingHelper.java | 2 +- .../minecraftforge/event/RegistryEvent.java | 2 +- .../minecraftforge/fluids/FluidRegistry.java | 2 +- .../fml/AutomaticEventSubscriber.java | 73 +++++++++ .../fml/DefaultModContainers.java | 47 +----- .../net/minecraftforge/fml/LaunchTesting.java | 1 + .../fml/LifecycleEventProvider.java | 16 +- .../fml/{language => }/ModContainer.java | 29 +++- .../java/net/minecraftforge/fml/ModList.java | 114 ++++++++++++++ .../net/minecraftforge/fml/ModLoader.java | 79 ++++++++++ .../{loading => }/ModLoadingClassLoader.java | 15 +- .../minecraftforge/fml/ModLoadingStage.java | 52 +++++++ .../minecraftforge/fml/ModThreadContext.java | 2 - .../net/minecraftforge/fml/SidedExecutor.java | 15 +- .../minecraftforge/fml/VersionChecker.java | 1 - .../fml/client/ClientModLoader.java | 4 +- .../fml/client/ConfigGuiHandler.java | 6 +- .../fml/client/DefaultGuiFactory.java | 2 +- .../fml/client/FMLClientHandler.java | 2 +- .../fml/client/FMLFileResourcePack.java | 2 +- .../fml/client/FMLFolderResourcePack.java | 2 +- .../fml/client/GuiDupesFound.java | 2 +- .../fml/client/GuiSortingProblem.java | 2 +- .../fml/client/TextureTracker.java | 2 +- .../fml/client/config/GuiConfigEntries.java | 2 +- .../fml/client/gui/GuiModList.java | 4 +- .../fml/common/AutomaticEventSubscriber.java | 94 ------------ .../fml/common/FMLCommonHandler.java | 2 +- .../fml/common/FMLContainer.java | 8 +- .../fml/common/FMLContainerHolder.java | 2 +- .../fml/common/IFMLSidedHandler.java | 2 +- .../fml/common/ILanguageAdapter.java | 2 +- .../fml/common/LoadController.java | 8 +- .../net/minecraftforge/fml/common/Loader.java | 4 +- .../net/minecraftforge/fml/common/Mod.java | 25 +-- .../fml/common/ModContainerFactory.java | 2 +- .../fml/common/ModMetadata.java | 2 +- .../fml/common/ProxyInjector.java | 2 +- .../WrongMinecraftVersionException.java | 1 + .../fml/common/discovery/ASMDataTable.java | 2 +- .../fml/common/discovery/ContainerType.java | 2 +- .../common/discovery/DirectoryDiscoverer.java | 2 +- .../fml/common/discovery/ITypeDiscoverer.java | 2 +- .../fml/common/discovery/JarDiscoverer.java | 2 +- .../fml/common/discovery/ModCandidate.java | 2 +- .../fml/common/discovery/ModDiscoverer.java | 2 +- .../common/event/FMLConstructionEvent.java | 65 -------- .../event/FMLFingerprintViolationEvent.java | 5 +- .../common/event/FMLInitializationEvent.java | 15 +- .../fml/common/event/FMLInterModComms.java | 32 ++-- .../common/event/FMLLoadCompleteEvent.java | 16 +- .../fml/common/event/FMLModDisabledEvent.java | 23 --- .../common/event/FMLModIdMappingEvent.java | 3 +- .../event/FMLPostInitializationEvent.java | 51 +------ .../event/FMLPreInitializationEvent.java | 142 +----------------- .../fml/common/event/FMLStateEvent.java | 14 +- .../{FMLEvent.java => ModLifecycleEvent.java} | 19 +-- .../common/network/FMLEmbeddedChannel.java | 8 +- .../fml/common/network/NetworkRegistry.java | 8 +- .../handshake/ChannelRegistrationHandler.java | 19 +++ .../handshake/FMLHandshakeMessage.java | 2 +- .../network/internal/EntitySpawnHandler.java | 2 +- .../common/network/internal/FMLMessage.java | 2 +- .../network/internal/FMLNetworkHandler.java | 2 +- .../network/internal/NetworkModHolder.java | 4 +- .../network/simpleimpl/MessageContext.java | 2 +- .../SimpleChannelHandlerWrapper.java | 2 +- .../simpleimpl/SimpleNetworkWrapper.java | 2 +- .../common/registry/EntityEntryBuilder.java | 2 +- .../fml/common/registry/EntityRegistry.java | 2 +- .../fml/common/toposort/ModSorter.java | 2 +- .../common/toposort/ModSortingException.java | 2 +- .../fml/common/toposort/TopologicalSort.java | 86 +++++++---- .../FMLJavaModLanguageProvider.java | 24 ++- .../fml/javafmlmod/FMLModContainer.java | 99 +++++++----- .../ModLoadingContext.java} | 24 ++- .../ExtensionPoint.java} | 19 ++- .../minecraftforge/fml/language/IModInfo.java | 5 + .../fml/language/IModLanguageProvider.java | 4 +- .../fml/loading/DefaultModInfos.java | 64 ++++++++ .../loading/FMLDevClientLaunchProvider.java | 5 + .../minecraftforge/fml/loading/FMLLoader.java | 22 +-- .../{ModList.java => LoadingModList.java} | 27 ++-- .../fml/loading/ModJarURLHandler.java | 2 +- .../minecraftforge/fml/loading/ModLoader.java | 60 -------- .../minecraftforge/fml/loading/ModSorter.java | 57 +++++-- .../moddiscovery/BackgroundScanHandler.java | 12 +- .../loading/moddiscovery/ModDiscoverer.java | 10 +- .../fml/loading/moddiscovery/ModFile.java | 12 -- .../fml/server/FMLServerHandler.java | 2 +- .../minecraftforge/oredict/OreDictionary.java | 2 +- .../debug/util/ModNameTooltip.java | 2 +- 95 files changed, 852 insertions(+), 786 deletions(-) create mode 100644 src/main/java/net/minecraftforge/fml/AutomaticEventSubscriber.java rename src/main/java/net/minecraftforge/fml/{language => }/ModContainer.java (77%) create mode 100644 src/main/java/net/minecraftforge/fml/ModList.java create mode 100644 src/main/java/net/minecraftforge/fml/ModLoader.java rename src/main/java/net/minecraftforge/fml/{loading => }/ModLoadingClassLoader.java (85%) create mode 100644 src/main/java/net/minecraftforge/fml/ModLoadingStage.java delete mode 100644 src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java delete mode 100644 src/main/java/net/minecraftforge/fml/common/event/FMLConstructionEvent.java delete mode 100644 src/main/java/net/minecraftforge/fml/common/event/FMLModDisabledEvent.java rename src/main/java/net/minecraftforge/fml/common/event/{FMLEvent.java => ModLifecycleEvent.java} (67%) rename src/main/java/net/minecraftforge/fml/{loading/ModLoadingStage.java => javafmlmod/ModLoadingContext.java} (51%) rename src/main/java/net/minecraftforge/fml/{common/event/FMLLoadEvent.java => language/ExtensionPoint.java} (59%) create mode 100644 src/main/java/net/minecraftforge/fml/loading/DefaultModInfos.java rename src/main/java/net/minecraftforge/fml/loading/{ModList.java => LoadingModList.java} (82%) delete mode 100644 src/main/java/net/minecraftforge/fml/loading/ModLoader.java diff --git a/src/main/java/net/minecraftforge/client/gui/ForgeGuiFactory.java b/src/main/java/net/minecraftforge/client/gui/ForgeGuiFactory.java index 30c8c3dcde..1472198f50 100644 --- a/src/main/java/net/minecraftforge/client/gui/ForgeGuiFactory.java +++ b/src/main/java/net/minecraftforge/client/gui/ForgeGuiFactory.java @@ -49,7 +49,7 @@ import net.minecraftforge.fml.client.config.GuiConfigEntries.SelectValueEntry; import net.minecraftforge.fml.client.config.GuiConfigEntries.BooleanEntry; import net.minecraftforge.fml.client.config.IConfigElement; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import static net.minecraftforge.common.ForgeModContainer.VERSION_CHECK_CAT; /** diff --git a/src/main/java/net/minecraftforge/common/ForgeChunkManager.java b/src/main/java/net/minecraftforge/common/ForgeChunkManager.java index caa5312175..678f8beb8b 100644 --- a/src/main/java/net/minecraftforge/common/ForgeChunkManager.java +++ b/src/main/java/net/minecraftforge/common/ForgeChunkManager.java @@ -52,7 +52,7 @@ import net.minecraftforge.common.util.Constants; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; diff --git a/src/main/java/net/minecraftforge/common/ForgeHooks.java b/src/main/java/net/minecraftforge/common/ForgeHooks.java index 6b47560aa7..54f2c3627b 100644 --- a/src/main/java/net/minecraftforge/common/ForgeHooks.java +++ b/src/main/java/net/minecraftforge/common/ForgeHooks.java @@ -145,7 +145,7 @@ import net.minecraftforge.fluids.IFluidBlock; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.LoaderState; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.ConnectionType; import net.minecraftforge.fml.common.registry.ForgeRegistries; diff --git a/src/main/java/net/minecraftforge/common/crafting/CraftingHelper.java b/src/main/java/net/minecraftforge/common/crafting/CraftingHelper.java index d2d5340964..c102755bab 100644 --- a/src/main/java/net/minecraftforge/common/crafting/CraftingHelper.java +++ b/src/main/java/net/minecraftforge/common/crafting/CraftingHelper.java @@ -71,7 +71,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreIngredient; diff --git a/src/main/java/net/minecraftforge/event/RegistryEvent.java b/src/main/java/net/minecraftforge/event/RegistryEvent.java index 7202c81900..57be95ae50 100644 --- a/src/main/java/net/minecraftforge/event/RegistryEvent.java +++ b/src/main/java/net/minecraftforge/event/RegistryEvent.java @@ -26,7 +26,7 @@ import org.apache.commons.lang3.Validate; import com.google.common.collect.ImmutableList; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.eventbus.api.GenericEvent; import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistryEntry; diff --git a/src/main/java/net/minecraftforge/fluids/FluidRegistry.java b/src/main/java/net/minecraftforge/fluids/FluidRegistry.java index c18df371d7..bb3b7c4806 100644 --- a/src/main/java/net/minecraftforge/fluids/FluidRegistry.java +++ b/src/main/java/net/minecraftforge/fluids/FluidRegistry.java @@ -46,7 +46,7 @@ import com.google.common.collect.Sets; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.registries.IRegistryDelegate; diff --git a/src/main/java/net/minecraftforge/fml/AutomaticEventSubscriber.java b/src/main/java/net/minecraftforge/fml/AutomaticEventSubscriber.java new file mode 100644 index 0000000000..5e44b02e3b --- /dev/null +++ b/src/main/java/net/minecraftforge/fml/AutomaticEventSubscriber.java @@ -0,0 +1,73 @@ +/* + * Minecraft Forge + * Copyright (c) 2018. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.fml; + +import net.minecraftforge.api.Side; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.ModContainer; +import net.minecraftforge.fml.language.ModFileScanData; +import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.fml.loading.moddiscovery.ModAnnotation; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.objectweb.asm.Type; + +import java.util.EnumSet; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import static net.minecraftforge.fml.Logging.LOADING; + +/** + * Automatic eventbus subscriber - reads {@link net.minecraftforge.fml.common.Mod.EventBusSubscriber} + * annotations and passes the class instances to the {@link net.minecraftforge.common.MinecraftForge.EVENT_BUS} + */ +public class AutomaticEventSubscriber +{ + private static final Logger LOGGER = LogManager.getLogger("FML"); + public static void inject(final ModContainer mod, final ModFileScanData scanData, final ClassLoader loader) + { + LOGGER.debug(LOADING,"Attempting to inject @EventBusSubscriber classes into the eventbus for {}", mod.getModId()); + List ebsTargets = scanData.getAnnotations().stream(). + filter(annotationData -> Objects.equals(annotationData.getAnnotationType(), Type.getType(Mod.EventBusSubscriber.class))). + collect(Collectors.toList()); + + ebsTargets.forEach(ad -> { + final List sidesValue = (List)ad.getAnnotationData().get("value"); + final EnumSet sides = sidesValue.stream().map(eh -> Side.valueOf(eh.getValue())). + collect(Collectors.toCollection(() -> EnumSet.noneOf(Side.class))); + final String modId = (String)ad.getAnnotationData().getOrDefault("modId", mod.getModId()); + if (Objects.equals(mod.getModId(), modId) && sides.contains(FMLEnvironment.side)) { + try + { + MinecraftForge.EVENT_BUS.register(Class.forName(ad.getClassType().getClassName(), true, loader)); + } + catch (ClassNotFoundException e) + { + LOGGER.error(LOADING, "Failed to load mod class {} for @EventBusSubscriber annotation", ad.getClassType(), e); + throw new RuntimeException(e); + } + } + }); + } + +} diff --git a/src/main/java/net/minecraftforge/fml/DefaultModContainers.java b/src/main/java/net/minecraftforge/fml/DefaultModContainers.java index 8327235384..68aa799ada 100644 --- a/src/main/java/net/minecraftforge/fml/DefaultModContainers.java +++ b/src/main/java/net/minecraftforge/fml/DefaultModContainers.java @@ -19,53 +19,14 @@ package net.minecraftforge.fml; -import com.electronwill.nightconfig.core.path.PathConfig; -import net.minecraftforge.fml.language.ModContainer; -import net.minecraftforge.fml.language.IModInfo; -import net.minecraftforge.fml.loading.moddiscovery.ModInfo; - -import java.net.URISyntaxException; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.List; +import net.minecraftforge.fml.loading.DefaultModInfos; public class DefaultModContainers { - static { - PathConfig minecraftmod; - PathConfig forgemod; - try - { - minecraftmod = PathConfig.of(Paths.get(DefaultModContainers.class.getClassLoader().getResource("minecraftmod.toml").toURI())); - forgemod = PathConfig.of(Paths.get(DefaultModContainers.class.getClassLoader().getResource("forgemod.toml").toURI())); - minecraftmod.load(); - forgemod.load(); - } - catch (URISyntaxException | NullPointerException e) - { - throw new RuntimeException("Missing toml configs for minecraft and forge!", e); - } - minecraftModInfo = new ModInfo(null, minecraftmod); - forgeModInfo = new ModInfo(null, forgemod); - - } - - private static final IModInfo minecraftModInfo; - private static final IModInfo forgeModInfo; - - // no construction - private DefaultModContainers() {} - - public static List getModInfos() - { - return Arrays.asList(minecraftModInfo, forgeModInfo); - } - - - public static final ModContainer MINECRAFT = new ModContainer(minecraftModInfo) + public static final ModContainer MINECRAFT = new ModContainer(DefaultModInfos.minecraftModInfo) { @Override - public boolean matches(Object mod) + public boolean matches(final Object mod) { return mod == this; } @@ -76,4 +37,4 @@ public class DefaultModContainers return this; } }; -} \ No newline at end of file +} diff --git a/src/main/java/net/minecraftforge/fml/LaunchTesting.java b/src/main/java/net/minecraftforge/fml/LaunchTesting.java index 66c9147a65..5de4a32561 100644 --- a/src/main/java/net/minecraftforge/fml/LaunchTesting.java +++ b/src/main/java/net/minecraftforge/fml/LaunchTesting.java @@ -59,6 +59,7 @@ public class LaunchTesting logcontext.getConfiguration().addFilter(axformFilter); logcontext.getConfiguration().addFilter(eventbusFilter); logcontext.updateLoggers(); + System.setProperty("fml.explodedDir", "/home/cpw/projects/mods/inventorysorter/classes"); hackNatives(); Launcher.main("--launchTarget", "devfmlclient","--gameDir", "projects/run", "--accessToken", "blah", "--version", "FMLDev", "--assetIndex", "1.12", diff --git a/src/main/java/net/minecraftforge/fml/LifecycleEventProvider.java b/src/main/java/net/minecraftforge/fml/LifecycleEventProvider.java index 2e3fa4a180..e140013f16 100644 --- a/src/main/java/net/minecraftforge/fml/LifecycleEventProvider.java +++ b/src/main/java/net/minecraftforge/fml/LifecycleEventProvider.java @@ -20,18 +20,18 @@ package net.minecraftforge.fml; import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.fml.loading.ModList; -import net.minecraftforge.fml.loading.ModLoadingStage; +import net.minecraftforge.fml.common.event.ModLifecycleEvent; +import net.minecraftforge.fml.javafmlmod.FMLModContainer; import java.util.function.Supplier; public enum LifecycleEventProvider { LOAD(()->new LifecycleEvent(ModLoadingStage.BEGIN)), - PREINIT(()->new LifecycleEvent(ModLoadingStage.PREINIT)); + CONSTRUCT(()->new LifecycleEvent(ModLoadingStage.CONSTRUCT)); - public void dispatch(final ModList target) { - target.dispatchLifeCycleEvent(this.event.get()); + public void dispatch() { + ModList.get().dispatchLifeCycleEvent(this.event.get()); } private final Supplier event; @@ -41,7 +41,7 @@ public enum LifecycleEventProvider } - public static class LifecycleEvent extends Event { + public static class LifecycleEvent { private final ModLoadingStage stage; public LifecycleEvent(ModLoadingStage stage) @@ -59,5 +59,9 @@ public enum LifecycleEventProvider return ModLoadingStage.values()[this.stage.ordinal()+1]; } + public ModLifecycleEvent buildModEvent(FMLModContainer fmlModContainer) + { + return stage.getModEvent(fmlModContainer); + } } } diff --git a/src/main/java/net/minecraftforge/fml/language/ModContainer.java b/src/main/java/net/minecraftforge/fml/ModContainer.java similarity index 77% rename from src/main/java/net/minecraftforge/fml/language/ModContainer.java rename to src/main/java/net/minecraftforge/fml/ModContainer.java index 42d11db1b8..88c6017671 100644 --- a/src/main/java/net/minecraftforge/fml/language/ModContainer.java +++ b/src/main/java/net/minecraftforge/fml/ModContainer.java @@ -17,14 +17,19 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package net.minecraftforge.fml.language; +package net.minecraftforge.fml; -import net.minecraftforge.fml.LifecycleEventProvider; -import net.minecraftforge.fml.loading.ModLoadingStage; +import net.minecraftforge.fml.language.ExtensionPoint; +import net.minecraftforge.fml.language.IModInfo; +import java.util.ArrayList; import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.Consumer; +import java.util.function.Supplier; /** * The container that wraps around mods in the system. @@ -45,11 +50,15 @@ public abstract class ModContainer protected final IModInfo modInfo; protected ModLoadingStage modLoadingStage; protected final Map> triggerMap; + protected final Map> extensionPoints = new IdentityHashMap<>(); + protected final List modLoadingError; + public ModContainer(IModInfo info) { this.modId = info.getModId(); this.modInfo = info; this.triggerMap = new HashMap<>(); + this.modLoadingError = new ArrayList<>(); this.modLoadingStage = ModLoadingStage.BEGIN; } @@ -83,7 +92,7 @@ public abstract class ModContainer */ public final void transitionState(LifecycleEventProvider.LifecycleEvent event) { - if (modLoadingStage != event.fromStage()) + if (modLoadingStage == event.fromStage()) { try { @@ -105,6 +114,16 @@ public abstract class ModContainer return modInfo; } + @SuppressWarnings("unchecked") + public Optional getCustomExtension(ExtensionPoint point) { + return Optional.ofNullable((T)extensionPoints.getOrDefault(point,()-> null).get()); + } + + public void registerExtensionPoint(ExtensionPoint point, Supplier extension) + { + extensionPoints.put(point, extension); + } + /** * Does this mod match the supplied mod? * @@ -117,6 +136,4 @@ public abstract class ModContainer * @return the mod object instance */ public abstract Object getMod(); - - public abstract T getCustomExtension(final String name); } diff --git a/src/main/java/net/minecraftforge/fml/ModList.java b/src/main/java/net/minecraftforge/fml/ModList.java new file mode 100644 index 0000000000..89eadb5122 --- /dev/null +++ b/src/main/java/net/minecraftforge/fml/ModList.java @@ -0,0 +1,114 @@ +/* + * Minecraft Forge + * Copyright (c) 2018. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.fml; + +import com.google.common.collect.Streams; +import net.minecraftforge.fml.loading.DefaultModInfos; +import net.minecraftforge.fml.loading.moddiscovery.BackgroundScanHandler; +import net.minecraftforge.fml.loading.moddiscovery.ModFile; +import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; +import net.minecraftforge.fml.loading.moddiscovery.ModInfo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Master list of all mods + */ +public class ModList +{ + private static ModList INSTANCE; + private final List modFiles; + private final List sortedList; + private final Map fileById; + private BackgroundScanHandler scanner; + private List mods; + private Map indexedMods; + + private ModList(final List modFiles, final List sortedList) + { + this.modFiles = modFiles.stream().map(ModFile::getModFileInfo).map(ModFileInfo.class::cast).collect(Collectors.toList()); + this.sortedList = Streams.concat(DefaultModInfos.getModInfos().stream(), sortedList.stream()). + map(ModInfo.class::cast). + collect(Collectors.toList()); + this.fileById = this.modFiles.stream().map(ModFileInfo::getMods).flatMap(Collection::stream). + map(ModInfo.class::cast). + collect(Collectors.toMap(ModInfo::getModId, ModInfo::getOwningFile)); + } + + public static ModList of(List modFiles, List sortedList) + { + INSTANCE = new ModList(modFiles, sortedList); + return INSTANCE; + } + + public static ModList get() { + return INSTANCE; + } + + public List getModFiles() + { + return modFiles; + } + + + public ModFileInfo getModFileById(String modid) + { + return this.fileById.get(modid); + } + + public void dispatchLifeCycleEvent(LifecycleEventProvider.LifecycleEvent lifecycleEvent) { + this.mods.parallelStream().forEach(m->m.transitionState(lifecycleEvent)); + final List erroredContainers = this.mods.stream().filter(m -> m.getCurrentState() == ModLoadingStage.ERROR).collect(Collectors.toList()); + if (!erroredContainers.isEmpty()) { + throw new RuntimeException("Errored containers found!"); + } + } + + public void setLoadedMods(final List modContainers) + { + this.mods = modContainers; + this.indexedMods = modContainers.stream().collect(Collectors.toMap(ModContainer::getModId, Function.identity())); + } + + public Optional getModObjectById(String modId) + { + return getModContainerById(modId).map(ModContainer::getMod); + } + + public Optional getModContainerById(String modId) + { + return Optional.ofNullable(this.indexedMods.get(modId)); + } + + public List getMods() + { + return this.sortedList; + } + + public boolean isLoaded(String modTarget) + { + return this.indexedMods.containsKey(modTarget); + } +} diff --git a/src/main/java/net/minecraftforge/fml/ModLoader.java b/src/main/java/net/minecraftforge/fml/ModLoader.java new file mode 100644 index 0000000000..5cbdd24916 --- /dev/null +++ b/src/main/java/net/minecraftforge/fml/ModLoader.java @@ -0,0 +1,79 @@ +/* + * Minecraft Forge + * Copyright (c) 2018. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.fml; + +import net.minecraftforge.fml.language.IModInfo; +import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.fml.loading.LoadingModList; +import net.minecraftforge.fml.loading.moddiscovery.ModFile; +import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class ModLoader +{ + private static final Logger LOGGER = LogManager.getLogger("FML"); + private static ModLoader INSTANCE; + private final ClassLoader launchClassLoader; + private final LoadingModList loadingModList; + private final ModLoadingClassLoader modClassLoader; + + private ModLoader() + { + INSTANCE = this; + this.launchClassLoader = FMLLoader.getLaunchClassLoader(); + this.loadingModList = FMLLoader.getLoadingModList(); + this.modClassLoader = new ModLoadingClassLoader(this.launchClassLoader); + Thread.currentThread().setContextClassLoader(this.modClassLoader); + } + + public static ModLoader get() + { + return INSTANCE == null ? INSTANCE = new ModLoader() : INSTANCE; + } + + public void loadMods() { + final ModList modList = ModList.of(loadingModList.getModFiles().stream().map(ModFileInfo::getFile).collect(Collectors.toList()), loadingModList.getMods()); + modList.setLoadedMods(loadingModList.getModFiles().stream(). + map(ModFileInfo::getFile). + map(mf -> buildMods(mf, modClassLoader)). + flatMap(Collection::stream).collect(Collectors.toList())); + + LifecycleEventProvider.LOAD.dispatch(); + LifecycleEventProvider.CONSTRUCT.dispatch(); + } + + private List buildMods(final ModFile modFile, final ModLoadingClassLoader modClassLoader) + { + final Map modInfoMap = modFile.getModFileInfo().getMods().stream().collect(Collectors.toMap(IModInfo::getModId, Function.identity())); + + return modFile.getScanResult().getTargets().entrySet().stream(). + map(e->e.getValue().loadMod(modInfoMap.get(e.getKey()), modClassLoader, modFile.getScanResult())). + collect(Collectors.toList()); + } + + +} diff --git a/src/main/java/net/minecraftforge/fml/loading/ModLoadingClassLoader.java b/src/main/java/net/minecraftforge/fml/ModLoadingClassLoader.java similarity index 85% rename from src/main/java/net/minecraftforge/fml/loading/ModLoadingClassLoader.java rename to src/main/java/net/minecraftforge/fml/ModLoadingClassLoader.java index 161a22c084..d16a43619f 100644 --- a/src/main/java/net/minecraftforge/fml/loading/ModLoadingClassLoader.java +++ b/src/main/java/net/minecraftforge/fml/ModLoadingClassLoader.java @@ -17,15 +17,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package net.minecraftforge.fml.loading; +package net.minecraftforge.fml; +import net.minecraftforge.fml.loading.FMLLoader; import org.apache.logging.log4j.LogManager; import java.io.IOException; -import java.io.InputStream; import java.net.URL; -import java.net.URLConnection; -import java.net.URLStreamHandler; import java.nio.file.Files; import java.nio.file.Path; import java.security.SecureClassLoader; @@ -38,11 +36,8 @@ public class ModLoadingClassLoader extends SecureClassLoader ClassLoader.registerAsParallelCapable(); } - private ModLoader modLoader; - - protected ModLoadingClassLoader(ModLoader modLoader, ClassLoader parent) { + protected ModLoadingClassLoader(final ClassLoader parent) { super(parent); - this.modLoader = modLoader; } @Override @@ -56,7 +51,7 @@ public class ModLoadingClassLoader extends SecureClassLoader { LogManager.getLogger("FML").debug(LOADING, "Loading class {}", name); final String className = name.replace('.','/').concat(".class"); - final Path classResource = modLoader.getModList().findResource(className); + final Path classResource = FMLLoader.getLoadingModList().findResource(className); if (classResource != null) { try { final byte[] bytes = Files.readAllBytes(classResource); @@ -66,6 +61,8 @@ public class ModLoadingClassLoader extends SecureClassLoader { throw new ClassNotFoundException("Failed to load class file " + classResource + " for "+ className, e); } + } else { + getParent().loadClass(name); } throw new ClassNotFoundException("Failed to find class file "+ className); } diff --git a/src/main/java/net/minecraftforge/fml/ModLoadingStage.java b/src/main/java/net/minecraftforge/fml/ModLoadingStage.java new file mode 100644 index 0000000000..0b4c4f37df --- /dev/null +++ b/src/main/java/net/minecraftforge/fml/ModLoadingStage.java @@ -0,0 +1,52 @@ +/* + * Minecraft Forge + * Copyright (c) 2018. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.fml; + +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.ModLifecycleEvent; + +import java.util.function.Function; +import java.util.function.Supplier; + +public enum ModLoadingStage +{ + ERROR(null), + BEGIN(null), + CONSTRUCT(()->FMLPreInitializationEvent::new), + PREINIT(()->FMLInitializationEvent::new), + INIT(()->FMLPostInitializationEvent::new), + POSTINIT(()->FMLLoadCompleteEvent::new), + COMPLETE(null); + + private final Supplier> modLifecycleEventFunction; + + ModLoadingStage(Supplier> modLifecycleEventFunction) + { + this.modLifecycleEventFunction = modLifecycleEventFunction; + } + + public ModLifecycleEvent getModEvent(ModContainer fmlModContainer) + { + return modLifecycleEventFunction.get().apply(fmlModContainer); + } +} diff --git a/src/main/java/net/minecraftforge/fml/ModThreadContext.java b/src/main/java/net/minecraftforge/fml/ModThreadContext.java index d777afe8f4..90e0f6375e 100644 --- a/src/main/java/net/minecraftforge/fml/ModThreadContext.java +++ b/src/main/java/net/minecraftforge/fml/ModThreadContext.java @@ -19,8 +19,6 @@ package net.minecraftforge.fml; -import net.minecraftforge.fml.language.ModContainer; - public class ModThreadContext { private static ThreadLocal context = ThreadLocal.withInitial(ModThreadContext::new); diff --git a/src/main/java/net/minecraftforge/fml/SidedExecutor.java b/src/main/java/net/minecraftforge/fml/SidedExecutor.java index d77f59ee78..0de3117157 100644 --- a/src/main/java/net/minecraftforge/fml/SidedExecutor.java +++ b/src/main/java/net/minecraftforge/fml/SidedExecutor.java @@ -20,6 +20,7 @@ package net.minecraftforge.fml; import net.minecraftforge.api.Side; +import net.minecraftforge.fml.loading.FMLEnvironment; import java.util.concurrent.Callable; import java.util.function.Supplier; @@ -37,7 +38,7 @@ public final class SidedExecutor * @return The callable's result */ public static T runOn(Side side, Supplier> toRun) { - if (side == Side.CLIENT) { + if (side == FMLEnvironment.side) { try { return toRun.get().call(); @@ -49,4 +50,16 @@ public final class SidedExecutor } return null; } + + public static T runSided(Supplier> clientTarget, Supplier> serverTarget) { + switch (FMLEnvironment.side) + { + case CLIENT: + return clientTarget.get().get(); + case SERVER: + return serverTarget.get().get(); + default: + throw new IllegalArgumentException("UNSIDED?"); + } + } } diff --git a/src/main/java/net/minecraftforge/fml/VersionChecker.java b/src/main/java/net/minecraftforge/fml/VersionChecker.java index fad8b40465..abf24cfa19 100644 --- a/src/main/java/net/minecraftforge/fml/VersionChecker.java +++ b/src/main/java/net/minecraftforge/fml/VersionChecker.java @@ -19,7 +19,6 @@ package net.minecraftforge.fml; -import net.minecraftforge.fml.language.ModContainer; import net.minecraftforge.fml.common.versioning.ComparableVersion; import net.minecraftforge.fml.loading.moddiscovery.ModInfo; diff --git a/src/main/java/net/minecraftforge/fml/client/ClientModLoader.java b/src/main/java/net/minecraftforge/fml/client/ClientModLoader.java index 119466967f..7030dcf342 100644 --- a/src/main/java/net/minecraftforge/fml/client/ClientModLoader.java +++ b/src/main/java/net/minecraftforge/fml/client/ClientModLoader.java @@ -27,7 +27,7 @@ import net.minecraft.client.resources.IResourcePack; import net.minecraft.client.resources.data.MetadataSerializer; import net.minecraftforge.fml.SidedProvider; import net.minecraftforge.fml.VersionChecker; -import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.fml.ModLoader; import org.lwjgl.input.Mouse; import java.io.IOException; @@ -46,7 +46,7 @@ public class ClientModLoader { SidedProvider.setClient(()->minecraft); SplashProgress.start(); - FMLLoader.getModLoader().loadMods(); + ModLoader.get().loadMods(); minecraft.refreshResources(); } diff --git a/src/main/java/net/minecraftforge/fml/client/ConfigGuiHandler.java b/src/main/java/net/minecraftforge/fml/client/ConfigGuiHandler.java index 78bcc3f64d..f6fb16dcab 100644 --- a/src/main/java/net/minecraftforge/fml/client/ConfigGuiHandler.java +++ b/src/main/java/net/minecraftforge/fml/client/ConfigGuiHandler.java @@ -21,7 +21,8 @@ package net.minecraftforge.fml.client; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.fml.loading.ModList; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.language.ExtensionPoint; import net.minecraftforge.fml.loading.moddiscovery.ModInfo; import java.util.Optional; @@ -31,6 +32,7 @@ public class ConfigGuiHandler { public static Optional> getGuiFactoryFor(ModInfo selectedMod) { - return ModList.get().getModContainerById(selectedMod.getModId()).map(mc->mc.getCustomExtension("customGuiFactory")); + return ModList.get().getModContainerById(selectedMod.getModId()). + flatMap(mc -> mc.getCustomExtension(ExtensionPoint.GUIFACTORY)); } } diff --git a/src/main/java/net/minecraftforge/fml/client/DefaultGuiFactory.java b/src/main/java/net/minecraftforge/fml/client/DefaultGuiFactory.java index a092e66fe3..f4b1d7b6f2 100644 --- a/src/main/java/net/minecraftforge/fml/client/DefaultGuiFactory.java +++ b/src/main/java/net/minecraftforge/fml/client/DefaultGuiFactory.java @@ -24,7 +24,7 @@ import java.util.Set; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraftforge.fml.client.config.GuiConfig; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; public class DefaultGuiFactory implements IModGuiFactory { diff --git a/src/main/java/net/minecraftforge/fml/client/FMLClientHandler.java b/src/main/java/net/minecraftforge/fml/client/FMLClientHandler.java index 250856da86..373574688f 100644 --- a/src/main/java/net/minecraftforge/fml/client/FMLClientHandler.java +++ b/src/main/java/net/minecraftforge/fml/client/FMLClientHandler.java @@ -101,7 +101,7 @@ import net.minecraftforge.fml.common.LoaderException; import net.minecraftforge.fml.common.MetadataCollection; import net.minecraftforge.fml.common.MissingModsException; import net.minecraftforge.fml.common.MultipleModsErrored; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.ModMetadata; import net.minecraftforge.fml.common.StartupQuery; import net.minecraftforge.fml.common.WrongMinecraftVersionException; diff --git a/src/main/java/net/minecraftforge/fml/client/FMLFileResourcePack.java b/src/main/java/net/minecraftforge/fml/client/FMLFileResourcePack.java index 7e7954dbb9..c0cfec8eca 100644 --- a/src/main/java/net/minecraftforge/fml/client/FMLFileResourcePack.java +++ b/src/main/java/net/minecraftforge/fml/client/FMLFileResourcePack.java @@ -32,7 +32,7 @@ import javax.imageio.ImageIO; import net.minecraft.client.resources.FileResourcePack; import net.minecraftforge.fml.common.FMLContainerHolder; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; public class FMLFileResourcePack extends FileResourcePack implements FMLContainerHolder { diff --git a/src/main/java/net/minecraftforge/fml/client/FMLFolderResourcePack.java b/src/main/java/net/minecraftforge/fml/client/FMLFolderResourcePack.java index d0e4c70340..3890068151 100644 --- a/src/main/java/net/minecraftforge/fml/client/FMLFolderResourcePack.java +++ b/src/main/java/net/minecraftforge/fml/client/FMLFolderResourcePack.java @@ -32,7 +32,7 @@ import javax.imageio.ImageIO; import net.minecraft.client.resources.FolderResourcePack; import net.minecraftforge.fml.common.FMLContainerHolder; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; public class FMLFolderResourcePack extends FolderResourcePack implements FMLContainerHolder { diff --git a/src/main/java/net/minecraftforge/fml/client/GuiDupesFound.java b/src/main/java/net/minecraftforge/fml/client/GuiDupesFound.java index fc01e9adf4..4a26f51082 100644 --- a/src/main/java/net/minecraftforge/fml/client/GuiDupesFound.java +++ b/src/main/java/net/minecraftforge/fml/client/GuiDupesFound.java @@ -20,7 +20,7 @@ package net.minecraftforge.fml.client; import net.minecraftforge.fml.common.DuplicateModsFoundException; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import java.io.File; import java.util.Map.Entry; diff --git a/src/main/java/net/minecraftforge/fml/client/GuiSortingProblem.java b/src/main/java/net/minecraftforge/fml/client/GuiSortingProblem.java index bbf687397b..b9cbf904b8 100644 --- a/src/main/java/net/minecraftforge/fml/client/GuiSortingProblem.java +++ b/src/main/java/net/minecraftforge/fml/client/GuiSortingProblem.java @@ -20,7 +20,7 @@ package net.minecraftforge.fml.client; import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.toposort.ModSortingException; import net.minecraftforge.fml.common.toposort.ModSortingException.SortingExceptionData; diff --git a/src/main/java/net/minecraftforge/fml/client/TextureTracker.java b/src/main/java/net/minecraftforge/fml/client/TextureTracker.java index 79517f8566..db8f724904 100644 --- a/src/main/java/net/minecraftforge/fml/client/TextureTracker.java +++ b/src/main/java/net/minecraftforge/fml/client/TextureTracker.java @@ -33,7 +33,7 @@ import net.minecraft.client.resources.IResourcePack; import net.minecraft.client.resources.SimpleReloadableResourceManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.FMLContainerHolder; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/main/java/net/minecraftforge/fml/client/config/GuiConfigEntries.java b/src/main/java/net/minecraftforge/fml/client/config/GuiConfigEntries.java index 26ecbf35f4..f6b3af12db 100644 --- a/src/main/java/net/minecraftforge/fml/client/config/GuiConfigEntries.java +++ b/src/main/java/net/minecraftforge/fml/client/config/GuiConfigEntries.java @@ -37,7 +37,7 @@ import net.minecraft.client.resources.I18n; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import org.lwjgl.input.Keyboard; diff --git a/src/main/java/net/minecraftforge/fml/client/gui/GuiModList.java b/src/main/java/net/minecraftforge/fml/client/gui/GuiModList.java index da49410814..4e58d84b69 100644 --- a/src/main/java/net/minecraftforge/fml/client/gui/GuiModList.java +++ b/src/main/java/net/minecraftforge/fml/client/gui/GuiModList.java @@ -52,16 +52,16 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.VersionChecker; import net.minecraftforge.fml.client.ConfigGuiHandler; import net.minecraftforge.fml.client.ResourcePackLoader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.versioning.ComparableVersion; import static net.minecraft.util.StringUtils.stripControlCodes; import net.minecraftforge.fml.language.IModInfo; -import net.minecraftforge.fml.loading.ModList; import net.minecraftforge.fml.loading.StringUtils; import net.minecraftforge.fml.loading.moddiscovery.ModInfo; import org.apache.commons.lang3.tuple.Pair; diff --git a/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java b/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java deleted file mode 100644 index 2d8c7fd08c..0000000000 --- a/src/main/java/net/minecraftforge/fml/common/AutomaticEventSubscriber.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.fml.common; - -import com.google.common.base.Strings; -import com.google.common.collect.SetMultimap; - -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.discovery.ASMDataTable; -import net.minecraftforge.fml.common.discovery.ASMDataTable.ASMData; -import net.minecraftforge.fml.language.ModContainer; -import net.minecraftforge.fml.loading.moddiscovery.ModAnnotation; -import net.minecraftforge.fml.relauncher.Side; - -import java.util.EnumSet; -import java.util.List; -import java.util.Set; - -/** - * Automatic eventbus subscriber - reads {@link net.minecraftforge.fml.common.Mod.EventBusSubscriber} - * annotations and passes the class instances to the {@link net.minecraftforge.common.MinecraftForge.EVENT_BUS} - */ -public class AutomaticEventSubscriber -{ - private static final EnumSet DEFAULT = EnumSet.allOf(Side.class); - public static void inject(ModContainer mod, ASMDataTable data, Side side) - { - FMLLog.log.debug("Attempting to inject @EventBusSubscriber classes into the eventbus for {}", mod.getModId()); - SetMultimap modData = data.getAnnotationsFor(mod); - Set mods = modData.get(Mod.class.getName()); - Set targets = modData.get(Mod.EventBusSubscriber.class.getName()); - ClassLoader mcl = Loader.instance().getModClassLoader(); - - for (ASMDataTable.ASMData targ : targets) - { - try - { - //noinspection unchecked - @SuppressWarnings("unchecked") - List sidesEnum = (List)targ.getAnnotationInfo().get("value"); - EnumSet sides = DEFAULT; - if (sidesEnum != null) { - sides = EnumSet.noneOf(Side.class); - for (ModAnnotation.EnumHolder h: sidesEnum) { - sides.add(Side.valueOf(h.getValue())); - } - } - if (sides == DEFAULT || sides.contains(side)) { - //FMLLog.log.debug("Found @EventBusSubscriber class {}", targ.getClassName()); - String amodid = (String)targ.getAnnotationInfo().get("modid"); - if (Strings.isNullOrEmpty(amodid)) { - amodid = ASMDataTable.getOwnerModID(mods, targ); - if (Strings.isNullOrEmpty(amodid)) { - FMLLog.bigWarning("Could not determine owning mod for @EventBusSubscriber on {} for mod {}", targ.getClassName(), mod.getModId()); - continue; - } - } - if (!mod.getModId().equals(amodid)) - { - FMLLog.log.debug("Skipping @EventBusSubscriber injection for {} since it is not for mod {}", targ.getClassName(), mod.getModId()); - continue; //We're not injecting this guy - } - FMLLog.log.debug("Registering @EventBusSubscriber for {} for mod {}", targ.getClassName(), mod.getModId()); - Class subscriptionTarget = Class.forName(targ.getClassName(), false, mcl); - MinecraftForge.EVENT_BUS.register(subscriptionTarget); - FMLLog.log.debug("Injected @EventBusSubscriber class {}", targ.getClassName()); - } - } - catch (Throwable e) - { - FMLLog.log.error("An error occurred trying to load an EventBusSubscriber {} for modid {}", targ.getClassName(), mod.getModId(), e); - throw new LoaderException(e); - } - } - } - -} diff --git a/src/main/java/net/minecraftforge/fml/common/FMLCommonHandler.java b/src/main/java/net/minecraftforge/fml/common/FMLCommonHandler.java index 14c3621dda..a2fd9abcfd 100644 --- a/src/main/java/net/minecraftforge/fml/common/FMLCommonHandler.java +++ b/src/main/java/net/minecraftforge/fml/common/FMLCommonHandler.java @@ -62,7 +62,7 @@ import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; import net.minecraftforge.fml.common.network.FMLNetworkEvent; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.thread.SidedThreadGroup; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.server.FMLServerHandler; diff --git a/src/main/java/net/minecraftforge/fml/common/FMLContainer.java b/src/main/java/net/minecraftforge/fml/common/FMLContainer.java index 62c824eddf..999cd17276 100644 --- a/src/main/java/net/minecraftforge/fml/common/FMLContainer.java +++ b/src/main/java/net/minecraftforge/fml/common/FMLContainer.java @@ -38,7 +38,7 @@ import net.minecraftforge.fml.common.network.NetworkCheckHandler; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.internal.FMLNetworkHandler; import net.minecraftforge.fml.common.registry.ForgeRegistries; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.registries.ForgeRegistry; import net.minecraftforge.registries.GameData; @@ -119,7 +119,7 @@ public final class FMLContainer extends DummyModContainer implements WorldAccess mod.setString("ModVersion", mc.getVersion()); modList.appendTag(mod); } - fmlData.setTag("ModList", modList); + fmlData.setTag("LoadingModList", modList); NBTTagCompound registries = new NBTTagCompound(); fmlData.setTag("Registries", registries); @@ -135,9 +135,9 @@ public final class FMLContainer extends DummyModContainer implements WorldAccess @Override public void readData(SaveHandler handler, WorldInfo info, Map propertyMap, NBTTagCompound tag) { - if (tag.hasKey("ModList")) + if (tag.hasKey("LoadingModList")) { - NBTTagList modList = tag.getTagList("ModList", (byte)10); + NBTTagList modList = tag.getTagList("LoadingModList", (byte)10); for (int i = 0; i < modList.tagCount(); i++) { NBTTagCompound mod = modList.getCompoundTagAt(i); diff --git a/src/main/java/net/minecraftforge/fml/common/FMLContainerHolder.java b/src/main/java/net/minecraftforge/fml/common/FMLContainerHolder.java index 160f99f7d8..980511e3ee 100644 --- a/src/main/java/net/minecraftforge/fml/common/FMLContainerHolder.java +++ b/src/main/java/net/minecraftforge/fml/common/FMLContainerHolder.java @@ -19,7 +19,7 @@ package net.minecraftforge.fml.common; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; public interface FMLContainerHolder { diff --git a/src/main/java/net/minecraftforge/fml/common/IFMLSidedHandler.java b/src/main/java/net/minecraftforge/fml/common/IFMLSidedHandler.java index ac3fbeb1f7..d464e020b6 100644 --- a/src/main/java/net/minecraftforge/fml/common/IFMLSidedHandler.java +++ b/src/main/java/net/minecraftforge/fml/common/IFMLSidedHandler.java @@ -29,7 +29,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.util.IThreadListener; import net.minecraftforge.common.util.CompoundDataFixer; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.relauncher.Side; public interface IFMLSidedHandler diff --git a/src/main/java/net/minecraftforge/fml/common/ILanguageAdapter.java b/src/main/java/net/minecraftforge/fml/common/ILanguageAdapter.java index f6803629d3..904ea57bb4 100644 --- a/src/main/java/net/minecraftforge/fml/common/ILanguageAdapter.java +++ b/src/main/java/net/minecraftforge/fml/common/ILanguageAdapter.java @@ -24,7 +24,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import net.minecraftforge.fml.javafmlmod.FMLModContainer; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.relauncher.Side; public interface ILanguageAdapter { diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index d1d174ec41..689db26473 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -31,7 +31,7 @@ import java.util.stream.Stream; import net.minecraftforge.common.util.TextTable; import net.minecraftforge.fml.common.LoaderState.ModState; import net.minecraftforge.fml.common.ProgressManager.ProgressBar; -import net.minecraftforge.fml.common.event.FMLEvent; +import net.minecraftforge.fml.common.event.ModLifecycleEvent; import net.minecraftforge.fml.common.event.FMLLoadEvent; import net.minecraftforge.fml.common.event.FMLModDisabledEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @@ -39,7 +39,7 @@ import net.minecraftforge.fml.common.event.FMLStateEvent; import net.minecraftforge.fml.common.eventhandler.FMLThrowingEventBus; import net.minecraftforge.fml.common.versioning.ArtifactVersion; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.message.FormattedMessage; @@ -175,7 +175,7 @@ public class LoadController } @Subscribe - public void propogateStateMessage(FMLEvent stateEvent) + public void propogateStateMessage(ModLifecycleEvent stateEvent) { if (stateEvent instanceof FMLPreInitializationEvent) { @@ -190,7 +190,7 @@ public class LoadController ProgressManager.pop(bar); } - private void sendEventToModContainer(FMLEvent stateEvent, ModContainer mc) + private void sendEventToModContainer(ModLifecycleEvent stateEvent, ModContainer mc) { String modId = mc.getModId(); Collection requirements = mc.getRequirements().stream().map(ArtifactVersion::getLabel).collect(Collectors.toCollection(HashSet::new)); diff --git a/src/main/java/net/minecraftforge/fml/common/Loader.java b/src/main/java/net/minecraftforge/fml/common/Loader.java index 413f45fa5e..0084e8a018 100644 --- a/src/main/java/net/minecraftforge/fml/common/Loader.java +++ b/src/main/java/net/minecraftforge/fml/common/Loader.java @@ -42,8 +42,8 @@ import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.config.ConfigManager; import net.minecraftforge.common.crafting.CraftingHelper; import net.minecraftforge.fml.common.LoaderState.ModState; -import net.minecraftforge.fml.language.ModContainer; -import net.minecraftforge.fml.language.ModContainer.Disableable; +import net.minecraftforge.fml.ModContainer; +import net.minecraftforge.fml.ModContainer.Disableable; import net.minecraftforge.fml.common.ProgressManager.ProgressBar; import net.minecraftforge.fml.common.discovery.ASMDataTable; import net.minecraftforge.fml.common.discovery.ContainerType; diff --git a/src/main/java/net/minecraftforge/fml/common/Mod.java b/src/main/java/net/minecraftforge/fml/common/Mod.java index 4106fac54a..db8e6e132b 100644 --- a/src/main/java/net/minecraftforge/fml/common/Mod.java +++ b/src/main/java/net/minecraftforge/fml/common/Mod.java @@ -24,8 +24,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import net.minecraftforge.fml.client.IModGuiFactory; -import net.minecraftforge.fml.common.event.FMLEvent; +import net.minecraftforge.api.Side; +import net.minecraftforge.fml.common.event.ModLifecycleEvent; import net.minecraftforge.fml.common.event.FMLFingerprintViolationEvent; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLInterModComms; @@ -37,15 +37,12 @@ import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.event.FMLServerStoppedEvent; import net.minecraftforge.fml.common.event.FMLServerStoppingEvent; import net.minecraftforge.fml.common.event.FMLInterModComms.IMCEvent; -import net.minecraftforge.fml.common.network.NetworkCheckHandler; import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.fml.common.versioning.VersionRange; -import net.minecraftforge.fml.relauncher.Side; /** * This defines a Mod to FML. * Any class found with this annotation applied will be loaded as a Mod. The instance that is loaded will - * represent the mod to other Mods in the system. It will be sent various subclasses of {@link FMLEvent} + * represent the mod to other Mods in the system. It will be sent various subclasses of {@link ModLifecycleEvent} * at pre-defined times during the loading of the game, based on where you have applied the {@link EventHandler} * annotation. */ @@ -60,7 +57,7 @@ public @interface Mod * This will be used to identify your mod for third parties (other mods), it will be used to identify your mod for registries such as block and item registries. * By default, you will have a resource domain that matches the modid. All these uses require that constraints are imposed on the format of the modid. */ - String modid(); + String value(); /** * Marks the associated method as handling an FML lifecycle event. * The method must have a single parameter, one of the following types. This annotation @@ -105,20 +102,6 @@ public @interface Mod @Target(ElementType.METHOD) @interface EventHandler{} - /** - * Populate the annotated field with the mod instance based on the specified ModId. This can be used - * to retrieve instances of other mods. - * @author cpw - * - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(ElementType.FIELD) - @interface Instance { - /** - * The mod object to inject into this field - */ - String value() default ""; - } /** * A class which will be subscribed to {@link net.minecraftforge.common.MinecraftForge.EVENT_BUS} at mod construction time. */ diff --git a/src/main/java/net/minecraftforge/fml/common/ModContainerFactory.java b/src/main/java/net/minecraftforge/fml/common/ModContainerFactory.java index 60502eeb35..a35026fe9f 100644 --- a/src/main/java/net/minecraftforge/fml/common/ModContainerFactory.java +++ b/src/main/java/net/minecraftforge/fml/common/ModContainerFactory.java @@ -26,7 +26,7 @@ import java.util.Map; import net.minecraftforge.fml.common.discovery.ModCandidate; import net.minecraftforge.fml.common.discovery.asm.ASMModParser; import net.minecraftforge.fml.javafmlmod.FMLModContainer; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.loading.moddiscovery.ModAnnotation; import org.objectweb.asm.Type; diff --git a/src/main/java/net/minecraftforge/fml/common/ModMetadata.java b/src/main/java/net/minecraftforge/fml/common/ModMetadata.java index afed1b0afc..552c01fb6a 100644 --- a/src/main/java/net/minecraftforge/fml/common/ModMetadata.java +++ b/src/main/java/net/minecraftforge/fml/common/ModMetadata.java @@ -28,7 +28,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.gson.annotations.SerializedName; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; /** * @author cpw diff --git a/src/main/java/net/minecraftforge/fml/common/ProxyInjector.java b/src/main/java/net/minecraftforge/fml/common/ProxyInjector.java index c56489a077..caea6546b9 100644 --- a/src/main/java/net/minecraftforge/fml/common/ProxyInjector.java +++ b/src/main/java/net/minecraftforge/fml/common/ProxyInjector.java @@ -25,7 +25,7 @@ import java.util.Set; import net.minecraftforge.fml.common.discovery.ASMDataTable; import net.minecraftforge.fml.common.discovery.ASMDataTable.ASMData; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.relauncher.Side; import com.google.common.base.Strings; diff --git a/src/main/java/net/minecraftforge/fml/common/WrongMinecraftVersionException.java b/src/main/java/net/minecraftforge/fml/common/WrongMinecraftVersionException.java index acd0192f6b..0be678d939 100644 --- a/src/main/java/net/minecraftforge/fml/common/WrongMinecraftVersionException.java +++ b/src/main/java/net/minecraftforge/fml/common/WrongMinecraftVersionException.java @@ -24,6 +24,7 @@ import net.minecraftforge.fml.client.GuiWrongMinecraft; import net.minecraftforge.fml.client.IDisplayableError; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.fml.ModContainer; public class WrongMinecraftVersionException extends EnhancedRuntimeException implements IDisplayableError { diff --git a/src/main/java/net/minecraftforge/fml/common/discovery/ASMDataTable.java b/src/main/java/net/minecraftforge/fml/common/discovery/ASMDataTable.java index e3b6cb7a73..6b0fe983e1 100644 --- a/src/main/java/net/minecraftforge/fml/common/discovery/ASMDataTable.java +++ b/src/main/java/net/minecraftforge/fml/common/discovery/ASMDataTable.java @@ -34,7 +34,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.google.common.collect.SetMultimap; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; public class ASMDataTable { diff --git a/src/main/java/net/minecraftforge/fml/common/discovery/ContainerType.java b/src/main/java/net/minecraftforge/fml/common/discovery/ContainerType.java index c2f6c0b785..8d2d189481 100644 --- a/src/main/java/net/minecraftforge/fml/common/discovery/ContainerType.java +++ b/src/main/java/net/minecraftforge/fml/common/discovery/ContainerType.java @@ -21,7 +21,7 @@ package net.minecraftforge.fml.common.discovery; import java.util.List; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; public enum ContainerType { diff --git a/src/main/java/net/minecraftforge/fml/common/discovery/DirectoryDiscoverer.java b/src/main/java/net/minecraftforge/fml/common/discovery/DirectoryDiscoverer.java index c694a8cf41..62297306b9 100644 --- a/src/main/java/net/minecraftforge/fml/common/discovery/DirectoryDiscoverer.java +++ b/src/main/java/net/minecraftforge/fml/common/discovery/DirectoryDiscoverer.java @@ -30,7 +30,7 @@ import java.util.regex.Matcher; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.LoaderException; import net.minecraftforge.fml.common.MetadataCollection; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.ModContainerFactory; import net.minecraftforge.fml.common.discovery.asm.ASMModParser; diff --git a/src/main/java/net/minecraftforge/fml/common/discovery/ITypeDiscoverer.java b/src/main/java/net/minecraftforge/fml/common/discovery/ITypeDiscoverer.java index af93c9c614..54dabdd483 100644 --- a/src/main/java/net/minecraftforge/fml/common/discovery/ITypeDiscoverer.java +++ b/src/main/java/net/minecraftforge/fml/common/discovery/ITypeDiscoverer.java @@ -22,7 +22,7 @@ package net.minecraftforge.fml.common.discovery; import java.util.List; import java.util.regex.Pattern; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; public interface ITypeDiscoverer { diff --git a/src/main/java/net/minecraftforge/fml/common/discovery/JarDiscoverer.java b/src/main/java/net/minecraftforge/fml/common/discovery/JarDiscoverer.java index 7a4866f961..e25b15ce58 100644 --- a/src/main/java/net/minecraftforge/fml/common/discovery/JarDiscoverer.java +++ b/src/main/java/net/minecraftforge/fml/common/discovery/JarDiscoverer.java @@ -30,7 +30,7 @@ import java.util.jar.JarFile; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.LoaderException; import net.minecraftforge.fml.common.MetadataCollection; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.ModContainerFactory; import net.minecraftforge.fml.common.discovery.ASMDataTable.ASMData; import net.minecraftforge.fml.common.discovery.asm.ASMModParser; diff --git a/src/main/java/net/minecraftforge/fml/common/discovery/ModCandidate.java b/src/main/java/net/minecraftforge/fml/common/discovery/ModCandidate.java index 3505af0cf4..499bfcf7d1 100644 --- a/src/main/java/net/minecraftforge/fml/common/discovery/ModCandidate.java +++ b/src/main/java/net/minecraftforge/fml/common/discovery/ModCandidate.java @@ -23,7 +23,7 @@ import java.io.File; import java.util.List; import java.util.Set; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import com.google.common.collect.Lists; import com.google.common.collect.Sets; diff --git a/src/main/java/net/minecraftforge/fml/common/discovery/ModDiscoverer.java b/src/main/java/net/minecraftforge/fml/common/discovery/ModDiscoverer.java index e697f1a9d1..17b327b7ab 100644 --- a/src/main/java/net/minecraftforge/fml/common/discovery/ModDiscoverer.java +++ b/src/main/java/net/minecraftforge/fml/common/discovery/ModDiscoverer.java @@ -25,7 +25,7 @@ import java.util.List; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.LoaderException; import net.minecraftforge.fml.common.ModClassLoader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.relauncher.CoreModManager; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLConstructionEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLConstructionEvent.java deleted file mode 100644 index caede1f60c..0000000000 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLConstructionEvent.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.fml.common.event; - -import net.minecraftforge.fml.common.ModClassLoader; -import net.minecraftforge.fml.common.LoaderState.ModState; -import net.minecraftforge.fml.common.discovery.ASMDataTable; - -import com.google.common.collect.ListMultimap; - -/** - * An internal FML event used to signal the construction of mods. Should not be used by mods. - */ -public class FMLConstructionEvent extends FMLStateEvent -{ - private ModClassLoader modClassLoader; - private ASMDataTable asmData; - private ListMultimap reverseDependencies; - - @SuppressWarnings("unchecked") - public FMLConstructionEvent(Object... eventData) - { - this.modClassLoader = (ModClassLoader)eventData[0]; - this.asmData = (ASMDataTable) eventData[1]; - this.reverseDependencies = (ListMultimap) eventData[2]; - } - - public ModClassLoader getModClassLoader() - { - return modClassLoader; - } - - @Override - public ModState getModState() - { - return ModState.CONSTRUCTED; - } - - public ASMDataTable getASMHarvestedData() - { - return asmData; - } - - public ListMultimap getReverseDependencies() - { - return reverseDependencies; - } -} diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLFingerprintViolationEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLFingerprintViolationEvent.java index 5bcc39a8d6..8d53049e8b 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLFingerprintViolationEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLFingerprintViolationEvent.java @@ -30,7 +30,8 @@ import net.minecraftforge.fml.common.Mod; * A special event used when the {@link Mod#certificateFingerprint()} doesn't match the certificate loaded from the JAR * file. You could use this to log a warning that the code that is running might not be yours, for example. */ -public class FMLFingerprintViolationEvent extends FMLEvent { +public class FMLFingerprintViolationEvent extends ModLifecycleEvent +{ private final boolean isDirectory; private final Set fingerprints; @@ -39,7 +40,7 @@ public class FMLFingerprintViolationEvent extends FMLEvent { public FMLFingerprintViolationEvent(boolean isDirectory, File source, ImmutableSet fingerprints, String expectedFingerprint) { - super(); + super(null); this.isDirectory = isDirectory; this.source = source; this.fingerprints = fingerprints; diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLInitializationEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLInitializationEvent.java index 3623ed9b97..7743ed9bdf 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLInitializationEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLInitializationEvent.java @@ -19,7 +19,7 @@ package net.minecraftforge.fml.common.event; -import net.minecraftforge.fml.common.LoaderState.ModState; +import net.minecraftforge.fml.ModContainer; /** * Called after {@link FMLPreInitializationEvent} and before {@link FMLPostInitializationEvent} during mod @@ -34,18 +34,11 @@ import net.minecraftforge.fml.common.LoaderState.ModState; * @see net.minecraftforge.fml.common.Mod.EventHandler for how to subscribe to this event * @author cpw */ -public class FMLInitializationEvent extends FMLStateEvent +public class FMLInitializationEvent extends ModLifecycleEvent { - public FMLInitializationEvent(Object... data) + public FMLInitializationEvent(final ModContainer container) { - super(data); + super(container); } - - @Override - public ModState getModState() - { - return ModState.INITIALIZED; - } - } diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLInterModComms.java b/src/main/java/net/minecraftforge/fml/common/event/FMLInterModComms.java index 1fb2fb77cb..94d462cc1a 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLInterModComms.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLInterModComms.java @@ -24,11 +24,13 @@ import java.util.Optional; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.ModThreadContext; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.LoaderState; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.Mod.Instance; import com.google.common.collect.ArrayListMultimap; @@ -54,9 +56,15 @@ public class FMLInterModComms { * @see net.minecraftforge.fml.common.Mod.EventHandler for how to subscribe to this event * @author cpw */ - public static class IMCEvent extends FMLEvent { + public static class IMCEvent extends ModLifecycleEvent + { private ModContainer activeContainer; + public IMCEvent() + { + super(activeContainer); + } + @Override public void applyModContainer(ModContainer activeContainer) { @@ -371,27 +379,19 @@ public class FMLInterModComms { private static boolean enqueueStartupMessage(String modTarget, IMCMessage message) { - if (Loader.instance().activeModContainer() == null) + if (ModThreadContext.get().getCurrentContainer() == null) { return false; } - enqueueMessage(Loader.instance().activeModContainer(), modTarget, message); - return Loader.isModLoaded(modTarget) && !Loader.instance().hasReachedState(LoaderState.POSTINITIALIZATION); + enqueueMessage(ModThreadContext.get().getCurrentContainer(), modTarget, message); + return ModList.get().isLoaded(modTarget); } - private static void enqueueMessage(Object sourceMod, String modTarget, IMCMessage message) + private static void enqueueMessage(ModContainer sourceMod, String modTarget, IMCMessage message) { - ModContainer mc; - if (sourceMod instanceof ModContainer) { - mc = (ModContainer) sourceMod; - } - else + if (ModList.get().isLoaded(modTarget)) { - mc = FMLCommonHandler.instance().findContainerFor(sourceMod); - } - if (mc != null && Loader.isModLoaded(modTarget)) - { - message.setSender(mc); + message.setSender(sourceMod); modMessages.put(modTarget, message); } } diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLLoadCompleteEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLLoadCompleteEvent.java index 10532fd05e..f5588844f6 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLLoadCompleteEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLLoadCompleteEvent.java @@ -19,7 +19,7 @@ package net.minecraftforge.fml.common.event; -import net.minecraftforge.fml.common.LoaderState.ModState; +import net.minecraftforge.fml.ModContainer; /** * This is a mostly internal event fired to mod containers that indicates that loading is complete. Mods should not @@ -27,18 +27,10 @@ import net.minecraftforge.fml.common.LoaderState.ModState; * * @author cpw */ -public class FMLLoadCompleteEvent extends FMLStateEvent +public class FMLLoadCompleteEvent extends ModLifecycleEvent { - - public FMLLoadCompleteEvent(Object... data) + public FMLLoadCompleteEvent(final ModContainer container) { - super(data); + super(container); } - - @Override - public ModState getModState() - { - return ModState.AVAILABLE; - } - } diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLModDisabledEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLModDisabledEvent.java deleted file mode 100644 index 7c4b5773e1..0000000000 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLModDisabledEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.fml.common.event; - -public class FMLModDisabledEvent extends FMLEvent { -} diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLModIdMappingEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLModIdMappingEvent.java index c47005ae17..e30fc514df 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLModIdMappingEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLModIdMappingEvent.java @@ -42,7 +42,7 @@ import net.minecraft.util.ResourceLocation; * @see net.minecraftforge.fml.common.Mod.EventHandler for how to subscribe to this event * @author cpw */ -public class FMLModIdMappingEvent extends FMLEvent +public class FMLModIdMappingEvent extends ModLifecycleEvent { public class ModRemapping { @@ -66,6 +66,7 @@ public class FMLModIdMappingEvent extends FMLEvent public final boolean isFrozen; public FMLModIdMappingEvent(Map> remaps, boolean isFrozen) { + super(null); this.isFrozen = isFrozen; this.remaps = Maps.newHashMap(); remaps.forEach((name, rm) -> diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLPostInitializationEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLPostInitializationEvent.java index 3f49ddd760..f11f9beeb9 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLPostInitializationEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLPostInitializationEvent.java @@ -19,15 +19,7 @@ package net.minecraftforge.fml.common.event; -import java.util.Arrays; -import java.util.Objects; -import java.util.Optional; - -import net.minecraftforge.fml.common.FMLLog; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.LoaderState.ModState; - -import java.lang.reflect.Constructor; +import net.minecraftforge.fml.ModContainer; /** * Called after {@link FMLInitializationEvent} has been dispatched on every mod. This is the third and last @@ -38,45 +30,10 @@ import java.lang.reflect.Constructor; * @see net.minecraftforge.fml.common.Mod.EventHandler for how to subscribe to this event * @author cpw */ -public class FMLPostInitializationEvent extends FMLStateEvent +public class FMLPostInitializationEvent extends ModLifecycleEvent { - public FMLPostInitializationEvent(Object... data) + public FMLPostInitializationEvent(final ModContainer container) { - super(data); - } - - @Override - public ModState getModState() - { - return ModState.POSTINITIALIZED; - } - - /** - * Build an object depending on if a specific target mod is loaded or not. - * - * Usually would be used to access an object from the other mod. - * - * @param modId The modId I conditionally want to build an object for - * @param className The name of the class I wish to instantiate - * @return An optional containing the object if possible, or null if not - */ - public Optional buildSoftDependProxy(String modId, String className, Object... arguments) - { - if (Loader.isModLoaded(modId)) - { - Class[] args = Arrays.stream(arguments).filter(Objects::nonNull).map(Object::getClass).toArray(Class[]::new); - try - { - Class clz = Class.forName(className,true,Loader.instance().getModClassLoader()); - Constructor ct = clz.getConstructor(args); - return Optional.of(ct.newInstance(arguments)); - } - catch (Exception e) - { - FMLLog.log.info("An error occurred trying to build a soft depend proxy", e); - return Optional.empty(); - } - } - return Optional.empty(); + super(container); } } diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLPreInitializationEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLPreInitializationEvent.java index 2f73dd31de..3a4e38a1a5 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLPreInitializationEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLPreInitializationEvent.java @@ -19,21 +19,8 @@ package net.minecraftforge.fml.common.event; -import java.io.File; -import java.security.CodeSource; -import java.security.cert.Certificate; -import java.util.Properties; - -import net.minecraftforge.fml.javafmlmod.FMLModContainer; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.ModMetadata; -import net.minecraftforge.fml.common.LoaderState.ModState; -import net.minecraftforge.fml.common.discovery.ASMDataTable; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import javax.annotation.Nullable; /** * Called before {@link FMLInitializationEvent} during mod startup. @@ -50,131 +37,10 @@ import javax.annotation.Nullable; * @see net.minecraftforge.fml.common.Mod.EventHandler for how to subscribe to this event * @author cpw */ -public class FMLPreInitializationEvent extends FMLStateEvent +public class FMLPreInitializationEvent extends ModLifecycleEvent { - private ModMetadata modMetadata; - private File sourceFile; - private File configurationDir; - private File suggestedConfigFile; - private ASMDataTable asmData; - private ModContainer modContainer; - - public FMLPreInitializationEvent(Object... data) + public FMLPreInitializationEvent(final ModContainer container) { - super(data); - this.asmData = (ASMDataTable)data[0]; - this.configurationDir = (File)data[1]; - } - - @Override - public ModState getModState() - { - return ModState.PREINITIALIZED; - } - - @Override - public void applyModContainer(ModContainer activeContainer) - { - this.modContainer = activeContainer; - this.modMetadata = activeContainer.getMetadata(); - this.sourceFile = activeContainer.getSource(); - this.suggestedConfigFile = new File(configurationDir, activeContainer.getModId()+".cfg"); - } - - /** - * Get the {@link File} the mod was loaded from - * @return The file the mod was loaded from - */ - public File getSourceFile() - { - return sourceFile; - } - - /** - * Get the {@link ModMetadata} for this mod - * @return the mod metadata for the mod - */ - public ModMetadata getModMetadata() - { - return modMetadata; - } - - /** - * Get the main configuration directory for this minecraft instance - * @return the main configuration directory - */ - public File getModConfigurationDirectory() - { - return configurationDir; - } - - /** - * Get a suggested configuration file for this mod. It will be of the form <modid>.cfg - * @return A suggested configuration file name for this mod - */ - public File getSuggestedConfigurationFile() - { - return suggestedConfigFile; - } - - /** - * Get the {@link ASMDataTable} for this instance of Minecraft. This is a special structure containing - * parsing information from FML. It can be searched for annotations parsed out by FML. - * @return - */ - public ASMDataTable getAsmData() - { - return asmData; - } - - /** - * 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 - */ - @Nullable - public Properties getVersionProperties() - { - if (this.modContainer instanceof FMLModContainer) - { - return ((FMLModContainer)this.modContainer).searchForVersionProperties(); - } - - return null; - } - - /** - * Get a logger instance configured to write to the FML Log as a parent, identified by modid. Handy for mod logging! - * - * @return A logger - */ - public Logger getModLog() - { - return LogManager.getLogger(modContainer.getModId()); - } - - /** - * Retrieve the FML signing certificates, if any. Validate these against the - * published FML certificates in your mod, if you wish. - * - * Deprecated because mods should NOT trust this code. Rather - * they should copy this, or something like this, into their own mods. - * - * @return Certificates used to sign FML and Forge - */ - @Deprecated - public Certificate[] getFMLSigningCertificates() - { - CodeSource codeSource = getClass().getClassLoader().getParent().getClass().getProtectionDomain().getCodeSource(); - Certificate[] certs = codeSource.getCertificates(); - if (certs == null) - { - return new Certificate[0]; - } - else - { - return certs; - } + super(container); } } diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLStateEvent.java b/src/main/java/net/minecraftforge/fml/common/event/FMLStateEvent.java index 05f52ba7d7..86a35ac523 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLStateEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/FMLStateEvent.java @@ -20,25 +20,19 @@ package net.minecraftforge.fml.common.event; import net.minecraftforge.fml.common.FMLCommonHandler; -import net.minecraftforge.fml.common.LoaderState.ModState; import net.minecraftforge.fml.relauncher.Side; /** * The parent of all mod-state changing events */ -public abstract class FMLStateEvent extends FMLEvent +public abstract class FMLStateEvent extends ModLifecycleEvent { - public FMLStateEvent(Object... data) + + public FMLStateEvent() { - + super(null); } - /** - * The current state of the mod - * @return The current state of the mod - */ - public abstract ModState getModState(); - /** * The side we're loading on. {@link Side#CLIENT} means we're loading in the client, {@link Side#SERVER} means * we're loading in the dedicated server. diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLEvent.java b/src/main/java/net/minecraftforge/fml/common/event/ModLifecycleEvent.java similarity index 67% rename from src/main/java/net/minecraftforge/fml/common/event/FMLEvent.java rename to src/main/java/net/minecraftforge/fml/common/event/ModLifecycleEvent.java index eac0ffd06d..5730424d49 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLEvent.java +++ b/src/main/java/net/minecraftforge/fml/common/event/ModLifecycleEvent.java @@ -19,24 +19,25 @@ package net.minecraftforge.fml.common.event; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.fml.ModContainer; /** - * Parent type to all FML events. This is based on Guava EventBus. Event Subscription isn't using the Guava annotation - * however, it's using a custom annotation specific to FML {@link net.minecraftforge.fml.common.Mod.EventHandler} + * Parent type to all ModLifecycle events. This is based on Forge EventBus. They fire through the + * ModContainer's eventbus instance. */ -public class FMLEvent +public class ModLifecycleEvent extends Event { - public final String getEventType() + private final ModContainer container; + + public ModLifecycleEvent(ModContainer container) { - return getClass().getSimpleName(); + this.container = container; } + public final String description() { String cn = getClass().getName(); return cn.substring(cn.lastIndexOf('.')+4,cn.length()-5); } - public void applyModContainer(ModContainer activeContainer) { - // NO OP - } } diff --git a/src/main/java/net/minecraftforge/fml/common/network/FMLEmbeddedChannel.java b/src/main/java/net/minecraftforge/fml/common/network/FMLEmbeddedChannel.java index b95f45e91e..58087648ac 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/FMLEmbeddedChannel.java +++ b/src/main/java/net/minecraftforge/fml/common/network/FMLEmbeddedChannel.java @@ -25,12 +25,14 @@ import io.netty.channel.embedded.EmbeddedChannel; import java.util.Map.Entry; import net.minecraft.network.Packet; +import net.minecraftforge.api.Side; +import net.minecraftforge.fml.ModThreadContext; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.network.FMLOutboundHandler.OutboundTarget; import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; -import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.javafmlmod.ModLoadingContext; import javax.annotation.Nullable; @@ -44,7 +46,7 @@ import javax.annotation.Nullable; public class FMLEmbeddedChannel extends EmbeddedChannel { public FMLEmbeddedChannel(String channelName, Side source, ChannelHandler... handlers) { - this(Loader.instance().activeModContainer(), channelName, source, handlers); + this(ModThreadContext.get().getCurrentContainer(), channelName, source, handlers); } public FMLEmbeddedChannel(ModContainer container, String channelName, Side source, ChannelHandler... handlers) { diff --git a/src/main/java/net/minecraftforge/fml/common/network/NetworkRegistry.java b/src/main/java/net/minecraftforge/fml/common/network/NetworkRegistry.java index 2dacb64b8b..92792f75dd 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/NetworkRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/network/NetworkRegistry.java @@ -35,16 +35,16 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Container; import net.minecraft.network.INetHandler; import net.minecraft.world.World; +import net.minecraftforge.api.Side; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.discovery.ASMDataTable; import net.minecraftforge.fml.common.network.FMLOutboundHandler.OutboundTarget; import net.minecraftforge.fml.common.network.handshake.NetworkDispatcher; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import net.minecraftforge.fml.common.network.internal.NetworkModHolder; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; -import net.minecraftforge.fml.relauncher.Side; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; @@ -311,7 +311,7 @@ public enum NetworkRegistry { return registry.values().stream() .filter(mod -> !mod.acceptsVanilla(from)) - .map(mod -> mod.getContainer().getName()) + .map(mod -> mod.getContainer().getModId()) .sorted() .collect(Collectors.toList()); } @@ -338,6 +338,7 @@ public enum NetworkRegistry */ public void fireNetworkHandshake(NetworkDispatcher networkDispatcher, Side origin) { +/* NetworkHandshakeEstablished handshake = new NetworkHandshakeEstablished(networkDispatcher, networkDispatcher.getNetHandler(), origin); for (FMLEmbeddedChannel channel : channels.get(origin).values()) { @@ -345,6 +346,7 @@ public enum NetworkRegistry channel.attr(FMLOutboundHandler.FML_MESSAGETARGETARGS).set(networkDispatcher); channel.pipeline().fireUserEventTriggered(handshake); } +*/ } public void cleanAttributes() diff --git a/src/main/java/net/minecraftforge/fml/common/network/handshake/ChannelRegistrationHandler.java b/src/main/java/net/minecraftforge/fml/common/network/handshake/ChannelRegistrationHandler.java index 88485955a0..be15867e60 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/handshake/ChannelRegistrationHandler.java +++ b/src/main/java/net/minecraftforge/fml/common/network/handshake/ChannelRegistrationHandler.java @@ -17,6 +17,25 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + @Override + public void update() { + // This method is called every tick (20 times per second normally) + + if (world.isRemote) { + // We only do something on the client so we don't have to bother about client-server communication. + // The effect that we want to have (blinking the block) is client-side as well. + updateCounter(); + counter -= lastCount * 3; + if (counter <= 0) { + lit = !lit; + counter = 400; // This is 20 seconds. Rate increases if more mods are near + world.markBlockRangeForRenderUpdate(getPos(), getPos()); + } + } + } + + private void updateCounter() { + package net.minecraftforge.fml.common.network.handshake; import io.netty.channel.ChannelHandlerContext; diff --git a/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeMessage.java b/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeMessage.java index f5cb4dc2c2..96fd3fbed0 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeMessage.java +++ b/src/main/java/net/minecraftforge/fml/common/network/handshake/FMLHandshakeMessage.java @@ -32,7 +32,7 @@ import java.util.Set; import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.FMLLog; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; diff --git a/src/main/java/net/minecraftforge/fml/common/network/internal/EntitySpawnHandler.java b/src/main/java/net/minecraftforge/fml/common/network/internal/EntitySpawnHandler.java index 969a0b5721..eef0b1c33b 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/internal/EntitySpawnHandler.java +++ b/src/main/java/net/minecraftforge/fml/common/network/internal/EntitySpawnHandler.java @@ -33,7 +33,7 @@ import net.minecraftforge.fml.client.FMLClientHandler; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.internal.FMLMessage.EntityMessage; import net.minecraftforge.fml.common.registry.EntityRegistry; diff --git a/src/main/java/net/minecraftforge/fml/common/network/internal/FMLMessage.java b/src/main/java/net/minecraftforge/fml/common/network/internal/FMLMessage.java index 2fc0a84f72..78150dbc50 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/internal/FMLMessage.java +++ b/src/main/java/net/minecraftforge/fml/common/network/internal/FMLMessage.java @@ -31,7 +31,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.network.PacketBuffer; import net.minecraft.network.datasync.EntityDataManager; import net.minecraftforge.fml.common.FMLLog; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.registry.EntityRegistry.EntityRegistration; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; diff --git a/src/main/java/net/minecraftforge/fml/common/network/internal/FMLNetworkHandler.java b/src/main/java/net/minecraftforge/fml/common/network/internal/FMLNetworkHandler.java index f5f15581c5..271fbc27a8 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/internal/FMLNetworkHandler.java +++ b/src/main/java/net/minecraftforge/fml/common/network/internal/FMLNetworkHandler.java @@ -42,7 +42,7 @@ import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLContainer; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.network.FMLEmbeddedChannel; import net.minecraftforge.fml.common.network.FMLOutboundHandler; import net.minecraftforge.fml.common.network.NetworkRegistry; diff --git a/src/main/java/net/minecraftforge/fml/common/network/internal/NetworkModHolder.java b/src/main/java/net/minecraftforge/fml/common/network/internal/NetworkModHolder.java index a6f6f2263d..47c1e58d11 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/internal/NetworkModHolder.java +++ b/src/main/java/net/minecraftforge/fml/common/network/internal/NetworkModHolder.java @@ -23,15 +23,15 @@ import java.lang.reflect.Method; import java.util.Map; import java.util.Set; +import net.minecraftforge.api.Side; import net.minecraftforge.fml.common.FMLLog; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.discovery.ASMDataTable; import net.minecraftforge.fml.common.discovery.ASMDataTable.ASMData; import net.minecraftforge.fml.common.network.NetworkCheckHandler; import net.minecraftforge.fml.common.versioning.DefaultArtifactVersion; import net.minecraftforge.fml.common.versioning.InvalidVersionSpecificationException; import net.minecraftforge.fml.common.versioning.VersionRange; -import net.minecraftforge.fml.relauncher.Side; import com.google.common.base.Preconditions; import com.google.common.base.Strings; diff --git a/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/MessageContext.java b/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/MessageContext.java index ab551d865f..a2095b4159 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/MessageContext.java +++ b/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/MessageContext.java @@ -22,7 +22,7 @@ package net.minecraftforge.fml.common.network.simpleimpl; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.network.INetHandler; import net.minecraft.network.NetHandlerPlayServer; -import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.api.Side; /** * Context for the {@link IMessageHandler} diff --git a/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/SimpleChannelHandlerWrapper.java b/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/SimpleChannelHandlerWrapper.java index 1a556d01e5..90e7da9ff5 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/SimpleChannelHandlerWrapper.java +++ b/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/SimpleChannelHandlerWrapper.java @@ -19,13 +19,13 @@ package net.minecraftforge.fml.common.network.simpleimpl; +import net.minecraftforge.api.Side; import org.apache.logging.log4j.Level; import net.minecraft.network.INetHandler; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.network.FMLOutboundHandler; import net.minecraftforge.fml.common.network.NetworkRegistry; -import net.minecraftforge.fml.relauncher.Side; import com.google.common.base.Preconditions; diff --git a/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/SimpleNetworkWrapper.java b/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/SimpleNetworkWrapper.java index 7a6a2e79cd..95c9a224a7 100644 --- a/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/SimpleNetworkWrapper.java +++ b/src/main/java/net/minecraftforge/fml/common/network/simpleimpl/SimpleNetworkWrapper.java @@ -33,13 +33,13 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.INetHandler; import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.api.Side; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.network.FMLEmbeddedChannel; import net.minecraftforge.fml.common.network.FMLOutboundHandler; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraftforge.fml.relauncher.Side; /** * This class is a simplified netty wrapper for those not wishing to deal with the full power of netty. diff --git a/src/main/java/net/minecraftforge/fml/common/registry/EntityEntryBuilder.java b/src/main/java/net/minecraftforge/fml/common/registry/EntityEntryBuilder.java index 8d8b9fecd0..913d11796b 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/EntityEntryBuilder.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/EntityEntryBuilder.java @@ -30,7 +30,7 @@ import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.relauncher.ReflectionHelper; import java.lang.reflect.Constructor; diff --git a/src/main/java/net/minecraftforge/fml/common/registry/EntityRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/EntityRegistry.java index 2ce1bff384..2ca959d138 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/EntityRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/EntityRegistry.java @@ -32,7 +32,7 @@ import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.SpawnListEntry; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.network.internal.FMLMessage.EntitySpawnMessage; import java.util.function.Function; diff --git a/src/main/java/net/minecraftforge/fml/common/toposort/ModSorter.java b/src/main/java/net/minecraftforge/fml/common/toposort/ModSorter.java index 8b2bb2cb0f..5c22296d73 100644 --- a/src/main/java/net/minecraftforge/fml/common/toposort/ModSorter.java +++ b/src/main/java/net/minecraftforge/fml/common/toposort/ModSorter.java @@ -29,7 +29,7 @@ import net.minecraftforge.fml.common.DummyModContainer; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.ModAPIManager; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.toposort.TopologicalSort.DirectedGraph; import net.minecraftforge.fml.common.versioning.ArtifactVersion; diff --git a/src/main/java/net/minecraftforge/fml/common/toposort/ModSortingException.java b/src/main/java/net/minecraftforge/fml/common/toposort/ModSortingException.java index d7b3cdda18..d85e7cfac6 100644 --- a/src/main/java/net/minecraftforge/fml/common/toposort/ModSortingException.java +++ b/src/main/java/net/minecraftforge/fml/common/toposort/ModSortingException.java @@ -25,7 +25,7 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraftforge.fml.client.GuiSortingProblem; import net.minecraftforge.fml.client.IDisplayableError; import net.minecraftforge.fml.common.EnhancedRuntimeException; -import net.minecraftforge.fml.common.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; diff --git a/src/main/java/net/minecraftforge/fml/common/toposort/TopologicalSort.java b/src/main/java/net/minecraftforge/fml/common/toposort/TopologicalSort.java index c60cf18416..cf12b589c3 100644 --- a/src/main/java/net/minecraftforge/fml/common/toposort/TopologicalSort.java +++ b/src/main/java/net/minecraftforge/fml/common/toposort/TopologicalSort.java @@ -19,6 +19,10 @@ package net.minecraftforge.fml.common.toposort; +import com.google.common.collect.Sets; +import org.apache.logging.log4j.message.Message; +import org.apache.logging.log4j.util.StringBuilderFormattable; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -176,7 +180,7 @@ public class TopologicalSort return; } - throw new TopoSortException(node, sortedResult, visitedNodes, expandedNodes); + throw new TopoSortException(new TopoSortException.TopoSortExceptionData<>(node, sortedResult, visitedNodes, expandedNodes)); } // Visit this node @@ -194,38 +198,68 @@ public class TopologicalSort expandedNodes.add(node); } - static class TopoSortException extends RuntimeException { - private final Object node; - private final List sortedResult; - private final Set visitedNodes; - private final Set expandedNodes; + public static class TopoSortException extends RuntimeException { + private final TopoSortExceptionData topoSortData; - public TopoSortException(Object node, List sortedResult, Set visitedNodes, Set expandedNodes) + public static class TopoSortExceptionData implements Message, StringBuilderFormattable { - this.node = node; - this.sortedResult = sortedResult; - this.visitedNodes = visitedNodes; - this.expandedNodes = expandedNodes; + private final List sortedResult; + private final Set visitedNodes; + private final Set expandedNodes; + private final T node; + + TopoSortExceptionData(T node, List sortedResult, Set visitedNodes, Set expandedNodes) + { + this.node = node; + this.sortedResult = sortedResult; + this.visitedNodes = visitedNodes; + this.expandedNodes = expandedNodes; + } + + @Override + public String getFormattedMessage() + { + return ""; + } + + @Override + public String getFormat() + { + return ""; + } + + @Override + public Object[] getParameters() + { + return new Object[0]; + } + + @Override + public Throwable getThrowable() + { + return null; + } + + @Override + public void formatTo(StringBuilder buffer) + { + buffer.append("Mod Sorting failed.\n"); + buffer.append("Visiting node {}\n").append(String.valueOf(node)); + buffer.append("Current sorted list : {}\n").append(String.valueOf(sortedResult)); + buffer.append("Visited set for this node : {}\n").append(String.valueOf(visitedNodes)); + buffer.append("Explored node set : {}\n").append(expandedNodes); + buffer.append("Likely cycle is in : {}\n").append(Sets.difference(visitedNodes, expandedNodes)); + } } - public Object getNode() + public TopoSortException(TopoSortExceptionData data) { - return node; + this.topoSortData = data; } - public List getSortedResult() - { - return sortedResult; - } - - public Set getVisitedNodes() - { - return visitedNodes; - } - - public Set getExpandedNodes() - { - return expandedNodes; + @SuppressWarnings("unchecked") + public TopoSortExceptionData getData() { + return (TopoSortExceptionData)this.topoSortData; } } } diff --git a/src/main/java/net/minecraftforge/fml/javafmlmod/FMLJavaModLanguageProvider.java b/src/main/java/net/minecraftforge/fml/javafmlmod/FMLJavaModLanguageProvider.java index cf1242a445..ca3703cfb1 100644 --- a/src/main/java/net/minecraftforge/fml/javafmlmod/FMLJavaModLanguageProvider.java +++ b/src/main/java/net/minecraftforge/fml/javafmlmod/FMLJavaModLanguageProvider.java @@ -19,23 +19,28 @@ package net.minecraftforge.fml.javafmlmod; -import net.minecraftforge.fml.language.ModContainer; import net.minecraftforge.fml.language.IModLanguageProvider; import net.minecraftforge.fml.language.IModInfo; import net.minecraftforge.fml.language.ModFileScanData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.objectweb.asm.Type; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; +import static net.minecraftforge.fml.Logging.LOADING; import static net.minecraftforge.fml.Logging.SCAN; import static net.minecraftforge.fml.Logging.fmlLog; public class FMLJavaModLanguageProvider implements IModLanguageProvider { private static class FMLModTarget implements IModLanguageProvider.IModLanguageLoader { + private static final Logger LOGGER = LogManager.getLogger("FML"); private final String className; private final String modId; @@ -50,10 +55,21 @@ public class FMLJavaModLanguageProvider implements IModLanguageProvider return modId; } + @SuppressWarnings("unchecked") @Override - public ModContainer loadMod(final IModInfo info, final ClassLoader modClassLoader, final ModFileScanData modFileScanResults) + public T loadMod(final IModInfo info, final ClassLoader modClassLoader, final ModFileScanData modFileScanResults) { - return new FMLModContainer(info, className, modClassLoader, modFileScanResults); + try + { + final Constructor constructor = Class.forName("net.minecraftforge.fml.javafmlmod.FMLModContainer", true, Thread.currentThread().getContextClassLoader()). + getConstructor(IModInfo.class, String.class, ClassLoader.class, ModFileScanData.class); + return (T)constructor.newInstance(info, className, modClassLoader, modFileScanResults); + } + catch (NoSuchMethodException | ClassNotFoundException | InstantiationException | IllegalAccessException | InvocationTargetException e) + { + LOGGER.error(LOADING,"Unable to load FMLModContainer, wut?", e); + throw new RuntimeException(e); + } } } @@ -71,7 +87,7 @@ public class FMLJavaModLanguageProvider implements IModLanguageProvider final Map modTargetMap = scanResult.getAnnotations().stream() .filter(ad -> ad.getAnnotationType().equals(MODANNOTATION)) .peek(ad -> fmlLog.debug(SCAN, "Found @Mod class {} with id {}", ad.getClassType().getClassName(), ad.getAnnotationData().get("modid"))) - .map(ad -> new FMLModTarget(ad.getClassType().getClassName(), (String)ad.getAnnotationData().get("modid"))) + .map(ad -> new FMLModTarget(ad.getClassType().getClassName(), (String)ad.getAnnotationData().get("value"))) .collect(Collectors.toMap(FMLModTarget::getModId, Function.identity())); scanResult.addLanguageLoader(modTargetMap); }; diff --git a/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java b/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java index 75763078c1..452771d449 100644 --- a/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java +++ b/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java @@ -18,26 +18,22 @@ */ package net.minecraftforge.fml.javafmlmod; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Objects; - +import net.minecraftforge.eventbus.EventBusErrorMessage; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.IEventListener; import net.minecraftforge.fml.LifecycleEventProvider; -import net.minecraftforge.fml.loading.ModLoadingStage; -import net.minecraftforge.fml.common.Mod.Instance; -import net.minecraftforge.fml.language.ModContainer; -import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.fml.common.event.ModLifecycleEvent; +import net.minecraftforge.fml.AutomaticEventSubscriber; +import net.minecraftforge.fml.ModLoadingStage; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.language.IModInfo; import net.minecraftforge.fml.language.ModFileScanData; -import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.function.Function; -import java.util.stream.Collectors; - -import org.objectweb.asm.Type; +import java.util.function.Consumer; import static net.minecraftforge.fml.Logging.LOADING; @@ -45,6 +41,7 @@ public class FMLModContainer extends ModContainer { private static final Logger LOGGER = LogManager.getLogger("FML"); private final ModFileScanData scanResults; + private final IEventBus eventBus; private Object modInstance; private final Class modClass; @@ -52,43 +49,65 @@ public class FMLModContainer extends ModContainer { super(info); this.scanResults = modFileScanResults; - triggerMap.put(ModLoadingStage.BEGIN, this::constructMod); - triggerMap.put(ModLoadingStage.PREINIT, this::preinitMod); + triggerMap.put(ModLoadingStage.BEGIN, dummy().andThen(this::beforeEvent).andThen(this::constructMod).andThen(this::afterEvent)); + triggerMap.put(ModLoadingStage.CONSTRUCT, dummy().andThen(this::beforeEvent).andThen(this::preinitMod).andThen(this::fireEvent).andThen(this::afterEvent)); + triggerMap.put(ModLoadingStage.PREINIT, dummy().andThen(this::beforeEvent).andThen(this::initMod).andThen(this::fireEvent).andThen(this::afterEvent)); + this.eventBus = IEventBus.create(this::onEventFailed); try { modClass = Class.forName(className, true, modClassLoader); LOGGER.error(LOADING,"Loaded modclass {} with {}", modClass.getName(), modClass.getClassLoader()); } - catch (ClassNotFoundException e) + catch (Throwable e) { LOGGER.error(LOADING, "Failed to load class {}", className, e); throw new RuntimeException(e); } } - private void preinitMod(LifecycleEventProvider.LifecycleEvent lifecycleEvent) + private void initMod(LifecycleEventProvider.LifecycleEvent lifecycleEvent) { - List> instanceFields = scanResults.getAnnotations().stream(). - filter(a -> Objects.equals(a.getAnnotationType(), Type.getType(Instance.class)) && - Objects.equals(a.getClassType(), Type.getType(modClass))). - map(a->Pair.of(a.getMemberName(), (String)a.getAnnotationData().get("value"))). - collect(Collectors.toList()); + } - instanceFields.forEach(p->{ - try - { - final Field field = modClass.getDeclaredField(p.getLeft()); - field.setAccessible(true); - field.set(modInstance, FMLLoader.getModLoader().getModList().getModObjectById(p.getRight()).get()); - } - catch (NoSuchFieldException | IllegalAccessException e) - { - LOGGER.error(LOADING, "Unable to set field {} to mod with ID {}", p.getLeft(), p.getRight(), e); - } - }); + private Consumer dummy() { return (s) -> {}; } + private void onEventFailed(IEventBus iEventBus, Event event, IEventListener[] iEventListeners, int i, Throwable throwable) + { + LOGGER.error(new EventBusErrorMessage(event, i, iEventListeners, throwable)); + } + + private void beforeEvent(LifecycleEventProvider.LifecycleEvent lifecycleEvent) { + ModLoadingContext.get().activeContainer = this; + } + + private void fireEvent(LifecycleEventProvider.LifecycleEvent lifecycleEvent) { + final ModLifecycleEvent event = lifecycleEvent.buildModEvent(this); + LOGGER.debug(LOADING, "Firing event {} for modid {}", event, this.getModId()); + try + { + eventBus.post(event); + LOGGER.debug(LOADING, "Fired event {} for modid {}", event, this.getModId()); + } + catch (Throwable e) + { + LOGGER.error(LOADING,"Caught exception during event {} dispatch for modid {}", event, this.getModId(), e); + modLoadingStage = ModLoadingStage.ERROR; + modLoadingError.add(e); + } + } + + private void afterEvent(LifecycleEventProvider.LifecycleEvent lifecycleEvent) { + ModLoadingContext.get().activeContainer = null; + if (getCurrentState() == ModLoadingStage.ERROR) { + LOGGER.error(LOADING,"An error occurred while dispatching event {} to {}", lifecycleEvent.fromStage(), getModId()); + } + } + + private void preinitMod(LifecycleEventProvider.LifecycleEvent lifecycleEvent) + { + AutomaticEventSubscriber.inject(this, this.scanResults, this.modClass.getClassLoader()); } private void constructMod(LifecycleEventProvider.LifecycleEvent event) @@ -99,10 +118,11 @@ public class FMLModContainer extends ModContainer this.modInstance = modClass.newInstance(); LOGGER.debug(LOADING, "Loaded mod instance {} of type {}", getModId(), modClass.getName()); } - catch (InstantiationException | IllegalAccessException e) + catch (Throwable e) { - LOGGER.error("Failed to create mod instance. ModID: {}, class {}", getModId(), modClass.getName(), e); - throw new RuntimeException("Failed to create mod instance", e); + LOGGER.error(LOADING,"Failed to create mod instance. ModID: {}, class {}", getModId(), modClass.getName(), e); + modLoadingStage = ModLoadingStage.ERROR; + modLoadingError.add(e); } } @@ -118,9 +138,8 @@ public class FMLModContainer extends ModContainer return modInstance; } - @Override - public T getCustomExtension(final String name) + public IEventBus getEventBus() { - return ((Function)modInstance).apply(name); + return this.eventBus; } } diff --git a/src/main/java/net/minecraftforge/fml/loading/ModLoadingStage.java b/src/main/java/net/minecraftforge/fml/javafmlmod/ModLoadingContext.java similarity index 51% rename from src/main/java/net/minecraftforge/fml/loading/ModLoadingStage.java rename to src/main/java/net/minecraftforge/fml/javafmlmod/ModLoadingContext.java index 749c16ab84..b5601fcee4 100644 --- a/src/main/java/net/minecraftforge/fml/loading/ModLoadingStage.java +++ b/src/main/java/net/minecraftforge/fml/javafmlmod/ModLoadingContext.java @@ -17,9 +17,27 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package net.minecraftforge.fml.loading; +package net.minecraftforge.fml.javafmlmod; -public enum ModLoadingStage +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.language.ExtensionPoint; + +import java.util.function.Supplier; + +public class ModLoadingContext { - ERROR, BEGIN, CONSTRUCT, PREINIT, INIT, POSTINIT, COMPLETE + private static ThreadLocal context = ThreadLocal.withInitial(ModLoadingContext::new); + FMLModContainer activeContainer; + public static ModLoadingContext get() { + return context.get(); + } + + public void registerExtensionPoint(ExtensionPoint point, Supplier extension) { + activeContainer.registerExtensionPoint(point, extension); + } + + public IEventBus getModEventBus() + { + return activeContainer.getEventBus(); + } } diff --git a/src/main/java/net/minecraftforge/fml/common/event/FMLLoadEvent.java b/src/main/java/net/minecraftforge/fml/language/ExtensionPoint.java similarity index 59% rename from src/main/java/net/minecraftforge/fml/common/event/FMLLoadEvent.java rename to src/main/java/net/minecraftforge/fml/language/ExtensionPoint.java index 958bc4fc4e..02246d01ac 100644 --- a/src/main/java/net/minecraftforge/fml/common/event/FMLLoadEvent.java +++ b/src/main/java/net/minecraftforge/fml/language/ExtensionPoint.java @@ -17,14 +17,17 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -package net.minecraftforge.fml.common.event; +package net.minecraftforge.fml.language; -/** - * Internal only event, used to begin the lifecycle of loading mods. - * - * @author cpw - */ -public class FMLLoadEvent +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.resources.IResourcePack; + +import java.util.function.BiFunction; +import java.util.function.Function; + +public class ExtensionPoint { - + public static final ExtensionPoint> GUIFACTORY = new ExtensionPoint<>(); + public static final ExtensionPoint> RESOURCEPACK = new ExtensionPoint<>(); } diff --git a/src/main/java/net/minecraftforge/fml/language/IModInfo.java b/src/main/java/net/minecraftforge/fml/language/IModInfo.java index bb4e7d6b18..2565a63107 100644 --- a/src/main/java/net/minecraftforge/fml/language/IModInfo.java +++ b/src/main/java/net/minecraftforge/fml/language/IModInfo.java @@ -107,5 +107,10 @@ public interface IModInfo { this.owner = owner; } + + public IModInfo getOwner() + { + return owner; + } } } diff --git a/src/main/java/net/minecraftforge/fml/language/IModLanguageProvider.java b/src/main/java/net/minecraftforge/fml/language/IModLanguageProvider.java index 6e26170a41..fea28b157e 100644 --- a/src/main/java/net/minecraftforge/fml/language/IModLanguageProvider.java +++ b/src/main/java/net/minecraftforge/fml/language/IModLanguageProvider.java @@ -22,7 +22,7 @@ package net.minecraftforge.fml.language; import java.util.function.Consumer; /** - * Loaded as a ServiceLoader, from the classpath. Extensions are loaded from + * Loaded as a ServiceLoader, from the classpath. ExtensionPoint are loaded from * the mods directory, with the FMLType META-INF of LANGPROVIDER. * * Version data is read from the manifest's implementation version. @@ -34,6 +34,6 @@ public interface IModLanguageProvider Consumer getFileVisitor(); interface IModLanguageLoader { - ModContainer loadMod(IModInfo info, ClassLoader modClassLoader, ModFileScanData modFileScanResults); + T loadMod(IModInfo info, ClassLoader modClassLoader, ModFileScanData modFileScanResults); } } diff --git a/src/main/java/net/minecraftforge/fml/loading/DefaultModInfos.java b/src/main/java/net/minecraftforge/fml/loading/DefaultModInfos.java new file mode 100644 index 0000000000..22595d68a8 --- /dev/null +++ b/src/main/java/net/minecraftforge/fml/loading/DefaultModInfos.java @@ -0,0 +1,64 @@ +/* + * Minecraft Forge + * Copyright (c) 2018. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.fml.loading; + +import com.electronwill.nightconfig.core.path.PathConfig; +import net.minecraftforge.fml.language.IModInfo; +import net.minecraftforge.fml.loading.moddiscovery.ModInfo; + +import java.net.URISyntaxException; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; + +public class DefaultModInfos +{ + static { + PathConfig minecraftmod; + PathConfig forgemod; + try + { + minecraftmod = PathConfig.of(Paths.get(DefaultModInfos.class.getClassLoader().getResource("minecraftmod.toml").toURI())); + forgemod = PathConfig.of(Paths.get(DefaultModInfos.class.getClassLoader().getResource("forgemod.toml").toURI())); + minecraftmod.load(); + forgemod.load(); + } + catch (URISyntaxException | NullPointerException e) + { + throw new RuntimeException("Missing toml configs for minecraft and forge!", e); + } + minecraftModInfo = new ModInfo(null, minecraftmod); + forgeModInfo = new ModInfo(null, forgemod); + + } + + public static final IModInfo minecraftModInfo; + private static final IModInfo forgeModInfo; + + // no construction + private DefaultModInfos() {} + + public static List getModInfos() + { + return Arrays.asList(minecraftModInfo, forgeModInfo); + } + + +} \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/fml/loading/FMLDevClientLaunchProvider.java b/src/main/java/net/minecraftforge/fml/loading/FMLDevClientLaunchProvider.java index 31c5bc7409..4701a9a981 100644 --- a/src/main/java/net/minecraftforge/fml/loading/FMLDevClientLaunchProvider.java +++ b/src/main/java/net/minecraftforge/fml/loading/FMLDevClientLaunchProvider.java @@ -24,6 +24,7 @@ import cpw.mods.modlauncher.api.ILaunchHandlerService; import cpw.mods.modlauncher.api.ITransformingClassLoader; import net.minecraftforge.api.Side; +import java.lang.reflect.Field; import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; @@ -72,6 +73,10 @@ public class FMLDevClientLaunchProvider extends FMLCommonLaunchHandler implement fmlLog.debug(CORE, "Launching minecraft in {} with arguments {}", launchClassLoader, arguments); super.beforeStart(launchClassLoader); launchClassLoader.addTargetPackageFilter(cn -> SKIPPACKAGES.stream().noneMatch(cn::startsWith)); + Field scl = ClassLoader.class.getDeclaredField("scl"); // Get system class loader + scl.setAccessible(true); // Set accessible + scl.set(null, launchClassLoader.getInstance()); // Update it to your class loader + Thread.currentThread().setContextClassLoader(launchClassLoader.getInstance()); Class.forName("net.minecraft.client.main.Main", true, launchClassLoader.getInstance()).getMethod("main", String[].class).invoke(null, (Object)arguments); return null; }; diff --git a/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java b/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java index 620dc2ce7b..4eda8152e3 100644 --- a/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java +++ b/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java @@ -27,14 +27,11 @@ import cpw.mods.modlauncher.api.IncompatibleEnvironmentException; import cpw.mods.modlauncher.serviceapi.ILaunchPluginService; import net.minecraftforge.api.Side; import net.minecraftforge.common.ForgeVersion; -import net.minecraftforge.fml.common.FMLPaths; -import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.loading.moddiscovery.BackgroundScanHandler; import net.minecraftforge.fml.loading.moddiscovery.ModDiscoverer; import net.minecraftforge.fml.loading.moddiscovery.ModFile; import net.minecraftforge.forgespi.ICoreModProvider; -import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Path; @@ -57,9 +54,8 @@ public class FMLLoader private static ILaunchPluginService eventBus; private static LanguageLoadingProvider languageLoadingProvider; private static Side side; - private static ModList modList; + private static LoadingModList loadingModList; private static ClassLoader launchClassLoader; - private static ModLoader modLoader; static void onInitialLoad(IEnvironment environment, Set otherServices) throws IncompatibleEnvironmentException { @@ -134,7 +130,7 @@ public class FMLLoader fmlLog.debug(SCAN,"Scanning for Mod Locators"); modDiscoverer = new ModDiscoverer(); final BackgroundScanHandler backgroundScanHandler = modDiscoverer.discoverMods(); - modList = backgroundScanHandler.getModList(); + loadingModList = backgroundScanHandler.getLoadingModList(); } public static ICoreModProvider getCoreModProvider() { @@ -177,12 +173,18 @@ public class FMLLoader public static void beforeStart(ITransformingClassLoader launchClassLoader) { - modLoader = new ModLoader(launchClassLoader.getInstance(), modList); - modLoader.classloadModFiles(); + FMLLoader.launchClassLoader = launchClassLoader.getInstance(); } - public static ModLoader getModLoader() + + public static LoadingModList getLoadingModList() { - return modLoader; + return loadingModList; + + } + + public static ClassLoader getLaunchClassLoader() + { + return launchClassLoader; } } diff --git a/src/main/java/net/minecraftforge/fml/loading/ModList.java b/src/main/java/net/minecraftforge/fml/loading/LoadingModList.java similarity index 82% rename from src/main/java/net/minecraftforge/fml/loading/ModList.java rename to src/main/java/net/minecraftforge/fml/loading/LoadingModList.java index 49b5346712..877d31fd03 100644 --- a/src/main/java/net/minecraftforge/fml/loading/ModList.java +++ b/src/main/java/net/minecraftforge/fml/loading/LoadingModList.java @@ -19,13 +19,16 @@ package net.minecraftforge.fml.loading; +import com.google.common.collect.Streams; import net.minecraftforge.fml.LifecycleEventProvider; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; +import net.minecraftforge.fml.ModLoadingStage; import net.minecraftforge.fml.loading.moddiscovery.BackgroundScanHandler; import net.minecraftforge.fml.loading.moddiscovery.ModFile; import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; import net.minecraftforge.fml.loading.moddiscovery.ModInfo; +import java.nio.file.Files; import java.nio.file.Path; import java.util.Collection; import java.util.List; @@ -37,9 +40,9 @@ import java.util.stream.Collectors; /** * Master list of all mods */ -public class ModList +public class LoadingModList { - private static ModList INSTANCE; + private static LoadingModList INSTANCE; private final List modFiles; private final List sortedList; private final Map fileById; @@ -47,22 +50,24 @@ public class ModList private List mods; private Map indexedMods; - private ModList(final List modFiles, final List sortedList) + private LoadingModList(final List modFiles, final List sortedList) { this.modFiles = modFiles.stream().map(ModFile::getModFileInfo).map(ModFileInfo.class::cast).collect(Collectors.toList()); - this.sortedList = sortedList; + this.sortedList = Streams.concat(DefaultModInfos.getModInfos().stream(), sortedList.stream()). + map(ModInfo.class::cast). + collect(Collectors.toList()); this.fileById = this.modFiles.stream().map(ModFileInfo::getMods).flatMap(Collection::stream). map(ModInfo.class::cast). collect(Collectors.toMap(ModInfo::getModId, ModInfo::getOwningFile)); } - public static ModList of(List modFiles, List sortedList) + public static LoadingModList of(List modFiles, List sortedList) { - INSTANCE = new ModList(modFiles, sortedList); + INSTANCE = new LoadingModList(modFiles, sortedList); return INSTANCE; } - public static ModList get() { + public static LoadingModList get() { return INSTANCE; } public void addCoreMods() @@ -78,7 +83,7 @@ public class ModList public void addForScanning(BackgroundScanHandler backgroundScanHandler) { this.scanner = backgroundScanHandler; - backgroundScanHandler.setModList(this); + backgroundScanHandler.setLoadingModList(this); modFiles.stream().map(ModFileInfo::getFile).forEach(backgroundScanHandler::submitForScanning); } @@ -91,7 +96,7 @@ public class ModList { for (ModFileInfo mf : modFiles) { final Path resource = mf.getFile().findResource(className); - if (resource != null) return resource; + if (Files.exists(resource)) return resource; } return null; } @@ -109,7 +114,7 @@ public class ModList } } - public void setLoadedMods(List modContainers) + public void setLoadedMods(final List modContainers) { this.mods = modContainers; this.indexedMods = modContainers.stream().collect(Collectors.toMap(ModContainer::getModId, Function.identity())); diff --git a/src/main/java/net/minecraftforge/fml/loading/ModJarURLHandler.java b/src/main/java/net/minecraftforge/fml/loading/ModJarURLHandler.java index adba13fe1a..cc6f02dc3c 100644 --- a/src/main/java/net/minecraftforge/fml/loading/ModJarURLHandler.java +++ b/src/main/java/net/minecraftforge/fml/loading/ModJarURLHandler.java @@ -47,7 +47,7 @@ public class ModJarURLHandler extends URLStreamHandler @Override public InputStream getInputStream() throws IOException { - return Files.newInputStream(FMLLoader.getModLoader().getModList().getModFileById(modid).getFile().findResource(modpath)); + return Files.newInputStream(FMLLoader.getLoadingModList().getModFileById(modid).getFile().findResource(modpath)); } }; } diff --git a/src/main/java/net/minecraftforge/fml/loading/ModLoader.java b/src/main/java/net/minecraftforge/fml/loading/ModLoader.java deleted file mode 100644 index 8455b6c9d5..0000000000 --- a/src/main/java/net/minecraftforge/fml/loading/ModLoader.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2018. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.fml.loading; - -import net.minecraftforge.fml.LifecycleEventProvider; -import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; - -import java.util.Collection; -import java.util.stream.Collectors; - -public class ModLoader -{ - private final ClassLoader launchClassLoader; - private final ModList modList; - private final ModLoadingClassLoader modClassLoader; - - public ModLoader(final ClassLoader launchClassLoader, final ModList modList) - { - this.launchClassLoader = launchClassLoader; - this.modList = modList; - this.modClassLoader = new ModLoadingClassLoader(this, this.launchClassLoader); - } - - public void classloadModFiles() - { - - } - - public ModList getModList() - { - return modList; - } - - public void loadMods() { - modList.setLoadedMods(modList.getModFiles().stream(). - map(ModFileInfo::getFile). - map(mf -> mf.buildMods(this.modClassLoader)). - flatMap(Collection::stream).collect(Collectors.toList())); - - LifecycleEventProvider.LOAD.dispatch(modList); - LifecycleEventProvider.PREINIT.dispatch(modList); - } -} diff --git a/src/main/java/net/minecraftforge/fml/loading/ModSorter.java b/src/main/java/net/minecraftforge/fml/loading/ModSorter.java index f5b7bd9e17..472e0757c8 100644 --- a/src/main/java/net/minecraftforge/fml/loading/ModSorter.java +++ b/src/main/java/net/minecraftforge/fml/loading/ModSorter.java @@ -19,7 +19,6 @@ package net.minecraftforge.fml.loading; -import net.minecraftforge.fml.DefaultModContainers; import net.minecraftforge.fml.Java9BackportUtils; import net.minecraftforge.fml.common.DuplicateModsFoundException; import net.minecraftforge.fml.common.MissingModsException; @@ -27,14 +26,17 @@ import net.minecraftforge.fml.common.toposort.TopologicalSort; import net.minecraftforge.fml.common.versioning.ArtifactVersion; import net.minecraftforge.fml.language.IModInfo; import net.minecraftforge.fml.loading.moddiscovery.ModFile; +import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; import net.minecraftforge.fml.loading.moddiscovery.ModInfo; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -42,34 +44,59 @@ import static net.minecraftforge.fml.Logging.LOADING; public class ModSorter { - private final List modFiles; + private static final Logger LOGGER = LogManager.getLogger("FML"); + private List modFiles; private List sortedList; private Map modIdNameLookup; - public ModSorter(final List modFiles) + private ModSorter(final List modFiles) { this.modFiles = modFiles; } - public static ModList sort(List mods) + public static LoadingModList sort(List mods) { final ModSorter ms = new ModSorter(mods); ms.buildUniqueList(); ms.verifyDependencyVersions(); ms.sort(); - return ModList.of(ms.modFiles, ms.sortedList); + return LoadingModList.of(ms.modFiles, ms.sortedList); } - private void sort() { - final TopologicalSort.DirectedGraph topoGraph = new TopologicalSort.DirectedGraph<>(); - modFiles.stream().map(ModFile::getModInfos). - flatMap(Collection::stream).forEach(topoGraph::addNode); - modFiles.stream().map(ModFile::getModInfos). - flatMap(Collection::stream).map(IModInfo::getDependencies).flatMap(Collection::stream).forEach(dep->addDependency(topoGraph, dep)); - } - - private void addDependency(TopologicalSort.DirectedGraph topoGraph, IModInfo.ModVersion dep) + private void sort() { + final TopologicalSort.DirectedGraph> topoGraph = new TopologicalSort.DirectedGraph<>(); + modFiles.stream().map(ModFile::getModFileInfo).map(ModFileInfo.class::cast).forEach(mi -> topoGraph.addNode(() -> mi)); + modFiles.stream().map(ModFile::getModInfos).flatMap(Collection::stream).map(IModInfo::getDependencies).flatMap(Collection::stream). + forEach(dep -> addDependency(topoGraph, dep)); + final List> sorted; + try + { + sorted = TopologicalSort.topologicalSort(topoGraph); + } + catch (TopologicalSort.TopoSortException e) + { + TopologicalSort.TopoSortException.TopoSortExceptionData> data = e.getData(); + LOGGER.error(LOADING, ()-> data); + throw e; + } + this.sortedList = sorted.stream().map(Supplier::get).map(ModFileInfo::getMods). + flatMap(Collection::stream).map(ModInfo.class::cast).collect(Collectors.toList()); + this.modFiles = sorted.stream().map(Supplier::get).map(ModFileInfo::getFile).collect(Collectors.toList()); + } + + private void addDependency(TopologicalSort.DirectedGraph> topoGraph,IModInfo.ModVersion dep) + { + switch (dep.getOrdering()) { + case BEFORE: + topoGraph.addEdge(()->(ModFileInfo)dep.getOwner().getOwningFile(), ()->modIdNameLookup.get(dep.getModId()).getOwningFile()); + break; + case AFTER: + topoGraph.addEdge(()->modIdNameLookup.get(dep.getModId()).getOwningFile(), ()->(ModFileInfo)dep.getOwner().getOwningFile()); + break; + case NONE: + break; + } } private void buildUniqueList() @@ -90,7 +117,7 @@ public class ModSorter private void verifyDependencyVersions() { final Map modVersions = Stream.concat(modFiles.stream().map(ModFile::getModInfos). - flatMap(Collection::stream), DefaultModContainers.getModInfos().stream()).collect(Collectors.toMap(IModInfo::getModId, IModInfo::getVersion)); + flatMap(Collection::stream), DefaultModInfos.getModInfos().stream()).collect(Collectors.toMap(IModInfo::getModId, IModInfo::getVersion)); final Map> modVersionDependencies = modFiles.stream(). map(ModFile::getModInfos).flatMap(Collection::stream). collect(Collectors.groupingBy(Function.identity(), Java9BackportUtils.flatMapping(e -> e.getDependencies().stream(), Collectors.toList()))); diff --git a/src/main/java/net/minecraftforge/fml/loading/moddiscovery/BackgroundScanHandler.java b/src/main/java/net/minecraftforge/fml/loading/moddiscovery/BackgroundScanHandler.java index 82c51fcc47..fc99a64166 100644 --- a/src/main/java/net/minecraftforge/fml/loading/moddiscovery/BackgroundScanHandler.java +++ b/src/main/java/net/minecraftforge/fml/loading/moddiscovery/BackgroundScanHandler.java @@ -20,7 +20,7 @@ package net.minecraftforge.fml.loading.moddiscovery; import net.minecraftforge.fml.language.ModFileScanData; -import net.minecraftforge.fml.loading.ModList; +import net.minecraftforge.fml.loading.LoadingModList; import java.util.ArrayList; import java.util.List; @@ -38,7 +38,7 @@ public class BackgroundScanHandler private final List pendingFiles; private final List scannedFiles; private final List allFiles; - private ModList modList; + private LoadingModList loadingModList; public BackgroundScanHandler() { modContentScanner = Executors.newSingleThreadExecutor(r -> { @@ -86,13 +86,13 @@ public class BackgroundScanHandler return allFiles; } - public void setModList(ModList modList) + public void setLoadingModList(LoadingModList loadingModList) { - this.modList = modList; + this.loadingModList = loadingModList; } - public ModList getModList() + public LoadingModList getLoadingModList() { - return modList; + return loadingModList; } } diff --git a/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModDiscoverer.java b/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModDiscoverer.java index faa7bd9cff..ca96debd77 100644 --- a/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModDiscoverer.java +++ b/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModDiscoverer.java @@ -21,7 +21,7 @@ package net.minecraftforge.fml.loading.moddiscovery; import cpw.mods.modlauncher.ServiceLoaderStreamUtils; import net.minecraftforge.fml.loading.FMLLoader; -import net.minecraftforge.fml.loading.ModList; +import net.minecraftforge.fml.loading.LoadingModList; import net.minecraftforge.fml.loading.ModSorter; import java.util.Collection; @@ -70,10 +70,10 @@ public class ModDiscoverer { } } fmlLog.debug(SCAN,"Found {} mod files with {} mods", mods::size, ()->mods.stream().mapToInt(mf -> mf.getModInfos().size()).sum()); - final ModList modList = ModSorter.sort(mods); - modList.addCoreMods(); - modList.addAccessTransformers(); - modList.addForScanning(backgroundScanHandler); + final LoadingModList loadingModList = ModSorter.sort(mods); + loadingModList.addCoreMods(); + loadingModList.addAccessTransformers(); + loadingModList.addForScanning(backgroundScanHandler); return backgroundScanHandler; } } diff --git a/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java b/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java index e690d41a33..a36f405b4f 100644 --- a/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java +++ b/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java @@ -20,13 +20,11 @@ package net.minecraftforge.fml.loading.moddiscovery; import com.google.common.collect.ImmutableMap; -import net.minecraftforge.fml.language.ModContainer; import net.minecraftforge.fml.language.IModFileInfo; import net.minecraftforge.fml.language.IModInfo; import net.minecraftforge.fml.language.ModFileScanData; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.fml.language.IModLanguageProvider; -import net.minecraftforge.fml.loading.ModLoadingClassLoader; import java.nio.file.Files; import java.nio.file.Path; @@ -37,11 +35,9 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Supplier; import java.util.jar.Attributes; import java.util.jar.Manifest; -import java.util.stream.Collectors; import static net.minecraftforge.fml.Logging.LOADING; import static net.minecraftforge.fml.Logging.SCAN; @@ -74,12 +70,6 @@ public class ModFile return locator.findPath(this, className); } - public List buildMods(ModLoadingClassLoader modClassLoader) - { - return getScanResult().getTargets().entrySet().stream(). - map(e->e.getValue().loadMod(this.modInfoMap.get(e.getKey()), modClassLoader, getScanResult())).collect(Collectors.toList()); - } - public enum Type { MOD, LIBRARY, LANGPROVIDER } @@ -88,7 +78,6 @@ public class ModFile private final Manifest manifest; private final IModLocator locator; private IModFileInfo modFileInfo; - private Map modInfoMap; private ModFileScanData fileModFileScanData; private CompletableFuture futureScanResult; private List coreMods; @@ -129,7 +118,6 @@ public class ModFile this.modFileInfo = ModFileParser.readModList(this); if (this.modFileInfo == null) return false; fmlLog.debug(LOADING,"Loading mod file {} with language {}", this.getFilePath(), this.modFileInfo.getModLoader()); - this.modInfoMap = this.getModInfos().stream().collect(Collectors.toMap(IModInfo::getModId, Function.identity())); this.coreMods = ModFileParser.getCoreMods(this); this.coreMods.forEach(mi-> fmlLog.debug(LOADING,"Found coremod {}", mi.getPath())); this.accessTransformer = locator.findPath(this, "META-INF", "accesstransformer.cfg"); diff --git a/src/main/java/net/minecraftforge/fml/server/FMLServerHandler.java b/src/main/java/net/minecraftforge/fml/server/FMLServerHandler.java index 73e8456c61..c4c0ceec35 100644 --- a/src/main/java/net/minecraftforge/fml/server/FMLServerHandler.java +++ b/src/main/java/net/minecraftforge/fml/server/FMLServerHandler.java @@ -42,7 +42,7 @@ import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.IFMLSidedHandler; import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.StartupQuery; import net.minecraftforge.fml.common.network.FMLNetworkEvent; import net.minecraftforge.fml.relauncher.Side; diff --git a/src/main/java/net/minecraftforge/oredict/OreDictionary.java b/src/main/java/net/minecraftforge/oredict/OreDictionary.java index e7017ef1e5..767aa4e36c 100644 --- a/src/main/java/net/minecraftforge/oredict/OreDictionary.java +++ b/src/main/java/net/minecraftforge/oredict/OreDictionary.java @@ -30,7 +30,7 @@ import java.util.Set; import net.minecraft.block.BlockPrismarine; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraft.block.Block; import net.minecraft.init.Blocks; diff --git a/src/test/java/net/minecraftforge/debug/util/ModNameTooltip.java b/src/test/java/net/minecraftforge/debug/util/ModNameTooltip.java index b5034889af..edbe97225c 100644 --- a/src/test/java/net/minecraftforge/debug/util/ModNameTooltip.java +++ b/src/test/java/net/minecraftforge/debug/util/ModNameTooltip.java @@ -28,7 +28,7 @@ import net.minecraft.util.text.TextFormatting; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.language.ModContainer; +import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.relauncher.Side; @Mod(modid = "forgemodnametooltip", name = "ForgeModNameTooltip", version = "1.0", clientSideOnly = true)