diff --git a/Spigot-Server-Patches/Add-MinecraftKey-Information-to-Objects.patch b/Spigot-Server-Patches/Add-MinecraftKey-Information-to-Objects.patch index 8905c65192..2b9410af4a 100644 --- a/Spigot-Server-Patches/Add-MinecraftKey-Information-to-Objects.patch +++ b/Spigot-Server-Patches/Add-MinecraftKey-Information-to-Objects.patch @@ -19,7 +19,7 @@ index 2e79b0b5ff..f38179e983 100644 MutablePair> info = list.computeIfAbsent(key, k -> MutablePair.of(0, Maps.newHashMap())); ChunkCoordIntPair chunk = new ChunkCoordIntPair(e.getChunkX(), e.getChunkZ()); diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index cd998fcfb5..d9c9748cec 100644 +index cec990f357..d636965800 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -0,0 +0,0 @@ import org.bukkit.event.entity.EntityPortalEvent; @@ -31,15 +31,6 @@ index cd998fcfb5..d9c9748cec 100644 // CraftBukkit start private static final int CURRENT_LEVEL = 2; -@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener { - private static final AxisAlignedBB b = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D); - private static double c = 1.0D; - private static int entityCount; -- private final EntityTypes g; -+ private final EntityTypes g; public EntityTypes getEntityType() { return g; } // Paper - OBFHELPER - private int id; - public boolean j; - public final List passengers; @@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener { return true; } @@ -64,18 +55,17 @@ index cd998fcfb5..d9c9748cec 100644 + } @Nullable public final String getSaveID() { -- EntityTypes entitytypes = this.P(); -- MinecraftKey minecraftkey = EntityTypes.getName(entitytypes); -- + EntityTypes entitytypes = this.getEntityType(); + MinecraftKey minecraftkey = EntityTypes.getName(entitytypes); + - return entitytypes.a() && minecraftkey != null ? minecraftkey.toString() : null; -+ EntityTypes type = this.getEntityType(); -+ return type != null && type.isPersistable() ? getMinecraftKeyString() : null; ++ return entitytypes != null && entitytypes.isPersistable() ? getMinecraftKeyString() : null; + // Paper end } protected abstract void a(NBTTagCompound nbttagcompound); diff --git a/src/main/java/net/minecraft/server/EntityTypes.java b/src/main/java/net/minecraft/server/EntityTypes.java -index a07ee150c2..d74bfa1201 100644 +index 0f2604a3d5..fae259ac70 100644 --- a/src/main/java/net/minecraft/server/EntityTypes.java +++ b/src/main/java/net/minecraft/server/EntityTypes.java @@ -0,0 +0,0 @@ public class EntityTypes { @@ -84,7 +74,7 @@ index a07ee150c2..d74bfa1201 100644 + public boolean isPersistable() { return a(); } // Paper - OBFHELPER public boolean a() { - return this.aU; + return this.bb; } diff --git a/src/main/java/net/minecraft/server/KeyedObject.java b/src/main/java/net/minecraft/server/KeyedObject.java new file mode 100644 @@ -102,7 +92,7 @@ index 0000000000..743142d030 + } +} diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java -index 62b6e6eb38..7390061bf0 100644 +index df46dbcacc..319be67501 100644 --- a/src/main/java/net/minecraft/server/TileEntity.java +++ b/src/main/java/net/minecraft/server/TileEntity.java @@ -0,0 +0,0 @@ import org.apache.logging.log4j.Logger; @@ -114,13 +104,13 @@ index 62b6e6eb38..7390061bf0 100644 public CustomTimingsHandler tickTimer = org.bukkit.craftbukkit.SpigotTimings.getTileEntityTimings(this); // Spigot private static final Logger a = LogManager.getLogger(); -- private final TileEntityTypes e; -+ private final TileEntityTypes e; public TileEntityTypes getTileEntityType() { return e; } // Paper - OBFHELPER +- private final TileEntityTypes b; ++ private final TileEntityTypes b; public TileEntityTypes getTileEntityType() { return b; } // Paper - OBFHELPER + @Nullable protected World world; protected BlockPosition position; - protected boolean d; @@ -0,0 +0,0 @@ public abstract class TileEntity { - this.e = tileentitytypes; + this.b = tileentitytypes; } + // Paper start diff --git a/Spigot-Server-Patches/Add-configurable-despawn-distances-for-living-entiti.patch b/Spigot-Server-Patches/Add-configurable-despawn-distances-for-living-entiti.patch index 421f8cd388..a3b0dc0155 100644 --- a/Spigot-Server-Patches/Add-configurable-despawn-distances-for-living-entiti.patch +++ b/Spigot-Server-Patches/Add-configurable-despawn-distances-for-living-entiti.patch @@ -30,24 +30,21 @@ index 341038fc4d..3e1f4be10f 100644 + } } diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 2bfd5fe2d8..80d872e797 100644 +index d49047abc1..265e734af2 100644 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ b/src/main/java/net/minecraft/server/EntityInsentient.java @@ -0,0 +0,0 @@ public abstract class EntityInsentient extends EntityLiving { - double d2 = entityhuman.locZ - this.locZ; - double d3 = d0 * d0 + d1 * d1 + d2 * d2; + if (entityhuman != null) { + double d0 = entityhuman.h(this); -- if (d3 > 16384.0D) { // CraftBukkit - remove isTypeNotPersistent() check -+ if (d3 > world.paperConfig.hardDespawnDistance) { // CraftBukkit - remove isTypeNotPersistent() check // Paper - custom despawn distances +- if (d0 > 16384.0D) { // CraftBukkit - remove isTypeNotPersistent() check ++ if (d0 > world.paperConfig.hardDespawnDistance) { // CraftBukkit - remove isTypeNotPersistent() check // Paper - custom despawn distances this.die(); } -- if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D) { // CraftBukkit - remove isTypeNotPersistent() check -+ if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d3 > world.paperConfig.softDespawnDistance) { // CraftBukkit - remove isTypeNotPersistent() check // Paper - custom despawn distances +- if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d0 > 1024.0D) { // CraftBukkit - remove isTypeNotPersistent() check ++ if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d0 > world.paperConfig.softDespawnDistance) { // CraftBukkit - remove isTypeNotPersistent() check // Paper - custom despawn distances this.die(); -- } else if (d3 < 1024.0D) { -+ } else if (d3 < world.paperConfig.softDespawnDistance) { // Paper - custom despawn distances + } else if (d0 < 1024.0D) { this.ticksFarFromPlayer = 0; - } - } -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Allow-for-toggling-of-spawn-chunks.patch b/Spigot-Server-Patches/Allow-for-toggling-of-spawn-chunks.patch index 00fbeeb723..14f35ea34e 100644 --- a/Spigot-Server-Patches/Allow-for-toggling-of-spawn-chunks.patch +++ b/Spigot-Server-Patches/Allow-for-toggling-of-spawn-chunks.patch @@ -20,15 +20,15 @@ index 3e1f4be10f..3f734327c0 100644 + } } diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index ad792af2bc..f24ee385cd 100644 +index eabcab0244..446f864420 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 IEntityAccess, GeneratorAccess, IIBlockAc - this.getServer().addWorld(this.world); +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose + }); // CraftBukkit end timings = new co.aikar.timings.WorldTimingsHandler(this); // Paper - code below can generate new world and access timings + this.keepSpawnInMemory = this.paperConfig.keepSpawnInMemory; // Paper - this.entityLimiter = new org.spigotmc.TickLimiter(spigotConfig.entityMaxTickTime); + this.entityLimiter = new org.spigotmc.TickLimiter(spigotConfig.entityMaxTickTime); this.tileLimiter = new org.spigotmc.TickLimiter(spigotConfig.tileMaxTickTime); } -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Allow-nerfed-mobs-to-jump.patch b/Spigot-Server-Patches/Allow-nerfed-mobs-to-jump.patch index c5c50f8de7..03ddf55215 100644 --- a/Spigot-Server-Patches/Allow-nerfed-mobs-to-jump.patch +++ b/Spigot-Server-Patches/Allow-nerfed-mobs-to-jump.patch @@ -19,7 +19,7 @@ index a55163a458..341038fc4d 100644 + } } diff --git a/src/main/java/net/minecraft/server/ControllerJump.java b/src/main/java/net/minecraft/server/ControllerJump.java -index 4ed5192c65..489beed269 100644 +index 2e869004c8..8a6856e0fd 100644 --- a/src/main/java/net/minecraft/server/ControllerJump.java +++ b/src/main/java/net/minecraft/server/ControllerJump.java @@ -0,0 +0,0 @@ public class ControllerJump { @@ -28,20 +28,20 @@ index 4ed5192c65..489beed269 100644 + public void jumpIfSet() { this.b(); } // Paper - OBFHELPER public void b() { - this.b.o(this.a); + this.b.setJumping(this.a); this.a = false; diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 1a3517aeed..2bfd5fe2d8 100644 +index afa03ce6f2..d49047abc1 100644 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ b/src/main/java/net/minecraft/server/EntityInsentient.java @@ -0,0 +0,0 @@ public abstract class EntityInsentient extends EntityLiving { - private final EntityAIBodyControl b; + private final EntityAIBodyControl c; protected NavigationAbstract navigation; public PathfinderGoalSelector goalSelector; + @Nullable public PathfinderGoalFloat goalFloat; // Paper public PathfinderGoalSelector targetSelector; private EntityLiving goalTarget; - private final EntitySenses bC; + private final EntitySenses bz; @@ -0,0 +0,0 @@ public abstract class EntityInsentient extends EntityLiving { // Spigot Start if ( this.fromMobSpawner ) @@ -56,7 +56,7 @@ index 1a3517aeed..2bfd5fe2d8 100644 } // Spigot End diff --git a/src/main/java/net/minecraft/server/PathfinderGoalFloat.java b/src/main/java/net/minecraft/server/PathfinderGoalFloat.java -index 0d95051383..38a0b2db1e 100644 +index 040a64471f..2dfa5a7b40 100644 --- a/src/main/java/net/minecraft/server/PathfinderGoalFloat.java +++ b/src/main/java/net/minecraft/server/PathfinderGoalFloat.java @@ -0,0 +0,0 @@ public class PathfinderGoalFloat extends PathfinderGoal { @@ -64,17 +64,15 @@ index 0d95051383..38a0b2db1e 100644 public PathfinderGoalFloat(EntityInsentient entityinsentient) { this.a = entityinsentient; + if (entityinsentient.getWorld().paperConfig.nerfedMobsShouldJump) entityinsentient.goalFloat = this; // Paper - this.a(4); + this.a(EnumSet.of(PathfinderGoal.Type.JUMP)); entityinsentient.getNavigation().d(true); } - -+ public boolean validConditions() { return this.a(); } // Paper - OBFHELPER - public boolean a() { - return this.a.isInWater() && this.a.bY() > 0.4D || this.a.ax(); +@@ -0,0 +0,0 @@ public class PathfinderGoalFloat extends PathfinderGoal { + return this.a.isInWater() && this.a.ce() > d0 || this.a.aC(); } + public void update() { this.e(); } // Paper - OBFHELPER + @Override public void e() { if (this.a.getRandom().nextFloat() < 0.8F) { - this.a.getControllerJump().a(); -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Configurable-baby-zombie-movement-speed.patch b/Spigot-Server-Patches/Configurable-baby-zombie-movement-speed.patch index 265b10fefc..71225888b9 100644 --- a/Spigot-Server-Patches/Configurable-baby-zombie-movement-speed.patch +++ b/Spigot-Server-Patches/Configurable-baby-zombie-movement-speed.patch @@ -20,26 +20,26 @@ index 098bd3fba8..55d8e74f82 100644 + } } diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java -index e3d52e7cf7..002be7f7be 100644 +index 21df3ef2c3..d9d9938602 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java @@ -0,0 +0,0 @@ public class EntityZombie extends EntityMonster { - protected static final IAttribute c = (new AttributeRanged((IAttribute) null, "zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance"); - private static final UUID a = UUID.fromString("B9766B59-9566-4402-BC1F-2EE2A276D836"); -- private static final AttributeModifier b = new AttributeModifier(EntityZombie.a, "Baby speed boost", 0.5D, 1); -+ private final AttributeModifier babyModifier = new AttributeModifier(EntityZombie.a, "Baby speed boost", world.paperConfig.babyZombieMovementSpeed, 1); // Paper - Remove static - Make baby speed configurable - private static final DataWatcherObject bC = DataWatcher.a(EntityZombie.class, DataWatcherRegistry.i); - private static final DataWatcherObject bD = DataWatcher.a(EntityZombie.class, DataWatcherRegistry.b); - private static final DataWatcherObject bE = DataWatcher.a(EntityZombie.class, DataWatcherRegistry.i); + protected static final IAttribute d = (new AttributeRanged((IAttribute) null, "zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance"); + private static final UUID b = UUID.fromString("B9766B59-9566-4402-BC1F-2EE2A276D836"); +- private static final AttributeModifier c = new AttributeModifier(EntityZombie.b, "Baby speed boost", 0.5D, AttributeModifier.Operation.MULTIPLY_BASE); ++ private final AttributeModifier babyModifier = new AttributeModifier(EntityZombie.b, "Baby speed boost", world.paperConfig.babyZombieMovementSpeed, AttributeModifier.Operation.MULTIPLY_BASE); private final AttributeModifier = c;// Paper - Remove static - Make baby speed configurable + private static final DataWatcherObject bz = DataWatcher.a(EntityZombie.class, DataWatcherRegistry.i); + private static final DataWatcherObject bA = DataWatcher.a(EntityZombie.class, DataWatcherRegistry.b); + public static final DataWatcherObject DROWN_CONVERTING = DataWatcher.a(EntityZombie.class, DataWatcherRegistry.i); @@ -0,0 +0,0 @@ public class EntityZombie extends EntityMonster { if (this.world != null && !this.world.isClientSide) { AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED); -- attributeinstance.c(EntityZombie.b); +- attributeinstance.c(EntityZombie.c); + attributeinstance.c(this.babyModifier); // Paper if (flag) { -- attributeinstance.b(EntityZombie.b); +- attributeinstance.b(EntityZombie.c); + attributeinstance.b(this.babyModifier); // Paper } } diff --git a/Spigot-Server-Patches/Configurable-cactus-and-reed-natural-growth-heights.patch b/Spigot-Server-Patches/Configurable-cactus-and-reed-natural-growth-heights.patch index b2f01aa0f8..229241df43 100644 --- a/Spigot-Server-Patches/Configurable-cactus-and-reed-natural-growth-heights.patch +++ b/Spigot-Server-Patches/Configurable-cactus-and-reed-natural-growth-heights.patch @@ -23,7 +23,7 @@ index a738657394..098bd3fba8 100644 + } } diff --git a/src/main/java/net/minecraft/server/BlockCactus.java b/src/main/java/net/minecraft/server/BlockCactus.java -index 625b9a049f..b6806d8db3 100644 +index a26e794124..29f9ff6c18 100644 --- a/src/main/java/net/minecraft/server/BlockCactus.java +++ b/src/main/java/net/minecraft/server/BlockCactus.java @@ -0,0 +0,0 @@ public class BlockCactus extends Block { @@ -36,7 +36,7 @@ index 625b9a049f..b6806d8db3 100644 if (j >= (byte) range(3, ((100.0F / world.spigotConfig.cactusModifier) * 15) + 0.5F, 15)) { // Spigot diff --git a/src/main/java/net/minecraft/server/BlockReed.java b/src/main/java/net/minecraft/server/BlockReed.java -index fad1a0a83c..c7017c58e7 100644 +index 4d5f485f0f..ff674a9d5b 100644 --- a/src/main/java/net/minecraft/server/BlockReed.java +++ b/src/main/java/net/minecraft/server/BlockReed.java @@ -0,0 +0,0 @@ public class BlockReed extends Block { diff --git a/Spigot-Server-Patches/Configurable-fishing-time-ranges.patch b/Spigot-Server-Patches/Configurable-fishing-time-ranges.patch index 09e44752c6..0ae92637cc 100644 --- a/Spigot-Server-Patches/Configurable-fishing-time-ranges.patch +++ b/Spigot-Server-Patches/Configurable-fishing-time-ranges.patch @@ -22,17 +22,17 @@ index 55d8e74f82..a55163a458 100644 + } } diff --git a/src/main/java/net/minecraft/server/EntityFishingHook.java b/src/main/java/net/minecraft/server/EntityFishingHook.java -index 39499f0743..118b974d76 100644 +index 366356a921..b082d0a820 100644 --- a/src/main/java/net/minecraft/server/EntityFishingHook.java +++ b/src/main/java/net/minecraft/server/EntityFishingHook.java @@ -0,0 +0,0 @@ public class EntityFishingHook extends Entity { - this.aw = MathHelper.nextInt(this.random, 20, 80); + this.at = MathHelper.nextInt(this.random, 20, 80); } } else { -- this.h = MathHelper.nextInt(this.random, 100, 600); -+ this.h = MathHelper.nextInt(this.random, world.paperConfig.fishingMinTicks, world.paperConfig.fishingMaxTicks); // Paper - this.h -= this.aA * 20 * 5; -+ this.h = Math.max(0, this.h); // Paper - Don't allow negative values +- this.as = MathHelper.nextInt(this.random, 100, 600); ++ this.as = MathHelper.nextInt(this.random, world.paperConfig.fishingMinTicks, world.paperConfig.fishingMaxTicks); // Paper + this.as -= this.ax * 20 * 5; ++ this.as = Math.max(0, this.as); // Paper - Don't allow negative values } } diff --git a/Spigot-Server-Patches/Drop-falling-block-and-tnt-entities-at-the-specified.patch b/Spigot-Server-Patches/Drop-falling-block-and-tnt-entities-at-the-specified.patch index 4871760452..d9a2645e8f 100644 --- a/Spigot-Server-Patches/Drop-falling-block-and-tnt-entities-at-the-specified.patch +++ b/Spigot-Server-Patches/Drop-falling-block-and-tnt-entities-at-the-specified.patch @@ -24,7 +24,7 @@ index 3f734327c0..1ed58f4bba 100644 + } } diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 131946154e..2198182ec9 100644 +index 2d07bfa879..7191861e81 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke @@ -36,43 +36,37 @@ index 131946154e..2198182ec9 100644 public EntityItem a(ItemStack itemstack, float f) { if (itemstack.isEmpty()) { diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java -index 4e4c8cc501..a6eae266de 100644 +index c9c903367f..55591fbe05 100644 --- a/src/main/java/net/minecraft/server/EntityFallingBlock.java +++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java @@ -0,0 +0,0 @@ public class EntityFallingBlock extends Entity { - } - this.move(EnumMoveType.SELF, this.motX, this.motY, this.motZ); -+ -+ // Paper start - Configurable EntityFallingBlock height nerf -+ if (this.world.paperConfig.fallingBlockHeightNerf != 0 && this.locY > this.world.paperConfig.fallingBlockHeightNerf) { -+ if (this.dropItem && this.world.getGameRules().getBoolean("doEntityDrops")) { -+ this.dropItem(new ItemStack(block), 0.0F); -+ } -+ -+ this.die(); -+ } -+ // Paper end -+ - if (!this.world.isClientSide) { - blockposition = new BlockPosition(this); - boolean flag = this.block.getBlock() instanceof BlockConcretePowder; + if (!this.onGround && !flag1) { + if (!this.world.isClientSide && (this.ticksLived > 100 && (blockposition.getY() < 1 || blockposition.getY() > 256) || this.ticksLived > 600)) { ++ if (this.world.paperConfig.fallingBlockHeightNerf != 0 && this.locY > this.world.paperConfig.fallingBlockHeightNerf) { // Paper - Configurable EntityFallingBlock height nerf + if (this.dropItem && this.world.getGameRules().getBoolean("doEntityDrops")) { + this.a((IMaterial) block); + } + + this.die(); ++ } // Paper + } + } else { + IBlockData iblockdata = this.world.getType(blockposition); diff --git a/src/main/java/net/minecraft/server/EntityTNTPrimed.java b/src/main/java/net/minecraft/server/EntityTNTPrimed.java -index e3a03782c8..8c19278f37 100644 +index ba86a07344..e3001570f9 100644 --- a/src/main/java/net/minecraft/server/EntityTNTPrimed.java +++ b/src/main/java/net/minecraft/server/EntityTNTPrimed.java @@ -0,0 +0,0 @@ public class EntityTNTPrimed extends Entity { } - this.move(EnumMoveType.SELF, this.motX, this.motY, this.motZ); -+ + this.move(EnumMoveType.SELF, this.getMot()); + // Paper start - Configurable TNT entity height nerf + if (this.world.paperConfig.entityTNTHeightNerf != 0 && this.locY > this.world.paperConfig.entityTNTHeightNerf) { + this.die(); + } + // Paper end -+ - this.motX *= 0.9800000190734863D; - this.motY *= 0.9800000190734863D; - this.motZ *= 0.9800000190734863D; + this.setMot(this.getMot().a(0.98D)); + if (this.onGround) { + this.setMot(this.getMot().d(0.7D, -0.5D, 0.7D)); -- \ No newline at end of file diff --git a/Spigot-Server-Patches/MC-Utils.patch b/Spigot-Server-Patches/MC-Utils.patch index 00284c9ce8..6c1a9364cd 100644 --- a/Spigot-Server-Patches/MC-Utils.patch +++ b/Spigot-Server-Patches/MC-Utils.patch @@ -837,7 +837,7 @@ index ea90a01830..59e7d907ef 100644 if (throwable != null) { completablefuture.completeExceptionally(throwable); diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java -index c4aa0152c8..6e44e58c58 100644 +index 73dd802205..9ed7f8ede4 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java @@ -0,0 +0,0 @@ public final class CraftItemStack extends ItemStack { diff --git a/Spigot-Server-Patches/Optimize-TileEntity-Ticking.patch b/Spigot-Server-Patches/Optimize-TileEntity-Ticking.patch index b1224002e7..e7a153850e 100644 --- a/Spigot-Server-Patches/Optimize-TileEntity-Ticking.patch +++ b/Spigot-Server-Patches/Optimize-TileEntity-Ticking.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Optimize TileEntity Ticking diff --git a/src/main/java/net/minecraft/server/TileEntityChest.java b/src/main/java/net/minecraft/server/TileEntityChest.java -index 2b03896e23..c46b761cc5 100644 +index 271406f8bb..d606e2e4fd 100644 --- a/src/main/java/net/minecraft/server/TileEntityChest.java +++ b/src/main/java/net/minecraft/server/TileEntityChest.java @@ -0,0 +0,0 @@ import org.bukkit.craftbukkit.entity.CraftHumanEntity; @@ -18,80 +18,71 @@ index 2b03896e23..c46b761cc5 100644 private NonNullList items; protected float a; @@ -0,0 +0,0 @@ public class TileEntityChest extends TileEntityLootable implements ITickable { + return nbttagcompound; + } + +- @Override + public void tick() { + int i = this.position.getX(); + int j = this.position.getY(); int k = this.position.getZ(); - ++this.k; -+ // Paper start + ++this.j; + } -+ private void doOpenLogic() { - float f; -- -- if (!this.world.isClientSide && this.f != 0 && (this.k + i + j + k) % 200 == 0) { ++ ++ public void doOpenLogic() { + int i = this.position.getX(); + int j = this.position.getY(); + int k = this.position.getZ(); -+ if (false && !this.world.isClientSide && this.f != 0 && (this.k + i + j + k) % 200 == 0) { // Paper - disable block -+ // Paper end - this.f = 0; - f = 5.0F; - List list = this.world.a(EntityHuman.class, new AxisAlignedBB((double) ((float) i - 5.0F), (double) ((float) j - 5.0F), (double) ((float) k - 5.0F), (double) ((float) (i + 1) + 5.0F), (double) ((float) (j + 1) + 5.0F), (double) ((float) (k + 1) + 5.0F))); ++ + this.viewingCount = a(this.world, this, this.j, i, j, k, this.viewingCount); + this.b = this.a; + float f = 0.1F; @@ -0,0 +0,0 @@ public class TileEntityChest extends TileEntityLootable implements ITickable { - } - } - -- this.e = this.a; -- f = 0.1F; -- if (this.f > 0 && this.a == 0.0F) { -+ if (this.f == 1 && this.a == 0.0F) { // check == 1 instead of > 0, first open + if (this.viewingCount > 0 && this.a == 0.0F) { this.a(SoundEffects.BLOCK_CHEST_OPEN); } -+ // Paper start + } -+ private void doCloseLogic() { -+ this.e = this.a; -+ // Paper end -- if (this.f == 0 && this.a > 0.0F || this.f > 0 && this.a < 1.0F) { -+ if (this.f == 0/* && this.a > 0.0F || this.f > 0 && this.a < 1.0F*/) { // Paper disable all but player count check -+ /* // Paper disable animation stuff +- if (this.viewingCount == 0 && this.a > 0.0F || this.viewingCount > 0 && this.a < 1.0F) { ++ public void doCloseLogic() { ++ if (this.viewingCount == 0 /* && this.a > 0.0F || this.viewingCount > 0 && this.a < 1.0F */) { // Paper - disable all but player count check ++ /* // Paper - disable animation stuff float f1 = this.a; - if (this.f > 0) { + if (this.viewingCount > 0) { @@ -0,0 +0,0 @@ public class TileEntityChest extends TileEntityLootable implements ITickable { - float f2 = 0.5F; -+ if (this.a < 0.5F && f1 >= 0.5F) { - this.a(SoundEffects.BLOCK_CHEST_CLOSE); - } -+ */ -+ // add some delay -+ MCUtil.scheduleTask(10, () -> { -+ if (this.f == 0) this.a(SoundEffects.BLOCK_CHEST_CLOSE); ++ */ ++ MCUtil.scheduleTask(10, () -> { ++ this.a(SoundEffects.BLOCK_CHEST_CLOSE); + }); -+ // } // Paper end ++ //} // Paper end if (this.a < 0.0F) { this.a = 0.0F; @@ -0,0 +0,0 @@ public class TileEntityChest extends TileEntityLootable implements ITickable { - ++this.f; + ++this.viewingCount; if (this.world == null) return; // CraftBukkit + doOpenLogic(); // Paper // CraftBukkit start - Call redstone event - if (this.getBlock() == Blocks.TRAPPED_CHEST) { + if (this.getBlock().getBlock() == Blocks.TRAPPED_CHEST) { @@ -0,0 +0,0 @@ public class TileEntityChest extends TileEntityLootable implements ITickable { - --this.f; + --this.viewingCount; // CraftBukkit start - Call redstone event + doCloseLogic(); // Paper - if (this.getBlock() == Blocks.TRAPPED_CHEST) { - int newPower = Math.max(0, Math.min(15, this.f)); + if (this.getBlock().getBlock() == Blocks.TRAPPED_CHEST) { + int newPower = Math.max(0, Math.min(15, this.viewingCount)); diff --git a/src/main/java/net/minecraft/server/TileEntityEnderChest.java b/src/main/java/net/minecraft/server/TileEntityEnderChest.java -index ee19595d33..f2df6f3950 100644 +index 6908f50031..ed5cdf177f 100644 --- a/src/main/java/net/minecraft/server/TileEntityEnderChest.java +++ b/src/main/java/net/minecraft/server/TileEntityEnderChest.java @@ -0,0 +0,0 @@ @@ -101,57 +92,63 @@ index ee19595d33..f2df6f3950 100644 +public class TileEntityEnderChest extends TileEntity { // Paper - Remove ITickable public float a; - public float e; + public float b; @@ -0,0 +0,0 @@ public class TileEntityEnderChest extends TileEntity implements ITickable { + super(TileEntityTypes.ENDER_CHEST); + } + +- @Override + public void tick() { + if (++this.g % 20 * 4 == 0) { + this.world.playBlockAction(this.position, Blocks.ENDER_CHEST, 1, this.c); } - this.e = this.a; -+ // Paper start -+ /* + this.b = this.a; ++ /* // Paper int i = this.position.getX(); int j = this.position.getY(); int k = this.position.getZ(); float f = 0.1F; double d0; - -+ */ + // Paper start ++ */ + } ++ + private void doOpenLogic() { + int i = this.position.getX(); + int j = this.position.getY(); + int k = this.position.getZ(); ++ double d0; + // Paper end - if (this.f > 0 && this.a == 0.0F) { - double d1 = (double) i + 0.5D; -- d0 = (double) k + 0.5D; -+ double d0 = (double) k + 0.5D; // Paper + if (this.c > 0 && this.a == 0.0F) { + double d1 = (double) i + 0.5D; +@@ -0,0 +0,0 @@ public class TileEntityEnderChest extends TileEntity implements ITickable { + d0 = (double) k + 0.5D; this.world.a((EntityHuman) null, d1, (double) j + 0.5D, d0, SoundEffects.BLOCK_ENDER_CHEST_OPEN, SoundCategory.BLOCKS, 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F); } -- + // Paper start + } + + private void doCloseLogic() { + int i = this.position.getX(); + int j = this.position.getY(); + int k = this.position.getZ(); -+ this.e = this.a; + double d0; + // Paper end - if (this.f == 0 && this.a > 0.0F || this.f > 0 && this.a < 1.0F) { + if (this.c == 0 && this.a > 0.0F || this.c > 0 && this.a < 1.0F) { float f1 = this.a; @@ -0,0 +0,0 @@ public class TileEntityEnderChest extends TileEntity implements ITickable { public void c() { - ++this.f; - this.world.playBlockAction(this.position, Blocks.ENDER_CHEST, 1, this.f); + ++this.c; + this.world.playBlockAction(this.position, Blocks.ENDER_CHEST, 1, this.c); + doOpenLogic(); // Paper } public void d() { - --this.f; - this.world.playBlockAction(this.position, Blocks.ENDER_CHEST, 1, this.f); + --this.c; + this.world.playBlockAction(this.position, Blocks.ENDER_CHEST, 1, this.c); + doCloseLogic(); // Paper } diff --git a/Spigot-Server-Patches/Paper-config-files.patch b/Spigot-Server-Patches/Paper-config-files.patch index 91145b3376..30013d3114 100644 --- a/Spigot-Server-Patches/Paper-config-files.patch +++ b/Spigot-Server-Patches/Paper-config-files.patch @@ -596,7 +596,7 @@ index f31f407fa1..28fa346b7f 100644 this.world = new CraftWorld((WorldServer) this, gen, env); this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 142b4a3a17..60a5ba6c73 100644 +index 83ab4245da..93246f464b 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -0,0 +0,0 @@ public final class CraftServer implements Server { @@ -651,7 +651,7 @@ index 142b4a3a17..60a5ba6c73 100644 + // Paper end } diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index c9668afc65..3e7024780b 100644 +index b61c06e32a..e34abd0c1f 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -0,0 +0,0 @@ public class Main { diff --git a/Spigot-Server-Patches/Player-affects-spawning-API.patch b/Spigot-Server-Patches/Player-affects-spawning-API.patch index 96b3dbdc73..e7dcdcca9f 100644 --- a/Spigot-Server-Patches/Player-affects-spawning-API.patch +++ b/Spigot-Server-Patches/Player-affects-spawning-API.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Player affects spawning API diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index 050f21efa5..58e037e13b 100644 +index 07401b4d9b..20460ad98a 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving { - private final ItemCooldown ce; + private final ItemCooldown bY; @Nullable public EntityFishingHook hookedFish; + // Paper start @@ -19,67 +19,33 @@ index 050f21efa5..58e037e13b 100644 // CraftBukkit start public boolean fauxSleeping; diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 80d872e797..e5322de974 100644 +index 265e734af2..5d830b245d 100644 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ b/src/main/java/net/minecraft/server/EntityInsentient.java @@ -0,0 +0,0 @@ public abstract class EntityInsentient extends EntityLiving { - } else { + if (!this.isPersistent() && !this.I()) { EntityHuman entityhuman = this.world.findNearbyPlayer(this, -1.0D); - if (entityhuman != null) { + if (entityhuman != null && entityhuman.affectsSpawning) { // Paper - Affects Spawning API - double d0 = entityhuman.locX - this.locX; - double d1 = entityhuman.locY - this.locY; - double d2 = entityhuman.locZ - this.locZ; + double d0 = entityhuman.h(this); + + if (d0 > world.paperConfig.hardDespawnDistance) { // CraftBukkit - remove isTypeNotPersistent() check // Paper - custom despawn distances diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java -index 3c566ebd0e..ba40e03fcc 100644 +index dbbc34d91b..d823c6b6d9 100644 --- a/src/main/java/net/minecraft/server/EntitySilverfish.java +++ b/src/main/java/net/minecraft/server/EntitySilverfish.java @@ -0,0 +0,0 @@ public class EntitySilverfish extends EntityMonster { - if (super.a(generatoraccess, flag)) { - EntityHuman entityhuman = generatoraccess.b(this, 5.0D); + if (super.a(generatoraccess, enummobspawn)) { + EntityHuman entityhuman = this.world.a(EntitySilverfish.b, (EntityLiving) this); - return entityhuman == null; + return !(entityhuman != null && !entityhuman.affectsSpawning) && entityhuman == null; // Paper - Affects Spawning API } else { return false; } -diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java -index 6ca0e19cb9..4eaa5d93b4 100644 ---- a/src/main/java/net/minecraft/server/SpawnerCreature.java -+++ b/src/main/java/net/minecraft/server/SpawnerCreature.java -@@ -0,0 +0,0 @@ public final class SpawnerCreature { - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - -- if (!entityhuman.isSpectator()) { -+ if (!entityhuman.isSpectator() && entityhuman.affectsSpawning) { // Paper - int l = MathHelper.floor(entityhuman.locX / 16.0D); - - j = MathHelper.floor(entityhuman.locZ / 16.0D); -diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index f24ee385cd..106ad00dc7 100644 ---- a/src/main/java/net/minecraft/server/World.java -+++ b/src/main/java/net/minecraft/server/World.java -@@ -0,0 +0,0 @@ import org.bukkit.craftbukkit.CraftWorld; - import org.bukkit.craftbukkit.block.CraftBlockState; - import org.bukkit.craftbukkit.block.data.CraftBlockData; - import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.craftbukkit.util.LongHashSet; // Paper - import org.bukkit.event.block.BlockPhysicsEvent; - import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; - import org.bukkit.generator.ChunkGenerator; -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman = (EntityHuman) this.players.get(i); - -- if (IEntitySelector.f.test(entityhuman)) { -+ if (IEntitySelector.f.test(entityhuman) && entityhuman.affectsSpawning) { // Paper - Affects Spawning API - double d4 = entityhuman.d(d0, d1, d2); - - if (d3 < 0.0D || d4 < d3 * d3) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 99f99148d6..15c2e1dee7 100644 +index 25726dd751..ca65d51d81 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/Spigot-Server-Patches/Remove-invalid-mob-spawner-tile-entities.patch b/Spigot-Server-Patches/Remove-invalid-mob-spawner-tile-entities.patch index cc9effed8a..238bc94a92 100644 --- a/Spigot-Server-Patches/Remove-invalid-mob-spawner-tile-entities.patch +++ b/Spigot-Server-Patches/Remove-invalid-mob-spawner-tile-entities.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Remove invalid mob spawner tile entities diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java -index 2b1198ca8f..e15ed21f67 100644 +index 89bce93c61..3be7f7d297 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java @@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { - tileentity.z(); - this.tileEntities.put(blockposition.h(), tileentity); + } + // CraftBukkit start + // Paper start - Remove invalid mob spawner tile entities + } else if (tileentity instanceof TileEntityMobSpawner && !(getBlockData(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getBlock() instanceof BlockMobSpawner)) { diff --git a/Spigot-Server-Patches/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch b/Spigot-Server-Patches/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch index 33f2c7875c..13d687bb17 100644 --- a/Spigot-Server-Patches/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch +++ b/Spigot-Server-Patches/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch @@ -6,23 +6,23 @@ Subject: [PATCH] Show 'Paper' in client crashes, server lists, and Mojang diff --git a/src/main/java/net/minecraft/server/EULA.java b/src/main/java/net/minecraft/server/EULA.java -index 220ca7bca0..e13e17bdd2 100644 +index d05fee962a..61c02c530b 100644 --- a/src/main/java/net/minecraft/server/EULA.java +++ b/src/main/java/net/minecraft/server/EULA.java @@ -0,0 +0,0 @@ public class EULA { + Properties properties = new Properties(); - fileoutputstream = new FileOutputStream(this.b); - properties.setProperty("eula", "false"); -- properties.store(fileoutputstream, "By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula)."); -+ properties.store(fileoutputstream, "By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).\nYou also agree that tacos are tasty, and the best food in the world."); // Paper - fix lag); - } catch (Exception exception) { - EULA.a.warn("Failed to save {}", this.b, exception); - } finally { + properties.setProperty("eula", "false"); +- properties.store(outputstream, "By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula)."); ++ properties.store(outputstream, "By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).\nYou also agree that tacos are tasty, and the best food in the world."); // Paper - fix lag; + } catch (Throwable throwable1) { + throwable = throwable1; + throw throwable1; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 7e89d7158b..df85f35f37 100644 +index 7b102e155d..89ad19e59c 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -0,0 +0,0 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati +@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant h; -- private boolean i; -+ private boolean i;public boolean isLoaded() { return i; } // Paper - OBFHELPER + private final ChunkSection[] sections; + private final BiomeBase[] d; + private final Map e; +- public boolean loaded; ++ public boolean loaded; public boolean isLoaded() { return loaded; } // Paper - OBFHELPER public final World world; public final Map heightMap; - public final int locX; + private final ChunkConverter i; @@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { - // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking - private int neighbors = 0x1 << 12; - public long chunkKey; + private final ChunkCoordIntPair loc; + private volatile boolean x; + ++ // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking ++ private int neighbors = 0x1 << 12; ++ public long chunkKey; + // Paper start + private class TileEntityHashMap extends java.util.HashMap { + @Override @@ -37,7 +40,7 @@ index 417c015e56..95a51ab745 100644 + } + return replaced; + } - ++ + @Override + public TileEntity remove(Object key) { + TileEntity removed = super.remove(key); @@ -48,26 +51,24 @@ index 417c015e56..95a51ab745 100644 + } + } + // Paper end - public boolean areNeighborsLoaded(final int radius) { - switch (radius) { - case 2: -@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { - this.g = new boolean[256]; - this.h = Maps.newHashMap(); ++ + public Chunk(World world, ChunkCoordIntPair chunkcoordintpair, BiomeBase[] abiomebase, ChunkConverter chunkconverter, TickList ticklist, TickList ticklist1, long i, @Nullable ChunkSection[] achunksection, @Nullable Consumer consumer) { + this.sections = new ChunkSection[16]; + this.e = Maps.newHashMap(); this.heightMap = Maps.newEnumMap(HeightMap.Type.class); - this.tileEntities = Maps.newHashMap(); + this.tileEntities = new TileEntityHashMap(); // Paper - this.p = Maps.newHashMap(); - this.q = Maps.newHashMap(); - this.r = new ShortList[16]; + this.l = Maps.newHashMap(); + this.m = Maps.newHashMap(); + this.n = new ShortList[16]; @@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { } entity.inChunk = true; + entity.setCurrentChunk(this); // Paper - entity.chunkX = this.locX; + entity.chunkX = this.loc.x; entity.chunkY = k; - entity.chunkZ = this.locZ; + entity.chunkZ = this.loc.z; @@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { ((HeightMap) this.heightMap.get(heightmap_type)).a(along); } @@ -90,15 +91,15 @@ index 417c015e56..95a51ab745 100644 + // Paper end } - public boolean c(BlockPosition blockposition) { + @Override diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index d9c9748cec..bdb4ca7643 100644 +index d636965800..e2b37ed1a0 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - private static final DataWatcherObject aF = DataWatcher.a(Entity.class, DataWatcherRegistry.i); - private static final DataWatcherObject aG = DataWatcher.a(Entity.class, DataWatcherRegistry.i); - private static final DataWatcherObject aH = DataWatcher.a(Entity.class, DataWatcherRegistry.i); + private static final DataWatcherObject aB = DataWatcher.a(Entity.class, DataWatcherRegistry.i); + private static final DataWatcherObject aC = DataWatcher.a(Entity.class, DataWatcherRegistry.i); + protected static final DataWatcherObject X = DataWatcher.a(Entity.class, DataWatcherRegistry.s); - public boolean inChunk; + public boolean inChunk; public boolean isAddedToChunk() { return inChunk; } // Paper - OBFHELPER public int chunkX; public int getChunkX() { return chunkX; } // Paper - OBFHELPER @@ -145,7 +146,7 @@ index d9c9748cec..bdb4ca7643 100644 private String entityKeyString; diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java -index 7390061bf0..c69209497b 100644 +index 319be67501..12f359a6ba 100644 --- a/src/main/java/net/minecraft/server/TileEntity.java +++ b/src/main/java/net/minecraft/server/TileEntity.java @@ -0,0 +0,0 @@ public abstract class TileEntity implements KeyedObject { // Paper @@ -165,14 +166,22 @@ index 7390061bf0..c69209497b 100644 @Nullable diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 9cdd0331f4..7edbbb106b 100644 +index ee34d42160..c1ad2626a7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -0,0 +0,0 @@ import java.util.UUID; - - import net.minecraft.server.*; - -+import org.bukkit.Chunk; +@@ -0,0 +0,0 @@ import com.google.common.collect.Lists; + import java.util.List; + import java.util.Set; + import java.util.UUID; ++<<<<<<< HEAD + import net.minecraft.server.AxisAlignedBB; + import net.minecraft.server.BlockPosition; + import net.minecraft.server.DamageSource; +@@ -0,0 +0,0 @@ import net.minecraft.server.EntityZombieVillager; + import net.minecraft.server.EnumChatFormat; + import net.minecraft.server.IChatBaseComponent; + import net.minecraft.server.NBTTagCompound; ++import org.bukkit.Chunk; // Paper import org.bukkit.EntityEffect; import org.bukkit.Location; import org.bukkit.Server; diff --git a/Spigot-Server-Patches/Timings-v2.patch b/Spigot-Server-Patches/Timings-v2.patch index e772f8b9cc..9506ec30aa 100644 --- a/Spigot-Server-Patches/Timings-v2.patch +++ b/Spigot-Server-Patches/Timings-v2.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Timings v2 diff --git a/src/main/java/co/aikar/timings/MinecraftTimings.java b/src/main/java/co/aikar/timings/MinecraftTimings.java new file mode 100644 -index 0000000000..7a2a27cdb4 +index 0000000000..3f9fb6f906 --- /dev/null +++ b/src/main/java/co/aikar/timings/MinecraftTimings.java @@ -0,0 +0,0 @@ @@ -21,6 +21,7 @@ index 0000000000..7a2a27cdb4 + +import java.util.Map; + ++// TODO: Re-implement missing timers +public final class MinecraftTimings { + + public static final Timing playerListTimer = Timings.ofSafe("Player List"); @@ -144,7 +145,7 @@ index 0000000000..7a2a27cdb4 +} diff --git a/src/main/java/co/aikar/timings/WorldTimingsHandler.java b/src/main/java/co/aikar/timings/WorldTimingsHandler.java new file mode 100644 -index 0000000000..145cb274b0 +index 0000000000..d5d3b2a20c --- /dev/null +++ b/src/main/java/co/aikar/timings/WorldTimingsHandler.java @@ -0,0 +0,0 @@ @@ -156,6 +157,7 @@ index 0000000000..145cb274b0 +/** + * Set of timers per world, to track world specific timings. + */ ++// TODO: Re-implement missing timers +public class WorldTimingsHandler { + public final Timing mobSpawn; + public final Timing doChunkUnload; @@ -297,11 +299,11 @@ index 5518ec1e54..7691409f6c 100644 + } } diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java -index e89ba3e412..1dc13fcc30 100644 +index c6d536226b..15dac7b94e 100644 --- a/src/main/java/net/minecraft/server/Block.java +++ b/src/main/java/net/minecraft/server/Block.java @@ -0,0 +0,0 @@ public class Block implements IMaterial { - protected final boolean i; + protected final boolean q; protected final SoundEffectType stepSound; protected final Material material; + // Paper start @@ -313,92 +315,98 @@ index e89ba3e412..1dc13fcc30 100644 + return timing; + } + // Paper end - protected final MaterialMapColor l; + protected final MaterialMapColor t; private final float frictionFactor; protected final BlockStateList blockStateList; diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java -index 554fbeb071..2b1198ca8f 100644 +index 2b29fe837b..89bce93c61 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java +@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { + return removed; + } + } ++ public boolean areNeighborsLoaded(final int radius) { ++ switch (radius) { ++ case 2: ++ return this.neighbors == Integer.MAX_VALUE >> 6; ++ case 1: ++ final int mask = ++ // x z offset x z offset x z offset ++ (0x1 << (1 * 5 + 1 + 12)) | (0x1 << (0 * 5 + 1 + 12)) | (0x1 << (-1 * 5 + 1 + 12)) | ++ (0x1 << (1 * 5 + 0 + 12)) | (0x1 << (0 * 5 + 0 + 12)) | (0x1 << (-1 * 5 + 0 + 12)) | ++ (0x1 << (1 * 5 + -1 + 12)) | (0x1 << (0 * 5 + -1 + 12)) | (0x1 << (-1 * 5 + -1 + 12)); ++ return (this.neighbors & mask) == mask; ++ default: ++ throw new UnsupportedOperationException(String.valueOf(radius)); ++ } ++ } ++ ++ public void setNeighborLoaded(final int x, final int z) { ++ this.neighbors |= 0x1 << (x * 5 + 12 + z); ++ } ++ ++ public void setNeighborUnloaded(final int x, final int z) { ++ this.neighbors &= ~(0x1 << (x * 5 + 12 + z)); ++ } + // Paper end + + public Chunk(World world, ChunkCoordIntPair chunkcoordintpair, BiomeBase[] abiomebase, ChunkConverter chunkconverter, TickList ticklist, TickList ticklist1, long i, @Nullable ChunkSection[] achunksection, @Nullable Consumer consumer) { @@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(this.bukkitChunk, this.needsDecoration)); if (this.needsDecoration) { + this.world.timings.syncChunkLoadPopulateTimer.startTiming(); // Paper - BlockSand.instaFall = true; java.util.Random random = new java.util.Random(); random.setSeed(world.getSeed()); + long xRand = random.nextLong() / 2L * 2L + 1L; @@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { + } } - BlockSand.instaFall = false; server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(bukkitChunk)); + this.world.timings.syncChunkLoadPopulateTimer.stopTiming(); // Paper } } - // CraftBukkit end -diff --git a/src/main/java/net/minecraft/server/ChunkMap.java b/src/main/java/net/minecraft/server/ChunkMap.java -index df2711a5f8..732c8793e5 100644 ---- a/src/main/java/net/minecraft/server/ChunkMap.java -+++ b/src/main/java/net/minecraft/server/ChunkMap.java -@@ -0,0 +0,0 @@ public class ChunkMap extends Long2ObjectOpenHashMap { } - - public Chunk put(long i, Chunk chunk) { -+ chunk.world.timings.syncChunkLoadPostTimer.startTiming(); // Paper - Chunk chunk1 = (Chunk) super.put(i, chunk); - ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i); - -@@ -0,0 +0,0 @@ public class ChunkMap extends Long2ObjectOpenHashMap { - } - } - } -+ chunk.world.timings.syncChunkLoadPostTimer.stopTiming(); // Paper - // CraftBukkit end - - return chunk1; diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java -index a8cdcb7da8..eb83e20d50 100644 +index 416f8e080c..5ee9824ba2 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java -@@ -0,0 +0,0 @@ public class ChunkProviderServer implements IChunkProvider { - } - - if (flag) { -- try { -+ try (co.aikar.timings.Timing timing = world.timings.syncChunkLoadTimer.startTiming()) { // Paper - chunk = this.chunkLoader.a(this.world, i, j, (chunk1) -> { - chunk1.setLastSaved(this.world.getTime()); - this.chunks.put(ChunkCoordIntPair.a(i, j), chunk1); -@@ -0,0 +0,0 @@ public class ChunkProviderServer implements IChunkProvider { - this.asyncTaskHandler.postToMainThread(chunk::addEntities); - return chunk; - } else if (flag1) { -- try { -- world.timings.syncChunkLoadTimer.startTiming(); // Spigot -+ try (co.aikar.timings.Timing timing = world.timings.chunkGeneration.startTiming()) { // Paper - this.batchScheduler.b(); - this.batchScheduler.a(new ChunkCoordIntPair(i, j)); - CompletableFuture completablefuture = this.batchScheduler.c(); -@@ -0,0 +0,0 @@ public class ChunkProviderServer implements IChunkProvider { - } catch (RuntimeException runtimeexception) { - throw this.a(i, j, (Throwable) runtimeexception); - } -- finally { world.timings.syncChunkLoadTimer.stopTiming(); } // Spigot -+ // finally { world.timings.syncChunkLoadTimer.stopTiming(); } // Spigot // Paper - } else { - return null; - } -@@ -0,0 +0,0 @@ public class ChunkProviderServer implements IChunkProvider { +@@ -0,0 +0,0 @@ public class ChunkProviderServer extends IChunkProvider { } - public void saveChunk(IChunkAccess ichunkaccess, boolean unloaded) { // Spigot -- try { + public void save(boolean flag) { + try (co.aikar.timings.Timing timed = world.timings.chunkSaveData.startTiming()) { // Paper - Timings - ichunkaccess.setLastSaved(this.world.getTime()); - this.chunkLoader.saveChunk(this.world, ichunkaccess, unloaded); // Spigot - } catch (IOException ioexception) { + this.playerChunkMap.save(flag); ++ } // Paper - Timings + } + + @Override +@@ -0,0 +0,0 @@ public class ChunkProviderServer extends IChunkProvider { + this.world.timings.mobSpawn.stopTiming(); // Spigot + this.world.getMethodProfiler().exit(); + } +- +- this.world.timings.doTickTiles.startTiming(); // Spigot ++ this.world.timings.chunkTicks.startTiming(); // Spigot // Paper + this.world.a(chunk, l); +- this.world.timings.doTickTiles.stopTiming(); // Spigot ++ this.world.timings.chunkTicks.stopTiming(); // Spigot // Paper + } + } + } +@@ -0,0 +0,0 @@ public class ChunkProviderServer extends IChunkProvider { + } + } + +- this.world.timings.tracker.startTiming(); // Spigot + this.playerChunkMap.g(); +- this.world.timings.tracker.stopTiming(); // Spigot + } + + @Override diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java -index 8e5ce6c181..35976a26f3 100644 +index c91347c644..8ac0e67e35 100644 --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java +++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java @@ -0,0 +0,0 @@ @@ -406,10 +414,10 @@ index 8e5ce6c181..35976a26f3 100644 +import co.aikar.timings.Timings; import com.google.common.collect.Maps; - import com.mojang.datafixers.DataFixTypes; - import com.mojang.datafixers.DataFixer; -@@ -0,0 +0,0 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { - public void loadEntities(NBTTagCompound nbttagcompound, Chunk chunk) { + import it.unimi.dsi.fastutil.longs.LongOpenHashSet; + import it.unimi.dsi.fastutil.longs.LongSet; +@@ -0,0 +0,0 @@ public class ChunkRegionLoader { + private static void loadEntities(NBTTagCompound nbttagcompound, Chunk chunk) { NBTTagList nbttaglist = nbttagcompound.getList("Entities", 10); World world = chunk.getWorld(); - world.timings.syncChunkLoadEntitiesTimer.startTiming(); // Spigot @@ -417,8 +425,8 @@ index 8e5ce6c181..35976a26f3 100644 for (int i = 0; i < nbttaglist.size(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompound(i); -@@ -0,0 +0,0 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { - chunk.f(true); +@@ -0,0 +0,0 @@ public class ChunkRegionLoader { + chunk.d(true); } - world.timings.syncChunkLoadEntitiesTimer.stopTiming(); // Spigot @@ -426,7 +434,7 @@ index 8e5ce6c181..35976a26f3 100644 NBTTagList nbttaglist1 = nbttagcompound.getList("TileEntities", 10); for (int j = 0; j < nbttaglist1.size(); ++j) { -@@ -0,0 +0,0 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { +@@ -0,0 +0,0 @@ public class ChunkRegionLoader { } } } @@ -435,7 +443,7 @@ index 8e5ce6c181..35976a26f3 100644 if (nbttagcompound.hasKeyOfType("TileTicks", 9) && world.getBlockTickList() instanceof TickListServer) { ((TickListServer) world.getBlockTickList()).a(nbttagcompound.getList("TileTicks", 10)); -@@ -0,0 +0,0 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { +@@ -0,0 +0,0 @@ public class ChunkRegionLoader { if (nbttagcompound.hasKeyOfType("LiquidTicks", 9) && world.getFluidTickList() instanceof TickListServer) { ((TickListServer) world.getFluidTickList()).a(nbttagcompound.getList("LiquidTicks", 10)); } @@ -445,7 +453,7 @@ index 8e5ce6c181..35976a26f3 100644 } diff --git a/src/main/java/net/minecraft/server/CustomFunction.java b/src/main/java/net/minecraft/server/CustomFunction.java -index 65574eb2e5..bc87cfc4b6 100644 +index 46e7737ca3..a3ef943066 100644 --- a/src/main/java/net/minecraft/server/CustomFunction.java +++ b/src/main/java/net/minecraft/server/CustomFunction.java @@ -0,0 +0,0 @@ public class CustomFunction { @@ -472,10 +480,10 @@ index 65574eb2e5..bc87cfc4b6 100644 return this.b; } diff --git a/src/main/java/net/minecraft/server/CustomFunctionData.java b/src/main/java/net/minecraft/server/CustomFunctionData.java -index f28f4f3cd3..6b417be1dd 100644 +index ed4b189d7e..2d2a4c9825 100644 --- a/src/main/java/net/minecraft/server/CustomFunctionData.java +++ b/src/main/java/net/minecraft/server/CustomFunctionData.java -@@ -0,0 +0,0 @@ public class CustomFunctionData implements ITickable, IResourcePackListener { +@@ -0,0 +0,0 @@ public class CustomFunctionData implements IResourcePackListener { return 0; } else { @@ -485,7 +493,7 @@ index f28f4f3cd3..6b417be1dd 100644 int j = 0; CustomFunction.c[] acustomfunction_c = customfunction.b(); diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java -index ad9c00bc80..4e9ef43b45 100644 +index b60956218d..19e2df3098 100644 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/DedicatedServer.java @@ -0,0 +0,0 @@ import org.apache.logging.log4j.Level; @@ -514,7 +522,7 @@ index ad9c00bc80..4e9ef43b45 100644 + MinecraftTimings.serverCommandTimer.stopTiming(); // Spigot } - public boolean Q() { + @Override @@ -0,0 +0,0 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer return remoteControlCommandListener.getMessages(); } @@ -538,7 +546,7 @@ index ad9c00bc80..4e9ef43b45 100644 return waitable.get(); } catch (java.util.concurrent.ExecutionException e) { diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index bdb4ca7643..131946154e 100644 +index e2b37ed1a0..2d07bfa879 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -0,0 +0,0 @@ import org.bukkit.command.CommandSender; @@ -563,21 +571,21 @@ index bdb4ca7643..131946154e 100644 @@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } - public void move(EnumMoveType enummovetype, double d0, double d1, double d2) { + public void move(EnumMoveType enummovetype, Vec3D vec3d) { - org.bukkit.craftbukkit.SpigotTimings.entityMoveTimer.startTiming(); // Spigot if (this.noclip) { - this.a(this.getBoundingBox().d(d0, d1, d2)); + this.a(this.getBoundingBox().b(vec3d)); this.recalcPosition(); @@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - this.world.methodProfiler.exit(); + this.world.getMethodProfiler().exit(); } - org.bukkit.craftbukkit.SpigotTimings.entityMoveTimer.stopTiming(); // Spigot } - protected float ab() { + protected Vec3D a(Vec3D vec3d, EnumMoveType enummovetype) { diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 011c7af218..b092b0fa23 100644 +index d31c1c989c..d89dbf1745 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -0,0 +0,0 @@ import org.bukkit.event.entity.EntityTeleportEvent; @@ -590,12 +598,12 @@ index 011c7af218..b092b0fa23 100644 public abstract class EntityLiving extends Entity { @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { - } + @Override public void tick() { - SpigotTimings.timerEntityBaseTick.startTiming(); // Spigot super.tick(); - this.cV(); + this.dk(); this.o(); @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { } @@ -608,8 +616,8 @@ index 011c7af218..b092b0fa23 100644 double d1 = this.locZ - this.lastZ; float f = (float) (d0 * d0 + d1 * d1); @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { - } else { - this.bv = 0; + if (this.isSleeping()) { + this.pitch = 0.0F; } - - SpigotTimings.timerEntityTickRest.stopTiming(); // Spigot @@ -617,83 +625,53 @@ index 011c7af218..b092b0fa23 100644 protected float e(float f, float f1) { @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { - } - this.world.methodProfiler.enter("ai"); + this.setMot(d4, d5, d6); + this.world.getMethodProfiler().enter("ai"); - SpigotTimings.timerEntityAI.startTiming(); // Spigot if (this.isFrozen()) { - this.bg = false; - this.bh = 0.0F; + this.jumping = false; + this.bb = 0.0F; @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { this.doTick(); - this.world.methodProfiler.exit(); + this.world.getMethodProfiler().exit(); } - SpigotTimings.timerEntityAI.stopTiming(); // Spigot - this.world.methodProfiler.exit(); - this.world.methodProfiler.enter("jump"); + this.world.getMethodProfiler().exit(); + this.world.getMethodProfiler().enter("jump"); @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { this.n(); AxisAlignedBB axisalignedbb = this.getBoundingBox(); - SpigotTimings.timerEntityAIMove.startTiming(); // Spigot - this.a(this.bh, this.bi, this.bj); + this.e(new Vec3D((double) this.bb, (double) this.bc, (double) this.bd)); - SpigotTimings.timerEntityAIMove.stopTiming(); // Spigot - this.world.methodProfiler.exit(); - this.world.methodProfiler.enter("push"); - if (this.bw > 0) { + this.world.getMethodProfiler().exit(); + this.world.getMethodProfiler().enter("push"); + if (this.bq > 0) { @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { this.a(axisalignedbb, this.getBoundingBox()); } - SpigotTimings.timerEntityAICollision.startTiming(); // Spigot - this.cN(); + this.collideNearby(); - SpigotTimings.timerEntityAICollision.stopTiming(); // Spigot - this.world.methodProfiler.exit(); - } - -diff --git a/src/main/java/net/minecraft/server/EntityTracker.java b/src/main/java/net/minecraft/server/EntityTracker.java -index cd462f7dfc..45ab33d1ae 100644 ---- a/src/main/java/net/minecraft/server/EntityTracker.java -+++ b/src/main/java/net/minecraft/server/EntityTracker.java -@@ -0,0 +0,0 @@ public class EntityTracker { - public void updatePlayers() { - List list = Lists.newArrayList(); - Iterator iterator = this.c.iterator(); -- -+ world.timings.tracker1.startTiming(); // Paper - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - -@@ -0,0 +0,0 @@ public class EntityTracker { - } - } - } -+ world.timings.tracker1.stopTiming(); // Paper - -+ world.timings.tracker2.startTiming(); // Paper - for (int i = 0; i < list.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) list.get(i); - Iterator iterator1 = this.c.iterator(); -@@ -0,0 +0,0 @@ public class EntityTracker { - } - } - } -+ world.timings.tracker2.stopTiming(); // Paper - + this.world.getMethodProfiler().exit(); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 72de40434f..7e89d7158b 100644 +index e35d4808bf..7b102e155d 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -0,0 +0,0 @@ package net.minecraft.server; +import co.aikar.timings.Timings; - import com.google.common.base.Stopwatch; ++import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; import com.google.common.collect.Maps; + import com.google.gson.JsonElement; @@ -0,0 +0,0 @@ import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.Main; import org.bukkit.event.server.ServerLoadEvent; @@ -702,9 +680,9 @@ index 72de40434f..7e89d7158b 100644 import org.spigotmc.SlackActivityAccountant; // Spigot +import co.aikar.timings.MinecraftTimings; // Paper - public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStatistics, ICommandListener, Runnable { + public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant implements IMojangStatistics, ICommandListener, AutoCloseable, Runnable { -@@ -0,0 +0,0 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati +@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant 0 && this.ticks % autosavePeriod == 0) { // CraftBukkit - SpigotTimings.worldSaveTimer.startTiming(); // Spigot + MinecraftServer.LOGGER.debug("Autosave started"); this.methodProfiler.enter("save"); this.playerList.savePlayers(); - // Spigot Start -@@ -0,0 +0,0 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati - // this.saveChunks(true); - // Spigot End + this.saveChunks(true, false, false); this.methodProfiler.exit(); + MinecraftServer.LOGGER.debug("Autosave finished"); - SpigotTimings.worldSaveTimer.stopTiming(); // Spigot } this.methodProfiler.enter("snooper"); -@@ -0,0 +0,0 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati +@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant 8000L) { -+ try (Timing ignored = world.timings.doChunkMapUpdate.startTiming()) { // Paper - this.k = i; - - for (j = 0; j < this.i.size(); ++j) { -@@ -0,0 +0,0 @@ public class PlayerChunkMap { - playerchunk.d(); - playerchunk.c(); - } -+ } // Paper timing - } - - if (!this.f.isEmpty()) { -+ try (Timing ignored = world.timings.doChunkMapToUpdate.startTiming()) { // Paper - Iterator iterator = this.f.iterator(); - - while (iterator.hasNext()) { -@@ -0,0 +0,0 @@ public class PlayerChunkMap { - } - - this.f.clear(); -+ } // Paper timing - } - - if (this.l && i % 4L == 0L) { - this.l = false; -+ try (Timing ignored = world.timings.doChunkMapSortMissing.startTiming()) { // Paper - Collections.sort(this.h, (playerchunk1, playerchunk2) -> { - return ComparisonChain.start().compare(playerchunk1.g(), playerchunk2.g()).result(); - }); -+ } // Paper timing - } - - if (this.m && i % 4L == 2L) { - this.m = false; -+ try (Timing ignored = world.timings.doChunkMapSortSendToPlayers.startTiming()) { // Paper - Collections.sort(this.g, (playerchunk1, playerchunk2) -> { - return ComparisonChain.start().compare(playerchunk1.g(), playerchunk2.g()).result(); - }); -+ } // Paper timing - } - - if (!this.h.isEmpty()) { -+ try (Timing ignored = world.timings.doChunkMapPlayersNeedingChunks.startTiming()) { // Paper - // Spigot start - org.spigotmc.SlackActivityAccountant activityAccountant = this.world.getMinecraftServer().slackActivityAccountant; - activityAccountant.startActivity(0.5); -@@ -0,0 +0,0 @@ public class PlayerChunkMap { - } - - activityAccountant.endActivity(); // Spigot -+ } // Paper timing - } - - if (!this.g.isEmpty()) { - j = 81; -+ try (Timing ignored = world.timings.doChunkMapPendingSendToPlayers.startTiming()) { // Paper - Iterator iterator2 = this.g.iterator(); - - while (iterator2.hasNext()) { -@@ -0,0 +0,0 @@ public class PlayerChunkMap { - } + import com.google.common.collect.Sets; + import com.mojang.datafixers.DataFixer; +@@ -0,0 +0,0 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + playerchunk = new PlayerChunk(new ChunkCoordIntPair(i), j, this.lightEngine, this.q, this); } + ++ // TODO: VERIFY THIS ++ ChunkCoordIntPair currentChunkPair = new ChunkCoordIntPair(i); ++ for (int x = -2; x < 3; x++) { ++ for (int z = -2; z < 3; z++) { ++ if (x == 0 && z == 0) { ++ continue; ++ } ++ ++ ++ Chunk neighbor = getUpdatingChunk(ChunkCoordIntPair.pair(currentChunkPair.x + x, currentChunkPair.z + z)) ++ if (neighbor != null) { ++ neighbor.setNeighborLoaded(-x, -z); ++ playerchunk.getChunk().setNeighborLoaded(x, z); ++ } ++ } ++ } ++ + this.updatingChunks.put(i, playerchunk); + this.updatingChunksModified = true; } -+ } // Paper timing - } +@@ -0,0 +0,0 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + this.a(i, playerchunk, event); // CraftBukkit + } else { + if (this.g.remove(i, playerchunk) && ichunkaccess != null) { ++ ++ // TODO: VERIFY THIS ++ // Paper - Update neighbor counts ++ for (int x = -2; x < 3; x++) { ++ for (int z = -2; z < 3; z++) { ++ if (x == 0 && z == 0) { ++ continue; ++ } ++ ++ ++ Chunk neighbor = ((Chunk) ichunkaccess).world.getChunkProvider().getChunkAt(event.getChunk().getX(), event.getChunk().getZ(), false); ++ if (neighbor != null) { ++ neighbor.setNeighborUnloaded(-x, -z); ++ ((Chunk) ichunkaccess).setNeighborUnloaded(x, z); ++ } ++ } ++ } ++ // Paper + // CraftBukkit start + if (event == null) { + this.saveChunk(ichunkaccess); +@@ -0,0 +0,0 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + }); - if (this.managedPlayers.isEmpty()) { -+ try (Timing ignored = world.timings.doChunkMapUnloadChunks.startTiming()) { // Paper - WorldProvider worldprovider = this.world.worldProvider; + return completablefuture.thenComposeAsync((either) -> { +- return (CompletableFuture) either.map((list) -> { ++ return either.map((list) -> { // Paper - Shut up. + try { + CompletableFuture> completablefuture1 = chunkstatus.a(this.world, this.chunkGenerator, this.definedStructureManager, this.lightEngine, (ichunkaccess) -> { + return this.b(playerchunk); +@@ -0,0 +0,0 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - if (!worldprovider.canRespawn()) { - this.world.getChunkProvider().b(); + PlayerChunkMap.EntityTracker playerchunkmap_entitytracker; + ObjectIterator objectiterator; ++ world.timings.tracker1.startTiming(); // Paper + + for (objectiterator = this.trackedEntities.values().iterator(); objectiterator.hasNext(); playerchunkmap_entitytracker.trackerEntry.a()) { + playerchunkmap_entitytracker = (PlayerChunkMap.EntityTracker) objectiterator.next(); +@@ -0,0 +0,0 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + playerchunkmap_entitytracker.e = sectionposition1; } -+ } // Paper timing } ++ world.timings.tracker1.stopTiming(); // Paper - } + objectiterator = this.trackedEntities.values().iterator(); + ++ world.timings.tracker2.startTiming(); // Paper + while (objectiterator.hasNext()) { + playerchunkmap_entitytracker = (PlayerChunkMap.EntityTracker) objectiterator.next(); + playerchunkmap_entitytracker.track(list); diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java -index 06f90ceca5..b9e6a3275c 100644 +index 23e37b5008..287bba3f6c 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -0,0 +0,0 @@ import org.bukkit.inventory.CraftingInventory; @@ -939,8 +890,8 @@ index 06f90ceca5..b9e6a3275c 100644 +import co.aikar.timings.MinecraftTimings; // Paper // CraftBukkit end - public class PlayerConnection implements PacketListenerPlayIn, ITickable { -@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { + public class PlayerConnection implements PacketListenerPlayIn { +@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn { // CraftBukkit end public void tick() { @@ -948,7 +899,7 @@ index 06f90ceca5..b9e6a3275c 100644 this.syncPosition(); this.player.playerTick(); this.player.setLocation(this.l, this.m, this.n, this.player.yaw, this.player.pitch); -@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { +@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn { this.player.resetIdleTimer(); // CraftBukkit - SPIGOT-854 this.disconnect(new ChatMessage("multiplayer.disconnect.idling", new Object[0])); } @@ -956,7 +907,7 @@ index 06f90ceca5..b9e6a3275c 100644 } -@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { +@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn { // CraftBukkit end private void handleCommand(String s) { @@ -965,7 +916,7 @@ index 06f90ceca5..b9e6a3275c 100644 // CraftBukkit start - whole method if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot this.LOGGER.info(this.player.getName() + " issued server command: " + s); -@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { +@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn { this.server.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -974,7 +925,7 @@ index 06f90ceca5..b9e6a3275c 100644 return; } -@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { +@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn { java.util.logging.Logger.getLogger(PlayerConnection.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); return; } finally { @@ -984,7 +935,7 @@ index 06f90ceca5..b9e6a3275c 100644 // this.minecraftServer.getCommandDispatcher().a(this.player.getCommandListener(), s); // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/PlayerConnectionUtils.java b/src/main/java/net/minecraft/server/PlayerConnectionUtils.java -index a73947d261..596aa27feb 100644 +index c8d2c81c58..aefc3eb19c 100644 --- a/src/main/java/net/minecraft/server/PlayerConnectionUtils.java +++ b/src/main/java/net/minecraft/server/PlayerConnectionUtils.java @@ -0,0 +0,0 @@ @@ -995,11 +946,13 @@ index a73947d261..596aa27feb 100644 + public class PlayerConnectionUtils { - public static void ensureMainThread(Packet packet, T t0, IAsyncTaskHandler iasynctaskhandler) throws CancelledPacketHandleException { + public static void ensureMainThread(Packet packet, T t0, WorldServer worldserver) throws CancelledPacketHandleException { +@@ -0,0 +0,0 @@ public class PlayerConnectionUtils { + + public static void ensureMainThread(Packet packet, T t0, IAsyncTaskHandler iasynctaskhandler) throws CancelledPacketHandleException { if (!iasynctaskhandler.isMainThread()) { + Timing timing = MinecraftTimings.getPacketTiming(packet); // Paper -+ - iasynctaskhandler.postToMainThread(() -> { + iasynctaskhandler.execute(() -> { if (t0 instanceof PlayerConnection && ((PlayerConnection) t0).processedDisconnect) return; // CraftBukkit + try (Timing ignored = timing.startTiming()) { // Paper packet.a(t0); @@ -1008,7 +961,7 @@ index a73947d261..596aa27feb 100644 throw CancelledPacketHandleException.INSTANCE; } diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java -index 54e44cba35..3a83819d56 100644 +index 993306e8e7..e6c03908cb 100644 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ b/src/main/java/net/minecraft/server/PlayerList.java @@ -0,0 +0,0 @@ @@ -1032,7 +985,7 @@ index 54e44cba35..3a83819d56 100644 public WhiteList getWhitelist() { diff --git a/src/main/java/net/minecraft/server/TickListServer.java b/src/main/java/net/minecraft/server/TickListServer.java -index 0da57948a3..6571fc5952 100644 +index 537e610797..b48e5b51a0 100644 --- a/src/main/java/net/minecraft/server/TickListServer.java +++ b/src/main/java/net/minecraft/server/TickListServer.java @@ -0,0 +0,0 @@ public class TickListServer implements TickList { @@ -1057,10 +1010,9 @@ index 0da57948a3..6571fc5952 100644 public void a() { int i = this.nextTickList.size(); @@ -0,0 +0,0 @@ public class TickListServer implements TickList { - } - this.f.methodProfiler.enter("cleaning"); -- + this.f.getMethodProfiler().enter("cleaning"); + + timingCleanup.startTiming(); // Paper NextTickListEntry nextticklistentry; // CraftBukkit - decompile error @@ -1071,22 +1023,22 @@ index 0da57948a3..6571fc5952 100644 } + timingCleanup.stopTiming(); // Paper - this.f.methodProfiler.exit(); - this.f.methodProfiler.enter("ticking"); + this.f.getMethodProfiler().exit(); + this.f.getMethodProfiler().enter("ticking"); + timingTicking.startTiming(); // Paper Iterator iterator = this.g.iterator(); while (iterator.hasNext()) { @@ -0,0 +0,0 @@ public class TickListServer implements TickList { - this.f.methodProfiler.exit(); + this.f.getMethodProfiler().exit(); this.g.clear(); + timingTicking.stopTiming(); // Paper } } diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java -index c69209497b..68ac014aab 100644 +index 12f359a6ba..b5e0ba3909 100644 --- a/src/main/java/net/minecraft/server/TileEntity.java +++ b/src/main/java/net/minecraft/server/TileEntity.java @@ -0,0 +0,0 @@ import javax.annotation.Nullable; @@ -1103,19 +1055,20 @@ index c69209497b..68ac014aab 100644 - public CustomTimingsHandler tickTimer = org.bukkit.craftbukkit.SpigotTimings.getTileEntityTimings(this); // Spigot + public Timing tickTimer = MinecraftTimings.getTileEntityTimings(this); // Paper private static final Logger a = LogManager.getLogger(); - private final TileEntityTypes e; public TileEntityTypes getTileEntityType() { return e; } // Paper - OBFHELPER - protected World world; + private final TileEntityTypes b; public TileEntityTypes getTileEntityType() { return b; } // Paper - OBFHELPER + @Nullable diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 9d5b3958bf..ad792af2bc 100644 +index 28fa346b7f..eabcab0244 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -0,0 +0,0 @@ - package net.minecraft.server; + package net.minecraft.server; ++import co.aikar.timings.Timing; +import co.aikar.timings.Timings; - import com.google.common.base.MoreObjects; import com.google.common.collect.Lists; - import it.unimi.dsi.fastutil.longs.LongSet; + import java.io.IOException; + import java.util.Collection; @@ -0,0 +0,0 @@ import java.util.ArrayList; import java.util.Map; import org.bukkit.Bukkit; @@ -1124,199 +1077,129 @@ index 9d5b3958bf..ad792af2bc 100644 import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.block.CraftBlockState; -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose public final com.destroystokyo.paper.PaperWorldConfig paperConfig; // Paper - public final SpigotTimings.WorldTimingsHandler timings; // Spigot + public final co.aikar.timings.WorldTimingsHandler timings; // Paper - private boolean guardEntityList; // Spigot public static BlockPosition lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc + private org.spigotmc.TickLimiter tileLimiter; +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose + public void c(WorldBorder worldborder, double d0) {} }); - this.getServer().addWorld(this.world); // CraftBukkit end - timings = new SpigotTimings.WorldTimingsHandler(this); // Spigot - code below can generate new world and access timings + timings = new co.aikar.timings.WorldTimingsHandler(this); // Paper - code below can generate new world and access timings - this.entityLimiter = new org.spigotmc.TickLimiter(spigotConfig.entityMaxTickTime); + this.entityLimiter = new org.spigotmc.TickLimiter(spigotConfig.entityMaxTickTime); this.tileLimiter = new org.spigotmc.TickLimiter(spigotConfig.tileMaxTickTime); } -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - } - - this.methodProfiler.exitEnter("remove"); -+ timings.entityRemoval.startTiming(); // Paper - this.entityList.removeAll(this.g); - - int j; -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - - this.g.clear(); - this.p_(); -+ timings.entityRemoval.stopTiming(); // Paper - this.methodProfiler.exitEnter("regular"); - - CrashReport crashreport1; -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - timings.entityTick.startTiming(); // Spigot - guardEntityList = true; // Spigot - // CraftBukkit start - Use field for loop variable -+ co.aikar.timings.TimingHistory.entityTicks += this.entityList.size(); // Paper - int entitiesThisCycle = 0; - if (tickPosition < 0) tickPosition = 0; - for (entityLimiter.initTick(); -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - this.methodProfiler.enter("tick"); - if (!entity.dead && !(entity instanceof EntityPlayer)) { - try { -- SpigotTimings.tickEntityTimer.startTiming(); // Spigot -+ entity.tickTimer.startTiming(); // Paper - this.g(entity); -- SpigotTimings.tickEntityTimer.stopTiming(); // Spigot -+ entity.tickTimer.stopTiming(); // Paper - } catch (Throwable throwable1) { -+ entity.tickTimer.stopTiming(); - crashreport1 = CrashReport.a(throwable1, "Ticking entity"); - crashreportsystemdetails1 = crashreport1.a("Entity being ticked"); - entity.appendEntityCrashDetails(crashreportsystemdetails1); -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose } timings.tileEntityPending.stopTiming(); // Spigot + co.aikar.timings.TimingHistory.tileEntityTicks += this.tileEntityListTick.size(); // Paper - this.methodProfiler.exit(); - this.methodProfiler.exit(); - } -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - } - // CraftBukkit end - -- entity.tickTimer.startTiming(); // Spigot - entity.N = entity.locX; - entity.O = entity.locY; - entity.P = entity.locZ; -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - entity.lastPitch = entity.pitch; - if (flag && entity.inChunk) { - ++entity.ticksLived; -+ ++co.aikar.timings.TimingHistory.activatedEntityTicks; // Paper - if (entity.isPassenger()) { - entity.aH(); - } else { -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - } - } - } -- entity.tickTimer.stopTiming(); // Spigot -- + gameprofilerfiller.exit(); + spigotConfig.currentPrimedTnt = 0; // Spigot } - public boolean a(@Nullable Entity entity, VoxelShape voxelshape) { + public void a(Consumer consumer, Entity entity) { + try { +- // Spigot start +- SpigotTimings.tickEntityTimer.startTiming(); ++ timings.tickEntities.startTiming(); + entity.tickTimer.startTiming(); + // Spigot end + consumer.accept(entity); +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose + // Spigot start + finally { + entity.tickTimer.stopTiming(); +- SpigotTimings.tickEntityTimer.startTiming(); ++ timings.tickEntities.stopTiming(); + } + // Spigot end + } diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index a7ae16681d..5a7087c758 100644 +index 1ec8272ff3..4fdbb8cd57 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java @@ -0,0 +0,0 @@ package net.minecraft.server; ++import co.aikar.timings.TimingHistory; +import co.aikar.timings.Timings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import com.google.common.util.concurrent.ListenableFuture; -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { + import com.google.common.collect.Queues; +@@ -0,0 +0,0 @@ import org.bukkit.Bukkit; + + import org.bukkit.WeatherType; + import org.bukkit.block.BlockState; +-import org.bukkit.craftbukkit.SpigotTimings; // Spigot + import org.bukkit.craftbukkit.event.CraftEventFactory; + import org.bukkit.craftbukkit.util.HashTreeSet; + +@@ -0,0 +0,0 @@ public class WorldServer extends World { // CraftBukkit end this.nextTickListBlock = new TickListServer<>(this, (block) -> { return block == null || block.getBlockData().isAir(); -- }, IRegistry.BLOCK::getKey, IRegistry.BLOCK::getOrDefault, this::b); -+ }, IRegistry.BLOCK::getKey, IRegistry.BLOCK::getOrDefault, this::b, "Blocks"); // Paper - timings -+ +- }, IRegistry.BLOCK::getKey, IRegistry.BLOCK::get, this::b); ++ }, IRegistry.BLOCK::getKey, IRegistry.BLOCK::get, this::b, "Blocks"); // Paper - Timings this.nextTickListFluid = new TickListServer<>(this, (fluidtype) -> { return fluidtype == null || fluidtype == FluidTypes.EMPTY; -- }, IRegistry.FLUID::getKey, IRegistry.FLUID::getOrDefault, this::a); -+ }, IRegistry.FLUID::getKey, IRegistry.FLUID::getOrDefault, this::a, "Fluids"); // Paper - timings +- }, IRegistry.FLUID::getKey, IRegistry.FLUID::get, this::a); ++ }, IRegistry.FLUID::getKey, IRegistry.FLUID::get, this::a, "Fluids"); // Paper - Timings + this.I = Sets.newHashSet(); this.siegeManager = new VillageSiege(this); - this.d = new ObjectLinkedOpenHashSet(); - this.server = minecraftserver; -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { + this.J = new ObjectLinkedOpenHashSet(); +@@ -0,0 +0,0 @@ public class WorldServer extends World { - timings.doChunkUnload.stopTiming(); // Spigot - this.methodProfiler.exitEnter("tickPending"); -- timings.doTickPending.startTiming(); // Spigot -+ timings.scheduledBlocks.startTiming(); // Paper - this.q(); -- timings.doTickPending.stopTiming(); // Spigot -+ timings.scheduledBlocks.stopTiming(); // Paper - this.methodProfiler.exitEnter("tickBlocks"); -- timings.doTickTiles.startTiming(); // Spigot -+ timings.chunkTicks.startTiming(); // Paper - this.n_(); -- timings.doTickTiles.stopTiming(); // Spigot -+ timings.chunkTicks.stopTiming(); // Paper - this.methodProfiler.exitEnter("chunkMap"); - timings.doChunkMap.startTiming(); // Spigot - this.manager.flush(); -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - } + org.spigotmc.ActivationRange.activateEntities(this); // Spigot + timings.entityTick.startTiming(); // Spigot ++ TimingHistory.entityTicks += this.globalEntityList.size(); // Paper + while (objectiterator.hasNext()) { + Entry entry = (Entry) objectiterator.next(); + Entity entity1 = (Entity) entry.getValue(); +@@ -0,0 +0,0 @@ public class WorldServer extends World { + } - this.methodProfiler.exitEnter("tickBlocks"); -+ timings.chunkTicksBlocks.startTiming(); // Paper - if (i > 0) { - ChunkSection[] achunksection = chunk.getSections(); - int i1 = achunksection.length; -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - } - } + gameprofilerfiller.exitEnter("tickBlocks"); ++ timings.chunkTicksBlocks.startTiming(); // Paper + if (i > 0) { + ChunkSection[] achunksection = chunk.getSections(); + int l = achunksection.length; +@@ -0,0 +0,0 @@ public class WorldServer extends World { } -+ timings.chunkTicksBlocks.stopTiming(); // Paper } + } +- ++ timings.chunkTicksBlocks.stopTiming(); // Paper + gameprofilerfiller.exit(); + } - this.methodProfiler.exit(); -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { +@@ -0,0 +0,0 @@ public class WorldServer extends World { - if (chunkproviderserver.d()) { + if (!flag1) { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); // CraftBukkit -+ timings.worldSave.startTiming(); // Paper ++ try (Timing ignored = timings.worldSave.startTiming()) { //Paper if (iprogressupdate != null) { iprogressupdate.a(new ChatMessage("menu.savingLevel", new Object[0])); } -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { +@@ -0,0 +0,0 @@ public class WorldServer extends World { iprogressupdate.c(new ChatMessage("menu.savingChunks", new Object[0])); } + timings.worldSaveChunks.startTiming(); // Paper - chunkproviderserver.a(flag); + chunkproviderserver.save(flag); + timings.worldSaveChunks.stopTiming(); // Paper - // CraftBukkit - ArrayList -> Collection - java.util.Collection list = chunkproviderserver.a(); - Iterator iterator = list.iterator(); -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - chunkproviderserver.unload(chunk); - } - } -- -+ timings.worldSave.stopTiming(); // Paper ++ } // Paper } } -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - } - - protected void a() throws ExceptionWorldConflict { -+ timings.worldSaveLevel.startTiming(); // Paper - this.checkSession(); - Iterator iterator = this.server.getWorlds().iterator(); - -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - this.worldData.c(this.server.getBossBattleCustomData().c()); - this.dataManager.saveWorldData(this.worldData, this.server.getPlayerList().t()); - this.h().a(); -+ timings.worldSaveLevel.stopTiming(); // Paper - } - - // CraftBukkit start diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 6a44f0d918..fea49800d8 100644 +index 93246f464b..95d0075d57 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -0,0 +0,0 @@ public final class CraftServer implements Server { @@ -1353,22 +1236,20 @@ index 6a44f0d918..fea49800d8 100644 org.spigotmc.RestartCommand.restart(); diff --git a/src/main/java/org/bukkit/craftbukkit/SpigotTimings.java b/src/main/java/org/bukkit/craftbukkit/SpigotTimings.java deleted file mode 100644 -index 2ab4b11a8d..0000000000 +index 38f211526b..0000000000 --- a/src/main/java/org/bukkit/craftbukkit/SpigotTimings.java +++ /dev/null @@ -0,0 +0,0 @@ -package org.bukkit.craftbukkit; - --import com.google.common.collect.Maps; --import net.minecraft.server.*; --import org.bukkit.plugin.java.JavaPluginLoader; --import org.spigotmc.CustomTimingsHandler; --import org.bukkit.scheduler.BukkitTask; -- -import java.util.HashMap; --import java.util.Map; -- +-import net.minecraft.server.Entity; +-import net.minecraft.server.TileEntity; +-import net.minecraft.server.World; -import org.bukkit.craftbukkit.scheduler.CraftTask; +-import org.bukkit.plugin.java.JavaPluginLoader; +-import org.bukkit.scheduler.BukkitTask; +-import org.spigotmc.CustomTimingsHandler; - -public class SpigotTimings { - @@ -1379,7 +1260,6 @@ index 2ab4b11a8d..0000000000 - public static final CustomTimingsHandler playerConnectionTimer = new CustomTimingsHandler("** PlayerConnection"); - public static final CustomTimingsHandler tickablesTimer = new CustomTimingsHandler("Tickables"); - public static final CustomTimingsHandler schedulerTimer = new CustomTimingsHandler("Scheduler"); -- public static final CustomTimingsHandler chunkIOTickTimer = new CustomTimingsHandler("ChunkIOTick"); - public static final CustomTimingsHandler timeUpdateTimer = new CustomTimingsHandler("Time Update"); - public static final CustomTimingsHandler serverCommandTimer = new CustomTimingsHandler("Server Command"); - public static final CustomTimingsHandler worldSaveTimer = new CustomTimingsHandler("World Save"); @@ -1482,7 +1362,6 @@ index 2ab4b11a8d..0000000000 - public final CustomTimingsHandler doTickTiles; - public final CustomTimingsHandler doVillages; - public final CustomTimingsHandler doChunkMap; -- public final CustomTimingsHandler doChunkGC; - public final CustomTimingsHandler doSounds; - public final CustomTimingsHandler entityTick; - public final CustomTimingsHandler tileEntityTick; @@ -1492,7 +1371,6 @@ index 2ab4b11a8d..0000000000 - public final CustomTimingsHandler tickEntities; - - public final CustomTimingsHandler syncChunkLoadTimer; -- public final CustomTimingsHandler syncChunkLoadDataTimer; - public final CustomTimingsHandler syncChunkLoadStructuresTimer; - public final CustomTimingsHandler syncChunkLoadEntitiesTimer; - public final CustomTimingsHandler syncChunkLoadTileEntitiesTimer; @@ -1509,14 +1387,12 @@ index 2ab4b11a8d..0000000000 - doVillages = new CustomTimingsHandler("** " + name + "doVillages"); - doChunkMap = new CustomTimingsHandler("** " + name + "doChunkMap"); - doSounds = new CustomTimingsHandler("** " + name + "doSounds"); -- doChunkGC = new CustomTimingsHandler("** " + name + "doChunkGC"); - doPortalForcer = new CustomTimingsHandler("** " + name + "doPortalForcer"); - entityTick = new CustomTimingsHandler("** " + name + "entityTick"); - tileEntityTick = new CustomTimingsHandler("** " + name + "tileEntityTick"); - tileEntityPending = new CustomTimingsHandler("** " + name + "tileEntityPending"); - - syncChunkLoadTimer = new CustomTimingsHandler("** " + name + "syncChunkLoad"); -- syncChunkLoadDataTimer = new CustomTimingsHandler("** " + name + "syncChunkLoad - Data"); - syncChunkLoadStructuresTimer = new CustomTimingsHandler("** " + name + "chunkLoad - Structures"); - syncChunkLoadEntitiesTimer = new CustomTimingsHandler("** " + name + "chunkLoad - Entities"); - syncChunkLoadTileEntitiesTimer = new CustomTimingsHandler("** " + name + "chunkLoad - TileEntities"); @@ -1530,44 +1406,8 @@ index 2ab4b11a8d..0000000000 - } - } -} -diff --git a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java -index 413dd35f06..52a8c48fa4 100644 ---- a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java -+++ b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java -@@ -0,0 +0,0 @@ - package org.bukkit.craftbukkit.chunkio; - - import java.io.IOException; -+ -+import co.aikar.timings.Timing; - import net.minecraft.server.Chunk; - import net.minecraft.server.ChunkCoordIntPair; - import net.minecraft.server.ChunkRegionLoader; -@@ -0,0 +0,0 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider {}); - -@@ -0,0 +0,0 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider> 4, z >> 4 ); ++ if ( isActive && !( chunk != null && chunk.areNeighborsLoaded( 1 ) ) ) ++ { ++ isActive = false; ++ } return isActive; } } diff --git a/scripts/importmcdev.sh b/scripts/importmcdev.sh index 227a01eab8..9d14850d8b 100755 --- a/scripts/importmcdev.sh +++ b/scripts/importmcdev.sh @@ -95,7 +95,6 @@ done # import FileName - ######################################################## ######################################################## ######################################################## diff --git a/work/Bukkit b/work/Bukkit index 263f706c2b..3735f9d0ad 160000 --- a/work/Bukkit +++ b/work/Bukkit @@ -1 +1 @@ -Subproject commit 263f706c2b25d4a2c0970bbb2bf99112947bc15e +Subproject commit 3735f9d0ad8295565d59db84f49446589f580da0 diff --git a/work/CraftBukkit b/work/CraftBukkit index 48c4c5ca81..364b6fbb73 160000 --- a/work/CraftBukkit +++ b/work/CraftBukkit @@ -1 +1 @@ -Subproject commit 48c4c5ca8133cead0e849c546cf7e0865300c94d +Subproject commit 364b6fbb73176d276a110f4ce4217979ad7ee6a4 diff --git a/work/Spigot b/work/Spigot index 3e47a77bbf..6dbf995f13 160000 --- a/work/Spigot +++ b/work/Spigot @@ -1 +1 @@ -Subproject commit 3e47a77bbf13823cba635bfc6b643f3816ae5347 +Subproject commit 6dbf995f13ca29e311d686e963973905388a29b3