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

Рестарт карты, запуск сервера из сторонней программы.

Тема в разделе "Управление сервером Bukkit", создана пользователем link9932, 12 окт 2014.

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

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

    Баллы:
    61
    Имя в Minecraft:
    link9932
    Добрый день, ребята. Ломаю голову над одной проблемой уже многое время. Для windows проблема решена, все отлично работает, но на Debian нихрена не пашет. Суть состоит в том, что после того, как пользователь в плагине написал "/restart", нужно вырубить сервер, поменять карту на заранее сохраненную и запустить сервер обратно. (ну, собственно, такой же алгоритм как и на многих минигейм серверах). Для этого я придумал такой алгоритм:

    1. После того, как пользователь админ в плагине написал команду "/restart" мы кикаем всех игроков с сервера, запускаем стороннюю программу и вырубаем баккит. На этом шаге проблем нет. Код:
      Код:
       public static void startRestart() throws IOException{
              ProcessBuilder pb = new ProcessBuilder("java", "-jar", "2562.jar");
              pb.directory();
              try {
                  Process p = pb.start();
              } catch (IOException e) {
                  e.printStackTrace();
              }   
          }
      
      public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
                  Player p = (Player) sender;
                  if(cmd.getName().equalsIgnoreCase("restart")) {
                     
                      for (Player player : Bukkit.getOnlinePlayers()) {
                          player.kickPlayer("Server reload!");
                      }
                     
                     
                      if (p.isOp()){
                      try {
                          startRestart();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                      Bukkit.shutdown();
                      return true;
                  }
                  }
                  return false;
              }
      
      Команда работает, игроки кикаются, баккит стопарится, сторонняя программа запускается.
    2. Далее, собственно, переходим к ней. Программа нужна для того, чтобы пока сервер выключен изменить сейв карты и запустить его снова. В папке "mapsave" у меня лежит сохранение. На этом шаге пока все хорошо. Старая папка "world" удаляется, на ее место копируется "mapsave" под именем "world". Остается только запуск сервера. Тут проблема. Запускаю скрипт "start.sh" с таким кодом в нем "java -jar cb.jar" через программу. Сервер вроде стартует, он даже на некоторое время переходит в онлайн, но зайти на этот сервер нельзя или можно, но карты там не будет. (мы будем как бы парить в воздухе, а потом нас выкинет) Хочу заметить то, что карта все таки рестартится т.к. при ручном запуске сервера я вижу карту из папки "mapsave". Значит проблема все таки с запуском. Пробовал много различных вариантов, но ничего дельного так и не получилось. В чем может быть проблема? Хочу напомнить, что на windows все отлично работает. Код сторонней программы:
      Код:
      package lincoln9932;
      
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.OutputStream;
      import java.util.concurrent.TimeUnit;
      
      
      public class Main{
          public static void main(String[] args) throws IOException, InterruptedException {
              TimeUnit.SECONDS.sleep(20);
              File f = new File("world");
              File e = new File("mapsave");
              f.delete();
              f.mkdir();
              copyDirectory(e, f);
              startBukkit();
      
             
             
          }
      
         
          public static void startBukkit() throws IOException, InterruptedException{
              TimeUnit.SECONDS.sleep(20);
              Runtime.getRuntime().exec("sh start.sh");
              System.exit(0);
          }
         
          public static void copyDirectory(File sourceLocation , File targetLocation)
                  throws IOException {
                     
                      if (sourceLocation.isDirectory()) {
                          if (!targetLocation.exists()) {
                              targetLocation.mkdir();
                          }
                         
                          String[] children = sourceLocation.list();
                          for (int i=0; i<children.length; i++) {
                              copyDirectory(new File(sourceLocation, children[i]),
                                      new File(targetLocation, children[i]));
      }
                      } else {
                         
                          InputStream in = new FileInputStream(sourceLocation);
                          OutputStream out = new FileOutputStream(targetLocation);
                         
                          byte[] buf = new byte[1024];
                          int len;
                          while ((len = in.read(buf)) > 0) {
                              out.write(buf, 0, len);
                          }
                          in.close();
                          out.close();
                      }
                  }
      
      
      
      }
      
      И скриншот папки сервера: [​IMG] 2562.jar - программа, которая должна стартовать баккит. Надеюсь на вашу помощь.
     
  2. alexandrage

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

    Баллы:
    173
    Столько извратов на то что можно сделать голым sh-ником...
     
  3. Yuri1.6

    Yuri1.6 Старожил Пользователь

    Баллы:
    123
    Skype:
    Yuri1.6
    Имя в Minecraft:
    YouTy6bl4
    Можно пример?
     

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