From 69ff788454fe936a8a6b851c88a7e316eae1bb69 Mon Sep 17 00:00:00 2001
From: Zach Brown <zach.brown@destroystokyo.com>
Date: Sat, 30 May 2015 01:21:00 -0500
Subject: [PATCH] Remove Spigot TileEntity/Enity Tick Time Capping

Appears to cause visual glitches with TNT Entities and certain types of cannons
TileEntity cap removed as we implement our own solution in a later (next) patch.

diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index d30b406..bdf4896 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -125,8 +125,6 @@ public abstract class World implements IBlockAccess {
     private final byte chunkTickRadius;
     public static boolean haveWeSilencedAPhysicsCrash;
     public static String blockLocation;
-    private org.spigotmc.TickLimiter entityLimiter;
-    private org.spigotmc.TickLimiter tileLimiter;
     private int tileTickPosition;
 
     public static long chunkToKey(int x, int z)
@@ -219,9 +217,7 @@ public abstract class World implements IBlockAccess {
         this.getServer().addWorld(this.world); 
         // CraftBukkit end
         this.keepSpawnInMemory = this.paperSpigotConfig.keepSpawnInMemory; // PaperSpigot
-        timings = new SpigotTimings.WorldTimingsHandler(this); // Spigot - code below can generate new world and access timings 
-        this.entityLimiter = new org.spigotmc.TickLimiter(spigotConfig.entityMaxTickTime);
-        this.tileLimiter = new org.spigotmc.TickLimiter(spigotConfig.tileMaxTickTime);
+        timings = new SpigotTimings.WorldTimingsHandler(this); // Spigot - code below can generate new world and access timings
     }
 
     public World b() {
@@ -1393,12 +1389,7 @@ public abstract class World implements IBlockAccess {
         timings.entityTick.startTiming(); // Spigot
         guardEntityList = true; // Spigot
         // CraftBukkit start - Use field for loop variable
-        int entitiesThisCycle = 0;
-        if (tickPosition < 0) tickPosition = 0;
-        for (entityLimiter.initTick();
-                entitiesThisCycle < entityList.size() && (entitiesThisCycle % 10 == 0 || entityLimiter.shouldContinue());
-                tickPosition++, entitiesThisCycle++) {
-            tickPosition = (tickPosition < entityList.size()) ? tickPosition : 0;
+        for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) {
             entity = (Entity) this.entityList.get(this.tickPosition);
             // CraftBukkit end
             if (entity.vehicle != null) {
@@ -1454,19 +1445,13 @@ public abstract class World implements IBlockAccess {
             this.c.clear();
         }
         // CraftBukkit end
+        Iterator iterator = this.tileEntityList.iterator();
 
-        // Spigot start
-        int tilesThisCycle = 0;
-        for (tileLimiter.initTick();
-                tilesThisCycle < tileEntityList.size() && (tilesThisCycle % 10 == 0 || tileLimiter.shouldContinue());
-                tileTickPosition++, tilesThisCycle++) {
-            tileTickPosition = (tileTickPosition < tileEntityList.size()) ? tileTickPosition : 0;
-            TileEntity tileentity = (TileEntity) this.tileEntityList.get(tileTickPosition);
-            // Spigot start
+        while (iterator.hasNext()) {
+            TileEntity tileentity = (TileEntity) iterator.next();
             if (tileentity == null) {
                 getServer().getLogger().severe("Spigot has detected a null entity and has removed it, preventing a crash");
-                tilesThisCycle--;
-                this.tileEntityList.remove(tileTickPosition--);
+                iterator.remove();
                 continue;
             }
             // Spigot end
@@ -1494,8 +1479,7 @@ public abstract class World implements IBlockAccess {
             }
 
             if (tileentity.x()) {
-                tilesThisCycle--;
-                this.tileEntityList.remove(tileTickPosition--);
+                iterator.remove();
                 this.h.remove(tileentity);
                 if (this.isLoaded(tileentity.getPosition())) {
                     this.getChunkAtWorldCoords(tileentity.getPosition()).e(tileentity.getPosition());
diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java
index 8e86212..ab2f8bf 100644
--- a/src/main/java/org/spigotmc/SpigotWorldConfig.java
+++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java
@@ -332,13 +332,4 @@ public class SpigotWorldConfig
     {
         hangingTickFrequency = getInt( "hanging-tick-frequency", 100 );
     }
-
-    public int tileMaxTickTime;
-    public int entityMaxTickTime;
-    private void maxTickTimes()
-    {
-        tileMaxTickTime = getInt("max-tick-time.tile", 50);
-        entityMaxTickTime = getInt("max-tick-time.entity", 50);
-        log("Tile Max Tick Time: " + tileMaxTickTime + "ms Entity max Tick Time: " + entityMaxTickTime + "ms");
-    }
 }
diff --git a/src/main/java/org/spigotmc/TickLimiter.java b/src/main/java/org/spigotmc/TickLimiter.java
deleted file mode 100644
index 23a3938..0000000
--- a/src/main/java/org/spigotmc/TickLimiter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.spigotmc;
-
-public class TickLimiter {
-
-    private final int maxTime;
-    private long startTime;
-
-    public TickLimiter(int maxtime) {
-        this.maxTime = maxtime;
-    }
-
-    public void initTick() {
-        startTime = System.currentTimeMillis();
-    }
-
-    public boolean shouldContinue() {
-        long remaining = System.currentTimeMillis() - startTime;
-        return remaining < maxTime;
-    }
-}
-- 
2.4.1.windows.1