From bdaf9d759febd042a23a16d2e6e9f870c5229c19 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Fri, 2 May 2025 00:29:40 +0800 Subject: [PATCH] =?UTF-8?q?perf(bukkit):=20=E4=BC=98=E5=8C=96=20chunks=20?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java index 5c1a6ca82..02f4c7611 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/worldedit/FastAsyncWorldEditDelegate.java @@ -18,8 +18,12 @@ import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.EmptyBlock; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.bukkit.Bukkit; +import java.util.HashSet; +import java.util.Set; + public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { protected FastAsyncWorldEditDelegate(Extent extent) { super(extent); @@ -51,6 +55,13 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { private void processBlocks(Region region, Pattern pattern) { try { + var weWorld = region.getWorld(); + if (weWorld == null) return; + var world = Bukkit.getWorld(weWorld.getName()); + if (world == null) return; + var ceWorld = CraftEngine.instance().worldManager().getWorld(world.getUID()); + if (ceWorld == null) return; + Set needSaveChunks = new HashSet<>(); for (BlockVector3 position : region) { BaseBlock blockState = pattern.applyBlock(position); BlockState oldBlockState = getBlock(position); @@ -62,15 +73,11 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { int stateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); if (BlockStateUtils.isVanillaBlock(stateId) && BlockStateUtils.isVanillaBlock(oldStateId)) continue; - var weWorld = region.getWorld(); - if (weWorld == null) continue; - var world = Bukkit.getWorld(weWorld.getName()); - if (world == null) continue; - var ceWorld = CraftEngine.instance().worldManager().getWorld(world.getUID()); - if (ceWorld == null) continue; var ceChunk = ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); + boolean needSave = false; if (ceChunk == null) { ceChunk = ceWorld.worldDataStorage().readChunkAt(ceWorld, new ChunkPos(chunkX, chunkZ)); + needSave = true; } var immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); if (immutableBlockState == null) { @@ -78,6 +85,10 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { } else { ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); } + if (needSave) needSaveChunks.add(ceChunk); + } + for (CEChunk ceChunk : needSaveChunks) { + ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); } } catch (Exception e) { CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e);