Skip to content

Commit

Permalink
fix: energy regulator broken randomly
Browse files Browse the repository at this point in the history
When energy network refreshing its children and unloaded universal data exists, random machine will stopped by error reporter
  • Loading branch information
StarWishsama committed Feb 7, 2025
1 parent 94467a8 commit f7424d1
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
}

Expand Down Expand Up @@ -541,13 +541,16 @@ public void getUniversalBlockData(@Nonnull UUID uuid, IAsyncReadCallback<Slimefu
*/
public Optional<SlimefunUniversalBlockData> 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();
}

/**
Expand Down Expand Up @@ -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));
});
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -902,6 +903,8 @@ public void loadUniversalData(SlimefunUniversalData uniData) {
uniData.getUUID());
}
}

uniData.setIsDataLoaded(true);
} finally {
lock.unlock(key);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down

0 comments on commit f7424d1

Please sign in to comment.