Repository: geysermc/geyser
Issue: Geyser does not shut down with /geyser shutdown, or Control-C after a player has joined

**Describe the bug**
`/geyser shutdown` does not fully shutdown Geyser after a player has joined through Geyser - in Linux, two Control-Cs are required to terminate the process.

**To Reproduce**
Steps to reproduce the behavior:
1. Run Geyser
2. Join Geyser
3. Try to shutdown Geyser

**Expected behavior**
Geyser cleanly shuts down.

**Geyser version**
Jenkins Inventory Latest


Changed files:
bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/console/GeyserLogger.java
connector/src/main/java/org/geysermc/connector/command/defaults/StopCommand.java
connector/src/main/java/org/geysermc/connector/GeyserConnector.java

diff --git a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/console/GeyserLogger.java b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/console/GeyserLogger.java
index 7df8a4ef..ac21215c 100644
--- a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/console/GeyserLogger.java
+++ b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/console/GeyserLogger.java
@@ -52,7 +52,7 @@ public class GeyserLogger extends SimpleTerminalConsole implements IGeyserLogger
 
     @Override
     protected void shutdown() {
-        GeyserConnector.getInstance().shutdown();
+        GeyserConnector.getInstance().getBootstrap().onDisable();
     }
 
     @Override
diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
index d33bda9a..714bd5ae 100644
--- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
+++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java
@@ -49,6 +49,7 @@ import java.net.InetSocketAddress;
 import java.text.DecimalFormat;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
 import java.util.UUID;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -142,6 +143,40 @@ public class GeyserConnector {
         bootstrap.getGeyserLogger().info("Shutting down Geyser.");
         shuttingDown = true;
 
+        if (players.size() >= 1) {
+            bootstrap.getGeyserLogger().info("Kicking " + players.size() + " player(s)");
+
+            for (GeyserSession playerSession : players.values()) {
+                playerSession.disconnect("Geyser Proxy shutting down.");
+            }
+
+            CompletableFuture<Void> future = CompletableFuture.runAsync(new Runnable() {
+                @Override
+                public void run() {
+                    // Simulate a long-running Job
+                    try {
+                        while (true) {
+                            if (players.size() == 0) {
+                                return;
+                            }
+
+                            TimeUnit.MILLISECONDS.sleep(100);
+                        }
+                    } catch (InterruptedException e) {
+                        throw new IllegalStateException(e);
+                    }
+                }
+            });
+
+            // Block and wait for the future to complete
+            try {
+                future.get();
+                bootstrap.getGeyserLogger().info("Kicked all players");
+            } catch (Exception e) {
+                // Quietly fail
+            }
+        }
+
         generalThreadPool.shutdown();
         bedrockServer.close();
         players.clear();
@@ -149,6 +184,8 @@ public class GeyserConnector {
         authType = null;
         commandMap.getCommands().clear();
         commandMap = null;
+
+        bootstrap.getGeyserLogger().info("Geyser shutdown successfully.");
     }
 
     public void addPlayer(GeyserSession player) {
diff --git a/connector/src/main/java/org/geysermc/connector/command/defaults/StopCommand.java b/connector/src/main/java/org/geysermc/connector/command/defaults/StopCommand.java
index 4694d0fd..2222cdef 100644
--- a/connector/src/main/java/org/geysermc/connector/command/defaults/StopCommand.java
+++ b/connector/src/main/java/org/geysermc/connector/command/defaults/StopCommand.java
@@ -48,6 +48,11 @@ public class StopCommand extends GeyserCommand {
         if (!sender.isConsole() && connector.getPlatformType() == PlatformType.STANDALONE) {
             return;
         }
+
         connector.shutdown();
+
+        if (connector.getPlatformType() == PlatformType.STANDALONE) {
+            System.exit(0);
+        }
     }
 }