From 4da3707d0fcd7012e2962e0fe93b866381be7628 Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Thu, 26 Dec 2024 12:54:08 +0800 Subject: [PATCH] fix: inconsistent location converter used --- .../SlimefunUniversalBlockData.java | 31 ++++++++++++++++--- .../slimefun4/storage/util/LocationUtils.java | 24 +++++++++++++- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalBlockData.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalBlockData.java index 2413d615ee..732e1f5155 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalBlockData.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalBlockData.java @@ -4,6 +4,7 @@ import com.xzavier0722.mc.plugin.slimefun4.storage.util.LocationUtils; import io.github.bakedlibs.dough.blocks.BlockPosition; import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.Location; public class SlimefunUniversalBlockData extends SlimefunUniversalData { @@ -24,11 +25,11 @@ public SlimefunUniversalBlockData(UUID uuid, String sfId, Location present) { } public void initLastPresent() { - setTraitData(UniversalDataTrait.BLOCK, LocationUtils.locationToString(lastPresent.toLocation())); + setTraitData(UniversalDataTrait.BLOCK, LocationUtils.getLocKey(lastPresent.toLocation())); } public void setLastPresent(BlockPosition lastPresent) { - setTraitData(UniversalDataTrait.BLOCK, LocationUtils.locationToString(lastPresent.toLocation())); + setTraitData(UniversalDataTrait.BLOCK, LocationUtils.getLocKey(lastPresent.toLocation())); this.lastPresent = lastPresent; } @@ -41,7 +42,7 @@ public BlockPosition getLastPresent() { if (lastPresent != null) { if (data == null) { - setTraitData(UniversalDataTrait.BLOCK, LocationUtils.locationToString(lastPresent.toLocation())); + setTraitData(UniversalDataTrait.BLOCK, LocationUtils.getLocKey(lastPresent.toLocation())); } return lastPresent; @@ -51,7 +52,29 @@ public BlockPosition getLastPresent() { return null; } - lastPresent = new BlockPosition(LocationUtils.toLocation(data)); + try { + lastPresent = new BlockPosition(LocationUtils.toLocation(data)); + } catch (RuntimeException e) { + if (data.isEmpty()) { + return null; + } + + // 修复因使用不一致的文本转换导致的位置无法解析 + try { + var lArr = data.split(","); + var bp = new BlockPosition( + Bukkit.getWorld(lArr[0].replace("[world=", "")), + (int) Double.parseDouble(lArr[1].replace("x=", "")), + (int) Double.parseDouble(lArr[2].replace("y=", "")), + (int) Double.parseDouble(lArr[3].replace("z=", "").replace("]", ""))); + + setTraitData(UniversalDataTrait.BLOCK, LocationUtils.getLocKey(bp.toLocation())); + + return bp; + } catch (Exception x) { + throw new RuntimeException("Unable to fix location " + data + ", it might be broken", x); + } + } return lastPresent; } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/util/LocationUtils.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/util/LocationUtils.java index c4f72a6370..56c7a34153 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/util/LocationUtils.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/util/LocationUtils.java @@ -7,10 +7,24 @@ import org.bukkit.World; public class LocationUtils { + /** + * 将 {@link Location} 转换为数据库中使用的 + * 标准格式位置信息 + * + * @param l {@link Location} + * @return 标准化后的位置信息字符串 + */ public static String getLocKey(Location l) { return l.getWorld().getName() + ";" + l.getBlockX() + ":" + l.getBlockY() + ":" + l.getBlockZ(); } + /** + * 将 {@link Chunk} 转换为数据库中使用的 + * 标准格式区块信息 + * + * @param chunk {@link Chunk} + * @return 标准化后的区块信息字符串 + */ public static String getChunkKey(Chunk chunk) { return chunk.getWorld().getName() + ";" + chunk.getX() + ":" + chunk.getZ(); } @@ -59,9 +73,17 @@ public static boolean isSameWorld(World w1, World w2) { return w1.getName().equals(w2.getName()); } + /** + * 将位置转换为易读的文本 + * + * 注意: 请不要将其用于数据库转换过程中! + * + * @param location 位置 + * @return 易读的位置文本 + */ public static String locationToString(Location location) { if (location == null) { - return ""; + return "null"; } return "[world="