diff --git a/Spigot-Server-Patches/Optimize-TileEntity-Ticking.patch b/Spigot-Server-Patches/Optimize-TileEntity-Ticking.patch index 0c61d196f..147a58b64 100644 --- a/Spigot-Server-Patches/Optimize-TileEntity-Ticking.patch +++ b/Spigot-Server-Patches/Optimize-TileEntity-Ticking.patch @@ -86,66 +86,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 private final List b = Lists.newArrayList(); private final List c = Lists.newArrayList(); public final List players = Lists.newArrayList(); -@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess { - public static boolean haveWeSilencedAPhysicsCrash; - public static String blockLocation; - private org.spigotmc.TickLimiter entityLimiter; -- private org.spigotmc.TickLimiter tileLimiter; -- private int tileTickPosition; -+ // PaperSpigot start - Disable Spigot's TE handling in favor of our own -+ //private org.spigotmc.TickLimiter tileLimiter; -+ //private int tileTickPosition; -+ // PaperSpigot end - - public static long chunkToKey(int x, int z) - { -@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess { - 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); -+ //this.tileLimiter = new org.spigotmc.TickLimiter(spigotConfig.tileMaxTickTime); // PaperSpigot - Disable Spigot's TE handling in favor of our own - } - - public World b() { -@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess { - } - // CraftBukkit end - -+ // PaperSpigot start - Return to previous behavior, theoretically tile entity ticks should no longer be long enough for this to be an issue -+ Iterator iterator = this.tileEntityList.iterator(); -+ -+ while (iterator.hasNext()) { -+ TileEntity tileentity = (TileEntity) iterator.next(); -+ /* - // Spigot start - int tilesThisCycle = 0; - for (tileLimiter.initTick(); -@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess { - tileTickPosition++, tilesThisCycle++) { - tileTickPosition = (tileTickPosition < tileEntityList.size()) ? tileTickPosition : 0; - TileEntity tileentity = (TileEntity) this.tileEntityList.get(tileTickPosition); -+ */ -+ // PaperSpigot end - // Spigot start - 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(); // PaperSpigot - Remove Spigot's TE handling in favor of our own - continue; - } - // Spigot end -@@ -0,0 +0,0 @@ public abstract class World implements IBlockAccess { - } - - if (tileentity.x()) { -- tilesThisCycle--; -- this.tileEntityList.remove(tileTickPosition--); -+ iterator.remove(); // PaperSpigot - Remove Spigot's TE handling in favor of our own - this.h.remove(tileentity); - if (this.isLoaded(tileentity.getPosition())) { - this.getChunkAtWorldCoords(tileentity.getPosition()).e(tileentity.getPosition()); diff --git a/src/main/java/org/github/paperspigot/WorldTileEntityList.java b/src/main/java/org/github/paperspigot/WorldTileEntityList.java new file mode 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 diff --git a/Spigot-Server-Patches/Remove-Spigot-TileEntity-Enity-Tick-Time-Capping.patch b/Spigot-Server-Patches/Remove-Spigot-TileEntity-Enity-Tick-Time-Capping.patch new file mode 100644 index 000000000..fb7381ed2 --- /dev/null +++ b/Spigot-Server-Patches/Remove-Spigot-TileEntity-Enity-Tick-Time-Capping.patch @@ -0,0 +1,125 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Zach Brown <1254957+zachbr@users.noreply.github.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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -0,0 +0,0 @@ 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) +@@ -0,0 +0,0 @@ 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() { +@@ -0,0 +0,0 @@ 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) { +@@ -0,0 +0,0 @@ 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 +@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/spigotmc/SpigotWorldConfig.java ++++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java +@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 +--- a/src/main/java/org/spigotmc/TickLimiter.java ++++ /dev/null +@@ -0,0 +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; +- } +-} +-- \ No newline at end of file