From 84a2bd24c7c5ba13ede540515837a91ee402b40f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Fri, 30 Jun 2023 12:49:01 +0300 Subject: [PATCH] Add OptiFine automatic installation Unlike other modloaders, it does require the game being installed beforehand, so it's also implemented here --- .../forge_installer/forge_installer.jar | Bin 79269 -> 79617 bytes .../assets/components/forge_installer/version | 2 +- .../fragments/OptiFineInstallFragment.java | 6 +- .../modloaders/OptiFineDownloadTask.java | 72 +++++++++++++++++- .../modloaders/OptiFineScraper.java | 1 + .../pojavlaunch/modloaders/OptiFineUtils.java | 12 +++ .../tasks/AsyncMinecraftDownloader.java | 6 +- .../src/main/res/values/strings.xml | 2 +- .../git/artdeell/forgeinstaller/Agent.java | 55 ++++++++----- .../artdeell/forgeinstaller/ProfileFixer.java | 14 ++-- 10 files changed, 138 insertions(+), 32 deletions(-) diff --git a/app_pojavlauncher/src/main/assets/components/forge_installer/forge_installer.jar b/app_pojavlauncher/src/main/assets/components/forge_installer/forge_installer.jar index c9475cb38271b27679b12466a8868948e9ab903d..c9c5045a24f857c2cba270627233216a03953a92 100644 GIT binary patch delta 5342 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 WE^*(MffM*F0TRO| minecraftVersions; public List> optifineVersions; } public static class OptiFineVersion { + public String minecraftVersion; public String versionName; public String downloadUrl; } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncMinecraftDownloader.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncMinecraftDownloader.java index b04c54055..74112fefd 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncMinecraftDownloader.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/tasks/AsyncMinecraftDownloader.java @@ -46,7 +46,7 @@ public class AsyncMinecraftDownloader { /* Allows each downloading thread to have its own RECYCLED buffer */ private final ConcurrentHashMap mThreadBuffers = new ConcurrentHashMap<>(5); - public AsyncMinecraftDownloader(@NonNull Activity activity, JMinecraftVersionList.Version version, String realVersion, + public AsyncMinecraftDownloader(Activity activity, JMinecraftVersionList.Version version, String realVersion, @NonNull DoneListener listener){ // this was there for a reason sExecutorService.execute(() -> { try { @@ -58,7 +58,7 @@ public class AsyncMinecraftDownloader { }); } /* we do the throws DownloaderException thing to avoid blanket-catching Exception as a form of anti-lazy-developer protection */ - private void downloadGame(@NonNull Activity activity, JMinecraftVersionList.Version verInfo, String versionName) throws DownloaderException { + private void downloadGame(Activity activity, JMinecraftVersionList.Version verInfo, String versionName) throws DownloaderException { final String downVName = "/" + versionName + "/" + versionName; //Downloading libraries @@ -88,7 +88,7 @@ public class AsyncMinecraftDownloader { verInfo = Tools.getVersionInfo(versionName); // THIS one function need the activity in the case of an error - if(!JRE17Util.installNewJreIfNeeded(activity, verInfo)){ + if(activity != null && !JRE17Util.installNewJreIfNeeded(activity, verInfo)){ ProgressKeeper.submitProgress(ProgressLayout.DOWNLOAD_MINECRAFT, -1, -1); throw new DownloaderException(); } diff --git a/app_pojavlauncher/src/main/res/values/strings.xml b/app_pojavlauncher/src/main/res/values/strings.xml index da26fa683..5f75caf87 100644 --- a/app_pojavlauncher/src/main/res/values/strings.xml +++ b/app_pojavlauncher/src/main/res/values/strings.xml @@ -392,7 +392,7 @@ Modded versions Select versions Select OptiFine version - Failed to get the OptiFine download link + Failed to collect data for OptiFine installation Downloading %s Create OptiFine profile diff --git a/forge_installer/src/main/java/git/artdeell/forgeinstaller/Agent.java b/forge_installer/src/main/java/git/artdeell/forgeinstaller/Agent.java index a9272cbd6..cc2d82d63 100644 --- a/forge_installer/src/main/java/git/artdeell/forgeinstaller/Agent.java +++ b/forge_installer/src/main/java/git/artdeell/forgeinstaller/Agent.java @@ -20,11 +20,12 @@ import javax.swing.JOptionPane; public class Agent implements AWTEventListener { private boolean forgeWindowHandled = false; private final boolean suppressProfileCreation; - + private final boolean optiFineInstallation; private final Timer componentTimer = new Timer(); - public Agent(boolean ps) { - this.suppressProfileCreation = ps; + public Agent(boolean nps, boolean of) { + this.suppressProfileCreation = !nps; + this.optiFineInstallation = of; } @Override @@ -33,7 +34,7 @@ public class Agent implements AWTEventListener { Window window = windowEvent.getWindow(); if(windowEvent.getID() == WindowEvent.WINDOW_OPENED) { if(!forgeWindowHandled) { // false at startup, so we will handle the first window as the Forge one - forgeWindowHandled = handleForgeWindow(window); + forgeWindowHandled = handleMainWindow(window); if(forgeWindowHandled) { componentTimer.cancel(); componentTimer.purge(); @@ -46,34 +47,47 @@ public class Agent implements AWTEventListener { } } - public boolean handleForgeWindow(Window window) { + public boolean handleMainWindow(Window window) { List components = new ArrayList<>(); insertAllComponents(components, window, new MainWindowFilter()); AbstractButton okButton = null; for(Component component : components) { if(component instanceof AbstractButton) { AbstractButton abstractButton = (AbstractButton) component; - switch(abstractButton.getText()) { - case "OK": - okButton = abstractButton; // store the button, so we can press it after processing other stuff - break; - case "Install client": - abstractButton.doClick(); // It should be the default, but let's make sure - } - + abstractButton = optiFineInstallation ? + handleOptiFineButton(abstractButton) : + handleForgeButton(abstractButton); + if(abstractButton != null) okButton = abstractButton; } } if(okButton == null) { System.out.println("Failed to set all the UI components, wil try again in the next window"); - System.exit(17); return false; }else{ - ProfileFixer.storeProfile(); + ProfileFixer.storeProfile(optiFineInstallation ? "OptiFine" : "forge"); EventQueue.invokeLater(okButton::doClick); // do that after forge actually builds its window, otherwise we set the path too fast return true; } } + + public AbstractButton handleForgeButton(AbstractButton abstractButton) { + switch(abstractButton.getText()) { + case "OK": + return abstractButton; // return the button, so we can press it after processing other stuff + case "Install client": + abstractButton.doClick(); // It should be the default, but let's make sure + } + return null; + } + + public AbstractButton handleOptiFineButton(AbstractButton abstractButton) { + if ("Install".equals(abstractButton.getText())) { + return abstractButton; + } + return null; + } + public void handleDialog(Window window) { List components = new ArrayList<>(); insertAllComponents(components, window, new DialogFilter()); // ensure that it's a JOptionPane dialog @@ -84,7 +98,7 @@ public class Agent implements AWTEventListener { JOptionPane optionPane = (JOptionPane) components.get(0); if(optionPane.getMessageType() == JOptionPane.INFORMATION_MESSAGE) { // forge doesn't emit information messages for other reasons yet System.out.println("The install was successful!"); - ProfileFixer.reinsertProfile(suppressProfileCreation); + ProfileFixer.reinsertProfile(optiFineInstallation ? "OptiFine" : "forge", suppressProfileCreation); System.exit(0); // again, forge doesn't call exit for some reason, so we do that ourselves here } } @@ -102,8 +116,15 @@ public class Agent implements AWTEventListener { } public static void premain(String args, Instrumentation inst) { + boolean noProfileSuppression = false; + boolean optifine = false; + if(args != null ) { + noProfileSuppression = args.contains("NPS"); // No Profile Suppression + optifine = args.contains("OF"); // OptiFine + } + Agent agent = new Agent(noProfileSuppression, optifine); Toolkit.getDefaultToolkit() - .addAWTEventListener(new Agent(!"NPS".equals(args)), // No Profile Suppression + .addAWTEventListener(agent, AWTEvent.WINDOW_EVENT_MASK); } } diff --git a/forge_installer/src/main/java/git/artdeell/forgeinstaller/ProfileFixer.java b/forge_installer/src/main/java/git/artdeell/forgeinstaller/ProfileFixer.java index 5228c0a2c..da0b1d4d1 100644 --- a/forge_installer/src/main/java/git/artdeell/forgeinstaller/ProfileFixer.java +++ b/forge_installer/src/main/java/git/artdeell/forgeinstaller/ProfileFixer.java @@ -15,23 +15,23 @@ public class ProfileFixer { private static final Random random = new Random(); private static final Path profilesPath = Paths.get(System.getProperty("user.home"), ".minecraft", "launcher_profiles.json"); private static JSONObject oldProfile = null; - public static void storeProfile() { + public static void storeProfile(String profileName) { try { JSONObject minecraftProfiles = new JSONObject( new String(Files.readAllBytes(profilesPath), StandardCharsets.UTF_8) ); JSONObject profilesArray = minecraftProfiles.getJSONObject("profiles"); - oldProfile = profilesArray.optJSONObject("forge", null); + oldProfile = profilesArray.optJSONObject(profileName, null); }catch (IOException | JSONException e) { System.out.println("Failed to store Forge profile: "+e); } } - private static String pickProfileName() { - return "forge"+random.nextInt(); + private static String pickProfileName(String profileName) { + return profileName+random.nextInt(); } - public static void reinsertProfile(boolean suppressProfileCreation) { + public static void reinsertProfile(String profileName, boolean suppressProfileCreation) { try { JSONObject minecraftProfiles = new JSONObject( new String(Files.readAllBytes(profilesPath), @@ -41,8 +41,8 @@ public class ProfileFixer { if(oldProfile != null) { if(suppressProfileCreation) profilesArray.put("forge", oldProfile); // restore the old profile else { - String name = pickProfileName(); - while(profilesArray.has(name)) name = pickProfileName(); + String name = pickProfileName(profileName); + while(profilesArray.has(name)) name = pickProfileName(profileName); profilesArray.put(name, oldProfile); // restore the old profile under a new name } }else{