diff --git a/patches/server/0002-Tuinity-Server-Patches.patch b/patches/server/0002-Tuinity-Server-Patches.patch index 2a21faadc..ededcfece 100644 --- a/patches/server/0002-Tuinity-Server-Patches.patch +++ b/patches/server/0002-Tuinity-Server-Patches.patch @@ -1,104 +1,107 @@ -From cae53f41f02d848e12a4077faf88bfc495553350 Mon Sep 17 00:00:00 2001 +From 2fb55c1eee17e60d4fb7ed8d7a226e4a33da9c21 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Fri, 14 Dec 2018 21:53:58 -0800 Subject: [PATCH] Tuinity Server Patches --- - pom.xml | 16 +- - .../com/destroystokyo/paper/PaperCommand.java | 2 +- - .../destroystokyo/paper/PaperWorldConfig.java | 3 +- - .../paper/io/PrioritizedTaskQueue.java | 20 +- - .../com/mojang/datafixers/util/Either.java | 6 +- - .../tuinity/chunk/ChunkRegionManager.java | 165 +++ - .../chunk/QueuedChangesMapLong2Int.java | 155 +++ - .../chunk/QueuedChangesMapLong2Object.java | 170 +++ - .../tuinity/tuinity/config/TuinityConfig.java | 253 +++++ - .../server/TickListServerInterval.java | 42 + - .../tuinity/server/TuinityTickList.java | 614 +++++++++++ - .../com/tuinity/tuinity/util/ChunkList.java | 119 +++ - .../com/tuinity/tuinity/util/EntityList.java | 124 +++ - .../tuinity/tuinity/util/IBlockDataList.java | 123 +++ - .../tuinity/util/OptimizedSmallEnumSet.java | 65 ++ - .../tuinity/util/PrimaryThreadList.java | 241 +++++ - .../tuinity/util/PrimaryThreadSet.java | 282 +++++ - .../util/TickSynchronizationPoint.java | 40 + - .../com/tuinity/tuinity/util/TickThread.java | 40 + - .../java/com/tuinity/tuinity/util/Util.java | 103 ++ - .../fastutil/ExtendedAbstractDoubleList.java | 39 + - .../fastutil/ExtendedDoubleArrayList.java | 65 ++ - .../fastutil/ExtendedObjectAVLTreeSet.java | 90 ++ - .../com/tuinity/tuinity/util/map/AreaMap.java | 388 +++++++ - .../tuinity/util/map/PlayerAreaMap.java | 25 + - .../util/map/PooledLinkedHashSets.java | 287 +++++ - .../util/pool/PooledBlockPositions.java | 40 + - .../tuinity/util/set/LinkedSortedSet.java | 142 +++ - .../net/minecraft/server/ArraySetSorted.java | 41 +- - .../net/minecraft/server/AxisAlignedBB.java | 2 + - src/main/java/net/minecraft/server/Chunk.java | 135 +++ - .../java/net/minecraft/server/ChunkMap.java | 15 +- - .../minecraft/server/ChunkMapDistance.java | 401 ++++++- - .../minecraft/server/ChunkProviderServer.java | 141 ++- - .../minecraft/server/ChunkRegionLoader.java | 12 +- - .../net/minecraft/server/ChunkStatus.java | 4 +- - .../net/minecraft/server/DedicatedServer.java | 3 +- - .../minecraft/server/DoubleListOffset.java | 2 +- - src/main/java/net/minecraft/server/EULA.java | 2 +- - .../java/net/minecraft/server/Entity.java | 100 ++ - .../minecraft/server/EntityEnderDragon.java | 4 +- - .../minecraft/server/EntityInsentient.java | 19 +- - .../net/minecraft/server/EntityPlayer.java | 43 +- - .../minecraft/server/EntityTrackerEntry.java | 41 +- - .../net/minecraft/server/EntityWither.java | 4 +- - .../java/net/minecraft/server/HeightMap.java | 5 +- - .../minecraft/server/IAsyncTaskHandler.java | 2 +- - .../net/minecraft/server/IEntityAccess.java | 33 +- - .../minecraft/server/LightEngineBlock.java | 2 +- - .../minecraft/server/LightEngineLayer.java | 2 +- - .../net/minecraft/server/LightEngineSky.java | 2 +- - .../minecraft/server/LightEngineStorage.java | 17 +- - .../server/LightEngineStorageArray.java | 26 +- - .../server/LightEngineStorageBlock.java | 8 +- - .../server/LightEngineStorageSky.java | 38 +- - .../java/net/minecraft/server/MCUtil.java | 30 +- - .../net/minecraft/server/MinecraftServer.java | 6 +- - .../net/minecraft/server/NBTTagCompound.java | 2 +- - .../minecraft/server/NavigationAbstract.java | 24 +- - .../net/minecraft/server/NetworkManager.java | 36 +- - .../server/PacketPlayOutMapChunk.java | 15 +- - .../net/minecraft/server/PairedQueue.java | 44 +- - .../net/minecraft/server/PathfinderGoal.java | 15 +- - .../server/PathfinderGoalSelector.java | 125 ++- - .../server/PathfinderGoalWrapped.java | 6 +- - .../minecraft/server/PathfinderNormal.java | 4 +- - .../server/PathfinderTargetCondition.java | 1 + - .../net/minecraft/server/PlayerChunk.java | 94 +- - .../net/minecraft/server/PlayerChunkMap.java | 997 +++++++++++++++--- - .../server/PlayerInteractManager.java | 45 +- - .../net/minecraft/server/PlayerInventory.java | 6 +- - .../java/net/minecraft/server/PlayerList.java | 6 +- - .../java/net/minecraft/server/ProtoChunk.java | 16 +- - .../java/net/minecraft/server/RegionFile.java | 468 +++++++- - .../minecraft/server/RegionFileBitSet.java | 26 +- - .../net/minecraft/server/RegionFileCache.java | 45 +- - .../server/RegionFileCompression.java | 7 +- - .../net/minecraft/server/ThreadedMailbox.java | 2 +- - .../java/net/minecraft/server/Ticket.java | 6 +- - .../java/net/minecraft/server/TicketType.java | 1 + - .../net/minecraft/server/VoxelShapeArray.java | 2 +- - .../minecraft/server/VoxelShapeCubePoint.java | 2 +- - .../server/VoxelShapeMergerList.java | 2 +- - .../net/minecraft/server/VoxelShapes.java | 2 +- - src/main/java/net/minecraft/server/World.java | 23 +- - .../net/minecraft/server/WorldServer.java | 461 +++++++- - .../net/minecraft/server/WorldUpgrader.java | 2 +- - .../org/bukkit/craftbukkit/CraftServer.java | 7 +- - .../org/bukkit/craftbukkit/CraftWorld.java | 67 +- - .../java/org/bukkit/craftbukkit/Main.java | 7 + - .../craftbukkit/entity/CraftEntity.java | 12 + - .../craftbukkit/entity/CraftPlayer.java | 37 +- - .../java/org/spigotmc/ActivationRange.java | 41 +- - src/main/java/org/spigotmc/AsyncCatcher.java | 2 +- - 94 files changed, 6980 insertions(+), 477 deletions(-) + pom.xml | 16 +- + .../co/aikar/timings/WorldTimingsHandler.java | 2 + + .../com/destroystokyo/paper/PaperCommand.java | 2 +- + .../paper/PaperVersionFetcher.java | 11 +- + .../destroystokyo/paper/PaperWorldConfig.java | 3 +- + .../paper/io/PrioritizedTaskQueue.java | 20 +- + .../com/mojang/datafixers/util/Either.java | 6 +- + .../tuinity/chunk/ChunkRegionManager.java | 165 +++ + .../chunk/QueuedChangesMapLong2Int.java | 155 +++ + .../chunk/QueuedChangesMapLong2Object.java | 170 +++ + .../tuinity/tuinity/config/TuinityConfig.java | 239 ++++ + .../server/TickListServerInterval.java | 42 + + .../tuinity/server/TuinityTickList.java | 614 ++++++++++ + .../com/tuinity/tuinity/util/ChunkList.java | 119 ++ + .../com/tuinity/tuinity/util/EntityList.java | 124 ++ + .../tuinity/tuinity/util/IBlockDataList.java | 123 ++ + .../tuinity/util/OptimizedSmallEnumSet.java | 65 + + .../tuinity/util/PrimaryThreadList.java | 241 ++++ + .../tuinity/util/PrimaryThreadSet.java | 282 +++++ + .../util/TickSynchronizationPoint.java | 40 + + .../com/tuinity/tuinity/util/TickThread.java | 40 + + .../java/com/tuinity/tuinity/util/Util.java | 103 ++ + .../fastutil/ExtendedAbstractDoubleList.java | 39 + + .../fastutil/ExtendedDoubleArrayList.java | 65 + + .../fastutil/ExtendedObjectAVLTreeSet.java | 90 ++ + .../com/tuinity/tuinity/util/map/AreaMap.java | 388 ++++++ + .../tuinity/util/map/PlayerAreaMap.java | 25 + + .../util/map/PooledLinkedHashSets.java | 287 +++++ + .../util/pool/PooledBlockPositions.java | 40 + + .../tuinity/util/set/LinkedSortedSet.java | 142 +++ + .../net/minecraft/server/ArraySetSorted.java | 41 +- + .../net/minecraft/server/AxisAlignedBB.java | 2 + + src/main/java/net/minecraft/server/Chunk.java | 135 +++ + .../java/net/minecraft/server/ChunkMap.java | 15 +- + .../minecraft/server/ChunkMapDistance.java | 401 ++++++- + .../minecraft/server/ChunkProviderServer.java | 141 ++- + .../minecraft/server/ChunkRegionLoader.java | 12 +- + .../net/minecraft/server/ChunkStatus.java | 4 +- + .../net/minecraft/server/DedicatedServer.java | 3 +- + .../minecraft/server/DoubleListOffset.java | 2 +- + src/main/java/net/minecraft/server/EULA.java | 2 +- + .../java/net/minecraft/server/Entity.java | 120 ++ + .../minecraft/server/EntityEnderDragon.java | 4 +- + .../minecraft/server/EntityInsentient.java | 19 +- + .../net/minecraft/server/EntityPlayer.java | 43 +- + .../minecraft/server/EntityTrackerEntry.java | 24 +- + .../net/minecraft/server/EntityWither.java | 4 +- + .../java/net/minecraft/server/HeightMap.java | 5 +- + .../minecraft/server/IAsyncTaskHandler.java | 2 +- + .../net/minecraft/server/IEntityAccess.java | 33 +- + .../minecraft/server/LightEngineBlock.java | 2 +- + .../minecraft/server/LightEngineLayer.java | 2 +- + .../net/minecraft/server/LightEngineSky.java | 2 +- + .../minecraft/server/LightEngineStorage.java | 17 +- + .../server/LightEngineStorageArray.java | 26 +- + .../server/LightEngineStorageBlock.java | 8 +- + .../server/LightEngineStorageSky.java | 38 +- + .../java/net/minecraft/server/MCUtil.java | 30 +- + .../net/minecraft/server/MinecraftServer.java | 6 +- + .../net/minecraft/server/NBTTagCompound.java | 2 +- + .../minecraft/server/NavigationAbstract.java | 24 +- + .../net/minecraft/server/NetworkManager.java | 36 +- + .../server/PacketPlayOutMapChunk.java | 15 +- + .../net/minecraft/server/PairedQueue.java | 44 +- + .../net/minecraft/server/PathfinderGoal.java | 15 +- + .../server/PathfinderGoalSelector.java | 125 +- + .../server/PathfinderGoalWrapped.java | 6 +- + .../minecraft/server/PathfinderNormal.java | 4 +- + .../server/PathfinderTargetCondition.java | 1 + + .../net/minecraft/server/PlayerChunk.java | 94 +- + .../net/minecraft/server/PlayerChunkMap.java | 1044 +++++++++++++++-- + .../server/PlayerInteractManager.java | 45 +- + .../net/minecraft/server/PlayerInventory.java | 6 +- + .../java/net/minecraft/server/PlayerList.java | 6 +- + .../java/net/minecraft/server/ProtoChunk.java | 16 +- + .../java/net/minecraft/server/RegionFile.java | 468 +++++++- + .../minecraft/server/RegionFileBitSet.java | 26 +- + .../net/minecraft/server/RegionFileCache.java | 45 +- + .../server/RegionFileCompression.java | 7 +- + .../net/minecraft/server/ThreadedMailbox.java | 2 +- + .../java/net/minecraft/server/Ticket.java | 6 +- + .../java/net/minecraft/server/TicketType.java | 1 + + .../net/minecraft/server/VoxelShapeArray.java | 2 +- + .../minecraft/server/VoxelShapeCubePoint.java | 2 +- + .../server/VoxelShapeMergerList.java | 2 +- + .../net/minecraft/server/VoxelShapes.java | 2 +- + src/main/java/net/minecraft/server/World.java | 23 +- + .../net/minecraft/server/WorldServer.java | 461 +++++++- + .../net/minecraft/server/WorldUpgrader.java | 2 +- + .../org/bukkit/craftbukkit/CraftServer.java | 7 +- + .../org/bukkit/craftbukkit/CraftWorld.java | 67 +- + .../java/org/bukkit/craftbukkit/Main.java | 7 + + .../craftbukkit/entity/CraftEntity.java | 12 + + .../craftbukkit/entity/CraftPlayer.java | 37 +- + .../java/org/spigotmc/ActivationRange.java | 41 +- + src/main/java/org/spigotmc/AsyncCatcher.java | 2 +- + src/main/java/org/spigotmc/TrackingRange.java | 40 + + 97 files changed, 7062 insertions(+), 484 deletions(-) create mode 100644 src/main/java/com/tuinity/tuinity/chunk/ChunkRegionManager.java create mode 100644 src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Int.java create mode 100644 src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Object.java @@ -168,6 +171,26 @@ index a7ee9396a0..90ca354c46 100644 +diff --git a/src/main/java/co/aikar/timings/WorldTimingsHandler.java b/src/main/java/co/aikar/timings/WorldTimingsHandler.java +index c9a3ba4bfb..af24eb0bcf 100644 +--- a/src/main/java/co/aikar/timings/WorldTimingsHandler.java ++++ b/src/main/java/co/aikar/timings/WorldTimingsHandler.java +@@ -34,6 +34,7 @@ public class WorldTimingsHandler { + public final Timing tileEntityPending; + public final Timing tracker1; + public final Timing tracker2; ++ public final Timing tracker3; // Tuinity - legacy tracker + public final Timing doTick; + public final Timing tickEntities; + public final Timing chunks; +@@ -118,6 +119,7 @@ public class WorldTimingsHandler { + + tracker1 = Timings.ofSafe(name + "tracker stage 1"); + tracker2 = Timings.ofSafe(name + "tracker stage 2"); ++ tracker3 = Timings.ofSafe(name + "tracker stage 3"); // Tuinity - legacy tracker + doTick = Timings.ofSafe(name + "doTick"); + tickEntities = Timings.ofSafe(name + "tickEntities"); + diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/java/com/destroystokyo/paper/PaperCommand.java index dfe92780ad..c088cf51ff 100644 --- a/src/main/java/com/destroystokyo/paper/PaperCommand.java @@ -181,6 +204,37 @@ index dfe92780ad..c088cf51ff 100644 if (chunk.getFullChunkIfCached() == null) { continue; } +diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java +index 49a38c6608..255bbd6e48 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java ++++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java +@@ -24,8 +24,8 @@ public class PaperVersionFetcher implements VersionFetcher { + @Nonnull + @Override + public String getVersionMessage(@Nonnull String serverVersion) { +- String[] parts = serverVersion.substring("git-Paper-".length()).split("[-\\s]"); +- String updateMessage = getUpdateStatusMessage("PaperMC/Paper", GITHUB_BRANCH_NAME, parts[0]); ++ String[] parts = serverVersion.substring("git-Tuinity-".length()).split("[-\\s]"); // Tuinity ++ String updateMessage = getUpdateStatusMessage("Spottedleaf/Tuinity", GITHUB_BRANCH_NAME, parts[0]); // Tuinity + String history = getHistory(); + + return history != null ? history + "\n" + updateMessage : updateMessage; +@@ -49,13 +49,10 @@ public class PaperVersionFetcher implements VersionFetcher { + + private static String getUpdateStatusMessage(@Nonnull String repo, @Nonnull String branch, @Nonnull String versionInfo) { + int distance; +- try { +- int jenkinsBuild = Integer.parseInt(versionInfo); +- distance = fetchDistanceFromSiteApi(jenkinsBuild, getMinecraftVersion()); +- } catch (NumberFormatException ignored) { ++ // Tuinity - we don't have jenkins setup + versionInfo = versionInfo.replace("\"", ""); + distance = fetchDistanceFromGitHub(repo, branch, versionInfo); +- } ++ // Tuinity - we don't have jenkins setup + + switch (distance) { + case -1: diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java index 7ca67a4aa5..e76d5fd8df 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -822,10 +876,10 @@ index 0000000000..e5bb56cca9 \ No newline at end of file diff --git a/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java b/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java new file mode 100644 -index 0000000000..534a6bc7e6 +index 0000000000..39395ee269 --- /dev/null +++ b/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java -@@ -0,0 +1,253 @@ +@@ -0,0 +1,239 @@ +package com.tuinity.tuinity.config; + +import ca.spottedleaf.concurrentutil.util.Throw; @@ -1058,23 +1112,9 @@ index 0000000000..534a6bc7e6 + } + + public boolean useOptimizedTracker; -+ public int optimizedTrackerTrackRange; -+ public int optimizedTrackerUntrackRange; + + private void optimizetracker() { + this.useOptimizedTracker = this.getBoolean("optimized-tracker", true); -+ this.optimizedTrackerTrackRange = this.getInt("optimized-tracker-track-range", -1); -+ this.optimizedTrackerUntrackRange = this.getInt("optimized-tracker-untrack-range", -1); -+ if (!this.useOptimizedTracker) { -+ this.optimizedTrackerTrackRange = -1; -+ this.optimizedTrackerUntrackRange = -1; -+ return; -+ } -+ if (this.optimizedTrackerTrackRange != this.optimizedTrackerUntrackRange && (this.optimizedTrackerTrackRange | this.optimizedTrackerUntrackRange) == -1) { -+ // TODO error here -+ this.optimizedTrackerTrackRange = -1; -+ this.optimizedTrackerUntrackRange = -1; -+ } + } + } + @@ -2837,7 +2877,7 @@ index 0000000000..d5688a734e \ No newline at end of file diff --git a/src/main/java/com/tuinity/tuinity/util/Util.java b/src/main/java/com/tuinity/tuinity/util/Util.java new file mode 100644 -index 0000000000..a69fc14880 +index 0000000000..92f43870fb --- /dev/null +++ b/src/main/java/com/tuinity/tuinity/util/Util.java @@ -0,0 +1,103 @@ @@ -2869,11 +2909,11 @@ index 0000000000..a69fc14880 + } + + public static long getCoordinateKey(final BlockPosition blockPos) { -+ return getCoordinateKey(blockPos.getX() >> 4, blockPos.getZ() >> 4); ++ return ((long)(blockPos.getZ() >> 4) << 32) | ((blockPos.getX() >> 4) & 0xFFFFFFFFL); + } + + public static long getCoordinateKey(final Entity entity) { -+ return getCoordinateKey(getChunkCoordinate(entity.locX()), getChunkCoordinate(entity.locZ())); ++ return ((long)(Util.fastFloor(entity.locZ()) >> 4) << 32) | ((Util.fastFloor(entity.locX()) >> 4) & 0xFFFFFFFFL); + } + + public static int fastFloor(double x) { @@ -2887,7 +2927,7 @@ index 0000000000..a69fc14880 + } + + public static long getCoordinateKey(final ChunkCoordIntPair pair) { -+ return getCoordinateKey(pair.x, pair.z); ++ return ((long)pair.z << 32) | (pair.x & 0xFFFFFFFFL); + } + + public static long getCoordinateKey(final int x, final int z) { @@ -3159,7 +3199,7 @@ index 0000000000..1a3f596330 +} diff --git a/src/main/java/com/tuinity/tuinity/util/map/AreaMap.java b/src/main/java/com/tuinity/tuinity/util/map/AreaMap.java new file mode 100644 -index 0000000000..dfb7a417ea +index 0000000000..a350e4204d --- /dev/null +++ b/src/main/java/com/tuinity/tuinity/util/map/AreaMap.java @@ -0,0 +1,388 @@ @@ -3219,12 +3259,12 @@ index 0000000000..dfb7a417ea + + @Nullable + public PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getObjectsInRange(final ChunkCoordIntPair chunkPos) { -+ return this.getObjectsInRange(chunkPos.x, chunkPos.z); ++ return this.areaMap.get(Util.getCoordinateKey(chunkPos)); + } + + @Nullable + public PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getObjectsInRange(final int chunkX, final int chunkZ) { -+ return this.getObjectsInRange(Util.getCoordinateKey(chunkX, chunkZ)); ++ return this.areaMap.get(Util.getCoordinateKey(chunkX, chunkZ)); + } + + // Long.MIN_VALUE indicates the object is not mapped @@ -5266,19 +5306,31 @@ index cf00f35a5b..e54730f097 100644 throwable = throwable1; throw throwable1; diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 8974c16bf9..181f1742ac 100644 +index 8974c16bf9..3cdba5c42a 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -208,6 +208,105 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -208,6 +208,125 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } // CraftBukkit end + // Tuinity start -+ // ender dragon is special cased for its large range, player is special cased for spectator mode + npc plugins -+ boolean isLegacyTrackingEntity = this instanceof EntityEnderDragon || this instanceof EntityPlayer; ++ boolean isLegacyTrackingEntity = this instanceof EntityPlayer && (this.getClass() != EntityPlayer.class); // TODO temp, fix citizens... ++ ++ com.tuinity.tuinity.util.map.PlayerAreaMap trackingAreaMap; ++ com.tuinity.tuinity.util.map.PlayerAreaMap unTrackingAreaMap; ++ ++ final void acquireTrackingMap(PlayerChunkMap chunkMap) { ++ int key = org.spigotmc.TrackingRange.getTrackingRangeType(this).ordinal(); ++ this.trackingAreaMap = chunkMap.playerEntityTrackerTrackMaps[key]; ++ this.unTrackingAreaMap = chunkMap.playerEntityTrackerUntrackMaps[key]; ++ } ++ ++ final void releaseTrackingMap(PlayerChunkMap chunkMap) { ++ this.trackingAreaMap = null; ++ this.unTrackingAreaMap = null; ++ } + + public final void setLegacyTrackingEntity(final boolean isLegacyTrackingEntity) { -+ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Cannot update legacy tracking off of the main thread"); + if (this.isLegacyTrackingEntity == isLegacyTrackingEntity) { + return; + } @@ -5291,35 +5343,37 @@ index 8974c16bf9..181f1742ac 100644 + WorldServer world = (WorldServer)this.world; + PlayerChunkMap chunkMap = world.getChunkProvider().playerChunkMap; + -+ if (chunkMap.playerEntityTrackerTrackMap == null) { ++ if (!chunkMap.optimisedTrackerEnabled) { + this.isLegacyTrackingEntity = isLegacyTrackingEntity; + return; + } ++ com.tuinity.tuinity.util.TickThread.ensureTickThread("Cannot update legacy tracking off of the main thread"); + + if (this.isLegacyTrackingEntity) { + this.isLegacyTrackingEntity = false; + chunkMap.activelyTrackedEntitiesLegacy.remove(this); + -+ PlayerChunkMap.EntityTracker tracker = chunkMap.trackedEntities.get(this.getId()); ++ PlayerChunkMap.EntityTracker tracker = this.tracker; + if (tracker != null) { ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet inRange = this.trackingAreaMap.getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(this)); ++ + for (EntityPlayer player : world.getPlayers()) { -+ tracker.removeTrackingPlayer(player); -+ tracker.updatePlayer(player); ++ tracker.clear(player); ++ if (inRange != null && inRange.contains(player)) { ++ this.addToTrackQueue(player); ++ } + } + } + } else { + this.isLegacyTrackingEntity = true; + chunkMap.activelyTrackedEntitiesLegacy.add(this); + -+ PlayerChunkMap.EntityTracker tracker = this.tracker; ++ PlayerChunkMap.EntityTracker tracker = chunkMap.trackedEntities.get(this.getId()); + if (tracker != null) { -+ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet inRange = chunkMap.playerEntityTrackerTrackMap.getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(this)); -+ + for (EntityPlayer player : world.getPlayers()) { ++ this.clearTrackingQueues(player); + tracker.clear(player); -+ if (inRange != null && inRange.contains(player)) { -+ tracker.updateTrackingPlayer(player); -+ } ++ tracker.updatePlayer(player); + } + } + } @@ -5333,9 +5387,10 @@ index 8974c16bf9..181f1742ac 100644 + if (player == this) { + return; + } ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Adding to track queue from off-main thread"); + int id = player.getId(); -+ this.trackQueue.add(id); + this.unTrackQueue.remove(id); ++ this.trackQueue.add(id); + ((WorldServer)this.world).trackingUpdateQueue.add(this); + } + @@ -5343,8 +5398,13 @@ index 8974c16bf9..181f1742ac 100644 + if (player == this) { + return; + } ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Removing from track queue from off-main thread"); + int id = player.getId(); + this.trackQueue.remove(id); ++ // don't queue untrack if we're not tracked ++ if (this.tracker == null || !this.tracker.trackedPlayers.contains(player)) { ++ return; ++ } + this.unTrackQueue.add(id); + ((WorldServer)this.world).trackingUpdateQueue.add(this); + } @@ -5375,7 +5435,7 @@ index 8974c16bf9..181f1742ac 100644 public Entity(EntityTypes entitytypes, World world) { this.id = Entity.entityCount.incrementAndGet(); this.passengers = Lists.newArrayList(); -@@ -1371,6 +1470,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1371,6 +1490,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return MathHelper.c(f * f + f1 * f1 + f2 * f2); } @@ -5507,7 +5567,7 @@ index e7bfbc3307..d49c45ce7f 100644 } diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java -index 3a88c9a670..b4d3c4a4f9 100644 +index 3a88c9a670..0323055c68 100644 --- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java @@ -18,7 +18,7 @@ import org.bukkit.event.player.PlayerVelocityEvent; @@ -5568,25 +5628,10 @@ index 3a88c9a670..b4d3c4a4f9 100644 boolean flag4 = k < -32768L || k > 32767L || l < -32768L || l > 32767L || i1 < -32768L || i1 > 32767L; if (!flag4 && this.o <= 400 && !this.q && this.r == this.tracker.onGround) { -@@ -248,11 +254,28 @@ public class EntityTrackerEntry { +@@ -248,11 +254,13 @@ public class EntityTrackerEntry { } -+ // Tuinity end - optimise entity tracking -+ // TODO make use of this in second pass rewrite -+ final void resetState() { -+ // required since we do not tick all tracker entries unless they have trackers - so data can and will get stale -+ if (this.trackedPlayers.size() != 0) { -+ return; -+ } -+ -+ this.synchronizeLocation(); -+ this.writeStaleData(); -+ this.xRot = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); // Tuinity - diff on change, used in forceStaleMeta -+ this.yRot = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); // Tuinity - diff on change, used in forceStaleMeta -+ } -+ // Tuinity end - optimise entity tracking -+ + public final void onUntrack(EntityPlayer player) { this.a(player); } // Tuinity - OBFHELPER public void a(EntityPlayer entityplayer) { this.tracker.c(entityplayer); @@ -5597,22 +5642,6 @@ index 3a88c9a670..b4d3c4a4f9 100644 public void b(EntityPlayer entityplayer) { PlayerConnection playerconnection = entityplayer.playerConnection; -@@ -352,6 +375,7 @@ public class EntityTrackerEntry { - - } - -+ private final void writeStaleData() { this.c(); } // Tuinity - OBFHELPER - private void c() { - DataWatcher datawatcher = this.tracker.getDataWatcher(); - -@@ -377,6 +401,7 @@ public class EntityTrackerEntry { - - } - -+ private final void synchronizeLocation() { this.d(); } // Tuinity - OBFHELPER - private void d() { - this.xLoc = PacketPlayOutEntity.a(this.tracker.locX()); - this.yLoc = PacketPlayOutEntity.a(this.tracker.locY()); diff --git a/src/main/java/net/minecraft/server/EntityWither.java b/src/main/java/net/minecraft/server/EntityWither.java index 8977c3516b..bace6cf36a 100644 --- a/src/main/java/net/minecraft/server/EntityWither.java @@ -6828,7 +6857,7 @@ index 9f8818c2d4..cc5ae6eef4 100644 } diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java -index 57bea926a6..9346a2c292 100644 +index 57bea926a6..b231af78ec 100644 --- a/src/main/java/net/minecraft/server/PlayerChunkMap.java +++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java @@ -55,8 +55,9 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { @@ -6854,7 +6883,7 @@ index 57bea926a6..9346a2c292 100644 // CraftBukkit start - recursion-safe executor for Chunk loadCallback() and unloadCallback() public final CallbackExecutor callbackExecutor = new CallbackExecutor(); -@@ -109,6 +110,293 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -109,6 +110,302 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { // Paper start - distance maps private final com.destroystokyo.paper.util.misc.PooledLinkedHashSets pooledLinkedPlayerHashSets = new com.destroystokyo.paper.util.misc.PooledLinkedHashSets<>(); @@ -6897,9 +6926,16 @@ index 57bea926a6..9346a2c292 100644 + + // Tuinity start - use distance map to optimise entity tracker + // force propagate tracker changes -+ if (this.playerEntityTrackerTrackMap != null) { -+ this.playerEntityTrackerTrackMap.update(player, chunkX, chunkZ, Math.min(this.entityTrackerTrackRange, effectiveViewDistance)); -+ this.playerEntityTrackerUntrackMap.update(player, chunkX, chunkZ, Math.min(this.entityTrackerUntrackRange, effectiveViewDistance)); ++ if (this.optimisedTrackerEnabled) { ++ for (int i = 0, len = TRACKING_RANGE_TYPES.length; i < len; ++i) { ++ com.tuinity.tuinity.util.map.PlayerAreaMap trackMap = this.playerEntityTrackerTrackMaps[i]; ++ com.tuinity.tuinity.util.map.PlayerAreaMap untrackMap = this.playerEntityTrackerUntrackMaps[i]; ++ int trackRange = this.entityTrackerTrackRanges[i]; ++ int untrackRange = this.entityTrackerUntrackRanges[i]; ++ ++ trackMap.update(player, chunkX, chunkZ, Math.min(trackRange, effectiveViewDistance)); ++ untrackMap.update(player, chunkX, chunkZ, Math.min(untrackRange, effectiveViewDistance)); ++ } + } + // Tuinity end - use distance map to optimise entity tracker + } @@ -7121,12 +7157,15 @@ index 57bea926a6..9346a2c292 100644 + // Tuinity end - optimise PlayerChunkMap#isOutsideRange + + // Tuinity start - use distance map to optimise entity tracker -+ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerEntityTrackerTrackMap; -+ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerEntityTrackerUntrackMap; -+ public final int entityTrackerTrackRange; -+ public final int entityTrackerUntrackRange; ++ public final boolean optimisedTrackerEnabled; ++ ++ // inlined EnumMap, TrackingRange.TrackingRangeType ++ static final org.spigotmc.TrackingRange.TrackingRangeType[] TRACKING_RANGE_TYPES = org.spigotmc.TrackingRange.TrackingRangeType.values(); ++ final com.tuinity.tuinity.util.map.PlayerAreaMap[] playerEntityTrackerTrackMaps; ++ final com.tuinity.tuinity.util.map.PlayerAreaMap[] playerEntityTrackerUntrackMaps; ++ final int[] entityTrackerTrackRanges; ++ final int[] entityTrackerUntrackRanges; + -+ //public final com.tuinity.tuinity.util.EntityList activelyTrackedEntities; // TODO not yet + final com.tuinity.tuinity.util.EntityList activelyTrackedEntitiesLegacy; + + public static boolean isLegacyTrackingEntity(Entity entity) { @@ -7134,8 +7173,7 @@ index 57bea926a6..9346a2c292 100644 + } + + private static int getEntityTrackingChunkRange(int blockRange) { -+ int centerChunkRange = (blockRange - 8); // on average, players are in the middle of a chunk, so subtract 8 -+ return centerChunkRange >>> 4 + ((centerChunkRange & 15) != 0 ? 1 : 0); ++ return blockRange >>> 4 + ((blockRange & 15) != 0 ? 1 : 0); + } + // Tuinity end - use distance map to optimise entity tracker + @@ -7148,7 +7186,7 @@ index 57bea926a6..9346a2c292 100644 void addPlayerToDistanceMaps(EntityPlayer player) { this.updateMaps(player); -@@ -134,10 +422,89 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -134,10 +431,100 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { // Paper end @@ -7181,9 +7219,13 @@ index 57bea926a6..9346a2c292 100644 + // Tuinity end - optimise PlayerChunkMap#isOutsideRange + + // Tuinity start - use distance map to optimise entity tracker -+ if (this.playerEntityTrackerTrackMap != null) { -+ this.playerEntityTrackerTrackMap.remove(player); -+ this.playerEntityTrackerUntrackMap.remove(player); ++ if (this.optimisedTrackerEnabled) { ++ for (com.tuinity.tuinity.util.map.PlayerAreaMap trackMap : this.playerEntityTrackerTrackMaps) { ++ trackMap.remove(player); ++ } ++ for (com.tuinity.tuinity.util.map.PlayerAreaMap trackMap : this.playerEntityTrackerUntrackMaps) { ++ trackMap.remove(player); ++ } + } + // Tuinity end - use distance map to optimise entity tracker + @@ -7220,9 +7262,16 @@ index 57bea926a6..9346a2c292 100644 + // Tuinity end - optimise PlayerChunkMap#isOutsideRange + + // Tuinity start - use distance map to optimise entity tracker -+ if (this.playerEntityTrackerTrackMap != null) { -+ this.playerEntityTrackerTrackMap.update(player, chunkX, chunkZ, Math.min(this.entityTrackerTrackRange, effectiveViewDistance)); -+ this.playerEntityTrackerUntrackMap.update(player, chunkX, chunkZ, Math.min(this.entityTrackerUntrackRange, effectiveViewDistance)); ++ if (this.optimisedTrackerEnabled) { ++ for (int i = 0, len = TRACKING_RANGE_TYPES.length; i < len; ++i) { ++ com.tuinity.tuinity.util.map.PlayerAreaMap trackMap = this.playerEntityTrackerTrackMaps[i]; ++ com.tuinity.tuinity.util.map.PlayerAreaMap untrackMap = this.playerEntityTrackerUntrackMaps[i]; ++ int trackRange = this.entityTrackerTrackRanges[i]; ++ int untrackRange = this.entityTrackerUntrackRanges[i]; ++ ++ trackMap.update(player, chunkX, chunkZ, Math.min(trackRange, effectiveViewDistance)); ++ untrackMap.update(player, chunkX, chunkZ, Math.min(untrackRange, effectiveViewDistance)); ++ } + } + // Tuinity end - use distance map to optimise entity tracker + @@ -7239,7 +7288,7 @@ index 57bea926a6..9346a2c292 100644 this.pendingUnload = new Long2ObjectLinkedOpenHashMap(); this.loadedChunks = new LongOpenHashSet(); this.unloadQueue = new LongOpenHashSet(); -@@ -166,7 +533,159 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -166,7 +553,185 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { this.l = supplier; this.m = new VillagePlace(new File(this.w, "poi"), datafixer, this.world); // Paper this.setViewDistance(i); @@ -7326,72 +7375,98 @@ index 57bea926a6..9346a2c292 100644 + + // Tuinity start - use distance map to optimise entity tracker + if (!this.world.tuinityConfig.useOptimizedTracker) { -+ this.playerEntityTrackerTrackMap = null; -+ this.playerEntityTrackerUntrackMap = null; -+ this.entityTrackerTrackRange = -1; -+ this.entityTrackerUntrackRange = -1; + this.activelyTrackedEntitiesLegacy = null; ++ this.playerEntityTrackerTrackMaps = null; ++ this.playerEntityTrackerUntrackMaps = null; ++ this.entityTrackerTrackRanges = null; ++ this.entityTrackerUntrackRanges = null; ++ this.optimisedTrackerEnabled = false; + } else { ++ this.optimisedTrackerEnabled = true; + this.activelyTrackedEntitiesLegacy = new com.tuinity.tuinity.util.EntityList(); + -+ // avoid player range, that's special-cased -+ int maxEntityTrackRange = this.world.spigotConfig.animalTrackingRange; -+ if (this.world.spigotConfig.monsterTrackingRange > maxEntityTrackRange) { -+ maxEntityTrackRange = this.world.spigotConfig.monsterTrackingRange; -+ } -+ if (this.world.spigotConfig.miscTrackingRange > maxEntityTrackRange) { -+ maxEntityTrackRange = this.world.spigotConfig.miscTrackingRange; -+ } -+ if (this.world.spigotConfig.otherTrackingRange > maxEntityTrackRange) { -+ maxEntityTrackRange = this.world.spigotConfig.otherTrackingRange; -+ } -+ maxEntityTrackRange = (maxEntityTrackRange >> 4) + ((maxEntityTrackRange & 15) != 0 ? 2 : 1); ++ this.playerEntityTrackerTrackMaps = new com.tuinity.tuinity.util.map.PlayerAreaMap[TRACKING_RANGE_TYPES.length]; ++ this.playerEntityTrackerUntrackMaps = new com.tuinity.tuinity.util.map.PlayerAreaMap[TRACKING_RANGE_TYPES.length]; ++ this.entityTrackerTrackRanges = new int[TRACKING_RANGE_TYPES.length]; ++ this.entityTrackerUntrackRanges = new int[TRACKING_RANGE_TYPES.length]; + -+ if (this.world.tuinityConfig.optimizedTrackerTrackRange == -1) { -+ this.entityTrackerTrackRange = Math.max(1, maxEntityTrackRange - 2); -+ this.entityTrackerUntrackRange = Math.max(2, maxEntityTrackRange - 1); -+ } else { -+ this.entityTrackerTrackRange = this.world.tuinityConfig.optimizedTrackerTrackRange; -+ this.entityTrackerUntrackRange = this.world.tuinityConfig.optimizedTrackerUntrackRange; -+ } ++ org.spigotmc.SpigotWorldConfig spigotWorldConfig = this.world.spigotConfig; + -+ this.playerEntityTrackerTrackMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, -+ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, -+ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { -+ Chunk chunk = PlayerChunkMap.this.world.getChunkProvider().getChunkAtIfCachedImmediately(rangeX, rangeZ); -+ if (chunk == null) { -+ return; -+ } -+ Entity[] entities = chunk.entities.getRawData(); -+ for (int index = 0, len = chunk.entities.size(); index < len; ++index) { -+ Entity entity = entities[index]; -+ if (entity.tracker == null) { -+ entity.addToTrackQueue(player); -+ } else { -+ entity.tracker.updateTrackingPlayer(player); -+ entity.clearTrackingQueues(player); ++ for (int ordinal = 0, len = TRACKING_RANGE_TYPES.length; ordinal < len; ++ordinal) { ++ org.spigotmc.TrackingRange.TrackingRangeType trackingRangeType = TRACKING_RANGE_TYPES[ordinal]; ++ int configuredSpigotValue; ++ switch (trackingRangeType) { ++ case PLAYER: ++ configuredSpigotValue = spigotWorldConfig.playerTrackingRange; ++ break; ++ case ANIMAL: ++ configuredSpigotValue = spigotWorldConfig.animalTrackingRange; ++ break; ++ case MONSTER: ++ configuredSpigotValue = spigotWorldConfig.monsterTrackingRange; ++ break; ++ case MISC: ++ configuredSpigotValue = spigotWorldConfig.miscTrackingRange; ++ break; ++ case OTHER: ++ configuredSpigotValue = spigotWorldConfig.otherTrackingRange; ++ break; ++ case ENDERDRAGON: ++ configuredSpigotValue = 10 * 16; // default is 10 chunk range // TODO check on update ++ break; ++ default: ++ throw new IllegalStateException("Missing case for enum " + trackingRangeType); ++ } ++ ++ int untrackRange = Math.max(1, getEntityTrackingChunkRange(configuredSpigotValue)); ++ int trackRange = untrackRange - 1; ++ this.entityTrackerTrackRanges[ordinal] = trackRange; ++ this.entityTrackerUntrackRanges[ordinal] = untrackRange; ++ ++ this.playerEntityTrackerTrackMaps[ordinal] = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ Chunk chunk = PlayerChunkMap.this.world.getChunkProvider().getChunkAtIfLoadedMainThreadNoCache(rangeX, rangeZ); ++ if (chunk == null || !player.loadedChunks.contains(com.tuinity.tuinity.util.Util.getCoordinateKey(rangeX, rangeZ))) { ++ return; + } -+ } -+ }, -+ null); -+ this.playerEntityTrackerUntrackMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, -+ null, -+ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, -+ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { -+ Chunk chunk = PlayerChunkMap.this.world.getChunkProvider().getChunkAtIfCachedImmediately(rangeX, rangeZ); -+ if (chunk == null) { -+ return; -+ } -+ Entity[] entities = chunk.entities.getRawData(); -+ for (int index = 0, len = chunk.entities.size(); index < len; ++index) { -+ Entity entity = entities[index]; -+ if (entity.tracker == null) { -+ return; // not tracked by player for sure ++ Entity[] entities = chunk.entities.getRawData(); ++ for (int index = 0, length = chunk.entities.size(); index < length; ++index) { ++ Entity entity = entities[index]; ++ if (org.spigotmc.TrackingRange.getTrackingRangeType(entity) != trackingRangeType) { ++ continue; ++ } ++ if (entity.tracker == null) { ++ entity.addToTrackQueue(player); ++ } else { ++ entity.tracker.updateTrackingPlayer(player); ++ entity.clearTrackingQueues(player); ++ } + } -+ entity.tracker.removeTrackingPlayer(player); -+ entity.clearTrackingQueues(player); -+ } -+ }); ++ }, ++ null); ++ this.playerEntityTrackerUntrackMaps[ordinal] = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ null, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ Chunk chunk = PlayerChunkMap.this.world.getChunkProvider().getChunkAtIfCachedImmediately(rangeX, rangeZ); ++ if (chunk == null) { ++ return; ++ } ++ Entity[] entities = chunk.entities.getRawData(); ++ for (int index = 0, length = chunk.entities.size(); index < length; ++index) { ++ Entity entity = entities[index]; ++ if (entity.tracker == null) { ++ return; // not tracked by player for sure ++ } ++ if (org.spigotmc.TrackingRange.getTrackingRangeType(entity) != trackingRangeType) { ++ continue; ++ } ++ entity.tracker.removeTrackingPlayer(player); ++ entity.clearTrackingQueues(player); ++ } ++ }); ++ } + } + // Tuinity end - use distance map to optimise entity tracker + // Tuinity start - optimise getPlayersInRange type functions @@ -7400,7 +7475,7 @@ index 57bea926a6..9346a2c292 100644 } public void updatePlayerMobTypeMap(Entity entity) { -@@ -177,15 +696,30 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -177,15 +742,30 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { int chunkZ = (int)Math.floor(entity.locZ()) >> 4; int index = entity.getEntityType().getEnumCreatureType().ordinal(); @@ -7432,7 +7507,7 @@ index 57bea926a6..9346a2c292 100644 private static double a(ChunkCoordIntPair chunkcoordintpair, Entity entity) { double d0 = (double) (chunkcoordintpair.x * 16 + 8); double d1 = (double) (chunkcoordintpair.z * 16 + 8); -@@ -213,8 +747,13 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -213,8 +793,13 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { } private static int a(ChunkCoordIntPair chunkcoordintpair, int i, int j) { @@ -7448,7 +7523,7 @@ index 57bea926a6..9346a2c292 100644 return Math.max(Math.abs(k), Math.abs(l)); } -@@ -225,12 +764,17 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -225,12 +810,17 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { @Nullable protected PlayerChunk getUpdatingChunk(long i) { @@ -7468,7 +7543,7 @@ index 57bea926a6..9346a2c292 100644 } protected IntSupplier c(long i) { -@@ -308,6 +852,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -308,6 +898,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { @Nullable private PlayerChunk a(long i, int j, @Nullable PlayerChunk playerchunk, int k) { @@ -7476,7 +7551,7 @@ index 57bea926a6..9346a2c292 100644 if (k > PlayerChunkMap.GOLDEN_TICKET && j > PlayerChunkMap.GOLDEN_TICKET) { return playerchunk; } else { -@@ -327,11 +872,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -327,11 +918,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { playerchunk = (PlayerChunk) this.pendingUnload.remove(i); if (playerchunk != null) { playerchunk.a(j); @@ -7490,7 +7565,7 @@ index 57bea926a6..9346a2c292 100644 this.updatingChunksModified = true; } -@@ -411,7 +957,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -411,7 +1003,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { protected void save(boolean flag) { if (flag) { @@ -7499,7 +7574,7 @@ index 57bea926a6..9346a2c292 100644 MutableBoolean mutableboolean = new MutableBoolean(); do { -@@ -439,7 +985,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -439,7 +1031,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { // this.i(); // Paper - nuke IOWorker PlayerChunkMap.LOGGER.info("ThreadedAnvilChunkStorage ({}): All chunks are saved", this.w.getName()); } else { @@ -7508,7 +7583,7 @@ index 57bea926a6..9346a2c292 100644 IChunkAccess ichunkaccess = (IChunkAccess) playerchunk.getChunkSave().getNow(null); // CraftBukkit - decompile error if (ichunkaccess instanceof ProtoChunkExtension || ichunkaccess instanceof Chunk) { -@@ -482,7 +1028,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -482,7 +1074,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { while (longiterator.hasNext()) { // Spigot long j = longiterator.nextLong(); longiterator.remove(); // Spigot @@ -7517,7 +7592,7 @@ index 57bea926a6..9346a2c292 100644 if (playerchunk != null) { this.pendingUnload.put(j, playerchunk); -@@ -610,7 +1156,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -610,7 +1202,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { if (!this.updatingChunksModified) { return false; } else { @@ -7526,7 +7601,7 @@ index 57bea926a6..9346a2c292 100644 this.updatingChunksModified = false; return true; } -@@ -903,11 +1449,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -903,11 +1495,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { completablefuture1.thenAcceptAsync((either) -> { either.mapLeft((chunk) -> { this.u.getAndIncrement(); @@ -7539,7 +7614,7 @@ index 57bea926a6..9346a2c292 100644 return Either.left(chunk); }); }, (runnable) -> { -@@ -1011,58 +1553,70 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1011,58 +1599,70 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { } // Paper } @@ -7631,7 +7706,7 @@ index 57bea926a6..9346a2c292 100644 } protected PlayerChunkMap.a e() { -@@ -1070,12 +1624,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1070,12 +1670,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { } protected Iterable f() { @@ -7646,7 +7721,7 @@ index 57bea926a6..9346a2c292 100644 while (objectbidirectionaliterator.hasNext()) { Entry entry = (Entry) objectbidirectionaliterator.next(); -@@ -1265,31 +1819,53 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1265,31 +1865,53 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { return isOutsideOfRange(chunkcoordintpair, false); } @@ -7720,7 +7795,7 @@ index 57bea926a6..9346a2c292 100644 private boolean b(EntityPlayer entityplayer) { return entityplayer.isSpectator() && !this.world.getGameRules().getBoolean(GameRules.SPECTATORS_GENERATE_CHUNKS); } -@@ -1315,13 +1891,11 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1315,13 +1937,11 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { } } @@ -7738,7 +7813,7 @@ index 57bea926a6..9346a2c292 100644 } -@@ -1329,11 +1903,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1329,11 +1949,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { SectionPosition sectionposition = SectionPosition.a((Entity) entityplayer); entityplayer.a(sectionposition); @@ -7748,11 +7823,11 @@ index 57bea926a6..9346a2c292 100644 } public void movePlayer(EntityPlayer entityplayer) { -+ if (this.playerEntityTrackerTrackMap == null) { // Tuinity - optimized tracker ++ if (!this.optimisedTrackerEnabled) { // Tuinity - optimized tracker ObjectIterator objectiterator = this.trackedEntities.values().iterator(); while (objectiterator.hasNext()) { -@@ -1345,6 +1920,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1345,6 +1966,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { playerchunkmap_entitytracker.updatePlayer(entityplayer); } } @@ -7760,7 +7835,7 @@ index 57bea926a6..9346a2c292 100644 int i = MathHelper.floor(entityplayer.locX()) >> 4; int j = MathHelper.floor(entityplayer.locZ()) >> 4; -@@ -1384,56 +1960,53 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1384,56 +2006,53 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { int k1; int l1; @@ -7772,7 +7847,12 @@ index 57bea926a6..9346a2c292 100644 + this.updateMaps(entityplayer); // Paper - distance maps + this.updateDistanceMapsTuinity(entityplayer); // Tuinity - distance maps + } -+ + +- for (int k2 = k1; k2 <= i2; ++k2) { +- for (int l2 = l1; l2 <= j2; ++l2) { +- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(k2, l2); +- boolean flag3 = a(chunkcoordintpair, i1, j1) <= this.viewDistance; +- boolean flag4 = a(chunkcoordintpair, i, j) <= this.viewDistance; + @Override + public Stream a(ChunkCoordIntPair chunkcoordintpair, boolean flag) { + // Tuinity start - per player view distance @@ -7796,12 +7876,7 @@ index 57bea926a6..9346a2c292 100644 + EntityPlayer player = (EntityPlayer)temp; + int viewDistance = this.playerViewDistanceBroadcastMap.getLastViewDistance(player); + long lastPosition = this.playerViewDistanceBroadcastMap.getLastCoordinate(player); - -- for (int k2 = k1; k2 <= i2; ++k2) { -- for (int l2 = l1; l2 <= j2; ++l2) { -- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(k2, l2); -- boolean flag3 = a(chunkcoordintpair, i1, j1) <= this.viewDistance; -- boolean flag4 = a(chunkcoordintpair, i, j) <= this.viewDistance; ++ + int distX = Math.abs(com.tuinity.tuinity.util.Util.getCoordinateX(lastPosition) - chunkcoordintpair.x); + int distZ = Math.abs(com.tuinity.tuinity.util.Util.getCoordinateZ(lastPosition) - chunkcoordintpair.z); @@ -7855,21 +7930,22 @@ index 57bea926a6..9346a2c292 100644 } protected void addEntity(Entity entity) { -@@ -1452,11 +2025,36 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1452,11 +2071,37 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { entity.tracker = playerchunkmap_entitytracker; // Paper - Fast access to tracker this.trackedEntities.put(entity.getId(), playerchunkmap_entitytracker); -+ if (this.playerEntityTrackerTrackMap == null) { // Tuinity - implement optimized tracker ++ if (!this.optimisedTrackerEnabled) { // Tuinity - implement optimized tracker playerchunkmap_entitytracker.track(this.world.getPlayers()); + // Tuinity start - implement optimized tracker + } else { ++ entity.acquireTrackingMap(this); + if (PlayerChunkMap.isLegacyTrackingEntity(entity)) { + this.activelyTrackedEntitiesLegacy.add(entity); + // tracker tick will propagate updates + } else { + int chunkX = com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locX()); + int chunkZ = com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locZ()); -+ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet playersTracking = this.playerEntityTrackerTrackMap.getObjectsInRange(chunkX, chunkZ); ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet playersTracking = entity.trackingAreaMap.getObjectsInRange(chunkX, chunkZ); + if (playersTracking != null) { + Object[] backingSet = playersTracking.getBackingSet(); + for (int index = 0, len = backingSet.length; index < len; ++index) { @@ -7877,7 +7953,7 @@ index 57bea926a6..9346a2c292 100644 + if (!(temp instanceof EntityPlayer)) { + continue; + } -+ EntityPlayer trackingPlayer = (EntityPlayer) temp; ++ EntityPlayer trackingPlayer = (EntityPlayer)temp; + playerchunkmap_entitytracker.updateTrackingPlayer(trackingPlayer); + } + } @@ -7888,11 +7964,11 @@ index 57bea926a6..9346a2c292 100644 EntityPlayer entityplayer = (EntityPlayer) entity; this.a(entityplayer, true); -+ if (this.playerEntityTrackerTrackMap == null) { // Tuinity - implement optimized tracker ++ if (!this.optimisedTrackerEnabled) { // Tuinity - implement optimized tracker ObjectIterator objectiterator = this.trackedEntities.values().iterator(); while (objectiterator.hasNext()) { -@@ -1466,6 +2064,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1466,6 +2111,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { playerchunkmap_entitytracker1.updatePlayer(entityplayer); } } @@ -7900,7 +7976,7 @@ index 57bea926a6..9346a2c292 100644 } } -@@ -1494,9 +2093,102 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1494,9 +2140,105 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { playerchunkmap_entitytracker1.a(); } entity.tracker = null; // Paper - We're no longer tracked @@ -7908,6 +7984,7 @@ index 57bea926a6..9346a2c292 100644 + if (this.activelyTrackedEntitiesLegacy != null) { + this.activelyTrackedEntitiesLegacy.remove(entity); + } ++ entity.releaseTrackingMap(this); + // Tuinity end - optimise entity tracking - we're no longer tracked } @@ -7935,7 +8012,7 @@ index 57bea926a6..9346a2c292 100644 + int chunkZ = com.tuinity.tuinity.util.Util.getChunkCoordinate(player.locZ()); + + com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet inRange = -+ this.playerEntityTrackerUntrackMap.getObjectsInRange(chunkX, chunkZ); ++ tracked.unTrackingAreaMap.getObjectsInRange(chunkX, chunkZ); + + if (inRange != null && inRange.contains(player)) { + tracker.updateTrackingPlayer((EntityPlayer)player); @@ -7974,6 +8051,7 @@ index 57bea926a6..9346a2c292 100644 + + // legacy tracker + ++ this.world.timings.tracker3.startTiming(); + Entity[] legacyEntities = this.activelyTrackedEntitiesLegacy.getRawData(); + for (int i = 0, size = this.activelyTrackedEntitiesLegacy.size(); i < size; ++i) { + Entity entity = legacyEntities[i]; @@ -7990,12 +8068,13 @@ index 57bea926a6..9346a2c292 100644 + tracker.track(this.world.getPlayers()); + entry.tick(); // always tick the entry, even if no player is tracking + } ++ this.world.timings.tracker3.stopTiming(); + } + // Tuinity end - optimized tracker + protected void g() { + // Tuinity start - optimized tracker -+ if (this.playerEntityTrackerTrackMap != null) { ++ if (this.optimisedTrackerEnabled) { + this.processTrackQueue(); + return; + } @@ -8003,7 +8082,7 @@ index 57bea926a6..9346a2c292 100644 List list = Lists.newArrayList(); List list1 = this.world.getPlayers(); -@@ -1554,6 +2246,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1554,6 +2296,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { } @@ -8011,15 +8090,15 @@ index 57bea926a6..9346a2c292 100644 private void a(EntityPlayer entityplayer, Packet[] apacket, Chunk chunk) { if (apacket[0] == null) { apacket[0] = new PacketPlayOutMapChunk(chunk, 65535, true); // Paper - Anti-Xray -@@ -1564,6 +2257,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1564,6 +2307,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { PacketDebug.a(this.world, chunk.getPos()); List list = Lists.newArrayList(); List list1 = Lists.newArrayList(); -+ if (this.playerEntityTrackerTrackMap == null) { // Tuinity - implement optimized tracker ++ if (!this.optimisedTrackerEnabled) { // Tuinity - implement optimized tracker ObjectIterator objectiterator = this.trackedEntities.values().iterator(); while (objectiterator.hasNext()) { -@@ -1581,6 +2275,32 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1581,6 +2325,31 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { } } } @@ -8029,30 +8108,29 @@ index 57bea926a6..9346a2c292 100644 + // Tuinity start - implement optimized tracker + // It's important to note that this is ONLY called when the chunk is at ticking level. + // At this point, the entities should be added in the chunk. -+ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet playersInRange -+ = this.playerEntityTrackerTrackMap.getObjectsInRange(chunk.getPos()); + // only send entities when they're in tracking range... -+ if (playersInRange != null && playersInRange.contains(entityplayer)) { -+ chunk.forEachEntity((Entity entityInChunk) -> { -+ PlayerChunkMap.EntityTracker tracker = entityInChunk.tracker; -+ if (tracker == null) { -+ return; // when added to tracker, this entity will propagate to players -+ } -+ -+ if (entityInChunk == entityplayer) { -+ return; // can't track himself -+ } ++ Entity[] entities = chunk.entities.getRawData(); ++ for (int i = 0, len = chunk.entities.size(); i < len; ++i) { ++ Entity entityInChunk = entities[i]; ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet playersInRange ++ = entityInChunk.trackingAreaMap.getObjectsInRange(chunk.getPos()); ++ if (playersInRange == null || !playersInRange.contains(entityplayer)) { ++ continue; ++ } ++ PlayerChunkMap.EntityTracker tracker = entityInChunk.tracker; ++ if (tracker == null) { ++ continue; ++ } + -+ // Note: We don't add to the lists because the track logic will handle it -+ tracker.updateTrackingPlayer(entityplayer); -+ }); ++ // Note: We don't add to the lists because the track logic will handle it ++ tracker.updateTrackingPlayer(entityplayer); + } + } + // Tuinity end - implement optimized tracker Iterator iterator; Entity entity1; -@@ -1618,7 +2338,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1618,7 +2387,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { public class EntityTracker { @@ -8061,7 +8139,7 @@ index 57bea926a6..9346a2c292 100644 private final Entity tracker; private final int trackingDistance; private SectionPosition e; -@@ -1684,10 +2404,13 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1684,10 +2453,13 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { public void updatePlayer(EntityPlayer entityplayer) { org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot if (entityplayer != this.tracker) { @@ -8079,7 +8157,7 @@ index 57bea926a6..9346a2c292 100644 if (flag) { boolean flag1 = this.tracker.attachedToPlayer; -@@ -1696,7 +2419,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1696,7 +2468,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { PlayerChunk playerchunk = PlayerChunkMap.this.getVisibleChunk(chunkcoordintpair.pair()); if (playerchunk != null && playerchunk.getChunk() != null) { @@ -8088,12 +8166,12 @@ index 57bea926a6..9346a2c292 100644 } } -@@ -1738,6 +2461,44 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { +@@ -1738,6 +2510,42 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { return i; } + // Tuinity start - optimized tracker -+ public final void updateTrackingPlayer(EntityPlayer entityplayer) { ++ final void updateTrackingPlayer(EntityPlayer entityplayer) { + if (entityplayer == this.tracker) { + return; + } @@ -8102,15 +8180,13 @@ index 57bea926a6..9346a2c292 100644 + // we also add a world check since we queue tracking changes + // TODO check on update + // CraftBukkit start - respect vanish API -+ boolean shouldTrack = entityplayer.world == tracker.world; ++ boolean shouldTrack = entityplayer.world == tracker.world && entityplayer.loadedChunks.contains(com.tuinity.tuinity.util.Util.getCoordinateKey(this.tracker)); + if (this.tracker instanceof EntityPlayer) { + Player player = ((EntityPlayer)this.tracker).getBukkitEntity(); + if (!entityplayer.getBukkitEntity().canSee(player)) { + shouldTrack = false; + } + } -+ -+ entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId())); + // CraftBukkit end + + if (shouldTrack) { @@ -8122,7 +8198,7 @@ index 57bea926a6..9346a2c292 100644 + } + } + -+ public final void removeTrackingPlayer(EntityPlayer player) { ++ final void removeTrackingPlayer(EntityPlayer player) { + com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Tracker update"); // Tuinity + if (this.trackedPlayers.remove(player)) { + this.trackerEntry.onUntrack(player); @@ -9257,7 +9333,7 @@ index 5117dafbcf..5f69a018d9 100644 if (chunk != null) { chunk.a(oclass, axisalignedbb, list, predicate); diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index 2de48e7537..ef021bca36 100644 +index 2de48e7537..a438c6e29b 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java @@ -55,7 +55,7 @@ public class WorldServer extends World { @@ -9692,13 +9768,13 @@ index 2de48e7537..ef021bca36 100644 + int newChunkZ = entity.chunkZ; + if (entity.valid && (prevChunkX != newChunkX || prevChunkZ != newChunkZ)) { + PlayerChunkMap chunkMap = this.getChunkProvider().playerChunkMap; -+ if (chunkMap.playerEntityTrackerTrackMap != null) { ++ if (chunkMap.optimisedTrackerEnabled) { + if (!PlayerChunkMap.isLegacyTrackingEntity(entity)) { + // handle tracking + com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet oldRange = -+ chunkMap.playerEntityTrackerTrackMap.getObjectsInRange(prevChunkX, prevChunkZ); ++ entity.trackingAreaMap.getObjectsInRange(prevChunkX, prevChunkZ); + com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newRange = -+ chunkMap.playerEntityTrackerTrackMap.getObjectsInRange(newChunkX, newChunkZ); ++ entity.trackingAreaMap.getObjectsInRange(newChunkX, newChunkZ); + + if (oldRange != newRange) { // optimization: equal pooled sets are identity equal + if (newRange != null) { @@ -9730,8 +9806,8 @@ index 2de48e7537..ef021bca36 100644 + } + + // handle untracking -+ oldRange = chunkMap.playerEntityTrackerUntrackMap.getObjectsInRange(prevChunkX, prevChunkZ); -+ newRange = chunkMap.playerEntityTrackerUntrackMap.getObjectsInRange(newChunkX, newChunkZ); ++ oldRange = entity.unTrackingAreaMap.getObjectsInRange(prevChunkX, prevChunkZ); ++ newRange = entity.unTrackingAreaMap.getObjectsInRange(newChunkX, newChunkZ); + if (oldRange != newRange) { // optimization: equal pooled sets are identity equal + if (oldRange != null) { + if (newRange == null) { @@ -10063,7 +10139,7 @@ index dfa15372b8..949acb1d32 100644 public Chunk getChunk() { net.minecraft.server.Chunk currentChunk = entity.getCurrentChunk(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 60f62f19cb..516a016480 100644 +index 60f62f19cb..b5ffd14413 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1,5 +1,6 @@ @@ -10077,11 +10153,11 @@ index 60f62f19cb..516a016480 100644 PlayerChunkMap.EntityTracker entry = tracker.trackedEntities.get(other.getId()); if (entry != null && !entry.trackedPlayers.contains(getHandle())) { -+ if (getHandle().getWorldServer().getChunkProvider().playerChunkMap.playerEntityTrackerTrackMap == null) { // Tuinity - optimized tracker ++ if (!getHandle().getWorldServer().getChunkProvider().playerChunkMap.optimisedTrackerEnabled || PlayerChunkMap.isLegacyTrackingEntity(other)) { // Tuinity - optimized tracker entry.updatePlayer(getHandle()); + // Tuinity start - optimized tracker + } else { -+ other.addToTrackQueue(other); ++ other.addToTrackQueue(getHandle()); + } + // Tuinity end - optimized tracker } @@ -10229,6 +10305,55 @@ index 9f7d2ef932..c3ac1a46c3 100644 { throw new IllegalStateException( "Asynchronous " + reason + "!" ); } +diff --git a/src/main/java/org/spigotmc/TrackingRange.java b/src/main/java/org/spigotmc/TrackingRange.java +index 46c33e6917..76a4d43152 100644 +--- a/src/main/java/org/spigotmc/TrackingRange.java ++++ b/src/main/java/org/spigotmc/TrackingRange.java +@@ -47,4 +47,44 @@ public class TrackingRange + return config.otherTrackingRange; + } + } ++ ++ // Tuinity start - optimise entity tracking ++ // copied from above, TODO check on update ++ public static TrackingRangeType getTrackingRangeType(Entity entity) ++ { ++ SpigotWorldConfig config = entity.world.spigotConfig; ++ if ( entity instanceof EntityPlayer ) ++ { ++ return TrackingRangeType.PLAYER; ++ // Paper start - Simplify and set water mobs to animal tracking range ++ } ++ switch (entity.activationType) { ++ case RAIDER: ++ case MONSTER: ++ return TrackingRangeType.MONSTER; ++ case WATER: ++ case ANIMAL: ++ return TrackingRangeType.ANIMAL; ++ case MISC: ++ } ++ if ( entity instanceof EntityItemFrame || entity instanceof EntityPainting || entity instanceof EntityItem || entity instanceof EntityExperienceOrb ) ++ // Paper end ++ { ++ return TrackingRangeType.MISC; ++ } else ++ { ++ if (entity instanceof EntityEnderDragon) return TrackingRangeType.ENDERDRAGON; // Paper - enderdragon is exempt ++ return TrackingRangeType.OTHER; ++ } ++ } ++ ++ public static enum TrackingRangeType { ++ PLAYER, ++ ANIMAL, ++ MONSTER, ++ MISC, ++ OTHER, ++ ENDERDRAGON; ++ } ++ // Tuinity end + } -- 2.24.0 diff --git a/patches/server/0006-Ridables.patch b/patches/server/0006-Ridables.patch index fdd48832a..fed37577f 100644 --- a/patches/server/0006-Ridables.patch +++ b/patches/server/0006-Ridables.patch @@ -1,4 +1,4 @@ -From 71031b29021f6399ec74e28c175b70c10578494b Mon Sep 17 00:00:00 2001 +From 781c2279df8a30208dc342bd2a934263ffe4a841 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 6 Feb 2020 19:53:59 -0600 Subject: [PATCH] Ridables @@ -195,7 +195,7 @@ index 816d301f1c..f7344d3aec 100644 this.C = true; return this; diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 181f1742ac..30fff1a466 100644 +index 3cdba5c42a..b0942bde3f 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -78,7 +78,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke @@ -234,7 +234,7 @@ index 181f1742ac..30fff1a466 100644 private float headHeight; // CraftBukkit start public boolean persist = true; -@@ -913,6 +913,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -933,6 +933,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return vec3d1; } @@ -242,7 +242,7 @@ index 181f1742ac..30fff1a466 100644 public static double b(Vec3D vec3d) { return vec3d.x * vec3d.x + vec3d.z * vec3d.z; } -@@ -1239,6 +1240,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1259,6 +1260,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return flag; } @@ -250,7 +250,7 @@ index 181f1742ac..30fff1a466 100644 private boolean l() { return this.world.getType(new BlockPosition(this)).getBlock() == Blocks.BUBBLE_COLUMN; } -@@ -1252,8 +1254,9 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1272,8 +1274,9 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return this.isInWater() || this.isInRain() || this.l(); } @@ -261,7 +261,7 @@ index 181f1742ac..30fff1a466 100644 } public boolean aA() { -@@ -1384,6 +1387,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1404,6 +1407,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return this.inLava; } @@ -269,7 +269,7 @@ index 181f1742ac..30fff1a466 100644 public void a(float f, Vec3D vec3d) { Vec3D vec3d1 = a(vec3d, f, this.yaw); -@@ -2212,7 +2216,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2232,7 +2236,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } else { this.passengers.add(entity); } @@ -284,7 +284,7 @@ index 181f1742ac..30fff1a466 100644 } return true; // CraftBukkit } -@@ -2247,6 +2257,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2267,6 +2277,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return false; } // Spigot end @@ -297,7 +297,7 @@ index 181f1742ac..30fff1a466 100644 this.passengers.remove(entity); entity.j = 60; } -@@ -2415,6 +2431,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2435,6 +2451,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.setFlag(4, flag); } @@ -305,7 +305,7 @@ index 181f1742ac..30fff1a466 100644 public boolean bt() { return this.glowing || this.world.isClientSide && this.getFlag(6); } -@@ -2633,6 +2650,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2653,6 +2670,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke public void setHeadRotation(float f) {} @@ -313,7 +313,7 @@ index 181f1742ac..30fff1a466 100644 public void l(float f) {} public boolean bA() { -@@ -3478,4 +3496,43 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -3498,4 +3516,43 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke void accept(Entity entity, double d0, double d1, double d2); } diff --git a/patches/server/0018-Cows-eat-mushrooms.patch b/patches/server/0018-Cows-eat-mushrooms.patch index 9ce01ed96..8cdef8d02 100644 --- a/patches/server/0018-Cows-eat-mushrooms.patch +++ b/patches/server/0018-Cows-eat-mushrooms.patch @@ -1,4 +1,4 @@ -From 8db8894db3cd06a5d0880d097255be17b611cc69 Mon Sep 17 00:00:00 2001 +From fee8e53ea5fb39b146f36a2059740a016eb6d054 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 4 May 2019 01:10:30 -0500 Subject: [PATCH] Cows eat mushrooms @@ -11,10 +11,10 @@ Subject: [PATCH] Cows eat mushrooms 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 30fff1a466..3b52f44b5f 100644 +index b0942bde3f..290607b66a 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1137,6 +1137,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1157,6 +1157,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return false; } @@ -22,7 +22,7 @@ index 30fff1a466..3b52f44b5f 100644 public void a(SoundEffect soundeffect, float f, float f1) { if (!this.isSilent()) { this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), soundeffect, this.getSoundCategory(), f, f1); -@@ -2677,6 +2678,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2697,6 +2698,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.invulnerable = flag; } diff --git a/patches/server/0023-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/server/0023-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index c5e7b97d2..bdabb4741 100644 --- a/patches/server/0023-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/patches/server/0023-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -1,4 +1,4 @@ -From 275747ed0be98ff0c1d03039f0ee3434c4c5cef3 Mon Sep 17 00:00:00 2001 +From 96d6a347eb4216c8839ef50b5fe78d0c0dee46f6 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 9 May 2019 18:26:06 -0500 Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms @@ -25,10 +25,10 @@ index f7344d3aec..f6c0165f94 100644 return (new EntityDamageSourceIndirect("indirectMagic", entity, entity1)).setIgnoreArmor().setMagic(); } diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 3b52f44b5f..34cf8039c5 100644 +index 290607b66a..4f280aca7b 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1484,6 +1484,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1504,6 +1504,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return d3 * d3 + d4 * d4 + d5 * d5; } @@ -36,7 +36,7 @@ index 3b52f44b5f..34cf8039c5 100644 public double h(Entity entity) { return this.c(entity.getPositionVector()); } -@@ -2007,14 +2008,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2027,14 +2028,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return this.a(new ItemStack(imaterial), (float) i); } diff --git a/patches/server/0032-Controllable-Minecarts.patch b/patches/server/0032-Controllable-Minecarts.patch index 4baa6f13a..6c14ff013 100644 --- a/patches/server/0032-Controllable-Minecarts.patch +++ b/patches/server/0032-Controllable-Minecarts.patch @@ -1,4 +1,4 @@ -From 28c1229a0fa4bd77ce56577a81cb6f23e89cd854 Mon Sep 17 00:00:00 2001 +From 80c196a657bccec715d713dc5a40dcb47052f9ca Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 29 Jun 2019 02:32:40 -0500 Subject: [PATCH] Controllable Minecarts @@ -11,10 +11,10 @@ Subject: [PATCH] Controllable Minecarts 4 files changed, 76 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 34cf8039c5..d121e5080b 100644 +index 4f280aca7b..e18fbfdd0a 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1384,6 +1384,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1404,6 +1404,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.inLava = true; } diff --git a/patches/server/0038-Dont-send-useless-entity-packets.patch b/patches/server/0038-Dont-send-useless-entity-packets.patch index 3c55c08b7..a0fbdb993 100644 --- a/patches/server/0038-Dont-send-useless-entity-packets.patch +++ b/patches/server/0038-Dont-send-useless-entity-packets.patch @@ -1,4 +1,4 @@ -From 04d58cc1908e9823eba1e48bfa52683d9e650a02 Mon Sep 17 00:00:00 2001 +From 400e1baed69b069bb3b98ddd37b4e3209b4a7063 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 6 Jul 2019 17:00:04 -0500 Subject: [PATCH] Dont send useless entity packets @@ -10,7 +10,7 @@ Subject: [PATCH] Dont send useless entity packets 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java -index b4d3c4a4f..1dc29d7cd 100644 +index 0323055c68..6449663b57 100644 --- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java @@ -168,6 +168,7 @@ public class EntityTrackerEntry { @@ -41,11 +41,11 @@ index b4d3c4a4f..1dc29d7cd 100644 + } + // Purpur end + - // Tuinity end - optimise entity tracking - // TODO make use of this in second pass rewrite - final void resetState() { + public final void onUntrack(EntityPlayer player) { this.a(player); } // Tuinity - OBFHELPER + public void a(EntityPlayer entityplayer) { + this.tracker.c(entityplayer); diff --git a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java -index e5da2b19c..5b1d95935 100644 +index e5da2b19c1..5b1d959354 100644 --- a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java +++ b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java @@ -5,11 +5,11 @@ import java.io.IOException; @@ -66,7 +66,7 @@ index e5da2b19c..5b1d95935 100644 protected boolean h; protected boolean i; diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 345404c3a..e21931216 100644 +index 345404c3a1..e219312168 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -142,6 +142,11 @@ public class PurpurConfig { diff --git a/patches/server/0049-Add-EntityPortalReadyEvent.patch b/patches/server/0049-Add-EntityPortalReadyEvent.patch index d21b4c4e7..13d82e7f4 100644 --- a/patches/server/0049-Add-EntityPortalReadyEvent.patch +++ b/patches/server/0049-Add-EntityPortalReadyEvent.patch @@ -1,4 +1,4 @@ -From c99d6744eeb5c60a89ef9610ad0262057780c6f1 Mon Sep 17 00:00:00 2001 +From 17f5f28322f45d104920cf8fb1343e468961c57b Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 11 Jan 2020 23:12:52 -0600 Subject: [PATCH] Add EntityPortalReadyEvent @@ -86,7 +86,7 @@ index 09c7c13183..6880cdd7f9 100644 break; // CraftBukkit start - add the block to our list diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index d121e5080b..f2fdec4f1f 100644 +index e18fbfdd0a..d54bd814c8 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -168,9 +168,9 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke @@ -102,7 +102,7 @@ index d121e5080b..f2fdec4f1f 100644 private boolean invulnerable; protected UUID uniqueID; protected String am; -@@ -2317,6 +2317,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2337,6 +2337,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.world.getMethodProfiler().enter("portal"); this.ag = i; this.portalCooldown = this.ba(); @@ -141,7 +141,7 @@ index f84dd6d9be..f50e9670bc 100644 } } diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index ff38e6c69c..d9bf65809d 100644 +index f19ef4d11c..eae1f79009 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java @@ -65,7 +65,7 @@ public class WorldServer extends World { diff --git a/patches/server/0057-Ladders-should-not-bypass-cramming-gamerule.patch b/patches/server/0057-Ladders-should-not-bypass-cramming-gamerule.patch index 281e69a88..b29e721b6 100644 --- a/patches/server/0057-Ladders-should-not-bypass-cramming-gamerule.patch +++ b/patches/server/0057-Ladders-should-not-bypass-cramming-gamerule.patch @@ -1,4 +1,4 @@ -From 59914b40255eb58be586d1ca14b2c520cf789886 Mon Sep 17 00:00:00 2001 +From 3dbb1399beea2403ac2557977c1a4b422cb1f79f Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 21 Jul 2019 18:06:20 -0500 Subject: [PATCH] Ladders should not bypass cramming gamerule @@ -17,10 +17,10 @@ Subject: [PATCH] Ladders should not bypass cramming gamerule 10 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index f2fdec4f1f..574c9b8e36 100644 +index d54bd814c8..00a8df8a7f 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1611,6 +1611,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1631,6 +1631,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } public boolean isCollidable() { diff --git a/patches/server/0097-Add-option-to-disable-saving-projectiles-to-disk.patch b/patches/server/0097-Add-option-to-disable-saving-projectiles-to-disk.patch index 02cf0d250..b3444acff 100644 --- a/patches/server/0097-Add-option-to-disable-saving-projectiles-to-disk.patch +++ b/patches/server/0097-Add-option-to-disable-saving-projectiles-to-disk.patch @@ -1,4 +1,4 @@ -From 564b097a276c2d25ed4b8ca91b5a6eed6ef439c8 Mon Sep 17 00:00:00 2001 +From 2a32d1e318c8d4b1e9178fcd1db43b4ee7cdbf64 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 18 Feb 2020 20:07:08 -0600 Subject: [PATCH] Add option to disable saving projectiles to disk @@ -34,10 +34,10 @@ index d529b795c5..e883365b0b 100644 // Paper start if ((int) Math.floor(entity.locX()) >> 4 != chunk.getPos().x || (int) Math.floor(entity.locZ()) >> 4 != chunk.getPos().z) { diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 574c9b8e36..125ab2adc9 100644 +index 00a8df8a7f..dd174f5065 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1628,6 +1628,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1648,6 +1648,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } diff --git a/patches/server/0100-Add-item-entity-options.patch b/patches/server/0100-Add-item-entity-options.patch index d6b2f4f57..74e774a2c 100644 --- a/patches/server/0100-Add-item-entity-options.patch +++ b/patches/server/0100-Add-item-entity-options.patch @@ -1,4 +1,4 @@ -From 69cc0a5e126856f8c63806c0fe4a22b8705519a7 Mon Sep 17 00:00:00 2001 +From 72665a928fc6af9a009329f0ea38bff623b57f70 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 22 Feb 2020 15:54:08 -0600 Subject: [PATCH] Add item entity options @@ -10,10 +10,10 @@ Subject: [PATCH] Add item entity options 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 125ab2adc9..63c78e83fd 100644 +index dd174f5065..b45472b008 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1359,6 +1359,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1379,6 +1379,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } diff --git a/patches/server/0102-Configurable-void-damage-height.patch b/patches/server/0102-Configurable-void-damage-height.patch index 61bc9ff4a..8fd46877c 100644 --- a/patches/server/0102-Configurable-void-damage-height.patch +++ b/patches/server/0102-Configurable-void-damage-height.patch @@ -1,4 +1,4 @@ -From a3bbecb7563589578a72b322928e547f5a7d3743 Mon Sep 17 00:00:00 2001 +From 06e1fa817f67f44bb929c7a8cfa9cee651a8e8ad Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 27 Feb 2020 21:42:19 -0600 Subject: [PATCH] Configurable void damage height @@ -9,10 +9,10 @@ Subject: [PATCH] Configurable void damage height 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index ff42ee6eb6..a38a29e3d6 100644 +index b45472b008..8e3f672bcc 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -550,7 +550,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -570,7 +570,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke // Paper start protected void performVoidDamage() { @@ -22,7 +22,7 @@ index ff42ee6eb6..a38a29e3d6 100644 && this.locY >= world.paperConfig.netherVoidTopDamageHeight)) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 7e467230a7..0180d76845 100644 +index 3c5f83f651..938add0cf7 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -198,6 +198,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0103-Fix-the-dead-lagging-the-server.patch b/patches/server/0103-Fix-the-dead-lagging-the-server.patch index 0cb3d23bc..d5f412fce 100644 --- a/patches/server/0103-Fix-the-dead-lagging-the-server.patch +++ b/patches/server/0103-Fix-the-dead-lagging-the-server.patch @@ -1,4 +1,4 @@ -From 36ea3dd71dd8ee3fe9ed2859ae93588aa71eeb16 Mon Sep 17 00:00:00 2001 +From 6b074bee911939cd4bce9cd4ad670d820652f568 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 6 Mar 2020 13:37:26 -0600 Subject: [PATCH] Fix the dead lagging the server @@ -9,10 +9,10 @@ Subject: [PATCH] Fix the dead lagging the server 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 2e1ed61490..a65f8c7d73 100644 +index 8e3f672bcc..d9c5c1ddc4 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1445,7 +1445,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1465,7 +1465,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.pitch = MathHelper.a(f1, -90.0F, 90.0F) % 360.0F; this.lastYaw = this.yaw; this.lastPitch = this.pitch;