From e9580877b484dd929f5b5385b5f61b5be858cb6f Mon Sep 17 00:00:00 2001 From: cpw Date: Tue, 1 Jan 2019 16:50:04 -0500 Subject: [PATCH] fix up some discovery code, and make regular runtime _mostly_ work. Still WIP and doesn't quite get to main screen yet. --- build.gradle | 12 +- .../fml/loading/DefaultModInfos.java | 5 +- .../fml/loading/FMLClientLaunchProvider.java | 14 +- .../fml/loading/FMLCommonLaunchHandler.java | 28 +- .../loading/FMLDevClientLaunchProvider.java | 8 +- .../minecraftforge/fml/loading/FMLLoader.java | 28 +- .../fml/loading/FMLServiceProvider.java | 10 + .../fml/loading/LanguageLoadingProvider.java | 51 ++- .../fml/loading/LibraryFinder.java | 17 +- .../ExplodedDirectoryLocator.java | 4 +- ...aftforge.fml.language.IModLanguageProvider | 0 .../resources/minecraftmod.toml | 0 .../net/minecraftforge/fml/LaunchTesting.java | 1 + .../resources/META-INF/accesstransformer.cfg | 388 ++++++++++++++++++ 14 files changed, 528 insertions(+), 38 deletions(-) delete mode 100644 src/fmllauncher/resources/META-INF/services/net.minecraftforge.fml.language.IModLanguageProvider rename src/{main => fmllauncher}/resources/minecraftmod.toml (100%) create mode 100644 src/main/resources/META-INF/accesstransformer.cfg diff --git a/build.gradle b/build.gradle index 13f1958cd..e4b6dec00 100644 --- a/build.gradle +++ b/build.gradle @@ -195,7 +195,7 @@ project(':forge') { MANIFESTS = [ '/': [ 'Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - 'GitCommit': grgit.head().getAbbreviatedId(8), + 'GitCommit': grgit.head().abbreviatedId, 'Git-Branch': grgit.branch.current().getName() ] as LinkedHashMap, 'net/minecraftforge/versions/forge/': [ @@ -221,6 +221,14 @@ project(':forge') { 'Implementation-Title': 'FML Java Mod', 'Implementation-Version': SPEC_VERSION, 'Implementation-Vendor': 'Forge' + ] as LinkedHashMap, + 'net/minecraftforge/fml/loading/': [ + 'Specification-Title': 'Launcher', + 'Specification-Vendor': 'Forge Development LLC', + 'Specification-Version': '1', + 'Implementation-Title': 'FML Launcher', + 'Implementation-Version': SPEC_VERSION, + 'Implementation-Vendor': 'Forge' ] as LinkedHashMap ] } @@ -449,7 +457,7 @@ project(':forge') { ] ], arguments: [ - game: ['--launchTarget', 'fmlclient'] + game: ['--launchTarget', 'fmlclient', '--fml.forgeVersion', "${project.version.substring(MC_VERSION.length() + 1)}", '--fml.mcVersion', "${MC_VERSION}", '--fml.forgeGroup', "${project.group}", '--fml.mcpVersion', "${MCP_VERSION}"] ], libraries: [ [ diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/DefaultModInfos.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/DefaultModInfos.java index 62b726490..f17e1bbb8 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/DefaultModInfos.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/DefaultModInfos.java @@ -36,7 +36,7 @@ import java.util.Objects; public class DefaultModInfos { static { - FileConfig minecraftmod; FileConfig forgemod; + FileConfig minecraftmod; try { final URI jarFileURI = DefaultModInfos.class.getClassLoader().getResource("minecraftmod.toml").toURI(); @@ -49,10 +49,9 @@ public class DefaultModInfos } catch (IOException | URISyntaxException | NullPointerException e) { - throw new RuntimeException("Missing toml configs for minecraft and forge!", e); + throw new RuntimeException("Missing toml config for minecraft!", e); } minecraftModInfo = new ModInfo(null, minecraftmod); - } public static final IModInfo minecraftModInfo; diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLClientLaunchProvider.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLClientLaunchProvider.java index 8fabffb89..4bc3d0444 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLClientLaunchProvider.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLClientLaunchProvider.java @@ -30,7 +30,8 @@ import org.apache.logging.log4j.Logger; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.concurrent.Callable; @@ -61,8 +62,19 @@ public class FMLClientLaunchProvider extends FMLCommonLaunchHandler implements I }; } + @SuppressWarnings("unchecked") @Override public void setup(final IEnvironment environment, final Map arguments) { + final List mavenRoots = new ArrayList<>((List) arguments.get("mavenRoots")); + final List mods = new ArrayList<>((List) arguments.get("mods")); + mavenRoots.add(LibraryFinder.findLibsPath().toString()); + final String forgeVersion = (String) arguments.get("forgeVersion"); + final String mcVersion = (String) arguments.get("mcVersion"); + final String forgeGroup = (String) arguments.get("forgeGroup"); + mods.add(forgeGroup+":forge::universal:"+mcVersion+"-"+forgeVersion); + // generics are gross yea? + ((Map)arguments).put("mavenRoots", mavenRoots); + ((Map)arguments).put("mods", mods); } @Override diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java index ca1624727..89a48042e 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java @@ -19,18 +19,21 @@ package net.minecraftforge.fml.loading; -import com.google.common.collect.ObjectArrays; import cpw.mods.modlauncher.api.IEnvironment; import cpw.mods.modlauncher.api.ITransformingClassLoader; import net.minecraftforge.api.distmarker.Dist; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Predicate; +import java.util.stream.Stream; + +import static net.minecraftforge.fml.loading.LogMarkers.CORE; public abstract class FMLCommonLaunchHandler { @@ -48,12 +51,12 @@ public abstract class FMLCommonLaunchHandler return cn -> SKIPPACKAGES.stream().noneMatch(cn::startsWith); } - public Path getForgePath(final String mcVersion, final String forgeVersion) { - return LibraryFinder.getForgeLibraryPath(mcVersion, forgeVersion); + public Path getForgePath(final String mcVersion, final String forgeVersion, final String forgeGroup) { + return LibraryFinder.getForgeLibraryPath(mcVersion, forgeVersion, forgeGroup); } - public Path[] getMCPaths(final String mcVersion, final String forgeVersion) { - return LibraryFinder.getMCPaths(mcVersion, forgeVersion, getDist().isClient() ? "client" : "server"); + public Path[] getMCPaths(final String mcVersion, final String mcpVersion, final String forgeVersion, final String forgeGroup) { + return LibraryFinder.getMCPaths(mcVersion, mcpVersion, forgeVersion, forgeGroup, getDist().isClient() ? "client" : "server"); } public void setup(final IEnvironment environment, final Map arguments) @@ -67,4 +70,19 @@ public abstract class FMLCommonLaunchHandler { FMLLoader.beforeStart(launchClassLoader); } + + protected void validatePaths(final Path forgePath, final Path[] mcPaths, String forgeVersion, String mcVersion, String mcpVersion) { + if (!Files.exists(forgePath)) { + LOGGER.fatal(CORE, "Failed to find forge version {} for MC {} at {}", forgeVersion, mcVersion, forgePath); + throw new RuntimeException("Missing forge!"); + } + + Stream.of(mcPaths).forEach(p->{ + if (!Files.exists(p)) { + LOGGER.fatal(CORE, "Failed to find Minecraft resource version {} at {}", mcVersion+"-"+mcpVersion, p); + throw new RuntimeException("Missing minecraft resource!"); + } + }); + + } } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLDevClientLaunchProvider.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLDevClientLaunchProvider.java index 9e6973ead..42a228165 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLDevClientLaunchProvider.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLDevClientLaunchProvider.java @@ -53,13 +53,13 @@ public class FMLDevClientLaunchProvider extends FMLCommonLaunchHandler implement return LibraryFinder.commonLibPaths(new Path[] {FMLLoader.getForgePath()}); } - public Path getForgePath(final String mcVersion, final String forgeVersion) { + public Path getForgePath(final String mcVersion, final String forgeVersion, final String forgeGroup) { // In forge dev, we just find the path for ForgeVersion for everything compiledClasses = LibraryFinder.findJarPathFor("net/minecraftforge/versions/forge/ForgeVersion.class", "forge"); return compiledClasses; } - public Path[] getMCPaths(final String mcVersion, final String forgeVersion) { + public Path[] getMCPaths(final String mcVersion, final String forgeVersion, final String forgeGroup) { // In forge dev, we just find the path for ForgeVersion for everything return new Path[] { compiledClasses, compiledClasses }; } @@ -92,4 +92,8 @@ public class FMLDevClientLaunchProvider extends FMLCommonLaunchHandler implement { return Dist.CLIENT; } + + @Override + protected void validatePaths(final Path forgePath, final Path[] mcPaths, final String forgeVersion, final String mcVersion, final String mcpVersion) { + } } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLLoader.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLLoader.java index 00606bdd7..4ee097cb5 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLLoader.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLLoader.java @@ -41,6 +41,7 @@ import java.nio.file.Paths; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.minecraftforge.fml.loading.LogMarkers.CORE; import static net.minecraftforge.fml.loading.LogMarkers.SCAN; @@ -60,8 +61,10 @@ public class FMLLoader private static Path gamePath; private static Path forgePath; private static Path[] mcPaths; - static String forgeVersion; static String mcVersion; + private static String mcpVersion; + static String forgeVersion; + private static String forgeGroup; private static Predicate classLoaderExclusions; static void onInitialLoad(IEnvironment environment, Set otherServices) throws IncompatibleEnvironmentException @@ -134,26 +137,19 @@ public class FMLLoader dist = commonLaunchHandler.getDist(); mcVersion = (String) arguments.get("mcVersion"); + mcpVersion = (String) arguments.get("mcpVersion"); forgeVersion = (String) arguments.get("forgeVersion"); - forgePath = commonLaunchHandler.getForgePath(mcVersion, forgeVersion); - mcPaths = commonLaunchHandler.getMCPaths(mcVersion, forgeVersion); + forgeGroup = (String) arguments.get("forgeGroup"); - if (!Files.exists(forgePath)) { - LOGGER.fatal(CORE, "Failed to find forge version {} for MC {} at {}", forgeVersion, mcVersion, forgePath); - throw new RuntimeException("Missing forge!"); - } - if (!Files.exists(mcPaths[0])) { - LOGGER.fatal(CORE, "Failed to find deobfuscated Minecraft version {} at {}", mcVersion, mcPaths[0]); - throw new RuntimeException("Missing deobfuscated minecraft!"); - } - if (!Files.exists(mcPaths[1])) { - LOGGER.fatal(CORE, "Failed to find forge patches for Minecraft version {} at {}", mcVersion, mcPaths[1]); - throw new RuntimeException("Missing forge patches!"); - } + LOGGER.fatal("Received command line version data : MC Version: '{}' MCP Version: '{}' Forge Version: '{}' Forge group: '{}'", mcVersion, mcpVersion, forgeVersion, forgeGroup); + forgePath = commonLaunchHandler.getForgePath(mcVersion, forgeVersion, forgeGroup); + mcPaths = commonLaunchHandler.getMCPaths(mcVersion, mcpVersion, forgeVersion, forgeGroup); + commonLaunchHandler.validatePaths(forgePath, mcPaths, forgeVersion, mcVersion, mcpVersion); commonLaunchHandler.setup(environment, arguments); classLoaderExclusions = commonLaunchHandler.getPackagePredicate(); languageLoadingProvider = new LanguageLoadingProvider(); + languageLoadingProvider.addForgeLanguage(forgePath); runtimeDistCleaner.getExtension().accept(dist); } @@ -180,6 +176,7 @@ public class FMLLoader public static void loadAccessTransformer() { +/* final URL resource = FMLLoader.class.getClassLoader().getResource("forge_at.cfg"); if (resource == null) { throw new RuntimeException("Missing forge_at.cfg file"); @@ -194,6 +191,7 @@ public class FMLLoader LOGGER.error("Error loading forge_at.cfg file", e); throw new RuntimeException(e); } +*/ } public static void addAccessTransformer(Path atPath, ModFile modName) diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLServiceProvider.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLServiceProvider.java index bc3931a6d..32bef29ba 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLServiceProvider.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLServiceProvider.java @@ -43,11 +43,15 @@ public class FMLServiceProvider implements ITransformationService private ArgumentAcceptingOptionSpec mavenRootsOption; private ArgumentAcceptingOptionSpec forgeOption; private ArgumentAcceptingOptionSpec mcOption; + private ArgumentAcceptingOptionSpec forgeGroupOption; + private ArgumentAcceptingOptionSpec mcpOption; private List modsArgumentList; private List modListsArgumentList; private List mavenRootsArgumentList; private String targetForgeVersion; private String targetMcVersion; + private String targetMcpVersion; + private String targetForgeGroup; @Override public String name() @@ -67,7 +71,9 @@ public class FMLServiceProvider implements ITransformationService arguments.put("mods", modsArgumentList); arguments.put("mavenRoots", mavenRootsArgumentList); arguments.put("forgeVersion", targetForgeVersion); + arguments.put("forgeGroup", targetForgeGroup); arguments.put("mcVersion", targetMcVersion); + arguments.put("mcpVersion", targetMcpVersion); LOGGER.debug(CORE, "Preparing launch handler"); FMLLoader.setupLaunchHandler(environment, arguments); LOGGER.debug(CORE,"Initiating mod scan"); @@ -86,7 +92,9 @@ public class FMLServiceProvider implements ITransformationService public void arguments(BiFunction argumentBuilder) { forgeOption = argumentBuilder.apply("forgeVersion", "Forge Version number").withRequiredArg().ofType(String.class).required(); + forgeGroupOption = argumentBuilder.apply("forgeGroup", "Forge Group (for testing)").withRequiredArg().ofType(String.class).defaultsTo("net.minecraftforge"); mcOption = argumentBuilder.apply("mcVersion", "Minecraft Version number").withRequiredArg().ofType(String.class).required(); + mcpOption = argumentBuilder.apply("mcpVersion", "MCP Version number").withRequiredArg().ofType(String.class).required(); modsOption = argumentBuilder.apply("mods", "List of mods to add").withRequiredArg().ofType(String.class).withValuesSeparatedBy(","); modListsOption = argumentBuilder.apply("modLists", "JSON modlists").withRequiredArg().ofType(String.class).withValuesSeparatedBy(","); mavenRootsOption = argumentBuilder.apply("mavenRoots", "Maven root directories").withRequiredArg().ofType(String.class).withValuesSeparatedBy(","); @@ -99,7 +107,9 @@ public class FMLServiceProvider implements ITransformationService modListsArgumentList = option.values(modListsOption); mavenRootsArgumentList = option.values(mavenRootsOption); targetForgeVersion = option.value(forgeOption); + targetForgeGroup = option.value(forgeGroupOption); targetMcVersion = option.value(mcOption); + targetMcpVersion = option.value(mcpOption); } @Nonnull diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/LanguageLoadingProvider.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/LanguageLoadingProvider.java index 901550a30..851031f22 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/LanguageLoadingProvider.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/LanguageLoadingProvider.java @@ -19,6 +19,7 @@ package net.minecraftforge.fml.loading; +import cpw.mods.modlauncher.ServiceLoaderStreamUtils; import net.minecraftforge.fml.language.IModLanguageProvider; import net.minecraftforge.fml.loading.moddiscovery.ExplodedDirectoryLocator; import net.minecraftforge.fml.loading.moddiscovery.ModFile; @@ -28,8 +29,11 @@ import org.apache.maven.artifact.versioning.ArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.VersionRange; +import java.io.File; +import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.net.URLClassLoader; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -37,11 +41,13 @@ import java.util.*; import java.util.function.Consumer; import java.util.stream.Stream; +import static cpw.mods.modlauncher.api.LamdbaExceptionUtils.rethrowFunction; import static net.minecraftforge.fml.loading.LogMarkers.CORE; public class LanguageLoadingProvider { private static final Logger LOGGER = LogManager.getLogger(); + private final LanguageClassLoader languageClassLoader; private final List languageProviders = new ArrayList<>(); private final ServiceLoader serviceLoader; private final Map languageProviderMap = new HashMap<>(); @@ -52,9 +58,9 @@ public class LanguageLoadingProvider } private static class ModLanguageWrapper { + private final IModLanguageProvider modLanguageProvider; private final ArtifactVersion version; - public ModLanguageWrapper(IModLanguageProvider modLanguageProvider, ArtifactVersion version) { this.modLanguageProvider = modLanguageProvider; @@ -70,9 +76,29 @@ public class LanguageLoadingProvider { return modLanguageProvider; } + + } + private static class LanguageClassLoader extends URLClassLoader + { + + public LanguageClassLoader() { + super(new URL[0]); + } + @Override + public void addURL(final URL url) { + LOGGER.debug(CORE, "Adding {} to languageloader classloader", url); + super.addURL(url); + } + } LanguageLoadingProvider() { - serviceLoader = ServiceLoader.load(IModLanguageProvider.class); + languageClassLoader = new LanguageClassLoader(); + serviceLoader = ServiceLoader.load(IModLanguageProvider.class, languageClassLoader); + loadLanguageProviders(); + } + + private void loadLanguageProviders() { + LOGGER.debug(CORE, "Found {} language providers", ServiceLoaderStreamUtils.toList(serviceLoader).size()); serviceLoader.forEach(languageProviders::add); languageProviders.forEach(lp -> { @@ -88,16 +114,35 @@ public class LanguageLoadingProvider LOGGER.fatal(CORE, "Found unversioned system classpath language provider {}", lp.name()); throw new RuntimeException("Failed to find implementation version for language provider "+ lp.name()); } - LOGGER.debug(CORE, "Found system classpath language provider {}, version {}", lp.name(), impl); + LOGGER.debug(CORE, "Found language provider {}, version {}", lp.name(), impl); languageProviderMap.put(lp.name(), new ModLanguageWrapper(lp, new DefaultArtifactVersion(impl))); }); } + void addForgeLanguage(final Path forgePath) { + if (!languageProviderMap.containsKey("javafml")) { + LOGGER.debug(CORE,"Adding forge as a language from {}", forgePath.toString()); + addLanguagePaths(Stream.of(forgePath)); + serviceLoader.reload(); + loadLanguageProviders(); + } else { + LOGGER.debug(CORE, "Skipping adding forge jar - javafml is already present"); + } + } + + private void addLanguagePaths(final Stream langPaths) { + languageProviders.clear(); + languageProviderMap.clear(); + langPaths.map(Path::toFile).map(File::toURI).map(rethrowFunction(URI::toURL)).forEach(languageClassLoader::addURL); + } + public void addAdditionalLanguages(List modFiles) { if (modFiles==null) return; Stream langPaths = modFiles.stream().map(ModFile::getFilePath); + addLanguagePaths(langPaths); serviceLoader.reload(); + loadLanguageProviders(); } public IModLanguageProvider findLanguage(ModFile mf, String modLoader, VersionRange modLoaderVersion) { diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/LibraryFinder.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/LibraryFinder.java index bcd9d20a0..635a72cc6 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/LibraryFinder.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/LibraryFinder.java @@ -69,8 +69,8 @@ public class LibraryFinder { return ObjectArrays.concat(extras, realms); } - static Path getForgeLibraryPath(final String mcVersion, final String forgeVersion) { - Path forgePath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraftforge", "forge", "", "", mcVersion+"-"+forgeVersion)); + static Path getForgeLibraryPath(final String mcVersion, final String forgeVersion, final String forgeGroup) { + Path forgePath = findLibsPath().resolve(MavenCoordinateResolver.get(forgeGroup, "forge", "", "universal", mcVersion+"-"+forgeVersion)); LOGGER.debug(CORE, "Found forge path {} is {}", forgePath, pathStatus(forgePath)); return forgePath; } @@ -78,11 +78,16 @@ public class LibraryFinder { static String pathStatus(final Path path) { return Files.exists(path) ? "present" : "missing"; } - static Path[] getMCPaths(final String mcVersion, final String forgeVersion, final String type) { - Path srgMcPath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraft", type, "", "srg", mcVersion)); - Path patchedBinariesPath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraftforge", "forge", "", type, mcVersion+"-"+forgeVersion)); + + static Path[] getMCPaths(final String mcVersion, final String mcpVersion, final String forgeVersion, final String forgeGroup, final String type) { + Path srgMcPath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraft", type, "", "srg", mcVersion+"-"+mcpVersion)); + Path mcDataPath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraft", type, "", "data", mcVersion)); + Path mcExtrasPath = findLibsPath().resolve(MavenCoordinateResolver.get("net.minecraft", type, "", "extra", mcVersion)); + Path patchedBinariesPath = findLibsPath().resolve(MavenCoordinateResolver.get(forgeGroup, "forge", "", type, mcVersion+"-"+forgeVersion)); LOGGER.info("SRG MC at {} is {}", srgMcPath.toString(), pathStatus(srgMcPath)); + LOGGER.info("MC Data at {} is {}", mcDataPath.toString(), pathStatus(mcDataPath)); + LOGGER.info("MC Extras at {} is {}", mcExtrasPath.toString(), pathStatus(mcExtrasPath)); LOGGER.info("Forge patches at {} is {}", patchedBinariesPath.toString(), pathStatus(patchedBinariesPath)); - return new Path[] { srgMcPath, patchedBinariesPath }; + return new Path[] { patchedBinariesPath, mcDataPath, mcExtrasPath, srgMcPath }; } } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ExplodedDirectoryLocator.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ExplodedDirectoryLocator.java index 4ce9f9ff7..c7d81c4b9 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ExplodedDirectoryLocator.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ExplodedDirectoryLocator.java @@ -108,6 +108,8 @@ public class ExplodedDirectoryLocator implements IModLocator { @Override public void initArguments(final Map arguments) { final List> explodedTargets = ((Map>>) arguments).get("explodedTargets"); - rootDirs.addAll(explodedTargets); + if (explodedTargets != null && !explodedTargets.isEmpty()) { + rootDirs.addAll(explodedTargets); + } } } diff --git a/src/fmllauncher/resources/META-INF/services/net.minecraftforge.fml.language.IModLanguageProvider b/src/fmllauncher/resources/META-INF/services/net.minecraftforge.fml.language.IModLanguageProvider deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/minecraftmod.toml b/src/fmllauncher/resources/minecraftmod.toml similarity index 100% rename from src/main/resources/minecraftmod.toml rename to src/fmllauncher/resources/minecraftmod.toml diff --git a/src/main/java/net/minecraftforge/fml/LaunchTesting.java b/src/main/java/net/minecraftforge/fml/LaunchTesting.java index 8cb514865..c82fff5b8 100644 --- a/src/main/java/net/minecraftforge/fml/LaunchTesting.java +++ b/src/main/java/net/minecraftforge/fml/LaunchTesting.java @@ -70,6 +70,7 @@ public class LaunchTesting "--assetsDir", assets, "--userProperties", "{}", "--fml.forgeVersion", "24.0.0", + "--fml.mcpVersion", "2018.11.30", "--fml.mcVersion", "1.13"); } else if (Objects.equals(target, "fmldevserver")) { String[] launchargs = ObjectArrays.concat(new String[] {"--launchTarget", target, diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 000000000..a41a4dd5e --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,388 @@ +#Main Forge Access Transformer configuration file +# SoundManager +public net.minecraft.client.audio.SoundManager field_148622_c #sndHandler +# Block +public net.minecraft.block.Block (Lnet/minecraft/block/material/Material;)V +public net.minecraft.block.Block func_149752_b(F)Lnet.minecraft.block.Block; #setResistance +public net.minecraft.block.Block func_149711_c(F)Lnet.minecraft.block.Block; #setHardness +public net.minecraft.block.Block func_149713_g(I)Lnet.minecraft.block.Block; #setLightOpacity +public net.minecraft.block.Block func_149715_a(F)Lnet.minecraft.block.Block; #setLightValue +public net.minecraft.block.Block func_149722_s()Lnet.minecraft.block.Block; #setBlockUnbreakable +public net.minecraft.block.Block func_149675_a(Z)Lnet.minecraft.block.Block; #setTickRandomly +public net.minecraft.block.Block func_180637_b(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;I)V # dropXpOnBlockBreak +# BlockFire +public net.minecraft.block.BlockFire func_176532_c(Lnet/minecraft/block/Block;)I # getFireSpreadSpeed +public net.minecraft.block.BlockFire func_176534_d(Lnet/minecraft/block/Block;)I # getFireSpreadSpeed +# Item +public net.minecraft.item.Item func_77656_e(I)Lnet.minecraft.item.Item; #setMaxDamage +public net.minecraft.item.Item func_77627_a(Z)Lnet.minecraft.item.Item; #setHasSubtypes +public net.minecraft.item.Item field_185051_m # properties +# Fluid +public net.minecraft.fluid.Fluid func_180664_k()Lnet/minecraft/util/BlockRenderLayer; # getRenderLayer +# Entity +public net.minecraft.entity.Entity func_70022_Q()Ljava/lang/String; # getEntityString +# EntityPlayer +public net.minecraft.entity.player.EntityPlayer func_71053_j()V #closeScreen +# EntityTrackerEntry +public net.minecraft.entity.EntityTrackerEntry field_73134_o # trackingPlayers +# Save Location +public net.minecraft.world.chunk.storage.AnvilChunkLoader field_75825_d # chunkSaveLocation +public net.minecraft.world.gen.ChunkProviderServer field_73247_e # currentChunkLoader +# World +public-f net.minecraft.world.World field_72982_D #villageCollectionObj +# Biome +public net.minecraft.world.biome.Biome *() #Everything protected->public +public net.minecraft.world.biome.BiomeForest *() +public net.minecraft.world.biome.BiomeHills *() +public net.minecraft.world.biome.BiomeMesa *() +public net.minecraft.world.biome.BiomePlains *() +public net.minecraft.world.biome.BiomeSavanna *() +public net.minecraft.world.biome.BiomeSnow *() +public net.minecraft.world.biome.BiomeTaiga *() +public net.minecraft.world.biome.Biome$BiomeProperties *() +# Map Gen Biome Lists +public+f net.minecraft.world.gen.structure.MapGenStronghold field_151546_e +# MapGenVillage +public-f net.minecraft.world.gen.structure.MapGenVillage field_75055_e #villageSpawnBiomes +# LayerUtil +public net.minecraft.world.gen.layer.LayerUtil func_202829_a(JLnet/minecraft/world/gen/layer/traits/IAreaTransformer1;Lnet/minecraft/world/gen/area/IAreaFactory;ILjava/util/function/LongFunction;)Lnet/minecraft/world/gen/area/IAreaFactory; # repeat +# ShapedRecipes +public+f net.minecraft.item.crafting.ShapedRecipes field_77574_d #recipeItems +public+f net.minecraft.item.crafting.ShapedRecipes field_77576_b #recipeWidth +public+f net.minecraft.item.crafting.ShapedRecipes field_77577_c #recipeHeight +# ShapelessRecipes +public net.minecraft.item.crafting.ShapelessRecipes field_77579_b #recipeItems +# ContainerRepair +public net.minecraft.inventory.ContainerRepair field_82856_l #ContainerRepair/stackSizeToBeUsedInRepair +# BiomeDecorator +public net.minecraft.world.biome.BiomeDecorator * +# CreativeTabs +public-f net.minecraft.creativetab.CreativeTabs field_78032_a # creativeTabArray non-final +# World stuff +public net.minecraft.world.World field_73003_n #prevRainingStrength +public net.minecraft.world.World field_73004_o #rainingStrength +public net.minecraft.world.World field_73017_q #thunderingStrength +public net.minecraft.world.World field_73018_p #prevThunderingStrength +public net.minecraft.world.World func_72923_a(Lnet/minecraft/entity/Entity;)V #onEntityAdded +public net.minecraft.world.World func_72847_b(Lnet/minecraft/entity/Entity;)V #onEntityRemoved +public net.minecraft.world.WorldServer func_72923_a(Lnet/minecraft/entity/Entity;)V #onEntityAdded +public net.minecraft.world.WorldServer func_72847_b(Lnet/minecraft/entity/Entity;)V #onEntityRemoved +public net.minecraft.client.multiplayer.WorldClient func_72923_a(Lnet/minecraft/entity/Entity;)V #onEntityAdded +public net.minecraft.client.multiplayer.WorldClient func_72847_b(Lnet/minecraft/entity/Entity;)V #onEntityRemoved +public net.minecraft.world.World func_175701_a(Lnet/minecraft/util/math/BlockPos;)Z # isValid +public net.minecraft.world.World func_189509_E(Lnet/minecraft/util/math/BlockPos;)Z # isOutsideBuildHeight +# GuiIngame +protected net.minecraft.client.gui.GuiIngame * +protected net.minecraft.client.gui.GuiIngame func_194798_c(F)V +protected net.minecraft.client.gui.GuiIngame func_194800_d(F)V +protected net.minecraft.client.gui.GuiIngame func_194805_e(F)V +protected net.minecraft.client.gui.GuiIngame func_194808_p()V +protected net.minecraft.client.gui.GuiIngame func_194802_a(Lnet/minecraft/scoreboard/ScoreObjective;)V +# ItemStack +default net.minecraft.item.ItemStack field_77991_e +# MapGenStructureIO +public net.minecraft.world.gen.structure.MapGenStructureIO func_143034_b(Ljava/lang/Class;Ljava/lang/String;)V # registerStart +public net.minecraft.world.gen.structure.MapGenStructureIO func_143031_a(Ljava/lang/Class;Ljava/lang/String;)V # registerPiece +# Stronghold +public net.minecraft.world.gen.structure.StructureStrongholdPieces$Stronghold +# Packets +public net.minecraft.network.play.server.SPacketBlockChange field_148883_d # blockState +# WorldType +public-f net.minecraft.world.WorldType field_77139_a #worldTypes +# DamageSource +public net.minecraft.util.DamageSource *() #All methods public, most are already +# EntityAITasks +public net.minecraft.entity.ai.EntityAITasks field_75782_a # taskEntries +# EntityXPOrb +public net.minecraft.entity.item.EntityXPOrb field_70530_e # xpValue +# Village +public net.minecraft.world.gen.structure.StructureVillagePieces$Village +# RenderPlayer +#public net.minecraft.client.renderer.entity.RenderBiped field_77071_a #modelBipedMain +# ChunkProviderServer +public net.minecraft.world.gen.ChunkProviderServer field_186029_c # chunkGenerator +public net.minecraft.world.gen.ChunkProviderServer field_73244_f # loadedChunkHashMap +#public net.minecraft.world.gen.ChunkProviderServer field_73245_g # loadedChunks +public net.minecraft.world.gen.ChunkProviderServer field_73251_h # worldObj + +# RenderEntityItem +protected net.minecraft.client.renderer.entity.RenderEntityItem func_177078_a(Lnet/minecraft/item/ItemStack;)I # getMiniItemCount +public net.minecraft.item.crafting.RecipeTippedArrow +public net.minecraft.item.crafting.ShieldRecipes$Decoration +public net.minecraft.item.crafting.RecipesBanners$RecipeAddPattern +public net.minecraft.item.crafting.RecipesBanners$RecipeDuplicatePattern +public net.minecraft.block.state.BlockStateContainer$StateImplementation +protected net.minecraft.block.state.BlockStateContainer$StateImplementation (Lnet/minecraft/block/Block;Lcom/google/common/collect/ImmutableMap;)V +protected net.minecraft.block.state.BlockStateContainer$StateImplementation field_177238_c # propertyValueTable + +# ModelBlock +public net.minecraft.client.renderer.block.model.ModelBlock field_178318_c # textures +public net.minecraft.client.renderer.block.model.ModelBlock field_178315_d # parent +public net.minecraft.client.renderer.block.model.ModelBlock field_178322_i # ambientOcclusion +public net.minecraft.client.renderer.block.model.ModelBlock func_209568_a(Lnet/minecraft/client/renderer/block/model/ModelBlock;Ljava/util/function/Function;Ljava/util/function/Function;)Lnet/minecraft/client/renderer/block/model/ItemOverrideList; # getOverrides +public net.minecraft.client.renderer.block.model.ModelBlock func_187966_f()Ljava/util/List; # getOverrides + +# ModelBakery +public net.minecraft.client.renderer.block.model.ModelBakery field_177604_a # MODEL_MISSING +protected net.minecraft.client.renderer.block.model.ModelBakery field_177602_b # LOCATIONS_BUILTIN_TEXTURES +protected net.minecraft.client.renderer.block.model.ModelBakery field_177598_f # resourceManager +protected net.minecraft.client.renderer.block.model.ModelBakery field_177599_g # sprites +protected net.minecraft.client.renderer.block.model.ModelBakery field_177609_j # textureMap +protected net.minecraft.client.renderer.block.model.ModelBakery field_177610_k # blockModelShapes +protected net.minecraft.client.renderer.block.model.ModelBakery field_177605_n # bakedRegistry +protected net.minecraft.client.renderer.block.model.ModelBakery field_177606_o # MODEL_GENERATED +#protected net.minecraft.client.renderer.block.model.ModelBakery field_177618_p # MODEL_COMPASS +#protected net.minecraft.client.renderer.block.model.ModelBakery field_177617_q # MODEL_CLOCK +protected net.minecraft.client.renderer.block.model.ModelBakery field_177616_r # MODEL_ENTITY +#protected net.minecraft.client.renderer.block.model.ModelBakery func_177591_a(Ljava/util/Collection;)V # loadVariants +protected net.minecraft.client.renderer.block.model.ModelBakery func_177569_a(Lnet/minecraft/client/renderer/block/model/ModelBlockDefinition;Lnet/minecraft/client/renderer/block/model/ModelResourceLocation;)V # registerVariant +protected net.minecraft.client.renderer.block.model.ModelBakery func_177586_a(Lnet/minecraft/util/ResourceLocation;)Lnet/minecraft/client/renderer/block/model/ModelBlockDefinition; # getModelBlockDefinition +protected net.minecraft.client.renderer.block.model.ModelBakery func_177594_c(Lnet/minecraft/util/ResourceLocation;)Lnet/minecraft/client/renderer/block/model/ModelBlock; # loadModel +protected net.minecraft.client.renderer.block.model.ModelBakery func_177592_e()V # registerVariantNames +protected net.minecraft.client.renderer.block.model.ModelBakery func_177596_a(Lnet/minecraft/item/Item;)Ljava/util/List; # getVariantNames +protected net.minecraft.client.renderer.block.model.ModelBakery func_177583_a(Ljava/lang/String;)Lnet/minecraft/util/ResourceLocation; # getItemLocation +protected net.minecraft.client.renderer.block.model.ModelBakery func_177585_a(Lnet/minecraft/client/renderer/block/model/ModelBlock;)Ljava/util/Set; # getTextureLocations +protected net.minecraft.client.renderer.block.model.ModelBakery func_177581_b(Lnet/minecraft/client/renderer/block/model/ModelBlock;)Z # hasItemModel +protected net.minecraft.client.renderer.block.model.ModelBakery func_177587_c(Lnet/minecraft/client/renderer/block/model/ModelBlock;)Z # isCustomRenderer +protected net.minecraft.client.renderer.block.model.ModelBakery func_177582_d(Lnet/minecraft/client/renderer/block/model/ModelBlock;)Lnet/minecraft/client/renderer/block/model/ModelBlock; # makeItemModel +protected net.minecraft.client.renderer.block.model.ModelBakery func_177580_d(Lnet/minecraft/util/ResourceLocation;)Lnet/minecraft/util/ResourceLocation; # getModelLocation +protected net.minecraft.client.renderer.block.model.ModelBakery func_188640_b()V # loadBlocks +protected net.minecraft.client.renderer.block.model.ModelBakery func_177577_b()V # loadVariantItemModels +protected net.minecraft.client.renderer.block.model.ModelBakery func_177590_d()V # loadItemModels +protected net.minecraft.client.renderer.block.model.ModelBakery func_177595_c()V # loadVariantModels +protected net.minecraft.client.renderer.block.model.ModelBakery func_188637_e()V # loadMultipartVariantModels +protected net.minecraft.client.renderer.block.model.ModelBakery func_188638_a(Lnet/minecraft/client/renderer/block/model/ModelResourceLocation;Lnet/minecraft/client/renderer/block/model/VariantList;)V # loadVariantList +#public net.minecraft.client.renderer.block.model.WeightedBakedModel field_177565_b # models + +# ItemModelMesher +# This field is public and uses int IDs, so we hide it and expose ItemModelMesherForge methods instead +private net.minecraft.client.renderer.ItemModelMesher field_199313_a + +# ItemOverrideList +protected net.minecraft.client.renderer.block.model.ItemOverrideList ()V + +# EnumFacing +public net.minecraft.util.EnumFacing field_82609_l # VALUES +public net.minecraft.util.EnumFacing field_176754_o # HORIZONTALS +public net.minecraft.client.renderer.BufferBuilder func_78909_a(I)I # getColorIndex +public net.minecraft.client.renderer.BufferBuilder func_178972_a(IIII)V # putColorRGB -- Add A? +# ModelBlock Constructor +#public net.minecraft.client.renderer.block.model.ModelBlock (Lnet/minecraft/util/ResourceLocation;Ljava/util/List;Ljava/util/Map;ZZLnet/minecraft/client/renderer/block/model/ItemCameraTransforms;)V +# RenderLivingEntity +#public net.minecraft.client.renderer.entity.RenderLivingBase func_177094_a(Lnet/minecraft/client/renderer/entity/layers/LayerRenderer;)Z # addLayer + +# S00PacketServerInfo +public net.minecraft.network.status.server.SPacketServerInfo field_149297_a # GSON + +# Resource Packs +public net.minecraft.resources.FallbackResourceManager field_199023_a # resourcePacks +public net.minecraft.resources.AbstractResourcePack field_195771_a # file + +#Main FML Access Transformer configuration file +# EntityList addMappings +#public net.minecraft.entity.EntityList func_75618_a(Ljava/lang/Class;Ljava/lang/String;I)V +#public net.minecraft.entity.EntityList func_75614_a(Ljava/lang/Class;Ljava/lang/String;III)V +#public net.minecraft.entity.EntityList field_75625_b #nameToClassMap +#public net.minecraft.entity.EntityList field_75626_c #classToNameMap +#public net.minecraft.entity.EntityList field_75623_d #idToClassMap +## RenderManager +public net.minecraft.client.renderer.entity.RenderManager field_78729_o #renderers +## TileEntityRendererDispatcher +public net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher field_147559_m +public net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher field_147557_n # fontRenderer - needed for rendering text in TESR items before entering world +## EntityRenderer +public net.minecraft.client.renderer.EntityRenderer func_175069_a(Lnet/minecraft/util/ResourceLocation;)V #loadShader +## WeightedRandomItem +public net.minecraft.util.WeightedRandom$Item field_76292_a #probability +# EntityPlayer +public net.minecraft.entity.player.EntityPlayer func_184816_a(Lnet/minecraft/entity/item/EntityItem;)Lnet/minecraft/item/ItemStack; # dropItemAndGetStack +protected net.minecraft.entity.player.EntityPlayer field_71077_c # spawnPos +protected net.minecraft.entity.player.EntityPlayer field_82248_d # spawnForced +# EntityPlayerSP +public net.minecraft.client.entity.EntityPlayerSP func_184816_a(Lnet/minecraft/entity/item/EntityItem;)Lnet/minecraft/item/ItemStack; # dropItemAndGetStack +## EntityPlayerMP getNextWindowId +public net.minecraft.entity.player.EntityPlayerMP func_71117_bO()V +public net.minecraft.entity.player.EntityPlayerMP field_71139_cq +## EntityAITaskEntry +public net.minecraft.entity.ai.EntityAITasks$EntityAITaskEntry +## EntityLiving +public net.minecraft.entity.EntityLiving field_70714_bg #tasks +public net.minecraft.entity.EntityLiving field_70715_bh #targetTasks +## EntityMinecartContainer +public net.minecraft.entity.item.EntityMinecartContainer field_94112_b #dropContentsWhenDead +# GuiScreen +public net.minecraft.client.gui.GuiScreen field_146297_k # minecraft instance - public because gui's outside access it +# Minecraft +public net.minecraft.client.Minecraft field_71446_o # textureManager +public net.minecraft.client.Minecraft field_110450_ap # mcDefaultResourcePack +public net.minecraft.client.Minecraft func_71370_a(II)V # resize +public net.minecraft.client.Minecraft func_180510_a(Lnet/minecraft/client/renderer/texture/TextureManager;)V # drawSplashScreen +public net.minecraft.client.Minecraft func_184119_a(Lnet/minecraft/item/ItemStack;Lnet/minecraft/tileentity/TileEntity;)Lnet/minecraft/item/ItemStack; # storeTEInStack +# MinecraftServer +protected net.minecraft.server.MinecraftServer field_211151_aa # serverTime +## DedicatedServer +public net.minecraft.server.dedicated.DedicatedServer field_71341_l # pendingCommandList +## SaveFormatOld +public net.minecraft.world.storage.SaveFormatOld field_75808_a # savesDirectory + +protected net.minecraft.util.ObjectIntIdentityMap field_148749_a # internal map +protected net.minecraft.util.ObjectIntIdentityMap field_148748_b # internal index list +#protected-f net.minecraft.util.RegistryNamespaced field_148759_a # identitymap + +# GuiButton +public net.minecraft.client.gui.GuiButton field_146120_f # width - needed for config GUI stuff +public net.minecraft.client.gui.GuiButton field_146121_g # height - needed for config GUI stuff +# GuiTextField +public-f net.minecraft.client.gui.GuiTextField field_146218_h # width - needed for config GUI stuff +public-f net.minecraft.client.gui.GuiTextField field_146219_i # height - needed for config GUI stuff +# GuiSlot +public net.minecraft.client.gui.GuiSlot field_148149_f # slotHeight - needed for config GUI stuff +public net.minecraft.client.gui.GuiSlot field_148151_d # right - needed for config GUI stuff +public net.minecraft.client.gui.GuiSlot field_148152_e # left - needed for config GUI stuff +public net.minecraft.client.gui.GuiSlot field_148153_b # top - needed for config GUI stuff +public net.minecraft.client.gui.GuiSlot field_148154_c # bottom - needed for config GUI stuff +public net.minecraft.client.gui.GuiSlot field_148155_a # width - needed for config GUI stuff +public net.minecraft.client.gui.GuiSlot field_148158_l # height - needed for config GUI stuff +public net.minecraft.client.gui.GuiSlot field_148160_j # headerPadding - needed for config GUI stuff + +# Villager Traid Classes +public net.minecraft.entity.passive.EntityVillager$EmeraldForItems +public net.minecraft.entity.passive.EntityVillager$ITradeList +public net.minecraft.entity.passive.EntityVillager$ItemAndEmeraldToItem +public net.minecraft.entity.passive.EntityVillager$ListEnchantedBookForEmeralds +public net.minecraft.entity.passive.EntityVillager$ListEnchantedItemForEmeralds +public net.minecraft.entity.passive.EntityVillager$ListItemForEmeralds +public net.minecraft.entity.passive.EntityVillager$PriceInfo + +# Font renderer +protected net.minecraft.client.gui.FontRenderer field_78286_d # charWidth +protected net.minecraft.client.gui.FontRenderer field_78287_e # glyphWidth +protected net.minecraft.client.gui.FontRenderer field_111273_g # locationFontTexture +protected net.minecraft.client.gui.FontRenderer field_78295_j # posX +protected net.minecraft.client.gui.FontRenderer field_78296_k # posY +protected net.minecraft.client.gui.FontRenderer func_78266_a(IZ)F # renderDefaultChar +protected net.minecraft.client.gui.FontRenderer func_78277_a(CZ)F # renderUnicodeChar + +# ChunkGeneratorEnd +private-f net.minecraft.world.gen.ChunkGeneratorEnd field_185969_i #lperlin1 +private-f net.minecraft.world.gen.ChunkGeneratorEnd field_185970_j #lperlin2 +private-f net.minecraft.world.gen.ChunkGeneratorEnd field_185971_k #perlin +private-f net.minecraft.world.gen.ChunkGeneratorEnd field_185973_o #island +private-f net.minecraft.world.gen.ChunkGeneratorEnd field_185972_n #endCityGen + +# ChunkGeneratorOverworld +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_185991_j #lperlin1 +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_185992_k #lperlin2 +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_185993_l #perlin +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_185994_m #surface +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_185979_A #ravineGenerator +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_185980_B #oceanMonumentGenerator +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_186003_v #caveGenerator +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_186004_w #strongholdGenerator +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_186005_x #villageGenerator +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_186006_y #mineshaftGenerator +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_186007_z #scatteredFeatureGenerator +private-f net.minecraft.world.gen.ChunkGeneratorOverworld field_191060_C #woodlandMansionGenerator + +# ChunkGeneratorHell +private-f net.minecraft.world.gen.ChunkGeneratorHell field_185957_u #lperlin1 +private-f net.minecraft.world.gen.ChunkGeneratorHell field_185958_v #lperlin2 +private-f net.minecraft.world.gen.ChunkGeneratorHell field_185959_w #perlin +private-f net.minecraft.world.gen.ChunkGeneratorHell field_73177_m #perlin2 +private-f net.minecraft.world.gen.ChunkGeneratorHell field_73174_n #perlin3 +public-f net.minecraft.world.gen.ChunkGeneratorHell field_185946_g #scale +public-f net.minecraft.world.gen.ChunkGeneratorHell field_185947_h #depth +private-f net.minecraft.world.gen.ChunkGeneratorHell field_185939_I #netherCaveGenerator +private-f net.minecraft.world.gen.ChunkGeneratorHell field_73172_c #netherBridgeGenerator + +# PlayerManager +private-f net.minecraft.server.management.PlayerChunkMapEntry field_187285_e # field_187285_e + +# RenderLivingBase +public net.minecraft.client.renderer.entity.RenderLivingBase func_177094_a(Lnet/minecraft/client/renderer/entity/layers/LayerRenderer;)Z # addLayer +#public net.minecraft.client.renderer.entity.RenderLivingBase func_177089_b(Lnet/minecraft/client/renderer/entity/layers/LayerRenderer;)Z # removeLayer + +# LootTable Stuff +private-f net.minecraft.world.storage.loot.LootPool field_186455_c # rolls +private-f net.minecraft.world.storage.loot.LootPool field_186456_d # bonusRolls + +#NBTPrimitive +public net.minecraft.nbt.NBTPrimitive + +#GuiOverlayDebug +public net.minecraft.client.gui.GuiOverlayDebug func_181554_e()V # renderLagometer +protected net.minecraft.client.gui.GuiOverlayDebug field_211537_g # rayTraceBlock +protected net.minecraft.client.gui.GuiOverlayDebug field_211538_h # rayTraceFluid + +# Expose vanilla brewing recipe system +public net.minecraft.potion.PotionHelper$MixPredicate +public net.minecraft.potion.PotionHelper func_193355_a(Lnet/minecraft/item/ItemPotion;Lnet/minecraft/item/Item;Lnet/minecraft/item/ItemPotion;)V # registerPotionItemConversion +public net.minecraft.potion.PotionHelper func_193354_a(Lnet/minecraft/item/ItemPotion;)V # registerPotionItem +public net.minecraft.potion.PotionHelper func_193357_a(Lnet/minecraft/potion/PotionType;Lnet/minecraft/item/Item;Lnet/minecraft/potion/PotionType;)V # registerPotionTypeConversion +public net.minecraft.potion.PotionHelper func_193356_a(Lnet/minecraft/potion/PotionType;Lnet/minecraft/item/crafting/Ingredient;Lnet/minecraft/potion/PotionType;)V # registerPotionTypeConversion + +# TileEntity +public net.minecraft.tileentity.TileEntity func_190560_a(Ljava/lang/String;Ljava/lang/Class;)V # register + +# TileEntityHopper +public net.minecraft.tileentity.TileEntityHopper func_174914_o()Z # mayTransfer +public net.minecraft.tileentity.TileEntityHopper func_145896_c(I)V # setTransferCooldown +protected net.minecraft.tileentity.TileEntityHopper func_145887_i()Z # updateHopper + +# DataFixer +public net.minecraft.util.datafix.DataFixer field_188262_d # version + +# AbstractSkeleton +protected net.minecraft.entity.monster.AbstractSkeleton func_190727_o()Lnet/minecraft/util/SoundEvent; # getStepSound - make AbstractSkeleton implementable + +# EntityWitherSkeleton +protected net.minecraft.entity.monster.EntityWitherSkeleton func_190727_o()Lnet/minecraft/util/SoundEvent; # getStepSound - make AbstractSkeleton implementable + +# EntityStray +protected net.minecraft.entity.monster.EntityStray func_190727_o()Lnet/minecraft/util/SoundEvent; # getStepSound - make AbstractSkeleton implementable + +# EntitySkeleton +protected net.minecraft.entity.monster.EntitySkeleton func_190727_o()Lnet/minecraft/util/SoundEvent; # getStepSound - make AbstractSkeleton implementable + +# EntitySelector +public net.minecraft.command.EntitySelector func_190826_c(Ljava/lang/String;)Ljava/lang/String; # addArgument + +# Teleporter +protected net.minecraft.world.Teleporter field_85192_a # world +protected net.minecraft.world.Teleporter field_77187_a # random +protected net.minecraft.world.Teleporter field_85191_c # destinationCoordinateCache + +public net.minecraft.util.ResourceLocation func_177516_a(Ljava/lang/String;)[Ljava/lang/String; # splitObjectName + +# Ingredient +public-f net.minecraft.item.crafting.Ingredient +protected net.minecraft.item.crafting.Ingredient (Ljava/util/stream/Stream;)V +public net.minecraft.item.crafting.Ingredient func_209357_a(Ljava/util/stream/Stream;)Lnet/minecraft/item/crafting/Ingredient; +public+f net.minecraft.item.crafting.Ingredient func_199564_a(Lnet/minecraft/network/PacketBuffer;)V +public net.minecraft.item.crafting.Ingredient$IItemList +public net.minecraft.item.crafting.Ingredient$SingleItemList +public net.minecraft.item.crafting.Ingredient$SingleItemList (Lnet/minecraft/item/ItemStack;)V +public net.minecraft.item.crafting.Ingredient$TagList +public net.minecraft.item.crafting.Ingredient$TagList (Lnet/minecraft/tags/Tag;)V + +# Crafting +public net.minecraft.client.Minecraft func_193986_ar()V # populateSearchTreeManager + +# Advancements +public net.minecraft.advancements.AdvancementManager func_195439_b(Lnet/minecraft/resources/IResourceManager;)Ljava/util/Map; # loadCustomAdvancements +public net.minecraft.advancements.CriteriaTriggers func_192118_a(Lnet/minecraft/advancements/ICriterionTrigger;)Lnet/minecraft/advancements/ICriterionTrigger; # register + +# BiomeProvider +public net.minecraft.world.biome.provider.BiomeProvider field_201540_a # BIOMES_TO_SPAWN_IN + +# BlockTags.Wrapper +public net.minecraft.tags.BlockTags$Wrapper + +#SaveHandler +public net.minecraft.world.storage.SaveHandler field_75771_c # playersDirectory + +#BlockItemUseContext +public net.minecraft.item.BlockItemUseContext (Lnet/minecraft/world/World;Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/item/ItemStack;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/EnumFacing;FFF)V + +#EntitySpawnPlacementRegistry +public net.minecraft.entity.EntitySpawnPlacementRegistry func_209346_a(Lnet/minecraft/entity/EntityType;Lnet/minecraft/entity/EntitySpawnPlacementRegistry$SpawnPlacementType;Lnet/minecraft/world/gen/Heightmap$Type;Lnet/minecraft/tags/Tag;)V # register \ No newline at end of file