mirror of
https://github.com/architectury/architectury-loom.git
synced 2026-04-02 13:37:45 -05:00
Copy userdev 'inject' files into the game jar
This commit is contained in:
@@ -49,6 +49,7 @@ import org.gradle.api.plugins.BasePluginConvention;
|
||||
import net.fabricmc.loom.api.decompilers.LoomDecompiler;
|
||||
import net.fabricmc.loom.processors.JarProcessorManager;
|
||||
import net.fabricmc.loom.providers.ForgeUniversalProvider;
|
||||
import net.fabricmc.loom.providers.ForgeUserdevProvider;
|
||||
import net.fabricmc.loom.providers.MappingsProvider;
|
||||
import net.fabricmc.loom.providers.MinecraftMappedProvider;
|
||||
import net.fabricmc.loom.providers.MinecraftProvider;
|
||||
@@ -346,6 +347,10 @@ public class LoomGradleExtension {
|
||||
return getDependencyManager().getProvider(ForgeUniversalProvider.class);
|
||||
}
|
||||
|
||||
public ForgeUserdevProvider getForgeUserdevProvider() {
|
||||
return getDependencyManager().getProvider(ForgeUserdevProvider.class);
|
||||
}
|
||||
|
||||
public void setDependencyManager(LoomDependencyManager dependencyManager) {
|
||||
this.dependencyManager = dependencyManager;
|
||||
}
|
||||
|
||||
@@ -43,19 +43,24 @@ import net.fabricmc.loom.util.Constants;
|
||||
import net.fabricmc.loom.util.DependencyProvider;
|
||||
|
||||
public class ForgeUserdevProvider extends DependencyProvider {
|
||||
private File userdevJar;
|
||||
|
||||
public ForgeUserdevProvider(Project project) {
|
||||
super(project);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void provide(DependencyInfo dependency, Consumer<Runnable> postPopulationScheduler) throws Exception {
|
||||
userdevJar = new File(getExtension().getProjectPersistentCache(), "forge-" + dependency.getDependency().getVersion() + "-userdev.jar");
|
||||
|
||||
Path configJson = getExtension()
|
||||
.getProjectPersistentCache()
|
||||
.toPath()
|
||||
.resolve("forge-config-" + dependency.getDependency().getVersion() + ".json");
|
||||
|
||||
if (Files.notExists(configJson) || isRefreshDeps()) {
|
||||
if (!userdevJar.exists() || Files.notExists(configJson) || isRefreshDeps()) {
|
||||
File resolved = dependency.resolveFile().orElseThrow(() -> new RuntimeException("Could not resolve Forge userdev"));
|
||||
Files.copy(resolved.toPath(), userdevJar.toPath());
|
||||
|
||||
try (FileSystem fs = FileSystems.newFileSystem(new URI("jar:" + resolved.toURI()), ImmutableMap.of("create", false))) {
|
||||
Files.copy(fs.getPath("config.json"), configJson);
|
||||
@@ -80,6 +85,10 @@ public class ForgeUserdevProvider extends DependencyProvider {
|
||||
// That'd require me to run the "MCP environment" fully up to merging.
|
||||
}
|
||||
|
||||
public File getUserdevJar() {
|
||||
return userdevJar;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTargetConfig() {
|
||||
return Constants.FORGE_USERDEV;
|
||||
|
||||
@@ -275,6 +275,9 @@ public class MinecraftProvider extends DependencyProvider {
|
||||
logger.lifecycle(":injecting forge classes into minecraft");
|
||||
copyAll(getExtension().getForgeUniversalProvider().getForge(), minecraftClientPatchedSrgJar);
|
||||
copyAll(getExtension().getForgeUniversalProvider().getForge(), minecraftServerPatchedSrgJar);
|
||||
|
||||
copyUserdevFiles(getExtension().getForgeUserdevProvider().getUserdevJar(), minecraftClientPatchedSrgJar);
|
||||
copyUserdevFiles(getExtension().getForgeUserdevProvider().getUserdevJar(), minecraftServerPatchedSrgJar);
|
||||
}
|
||||
|
||||
private void remapPatchedJars(Logger logger) throws IOException {
|
||||
@@ -352,10 +355,8 @@ public class MinecraftProvider extends DependencyProvider {
|
||||
.filter(java.nio.file.Files::isRegularFile)
|
||||
.filter(filter)
|
||||
.forEach(it -> {
|
||||
Path targetPath = targetFs.getPath(it.toString());
|
||||
|
||||
try {
|
||||
action.accept(sourceFs, targetFs, it, targetPath);
|
||||
action.accept(sourceFs, targetFs, it);
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
@@ -371,7 +372,9 @@ public class MinecraftProvider extends DependencyProvider {
|
||||
}
|
||||
|
||||
private void copyMissingClasses(File source, File target) throws IOException {
|
||||
walkFileSystems(source, target, it -> it.toString().endsWith(".class"), (sourceFs, targetFs, sourcePath, targetPath) -> {
|
||||
walkFileSystems(source, target, it -> it.toString().endsWith(".class"), (sourceFs, targetFs, it) -> {
|
||||
Path targetPath = targetFs.getPath(it.toString());
|
||||
|
||||
if (java.nio.file.Files.exists(targetPath)) return;
|
||||
Path parent = targetPath.getParent();
|
||||
|
||||
@@ -379,7 +382,7 @@ public class MinecraftProvider extends DependencyProvider {
|
||||
java.nio.file.Files.createDirectories(parent);
|
||||
}
|
||||
|
||||
java.nio.file.Files.copy(sourcePath, targetPath);
|
||||
java.nio.file.Files.copy(it, targetPath);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -387,14 +390,32 @@ public class MinecraftProvider extends DependencyProvider {
|
||||
walkFileSystems(source, target, it -> !it.toString().endsWith(".class"), this::copyReplacing);
|
||||
}
|
||||
|
||||
private void copyReplacing(FileSystem sourceFs, FileSystem targetFs, Path sourcePath, Path targetPath) throws IOException {
|
||||
private void copyReplacing(FileSystem sourceFs, FileSystem targetFs, Path it) throws IOException {
|
||||
Path targetPath = targetFs.getPath(it.toString());
|
||||
Path parent = targetPath.getParent();
|
||||
|
||||
if (parent != null) {
|
||||
java.nio.file.Files.createDirectories(parent);
|
||||
}
|
||||
|
||||
java.nio.file.Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
|
||||
java.nio.file.Files.copy(it, targetPath, StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
|
||||
private void copyUserdevFiles(File source, File target) throws IOException {
|
||||
walkFileSystems(source, target, java.nio.file.Files::isRegularFile, (sourceFs, targetFs, it) -> {
|
||||
Path inject = sourceFs.getPath("inject");
|
||||
|
||||
if (it.startsWith(inject)) {
|
||||
Path targetPath = targetFs.getPath(inject.relativize(it).toString());
|
||||
Path parent = targetPath.getParent();
|
||||
|
||||
if (parent != null) {
|
||||
java.nio.file.Files.createDirectories(parent);
|
||||
}
|
||||
|
||||
java.nio.file.Files.copy(it, targetPath);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public File getMergedJar() {
|
||||
|
||||
@@ -29,11 +29,11 @@ import java.nio.file.FileSystem;
|
||||
import java.nio.file.Path;
|
||||
|
||||
/**
|
||||
* Consumes two file systems and an equivalent path object for both of them.
|
||||
* Consumes two file systems and a path object in the first one.
|
||||
*
|
||||
* @author Juuz
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface FsPathConsumer {
|
||||
void accept(FileSystem sourceFs, FileSystem targetFs, Path sourcePath, Path targetPath) throws IOException;
|
||||
void accept(FileSystem sourceFs, FileSystem targetFs, Path it) throws IOException;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user