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:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user