From 8bf65f28726a7914028b90806c195a479005ed5d Mon Sep 17 00:00:00 2001
From: Shane Freeder <theboyetronic@gmail.com>
Date: Mon, 16 Jul 2018 21:08:09 +0100
Subject: [PATCH] NOT FINISHED! even more 1.13-pre patches!

---
 ...ve-invalid-mob-spawner-tile-entities.patch |   6 +-
 ...nilla-per-world-scoreboard-coloring-.patch |  10 +-
 ...08-Implement-PlayerLocaleChangeEvent.patch |   6 +-
 ...1-Vehicle-Event-Cancellation-Changes.patch |   8 +-
 ...-Ensure-Chunks-never-ever-load-async.patch |  13 +-
 ...nk-Unloads-based-on-Player-Movement.patch} |  69 +++++------
 ...=> 0129-Fix-Double-World-Add-issues.patch} |  18 +--
 .../0130-Fix-Old-Sign-Conversion.patch        | 116 ++++++++++++++++++
 ...-profiles-that-have-no-UUID-and-no-.patch} |   4 +-
 ...ative-vehicle-moved-wrongly-message.patch} |   8 +-
 ...rs-that-dismount-from-other-players.patch} |   6 +-
 ...etting-for-proxy-online-mode-status.patch} |  14 +--
 ...-BlockStateEnum-hashCode-and-equals.patch} |  42 +++----
 ...0136-Disable-ticking-of-snow-blocks.patch} |  19 +--
 ...37-Fix-AIOOBE-in-inventory-handling.patch} |  14 +--
 ...nfigurable-packet-in-spam-threshold.patch} |   6 +-
 ...9-Configurable-flying-kick-messages.patch} |  17 ++-
 ...atch => 0140-Auto-Save-Improvements.patch} |  84 ++++++-------
 ...ch => 0141-Chunk-registration-fixes.patch} |   8 +-
 ...k-reference-on-Craft-Entity-removal.patch} |  13 +-
 ...to-fix-bad-Y-levels-on-player-login.patch} |  10 +-
 ...ch => 0144-Disable-Vanilla-Chunk-GC.patch} |   8 +-
 ...ion-to-remove-corrupt-tile-entities.patch} |  12 +-
 ...nt.patch => 0146-Add-EntityZapEvent.patch} |  18 +--
 .../0146-Fix-Old-Sign-Conversion.patch        |  71 -----------
 ...Chunks-from-Hoppers-and-other-things.patch |  35 ++++++
 ...ent-Auto-Save-if-Save-Queue-is-full.patch} |  28 ++---
 ... 0149-Chunk-Save-Stats-Debug-Option.patch} |  40 +++---
 ...-from-ArmorStand-and-SpawnEgg-items.patch} |  41 ++-----
 ...51-Cache-user-authenticator-threads.patch} |  25 ++--
 .../0152-Optimize-Network-Queue.patch         |  22 ++++
 ....patch => 0153-Optimise-removeQueue.patch} |  32 ++---
 ...-Allow-Reloading-of-Command-Aliases.patch} |   6 +-
 ...-Add-source-to-PlayerExpChangeEvent.patch} |  18 +--
 ...imize-World.isLoaded-BlockPosition-Z.patch |  25 ++++
 ...-Don-t-let-fishinghooks-use-portals.patch} |  20 +--
 ... => 0158-Add-ProjectileCollideEvent.patch} |  29 ++---
 ...tring-limit-for-packet-serialization.patch |  27 ----
 ...Chunks-from-Hoppers-and-other-things.patch |  36 ------
 .../0169-Optimize-Network-Queue.patch         |  22 ----
 ...imize-World.isLoaded-BlockPosition-Z.patch |  23 ----
 ...-Speedup-BlockPos-by-fixing-inlining.patch |   0
 work/CraftBukkit                              |   2 +-
 43 files changed, 513 insertions(+), 518 deletions(-)
 rename Spigot-Server-Patches/{0143-Delay-Chunk-Unloads-based-on-Player-Movement.patch => 0128-Delay-Chunk-Unloads-based-on-Player-Movement.patch} (78%)
 rename Spigot-Server-Patches/{0145-Fix-Double-World-Add-issues.patch => 0129-Fix-Double-World-Add-issues.patch} (64%)
 create mode 100644 Spigot-Server-Patches/0130-Fix-Old-Sign-Conversion.patch
 rename Spigot-Server-Patches/{0147-Don-t-lookup-game-profiles-that-have-no-UUID-and-no-.patch => 0131-Don-t-lookup-game-profiles-that-have-no-UUID-and-no-.patch} (90%)
 rename Spigot-Server-Patches/{0148-More-informative-vehicle-moved-wrongly-message.patch => 0132-More-informative-vehicle-moved-wrongly-message.patch} (81%)
 rename Spigot-Server-Patches/{0149-Re-track-players-that-dismount-from-other-players.patch => 0133-Re-track-players-that-dismount-from-other-players.patch} (86%)
 rename Spigot-Server-Patches/{0150-Add-setting-for-proxy-online-mode-status.patch => 0134-Add-setting-for-proxy-online-mode-status.patch} (88%)
 rename Spigot-Server-Patches/{0151-Optimise-BlockStateEnum-hashCode-and-equals.patch => 0135-Optimise-BlockStateEnum-hashCode-and-equals.patch} (61%)
 rename Spigot-Server-Patches/{0152-Disable-ticking-of-snow-blocks.patch => 0136-Disable-ticking-of-snow-blocks.patch} (51%)
 rename Spigot-Server-Patches/{0153-Fix-AIOOBE-in-inventory-handling.patch => 0137-Fix-AIOOBE-in-inventory-handling.patch} (64%)
 rename Spigot-Server-Patches/{0154-Configurable-packet-in-spam-threshold.patch => 0138-Configurable-packet-in-spam-threshold.patch} (91%)
 rename Spigot-Server-Patches/{0155-Configurable-flying-kick-messages.patch => 0139-Configurable-flying-kick-messages.patch} (80%)
 rename Spigot-Server-Patches/{0156-Auto-Save-Improvements.patch => 0140-Auto-Save-Improvements.patch} (78%)
 rename Spigot-Server-Patches/{0157-Chunk-registration-fixes.patch => 0141-Chunk-registration-fixes.patch} (72%)
 rename Spigot-Server-Patches/{0158-Remove-FishingHook-reference-on-Craft-Entity-removal.patch => 0142-Remove-FishingHook-reference-on-Craft-Entity-removal.patch} (58%)
 rename Spigot-Server-Patches/{0159-Auto-fix-bad-Y-levels-on-player-login.patch => 0143-Auto-fix-bad-Y-levels-on-player-login.patch} (73%)
 rename Spigot-Server-Patches/{0161-Disable-Vanilla-Chunk-GC.patch => 0144-Disable-Vanilla-Chunk-GC.patch} (79%)
 rename Spigot-Server-Patches/{0162-Option-to-remove-corrupt-tile-entities.patch => 0145-Option-to-remove-corrupt-tile-entities.patch} (79%)
 rename Spigot-Server-Patches/{0163-Add-EntityZapEvent.patch => 0146-Add-EntityZapEvent.patch} (85%)
 delete mode 100644 Spigot-Server-Patches/0146-Fix-Old-Sign-Conversion.patch
 create mode 100644 Spigot-Server-Patches/0147-Don-t-load-Chunks-from-Hoppers-and-other-things.patch
 rename Spigot-Server-Patches/{0165-Prevent-Auto-Save-if-Save-Queue-is-full.patch => 0148-Prevent-Auto-Save-if-Save-Queue-is-full.patch} (78%)
 rename Spigot-Server-Patches/{0166-Chunk-Save-Stats-Debug-Option.patch => 0149-Chunk-Save-Stats-Debug-Option.patch} (77%)
 rename Spigot-Server-Patches/{0167-Filter-bad-data-from-ArmorStand-and-SpawnEgg-items.patch => 0150-Filter-bad-data-from-ArmorStand-and-SpawnEgg-items.patch} (55%)
 rename Spigot-Server-Patches/{0168-Cache-user-authenticator-threads.patch => 0151-Cache-user-authenticator-threads.patch} (69%)
 create mode 100644 Spigot-Server-Patches/0152-Optimize-Network-Queue.patch
 rename Spigot-Server-Patches/{0170-Optimise-removeQueue.patch => 0153-Optimise-removeQueue.patch} (72%)
 rename Spigot-Server-Patches/{0171-Allow-Reloading-of-Command-Aliases.patch => 0154-Allow-Reloading-of-Command-Aliases.patch} (89%)
 rename Spigot-Server-Patches/{0172-Add-source-to-PlayerExpChangeEvent.patch => 0155-Add-source-to-PlayerExpChangeEvent.patch} (80%)
 create mode 100644 Spigot-Server-Patches/0156-Optimize-World.isLoaded-BlockPosition-Z.patch
 rename Spigot-Server-Patches/{0175-Don-t-let-fishinghooks-use-portals.patch => 0157-Don-t-let-fishinghooks-use-portals.patch} (69%)
 rename Spigot-Server-Patches/{0176-Add-ProjectileCollideEvent.patch => 0158-Add-ProjectileCollideEvent.patch} (87%)
 delete mode 100644 Spigot-Server-Patches/0160-Raise-string-limit-for-packet-serialization.patch
 delete mode 100644 Spigot-Server-Patches/0164-Don-t-load-Chunks-from-Hoppers-and-other-things.patch
 delete mode 100644 Spigot-Server-Patches/0169-Optimize-Network-Queue.patch
 delete mode 100644 Spigot-Server-Patches/0173-Optimize-World.isLoaded-BlockPosition-Z.patch
 rename {Spigot-Server-Patches => removed}/0174-Speedup-BlockPos-by-fixing-inlining.patch (100%)

diff --git a/Spigot-Server-Patches/0019-Remove-invalid-mob-spawner-tile-entities.patch b/Spigot-Server-Patches/0019-Remove-invalid-mob-spawner-tile-entities.patch
index 7f79f932f..9756b4893 100644
--- a/Spigot-Server-Patches/0019-Remove-invalid-mob-spawner-tile-entities.patch
+++ b/Spigot-Server-Patches/0019-Remove-invalid-mob-spawner-tile-entities.patch
@@ -1,11 +1,11 @@
-From 7bff1557c12e7c7c67a4901f488a7ff95605603e Mon Sep 17 00:00:00 2001
+From ab5cb9f6f247e8ddd7219a298e41a4f5fffab5e5 Mon Sep 17 00:00:00 2001
 From: Byteflux <byte@byteflux.net>
 Date: Tue, 1 Mar 2016 15:08:03 -0600
 Subject: [PATCH] Remove invalid mob spawner tile entities
 
 
 diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
-index 3b97981bc..36ea4ad47 100644
+index 3b97981bc..4a4cc6c59 100644
 --- a/src/main/java/net/minecraft/server/Chunk.java
 +++ b/src/main/java/net/minecraft/server/Chunk.java
 @@ -777,6 +777,10 @@ public class Chunk implements IChunkAccess {
@@ -13,7 +13,7 @@ index 3b97981bc..36ea4ad47 100644
              this.tileEntities.put(blockposition, tileentity);
              // CraftBukkit start
 +            // Paper start - Remove invalid mob spawner tile entities
-+        } else if (tileentity instanceof TileEntityMobSpawner && org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(getBlockData(blockposition).getBlock()) != org.bukkit.Material.MOB_SPAWNER) {
++        } else if (tileentity instanceof TileEntityMobSpawner && !(getBlockData(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getBlock() instanceof BlockMobSpawner)) {
 +            this.tileEntities.remove(blockposition);
 +            // Paper end
          } else {
diff --git a/Spigot-Server-Patches/0100-Option-to-use-vanilla-per-world-scoreboard-coloring-.patch b/Spigot-Server-Patches/0100-Option-to-use-vanilla-per-world-scoreboard-coloring-.patch
index b74935465..86f4a387d 100644
--- a/Spigot-Server-Patches/0100-Option-to-use-vanilla-per-world-scoreboard-coloring-.patch
+++ b/Spigot-Server-Patches/0100-Option-to-use-vanilla-per-world-scoreboard-coloring-.patch
@@ -1,4 +1,4 @@
-From d8dc035a4c4013dbfc42842f5233022488a2649c Mon Sep 17 00:00:00 2001
+From 165e6010c2951073c778f6d62469189754781c94 Mon Sep 17 00:00:00 2001
 From: Zach Brown <zach.brown@destroystokyo.com>
 Date: Wed, 6 Apr 2016 01:04:23 -0500
 Subject: [PATCH] Option to use vanilla per-world scoreboard coloring on names
@@ -19,19 +19,19 @@ index 6ac58e5ec..ff9929a05 100644
 +    }
  }
 diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
-index c37c46e71..fecf29710 100644
+index c37c46e71..88092d823 100644
 --- a/src/main/java/net/minecraft/server/Entity.java
 +++ b/src/main/java/net/minecraft/server/Entity.java
 @@ -2251,6 +2251,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
          return this.getFlag(5);
      }
  
-+    @Nullable public ScoreboardTeamBase getTeam() { return this.aY(); } // Paper - OBFHELPER
++    @Nullable public ScoreboardTeamBase getTeam() { return this.be(); } // Paper - OBFHELPER
      @Nullable
      public ScoreboardTeamBase be() {
          if (!this.world.paperConfig.nonPlayerEntitiesOnScoreboards && !(this instanceof EntityHuman)) { return null; } // Paper
 diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
-index 553011d88..d61ce6461 100644
+index 553011d88..65fa09a01 100644
 --- a/src/main/java/net/minecraft/server/PlayerConnection.java
 +++ b/src/main/java/net/minecraft/server/PlayerConnection.java
 @@ -1622,7 +1622,14 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
@@ -42,7 +42,7 @@ index 553011d88..d61ce6461 100644
 +                // Paper Start - (Meh) Support for vanilla world scoreboard name coloring
 +                String displayName = event.getPlayer().getDisplayName();
 +                if (this.player.getWorld().paperConfig.useVanillaScoreboardColoring) {
-+                    displayName = ScoreboardTeam.getPlayerDisplayName(this.player.getTeam(), player.getDisplayName());
++                    displayName = CraftChatMessage.fromComponent(ScoreboardTeam.a(this.player.getTeam(),((CraftPlayer) player).getHandle().getDisplayName()));
 +                }
 +
 +                s = String.format(event.getFormat(), displayName, event.getMessage());
diff --git a/Spigot-Server-Patches/0108-Implement-PlayerLocaleChangeEvent.patch b/Spigot-Server-Patches/0108-Implement-PlayerLocaleChangeEvent.patch
index 78e0a46d8..3873a1a60 100644
--- a/Spigot-Server-Patches/0108-Implement-PlayerLocaleChangeEvent.patch
+++ b/Spigot-Server-Patches/0108-Implement-PlayerLocaleChangeEvent.patch
@@ -1,11 +1,11 @@
-From 7c0d5e351e70cae45275be880bb19b15859894fe Mon Sep 17 00:00:00 2001
+From 3fc405ea7cc11069a684deb236861ad238e41efd Mon Sep 17 00:00:00 2001
 From: Isaac Moore <rmsy@me.com>
 Date: Tue, 19 Apr 2016 14:09:31 -0500
 Subject: [PATCH] Implement PlayerLocaleChangeEvent
 
 
 diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
-index 5ca0dec1f..8b5cfc78a 100644
+index 55eaa89f6..8b5cfc78a 100644
 --- a/src/main/java/net/minecraft/server/EntityPlayer.java
 +++ b/src/main/java/net/minecraft/server/EntityPlayer.java
 @@ -37,7 +37,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
@@ -21,7 +21,7 @@ index 5ca0dec1f..8b5cfc78a 100644
              PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(getBukkitEntity(), getMainHand() == EnumMainHand.LEFT ? MainHand.LEFT : MainHand.RIGHT);
              this.server.server.getPluginManager().callEvent(event);
          }
--        if (!this.locale.equals(packetplayinsettings.a())) {
+-        if (!this.locale.equals(packetplayinsettings.b())) {
 +        if (this.locale == null || !this.locale.equals(packetplayinsettings.b())) { // Paper - fix bug and check for null
              PlayerLocaleChangeEvent event = new PlayerLocaleChangeEvent(getBukkitEntity(), packetplayinsettings.b());
              this.server.server.getPluginManager().callEvent(event);
diff --git a/Spigot-Server-Patches/0111-Vehicle-Event-Cancellation-Changes.patch b/Spigot-Server-Patches/0111-Vehicle-Event-Cancellation-Changes.patch
index 9fd45005f..07193c63f 100644
--- a/Spigot-Server-Patches/0111-Vehicle-Event-Cancellation-Changes.patch
+++ b/Spigot-Server-Patches/0111-Vehicle-Event-Cancellation-Changes.patch
@@ -1,11 +1,11 @@
-From e27e2dd897b4f710aad5f7ac293ca48ffad02fcb Mon Sep 17 00:00:00 2001
+From 47d3cf8ea0a9e7d17cf085f1489ecb34c1331407 Mon Sep 17 00:00:00 2001
 From: Zach Brown <zach.brown@destroystokyo.com>
 Date: Fri, 22 Apr 2016 18:20:05 -0500
 Subject: [PATCH] Vehicle Event Cancellation Changes
 
 
 diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
-index fecf29710..115504bf6 100644
+index fecf29710..85e5a0a4c 100644
 --- a/src/main/java/net/minecraft/server/Entity.java
 +++ b/src/main/java/net/minecraft/server/Entity.java
 @@ -80,7 +80,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
@@ -13,7 +13,7 @@ index fecf29710..115504bf6 100644
      public final List<Entity> passengers;
      protected int k;
 -    private Entity ax;
-+    private Entity ax;public void setVehicle(Entity entity) { this.au = entity; } // Paper // OBFHELPER
++    private Entity ax;public void setVehicle(Entity entity) { this.ax = entity; } // Paper - OBFHELPER
      public boolean attachedToPlayer;
      public World world;
      public double lastX;
@@ -41,5 +41,5 @@ index fecf29710..115504bf6 100644
              entity.k = 60;
          }
 -- 
-2.17.1
+2.18.0
 
diff --git a/Spigot-Server-Patches/0125-Ensure-Chunks-never-ever-load-async.patch b/Spigot-Server-Patches/0125-Ensure-Chunks-never-ever-load-async.patch
index 9b0bb41a1..484969f6e 100644
--- a/Spigot-Server-Patches/0125-Ensure-Chunks-never-ever-load-async.patch
+++ b/Spigot-Server-Patches/0125-Ensure-Chunks-never-ever-load-async.patch
@@ -1,4 +1,4 @@
-From 3f8a86086738570a1913027002282e9644e5a40c Mon Sep 17 00:00:00 2001
+From a9063e4c96a63299f95371c012667bef2f741867 Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Fri, 27 May 2016 21:41:26 -0400
 Subject: [PATCH] Ensure Chunks never ever load async
@@ -27,18 +27,21 @@ index 7b7a3d01b..9aaca21a7 100644
  
      public static void queueChunkLoad(World world, ChunkRegionLoader loader, ChunkProviderServer provider, int x, int z, Runnable runnable) {
 diff --git a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java
-index 52a8c48fa..a4fcdbe04 100644
+index 52a8c48fa..2bbd5a7e2 100644
 --- a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java
 +++ b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java
-@@ -35,7 +35,7 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChu
+@@ -35,9 +35,9 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChu
  
      // sync stuff
      public void callStage2(QueuedChunk queuedChunk, Chunk chunk) throws RuntimeException {
 -        if (chunk == null) {
 +        if (chunk == null || queuedChunk.provider.chunks.containsKey(ChunkCoordIntPair.a(queuedChunk.x, queuedChunk.z))) { // Paper - also call original if it was already loaded
              // If the chunk loading failed just do it synchronously (may generate)
-             // queuedChunk.provider.originalGetChunkAt(queuedChunk.x, queuedChunk.z);
+-            // queuedChunk.provider.originalGetChunkAt(queuedChunk.x, queuedChunk.z);
++            queuedChunk.provider.getChunkAt(queuedChunk.x, queuedChunk.z); // Paper - actually call original if it was already loaded
              return;
+         }
+         try (Timing ignored = queuedChunk.provider.world.timings.chunkIOStage2.startTimingIfSync()) { // Paper
 -- 
-2.17.1
+2.18.0
 
diff --git a/Spigot-Server-Patches/0143-Delay-Chunk-Unloads-based-on-Player-Movement.patch b/Spigot-Server-Patches/0128-Delay-Chunk-Unloads-based-on-Player-Movement.patch
similarity index 78%
rename from Spigot-Server-Patches/0143-Delay-Chunk-Unloads-based-on-Player-Movement.patch
rename to Spigot-Server-Patches/0128-Delay-Chunk-Unloads-based-on-Player-Movement.patch
index 7b2c2f1c5..3fca908c6 100644
--- a/Spigot-Server-Patches/0143-Delay-Chunk-Unloads-based-on-Player-Movement.patch
+++ b/Spigot-Server-Patches/0128-Delay-Chunk-Unloads-based-on-Player-Movement.patch
@@ -1,4 +1,4 @@
-From f4451963bcdefb63b5331539e134a7d553c06fe0 Mon Sep 17 00:00:00 2001
+From 9ea3a3e7a7eb8e3e4d3c6289684125f195081e0e Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Sat, 18 Jun 2016 23:22:12 -0400
 Subject: [PATCH] Delay Chunk Unloads based on Player Movement
@@ -17,12 +17,12 @@ This allows servers with smaller worlds who do less long distance exploring to s
 wasting cpu cycles on saving/unloading/reloading chunks repeatedly.
 
 diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index ce43e7bb7..e35e72e8b 100644
+index 321da3be3..0e6c18b32 100644
 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
 +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -344,4 +344,18 @@ public class PaperWorldConfig {
-     private void isHopperPushBased() {
-         isHopperPushBased = getBoolean("hopper.push-based", false);
+@@ -284,4 +284,18 @@ public class PaperWorldConfig {
+         preventTntFromMovingInWater = getBoolean("prevent-tnt-from-moving-in-water", false);
+         log("Prevent TNT from moving in water: " + preventTntFromMovingInWater);
      }
 +
 +    public long delayChunkUnloadsBy;
@@ -40,22 +40,22 @@ index ce43e7bb7..e35e72e8b 100644
 +    }
  }
 diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
-index 3904a1b8f..bcf68af4f 100644
+index 718ebfea0..6c6924937 100644
 --- a/src/main/java/net/minecraft/server/Chunk.java
 +++ b/src/main/java/net/minecraft/server/Chunk.java
-@@ -30,6 +30,7 @@ public class Chunk {
+@@ -39,6 +39,7 @@ public class Chunk implements IChunkAccess {
      private boolean j; public boolean isLoaded() { return j; } // Paper - OBFHELPER
      public final World world;
-     public final int[] heightMap;
+     public final Map<HeightMap.Type, HeightMap> heightMap;
 +    public Long scheduledForUnload; // Paper - delay chunk unloads
      public final int locX;
      public final int locZ;
      private boolean m;
 diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
-index 5cc192bbd..47159bff3 100644
+index 7825dc91b..2e72a294d 100644
 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
 +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
-@@ -315,6 +315,19 @@ public class ChunkProviderServer implements IChunkProvider {
+@@ -318,6 +318,19 @@ public class ChunkProviderServer implements IChunkProvider {
  
                  activityAccountant.endActivity(); // Spigot
              }
@@ -73,13 +73,13 @@ index 5cc192bbd..47159bff3 100644
 +            }
 +            // Paper end
  
+             this.f.a();
              this.chunkLoader.b();
-         }
 diff --git a/src/main/java/net/minecraft/server/PlayerChunk.java b/src/main/java/net/minecraft/server/PlayerChunk.java
-index 3d30e1831..48a008e0a 100644
+index ffff87dc0..344b95233 100644
 --- a/src/main/java/net/minecraft/server/PlayerChunk.java
 +++ b/src/main/java/net/minecraft/server/PlayerChunk.java
-@@ -32,8 +32,16 @@ public class PlayerChunk {
+@@ -33,14 +33,23 @@ public class PlayerChunk {
          public void run() {
              loadInProgress = false;
              PlayerChunk.this.chunk = PlayerChunk.this.playerChunkMap.getWorld().getChunkProviderServer().getOrLoadChunkAt(location.x, location.z);
@@ -96,27 +96,26 @@ index 3d30e1831..48a008e0a 100644
      // CraftBukkit end
  
      public PlayerChunk(PlayerChunkMap playerchunkmap, int i, int j) {
-@@ -42,6 +50,7 @@ public class PlayerChunk {
-         // CraftBukkit start
-         loadInProgress = true;
-         this.chunk = playerchunkmap.getWorld().getChunkProviderServer().getChunkAt(i, j, loadedRunnable, false);
+         this.playerChunkMap = playerchunkmap;
+         this.location = new ChunkCoordIntPair(i, j);
+         this.chunk = playerchunkmap.getWorld().getChunkProviderServer().getOrLoadChunkAt(i, j);
 +        markChunkUsed(); // Paper - delay chunk unloads
-         // CraftBukkit end
      }
  
-@@ -110,6 +119,7 @@ public class PlayerChunk {
-             if (!loadInProgress) {
-                 loadInProgress = true;
-                 this.chunk = playerChunkMap.getWorld().getChunkProviderServer().getChunkAt(this.location.x, this.location.z, loadedRunnable, flag);
+     public ChunkCoordIntPair a() {
+@@ -85,6 +94,7 @@ public class PlayerChunk {
+                 this.chunk = this.playerChunkMap.getWorld().getChunkProviderServer().getChunkAt(this.location.x, this.location.z);
+             } else {
+                 this.chunk = this.playerChunkMap.getWorld().getChunkProviderServer().getOrLoadChunkAt(this.location.x, this.location.z);
 +                markChunkUsed(); // Paper - delay chunk unloads
              }
-             // CraftBukkit end
  
+             return this.chunk != null;
 diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
-index ad1d90b56..0b10f1684 100644
+index 4d888d6d4..cf5c76a78 100644
 --- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
 +++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
-@@ -487,7 +487,13 @@ public class PlayerChunkMap {
+@@ -461,7 +461,13 @@ public class PlayerChunkMap {
          Chunk chunk = playerchunk.f();
  
          if (chunk != null) {
@@ -132,29 +131,29 @@ index ad1d90b56..0b10f1684 100644
  
      }
 diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
-index eca4903ed..36a78daff 100644
+index 4588df4b1..c34f42efc 100644
 --- a/src/main/java/net/minecraft/server/World.java
 +++ b/src/main/java/net/minecraft/server/World.java
-@@ -1594,7 +1594,13 @@ public abstract class World implements IBlockAccess {
-             if (!tileentity.y() && tileentity.u()) {
+@@ -1294,7 +1294,13 @@ public abstract class World implements GeneratorAccess, IIBlockAccess, AutoClose
+             if (!tileentity.x() && tileentity.u()) {
                  BlockPosition blockposition = tileentity.getPosition();
  
--                if (this.isLoaded(blockposition) && this.P.a(blockposition)) {
+-                if (this.isLoaded(blockposition) && this.K.a(blockposition)) {
 +                // Paper start - Skip ticking in chunks scheduled for unload
 +                net.minecraft.server.Chunk chunk = this.getChunkIfLoaded(blockposition);
 +                boolean shouldTick = chunk != null;
 +                if(this.paperConfig.skipEntityTickingInChunksScheduledForUnload)
 +                    shouldTick = shouldTick && !chunk.isUnloading() && chunk.scheduledForUnload == null;
-+                if (shouldTick && this.P.a(blockposition)) {
++                if (shouldTick && this.K.a(blockposition)) {
 +                    // Paper end
                      try {
                          this.methodProfiler.a(() -> {
-                             return String.valueOf(TileEntity.a(tileentity.getClass()));
+                             return String.valueOf(TileEntityTypes.a(tileentity.C()));
 diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
-index 69dc11e2b..284dc6391 100644
+index 9d88b9ddb..e516ec603 100644
 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
 +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
-@@ -1576,7 +1576,7 @@ public class CraftWorld implements World {
+@@ -1601,7 +1601,7 @@ public class CraftWorld implements World {
          ChunkProviderServer cps = world.getChunkProviderServer();
          for (net.minecraft.server.Chunk chunk : cps.chunks.values()) {
              // If in use, skip it
@@ -164,10 +163,10 @@ index 69dc11e2b..284dc6391 100644
              }
  
 diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
-index 47865c027..b79bf70f0 100644
+index a9b84fdec..e02647f80 100644
 --- a/src/main/java/org/spigotmc/ActivationRange.java
 +++ b/src/main/java/org/spigotmc/ActivationRange.java
-@@ -283,6 +283,10 @@ public class ActivationRange
+@@ -284,6 +284,10 @@ public class ActivationRange
          {
              isActive = false;
          }
diff --git a/Spigot-Server-Patches/0145-Fix-Double-World-Add-issues.patch b/Spigot-Server-Patches/0129-Fix-Double-World-Add-issues.patch
similarity index 64%
rename from Spigot-Server-Patches/0145-Fix-Double-World-Add-issues.patch
rename to Spigot-Server-Patches/0129-Fix-Double-World-Add-issues.patch
index de56b49d7..9ffcdcd41 100644
--- a/Spigot-Server-Patches/0145-Fix-Double-World-Add-issues.patch
+++ b/Spigot-Server-Patches/0129-Fix-Double-World-Add-issues.patch
@@ -1,4 +1,4 @@
-From 244438affa544cd9fb04141577b56ef2a0b11788 Mon Sep 17 00:00:00 2001
+From 26d160c73d35a95a6684b1423daf224d7878a82e Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Tue, 21 Jun 2016 22:54:34 -0400
 Subject: [PATCH] Fix Double World Add issues
@@ -8,23 +8,23 @@ Vanilla will double add Spider Jockeys to the world, so ignore already added.
 Also add debug if something else tries to, and abort before world gets bad state
 
 diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
-index 12bd558a7..8747d9a45 100644
+index faaa1b36b..063d53f1c 100644
 --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
 +++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
-@@ -546,7 +546,7 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
+@@ -1020,7 +1020,7 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
      }
  
-     public static void a(Entity entity, World world, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
--        if (world.addEntity(entity, reason) && entity.isVehicle()) {
-+        if (!entity.valid && world.addEntity(entity, reason) && entity.isVehicle()) { // Paper
+     public static void a(Entity entity, GeneratorAccess generatoraccess, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
+-        if (generatoraccess.addEntity(entity, reason) && entity.isVehicle()) {
++        if (!entity.valid && generatoraccess.addEntity(entity, reason) && entity.isVehicle()) { // Paper
              // CraftBukkit end
-             Iterator iterator = entity.bF().iterator();
+             Iterator iterator = entity.bP().iterator();
  
 diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
-index 36a78daff..6e37c4366 100644
+index c34f42efc..a8ef9e337 100644
 --- a/src/main/java/net/minecraft/server/World.java
 +++ b/src/main/java/net/minecraft/server/World.java
-@@ -1103,6 +1103,7 @@ public abstract class World implements IBlockAccess {
+@@ -955,6 +955,7 @@ public abstract class World implements GeneratorAccess, IIBlockAccess, AutoClose
      public boolean addEntity(Entity entity, SpawnReason spawnReason) { // Changed signature, added SpawnReason
          org.spigotmc.AsyncCatcher.catchOp( "entity add"); // Spigot
          if (entity == null) return false;
diff --git a/Spigot-Server-Patches/0130-Fix-Old-Sign-Conversion.patch b/Spigot-Server-Patches/0130-Fix-Old-Sign-Conversion.patch
new file mode 100644
index 000000000..a35d54be6
--- /dev/null
+++ b/Spigot-Server-Patches/0130-Fix-Old-Sign-Conversion.patch
@@ -0,0 +1,116 @@
+From 62dd445f7cb912223bd98f9be51823bb9ebb49ad Mon Sep 17 00:00:00 2001
+From: Aikar <aikar@aikar.co>
+Date: Fri, 17 Jun 2016 20:50:11 -0400
+Subject: [PATCH] Fix Old Sign Conversion
+
+1) Sign loading code was trying to parse the JSON before the check for oldSign.
+   That code could then skip the old sign converting code if it triggers a JSON parse exception.
+2) New Mojang Schematic system has Tile Entities in the new converted format, but missing the Bukkit.isConverted flag
+   This causes Igloos and such to render broken signs. We fix this by ignoring sign conversion for Defined Structures
+
+diff --git a/src/main/java/net/minecraft/server/DefinedStructure.java b/src/main/java/net/minecraft/server/DefinedStructure.java
+index 65910508f..002b74175 100644
+--- a/src/main/java/net/minecraft/server/DefinedStructure.java
++++ b/src/main/java/net/minecraft/server/DefinedStructure.java
+@@ -88,7 +88,7 @@ public class DefinedStructure {
+     }
+ 
+     private void a(World world, BlockPosition blockposition, BlockPosition blockposition1) {
+-        List list = world.a(Entity.class, new AxisAlignedBB(blockposition, blockposition1), (entity) -> {
++        List list = world.a(Entity.class, new AxisAlignedBB(blockposition, blockposition1),(Predicate<? super Entity>) (entity) -> { // Paper - decompile fix
+             return !(entity instanceof EntityHuman);
+         });
+ 
+@@ -218,9 +218,11 @@ public class DefinedStructure {
+                                         definedstructure_blockinfo1.c.setInt("x", blockposition1.getX());
+                                         definedstructure_blockinfo1.c.setInt("y", blockposition1.getY());
+                                         definedstructure_blockinfo1.c.setInt("z", blockposition1.getZ());
++                                        tileentity.isLoadingStructure = true; // Paper
+                                         tileentity.load(definedstructure_blockinfo1.c);
+                                         tileentity.a(definedstructureinfo.b());
+                                         tileentity.a(definedstructureinfo.c());
++                                        tileentity.isLoadingStructure = false; // Paper
+                                     }
+                                 }
+ 
+@@ -285,21 +287,27 @@ public class DefinedStructure {
+                         voxelshapebitset.a(blockposition3.getX() - i2, blockposition3.getY() - j2, blockposition3.getZ() - l1, true, true);
+                     }
+ 
+-                    voxelshapebitset.a((enumdirection, i, j, k) -> {
+-                        BlockPosition blockposition = new BlockPosition(l + i, i1 + j, j1 + k);
+-                        BlockPosition blockposition1 = blockposition.shift(enumdirection);
+-                        IBlockData iblockdata = generatoraccess.getType(blockposition);
++                    // Paper start - decompile fixes
++                    int finalL = l;
++                    int finalI = i1;
++                    int finalJ = j1;
++                    int finalK = k1;
++                    voxelshapebitset.a((enumdirection, i_, j_, k_) -> {
++                        BlockPosition innerBlockposition = new BlockPosition(finalL + i_, finalI + j_, finalJ + k_);
++                        BlockPosition blockposition1 = innerBlockposition.shift(enumdirection);
++                        IBlockData iblockdata = generatoraccess.getType(innerBlockposition);
+                         IBlockData iblockdata1 = generatoraccess.getType(blockposition1);
+-                        IBlockData iblockdata2 = iblockdata.updateState(enumdirection, iblockdata1, generatoraccess, blockposition, blockposition1);
++                        IBlockData iblockdata2 = iblockdata.updateState(enumdirection, iblockdata1, generatoraccess, innerBlockposition, blockposition1);
+ 
+                         if (iblockdata != iblockdata2) {
+-                            generatoraccess.setTypeAndData(blockposition, iblockdata2, k1 & -2 | 16);
++                            generatoraccess.setTypeAndData(innerBlockposition, iblockdata2, finalK & -2 | 16);
+                         }
+ 
+-                        IBlockData iblockdata3 = iblockdata1.updateState(enumdirection.opposite(), iblockdata2, generatoraccess, blockposition1, blockposition);
++                        IBlockData iblockdata3 = iblockdata1.updateState(enumdirection.opposite(), iblockdata2, generatoraccess, blockposition1, innerBlockposition);
+ 
+                         if (iblockdata1 != iblockdata3) {
+-                            generatoraccess.setTypeAndData(blockposition1, iblockdata3, k1 & -2 | 16);
++                            generatoraccess.setTypeAndData(blockposition1, iblockdata3, finalK & -2 | 16);
++                            // Paper end - decompile fixes
+                         }
+ 
+                     });
+@@ -734,7 +742,7 @@ public class DefinedStructure {
+         public IBlockData a(int i) {
+             IBlockData iblockdata = (IBlockData) this.b.fromId(i);
+ 
+-            return iblockdata == null ? DefinedStructure.a.a : iblockdata;
++            return iblockdata == null ? a : iblockdata; // Paper - decompile error - Blocks.AIR.getBlockData()
+         }
+ 
+         public Iterator<IBlockData> iterator() {
+diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java
+index 8cab71c0e..2cfe2202e 100644
+--- a/src/main/java/net/minecraft/server/TileEntity.java
++++ b/src/main/java/net/minecraft/server/TileEntity.java
+@@ -11,6 +11,7 @@ import org.bukkit.inventory.InventoryHolder; // CraftBukkit
+ public abstract class TileEntity implements KeyedObject {
+ 
+     public Timing tickTimer = MinecraftTimings.getTileEntityTimings(this); // Paper
++    boolean isLoadingStructure = false; // Paper
+     private static final Logger a = LogManager.getLogger();
+     private final TileEntityTypes<?> e; public TileEntityTypes getTileEntityType() { return e; } // Paper - OBFHELPER
+     protected World world;
+diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java
+index 939d8790f..335a4d27f 100644
+--- a/src/main/java/net/minecraft/server/TileEntitySign.java
++++ b/src/main/java/net/minecraft/server/TileEntitySign.java
+@@ -49,13 +49,14 @@ public class TileEntitySign extends TileEntity implements ICommandListener {
+             }
+ 
+             try {
+-                IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s);
++                //IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s); // Paper - move down - the old format might throw a json error
+ 
+-                if (oldSign) {
++                if (oldSign && !isLoadingStructure) { // Paper - saved structures will be in the new format, but will not have isConverted
+                     lines[i] = org.bukkit.craftbukkit.util.CraftChatMessage.fromString(s)[0];
+                     continue;
+                 }
+                 // CraftBukkit end
++                IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s); // Paper - after old sign
+ 
+                 if (this.world instanceof WorldServer) {
+                     try {
+-- 
+2.18.0
+
diff --git a/Spigot-Server-Patches/0147-Don-t-lookup-game-profiles-that-have-no-UUID-and-no-.patch b/Spigot-Server-Patches/0131-Don-t-lookup-game-profiles-that-have-no-UUID-and-no-.patch
similarity index 90%
rename from Spigot-Server-Patches/0147-Don-t-lookup-game-profiles-that-have-no-UUID-and-no-.patch
rename to Spigot-Server-Patches/0131-Don-t-lookup-game-profiles-that-have-no-UUID-and-no-.patch
index 0617dceb6..123aa3edc 100644
--- a/Spigot-Server-Patches/0147-Don-t-lookup-game-profiles-that-have-no-UUID-and-no-.patch
+++ b/Spigot-Server-Patches/0131-Don-t-lookup-game-profiles-that-have-no-UUID-and-no-.patch
@@ -1,11 +1,11 @@
-From 0aa3b7dfdf6535beb442e6ef6a6f609e15d4671c Mon Sep 17 00:00:00 2001
+From 346d6a77e1974d7f4765f616c06cad3746ed4039 Mon Sep 17 00:00:00 2001
 From: Zach Brown <zach.brown@destroystokyo.com>
 Date: Sat, 16 Jul 2016 19:11:17 -0500
 Subject: [PATCH] Don't lookup game profiles that have no UUID and no name
 
 
 diff --git a/src/main/java/net/minecraft/server/UserCache.java b/src/main/java/net/minecraft/server/UserCache.java
-index 4fb17a801..7ce08eb8b 100644
+index f8b7d695c..a47a51a41 100644
 --- a/src/main/java/net/minecraft/server/UserCache.java
 +++ b/src/main/java/net/minecraft/server/UserCache.java
 @@ -87,7 +87,7 @@ public class UserCache {
diff --git a/Spigot-Server-Patches/0148-More-informative-vehicle-moved-wrongly-message.patch b/Spigot-Server-Patches/0132-More-informative-vehicle-moved-wrongly-message.patch
similarity index 81%
rename from Spigot-Server-Patches/0148-More-informative-vehicle-moved-wrongly-message.patch
rename to Spigot-Server-Patches/0132-More-informative-vehicle-moved-wrongly-message.patch
index 3b393c987..ca9fae3bf 100644
--- a/Spigot-Server-Patches/0148-More-informative-vehicle-moved-wrongly-message.patch
+++ b/Spigot-Server-Patches/0132-More-informative-vehicle-moved-wrongly-message.patch
@@ -1,18 +1,18 @@
-From 7d692b1b168fdc8a7d3d1394bb6d58f59de98053 Mon Sep 17 00:00:00 2001
+From cb692770973181e52d95b3f1616a8e07667832d3 Mon Sep 17 00:00:00 2001
 From: Zach Brown <zach.brown@destroystokyo.com>
 Date: Thu, 28 Jul 2016 17:58:53 -0500
 Subject: [PATCH] More informative vehicle moved wrongly message
 
 
 diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
-index 9eb7b012f..e66584deb 100644
+index d61ce6461..e4f28b8ac 100644
 --- a/src/main/java/net/minecraft/server/PlayerConnection.java
 +++ b/src/main/java/net/minecraft/server/PlayerConnection.java
-@@ -357,7 +357,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
+@@ -354,7 +354,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
  
                  if (d10 > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot
                      flag1 = true;
--                    PlayerConnection.LOGGER.warn("{} moved wrongly!", entity.getName());
+-                    PlayerConnection.LOGGER.warn("{} moved wrongly!", entity.getDisplayName().getString());
 +                    PlayerConnection.LOGGER.warn(entity.getName() + " (vehicle of " + this.player.getName() + ") moved wrongly!"); // Paper - More informative
                  }
  
diff --git a/Spigot-Server-Patches/0149-Re-track-players-that-dismount-from-other-players.patch b/Spigot-Server-Patches/0133-Re-track-players-that-dismount-from-other-players.patch
similarity index 86%
rename from Spigot-Server-Patches/0149-Re-track-players-that-dismount-from-other-players.patch
rename to Spigot-Server-Patches/0133-Re-track-players-that-dismount-from-other-players.patch
index 2db75c3cd..8ef864a83 100644
--- a/Spigot-Server-Patches/0149-Re-track-players-that-dismount-from-other-players.patch
+++ b/Spigot-Server-Patches/0133-Re-track-players-that-dismount-from-other-players.patch
@@ -1,14 +1,14 @@
-From e5dae80584dbf0caa5a09109148f8063a834d834 Mon Sep 17 00:00:00 2001
+From edd50cef4c8769d05a85ebfb88e0b85d88af36ab Mon Sep 17 00:00:00 2001
 From: Zach Brown <zach.brown@destroystokyo.com>
 Date: Sun, 31 Jul 2016 16:33:03 -0500
 Subject: [PATCH] Re-track players that dismount from other players
 
 
 diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
-index 4b6976b19..2391adac7 100644
+index 8b5cfc78a..5aafa4e23 100644
 --- a/src/main/java/net/minecraft/server/EntityPlayer.java
 +++ b/src/main/java/net/minecraft/server/EntityPlayer.java
-@@ -724,6 +724,13 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+@@ -733,6 +733,13 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
          if (entity1 != entity && this.playerConnection != null) {
              this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch);
          }
diff --git a/Spigot-Server-Patches/0150-Add-setting-for-proxy-online-mode-status.patch b/Spigot-Server-Patches/0134-Add-setting-for-proxy-online-mode-status.patch
similarity index 88%
rename from Spigot-Server-Patches/0150-Add-setting-for-proxy-online-mode-status.patch
rename to Spigot-Server-Patches/0134-Add-setting-for-proxy-online-mode-status.patch
index 0cd1157c5..8c14a4112 100644
--- a/Spigot-Server-Patches/0150-Add-setting-for-proxy-online-mode-status.patch
+++ b/Spigot-Server-Patches/0134-Add-setting-for-proxy-online-mode-status.patch
@@ -1,4 +1,4 @@
-From 75da66ca4a6bd260906024ddab96c665c9231c9d Mon Sep 17 00:00:00 2001
+From eb105e6e240bc10506a92fc0972efbbf8912ee05 Mon Sep 17 00:00:00 2001
 From: Gabriele C <sgdc3.mail@gmail.com>
 Date: Fri, 5 Aug 2016 01:03:08 +0200
 Subject: [PATCH] Add setting for proxy online mode status
@@ -19,12 +19,12 @@ index 011cbf5e3..cf06f8ac3 100644
 +    }
  }
 diff --git a/src/main/java/net/minecraft/server/NameReferencingFileConverter.java b/src/main/java/net/minecraft/server/NameReferencingFileConverter.java
-index b943a9b20..8f3b93dc1 100644
+index f13534917..85c7a96c5 100644
 --- a/src/main/java/net/minecraft/server/NameReferencingFileConverter.java
 +++ b/src/main/java/net/minecraft/server/NameReferencingFileConverter.java
-@@ -66,7 +66,8 @@ public class NameReferencingFileConverter {
-             }
-         }), String.class);
+@@ -60,7 +60,8 @@ public class NameReferencingFileConverter {
+             return new String[i];
+         });
  
 -        if (minecraftserver.getOnlineMode() || org.spigotmc.SpigotConfig.bungee) { // Spigot: bungee = online mode, for now.
 +        if (minecraftserver.getOnlineMode()
@@ -33,10 +33,10 @@ index b943a9b20..8f3b93dc1 100644
          } else {
              String[] astring1 = astring;
 diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 054ac1b47..d3165763c 100644
+index 2bcd1c3ca..a36192362 100644
 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
 +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -1335,7 +1335,8 @@ public final class CraftServer implements Server {
+@@ -1374,7 +1374,8 @@ public final class CraftServer implements Server {
              // Spigot Start
              GameProfile profile = null;
              // Only fetch an online UUID in online mode
diff --git a/Spigot-Server-Patches/0151-Optimise-BlockStateEnum-hashCode-and-equals.patch b/Spigot-Server-Patches/0135-Optimise-BlockStateEnum-hashCode-and-equals.patch
similarity index 61%
rename from Spigot-Server-Patches/0151-Optimise-BlockStateEnum-hashCode-and-equals.patch
rename to Spigot-Server-Patches/0135-Optimise-BlockStateEnum-hashCode-and-equals.patch
index 5e8c15713..9b5297113 100644
--- a/Spigot-Server-Patches/0151-Optimise-BlockStateEnum-hashCode-and-equals.patch
+++ b/Spigot-Server-Patches/0135-Optimise-BlockStateEnum-hashCode-and-equals.patch
@@ -1,14 +1,14 @@
-From a447b4a83b584f8af1b4b6d5fb660a9db06d2179 Mon Sep 17 00:00:00 2001
+From 7c023b2177ae11b64004ab1ab12096db67d4352d Mon Sep 17 00:00:00 2001
 From: Alfie Cleveland <alfeh@me.com>
 Date: Fri, 19 Aug 2016 01:52:56 +0100
 Subject: [PATCH] Optimise BlockStateEnum hashCode and equals
 
 
 diff --git a/src/main/java/net/minecraft/server/BlockStateEnum.java b/src/main/java/net/minecraft/server/BlockStateEnum.java
-index 21ac1e066..a241d7d8c 100644
+index 725087de5..5e6cb5d7d 100644
 --- a/src/main/java/net/minecraft/server/BlockStateEnum.java
 +++ b/src/main/java/net/minecraft/server/BlockStateEnum.java
-@@ -16,6 +16,11 @@ public class BlockStateEnum<T extends Enum<T> & INamable> extends BlockState<T>
+@@ -17,6 +17,11 @@ public class BlockStateEnum<T extends Enum<T> & INamable> extends BlockState<T>
      private final ImmutableSet<T> a;
      private final Map<String, T> b = Maps.newHashMap();
  
@@ -20,19 +20,23 @@ index 21ac1e066..a241d7d8c 100644
      protected BlockStateEnum(String s, Class<T> oclass, Collection<T> collection) {
          super(s, oclass);
          this.a = ImmutableSet.copyOf(collection);
-@@ -32,6 +37,7 @@ public class BlockStateEnum<T extends Enum<T> & INamable> extends BlockState<T>
-             this.b.put(s1, (T) oenum);
+@@ -30,9 +35,10 @@ public class BlockStateEnum<T extends Enum<T> & INamable> extends BlockState<T>
+                 throw new IllegalArgumentException("Multiple values have the same name \'" + s1 + "\'");
+             }
+ 
+-            this.b.put(s1, oenum);
++            this.b.put(s1, (T) oenum); // Paper - decompile fix
          }
  
 +        this.hashCode = hashId++; // Paper
      }
  
-     public Collection<T> c() {
-@@ -46,32 +52,15 @@ public class BlockStateEnum<T extends Enum<T> & INamable> extends BlockState<T>
+     public Collection<T> d() {
+@@ -47,24 +53,14 @@ public class BlockStateEnum<T extends Enum<T> & INamable> extends BlockState<T>
          return ((INamable) t0).getName();
      }
  
-+    @Override // Paper - override equals as BlockStateEnum is a singleton
++    @Override // Paper start - override equals as BlockStateEnum is a singleton
      public boolean equals(Object object) {
 -        if (this == object) {
 -            return true;
@@ -44,27 +48,19 @@ index 21ac1e066..a241d7d8c 100644
 -            return false;
 -        }
 +       return this == object;
++        // Paper end - override equals as BlockStateEnum is a singleton
      }
  
--    // Spigot start
--    private int hashCode;
-+    @Override // Paper - override equals as BlockStateEnum is a singleton
-     public int hashCode() {
--        int hash = hashCode;
--        if (hash == 0) {
--            int i = super.hashCode();
+     public int c() {
+-        int i = super.c();
 -
--            i = 31 * i + this.a.hashCode();
--            i = 31 * i + this.b.hashCode();
--            hashCode = hash = i;
--        }
--        return hash;
-+        return hashCode;
+-        i = 31 * i + this.a.hashCode();
+-        i = 31 * i + this.b.hashCode();
+-        return i;
++        return hashCode; // Paper - hashCode method is final, but we can do this here
      }
--    // Spigot end
  
      public static <T extends Enum<T> & INamable> BlockStateEnum<T> of(String s, Class<T> oclass) {
-         return a(s, oclass, Predicates.alwaysTrue());
 -- 
 2.18.0
 
diff --git a/Spigot-Server-Patches/0152-Disable-ticking-of-snow-blocks.patch b/Spigot-Server-Patches/0136-Disable-ticking-of-snow-blocks.patch
similarity index 51%
rename from Spigot-Server-Patches/0152-Disable-ticking-of-snow-blocks.patch
rename to Spigot-Server-Patches/0136-Disable-ticking-of-snow-blocks.patch
index 6972b3a8d..940505fd4 100644
--- a/Spigot-Server-Patches/0152-Disable-ticking-of-snow-blocks.patch
+++ b/Spigot-Server-Patches/0136-Disable-ticking-of-snow-blocks.patch
@@ -1,32 +1,23 @@
-From c495d06f61d0f6a57b3a0b008d4f60e937ecff42 Mon Sep 17 00:00:00 2001
+From 093f67662e108285ca05b0485d6ff14d2c73323d Mon Sep 17 00:00:00 2001
 From: killme <killme-git@ibts.me>
 Date: Tue, 30 Aug 2016 16:39:48 +0200
 Subject: [PATCH] Disable ticking of snow blocks
 
 
 diff --git a/src/main/java/net/minecraft/server/BlockSnowBlock.java b/src/main/java/net/minecraft/server/BlockSnowBlock.java
-index 8123d7295..b6765e5bc 100644
+index 0c8f9d37f..44ed65626 100644
 --- a/src/main/java/net/minecraft/server/BlockSnowBlock.java
 +++ b/src/main/java/net/minecraft/server/BlockSnowBlock.java
-@@ -6,7 +6,7 @@ public class BlockSnowBlock extends Block {
- 
-     protected BlockSnowBlock() {
-         super(Material.SNOW_BLOCK);
--        this.a(true);
-+        // this.a(true); // Paper - snow blocks don't need to tick
-         this.a(CreativeModeTab.b);
-     }
- 
-@@ -18,6 +18,8 @@ public class BlockSnowBlock extends Block {
+@@ -16,6 +16,8 @@ public class BlockSnowBlock extends Block {
          return 4;
      }
  
 +    // Paper start - snow blocks don't need to tick
 +    /*
-     public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
+     public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Random random) {
          if (world.getBrightness(EnumSkyBlock.BLOCK, blockposition) > 11) {
              // CraftBukkit start
-@@ -30,4 +32,6 @@ public class BlockSnowBlock extends Block {
+@@ -28,4 +30,6 @@ public class BlockSnowBlock extends Block {
          }
  
      }
diff --git a/Spigot-Server-Patches/0153-Fix-AIOOBE-in-inventory-handling.patch b/Spigot-Server-Patches/0137-Fix-AIOOBE-in-inventory-handling.patch
similarity index 64%
rename from Spigot-Server-Patches/0153-Fix-AIOOBE-in-inventory-handling.patch
rename to Spigot-Server-Patches/0137-Fix-AIOOBE-in-inventory-handling.patch
index 24f979e48..0d76ffc1e 100644
--- a/Spigot-Server-Patches/0153-Fix-AIOOBE-in-inventory-handling.patch
+++ b/Spigot-Server-Patches/0137-Fix-AIOOBE-in-inventory-handling.patch
@@ -1,22 +1,22 @@
-From ccc20dcc8957311e38f8f1d350e01e9f3ec46d9f Mon Sep 17 00:00:00 2001
+From 6ad7cbab0516dc2372b5a23e12f64abc400ca6a3 Mon Sep 17 00:00:00 2001
 From: Brokkonaut <hannos17@gmx.de>
 Date: Sun, 4 Sep 2016 16:35:43 -0500
 Subject: [PATCH] Fix AIOOBE in inventory handling
 
 
 diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
-index e66584deb..f5fb86414 100644
+index e4f28b8ac..c09620b37 100644
 --- a/src/main/java/net/minecraft/server/PlayerConnection.java
 +++ b/src/main/java/net/minecraft/server/PlayerConnection.java
-@@ -1849,7 +1849,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
+@@ -2080,7 +2080,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
                      case CLONE:
-                         if (packetplayinwindowclick.c() == 2) {
+                         if (packetplayinwindowclick.d() == 2) {
                              click = ClickType.MIDDLE;
--                            if (packetplayinwindowclick.b() == -999) {
-+                            if (packetplayinwindowclick.b() < 0) { // Paper - GH-404
+-                            if (packetplayinwindowclick.c() == -999) {
++                            if (packetplayinwindowclick.c() < 0) { // Paper - GH-404
                                  action = InventoryAction.NOTHING;
                              } else {
-                                 Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b());
+                                 Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.c());
 -- 
 2.18.0
 
diff --git a/Spigot-Server-Patches/0154-Configurable-packet-in-spam-threshold.patch b/Spigot-Server-Patches/0138-Configurable-packet-in-spam-threshold.patch
similarity index 91%
rename from Spigot-Server-Patches/0154-Configurable-packet-in-spam-threshold.patch
rename to Spigot-Server-Patches/0138-Configurable-packet-in-spam-threshold.patch
index cc040a5c8..8dcded41a 100644
--- a/Spigot-Server-Patches/0154-Configurable-packet-in-spam-threshold.patch
+++ b/Spigot-Server-Patches/0138-Configurable-packet-in-spam-threshold.patch
@@ -1,4 +1,4 @@
-From fc0280fe1ab9b4a8eff7c35bb03792e00440b736 Mon Sep 17 00:00:00 2001
+From c1b9295b23dbaf419b41f1fbe6aa1df6cccfbbe6 Mon Sep 17 00:00:00 2001
 From: Zach Brown <zach.brown@destroystokyo.com>
 Date: Sun, 11 Sep 2016 14:30:57 -0500
 Subject: [PATCH] Configurable packet in spam threshold
@@ -23,10 +23,10 @@ index cf06f8ac3..2001175bf 100644
 +    }
  }
 diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
-index f5fb86414..16c343b54 100644
+index c09620b37..aa7c019ab 100644
 --- a/src/main/java/net/minecraft/server/PlayerConnection.java
 +++ b/src/main/java/net/minecraft/server/PlayerConnection.java
-@@ -909,13 +909,14 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
+@@ -1185,13 +1185,14 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
      // Spigot start - limit place/interactions
      private int limitedPackets;
      private long lastLimitedPacket = -1;
diff --git a/Spigot-Server-Patches/0155-Configurable-flying-kick-messages.patch b/Spigot-Server-Patches/0139-Configurable-flying-kick-messages.patch
similarity index 80%
rename from Spigot-Server-Patches/0155-Configurable-flying-kick-messages.patch
rename to Spigot-Server-Patches/0139-Configurable-flying-kick-messages.patch
index d30851f10..75684ef78 100644
--- a/Spigot-Server-Patches/0155-Configurable-flying-kick-messages.patch
+++ b/Spigot-Server-Patches/0139-Configurable-flying-kick-messages.patch
@@ -1,4 +1,4 @@
-From 4a14ee67890687fcab9c5e662e07a082ea0e0fe6 Mon Sep 17 00:00:00 2001
+From 1bc0a231c368f5dbfb900443a1532d7cf547e328 Mon Sep 17 00:00:00 2001
 From: kashike <kashike@vq.lc>
 Date: Tue, 20 Sep 2016 00:58:01 +0000
 Subject: [PATCH] Configurable flying kick messages
@@ -21,22 +21,21 @@ index 2001175bf..621c585e7 100644
 +    }
  }
 diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
-index 16c343b54..8981e94df 100644
+index aa7c019ab..be0322941 100644
 --- a/src/main/java/net/minecraft/server/PlayerConnection.java
 +++ b/src/main/java/net/minecraft/server/PlayerConnection.java
-@@ -144,7 +144,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
-         if (this.B) {
+@@ -144,6 +144,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
              if (++this.C > 80) {
-                 PlayerConnection.LOGGER.warn("{} was kicked for floating too long!", this.player.getName());
--                this.disconnect(new ChatMessage("multiplayer.disconnect.flying", new Object[0]));
+                 PlayerConnection.LOGGER.warn("{} was kicked for floating too long!", this.player.getDisplayName().getString());
+                 this.disconnect(new ChatMessage("multiplayer.disconnect.flying", new Object[0]));
 +                this.disconnect(com.destroystokyo.paper.PaperConfig.flyingKickPlayerMessage); // Paper - use configurable kick message
                  return;
              }
          } else {
-@@ -163,7 +163,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
-             if (this.D && this.player.getVehicle().bE() == this.player) {
+@@ -162,7 +163,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable {
+             if (this.D && this.player.getRootVehicle().bO() == this.player) {
                  if (++this.E > 80) {
-                     PlayerConnection.LOGGER.warn("{} was kicked for floating a vehicle too long!", this.player.getName());
+                     PlayerConnection.LOGGER.warn("{} was kicked for floating a vehicle too long!", this.player.getDisplayName().getString());
 -                    this.disconnect(new ChatMessage("multiplayer.disconnect.flying", new Object[0]));
 +                    this.disconnect(com.destroystokyo.paper.PaperConfig.flyingKickVehicleMessage); // Paper - use configurable kick message
                      return;
diff --git a/Spigot-Server-Patches/0156-Auto-Save-Improvements.patch b/Spigot-Server-Patches/0140-Auto-Save-Improvements.patch
similarity index 78%
rename from Spigot-Server-Patches/0156-Auto-Save-Improvements.patch
rename to Spigot-Server-Patches/0140-Auto-Save-Improvements.patch
index a3866f2b8..0a86e5901 100644
--- a/Spigot-Server-Patches/0156-Auto-Save-Improvements.patch
+++ b/Spigot-Server-Patches/0140-Auto-Save-Improvements.patch
@@ -1,4 +1,4 @@
-From 3116c6b8cd13ddce911fcb81a43a7a8b6696bd67 Mon Sep 17 00:00:00 2001
+From 9c20a3d7127f062b7270bafc120ccb55f69e3900 Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Mon, 19 Sep 2016 23:16:39 -0400
 Subject: [PATCH] Auto Save Improvements
@@ -32,7 +32,7 @@ index 621c585e7..459c86bce 100644
 +    }
  }
 diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 1b9eb7f45..ce848d63e 100644
+index 0e6c18b32..c182ceffb 100644
 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
 +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
 @@ -2,6 +2,7 @@ package com.destroystokyo.paper;
@@ -43,9 +43,9 @@ index 1b9eb7f45..ce848d63e 100644
  import org.bukkit.configuration.file.YamlConfiguration;
  import org.spigotmc.SpigotWorldConfig;
  
-@@ -363,4 +364,19 @@ public class PaperWorldConfig {
-     private void elytraHitWallDamage() {
-         elytraHitWallDamage = getBoolean("elytra-hit-wall-damage", true);
+@@ -298,4 +299,19 @@ public class PaperWorldConfig {
+     private void skipEntityTickingInChunksScheduledForUnload() {
+         skipEntityTickingInChunksScheduledForUnload = getBoolean("skip-entity-ticking-in-chunks-scheduled-for-unload", skipEntityTickingInChunksScheduledForUnload);
      }
 +
 +    public int autoSavePeriod = -1;
@@ -64,25 +64,25 @@ index 1b9eb7f45..ce848d63e 100644
 +    }
  }
 diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
-index cc9c8b2e0..a59f5b190 100644
+index 6c6924937..5163bd11b 100644
 --- a/src/main/java/net/minecraft/server/Chunk.java
 +++ b/src/main/java/net/minecraft/server/Chunk.java
-@@ -1000,11 +1000,9 @@ public class Chunk {
-             if (this.t && this.world.getTime() != this.lastSaved || this.s) {
+@@ -1013,11 +1013,9 @@ public class Chunk implements IChunkAccess {
+             if (this.w && this.world.getTime() != this.lastSaved || this.y) {
                  return true;
              }
--        } else if (this.t && this.world.getTime() >= this.lastSaved + MinecraftServer.getServer().autosavePeriod * 4) { // Spigot - Only save if we've passed 2 auto save intervals without modification
+-        } else if (this.w && this.world.getTime() >= this.lastSaved + MinecraftServer.getServer().autosavePeriod * 4) { // Spigot - Only save if we've passed 2 auto save intervals without modification
 -            return true;
          }
 -
--        return this.s;
-+        // This !flag section should say if s(isModified) or t(hasEntities), then check auto save
-+        return ((this.s || this.t) && this.world.getTime() >= this.lastSaved + world.paperConfig.autoSavePeriod); // Paper - Make world configurable and incremental
+-        return this.y;
++        // This !flag section should say if y(isModified) or w(hasEntities), then check auto save
++        return ((this.y || this.w) && this.world.getTime() >= this.lastSaved + world.paperConfig.autoSavePeriod); // Paper - Make world configurable and incremental
      }
  
-     public Random a(long i) {
+     public boolean isEmpty() {
 diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
-index 47159bff3..db81b4a8c 100644
+index 2e72a294d..1e6ea3084 100644
 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
 +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
 @@ -1,5 +1,6 @@
@@ -90,11 +90,11 @@ index 47159bff3..db81b4a8c 100644
  
 +import com.destroystokyo.paper.PaperConfig;
  import com.google.common.collect.Lists;
- import com.google.common.collect.Sets;
  import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
-@@ -266,7 +267,7 @@ public class ChunkProviderServer implements IChunkProvider {
+ import it.unimi.dsi.fastutil.longs.Long2ObjectMaps;
+@@ -260,7 +261,7 @@ public class ChunkProviderServer implements IChunkProvider {
                  this.saveChunk(chunk, false); // Spigot
-                 chunk.f(false);
+                 chunk.a(false);
                  ++i;
 -                if (i == 24 && !flag && false) { // Spigot
 +                if (!flag && i >= world.paperConfig.maxAutoSaveChunksPerTick) { // Spigot - // Paper - Incremental Auto Save - cap max per tick
@@ -102,36 +102,36 @@ index 47159bff3..db81b4a8c 100644
                  }
              }
 diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
-index 2391adac7..8b7eb47a2 100644
+index 5aafa4e23..f5fae7ba8 100644
 --- a/src/main/java/net/minecraft/server/EntityPlayer.java
 +++ b/src/main/java/net/minecraft/server/EntityPlayer.java
-@@ -32,6 +32,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
- 
-     private static final Logger bV = LogManager.getLogger();
-     public String locale = null; // PAIL: private -> public // Paper - default to null
+@@ -38,6 +38,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+     private static final Logger cc = LogManager.getLogger();
+     private static final IChatBaseComponent cd = (new ChatMessage("multiplayer.message_not_delivered", new Object[0])).a(EnumChatFormat.RED);
+     public String locale = null; // CraftBukkit - lowercase // Paper - default to null
 +    public long lastSave = MinecraftServer.currentTick; // Paper
      public PlayerConnection playerConnection;
      public final MinecraftServer server;
      public final PlayerInteractManager playerInteractManager;
 diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index ab7933079..5c09c6ff7 100644
+index 49b2c27c6..bf020293d 100644
 --- a/src/main/java/net/minecraft/server/MinecraftServer.java
 +++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -119,6 +119,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IAs
-     public final Thread primaryThread;
+@@ -147,6 +147,7 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati
      public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
      public int autosavePeriod;
+     public File bukkitDataPackFolder;
 +    public boolean serverAutoSave = false; // Paper
      // CraftBukkit end
      // Spigot start
      public final SlackActivityAccountant slackActivityAccountant = new SlackActivityAccountant();
-@@ -766,22 +767,30 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IAs
-             this.q.b().a(agameprofile);
+@@ -868,22 +869,30 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati
+             this.n.b().a(agameprofile);
          }
  
 -        if (autosavePeriod > 0 && this.ticks % autosavePeriod == 0) { // CraftBukkit
              this.methodProfiler.a("save");
--            this.v.savePlayers();
+-            this.s.savePlayers();
 +
 +        serverAutoSave = (autosavePeriod > 0 && this.ticks % autosavePeriod == 0); // Paper
 +        int playerSaveInterval = com.destroystokyo.paper.PaperConfig.playerAutoSaveRate;
@@ -139,7 +139,7 @@ index ab7933079..5c09c6ff7 100644
 +            playerSaveInterval = autosavePeriod;
 +        }
 +        if (playerSaveInterval > 0) { // CraftBukkit // Paper
-+            this.v.savePlayers(playerSaveInterval);
++            this.s.savePlayers(playerSaveInterval);
              // Spigot Start
 +        } // Paper - Incremental Auto Saving
 +
@@ -154,17 +154,17 @@ index ab7933079..5c09c6ff7 100644
              server.playerCommandState = false;
              // this.saveChunks(true);
              // Spigot End
-             this.methodProfiler.b();
+             this.methodProfiler.e();
 -        }
 +        //} // Paper - Incremental Auto Saving
  
-         this.methodProfiler.a("tallying");
-         // Spigot start
+         this.methodProfiler.a("snooper");
+         if (getSnooperEnabled() && !this.j.d() && this.ticks > 100) { // Spigot
 diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
-index 950dbdc50..23ed9efbf 100644
+index 801a147f0..1f2265231 100644
 --- a/src/main/java/net/minecraft/server/PlayerList.java
 +++ b/src/main/java/net/minecraft/server/PlayerList.java
-@@ -343,6 +343,7 @@ public abstract class PlayerList {
+@@ -340,6 +340,7 @@ public abstract class PlayerList {
      }
  
      protected void savePlayerFile(EntityPlayer entityplayer) {
@@ -172,7 +172,7 @@ index 950dbdc50..23ed9efbf 100644
          this.playerFileData.save(entityplayer);
          ServerStatisticManager serverstatisticmanager = (ServerStatisticManager) entityplayer.getStatisticManager(); // CraftBukkit
  
-@@ -1245,13 +1246,25 @@ public abstract class PlayerList {
+@@ -1219,13 +1220,25 @@ public abstract class PlayerList {
  
      }
  
@@ -197,13 +197,13 @@ index 950dbdc50..23ed9efbf 100644
      }
 +    // Paper end
  
-     public void addWhitelist(GameProfile gameprofile) {
-         this.whitelist.add(new WhiteListEntry(gameprofile));
+     public WhiteList getWhitelist() {
+         return this.whitelist;
 diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
-index ebe397116..53cea76e2 100644
+index e3d62fc9c..72b3a6d40 100644
 --- a/src/main/java/net/minecraft/server/WorldServer.java
 +++ b/src/main/java/net/minecraft/server/WorldServer.java
-@@ -1053,8 +1053,9 @@ public class WorldServer extends World implements IAsyncTaskHandler {
+@@ -872,8 +872,9 @@ public class WorldServer extends World implements IAsyncTaskHandler {
          ChunkProviderServer chunkproviderserver = this.getChunkProviderServer();
  
          if (chunkproviderserver.e()) {
@@ -212,11 +212,11 @@ index ebe397116..53cea76e2 100644
              timings.worldSave.startTiming(); // Paper
 +            if (flag || server.serverAutoSave) { // Paper
              if (iprogressupdate != null) {
-                 iprogressupdate.a("Saving level");
+                 iprogressupdate.a(new ChatMessage("menu.savingLevel", new Object[0]));
              }
-@@ -1063,6 +1064,7 @@ public class WorldServer extends World implements IAsyncTaskHandler {
+@@ -882,6 +883,7 @@ public class WorldServer extends World implements IAsyncTaskHandler {
              if (iprogressupdate != null) {
-                 iprogressupdate.c("Saving chunks");
+                 iprogressupdate.c(new ChatMessage("menu.savingChunks", new Object[0]));
              }
 +            } // Paper
  
diff --git a/Spigot-Server-Patches/0157-Chunk-registration-fixes.patch b/Spigot-Server-Patches/0141-Chunk-registration-fixes.patch
similarity index 72%
rename from Spigot-Server-Patches/0157-Chunk-registration-fixes.patch
rename to Spigot-Server-Patches/0141-Chunk-registration-fixes.patch
index 9b90846d8..d173157ef 100644
--- a/Spigot-Server-Patches/0157-Chunk-registration-fixes.patch
+++ b/Spigot-Server-Patches/0141-Chunk-registration-fixes.patch
@@ -1,4 +1,4 @@
-From e12d715554fa2684d9c5c7dcfc765fdf66f02654 Mon Sep 17 00:00:00 2001
+From 25b0a8a99230a59bf4252825e53800faad6e5368 Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Wed, 21 Sep 2016 22:54:28 -0400
 Subject: [PATCH] Chunk registration fixes
@@ -8,10 +8,10 @@ World checks and the Chunk Add logic are inconsistent on how Y > 256, < 0, is tr
 Keep them consistent
 
 diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
-index 6e37c4366..000d2eeb9 100644
+index a8ef9e337..3b2de1f31 100644
 --- a/src/main/java/net/minecraft/server/World.java
 +++ b/src/main/java/net/minecraft/server/World.java
-@@ -1770,7 +1770,7 @@ public abstract class World implements IBlockAccess {
+@@ -1470,7 +1470,7 @@ public abstract class World implements GeneratorAccess, IIBlockAccess, AutoClose
          }
  
          i = MathHelper.floor(entity.locX / 16.0D);
@@ -19,7 +19,7 @@ index 6e37c4366..000d2eeb9 100644
 +        j = Math.min(15, Math.max(0, MathHelper.floor(entity.locY / 16.0D))); // Paper - stay consistent with chunk add/remove behavior
          int k = MathHelper.floor(entity.locZ / 16.0D);
  
-         if (!entity.aa || entity.ab != i || entity.ac != j || entity.ad != k) {
+         if (!entity.inChunk || entity.ae != i || entity.af != j || entity.ag != k) {
 -- 
 2.18.0
 
diff --git a/Spigot-Server-Patches/0158-Remove-FishingHook-reference-on-Craft-Entity-removal.patch b/Spigot-Server-Patches/0142-Remove-FishingHook-reference-on-Craft-Entity-removal.patch
similarity index 58%
rename from Spigot-Server-Patches/0158-Remove-FishingHook-reference-on-Craft-Entity-removal.patch
rename to Spigot-Server-Patches/0142-Remove-FishingHook-reference-on-Craft-Entity-removal.patch
index a93f856a5..33585a0b3 100644
--- a/Spigot-Server-Patches/0158-Remove-FishingHook-reference-on-Craft-Entity-removal.patch
+++ b/Spigot-Server-Patches/0142-Remove-FishingHook-reference-on-Craft-Entity-removal.patch
@@ -1,14 +1,14 @@
-From 1b510c55f2ced947504bbe7ecd6f5936f9a644f0 Mon Sep 17 00:00:00 2001
+From b25b163404c102ab0e30bec1af51a85ac8dc13f1 Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Thu, 16 Jun 2016 00:17:23 -0400
 Subject: [PATCH] Remove FishingHook reference on Craft Entity removal
 
 
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java
-index d555597dc..f5419dea4 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java
-@@ -62,4 +62,14 @@ public class CraftFish extends AbstractProjectile implements Fish {
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java
+index 8392b16b3..752b56435 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java
+@@ -62,4 +62,15 @@ public class CraftFishHook extends AbstractProjectile implements FishHook {
          Validate.isTrue(chance >= 0 && chance <= 1, "The bite chance must be between 0 and 1.");
          this.biteChance = chance;
      }
@@ -22,6 +22,7 @@ index d555597dc..f5419dea4 100644
 +        }
 +    }
 +    // Paper end
++    
  }
 -- 
 2.18.0
diff --git a/Spigot-Server-Patches/0159-Auto-fix-bad-Y-levels-on-player-login.patch b/Spigot-Server-Patches/0143-Auto-fix-bad-Y-levels-on-player-login.patch
similarity index 73%
rename from Spigot-Server-Patches/0159-Auto-fix-bad-Y-levels-on-player-login.patch
rename to Spigot-Server-Patches/0143-Auto-fix-bad-Y-levels-on-player-login.patch
index 113e0b927..719fe37f4 100644
--- a/Spigot-Server-Patches/0159-Auto-fix-bad-Y-levels-on-player-login.patch
+++ b/Spigot-Server-Patches/0143-Auto-fix-bad-Y-levels-on-player-login.patch
@@ -1,4 +1,4 @@
-From f181f1048f4dd143fc9f0b998e8e1a789efbf1b2 Mon Sep 17 00:00:00 2001
+From 7267f517bb9c00b59b8d441d00a286d15fd55d0d Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Wed, 21 Sep 2016 23:48:39 -0400
 Subject: [PATCH] Auto fix bad Y levels on player login
@@ -6,17 +6,17 @@ Subject: [PATCH] Auto fix bad Y levels on player login
 Bring down to a saner Y level if super high, as this can cause the server to crash
 
 diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
-index 8b7eb47a2..7886eee61 100644
+index f5fae7ba8..dc32dc80d 100644
 --- a/src/main/java/net/minecraft/server/EntityPlayer.java
 +++ b/src/main/java/net/minecraft/server/EntityPlayer.java
-@@ -140,6 +140,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+@@ -199,6 +199,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
  
      public void a(NBTTagCompound nbttagcompound) {
          super.a(nbttagcompound);
 +        if (this.locY > 300) this.locY = 257; // Paper - bring down to a saner Y level if out of world
          if (nbttagcompound.hasKeyOfType("playerGameType", 99)) {
-             if (this.C_().getForceGamemode()) {
-                 this.playerInteractManager.setGameMode(this.C_().getGamemode());
+             if (this.bK().getForceGamemode()) {
+                 this.playerInteractManager.setGameMode(this.bK().getGamemode());
 -- 
 2.18.0
 
diff --git a/Spigot-Server-Patches/0161-Disable-Vanilla-Chunk-GC.patch b/Spigot-Server-Patches/0144-Disable-Vanilla-Chunk-GC.patch
similarity index 79%
rename from Spigot-Server-Patches/0161-Disable-Vanilla-Chunk-GC.patch
rename to Spigot-Server-Patches/0144-Disable-Vanilla-Chunk-GC.patch
index 204648b85..272b16316 100644
--- a/Spigot-Server-Patches/0161-Disable-Vanilla-Chunk-GC.patch
+++ b/Spigot-Server-Patches/0144-Disable-Vanilla-Chunk-GC.patch
@@ -1,4 +1,4 @@
-From 839a3b9a54a2c51c8c3333c3a05eef5009561dae Mon Sep 17 00:00:00 2001
+From 3e0826f735fb80823d60d8fc9bc6100dfd3e8644 Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Mon, 26 Sep 2016 01:51:30 -0400
 Subject: [PATCH] Disable Vanilla Chunk GC
@@ -6,10 +6,10 @@ Subject: [PATCH] Disable Vanilla Chunk GC
 Bukkit has its own system for this.
 
 diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
-index 53cea76e2..737ade74d 100644
+index 72b3a6d40..e766e2536 100644
 --- a/src/main/java/net/minecraft/server/WorldServer.java
 +++ b/src/main/java/net/minecraft/server/WorldServer.java
-@@ -1070,7 +1070,7 @@ public class WorldServer extends World implements IAsyncTaskHandler {
+@@ -889,7 +889,7 @@ public class WorldServer extends World implements IAsyncTaskHandler {
              chunkproviderserver.a(flag);
              timings.worldSaveChunks.stopTiming(); // Paper
              // CraftBukkit - ArrayList -> Collection
@@ -18,7 +18,7 @@ index 53cea76e2..737ade74d 100644
              Iterator iterator = arraylist.iterator();
  
              while (iterator.hasNext()) {
-@@ -1079,7 +1079,8 @@ public class WorldServer extends World implements IAsyncTaskHandler {
+@@ -898,7 +898,8 @@ public class WorldServer extends World implements IAsyncTaskHandler {
                  if (chunk != null && !this.manager.a(chunk.locX, chunk.locZ)) {
                      chunkproviderserver.unload(chunk);
                  }
diff --git a/Spigot-Server-Patches/0162-Option-to-remove-corrupt-tile-entities.patch b/Spigot-Server-Patches/0145-Option-to-remove-corrupt-tile-entities.patch
similarity index 79%
rename from Spigot-Server-Patches/0162-Option-to-remove-corrupt-tile-entities.patch
rename to Spigot-Server-Patches/0145-Option-to-remove-corrupt-tile-entities.patch
index 9621de5a0..9d6624b29 100644
--- a/Spigot-Server-Patches/0162-Option-to-remove-corrupt-tile-entities.patch
+++ b/Spigot-Server-Patches/0145-Option-to-remove-corrupt-tile-entities.patch
@@ -1,14 +1,14 @@
-From 5b908630761c4e62419ce38535eaa3b715c34675 Mon Sep 17 00:00:00 2001
+From 972bafac578a82a102ff389e5faf3b35d3b58e72 Mon Sep 17 00:00:00 2001
 From: Zach Brown <zach.brown@destroystokyo.com>
 Date: Wed, 5 Oct 2016 16:27:36 -0500
 Subject: [PATCH] Option to remove corrupt tile entities
 
 
 diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index ce848d63e..93b0af036 100644
+index c182ceffb..9a2ec0793 100644
 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
 +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -379,4 +379,9 @@ public class PaperWorldConfig {
+@@ -314,4 +314,9 @@ public class PaperWorldConfig {
      private void maxAutoSaveChunksPerTick() {
          maxAutoSaveChunksPerTick = getInt("max-auto-save-chunks-per-tick", 24);
      }
@@ -19,10 +19,10 @@ index ce848d63e..93b0af036 100644
 +    }
  }
 diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
-index a59f5b190..27a36b2b0 100644
+index 5163bd11b..f31524eb0 100644
 --- a/src/main/java/net/minecraft/server/Chunk.java
 +++ b/src/main/java/net/minecraft/server/Chunk.java
-@@ -823,11 +823,18 @@ public class Chunk {
+@@ -832,6 +832,12 @@ public class Chunk implements IChunkAccess {
                              "Chunk coordinates: " + (this.locX * 16) + "," + (this.locZ * 16));
              e.printStackTrace();
              ServerInternalException.reportInternalException(e);
@@ -35,6 +35,8 @@ index a59f5b190..27a36b2b0 100644
              // Paper end
              // CraftBukkit end
          }
+@@ -841,6 +847,7 @@ public class Chunk implements IChunkAccess {
+         this.i.put(new BlockPosition(nbttagcompound.getInt("x"), nbttagcompound.getInt("y"), nbttagcompound.getInt("z")), nbttagcompound);
      }
  
 +    public void removeTileEntity(BlockPosition blockposition) { this.d(blockposition); } // Paper - OBFHELPER
diff --git a/Spigot-Server-Patches/0163-Add-EntityZapEvent.patch b/Spigot-Server-Patches/0146-Add-EntityZapEvent.patch
similarity index 85%
rename from Spigot-Server-Patches/0163-Add-EntityZapEvent.patch
rename to Spigot-Server-Patches/0146-Add-EntityZapEvent.patch
index 801563473..e71df3151 100644
--- a/Spigot-Server-Patches/0163-Add-EntityZapEvent.patch
+++ b/Spigot-Server-Patches/0146-Add-EntityZapEvent.patch
@@ -1,14 +1,14 @@
-From 13f069785d26dfc9ab4f6f87fb7c7d5c40b1b8c9 Mon Sep 17 00:00:00 2001
+From c66ad22a6abf417c552de63b264628c814f718c1 Mon Sep 17 00:00:00 2001
 From: AlphaBlend <whizkid3000@hotmail.com>
 Date: Sun, 16 Oct 2016 23:19:30 -0700
 Subject: [PATCH] Add EntityZapEvent
 
 
 diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java
-index 94d011721..fcf99e668 100644
+index 286382399..2c7677b48 100644
 --- a/src/main/java/net/minecraft/server/EntityPig.java
 +++ b/src/main/java/net/minecraft/server/EntityPig.java
-@@ -158,6 +158,12 @@ public class EntityPig extends EntityAnimal {
+@@ -152,6 +152,12 @@ public class EntityPig extends EntityAnimal {
          if (!this.world.isClientSide && !this.dead) {
              EntityPigZombie entitypigzombie = new EntityPigZombie(this.world);
  
@@ -22,10 +22,10 @@ index 94d011721..fcf99e668 100644
              if (CraftEventFactory.callPigZapEvent(this, entitylightning, entitypigzombie).isCancelled()) {
                  return;
 diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java
-index 87ed31b21..9d201b14e 100644
+index 2ec695c9e..abfd9adbd 100644
 --- a/src/main/java/net/minecraft/server/EntityVillager.java
 +++ b/src/main/java/net/minecraft/server/EntityVillager.java
-@@ -638,6 +638,12 @@ public class EntityVillager extends EntityAgeable implements NPC, IMerchant {
+@@ -610,6 +610,12 @@ public class EntityVillager extends EntityAgeable implements NPC, IMerchant {
          if (!this.world.isClientSide && !this.dead) {
              EntityWitch entitywitch = new EntityWitch(this.world);
  
@@ -36,9 +36,9 @@ index 87ed31b21..9d201b14e 100644
 +            // Paper end
 +
              entitywitch.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch);
-             entitywitch.prepare(this.world.D(new BlockPosition(entitywitch)), (GroupDataEntity) null);
+             entitywitch.prepare(this.world.getDamageScaler(new BlockPosition(entitywitch)), (GroupDataEntity) null, (NBTTagCompound) null);
              entitywitch.setNoAI(this.isNoAI());
-@@ -646,7 +652,7 @@ public class EntityVillager extends EntityAgeable implements NPC, IMerchant {
+@@ -618,7 +624,7 @@ public class EntityVillager extends EntityAgeable implements NPC, IMerchant {
                  entitywitch.setCustomNameVisible(this.getCustomNameVisible());
              }
  
@@ -48,10 +48,10 @@ index 87ed31b21..9d201b14e 100644
          }
      }
 diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index bc84dd30f..ba7e5d181 100644
+index 1d39ebcfa..2a7f89537 100644
 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-@@ -684,6 +684,14 @@ public class CraftEventFactory {
+@@ -692,6 +692,14 @@ public class CraftEventFactory {
          return event;
      }
  
diff --git a/Spigot-Server-Patches/0146-Fix-Old-Sign-Conversion.patch b/Spigot-Server-Patches/0146-Fix-Old-Sign-Conversion.patch
deleted file mode 100644
index fe2673067..000000000
--- a/Spigot-Server-Patches/0146-Fix-Old-Sign-Conversion.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From b9cd2fb5f5d0dd6ef57e7d8b5c550d760e472077 Mon Sep 17 00:00:00 2001
-From: Aikar <aikar@aikar.co>
-Date: Fri, 17 Jun 2016 20:50:11 -0400
-Subject: [PATCH] Fix Old Sign Conversion
-
-1) Sign loading code was trying to parse the JSON before the check for oldSign.
-   That code could then skip the old sign converting code if it triggers a JSON parse exception.
-2) New Mojang Schematic system has Tile Entities in the new converted format, but missing the Bukkit.isConverted flag
-   This causes Igloos and such to render broken signs. We fix this by ignoring sign conversion for Defined Structures
-
-diff --git a/src/main/java/net/minecraft/server/DefinedStructure.java b/src/main/java/net/minecraft/server/DefinedStructure.java
-index 9f314204b..23da9467e 100644
---- a/src/main/java/net/minecraft/server/DefinedStructure.java
-+++ b/src/main/java/net/minecraft/server/DefinedStructure.java
-@@ -203,9 +203,11 @@ public class DefinedStructure {
-                                 definedstructure_blockinfo1.c.setInt("x", blockposition1.getX());
-                                 definedstructure_blockinfo1.c.setInt("y", blockposition1.getY());
-                                 definedstructure_blockinfo1.c.setInt("z", blockposition1.getZ());
-+                                tileentity.isLoadingStructure = true; // Paper
-                                 tileentity.load(definedstructure_blockinfo1.c);
-                                 tileentity.a(definedstructureinfo.b());
-                                 tileentity.a(definedstructureinfo.c());
-+                                tileentity.isLoadingStructure = false; // Paper
-                             }
-                         }
-                     }
-@@ -600,7 +602,7 @@ public class DefinedStructure {
-         public IBlockData a(int i) {
-             IBlockData iblockdata = (IBlockData) this.b.fromId(i);
- 
--            return iblockdata == null ? DefinedStructure.a.a : iblockdata;
-+            return iblockdata == null ? a : iblockdata; // Paper - decompile error - Blocks.AIR.getBlockData()
-         }
- 
-         public Iterator<IBlockData> iterator() {
-diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java
-index dfdc55583..d3bc13726 100644
---- a/src/main/java/net/minecraft/server/TileEntity.java
-+++ b/src/main/java/net/minecraft/server/TileEntity.java
-@@ -11,6 +11,7 @@ import org.bukkit.inventory.InventoryHolder; // CraftBukkit
- public abstract class TileEntity implements KeyedObject {
- 
-     public Timing tickTimer = MinecraftTimings.getTileEntityTimings(this); // Paper
-+    boolean isLoadingStructure = false; // Paper
-     private static final Logger a = LogManager.getLogger();
-     private static final RegistryMaterials<MinecraftKey, Class<? extends TileEntity>> f = new RegistryMaterials();
-     protected World world;
-diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java
-index 77a7b4458..54b719d91 100644
---- a/src/main/java/net/minecraft/server/TileEntitySign.java
-+++ b/src/main/java/net/minecraft/server/TileEntitySign.java
-@@ -77,13 +77,14 @@ public class TileEntitySign extends TileEntity {
-             }
- 
-             try {
--                IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s);
-+                //IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s); // Paper - move down - the old format might throw a json error
- 
--                if (oldSign) {
-+                if (oldSign && !isLoadingStructure) { // Paper - saved structures will be in the new format, but will not have isConverted
-                     lines[i] = org.bukkit.craftbukkit.util.CraftChatMessage.fromString(s)[0];
-                     continue;
-                 }
-                 // CraftBukkit end
-+                IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s); // Paper - after old sign
- 
-                 try {
-                     this.lines[i] = ChatComponentUtils.filterForDisplay(icommandlistener, ichatbasecomponent, (Entity) null);
--- 
-2.18.0
-
diff --git a/Spigot-Server-Patches/0147-Don-t-load-Chunks-from-Hoppers-and-other-things.patch b/Spigot-Server-Patches/0147-Don-t-load-Chunks-from-Hoppers-and-other-things.patch
new file mode 100644
index 000000000..89cd70d6e
--- /dev/null
+++ b/Spigot-Server-Patches/0147-Don-t-load-Chunks-from-Hoppers-and-other-things.patch
@@ -0,0 +1,35 @@
+From 3fae37b400f05dba3d1ca15ad221ac4127ba2c20 Mon Sep 17 00:00:00 2001
+From: Aikar <aikar@aikar.co>
+Date: Thu, 3 Nov 2016 20:28:12 -0400
+Subject: [PATCH] Don't load Chunks from Hoppers and other things
+
+Hoppers call this to I guess "get the primary side" of a double sided chest.
+
+If the double sided chest crosses chunk lines, it causes the chunk to load.
+This will end up causing sync chunk loads, which will unload with Chunk GC,
+only to be reloaded again the next tick.
+
+This of course is undesirable, so just return the loaded side as "primary"
+and treat it as a single chest if the other sides are unloaded
+
+diff --git a/src/main/java/net/minecraft/server/BlockChest.java b/src/main/java/net/minecraft/server/BlockChest.java
+index f8be07258..633c75ffe 100644
+--- a/src/main/java/net/minecraft/server/BlockChest.java
++++ b/src/main/java/net/minecraft/server/BlockChest.java
+@@ -196,7 +196,12 @@ public class BlockChest extends BlockTileEntity implements IFluidSource, IFluidC
+                 return (ITileInventory) object;
+             } else {
+                 BlockPosition blockposition1 = blockposition.shift(j(iblockdata));
+-                IBlockData iblockdata1 = world.getType(blockposition1);
++                // Paper start - don't load chunks if the other side of the chest is in unloaded chunk
++                final IBlockData iblockdata1 = world.getTypeIfLoaded(blockposition1); // Paper
++                if (iblockdata1 ==  null) {
++                    return null;
++                }
++                // Paper end
+ 
+                 if (iblockdata1.getBlock() == this) {
+                     BlockPropertyChestType blockpropertychesttype1 = (BlockPropertyChestType) iblockdata1.get(BlockChest.b);
+-- 
+2.18.0
+
diff --git a/Spigot-Server-Patches/0165-Prevent-Auto-Save-if-Save-Queue-is-full.patch b/Spigot-Server-Patches/0148-Prevent-Auto-Save-if-Save-Queue-is-full.patch
similarity index 78%
rename from Spigot-Server-Patches/0165-Prevent-Auto-Save-if-Save-Queue-is-full.patch
rename to Spigot-Server-Patches/0148-Prevent-Auto-Save-if-Save-Queue-is-full.patch
index cb1f83392..8dc51fd74 100644
--- a/Spigot-Server-Patches/0165-Prevent-Auto-Save-if-Save-Queue-is-full.patch
+++ b/Spigot-Server-Patches/0148-Prevent-Auto-Save-if-Save-Queue-is-full.patch
@@ -1,4 +1,4 @@
-From 8b4d08357734d240e14b6cef4b3ad9563cbfb822 Mon Sep 17 00:00:00 2001
+From 55d61d596dd28c87be9a6885282a21abc2caff4f Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Thu, 3 Nov 2016 21:52:22 -0400
 Subject: [PATCH] Prevent Auto Save if Save Queue is full
@@ -7,10 +7,10 @@ If the save queue already has 50 (configurable) of chunks pending,
 then avoid processing auto save (which would add more)
 
 diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 93b0af036..086a7fdaa 100644
+index 9a2ec0793..f88444c7e 100644
 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
 +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -380,6 +380,11 @@ public class PaperWorldConfig {
+@@ -315,6 +315,11 @@ public class PaperWorldConfig {
          maxAutoSaveChunksPerTick = getInt("max-auto-save-chunks-per-tick", 24);
      }
  
@@ -23,13 +23,13 @@ index 93b0af036..086a7fdaa 100644
      private void removeCorruptTEs() {
          removeCorruptTEs = getBoolean("remove-corrupt-tile-entities", false);
 diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
-index db81b4a8c..93e938a9d 100644
+index 1e6ea3084..9145401bc 100644
 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
 +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
-@@ -254,6 +254,14 @@ public class ChunkProviderServer implements IChunkProvider {
-         int i = 0;
+@@ -250,6 +250,14 @@ public class ChunkProviderServer implements IChunkProvider {
+         ArrayList arraylist = Lists.newArrayList(this.chunks.values());
+         Iterator iterator = arraylist.iterator();
  
-         // CraftBukkit start
 +        // Paper start
 +        final ChunkRegionLoader chunkLoader = (ChunkRegionLoader) world.getChunkProviderServer().chunkLoader;
 +        final int queueSize = chunkLoader.getQueueSize();
@@ -38,12 +38,12 @@ index db81b4a8c..93e938a9d 100644
 +        }
 +        final int autoSaveLimit = world.paperConfig.maxAutoSaveChunksPerTick;
 +        // Paper end
-         Iterator iterator = this.chunks.values().iterator();
          while (iterator.hasNext()) {
              Chunk chunk = (Chunk) iterator.next();
-@@ -267,7 +275,7 @@ public class ChunkProviderServer implements IChunkProvider {
+ 
+@@ -261,7 +269,7 @@ public class ChunkProviderServer implements IChunkProvider {
                  this.saveChunk(chunk, false); // Spigot
-                 chunk.f(false);
+                 chunk.a(false);
                  ++i;
 -                if (!flag && i >= world.paperConfig.maxAutoSaveChunksPerTick) { // Spigot - // Paper - Incremental Auto Save - cap max per tick
 +                if (!flag && i >= autoSaveLimit) { // Spigot - // Paper - Incremental Auto Save - cap max per tick
@@ -51,18 +51,18 @@ index db81b4a8c..93e938a9d 100644
                  }
              }
 diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
-index 8747d9a45..77943821e 100644
+index 063d53f1c..071e8a196 100644
 --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
 +++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
-@@ -39,6 +39,8 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
-         this.e = dataconvertermanager;
+@@ -99,6 +99,8 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
+         }
      }
  
 +    public int getQueueSize() { return queue.size(); } // Paper
 +
      // CraftBukkit start - Add async variant, provide compatibility
      @Nullable
-     public Chunk a(World world, int i, int j) throws IOException {
+     public synchronized Chunk a(GeneratorAccess generatoraccess, int i, int j, Consumer<Chunk> consumer) throws IOException {
 -- 
 2.18.0
 
diff --git a/Spigot-Server-Patches/0166-Chunk-Save-Stats-Debug-Option.patch b/Spigot-Server-Patches/0149-Chunk-Save-Stats-Debug-Option.patch
similarity index 77%
rename from Spigot-Server-Patches/0166-Chunk-Save-Stats-Debug-Option.patch
rename to Spigot-Server-Patches/0149-Chunk-Save-Stats-Debug-Option.patch
index 2233274d5..af4f2f903 100644
--- a/Spigot-Server-Patches/0166-Chunk-Save-Stats-Debug-Option.patch
+++ b/Spigot-Server-Patches/0149-Chunk-Save-Stats-Debug-Option.patch
@@ -1,4 +1,4 @@
-From 4c7de2e2109d66a5a3911af98b61c1af58e0d8a6 Mon Sep 17 00:00:00 2001
+From 6e299603426bfed427e4ae7bded471d86ab70a0b Mon Sep 17 00:00:00 2001
 From: Aikar <aikar@aikar.co>
 Date: Fri, 4 Nov 2016 02:12:10 -0400
 Subject: [PATCH] Chunk Save Stats Debug Option
@@ -8,22 +8,22 @@ Adds a command line flag to enable stats on how chunk saves are processing.
 Stats on current queue, how many was processed and how many were queued.
 
 diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
-index 93e938a9d..66ff1adf6 100644
+index 9145401bc..ef35eb7ec 100644
 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
 +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
-@@ -28,6 +28,11 @@ public class ChunkProviderServer implements IChunkProvider {
-     public final Set<Long> unloadQueue = Sets.newHashSet();
-     public final ChunkGenerator chunkGenerator;
-     private final IChunkLoader chunkLoader;
+@@ -36,6 +36,11 @@ public class ChunkProviderServer implements IChunkProvider {
+     public final Long2ObjectMap<Chunk> chunks = Long2ObjectMaps.synchronize(new ChunkMap(8192));
+     private final ChunkTaskScheduler f;
+     private final SchedulerBatch<ChunkCoordIntPair, ChunkStatus, ProtoChunk> g;
 +    // Paper start - chunk save stats
 +    private long lastQueuedSaves = 0L; // Paper
 +    private long lastProcessedSaves = 0L; // Paper
 +    private long lastSaveStatPrinted = System.currentTimeMillis();
 +    // Paper end
-     // Paper start
-     protected Chunk lastChunkByPos = null;
-     public Long2ObjectOpenHashMap<Chunk> chunks = new Long2ObjectOpenHashMap<Chunk>(8192) {
-@@ -257,6 +262,30 @@ public class ChunkProviderServer implements IChunkProvider {
+     public final WorldServer world;
+ 
+     public ChunkProviderServer(WorldServer worldserver, IChunkLoader ichunkloader, ChunkGenerator<?> chunkgenerator, IAsyncTaskHandler iasynctaskhandler) {
+@@ -253,6 +258,30 @@ public class ChunkProviderServer implements IChunkProvider {
          // Paper start
          final ChunkRegionLoader chunkLoader = (ChunkRegionLoader) world.getChunkProviderServer().chunkLoader;
          final int queueSize = chunkLoader.getQueueSize();
@@ -55,11 +55,11 @@ index 93e938a9d..66ff1adf6 100644
              return false;
          }
 diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
-index 77943821e..14f88e91d 100644
+index 071e8a196..fedc38dc1 100644
 --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
 +++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
-@@ -39,7 +39,13 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
-         this.e = dataconvertermanager;
+@@ -99,7 +99,13 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
+         }
      }
  
 -    public int getQueueSize() { return queue.size(); } // Paper
@@ -73,15 +73,15 @@ index 77943821e..14f88e91d 100644
  
      // CraftBukkit start - Add async variant, provide compatibility
      @Nullable
-@@ -163,6 +169,7 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
-         synchronized (lock) {  // Paper - Chunk queue improvements
-             this.b.put(chunkcoordintpair, nbttagcompound);
-         }
-+        queuedSaves++; // Paper
-         queue.add(new QueuedChunk(chunkcoordintpair, nbttagcompound)); // Paper - Chunk queue improvements
+@@ -291,6 +297,7 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
  
+     protected synchronized void a(ChunkCoordIntPair chunkcoordintpair, Supplier<NBTTagCompound> nbttagcompound) { // Spigot
+         queue.add(new QueuedChunk(chunkcoordintpair, nbttagcompound)); // Paper - Chunk queue improvements
++        queuedSaves++; // Paper
+         this.b.put(chunkcoordintpair, nbttagcompound);
          FileIOThread.a().a(this);
-@@ -187,6 +194,7 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
+     }
+@@ -314,6 +321,7 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver {
              return false;
          } else {
              ChunkCoordIntPair chunkcoordintpair = chunk.coords; // Paper - Chunk queue improvements
diff --git a/Spigot-Server-Patches/0167-Filter-bad-data-from-ArmorStand-and-SpawnEgg-items.patch b/Spigot-Server-Patches/0150-Filter-bad-data-from-ArmorStand-and-SpawnEgg-items.patch
similarity index 55%
rename from Spigot-Server-Patches/0167-Filter-bad-data-from-ArmorStand-and-SpawnEgg-items.patch
rename to Spigot-Server-Patches/0150-Filter-bad-data-from-ArmorStand-and-SpawnEgg-items.patch
index 339f847e8..a18e8f788 100644
--- a/Spigot-Server-Patches/0167-Filter-bad-data-from-ArmorStand-and-SpawnEgg-items.patch
+++ b/Spigot-Server-Patches/0150-Filter-bad-data-from-ArmorStand-and-SpawnEgg-items.patch
@@ -1,11 +1,11 @@
-From 051ae98e08452cc8838801081b84366dbc42b7f8 Mon Sep 17 00:00:00 2001
+From fe49df954c155646594c102bbf909fbbcc55a37d Mon Sep 17 00:00:00 2001
 From: Zach Brown <zach.brown@destroystokyo.com>
 Date: Sat, 12 Nov 2016 23:25:22 -0600
 Subject: [PATCH] Filter bad data from ArmorStand and SpawnEgg items
 
 
 diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-index 086a7fdaa..4b9bf3b4f 100644
+index f88444c7e..f64a5ef35 100644
 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
 +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
 @@ -3,6 +3,7 @@ package com.destroystokyo.paper;
@@ -16,7 +16,7 @@ index 086a7fdaa..4b9bf3b4f 100644
  import org.bukkit.configuration.file.YamlConfiguration;
  import org.spigotmc.SpigotWorldConfig;
  
-@@ -389,4 +390,12 @@ public class PaperWorldConfig {
+@@ -324,4 +325,12 @@ public class PaperWorldConfig {
      private void removeCorruptTEs() {
          removeCorruptTEs = getBoolean("remove-corrupt-tile-entities", false);
      }
@@ -30,44 +30,25 @@ index 086a7fdaa..4b9bf3b4f 100644
 +    }
  }
 diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java
-index 59acc9088..d0b67d8fd 100644
+index 1d4a7b64d..c4a25bd87 100644
 --- a/src/main/java/net/minecraft/server/EntityFallingBlock.java
 +++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java
-@@ -271,6 +271,14 @@ public class EntityFallingBlock extends Entity {
-             this.block = Block.getById(nbttagcompound.getByte("Tile") & 255).fromLegacyData(i);
-         }
+@@ -228,6 +228,15 @@ public class EntityFallingBlock extends Entity {
  
+     protected void a(NBTTagCompound nbttagcompound) {
+         this.block = GameProfileSerializer.d(nbttagcompound.getCompound("BlockState"));
++
 +        // Paper start - Block FallingBlocks with Command Blocks
 +        // Check mappings on update - dc = "repeating_command_block" - dd = "chain_command_block"
 +        final Block b = this.block.getBlock();
-+        if (this.world.paperConfig.filterNBTFromSpawnEgg && (b == Blocks.COMMAND_BLOCK || b == Blocks.dc || b == Blocks.dd)) {
++        if (this.world.paperConfig.filterNBTFromSpawnEgg && (b == Blocks.COMMAND_BLOCK || b == Blocks.REPEATING_COMMAND_BLOCK || b == Blocks.CHAIN_COMMAND_BLOCK)) {
 +            this.block = Blocks.STONE.getBlockData();
 +        }
 +        // Paper end
 +
          this.ticksLived = nbttagcompound.getInt("Time");
-         Block block = this.block.getBlock();
- 
-diff --git a/src/main/java/net/minecraft/server/ItemMonsterEgg.java b/src/main/java/net/minecraft/server/ItemMonsterEgg.java
-index b24f7d8b2..5a08f6b4e 100644
---- a/src/main/java/net/minecraft/server/ItemMonsterEgg.java
-+++ b/src/main/java/net/minecraft/server/ItemMonsterEgg.java
-@@ -102,7 +102,14 @@ public class ItemMonsterEgg extends Item {
-                 NBTTagCompound nbttagcompound1 = entity.save(new NBTTagCompound());
-                 UUID uuid = entity.getUniqueID();
- 
--                nbttagcompound1.a(nbttagcompound.getCompound("EntityTag"));
-+                // Paper start - Filter out position and motion information
-+                final NBTTagCompound entityTag = nbttagcompound.getCompound("EntityTag");
-+                if (world.paperConfig.filterNBTFromSpawnEgg) {
-+                    entityTag.remove("Pos");
-+                    entityTag.remove("Motion");
-+                }
-+                nbttagcompound1.a(entityTag);
-+                // Paper end
-                 entity.a(uuid);
-                 entity.f(nbttagcompound1);
-             }
+         if (nbttagcompound.hasKeyOfType("HurtEntities", 99)) {
+             this.hurtEntities = nbttagcompound.getBoolean("HurtEntities");
 -- 
 2.18.0
 
diff --git a/Spigot-Server-Patches/0168-Cache-user-authenticator-threads.patch b/Spigot-Server-Patches/0151-Cache-user-authenticator-threads.patch
similarity index 69%
rename from Spigot-Server-Patches/0168-Cache-user-authenticator-threads.patch
rename to Spigot-Server-Patches/0151-Cache-user-authenticator-threads.patch
index 41386948d..fb6e8338f 100644
--- a/Spigot-Server-Patches/0168-Cache-user-authenticator-threads.patch
+++ b/Spigot-Server-Patches/0151-Cache-user-authenticator-threads.patch
@@ -1,14 +1,14 @@
-From 9f3a20649274a2ecc29be930cb9257172ce21902 Mon Sep 17 00:00:00 2001
+From a2e44a310b6d7c52649acda35aba0cd677d3a7e7 Mon Sep 17 00:00:00 2001
 From: vemacs <d@nkmem.es>
 Date: Wed, 23 Nov 2016 08:31:45 -0500
 Subject: [PATCH] Cache user authenticator threads
 
 
 diff --git a/src/main/java/net/minecraft/server/LoginListener.java b/src/main/java/net/minecraft/server/LoginListener.java
-index 57f728567..2158fcd32 100644
+index 2f6d79b03..89a11a496 100644
 --- a/src/main/java/net/minecraft/server/LoginListener.java
 +++ b/src/main/java/net/minecraft/server/LoginListener.java
-@@ -96,6 +96,12 @@ public class LoginListener implements PacketLoginInListener, ITickable {
+@@ -93,6 +93,12 @@ public class LoginListener implements PacketLoginInListener, ITickable {
  
      }
  
@@ -21,8 +21,8 @@ index 57f728567..2158fcd32 100644
      // Spigot start
      public void initUUID()
      {
-@@ -178,8 +184,8 @@ public class LoginListener implements PacketLoginInListener, ITickable {
-             this.networkManager.sendPacket(new PacketLoginOutEncryptionBegin("", this.server.O().getPublic(), this.e));
+@@ -169,8 +175,8 @@ public class LoginListener implements PacketLoginInListener, ITickable {
+             this.networkManager.sendPacket(new PacketLoginOutEncryptionBegin("", this.server.G().getPublic(), this.e));
          } else {
              // Spigot start
 -            new Thread("User Authenticator #" + LoginListener.b.incrementAndGet()) {
@@ -32,7 +32,7 @@ index 57f728567..2158fcd32 100644
                  @Override
                  public void run() {
                      try {
-@@ -191,7 +197,8 @@ public class LoginListener implements PacketLoginInListener, ITickable {
+@@ -182,7 +188,8 @@ public class LoginListener implements PacketLoginInListener, ITickable {
                          server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + i.getName(), ex);
                      }
                  }
@@ -42,21 +42,24 @@ index 57f728567..2158fcd32 100644
              // Spigot end
          }
  
-@@ -207,7 +214,8 @@ public class LoginListener implements PacketLoginInListener, ITickable {
+@@ -198,7 +205,8 @@ public class LoginListener implements PacketLoginInListener, ITickable {
              this.loginKey = packetlogininencryptionbegin.a(privatekey);
              this.g = LoginListener.EnumProtocolState.AUTHENTICATING;
              this.networkManager.a(this.loginKey);
--            (new Thread("User Authenticator #" + LoginListener.b.incrementAndGet()) {
+-            Thread thread = new Thread("User Authenticator #" + LoginListener.b.incrementAndGet()) {
 +            // Paper start - Cache authenticator threads
 +            authenticatorPool.execute(new Runnable() {
                  public void run() {
                      GameProfile gameprofile = LoginListener.this.i;
  
-@@ -254,7 +262,8 @@ public class LoginListener implements PacketLoginInListener, ITickable {
+@@ -245,10 +253,8 @@ public class LoginListener implements PacketLoginInListener, ITickable {
  
-                     return LoginListener.this.server.ac() && socketaddress instanceof InetSocketAddress ? ((InetSocketAddress) socketaddress).getAddress() : null;
+                     return LoginListener.this.server.U() && socketaddress instanceof InetSocketAddress ? ((InetSocketAddress) socketaddress).getAddress() : null;
                  }
--            }).start();
+-            };
+-
+-            thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(LoginListener.c));
+-            thread.start();
 +            });
 +            // Paper end
          }
diff --git a/Spigot-Server-Patches/0152-Optimize-Network-Queue.patch b/Spigot-Server-Patches/0152-Optimize-Network-Queue.patch
new file mode 100644
index 000000000..c1a6ea2a7
--- /dev/null
+++ b/Spigot-Server-Patches/0152-Optimize-Network-Queue.patch
@@ -0,0 +1,22 @@
+From 146ed7d9845c818bcf091214784ba462f02ae69e Mon Sep 17 00:00:00 2001
+From: vemacs <d@nkmem.es>
+Date: Wed, 23 Nov 2016 12:54:56 -0500
+Subject: [PATCH] Optimize Network Queue
+
+
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index bf020293d..f81ff5628 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -118,7 +118,7 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati
+     private final GameProfileRepository W;
+     private final UserCache X;
+     private long Y;
+-    protected final Queue<FutureTask<?>> g = Queues.newConcurrentLinkedQueue();
++    protected final Queue<FutureTask<?>> g = new com.destroystokyo.paper.utils.CachedSizeConcurrentLinkedQueue<>(); // Spigot, PAIL: Rename // Paper - Make size() constant-time
+     private Thread serverThread;
+     private long aa = SystemUtils.b();
+     private final IReloadableResourceManager ac;
+-- 
+2.18.0
+
diff --git a/Spigot-Server-Patches/0170-Optimise-removeQueue.patch b/Spigot-Server-Patches/0153-Optimise-removeQueue.patch
similarity index 72%
rename from Spigot-Server-Patches/0170-Optimise-removeQueue.patch
rename to Spigot-Server-Patches/0153-Optimise-removeQueue.patch
index d4e629a01..b1965051a 100644
--- a/Spigot-Server-Patches/0170-Optimise-removeQueue.patch
+++ b/Spigot-Server-Patches/0153-Optimise-removeQueue.patch
@@ -1,34 +1,34 @@
-From 620aaee71fea323a42cfb6674a33a1b715c03a99 Mon Sep 17 00:00:00 2001
+From 1e1c86320251ddee4d47d350d6aeafba60214f49 Mon Sep 17 00:00:00 2001
 From: Alfie Cleveland <alfeh@me.com>
 Date: Fri, 25 Nov 2016 13:22:40 +0000
 Subject: [PATCH] Optimise removeQueue
 
 
 diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
-index 7886eee61..f8e289475 100644
+index dc32dc80d..cf2a39384 100644
 --- a/src/main/java/net/minecraft/server/EntityPlayer.java
 +++ b/src/main/java/net/minecraft/server/EntityPlayer.java
-@@ -3,8 +3,10 @@ package net.minecraft.server;
- import com.google.common.collect.Lists;
- import com.mojang.authlib.GameProfile;
+@@ -5,8 +5,10 @@ import com.mojang.authlib.GameProfile;
  import io.netty.buffer.Unpooled;
+ import io.netty.util.concurrent.Future;
+ import io.netty.util.concurrent.GenericFutureListener;
 +import java.util.ArrayDeque; // Paper
  import java.util.ArrayList;
  import java.util.Collection;
 +import java.util.Deque; // Paper
  import java.util.Iterator;
  import java.util.List;
- import javax.annotation.Nullable;
-@@ -38,7 +40,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+ import java.util.Random;
+@@ -44,7 +46,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
      public final PlayerInteractManager playerInteractManager;
      public double d;
      public double e;
 -    public final List<Integer> removeQueue = Lists.newLinkedList();
 +    public final Deque<Integer> removeQueue = new ArrayDeque<>(); // Paper
-     private final AdvancementDataPlayer bY;
-     private final ServerStatisticManager bZ;
-     private float ca = Float.MIN_VALUE;
-@@ -295,10 +297,17 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+     private final AdvancementDataPlayer cg;
+     private final ServerStatisticManager ch;
+     private float ci = Float.MIN_VALUE;
+@@ -351,10 +353,17 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
              Iterator iterator = this.removeQueue.iterator();
              int j = 0;
  
@@ -47,18 +47,18 @@ index 7886eee61..f8e289475 100644
  
              this.playerConnection.sendPacket(new PacketPlayOutEntityDestroy(aint));
          }
-@@ -1112,7 +1121,11 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+@@ -1119,7 +1128,11 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
          this.lastHealthSent = -1.0F;
-         this.ch = -1;
-         // this.cr.a((RecipeBook) entityplayer.cr); // CraftBukkit
+         this.cp = -1;
+         // this.cz.a((RecipeBook) entityplayer.cz); // CraftBukkit
 -        this.removeQueue.addAll(entityplayer.removeQueue);
 +        // Paper start - Optimize remove queue
 +        //this.removeQueue.addAll(entityplayer.removeQueue);
 +        if (this.removeQueue != entityplayer.removeQueue) {
 +            this.removeQueue.addAll(entityplayer.removeQueue);
 +        }
-         this.cq = entityplayer.cq;
-         this.cv = entityplayer.cv;
+         this.cy = entityplayer.cy;
+         this.cD = entityplayer.cD;
          this.setShoulderEntityLeft(entityplayer.getShoulderEntityLeft());
 -- 
 2.18.0
diff --git a/Spigot-Server-Patches/0171-Allow-Reloading-of-Command-Aliases.patch b/Spigot-Server-Patches/0154-Allow-Reloading-of-Command-Aliases.patch
similarity index 89%
rename from Spigot-Server-Patches/0171-Allow-Reloading-of-Command-Aliases.patch
rename to Spigot-Server-Patches/0154-Allow-Reloading-of-Command-Aliases.patch
index 0ec409182..9e62e9044 100644
--- a/Spigot-Server-Patches/0171-Allow-Reloading-of-Command-Aliases.patch
+++ b/Spigot-Server-Patches/0154-Allow-Reloading-of-Command-Aliases.patch
@@ -1,4 +1,4 @@
-From bd9e06a79e32b2c983c41827e7c4127c3436f6cc Mon Sep 17 00:00:00 2001
+From 92afeaf4b7ea1551a2a035a2e0443e28571f5a00 Mon Sep 17 00:00:00 2001
 From: willies952002 <admin@domnian.com>
 Date: Mon, 28 Nov 2016 10:21:52 -0500
 Subject: [PATCH] Allow Reloading of Command Aliases
@@ -6,10 +6,10 @@ Subject: [PATCH] Allow Reloading of Command Aliases
 Reload the aliases stored in commands.yml
 
 diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index d3165763c..41357cb0e 100644
+index a36192362..f3dfd65d6 100644
 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
 +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -1889,5 +1889,24 @@ public final class CraftServer implements Server {
+@@ -1985,5 +1985,24 @@ public final class CraftServer implements Server {
              });
          }
      }
diff --git a/Spigot-Server-Patches/0172-Add-source-to-PlayerExpChangeEvent.patch b/Spigot-Server-Patches/0155-Add-source-to-PlayerExpChangeEvent.patch
similarity index 80%
rename from Spigot-Server-Patches/0172-Add-source-to-PlayerExpChangeEvent.patch
rename to Spigot-Server-Patches/0155-Add-source-to-PlayerExpChangeEvent.patch
index a63d67526..507e131bf 100644
--- a/Spigot-Server-Patches/0172-Add-source-to-PlayerExpChangeEvent.patch
+++ b/Spigot-Server-Patches/0155-Add-source-to-PlayerExpChangeEvent.patch
@@ -1,15 +1,15 @@
-From a5060ec7126dd0c5ea6396bffc5a17ca54ba650b Mon Sep 17 00:00:00 2001
+From 6ad2b5f736ba163164761a7ef91c718e52aaddfa Mon Sep 17 00:00:00 2001
 From: AlphaBlend <whizkid3000@hotmail.com>
 Date: Thu, 8 Sep 2016 08:48:33 -0700
 Subject: [PATCH] Add source to PlayerExpChangeEvent
 
 
 diff --git a/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/src/main/java/net/minecraft/server/EntityExperienceOrb.java
-index eae706368..bf5f1f0e8 100644
+index c8698b2f6..3c888d601 100644
 --- a/src/main/java/net/minecraft/server/EntityExperienceOrb.java
 +++ b/src/main/java/net/minecraft/server/EntityExperienceOrb.java
-@@ -178,7 +178,7 @@ public class EntityExperienceOrb extends Entity {
- 				}
+@@ -185,7 +185,7 @@ public class EntityExperienceOrb extends Entity {
+                 }
  
                  if (this.value > 0) {
 -                    entityhuman.giveExp(CraftEventFactory.callPlayerExpChangeEvent(entityhuman, this.value).getAmount()); // CraftBukkit - this.value -> event.getAmount()
@@ -18,7 +18,7 @@ index eae706368..bf5f1f0e8 100644
  
                  this.die();
 diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index ba7e5d181..87b4e9189 100644
+index 2a7f89537..e32d7fdd1 100644
 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 @@ -46,6 +46,7 @@ import org.bukkit.entity.Player;
@@ -29,7 +29,7 @@ index ba7e5d181..87b4e9189 100644
  import org.bukkit.event.Cancellable;
  import org.bukkit.event.Event;
  import org.bukkit.event.block.*;
-@@ -656,6 +657,17 @@ public class CraftEventFactory {
+@@ -661,6 +662,17 @@ public class CraftEventFactory {
          return event;
      }
  
@@ -44,9 +44,9 @@ index ba7e5d181..87b4e9189 100644
 +    }
 +    // Paper end
 +
-     public static boolean handleBlockGrowEvent(World world, int x, int y, int z, net.minecraft.server.Block type, int data) {
-         Block block = world.getWorld().getBlockAt(x, y, z);
-         CraftBlockState state = (CraftBlockState) block.getState();
+     public static boolean handleBlockGrowEvent(World world, BlockPosition pos, IBlockData block) {
+         return handleBlockGrowEvent(world, pos, block, 3);
+     }
 -- 
 2.18.0
 
diff --git a/Spigot-Server-Patches/0156-Optimize-World.isLoaded-BlockPosition-Z.patch b/Spigot-Server-Patches/0156-Optimize-World.isLoaded-BlockPosition-Z.patch
new file mode 100644
index 000000000..19bd38247
--- /dev/null
+++ b/Spigot-Server-Patches/0156-Optimize-World.isLoaded-BlockPosition-Z.patch
@@ -0,0 +1,25 @@
+From 449f4ed9e6999fef7cb2a95bbde1eaba7894e946 Mon Sep 17 00:00:00 2001
+From: Aikar <aikar@aikar.co>
+Date: Fri, 2 Dec 2016 00:11:43 -0500
+Subject: [PATCH] Optimize World.isLoaded(BlockPosition)Z
+
+Reduce method invocations for World.isLoaded(BlockPosition)Z
+
+diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
+index 3b2de1f31..0ba99bcbc 100644
+--- a/src/main/java/net/minecraft/server/World.java
++++ b/src/main/java/net/minecraft/server/World.java
+@@ -273,6 +273,10 @@ public abstract class World implements GeneratorAccess, IIBlockAccess, AutoClose
+         return this.getType(blockposition).isAir();
+     }
+ 
++    public boolean isLoaded(BlockPosition blockposition) {
++        return getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4) != null; // Paper
++    }
++
+     // Paper start
+     public Chunk getChunkIfLoaded(BlockPosition blockposition) {
+         return ((ChunkProviderServer) this.chunkProvider).getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4);
+-- 
+2.18.0
+
diff --git a/Spigot-Server-Patches/0175-Don-t-let-fishinghooks-use-portals.patch b/Spigot-Server-Patches/0157-Don-t-let-fishinghooks-use-portals.patch
similarity index 69%
rename from Spigot-Server-Patches/0175-Don-t-let-fishinghooks-use-portals.patch
rename to Spigot-Server-Patches/0157-Don-t-let-fishinghooks-use-portals.patch
index 1a3627797..a07e15c55 100644
--- a/Spigot-Server-Patches/0175-Don-t-let-fishinghooks-use-portals.patch
+++ b/Spigot-Server-Patches/0157-Don-t-let-fishinghooks-use-portals.patch
@@ -1,27 +1,27 @@
-From 5f57f26f976b45cda5fcda4dffebc4981d748109 Mon Sep 17 00:00:00 2001
+From 3ff34f57ccb9cc01fe8512784f15a6b2cefff8fb Mon Sep 17 00:00:00 2001
 From: Zach Brown <zach.brown@destroystokyo.com>
 Date: Fri, 16 Dec 2016 16:03:19 -0600
 Subject: [PATCH] Don't let fishinghooks use portals
 
 
 diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
-index c675a6e16..f71528b5f 100644
+index 51b42933d..eb2a693af 100644
 --- a/src/main/java/net/minecraft/server/Entity.java
 +++ b/src/main/java/net/minecraft/server/Entity.java
-@@ -144,7 +144,7 @@ public abstract class Entity implements ICommandListener, KeyedObject { // Paper
-     public boolean ah;
+@@ -143,7 +143,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+     public boolean ak;
      public boolean impulse;
      public int portalCooldown;
--    protected boolean ak;
-+    protected boolean ak; public boolean inPortal() { return ak; } // Paper - OBFHELPER
-     protected int al;
+-    protected boolean an;
++    protected boolean an; public boolean inPortal() { return an; } // Paper - OBFHELPER
+     protected int ao;
      public int dimension;
-     protected BlockPosition an;
+     protected BlockPosition aq;
 diff --git a/src/main/java/net/minecraft/server/EntityFishingHook.java b/src/main/java/net/minecraft/server/EntityFishingHook.java
-index 339d1f1b1..7f011aef8 100644
+index 866f41980..8630184d4 100644
 --- a/src/main/java/net/minecraft/server/EntityFishingHook.java
 +++ b/src/main/java/net/minecraft/server/EntityFishingHook.java
-@@ -185,6 +185,12 @@ public class EntityFishingHook extends Entity {
+@@ -190,6 +190,12 @@ public class EntityFishingHook extends Entity {
              this.motY *= 0.92D;
              this.motZ *= 0.92D;
              this.setPosition(this.locX, this.locY, this.locZ);
diff --git a/Spigot-Server-Patches/0176-Add-ProjectileCollideEvent.patch b/Spigot-Server-Patches/0158-Add-ProjectileCollideEvent.patch
similarity index 87%
rename from Spigot-Server-Patches/0176-Add-ProjectileCollideEvent.patch
rename to Spigot-Server-Patches/0158-Add-ProjectileCollideEvent.patch
index 50becc730..dc7525a24 100644
--- a/Spigot-Server-Patches/0176-Add-ProjectileCollideEvent.patch
+++ b/Spigot-Server-Patches/0158-Add-ProjectileCollideEvent.patch
@@ -1,18 +1,19 @@
-From 14204e807bf59765b9126dceee7a62469db61a16 Mon Sep 17 00:00:00 2001
+From 1fde28664611a9d358932373b047810dd1f48acd Mon Sep 17 00:00:00 2001
 From: Techcable <Techcable@outlook.com>
 Date: Fri, 16 Dec 2016 21:25:39 -0600
 Subject: [PATCH] Add ProjectileCollideEvent
 
 
 diff --git a/src/main/java/net/minecraft/server/EntityArrow.java b/src/main/java/net/minecraft/server/EntityArrow.java
-index 86836a5d0..8a9e16ad6 100644
+index 75445b00d..4ab875a3d 100644
 --- a/src/main/java/net/minecraft/server/EntityArrow.java
 +++ b/src/main/java/net/minecraft/server/EntityArrow.java
-@@ -190,6 +190,15 @@ public abstract class EntityArrow extends Entity implements IProjectile {
+@@ -191,6 +191,16 @@ public abstract class EntityArrow extends Entity implements IProjectile {
                  }
              }
  
 +            // Paper start - Call ProjectileCollideEvent
++            // TODO: flag - noclip - call cancelled?
 +            if (movingobjectposition != null && movingobjectposition.entity != null) {
 +                com.destroystokyo.paper.event.entity.ProjectileCollideEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileCollideEvent(this, movingobjectposition);
 +                if (event.isCancelled()) {
@@ -21,14 +22,14 @@ index 86836a5d0..8a9e16ad6 100644
 +            }
 +            // Paper end
 +
-             if (movingobjectposition != null) {
+             if (movingobjectposition != null && !flag) {
                  this.a(movingobjectposition);
-             }
+                 this.impulse = true;
 diff --git a/src/main/java/net/minecraft/server/EntityFireball.java b/src/main/java/net/minecraft/server/EntityFireball.java
-index 365e070f8..657b3b5ac 100644
+index 3e3619d79..58cc4824c 100644
 --- a/src/main/java/net/minecraft/server/EntityFireball.java
 +++ b/src/main/java/net/minecraft/server/EntityFireball.java
-@@ -70,6 +70,15 @@ public abstract class EntityFireball extends Entity {
+@@ -68,6 +68,15 @@ public abstract class EntityFireball extends Entity {
              ++this.f;
              MovingObjectPosition movingobjectposition = ProjectileHelper.a(this, true, this.f >= 25, this.shooter);
  
@@ -45,10 +46,10 @@ index 365e070f8..657b3b5ac 100644
                  this.a(movingobjectposition);
  
 diff --git a/src/main/java/net/minecraft/server/EntityFishingHook.java b/src/main/java/net/minecraft/server/EntityFishingHook.java
-index 7f011aef8..6ac89d1e3 100644
+index 8630184d4..7440e4a2a 100644
 --- a/src/main/java/net/minecraft/server/EntityFishingHook.java
 +++ b/src/main/java/net/minecraft/server/EntityFishingHook.java
-@@ -240,6 +240,16 @@ public class EntityFishingHook extends Entity {
+@@ -245,6 +245,16 @@ public class EntityFishingHook extends Entity {
  
          vec3d = new Vec3D(this.locX, this.locY, this.locZ);
          vec3d1 = new Vec3D(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ);
@@ -66,10 +67,10 @@ index 7f011aef8..6ac89d1e3 100644
              vec3d1 = new Vec3D(movingobjectposition.pos.x, movingobjectposition.pos.y, movingobjectposition.pos.z);
          }
 diff --git a/src/main/java/net/minecraft/server/EntityProjectile.java b/src/main/java/net/minecraft/server/EntityProjectile.java
-index cfcaf3832..01c7fcc8b 100644
+index ee402d414..fc8c0cab5 100644
 --- a/src/main/java/net/minecraft/server/EntityProjectile.java
 +++ b/src/main/java/net/minecraft/server/EntityProjectile.java
-@@ -160,6 +160,15 @@ public abstract class EntityProjectile extends Entity implements IProjectile {
+@@ -144,6 +144,15 @@ public abstract class EntityProjectile extends Entity implements IProjectile {
              movingobjectposition = new MovingObjectPosition(entity);
          }
  
@@ -83,13 +84,13 @@ index cfcaf3832..01c7fcc8b 100644
 +        // Paper end
 +
          if (movingobjectposition != null) {
-             if (movingobjectposition.type == MovingObjectPosition.EnumMovingObjectType.BLOCK && this.world.getType(movingobjectposition.a()).getBlock() == Blocks.PORTAL) {
+             if (movingobjectposition.type == MovingObjectPosition.EnumMovingObjectType.BLOCK && this.world.getType(movingobjectposition.a()).getBlock() == Blocks.NETHER_PORTAL) {
                  this.e(movingobjectposition.a());
 diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index 87b4e9189..06a277b3b 100644
+index e32d7fdd1..3f9a66002 100644
 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-@@ -805,6 +805,16 @@ public class CraftEventFactory {
+@@ -797,6 +797,16 @@ public class CraftEventFactory {
          return CraftItemStack.asNMSCopy(bitem);
      }
  
diff --git a/Spigot-Server-Patches/0160-Raise-string-limit-for-packet-serialization.patch b/Spigot-Server-Patches/0160-Raise-string-limit-for-packet-serialization.patch
deleted file mode 100644
index 66b93ea88..000000000
--- a/Spigot-Server-Patches/0160-Raise-string-limit-for-packet-serialization.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-From 650f61273af6eb6f665ba0395293aaa4ce1eee97 Mon Sep 17 00:00:00 2001
-From: Aikar <aikar@aikar.co>
-Date: Wed, 21 Sep 2016 23:54:20 -0400
-Subject: [PATCH] Raise string limit for packet serialization
-
-The default limit is possible to hit with 50 page books with color codes, causing clients to disconnect.
-
-Bump the limit up a hair to above currently seen sizes.
-
-diff --git a/src/main/java/net/minecraft/server/PacketDataSerializer.java b/src/main/java/net/minecraft/server/PacketDataSerializer.java
-index a8fc7e431..c1273e988 100644
---- a/src/main/java/net/minecraft/server/PacketDataSerializer.java
-+++ b/src/main/java/net/minecraft/server/PacketDataSerializer.java
-@@ -300,8 +300,8 @@ public class PacketDataSerializer extends ByteBuf {
-     public PacketDataSerializer a(String s) {
-         byte[] abyte = s.getBytes(StandardCharsets.UTF_8);
- 
--        if (abyte.length > 32767) {
--            throw new EncoderException("String too big (was " + abyte.length + " bytes encoded, max " + 32767 + ")");
-+        if (abyte.length > 44767) { // Paper - raise limit a bit more as normal means can trigger this
-+            throw new EncoderException("String too big (was " + s.length() + " bytes encoded, max " + 44767 + ")"); // Paper
-         } else {
-             this.d(abyte.length);
-             this.writeBytes(abyte);
--- 
-2.18.0
-
diff --git a/Spigot-Server-Patches/0164-Don-t-load-Chunks-from-Hoppers-and-other-things.patch b/Spigot-Server-Patches/0164-Don-t-load-Chunks-from-Hoppers-and-other-things.patch
deleted file mode 100644
index db42f4e11..000000000
--- a/Spigot-Server-Patches/0164-Don-t-load-Chunks-from-Hoppers-and-other-things.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 3d7dc05a042dca4e664cbabe11769c6b80da55af Mon Sep 17 00:00:00 2001
-From: Aikar <aikar@aikar.co>
-Date: Thu, 3 Nov 2016 20:28:12 -0400
-Subject: [PATCH] Don't load Chunks from Hoppers and other things
-
-Hoppers call this to I guess "get the primary side" of a double sided chest.
-
-If the double sided chest crosses chunk lines, it causes the chunk to load.
-This will end up causing sync chunk loads, which will unload with Chunk GC,
-only to be reloaded again the next tick.
-
-This of course is undesirable, so just return the loaded side as "primary"
-and treat it as a single chest if the other sides are unloaded
-
-diff --git a/src/main/java/net/minecraft/server/BlockChest.java b/src/main/java/net/minecraft/server/BlockChest.java
-index bc398ec52..90267a1fb 100644
---- a/src/main/java/net/minecraft/server/BlockChest.java
-+++ b/src/main/java/net/minecraft/server/BlockChest.java
-@@ -339,7 +339,13 @@ public class BlockChest extends BlockTileEntity {
-                 while (iterator.hasNext()) {
-                     EnumDirection enumdirection = (EnumDirection) iterator.next();
-                     BlockPosition blockposition1 = blockposition.shift(enumdirection);
--                    Block block = world.getType(blockposition1).getBlock();
-+                    // Paper start - don't load chunks if the other side of the chest is in unloaded chunk
-+                    final IBlockData type = world.getTypeIfLoaded(blockposition1); // Paper
-+                    if (type ==  null) {
-+                        continue;
-+                    }
-+                    Block block = type.getBlock();
-+                    // Paper end
- 
-                     if (block == this) {
-                         if (this.e(world, blockposition1)) {
--- 
-2.18.0
-
diff --git a/Spigot-Server-Patches/0169-Optimize-Network-Queue.patch b/Spigot-Server-Patches/0169-Optimize-Network-Queue.patch
deleted file mode 100644
index eaabd86f5..000000000
--- a/Spigot-Server-Patches/0169-Optimize-Network-Queue.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From d3c90cc09b0a21f0ff27b57d39cff7634386b55f Mon Sep 17 00:00:00 2001
-From: vemacs <d@nkmem.es>
-Date: Wed, 23 Nov 2016 12:54:56 -0500
-Subject: [PATCH] Optimize Network Queue
-
-
-diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 5c09c6ff7..13c6b5ccd 100644
---- a/src/main/java/net/minecraft/server/MinecraftServer.java
-+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -104,7 +104,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IAs
-     private final GameProfileRepository X;
-     private final UserCache Y;
-     private long Z;
--    protected final Queue<FutureTask<?>> j = new java.util.concurrent.ConcurrentLinkedQueue<FutureTask<?>>(); // Spigot, PAIL: Rename
-+    protected final Queue<FutureTask<?>> j = new com.destroystokyo.paper.utils.CachedSizeConcurrentLinkedQueue<>(); // Spigot, PAIL: Rename // Paper - Make size() constant-time
-     private Thread serverThread;
-     private long ab = aw();
- 
--- 
-2.18.0
-
diff --git a/Spigot-Server-Patches/0173-Optimize-World.isLoaded-BlockPosition-Z.patch b/Spigot-Server-Patches/0173-Optimize-World.isLoaded-BlockPosition-Z.patch
deleted file mode 100644
index 9df0319e4..000000000
--- a/Spigot-Server-Patches/0173-Optimize-World.isLoaded-BlockPosition-Z.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From 1ae942442cdb03e6bc32f33adafa4b0ab464e99f Mon Sep 17 00:00:00 2001
-From: Aikar <aikar@aikar.co>
-Date: Fri, 2 Dec 2016 00:11:43 -0500
-Subject: [PATCH] Optimize World.isLoaded(BlockPosition)Z
-
-Reduce method invocations for World.isLoaded(BlockPosition)Z
-
-diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
-index 000d2eeb9..d7bf8378e 100644
---- a/src/main/java/net/minecraft/server/World.java
-+++ b/src/main/java/net/minecraft/server/World.java
-@@ -290,7 +290,7 @@ public abstract class World implements IBlockAccess {
-     }
- 
-     public boolean isLoaded(BlockPosition blockposition) {
--        return this.a(blockposition, true);
-+        return getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4) != null; // Paper
-     }
- 
-     public boolean a(BlockPosition blockposition, boolean flag) {
--- 
-2.18.0
-
diff --git a/Spigot-Server-Patches/0174-Speedup-BlockPos-by-fixing-inlining.patch b/removed/0174-Speedup-BlockPos-by-fixing-inlining.patch
similarity index 100%
rename from Spigot-Server-Patches/0174-Speedup-BlockPos-by-fixing-inlining.patch
rename to removed/0174-Speedup-BlockPos-by-fixing-inlining.patch
diff --git a/work/CraftBukkit b/work/CraftBukkit
index 1fccb8950..b4bff6fc3 160000
--- a/work/CraftBukkit
+++ b/work/CraftBukkit
@@ -1 +1 @@
-Subproject commit 1fccb8950186caae273e45f1b08ebe2797214293
+Subproject commit b4bff6fc3d3f80a7e297624f5d9dbf3ec7d6f6aa