diff --git a/gradle.properties b/gradle.properties index efc85bb..f5c5a6f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ mcVersion=26.2 apiVersion=26.2 version=26.2 -purpurRef=fc3c961cdbea92b1205f2f175b89dcd9b4ab0be2 +purpurRef=ed29e9980557c6f252ccbfbc50dced007b6c05f7 org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/shreddedpaper-server/minecraft-patches/sources/net/minecraft/server/level/ChunkMap.java.patch b/shreddedpaper-server/minecraft-patches/sources/net/minecraft/server/level/ChunkMap.java.patch index 676b1ce..319e309 100644 --- a/shreddedpaper-server/minecraft-patches/sources/net/minecraft/server/level/ChunkMap.java.patch +++ b/shreddedpaper-server/minecraft-patches/sources/net/minecraft/server/level/ChunkMap.java.patch @@ -79,7 +79,7 @@ ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)this.level).moonrise$getChunkTaskScheduler().chunkHolderManager.autoSave(); // Paper - rewrite chunk system } -@@ -702,7 +_,7 @@ +@@ -703,7 +_,7 @@ } // Paper start - optimise chunk tick iteration @@ -88,7 +88,7 @@ final ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkData chunkData = ((ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemLevelChunk)levelChunk).moonrise$getChunkHolder().holderData; final ca.spottedleaf.moonrise.common.misc.NearbyPlayers.TrackedChunk nearbyPlayers = chunkData.nearbyPlayers; if (nearbyPlayers == null) { -@@ -722,6 +_,7 @@ +@@ -723,6 +_,7 @@ Objects.checkFromIndexSize(0, len, raw.length); for (int i = 0; i < len; ++i) { @@ -96,7 +96,7 @@ // Paper start - PlayerNaturallySpawnCreaturesEvent com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event = raw[i].playerNaturallySpawnedEvent; if (event == null || event.isCancelled()) { -@@ -732,31 +_,34 @@ +@@ -733,31 +_,34 @@ // Paper end - PlayerNaturallySpawnCreaturesEvent return true; } @@ -150,7 +150,7 @@ public void forEachBlockTickingChunk(final Consumer tickingChunkConsumer) { this.distanceManager.forEachEntityTickingChunk(chunkPos -> { -@@ -814,7 +_,9 @@ +@@ -815,7 +_,9 @@ Objects.checkFromIndexSize(0, len, raw.length); for (int i = 0; i < len; ++i) { @@ -160,7 +160,7 @@ // Paper start - PlayerNaturallySpawnCreaturesEvent com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event; blockRange = 16384.0; -@@ -827,6 +_,7 @@ +@@ -828,6 +_,7 @@ // Paper end - PlayerNaturallySpawnCreaturesEvent return true; } @@ -168,7 +168,7 @@ } return false; -@@ -849,7 +_,9 @@ +@@ -850,7 +_,9 @@ Objects.checkFromIndexSize(0, len, raw.length); for (int i = 0; i < len; ++i) { @@ -178,7 +178,7 @@ if (this.playerIsCloseEnoughForSpawning(player, pos, 16384.0D)) { // Spigot if (ret == null) { ret = new ArrayList<>(len - i); -@@ -858,6 +_,7 @@ +@@ -859,6 +_,7 @@ ret.add(player); } } @@ -186,7 +186,7 @@ } return ret == null ? new ArrayList<>() : ret; -@@ -983,9 +_,9 @@ +@@ -984,9 +_,9 @@ protected void addEntity(final Entity entity) { org.spigotmc.AsyncCatcher.catchOp("entity track"); // Spigot // Paper start - ignore and warn about illegal addEntity calls instead of crashing server @@ -198,7 +198,7 @@ return; } // Paper end - ignore and warn about illegal addEntity calls instead of crashing server -@@ -996,12 +_,13 @@ +@@ -997,12 +_,13 @@ range = org.spigotmc.TrackingRange.getEntityTrackingRange(entity, range); // Spigot if (range != 0) { int updateInterval = type.updateInterval(); @@ -214,7 +214,7 @@ // Paper start - optimise entity tracker if (((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity)entity).moonrise$getTrackedEntity() != null) { throw new IllegalStateException("Entity is already tracked"); -@@ -1011,8 +_,9 @@ +@@ -1012,8 +_,9 @@ trackedEntity.updatePlayers(this.level.players()); if (entity instanceof ServerPlayer player) { this.updatePlayerStatus(player, true); @@ -225,7 +225,7 @@ if (e.entity != player) { e.updatePlayer(player); } -@@ -1027,13 +_,14 @@ +@@ -1028,13 +_,14 @@ if (entity instanceof ServerPlayer player) { this.updatePlayerStatus(player, false); @@ -242,7 +242,7 @@ trackedEntity.broadcastRemoved(); } ((ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity)entity).moonrise$setTrackedEntity(null); // Paper - optimise entity tracker -@@ -1041,22 +_,25 @@ +@@ -1042,22 +_,25 @@ // Paper start - optimise entity tracker private void newTrackerTick() { @@ -282,7 +282,7 @@ } // Paper end - optimise entity tracker -@@ -1072,7 +_,7 @@ +@@ -1073,7 +_,7 @@ List movedPlayers = Lists.newArrayList(); List players = this.level.players(); @@ -291,7 +291,7 @@ SectionPos oldPos = trackedEntity.lastSectionPos; SectionPos newPos = SectionPos.of(trackedEntity.entity); boolean sectionPosChanged = !Objects.equals(oldPos, newPos); -@@ -1091,14 +_,14 @@ +@@ -1092,14 +_,14 @@ } if (!movedPlayers.isEmpty()) { @@ -308,7 +308,7 @@ if (trackedEntity != null) { trackedEntity.sendToTrackingPlayers(packet); } -@@ -1107,26 +_,26 @@ +@@ -1108,26 +_,26 @@ public void sendToTrackingPlayersFiltered( final Entity entity, final Packet packet, final Predicate targetPredicate ) { @@ -339,7 +339,7 @@ if (entity.seenBy.contains(player.connection)) { consumer.accept(entity.entity); } -@@ -1212,6 +_,7 @@ +@@ -1213,6 +_,7 @@ private final int range; private SectionPos lastSectionPos; public final Set seenBy = new it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet<>(); // Paper - Perf: optimise map impl @@ -347,7 +347,7 @@ // Paper start - optimise entity tracker private long lastChunkUpdate = -1L; -@@ -1237,21 +_,33 @@ +@@ -1238,21 +_,33 @@ this.lastChunkUpdate = currChunkUpdate; this.lastTrackedChunk = chunk; @@ -382,7 +382,7 @@ } } -@@ -1302,6 +_,91 @@ +@@ -1303,6 +_,91 @@ this.range = range; this.lastSectionPos = SectionPos.of(entity); } @@ -474,7 +474,7 @@ @Override public boolean equals(final Object obj) { -@@ -1315,9 +_,13 @@ +@@ -1316,9 +_,13 @@ @Override public void sendToTrackingPlayers(final Packet packet) { @@ -488,7 +488,7 @@ } @Override -@@ -1330,27 +_,33 @@ +@@ -1331,27 +_,33 @@ @Override public void sendToTrackingPlayersFiltered(final Packet packet, final Predicate targetPredicate) { @@ -522,7 +522,7 @@ } public void updatePlayer(final ServerPlayer player) { -@@ -1384,6 +_,7 @@ +@@ -1385,6 +_,7 @@ } // CraftBukkit end if (visibleToPlayer) { @@ -530,7 +530,7 @@ if (this.seenBy.add(player.connection)) { // Paper start - entity tracking events if (io.papermc.paper.event.player.PlayerTrackEntityEvent.getHandlerList().getRegisteredListeners().length == 0 || new io.papermc.paper.event.player.PlayerTrackEntityEvent(player.getBukkitEntity(), this.entity.getBukkitEntity()).callEvent()) { -@@ -1397,6 +_,7 @@ +@@ -1398,6 +_,7 @@ // Paper end - entity tracking events this.serverEntity.onPlayerAdd(); // Paper - fix desync when a player is added to the tracker } diff --git a/shreddedpaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch b/shreddedpaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch index c551ea4..a695d07 100644 --- a/shreddedpaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch +++ b/shreddedpaper-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch @@ -274,7 +274,7 @@ // Paper end - chunk tick iteration public ServerLevel( -@@ -741,7 +_,7 @@ +@@ -742,7 +_,7 @@ this.sleepStatus = new SleepStatus(); this.gameEventDispatcher = new GameEventDispatcher(this); @@ -283,7 +283,7 @@ this.environmentAttributes = EnvironmentAttributeSystem.builder().addDefaultLayers(this).build(); this.updateSkyBrightness(); // Paper start - rewrite chunk system -@@ -759,6 +_,7 @@ +@@ -760,6 +_,7 @@ this.chunkDataController = new ca.spottedleaf.moonrise.patches.chunk_system.io.datacontroller.ChunkDataController((ServerLevel)(Object)this, this.chunkTaskScheduler); // Paper end - rewrite chunk system this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit @@ -291,7 +291,7 @@ } // Paper start -@@ -812,9 +_,9 @@ +@@ -813,9 +_,9 @@ return previous; } @@ -303,7 +303,7 @@ this.environmentAttributes().invalidateTickCache(); TickRateManager tickRateManager = this.tickRateManager(); boolean runs = tickRateManager.runsNormally(); -@@ -873,13 +_,13 @@ +@@ -874,13 +_,13 @@ } profiler.popPush("chunkSource"); @@ -320,7 +320,7 @@ profiler.pop(); boolean isActive = !paperConfig().unsupportedSettings.disableWorldTickingWhenEmpty || this.chunkSource.hasActiveTickets(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players // Paper - restore this if (isActive) { -@@ -899,35 +_,37 @@ +@@ -900,35 +_,37 @@ } io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR @@ -385,7 +385,7 @@ profiler.pop(); } // Paper - option to disable ticking this.spigotConfig.currentPrimedTnt = 0; // Spigot -@@ -938,14 +_,15 @@ +@@ -939,14 +_,15 @@ profiler.pop(); profiler.push("debugSynchronizers"); if (this.debugSynchronizers.hasAnySubscriberFor(DebugSubscriptions.NEIGHBOR_UPDATES)) { @@ -404,7 +404,7 @@ } @Override -@@ -974,7 +_,7 @@ +@@ -975,7 +_,7 @@ private void wakeUpAllPlayers() { this.sleepStatus.removeAllSleepers(); @@ -413,7 +413,7 @@ } // Paper start - optimise random ticking -@@ -1198,7 +_,7 @@ +@@ -1199,7 +_,7 @@ } public boolean isHandlingTick() { @@ -422,7 +422,7 @@ } public boolean canSleepThroughNights() { -@@ -1419,27 +_,29 @@ +@@ -1420,27 +_,29 @@ this.emptyTime = 0; } @@ -456,7 +456,7 @@ ((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer)this.server).moonrise$executeMidTickTasks(); } // Paper end - rewrite chunk system -@@ -1494,7 +_,7 @@ +@@ -1495,7 +_,7 @@ private void tickPassenger(final Entity vehicle, final Entity entity, final boolean isActive) { // Paper - EAR 2 if (entity.isRemoved() || entity.getVehicle() != vehicle) { entity.stopRiding(); @@ -465,7 +465,7 @@ entity.setOldPosAndRot(); entity.tickCount++; entity.totalEntityAge++; // Paper - age-like counter for all entities -@@ -1718,8 +_,8 @@ +@@ -1719,8 +_,8 @@ } else { if (entity instanceof net.minecraft.world.entity.item.ItemEntity item && item.getItem().isEmpty()) return false; // Paper - Prevent empty items from being added // Paper start - capture all item additions to the world @@ -476,7 +476,7 @@ return true; } // Paper end - capture all item additions to the world -@@ -1805,7 +_,9 @@ +@@ -1806,7 +_,9 @@ .callEvent(); } // Paper end - Add BlockBreakProgressUpdateEvent @@ -487,7 +487,7 @@ if (player.level() == this && player.getId() != id) { double xd = blockPos.getX() - player.getX(); double yd = blockPos.getY() - player.getY(); -@@ -1816,7 +_,7 @@ +@@ -1817,7 +_,7 @@ continue; } // CraftBukkit end @@ -496,7 +496,7 @@ } } } -@@ -1925,7 +_,7 @@ +@@ -1926,7 +_,7 @@ @Override public void sendBlockUpdated(final BlockPos pos, final BlockState old, final BlockState current, final @Block.UpdateFlags int updateFlags) { @@ -505,7 +505,7 @@ String message = "recursive call to sendBlockUpdated"; Util.logAndPauseIfInIde("recursive call to sendBlockUpdated", new IllegalStateException("recursive call to sendBlockUpdated")); } -@@ -1939,7 +_,7 @@ +@@ -1940,7 +_,7 @@ List navigationsToUpdate = new ObjectArrayList<>(); try { // Paper - catch CME see below why @@ -514,7 +514,7 @@ PathNavigation pathNavigation = navigatingMob.getNavigation(); if (pathNavigation.shouldRecomputePath(pos)) { navigationsToUpdate.add(pathNavigation); -@@ -1956,13 +_,13 @@ +@@ -1957,13 +_,13 @@ // Paper end - catch CME see below why try { @@ -530,7 +530,7 @@ } } } // Paper - option to disable pathfinding updates -@@ -1971,17 +_,17 @@ +@@ -1972,17 +_,17 @@ @Override public void updateNeighborsAt(final BlockPos pos, final Block sourceBlock) { // CraftBukkit start @@ -551,7 +551,7 @@ this.neighborUpdater.updateNeighborsAtExceptFromFacing(pos, sourceBlock, null, orientation); } -@@ -2110,14 +_,15 @@ +@@ -2111,14 +_,15 @@ @Override public void blockEvent(final BlockPos pos, final Block block, final int b0, final int b1) { @@ -572,7 +572,7 @@ if (this.shouldTickBlocksAt(eventData.pos())) { if (this.doBlockEvent(eventData)) { this.server -@@ -2133,11 +_,11 @@ +@@ -2134,11 +_,11 @@ ); } } else { @@ -586,7 +586,7 @@ } private boolean doBlockEvent(final BlockEventData eventData) { -@@ -2387,7 +_,7 @@ +@@ -2388,7 +_,7 @@ final MapItemSavedData mapData = storage.get(MapItemSavedData.type(id)); // get populates the cache if (mapData != null) { // map was read, init it and return mapData.id = id; @@ -595,7 +595,7 @@ return mapData; } -@@ -2406,8 +_,7 @@ +@@ -2407,8 +_,7 @@ public void setMapData(final MapId id, final MapItemSavedData data) { // CraftBukkit start data.id = id; @@ -605,7 +605,7 @@ // CraftBukkit end this.getServer().getDataStorage().set(MapItemSavedData.type(id), data); } -@@ -2463,11 +_,11 @@ +@@ -2464,11 +_,11 @@ Optional> newType = PoiTypes.forState(newState); if (!Objects.equals(oldType, newType)) { BlockPos immutable = pos.immutable(); @@ -619,7 +619,7 @@ // Paper start - Remove stale POIs if (oldType.isEmpty() && this.getPoiManager().exists(immutable, _ -> true)) { this.getPoiManager().remove(immutable); -@@ -2530,7 +_,7 @@ +@@ -2531,7 +_,7 @@ } output.write(String.format(Locale.ROOT, "entities: %s\n", this.moonrise$getEntityLookup().getDebugInfo())); // Paper - rewrite chunk system @@ -628,7 +628,7 @@ output.write(String.format(Locale.ROOT, "block_ticks: %d\n", this.getBlockTicks().count())); output.write(String.format(Locale.ROOT, "fluid_ticks: %d\n", this.getFluidTicks().count())); output.write("distance_manager: " + chunkMap.getDistanceManager().getDebugStatus() + "\n"); -@@ -2598,17 +_,25 @@ +@@ -2599,17 +_,25 @@ } private void dumpBlockEntityTickers(final Writer output) throws IOException { @@ -661,7 +661,7 @@ } public Iterable getAllEntities() { -@@ -2650,8 +_,8 @@ +@@ -2651,8 +_,8 @@ this.players.size(), this.moonrise$getEntityLookup().getDebugInfo(), // Paper - rewrite chunk system getTypeCount(this.moonrise$getEntityLookup().getAll(), e -> e.typeHolder().getRegisteredName()), // Paper - rewrite chunk system @@ -672,7 +672,7 @@ this.getBlockTicks().count(), this.getFluidTicks().count(), this.gatherChunkSourceStats() -@@ -2681,7 +_,7 @@ +@@ -2682,7 +_,7 @@ @Override public LevelEntityGetter getEntities() { @@ -681,7 +681,7 @@ return this.moonrise$getEntityLookup(); // Paper - rewrite chunk system } -@@ -2869,7 +_,7 @@ +@@ -2870,7 +_,7 @@ // Paper start - optimize redstone (Alternate Current) @Override public alternate.current.wire.WireHandler getWireHandler() { @@ -690,7 +690,7 @@ } // Paper end - optimize redstone (Alternate Current) -@@ -2910,12 +_,12 @@ +@@ -2911,12 +_,12 @@ @Override public void onTickingStart(final Entity entity) { if (entity instanceof net.minecraft.world.entity.Marker && !paperConfig().entities.markers.tick) return; // Paper - Configurable marker ticking @@ -705,7 +705,7 @@ // Paper start - Reset pearls when they stop being ticked if (ServerLevel.this.paperConfig().fixes.disableUnloadedChunkEnderpearlExploit && ServerLevel.this.paperConfig().misc.legacyEnderPearlBehavior && entity instanceof net.minecraft.world.entity.projectile.throwableitemprojectile.ThrownEnderpearl pearl) { pearl.setOwner(null); -@@ -2925,10 +_,11 @@ +@@ -2926,10 +_,11 @@ @Override public void onTrackingStart(final Entity entity) { @@ -718,7 +718,7 @@ if (player.isReceivingWaypoints()) { ServerLevel.this.getWaypointManager().addPlayer(player); } -@@ -2941,14 +_,14 @@ +@@ -2942,14 +_,14 @@ } if (entity instanceof Mob mob) { @@ -735,7 +735,7 @@ } if (entity instanceof EnderDragon dragon) { -@@ -2975,7 +_,7 @@ +@@ -2976,7 +_,7 @@ @Override public void onTrackingEnd(final Entity entity) { @@ -744,7 +744,7 @@ // Spigot start // TODO I don't think this is needed anymore if (entity instanceof Player player) { for (final ServerLevel level : ServerLevel.this.getServer().getAllLevels()) { -@@ -2984,10 +_,12 @@ +@@ -2985,10 +_,12 @@ continue; } @@ -757,7 +757,7 @@ } } } -@@ -3006,20 +_,21 @@ +@@ -3007,20 +_,21 @@ // Spigot end ServerLevel.this.getChunkSource().removeEntity(entity); if (entity instanceof ServerPlayer player) { @@ -781,7 +781,7 @@ } if (entity instanceof EnderDragon dragon) { -@@ -3044,6 +_,9 @@ +@@ -3045,6 +_,9 @@ @Override public void onSectionChange(final Entity entity) { entity.updateDynamicGameEventListener(DynamicGameEventListener::move); diff --git a/shreddedpaper-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftWorld.java.patch b/shreddedpaper-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftWorld.java.patch index 819b404..87ba143 100644 --- a/shreddedpaper-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftWorld.java.patch +++ b/shreddedpaper-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftWorld.java.patch @@ -94,7 +94,7 @@ } if (grownTree) { // Copy block data to delegate for (CraftBlockState snapshot : capturedBlockStates) { -@@ -1589,7 +_,7 @@ +@@ -1594,7 +_,7 @@ if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(CraftSound.bukkitToMinecraftHolder(sound), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed); @@ -103,7 +103,7 @@ if (entityTracker != null) { entityTracker.sendToTrackingPlayersAndSelf(packet); } -@@ -1610,7 +_,7 @@ +@@ -1615,7 +_,7 @@ if (!(entity instanceof CraftEntity craftEntity) || entity.getWorld() != this || sound == null || category == null) return; ClientboundSoundEntityPacket packet = new ClientboundSoundEntityPacket(Holder.direct(SoundEvent.createVariableRangeEvent(Identifier.parse(sound))), net.minecraft.sounds.SoundSource.valueOf(category.name()), craftEntity.getHandle(), volume, pitch, seed); @@ -112,7 +112,7 @@ if (entityTracker != null) { entityTracker.sendToTrackingPlayersAndSelf(packet); } -@@ -2041,11 +_,12 @@ +@@ -2046,11 +_,12 @@ @Override public void getChunkAtAsync(int x, int z, boolean gen, boolean urgent, @NotNull Consumer cb) { warnUnsafeChunk("getting a faraway chunk async", x, z); // Paper @@ -126,7 +126,7 @@ } ); -@@ -2055,11 +_,12 @@ +@@ -2060,11 +_,12 @@ public void getChunksAtAsync(int minX, int minZ, int maxX, int maxZ, boolean urgent, Runnable cb) { warnUnsafeChunk("getting a faraway chunk async", minX, minZ); // Paper warnUnsafeChunk("getting a faraway chunk async", maxX, maxZ); // Paper