Port CB changes from Moonrise patch

This commit is contained in:
Spottedleaf
2024-12-20 10:52:51 -08:00
parent 3af380ba08
commit 48f34f8c90
9 changed files with 337 additions and 112 deletions

View File

@@ -22768,7 +22768,7 @@ index 0000000000000000000000000000000000000000..689ce367164e79e0426eeecb81dbbc52
+ private SaveUtil() {}
+}
diff --git a/io/papermc/paper/FeatureHooks.java b/io/papermc/paper/FeatureHooks.java
index d3aebc7f833764351c8e5fe1fad1aa2f8718ca37..046a6304ea7e9dd66cb9d4cb004a582f13018295 100644
index e40b83502c74d7dcae05d9d0c865affeee186893..c4ddf4b6fee8086481581fab88a807f63e211b5c 100644
--- a/io/papermc/paper/FeatureHooks.java
+++ b/io/papermc/paper/FeatureHooks.java
@@ -1,6 +1,8 @@
@@ -22793,6 +22793,159 @@ index d3aebc7f833764351c8e5fe1fad1aa2f8718ca37..046a6304ea7e9dd66cb9d4cb004a582f
}
public static LevelChunkSection createSection(final Registry<Biome> biomeRegistry, final Level level, final ChunkPos chunkPos, final int chunkSection) {
@@ -79,89 +84,30 @@ public final class FeatureHooks {
}
public static boolean isSpiderCollidingWithWorldBorder(final Spider spider) {
- return true; // ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.isCollidingWithBorder(spider.level().getWorldBorder(), spider.getBoundingBox().inflate(ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_EPSILON))
+ return ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.isCollidingWithBorder(spider.level().getWorldBorder(), spider.getBoundingBox().inflate(ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_EPSILON)); // Paper - rewrite collision system
}
public static void dumpAllChunkLoadInfo(net.minecraft.server.MinecraftServer server, boolean isLongTimeout) {
+ ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler.dumpAllChunkLoadInfo(server, isLongTimeout); // Paper - rewrite chunk system
}
private static void dumpEntity(final Entity entity) {
}
public static org.bukkit.entity.Entity[] getChunkEntities(net.minecraft.server.level.ServerLevel world, int chunkX, int chunkZ) {
- world.getChunk(chunkX, chunkZ); // ensure full loaded
-
- net.minecraft.world.level.entity.PersistentEntitySectionManager<net.minecraft.world.entity.Entity> entityManager = world.entityManager;
- long pair = ChunkPos.asLong(chunkX, chunkZ);
-
- if (entityManager.areEntitiesLoaded(pair)) {
- return entityManager.getEntities(new ChunkPos(chunkX, chunkZ)).stream()
- .map(net.minecraft.world.entity.Entity::getBukkitEntity)
- .filter(java.util.Objects::nonNull).toArray(org.bukkit.entity.Entity[]::new);
- }
-
- entityManager.ensureChunkQueuedForLoad(pair); // Start entity loading
-
- // SPIGOT-6772: Use entity mailbox and re-schedule entities if they get unloaded
- net.minecraft.util.thread.ConsecutiveExecutor mailbox = ((net.minecraft.world.level.chunk.storage.EntityStorage) entityManager.permanentStorage).entityDeserializerQueue;
- java.util.function.BooleanSupplier supplier = () -> {
- // only execute inbox if our entities are not present
- if (entityManager.areEntitiesLoaded(pair)) {
- return true;
- }
-
- if (!entityManager.isPending(pair)) {
- // Our entities got unloaded, this should normally not happen.
- entityManager.ensureChunkQueuedForLoad(pair); // Re-start entity loading
- }
-
- // tick loading inbox, which loads the created entities to the world
- // (if present)
- entityManager.tick();
- // check if our entities are loaded
- return entityManager.areEntitiesLoaded(pair);
- };
-
- // now we wait until the entities are loaded,
- // the converting from NBT to entity object is done on the main Thread which is why we wait
- while (!supplier.getAsBoolean()) {
- if (mailbox.size() != 0) {
- mailbox.run();
- } else {
- Thread.yield();
- java.util.concurrent.locks.LockSupport.parkNanos("waiting for entity loading", 100000L);
- }
- }
-
- return entityManager.getEntities(new ChunkPos(chunkX, chunkZ)).stream()
- .map(net.minecraft.world.entity.Entity::getBukkitEntity)
- .filter(java.util.Objects::nonNull).toArray(org.bukkit.entity.Entity[]::new);
+ return world.getChunkEntities(chunkX, chunkZ); // Paper - rewrite chunk system
}
public static java.util.Collection<org.bukkit.plugin.Plugin> getPluginChunkTickets(net.minecraft.server.level.ServerLevel world,
int x, int z) {
- net.minecraft.server.level.DistanceManager chunkDistanceManager = world.getChunkSource().chunkMap.distanceManager;
- net.minecraft.util.SortedArraySet<net.minecraft.server.level.Ticket<?>> tickets = chunkDistanceManager.tickets.get(ChunkPos.asLong(x, z));
-
- if (tickets == null) {
- return java.util.Collections.emptyList();
- }
-
- com.google.common.collect.ImmutableList.Builder<org.bukkit.plugin.Plugin> ret = com.google.common.collect.ImmutableList.builder();
- for (net.minecraft.server.level.Ticket<?> ticket : tickets) {
- if (ticket.getType() == net.minecraft.server.level.TicketType.PLUGIN_TICKET) {
- ret.add((org.bukkit.plugin.Plugin) ticket.key);
- }
- }
-
- return ret.build();
+ return world.moonrise$getChunkTaskScheduler().chunkHolderManager.getPluginChunkTickets(x, z); // Paper - rewrite chunk system
}
public static Map<org.bukkit.plugin.Plugin, java.util.Collection<org.bukkit.Chunk>> getPluginChunkTickets(net.minecraft.server.level.ServerLevel world) {
Map<org.bukkit.plugin.Plugin, com.google.common.collect.ImmutableList.Builder<Chunk>> ret = new HashMap<>();
net.minecraft.server.level.DistanceManager chunkDistanceManager = world.getChunkSource().chunkMap.distanceManager;
- for (it.unimi.dsi.fastutil.longs.Long2ObjectMap.Entry<net.minecraft.util.SortedArraySet<net.minecraft.server.level.Ticket<?>>> chunkTickets : chunkDistanceManager.tickets.long2ObjectEntrySet()) {
+ for (it.unimi.dsi.fastutil.longs.Long2ObjectMap.Entry<net.minecraft.util.SortedArraySet<net.minecraft.server.level.Ticket<?>>> chunkTickets : chunkDistanceManager.moonrise$getChunkHolderManager().getTicketsCopy().long2ObjectEntrySet()) { // Paper - rewrite chunk system
long chunkKey = chunkTickets.getLongKey();
net.minecraft.util.SortedArraySet<net.minecraft.server.level.Ticket<?>> tickets = chunkTickets.getValue();
@@ -183,15 +129,15 @@ public final class FeatureHooks {
}
public static int getViewDistance(net.minecraft.server.level.ServerLevel world) {
- return world.getChunkSource().chunkMap.serverViewDistance;
+ return world.moonrise$getPlayerChunkLoader().getAPIViewDistance(); // Paper - rewrite chunk system
}
public static int getSimulationDistance(net.minecraft.server.level.ServerLevel world) {
- return world.getChunkSource().chunkMap.getDistanceManager().simulationDistance;
+ return world.moonrise$getPlayerChunkLoader().getAPITickDistance(); // Paper - rewrite chunk system
}
public static int getSendViewDistance(net.minecraft.server.level.ServerLevel world) {
- return getViewDistance(world);
+ return world.moonrise$getPlayerChunkLoader().getAPISendViewDistance(); // Paper - rewrite chunk system
}
public static void setViewDistance(net.minecraft.server.level.ServerLevel world, int distance) {
@@ -209,31 +155,31 @@ public final class FeatureHooks {
}
public static void setSendViewDistance(net.minecraft.server.level.ServerLevel world, int distance) {
- throw new UnsupportedOperationException("Not implemented yet");
+ world.chunkSource.setSendViewDistance(distance); // Paper - rewrite chunk system
}
public static void tickEntityManager(net.minecraft.server.level.ServerLevel world) {
- world.entityManager.tick();
+ // Paper - rewrite chunk system
}
public static void closeEntityManager(net.minecraft.server.level.ServerLevel world, boolean save) {
- world.entityManager.close(save);
+ // Paper - rewrite chunk system
}
public static java.util.concurrent.Executor getWorldgenExecutor() {
- return net.minecraft.Util.backgroundExecutor();
+ return Runnable::run; // Paper - rewrite chunk system
}
public static void setViewDistance(ServerPlayer player, int distance) {
- throw new UnsupportedOperationException("Not implemented yet");
+ ((ca.spottedleaf.moonrise.patches.chunk_system.player.ChunkSystemServerPlayer)player).moonrise$getViewDistanceHolder().setLoadViewDistance(distance == -1 ? distance : distance + 1); // Paper - rewrite chunk system
}
public static void setSimulationDistance(ServerPlayer player, int distance) {
- throw new UnsupportedOperationException("Not implemented yet");
+ ((ca.spottedleaf.moonrise.patches.chunk_system.player.ChunkSystemServerPlayer)player).moonrise$getViewDistanceHolder().setTickViewDistance(distance); // Paper - rewrite chunk system
}
public static void setSendViewDistance(ServerPlayer player, int distance) {
- throw new UnsupportedOperationException("Not implemented yet");
+ ((ca.spottedleaf.moonrise.patches.chunk_system.player.ChunkSystemServerPlayer)player).moonrise$getViewDistanceHolder().setSendViewDistance(distance); // Paper - rewrite chunk system
}
}
diff --git a/io/papermc/paper/command/subcommands/ChunkDebugCommand.java b/io/papermc/paper/command/subcommands/ChunkDebugCommand.java
new file mode 100644
index 0000000000000000000000000000000000000000..2dca7afbd93cfbb8686f336fcd3b45dd01fba0fc