CraftServer have a API to stop server?

Discussion in 'Plugin Development' started by d3x, Feb 8, 2011.

Thread Status:
Not open for further replies.
  1. Offline

    d3x

    I noticed Bukkit does not have API to ban a user/ip or to stop the server. I looked at how Essentials banned players and it uses a interesting work around.

    Code:
    ((CraftServer)plugin.getServer()).getHandle().a(user2ban);
    and

    Code:
    ((CraftServer)plugin.getServer()).getHandle().c(ip2ban);
    Tested and it works great!

    Now this has be wondering if there is a function in there to stop the server too![/code]
     
  2. Offline

    Kekec852

    Yes it is! In code section is hack for sending console command and stoping server (will do save-all stop).
    I mod code form folowing link:
    http://forums.bukkit.org/threads/send-commands-to-console.3241/

    If you want to compile this code you need to put CraftBukkit to classpath(Not Bukkit)

    Code:
    
        private static MinecraftServer mcServer;
        private static boolean mcServerHack = false;
        //this will do a hack to get MinecraftServer
    
    
        private void loadMCServer() {
            if (server instanceof CraftServer) {
                CraftServer s = (CraftServer) server;
                Field f;
                try {
                    f = CraftServer.class.getDeclaredField("console");
                    f.setAccessible(true);
                    mcServer = (MinecraftServer) f.get(s);
                    mcServerHack = true;
                } catch (Exception e) {
                    Logger.getLogger("Minecraft").log(Level.SEVERE, null, e);
                }
            }
        }
    
        public void stopServer(){
              mcServer.a();
         }
         public void sendServerCmd(String cmd, CommandSender sender){
              if (mcServerHack && !mcServer.g && MinecraftServer.a(mcServer)) {
                  mcServer.a(cmd, mcServer);
              else{
                   if (sender != null) {
                      sender.sendMessage(ChatColor.RED + "Can't send console command!");
                   } else {
                      Logger.getLogger("Minecraft").log(Level.WARNING, "Can't send console command!");
                   }
              }
         }
    
     
  3. Offline

    d3x

    Thanks for the link, I cleaned it up a bit so it can just be added to the plugin's main class.

    Code:
    //imports
    import java.lang.reflect.Field;
    import net.minecraft.server.MinecraftServer;
    import org.bukkit.craftbukkit.CraftServer;
    
    //add to main class
        public void consoleCommand(String cmd)
        {
            CraftServer craftserver = (CraftServer)this.getServer();
            Field field;
            try { field = CraftServer.class.getDeclaredField("console"); }
            catch (NoSuchFieldException ex) { l.info("consoleCommand: NoSuchFieldException"); return; }
            catch (SecurityException ex) { l.info("consoleCommand: SecurityException"); return; }
            MinecraftServer mcs;
            try { field.setAccessible(true); mcs = (MinecraftServer) field.get(craftserver); }
            catch (IllegalArgumentException ex) { l.info("consoleCommand: IllegalArgumentException"); return; }
            catch (IllegalAccessException ex) { l.info("consoleCommand: IllegalAccessException"); return; }
            if ( (!mcs.g) && (MinecraftServer.a(mcs)) )
                mcs.a(cmd, mcs);
        }
     
  4. Offline

    Kekec852

    Cool, but i forgot to write in my code you need to call loadMCServer() once and then sendConssoleCmc(). Becouse taht hack is using reflection and that is slow. That why I have two methods.
     
  5. Offline

    mkaltner

    This seems to work as of RB733:

    Code:
    public boolean consoleCommand(String cmd)
    {
        return plugin.getServer().dispatchCommand(new ConsoleCommandSender(plugin.getServer()), cmd);
    }
    
     
Thread Status:
Not open for further replies.

Share This Page