diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java index a619f356e..c3f29f135 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java @@ -73,9 +73,9 @@ public final class ModpackFileSelectionPage extends StackPane implements WizardP ModAdviser.ModSuggestion state = ModAdviser.ModSuggestion.SUGGESTED; if (basePath.length() > "minecraft/".length()) { state = adviser.advise(StringUtils.substringAfter(basePath, "minecraft/") + (file.isDirectory() ? "/" : ""), file.isDirectory()); - if (file.isFile() && Objects.equals(FileUtils.getNameWithoutExtension(file), version)) + if (file.isFile() && Objects.equals(FileUtils.getNameWithoutExtension(file), version)) // Ignore .json, .jar state = ModAdviser.ModSuggestion.HIDDEN; - if (file.isDirectory() && Objects.equals(file.getName(), version + "-natives")) + if (file.isDirectory() && Objects.equals(file.getName(), version + "-natives")) // Ignore -natives state = ModAdviser.ModSuggestion.HIDDEN; if (state == ModAdviser.ModSuggestion.HIDDEN) return null; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index 67cf63ca1..cc831dd8e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -217,10 +217,18 @@ public class DefaultLauncher extends Launcher { public void decompressNatives(File destination) throws NotDecompressingNativesException { try { + FileUtils.cleanDirectory(destination); for (Library library : version.getLibraries()) if (library.isNative()) new Unzipper(repository.getLibraryFile(version, library), destination) - .setFilter((destFile, isDirectory, zipEntry, path) -> library.getExtract().shouldExtract(path)) + .setFilter((zipEntry, isDirectory, destFile, path) -> { + if (!isDirectory && Files.isRegularFile(destFile) && Files.size(destFile) == Files.size(zipEntry)) + return false; + String ext = FileUtils.getExtension(destFile); + if (ext.equals("sha1") || ext.equals("git")) + return false; + return library.getExtract().shouldExtract(path); + }) .setReplaceExistentFile(true).unzip(); } catch (IOException e) { throw new NotDecompressingNativesException(e); @@ -247,7 +255,7 @@ public class DefaultLauncher extends Launcher { @Override public ManagedProcess launch() throws IOException, InterruptedException { - File nativeFolder = Files.createTempDirectory("minecraft").toFile(); + File nativeFolder = repository.getNativeDirectory(versionId); // To guarantee that when failed to generate launch command line, we will not call pre-launch command List rawCommandLine = generateCommandLine(nativeFolder).asList(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Unzipper.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Unzipper.java index 03aba5207..6c138b792 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Unzipper.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/Unzipper.java @@ -128,7 +128,7 @@ public class Unzipper { String relativePath = root.relativize(dir).toString(); Path dirToCreate = dest.resolve(relativePath); if (filter != null && !filter.accept(dir, true, dirToCreate, relativePath)) - return FileVisitResult.CONTINUE; + return FileVisitResult.SKIP_SUBTREE; if (Files.notExists(dirToCreate)) { Files.createDirectory(dirToCreate); } @@ -139,6 +139,6 @@ public class Unzipper { } public interface FileFilter { - boolean accept(Path destPath, boolean isDirectory, Path zipEntry, String entryPath) throws IOException; + boolean accept(Path zipEntry, boolean isDirectory, Path destFile, String entryPath) throws IOException; } }