Change some stuff in hope that it helps things
This commit is contained in:
		
							parent
							
								
									bbf5e341e3
								
							
						
					
					
						commit
						d0e649766b
					
				
					 30 changed files with 763 additions and 1211 deletions
				
			
		|  | @ -11,7 +11,7 @@ targetCompatibility = 1.8 | |||
| 
 | ||||
| group = 'net.fabricmc' | ||||
| archivesBaseName = project.name | ||||
| version = '0.0.12-SNAPSHOT' | ||||
| version = '0.0.13-SNAPSHOT' | ||||
| 
 | ||||
| def build = "local" | ||||
| def ENV = System.getenv() | ||||
|  | @ -47,7 +47,7 @@ dependencies { | |||
| 
 | ||||
| jar { | ||||
| 	manifest { | ||||
| 		attributes 'Implementation-Version': version + " Build(" + build + ")" | ||||
| 		attributes 'Implementation-MinecraftVersionInfo': version + " Build(" + build + ")" | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										2
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							|  | @ -20,7 +20,7 @@ set DEFAULT_JVM_OPTS= | |||
| if defined JAVA_HOME goto findJavaFromJavaHome | ||||
| 
 | ||||
| set JAVA_EXE=java.exe | ||||
| %JAVA_EXE% -version >NUL 2>&1 | ||||
| %JAVA_EXE% -minecraftVersionInfo >NUL 2>&1 | ||||
| if "%ERRORLEVEL%" == "0" goto init | ||||
| 
 | ||||
| echo. | ||||
|  |  | |||
|  | @ -28,10 +28,9 @@ import com.google.common.collect.ImmutableMap; | |||
| import com.google.gson.Gson; | ||||
| import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | ||||
| import net.fabricmc.loom.task.DownloadTask; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.loom.util.ModRemapper; | ||||
| import net.fabricmc.loom.util.Version; | ||||
| import net.fabricmc.loom.providers.MinecraftProvider; | ||||
| import net.fabricmc.loom.providers.ModRemapperProvider; | ||||
| import net.fabricmc.loom.util.*; | ||||
| import org.gradle.api.Plugin; | ||||
| import org.gradle.api.Project; | ||||
| import org.gradle.api.Task; | ||||
|  | @ -70,22 +69,13 @@ public class AbstractPlugin implements Plugin<Project> { | |||
| 		project.getExtensions().create("minecraft", LoomGradleExtension.class, project); | ||||
| 
 | ||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		readModJson(extension); | ||||
| 
 | ||||
| 		// Force add Mojang repository | ||||
| 		addMavenRepo(target, "Mojang", "https://libraries.minecraft.net/"); | ||||
| 
 | ||||
| 		// Minecraft libraries configuration | ||||
| 		project.getConfigurations().maybeCreate(Constants.CONFIG_MINECRAFT); | ||||
| 		project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES); | ||||
| 		project.getConfigurations().maybeCreate(Constants.CONFIG_MC_DEPENDENCIES_CLIENT); | ||||
| 		project.getConfigurations().maybeCreate(Constants.CONFIG_NATIVES); | ||||
| 
 | ||||
| 		Configuration compileModsConfig = project.getConfigurations().maybeCreate(Constants.COMPILE_MODS); | ||||
| 
 | ||||
| 		compileModsConfig.setTransitive(false); //Dont get transitive deps of mods | ||||
| 
 | ||||
| 		// 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().maybeCreate(Constants.MINECRAFT); | ||||
| 
 | ||||
| 		configureIDEs(); | ||||
| 		configureCompile(); | ||||
|  | @ -95,21 +85,17 @@ public class AbstractPlugin implements Plugin<Project> { | |||
| 			Project project = entry.getKey(); | ||||
| 			Set<Task> taskSet = entry.getValue(); | ||||
| 			for (Task task : taskSet) { | ||||
| 				if (task instanceof GeneratorTask) { | ||||
| 					task.dependsOn("setup"); | ||||
| 				} | ||||
| 
 | ||||
| 				if (task instanceof JavaCompile | ||||
| 					&& !(task.getName().contains("Test")) && !(task.getName().contains("test"))) { | ||||
| 					JavaCompile javaCompileTask = (JavaCompile) task; | ||||
| 					javaCompileTask.doFirst(task1 -> { | ||||
| 						project.getLogger().lifecycle(":setting java compiler args"); | ||||
| 						try { | ||||
| 							javaCompileTask.getClasspath().add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); | ||||
| 							javaCompileTask.getClasspath().add(target.files(this.getClass().getProtectionDomain().getCodeSource().getLocation())); | ||||
| 							//javaCompileTask.getClasspath().add(target.files(this.getClass().getProtectionDomain().getCodeSource().getLocation())); | ||||
| 
 | ||||
| 							javaCompileTask.getOptions().getCompilerArgs().add("-AinMapFileNamedIntermediary=" + Constants.MAPPINGS_TINY.get(extension).getCanonicalPath()); | ||||
| 							javaCompileTask.getOptions().getCompilerArgs().add("-AoutMapFileNamedIntermediary=" + Constants.MAPPINGS_MIXIN_EXPORT.get(extension).getCanonicalPath()); | ||||
| 
 | ||||
| 							javaCompileTask.getOptions().getCompilerArgs().add("-AinMapFileNamedIntermediary=" + extension.getMinecraftProvider().pomfProvider.MAPPINGS_TINY.getCanonicalPath()); | ||||
| 							javaCompileTask.getOptions().getCompilerArgs().add("-AoutMapFileNamedIntermediary=" + extension.getMinecraftProvider().pomfProvider.MAPPINGS_MIXIN_EXPORT.getCanonicalPath()); | ||||
| 							if(extension.refmapName == null || extension.refmapName.isEmpty()){ | ||||
| 								project.getLogger().error("Could not find refmap definition, will be using default name: " + project.getName() + "-refmap.json"); | ||||
| 								extension.refmapName = project.getName() + "-refmap.json"; | ||||
|  | @ -176,11 +162,9 @@ public class AbstractPlugin implements Plugin<Project> { | |||
| 		ideaModel.getModule().setDownloadJavadoc(true); | ||||
| 		ideaModel.getModule().setDownloadSources(true); | ||||
| 		ideaModel.getModule().setInheritOutputDirs(true); | ||||
| 		ideaModel.getModule().getScopes().get("COMPILE").get("plus").add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); | ||||
| 
 | ||||
| 		// ECLIPSE | ||||
| 		EclipseModel eclipseModel = (EclipseModel) project.getExtensions().getByName("eclipse"); | ||||
| 		eclipseModel.getClasspath().getPlusConfigurations().add(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT)); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
|  | @ -192,11 +176,6 @@ public class AbstractPlugin implements Plugin<Project> { | |||
| 		SourceSet main = javaModule.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME); | ||||
| 		SourceSet test = javaModule.getSourceSets().getByName(SourceSet.TEST_SOURCE_SET_NAME); | ||||
| 
 | ||||
| 		main.setCompileClasspath(main.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT))); | ||||
| 		test.setCompileClasspath(test.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT))); | ||||
| 		main.setRuntimeClasspath(main.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT))); | ||||
| 		test.setCompileClasspath(test.getCompileClasspath().plus(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT))); | ||||
| 
 | ||||
| 		Javadoc javadoc = (Javadoc) project.getTasks().getByName(JavaPlugin.JAVADOC_TASK_NAME); | ||||
| 		javadoc.setClasspath(main.getOutput().plus(main.getCompileClasspath())); | ||||
| 
 | ||||
|  | @ -231,74 +210,25 @@ public class AbstractPlugin implements Plugin<Project> { | |||
| 			project1.getRepositories().mavenCentral(); | ||||
| 			project1.getRepositories().jcenter(); | ||||
| 
 | ||||
| 			Gson gson = new Gson(); | ||||
| 			try { | ||||
| 				DownloadTask.downloadMcJson(extension, project1.getLogger()); | ||||
| 				Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); | ||||
| 				for (Version.Library library : version.libraries) { | ||||
| 					if (library.allowed() && library.getFile(extension) != null) { | ||||
| 						String configName = Constants.CONFIG_MC_DEPENDENCIES; | ||||
| 						if (library.name.contains("java3d") || library.name.contains("paulscode") || library.name.contains("lwjgl") || library.name.contains("twitch") || library.name.contains("jinput") || library.name.contains("text2speech") || library.name.contains("objc")) { | ||||
| 							configName = Constants.CONFIG_MC_DEPENDENCIES_CLIENT; | ||||
| 						} | ||||
| 						project1.getDependencies().add(configName, library.getArtifactName()); | ||||
| 					} | ||||
| 				} | ||||
| 			} catch (IOException e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 			project1.getDependencies().add(Constants.CONFIG_MINECRAFT, "net.minecraft:" + Constants.MINECRAFT_FINAL_JAR.get(extension).getName().replace(".jar", "")); | ||||
| 			LoomDependencyManager dependencyManager = new LoomDependencyManager(); | ||||
| 			extension.setDependencyManager(dependencyManager); | ||||
| 
 | ||||
| 			if (extension.isModWorkspace()) { | ||||
| 				//only add this when not in a dev env | ||||
| 				project1.getDependencies().add(Constants.COMPILE_MODS, "net.fabricmc:fabric-loader:" + extension.getVersionString()); | ||||
| 			} | ||||
| 			dependencyManager.addProvider(new MinecraftProvider()); | ||||
| 			dependencyManager.addProvider(new ModRemapperProvider()); | ||||
| 
 | ||||
| 			dependencyManager.handleDependencies(project1); | ||||
| 
 | ||||
| 			project1.getTasks().getByName("idea").finalizedBy(project1.getTasks().getByName("genIdeaWorkspace")); | ||||
| 		}); | ||||
| 
 | ||||
| 		project.getTasks().getByName("jar").doLast(task -> { | ||||
| 			project.getLogger().lifecycle(":remapping mods"); | ||||
| 			LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 			try { | ||||
| 				if(extension.hasPomf()){ | ||||
| 					ModRemapper.remap(project); | ||||
| 				} | ||||
| 				ModRemapper.remap(project); | ||||
| 			} catch (IOException e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 		}); | ||||
| 
 | ||||
| 		project.afterEvaluate(project12 -> { | ||||
| 			project12.getTasks().getByName("idea").dependsOn(project12.getTasks().getByName("cleanIdea")).dependsOn(project12.getTasks().getByName("setup")).dependsOn(project12.getTasks().getByName("extractNatives")); | ||||
| 			project12.getTasks().getByName("idea").finalizedBy(project12.getTasks().getByName("genIdeaWorkspace")); | ||||
| 		}); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	protected void readModJson(LoomGradleExtension extension) { | ||||
| 		File resDir = new File(project.getProjectDir(), "src" + File.separator + "main" + File.separator + "resources"); | ||||
| 		File modJson = new File(resDir, "mod.json"); | ||||
| 		if (modJson.exists()) { | ||||
| 			Gson gson = new Gson(); | ||||
| 			try { | ||||
| 				JsonElement jsonElement = gson.fromJson(new FileReader(modJson), JsonElement.class); | ||||
| 				JsonObject jsonObject = jsonElement.getAsJsonObject(); | ||||
| 				if ((extension.version == null || extension.version.isEmpty()) && jsonObject.has("version")) { | ||||
| 					project.setVersion(jsonObject.get("version").getAsString()); | ||||
| 				} | ||||
| 				if (jsonObject.has("group")) { | ||||
| 					project.setGroup(jsonObject.get("group").getAsString()); | ||||
| 				} | ||||
| 				if (jsonObject.has("description")) { | ||||
| 					project.setDescription(jsonObject.get("description").getAsString()); | ||||
| 				} | ||||
| 				//TODO load deps | ||||
| 
 | ||||
| 			} catch (FileNotFoundException e) { | ||||
| 				//This wont happen as we have checked for it | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -24,38 +24,24 @@ | |||
| 
 | ||||
| package net.fabricmc.loom; | ||||
| 
 | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.loom.providers.MinecraftProvider; | ||||
| import net.fabricmc.loom.util.LoomDependencyManager; | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| import java.io.File; | ||||
| 
 | ||||
| public class LoomGradleExtension { | ||||
| 	public String version; | ||||
| 	public String runDir = "run"; | ||||
| 	public String fabricVersion; | ||||
| 	public String pomfVersion; | ||||
| 	public String refmapName; | ||||
| 	public String jarMapper = Constants.JAR_MAPPER_TINY; // enigma, tiny | ||||
| 	public boolean localMappings = false; | ||||
| 
 | ||||
| 	//Not to be set in the build.gradle | ||||
| 	private Project project; | ||||
| 	private LoomDependencyManager dependencyManager; | ||||
| 
 | ||||
| 	public LoomGradleExtension(Project project) { | ||||
| 		this.project = project; | ||||
| 	} | ||||
| 
 | ||||
| 	public String getVersionString() { | ||||
| 		if (isModWorkspace()) { | ||||
| 			return version + "-" + fabricVersion; | ||||
| 		} | ||||
| 		return version; | ||||
| 	} | ||||
| 
 | ||||
| 	public boolean isModWorkspace() { | ||||
| 		return fabricVersion != null && !fabricVersion.isEmpty(); | ||||
| 	} | ||||
| 
 | ||||
| 	public File getUserCache() { | ||||
| 		File userCache = new File(project.getGradle().getGradleUserHomeDir(), "caches" + File.separator + "fabric-loom"); | ||||
| 		if (!userCache.exists()) { | ||||
|  | @ -64,10 +50,15 @@ public class LoomGradleExtension { | |||
| 		return userCache; | ||||
| 	} | ||||
| 
 | ||||
| 	public boolean hasPomf(){ | ||||
| 		if (localMappings) { | ||||
| 			return true; | ||||
| 		} | ||||
| 		return pomfVersion != null && !pomfVersion.isEmpty(); | ||||
| 	public LoomDependencyManager getDependencyManager() { | ||||
| 		return dependencyManager; | ||||
| 	} | ||||
| 
 | ||||
| 	public MinecraftProvider getMinecraftProvider(){ | ||||
| 		return getDependencyManager().getProvider(MinecraftProvider.class); | ||||
| 	} | ||||
| 
 | ||||
| 	public void setDependencyManager(LoomDependencyManager dependencyManager) { | ||||
| 		this.dependencyManager = dependencyManager; | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -32,16 +32,8 @@ public class LoomGradlePlugin extends AbstractPlugin { | |||
| 	public void apply(Project target) { | ||||
| 		super.apply(target); | ||||
| 
 | ||||
| 		makeTask("download", DownloadTask.class); | ||||
| 		makeTask("mergeJars", MergeJarsTask.class).dependsOn("download"); | ||||
| 		makeTask("mapJars", MapJarsTask.class).dependsOn("mergeJars"); | ||||
| 		makeTask("setup", SetupTask.class).dependsOn("mapJars").setGroup("fabric"); | ||||
| 
 | ||||
| 		makeTask("extractNatives", ExtractNativesTask.class).dependsOn("download"); | ||||
| 		makeTask("genIdeaWorkspace", GenIdeaProjectTask.class).dependsOn("idea").setGroup("ide"); | ||||
| 
 | ||||
| 		makeTask("vscode", GenVSCodeProjectTask.class).dependsOn("extractNatives").setGroup("ide"); | ||||
| 
 | ||||
| 		makeTask("runClient", RunClientTask.class).dependsOn("buildNeeded").setGroup("minecraft"); | ||||
| 		makeTask("runServer", RunServerTask.class).dependsOn("buildNeeded").setGroup("minecraft"); | ||||
| 	} | ||||
|  |  | |||
|  | @ -0,0 +1,115 @@ | |||
| /* | ||||
|  * 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.providers; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.MapJarsTiny; | ||||
| import net.fabricmc.stitch.merge.JarMerger; | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| public class MinecraftJarProvider { | ||||
| 
 | ||||
| 	public File MINECRAFT_INTERMEDIARY_JAR; | ||||
| 	public File MINECRAFT_MERGED_JAR; | ||||
| 	public File MINECRAFT_MAPPED_JAR; | ||||
| 
 | ||||
| 	MinecraftProvider minecraftProvider; | ||||
| 
 | ||||
| 	public MinecraftJarProvider(Project project, MinecraftProvider minecraftProvider) throws IOException { | ||||
| 		this.minecraftProvider = minecraftProvider; | ||||
| 		initFiles(project, minecraftProvider); | ||||
| 		proccess(project, minecraftProvider); | ||||
| 	} | ||||
| 
 | ||||
| 	private void proccess(Project project, MinecraftProvider minecraftProvider) throws IOException { | ||||
| 		if (!MINECRAFT_MERGED_JAR.exists()) { | ||||
| 			mergeJars(project); | ||||
| 		} | ||||
| 
 | ||||
| 		if (getMappedJar().exists()) { | ||||
| 			getMappedJar().delete(); | ||||
| 		} | ||||
| 		if (getIntermediaryJar().exists()) { | ||||
| 			getIntermediaryJar().delete(); | ||||
| 		} | ||||
| 		new MapJarsTiny().mapJars(this, project); | ||||
| 
 | ||||
| 		if (!MINECRAFT_MAPPED_JAR.exists()) { | ||||
| 			throw new RuntimeException("mapped jar not found"); | ||||
| 		} | ||||
| 		minecraftProvider.addDep(MINECRAFT_MAPPED_JAR, project); | ||||
| 	} | ||||
| 
 | ||||
| 	public void mergeJars(Project project) throws IOException { | ||||
| 		project.getLogger().lifecycle(":merging jars"); | ||||
| 		FileInputStream client = new FileInputStream(minecraftProvider.MINECRAFT_CLIENT_JAR); | ||||
| 		FileInputStream server = new FileInputStream(minecraftProvider.MINECRAFT_SERVER_JAR); | ||||
| 		FileOutputStream merged = new FileOutputStream(MINECRAFT_MERGED_JAR); | ||||
| 
 | ||||
| 		JarMerger jarMerger = new JarMerger(client, server, merged); | ||||
| 
 | ||||
| 		jarMerger.merge(); | ||||
| 		jarMerger.close(); | ||||
| 
 | ||||
| 		client.close(); | ||||
| 		server.close(); | ||||
| 		merged.close(); | ||||
| 	} | ||||
| 
 | ||||
| 	private void initFiles(Project project, MinecraftProvider minecraftProvider) { | ||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		MINECRAFT_INTERMEDIARY_JAR = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-intermediary.jar"); | ||||
| 		MINECRAFT_MERGED_JAR = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-merged.jar"); | ||||
| 		MINECRAFT_MAPPED_JAR = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-mapped-" + minecraftProvider.pomfVersion + ".jar"); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	public File getMappingFile() { | ||||
| 		return minecraftProvider.pomfProvider.MAPPINGS_TINY; | ||||
| 	} | ||||
| 
 | ||||
| 	public Collection<File> getMapperPaths() { | ||||
| 		return minecraftProvider.libraryProvider.getLibraries(); | ||||
| 	} | ||||
| 
 | ||||
| 	public File getInputJar() { | ||||
| 		return MINECRAFT_MERGED_JAR; | ||||
| 	} | ||||
| 
 | ||||
| 	public File getIntermediaryJar() { | ||||
| 		return MINECRAFT_INTERMEDIARY_JAR; | ||||
| 	} | ||||
| 
 | ||||
| 	public File getMappedJar() { | ||||
| 		return MINECRAFT_MAPPED_JAR; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,161 @@ | |||
| /* | ||||
|  * 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.providers; | ||||
| 
 | ||||
| import com.google.common.collect.HashMultimap; | ||||
| import com.google.common.collect.Multimap; | ||||
| import com.google.gson.Gson; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.Checksum; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.loom.util.MinecraftVersionInfo; | ||||
| import net.fabricmc.loom.util.assets.AssetIndex; | ||||
| import net.fabricmc.loom.util.assets.AssetObject; | ||||
| import net.fabricmc.loom.util.progress.ProgressLogger; | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileReader; | ||||
| import java.io.IOException; | ||||
| import java.net.URL; | ||||
| import java.util.Collection; | ||||
| import java.util.HashSet; | ||||
| import java.util.Map; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| public class MinecraftLibraryProvider { | ||||
| 
 | ||||
| 	public File MINECRAFT_LIBS; | ||||
| 	public File MINECRAFT_NATIVES; | ||||
| 
 | ||||
| 	private Collection<File> libs = new HashSet<>(); | ||||
| 
 | ||||
| 	public void provide(MinecraftProvider minecraftProvider, Project project) throws IOException { | ||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		MinecraftVersionInfo versionInfo = minecraftProvider.versionInfo; | ||||
| 
 | ||||
| 		initFiles(project, minecraftProvider); | ||||
| 
 | ||||
| 		for (MinecraftVersionInfo.Library library : versionInfo.libraries) { | ||||
| 			if (library.allowed() && library.getFile(MINECRAFT_LIBS) != null) { | ||||
| 				// By default, they are all available on all sides | ||||
| 				boolean isClientOnly = false; | ||||
| 				if (library.name.contains("java3d") || library.name.contains("paulscode") || library.name.contains("lwjgl") || library.name.contains("twitch") || library.name.contains("jinput") || library.name.contains("text2speech") || library.name.contains("objc")) { | ||||
| 					isClientOnly = true; | ||||
| 				} | ||||
| 				if(!library.getFile(MINECRAFT_LIBS).exists()){ | ||||
| 					project.getLogger().lifecycle(":downloading " + library.getURL()); | ||||
| 					FileUtils.copyURLToFile(new URL(library.getURL()), library.getFile(MINECRAFT_LIBS)); | ||||
| 				} | ||||
| 				libs.add(library.getFile(MINECRAFT_LIBS)); | ||||
| 				minecraftProvider.addDep(library.getFile(MINECRAFT_LIBS), project); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		//adds the natvies to compile //TODO extract natives | ||||
| 		versionInfo.libraries.stream().filter(lib -> lib.natives != null).forEach(lib -> minecraftProvider.addDep(lib.getArtifactName(), project)); | ||||
| 
 | ||||
| 		//		for (File source : getProject().getConfigurations().getByName(Constants.CONFIG_NATIVES)) { | ||||
| 		//			ZipUtil.unpack(source, Constants.MINECRAFT_NATIVES.get(extension)); | ||||
| 		//		} | ||||
| 
 | ||||
| 		MinecraftVersionInfo.AssetIndex assetIndex = versionInfo.assetIndex; | ||||
| 
 | ||||
| 		// get existing cache files | ||||
| 		project.getLogger().lifecycle(":checking for existing asset files"); | ||||
| 		Multimap<String, File> assetFilenameToFile = HashMultimap.create(); | ||||
| 		for (File assetDir : Objects.requireNonNull(extension.getUserCache().listFiles((f) -> f.isDirectory() && f.getName().startsWith("assets-")))) { | ||||
| 			File objectsDir = new File(assetDir, "objects"); | ||||
| 			if (objectsDir.exists() && objectsDir.isDirectory()) { | ||||
| 				for (File subDir : Objects.requireNonNull(objectsDir.listFiles(File::isDirectory))) { | ||||
| 					for (File subFile : Objects.requireNonNull(subDir.listFiles(File::isFile))) { | ||||
| 						assetFilenameToFile.put("objects" + File.separator + subDir.getName() + File.separator + subFile.getName(), subFile); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		File assets = new File(extension.getUserCache(), "assets-" + minecraftProvider.minecraftVersion); | ||||
| 		if (!assets.exists()) { | ||||
| 			assets.mkdirs(); | ||||
| 		} | ||||
| 
 | ||||
| 		File assetsInfo = new File(assets, "indexes" + File.separator + assetIndex.id + ".json"); | ||||
| 		if (!assetsInfo.exists() || !Checksum.equals(assetsInfo, assetIndex.sha1)) { | ||||
| 			project.getLogger().lifecycle(":downloading asset index"); | ||||
| 			FileUtils.copyURLToFile(new URL(assetIndex.url), assetsInfo); | ||||
| 		} | ||||
| 
 | ||||
| 		ProgressLogger progressLogger = ProgressLogger.getProgressFactory(project, getClass().getName()); | ||||
| 		progressLogger.start("Downloading assets...", "assets"); | ||||
| 		FileReader fileReader = new FileReader(assetsInfo); | ||||
| 		AssetIndex index = new Gson().fromJson(fileReader, AssetIndex.class); | ||||
| 		fileReader.close(); | ||||
| 		Map<String, AssetObject> parent = index.getFileMap(); | ||||
| 		final int totalSize = parent.size(); | ||||
| 		int position = 0; | ||||
| 		project.getLogger().lifecycle(":downloading assets..."); | ||||
| 		for (Map.Entry<String, AssetObject> entry : parent.entrySet()) { | ||||
| 			AssetObject object = entry.getValue(); | ||||
| 			String sha1 = object.getHash(); | ||||
| 			String filename = "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1; | ||||
| 			File file = new File(assets, filename); | ||||
| 			if (!file.exists() && assetFilenameToFile.containsKey(filename)) { | ||||
| 				project.getLogger().debug(":copying asset " + entry.getKey()); | ||||
| 				for (File srcFile : assetFilenameToFile.get(filename)) { | ||||
| 					if (Checksum.equals(srcFile, sha1)) { | ||||
| 						FileUtils.copyFile(srcFile, file); | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			if (!file.exists() || !Checksum.equals(file, sha1)) { | ||||
| 				project.getLogger().debug(":downloading asset " + entry.getKey()); | ||||
| 				FileUtils.copyURLToFile(new URL(Constants.RESOURCES_BASE + sha1.substring(0, 2) + "/" + sha1), file); | ||||
| 			} | ||||
| 			String assetName = entry.getKey(); | ||||
| 			int end = assetName.lastIndexOf("/") + 1; | ||||
| 			if (end > 0) { | ||||
| 				assetName = assetName.substring(end); | ||||
| 			} | ||||
| 			progressLogger.progress(assetName + " - " + position + "/" + totalSize + " (" + (int) ((position / (double) totalSize) * 100) + "%) assets downloaded"); | ||||
| 			position++; | ||||
| 		} | ||||
| 		progressLogger.completed(); | ||||
| 	} | ||||
| 
 | ||||
| 	public Collection<File> getLibraries() { | ||||
| 		return libs; | ||||
| 	} | ||||
| 
 | ||||
| 	private void initFiles(Project project, MinecraftProvider minecraftProvider) { | ||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		MINECRAFT_LIBS = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-libs"); | ||||
| 		MINECRAFT_NATIVES = new File(extension.getUserCache(), minecraftProvider.minecraftVersion + "-natives"); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										116
									
								
								src/main/java/net/fabricmc/loom/providers/MinecraftProvider.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								src/main/java/net/fabricmc/loom/providers/MinecraftProvider.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,116 @@ | |||
| /* | ||||
|  * 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.providers; | ||||
| 
 | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.GsonBuilder; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.*; | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.apache.commons.io.IOUtils; | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileReader; | ||||
| import java.io.IOException; | ||||
| import java.net.URL; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.Optional; | ||||
| 
 | ||||
| public class MinecraftProvider extends DependencyProvider { | ||||
| 
 | ||||
| 	public String minecraftVersion; | ||||
| 	public String pomfVersion; | ||||
| 
 | ||||
| 	public PomfProvider pomfProvider; | ||||
| 	public MinecraftVersionInfo versionInfo; | ||||
| 	public MinecraftLibraryProvider libraryProvider; | ||||
| 	public MinecraftJarProvider jarProvider; | ||||
| 
 | ||||
| 	File MINECRAFT_JSON; | ||||
| 	File MINECRAFT_CLIENT_JAR; | ||||
| 	File MINECRAFT_SERVER_JAR; | ||||
| 	File MINECRAFT_MERGED_JAR; | ||||
| 
 | ||||
| 	Gson gson = new Gson(); | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void provide(DependcyInfo dependency, Project project, LoomGradleExtension extension) throws Exception { | ||||
| 		minecraftVersion = dependency.getDependency().getName(); | ||||
| 		pomfVersion = dependency.getDependency().getVersion(); | ||||
| 
 | ||||
| 		initFiles(project); | ||||
| 
 | ||||
| 		downloadMcJson(); | ||||
| 		versionInfo = gson.fromJson(new FileReader(MINECRAFT_JSON), MinecraftVersionInfo.class); | ||||
| 
 | ||||
| 		downloadJars(); | ||||
| 
 | ||||
| 		libraryProvider = new MinecraftLibraryProvider(); | ||||
| 		libraryProvider.provide(this, project); | ||||
| 
 | ||||
| 		//Downloads and setups up pomf | ||||
| 		pomfProvider = new PomfProvider(pomfVersion, minecraftVersion, project); | ||||
| 
 | ||||
| 		jarProvider = new MinecraftJarProvider(project, this); | ||||
| 	} | ||||
| 
 | ||||
| 	private void initFiles(Project project) { | ||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		MINECRAFT_JSON = new File(extension.getUserCache(), minecraftVersion + "-info.jar"); | ||||
| 		MINECRAFT_CLIENT_JAR = new File(extension.getUserCache(), minecraftVersion + "-client.jar"); | ||||
| 		MINECRAFT_SERVER_JAR = new File(extension.getUserCache(), minecraftVersion + "-server.jar"); | ||||
| 		MINECRAFT_MERGED_JAR = new File(extension.getUserCache(), minecraftVersion + "-merged.jar"); | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	private void downloadMcJson() throws IOException { | ||||
| 		String versionManifest = IOUtils.toString(new URL("https://launchermeta.mojang.com/mc/game/version_manifest.json"), StandardCharsets.UTF_8); | ||||
| 		ManifestVersion mcManifest = new GsonBuilder().create().fromJson(versionManifest, ManifestVersion.class); | ||||
| 
 | ||||
| 		Optional<ManifestVersion.Versions> optionalVersion = mcManifest.versions.stream().filter(versions -> versions.id.equalsIgnoreCase(minecraftVersion)).findFirst(); | ||||
| 		if (optionalVersion.isPresent()) { | ||||
| 			FileUtils.copyURLToFile(new URL(optionalVersion.get().url), MINECRAFT_JSON); | ||||
| 		} else { | ||||
| 			throw new RuntimeException("Failed to download minecraft json"); | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	private void downloadJars() throws IOException { | ||||
| 		if (!MINECRAFT_CLIENT_JAR.exists() || !Checksum.equals(MINECRAFT_CLIENT_JAR, versionInfo.downloads.get("client").sha1)) { | ||||
| 			FileUtils.copyURLToFile(new URL(versionInfo.downloads.get("client").url), MINECRAFT_CLIENT_JAR); | ||||
| 		} | ||||
| 
 | ||||
| 		if (!MINECRAFT_SERVER_JAR.exists() || !Checksum.equals(MINECRAFT_SERVER_JAR, versionInfo.downloads.get("server").sha1)) { | ||||
| 			FileUtils.copyURLToFile(new URL(versionInfo.downloads.get("server").url), MINECRAFT_SERVER_JAR); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public String getTargetConfig() { | ||||
| 		return Constants.MINECRAFT; | ||||
| 	} | ||||
| } | ||||
|  | @ -22,25 +22,35 @@ | |||
|  * SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| package net.fabricmc.loom.task; | ||||
| package net.fabricmc.loom.providers; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| import org.zeroturnaround.zip.ZipUtil; | ||||
| import net.fabricmc.loom.util.DependencyProvider; | ||||
| import net.fabricmc.loom.util.ModProcessor; | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileNotFoundException; | ||||
| 
 | ||||
| public class ExtractNativesTask extends DefaultTask { | ||||
| 	@TaskAction | ||||
| 	public void extractNatives() throws FileNotFoundException { | ||||
| 		LoomGradleExtension extension = getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		if (!Constants.MINECRAFT_NATIVES.get(extension).exists()) { | ||||
| 			for (File source : getProject().getConfigurations().getByName(Constants.CONFIG_NATIVES)) { | ||||
| 				ZipUtil.unpack(source, Constants.MINECRAFT_NATIVES.get(extension)); | ||||
| 			} | ||||
| 		} | ||||
| public class ModRemapperProvider extends DependencyProvider { | ||||
| 	@Override | ||||
| 	public void provide(DependcyInfo dependency, Project project, LoomGradleExtension extension) { | ||||
| 		File input = dependency.resolveFile(); | ||||
| 
 | ||||
| 		project.getLogger().lifecycle("Providing " + dependency.getDepString()); | ||||
| 
 | ||||
| 		MinecraftProvider minecraftProvider = getDependencyManager().getProvider(MinecraftProvider.class); | ||||
| 
 | ||||
| 		String outputName = input.getName().substring(0, input.getName().length() - 4) + "-mapped-" + minecraftProvider.pomfVersion + ".jar";//TODO use the hash of the input file or something? | ||||
| 		File output = new File(Constants.REMAPPED_MODS_STORE, outputName); | ||||
| 
 | ||||
| 		ModProcessor.handleMod(input, output, project); | ||||
| 
 | ||||
| 		addDep(output, project); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public String getTargetConfig() { | ||||
| 		return Constants.COMPILE_MODS; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										98
									
								
								src/main/java/net/fabricmc/loom/providers/PomfProvider.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/main/java/net/fabricmc/loom/providers/PomfProvider.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,98 @@ | |||
| /* | ||||
|  * 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.providers; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.net.URL; | ||||
| import java.util.zip.GZIPInputStream; | ||||
| 
 | ||||
| //TODO fix local mappings | ||||
| //TODO possibly use maven for mappings, can fix above at the same time | ||||
| public class PomfProvider { | ||||
| 
 | ||||
| 	public String minecraftVersion; | ||||
| 	public String pomfVersion; | ||||
| 
 | ||||
| 	public File POMF_DIR; | ||||
| 	public File MAPPINGS_TINY_GZ; | ||||
| 	public File MAPPINGS_TINY; | ||||
| 	public File MAPPINGS_MIXIN_EXPORT; | ||||
| 
 | ||||
| 	public PomfProvider(String pomfVersion, String minecraftVersion, Project project) { | ||||
| 		this.pomfVersion = pomfVersion; | ||||
| 		this.minecraftVersion = minecraftVersion; | ||||
| 		initFiles(project); | ||||
| 		try { | ||||
| 			init(project); | ||||
| 		} catch (Exception e) { | ||||
| 			throw new RuntimeException("Failed to setup pomf", e); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public void init(Project project) throws IOException { | ||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		project.getLogger().lifecycle(":setting up pomf " + pomfVersion); | ||||
| 
 | ||||
| 		if (!POMF_DIR.exists()) { | ||||
| 			POMF_DIR.mkdir(); | ||||
| 		} | ||||
| 
 | ||||
| 		if (!MAPPINGS_TINY_GZ.exists()) { | ||||
| 			FileUtils.copyURLToFile( | ||||
| 				new URL(String.format("%1$s%2$s.%3$s/pomf-%2$s.%3$s-tiny.gz", Constants.POMF_MAVEN_SERVER, minecraftVersion, pomfVersion)), | ||||
| 				MAPPINGS_TINY_GZ); | ||||
| 		} | ||||
| 
 | ||||
| 		if (!MAPPINGS_TINY.exists()) { | ||||
| 			GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(MAPPINGS_TINY_GZ)); | ||||
| 			FileOutputStream fileOutputStream = new FileOutputStream(MAPPINGS_TINY); | ||||
| 			int length; | ||||
| 			byte[] buffer = new byte[1024]; | ||||
| 			while ((length = gzipInputStream.read(buffer)) > 0) { | ||||
| 				fileOutputStream.write(buffer, 0, length); | ||||
| 			} | ||||
| 			gzipInputStream.close(); | ||||
| 			fileOutputStream.close(); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public void initFiles(Project project) { | ||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		POMF_DIR = new File(extension.getUserCache(), "pomf"); | ||||
| 
 | ||||
| 		MAPPINGS_TINY_GZ = new File(POMF_DIR, "pomf-tiny-" + minecraftVersion + "." + pomfVersion + ".gz"); | ||||
| 		MAPPINGS_TINY = new File(POMF_DIR, "pomf-tiny-" + minecraftVersion + "." + pomfVersion); | ||||
| 		MAPPINGS_MIXIN_EXPORT = new File(Constants.CACHE_FILES, "mixin-map-" + minecraftVersion + "." + pomfVersion + ".tiny"); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  | @ -1,155 +0,0 @@ | |||
| /* | ||||
|  * 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.util.Constants; | ||||
| import net.fabricmc.loom.util.progress.ProgressLogger; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.tasks.Input; | ||||
| import org.gradle.api.tasks.OutputFile; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| import java.net.HttpURLConnection; | ||||
| import java.net.URL; | ||||
| import java.nio.ByteBuffer; | ||||
| import java.nio.channels.Channels; | ||||
| import java.nio.channels.FileChannel; | ||||
| import java.nio.channels.ReadableByteChannel; | ||||
| 
 | ||||
| /** | ||||
|  * Generic Download class compatible with ProgressLogger | ||||
|  */ | ||||
| public class DownloadNewTask extends DefaultTask { | ||||
| 	@Input | ||||
| 	private Object output; | ||||
| 
 | ||||
| 	@OutputFile | ||||
| 	private String url; | ||||
| 	private String taskName; | ||||
| 
 | ||||
| 	@TaskAction | ||||
| 	public void download() throws IOException { | ||||
| 		File outputFile = getProject().file(getOutput()); | ||||
| 		outputFile.getParentFile().mkdirs(); | ||||
| 		outputFile.createNewFile(); | ||||
| 
 | ||||
| 		getLogger().info("Downloading " + getURL()); | ||||
| 
 | ||||
| 		URL url = new URL(getURL()); | ||||
| 		HttpURLConnection connect = (HttpURLConnection) url.openConnection(); | ||||
| 		connect.setRequestProperty("User-Agent", Constants.USER_AGENT); | ||||
| 		connect.setInstanceFollowRedirects(true); | ||||
| 
 | ||||
| 		ProgressLogger progressLogger = ProgressLogger.getProgressFactory(getProject(), getClass().getName()); | ||||
| 		progressLogger.setDescription("Downloading " + getURL()); | ||||
| 		ReadableByteChannel inChannel = new DownloadChannel(Channels.newChannel(connect.getInputStream()), getContentLength(url), progressLogger); | ||||
| 		FileChannel outChannel = new FileOutputStream(outputFile).getChannel(); | ||||
| 		outChannel.transferFrom(inChannel, 0, Long.MAX_VALUE); | ||||
| 		outChannel.close(); | ||||
| 		inChannel.close(); | ||||
| 		progressLogger.completed(); | ||||
| 		getLogger().info("Download complete"); | ||||
| 	} | ||||
| 
 | ||||
| 	private int getContentLength(URL url) { | ||||
| 		HttpURLConnection connection; | ||||
| 		int contentLength = -1; | ||||
| 		try { | ||||
| 			connection = (HttpURLConnection) url.openConnection(); | ||||
| 			contentLength = connection.getContentLength(); | ||||
| 		} catch (Exception e) { | ||||
| 		} | ||||
| 		return contentLength; | ||||
| 	} | ||||
| 
 | ||||
| 	public File getOutput() { | ||||
| 		return getProject().file(output); | ||||
| 	} | ||||
| 
 | ||||
| 	public void setOutput(Object output) { | ||||
| 		this.output = output; | ||||
| 	} | ||||
| 
 | ||||
| 	public String getURL() { | ||||
| 		return url; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setURL(String url) { | ||||
| 		this.url = url; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setTaskName(String taskName) { | ||||
| 		this.taskName = taskName; | ||||
| 	} | ||||
| 
 | ||||
| 	public String getTaskName() { | ||||
| 		return taskName; | ||||
| 	} | ||||
| 
 | ||||
| 	class DownloadChannel implements ReadableByteChannel { | ||||
| 		ProgressLogger logger; | ||||
| 		String formattedSize; | ||||
| 		ReadableByteChannel rbc; | ||||
| 		long totalBytes; | ||||
| 
 | ||||
| 		DownloadChannel(ReadableByteChannel rbc, long expectedSize, ProgressLogger logger) { | ||||
| 			this.logger = logger; | ||||
| 			this.formattedSize = toHumanReadableLength(expectedSize); | ||||
| 			this.rbc = rbc; | ||||
| 		} | ||||
| 
 | ||||
| 		public void close() throws IOException { | ||||
| 			rbc.close(); | ||||
| 		} | ||||
| 
 | ||||
| 		public boolean isOpen() { | ||||
| 			return rbc.isOpen(); | ||||
| 		} | ||||
| 
 | ||||
| 		public int read(ByteBuffer buffer) throws IOException { | ||||
| 			int processedBytes; | ||||
| 			if ((processedBytes = rbc.read(buffer)) > 0) { | ||||
| 				totalBytes += processedBytes; | ||||
| 				logger.progress(toHumanReadableLength(totalBytes) + "/" + formattedSize + " downloaded"); | ||||
| 			} | ||||
| 			return processedBytes; | ||||
| 		} | ||||
| 
 | ||||
| 		private String toHumanReadableLength(long bytes) { | ||||
| 			if (bytes < 1024) { | ||||
| 				return bytes + " B"; | ||||
| 			} else if (bytes < 1024 * 1024) { | ||||
| 				return (bytes / 1024) + " KB"; | ||||
| 			} else if (bytes < 1024 * 1024 * 1024) { | ||||
| 				return String.format("%.2f MB", bytes / (1024.0 * 1024.0)); | ||||
| 			} else { | ||||
| 				return String.format("%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0)); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -1,247 +0,0 @@ | |||
| /* | ||||
|  * 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 com.google.common.collect.HashMultimap; | ||||
| import com.google.common.collect.Multimap; | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.GsonBuilder; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.Checksum; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.loom.util.ManifestVersion; | ||||
| import net.fabricmc.loom.util.Version; | ||||
| import net.fabricmc.loom.util.assets.AssetIndex; | ||||
| import net.fabricmc.loom.util.assets.AssetObject; | ||||
| import net.fabricmc.loom.util.progress.ProgressLogger; | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.artifacts.Configuration; | ||||
| import org.gradle.api.artifacts.dsl.DependencyHandler; | ||||
| import org.gradle.api.logging.Logger; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| 
 | ||||
| import java.io.*; | ||||
| import java.net.URL; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import java.util.Objects; | ||||
| import java.util.Optional; | ||||
| import java.util.zip.GZIPInputStream; | ||||
| 
 | ||||
| public class DownloadTask extends DefaultTask { | ||||
| 	@TaskAction | ||||
| 	public void download() { | ||||
| 		try { | ||||
| 			LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 
 | ||||
| 			downloadMcJson(extension, getLogger()); | ||||
| 
 | ||||
| 			Gson gson = new Gson(); | ||||
| 			Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); | ||||
| 
 | ||||
| 			if (!Constants.MINECRAFT_CLIENT_JAR.get(extension).exists() || !Checksum.equals(Constants.MINECRAFT_CLIENT_JAR.get(extension), version.downloads.get("client").sha1)) { | ||||
| 				this.getLogger().lifecycle(":downloading client"); | ||||
| 				FileUtils.copyURLToFile(new URL(version.downloads.get("client").url), Constants.MINECRAFT_CLIENT_JAR.get(extension)); | ||||
| 			} | ||||
| 
 | ||||
| 			if (!Constants.MINECRAFT_SERVER_JAR.get(extension).exists() || !Checksum.equals(Constants.MINECRAFT_SERVER_JAR.get(extension), version.downloads.get("server").sha1)) { | ||||
| 				this.getLogger().lifecycle(":downloading server"); | ||||
| 				FileUtils.copyURLToFile(new URL(version.downloads.get("server").url), Constants.MINECRAFT_SERVER_JAR.get(extension)); | ||||
| 			} | ||||
| 
 | ||||
| 			if (!Constants.POMF_DIR.get(extension).exists()) { | ||||
| 				Constants.POMF_DIR.get(extension).mkdir(); | ||||
| 			} | ||||
| 
 | ||||
| 			if (Constants.JAR_MAPPER_ENIGMA.equals(extension.jarMapper)) { | ||||
| 				if (!Constants.MAPPINGS_ENIGMA_ZIP.get(extension).exists() && extension.hasPomf()) { | ||||
| 					this.getLogger().lifecycle(":downloading enigma mappings"); | ||||
| 					try { | ||||
| 						FileUtils.copyURLToFile( | ||||
| 								new URL(String.format("%1$s%2$s.%3$s/pomf-%2$s.%3$s-engima.zip", Constants.POMF_MAVEN_SERVER, extension.version, extension.pomfVersion)), | ||||
| 								Constants.MAPPINGS_ENIGMA_ZIP.get(extension) | ||||
| 						); | ||||
| 					} catch (Exception e) { | ||||
| 						throw new RuntimeException("Failed to download mappings", e); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			if (!extension.hasPomf()) { | ||||
| 				if (Constants.MAPPINGS_DIR_LOCAL.get(extension).exists()) { | ||||
| 					if (Constants.MAPPINGS_TINY_GZ_LOCAL.get(extension).exists() && (!Constants.JAR_MAPPER_ENIGMA.equals(extension.jarMapper) || Constants.MAPPINGS_ENIGMA_ZIP_LOCAL.get(extension).exists())) { | ||||
| 						this.getLogger().lifecycle(":using local mappings!"); | ||||
| 						extension.localMappings = true; | ||||
| 
 | ||||
| 						//We delete this to make sure they are always re extracted. | ||||
| 						deleteIfExists(Constants.MAPPINGS_ENIGMA_DIR.get(extension)); | ||||
| 						deleteIfExists(Constants.MAPPINGS_ENIGMA_ZIP.get(extension)); | ||||
| 						deleteIfExists(Constants.MAPPINGS_TINY_GZ.get(extension)); | ||||
| 						deleteIfExists(Constants.MAPPINGS_TINY.get(extension)); | ||||
| 
 | ||||
| 						Constants.MAPPINGS_TINY_GZ = Constants.MAPPINGS_TINY_GZ_LOCAL; | ||||
| 						Constants.MAPPINGS_ENIGMA_ZIP = Constants.MAPPINGS_ENIGMA_ZIP_LOCAL; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			if (!Constants.MAPPINGS_TINY.get(extension).exists() && extension.hasPomf()) { | ||||
| 				if (!Constants.MAPPINGS_TINY_GZ.get(extension).exists() && !extension.localMappings) { | ||||
| 					getLogger().lifecycle(":downloading tiny mappings"); | ||||
| 					try { | ||||
| 						FileUtils.copyURLToFile(new URL(String.format("%1$s%2$s.%3$s/pomf-%2$s.%3$s-tiny.gz", Constants.POMF_MAVEN_SERVER, extension.version, extension.pomfVersion)), Constants.MAPPINGS_TINY_GZ.get(extension)); | ||||
| 					} catch (Exception e) { | ||||
| 						throw new RuntimeException("Failed to download mappings", e); | ||||
| 					} | ||||
| 				} | ||||
| 				GZIPInputStream gzipInputStream = new GZIPInputStream(new FileInputStream(Constants.MAPPINGS_TINY_GZ.get(extension))); | ||||
| 				FileOutputStream fileOutputStream = new FileOutputStream(Constants.MAPPINGS_TINY.get(extension)); | ||||
| 				int length; | ||||
| 				byte[] buffer = new byte[1024]; | ||||
| 				while ((length = gzipInputStream.read(buffer)) > 0) { | ||||
| 					fileOutputStream.write(buffer, 0, length); | ||||
| 				} | ||||
| 				gzipInputStream.close(); | ||||
| 				fileOutputStream.close(); | ||||
| 			} | ||||
| 
 | ||||
| 			DependencyHandler dependencyHandler = getProject().getDependencies(); | ||||
| 
 | ||||
| 			if (getProject().getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getState() == Configuration.State.UNRESOLVED) { | ||||
| 				for (Version.Library library : version.libraries) { | ||||
| 					if (library.allowed() && library.getFile(extension) != null) { | ||||
| 						// By default, they are all available on all sides | ||||
| 						String configName = Constants.CONFIG_MC_DEPENDENCIES; | ||||
| 						if (library.name.contains("java3d") || library.name.contains("paulscode") || library.name.contains("lwjgl") || library.name.contains("twitch") || library.name.contains("jinput") || library.name.contains("text2speech") || library.name.contains("objc")) { | ||||
| 							configName = Constants.CONFIG_MC_DEPENDENCIES_CLIENT; | ||||
| 						} | ||||
| 						dependencyHandler.add(configName, library.getArtifactName()); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			if (getProject().getConfigurations().getByName(Constants.CONFIG_NATIVES).getState() == Configuration.State.UNRESOLVED) { | ||||
| 				version.libraries.stream().filter(lib -> lib.natives != null).forEach(lib -> dependencyHandler.add(Constants.CONFIG_NATIVES, lib.getArtifactName())); | ||||
| 			} | ||||
| 
 | ||||
| 			Version.AssetIndex assetIndex = version.assetIndex; | ||||
| 
 | ||||
| 			// get existing cache files | ||||
| 			this.getLogger().lifecycle(":checking for existing asset files"); | ||||
| 			Multimap<String, File> assetFilenameToFile = HashMultimap.create(); | ||||
| 			for (File assetDir : Objects.requireNonNull(extension.getUserCache().listFiles((f) -> f.isDirectory() && f.getName().startsWith("assets-")))) { | ||||
| 				File objectsDir = new File(assetDir, "objects"); | ||||
| 				if (objectsDir.exists() && objectsDir.isDirectory()) { | ||||
| 					for (File subDir : Objects.requireNonNull(objectsDir.listFiles(File::isDirectory))) { | ||||
| 						for (File subFile : Objects.requireNonNull(subDir.listFiles(File::isFile))) { | ||||
| 							assetFilenameToFile.put("objects" + File.separator + subDir.getName() + File.separator + subFile.getName(), subFile); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			File assets = new File(extension.getUserCache(), "assets-" + extension.version); | ||||
| 			if (!assets.exists()) { | ||||
| 				assets.mkdirs(); | ||||
| 			} | ||||
| 
 | ||||
| 			File assetsInfo = new File(assets, "indexes" + File.separator + assetIndex.id + ".json"); | ||||
| 			if (!assetsInfo.exists() || !Checksum.equals(assetsInfo, assetIndex.sha1)) { | ||||
| 				this.getLogger().lifecycle(":downloading asset index"); | ||||
| 				FileUtils.copyURLToFile(new URL(assetIndex.url), assetsInfo); | ||||
| 			} | ||||
| 
 | ||||
| 			ProgressLogger progressLogger = ProgressLogger.getProgressFactory(getProject(), getClass().getName()); | ||||
| 			progressLogger.start("Downloading assets...", "assets"); | ||||
| 			AssetIndex index = new Gson().fromJson(new FileReader(assetsInfo), AssetIndex.class); | ||||
| 			Map<String, AssetObject> parent = index.getFileMap(); | ||||
| 			final int totalSize = parent.size(); | ||||
| 			int position = 0; | ||||
| 			this.getLogger().lifecycle(":downloading assets..."); | ||||
| 			for (Map.Entry<String, AssetObject> entry : parent.entrySet()) { | ||||
| 				AssetObject object = entry.getValue(); | ||||
| 				String sha1 = object.getHash(); | ||||
| 				String filename = "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1; | ||||
| 				File file = new File(assets, filename); | ||||
| 				if (!file.exists() && assetFilenameToFile.containsKey(filename)) { | ||||
| 					this.getLogger().debug(":copying asset " + entry.getKey()); | ||||
| 					for (File srcFile : assetFilenameToFile.get(filename)) { | ||||
| 						if (Checksum.equals(srcFile, sha1)) { | ||||
| 							FileUtils.copyFile(srcFile, file); | ||||
| 							break; | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 
 | ||||
| 				if (!file.exists() || !Checksum.equals(file, sha1)) { | ||||
| 					this.getLogger().debug(":downloading asset " + entry.getKey()); | ||||
| 					FileUtils.copyURLToFile(new URL(Constants.RESOURCES_BASE + sha1.substring(0, 2) + "/" + sha1), file); | ||||
| 				} | ||||
| 				String assetName = entry.getKey(); | ||||
| 				int end = assetName.lastIndexOf("/") + 1; | ||||
| 				if (end > 0) { | ||||
| 					assetName = assetName.substring(end); | ||||
| 				} | ||||
| 				progressLogger.progress(assetName + " - " + position + "/" + totalSize + " (" + (int) ((position / (double) totalSize) * 100) + "%) assets downloaded"); | ||||
| 				position++; | ||||
| 			} | ||||
| 			progressLogger.completed(); | ||||
| 		} catch (IOException e) { | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public static void downloadMcJson(LoomGradleExtension extension, Logger logger) throws IOException { | ||||
| 		if (!Constants.MINECRAFT_JSON.get(extension).exists()) { | ||||
| 			logger.lifecycle(":downloading minecraft json"); | ||||
| 			FileUtils.copyURLToFile(new URL("https://launchermeta.mojang.com/mc/game/version_manifest.json"), Constants.VERSION_MANIFEST.get(extension)); | ||||
| 			ManifestVersion mcManifest = new GsonBuilder().create().fromJson(FileUtils.readFileToString(Constants.VERSION_MANIFEST.get(extension), "UTF-8"), ManifestVersion.class); | ||||
| 
 | ||||
| 			Optional<ManifestVersion.Versions> optionalVersion = mcManifest.versions.stream().filter(versions -> versions.id.equalsIgnoreCase(extension.version)).findFirst(); | ||||
| 			if (optionalVersion.isPresent()) { | ||||
| 				FileUtils.copyURLToFile(new URL(optionalVersion.get().url), Constants.MINECRAFT_JSON.get(extension)); | ||||
| 			} else { | ||||
| 				logger.info(":failed downloading minecraft json"); | ||||
| 				throw new RuntimeException("Failed downloading Minecraft json"); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private static boolean deleteIfExists(File file) { | ||||
| 		if (file.exists()) { | ||||
| 			if (file.isDirectory()) { | ||||
| 				try { | ||||
| 					FileUtils.deleteDirectory(file); | ||||
| 					return file.mkdir(); | ||||
| 				} catch (IOException e) { | ||||
| 					e.printStackTrace(); | ||||
| 				} | ||||
| 			} | ||||
| 			return file.delete(); | ||||
| 		} | ||||
| 		return false; | ||||
| 	} | ||||
| } | ||||
|  | @ -26,9 +26,10 @@ package net.fabricmc.loom.task; | |||
| 
 | ||||
| import com.google.gson.Gson; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.providers.MinecraftProvider; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.loom.util.IdeaRunConfig; | ||||
| import net.fabricmc.loom.util.Version; | ||||
| import net.fabricmc.loom.util.MinecraftVersionInfo; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.Project; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
|  | @ -104,7 +105,8 @@ public class GenIdeaProjectTask extends DefaultTask { | |||
| 
 | ||||
| 		Gson gson = new Gson(); | ||||
| 
 | ||||
| 		Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); | ||||
| 		MinecraftProvider minecraftProvider =  extension.getDependencyManager().getProvider(MinecraftProvider.class); | ||||
| 		MinecraftVersionInfo minecraftVersionInfo = minecraftProvider.versionInfo; | ||||
| 
 | ||||
| 		TransformerFactory transformerFactory = TransformerFactory.newInstance(); | ||||
| 		Transformer transformer = transformerFactory.newTransformer(); | ||||
|  | @ -139,8 +141,8 @@ public class GenIdeaProjectTask extends DefaultTask { | |||
| 		ideaClient.projectName = project.getName(); | ||||
| 		ideaClient.configName = "Minecraft Client"; | ||||
| 		ideaClient.runDir = "file://$PROJECT_DIR$/" + extension.runDir; | ||||
| 		ideaClient.vmArgs = "-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath() + " -Dfabric.development=true"; | ||||
| 		ideaClient.programArgs = "--tweakClass " + Constants.FABRIC_CLIENT_TWEAKER + " --assetIndex " + version.assetIndex.id + " --assetsDir \"" + new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath() + "\" --fabricMappingFile \"" + Constants.MAPPINGS_TINY.get(extension).getAbsolutePath() + "\""; | ||||
| 		ideaClient.vmArgs = "-Djava.library.path=" + extension.getMinecraftProvider().libraryProvider.MINECRAFT_NATIVES.getAbsolutePath() + " -Dfabric.development=true"; | ||||
| 		ideaClient.programArgs = "--tweakClass " + Constants.FABRIC_CLIENT_TWEAKER + " --assetIndex " + minecraftVersionInfo.assetIndex.id + " --assetsDir \"" + new File(extension.getUserCache(), "assets-" + minecraftProvider.minecraftVersion).getAbsolutePath() + "\" --fabricMappingFile \"" + minecraftProvider.pomfProvider.MAPPINGS_TINY.getAbsolutePath() + "\""; | ||||
| 
 | ||||
| 		runManager.appendChild(ideaClient.genRuns(runManager)); | ||||
| 
 | ||||
|  | @ -150,7 +152,7 @@ public class GenIdeaProjectTask extends DefaultTask { | |||
| 		ideaServer.configName = "Minecraft Server"; | ||||
| 		ideaServer.runDir = "file://$PROJECT_DIR$/" + extension.runDir; | ||||
| 		ideaServer.vmArgs = "-Dfabric.development=true"; | ||||
| 		ideaServer.programArgs = "--tweakClass " + Constants.FABRIC_SERVER_TWEAKER + " --fabricMappingFile \"" + Constants.MAPPINGS_TINY.get(extension).getAbsolutePath() + "\""; | ||||
| 		ideaServer.programArgs = "--tweakClass " + Constants.FABRIC_SERVER_TWEAKER + " --fabricMappingFile \"" + minecraftProvider.pomfProvider.MAPPINGS_TINY.getAbsolutePath() + "\""; | ||||
| 
 | ||||
| 		runManager.appendChild(ideaServer.genRuns(runManager)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,82 +0,0 @@ | |||
| /* | ||||
|  * 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 com.google.gson.*; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.loom.util.Version; | ||||
| import org.apache.commons.io.FileUtils; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileReader; | ||||
| import java.io.IOException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| /** | ||||
|  * Install https://marketplace.visualstudio.com/items?itemName=georgewfraser.vscode-javac into vscode | ||||
|  */ | ||||
| public class GenVSCodeProjectTask extends DefaultTask { | ||||
| 
 | ||||
| 	@TaskAction | ||||
| 	public void genVsCodeProject() throws IOException { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		File classPathFile = new File("vscodeClasspath.txt"); | ||||
| 		File configFile = new File("javaconfig.json"); | ||||
| 
 | ||||
| 		Gson gson = new Gson(); | ||||
| 		Version version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); | ||||
| 
 | ||||
| 		List<String> libs = new ArrayList<>(); | ||||
| 		for (Version.Library library : version.libraries) { | ||||
| 			if (library.allowed() && library.getFile(extension) != null && library.getFile(extension).exists()) { | ||||
| 				libs.add(library.getFile(extension).getAbsolutePath()); | ||||
| 			} | ||||
| 		} | ||||
| 		libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); | ||||
| 		for (File file : getProject().getConfigurations().getByName("compile").getFiles()) { | ||||
| 			libs.add(file.getAbsolutePath()); | ||||
| 		} | ||||
| 		FileUtils.writeLines(classPathFile, libs); | ||||
| 
 | ||||
| 		JsonObject jsonObject = new JsonObject(); | ||||
| 		JsonArray jsonArray = new JsonArray(); | ||||
| 		jsonArray.add("src/main/java"); | ||||
| 		jsonArray.add("src/main/resources"); | ||||
| 		jsonArray.add("src/test/java"); | ||||
| 		jsonArray.add("src/test/resources"); | ||||
| 		jsonObject.add("sourcePath", jsonArray); | ||||
| 		JsonElement element = new JsonPrimitive(classPathFile.getName()); | ||||
| 		jsonObject.add("classPathFile", element); | ||||
| 		element = new JsonPrimitive("vscode"); | ||||
| 		jsonObject.add("outputDirectory", element); | ||||
| 
 | ||||
| 		FileUtils.writeStringToFile(configFile, gson.toJson(jsonObject), "UTF-8"); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  | @ -1,38 +0,0 @@ | |||
| /* | ||||
|  * 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.delayed.IDelayed; | ||||
| import org.gradle.api.DefaultTask; | ||||
| 
 | ||||
| import java.io.File; | ||||
| 
 | ||||
| public class LoomBaseTask extends DefaultTask { | ||||
| 	protected final File getFile(IDelayed<File> file) { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		return file.get(extension); | ||||
| 	} | ||||
| } | ||||
|  | @ -1,122 +0,0 @@ | |||
| /* | ||||
|  * 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 cuchaz.enigma.Deobfuscator; | ||||
| import cuchaz.enigma.TranslatingTypeLoader; | ||||
| import cuchaz.enigma.mapping.MappingsEnigmaReader; | ||||
| import cuchaz.enigma.mapping.TranslationDirection; | ||||
| import cuchaz.enigma.mapping.Translator; | ||||
| import cuchaz.enigma.mapping.entry.ReferencedEntryPool; | ||||
| import cuchaz.enigma.throwables.MappingParseException; */ | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.tinyremapper.OutputConsumerPath; | ||||
| import net.fabricmc.tinyremapper.TinyRemapper; | ||||
| 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.IOException; | ||||
| import java.nio.file.Path; | ||||
| import java.util.jar.JarFile; | ||||
| 
 | ||||
| public class MapJarsEnigma { | ||||
| 	public void mapJars(MapJarsTask task) { | ||||
| 		throw new RuntimeException("Currently unsupported!"); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Deobfuscator deobfuscator; | ||||
| 
 | ||||
| 	public void mapJars(MapJarsTask task) throws IOException, MappingParseException { | ||||
| 		LoomGradleExtension extension = task.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		if (!Constants.MINECRAFT_MAPPED_JAR.get(extension).exists() || extension.localMappings || true) { | ||||
| 			if(Constants.MINECRAFT_MAPPED_JAR.get(extension).exists()){ | ||||
| 				Constants.MINECRAFT_MAPPED_JAR.get(extension).delete(); | ||||
| 			} | ||||
| 
 | ||||
| 			if (!extension.hasPomf()) { | ||||
| 				task.getLogger().lifecycle("POMF version not set, skipping mapping!"); | ||||
| 				FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), Constants.MINECRAFT_MAPPED_JAR.get(extension)); | ||||
| 				return; | ||||
| 			} | ||||
| 
 | ||||
| 			if (!Constants.MAPPINGS_ENIGMA_DIR.get(extension).exists() || extension.localMappings) { | ||||
| 				task.getLogger().lifecycle(":unpacking mappings"); | ||||
| 				FileUtils.deleteDirectory(Constants.MAPPINGS_ENIGMA_DIR.get(extension)); | ||||
| 				ZipUtil.unpack(Constants.MAPPINGS_ENIGMA_ZIP.get(extension), Constants.MAPPINGS_ENIGMA_DIR.get(extension)); | ||||
| 			} | ||||
| 
 | ||||
| 			task.getLogger().lifecycle(":remapping jar (Enigma)"); | ||||
| 			deobfuscator = new Deobfuscator(new JarFile(Constants.MINECRAFT_MERGED_JAR.get(extension))); | ||||
| 			deobfuscator.setMappings(new MappingsEnigmaReader().read(Constants.MAPPINGS_ENIGMA_DIR.get(extension))); | ||||
| 			writeJar(Constants.MINECRAFT_PARTIAL_ENIGMA_JAR.get(extension), new ProgressListener(), deobfuscator); | ||||
| 
 | ||||
| 			File tempAssets = new File(Constants.CACHE_FILES, "tempAssets"); | ||||
| 			if (tempAssets.exists()) { | ||||
| 				FileUtils.deleteDirectory(tempAssets); | ||||
| 			} | ||||
| 			tempAssets.mkdir(); | ||||
| 
 | ||||
| 			ZipUtil.unpack(Constants.MINECRAFT_CLIENT_JAR.get(extension), tempAssets, name -> { | ||||
| 				if (!name.endsWith(".class") && !name.startsWith("META-INF")) { | ||||
| 					return name; | ||||
| 				} else { | ||||
| 					return null; | ||||
| 				} | ||||
| 			}); | ||||
| 			ZipUtil.unpack(Constants.MINECRAFT_PARTIAL_ENIGMA_JAR.get(extension), tempAssets); | ||||
| 
 | ||||
| 			ZipUtil.pack(tempAssets, Constants.MINECRAFT_MAPPED_JAR.get(extension)); | ||||
| 			FileUtils.deleteDirectory(tempAssets); | ||||
| 		} else { | ||||
| 			task.getLogger().lifecycle(Constants.MINECRAFT_MAPPED_JAR.get(extension).getAbsolutePath()); | ||||
| 			task.getLogger().lifecycle(":mapped jar found, skipping mapping"); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public void writeJar(File out, Deobfuscator.ProgressListener progress, Deobfuscator deobfuscator) { | ||||
| 		Translator obfuscationTranslator = deobfuscator.getTranslator(TranslationDirection.OBFUSCATING); | ||||
| 		Translator deobfuscationTranslator = deobfuscator.getTranslator(TranslationDirection.DEOBFUSCATING); | ||||
| 		TranslatingTypeLoader loader = new TranslatingTypeLoader(deobfuscator.getJar(), deobfuscator.getJarIndex(), new ReferencedEntryPool(), obfuscationTranslator, deobfuscationTranslator); | ||||
| 		deobfuscator.transformJar(out, progress, loader::transformInto); | ||||
| 	} | ||||
| 
 | ||||
| 	public static class ProgressListener implements Deobfuscator.ProgressListener { | ||||
| 		@Override | ||||
| 		public void init(int i, String s) { | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		@Override | ||||
| 		public void onProgress(int i, String s) { | ||||
| 
 | ||||
| 		} | ||||
| 	} */ | ||||
| } | ||||
|  | @ -1,107 +0,0 @@ | |||
| /* | ||||
|  * 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 org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.tasks.*; | ||||
| import org.zeroturnaround.zip.commons.FileUtils; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.Collection; | ||||
| 
 | ||||
| public class MapJarsTask extends LoomBaseTask { | ||||
| 	@InputFiles | ||||
| 	@Classpath | ||||
| 	public Collection<File> getMapperPaths() { | ||||
| 		return this.getProject().getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getFiles(); | ||||
| 	} | ||||
| 
 | ||||
| 	@InputFile | ||||
| 	public File getMappingFile() { | ||||
| 		return getFile(Constants.MAPPINGS_TINY); | ||||
| 	} | ||||
| 
 | ||||
| 	@InputFile | ||||
| 	public File getInputJar() { | ||||
| 		return getFile(Constants.MINECRAFT_MERGED_JAR); | ||||
| 	} | ||||
| 
 | ||||
| 	@OutputFile | ||||
| 	public File getIntermediaryJar() { | ||||
| 		return getFile(Constants.MINECRAFT_INTERMEDIARY_JAR); | ||||
| 	} | ||||
| 
 | ||||
| 	@OutputFile | ||||
| 	public File getMappedJar() { | ||||
| 		return getFile(Constants.MINECRAFT_MAPPED_JAR); | ||||
| 	} | ||||
| 
 | ||||
| 	@Input | ||||
| 	public boolean localMappings() { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		return extension.localMappings; | ||||
| 	} | ||||
| 
 | ||||
| 	@Input | ||||
| 	public String pomfVersion() { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		return extension.pomfVersion; | ||||
| 	} | ||||
| 
 | ||||
| 	@Input | ||||
| 	public String jarMapper() { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		return extension.jarMapper; | ||||
| 	} | ||||
| 
 | ||||
| 	@TaskAction | ||||
| 	public void mapJars() throws Exception { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 
 | ||||
| 		if (getMappedJar().exists()) { | ||||
| 			getMappedJar().delete(); | ||||
| 		} | ||||
| 
 | ||||
| 		if (getIntermediaryJar().exists()) { | ||||
| 			getIntermediaryJar().delete(); | ||||
| 		} | ||||
| 
 | ||||
| 		if (!extension.hasPomf()) { | ||||
| 			this.getLogger().lifecycle("Mapping version not set, skipping mapping!"); | ||||
| 			FileUtils.copyFile(Constants.MINECRAFT_MERGED_JAR.get(extension), getMappedJar()); | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		if (Constants.JAR_MAPPER_ENIGMA.equals(jarMapper())) { | ||||
| 			new MapJarsEnigma().mapJars(this); | ||||
| 		} else if (Constants.JAR_MAPPER_TINY.equals(jarMapper())) { | ||||
| 			new MapJarsTiny().mapJars(this); | ||||
| 		} else { | ||||
| 			throw new RuntimeException("Unknown JAR mapper type: " + jarMapper()); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -1,74 +0,0 @@ | |||
| /* | ||||
|  * 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.delayed.IDelayed; | ||||
| import net.fabricmc.stitch.merge.JarMerger; | ||||
| import org.gradle.api.DefaultTask; | ||||
| import org.gradle.api.tasks.InputFile; | ||||
| import org.gradle.api.tasks.OutputFile; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.FileOutputStream; | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| public class MergeJarsTask extends LoomBaseTask { | ||||
| 	@InputFile | ||||
| 	public File getClientJar() { | ||||
| 		return getFile(Constants.MINECRAFT_CLIENT_JAR); | ||||
| 	} | ||||
| 
 | ||||
| 	@InputFile | ||||
| 	public File getServerJar() { | ||||
| 		return getFile(Constants.MINECRAFT_SERVER_JAR); | ||||
| 	} | ||||
| 
 | ||||
| 	@OutputFile | ||||
| 	public File getMergedJar() { | ||||
| 		return getFile(Constants.MINECRAFT_MERGED_JAR); | ||||
| 	} | ||||
| 
 | ||||
| 	@TaskAction | ||||
| 	public void mergeJars() throws IOException { | ||||
| 		this.getLogger().lifecycle(":merging jars"); | ||||
| 		FileInputStream client = new FileInputStream(getClientJar()); | ||||
| 		FileInputStream server = new FileInputStream(getServerJar()); | ||||
| 		FileOutputStream merged = new FileOutputStream(getMergedJar()); | ||||
| 
 | ||||
| 		JarMerger jarMerger = new JarMerger(client, server, merged); | ||||
| 
 | ||||
| 		jarMerger.merge(); | ||||
| 		jarMerger.close(); | ||||
| 
 | ||||
| 		client.close(); | ||||
| 		server.close(); | ||||
| 		merged.close(); | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  | @ -24,15 +24,12 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.task; | ||||
| 
 | ||||
| import com.google.gson.Gson; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.loom.util.Version; | ||||
| import net.fabricmc.loom.util.MinecraftVersionInfo; | ||||
| import org.gradle.api.tasks.JavaExec; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileNotFoundException; | ||||
| import java.io.FileReader; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
|  | @ -41,35 +38,22 @@ public class RunClientTask extends JavaExec { | |||
| 	@Override | ||||
| 	public void exec() { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		Gson gson = new Gson(); | ||||
| 		Version version = null; | ||||
| 		try { | ||||
| 			version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); | ||||
| 		} catch (FileNotFoundException e) { | ||||
|             getLogger().error("Failed to retrieve version from  minecraft json", e); | ||||
| 		} | ||||
| 		MinecraftVersionInfo minecraftVersionInfo = extension.getMinecraftProvider().versionInfo; | ||||
| 
 | ||||
| 
 | ||||
| 		List<String> libs = new ArrayList<>(); | ||||
| 		for (File file : getProject().getConfigurations().getByName("compile").getFiles()) { | ||||
| 			libs.add(file.getAbsolutePath()); | ||||
| 		} | ||||
| 		for (File file : getProject().getConfigurations().getByName(Constants.CONFIG_MINECRAFT).getFiles()) { | ||||
| 			libs.add(file.getAbsolutePath()); | ||||
| 		} | ||||
| 		//Used to add the fabric jar that has been built | ||||
| 		for (File file : new File(getProject().getBuildDir(), "libs").listFiles()) { | ||||
| 			if (file.isFile()) { | ||||
| 				libs.add(file.getAbsolutePath()); | ||||
| 			} | ||||
| 		} | ||||
| 		libs.add(Constants.MINECRAFT_CLIENT_JAR.get(extension).getAbsolutePath()); | ||||
| 
 | ||||
| 		//Removes the deobf jars | ||||
| 		libs.removeIf(s -> s.contains(Constants.MINECRAFT_FINAL_JAR.get(extension).getName())); | ||||
| 
 | ||||
| 		classpath(libs); | ||||
| 
 | ||||
| 		args("--tweakClass", Constants.FABRIC_CLIENT_TWEAKER, "--assetIndex", version.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.version).getAbsolutePath(), "--fabricMappingFile", Constants.MAPPINGS_TINY.get(extension).getAbsolutePath()); | ||||
| 		args("--tweakClass", Constants.FABRIC_CLIENT_TWEAKER, "--assetIndex", minecraftVersionInfo.assetIndex.id, "--assetsDir", new File(extension.getUserCache(), "assets-" + extension.getMinecraftProvider().minecraftVersion).getAbsolutePath(), "--fabricMappingFile", extension.getMinecraftProvider().pomfProvider.MAPPINGS_TINY.getAbsolutePath()); | ||||
| 
 | ||||
| 		setWorkingDir(new File(getProject().getRootDir(), "run")); | ||||
| 
 | ||||
|  | @ -93,7 +77,7 @@ public class RunClientTask extends JavaExec { | |||
| 	public List<String> getJvmArgs() { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		List<String> args = new ArrayList<>(); | ||||
| 		args.add("-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath()); | ||||
| 		args.add("-Djava.library.path=" + extension.getMinecraftProvider().libraryProvider.MINECRAFT_NATIVES.getAbsolutePath()); | ||||
| 		//args.add("-XstartOnFirstThread"); //Fixes lwjgl starting on an incorrect thread | ||||
| 		return args; | ||||
| 	} | ||||
|  |  | |||
|  | @ -24,15 +24,11 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.task; | ||||
| 
 | ||||
| import com.google.gson.Gson; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.loom.util.Version; | ||||
| import org.gradle.api.tasks.JavaExec; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.FileNotFoundException; | ||||
| import java.io.FileReader; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
|  | @ -41,31 +37,20 @@ public class RunServerTask extends JavaExec { | |||
| 	@Override | ||||
| 	public void exec() { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		Gson gson = new Gson(); | ||||
| 		Version version = null; | ||||
| 		try { | ||||
| 			version = gson.fromJson(new FileReader(Constants.MINECRAFT_JSON.get(extension)), Version.class); | ||||
| 		} catch (FileNotFoundException e) { | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
| 
 | ||||
| 		List<String> libs = new ArrayList<>(); | ||||
| 		for (File file : getProject().getConfigurations().getByName("compile").getFiles()) { | ||||
| 			libs.add(file.getAbsolutePath()); | ||||
| 		} | ||||
| 		for (File file : getProject().getConfigurations().getByName(Constants.CONFIG_MINECRAFT).getFiles()) { | ||||
| 			libs.add(file.getAbsolutePath()); | ||||
| 		} | ||||
| 		//Used to add the fabric jar that has been built | ||||
| 		for (File file : new File(getProject().getBuildDir(), "libs").listFiles()) { | ||||
| 			if (file.isFile()) { | ||||
| 				libs.add(file.getAbsolutePath()); | ||||
| 			} | ||||
| 		} | ||||
| 		libs.add(Constants.MINECRAFT_FINAL_JAR.get(extension).getAbsolutePath()); | ||||
| 		classpath(libs); | ||||
| 
 | ||||
| 		args("--tweakClass", Constants.FABRIC_SERVER_TWEAKER,  "--fabricMappingFile", Constants.MAPPINGS_TINY.get(extension).getAbsolutePath()); | ||||
| 		args("--tweakClass", Constants.FABRIC_SERVER_TWEAKER,  "--fabricMappingFile", extension.getMinecraftProvider().pomfProvider.MAPPINGS_TINY.getAbsolutePath()); | ||||
| 
 | ||||
| 		setWorkingDir(new File(getProject().getRootDir(), "run")); | ||||
| 
 | ||||
|  | @ -89,7 +74,6 @@ public class RunServerTask extends JavaExec { | |||
| 	public List<String> getJvmArgs() { | ||||
| 		LoomGradleExtension extension = this.getProject().getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		List<String> args = new ArrayList<>(); | ||||
| 		args.add("-Djava.library.path=" + Constants.MINECRAFT_NATIVES.get(extension).getAbsolutePath()); | ||||
| 		args.add("-Dfabric.development=true"); | ||||
| 		return args; | ||||
| 	} | ||||
|  |  | |||
|  | @ -1,62 +0,0 @@ | |||
| /* | ||||
|  * 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.ModProcessor; | ||||
| 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(); | ||||
| 				} | ||||
| 				ModProcessor.handleMod(input, output, getProject()); | ||||
| 				if (!output.exists()) { | ||||
| 					throw new RuntimeException("Output does not exist!"); | ||||
| 				} | ||||
| 				getProject().getDependencies().add(Constants.CONFIG_MINECRAFT, getProject().files(output.getPath())); | ||||
| 			}); | ||||
| 	} | ||||
| } | ||||
|  | @ -24,49 +24,14 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.util; | ||||
| 
 | ||||
| import net.fabricmc.loom.util.delayed.DelayedFile; | ||||
| import net.fabricmc.loom.util.delayed.IDelayed; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.net.URL; | ||||
| import java.net.URLClassLoader; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| public class Constants { | ||||
| 	public static final File WORKING_DIRECTORY = new File("."); | ||||
| 	public static final File CACHE_FILES = new File(WORKING_DIRECTORY, ".gradle/minecraft"); | ||||
| 
 | ||||
| 	public static final String JAR_MAPPER_ENIGMA = "enigma"; | ||||
| 	public static final String JAR_MAPPER_TINY = "tiny"; | ||||
| 	public static final File REMAPPED_MODS_STORE = new File(CACHE_FILES, "remapped_mods"); | ||||
| 
 | ||||
| 	public static final IDelayed<File> MINECRAFT_CLIENT_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-client.jar")); | ||||
| 	public static final IDelayed<File> MINECRAFT_SERVER_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-server.jar")); | ||||
| 	public static final IDelayed<File> MINECRAFT_MERGED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-merged.jar")); | ||||
| 	public static final IDelayed<File> MINECRAFT_MAPPED_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-mapped-" + extension.pomfVersion + ".jar")); | ||||
| 	public static final IDelayed<File> MINECRAFT_INTERMEDIARY_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-intermediary.jar")); | ||||
| //	public static final IDelayed<File> MINECRAFT_PARTIAL_ENIGMA_JAR = new DelayedFile(extension -> new File(extension.getUserCache(), extension.version + "-partial-enigma-" + extension.pomfVersion + ".jar")); | ||||
| //	public static final IDelayed<File> MINECRAFT_FINAL_JAR = new DelayedFile(extension -> new File(CACHE_FILES, extension.version + "-final-" + extension.pomfVersion + ".jar")); | ||||
| 	public static final IDelayed<File> MINECRAFT_FINAL_JAR = MINECRAFT_MAPPED_JAR; | ||||
| 
 | ||||
| 	public static final IDelayed<File> POMF_DIR = new DelayedFile(extension -> new File(extension.getUserCache(), "pomf")); | ||||
| 	public static       IDelayed<File> MAPPINGS_TINY_GZ = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-tiny-" + extension.version + "." + extension.pomfVersion + ".gz")); | ||||
| 	public static final IDelayed<File> MAPPINGS_TINY = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-tiny-" + extension.version + "." + extension.pomfVersion)); | ||||
| 	public static final IDelayed<File> MAPPINGS_MIXIN_EXPORT = new DelayedFile(extension -> new File(CACHE_FILES, "mixin-map-" + extension.version + "." + extension.pomfVersion + ".tiny")); | ||||
| 	public static       IDelayed<File> MAPPINGS_ENIGMA_ZIP = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + ".zip")); | ||||
| 	public static final IDelayed<File> MAPPINGS_ENIGMA_DIR = new DelayedFile(extension -> new File(POMF_DIR.get(extension), "pomf-enigma-" + extension.version + "." + extension.pomfVersion + "")); | ||||
| 
 | ||||
| 	public static final IDelayed<File> MAPPINGS_DIR_LOCAL = new DelayedFile(extension -> new File(WORKING_DIRECTORY, "mappings")); | ||||
| 	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> 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_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> VERSION_MANIFEST = new DelayedFile(extension -> new File(extension.getUserCache(), "version_manifest.json")); | ||||
| 
 | ||||
| 	public static final String FABRIC_CLIENT_TWEAKER = "net.fabricmc.loader.launch.FabricClientTweaker"; | ||||
| 	public static final String FABRIC_SERVER_TWEAKER = "net.fabricmc.loader.launch.FabricServerTweaker"; | ||||
|  | @ -75,21 +40,8 @@ public class Constants { | |||
| 	public static final String LIBRARIES_BASE = "https://libraries.minecraft.net/"; | ||||
| 	public static final String RESOURCES_BASE = "http://resources.download.minecraft.net/"; | ||||
| 
 | ||||
| 	public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"; | ||||
| 
 | ||||
| 	public static final String CONFIG_NATIVES = "MC_NATIVES"; | ||||
| 	public static final String CONFIG_MC_DEPENDENCIES = "MC_DEPENDENCIES"; | ||||
| 	public static final String CONFIG_MINECRAFT = "MINECRAFT"; | ||||
| 	public static final String CONFIG_MC_DEPENDENCIES_CLIENT = "MC_DEPENDENCIES_CLIENT"; | ||||
| 	public static final String SYSTEM_ARCH = System.getProperty("os.arch").equals("64") ? "64" : "32"; | ||||
| 	public static final String COMPILE_MODS = "modCompile"; | ||||
| 
 | ||||
| 	public static List<String> getClassPath() { | ||||
| 		URL[] urls = ((URLClassLoader) Constants.class.getClassLoader()).getURLs(); | ||||
| 		ArrayList<String> list = new ArrayList<>(); | ||||
| 		for (URL url : urls) { | ||||
| 			list.add(url.getPath()); | ||||
| 		} | ||||
| 		return list; | ||||
| 	} | ||||
| 	public static final String COMPILE_MODS = "modCompile"; | ||||
| 	public static final String MINECRAFT = "minecraft"; | ||||
| } | ||||
|  |  | |||
							
								
								
									
										92
									
								
								src/main/java/net/fabricmc/loom/util/DependencyProvider.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								src/main/java/net/fabricmc/loom/util/DependencyProvider.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,92 @@ | |||
| /* | ||||
|  * 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 net.fabricmc.loom.LoomGradleExtension; | ||||
| import org.gradle.api.Project; | ||||
| import org.gradle.api.artifacts.Configuration; | ||||
| import org.gradle.api.artifacts.Dependency; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| public abstract class DependencyProvider { | ||||
| 
 | ||||
| 	private LoomDependencyManager dependencyManager; | ||||
| 
 | ||||
| 	public abstract void provide(DependcyInfo dependency, Project project, LoomGradleExtension extension) throws Exception; | ||||
| 
 | ||||
| 	public abstract String getTargetConfig(); | ||||
| 
 | ||||
| 	public void addDep(Object object, Project project){ | ||||
| 		if(object instanceof File){ | ||||
| 			object = project.files(object); | ||||
| 		} | ||||
| 		project.getDependencies().add("compile", object); | ||||
| 	} | ||||
| 
 | ||||
| 	public void register(LoomDependencyManager dependencyManager){ | ||||
| 		this.dependencyManager = dependencyManager; | ||||
| 	} | ||||
| 
 | ||||
| 	public LoomDependencyManager getDependencyManager() { | ||||
| 		return dependencyManager; | ||||
| 	} | ||||
| 
 | ||||
| 	public static class DependcyInfo { | ||||
| 		final Dependency dependency; | ||||
| 		final Configuration sourceConfiguration; | ||||
| 
 | ||||
| 		public DependcyInfo(Dependency dependency, Configuration sourceConfiguration) { | ||||
| 			this.dependency = dependency; | ||||
| 			this.sourceConfiguration = sourceConfiguration; | ||||
| 		} | ||||
| 
 | ||||
| 		public Dependency getDependency() { | ||||
| 			return dependency; | ||||
| 		} | ||||
| 
 | ||||
| 		public Configuration getSourceConfiguration() { | ||||
| 			return sourceConfiguration; | ||||
| 		} | ||||
| 
 | ||||
| 		public Set<File> resolve(){ | ||||
| 			return sourceConfiguration.files(dependency); | ||||
| 		} | ||||
| 
 | ||||
| 		public File resolveFile(){ | ||||
| 			Set<File> files = resolve(); | ||||
| 			if(files.size() != 1){ | ||||
| 				throw new RuntimeException(dependency + " resolves to more than one file"); | ||||
| 			} | ||||
| 			File file = files.stream().findFirst().orElse(null); | ||||
| 			return file; | ||||
| 		} | ||||
| 
 | ||||
| 		public String getDepString(){ | ||||
| 			return dependency.getGroup() + ":" + dependency.getName() + ":" + dependency.getVersion(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -0,0 +1,84 @@ | |||
| /* | ||||
|  * 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 net.fabricmc.loom.LoomGradleExtension; | ||||
| import org.gradle.api.Project; | ||||
| import org.gradle.api.artifacts.Configuration; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| public class LoomDependencyManager { | ||||
| 
 | ||||
| 	private List<DependencyProvider> dependencyProviderList = new ArrayList<>(); | ||||
| 
 | ||||
| 	public void addProvider(DependencyProvider provider){ | ||||
| 		if(dependencyProviderList.contains(provider)){ | ||||
| 			throw new RuntimeException("Provider is already registered"); | ||||
| 		} | ||||
| 		if(getProvider(provider.getClass()) != null){ | ||||
| 			throw new RuntimeException("Provider of this type is already registered"); | ||||
| 		} | ||||
| 		provider.register(this); | ||||
| 		dependencyProviderList.add(provider); | ||||
| 	} | ||||
| 
 | ||||
| 	public <T> T getProvider(Class<T> clazz){ | ||||
| 		for(DependencyProvider provider : dependencyProviderList){ | ||||
| 			if(provider.getClass() == clazz){ | ||||
| 				return (T) provider; | ||||
| 			} | ||||
| 		} | ||||
| 		return null; | ||||
| 	} | ||||
| 
 | ||||
| 	public void handleDependencies(Project project){ | ||||
| 		project.getLogger().lifecycle(":setting up loom dependencies"); | ||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||
| 		Set<String> targetConfigs = new HashSet<>(); | ||||
| 		for(DependencyProvider provider : dependencyProviderList){ | ||||
| 			targetConfigs.add(provider.getTargetConfig()); | ||||
| 		} | ||||
| 		for(String config : targetConfigs){ | ||||
| 			Configuration configuration = project.getConfigurations().getByName(config); | ||||
| 			configuration.getDependencies().stream().forEach(dependency -> { | ||||
| 				for(DependencyProvider provider : dependencyProviderList){ | ||||
| 					if(provider.getTargetConfig().equals(config)){ | ||||
| 						DependencyProvider.DependcyInfo info = new DependencyProvider.DependcyInfo(dependency, configuration); | ||||
| 						try { | ||||
| 							provider.provide(info, project, extension); | ||||
| 						} catch (Exception e) { | ||||
| 							throw new RuntimeException("Failed to provide", e); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			}); | ||||
| 
 | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -22,15 +22,14 @@ | |||
|  * SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| package net.fabricmc.loom.task; | ||||
| package net.fabricmc.loom.util; | ||||
| 
 | ||||
| 
 | ||||
| import com.google.common.base.Joiner; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
| import net.fabricmc.loom.providers.MinecraftJarProvider; | ||||
| import net.fabricmc.tinyremapper.OutputConsumerPath; | ||||
| import net.fabricmc.tinyremapper.TinyRemapper; | ||||
| import net.fabricmc.tinyremapper.TinyUtils; | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
|  | @ -39,22 +38,22 @@ import java.util.Arrays; | |||
| 
 | ||||
| public class MapJarsTiny { | ||||
| 
 | ||||
| 	public void mapJars(MapJarsTask task) throws IOException { | ||||
| 	public void mapJars(MinecraftJarProvider jarProvider, Project project) throws IOException { | ||||
| 		String fromM = "official"; | ||||
| 
 | ||||
| 		Path mappings = task.getMappingFile().toPath(); | ||||
| 		Path[] classpath = task.getMapperPaths().stream() | ||||
| 		Path mappings = jarProvider.getMappingFile().toPath(); | ||||
| 		Path[] classpath = jarProvider.getMapperPaths().stream() | ||||
| 				.map(File::toPath) | ||||
| 				.toArray(Path[]::new); | ||||
| 
 | ||||
| 		Path input = task.getInputJar().toPath(); | ||||
| 		Path outputMapped = task.getMappedJar().toPath(); | ||||
| 		Path outputIntermediary = task.getIntermediaryJar().toPath(); | ||||
| 		Path input = jarProvider.getInputJar().toPath(); | ||||
| 		Path outputMapped = jarProvider.getMappedJar().toPath(); | ||||
| 		Path outputIntermediary = jarProvider.getIntermediaryJar().toPath(); | ||||
| 
 | ||||
| 		for (String toM : Arrays.asList("named", "intermediary")) { | ||||
| 			Path output = "named".equals(toM) ? outputMapped : outputIntermediary; | ||||
| 
 | ||||
| 			task.getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")"); | ||||
| 			project.getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")"); | ||||
| 
 | ||||
| 			TinyRemapper remapper = TinyRemapper.newRemapper() | ||||
| 					.withMappings(TinyUtils.createTinyMappingProvider(mappings, fromM, toM)) | ||||
|  | @ -27,12 +27,13 @@ package net.fabricmc.loom.util; | |||
| import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.providers.MinecraftLibraryProvider; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| public class Version { | ||||
| public class MinecraftVersionInfo { | ||||
| 	public List<Library> libraries; | ||||
| 	public Map<String, Downloads> downloads; | ||||
| 	public AssetIndex assetIndex; | ||||
|  | @ -62,9 +63,9 @@ public class Version { | |||
| 			return Constants.LIBRARIES_BASE + path; | ||||
| 		} | ||||
| 
 | ||||
| 		public File getFile(LoomGradleExtension extension) { | ||||
| 		public File getFile(File baseDir) { | ||||
| 			String[] parts = this.name.split(":", 3); | ||||
| 			return new File(Constants.MINECRAFT_LIBS.get(extension), parts[0].replace(".", File.separator) + File.separator + parts[1] + File.separator + parts[2] + File.separator + parts[1] + "-" + parts[2] + getClassifier() + ".jar"); | ||||
| 			return new File(baseDir, parts[0].replace(".", File.separator) + File.separator + parts[1] + File.separator + parts[2] + File.separator + parts[1] + "-" + parts[2] + getClassifier() + ".jar"); | ||||
| 		} | ||||
| 
 | ||||
| 		public String getSha1() { | ||||
|  | @ -29,6 +29,7 @@ import com.google.gson.GsonBuilder; | |||
| import com.google.gson.JsonElement; | ||||
| import com.google.gson.JsonObject; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.providers.MinecraftProvider; | ||||
| import net.fabricmc.tinyremapper.OutputConsumerPath; | ||||
| import net.fabricmc.tinyremapper.TinyRemapper; | ||||
| import net.fabricmc.tinyremapper.TinyUtils; | ||||
|  | @ -77,10 +78,12 @@ public class ModProcessor { | |||
| 		String fromM = "intermediary"; | ||||
| 		String toM = "named"; | ||||
| 
 | ||||
| 		File mappingsFile = Constants.MAPPINGS_TINY.get(extension); | ||||
| 		MinecraftProvider minecraftProvider = extension.getMinecraftProvider(); | ||||
| 
 | ||||
| 		File mappingsFile = minecraftProvider.pomfProvider.MAPPINGS_TINY; | ||||
| 		Path mappings = mappingsFile.toPath(); | ||||
| 		Path mc = Constants.MINECRAFT_INTERMEDIARY_JAR.get(extension).toPath(); | ||||
| 		Path[] mcDeps = project.getConfigurations().getByName(Constants.CONFIG_MC_DEPENDENCIES).getFiles().stream() | ||||
| 		Path mc = minecraftProvider.jarProvider.MINECRAFT_INTERMEDIARY_JAR.toPath(); | ||||
| 		Path[] mcDeps = minecraftProvider.jarProvider.getMapperPaths().stream() | ||||
| 			.map(File::toPath) | ||||
| 			.toArray(Path[]::new); | ||||
| 		Collection<File> modCompileFiles = project.getConfigurations().getByName(Constants.COMPILE_MODS).getFiles(); | ||||
|  |  | |||
|  | @ -25,6 +25,7 @@ | |||
| package net.fabricmc.loom.util; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.providers.MinecraftProvider; | ||||
| import net.fabricmc.tinyremapper.OutputConsumerPath; | ||||
| import net.fabricmc.tinyremapper.TinyRemapper; | ||||
| import net.fabricmc.tinyremapper.TinyUtils; | ||||
|  | @ -49,18 +50,19 @@ public class ModRemapper { | |||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		Path mappings = Constants.MAPPINGS_TINY.get(extension).toPath(); | ||||
| 		MinecraftProvider minecraftProvider = extension.getMinecraftProvider(); | ||||
| 
 | ||||
| 		Path mappings = minecraftProvider.pomfProvider.MAPPINGS_TINY.toPath(); | ||||
| 
 | ||||
| 		String fromM = "named"; | ||||
| 		String toM = "intermediary"; | ||||
| 
 | ||||
| 		List<File> classpathFiles = new ArrayList<>(); | ||||
| 		classpathFiles.addAll(project.getConfigurations().getByName("compile").getFiles()); | ||||
| 		classpathFiles.addAll(project.getConfigurations().getByName(Constants.CONFIG_MINECRAFT).getFiles()); | ||||
| 
 | ||||
| 		Path[] classpath = classpathFiles.stream().map(File::toPath).toArray(Path[]::new); | ||||
| 
 | ||||
| 		File mixinMapFile = Constants.MAPPINGS_MIXIN_EXPORT.get(extension); | ||||
| 		File mixinMapFile = extension.getMinecraftProvider().jarProvider.MINECRAFT_MAPPED_JAR; | ||||
| 		Path mixinMapPath = mixinMapFile.toPath(); | ||||
| 
 | ||||
| 		TinyRemapper.Builder remapperBuilder = TinyRemapper.newRemapper(); | ||||
|  |  | |||
|  | @ -1,46 +0,0 @@ | |||
| /* | ||||
|  * 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.delayed; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.function.Function; | ||||
| 
 | ||||
| public class DelayedFile implements IDelayed<File> { | ||||
| 	private File file; | ||||
| 	private Function<LoomGradleExtension, File> function; | ||||
| 
 | ||||
| 	public DelayedFile(Function<LoomGradleExtension, File> function) { | ||||
| 		this.function = function; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public File get(LoomGradleExtension extension) { | ||||
| 		// TODO: Figure out caching issues | ||||
| 		this.file = this.function.apply(extension); | ||||
| 		return this.file; | ||||
| 	} | ||||
| } | ||||
|  | @ -1,31 +0,0 @@ | |||
| /* | ||||
|  * 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.delayed; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| 
 | ||||
| public interface IDelayed<T> { | ||||
| 	T get(LoomGradleExtension extension); | ||||
| } | ||||
		Loading…
	
		Reference in a new issue