From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Sat, 15 May 2021 20:30:34 -0700
Subject: [PATCH] Add PlayerKickEvent causes


diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index 34b51466ffb281b05f531b3f7deda245ae7fd96a..a4b236d75e77176a163094edd31f81725bbf4eca 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
@@ -237,6 +237,14 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
      * @param message kick message
      */
     void kick(final @Nullable net.kyori.adventure.text.Component message);
+
+    /**
+     * Kicks player with custom kick message and cause.
+     *
+     * @param message kick message
+     * @param cause kick cause
+     */
+    void kick(final @Nullable Component message, @NotNull org.bukkit.event.player.PlayerKickEvent.Cause cause);
     // Paper end
 
     /**
diff --git a/src/main/java/org/bukkit/event/player/PlayerKickEvent.java b/src/main/java/org/bukkit/event/player/PlayerKickEvent.java
index 5c0efe74237dbe6803ce023fde99682ff70d1a92..02914c0743852e9e4fd2c085fd4b735e74d8875b 100644
--- a/src/main/java/org/bukkit/event/player/PlayerKickEvent.java
+++ b/src/main/java/org/bukkit/event/player/PlayerKickEvent.java
@@ -12,6 +12,7 @@ public class PlayerKickEvent extends PlayerEvent implements Cancellable {
     private static final HandlerList handlers = new HandlerList();
     private net.kyori.adventure.text.Component leaveMessage; // Paper
     private net.kyori.adventure.text.Component kickReason; // Paper
+    private final Cause cause; // Paper
     private Boolean cancel;
 
     @Deprecated // Paper
@@ -19,14 +20,25 @@ public class PlayerKickEvent extends PlayerEvent implements Cancellable {
         super(playerKicked);
         this.kickReason = org.bukkit.Bukkit.getUnsafe().legacyComponentSerializer().deserialize(kickReason); // Paper
         this.leaveMessage = org.bukkit.Bukkit.getUnsafe().legacyComponentSerializer().deserialize(leaveMessage); // Paper
+        this.cause  = Cause.UNKNOWN; // Paper
         this.cancel = false;
     }
     // Paper start
+    @Deprecated
     public PlayerKickEvent(@NotNull final Player playerKicked, @NotNull final net.kyori.adventure.text.Component kickReason, @NotNull final net.kyori.adventure.text.Component leaveMessage) {
         super(playerKicked);
         this.kickReason = kickReason;
         this.leaveMessage = leaveMessage;
         this.cancel = false;
+        this.cause = Cause.UNKNOWN;
+    }
+
+    public PlayerKickEvent(@NotNull final Player playerKicked, @NotNull final net.kyori.adventure.text.Component kickReason, @NotNull final net.kyori.adventure.text.Component leaveMessage, @NotNull final Cause cause) {
+        super(playerKicked);
+        this.kickReason = kickReason;
+        this.leaveMessage = leaveMessage;
+        this.cancel = false;
+        this.cause = cause;
     }
 
     /**
@@ -132,4 +144,63 @@ public class PlayerKickEvent extends PlayerEvent implements Cancellable {
     public static HandlerList getHandlerList() {
         return handlers;
     }
+    // Paper start
+    /**
+     * Gets the cause of this kick
+     *
+     * @return
+     */
+    @NotNull
+    public org.bukkit.event.player.PlayerKickEvent.Cause getCause() {
+        return cause;
+    }
+
+    public enum Cause {
+
+        PLUGIN,
+
+        WHITELIST,
+
+        BANNED,
+
+        IP_BANNED,
+
+        KICK_COMMAND,
+
+        FLYING_PLAYER,
+
+        FLYING_VEHICLE,
+
+        TIMEOUT,
+
+        IDLING,
+
+        INVALID_VEHICLE_MOVEMENT,
+
+        INVALID_PLAYER_MOVEMENT,
+
+        INVALID_ENTITY_ATTACKED,
+
+        INVALID_PAYLOAD,
+
+        SPAM,
+
+        ILLEGAL_ACTION,
+
+        ILLEGAL_CHARACTERS,
+
+        SELF_INTERACTION,
+
+        DUPLICATE_LOGIN,
+
+        /**
+         * Spigot's restart command
+         */
+        RESTART_COMMAND,
+        /**
+         * Fallback cause
+         */
+        UNKNOWN,
+    }
+    // Paper end
 }