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

Туториал [Мини урок] Создаем список серверов

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем Raptor2108, 6 ноя 2012.

  1. Автор темы
    Raptor2108

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

    Баллы:
    173
    В этом маленьком уроке мы создадим свой список серверов и запретим добавлять в список другие. Итоговый результат можно посмотреть на картинке:
    [​IMG]

    Нам понадобится:
    1)
    MCP
    2) Notepad ++

    Распаковываем MCP в любую папку, в папку jar кидаем папку bin чистого minecraft клиента, запускаем файлик decompile.bat и ждем, обычно это занимает около 5 минут. Как только декомпиляция завершена закрываем консоль и идем в папку src\minecraft\net\minecraft\src.

    Теперь скачиваем архив с файлами для нужной нам версии:
    1. Minecraft 1.6.4
    2. Minecraft 1.7.10
    И распаковываем его в нашу папку с заменой существующих файлов. Открываем файл ServerList.java с помощью notepad++ и видим в самом вверху Панель управления.
    [​IMG]

    new ServerData("Server one", "localhost") - Эта строчка добавляет в список сервер под названием Server one и IP адресом localhost, изменяем эти данные на свои, если нам необходимо добавить еще серверов, то после ...."localhost") ставим запятую и снова копируем строчку new ServerData("Server one", "localhost") с данными второго сервера чтобы получилось вот так:
    Код:
    ServerData[] server = {
     
        new ServerData("Server one", "localhost"),
        new ServerData("Server two", "localhost")
     
     
     
        };
    По аналогии можем добавить третий четвертый и последующие сервера. Сохраняем изменения в файле и запускаем recompile.bat, после того как он закончит работу запускаем reobfuscate.bat, далее ищем наши классы в папке reobf, закидываем их в наш minecraft.jar.



    Теперь давайте разбираться, список всех серверов берется из файла server.dat и на основе которого выводится на экран, нас это конечно не устраивает, Итак что нам нужно сделать:
    - Первым делом нужно запретить загрузку серверов из файла, чтобы никто не смог добавить другие сервера в список;
    - Добавить свои сервера;
    - И конечно изменить расположение и размер стандартных кнопок, убрав такие как Добавить сервер, Удалить сервер и Редактировать сервер.

    Начнем с первого пункта, за формирование и загрузку списка серверов с версии 1.3.2 отвечает отдельный класс ServerList, который можно найти в одноименном файле ServerList.java, откроем его и найдем следующий метод:
    Код:
    public void loadServerList()
    В нем следующие 2 строчки берут список серверов из файла server.dat и кладут в массив для последующего использования:
    Код:
    NBTTagCompound var1 = CompressedStreamTools.read(new File(this.mc.mcDataDir, "servers.dat"));
                NBTTagList var2 = var1.getTagList("servers");
    Стираем их. Далее идет цикл который на основе этого самого массива выводит сервера на экран:
    Код:
      for (int var3 = 0; var3 < var2.tagCount(); ++var3)
                {
                    this.servers.add(ServerData.getServerDataFromNBTCompound((NBTTagCompound)var2.tagAt(var3)));
                }
    Так же стираем его. Ну чтож с первым пунктом разобрались, если все сделано верно у нас метод loadServerList теперь выглядит так:
    Код:
        public void loadServerList()
        {
            try
            {
    
                this.servers.clear();
    
    
            }
            catch (Exception var4)
            {
                var4.printStackTrace();
            }
        }
    Давайте добавим наш \ наши сервера в список. За это как мы помним из цикла отвечает метод this.servers.add().
    Сразу после this.servers.clear(); напишем такой метод: this.servers.add(new ServerData("Название сервера", "IP сервера"));
    В итоге получится вот так:
    Код:
        public void loadServerList()
        {
            try
            {
                this.servers.clear();
                this.servers.add(new ServerData("Название сервера", "IP сервера"));
            }
            catch (Exception var4)
            {
                var4.printStackTrace();
            }
        }

    Подсказка: в название сервера можно использовать разные цвета, используя специальные символы, посмотреть их можно тут (используйте символ § вместо #)
     
    Последнее редактирование: 19 дек 2014
    iProger, MegaFlary, CraftCoder и 38 другим нравится это.
  2. Автор темы
    Raptor2108

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

    Баллы:
    173
    Сервера мы добавили, осталось самое простое: изменить кнопки. Для этого идем в файл GuiMultiplayer.java, там примерно на 105 строке есть метод:
    Код:
    initGuiControls()
    Он отвечает как нистранно за инициализацию всех кнопок:cap:

    Тут я не буду вдаваться в подробности, просто замените весь метод на такой:

    Код:
      public void initGuiControls()
        {
            StringTranslate var1 = StringTranslate.getInstance();
            this.controlList.add(this.buttonEdit = new GuiButton(7, this.width / 2 - 154, this.height - 28, 70, 20, var1.translateKey("")));
            this.controlList.add(this.buttonDelete = new GuiButton(2, this.width / 2 - 74, this.height - 28, 70, 20, var1.translateKey("")));
            this.controlList.add(this.buttonSelect = new GuiButton(1, this.width / 2 - 154, this.height - 52, 308, 20, var1.translateKey("selectServer.select")));
            this.controlList.add(new GuiButton(8, this.width / 2 - 154, this.height - 28, 152, 20, var1.translateKey("selectServer.refresh")));
            this.controlList.add(new GuiButton(0, this.width / 2 + 2, this.height - 28, 152, 20, var1.translateKey("gui.cancel")));
            boolean var2 = this.selectedServer >= 0 && this.selectedServer < this.serverSlotContainer.getSize();
            this.buttonSelect.enabled = var2;
            this.buttonEdit.enabled = var2;
            this.buttonDelete.enabled = var2;
        }
    Код:
      public void initGuiControls()
        {
            StringTranslate var1 = StringTranslate.getInstance();
            this.buttonList.add(this.field_96289_p = new GuiButton(7, this.width / 2 - 154, this.height - 28, 70, 20, var1.translateKey("")));
            this.buttonList.add(this.buttonDelete = new GuiButton(2, this.width / 2 - 74, this.height - 28, 70, 20, var1.translateKey("")));
            this.buttonList.add(this.buttonSelect = new GuiButton(1, this.width / 2 - 154, this.height - 52, 308, 20, var1.translateKey("selectServer.select")));
            this.buttonList.add(new GuiButton(8, this.width / 2 - 154, this.height - 28, 152, 20, var1.translateKey("selectServer.refresh")));
            this.buttonList.add(new GuiButton(0, this.width / 2 + 2, this.height - 28, 152, 20, var1.translateKey("gui.cancel")));
            boolean var2 = this.selectedServer >= 0 && this.selectedServer < this.serverSlotContainer.getSize();
            this.buttonSelect.enabled = var2;
            this.field_96289_p.enabled = var2;
            this.buttonDelete.enabled = var2;
        }
    Код:
    public void func_146794_g()
        {  
            this.buttonList.add(this.field_146810_r = new GuiButton(7, this.width / 2 - 154, this.height - 28, 70, 20, I18n.format("selectServer.edit", new Object[0])));
            this.buttonList.add(this.field_146808_t = new GuiButton(2, this.width / 2 - 74, this.height - 28, 70, 20, I18n.format("selectServer.delete", new Object[0])));
            this.buttonList.add(this.field_146809_s = new GuiButton(1, this.width / 2 - 154, this.height - 52, 308, 20, I18n.format("selectServer.select", new Object[0])));
            this.buttonList.add(new GuiButton(8, this.width / 2 - 154, this.height - 28, 152, 20, I18n.format("selectServer.refresh", new Object[0])));
            this.buttonList.add(new GuiButton(0, this.width / 2 + 2, this.height - 28, 152, 20, I18n.format("gui.cancel", new Object[0])));
            this.func_146790_a(this.field_146803_h.func_148193_k());
        }

    Сохраняем все измененные нами файлы.

    Теперь идем обратно в папку с MCP и запускаем файлик recompile.bat, а после окончания его работы reobfuscate.bat, далее идем в папку reobf\minecraft и копируем все получившиеся классы оттуда в свой minecraft.jar.
    На этом все :D

    Бонус

    Убираем поиск локальных серверов. Для этого надо зайти в файл GuiSlotServer.java и закоментировать 84 строчку, чтобы получилось вот так:
    Код:
    //  this.func_77249_c(par1, par2, par3, par4, par5Tessellator);
    Далее как описано чуть выше, рекомпилим и закидываем получившиеся классы в minecraft.jar.
     
    Последнее редактирование: 19 дек 2014
    MegaFlary, -FoX-, iSemka и 32 другим нравится это.
  3. LiveD

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

    Баллы:
    153
    Skype:
    LiveDRus
    Можно подменить server.dat :D. Тогда уж впилить в лаунчер проверку, на server.dat. А так спасибо, лайк.
     
  4. Автор темы
    Raptor2108

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

    Баллы:
    173
    В том то и дело что он больше не используется, добавление наших серверов идет в самом коде.
     
    Xakep_SDK, dimahru и SuperHanz нравится это.
  5. LiveD

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

    Баллы:
    153
    Skype:
    LiveDRus
    Да не посмотрел, спасибо.
     
  6. Alastar

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

    Баллы:
    173
    Нашел дыру небольшую)
    Если найти класс с IP и названием сервера то с помощью InClassTranslator эти параметры можно просто изменить.
    P.S.В таком случае можно было бы просто выложить эти классы)
     
  7. Автор темы
    Raptor2108

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

    Баллы:
    173
    Для этого есть лаунчер с проверкой клиента, а насчет выложить, это было бы легко , но я поставил целью объяснить как это работает, а не дать тупо скопировать готовое.
     
    DimasForce, leon0399, Xakep_SDK и 3 другим нравится это.
  8. Alastar

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

    Баллы:
    173
    Кстати на 1.4.2 не канает)
    P.S. Хотя кто знает...у меня же рук нет(
     
  9. Alastar

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

    Баллы:
    173
    Ты получил молотом по голове как и я?)Можешь для 1.4.2 выложить?
    P.S. На икрафте играешь? Или 0дмин там?)
     
    Сникерсни нравится это.
  10. Автор темы
    Raptor2108

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

    Баллы:
    173
    Нет человек просил "Сделай как у них" только 1.3.2. Код рабочий, а молот от GuiMultiplayer.java там какой то маленький косячок если найду исправлю. На 1.4.2 абсолютно точно так же делается.
     
    Xakep_SDK, SuperHanz и Alastar нравится это.
  11. Alastar

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

    Баллы:
    173
    Очень полезный тутор! Будешь еще выкладывать?)
     
  12. Автор темы
    Raptor2108

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

    Баллы:
    173
    Идей нету пока что больше. Если есть предложение пиши, попробую реализовать.
     
    Xakep_SDK и SuperHanz нравится это.
  13. Alastar

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

    Баллы:
    173
    Можешь это но только для 1.4.2 реализовать? Просто я просил тут некоторых, но меня откровенно послали на***, а так было бы очень полезно для всех)​
     
  14. Автор темы
    Raptor2108

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

    Баллы:
    173
    По моему это не актуально. Кто станет изменять ваш клиент, когда можно просто взять чистый.
     
    SuperHanz нравится это.
  15. Alastar

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

    Баллы:
    173
    Ну ок) Моя доза идей на сегодня к сожалению исчерпалась:D
    P.S. Хотя...
     
  16. AxmeD

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

    Баллы:
    103
    Довольно полезно. Благодарю :)
     
  17. Alastar

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

    Баллы:
    173
    Ахха, маленький косяк нашел все равно) На 1.4.2 из-под кнопки вылезает буква Р :D
     
  18. AxmeD

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

    Баллы:
    103
    Ну, это же 1.4, а не 1.3. Может в разных версиях по разному
     
  19. Автор темы
    Raptor2108

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

    Баллы:
    173
    En_US.lang - открыть -Найти слово "Редактировать", изменить на "Р".
     
    SuperHanz и Alastar нравится это.
  20. Alastar

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

    Баллы:
    173
    А может просто стереть? Или ошибка вылезет?
     

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