2727import pro .gravit .launcher .runtime .managers .SettingsManager ;
2828import pro .gravit .launcher .runtime .utils .HWIDProvider ;
2929import pro .gravit .launcher .runtime .utils .LauncherUpdater ;
30- import pro .gravit .utils .helper .IOHelper ;
31- import pro .gravit .utils .helper .JavaHelper ;
32- import pro .gravit .utils .helper .LogHelper ;
33- import pro .gravit .utils .helper .SecurityHelper ;
30+ import pro .gravit .utils .helper .*;
3431
3532import java .io .IOException ;
3633import java .net .URI ;
4037import java .time .LocalDateTime ;
4138import java .time .ZoneOffset ;
4239import java .time .temporal .ChronoUnit ;
40+ import java .util .ArrayList ;
4341import java .util .List ;
4442import java .util .Map ;
4543import java .util .UUID ;
4846import java .util .concurrent .ExecutorService ;
4947import java .util .concurrent .Executors ;
5048import java .util .function .Function ;
49+ import java .util .regex .Matcher ;
50+ import java .util .regex .Pattern ;
5151import java .util .stream .Collectors ;
5252
5353public class LauncherBackendImpl implements LauncherBackendAPI , TextureUploadExtension {
@@ -244,13 +244,16 @@ public CompletableFuture<byte[]> fetchTexture(Texture texture) {
244244 return CompletableFuture .failedFuture (new UnsupportedOperationException ());
245245 }
246246
247- @ SuppressWarnings ({"rawtypes" , "unchecked" })
248247 @ Override
249248 public CompletableFuture <List <Java >> getAvailableJava () {
250249 if (availableJavas == null ) {
251250 if (availableJavasFuture == null ) {
252251 availableJavasFuture = CompletableFuture .supplyAsync (() -> {
253- return (List ) JavaHelper .findJava (); // TODO: Custom Java
252+ List <Java > javas = getCustomJava ();
253+ if (!Launcher .getConfig ().forceUseCustomJava && !javas .isEmpty ()) {
254+ javas .addAll (JavaHelper .findJava ());
255+ }
256+ return javas ;
254257 }, executorService ).thenApply (e -> {
255258 availableJavas = e ;
256259 return e ;
@@ -261,6 +264,54 @@ public CompletableFuture<List<Java>> getAvailableJava() {
261264 return CompletableFuture .completedFuture (availableJavas );
262265 }
263266
267+ private static final Pattern JAVA_VERSION_PATTERN = Pattern .compile (
268+ "Java (?<version>.+) b(?<build>.+) (?<os>.+) (?<arch>.+) javafx (?<javafx>.+)" );
269+
270+ public List <Java > getCustomJava () {
271+ List <Java > versions = new ArrayList <>();
272+ for (Map .Entry <String , String > entry : Launcher .getConfig ().customJavaDownload .entrySet ()) {
273+ String javaDir = entry .getKey ();
274+ String javaVersionString = entry .getValue ();
275+ Matcher matcher = JAVA_VERSION_PATTERN .matcher (javaVersionString );
276+ if (matcher .matches ()) {
277+ String os = matcher .group ("os" );
278+ int version = Integer .parseInt (matcher .group ("version" ));
279+ int build = Integer .parseInt (matcher .group ("build" ));
280+ JVMHelper .ARCH arch = JVMHelper .ARCH .valueOf (matcher .group ("arch" ));
281+ boolean javafx = Boolean .parseBoolean (matcher .group ("javafx" ));
282+ if (!isArchAvailable (arch )) {
283+ continue ;
284+ }
285+ if (!JVMHelper .OS_TYPE .name .equals (os )) {
286+ continue ;
287+ }
288+ Path javaDirectory = DirBridge .dirUpdates .resolve (javaDir );
289+ LogHelper .debug ("In-Launcher Java Version found: Java %d b%d %s javafx %s" , version , build ,
290+ arch .name , Boolean .toString (javafx ));
291+ JavaHelper .JavaVersion javaVersion = new JavaHelper .JavaVersion (javaDirectory , version , build ,
292+ arch , javafx );
293+ versions .add (javaVersion );
294+ } else {
295+ LogHelper .warning ("Java Version: %s does not match" , javaVersionString );
296+ }
297+ }
298+ return versions ;
299+ }
300+
301+ public boolean isArchAvailable (JVMHelper .ARCH arch ) {
302+ if (JVMHelper .ARCH_TYPE == arch ) {
303+ return true ;
304+ }
305+ if (arch == JVMHelper .ARCH .X86_64 && JVMHelper .OS_TYPE == JVMHelper .OS .MUSTDIE
306+ && ((JVMHelper .ARCH_TYPE == JVMHelper .ARCH .X86 && !JVMHelper .isJVMMatchesSystemArch ())
307+ || JVMHelper .ARCH_TYPE == JVMHelper .ARCH .ARM64 )) {
308+ return true ;
309+ }
310+ return arch == JVMHelper .ARCH .X86_64
311+ && JVMHelper .OS_TYPE == JVMHelper .OS .MACOSX
312+ && JVMHelper .ARCH_TYPE == JVMHelper .ARCH .ARM64 ;
313+ }
314+
264315 @ Override
265316 public CompletableFuture <ServerPingInfo > pingServer (ProfileFeatureAPI .ClientProfile profile ) {
266317 return pingFutures .computeIfAbsent (profile .getUUID (), (k ) -> {
0 commit comments