9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-04 15:41:38 +00:00

fix(core): 修复非法参数问题

This commit is contained in:
jhqwqmc
2025-05-06 04:19:20 +08:00
parent c61f6c7e1a
commit 3c9651a1b3

View File

@@ -1,8 +1,10 @@
package net.momirealms.craftengine.bukkit.compatibility.worldedit;
import com.fastasyncworldedit.bukkit.adapter.FaweAdapter;
import com.fastasyncworldedit.core.configuration.Settings;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.event.extent.EditSessionEvent;
import com.sk89q.worldedit.extent.AbstractDelegateExtent;
import com.sk89q.worldedit.function.mask.Mask;
@@ -26,14 +28,13 @@ import org.bukkit.Bukkit;
import java.io.IOException;
import java.util.HashSet;
import java.util.Locale;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import static java.util.Objects.requireNonNull;
public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
private final FaweAdapter<?, ?> adapter = (FaweAdapter<?, ?>) WorldEditPlugin.getInstance().getBukkitImplAdapter();
private final Set<CEChunk> chunksToSave;
private final CEWorld ceWorld;
@@ -141,10 +142,10 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
private void processBlock(int blockX, int blockY, int blockZ, BaseBlock blockState, BaseBlock oldBlockState) throws IOException {
int chunkX = blockX >> 4;
int chunkZ = blockZ >> 4;
int newStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(getStringBlockState(blockState)));
// int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString()));
if (BlockStateUtils.isVanillaBlock(newStateId) /* && BlockStateUtils.isVanillaBlock(oldStateId) */)
return;
int newStateId = BlockStateUtils.blockDataToId(this.adapter.adapt(blockState));
int oldStateId = BlockStateUtils.blockDataToId(this.adapter.adapt(oldBlockState));
CraftEngine.instance().debug(() -> "Processing block at " + blockX + ", " + blockY + ", " + blockZ + ": " + oldStateId + " -> " + newStateId);
if (BlockStateUtils.isVanillaBlock(newStateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return;
CEChunk ceChunk = Optional.ofNullable(this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ))
.orElse(this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ)));
ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(newStateId);
@@ -159,6 +160,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
private void saveAllChunks() {
try {
for (CEChunk ceChunk : this.chunksToSave) {
CraftEngine.instance().debug(() -> "Saving chunk " + ceChunk.chunkPos());
this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true);
}
this.chunksToSave.clear();
@@ -166,17 +168,4 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent {
CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e);
}
}
private String getStringBlockState(BaseBlock blockState) {
if (blockState.getStates().isEmpty()) {
return blockState.getBlockType().id();
} else {
String properties = blockState.getStates().entrySet().stream()
.map(entry -> entry.getKey().getName()
+ "="
+ entry.getValue().toString().toLowerCase(Locale.ROOT))
.collect(Collectors.joining(","));
return blockState.getBlockType().id() + "[" + properties + "]";
}
}
}