From f7424d10e07ee3337c55a50351e8e9a30827867e Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Fri, 7 Feb 2025 15:55:28 +0800 Subject: [PATCH] fix: energy regulator broken randomly When energy network refreshing its children and unloaded universal data exists, random machine will stopped by error reporter --- .../controller/BlockDataController.java | 25 +++++++------ .../SlimefunUniversalBlockData.java | 36 +++++++++++-------- .../controller/SlimefunUniversalData.java | 4 +++ 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java index df2eaecf47..afa98657ce 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/BlockDataController.java @@ -248,8 +248,6 @@ public SlimefunUniversalBlockData createUniversalBlock(Location l, String sfId) var uuid = UUID.randomUUID(); var uniData = new SlimefunUniversalBlockData(uuid, sfId, l); - uniData.setIsDataLoaded(true); - uniData.initLastPresent(); loadedUniversalData.put(uuid, uniData); @@ -267,6 +265,8 @@ public SlimefunUniversalBlockData createUniversalBlock(Location l, String sfId) .getBlockDataController() .saveUniversalData(uuid, sfId, Set.of(UniversalDataTrait.BLOCK, UniversalDataTrait.INVENTORY)); + uniData.setIsDataLoaded(true); + return uniData; } @@ -541,13 +541,16 @@ public void getUniversalBlockData(@Nonnull UUID uuid, IAsyncReadCallback getUniversalBlockDataFromCache(@Nonnull Location l) { checkDestroy(); + for (SlimefunUniversalData uniData : loadedUniversalData.values()) { + if (uniData instanceof SlimefunUniversalBlockData ubd + && ubd.isDataLoaded() + && ubd.getLastPresent() != null + && l.equals(ubd.getLastPresent().toLocation())) { + return Optional.of(ubd); + } + } - return loadedUniversalData.values().stream() - .filter(uniData -> uniData instanceof SlimefunUniversalBlockData ubd - && ubd.getLastPresent() != null - && l.equals(ubd.getLastPresent().toLocation())) - .map(data -> (SlimefunUniversalBlockData) data) - .findFirst(); + return Optional.empty(); } /** @@ -727,7 +730,7 @@ public void loadUniversalRecord() { ? new SlimefunUniversalBlockData(uuid, sfId) : new SlimefunUniversalData(uuid, sfId); - traits.forEach(t -> uniData.getTraits().add(t)); + traits.forEach(uniData::addTrait); scheduleReadTask(() -> loadUniversalData(uniData)); }); @@ -857,8 +860,6 @@ public void loadUniversalData(SlimefunUniversalData uniData) { DataUtils.blockDataDebase64(recordSet.get(FieldKey.DATA_VALUE)), false)); - uniData.setIsDataLoaded(true); - loadedUniversalData.putIfAbsent(uniData.getUUID(), uniData); if (uniData.hasTrait(UniversalDataTrait.INVENTORY)) { @@ -902,6 +903,8 @@ public void loadUniversalData(SlimefunUniversalData uniData) { uniData.getUUID()); } } + + uniData.setIsDataLoaded(true); } finally { lock.unlock(key); } 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 732e1f5155..e0c8b7265a 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 @@ -38,6 +38,10 @@ public void setLastPresent(Location l) { } public BlockPosition getLastPresent() { + if (!isDataLoaded()) { + return null; + } + var data = getData(UniversalDataTrait.BLOCK.getReservedKey()); if (lastPresent != null) { @@ -60,22 +64,26 @@ public BlockPosition getLastPresent() { } // 修复因使用不一致的文本转换导致的位置无法解析 - 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); - } + oldLocationFix(data); } return lastPresent; } + + private void oldLocationFix(String data) { + 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())); + + lastPresent = bp; + } catch (Exception x) { + throw new RuntimeException("Unable to fix location " + data + ", it might be broken", x); + } + } } diff --git a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalData.java b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalData.java index baf6d59829..678c90822c 100644 --- a/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalData.java +++ b/src/main/java/com/xzavier0722/mc/plugin/slimefun4/storage/controller/SlimefunUniversalData.java @@ -81,6 +81,10 @@ public UUID getUUID() { return UUID.fromString(getKey()); } + public void addTrait(UniversalDataTrait trait) { + traits.add(trait); + } + public boolean hasTrait(UniversalDataTrait trait) { return traits.contains(trait); }