Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Туториал Делаем кнопки "Зайти на сервер", "Обновить" и отображение кол-ва игроков в гл. меню.

  1. Открываем класс net.minecraft.client.gui.GuiMultiplayer.
  2. В конец метода initGui() добавляем:
    Код:
    this.mc.displayGuiScreen(new GuiMainMenu());
  3. Создаём класс PingTask и добавляем в него:
    Код:
    package net.minecraft.client.gui;
    
    import java.util.concurrent.FutureTask;
    import java.util.concurrent.Callable;
    import net.minecraft.client.multiplayer.ServerData;
    import net.minecraft.client.network.ServerPinger;
    
    public class PingTask extends FutureTask<PingTask.AdvServerData>
    {
        private boolean isOnline = false;
        public PingTask(final String ip, final ServerPinger pinger)
        {
            super(new Callable<PingTask.AdvServerData>()
            {
                @Override
                public AdvServerData call()
                {
                    AdvServerData data = new AdvServerData(ip);
                    try
                    {
                        pinger.ping(data);
                        data.isOnline = true;
                    }
                    catch (Exception e)
                    {
                        data.isOnline = false;
                    }
                    return data;
                }
            });
        }
      
        public static class AdvServerData extends ServerData
        {
            public boolean isOnline;
            public AdvServerData(String ip)
            {
                super("", ip, true);
            }
        }
    }
  4. Открываем класс net.minecraft.client.gui.GuiMainMenu.
  5. В самое начало ТЕЛА класса добавляем:
    Код:
        private static final String defText = "Зайти на сервер";
        private static final String disabledText = "Сервер выключен";
        private static final String pingingText = "Пингование сервера...";
        private static final String ip = "mc.hypixel.net:25565";
        private ServerPinger pinger = new ServerPinger();
        private PingTask pingTask;
        private GuiButton joinButton;
  6. В конец метода GuiMainMenu() добавляем:
    Код:
    FMLClientHandler.instance().setupServerList();
  7. В начало метода updateScreen() добавляем:
    Код:
            this.pinger.pingPendingNetworks();
            if (this.pingTask != null && this.pingTask.isDone())
            {
                try
                {
                    AdvServerData data = this.pingTask.get();
                    if (data.isOnline)
                    {
                        if (Strings.isNullOrEmpty(data.populationInfo)) this.joinButton.displayString = pingingText;
                        else
                        {
                            this.joinButton.displayString = defText + " [" + data.populationInfo + "§f]";
                            this.pingTask = null;
                        }
                    }
                    else this.joinButton.displayString = disabledText;
                }
                catch (Exception e)
                {
                }
            }
  8. После метода из пункта 7 добавляем:
    Код:
    public void onGuiClosed()
        {
            this.pinger.clearPendingNetworks();
        }
        
        private void ping()
        {
            if (this.pingTask != null && !this.pingTask.isCancelled()) this.pingTask.cancel(false);
            Thread t = new Thread(this.pingTask = new PingTask(ip, this.pinger));
            t.setDaemon(true);
            t.start();
            this.joinButton.displayString = pingingText;
        }
  9. В методе addSingleplayerMultiplayerButtons(int, int) заменяем:
    Код:
    this.buttonList.add(new GuiButton(2, this.width / 2 - 100, p_73969_1_ + p_73969_2_ * 1, I18n.format("menu.multiplayer", new Object[0])));
    на:
    Код:
    boolean needPing = this.joinButton == null;
    this.buttonList.add(this.joinButton = new GuiButton(2, this.width / 2 - 100, p_73969_1_ + p_73969_2_, needPing ? pingingText : this.joinButton.displayString));
    if (needPing) this.ping();
    GuiButton updateButton = new GuiButton(100, this.width / 2 + 102, p_73969_1_ + p_73969_2_, "Обновить");
    updateButton.width = 50;
    this.buttonList.add(updateButton);
  10. В начале метода actionPerformed(GuiButton) добавляем:
    Код:
    if (button.id == 100) this.ping();
  11. В методе из пункта 10 заменяем:
    Код:
    this.mc.displayGuiScreen(new GuiMultiplayer(this));
    на:
    Код:
    FMLClientHandler.instance().connectToServer(new GuiMultiplayer(this), new AdvServerData(ip));
  12. Вот
    1a5061b748574204bdfd877d6a03b142.png
 
  1. Открываем класс net.minecraft.client.gui.GuiMultiplayer.
  2. В конец метода initGui() добавляем:
    Java:
    this.mc.displayGuiScreen(new GuiMainMenu());
  3. Создаём класс PingTask и добавляем в него:
    Java:
    public class PingTask extends FutureTask<PingTask.AdvServerData>
    {
        private boolean isOnline = false;
    
        public PingTask(final String ip, final OldServerPinger pinger)
        {
            super(new Callable<PingTask.AdvServerData>()
            {
                @Override
                public AdvServerData call()
                {
                    AdvServerData data = new AdvServerData(ip);
                    try
                    {
                        pinger.func_147224_a(data);
                        data.isOnline = true;
                    }
                    catch (Exception e)
                    {
                        data.isOnline = false;
                    }
                    return data;
                }
            });
        }
       
        public static class AdvServerData extends ServerData
        {
            public boolean isOnline;
    
            public AdvServerData(String ip)
            {
                super("", ip);
            }
        }
    }
  4. Открываем класс net.minecraft.client.gui.GuiMainMenu.
  5. В самое начало ТЕЛА класса добавляем:
    Java:
    private static final String defText = "Зайти на сервер";
    private static final String disabledText = "Сервер выключен";
    private static final String pingingText = "Пингование сервера...";
    private static final String ip = "mc.hypixel.net:25565";
    private OldServerPinger pinger = new OldServerPinger();
    private PingTask pingTask;
    private GuiButton joinButton;
  6. В конец метода GuiMainMenu() добавляем:
    Java:
    FMLClientHandler.instance().setupServerList();
  7. В начало метода updateScreen() добавляем:
    Java:
    this.pinger.func_147223_a();
    if (this.pingTask != null && this.pingTask.isDone())
    {
        try
        {
            AdvServerData data = this.pingTask.get();
            if (data.isOnline)
            {
                if (Strings.isNullOrEmpty(data.populationInfo)) this.joinButton.displayString = pingingText;
                else
                {
                    this.joinButton.displayString = defText + " [" + data.populationInfo + "§f]";
                    this.pingTask = null;
                }
            }
            else this.joinButton.displayString = disabledText;
        }
        catch (Exception e)
        {
        }
    }
  8. После метода из пункта 7 добавляем:
    Java:
    public void onGuiClosed()
    {
        this.pinger.func_147226_b();
    }
    
    private void ping()
    {
        if (this.pingTask != null && !this.pingTask.isCancelled()) this.pingTask.cancel(false);
        Thread t = new Thread(this.pingTask = new PingTask(ip, this.pinger));
        t.setDaemon(true);
        t.start();
        this.joinButton.displayString = pingingText;
    }
  9. В методе addSingleplayerMultiplayerButtons(int, int) заменяем:
    Java:
    this.buttonList.add(new GuiButton(2, this.width / 2 - 100, p_73969_1_ + p_73969_2_ * 1, I18n.format("menu.multiplayer", new Object[0])));
    на:
    Java:
    boolean needPing = this.joinButton == null;
    this.buttonList.add(this.joinButton = new GuiButton(2, this.width / 2 - 100, p_73969_1_ + p_73969_2_, needPing ? pingingText : this.joinButton.displayString));
    if (needPing) this.ping();
    GuiButton updateButton = new GuiButton(100, this.width / 2 + 102, p_73969_1_ + p_73969_2_, "Обновить");
    updateButton.width = 50;
    this.buttonList.add(updateButton);
  10. В начале метода actionPerformed(GuiButton) добавляем:
    Java:
    if (p_146284_1_.id == 100) this.ping();
  11. В методе из пункта 10 заменяем:
    Java:
    this.mc.displayGuiScreen(new GuiMultiplayer(this));
    на:
    Java:
    FMLClientHandler.instance().connectToServer(new GuiMultiplayer(this), new AdvServerData(ip));
Крашит при запуске
 
Автор если не затруднит поправь шапку.
Есть вариант получше чем предложил ты.
Вот эта строка
FMLClientHandler.instance().connectToServer(new GuiMultiplayer(this), new AdvServerData(ip));
открывает доп гуи, если человек не попал на сервер ему откроет меню выбора серверов.(А нам это не надо:D)
рекомендую делать вот что
this.mc.displayGuiScreen(new GuiConnecting(this, this.mc, new AdvServerData(ip)));
все тоже самое но после безуспешного подключения, игрок попадет не в меню выбора сервера а в главное меню.
 
Именно на этот случай сделан второй пункт туториала. Я когда-то пробовал ваш варинт, но чем-то он мне не понравился (чем именно, уже не помню, всё же много времени прошло).
 
Именно на этот случай сделан второй пункт туториала. Я когда-то пробовал ваш варинт, но чем-то он мне не понравился (чем именно, уже не помню, всё же много времени прошло).
Ну меня такой вариант устроил, полностью, работает все на ура.


собственно я понял че к чему. Он выдает нулку при первом конекте. :D

Можно решить вот так меняем это
Java:
FMLClientHandler.instance().connectToServer(new GuiMultiplayer(this), new AdvServerData(ip));
На это
Java:
FMLClientHandler.instance().connectToServer(new GuiMainMenu(), new AdvServerData(ip));
 
Последнее редактирование:
Вопрос!
Как поменять цвет 0/9000 ?
А именно,количество игроков на сервере,сам слеш и максимальное кол-во слотов...
 
Вопрос!
Как поменять цвет 0/9000 ?
А именно,количество игроков на сервере,сам слеш и максимальное кол-во слотов...
  1. Убираем цветовые коды из записи количества игроков.
  2. Делим запись на 2 строки по символу '/'.
  3. Меняем цвет так, как пожелаем.
 
  1. Убираем цветовые коды из записи количества игроков.
  2. Делим запись на 2 строки по символу '/'.
  3. Меняем цвет так, как пожелаем.
Спасибо!Думаю многим новичкам пригодится....Пример был бы кстати!
 
И еще вопрос!
Я убрал кнопки выбора языка,теперь нужно сделать его по дефолту русским,и что бы он был в HD как на скрине!
Вопрос: Как это риализовать?
1-Изображение стороннего лаунчера...
2-Лаунчер над которым я работаю...
P.S. ascii.png Заменил на HD
P.S.S В assets/minecraft/lang файл en_US.lang полностью русифицирован
 

Вложения:

  • ef78664b52.jpg
    ef78664b52.jpg
    Размер файла
    191,3 КБ
    Просмотров
    61
  • bb51687571.jpg
    bb51687571.jpg
    Размер файла
    150,5 КБ
    Просмотров
    60
И еще вопрос!
Я убрал кнопки выбора языка,теперь нужно сделать его по дефолту русским,и что бы он был в HD как на скрине!
Вопрос: Как это риализовать?
1-Изображение стороннего лаунчера...
2-Лаунчер над которым я работаю...
P.S. ascii.png Заменил на HD
P.S.S В assets/minecraft/lang файл en_US.lang полностью русифицирован
С en_US шрифт никак не связан. Нужно или заменять Unicode шрифт, или патчить FontRenderer (это делает мой мод ClientFixer).
 
1-Изображение стороннего лаунчера...
2-Лаунчер над которым я работаю...
Омг... рукалицо.jpg

Не знаю излечит ли клинический случай, но вот, стоит почитать и попытаться осознать:
Лаунчер (англ. Launcher) — программа, предоставляющая пользователю возможность войти в свой аккаунт, а также загрузить и запустить клиент игры.
То, над чем тут ведется работа называется "клиент".
Поди еще и комплексы игровых серверов обзываешь "лаунчерами"...
 
В чем собственно заключается суть твоего сообщения?
Я вроде как написал именно (конкретно про лаунчер,в нем изменяются сами классы (кнопки,расположение кнопок,связка авторизации через сайт,дизайн через xml файлы лаунчера)
Клиент я сам не трогал (Моды,конфиги к ним),они настроены корректно клиент (Лаунчер и модификации) + связаны с сервером.
Если есть какие либо претензии,то прошу писать мне в личку,а не показывать свой тупизм обращаясь ко мне!

Тупизм тут только ты свой показываешь называя лаучером то, что лаунчером не является и даже не пытаясь понять, что клиент игры - это не лаунчер.
 
Тупизм тут только ты свой показываешь называя лаучером то, что лаунчером не является и даже не пытаясь понять, что клиент игры - это не лаунчер.
Не обращай внимания :D Со временем Никогда не поймет.
 
Я и не собирался понимать,мне это не к чему!самое главное понял тот человек который мне помог,и я сделал то что хотел и даже больше...Спасибо автору!
А хейтить,рофлить и прочее это ваша учесть!
Не просто понимаешь, лаунчер это программа запуска игры. В нем ты вводишь данные для авторизации и т.д.
А клиент это уже сама игра. В данном случае ты правишь не лаунчер а клиент. :)
 
Я и не собирался понимать,мне это не к чему!самое главное понял тот человек который мне помог,и я сделал то что хотел и даже больше...Спасибо автору!
А хейтить,рофлить и прочее это ваша учесть!
Просто предельно возможный уровень так называемого проекта, который может быть сделан таким разработчиком, который не видит разницы между программой, которая запускает игру, и самой игрой - конечен и заранее известен. Обречен он, если угодно.
Я понимаю, что все когда-то чему-то учатся, что-то начинают в первый раз, но не надо объективную критику, не суть в какой она была форме (просто одного фейспалма уже не хватает, когда называют клиент (а то и проект) лаунчером), воспринимать в штыки и начинать в ответ еще наезды какие-то устраивать. Нужно прочитать, погуглить, изучить матчасть и принять как данность то, что ты был не прав и, опционально, поблагодарить за ликбез. Что такое "ликбез" думаю не надо объяснять? Погугли таки, если что...
 
Кто может нормально обьяснить под майн 1.7.10? А то у меня есть ряд причин по которым я не могу сделать кнопочку :( 1. Я не понял 2. Я не понял
 

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

Назад
Верх