Added modCompile config to allow deps to be remapped
This commit is contained in:
		
							parent
							
								
									482606d765
								
							
						
					
					
						commit
						ec4bd3162a
					
				
					 9 changed files with 211 additions and 23 deletions
				
			
		
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -26,7 +26,6 @@ package net.fabricmc.loom; | ||||||
| 
 | 
 | ||||||
| import com.google.common.collect.ImmutableMap; | import com.google.common.collect.ImmutableMap; | ||||||
| import com.google.gson.Gson; | import com.google.gson.Gson; | ||||||
| import com.google.gson.JsonArray; |  | ||||||
| import com.google.gson.JsonElement; | import com.google.gson.JsonElement; | ||||||
| import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||||
| import net.fabricmc.loom.task.DownloadTask; | import net.fabricmc.loom.task.DownloadTask; | ||||||
|  | @ -36,6 +35,7 @@ import net.fabricmc.loom.util.Version; | ||||||
| import org.gradle.api.Plugin; | import org.gradle.api.Plugin; | ||||||
| import org.gradle.api.Project; | import org.gradle.api.Project; | ||||||
| import org.gradle.api.Task; | import org.gradle.api.Task; | ||||||
|  | import org.gradle.api.artifacts.Configuration; | ||||||
| import org.gradle.api.artifacts.repositories.MavenArtifactRepository; | import org.gradle.api.artifacts.repositories.MavenArtifactRepository; | ||||||
| import org.gradle.api.plugins.JavaPlugin; | import org.gradle.api.plugins.JavaPlugin; | ||||||
| import org.gradle.api.plugins.JavaPluginConvention; | import org.gradle.api.plugins.JavaPluginConvention; | ||||||
|  | @ -78,9 +78,10 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 		project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES); | 		project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES); | ||||||
| 		project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES_CLIENT); | 		project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES_CLIENT); | ||||||
| 		project.getConfigurations().maybeCreate(Constants.CONFIG_NATIVES); | 		project.getConfigurations().maybeCreate(Constants.CONFIG_NATIVES); | ||||||
| 		project.getConfigurations().maybeCreate(Constants.COMPILE_MODS); | 		Configuration compileModsConfig = project.getConfigurations().maybeCreate(Constants.COMPILE_MODS); | ||||||
|  | 		project.getConfigurations().maybeCreate(Constants.COMPILE_MODS_PROCESSED); | ||||||
| 
 | 
 | ||||||
| 		project.getConfigurations().maybeCreate(Constants.PROCESS_MODS_DEPENDENCIES); | 		compileModsConfig.setTransitive(false); //Dont get transitive deps of mods | ||||||
| 
 | 
 | ||||||
| 		// Common libraries extends from client libraries, CONFIG_MC_DEPENDENCIES will contains all MC dependencies | 		// Common libraries extends from client libraries, CONFIG_MC_DEPENDENCIES will contains all MC dependencies | ||||||
| 		project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT).extendsFrom(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).extendsFrom(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES_CLIENT))); | 		project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT).extendsFrom(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).extendsFrom(project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES_CLIENT))); | ||||||
|  | @ -88,6 +89,7 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 		configureIDEs(); | 		configureIDEs(); | ||||||
| 		configureCompile(); | 		configureCompile(); | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 		Map<Project, Set<Task>> taskMap = project.getAllTasks(true); | 		Map<Project, Set<Task>> taskMap = project.getAllTasks(true); | ||||||
| 		for (Map.Entry<Project, Set<Task>> entry : taskMap.entrySet()) { | 		for (Map.Entry<Project, Set<Task>> entry : taskMap.entrySet()) { | ||||||
| 			Project project = entry.getKey(); | 			Project project = entry.getKey(); | ||||||
|  | @ -170,12 +172,12 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 		ideaModule.getModule().setDownloadSources(true); | 		ideaModule.getModule().setDownloadSources(true); | ||||||
| 		ideaModule.getModule().setInheritOutputDirs(true); | 		ideaModule.getModule().setInheritOutputDirs(true); | ||||||
| 		ideaModule.getModule().getScopes().get("COMPILE").get("plus").add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); | 		ideaModule.getModule().getScopes().get("COMPILE").get("plus").add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); | ||||||
| 		ideaModule.getModule().getScopes().get("COMPILE").get("plus").add(project.getConfigurations().getByName(Constants.COMPILE_MODS)); | 		ideaModule.getModule().getScopes().get("COMPILE").get("plus").add(project.getConfigurations().getByName(Constants.COMPILE_MODS_PROCESSED)); | ||||||
| 
 | 
 | ||||||
| 		// ECLIPSE | 		// ECLIPSE | ||||||
| 		EclipseModel eclipseModule = (EclipseModel) project.getExtensions().getByName("eclipse"); | 		EclipseModel eclipseModule = (EclipseModel) project.getExtensions().getByName("eclipse"); | ||||||
| 		eclipseModule.getClasspath().getPlusConfigurations().add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); | 		eclipseModule.getClasspath().getPlusConfigurations().add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); | ||||||
| 		eclipseModule.getClasspath().getPlusConfigurations().add(project.getConfigurations().getByName(Constants.COMPILE_MODS)); | 		eclipseModule.getClasspath().getPlusConfigurations().add(project.getConfigurations().getByName(Constants.COMPILE_MODS_PROCESSED)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
|  | @ -208,11 +210,6 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 				flatDirectoryArtifactRepository.setName("UserLocalCacheFiles"); | 				flatDirectoryArtifactRepository.setName("UserLocalCacheFiles"); | ||||||
| 			}); | 			}); | ||||||
| 
 | 
 | ||||||
| 			project1.getRepositories().maven(mavenArtifactRepository -> { |  | ||||||
| 				mavenArtifactRepository.setName("FabricMC"); |  | ||||||
| 				mavenArtifactRepository.setUrl("http://maven.fabricmc.net/"); |  | ||||||
| 			}); |  | ||||||
| 
 |  | ||||||
| 			project1.getRepositories().maven(mavenArtifactRepository -> { | 			project1.getRepositories().maven(mavenArtifactRepository -> { | ||||||
| 				mavenArtifactRepository.setName("modmuss50"); | 				mavenArtifactRepository.setName("modmuss50"); | ||||||
| 				mavenArtifactRepository.setUrl("https://maven.modmuss50.me/"); | 				mavenArtifactRepository.setUrl("https://maven.modmuss50.me/"); | ||||||
|  | @ -251,8 +248,10 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 
 | 
 | ||||||
| 			if (extension.isModWorkspace()) { | 			if (extension.isModWorkspace()) { | ||||||
| 				//only add this when not in a dev env | 				//only add this when not in a dev env | ||||||
| 				project1.getDependencies().add(Constants.CONFIG_MC_DEPENDENCIES, "net.fabricmc:fabric-base:" + extension.getVersionString() +":deobf"); | 				project1.getDependencies().add(Constants.COMPILE_MODS, "net.fabricmc:fabric-base:" + extension.getVersionString()); | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 		}); | 		}); | ||||||
| 
 | 
 | ||||||
| 		project.getTasks().getByName("jar").doLast(task -> { | 		project.getTasks().getByName("jar").doLast(task -> { | ||||||
|  |  | ||||||
|  | @ -25,10 +25,7 @@ | ||||||
| package net.fabricmc.loom; | package net.fabricmc.loom; | ||||||
| 
 | 
 | ||||||
| import net.fabricmc.loom.task.*; | import net.fabricmc.loom.task.*; | ||||||
| import net.fabricmc.loom.util.Constants; |  | ||||||
| import org.gradle.api.DefaultTask; |  | ||||||
| import org.gradle.api.Project; | import org.gradle.api.Project; | ||||||
| import org.gradle.api.Task; |  | ||||||
| 
 | 
 | ||||||
| public class LoomGradlePlugin extends AbstractPlugin { | public class LoomGradlePlugin extends AbstractPlugin { | ||||||
| 	@Override | 	@Override | ||||||
|  | @ -39,7 +36,7 @@ public class LoomGradlePlugin extends AbstractPlugin { | ||||||
| 		makeTask("mergeJars", MergeJarsTask.class).dependsOn("download"); | 		makeTask("mergeJars", MergeJarsTask.class).dependsOn("download"); | ||||||
| 		makeTask("mapJars", MapJarsTask.class).dependsOn("mergeJars"); | 		makeTask("mapJars", MapJarsTask.class).dependsOn("mergeJars"); | ||||||
| 		makeTask("finaliseJars", FinaliseJar.class).dependsOn("mapJars"); | 		makeTask("finaliseJars", FinaliseJar.class).dependsOn("mapJars"); | ||||||
| 		makeTask("setup", DefaultTask.class).dependsOn("finaliseJars").setGroup("fabric"); | 		makeTask("setup", SetupTask.class).dependsOn("finaliseJars").setGroup("fabric"); | ||||||
| 
 | 
 | ||||||
| 		makeTask("extractNatives", ExtractNativesTask.class).dependsOn("download"); | 		makeTask("extractNatives", ExtractNativesTask.class).dependsOn("download"); | ||||||
| 		makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea").setGroup("ide"); | 		makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea").setGroup("ide"); | ||||||
|  |  | ||||||
|  | @ -31,10 +31,14 @@ import org.gradle.api.tasks.TaskAction; | ||||||
| import org.zeroturnaround.zip.commons.FileUtils; | import org.zeroturnaround.zip.commons.FileUtils; | ||||||
| 
 | 
 | ||||||
| public class MapJarsTask extends DefaultTask { | public class MapJarsTask extends DefaultTask { | ||||||
|  | 
 | ||||||
|  | 	//Set to to true if you want to always remap the jar, useful for when working on the gradle plugin | ||||||
|  | 	public static final boolean ALWAYS_REMAP = false; | ||||||
|  | 
 | ||||||
| 	@TaskAction | 	@TaskAction | ||||||
| 	public void mapJars() throws Exception { | 	public void mapJars() throws Exception { | ||||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||||
| 		if (!Constants.MINECRAFT_MAPPED_JAR.get(extension).exists() || extension.localMappings || true) { | 		if (!Constants.MINECRAFT_MAPPED_JAR.get(extension).exists() || extension.localMappings || ALWAYS_REMAP) { | ||||||
| 			if(Constants.MINECRAFT_MAPPED_JAR.get(extension).exists()){ | 			if(Constants.MINECRAFT_MAPPED_JAR.get(extension).exists()){ | ||||||
| 				Constants.MINECRAFT_MAPPED_JAR.get(extension).delete(); | 				Constants.MINECRAFT_MAPPED_JAR.get(extension).delete(); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | @ -30,10 +30,6 @@ import net.fabricmc.loom.util.Constants; | ||||||
| import net.fabricmc.tinyremapper.OutputConsumerPath; | import net.fabricmc.tinyremapper.OutputConsumerPath; | ||||||
| import net.fabricmc.tinyremapper.TinyRemapper; | import net.fabricmc.tinyremapper.TinyRemapper; | ||||||
| import net.fabricmc.tinyremapper.TinyUtils; | import net.fabricmc.tinyremapper.TinyUtils; | ||||||
| import org.gradle.api.DefaultTask; |  | ||||||
| import org.gradle.api.tasks.TaskAction; |  | ||||||
| import org.zeroturnaround.zip.ZipUtil; |  | ||||||
| import org.zeroturnaround.zip.commons.FileUtils; |  | ||||||
| 
 | 
 | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
|  | @ -48,7 +44,7 @@ public class MapJarsTiny { | ||||||
| 		String toM = "pomf"; | 		String toM = "pomf"; | ||||||
| 
 | 
 | ||||||
| 		Path mappings = Constants.MAPPINGS_TINY.get(extension).toPath(); | 		Path mappings = Constants.MAPPINGS_TINY.get(extension).toPath(); | ||||||
| 		Path[] classpath = task.getProject().getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getFiles().stream() | 		Path[] classpath = task.getProject().getConfigurations().getByName(Constants.CONFIG_MINECRAFT).getFiles().stream() | ||||||
| 				.map(File::toPath) | 				.map(File::toPath) | ||||||
| 				.toArray(Path[]::new); | 				.toArray(Path[]::new); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -79,7 +79,7 @@ public class RunClientTask extends JavaExec { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public String getMain() { | 	public String getMain() { | ||||||
| 		return "cpw.mods.modlauncher.Launcher"; | 		return "net.minecraft.launchwrapper.Launch"; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
|  |  | ||||||
							
								
								
									
										61
									
								
								src/main/java/net/fabricmc/loom/task/SetupTask.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/main/java/net/fabricmc/loom/task/SetupTask.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,61 @@ | ||||||
|  | /* | ||||||
|  |  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2016, 2017, 2018 FabricMC | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in all | ||||||
|  |  * copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |  * SOFTWARE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package net.fabricmc.loom.task; | ||||||
|  | 
 | ||||||
|  | import net.fabricmc.loom.LoomGradleExtension; | ||||||
|  | import net.fabricmc.loom.util.Constants; | ||||||
|  | import net.fabricmc.loom.util.ModProccessor; | ||||||
|  | import org.apache.commons.lang3.Validate; | ||||||
|  | import org.gradle.api.DefaultTask; | ||||||
|  | import org.gradle.api.artifacts.Configuration; | ||||||
|  | import org.gradle.api.tasks.TaskAction; | ||||||
|  | 
 | ||||||
|  | import java.io.File; | ||||||
|  | 
 | ||||||
|  | public class SetupTask extends DefaultTask { | ||||||
|  | 
 | ||||||
|  | 	@TaskAction | ||||||
|  | 	public void setup(){ | ||||||
|  | 		configureModRemapper(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void configureModRemapper(){ | ||||||
|  | 		LoomGradleExtension extension = getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||||
|  | 		Configuration inputConfig =  getProject().getConfigurations().getByName(Constants.COMPILE_MODS); | ||||||
|  | 		inputConfig.getResolvedConfiguration().getFiles().stream() | ||||||
|  | 			.filter(file -> file.getName().endsWith(".jar")) | ||||||
|  | 			.forEach(input -> { | ||||||
|  | 				String outputName = input.getName().substring(0, input.getName().length() - 4) + "-mapped-" + extension.pomfVersion  + ".jar";//TODO use the hash of the input file or something? | ||||||
|  | 				File output = new File(Constants.REMAPPED_MODS_STORE.get(extension), outputName); | ||||||
|  | 				if(!output.getParentFile().exists()){ | ||||||
|  | 					output.mkdirs(); | ||||||
|  | 				} | ||||||
|  | 				getProject().getLogger().lifecycle(":remapping jar " + input.getName()); | ||||||
|  | 				ModProccessor.handleMod(input, output, getProject()); | ||||||
|  | 				Validate.isTrue(output.exists()); | ||||||
|  | 				getProject().getDependencies().add(Constants.COMPILE_MODS_PROCESSED, getProject().files(output.getPath())); | ||||||
|  | 			}); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -58,6 +58,8 @@ public class Constants { | ||||||
| 	public static final IDelayed<File> MAPPINGS_ENIGMA_ZIP_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-enigma-" + extension.version + ".zip")); | 	public static final IDelayed<File> MAPPINGS_ENIGMA_ZIP_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-enigma-" + extension.version + ".zip")); | ||||||
| 	public static final IDelayed<File> MAPPINGS_TINY_GZ_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-tiny-" + extension.version + ".gz")); | 	public static final IDelayed<File> MAPPINGS_TINY_GZ_LOCAL = new DelayedFile(extension -> new File(MAPPINGS_DIR_LOCAL.get(extension), "pomf-tiny-" + extension.version + ".gz")); | ||||||
| 
 | 
 | ||||||
|  | 	public static final IDelayed<File> REMAPPED_MODS_STORE = new DelayedFile(extension -> new File(CACHE_FILES, "remapped_mods")); | ||||||
|  | 
 | ||||||
| 	public static final IDelayed<File> MINECRAFT_LIBS = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-libs")); | 	public static final IDelayed<File> MINECRAFT_LIBS = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-libs")); | ||||||
| 	public static final IDelayed<File> MINECRAFT_NATIVES = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-natives")); | 	public static final IDelayed<File> MINECRAFT_NATIVES = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-natives")); | ||||||
| 	public static final IDelayed<File> MINECRAFT_JSON = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-info.json")); | 	public static final IDelayed<File> MINECRAFT_JSON = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-info.json")); | ||||||
|  | @ -78,9 +80,9 @@ public class Constants { | ||||||
| 	public static final String CONFIG_MC_DEPENDENCIES = "MC_DEPENDENCIES"; | 	public static final String CONFIG_MC_DEPENDENCIES = "MC_DEPENDENCIES"; | ||||||
| 	public static final String CONFIG_MINECRAFT = "MINECRAFT"; | 	public static final String CONFIG_MINECRAFT = "MINECRAFT"; | ||||||
| 	public static final String CONFIG_MC_DEPENDENCIES_CLIENT = "MC_DEPENDENCIES_CLIENT"; | 	public static final String CONFIG_MC_DEPENDENCIES_CLIENT = "MC_DEPENDENCIES_CLIENT"; | ||||||
| 	public static final String PROCESS_MODS_DEPENDENCIES = "PROCESS_MODS_DEPENDENCIES"; |  | ||||||
| 	public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32"; | 	public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32"; | ||||||
| 	public static final String COMPILE_MODS = "modCompile"; | 	public static final String COMPILE_MODS = "modCompile"; | ||||||
|  | 	public static final String COMPILE_MODS_PROCESSED = "modCompile_PROCESSED"; | ||||||
| 
 | 
 | ||||||
| 	public static List<String> getClassPath() { | 	public static List<String> getClassPath() { | ||||||
| 		URL[] urls = ((URLClassLoader) Constants.class.getClassLoader()).getURLs(); | 		URL[] urls = ((URLClassLoader) Constants.class.getClassLoader()).getURLs(); | ||||||
|  |  | ||||||
							
								
								
									
										129
									
								
								src/main/java/net/fabricmc/loom/util/ModProccessor.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								src/main/java/net/fabricmc/loom/util/ModProccessor.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,129 @@ | ||||||
|  | /* | ||||||
|  |  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2016, 2017, 2018 FabricMC | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in all | ||||||
|  |  * copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |  * SOFTWARE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package net.fabricmc.loom.util; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.Gson; | ||||||
|  | import com.google.gson.JsonObject; | ||||||
|  | import net.fabricmc.loom.LoomGradleExtension; | ||||||
|  | import net.fabricmc.tinyremapper.OutputConsumerPath; | ||||||
|  | import net.fabricmc.tinyremapper.TinyRemapper; | ||||||
|  | import net.fabricmc.tinyremapper.TinyUtils; | ||||||
|  | import org.apache.commons.io.IOUtils; | ||||||
|  | import org.gradle.api.Project; | ||||||
|  | import org.gradle.api.artifacts.dsl.DependencyHandler; | ||||||
|  | 
 | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
|  | import java.nio.charset.StandardCharsets; | ||||||
|  | import java.nio.file.Path; | ||||||
|  | import java.nio.file.Paths; | ||||||
|  | import java.util.jar.JarFile; | ||||||
|  | import java.util.zip.ZipEntry; | ||||||
|  | 
 | ||||||
|  | public class ModProccessor { | ||||||
|  | 
 | ||||||
|  | 	public static void handleMod(File input, File output, Project project){ | ||||||
|  | 		if(output.exists()){ | ||||||
|  | 			output.delete(); | ||||||
|  | 		} | ||||||
|  | 		remapJar(input, output, project); | ||||||
|  | 
 | ||||||
|  | 		JsonObject jsonObject = readInstallerJson(input); | ||||||
|  | 		if(jsonObject != null){ | ||||||
|  | 			handleInstallerJson(jsonObject, project); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private static void remapJar(File input, File output, Project project){ | ||||||
|  | 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||||
|  | 		String fromM = "mojang"; | ||||||
|  | 		String toM = "pomf"; | ||||||
|  | 
 | ||||||
|  | 		Path mappings = Constants.MAPPINGS_TINY.get(extension).toPath(); | ||||||
|  | 		Path[] classpath = project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getFiles().stream() | ||||||
|  | 			.map(File::toPath) | ||||||
|  | 			.toArray(Path[]::new); | ||||||
|  | 
 | ||||||
|  | 		project.getLogger().lifecycle(":remapping " + input.getName() + " (TinyRemapper, " + fromM + " -> " + toM + ")"); | ||||||
|  | 
 | ||||||
|  | 		TinyRemapper remapper = TinyRemapper.newRemapper() | ||||||
|  | 			.withMappings(TinyUtils.createTinyMappingProvider(mappings, fromM, toM)) | ||||||
|  | 			.build(); | ||||||
|  | 
 | ||||||
|  | 		try { | ||||||
|  | 			OutputConsumerPath outputConsumer = new OutputConsumerPath(Paths.get(output.getAbsolutePath())); | ||||||
|  | 			outputConsumer.addNonClassFiles(input.toPath()); | ||||||
|  | 			remapper.read(input.toPath()); | ||||||
|  | 			remapper.read(classpath); | ||||||
|  | 			remapper.apply(input.toPath(), outputConsumer); | ||||||
|  | 			outputConsumer.finish(); | ||||||
|  | 			remapper.finish(); | ||||||
|  | 		} catch (Exception e){ | ||||||
|  | 			remapper.finish(); | ||||||
|  | 			throw new RuntimeException("Failed to remap jar to " + toM, e); | ||||||
|  | 		} | ||||||
|  | 		if(!output.exists()){ | ||||||
|  | 			throw new RuntimeException("Failed to remap jar to " + toM + " file not found: " + output.getAbsolutePath()); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private static void handleInstallerJson(JsonObject jsonObject, Project project){ | ||||||
|  | 		DependencyHandler dependencyHandler = project.getDependencies(); | ||||||
|  | 
 | ||||||
|  | 		JsonObject libraries = jsonObject.get("libraries").getAsJsonObject(); | ||||||
|  | 		libraries.get("common").getAsJsonArray().forEach(jsonElement -> { | ||||||
|  | 			String name = jsonElement.getAsJsonObject().get("name").getAsString(); | ||||||
|  | 			dependencyHandler.add("compile", name); | ||||||
|  | 
 | ||||||
|  | 			//TODO is it an issue if we add the same url twice? or do I need to check this? | ||||||
|  | 			if(jsonElement.getAsJsonObject().has("url")){ | ||||||
|  | 				project.getRepositories().maven(mavenArtifactRepository -> mavenArtifactRepository.setUrl(jsonElement.getAsJsonObject().get("url").getAsString())); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private static JsonObject readInstallerJson(File file){ | ||||||
|  | 		try { | ||||||
|  | 			JarFile jarFile = new JarFile(file); | ||||||
|  | 			ZipEntry entry = jarFile.getEntry("fabric-installer.json"); | ||||||
|  | 			if(entry == null){ | ||||||
|  | 				return null; | ||||||
|  | 			} | ||||||
|  | 			InputStream inputstream = jarFile.getInputStream(entry); | ||||||
|  | 			String jsonStr = IOUtils.toString(inputstream, StandardCharsets.UTF_8); | ||||||
|  | 			inputstream.close(); | ||||||
|  | 			jarFile.close(); | ||||||
|  | 
 | ||||||
|  | 			JsonObject jsonObject = new Gson().fromJson(jsonStr, JsonObject.class); | ||||||
|  | 			return jsonObject; | ||||||
|  | 		} catch (IOException e) { | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 			return null; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue