Skip to content

Commit

Permalink
fix(uni): retrieve data only from main thread (#979)
Browse files Browse the repository at this point in the history
  • Loading branch information
StarWishsama committed Dec 8, 2024
1 parent 2189558 commit f24b660
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 22 deletions.
16 changes: 0 additions & 16 deletions src/main/java/city/norain/slimefun4/utils/ClassUtil.java

This file was deleted.

29 changes: 29 additions & 0 deletions src/main/java/city/norain/slimefun4/utils/TaskUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package city.norain.slimefun4.utils;

import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import lombok.SneakyThrows;
import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit;

@UtilityClass
public class TaskUtil {
@SneakyThrows
public <T> T runSyncMethod(Callable<T> callable) {
if (Bukkit.isPrimaryThread()) {
return callable.call();
} else {
try {
return Bukkit.getScheduler()
.callSyncMethod(Slimefun.instance(), callable)
.get(1, TimeUnit.SECONDS);
} catch (TimeoutException e) {
Slimefun.logger().log(Level.WARNING, "Timeout when executing sync method", e);
return null;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,10 @@ public void removeBlock(Location l) {
Slimefun.getBlockDataService()
.getUniversalDataUUID(l.getBlock())
.ifPresent(uuid -> removeUniversalBlockData(uuid, l));
} else {
Slimefun.runSync(() -> Slimefun.getBlockDataService()
.getUniversalDataUUID(l.getBlock())
.ifPresent(uuid -> removeUniversalBlockData(uuid, l)));
}
});

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.xzavier0722.mc.plugin.slimefun4.storage.util;

import city.norain.slimefun4.api.menu.UniversalMenu;
import city.norain.slimefun4.utils.TaskUtil;
import com.google.common.base.Preconditions;
import com.xzavier0722.mc.plugin.slimefun4.storage.callback.IAsyncReadCallback;
import com.xzavier0722.mc.plugin.slimefun4.storage.controller.ADataContainer;
Expand Down Expand Up @@ -37,7 +38,9 @@ public static boolean hasBlock(Location l) {

@ParametersAreNonnullByDefault
public static boolean hasUniversalBlock(Location l) {
return Slimefun.getBlockDataService().getUniversalDataUUID(l.getBlock()).isPresent();
return TaskUtil.runSyncMethod(() -> Slimefun.getBlockDataService()
.getUniversalDataUUID(l.getBlock())
.isPresent());
}

@ParametersAreNonnullByDefault
Expand Down Expand Up @@ -162,9 +165,11 @@ public static void removeData(Location loc, String key) {
*/
@ParametersAreNonnullByDefault
@Nullable public static SlimefunUniversalBlockData getUniversalBlock(Block block) {
var uuid = Slimefun.getBlockDataService().getUniversalDataUUID(block);
return TaskUtil.runSyncMethod(() -> {
var uuid = Slimefun.getBlockDataService().getUniversalDataUUID(block);

return uuid.map(id -> getUniversalBlock(id, block.getLocation())).orElse(null);
return uuid.map(id -> getUniversalBlock(id, block.getLocation())).orElse(null);
});
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public ErrorReport(T throwable, Location l, SlimefunItem item) {
Slimefun.getDatabaseManager().getBlockDataController().getBlockData(l);

if (blockData == null) {
Slimefun.getBlockDataService()
Slimefun.runSync(() -> Slimefun.getBlockDataService()
.getUniversalDataUUID(l.getBlock())
.ifPresentOrElse(
uuid -> {
Expand All @@ -127,7 +127,7 @@ public ErrorReport(T throwable, Location l, SlimefunItem item) {
stream.println("该方块没有任何数据.");
}
},
() -> stream.println("该方块没有任何数据."));
() -> stream.println("该方块没有任何数据.")));
} else {
stream.println(" 数据加载状态: " + blockData.isDataLoaded());
stream.println(" 物品栏: " + (blockData.getBlockMenu() != null));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import city.norain.slimefun4.api.menu.UniversalMenu;
import city.norain.slimefun4.api.menu.UniversalMenuPreset;
import city.norain.slimefun4.utils.TaskUtil;
import com.xzavier0722.mc.plugin.slimefun4.storage.controller.SlimefunUniversalBlockData;
import com.xzavier0722.mc.plugin.slimefun4.storage.controller.SlimefunUniversalData;
import com.xzavier0722.mc.plugin.slimefun4.storage.controller.attributes.UniversalBlock;
Expand Down Expand Up @@ -989,7 +990,8 @@ public boolean onClick(
public void addItems(Block b, ItemStack... items) {
Validate.notNull(b, "The Block cannot be null.");

Optional<UUID> uuid = Slimefun.getBlockDataService().getUniversalDataUUID(b);
Optional<UUID> uuid =
TaskUtil.runSyncMethod(() -> Slimefun.getBlockDataService().getUniversalDataUUID(b));

if (uuid.isEmpty()) {
throw new IllegalStateException("Android missing uuid");
Expand Down

0 comments on commit f24b660

Please sign in to comment.