All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.spigotmc.RestartCommand Maven / Gradle / Ivy

package org.spigotmc;

import net.minecraft.server.EntityPlayer;
import net.minecraft.server.MinecraftServer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;

import java.io.File;
import java.util.List;

public class RestartCommand extends Command {

  public RestartCommand(String name) {
    super(name);
    this.description = "Restarts the server";
    this.usageMessage = "/restart";
    this.setPermission("bukkit.command.restart");
  }

  public static void restart() {
    restart(new File(SpigotConfig.restartScript));
  }

  public static void restart(final File script) {
    AsyncCatcher.enabled = false; // Disable async catcher incase it interferes with us
    try {
      if (script.isFile()) {
        System.out.println("Attempting to restart with " + SpigotConfig.restartScript);

        // Disable Watchdog
        WatchdogThread.doStop();

        // Kick all players
        for (EntityPlayer p : MinecraftServer.getServer().getPlayerList().players) {
          p.playerConnection.disconnect(SpigotConfig.restartMessage);
        }
        // Give the socket a chance to send the packets
        try {
          Thread.sleep(100);
        } catch (InterruptedException ex) {
        }
        // Close the socket so we can rebind with the new process
        MinecraftServer.getServer().getServerConnection().b();

        // Give time for it to kick in
        try {
          Thread.sleep(100);
        } catch (InterruptedException ex) {
        }

        // Actually shutdown
        try {
          MinecraftServer.getServer().stop();
        } catch (Throwable t) {
        }

        // This will be done AFTER the server has completely halted
        Thread shutdownHook = new Thread() {
          @Override
          public void run() {
            try {
              String os = System.getProperty("os.name").toLowerCase();
              if (os.contains("win")) {
                Runtime.getRuntime().exec("cmd /c start " + script.getPath());
              } else {
                Runtime.getRuntime().exec(new String[]
                  {
                    "sh", script.getPath()
                  });
              }
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        };

        shutdownHook.setDaemon(true);
        Runtime.getRuntime().addShutdownHook(shutdownHook);
      } else {
        System.out.println("Startup script '" + SpigotConfig.restartScript + "' does not exist! Stopping server.");
      }
      System.exit(0);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  @Override
  public boolean execute(CommandSender sender, String currentAlias, String[] args) {
    if (testPermission(sender)) {
      MinecraftServer.getServer().processQueue.add(new Runnable() {
        @Override
        public void run() {
          restart();
        }
      });
    }
    return true;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy