From 2b7b218bd3f5ebc0d0948b794b5468fc6b4ce039 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 3 May 2025 14:42:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B9=E5=9D=97=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../worldedit/FastAsyncWorldEditDelegate.java | 36 ++++++++++--------- .../bukkit/world/BukkitBlockInWorld.java | 22 +++++++++++- .../core/font/AbstractFontManager.java | 6 ++++ .../resolution/ResolutionMergeAltas.java | 6 ++-- .../craftengine/core/util/CharacterUtils.java | 3 +- .../parameter/BlockParameterProvider.java | 12 ++++--- .../context/parameter/BlockParameters.java | 1 - .../craftengine/core/world/BlockInWorld.java | 5 +++ gradle.properties | 4 +-- 9 files changed, 66 insertions(+), 29 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 53987af76..1adf0be83 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 @@ -11,11 +11,13 @@ import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.eventbus.Subscribe; +import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockStateHolder; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.world.CEWorld; import net.momirealms.craftengine.core.world.ChunkPos; @@ -24,20 +26,21 @@ import org.bukkit.Bukkit; import java.io.IOException; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import static java.util.Objects.requireNonNull; public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { - private final Set needSaveChunks; + private final Set chunksToSave; private final CEWorld ceWorld; protected FastAsyncWorldEditDelegate(EditSessionEvent event) { super(event.getExtent()); - this.needSaveChunks = new HashSet<>(); - var weWorld = event.getWorld(); - var world = Bukkit.getWorld(requireNonNull(weWorld).getName()); - var ceWorld = CraftEngine.instance().worldManager().getWorld(requireNonNull(world).getUID()); + this.chunksToSave = new HashSet<>(); + World weWorld = event.getWorld(); + org.bukkit.World world = Bukkit.getWorld(requireNonNull(weWorld).getName()); + CEWorld ceWorld = CraftEngine.instance().worldManager().getWorld(requireNonNull(world).getUID()); this.ceWorld = requireNonNull(ceWorld); } @@ -65,7 +68,6 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { return super.setBlocks(region, pattern); } - @Override public > int setBlocks(final Region region, final B block) { this.processBlocks(region, block); @@ -77,6 +79,7 @@ public class FastAsyncWorldEditDelegate extends AbstractDelegateExtent { this.processBlocks(region, pattern); return super.replaceBlocks(region, mask, pattern); } + @Override public > int replaceBlocks(final Region region, final Set filter, final B replacement) { this.processBlocks(region, replacement); @@ -136,28 +139,27 @@ 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 stateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); - int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); - if (BlockStateUtils.isVanillaBlock(stateId) && BlockStateUtils.isVanillaBlock(oldStateId)) return; - var ceChunk = this.ceWorld.getChunkAtIfLoaded(chunkX, chunkZ); - if (ceChunk == null) { - ceChunk = this.ceWorld.worldDataStorage().readChunkAt(this.ceWorld, new ChunkPos(chunkX, chunkZ)); - } - var immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); + int newStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(blockState.getAsString())); +// int oldStateId = BlockStateUtils.blockDataToId(Bukkit.createBlockData(oldBlockState.getAsString())); + 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); if (immutableBlockState == null) { ceChunk.setBlockState(blockX, blockY, blockZ, EmptyBlock.STATE); } else { ceChunk.setBlockState(blockX, blockY, blockZ, immutableBlockState); } - this.needSaveChunks.add(ceChunk); + this.chunksToSave.add(ceChunk); } private void saveAllChunks() { try { - for (CEChunk ceChunk : this.needSaveChunks) { + for (CEChunk ceChunk : this.chunksToSave) { this.ceWorld.worldDataStorage().writeChunkAt(ceChunk.chunkPos(), ceChunk, true); } - this.needSaveChunks.clear(); + this.chunksToSave.clear(); } catch (Exception e) { CraftEngine.instance().logger().warn("Error when recording FastAsyncWorldEdit operation chunks", e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java index 7411024be..e765f16c2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitBlockInWorld.java @@ -1,10 +1,12 @@ package net.momirealms.craftengine.bukkit.world; +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.behavior.BlockItemBehavior; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.block.ImmutableBlockState; @@ -78,7 +80,25 @@ public class BukkitBlockInWorld implements BlockInWorld { return this.block.getZ(); } + @Override + public String getAsString() { + ImmutableBlockState state = CraftEngineBlocks.getCustomBlockState(this.block); + if (state != null) { + return state.toString(); + } + return this.block.getBlockData().getAsString(); + } + + @Override + public Key owner() { + ImmutableBlockState state = CraftEngineBlocks.getCustomBlockState(this.block); + if (state != null) { + return state.owner().value().id(); + } + return KeyUtils.namespacedKey2Key(this.block.getType().getKey()); + } + public Block block() { - return block; + return this.block; } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java index bbb3d4b25..325c63b9b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/font/AbstractFontManager.java @@ -454,11 +454,17 @@ public abstract class AbstractFontManager implements FontManager { return it.toCharArray(); } }).toList(); + if (chars.isEmpty()) { + throw new LocalizedResourceConfigException("warning.config.image.missing_char", path, id); + } } else { if (charsObj instanceof Integer integer) { chars = List.of(new char[]{(char) integer.intValue()}); } else { String character = charsObj.toString(); + if (character.isEmpty()) { + throw new LocalizedResourceConfigException("warning.config.image.missing_char", path, id); + } if (character.length() == 1) { chars = List.of(character.toCharArray()); } else { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java index 6f75bbb4d..b5c75a1b6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionMergeAltas.java @@ -27,18 +27,18 @@ public class ResolutionMergeAltas implements Resolution { JsonArray ja3 = new JsonArray(); HashSet elements = new HashSet<>(); for (JsonElement je : ja1) { - if (elements.add(je.getAsString())) { + if (elements.add(je.toString())) { ja3.add(je); } } for (JsonElement je : ja2) { - if (elements.add(je.getAsString())) { + if (elements.add(je.toString())) { ja3.add(je); } } j3.add("sources", ja3); GsonHelper.writeJsonFile(j3, existing.path()); - } catch (IOException e) { + } catch (Exception e) { CraftEngine.instance().logger().severe("Failed to merge json when resolving file conflicts", e); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java index 940274bba..7e5e154da 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java @@ -6,6 +6,7 @@ import java.util.regex.Pattern; import java.util.stream.IntStream; public class CharacterUtils { + private static final Pattern PATTERN = Pattern.compile("[\\p{Mn}\\p{Me}\\p{Mc}\\p{Cf}]"); private CharacterUtils() {} @@ -87,7 +88,7 @@ public class CharacterUtils { type == Character.CONTROL || type == Character.SURROGATE || type == Character.PRIVATE_USE || - Pattern.compile("[\\p{Mn}\\p{Me}\\p{Mc}\\p{Cf}]").matcher(new String(Character.toChars(codePoint))).find() + PATTERN.matcher(new String(Character.toChars(codePoint))).find() ) return true; if (i < input.length()) { int nextCodePoint = input.codePointAt(i); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java index 243cb585f..7f9f91872 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameterProvider.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.core.util.context.parameter; -import net.momirealms.craftengine.core.util.MCUtils; import net.momirealms.craftengine.core.util.context.ContextKey; import net.momirealms.craftengine.core.util.context.LazyContextParameterProvider; import net.momirealms.craftengine.core.world.BlockInWorld; @@ -15,9 +14,14 @@ import java.util.function.Function; public class BlockParameterProvider implements LazyContextParameterProvider { private static final Map, Function> CONTEXT_FUNCTIONS = new HashMap<>(); static { - CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_X, b -> MCUtils.fastFloor(b.x())); - CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Y, b -> MCUtils.fastFloor(b.y())); - CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Z, b -> MCUtils.fastFloor(b.z())); + CONTEXT_FUNCTIONS.put(BlockParameters.X, BlockInWorld::x); + CONTEXT_FUNCTIONS.put(BlockParameters.Y, BlockInWorld::y); + CONTEXT_FUNCTIONS.put(BlockParameters.Z, BlockInWorld::z); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_X, BlockInWorld::x); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Y, BlockInWorld::y); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_Z, BlockInWorld::z); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_OWNER, BlockInWorld::owner); + CONTEXT_FUNCTIONS.put(BlockParameters.BLOCK_STATE, BlockInWorld::getAsString); } private final BlockInWorld block; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java index 6ccdf1ec9..b724ef86d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/parameter/BlockParameters.java @@ -17,5 +17,4 @@ public final class BlockParameters { public static final ContextKey BLOCK_Z = new ContextKey<>(Key.of("craftengine:block.block_z")); public static final ContextKey BLOCK_STATE = new ContextKey<>(Key.of("craftengine:block.state")); public static final ContextKey BLOCK_OWNER = new ContextKey<>(Key.of("craftengine:block.owner")); - } diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java b/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java index 192d2c984..2b38da29f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/BlockInWorld.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.world; import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.util.Key; public interface BlockInWorld { @@ -12,6 +13,10 @@ public interface BlockInWorld { return false; } + Key owner(); + + String getAsString(); + int x(); int y(); diff --git a/gradle.properties b/gradle.properties index 30c9a5e26..d511d872d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.53-beta.1 +project_version=0.0.53-beta.2 config_version=31 lang_version=10 project_group=net.momirealms @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.15 -nms_helper_version=0.64.3 +nms_helper_version=0.64.4 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 amazon_awssdk_eventstream_version=1.0.1