/* SPDX-FileCopyrightText: 2026 Project Tick * SPDX-FileContributor: Project Tick * SPDX-License-Identifier: GPL-3.0-or-later * * MeshMC - A Custom Launcher for Minecraft * Copyright (C) 2026 Project Tick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * Linking this library statically or dynamically with other modules is * making a combined work based on this library. Thus, the terms and * conditions of the GNU General Public License cover the whole * combination. * * As a special exception, the copyright holders of this library give * you permission to link this library with independent modules to * produce an executable, regardless of the license terms of these * independent modules, and to copy and distribute the resulting * executable under terms of your choice, provided that you also meet, * for each linked independent module, the terms and conditions of the * license of that module. An independent module is a module which is * not derived from or based on this library. If you modify this * library, you may extend this exception to your version of the * library, but you are not obliged to do so. If you do not wish to do * so, delete this exception statement from your version. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * This file incorporates work covered by the following copyright and * permission notice: * * 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. */ package org.projecttick; import net.minecraft.MeshMC; import javax.imageio.ImageIO; import java.applet.Applet; import java.awt.*; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Scanner; public class LegacyFrame extends Frame implements WindowListener { private MeshMC appletWrap = null; public LegacyFrame(String title) { super ( title ); BufferedImage image; try { image = ImageIO.read ( new File ( "icon.png" ) ); setIconImage ( image ); } catch ( IOException e ) { e.printStackTrace(); } this.addWindowListener ( this ); } public void start ( Applet mcApplet, String user, String session, int winSizeW, int winSizeH, boolean maximize, String serverAddress, String serverPort ) { try { appletWrap = new MeshMC( 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. File mpticketFile = null; Scanner fileReader = null; try { mpticketFile = new File(System.getProperty("user.dir") + "/../mpticket").getCanonicalFile(); fileReader = new Scanner(new FileInputStream(mpticketFile), "ascii"); String[] mpticketParams = new String[3]; for(int i=0;i<3;i++) { if(fileReader.hasNextLine()) { mpticketParams[i] = fileReader.nextLine(); } else { throw new IllegalArgumentException(); } } // Assumes parameters are valid and in the correct order appletWrap.setParameter("server", mpticketParams[0]); appletWrap.setParameter("port", mpticketParams[1]); appletWrap.setParameter("mppass", mpticketParams[2]); fileReader.close(); mpticketFile.delete(); } catch (FileNotFoundException e) {} catch (IllegalArgumentException e) { fileReader.close(); File mpticketFileCorrupt = new File(System.getProperty("user.dir") + "/../mpticket.corrupt"); if(mpticketFileCorrupt.exists()) { mpticketFileCorrupt.delete(); } mpticketFile.renameTo(mpticketFileCorrupt); System.err.println("Malformed mpticket file, missing argument."); e.printStackTrace(System.err); System.exit(-1); } catch (Exception e) { e.printStackTrace(System.err); System.exit(-1); } 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); this.add ( appletWrap ); appletWrap.setPreferredSize ( new Dimension (winSizeW, winSizeH) ); this.pack(); this.setLocationRelativeTo ( null ); this.setResizable ( true ); if ( maximize ) { this.setExtendedState ( MAXIMIZED_BOTH ); } validate(); appletWrap.init(); appletWrap.start(); setVisible ( true ); } @Override public void windowActivated ( WindowEvent e ) {} @Override public void windowClosed ( WindowEvent e ) {} @Override public void windowClosing ( WindowEvent e ) { new Thread() { public void run() { try { Thread.sleep ( 30000L ); } catch ( InterruptedException localInterruptedException ) { localInterruptedException.printStackTrace(); } System.out.println ( "FORCING EXIT!" ); System.exit ( 0 ); } } .start(); if ( appletWrap != null ) { appletWrap.stop(); appletWrap.destroy(); } // old minecraft versions can hang without this >_< System.exit ( 0 ); } @Override public void windowDeactivated ( WindowEvent e ) {} @Override public void windowDeiconified ( WindowEvent e ) {} @Override public void windowIconified ( WindowEvent e ) {} @Override public void windowOpened ( WindowEvent e ) {} }