9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-06 15:52:03 +00:00

Merge branch 'Xiao-MoMi:dev' into dev

This commit is contained in:
jhqwqmc
2025-05-06 16:50:53 +08:00
committed by GitHub

View File

@@ -52,7 +52,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
public static void init() { public static void init() {
Settings.settings().EXTENT.ALLOWED_PLUGINS.add(FastAsyncWorldEditDelegate.class.getCanonicalName()); Settings.settings().EXTENT.ALLOWED_PLUGINS.add(FastAsyncWorldEditDelegate.class.getCanonicalName());
FaweAdapter<?, ?> adapter= (FaweAdapter<?, ?>) WorldEditPlugin.getInstance().getBukkitImplAdapter(); FaweAdapter<?, ?> adapter = (FaweAdapter<?, ?>) WorldEditPlugin.getInstance().getBukkitImplAdapter();
Method ordinalToIbdIDMethod = ReflectionUtils.getDeclaredMethod(CachedBukkitAdapter.class, int.class.arrayType(), new String[]{"getOrdinalToIbdID"}); Method ordinalToIbdIDMethod = ReflectionUtils.getDeclaredMethod(CachedBukkitAdapter.class, int.class.arrayType(), new String[]{"getOrdinalToIbdID"});
try { try {
assert ordinalToIbdIDMethod != null; assert ordinalToIbdIDMethod != null;
@@ -109,23 +109,15 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
@Override @Override
public <T extends BlockStateHolder<T>> boolean setBlock(int x, int y, int z, T block) { public <T extends BlockStateHolder<T>> boolean setBlock(int x, int y, int z, T block) {
try { BaseBlock oldBlockState = getBlock(x, y, z).toBaseBlock();
BaseBlock oldBlockState = getBlock(x, y, z).toBaseBlock(); this.processBlock(x, y, z, block.toBaseBlock(), oldBlockState);
this.processBlock(x, y, z, block.toBaseBlock(), oldBlockState);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e);
}
return super.setBlock(x, y, z, block); return super.setBlock(x, y, z, block);
} }
@Override @Override
public <T extends BlockStateHolder<T>> boolean setBlock(BlockVector3 position, T block) { public <T extends BlockStateHolder<T>> boolean setBlock(BlockVector3 position, T block) {
try { BaseBlock oldBlockState = getBlock(position).toBaseBlock();
BaseBlock oldBlockState = getBlock(position).toBaseBlock(); this.processBlock(position.x(), position.y(), position.z(), block.toBaseBlock(), oldBlockState);
this.processBlock(position.x(), position.y(), position.z(), block.toBaseBlock(), oldBlockState);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e);
}
return super.setBlock(position, block); return super.setBlock(position, block);
} }
@@ -136,37 +128,37 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
} }
private void processBlocks(Iterable<BlockVector3> region, Pattern pattern) { private void processBlocks(Iterable<BlockVector3> region, Pattern pattern) {
try { for (BlockVector3 position : region) {
for (BlockVector3 position : region) { BaseBlock blockState = pattern.applyBlock(position);
BaseBlock blockState = pattern.applyBlock(position); BaseBlock oldBlockState = getBlock(position).toBaseBlock();
BaseBlock oldBlockState = getBlock(position).toBaseBlock(); int blockX = position.x();
int blockX = position.x(); int blockY = position.y();
int blockY = position.y(); int blockZ = position.z();
int blockZ = position.z(); this.processBlock(blockX, blockY, blockZ, blockState, oldBlockState);
this.processBlock(blockX, blockY, blockZ, blockState, oldBlockState);
}
saveAllChunks();
} catch (Exception e) {
CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e);
} }
saveAllChunks();
} }
private void processBlock(int blockX, int blockY, int blockZ, BaseBlock newBlock, BaseBlock oldBlock) throws IOException { private void processBlock(int blockX, int blockY, int blockZ, BaseBlock newBlock, BaseBlock oldBlock) {
int chunkX = blockX >> 4; int chunkX = blockX >> 4;
int chunkZ = blockZ >> 4; int chunkZ = blockZ >> 4;
int newStateId = ordinalToIbdID[newBlock.getOrdinal()]; int newStateId = ordinalToIbdID[newBlock.getOrdinal()];
int oldStateId = ordinalToIbdID[oldBlock.getOrdinal()]; int oldStateId = ordinalToIbdID[oldBlock.getOrdinal()];
CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId); //CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId);
if (BlockStateUtils.isVanillaBlock(newStateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return; if (BlockStateUtils.isVanillaBlock(newStateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return;
CEChunk ceChunk = Optional.ofNullable(this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ)) try {
.orElse(this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ))); CEChunk ceChunk = Optional.ofNullable(this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ))
ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(newStateId); .orElse(this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ)));
if (immutableBlockState == null) { ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(newStateId);
ceChunk.setBlockState(blockX, blockY, blockZ, EmptyBlock.STATE); if (immutableBlockState == null) {
} else { ceChunk.setBlockState(blockX, blockY, blockZ, EmptyBlock.STATE);
ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); } else {
ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState);
}
this.chunksToSave.add(ceChunk);
} catch (IOException e) {
CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation blocks", e);
} }
this.chunksToSave.add(ceChunk);
} }
private void saveAllChunks() { private void saveAllChunks() {
@@ -176,7 +168,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true);
} }
this.chunksToSave.clear(); this.chunksToSave.clear();
} catch (Exception e) { } catch (IOException e) {
CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e); CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e);
} }
} }