diff --git a/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java b/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java index 93af6963..7670bf49 100644 --- a/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java +++ b/bukkit/src/main/java/net/william278/husksync/data/BukkitData.java @@ -45,6 +45,7 @@ import org.bukkit.inventory.EquipmentSlotGroup; //#endif import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.plugin.Plugin; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.jetbrains.annotations.NotNull; @@ -567,6 +568,14 @@ public abstract class BukkitData implements Data { @NotNull public static BukkitData.Attributes adapt(@NotNull Player player, @NotNull HuskSync plugin) { + if (!Bukkit.isPrimaryThread()) { + try { + return Bukkit.getScheduler().callSyncMethod((Plugin) plugin, () -> adapt(player, plugin)).get(); + } catch (Exception e) { + throw new IllegalStateException("Failed to adapt attributes on main thread", e); + } + } + final List attributes = Lists.newArrayList(); final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes(); Registry.ATTRIBUTE.forEach(id -> { @@ -665,6 +674,15 @@ public abstract class BukkitData implements Data { @Override public void apply(@NotNull BukkitUser user, @NotNull BukkitHuskSync plugin) throws IllegalStateException { + if (!Bukkit.isPrimaryThread()) { + try { + Bukkit.getScheduler().callSyncMethod(plugin, () -> { this.apply(user, plugin); return null; }).get(); + return; + } catch (Exception e) { + throw new IllegalStateException("Failed to apply attributes on main thread", e); + } + } + final AttributeSettings settings = plugin.getSettings().getSynchronization().getAttributes(); Registry.ATTRIBUTE.forEach(id -> { if (settings.isIgnoredAttribute(id.getKey().toString())) {