aboutsummaryrefslogtreecommitdiff
path: root/libraries/launcher/org/multimc/applet
diff options
context:
space:
mode:
authoricelimetea <fr3shtea@outlook.com>2022-05-02 22:36:55 +0100
committericelimetea <fr3shtea@outlook.com>2022-05-02 22:36:55 +0100
commit8de63b60b1a9d0ba16f5d45f3198c13637151749 (patch)
treeb9f0e9d98720c3535400828544f86e64efa15fc5 /libraries/launcher/org/multimc/applet
parentd29720fbcef633a5b292a16a5e8f121df75260ac (diff)
downloadPrismLauncher-8de63b60b1a9d0ba16f5d45f3198c13637151749.tar.gz
PrismLauncher-8de63b60b1a9d0ba16f5d45f3198c13637151749.tar.bz2
PrismLauncher-8de63b60b1a9d0ba16f5d45f3198c13637151749.zip
Refactor some parts of NewLaunch (part 2)
Diffstat (limited to 'libraries/launcher/org/multimc/applet')
-rw-r--r--libraries/launcher/org/multimc/applet/LegacyFrame.java167
1 files changed, 167 insertions, 0 deletions
diff --git a/libraries/launcher/org/multimc/applet/LegacyFrame.java b/libraries/launcher/org/multimc/applet/LegacyFrame.java
new file mode 100644
index 00000000..a5e6c170
--- /dev/null
+++ b/libraries/launcher/org/multimc/applet/LegacyFrame.java
@@ -0,0 +1,167 @@
+package org.multimc.applet;/*
+ * Copyright 2012-2021 MultiMC Contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import net.minecraft.Launcher;
+
+import javax.imageio.ImageIO;
+import java.applet.Applet;
+import java.awt.*;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Scanner;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public final class LegacyFrame extends Frame {
+
+ private static final Logger LOGGER = Logger.getLogger("LegacyFrame");
+
+ private Launcher appletWrap;
+
+ public LegacyFrame(String title) {
+ super(title);
+
+ try {
+ setIconImage(ImageIO.read(new File("icon.png")));
+ } catch (IOException e) {
+ LOGGER.log(Level.WARNING, "Unable to read Minecraft icon!", e);
+ }
+
+ this.addWindowListener(new ForceExitHandler());
+ }
+
+ public void start (
+ Applet mcApplet,
+ String user,
+ String session,
+ int winSizeW,
+ int winSizeH,
+ boolean maximize,
+ String serverAddress,
+ String serverPort
+ ) {
+ try {
+ appletWrap = new Launcher(mcApplet, new URL("http://www.minecraft.net/game"));
+ } catch (MalformedURLException ignored) {}
+
+ // Implements support for launching in to multiplayer on classic servers using a mpticket
+ // file generated by an external program and stored in the instance's root folder.
+ Path mpticketFile = Paths.get(System.getProperty("user.dir") + "/../mpticket");
+ Path mpticketFileCorrupt = Paths.get(System.getProperty("user.dir") + "/../mpticket.corrupt");
+
+ if (Files.exists(mpticketFile)) {
+ try (Scanner fileScanner = new Scanner(
+ Files.newInputStream(mpticketFile),
+ StandardCharsets.US_ASCII.name()
+ )) {
+ String[] mpticketParams = new String[3];
+
+ for (int i = 0; i < mpticketParams.length; i++) {
+ if (fileScanner.hasNextLine()) {
+ mpticketParams[i] = fileScanner.nextLine();
+ } else {
+ Files.move(
+ mpticketFile,
+ mpticketFileCorrupt,
+ StandardCopyOption.REPLACE_EXISTING
+ );
+
+ throw new IllegalArgumentException("Mpticket file is corrupted!");
+ }
+ }
+
+ Files.delete(mpticketFile);
+
+ // Assumes parameters are valid and in the correct order
+ appletWrap.setParameter("server", mpticketParams[0]);
+ appletWrap.setParameter("port", mpticketParams[1]);
+ appletWrap.setParameter("mppass", mpticketParams[2]);
+ } catch (IOException e) {
+ LOGGER.log(Level.WARNING, "Unable to read mpticket file!", e);
+ }
+ }
+
+ if (serverAddress != null) {
+ appletWrap.setParameter("server", serverAddress);
+ appletWrap.setParameter("port", serverPort);
+ }
+
+ appletWrap.setParameter("username", user);
+ appletWrap.setParameter("sessionid", session);
+ appletWrap.setParameter("stand-alone", "true"); // Show the quit button.
+ appletWrap.setParameter("haspaid", "true"); // Some old versions need this for world saves to work.
+ appletWrap.setParameter("demo", "false");
+ appletWrap.setParameter("fullscreen", "false");
+
+ mcApplet.setStub(appletWrap);
+
+ add(appletWrap);
+
+ appletWrap.setPreferredSize(new Dimension(winSizeW, winSizeH));
+
+ pack();
+
+ setLocationRelativeTo(null);
+ setResizable(true);
+
+ if (maximize)
+ this.setExtendedState(MAXIMIZED_BOTH);
+
+ validate();
+
+ appletWrap.init();
+ appletWrap.start();
+
+ setVisible(true);
+ }
+
+ private final class ForceExitHandler extends WindowAdapter {
+
+ @Override
+ public void windowClosing(WindowEvent e) {
+ new Thread(() -> {
+ try {
+ Thread.sleep(30000L);
+ } catch (InterruptedException localInterruptedException) {
+ localInterruptedException.printStackTrace();
+ }
+
+ LOGGER.info("Forcing exit!");
+
+ System.exit(0);
+ }).start();
+
+ if (appletWrap != null) {
+ appletWrap.stop();
+ appletWrap.destroy();
+ }
+
+ // old minecraft versions can hang without this >_<
+ System.exit(0);
+ }
+
+ }
+
+}