Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Управление сервером Bukkit' started by link9932, Oct 12, 2014.

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

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

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

    1. После того, как пользователь админ в плагине написал команду "/restart" мы кикаем всех игроков с сервера, запускаем стороннюю программу и вырубаем баккит. На этом шаге проблем нет. Код:
      Code:
       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 все отлично работает. Код сторонней программы:
      Code:
      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. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    Столько извратов на то что можно сделать голым sh-ником...
     
  4. Yuri1.6

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

    Trophy Points:
    123
    Skype:
    Yuri1.6
    Имя в Minecraft:
    YouTy6bl4
    Можно пример?
     

Share This Page