From cca2920506a5e3b8460d12e89e60788bd5da251e Mon Sep 17 00:00:00 2001
From: md_5 <md_5@live.com.au>
Date: Sat, 23 Mar 2013 18:05:22 +1100
Subject: [PATCH] Move async checks to their own patch so we can add more of
 them.

---
 CraftBukkit-Patches/0002-Spigot-Changes.patch |  29 +---
 ...ch => 0005-Async-Operation-Catching.patch} |  23 ++-
 .../0027-Watchdog-Thread.patch                | 138 +++++++++++++++---
 ...ion-itself-instead-of-next-to-bed-Fi.patch |   6 +-
 .../0040-Entity-Tracking-Ranges.patch         |   6 +-
 .../0042-BungeeCord-Support.patch             |   6 +-
 .../0043-Texture-Pack-Resolutions.patch       |   8 +-
 7 files changed, 154 insertions(+), 62 deletions(-)
 rename CraftBukkit-Patches/{0005-Thread-safety.-Adds-thread-safety-for-chunk-load-unl.patch => 0005-Async-Operation-Catching.patch} (57%)

diff --git a/CraftBukkit-Patches/0002-Spigot-Changes.patch b/CraftBukkit-Patches/0002-Spigot-Changes.patch
index ce2d45e2b..b39da0576 100644
--- a/CraftBukkit-Patches/0002-Spigot-Changes.patch
+++ b/CraftBukkit-Patches/0002-Spigot-Changes.patch
@@ -1,6 +1,6 @@
-From 05108bcbeddcf5681feb3d5f7c986ce738cccbb8 Mon Sep 17 00:00:00 2001
+From 308eaa2dbd96b59ee9bdc253390679070bfd1533 Mon Sep 17 00:00:00 2001
 From: md_5 <md_5@live.com.au>
-Date: Sat, 23 Mar 2013 09:39:40 +1100
+Date: Sat, 23 Mar 2013 17:57:27 +1100
 Subject: [PATCH] Spigot Changes
 
 The set of changes which provide core Spigot functionality, which would otherwise be a mess to try and apply individually.
@@ -28,9 +28,8 @@ The set of changes which provide core Spigot functionality, which would otherwis
  .../java/org/bukkit/craftbukkit/CraftWorld.java    |  68 ++++++++++++-
  src/main/java/org/bukkit/craftbukkit/Spigot.java   |  20 ++++
  .../craftbukkit/chunkio/ChunkIOProvider.java       |   2 +-
- .../org/bukkit/craftbukkit/entity/CraftPlayer.java |   7 ++
  src/main/resources/configurations/bukkit.yml       |  25 +++++
- 25 files changed, 392 insertions(+), 78 deletions(-)
+ 24 files changed, 385 insertions(+), 78 deletions(-)
  create mode 100644 src/main/java/org/bukkit/craftbukkit/Spigot.java
 
 diff --git a/.gitignore b/.gitignore
@@ -978,28 +977,6 @@ index 48cf5ba..1d4764c 100644
              return;
          }
  
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 70111e7..1871d3e 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -213,10 +213,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
-     }
- 
-     public void kickPlayer(String message) {
-+        // Spigot start
-+        kickPlayer(message, false);
-+    }
-+
-+    public void kickPlayer(String message, boolean async){
-         if (getHandle().playerConnection == null) return;
-+        if (!async && !Bukkit.isPrimaryThread()) throw new IllegalStateException("Cannot kick player from asynchronous thread!"); // Spigot
- 
-         getHandle().playerConnection.disconnect(message == null ? "" : message);
-     }
-+    // Spigot end
- 
-     public void setCompassTarget(Location loc) {
-         if (getHandle().playerConnection == null) return;
 diff --git a/src/main/resources/configurations/bukkit.yml b/src/main/resources/configurations/bukkit.yml
 index 61a95e3..58501ea 100644
 --- a/src/main/resources/configurations/bukkit.yml
diff --git a/CraftBukkit-Patches/0005-Thread-safety.-Adds-thread-safety-for-chunk-load-unl.patch b/CraftBukkit-Patches/0005-Async-Operation-Catching.patch
similarity index 57%
rename from CraftBukkit-Patches/0005-Thread-safety.-Adds-thread-safety-for-chunk-load-unl.patch
rename to CraftBukkit-Patches/0005-Async-Operation-Catching.patch
index dc4381985..8355dba54 100644
--- a/CraftBukkit-Patches/0005-Thread-safety.-Adds-thread-safety-for-chunk-load-unl.patch
+++ b/CraftBukkit-Patches/0005-Async-Operation-Catching.patch
@@ -1,12 +1,13 @@
-From 60bfde2f20cab9fade83e6f34af2a2ee5ed168c9 Mon Sep 17 00:00:00 2001
+From 67cddbc9856c267a110cf7531b8fde518e327613 Mon Sep 17 00:00:00 2001
 From: md_5 <md_5@live.com.au>
 Date: Thu, 7 Mar 2013 20:12:46 +1100
-Subject: [PATCH] Thread safety. Adds thread safety for chunk load / unload
- methods.
+Subject: [PATCH] Async Operation Catching
 
+Catch and throw an exception when a potentially unsafe operation occurs on a thread other than the main server thread.
 ---
- src/main/java/org/bukkit/craftbukkit/CraftWorld.java | 3 +++
- 1 file changed, 3 insertions(+)
+ src/main/java/org/bukkit/craftbukkit/CraftWorld.java         | 3 +++
+ src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java | 1 +
+ 2 files changed, 4 insertions(+)
 
 diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
 index 9343d46..b569dc4 100644
@@ -36,6 +37,18 @@ index 9343d46..b569dc4 100644
          chunkLoadCount++;
          if (generate) {
              // Use the default variant of loadChunk when generate == true.
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 70111e7..59e63ef 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -213,6 +213,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+     }
+ 
+     public void kickPlayer(String message) {
++        if (Thread.currentThread() != MinecraftServer.getServer().primaryThread) throw new IllegalStateException("Asynchronous player kick!");
+         if (getHandle().playerConnection == null) return;
+ 
+         getHandle().playerConnection.disconnect(message == null ? "" : message);
 -- 
 1.8.1-rc2
 
diff --git a/CraftBukkit-Patches/0027-Watchdog-Thread.patch b/CraftBukkit-Patches/0027-Watchdog-Thread.patch
index 5c6afb6ff..1d4911f83 100644
--- a/CraftBukkit-Patches/0027-Watchdog-Thread.patch
+++ b/CraftBukkit-Patches/0027-Watchdog-Thread.patch
@@ -1,15 +1,15 @@
-From 63bf5cad042a511332edc488e25b53df78c64919 Mon Sep 17 00:00:00 2001
+From 82330dae19c04ca1d92033b449536f4f79d1e322 Mon Sep 17 00:00:00 2001
 From: md_5 <md_5@live.com.au>
 Date: Sat, 23 Feb 2013 12:33:20 +1100
 Subject: [PATCH] Watchdog Thread.
 
 ---
- .../java/net/minecraft/server/MinecraftServer.java |  2 +
- src/main/java/org/bukkit/craftbukkit/Spigot.java   | 78 +++++++++++++++++-
- src/main/java/org/spigotmc/RestartCommand.java     | 23 ++++++
- src/main/java/org/spigotmc/WatchdogThread.java     | 93 ++++++++++++++++++++++
- src/main/resources/configurations/bukkit.yml       |  3 +
- 5 files changed, 197 insertions(+), 2 deletions(-)
+ .../java/net/minecraft/server/MinecraftServer.java |   2 +
+ src/main/java/org/bukkit/craftbukkit/Spigot.java   | 123 +++++++++++++++++----
+ src/main/java/org/spigotmc/RestartCommand.java     |  23 ++++
+ src/main/java/org/spigotmc/WatchdogThread.java     |  93 ++++++++++++++++
+ src/main/resources/configurations/bukkit.yml       |   3 +
+ 5 files changed, 222 insertions(+), 22 deletions(-)
  create mode 100644 src/main/java/org/spigotmc/RestartCommand.java
  create mode 100644 src/main/java/org/spigotmc/WatchdogThread.java
 
@@ -34,7 +34,7 @@ index 28135f4..3689a3d 100644
                  this.isStopped = true;
              } catch (Throwable throwable1) {
 diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java
-index b00c885..dcfac79 100644
+index b00c885..d445c2e 100644
 --- a/src/main/java/org/bukkit/craftbukkit/Spigot.java
 +++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
 @@ -1,5 +1,6 @@
@@ -44,20 +44,29 @@ index b00c885..dcfac79 100644
  import java.io.IOException;
  import java.util.ArrayList;
  import net.minecraft.server.*;
-@@ -8,9 +9,11 @@ import org.bukkit.configuration.file.YamlConfiguration;
+@@ -8,21 +9,24 @@ import org.bukkit.configuration.file.YamlConfiguration;
  
  import java.util.List;
  import java.util.logging.Level;
 -import java.util.logging.Logger;
++import net.minecraft.server.EntityPlayer;
  import org.bukkit.Bukkit;
-+import org.bukkit.entity.Player;
  import org.spigotmc.Metrics;
 +import org.spigotmc.RestartCommand;
 +import org.spigotmc.WatchdogThread;
  
  public class Spigot {
-     static AxisAlignedBB maxBB = AxisAlignedBB.a(0,0,0,0,0,0);
-@@ -23,6 +26,7 @@ public class Spigot {
+-    static AxisAlignedBB maxBB = AxisAlignedBB.a(0,0,0,0,0,0);
+-    static AxisAlignedBB miscBB = AxisAlignedBB.a(0,0,0,0,0,0);
+-    static AxisAlignedBB animalBB = AxisAlignedBB.a(0,0,0,0,0,0);
+-    static AxisAlignedBB monsterBB = AxisAlignedBB.a(0,0,0,0,0,0);
+ 
++    static AxisAlignedBB maxBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0);
++    static AxisAlignedBB miscBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0);
++    static AxisAlignedBB animalBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0);
++    static AxisAlignedBB monsterBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0);
+     public static boolean tabPing = false;
+     private static Metrics metrics;
  
      public static void initialize(CraftServer server, SimpleCommandMap commandMap, YamlConfiguration configuration) {
          commandMap.register("bukkit", new org.bukkit.craftbukkit.command.TicksPerSecondCommand("tps"));
@@ -91,7 +100,100 @@ index b00c885..dcfac79 100644
          }
  
          if (server.chunkGCPeriod == 0) {
-@@ -265,4 +280,63 @@ public class Spigot {
+@@ -59,6 +74,7 @@ public class Spigot {
+     /**
+      * Initializes an entities type on construction to specify what group this
+      * entity is in for activation ranges.
++     *
+      * @param entity
+      * @return group id
+      */
+@@ -80,21 +96,20 @@ public class Spigot {
+      * @return boolean If it should always tick.
+      */
+     public static boolean initializeEntityActivationState(Entity entity, CraftWorld world) {
+-        if (   (entity.activationType == 3 && world.miscEntityActivationRange == 0)
+-            || (entity.activationType == 2 && world.animalEntityActivationRange == 0)
+-            || (entity.activationType == 1 && world.monsterEntityActivationRange == 0)
+-            || entity instanceof EntityHuman
+-            || entity instanceof EntityItemFrame
+-            || entity instanceof EntityProjectile
+-            || entity instanceof EntityEnderDragon
+-            || entity instanceof EntityComplexPart
+-            || entity instanceof EntityWither
+-            || entity instanceof EntityFireball
+-            || entity instanceof EntityWeather
+-            || entity instanceof EntityTNTPrimed
+-            || entity instanceof EntityEnderCrystal
+-            || entity instanceof EntityFireworks
+-            ) {
++        if ((entity.activationType == 3 && world.miscEntityActivationRange == 0)
++                || (entity.activationType == 2 && world.animalEntityActivationRange == 0)
++                || (entity.activationType == 1 && world.monsterEntityActivationRange == 0)
++                || entity instanceof EntityHuman
++                || entity instanceof EntityItemFrame
++                || entity instanceof EntityProjectile
++                || entity instanceof EntityEnderDragon
++                || entity instanceof EntityComplexPart
++                || entity instanceof EntityWither
++                || entity instanceof EntityFireball
++                || entity instanceof EntityWeather
++                || entity instanceof EntityTNTPrimed
++                || entity instanceof EntityEnderCrystal
++                || entity instanceof EntityFireworks) {
+             return true;
+         }
+ 
+@@ -104,6 +119,7 @@ public class Spigot {
+     /**
+      * Utility method to grow an AABB without creating a new AABB or touching
+      * the pool, so we can re-use ones we have.
++     *
+      * @param target
+      * @param source
+      * @param x
+@@ -122,6 +138,7 @@ public class Spigot {
+     /**
+      * Find what entities are in range of the players in the world and set
+      * active if in range.
++     *
+      * @param world
+      */
+     public static void activateEntities(World world) {
+@@ -160,6 +177,7 @@ public class Spigot {
+ 
+     /**
+      * Checks for the activation state of all entities in this chunk.
++     *
+      * @param chunk
+      */
+     private static void activateChunkEntities(Chunk chunk) {
+@@ -195,6 +213,7 @@ public class Spigot {
+     /**
+      * If an entity is not in range, do some more checks to see if we should
+      * give it a shot.
++     *
+      * @param entity
+      * @return
+      */
+@@ -205,7 +224,7 @@ public class Spigot {
+         }
+         if (!(entity instanceof EntityArrow)) {
+             if (!entity.onGround || entity.passenger != null
+-                || entity.vehicle != null) {
++                    || entity.vehicle != null) {
+                 return true;
+             }
+         } else if (!((EntityArrow) entity).inGround) {
+@@ -235,6 +254,7 @@ public class Spigot {
+ 
+     /**
+      * Checks if the entity is active for this tick.
++     *
+      * @param entity
+      * @return
+      */
+@@ -265,4 +285,63 @@ public class Spigot {
          SpigotTimings.checkIfActiveTimer.stopTiming();
          return isActive;
      }
@@ -104,8 +206,8 @@ index b00c885..dcfac79 100644
 +                System.out.println("Attempting to restart with " + startupScript);
 +
 +                // Kick all players
-+                for (Player p : Bukkit.getServer().getOnlinePlayers()) {
-+                   ((org.bukkit.craftbukkit.entity.CraftPlayer) p).kickPlayer("Server is restarting", true);
++                for (EntityPlayer p : (List< EntityPlayer>) MinecraftServer.getServer().getPlayerList().players) {
++                    p.playerConnection.disconnect("Server is restarting");
 +                }
 +                // Give the socket a chance to send the packets
 +                try {
@@ -130,15 +232,15 @@ index b00c885..dcfac79 100644
 +                // This will be done AFTER the server has completely halted
 +                Thread shutdownHook = new Thread() {
 +                    @Override
-+                    public void run(){
++                    public void run() {
 +                        try {
 +                            String os = System.getProperty("os.name").toLowerCase();
 +                            if (os.contains("win")) {
 +                                Runtime.getRuntime().exec("cmd /c start " + file.getPath());
 +                            } else {
-+                                Runtime.getRuntime().exec(new String[] { "sh", file.getPath()});
++                                Runtime.getRuntime().exec(new String[]{"sh", file.getPath()});
 +                            }
-+                        } catch (Exception e){
++                        } catch (Exception e) {
 +                            e.printStackTrace();
 +                        }
 +                    }
diff --git a/CraftBukkit-Patches/0030-Return-bed-location-itself-instead-of-next-to-bed-Fi.patch b/CraftBukkit-Patches/0030-Return-bed-location-itself-instead-of-next-to-bed-Fi.patch
index 193347b17..11d7447b1 100644
--- a/CraftBukkit-Patches/0030-Return-bed-location-itself-instead-of-next-to-bed-Fi.patch
+++ b/CraftBukkit-Patches/0030-Return-bed-location-itself-instead-of-next-to-bed-Fi.patch
@@ -1,4 +1,4 @@
-From 38f144fcd9d44015bb3db3530742c12708b49dfe Mon Sep 17 00:00:00 2001
+From f9ec6953de1d80b95eea4b195973b9dda36f5e0f Mon Sep 17 00:00:00 2001
 From: EdGruberman <ed@rjump.com>
 Date: Fri, 22 Feb 2013 09:23:51 -0700
 Subject: [PATCH] Return bed location itself instead of next to bed; Fixes
@@ -9,10 +9,10 @@ Subject: [PATCH] Return bed location itself instead of next to bed; Fixes
  1 file changed, 20 insertions(+), 2 deletions(-)
 
 diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 1871d3e..2e58bf0 100644
+index 59e63ef..3c34a4c 100644
 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
 +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -632,10 +632,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -626,10 +626,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
          ChunkCoordinates bed = getHandle().getBed();
  
          if (world != null && bed != null) {
diff --git a/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch b/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch
index 55dea1e22..5ac2a5404 100644
--- a/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch
+++ b/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch
@@ -1,4 +1,4 @@
-From 9e7503dbe6691e74f3ef4d864b459da13597cb29 Mon Sep 17 00:00:00 2001
+From bc6b6883004dfcf9bae2842933ae9603f720412b Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Wed, 20 Feb 2013 11:58:47 -0500
 Subject: [PATCH] Entity Tracking Ranges
@@ -83,10 +83,10 @@ index 3bfc669..804da57 100644
  
      public Block getBlockAt(int x, int y, int z) {
 diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java
-index dcfac79..beab433 100644
+index d445c2e..3bfd29b 100644
 --- a/src/main/java/org/bukkit/craftbukkit/Spigot.java
 +++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
-@@ -339,4 +339,30 @@ public class Spigot {
+@@ -344,4 +344,30 @@ public class Spigot {
              ex.printStackTrace();
          }
      }
diff --git a/CraftBukkit-Patches/0042-BungeeCord-Support.patch b/CraftBukkit-Patches/0042-BungeeCord-Support.patch
index ea33e6ff5..78b4af766 100644
--- a/CraftBukkit-Patches/0042-BungeeCord-Support.patch
+++ b/CraftBukkit-Patches/0042-BungeeCord-Support.patch
@@ -1,4 +1,4 @@
-From 2e0bd90323900b7b0e85d8b8fdefac11564a6aa7 Mon Sep 17 00:00:00 2001
+From f081be9a6ac0b77c3776bfb3c058a65db932e80f Mon Sep 17 00:00:00 2001
 From: md_5 <md_5@live.com.au>
 Date: Sat, 23 Mar 2013 11:15:11 +1100
 Subject: [PATCH] BungeeCord Support
@@ -33,11 +33,11 @@ index 58687ed..ae73a43 100644
 +    // Spigot end
  }
 diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java
-index beab433..9a01674 100644
+index 3bfd29b..bce217e 100644
 --- a/src/main/java/org/bukkit/craftbukkit/Spigot.java
 +++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
 @@ -23,6 +23,7 @@ public class Spigot {
- 
+     static AxisAlignedBB monsterBB = AxisAlignedBB.a(0, 0, 0, 0, 0, 0);
      public static boolean tabPing = false;
      private static Metrics metrics;
 +    public static List<String> bungeeIPs;
diff --git a/CraftBukkit-Patches/0043-Texture-Pack-Resolutions.patch b/CraftBukkit-Patches/0043-Texture-Pack-Resolutions.patch
index e1dd3b5ec..bbf54702a 100644
--- a/CraftBukkit-Patches/0043-Texture-Pack-Resolutions.patch
+++ b/CraftBukkit-Patches/0043-Texture-Pack-Resolutions.patch
@@ -1,4 +1,4 @@
-From d8572c7da59ef43d0adf53e4dff7400b00bb9e12 Mon Sep 17 00:00:00 2001
+From 4a8f60ad4f5babc013cd49f510bea117f9356cc3 Mon Sep 17 00:00:00 2001
 From: md_5 <md_5@live.com.au>
 Date: Sat, 23 Mar 2013 13:04:45 +1100
 Subject: [PATCH] Texture Pack Resolutions
@@ -25,7 +25,7 @@ index 3689a3d..9a78084 100644
  
      public abstract boolean T();
 diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java
-index 9a01674..cf17b5a 100644
+index bce217e..8fd635f 100644
 --- a/src/main/java/org/bukkit/craftbukkit/Spigot.java
 +++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
 @@ -24,6 +24,7 @@ public class Spigot {
@@ -45,10 +45,10 @@ index 9a01674..cf17b5a 100644
          if (metrics == null) {
              try {
 diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 2e58bf0..d7a3bc7 100644
+index 3c34a4c..8361614 100644
 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
 +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -834,7 +834,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -828,7 +828,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
      public void setTexturePack(String url) {
          Validate.notNull(url, "Texture pack URL cannot be null");