1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
  3. Данный раздел создан исключительно для релизов! Вопросы по лаунчеру или обвязке задавайте ТОЛЬКО в соответсвующей теме автора. Любые другие темы будут удалены, а авторы понесут наказание.

Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Фикс Фикс запускатора клиента xLauncer от XeroXP (1.6.2|1.5.2) + вечной авторизации v 2.1

Тема в разделе "Веб-обвязки и лаунчеры", создана пользователем eshkin, 22 авг 2013.

Статус темы:
Закрыта.
  1. Автор темы
    eshkin

    eshkin Старожил Пользователь

    Баллы:
    103
    Skype:
    Cignium
    Внимание всем, кто пользовался старыми версиями кода файла xLoader.java замените старый код на новый. Обновление(замена): делается так же как и исправление.
    Я нашёл фикс запускатора на 1.6.2 и 1.5.2(если вы берёте официальный клиент)!
    Тема самого лаунчера(кликабельно).
    Исправление:
    Заходим в Netbeans или в Eclipse и ищем файл xLoader.java, стираем всё и вставляем это, я пользовался самой последней версией исходников версией 1.5.3) Такой тип запускатора выбирает тип запуска по названию jar'ника, если это minecraft.jar то это старый метод запуска minecraft ниже версию 1.5, если же jar'ник скажем такой 1.6.2.jar или 1.5.2.jar то метод запуска новый. Называйте правильно jar'ники, иначе ничего не запустится.(В клиенте ничего менять не нужно, как папки лежали так пусть и лежат.)
    Код:
    package ru.xeroxp.launcher;
     
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Collection;
    import ru.xeroxp.launcher.process.JavaProcess;
    import ru.xeroxp.launcher.process.JavaProcessLauncher;
    import ru.xeroxp.launcher.process.JavaProcessRunnable;
     
    public class xLoader implements JavaProcessRunnable {
        private final Object lock = new Object();
        private boolean isWorking = false;
        private String userName;
        private String sessionId = "0";
        private String jarfile;
        private String server = "0";
        private String port = "25565";
        private String folder;
        private String version;
        public static JavaProcess process;
     
        public xLoader(String userName, String sessionId, String server, String port, String folder, String jar, String version) {
            this.userName = userName;
            this.sessionId = sessionId;
            this.server = server;
            this.port = port;
            this.jarfile = jar;
            this.folder = folder;
            this.version = version;
            playGame();
        }
     
        public xLoader(String userName) {
            this.userName = userName;
            this.jarfile = xSettings.offlineClient[1];
            this.folder = xSettings.offlineClient[0];
            this.version = xSettings.offlineClient[2];
            playGame();
        }
     
        private void setWorking(boolean working) {
            this.isWorking = working;
        }
     
        public boolean isWorking() {
            return this.isWorking;
        }
     
        public void playGame() {
            synchronized (this.lock) {
                if (this.isWorking) {
                    return;
                }
                setWorking(true);
                launchGame();
            }
        }
     
        protected void launchGame() {
            try {
                String memory = xTheme.readMemory();
                if (memory == null || memory.isEmpty()) memory = Integer.toString(512);
                xUtils utils = new xUtils();
                String separator = System.getProperty("file.separator");
                File nativespath;
                File librarypath;
                File workdir;
                File assetsdir;
                File jarpath;
                File fl = null;
                String minecraft;
                fl = new File(this.jarfile);
                minecraft = fl.getName();
                if (minecraft == "minecraft.jar") {
                    if (this.folder.isEmpty()) {
                        nativespath = new File(utils.getDirectory(), "bin" + separator + "natives");
                        librarypath = new File(utils.getDirectory(), "bin");
                        workdir = utils.getDirectory();
                        jarpath = new File(utils.getDirectory(), "bin" + separator + this.jarfile);
                        assetsdir = new File(utils.getDirectory(), "assets");
                    }
                    else {
                        nativespath = new File(utils.getDirectory(), this.folder + separator + "bin" + separator + "natives");
                        librarypath = new File(utils.getDirectory(), this.folder + separator + "bin");
                        workdir = new File(utils.getDirectory(), this.folder);
                        jarpath = new File(utils.getDirectory(), this.folder + separator + "bin" + separator + this.jarfile);
                        assetsdir = new File(utils.getDirectory(), this.folder + separator + "assets");
                    }
                } else {
                    if (this.folder.isEmpty()) {
                        nativespath = new File(utils.getDirectory(), "versions" + separator + this.version + separator + "natives");
                        librarypath = new File(utils.getDirectory(), "libraries");
                        workdir = utils.getDirectory();
                        jarpath = new File(utils.getDirectory(), "versions" + separator + this.version + separator + this.jarfile);
                        assetsdir = new File(utils.getDirectory(), "assets");
                    }
                    else {
                        nativespath = new File(utils.getDirectory(), this.folder + separator + "versions" + separator + this.version + separator + "natives");
                        librarypath = new File(utils.getDirectory(), this.folder + separator + "libraries");
                        workdir = new File(utils.getDirectory(), this.folder);
                        jarpath = new File(utils.getDirectory(), this.folder + separator + "versions" + separator + this.version + separator + this.jarfile);
                        assetsdir = new File(utils.getDirectory(), this.folder + separator + "assets");
                    }
                }
                String libraries = getLibraries(librarypath);
                if (!libraries.isEmpty()) {
                    libraries = libraries + ";" + jarpath.getAbsolutePath();
                } else {
                    libraries = jarpath.getAbsolutePath();
                }
                JavaProcessLauncher processLauncher = new JavaProcessLauncher(utils.getJavaExecutable(), new String[0]);
                processLauncher.addCommands(new String[] { "-Xmx" + memory + "M" });
                File assetsDirectory = assetsdir;
                if (utils.getPlatform().toString().equals("macos")) {
                    processLauncher.addCommands(new String[] { "-Xdock:icon=" + new File(assetsDirectory, "icons/minecraft.icns").getAbsolutePath() });
                    processLauncher.addCommands(new String[] { "-Xdock:name=" + xSettings.gameName });
                }
                processLauncher.addCommands(new String[] { "\"" + "-Djava.library.path=" + nativespath.getAbsolutePath() + "\"" });
                processLauncher.addCommands(new String[] { "-cp", "\"" + libraries + "\"" });
                if (jarfile.toString().toLowerCase().contains("forge")) {
                    processLauncher.addCommands(new String[] { "net.minecraft.launchwrapper.Launch" });
                    processLauncher.addCommands(new String[] { "--tweakClass", "cpw.mods.fml.common.launcher.FMLTweaker" });
                } else {
                    processLauncher.addCommands(new String[] { "net.minecraft.client.main.Main" });
                }
                //processLauncher.addCommands(new String[] { userName, sessionId, version });
                processLauncher.addCommands(new String[] { "--username", userName });
                processLauncher.addCommands(new String[] { "--session", sessionId });
                processLauncher.addCommands(new String[] { "--version", version });
                processLauncher.addCommands(new String[] { "--gameDir", "\"" + workdir.getAbsolutePath() + "\"" });
                processLauncher.addCommands(new String[] { "--assetsDir", "\"" + assetsdir.getAbsolutePath() + "\"" });
                if (!server.equals("0")) {
                    processLauncher.addCommands(new String[] { "--server", server });
                    processLauncher.addCommands(new String[] { "--port", port });
                }
                process = processLauncher.start();
                process.safeSetExitRunnable(this);
            } catch (Exception e) {
                System.out.println(e);
                setWorking(false);
                return;
            }
        }
     
        public void onJavaProcessEnded(JavaProcess process) {
            int exitCode = process.getExitCode();
     
            if (exitCode == 0) {
                System.out.println("Game ended with no troubles detected (exit code " + exitCode + ")");
            } else {
                System.out.println("Game ended with bad state (exit code " + exitCode + ")");
     
                String errorText = null;
                String[] sysOut = (String[])process.getSysOutLines().getItems();
     
                for (int i = sysOut.length - 1; i >= 0; i--) {
                    String line = sysOut[i];
                    String crashIdentifier = "#@!@#";
                    int pos = line.lastIndexOf(crashIdentifier);
     
                    if ((pos >= 0) && (pos < line.length() - crashIdentifier.length() - 1)) {
                        errorText = line.substring(pos + crashIdentifier.length()).trim();
                        break;
                    }
                }
     
                if(errorText != null) {
                    System.out.println(errorText);
                }
                setWorking(false);
            }
            if (!xMain.error) {
                System.exit(1);
            }
        }
     
        public void onReadyToLaunch() {
            synchronized (this.lock) {
                if (isWorking()) {
                    try {
                        launchGame();
                    } catch (Throwable ex) {
                        System.out.println("LAUNCH ERROR: " + ex.getMessage());
                    }
                }
            }
        }
     
        private static String getLibraries(File path) throws Exception {
            String libraries = "";
            File[] files = path.listFiles();
            if (files.length == 0) {
                return "";
            }
            for(int i = 0; i < files.length; i++) {
                if(files[i].isDirectory()) {
                    String slibraries = getLibraries(new File(path+File.separator+files[i].getName()));
                    if (libraries.isEmpty()) {
                        libraries = slibraries;
                    } else {
                        libraries = libraries + ";" + slibraries;
                    }
                }
                if(files[i].isFile()) {
                    if (libraries.isEmpty()) {
                        libraries = files[i].getAbsolutePath();
                    } else {
                        libraries = libraries + ";" + files[i].getAbsolutePath();
                    } 
                }
            }
            return libraries;
        }
     
        private static void exit() {
            new Thread (new Runnable() {
                public void run() {
                    try {
                        process.getRawProcess().waitFor();
                        if (!xMain.error) {
                            System.exit(1);
                        }
                    } catch (Exception ex) {
                        System.exit(1);
                    }
                }
            }).start();
        }
    }
    
    Дальше идём в xSettingsOfTheme.java и в серверах вместо этого вписываем
    Код:
    new xServer(0, "Classic", "localhost", "25565", "hitech", "Сюда пишем(то что в квадратных скобках): [цифра.цифра.цифра.jar] или [minecraft.jar] зависит от версии вашего клиента, первый вариант для версий 1.5 +", "Cюда пишем версию(то что в квадратных скобках): [цифра.цифра.цифра.jar] или [minecraft.jar] зависит от версии вашего клиента, первый вариант для версий 1.5 +", 100, 0, 0, 724, 110, 6, 6, 180, 98, 500, 30, 200, 24, new Color(114, 114, 114), 450, 78, 70, 14, new Color(114, 114, 114), 231, 71, 484.0D, 29),
    UPDATE! Теперь можно пользоваться версиями ниже 1.5.
    Вот собственно весь фикс.
    Версии ниже 1.0.0 будут запускаться.

    1. Также фикс вечной авторизации. Она возникает в большинстве случаев из-за удаления старых как попало или добавления новых серверов в список лаунчера не по счёту то есть нужно добавлять так:
    Код:
    new xServer(0, "Classic", "localhost", "25565", "hitech", "1.5.2.jar", "1.5.2", 100, 0, 0, 724, 110, 6, 6, 180, 98, 500, 30, 200, 24, new Color(114, 114, 114), 450, 78, 70, 14, new Color(114, 114, 114), 231, 71, 484.0D, 29),
     
    new xServer(1, "Hitech", "localhost", "25565", "sandbox", "minecraft.jar", "1.4.7", 100, 0, 120, 724, 110, 6, 126, 180, 98, 500, 150, 200, 24, new Color(114, 114, 114), 450, 198, 70, 14, new Color(114, 114, 114), 231, 191, 484.0D, 29)
    Самое первое в скобках это ID сервера, добавляем сервер по порядку начиная с нуля если уже есть какие-то то добавляем в ID нового сервера ID на 1 больше предыдущего(Внимательно проверяйте введённые данные)
    2. Ваш лаунчер пытается проверить папки, которых нет, это возможно ваш косяк или косяк лаунчера(он иногда не распаковывает архив с обновлением, советую удалить архив и заново нажать кнопку обновить в лаунчере.).
    С вами был Кэп.:D

    Обновления:


    v 2.1 relese Окончательное исправление 2.
    v 2.0 relese Окончательное исправление.
    v 1.1 Добавление второго пункта фикса вечной авторизации.
    v 1.0 Исправление фикса запускатора клиента и небольшие исправления текста.
    v 1.0 alfa Появление фикса.

    To Do:
    1) Исправить ошибку распаковки архива.
    2) Исправить ошибку проверки клиента.
    3) Выложить исходники со всеми исправлениями.
     
    LexTertainment, Bjoerndalen, book777 и ещё 1-му нравится это.
  2. Автор темы
    eshkin

    eshkin Старожил Пользователь

    Баллы:
    103
    Skype:
    Cignium
    Вышла новая версия!
    v 2.0 relese Окончательное исправление.
    Если что-то непонятно в этом лаунчере помогу.
    Вышла новая версия!
    v 2.1 relese Окончательное исправление 2.
    Если что-то непонятно в этом лаунчере помогу.
     
  3. XeroXP

    XeroXP Старожил Пользователь

    Баллы:
    153
    Skype:
    slava.pestr
    Имя в Minecraft:
    XeroXP
    Что-то намудрили вы, лаунчер определяет тип запуска только по версии (кроме minecraft версий выше 1.5.2, запуск forge определяется по названию jar)
    А jar файл вы могли называть как угодно (про forge на версии выше 1.5.2 я уже писал), и класть его надо было в bin вместе с папкой natives (как обычно), папку assets и libraries рядом с папкой bin

    Про id серверов - это скорее не фикс, а ответ на самую распространенную ошибку

    А папки надо раскладывать умело так, чтобы в check лежали не все папки и файлы, а только с проверяемыми форматами
    Эти же папки и файлы обязательно должны присутствовать в client.zip (в этот архив можно положить дополнительные файлы и папки)

    Ошибка распаковки может быть из-за того, что криво запаковали (определяется тем, что вместо папки создается файл с этим же именем или наоборот) (исправляется правильной перепаковкой)
    И эта ошибка может возникнуть из-за присутствия в названиях файлов и папок запрещенных символов (кириллицы)

    Ошибка с проверкой также возникает из-за кривого разложения файлов

    Очень печально, что я живу именно в этой стране...
     
  4. Автор темы
    eshkin

    eshkin Старожил Пользователь

    Баллы:
    103
    Skype:
    Cignium
    Что-то в этом роде, но написано проффесианально. Я выложил такой запускатор, потому что мне так удобнее располагать файлы и самому mojang тоже. Ну и модифицировались необязательно. И да v 2.1 release Удаление багов, понижение производительности. И ещё, не все всё могут сделать правильно ;)
     
  5. XeroXP

    XeroXP Старожил Пользователь

    Баллы:
    153
    Skype:
    slava.pestr
    Имя в Minecraft:
    XeroXP
    Первое предложение не понятно к чему относится. Про модификацию я не понял (клиент модифицировать обязательно в связке клиент-сервер т.к. сессия будет приходить невалидная)
    Если ты хоть разберешься в коде, то поймешь, что 1.5.2 запускается через applet и что достаточно было заменить "bin" на "versions" в этом файле
    Я не понял про удаление каких багов идет речь, выше я описал решение ошибок, т.к. все работает хорошо (главное иметь прямые руки)
     
    homya4ok нравится это.
  6. dzikar

    dzikar Активный участник Пользователь

    Баллы:
    88
    Skype:
    kabala1790
    Имя в Minecraft:
    dzikar

    напишете норальное реадме. где будет написано так что выполнил по пунктам и запустилось или где искать если что проблему. Но не так что собрал и повисает в вечной авторизации. Даже не поймёшь, что, где, когда и как. Если за завтро не разберусь в причинах такого поведения, забиваю болт на xlauncher и заказываю за бугром лаунчер на c++. Кросс платформенный и мультиклиентный. Меньше мозготрёпки.
     
Статус темы:
Закрыта.

Поделиться этой страницей