Aller au contenu
Litarvan

[Forge/Vanilla] [1.*.*] Créer son propre launcher perso de zéro

Recommended Posts

Go sur le tuto d'open classroom (lien au début du tuto) dessus il y a une partie ou ils l'expliquent, la partie "Notre Première Fenêtre"

ça ne le met pas ... :/

package fr.koora.nealfight;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;

import fr.theshark34.openlauncherlib.Authenticator;
import fr.theshark34.openlauncherlib.GameLauncher;
import fr.theshark34.s_update.S_Update;
import fr.theshark34.s_update.Util;
import net.kronos.mclib.auth.yggdrasil.AuthYggdrasilException;
import net.kronos.mclib.auth.yggdrasil.model.response.YggdrasilAuthenticateResponse;

public class LauncherFrame extends JFrame {

    public static final File GAME_DIR = new File(System.getProperty("user.home") + "/.nealfight");
    private JLabel titre;
    private JTextField pseudo;
    private JPasswordField mdp;
    private JButton jouer;
    private JProgressBar pb;

    private String username = null;
    private String accessToken = null;
    private String id = null;

    public LauncherFrame() {
    	WindowMover mover = new WindowMover(this);
    	this.addMouseListener(mover);
    	this.addMouseMotionListener(mover);
        this.setTitle("NealFight");
        this.setSize(850, 500);
        this.setUndecorated(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setLayout(null);
        titre = new JLabel();
        titre.setFont(titre.getFont().deriveFont(60f));
        titre.setBounds(0, 20, 850, 100);
        this.add(titre);
        pseudo = new JTextField();
        pseudo.setBounds(15, 390, 150, 20);
        this.add(pseudo);
        mdp = new JPasswordField();
        mdp.setBounds(15, 420, 150, 20);
        this.add(mdp);
        jouer = new JButton("Jouer");
        jouer.setBounds(190, 410, 70, 30);
        this.add(jouer);
        jouer.addActionListener(new ActionListener() {
            @Override
           public void actionPerformed(ActionEvent e) {
               Thread t = new Thread() {
                   @Override
                   public void run() {
                       auth();
                       saveUsername();
                       update();
                       launchGame(username, accessToken, id);
                   }
               };
               t.start();
           }
        });
        
        pb = new JProgressBar();
        pb.setStringPainted(true);
        pb.setBounds(0, 480, 850, 20);
        this.add(pb);
        
        this.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        new LauncherFrame().loadUsername();
    }
    private void auth() {
    	pseudo.setEnabled(false);
    	mdp.setEnabled(false);
    	jouer.setEnabled(false);
    	try {
    	    YggdrasilAuthenticateResponse rep = Authenticator.auth(GAME_DIR, pseudo.getText(), new String(mdp.getPassword()));
    	    username = rep.getSelectedProfile().getName();
    	    accessToken = rep.getAccessToken();
    	    id = rep.getSelectedProfile().getId();
    	} catch (AuthYggdrasilException e) {
    	    pseudo.setEnabled(true);
    	    mdp.setEnabled(true);
    	    jouer.setEnabled(true);
    	    pseudo.setText(e.getErrorModel().getErrorMessage());
    	}
    	if(username != null) {
    		update();
    		final S_Update su = new S_Update("http://launcher.plutonia.fr/nealfight/", GAME_DIR);
    		Thread t = new Thread() {
    		    @Override
    		    public void run() {
    		        boolean stop = false;
    		        while (!stop) {
    		            if (Util.getDownloadingFile() != null) {
    		                switch (su.getState()) {
    		                case S_Update.DOWNLOADING:
    		                    pb.setString("Téléchargement de "
    		                        + su.getCurrentFileName());
    		                    pb.setMaximum((int) Util.getDownloadingFileSize());
    		                    pb.setValue((int) Util.getDownloadingFile()
    		                            .length());
    		                    break;
    		                case S_Update.UNZIPPING:
    		                    pb.setString("Dezzipage de "
	                            + su.getCurrentFileName());
    		                    break;
    		                case S_Update.REMOVING:
    		                    pb.setString("Suppression de "
    		                            + su.getCurrentFileName());
    		                    break;
    		                case S_Update.FINISH:
    		                    stop = true;
    		                    break;
    		                }
    		            }
    		        }
    		    }
    		};
    		try {
    		    if (su.checkForUpdate()) {
    		        pb.setString("Préparation de la mise à jours...");
    		        su.createLists();
    		        pb.setString("Mise à jours en cours...");
    		        t.start();
    		        su.update();
    		    }
    		} catch (IOException e) {
    		    JOptionPane.showMessageDialog(null, "Impossible de mettre à jour NealFight, veuillez contacter un gérant du serveur : " + e, "Erreur !", JOptionPane.ERROR_MESSAGE);
    		    pseudo.setEnabled(true);
    		    mdp.setEnabled(true);
    		    jouer.setEnabled(true);
    		    e.printStackTrace();
    		    return;
    		}
    		pb.setString("Lancement du jeu en cours...");
    		try {
    		    if (su.checkForUpdate()) {
    		        pb.setString("Préparation de la mise à jours...");
    		        su.createLists();
    		        pb.setString("Mise à jours en cours...");
    		        su.update();
    		    }
    		    pb.setString("Lancement du jeu en cours...");
    		} catch (IOException e) {
    		    JOptionPane.showMessageDialog(null, "Impossible de mettre à jour NealFight, veuillez contacter un gérant du serveur : " + e, "Erreur !", JOptionPane.ERROR_MESSAGE);
    		    pseudo.setEnabled(true);
    		    mdp.setEnabled(true);
    		    jouer.setEnabled(true);
    		    e.printStackTrace();
    		    return;
    		    
    		}
    	}
    }
    private void update() {
        pb.setString("Vérification des mises à jours...");
    }
    private void launchGame(String username, String accessToken, String id) {
    	GameLauncher gl = new GameLauncher("1.7.2", GAME_DIR, "NealFight", username, accessToken, id, new String[] {"-Xms512M", "-Xmx1024M"}, false, false);
    this.setVisible(false);
    try {
        Process p = gl.launchMinecraft();
        gl.printProcessOutput(p);
        p.waitFor();
        System.exit(0);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (IOException e) {
	    JOptionPane.showMessageDialog(null, "Impossible de mettre à jours NealFight, veuillez contacter un gérant du serveur : " + e, "Erreur !", JOptionPane.ERROR_MESSAGE);
    }
    }
    public static final File USERNAME_FILE = new File(GAME_DIR, "username.txt");
    private void loadUsername() {
        GAME_DIR.mkdirs();
        try {
            BufferedReader br = new BufferedReader(
            new FileReader(USERNAME_FILE));
            pseudo.setText(br.readLine());
            br.close();
        } catch (IOException e) {
        }
    }
 
    private void saveUsername() {
        try {
            FileWriter fw = new FileWriter(USERNAME_FILE);
            fw.write(pseudo.getText());
            fw.close();
        } catch (IOException e) {
        }
    }
    public class WindowMover extends MouseAdapter {
    	private Point click;
    	private JFrame window;
        @Override
        public void mouseDragged(MouseEvent e) {
            if (click != null) {
                Point draggedPoint = MouseInfo.getPointerInfo()
                        .getLocation();
                window.setLocation(new Point((int) draggedPoint.getX()
                        - (int) click.getX(), (int) draggedPoint
                        .getY() - (int) click.getY()));
            }
        }
     
        @Override
        public void mousePressed(MouseEvent e) {
            click = e.getPoint();
        }
        public WindowMover(JFrame window) {
            this.window = window;
        }
    }
    public class Panneau extends JPanel {
    	  public void paintComponent(Graphics g){
    	    try {
    	      Image img = ImageIO.read(new File("nealfight.png"));
    	      g.drawImage(img, 850, 500, this);
    	      //Pour une image de fond
    	      //g.drawImage(img, 850, 500, this.getWidth(), this.getHeight(), this);
    	    } catch (IOException e) {
    	      e.printStackTrace();
    	    }                
    	  }               
    	}
}

http://prntscr.com/6d416l

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est bien de créer ton Panneau mais faut l'ajouter ;)

Au début du constructeur de LauncherFrame rajoute this.setContentPane(new Panneau());

A oui aussi, la méthode paintComponent s'exécute plusieurs fois, et a chaque fois tu recharge limage, il faudrait la charger dans le constructeur de Panneau.

Partager ce message


Lien à poster
Partager sur d’autres sites

@TheShark34 Toujours le même problème :/

UjS0qIq.png

package fr.koora.nealfight;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;

import fr.theshark34.openlauncherlib.Authenticator;
import fr.theshark34.openlauncherlib.GameLauncher;
import fr.theshark34.s_update.S_Update;
import fr.theshark34.s_update.Util;
import net.kronos.mclib.auth.yggdrasil.AuthYggdrasilException;
import net.kronos.mclib.auth.yggdrasil.model.response.YggdrasilAuthenticateResponse;

public class LauncherFrame extends JFrame {

    public static final File GAME_DIR = new File(System.getProperty("user.home") + "/.nealfight");
    private JLabel titre;
    private JTextField pseudo;
    private JPasswordField mdp;
    private JButton jouer;
    private JProgressBar pb;

    private String username = null;
    private String accessToken = null;
    private String id = null;

    public LauncherFrame() {
    	WindowMover mover = new WindowMover(this);
    	this.addMouseListener(mover);
    	this.addMouseMotionListener(mover);
        this.setTitle("NealFight");
        this.setSize(850, 500);
    	this.setContentPane(new Panneau());
        this.setUndecorated(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setLayout(null);
        titre = new JLabel();
        titre.setFont(titre.getFont().deriveFont(60f));
        titre.setBounds(0, 20, 850, 100);
        this.add(titre);
        pseudo = new JTextField();
        pseudo.setBounds(15, 390, 150, 20);
        this.add(pseudo);
        mdp = new JPasswordField();
        mdp.setBounds(15, 420, 150, 20);
        this.add(mdp);
        jouer = new JButton("Jouer");
        jouer.setBounds(190, 410, 70, 30);
        this.add(jouer);
        jouer.addActionListener(new ActionListener() {
            @Override
           public void actionPerformed(ActionEvent e) {
               Thread t = new Thread() {
                   @Override
                   public void run() {
                       auth();
                       saveUsername();
                       update();
                       launchGame(username, accessToken, id);
                   }
               };
               t.start();
           }
        });
        
        pb = new JProgressBar();
        pb.setStringPainted(true);
        pb.setBounds(0, 480, 850, 20);
        this.add(pb);
        
        this.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        new LauncherFrame().loadUsername();
    }
    private void auth() {
    	pseudo.setEnabled(false);
    	mdp.setEnabled(false);
    	jouer.setEnabled(false);
    	try {
    	    YggdrasilAuthenticateResponse rep = Authenticator.auth(GAME_DIR, pseudo.getText(), new String(mdp.getPassword()));
    	    username = rep.getSelectedProfile().getName();
    	    accessToken = rep.getAccessToken();
    	    id = rep.getSelectedProfile().getId();
    	} catch (AuthYggdrasilException e) {
    	    pseudo.setEnabled(true);
    	    mdp.setEnabled(true);
    	    jouer.setEnabled(true);
    	    pseudo.setText(e.getErrorModel().getErrorMessage());
    	}
    	if(username != null) {
    		update();
    		final S_Update su = new S_Update("http://launcher.plutonia.fr/nealfight/", GAME_DIR);
    		Thread t = new Thread() {
    		    @Override
    		    public void run() {
    		        boolean stop = false;
    		        while (!stop) {
    		            if (Util.getDownloadingFile() != null) {
    		                switch (su.getState()) {
    		                case S_Update.DOWNLOADING:
    		                    pb.setString("Téléchargement de "
    		                        + su.getCurrentFileName());
    		                    pb.setMaximum((int) Util.getDownloadingFileSize());
    		                    pb.setValue((int) Util.getDownloadingFile()
    		                            .length());
    		                    break;
    		                case S_Update.UNZIPPING:
    		                    pb.setString("Dezzipage de "
	                            + su.getCurrentFileName());
    		                    break;
    		                case S_Update.REMOVING:
    		                    pb.setString("Suppression de "
    		                            + su.getCurrentFileName());
    		                    break;
    		                case S_Update.FINISH:
    		                    stop = true;
    		                    break;
    		                }
    		            }
    		        }
    		    }
    		};
    		try {
    		    if (su.checkForUpdate()) {
    		        pb.setString("Préparation de la mise à jours...");
    		        su.createLists();
    		        pb.setString("Mise à jours en cours...");
    		        t.start();
    		        su.update();
    		    }
    		} catch (IOException e) {
    		    JOptionPane.showMessageDialog(null, "Impossible de mettre à jour NealFight, veuillez contacter un gérant du serveur : " + e, "Erreur !", JOptionPane.ERROR_MESSAGE);
    		    pseudo.setEnabled(true);
    		    mdp.setEnabled(true);
    		    jouer.setEnabled(true);
    		    e.printStackTrace();
    		    return;
    		}
    		pb.setString("Lancement du jeu en cours...");
    		try {
    		    if (su.checkForUpdate()) {
    		        pb.setString("Préparation de la mise à jours...");
    		        su.createLists();
    		        pb.setString("Mise à jours en cours...");
    		        su.update();
    		    }
    		    pb.setString("Lancement du jeu en cours...");
    		} catch (IOException e) {
    		    JOptionPane.showMessageDialog(null, "Impossible de mettre à jour NealFight, veuillez contacter un gérant du serveur : " + e, "Erreur !", JOptionPane.ERROR_MESSAGE);
    		    pseudo.setEnabled(true);
    		    mdp.setEnabled(true);
    		    jouer.setEnabled(true);
    		    e.printStackTrace();
    		    return;
    		    
    		}
    	}
    }
    private void update() {
        pb.setString("Vérification des mises à jours...");
    }
    private void launchGame(String username, String accessToken, String id) {
    	GameLauncher gl = new GameLauncher("1.7.2", GAME_DIR, "NealFight", username, accessToken, id, new String[] {"-Xms512M", "-Xmx1024M"}, false, false);
    this.setVisible(false);
    try {
        Process p = gl.launchMinecraft();
        gl.printProcessOutput(p);
        p.waitFor();
        System.exit(0);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (IOException e) {
	    JOptionPane.showMessageDialog(null, "Impossible de mettre à jours NealFight, veuillez contacter un gérant du serveur : " + e, "Erreur !", JOptionPane.ERROR_MESSAGE);
    }
    }
    public static final File USERNAME_FILE = new File(GAME_DIR, "username.txt");
    private void loadUsername() {
        GAME_DIR.mkdirs();
        try {
            BufferedReader br = new BufferedReader(
            new FileReader(USERNAME_FILE));
            pseudo.setText(br.readLine());
            br.close();
        } catch (IOException e) {
        }
    }
 
    private void saveUsername() {
        try {
            FileWriter fw = new FileWriter(USERNAME_FILE);
            fw.write(pseudo.getText());
            fw.close();
        } catch (IOException e) {
        }
    }
    public class WindowMover extends MouseAdapter {
    	private Point click;
    	private JFrame window;
        @Override
        public void mouseDragged(MouseEvent e) {
            if (click != null) {
                Point draggedPoint = MouseInfo.getPointerInfo()
                        .getLocation();
                window.setLocation(new Point((int) draggedPoint.getX()
                        - (int) click.getX(), (int) draggedPoint
                        .getY() - (int) click.getY()));
            }
        }
     
        @Override
        public void mousePressed(MouseEvent e) {
            click = e.getPoint();
        }
        public WindowMover(JFrame window) {
            this.window = window;
        }
    }
    public class Panneau extends JPanel {
    	  public void paintComponent(Graphics g){
    	    try {
    	      Image img = ImageIO.read(new File("nealfight.png"));
    	      g.drawImage(img, 850, 500, this);
    	      //Pour une image de fond
    	      //g.drawImage(img, 850, 500, this.getWidth(), this.getHeight(), this);
    	    } catch (IOException e) {
    	      e.printStackTrace();
    	    }                
    	  }               
    	}
}

Partager ce message


Lien à poster
Partager sur d’autres sites

Dans paintComponent, tu as mis en commentaire, ce qui a l'air d'être bien, enleve le g.drawImage, par celui qui est en commentaire. Aussi tu charge ton image dans paintComponent, mais il faut que fois, dans le contructeur de Panneau par exemple, parce que paintComponent est appelé plusieurs fois, donc c'est pas propre.

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu suis le tutoriel pour faire ton propre pack, Mathmatboy l'a fait, et ça marche. J'uploderai les miens, mais ça prend du temps avec mon upload a 25ko/s pour un fichier de 200mo ^^

Partager ce message


Lien à poster
Partager sur d’autres sites

Mise à jour du 09/03/2015

  • L'OpenLauncherLib est maintenant en version 1.0-RELEASE !
  • Nombreux réglages de bugs pour celle-ci
  • Ajout de la compatibilité Forge 1.8 pour celle-ci (Merci Mathmatboy =D)
  • L'OpenLauncherLib utilise maintenant Gradle (Merci Thog =D)
  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Mise à jour MAJEURE du 12/03/2015

  • Réglage du bug de l'OpenLauncherLib qui créait un dossier logs la où se trouvait le launcher/bootstrap, maintenant il est dans le dossier du jeu (Merci luca)
  • Ajout du bonus permettant que l'emplacement du dossier du jeu soit dynamique
  • Ajout de la partie 7] Exporter son launcher, et la partie bonus est maintenant la partie 6] Features en plus
  • Le tutoriel pour faire son bootstrap est beaucoup plus clair
  • Réglages de plusieurs bugs du tutoriels et de petits trucs
  • Ajout de l'export du launcher/bootstrap en .exe et en .app
  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonne nouvelle ! S-Update est sortit en 1.0-RELEASE ! J'ai reglé le gros bug qui faisant que quand on arrêtait la mise à jour en cours, il pensait qu'elle était finie donc ça faisait chier quand même. Je l'ai mis en projet Gradle et tout.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui je sais, tu as pris la version buggée, retélécharge la nouvelle version (t'a pas l'impression qu'elle a changé mais ya plus le bug) : https://github.com/TheShark34/S-Update/releases/download/1.0-RELEASE/s-update-1.0-RELEASE.jar

C'est le même nom t'inquiète ;)

Si ça marche toujours pas, supprime ton dossier .nom_du_serveur et reessaye.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui je sais, tu as pris la version buggée, retélécharge la nouvelle version (t'a pas l'impression qu'elle a changé mais ya plus le bug) : https://github.com/TheShark34/S-Update/releases/download/1.0-RELEASE/s-update-1.0-RELEASE.jar

C'est le même nom t'inquiète ;)

Si ça marche toujours pas, supprime ton dossier .nom_du_serveur et reessaye.

parfait merci !!!!!!!!!!!!

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu devrais upload un pack vierge sur Mediafire ou autre parce que 1h pour télécharger un pack sur Dropbox a 70ko/s au lieu de 5-15mo/s, ca pique.

Sinon, merci car j'ai bien réalisé mon launcher custom grace a vos librairies. :D

Partager ce message


Lien à poster
Partager sur d’autres sites

Sinon, juste pour precision, pour le lancement du jeu, on doit preciser la version mais ca doit être la version exacte du minecraft.jar téléchargé ?

GameLauncher gl = new GameLauncher("1.7.10", GAME_DIR, "Mon Minecraft Style", username, accessToken, id, new String[] {"-Xms512M", "-Xmx1024M"}, true, false, false);

btw, si j'ai bien compris le .minecraft, la 1.8 change beaucoup. quel sont les dossiers/fichiers a faire télécharger (Si tu le sais) ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu ne sais pas pour la 1.8 ?

Pourquoi doit-on absolument preciser la bonne version ? Je trouve pas sa pratique de devoir refaire le launcher dès que tu upgrade de version. La flemme de passer par un get text qui contiendra la version.

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour les version index des assets, et car minecraft la demande en argument mais ça c'est pas grave, si tu veux vouloir mettre ce que tu veux, faut que l'assetindex (.nom_du_serveur/assets/<version>.json) ais le même nom, c'est tout ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour les version index des assets, et car minecraft la demande en argument mais ça c'est pas grave, si tu veux vouloir mettre ce que tu veux, faut que l'assetindex (.nom_du_serveur/assets/<version>.json) ais le même nom, c'est tout ;)

Un dernier petit truc :P le dossier ressource packs se cree pas.

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est que tu as oublié de mettre GAME_DIR en argument du GameLauncher, c'est bizarre quand même.

non non le game_dir y est bien le dossier se cree sauf ressourcepacks

Partager ce message


Lien à poster
Partager sur d’autres sites

Il contient quoi ton dossier .nom_du_serveur ?

Quand tu dit qu'il se créé pas, il se créé pas dans .nom_du_serveur quand tu lance MC tu veux dire ? A ce moment la lance MC avec ton launcher, va dans options --> Resource Packs --> Open resource packs folder, et regarde où il te mène.

Si c'est que tu veux avoir un resource packs avec la mise a jour, c'est que tu as mal lu la partie Mise A Jour B]

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×