From ca5ff29a0de9e0fab13749fedd9dffd8153b9deb Mon Sep 17 00:00:00 2001 From: Samsuik Date: Sat, 21 Sep 2024 00:33:08 +0100 Subject: [PATCH] Updated Upstream (Paper) Upstream has released updates that appear to apply and compile correctly Paper Changes: PaperMC/Paper@691d452 Fix bundled spark permission check (#11355) PaperMC/Paper@012c527 Update Velocity natives (#11347) PaperMC/Paper@953e6e9 Fire BlockExpEvent on grindstone use (#11346) PaperMC/Paper@10f5879 Change condition check order of entity tracking Y (#11348) PaperMC/Paper@805a974 Improve console completion with brig suggestions (#9251) PaperMC/Paper@e0021b1 Fix allowSpiderWorldBorderClimbing world config (#11321) PaperMC/Paper@3db4758 Check dead flag in isAlive() (#11330) PaperMC/Paper@21f125f Revert velocity natives to 3.1.2 (#11368) PaperMC/Paper@0e82527 Fix NPE while trying to respawn an already disconnected player (#11353) PaperMC/Paper@5d91bef Fix shulkerbox loot table replenish (#11366) PaperMC/Paper@a8e6a93 Deprecate for removal all OldEnum-related methods (#11371) PaperMC/Paper@925c3b9 Add FeatureFlag API (#8952) PaperMC/Paper@426f992 Enchantment is data-driven, so not FeatureDependant (#11377) PaperMC/Paper@1ba1be7 Update Velocity natives again PaperMC/Paper@7632de5 Tag Lifecycle Events (#10993) PaperMC/Paper@b09eaf2 Add Item serialization as json api (#11235) PaperMC/Paper@971a7a5 Add Decorated Pot Cracked API (#11365) PaperMC/Paper@61fe23c deprecate isEnabledByFeature in Item/BlockType PaperMC/Paper@e945cfe Fix PaperServerListPingEvent#getPlayerSample not being populated or used (#11387) PaperMC/Paper@4ff58c4 Update spark PaperMC/Paper@d1a72ea Updated Upstream (Bukkit/CraftBukkit/Spigot) (#11405) PaperMC/Paper@0a53f1d Set default drop behavior for player deaths (#11380) PaperMC/Paper@951e7dd Fix TrialSpawner forgetting assigned mob when placed by player (#11381) PaperMC/Paper@13a2395 Fix enable-player-collisions playing sounds when set to false (#11390) PaperMC/Paper@1348e44 Prevent NPE when serializing unresolved profile (#11407) PaperMC/Paper@2aaf436 Validate slot in PlayerInventory#setSlot (#11399) PaperMC/Paper@5c82955 Only mark decorations dirty if a removal actually occurs (#11413) PaperMC/Paper@c5a1066 Remove wall-time / unused skip tick protection (#11412) --- gradle.properties | 2 +- patches/server/0002-Sakura-Utils.patch | 10 +- .../0003-Sakura-Configuration-Files.patch | 10 +- ...4-Local-Config-and-Value-Storage-API.patch | 16 +- .../0005-Visibility-API-and-Command.patch | 114 ++++++----- .../server/0007-Load-Chunks-on-Movement.patch | 8 +- patches/server/0008-TPS-Graph-Command.patch | 10 +- .../0011-Use-Optimised-TrackedEntityMap.patch | 4 +- .../server/0015-Store-Entity-Data-State.patch | 6 +- .../server/0016-Merge-Cannon-Entities.patch | 36 ++-- ...0017-Replace-explosion-density-cache.patch | 39 ++-- .../server/0019-Specialised-Explosions.patch | 8 +- .../0025-Add-maxSearch-to-getEntities.patch | 8 +- .../0029-Explosion-Durable-Blocks.patch | 74 +++---- ...31-Cache-Vanillia-and-Eigen-Redstone.patch | 30 +-- ...-ItemEntity-s-that-ignore-explosions.patch | 4 +- ...-Configure-cannon-physics-by-version.patch | 183 +++++++----------- ...Reduce-entity-tracker-player-updates.patch | 10 +- ...Add-explosions-dropping-items-config.patch | 4 +- .../0069-Old-enchanted-golden-apples.patch | 4 +- .../0074-Entity-tracking-range-modifier.patch | 12 +- .../server/0077-Optimise-hopper-ticking.patch | 4 +- ...tity-schedulers-only-when-necessary.patch} | 4 +- 23 files changed, 270 insertions(+), 330 deletions(-) rename patches/server/{0079-Tick-entity-schedulers-only-when-necessary.patch => 0078-Tick-entity-schedulers-only-when-necessary.patch} (96%) diff --git a/gradle.properties b/gradle.properties index 6feb933..0771ad4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=me.samsuik.sakura version=1.21.1-R0.1-SNAPSHOT mcVersion=1.21.1 -paperRef=ff251e42b661b5373374a2b250345289fc052882 +paperRef=c5a10665b8b80af650500b9263036f778f06d500 org.gradle.jvmargs=-Xmx2G org.gradle.vfs.watch=false diff --git a/patches/server/0002-Sakura-Utils.patch b/patches/server/0002-Sakura-Utils.patch index 2a4f551..e0e3db4 100644 --- a/patches/server/0002-Sakura-Utils.patch +++ b/patches/server/0002-Sakura-Utils.patch @@ -226,26 +226,26 @@ index 0000000000000000000000000000000000000000..131dc69cdd2c121975199324022f9421 +} diff --git a/src/main/java/me/samsuik/sakura/utils/objects/Expiry.java b/src/main/java/me/samsuik/sakura/utils/objects/Expiry.java new file mode 100644 -index 0000000000000000000000000000000000000000..65e3c06062f529fd3e70eedccfe38b93c6c66c60 +index 0000000000000000000000000000000000000000..97a54930416951645e35f7bd7ec11325d1ba4d53 --- /dev/null +++ b/src/main/java/me/samsuik/sakura/utils/objects/Expiry.java @@ -0,0 +1,19 @@ +package me.samsuik.sakura.utils.objects; + +public final class Expiry { -+ private long expireAt; ++ private int expireAt; + private final int inc; + -+ public Expiry(long tick, int inc) { ++ public Expiry(int tick, int inc) { + this.expireAt = tick + inc; + this.inc = inc; + } + -+ public void refresh(long tick) { ++ public void refresh(int tick) { + this.expireAt = tick + this.inc; + } + -+ public boolean isExpired(long tick) { ++ public boolean isExpired(int tick) { + return tick >= this.expireAt; + } +} diff --git a/patches/server/0003-Sakura-Configuration-Files.patch b/patches/server/0003-Sakura-Configuration-Files.patch index a2718f7..4f2ad6d 100644 --- a/patches/server/0003-Sakura-Configuration-Files.patch +++ b/patches/server/0003-Sakura-Configuration-Files.patch @@ -1031,7 +1031,7 @@ index 0000000000000000000000000000000000000000..4024f9738e039ffffd560a07a2210f75 +public record DurableMaterial(int durability, float resistance) { +} diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 23ddd26af762c1cd7fb3920669abb96b3213ab37..741ca90ca91c77f3cc58a7020169165b20250225 100644 +index 696d075ca2883f3c37e35f983c4d020e5db89d16..f7a636990d581ad0230317a716d2662ea25480e3 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -317,6 +317,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> 4, position.getZ() >> 4); + + LocalValueConfig local = this.configMap.computeIfAbsent(chunkKey, (key) -> { -+ LocalValueConfig config = new LocalValueConfig(new Expiry(MinecraftServer.currentTickLong, 600)); ++ LocalValueConfig config = new LocalValueConfig(new Expiry(MinecraftServer.currentTick, 600)); + + // defaults from sakura config + config.init(level); @@ -129,11 +129,11 @@ index 0000000000000000000000000000000000000000..00953ca239c677ece37715b759a1f026 + return config; + }); + -+ local.expiry().refresh(MinecraftServer.currentTickLong); ++ local.expiry().refresh(MinecraftServer.currentTick); + return local; + } + -+ public synchronized void expire(long tick) { ++ public synchronized void expire(int tick) { + if (tick % 200 != 0) return; + + // remove expired @@ -227,14 +227,14 @@ index 0000000000000000000000000000000000000000..5b3e2cca7ee16bc6ecfa0f29438fa658 + } +} diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 741ca90ca91c77f3cc58a7020169165b20250225..39cc9aba054696c063133d529e79594a5ce2c0cd 100644 +index f7a636990d581ad0230317a716d2662ea25480e3..f0ba7597de6f1eb025639cbe0f35f51d839fe4c2 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1820,6 +1820,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop mainThreadExecutor, LightChunkGetter chunkProvider, ChunkGenerator chunkGenerator, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier persistentStateManagerFactory, int viewDistance, boolean dsync) { + super(new RegionStorageInfo(session.getLevelId(), world.dimension(), "chunk"), session.getDimensionPath(world.dimension()).resolve("region"), dataFixer, dsync); +@@ -943,6 +944,8 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + } + ((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerTrackedEntity)tracker).moonrise$clearPlayers(); + } + -+ if (flag && (this.entity.isPrimedTNT || this.entity.isFallingBlock) && player.visibility.isToggled(me.samsuik.sakura.player.visibility.Visibility.Setting.MINIMAL)) { -+ long key = entity.blockPosition().asLong(); -+ -+ if (level.minimalTNT.containsKey(key)) { -+ flag = level.minimalTNT.get(key) == entity.getId(); -+ } else { -+ level.minimalTNT.put(key, entity.getId()); -+ } ++ this.minimalEntities.clear(); // Sakura - visibility api and command + } + // Paper end - optimise entity tracker + +@@ -1179,6 +1182,29 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + } + } + // Paper end - optimise entity tracker ++ // Sakura start - visibility api and command ++ private boolean checkEntityVisibility(ServerPlayer player) { ++ if (player.visibility.isModified() || !(this.entity.isPrimedTNT || this.entity.isFallingBlock)) { ++ return true; ++ } ++ if (this.entity.isPrimedTNT && player.visibility.isToggled(me.samsuik.sakura.player.visibility.Visibility.Setting.TNT_VISIBILITY)) { ++ return false; ++ } ++ if (this.entity.isFallingBlock && player.visibility.isToggled(me.samsuik.sakura.player.visibility.Visibility.Setting.SAND_VISIBILITY)) { ++ return false; ++ } ++ if (player.visibility.isToggled(me.samsuik.sakura.player.visibility.Visibility.Setting.MINIMAL)) { ++ final long key = this.entity.blockPosition().asLong() ^ this.entity.getType().hashCode(); ++ final long visibleEntity = ChunkMap.this.minimalEntities.get(key); ++ if (visibleEntity != Integer.MIN_VALUE) { ++ return this.entity.getId() == visibleEntity; ++ } else { ++ ChunkMap.this.minimalEntities.put(key, this.entity.getId()); + } -+ // Sakura end ++ } ++ return true; ++ } ++ // Sakura end - visibility api and command + + public TrackedEntity(final Entity entity, final int i, final int j, final boolean flag) { + this.serverEntity = new ServerEntity(ChunkMap.this.level, entity, j, flag, this::broadcast, this.seenBy); // CraftBukkit +@@ -1256,6 +1282,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + } + flag = flag && this.entity.broadcastToPlayer(player) && ChunkMap.this.isChunkTracked(player, this.entity.chunkPosition().x, this.entity.chunkPosition().z); + // Paper end - Configurable entity tracking range by Y ++ flag = flag && this.checkEntityVisibility(player); // Sakura start - visibility api and command + // CraftBukkit start - respect vanish API if (flag && !player.getBukkitEntity().canSee(this.entity.getBukkitEntity())) { // Paper - only consider hits - flag = false; diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 06d4c259894e7706d8a73229d079d59cf1797881..b10d442b2b05a9400674031c9d140a8ac42a3255 100644 +index fb2e895aa658175329708828de3e1030bf28620b..07f36cd0dea417459e7022fe7e73a5177fc7c67a 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -1791,7 +1791,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. @@ -303,7 +323,7 @@ index 06d4c259894e7706d8a73229d079d59cf1797881..b10d442b2b05a9400674031c9d140a8a } } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 6c280abdef5f80b668d6090f9d35283a33e21e0c..5ac73657e6d2e44cadd5b807ff2130f2db6a2c0f 100644 +index c396580a9cfd86ff261bed439bb4662ae88010b5..007bc568d3fb23f08790044aa3171727996927dc 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -282,6 +282,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple @@ -345,7 +365,7 @@ index 6c280abdef5f80b668d6090f9d35283a33e21e0c..5ac73657e6d2e44cadd5b807ff2130f2 nbt.putBoolean("spawn_extra_particles_on_fall", this.spawnExtraParticlesOnFall); if (this.raidOmenPosition != null) { diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..79533a1677430039f410f66b55927e1dd8e35b15 100644 +index 6998f32f8d79dbdb6b31ffaa126602fc4a428616..65ed367fe5b4a19ecbd0fe0193dcf0d4c5d2521d 100644 --- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -43,6 +43,23 @@ import org.bukkit.craftbukkit.util.CraftLocation; @@ -372,7 +392,7 @@ index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..79533a1677430039f410f66b55927e1d public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener, CraftPlayer.TransferCookieConnection { -@@ -95,6 +112,65 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -100,6 +117,65 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack protected final org.bukkit.craftbukkit.CraftServer cserver; public boolean processedDisconnect; @@ -438,7 +458,7 @@ index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..79533a1677430039f410f66b55927e1d public CraftPlayer getCraftPlayer() { return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity(); // CraftBukkit end -@@ -301,6 +377,12 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -306,6 +382,12 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack ClientboundSetDefaultSpawnPositionPacket packet6 = (ClientboundSetDefaultSpawnPositionPacket) packet; this.player.compassTarget = CraftLocation.toBukkit(packet6.pos, this.getCraftPlayer().getWorld()); } @@ -451,7 +471,7 @@ index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..79533a1677430039f410f66b55927e1d // CraftBukkit end if (packet.isTerminal()) { this.close(); -@@ -314,8 +396,11 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -319,8 +401,11 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack CrashReport crashreport = CrashReport.forThrowable(throwable, "Sending packet"); CrashReportCategory crashreportsystemdetails = crashreport.addCategory("Packet being sent"); @@ -465,7 +485,7 @@ index b43f87ff4b9853b5d4bbea5ff9686d64d9d0d26b..79533a1677430039f410f66b55927e1d throw new ReportedException(crashreport); } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 4320af392b7bd29d6a5d6da44361ffd0da16036a..797707c97dec5c89aaaeb2f2bb6ac39808f6e394 100644 +index fcccf989c25f0a259b160c4ff7873f7009e64d14..5f066ffa28b6eb6560c4645ce52f7cbc36c7d3f5 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -3213,6 +3213,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @@ -477,7 +497,7 @@ index 4320af392b7bd29d6a5d6da44361ffd0da16036a..797707c97dec5c89aaaeb2f2bb6ac398 if (this.player.containerMenu != oldContainer) { return; diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index e0827d8bb3fa17d4f590a5342ff41a514f623e68..0c453d7584c539cb8dfb70c325da652808ec0aa6 100644 +index 9f68c0fda7f5526eb97619f1a35ed3b78d1b3751..26a144e56cf906e1eb0ad52d217bcc0ef5bbd30d 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -549,6 +549,10 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -515,23 +535,11 @@ index 42bd2d9a1528b6210e4dfb56233062fd97c9743b..28a15f612239614c6c56974da5855ce3 } public PrimedTnt(Level world, double x, double y, double z, @Nullable LivingEntity igniter) { -diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index c811bc64d0686fdec58defb707d57e539c261b48..5886f44fdc605d3b814566808d8477e09df2fd3b 100644 ---- a/src/main/java/net/minecraft/world/level/Level.java -+++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -695,6 +695,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - return chunk != null ? chunk.getNoiseBiome(x, y, z) : this.getUncachedNoiseBiome(x, y, z); - } - // Paper end - optimise random ticking -+ public final it.unimi.dsi.fastutil.longs.Long2IntMap minimalTNT = new it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap(); // Sakura - visibility api - - 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, Supplier sakuraWorldConfigCreator, java.util.concurrent.Executor executor) { // Sakura - sakura configuration files// Paper - create paper world config & Anti-Xray - this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index a0d5082590ee03060f0dbb4770d196efc316c328..aea2720cfe7a0bfcf03653b5d527937c86a16dac 100644 +index ad740739437be632fc7fedec488a7d0c49534688..ff8580ca3e74e7e28afbfa8c2e566b98ced2dbff 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -545,6 +545,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -547,6 +547,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().displayName = name == null ? this.getName() : name; } diff --git a/patches/server/0007-Load-Chunks-on-Movement.patch b/patches/server/0007-Load-Chunks-on-Movement.patch index c162743..3e51384 100644 --- a/patches/server/0007-Load-Chunks-on-Movement.patch +++ b/patches/server/0007-Load-Chunks-on-Movement.patch @@ -52,7 +52,7 @@ index f56e5c0f53f9b52a9247b9be9265b949494fc924..f8e0746433057297c88f0237502da856 public static TicketType create(String name, Comparator argumentComparator) { return new TicketType<>(name, argumentComparator, 0L); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 84be48a2fb7d99fac15f2f71576e82503a84da79..6e9d9d7938049734b06a30f88e4a657dfa01265a 100644 +index 26a144e56cf906e1eb0ad52d217bcc0ef5bbd30d..3d82da439c31f9a6967077197de21e2356778112 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -553,6 +553,20 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -125,7 +125,7 @@ index ef245198ce6385c66f58e0dbcdebffbe6d2b625e..b7c8c2335d59853dbc97d3b9496b5e3a public PrimedTnt(Level world, double x, double y, double z, @Nullable LivingEntity igniter) { diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java -index 75c8125e20b70433fe9d143a3193d821043327c3..77071ef825951cbdcbad79f4496add9dc499e856 100644 +index 75c8125e20b70433fe9d143a3193d821043327c3..20764fba3c7cfe26cf622c3ee4848839408fa6af 100644 --- a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java +++ b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java @@ -140,6 +140,17 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom @@ -136,11 +136,11 @@ index 75c8125e20b70433fe9d143a3193d821043327c3..77071ef825951cbdcbad79f4496add9d + private long lastMovementLoadTicket = 0; + + public final boolean movementTicketNeedsUpdate() { -+ return net.minecraft.server.MinecraftServer.currentTickLong - this.lastMovementLoadTicket >= 100; ++ return net.minecraft.server.MinecraftServer.currentTick - this.lastMovementLoadTicket >= 100; + } + + public final void updatedMovementTicket() { -+ this.lastMovementLoadTicket = net.minecraft.server.MinecraftServer.currentTickLong; ++ this.lastMovementLoadTicket = net.minecraft.server.MinecraftServer.currentTick; + } + // Sakura end - load chunks on movement diff --git a/patches/server/0008-TPS-Graph-Command.patch b/patches/server/0008-TPS-Graph-Command.patch index a2bbe86..212fb54 100644 --- a/patches/server/0008-TPS-Graph-Command.patch +++ b/patches/server/0008-TPS-Graph-Command.patch @@ -414,10 +414,10 @@ index 0000000000000000000000000000000000000000..6903863ad293a335a8ed1aeaa06fccb4 + +} diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 0f8d7e9b38bd1e834b9f1f015e4e971437130164..5abe92349a31069b25a1020c3d518a1b0103bbc8 100644 +index 7499ee50e3c62c3107979ea8a100f1da96f2c980..4c53e39aa153f490a473175df00679d0d01d2bd0 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1211,6 +1211,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop type, Level world) { this.id = Entity.ENTITY_COUNTER.incrementAndGet(); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 5886f44fdc605d3b814566808d8477e09df2fd3b..7384c7f81e0f9bfe05c05561a1ec87f3fa17f010 100644 +index c811bc64d0686fdec58defb707d57e539c261b48..0925de100a7da3bba6c3fab7a0c79b2ee0d86904 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1431,6 +1431,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1430,6 +1430,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public void guardEntityTick(Consumer tickConsumer, T entity) { try { diff --git a/patches/server/0016-Merge-Cannon-Entities.patch b/patches/server/0016-Merge-Cannon-Entities.patch index f4b6f95..fd086ee 100644 --- a/patches/server/0016-Merge-Cannon-Entities.patch +++ b/patches/server/0016-Merge-Cannon-Entities.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Merge Cannon Entities diff --git a/src/main/java/me/samsuik/sakura/entity/merge/EntityMergeHandler.java b/src/main/java/me/samsuik/sakura/entity/merge/EntityMergeHandler.java new file mode 100644 -index 0000000000000000000000000000000000000000..c8040daf71384d1fe7bd16478741b4c9cca1100c +index 0000000000000000000000000000000000000000..dbd38e3b5b32c324eff6875269f09131425796a4 --- /dev/null +++ b/src/main/java/me/samsuik/sakura/entity/merge/EntityMergeHandler.java @@ -0,0 +1,76 @@ @@ -59,7 +59,7 @@ index 0000000000000000000000000000000000000000..c8040daf71384d1fe7bd16478741b4c9 + * + * @param tick server tick + */ -+ public void expire(long tick) { ++ public void expire(int tick) { + if (tick % 200 == 0) { + this.trackedHistory.expire(tick); + } @@ -320,7 +320,7 @@ index 0000000000000000000000000000000000000000..3061c3a48f7c68f64a3348b9583f4b41 +} diff --git a/src/main/java/me/samsuik/sakura/entity/merge/TrackedMergeHistory.java b/src/main/java/me/samsuik/sakura/entity/merge/TrackedMergeHistory.java new file mode 100644 -index 0000000000000000000000000000000000000000..12f12705678e260654c0af7e23e403e36f9a427d +index 0000000000000000000000000000000000000000..2c2a26fdb3081ced574070e5e6f3a1b4c09b578d --- /dev/null +++ b/src/main/java/me/samsuik/sakura/entity/merge/TrackedMergeHistory.java @@ -0,0 +1,73 @@ @@ -363,14 +363,14 @@ index 0000000000000000000000000000000000000000..12f12705678e260654c0af7e23e403e3 + return this.historyMap.get(originPosition); + } + -+ public void expire(long tick) { ++ public void expire(int tick) { + this.historyMap.values().removeIf(p -> p.expiry().isExpired(tick)); + } + + private static final class PositionHistory { + private final LongOpenHashSet positions = new LongOpenHashSet(); -+ private final Expiry expiry = new Expiry(MinecraftServer.currentTickLong, 200); -+ private final long created = MinecraftServer.currentTickLong; ++ private final Expiry expiry = new Expiry(MinecraftServer.currentTick, 200); ++ private final long created = MinecraftServer.currentTick; + private int cycles = 0; + + public Expiry expiry() { @@ -378,7 +378,7 @@ index 0000000000000000000000000000000000000000..12f12705678e260654c0af7e23e403e3 + } + + public boolean has(long position) { -+ this.expiry.refresh(MinecraftServer.currentTickLong); ++ this.expiry.refresh(MinecraftServer.currentTick); + return this.positions.contains(position); + } + @@ -392,25 +392,25 @@ index 0000000000000000000000000000000000000000..12f12705678e260654c0af7e23e403e3 + } + + public boolean hasMetConditions(@NotNull Entity entity, @NotNull MergeCondition condition) { -+ long timeSinceCreation = MinecraftServer.currentTickLong - this.created; ++ long timeSinceCreation = MinecraftServer.currentTick - this.created; + return condition.accept(entity, this.cycles, timeSinceCreation); + } + } +} diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 5abe92349a31069b25a1020c3d518a1b0103bbc8..d2542876279eec14f952f0b20d4ea665c7de00f4 100644 +index d48a1f7d23d1c47465ad8df37facbabe3a15c543..012bec9a32acc26f65c8efbfde341b0d15a4e822 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1825,6 +1825,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 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, Supplier sakuraWorldConfigCreator, java.util.concurrent.Executor executor) { // Sakura - sakura configuration files// Paper - create paper world config & Anti-Xray diff --git a/patches/server/0017-Replace-explosion-density-cache.patch b/patches/server/0017-Replace-explosion-density-cache.patch index 5457bce..165f312 100644 --- a/patches/server/0017-Replace-explosion-density-cache.patch +++ b/patches/server/0017-Replace-explosion-density-cache.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Replace explosion density cache diff --git a/src/main/java/me/samsuik/sakura/explosion/density/BlockDensityCache.java b/src/main/java/me/samsuik/sakura/explosion/density/BlockDensityCache.java new file mode 100644 -index 0000000000000000000000000000000000000000..b760b03f9ddc1fb2aed135105030fc1b5dc2c9c9 +index 0000000000000000000000000000000000000000..35454e122e87892099226ba8fd8d444664be9037 --- /dev/null +++ b/src/main/java/me/samsuik/sakura/explosion/density/BlockDensityCache.java -@@ -0,0 +1,65 @@ +@@ -0,0 +1,62 @@ +package me.samsuik.sakura.explosion.density; + +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -58,10 +58,7 @@ index 0000000000000000000000000000000000000000..b760b03f9ddc1fb2aed135105030fc1b + } + } + -+ public void clear(long tick) { -+ // trim size every 30 seconds -+ if (tick != -1 && tick % 600 == 0) -+ this.densityDataMap.trim(); ++ public void invalidate() { + this.densityDataMap.clear(); + } + @@ -129,19 +126,19 @@ index 0000000000000000000000000000000000000000..d7e24638f07f243502004970ab4ce646 + } +} diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index d2542876279eec14f952f0b20d4ea665c7de00f4..af3bcb2dff44d9a734cab9610abbe5d7430c5d57 100644 +index 012bec9a32acc26f65c8efbfde341b0d15a4e822..8041737aa751bec1c51ee3d9dacd6dfb2b845265 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1826,6 +1826,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 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, Supplier sakuraWorldConfigCreator, java.util.concurrent.Executor executor) { // Sakura - sakura configuration files// Paper - create paper world config & Anti-Xray this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot diff --git a/src/main/java/net/minecraft/world/level/block/BasePressurePlateBlock.java b/src/main/java/net/minecraft/world/level/block/BasePressurePlateBlock.java -index 8b33e35c843e5c0b8988a2ef2a38a2673035292f..5ec557652558bb44e9be7d32fc214091d29aac78 100644 +index 1aa36b456b1c635d3184aeab70d1d84266e22c4b..afb76b13f404a12a5f5b9ffe72756d31290a9a85 100644 --- a/src/main/java/net/minecraft/world/level/block/BasePressurePlateBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BasePressurePlateBlock.java @@ -109,6 +109,11 @@ public abstract class BasePressurePlateBlock extends Block { @@ -231,14 +228,14 @@ index 8b33e35c843e5c0b8988a2ef2a38a2673035292f..5ec557652558bb44e9be7d32fc214091 + // Sakura start - explosion density cache + if (!world.paperConfig().environment.optimizeExplosions) { -+ world.densityCache.clear(-1); ++ world.densityCache.invalidate(); + } + // Sakura end - explosion density cache world.setBlock(pos, iblockdata1, 2); this.updateNeighbours(world, pos); world.setBlocksDirty(pos, state, iblockdata1); diff --git a/src/main/java/net/minecraft/world/level/block/TripWireHookBlock.java b/src/main/java/net/minecraft/world/level/block/TripWireHookBlock.java -index 76aca266d3f3222502ff4c196228f08fcd88c5f8..6a63e60d80ee53a4611dfcdd9ab974f8227fae59 100644 +index 76aca266d3f3222502ff4c196228f08fcd88c5f8..b965d1b38a0a3f08531060039e46913dff3bfd0e 100644 --- a/src/main/java/net/minecraft/world/level/block/TripWireHookBlock.java +++ b/src/main/java/net/minecraft/world/level/block/TripWireHookBlock.java @@ -173,6 +173,11 @@ public class TripWireHookBlock extends Block { @@ -247,7 +244,7 @@ index 76aca266d3f3222502ff4c196228f08fcd88c5f8..6a63e60d80ee53a4611dfcdd9ab974f8 + // Sakura start - explosion density cache + if (!world.paperConfig().environment.optimizeExplosions) { -+ world.densityCache.clear(-1); ++ world.densityCache.invalidate(); + } + // Sakura end - explosion density cache world.setBlock(blockposition1, (BlockState) iblockdata3.setValue(TripWireHookBlock.FACING, enumdirection1), 3); diff --git a/patches/server/0019-Specialised-Explosions.patch b/patches/server/0019-Specialised-Explosions.patch index 79fbbc2..271fe5f 100644 --- a/patches/server/0019-Specialised-Explosions.patch +++ b/patches/server/0019-Specialised-Explosions.patch @@ -459,7 +459,7 @@ index 0000000000000000000000000000000000000000..a5d13c6b0d8765e4a65b43f5835fd907 + } +} diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 3e160ec5f14b57732f0fe66e2d3ef3a2e7ba1406..d9495f6585c13ed2b1cdbe971a721d5b717920aa 100644 +index 65a71789571f896fc25a3eec22ee7808130a1578..fc84d393df406cc9895ee063422afe562762d443 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -1796,6 +1796,12 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. @@ -511,7 +511,7 @@ index a8e540c8a27135336fb2d6e37aec13d598b2000e..e64c85bf8fbd3ad0d7e8a6e4a34aed81 // Sakura end - merge cannon entities diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index da423a9211dd72bc531d7f0f65aab08b5c44f39c..d3ddf3c99cb6338cea6e1cad3d96c931885e5a20 100644 +index dfc6a49b2e4d7dd943a404e1f8445f9b67f41cde..4702f1d07ad32e94aeada46122f84ac68ece9af7 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -57,9 +57,11 @@ public class Explosion { @@ -608,10 +608,10 @@ index da423a9211dd72bc531d7f0f65aab08b5c44f39c..d3ddf3c99cb6338cea6e1cad3d96c931 float blockDensity = this.level.densityCache.getDensity(vec3d, entity); if (blockDensity == me.samsuik.sakura.explosion.density.BlockDensityCache.UNKNOWN_DENSITY) { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 67e5a3ae24b131ee1579a06d8b10ba9b0ac1ad41..d65a8857fd90063e277141d0e9fd553e39fc0880 100644 +index 8e12d473bfd7dad4dfda8bba503f475151da0ad1..eaafb99543869234e6bb8eb227bf9a0d6e8346d0 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1522,7 +1522,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1521,7 +1521,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } Explosion.BlockInteraction explosion_effect1 = explosion_effect; diff --git a/patches/server/0025-Add-maxSearch-to-getEntities.patch b/patches/server/0025-Add-maxSearch-to-getEntities.patch index 7cd4a83..a0e2997 100644 --- a/patches/server/0025-Add-maxSearch-to-getEntities.patch +++ b/patches/server/0025-Add-maxSearch-to-getEntities.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add maxSearch to getEntities diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java -index 8126c4fdbbc586cf3722c6ee2986338de044602e..0a8f593784322454335236d6f0dbb6ec9a9b8332 100644 +index f3832bf2064117ef2fe804ae3fd679b1f2b0343b..9051dc762e48191fd56d26e0d0499ef12b10a240 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/level/entity/ChunkEntitySlices.java @@ -336,10 +336,16 @@ public final class ChunkEntitySlices { @@ -98,10 +98,10 @@ index efc0c1acc8239dd7b00211a1d3bfd3fc3b2c810c..0ffbc8b459c3475ff0a9c307cb7bd144 \ No newline at end of file +} diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 70ce20d946287a7449da4efc958be5a9fa683afe..503e5afa3d9130738a9374e591277aae9dc08282 100644 +index eaafb99543869234e6bb8eb227bf9a0d6e8346d0..ec47e7da3c06ee74e0c134e4a881ab373fc68af8 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1669,10 +1669,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1668,10 +1668,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl this.getEntities(filter, box, predicate, result, Integer.MAX_VALUE); } @@ -121,7 +121,7 @@ index 70ce20d946287a7449da4efc958be5a9fa683afe..503e5afa3d9130738a9374e591277aae this.getProfiler().incrementCounter("getEntities"); if (entityTypeTest instanceof net.minecraft.world.entity.EntityType byType) { -@@ -1687,7 +1695,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1686,7 +1694,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl if (entityTypeTest == null) { if (maxCount != Integer.MAX_VALUE) { diff --git a/patches/server/0029-Explosion-Durable-Blocks.patch b/patches/server/0029-Explosion-Durable-Blocks.patch index 1d3f8e0..cc71adc 100644 --- a/patches/server/0029-Explosion-Durable-Blocks.patch +++ b/patches/server/0029-Explosion-Durable-Blocks.patch @@ -6,63 +6,45 @@ Subject: [PATCH] Explosion Durable Blocks diff --git a/src/main/java/me/samsuik/sakura/explosion/durable/DurableBlockManager.java b/src/main/java/me/samsuik/sakura/explosion/durable/DurableBlockManager.java new file mode 100644 -index 0000000000000000000000000000000000000000..c5eb573f946d24d2a44a46e0f395e00e4dc29bd6 +index 0000000000000000000000000000000000000000..e52cae27c2bbf4fa02d49d1c69d8e1240fddfb81 --- /dev/null +++ b/src/main/java/me/samsuik/sakura/explosion/durable/DurableBlockManager.java -@@ -0,0 +1,61 @@ +@@ -0,0 +1,43 @@ +package me.samsuik.sakura.explosion.durable; + -+import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -+import me.samsuik.sakura.utils.objects.Expiry; ++import com.google.common.cache.Cache; ++import com.google.common.cache.CacheBuilder; +import net.minecraft.core.BlockPos; + ++import java.util.concurrent.TimeUnit; ++ +public final class DurableBlockManager { -+ private final Long2ObjectOpenHashMap blocks = new Long2ObjectOpenHashMap<>(); -+ private long serverTick; ++ private final Cache durableBlocks = CacheBuilder.newBuilder() ++ .expireAfterAccess(1, TimeUnit.MINUTES) ++ .maximumSize(65534) ++ .build(); + + public boolean damage(BlockPos pos, DurableMaterial material) { -+ long packed = pos.asLong(); -+ // Expires after 1200 ticks (1 minute) without any changes. -+ DurableBlock block = this.blocks.computeIfAbsent(packed, k -> new DurableBlock( -+ new Expiry(this.serverTick, 1200), -+ material.durability() -+ )); -+ -+ if (block.damage()) { -+ this.blocks.remove(packed); -+ return true; -+ } else { -+ block.getExpiry().refresh(this.serverTick); -+ return false; ++ DurableBlock block = this.durableBlocks.getIfPresent(pos); ++ if (block == null) { ++ this.durableBlocks.put(pos, block = new DurableBlock(material.durability())); + } ++ return block.damage(); + } + + public int durability(BlockPos pos, DurableMaterial material) { -+ DurableBlock block = this.blocks.get(pos.asLong()); -+ return block != null ? block.getDurability() : material.durability(); -+ } -+ -+ public void expire(long tick) { -+ if (tick % 200 == 0) { -+ this.blocks.values().removeIf(block -> block.getExpiry().isExpired(tick)); -+ } -+ this.serverTick = tick; ++ final DurableBlock block = this.durableBlocks.getIfPresent(pos); ++ return block != null ? block.durability() : material.durability(); + } + + private static final class DurableBlock { -+ private final Expiry expiry; + private int durability; + -+ public DurableBlock(Expiry expiry, int durability) { -+ this.expiry = expiry; ++ public DurableBlock(int durability) { + this.durability = durability; + } + -+ public Expiry getExpiry() { -+ return this.expiry; -+ } -+ -+ public int getDurability() { ++ public int durability() { + return this.durability; + } + @@ -72,14 +54,14 @@ index 0000000000000000000000000000000000000000..c5eb573f946d24d2a44a46e0f395e00e + } +} diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index af3bcb2dff44d9a734cab9610abbe5d7430c5d57..479e10d3b431ce1292c97b4c2af18c79433e43e8 100644 +index 8041737aa751bec1c51ee3d9dacd6dfb2b845265..7073914cfd5759bea92ce098ad36a86afee5dd37 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1827,6 +1827,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop wires = this.adjacent.get(position.asLong()); -+ return wires != null && wires.stream().anyMatch(cache -> !cache.expiry().isExpired(MinecraftServer.currentTickLong)); ++ return wires != null && wires.stream().anyMatch(cache -> !cache.expiry().isExpired(MinecraftServer.currentTick)); + } + + public boolean isTracking() { @@ -242,7 +242,7 @@ index 0000000000000000000000000000000000000000..4f5af6e241b0194ed982144fd9320315 + + RedstoneCache redstoneCache = new RedstoneCache( + wires, updates, connected, -+ new Expiry(MinecraftServer.currentTickLong, 200) ++ new Expiry(MinecraftServer.currentTick, 200) + ); + + // put the newly created redstone cache into use @@ -267,7 +267,7 @@ index 0000000000000000000000000000000000000000..4f5af6e241b0194ed982144fd9320315 + }); + } + -+ public void expire(long tick) { ++ public void expire(int tick) { + if (tick % 100 != 0) return; + + this.wireCaches.values().removeIf(cache -> { @@ -324,7 +324,7 @@ index 0000000000000000000000000000000000000000..4f5af6e241b0194ed982144fd9320315 + }); + + // Refresh so the cache won't expire -+ expiry.refresh(MinecraftServer.currentTickLong); ++ expiry.refresh(MinecraftServer.currentTick); + } + } + @@ -342,23 +342,11 @@ index 0000000000000000000000000000000000000000..4f5af6e241b0194ed982144fd9320315 + } + +} -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 479e10d3b431ce1292c97b4c2af18c79433e43e8..fb761723228ed9c2fafa15299866e28e8efac788 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1828,6 +1828,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 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, Supplier sakuraWorldConfigCreator, java.util.concurrent.Executor executor) { // Sakura - sakura configuration files// Paper - create paper world config & Anti-Xray this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot -@@ -1078,6 +1079,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1077,6 +1078,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } else { BlockState iblockdata2 = this.getBlockState(pos); diff --git a/patches/server/0033-Added-list-of-ItemEntity-s-that-ignore-explosions.patch b/patches/server/0033-Added-list-of-ItemEntity-s-that-ignore-explosions.patch index d5b1862..a329e54 100644 --- a/patches/server/0033-Added-list-of-ItemEntity-s-that-ignore-explosions.patch +++ b/patches/server/0033-Added-list-of-ItemEntity-s-that-ignore-explosions.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Added list of ItemEntity's that ignore explosions diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index ea0d9335446b20073b9aafb9de453097355db79c..d3b3194751df29ac5bd12339dc64695d308780d3 100644 +index 4423973d4d9a2c3879d98d1d4c8b8c117c677ac5..634a2e000ad788525fbb9f76be9cab8b0397dccc 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -@@ -591,6 +591,17 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -590,6 +590,17 @@ public class ItemEntity extends Entity implements TraceableEntity { } diff --git a/patches/server/0038-Configure-cannon-physics-by-version.patch b/patches/server/0038-Configure-cannon-physics-by-version.patch index 07702ee..a80a63b 100644 --- a/patches/server/0038-Configure-cannon-physics-by-version.patch +++ b/patches/server/0038-Configure-cannon-physics-by-version.patch @@ -106,7 +106,7 @@ index a5d13c6b0d8765e4a65b43f5835fd907738e1da4..19f0d8cf94a60b66cead3c129ded69fc protected int getExplosionCount() { if (this.cause.getMergeEntityData().getMergeLevel() == MergeLevel.NONE) { diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c4fb10b05f88e3d743ef2a58dd4be09c167a04ee..f1f07e69082d3c43b4b2792af2115ef5d7aef452 100644 +index deb032f9e80b2a001e2908a81bd62b00c87ba02e..9241f5cfc79f2f75ddffd41c012879306c94af4a 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -384,7 +384,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -475,7 +475,7 @@ index 4d0cfa1f96a04713cb1d51c7aaaf91374a0d6c17..96c43df6834e20a9e04eb095f36a644e // Paper end - Option to prevent TNT from moving in water } diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 21c6c8710add54a811fcd6d68ec75ad124219bc9..a29d85de45a6f96047a79cecbf17a797330d1ea5 100644 +index 90f2a510fb2b33534f12ec4d86d9bf33bd532b58..488748a0c34b3c7e7f3348ebbbb5155c2c353368 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -77,6 +77,7 @@ public class Explosion { @@ -500,7 +500,7 @@ index 21c6c8710add54a811fcd6d68ec75ad124219bc9..a29d85de45a6f96047a79cecbf17a797 hitResult = density != 0.0f ? net.minecraft.world.phys.HitResult.Type.MISS : net.minecraft.world.phys.HitResult.Type.BLOCK; + // Sakura start - physics version api + } else if (entity.physics().before(1_14_0)) { -+ hitResult = entity.level().rayTrace(vec3d1, source); ++ hitResult = entity.level().clipLegacy(vec3d1, source); } else { - hitResult = entity.level().clip(new ClipContext(vec3d1, source, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, entity)).getType(); + hitResult = entity.level().clip(new ClipContext(vec3d1, source, entity.physics().afterOrEqual(1_16_0) ? ClipContext.Block.COLLIDER : ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, entity)).getType(); @@ -568,147 +568,121 @@ index 21c6c8710add54a811fcd6d68ec75ad124219bc9..a29d85de45a6f96047a79cecbf17a797 private final Level world; private final double posX, posY, posZ; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 456eb52fd5fff7950d64dedb36cee011448c6e89..f685c3c894963d5100fdf5d5bda99adf248f41ec 100644 +index d82d64c98fc7624dfcc86fcbf49cde108bb34ede..062bc318e9c4e3b9a6429ce0eaaa29081cd1d227 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -695,6 +695,205 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -695,6 +695,170 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl return chunk != null ? chunk.getNoiseBiome(x, y, z) : this.getUncachedNoiseBiome(x, y, z); } // Paper end - optimise random ticking + // Sakura start - physics version api -+ public net.minecraft.world.phys.BlockHitResult.Type rayTrace(net.minecraft.world.phys.Vec3 vec3d, net.minecraft.world.phys.Vec3 vec3d1) { -+ // May deviate from vanilla here; I remember noticing a bug and there's no fix commit. -+ int i = Mth.floor(vec3d1.x); -+ int j = Mth.floor(vec3d1.y); -+ int k = Mth.floor(vec3d1.z); -+ int l = Mth.floor(vec3d.x); -+ int i1 = Mth.floor(vec3d.y); -+ int j1 = Mth.floor(vec3d.z); -+ BlockPos.MutableBlockPos blockposition = new BlockPos.MutableBlockPos(l, i1, j1); -+ LevelChunk chunk = this.getChunkIfLoaded(l >> 4, j1 >> 4); ++ public final net.minecraft.world.phys.BlockHitResult.Type clipLegacy(Vec3 from, Vec3 to) { ++ int toX = Mth.floor(to.x); ++ int toY = Mth.floor(to.y); ++ int toZ = Mth.floor(to.z); ++ int fromX = Mth.floor(from.x); ++ int fromY = Mth.floor(from.y); ++ int fromZ = Mth.floor(from.z); + -+ // probably a bad idea to copy this over so we don't need to do a null check ++ BlockPos.MutableBlockPos blockPos = new BlockPos.MutableBlockPos(fromX, fromY, fromZ); ++ LevelChunk chunk = this.getChunkIfLoaded(fromX >> 4, fromZ >> 4); + if (chunk == null) { + return net.minecraft.world.phys.BlockHitResult.Type.MISS; + } + -+ BlockState iblockdata = chunk.getBlockState(blockposition); -+ net.minecraft.world.phys.shapes.VoxelShape shape = iblockdata.getShape(this, blockposition); -+ ++ BlockState blockstate = chunk.getBlockState(blockPos); ++ VoxelShape shape = blockstate.getShape(this, blockPos); + for (AABB bb : shape.toAabbs()) { -+ if (clip(bb, blockposition, vec3d, vec3d1)) { ++ if (this.clip(bb, blockPos, from, to)) { + return net.minecraft.world.phys.BlockHitResult.Type.BLOCK; + } + } + -+ int k1 = 200; -+ -+ while (k1-- >= 0) { -+ if (l == i && i1 == j && j1 == k) { ++ for (int steps = 0; steps < 16; ++steps) { ++ if (fromX == toX && fromY == toY && fromZ == toZ) { + return net.minecraft.world.phys.BlockHitResult.Type.MISS; + } + -+ boolean flag3 = true; -+ boolean flag4 = true; -+ boolean flag5 = true; ++ boolean moveX = true; ++ boolean moveY = true; ++ boolean moveZ = true; + double d0 = 999.0D; + double d1 = 999.0D; + double d2 = 999.0D; + -+ if (i > l) { -+ d0 = (double) l + 1.0D; -+ } else if (i < l) { -+ d0 = (double) l + 0.0D; ++ if (toX > fromX) { ++ d0 = (double) fromX + 1.0D; ++ } else if (toX < fromX) { ++ d0 = (double) fromX + 0.0D; + } else { -+ flag3 = false; ++ moveX = false; + } + -+ if (j > i1) { -+ d1 = (double) i1 + 1.0D; -+ } else if (j < i1) { -+ d1 = (double) i1 + 0.0D; ++ if (toY > fromY) { ++ d1 = (double) fromY + 1.0D; ++ } else if (toY < fromY) { ++ d1 = (double) fromY + 0.0D; + } else { -+ flag4 = false; ++ moveY = false; + } + -+ if (k > j1) { -+ d2 = (double) j1 + 1.0D; -+ } else if (k < j1) { -+ d2 = (double) j1 + 0.0D; ++ if (toZ > fromZ) { ++ d2 = (double) fromZ + 1.0D; ++ } else if (toZ < fromZ) { ++ d2 = (double) fromZ + 0.0D; + } else { -+ flag5 = false; ++ moveZ = false; + } + + double d3 = 999.0D; + double d4 = 999.0D; + double d5 = 999.0D; -+ double d6 = vec3d1.x - vec3d.x; -+ double d7 = vec3d1.y - vec3d.y; -+ double d8 = vec3d1.z - vec3d.z; ++ double d6 = to.x - from.x; ++ double d7 = to.y - from.y; ++ double d8 = to.z - from.z; + -+ if (flag3) { -+ d3 = (d0 - vec3d.x) / d6; -+ } ++ if (moveX) d3 = (d0 - from.x) / d6; ++ if (moveY) d4 = (d1 - from.y) / d7; ++ if (moveZ) d5 = (d2 - from.z) / d8; + -+ if (flag4) { -+ d4 = (d1 - vec3d.y) / d7; -+ } -+ -+ if (flag5) { -+ d5 = (d2 - vec3d.z) / d8; -+ } -+ -+ if (d3 == -0.0D) { -+ d3 = -1.0E-4D; -+ } -+ -+ if (d4 == -0.0D) { -+ d4 = -1.0E-4D; -+ } -+ -+ if (d5 == -0.0D) { -+ d5 = -1.0E-4D; -+ } -+ -+ Direction enumdirection; ++ if (d3 == -0.0D) d3 = -1.0E-4D; ++ if (d4 == -0.0D) d4 = -1.0E-4D; ++ if (d5 == -0.0D) d5 = -1.0E-4D; + ++ Direction moveDir; + if (d3 < d4 && d3 < d5) { -+ enumdirection = i > l ? Direction.WEST : Direction.EAST; -+ vec3d = new net.minecraft.world.phys.Vec3(d0, vec3d.y + d7 * d3, vec3d.z + d8 * d3); ++ moveDir = toX > fromX ? Direction.WEST : Direction.EAST; ++ from = new Vec3(d0, from.y + d7 * d3, from.z + d8 * d3); + } else if (d4 < d5) { -+ enumdirection = j > i1 ? Direction.DOWN : Direction.UP; -+ vec3d = new net.minecraft.world.phys.Vec3(vec3d.x + d6 * d4, d1, vec3d.z + d8 * d4); ++ moveDir = toY > fromY ? Direction.DOWN : Direction.UP; ++ from = new Vec3(from.x + d6 * d4, d1, from.z + d8 * d4); + } else { -+ enumdirection = k > j1 ? Direction.NORTH : Direction.SOUTH; -+ vec3d = new net.minecraft.world.phys.Vec3(vec3d.x + d6 * d5, vec3d.y + d7 * d5, d2); ++ moveDir = toZ > fromZ ? Direction.NORTH : Direction.SOUTH; ++ from = new Vec3(from.x + d6 * d5, from.y + d7 * d5, d2); + } + -+ l = Mth.floor(vec3d.x) - (enumdirection == Direction.EAST ? 1 : 0); -+ i1 = Mth.floor(vec3d.y) - (enumdirection == Direction.UP ? 1 : 0); -+ j1 = Mth.floor(vec3d.z) - (enumdirection == Direction.SOUTH ? 1 : 0); -+ blockposition.set(l, i1, j1); -+ -+ int chunkX = l >> 4; -+ int chunkZ = j1 >> 4; ++ fromX = Mth.floor(from.x) - (moveDir == Direction.EAST ? 1 : 0); ++ fromY = Mth.floor(from.y) - (moveDir == Direction.UP ? 1 : 0); ++ fromZ = Mth.floor(from.z) - (moveDir == Direction.SOUTH ? 1 : 0); ++ blockPos.set(fromX, fromY, fromZ); + ++ int chunkX = fromX >> 4; ++ int chunkZ = fromZ >> 4; + if (chunkX != chunk.locX || chunkZ != chunk.locZ) { + chunk = this.getChunkIfLoaded(chunkX, chunkZ); + } -+ + if (chunk == null) { + return net.minecraft.world.phys.BlockHitResult.Type.MISS; + } + -+ iblockdata = chunk.getBlockState(blockposition); -+ shape = iblockdata.getShape(this, blockposition); -+ ++ blockstate = chunk.getBlockState(blockPos); ++ shape = blockstate.getShape(this, blockPos); + for (AABB bb : shape.toAabbs()) { -+ if (clip(bb, blockposition, vec3d, vec3d1)) { ++ if (this.clip(bb, blockPos, from, to)) { + return net.minecraft.world.phys.BlockHitResult.Type.BLOCK; + } + } + } -+ + return net.minecraft.world.phys.BlockHitResult.Type.MISS; + } + @@ -720,63 +694,54 @@ index 456eb52fd5fff7950d64dedb36cee011448c6e89..f685c3c894963d5100fdf5d5bda99adf + double y = vec3d1.y - vec3d.y; + double z = vec3d1.z - vec3d.z; + -+ double minXd = clip(bb.minX, x, vec3d.x); -+ double minYd = clip(bb.minY, y, vec3d.y); -+ double minZd = clip(bb.minZ, z, vec3d.z); -+ double maxXd = clip(bb.maxX, x, vec3d.x); -+ double maxYd = clip(bb.maxY, y, vec3d.y); -+ double maxZd = clip(bb.maxZ, z, vec3d.z); ++ double minXd = this.clip(bb.minX, x, vec3d.x); ++ double minYd = this.clip(bb.minY, y, vec3d.y); ++ double minZd = this.clip(bb.minZ, z, vec3d.z); ++ double maxXd = this.clip(bb.maxX, x, vec3d.x); ++ double maxYd = this.clip(bb.maxY, y, vec3d.y); ++ double maxZd = this.clip(bb.maxZ, z, vec3d.z); + -+ return clipX(vec3d, bb, minXd, y, z) || clipY(vec3d, bb, minYd, x, z) || clipZ(vec3d, bb, minZd, x, y) -+ || clipX(vec3d, bb, maxXd, y, z) || clipY(vec3d, bb, maxYd, x, z) || clipZ(vec3d, bb, maxZd, x, y); ++ return this.clipX(vec3d, bb, minXd, y, z) || this.clipY(vec3d, bb, minYd, x, z) || this.clipZ(vec3d, bb, minZd, x, y) ++ || this.clipX(vec3d, bb, maxXd, y, z) || this.clipY(vec3d, bb, maxYd, x, z) || this.clipZ(vec3d, bb, maxZd, x, y); + } + + private double clip(double bound, double axisD, double axisN) { -+ // This is my friend jerry, he was an epsilon. Unfortunately, once day -+ // he was cast to a float. Now he's spending his retirement here as a double. + if (axisD * axisD < 1.0000000116860974E-7D) { + return -1.0; + } -+ + return (bound - axisN) / axisD; + } + -+ private boolean clipX(net.minecraft.world.phys.Vec3 vec3d, AABB bb, double n, double y, double z) { ++ private boolean clipX(Vec3 vec3d, AABB bb, double n, double y, double z) { + if (n < 0.0 || n > 1.0) { + return false; + } -+ + y = vec3d.y + y * n; + z = vec3d.z + z * n; -+ + return y >= bb.minY && y <= bb.maxY && z >= bb.minZ && z <= bb.maxZ; + } + -+ private boolean clipY(net.minecraft.world.phys.Vec3 vec3d, AABB bb, double n, double x, double z) { ++ private boolean clipY(Vec3 vec3d, AABB bb, double n, double x, double z) { + if (n < 0.0 || n > 1.0) { + return false; + } -+ + x = vec3d.x + x * n; + z = vec3d.z + z * n; -+ + return x >= bb.minX && x <= bb.maxX && z >= bb.minZ && z <= bb.maxZ; + } + -+ private boolean clipZ(net.minecraft.world.phys.Vec3 vec3d, AABB bb, double n, double x, double y) { ++ private boolean clipZ(Vec3 vec3d, AABB bb, double n, double x, double y) { + if (n < 0.0 || n > 1.0) { + return false; + } -+ + x = vec3d.x + x * n; + y = vec3d.y + y * n; -+ + return x >= bb.minX && x <= bb.maxX && y >= bb.minY && y <= bb.maxY; + } + // Sakura end - physics version api - public final it.unimi.dsi.fastutil.longs.Long2IntMap minimalTNT = new it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap(); // Sakura - visibility api public final me.samsuik.sakura.entity.merge.EntityMergeHandler mergeHandler = new me.samsuik.sakura.entity.merge.EntityMergeHandler(); // Sakura - merge cannon entities public final me.samsuik.sakura.explosion.density.BlockDensityCache densityCache = new me.samsuik.sakura.explosion.density.BlockDensityCache(); // Sakura - explosion density cache + public final me.samsuik.sakura.explosion.durable.DurableBlockManager durabilityManager = new me.samsuik.sakura.explosion.durable.DurableBlockManager(); // Sakura - explosion durable blocks diff --git a/src/main/java/net/minecraft/world/level/block/FallingBlock.java b/src/main/java/net/minecraft/world/level/block/FallingBlock.java index 1ea1232a5ba3e48eef3a139d6487c9a190155ebd..4cf5147c8b089c3fa5476a05501fae0d9afaf341 100644 --- a/src/main/java/net/minecraft/world/level/block/FallingBlock.java diff --git a/patches/server/0046-Reduce-entity-tracker-player-updates.patch b/patches/server/0046-Reduce-entity-tracker-player-updates.patch index 1d3587f..cf7aaef 100644 --- a/patches/server/0046-Reduce-entity-tracker-player-updates.patch +++ b/patches/server/0046-Reduce-entity-tracker-player-updates.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Reduce entity tracker player updates diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index b2c99286e89f7f04aaa6efed245d344f15aa35fb..925809750c80a74d80255f6b611c486915530b34 100644 +index e80e1d7ac52ef6f81dab85916f8107bc3e9339c6..47e1bec18c9bed6028b63ed6a1bcc66bcd4df238 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java -@@ -927,7 +927,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -928,7 +928,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider if (tracker == null) { continue; } @@ -20,10 +20,10 @@ index b2c99286e89f7f04aaa6efed245d344f15aa35fb..925809750c80a74d80255f6b611c4869 tracker.serverEntity.sendChanges(); } -@@ -1179,12 +1183,30 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - } +@@ -1205,12 +1209,30 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + return true; } - // Paper end - optimise entity tracker + // Sakura end - visibility api and command + // Sakura start - reduce entity tracker player updates + private final int playerUpdateInterval; + private Vec3 entityPosition; diff --git a/patches/server/0054-Add-explosions-dropping-items-config.patch b/patches/server/0054-Add-explosions-dropping-items-config.patch index 1f98b22..7616197 100644 --- a/patches/server/0054-Add-explosions-dropping-items-config.patch +++ b/patches/server/0054-Add-explosions-dropping-items-config.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Add explosions dropping items config diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 726910c21440c62e35220294e4b639f4a8d242e2..64978e2c3bb5056e85b50a04f2d7fa8f8c76cd4b 100644 +index 4ed468653f2487e62ad3c187d558978b05a3264d..ec0a3764e129faecce4fd35f4e301a6fe8a9061b 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -908,6 +908,11 @@ public class Explosion { - this.level.densityCache.clear(-1); + this.level.densityCache.invalidate(); } // Sakura end - explosion density cache + // Sakura start - config for explosions dropping items diff --git a/patches/server/0069-Old-enchanted-golden-apples.patch b/patches/server/0069-Old-enchanted-golden-apples.patch index 8e1dd9e..df7118b 100644 --- a/patches/server/0069-Old-enchanted-golden-apples.patch +++ b/patches/server/0069-Old-enchanted-golden-apples.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Old enchanted golden apples diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 2f7e51b1509d3db78ed8dbd073e2f9ded820390b..a4b59cb05111aed52758061c314aafc56d75dc2d 100644 +index 195de6437fce730d45777afae91e3ae9ba99bd0b..7b383a7a301e2164df56f420c3d0e6528ed603d6 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -4571,6 +4571,11 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -4574,6 +4574,11 @@ public abstract class LivingEntity extends Entity implements Attackable { public final ItemStack eat(Level world, ItemStack stack) { FoodProperties foodinfo = (FoodProperties) stack.get(DataComponents.FOOD); diff --git a/patches/server/0074-Entity-tracking-range-modifier.patch b/patches/server/0074-Entity-tracking-range-modifier.patch index 39afbdc..869fa88 100644 --- a/patches/server/0074-Entity-tracking-range-modifier.patch +++ b/patches/server/0074-Entity-tracking-range-modifier.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Entity tracking range modifier diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 925809750c80a74d80255f6b611c486915530b34..0ba22484917ebb88a23a33c0ab5a171ae4630c59 100644 +index 47e1bec18c9bed6028b63ed6a1bcc66bcd4df238..80c5515b481c01e3a2fb59d4a69bc0a0d2b01792 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java -@@ -1264,7 +1264,10 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1290,7 +1290,10 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider double vec3d_dz = player.getZ() - this.entity.getZ(); // Paper end - remove allocation of Vec3D here int i = ChunkMap.this.getPlayerViewDistance(player); @@ -19,9 +19,9 @@ index 925809750c80a74d80255f6b611c486915530b34..0ba22484917ebb88a23a33c0ab5a171a + // Sakura end - entity tracking range modifier double d1 = vec3d_dx * vec3d_dx + vec3d_dz * vec3d_dz; // Paper double d2 = d0 * d0; - boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(player) && ChunkMap.this.isChunkTracked(player, this.entity.chunkPosition().x, this.entity.chunkPosition().z); + // Paper start - Configurable entity tracking range by Y diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 95b582042133624a47c67719f86990862a539030..62783c4c951089cbc00073b5945ce56ec7dbae7a 100644 +index 007bc568d3fb23f08790044aa3171727996927dc..4a5844be3683f502eebe01eed7ff1c2a6bf99962 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -333,6 +333,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple @@ -33,10 +33,10 @@ index 95b582042133624a47c67719f86990862a539030..62783c4c951089cbc00073b5945ce56e public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile, ClientInformation clientOptions) { super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index e340694c74add2f0e06b3e8bc9cc0bd50699e119..817b7248e4e055a66d1edbdd3d6e2ce854ff9542 100644 +index ff8580ca3e74e7e28afbfa8c2e566b98ced2dbff..c989f7051167ad6b83f0c916aefd068198711dab 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3018,6 +3018,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3017,6 +3017,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return (this.getHandle().requestedViewDistance() == 0) ? Bukkit.getViewDistance() : this.getHandle().requestedViewDistance(); } diff --git a/patches/server/0077-Optimise-hopper-ticking.patch b/patches/server/0077-Optimise-hopper-ticking.patch index 94c79ec..97b1045 100644 --- a/patches/server/0077-Optimise-hopper-ticking.patch +++ b/patches/server/0077-Optimise-hopper-ticking.patch @@ -42,10 +42,10 @@ index 5db5ba026462ca642dcee718af732f80fadabef5..51e26395b53628b34b1f7f68935a9ba4 boolean isEmpty(); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index f685c3c894963d5100fdf5d5bda99adf248f41ec..1dd832b3082e201bf9206e8668de097e022463d8 100644 +index 062bc318e9c4e3b9a6429ce0eaaa29081cd1d227..11e89d518d45b42bb39689e6ac1635b54ec8e41f 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1615,7 +1615,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1579,7 +1579,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl tilesThisCycle--; toRemove.add(tickingblockentity); // Paper - Fix MC-117075; use removeAll // Spigot end diff --git a/patches/server/0079-Tick-entity-schedulers-only-when-necessary.patch b/patches/server/0078-Tick-entity-schedulers-only-when-necessary.patch similarity index 96% rename from patches/server/0079-Tick-entity-schedulers-only-when-necessary.patch rename to patches/server/0078-Tick-entity-schedulers-only-when-necessary.patch index 06c60a2..e28c8bc 100644 --- a/patches/server/0079-Tick-entity-schedulers-only-when-necessary.patch +++ b/patches/server/0078-Tick-entity-schedulers-only-when-necessary.patch @@ -59,10 +59,10 @@ index c03608fec96b51e1867f43d8f42e5aefb1520e46..ca2e49c4e46e5c05091e11b8254e2ae5 * Retires the scheduler, preventing new tasks from being scheduled and invoking the retired callback * on all currently scheduled tasks. diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index fb761723228ed9c2fafa15299866e28e8efac788..f3507f7b2ba0e838af2f68ad73aaee7c0421f9f3 100644 +index 0ec9f586a66130227b1a21db3634edd6fe677db4..3091b303327fc58065cf0e341f83364be9da532e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1736,7 +1736,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop {