Skip to content

Commit

Permalink
feature: support paper chunk system (#1884)
Browse files Browse the repository at this point in the history
* avoid usage of ticking chunk future on paper

* fix entity handling

* fix entity handling but on spigot

* seems like no one uses spigot

Co-authored-by: Alexander Brandes <[email protected]>
  • Loading branch information
SirYwell and NotMyFault authored Sep 4, 2022
1 parent 3b109ba commit 5da558e
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ static void removeBeacon(BlockEntity beacon, LevelChunk levelChunk) {
}

static List<Entity> getEntities(LevelChunk chunk) {
return chunk.level.entityManager.getEntities(new ChunkPos(chunk.locX, chunk.locZ));
return chunk.level.entityManager.getEntities(chunk.getPos());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -588,7 +588,7 @@ static void removeBeacon(BlockEntity beacon, LevelChunk levelChunk) {
}

static List<Entity> getEntities(LevelChunk chunk) {
return chunk.level.entityManager.getEntities(new ChunkPos(chunk.locX, chunk.locZ));
return chunk.level.entityManager.getEntities(chunk.getPos());
}

record FakeIdMapBlock(int size) implements IdMap<net.minecraft.world.level.block.state.BlockState> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -585,23 +585,6 @@ public boolean generateTree(
return true;
}

@Override
public List<org.bukkit.entity.Entity> getEntities(org.bukkit.World world) {
// Quickly add each entity to a list copy.
List<Entity> mcEntities = new ArrayList<>();
((CraftWorld) world).getHandle().entityManager.getEntityGetter().getAll().forEach(mcEntities::add);

List<org.bukkit.entity.Entity> list = new ArrayList<>();
mcEntities.forEach((mcEnt) -> {
org.bukkit.entity.Entity bukkitEntity = mcEnt.getBukkitEntity();
if (bukkitEntity.isValid()) {
list.add(bukkitEntity);
}

});
return list;
}

@Override
public BaseItemStack adapt(org.bukkit.inventory.ItemStack itemStack) {
final ItemStack nmsStack = CraftItemStack.asNMSCopy(itemStack);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -676,7 +676,7 @@ public synchronized <T extends Future<T>> T call(IChunkSet set, Runnable finaliz
}
if (Settings.settings().EXPERIMENTAL.REMOVE_ENTITY_FROM_WORLD_ON_CHUNK_FAIL) {
for (UUID uuid : entityRemoves) {
Entity entity = nmsWorld.entityManager.getEntityGetter().get(uuid);
Entity entity = nmsWorld.getEntities().get(uuid);
if (entity != null) {
removeEntity(entity);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,20 +278,21 @@ public static void sendChunk(ServerLevel nmsWorld, int chunkX, int chunkZ, boole
return;
}
ChunkPos coordIntPair = new ChunkPos(chunkX, chunkZ);
// UNLOADED_CHUNK
Optional<LevelChunk> optional = ((Either) chunkHolder
.getTickingChunkFuture()
.getNow(ChunkHolder.UNLOADED_LEVEL_CHUNK)).left();
LevelChunk levelChunk;
if (PaperLib.isPaper()) {
// getChunkAtIfLoadedImmediately is paper only
optional = optional.or(() -> Optional.ofNullable(nmsWorld
levelChunk = nmsWorld
.getChunkSource()
.getChunkAtIfLoadedImmediately(chunkX, chunkZ)));
.getChunkAtIfLoadedImmediately(chunkX, chunkZ);
} else {
levelChunk = ((Optional<LevelChunk>) ((Either) chunkHolder
.getTickingChunkFuture() // method is not present with new paper chunk system
.getNow(ChunkHolder.UNLOADED_LEVEL_CHUNK)).left())
.orElse(null);
}
if (optional.isEmpty()) {
if (levelChunk == null) {
return;
}
LevelChunk levelChunk = optional.get();
TaskManager.taskManager().task(() -> {
ClientboundLevelChunkWithLightPacket packet;
if (PaperLib.isPaper()) {
Expand Down Expand Up @@ -589,7 +590,10 @@ static void removeBeacon(BlockEntity beacon, LevelChunk levelChunk) {
}

static List<Entity> getEntities(LevelChunk chunk) {
return chunk.level.entityManager.getEntities(new ChunkPos(chunk.locX, chunk.locZ));
if (PaperLib.isPaper()) {
return Arrays.asList(chunk.entities.getRawData());
}
return chunk.level.entityManager.getEntities(chunk.getPos());
}

record FakeIdMapBlock(int size) implements IdMap<net.minecraft.world.level.block.state.BlockState> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,10 +141,9 @@ public BukkitWorld(World world) {

@Override
public List<com.sk89q.worldedit.entity.Entity> getEntities(Region region) {
//FAWE start - allow async entity retrieval
List<Entity> ents = WorldEditPlugin.getInstance().getBukkitImplAdapter().getEntities(getWorld());
//FAWE end
World world = getWorld();

List<Entity> ents = world.getEntities();
List<com.sk89q.worldedit.entity.Entity> entities = new ArrayList<>();
for (Entity ent : ents) {
if (region.contains(BukkitAdapter.asBlockVector(ent.getLocation()))) {
Expand All @@ -157,9 +156,7 @@ public List<com.sk89q.worldedit.entity.Entity> getEntities(Region region) {
@Override
public List<com.sk89q.worldedit.entity.Entity> getEntities() {
List<com.sk89q.worldedit.entity.Entity> list = new ArrayList<>();
//FAWE start - allow async entity retrieval
for (Entity entity : WorldEditPlugin.getInstance().getBukkitImplAdapter().getEntities(getWorld())) {
//FAWE end
for (Entity entity : getWorld().getEntities()) {
list.add(BukkitAdapter.adapt(entity));
}
return list;
Expand Down

0 comments on commit 5da558e

Please sign in to comment.