From fd838ffbee8a7e22db17cf542de405ed77eb9b7b Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Fri, 9 Jun 2023 23:44:24 -0700 Subject: [PATCH] Update to latest paper Fix two regionizer issues: In ThreadedRegionizer#addChunk, fix the incorrect handling of merging two regions where one of the regions had pending merges. If the first region had pending merges, and the second was marked as "ready" then the merge would cause a "ready" region to have pending merges. The fix is to simply downgrade the "ready" region to "transient," as was previously done if the merge was delayed in the case where the first region was "ticking." Additionally, prevent the creation of empty regions by checking if any new sections were created. This would happen when a section existed, but had no marked chunks in it AND all of the sections neighbours existed. In these cases, no region needs to be created as no sections were created. --- gradle.properties | 2 +- patches/server/0001-Build-changes.patch | 4 +- patches/server/0003-Threaded-Regions.patch | 222 +++++++++--------- patches/server/0004-Max-pending-logins.patch | 2 +- ...-getHandle-and-overrides-perform-thr.patch | 8 +- ...edOperationException-for-broken-APIs.patch | 2 +- ...s-github.com-PaperMC-paperweight-iss.patch | 2 +- .../0012-Lag-compensate-block-breaking.patch | 2 +- ...dates-in-non-loaded-or-non-owned-chu.patch | 4 +- 9 files changed, 129 insertions(+), 119 deletions(-) diff --git a/gradle.properties b/gradle.properties index a4b3a7a..ad3834b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=dev.folia version=1.20-R0.1-SNAPSHOT mcVersion=1.20 -paperRef=04509f0234dfd4c05be002de1985ab4915c2092c +paperRef=2ffb704efaf9811b9da286011e9c4b8f682620a9 org.gradle.caching=true org.gradle.parallel=true diff --git a/patches/server/0001-Build-changes.patch b/patches/server/0001-Build-changes.patch index 84487e9..210a385 100644 --- a/patches/server/0001-Build-changes.patch +++ b/patches/server/0001-Build-changes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Build changes diff --git a/build.gradle.kts b/build.gradle.kts -index a3a76b9b7efa773117d2ee1ce53ef784b09b277d..85f5bedaf294dc48cab9cd5380ed4edeb4166a40 100644 +index e7a03ea1dab56e7725f718da0b44c736018ac995..59bc7ef3d26d3fb3bc7a0d79861acd68e5062fe6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,8 +7,12 @@ plugins { @@ -101,7 +101,7 @@ index fb82bb52f219e7683fe1d3c0fb3acbe2251de8d4..cdb9925e8c4771831a7fe8bbcb705278 public SystemReport fillSystemReport(SystemReport details) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index aefbb6a3f49a74a4c8fd004aa6a4ab1ab907e878..ce4238d0cb82cc16fc2e5f534ab4a7eef50b5437 100644 +index ffa27c9c02dc4d12411fc089de3af8e8e12ba06e..c927ff1250e6bc7b1fbdfa80b189dc9efc471a1e 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -262,7 +262,7 @@ import javax.annotation.Nullable; // Paper diff --git a/patches/server/0003-Threaded-Regions.patch b/patches/server/0003-Threaded-Regions.patch index 7769554..8765e75 100644 --- a/patches/server/0003-Threaded-Regions.patch +++ b/patches/server/0003-Threaded-Regions.patch @@ -5325,10 +5325,10 @@ index 0000000000000000000000000000000000000000..84b4ff07735fb84e28ee8966ffdedb1b +} diff --git a/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java b/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java new file mode 100644 -index 0000000000000000000000000000000000000000..4b8f51cd8ebd0bb85f1f6035650488da6454212d +index 0000000000000000000000000000000000000000..72a2b81a0a4dc6aab02d0dbad713ea882887d85f --- /dev/null +++ b/src/main/java/io/papermc/paper/threadedregions/ThreadedRegionizer.java -@@ -0,0 +1,1318 @@ +@@ -0,0 +1,1328 @@ +package io.papermc.paper.threadedregions; + +import ca.spottedleaf.concurrentutil.map.SWMRLong2ObjectHashTable; @@ -5649,6 +5649,11 @@ index 0000000000000000000000000000000000000000..4b8f51cd8ebd0bb85f1f6035650488da + } + } + ++ if (newSections.isEmpty()) { ++ // if we didn't add any sections, then we don't need to merge any regions or create a region ++ return; ++ } ++ + final ThreadedRegion regionOfInterest; + final boolean regionOfInterestAlive; + if (nearbyRegions == null) { @@ -5664,7 +5669,6 @@ index 0000000000000000000000000000000000000000..4b8f51cd8ebd0bb85f1f6035650488da + regionOfInterest.onCreate(); + } else { + // need to merge the regions -+ + ThreadedRegion firstUnlockedRegion = null; + + for (final ThreadedRegion region : nearbyRegions) { @@ -5672,6 +5676,9 @@ index 0000000000000000000000000000000000000000..4b8f51cd8ebd0bb85f1f6035650488da + continue; + } + firstUnlockedRegion = region; ++ if (firstUnlockedRegion.state == ThreadedRegion.STATE_READY && (!firstUnlockedRegion.mergeIntoLater.isEmpty() || !firstUnlockedRegion.expectingMergeFrom.isEmpty())) { ++ throw new IllegalStateException("Illegal state for unlocked region " + firstUnlockedRegion); ++ } + break; + } + @@ -5698,8 +5705,6 @@ index 0000000000000000000000000000000000000000..4b8f51cd8ebd0bb85f1f6035650488da + // we need to now tell all the other regions to merge into the region we just created, + // and to merge all the ones we can immediately + -+ boolean delayedTrueMerge = false; -+ + for (final ThreadedRegion region : nearbyRegions) { + if (region == regionOfInterest) { + continue; @@ -5708,22 +5713,21 @@ index 0000000000000000000000000000000000000000..4b8f51cd8ebd0bb85f1f6035650488da + // a merge target + if (!region.tryKill()) { + regionOfInterest.mergeIntoLater(region); -+ delayedTrueMerge = true; + } else { + region.mergeInto(regionOfInterest); + } + } + -+ if (delayedTrueMerge && firstUnlockedRegion != null) { -+ // we need to retire this region, as it can no longer tick -+ if (regionOfInterest.state == ThreadedRegion.STATE_READY) { -+ regionOfInterest.state = ThreadedRegion.STATE_TRANSIENT; -+ this.callbacks.onRegionInactive(regionOfInterest); ++ if (firstUnlockedRegion != null && firstUnlockedRegion.state == ThreadedRegion.STATE_READY) { ++ // we need to retire this region if the merges added other pending merges ++ if (!firstUnlockedRegion.mergeIntoLater.isEmpty() || !firstUnlockedRegion.expectingMergeFrom.isEmpty()) { ++ firstUnlockedRegion.state = ThreadedRegion.STATE_TRANSIENT; ++ this.callbacks.onRegionInactive(firstUnlockedRegion); + } + } + -+ // need to set alive if we created it and we didn't delay a merge -+ regionOfInterestAlive = firstUnlockedRegion == null && !delayedTrueMerge && regionOfInterest.mergeIntoLater.isEmpty() && regionOfInterest.expectingMergeFrom.isEmpty(); ++ // need to set alive if we created it and there are no pending merges ++ regionOfInterestAlive = firstUnlockedRegion == null && regionOfInterest.mergeIntoLater.isEmpty() && regionOfInterest.expectingMergeFrom.isEmpty(); + } + + if (regionOfInterestAlive) { @@ -5733,6 +5737,12 @@ index 0000000000000000000000000000000000000000..4b8f51cd8ebd0bb85f1f6035650488da + } + this.callbacks.onRegionActive(regionOfInterest); + } ++ ++ if (regionOfInterest.state == ThreadedRegion.STATE_READY) { ++ if (!regionOfInterest.mergeIntoLater.isEmpty() || !regionOfInterest.expectingMergeFrom.isEmpty()) { ++ throw new IllegalStateException("Should not happen on region " + this); ++ } ++ } + } catch (final Throwable throwable) { + LOGGER.error("Failed to add chunk (" + chunkX + "," + chunkZ + ")", throwable); + SneakyThrow.sneaky(throwable); @@ -13103,7 +13113,7 @@ index 8f5714221bc32fb2c9201cbc8a0a35610977f574..c78a7e5e5c6b012756e6a1e50159dd97 } } diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 7f0b8cdae07e7e4745a099242a4f0c5914be8667..0c497a618f4d356989f7874480c0f2cc4fff4c63 100644 +index 9f422cbeaa52b3e6a0a27af4f8ad4ddb7808483f..78ada86028bac06b62a7d70776a29705a3b11a06 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -443,9 +443,9 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -13187,7 +13197,7 @@ index e2202389a2c4133a183cca59c4e909fc419379ab..18f438eec03cabc1614ab807081cff6b // Paper end - optimise chunk tick iteration diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index f0347600b2f07105ce4802273b0cfe8631ee8876..ee5dcc4dec199576eb125002e1cfdbad6d643260 100644 +index 9209b598d7168b82574e4800056b8b9f84265dd0..916bfdfb13d8f8093e1908a7c35344b83d0ee0ac 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -147,21 +147,21 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider @@ -13770,7 +13780,7 @@ index f0347600b2f07105ce4802273b0cfe8631ee8876..ee5dcc4dec199576eb125002e1cfdbad if (playerchunkmap_entitytracker != null) { playerchunkmap_entitytracker.broadcastAndSend(packet); -@@ -1435,41 +1260,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1440,41 +1265,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider this.lastSectionPos = SectionPos.of((EntityAccess) entity); } @@ -13813,7 +13823,7 @@ index f0347600b2f07105ce4802273b0cfe8631ee8876..ee5dcc4dec199576eb125002e1cfdbad public boolean equals(Object object) { return object instanceof ChunkMap.TrackedEntity ? ((ChunkMap.TrackedEntity) object).entity.getId() == this.entity.getId() : false; -@@ -1516,6 +1307,28 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1521,6 +1312,28 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider } } @@ -13842,7 +13852,7 @@ index f0347600b2f07105ce4802273b0cfe8631ee8876..ee5dcc4dec199576eb125002e1cfdbad public void updatePlayer(ServerPlayer player) { org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot -@@ -1532,10 +1345,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1537,10 +1350,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(player); // CraftBukkit start - respect vanish API @@ -14252,7 +14262,7 @@ index 488a253e218409b5f0b4a872cee0928578fa7582..af35fd63b090aa3d89bc60cb9cb7694b } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 2ac23779222369ace69f1e3f7fb12184865b7a43..85df1c6debf85dac7bea4e33abc2097f5a1597d8 100644 +index 18aac3da3c88f33b1a71a5920a8daa27e9723913..b126435b07572e7b8f41647a0179164b680e9e64 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -192,36 +192,35 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -15818,7 +15828,7 @@ index 5fad40fa88f697108e42461c41012d5964ed7d75..ab8fb605bf35a3d74af5ede6fcde1461 this.removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.DEATH); this.effectsDirty = true; diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index bb7ad618fad7f11a02d7e088e2c05bfffaf0b41d..d9e622964b415b07caaa714d7d23649dcc62c677 100644 +index 1635fee928d64f4d2c336dca6675ed4641918830..7e303f86b6d8d41f96e5b3b3b0327da2082a8211 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -124,11 +124,11 @@ public class ServerPlayerGameMode { @@ -15844,7 +15854,7 @@ index bb7ad618fad7f11a02d7e088e2c05bfffaf0b41d..d9e622964b415b07caaa714d7d23649d if (iblockdata == null) { this.isDestroyingBlock = false; return; -@@ -415,7 +415,7 @@ public class ServerPlayerGameMode { +@@ -417,7 +417,7 @@ public class ServerPlayerGameMode { } else { // CraftBukkit start org.bukkit.block.BlockState state = bblock.getState(); @@ -15853,7 +15863,7 @@ index bb7ad618fad7f11a02d7e088e2c05bfffaf0b41d..d9e622964b415b07caaa714d7d23649d // CraftBukkit end block.playerWillDestroy(this.level, pos, iblockdata, this.player); boolean flag = this.level.removeBlock(pos, false); -@@ -443,8 +443,8 @@ public class ServerPlayerGameMode { +@@ -445,8 +445,8 @@ public class ServerPlayerGameMode { // return true; // CraftBukkit } // CraftBukkit start @@ -16021,7 +16031,7 @@ index 44d99e89226adb6234b9405f25ac9dab9bd84297..072634e26d32ca0b3438a5d3a03be367 Collections.shuffle( this.connections ); } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 1288f651fa83d5ab99a88858f52a6d3212284df0..cdd365c5d6a14a754dd5088af20298d6fb8a20d5 100644 +index ae82ab0e3d8e99f87ca8465fbcbb44b5ce18bf96..f461db9abd9a7d9bed145cd1a053835c31541a88 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -325,10 +325,10 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -16191,8 +16201,8 @@ index 1288f651fa83d5ab99a88858f52a6d3212284df0..cdd365c5d6a14a754dd5088af20298d6 // Paper start String str = packet.getCommand(); int index = -1; if (str.length() > 64 && ((index = str.indexOf(' ')) == -1 || index >= 64)) { -- server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam", new Object[0]))); // Paper -+ this.disconnect(Component.translatable("disconnect.spam", new Object[0])); // Paper // Folia - region threading +- server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper ++ this.disconnect(Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper // Folia - region threading return; } // Paper end @@ -16704,7 +16714,7 @@ index 7edd4b88eb0476f0630630bc4681e859bd145b2b..f3586a5c5b5d4cae817aa7c15fc0c2fc date1 = fallback; } diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 647607827949302098ff45ffa4296ed62511987a..576e60f2ce00733254895f83f4bef76152dc3fe9 100644 +index 683b5d78f9e3dc34e40c54683f64be32317797ac..fc58f714b069453b5f6d2f0ca801fbe1beef07aa 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -139,10 +139,10 @@ public abstract class PlayerList { @@ -18819,7 +18829,7 @@ index 90ce201bc7c47cef9bc59d7b535a7453854bac75..9c7c116a7d3570ccf5b30d55d68c420f this.setPersistenceRequired(); } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index 9f7fa132997829e9a34aaae7aac7a6f7d529eee2..3128c74e219a9be939eac9a2f723cd4b8b7d8a61 100644 +index 098ae9d8fa3e7cad8473a877decba771f6bd1b36..b95ea9c8f0f7f578dc0acb4afd8853baf69995c8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -337,9 +337,9 @@ public class Turtle extends Animal { @@ -19744,7 +19754,7 @@ index d7a0cbde8f8c99276307502674c71463fbe7e89c..2a501b3fa8d69f627b279fd035fd2cb1 } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index b367ec1feaccbd67e9e28c0d0515e163f37135fe..3cd24d49dc32ed539a05181a1c9973886f4d65cc 100644 +index adb7220be617d6d9f2cdd7fbe4fa2dd24cc7d142..ae02df4a0304f4a5a6113bb893662ce5538387ee 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -340,6 +340,7 @@ public final class ItemStack { @@ -20096,7 +20106,7 @@ index 8f97c9df726ac20cfce7bdddd5dd4f8c5aa76c35..e8c4815960ab144298d4352f393b9670 static class CacheKey { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5ff2bb5fe9 100644 +index 147d802d9207e358fdb2d1c7806fc2f634dcfd98..c28e974ea43e69e1e7d608785299d74317c83920 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -117,10 +117,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -20156,7 +20166,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f public final org.spigotmc.SpigotWorldConfig spigotConfig; // Spigot // Paper start private final io.papermc.paper.configuration.WorldConfiguration paperConfig; -@@ -179,9 +169,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -180,9 +170,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; private org.spigotmc.TickLimiter tileLimiter; @@ -20169,7 +20179,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f // Paper start - fix and optimise world upgrading // copied from below -@@ -225,7 +215,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -226,7 +216,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { List ret = new java.util.ArrayList<>(); double maxRangeSquared = maxRange * maxRange; @@ -20178,7 +20188,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f if ((maxRange < 0.0 || player.distanceToSqr(sourceX, sourceY, sourceZ) < maxRangeSquared)) { if (predicate == null || predicate.test(player)) { ret.add(player); -@@ -241,7 +231,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -242,7 +232,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { net.minecraft.server.level.ServerPlayer closest = null; double closestRangeSquared = maxRange < 0.0 ? Double.MAX_VALUE : maxRange * maxRange; @@ -20187,7 +20197,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f double distanceSquared = player.distanceToSqr(sourceX, sourceY, sourceZ); if (distanceSquared < closestRangeSquared && (predicate == null || predicate.test(player))) { closest = player; -@@ -272,6 +262,33 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -273,6 +263,33 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public abstract ResourceKey getTypeKey(); @@ -20218,10 +20228,10 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f + } + // Folia end - region ticking + - protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator) { // Paper + protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - Async-Anti-Xray - Pass executor this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper -@@ -315,7 +332,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -316,7 +333,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { this.thread = Thread.currentThread(); this.biomeManager = new BiomeManager(this, i); this.isDebug = flag1; @@ -20230,7 +20240,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f this.registryAccess = iregistrycustom; this.damageSources = new DamageSources(iregistrycustom); // CraftBukkit start -@@ -455,8 +472,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -457,8 +474,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Nullable public final BlockState getBlockStateIfLoaded(BlockPos pos) { // CraftBukkit start - tree generation @@ -20241,7 +20251,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f if (previous != null) { return previous.getHandle(); } -@@ -518,16 +535,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -520,16 +537,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Override public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { @@ -20262,7 +20272,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f } blockstate.setFlag(flags); // Paper - update the flag also blockstate.setData(state); -@@ -544,10 +562,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -546,10 +564,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { // CraftBukkit start - capture blockstates boolean captured = false; @@ -20275,7 +20285,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f captured = true; } // CraftBukkit end -@@ -556,8 +574,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -559,8 +577,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { if (iblockdata1 == null) { // CraftBukkit start - remove blockstate if failed (or the same) @@ -20286,7 +20296,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f } // CraftBukkit end return false; -@@ -594,7 +612,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -597,7 +615,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { */ // CraftBukkit start @@ -20295,7 +20305,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f // Modularize client and physic updates // Spigot start try { -@@ -643,7 +661,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -646,7 +664,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { // CraftBukkit start iblockdata1.updateIndirectNeighbourShapes(this, blockposition, k, j - 1); // Don't call an event for the old block to limit event spam CraftWorld world = ((ServerLevel) this).getWorld(); @@ -20304,7 +20314,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftBlockData.fromData(iblockdata)); this.getCraftServer().getPluginManager().callEvent(event); -@@ -657,7 +675,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -660,7 +678,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } // CraftBukkit start - SPIGOT-5710 @@ -20313,7 +20323,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f this.onBlockStateChange(blockposition, iblockdata1, iblockdata2); } // CraftBukkit end -@@ -736,7 +754,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -739,7 +757,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Override public void neighborShapeChanged(Direction direction, BlockState neighborState, BlockPos pos, BlockPos neighborPos, int flags, int maxUpdateDepth) { @@ -20322,7 +20332,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f } @Override -@@ -761,11 +779,34 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -764,11 +782,34 @@ public abstract class Level implements LevelAccessor, AutoCloseable { return this.getChunkSource().getLightEngine(); } @@ -20359,7 +20369,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f if (previous != null) { return previous.getHandle(); } -@@ -856,7 +897,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -859,7 +900,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public void addBlockEntityTicker(TickingBlockEntity ticker) { @@ -20368,7 +20378,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f } protected void tickBlockEntities() { -@@ -864,11 +905,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -867,11 +908,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { gameprofilerfiller.push("blockEntities"); timings.tileEntityPending.startTiming(); // Spigot @@ -20384,7 +20394,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f timings.tileEntityPending.stopTiming(); // Spigot timings.tileEntityTick.startTiming(); // Spigot -@@ -877,9 +917,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -880,9 +920,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { int tilesThisCycle = 0; var toRemove = new it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet(net.minecraft.Util.identityStrategy()); // Paper - use removeAll toRemove.add(null); @@ -20396,7 +20406,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f // Spigot start if (tickingblockentity == null) { this.getCraftServer().getLogger().severe("Spigot has detected a null entity and has removed it, preventing a crash"); -@@ -896,19 +935,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -899,19 +938,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } else if (this.shouldTickBlocksAt(tickingblockentity.getPos())) { tickingblockentity.tick(); // Paper start - execute chunk tasks during tick @@ -20421,7 +20431,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f } public void guardEntityTick(Consumer tickConsumer, T entity) { -@@ -921,7 +960,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -924,7 +963,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { final String msg = String.format("Entity threw exception at %s:%s,%s,%s", entity.level().getWorld().getName(), entity.getX(), entity.getY(), entity.getZ()); MinecraftServer.LOGGER.error(msg, throwable); getCraftServer().getPluginManager().callEvent(new ServerExceptionEvent(new ServerInternalException(msg, throwable))); @@ -20431,7 +20441,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f // Paper end } } -@@ -1004,9 +1044,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1007,9 +1047,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Nullable public BlockEntity getBlockEntity(BlockPos blockposition, boolean validate) { @@ -20447,7 +20457,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f return blockEntity; } // Paper end -@@ -1019,8 +1064,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1022,8 +1067,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { if (!this.isOutsideBuildHeight(blockposition)) { // CraftBukkit start @@ -20458,7 +20468,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f return; } // CraftBukkit end -@@ -1100,6 +1145,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1103,6 +1148,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Override public List getEntities(@Nullable Entity except, AABB box, Predicate predicate) { @@ -20466,7 +20476,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f this.getProfiler().incrementCounter("getEntities"); List list = Lists.newArrayList(); ((ServerLevel)this).getEntityLookup().getEntities(except, box, list, predicate); // Paper - optimise this call -@@ -1119,6 +1165,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1122,6 +1168,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public void getEntities(EntityTypeTest filter, AABB box, Predicate predicate, List result, int limit) { @@ -20474,7 +20484,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f this.getProfiler().incrementCounter("getEntities"); // Paper start - optimise this call //TODO use limit -@@ -1156,13 +1203,30 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1159,13 +1206,30 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public void disconnect() {} @@ -20507,7 +20517,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f public boolean mayInteract(Player player, BlockPos pos) { return true; -@@ -1364,8 +1428,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1367,8 +1431,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public final BlockPos.MutableBlockPos getRandomBlockPosition(int x, int y, int z, int l, BlockPos.MutableBlockPos out) { // Paper end @@ -20517,7 +20527,7 @@ index 7771748a15c153352ce4874495f5fa7437aaf9a7..f99b5a14717f87fe0629cbe7b6339a5f out.set(x + (i1 & 15), y + (i1 >> 16 & l), z + (i1 >> 8 & 15)); // Paper - change to setValues call return out; // Paper -@@ -1396,7 +1459,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1399,7 +1462,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Override public long nextSubTickCount() { @@ -21861,7 +21871,7 @@ index 8bab3fcfc6aa6c0b37621474a69f15e94bda2113..dfae4b5bb0b7e0439c916bc470b32622 return true; } else { diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index 17398a48ff84ba1b21bd64f7857e3a326fcc54cf..2e89313f845d370d07745936cde7aad3c562d51b 100644 +index 4ff0d2fc9fd76e92e64abd69f2c9e299aa08ac32..7a3b7f2466f4a1ed107497d99c8509a6e9ba3624 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java @@ -59,6 +59,13 @@ public class LevelChunk extends ChunkAccess { @@ -22052,10 +22062,10 @@ index 17398a48ff84ba1b21bd64f7857e3a326fcc54cf..2e89313f845d370d07745936cde7aad3 public void tick() { if (!this.blockEntity.isRemoved() && this.blockEntity.hasLevel()) { diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java -index ebcc7ece0654abd368fc759029f87a7cec9ed036..0c11888bbce6c444189ba268579a5db2a1b5a8af 100644 +index 9c6a2884c34a9f6e775103da42480cd6b8c693b3..bc938c2a4cb30f3151b600ab88ca5c4e9734f326 100644 --- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java +++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java -@@ -635,7 +635,7 @@ public class ChunkSerializer { +@@ -639,7 +639,7 @@ public class ChunkSerializer { } private static void saveTicks(ServerLevel world, CompoundTag nbt, ChunkAccess.TicksToSave tickSchedulers) { @@ -22707,7 +22717,7 @@ index 1d7c663fa0e550bd0cfb9a4b83ccd7e2968666f0..f3df9c9b6cff85565514f990597f3fe5 LevelChunkTicks levelChunkTicks = this.allContainers.get(l); if (levelChunkTicks == null) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index ce4238d0cb82cc16fc2e5f534ab4a7eef50b5437..aa877017799c573a114832fd1809bc80e322ed2c 100644 +index c927ff1250e6bc7b1fbdfa80b189dc9efc471a1e..a2e688607194167ebf9ca646561d61b41f2ff915 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -310,6 +310,82 @@ public final class CraftServer implements Server { @@ -22858,7 +22868,7 @@ index ce4238d0cb82cc16fc2e5f534ab4a7eef50b5437..aa877017799c573a114832fd1809bc80 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab048bf93d 100644 +index 89514af7f3771db496e7e2a40fa4e7fdf527f095..5e7f8f4cc24bc14e1a2639b60c33a04d8c0ccd85 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -184,7 +184,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @@ -22935,7 +22945,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab ChunkHolder playerChunk = this.world.getChunkSource().chunkMap.getVisibleChunkIfPresent(ChunkPos.asLong(x, z)); if (playerChunk == null) return false; -@@ -533,7 +535,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -538,7 +540,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean loadChunk(int x, int z, boolean generate) { @@ -22944,7 +22954,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab warnUnsafeChunk("loading a faraway chunk", x, z); // Paper // Paper start - Optimize this method ChunkPos chunkPos = new ChunkPos(x, z); -@@ -605,7 +607,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -610,7 +612,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { DistanceManager chunkDistanceManager = this.world.getChunkSource().chunkMap.distanceManager; if (chunkDistanceManager.addRegionTicketAtDistance(TicketType.PLUGIN_TICKET, new ChunkPos(x, z), 2, plugin)) { // keep in-line with force loading, add at level 31 @@ -22953,7 +22963,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab return true; } -@@ -790,13 +792,15 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -795,13 +797,15 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { @@ -22974,7 +22984,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab BlockPos position = ((CraftBlockState) blockstate).getPosition(); net.minecraft.world.level.block.state.BlockState oldBlock = this.world.getBlockState(position); int flag = ((CraftBlockState) blockstate).getFlag(); -@@ -804,10 +808,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -809,10 +813,10 @@ public class CraftWorld extends CraftRegionAccessor implements World { net.minecraft.world.level.block.state.BlockState newBlock = this.world.getBlockState(position); this.world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, newBlock, flag, 512); } @@ -22987,7 +22997,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab return false; } } -@@ -841,6 +845,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -846,6 +850,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setTime(long time) { @@ -22995,7 +23005,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab long margin = (time - this.getFullTime()) % 24000; if (margin < 0) margin += 24000; this.setFullTime(this.getFullTime() + margin); -@@ -853,6 +858,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -858,6 +863,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setFullTime(long time) { @@ -23003,7 +23013,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab // Notify anyone who's listening TimeSkipEvent event = new TimeSkipEvent(this, TimeSkipEvent.SkipReason.CUSTOM, time - this.world.getDayTime()); this.server.getPluginManager().callEvent(event); -@@ -880,7 +886,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -885,7 +891,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public long getGameTime() { @@ -23012,7 +23022,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab } @Override -@@ -900,11 +906,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -905,11 +911,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source) { @@ -23026,7 +23036,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab return !world.explode(source != null ? ((org.bukkit.craftbukkit.entity.CraftEntity) source).getHandle() : null, loc.getX(), loc.getY(), loc.getZ(), power, setFire, breakBlocks ? net.minecraft.world.level.Level.ExplosionInteraction.MOB : net.minecraft.world.level.Level.ExplosionInteraction.NONE).wasCanceled; } // Paper end -@@ -974,6 +982,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -979,6 +987,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getHighestBlockYAt(int x, int z, org.bukkit.HeightMap heightMap) { @@ -23034,7 +23044,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab warnUnsafeChunk("getting a faraway chunk", x >> 4, z >> 4); // Paper // Transient load for this tick return this.world.getChunk(x >> 4, z >> 4).getHeight(CraftHeightMap.toNMS(heightMap), x, z); -@@ -1004,6 +1013,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1009,6 +1018,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setBiome(int x, int y, int z, Holder bb) { BlockPos pos = new BlockPos(x, 0, z); @@ -23042,7 +23052,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab if (this.world.hasChunkAt(pos)) { net.minecraft.world.level.chunk.LevelChunk chunk = this.world.getChunkAt(pos); -@@ -1279,6 +1289,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1284,6 +1294,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setStorm(boolean hasStorm) { @@ -23050,7 +23060,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab world.serverLevelData.setRaining(hasStorm, org.bukkit.event.weather.WeatherChangeEvent.Cause.PLUGIN); // Paper this.setWeatherDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) -@@ -1291,6 +1302,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1296,6 +1307,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setWeatherDuration(int duration) { @@ -23058,7 +23068,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab world.serverLevelData.setRainTime(duration); } -@@ -1301,6 +1313,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1306,6 +1318,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThundering(boolean thundering) { @@ -23066,7 +23076,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab world.serverLevelData.setThundering(thundering, org.bukkit.event.weather.ThunderChangeEvent.Cause.PLUGIN); // Paper this.setThunderDuration(0); // Reset weather duration (legacy behaviour) this.setClearWeatherDuration(0); // Reset clear weather duration (reset "/weather clear" commands) -@@ -1313,6 +1326,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1318,6 +1331,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setThunderDuration(int duration) { @@ -23074,7 +23084,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab world.serverLevelData.setThunderTime(duration); } -@@ -1323,6 +1337,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1328,6 +1342,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setClearWeatherDuration(int duration) { @@ -23082,7 +23092,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab world.serverLevelData.setClearWeatherTime(duration); } -@@ -1516,6 +1531,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1521,6 +1536,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setKeepSpawnInMemory(boolean keepLoaded) { @@ -23090,7 +23100,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab // Paper start - Configurable spawn radius if (keepLoaded == world.keepSpawnInMemory) { // do nothing, nothing has changed -@@ -1594,6 +1610,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1599,6 +1615,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setHardcore(boolean hardcore) { @@ -23098,7 +23108,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab world.serverLevelData.settings.hardcore = hardcore; } -@@ -1606,6 +1623,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1611,6 +1628,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) { @@ -23106,7 +23116,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setTicksPerSpawns(SpawnCategory.ANIMAL, ticksPerAnimalSpawns); } -@@ -1618,6 +1636,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1623,6 +1641,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) { @@ -23114,7 +23124,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setTicksPerSpawns(SpawnCategory.MONSTER, ticksPerMonsterSpawns); } -@@ -1630,6 +1649,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1635,6 +1654,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterSpawns(int ticksPerWaterSpawns) { @@ -23122,7 +23132,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setTicksPerSpawns(SpawnCategory.WATER_ANIMAL, ticksPerWaterSpawns); } -@@ -1642,6 +1662,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1647,6 +1667,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterAmbientSpawns(int ticksPerWaterAmbientSpawns) { @@ -23130,7 +23140,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setTicksPerSpawns(SpawnCategory.WATER_AMBIENT, ticksPerWaterAmbientSpawns); } -@@ -1654,6 +1675,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1659,6 +1680,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerWaterUndergroundCreatureSpawns(int ticksPerWaterUndergroundCreatureSpawns) { @@ -23138,7 +23148,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setTicksPerSpawns(SpawnCategory.WATER_UNDERGROUND_CREATURE, ticksPerWaterUndergroundCreatureSpawns); } -@@ -1666,11 +1688,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1671,11 +1693,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns) { @@ -23152,7 +23162,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab Validate.notNull(spawnCategory, "SpawnCategory cannot be null"); Validate.isTrue(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory." + spawnCategory + " are not supported."); -@@ -1687,21 +1711,25 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1692,21 +1716,25 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { @@ -23178,7 +23188,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.server.getWorldMetadata().removeMetadata(this, metadataKey, owningPlugin); } -@@ -1714,6 +1742,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1719,6 +1747,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setMonsterSpawnLimit(int limit) { @@ -23186,7 +23196,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setSpawnLimit(SpawnCategory.MONSTER, limit); } -@@ -1726,6 +1755,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1731,6 +1760,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAnimalSpawnLimit(int limit) { @@ -23194,7 +23204,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setSpawnLimit(SpawnCategory.ANIMAL, limit); } -@@ -1738,6 +1768,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1743,6 +1773,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAnimalSpawnLimit(int limit) { @@ -23202,7 +23212,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setSpawnLimit(SpawnCategory.WATER_ANIMAL, limit); } -@@ -1750,6 +1781,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1755,6 +1786,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterAmbientSpawnLimit(int limit) { @@ -23210,7 +23220,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setSpawnLimit(SpawnCategory.WATER_AMBIENT, limit); } -@@ -1762,6 +1794,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1767,6 +1799,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setWaterUndergroundCreatureSpawnLimit(int limit) { @@ -23218,7 +23228,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setSpawnLimit(SpawnCategory.WATER_UNDERGROUND_CREATURE, limit); } -@@ -1774,6 +1807,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1779,6 +1812,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override @Deprecated public void setAmbientSpawnLimit(int limit) { @@ -23226,7 +23236,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab this.setSpawnLimit(SpawnCategory.AMBIENT, limit); } -@@ -1796,6 +1830,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1801,6 +1835,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setSpawnLimit(SpawnCategory spawnCategory, int limit) { @@ -23234,7 +23244,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab Validate.notNull(spawnCategory, "SpawnCategory cannot be null"); Validate.isTrue(CraftSpawnCategory.isValidForLimits(spawnCategory), "SpawnCategory." + spawnCategory + " are not supported."); -@@ -1850,7 +1885,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1855,7 +1890,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(BuiltInRegistries.SOUND_EVENT.wrapAsHolder(CraftSound.getSoundEffect(sound)), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, this.getHandle().getRandom().nextLong()); @@ -23243,7 +23253,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } -@@ -1861,7 +1896,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1866,7 +1901,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(Holder.direct(SoundEvent.createVariableRangeEvent(new ResourceLocation(sound))), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, this.getHandle().getRandom().nextLong()); @@ -23252,7 +23262,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab if (entityTracker != null) { entityTracker.broadcastAndSend(packet); } -@@ -1947,6 +1982,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1952,6 +1987,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRuleValue(String rule, String value) { @@ -23260,7 +23270,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab // No null values allowed if (rule == null || value == null) return false; -@@ -1988,6 +2024,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1993,6 +2029,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean setGameRule(GameRule rule, T newValue) { @@ -23268,7 +23278,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab Validate.notNull(rule, "GameRule cannot be null"); Validate.notNull(newValue, "GameRule value cannot be null"); -@@ -2253,6 +2290,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2258,6 +2295,12 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void sendGameEvent(Entity sourceEntity, org.bukkit.GameEvent gameEvent, Vector position) { @@ -23281,7 +23291,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab getHandle().gameEvent(sourceEntity != null ? ((CraftEntity) sourceEntity).getHandle(): null, net.minecraft.core.registries.BuiltInRegistries.GAME_EVENT.get(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(gameEvent.getKey())), org.bukkit.craftbukkit.util.CraftVector.toBlockPos(position)); } // Paper end -@@ -2385,7 +2428,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2390,7 +2433,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start public java.util.concurrent.CompletableFuture getChunkAtAsync(int x, int z, boolean gen, boolean urgent) { warnUnsafeChunk("getting a faraway chunk async", x, z); // Paper @@ -23290,7 +23300,7 @@ index 439857a814212b36e475461a01b320731a10b86d..be71724effeae857123aac6e34393fab net.minecraft.world.level.chunk.LevelChunk immediate = this.world.getChunkSource().getChunkAtIfLoadedImmediately(x, z); if (immediate != null) { return java.util.concurrent.CompletableFuture.completedFuture(new CraftChunk(immediate)); -@@ -2402,7 +2445,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2407,7 +2450,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { java.util.concurrent.CompletableFuture ret = new java.util.concurrent.CompletableFuture<>(); io.papermc.paper.chunk.system.ChunkSystem.scheduleChunkLoad(this.getHandle(), x, z, gen, ChunkStatus.FULL, true, priority, (c) -> { @@ -23672,7 +23682,7 @@ index ea056babe2f8123f20dc608d8a636da1de634b8c..6a54b582fdab953c452a32e9839e2a91 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index be933acd3004e7e092be3688d0d9ee97b159ab5a..93e0c4fd626455db1e14785a0b6750ba07fa0fe0 100644 +index 548eddde8b0558b780f672d321507cfcbac92558..4b4fd590574bb0a41bc84bbb18397f95cb61555c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -573,7 +573,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -23684,7 +23694,7 @@ index be933acd3004e7e092be3688d0d9ee97b159ab5a..93e0c4fd626455db1e14785a0b6750ba if (this.getHandle().connection == null) return; this.getHandle().connection.disconnect(message == null ? "" : message, org.bukkit.event.player.PlayerKickEvent.Cause.PLUGIN); // Paper - kick event cause -@@ -1287,6 +1287,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1288,6 +1288,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean teleport(Location location, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause, io.papermc.paper.entity.TeleportFlag... flags) { @@ -23696,7 +23706,7 @@ index be933acd3004e7e092be3688d0d9ee97b159ab5a..93e0c4fd626455db1e14785a0b6750ba java.util.Set relativeArguments; java.util.Set allFlags; if (flags.length == 0) { -@@ -1818,7 +1823,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1819,7 +1824,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private void unregisterEntity(Entity other) { // Paper end ChunkMap tracker = ((ServerLevel) this.getHandle().level()).getChunkSource().chunkMap; @@ -23705,7 +23715,7 @@ index be933acd3004e7e092be3688d0d9ee97b159ab5a..93e0c4fd626455db1e14785a0b6750ba if (entry != null) { entry.removePlayer(this.getHandle()); } -@@ -1902,7 +1907,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1903,7 +1908,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(otherPlayer))); } @@ -23715,7 +23725,7 @@ index be933acd3004e7e092be3688d0d9ee97b159ab5a..93e0c4fd626455db1e14785a0b6750ba entry.updatePlayer(this.getHandle()); } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 1ced79cf92fe0b01a42f097794dacc3ce74518f3..4e08c4064c9ba2f16b1ae475f19c668b48fb0dc2 100644 +index a9a58f0bb19e034cffdafcc38fdc9003744a5d6c..4b0736339caf2fe47e9b4ebd0dd50ff956c365ae 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -230,8 +230,8 @@ import org.bukkit.potion.PotionEffect; @@ -24025,10 +24035,10 @@ index 612c3169c3463d702b85975e1db79ae6e47d60d0..6f77134ba451e7bd6bcba1000134ce8a public static int playerSample; diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java -index bbfafb1400721251dfd2cac4dd8a31be2d682d4b..c5a04b6fb00b32752dce051f12012b9062ed4eda 100644 +index 5638290c72e0daeddfa79fd55e87334fa7d86f72..9461ebdd919da51d422338dbfbfcf9ea9dd7bfea 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java -@@ -429,7 +429,7 @@ public class SpigotWorldConfig +@@ -431,7 +431,7 @@ public class SpigotWorldConfig this.otherMultiplier = (float) this.getDouble( "hunger.other-multiplier", 0.0 ); } diff --git a/patches/server/0004-Max-pending-logins.patch b/patches/server/0004-Max-pending-logins.patch index 0b8cfae..a7a1a43 100644 --- a/patches/server/0004-Max-pending-logins.patch +++ b/patches/server/0004-Max-pending-logins.patch @@ -19,7 +19,7 @@ index 2e96377d628b3a07fb565020074d665f594f32e8..75b1877f8c3e4da3183437f327ef3376 } // Folia - region threading - remove delayed accept diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 576e60f2ce00733254895f83f4bef76152dc3fe9..f35192cd5f08fdac6eaee549d6b73cccd22fefe4 100644 +index fc58f714b069453b5f6d2f0ca801fbe1beef07aa..7dc9114a994ff265eb66d99c4f15be197b327e55 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -180,6 +180,17 @@ public abstract class PlayerList { diff --git a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch index e6e12fc..f714743 100644 --- a/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch +++ b/patches/server/0006-Make-CraftEntity-getHandle-and-overrides-perform-thr.patch @@ -87,7 +87,7 @@ index 131bf7600ee4a476fb387dea9e0bc85df384447b..e8c2d4f647b01dfaebccd5a2fa330594 if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index aa877017799c573a114832fd1809bc80e322ed2c..d68e0ae2e6332a6a99630e2635b22d2cd509377f 100644 +index a2e688607194167ebf9ca646561d61b41f2ff915..f83d112a6f55a75aae114bb1c0cb5db4e5e009a3 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -376,7 +376,7 @@ public final class CraftServer implements Server { @@ -2146,7 +2146,7 @@ index beea227855f0b978e655efc298024120df8f4945..e1b7922ed298b6b3068c3f5fbe3b4030 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 93e0c4fd626455db1e14785a0b6750ba07fa0fe0..bc59a9d2f965c8e8638a2eeb3fcf661ed81f1727 100644 +index 4b4fd590574bb0a41bc84bbb18397f95cb61555c..e98c8d54ef30837da40e8f4ab9f7f46444d77359 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -593,7 +593,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -2158,7 +2158,7 @@ index 93e0c4fd626455db1e14785a0b6750ba07fa0fe0..bc59a9d2f965c8e8638a2eeb3fcf661e final ServerGamePacketListenerImpl connection = this.getHandle().connection; if (connection != null) { connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message, cause); -@@ -2023,9 +2023,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2024,9 +2024,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this; } @@ -2176,7 +2176,7 @@ index 93e0c4fd626455db1e14785a0b6750ba07fa0fe0..bc59a9d2f965c8e8638a2eeb3fcf661e } public void setHandle(final ServerPlayer entity) { -@@ -3024,7 +3031,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3025,7 +3032,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { { if ( CraftPlayer.this.getHealth() <= 0 && CraftPlayer.this.isOnline() ) { diff --git a/patches/server/0008-Throw-UnsupportedOperationException-for-broken-APIs.patch b/patches/server/0008-Throw-UnsupportedOperationException-for-broken-APIs.patch index d9ea349..0eee641 100644 --- a/patches/server/0008-Throw-UnsupportedOperationException-for-broken-APIs.patch +++ b/patches/server/0008-Throw-UnsupportedOperationException-for-broken-APIs.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Throw UnsupportedOperationException() for broken APIs diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index d68e0ae2e6332a6a99630e2635b22d2cd509377f..dc7ff994269e2a41a3256936c6b46f80dd8c2e18 100644 +index f83d112a6f55a75aae114bb1c0cb5db4e5e009a3..beb4946b582e2d3608dc3adff22089b4c19177ee 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -1264,6 +1264,7 @@ public final class CraftServer implements Server { diff --git a/patches/server/0010-Work-around-https-github.com-PaperMC-paperweight-iss.patch b/patches/server/0010-Work-around-https-github.com-PaperMC-paperweight-iss.patch index 6f002d5..4770ec2 100644 --- a/patches/server/0010-Work-around-https-github.com-PaperMC-paperweight-iss.patch +++ b/patches/server/0010-Work-around-https-github.com-PaperMC-paperweight-iss.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Work around https://github.com/PaperMC/paperweight/issues/194 diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index cdd365c5d6a14a754dd5088af20298d6fb8a20d5..7df99939dc12413b457775fe7e5c1d8d67551f9b 100644 +index f461db9abd9a7d9bed145cd1a053835c31541a88..6f88fbd45217dbbe67f2469040b7c5f621e185c6 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -504,7 +504,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic diff --git a/patches/server/0012-Lag-compensate-block-breaking.patch b/patches/server/0012-Lag-compensate-block-breaking.patch index f7b483d..43a10ca 100644 --- a/patches/server/0012-Lag-compensate-block-breaking.patch +++ b/patches/server/0012-Lag-compensate-block-breaking.patch @@ -41,7 +41,7 @@ index 41db6c61de36ebb1c214423dca0ba6a0c5a95cc1..65c4e158d81ac5c5788cf4dcb379061a // connections diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index d9e622964b415b07caaa714d7d23649dcc62c677..56d115f4fdc6c7e3a748557eb8c052994c4521de 100644 +index 7e303f86b6d8d41f96e5b3b3b0327da2082a8211..edfa7fbf209128b2254aa238e679f7be45162327 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -124,7 +124,7 @@ public class ServerPlayerGameMode { diff --git a/patches/server/0013-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch b/patches/server/0013-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch index 95d848d..7c9b2c1 100644 --- a/patches/server/0013-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch +++ b/patches/server/0013-Prevent-block-updates-in-non-loaded-or-non-owned-chu.patch @@ -9,10 +9,10 @@ add explicit block update suppression techniques, it's better than the server crashing. diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index f99b5a14717f87fe0629cbe7b6339a5ff2bb5fe9..8d15a9ff9fe61b97fa73957f3a2042859fe7d70e 100644 +index c28e974ea43e69e1e7d608785299d74317c83920..8cf4428d8140fd03f0ad8fa1d148a04d8caefda8 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1340,7 +1340,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1343,7 +1343,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { Direction enumdirection = (Direction) iterator.next(); BlockPos blockposition1 = pos.relative(enumdirection);