From af4729ac8798c4251077d4791dee7618a76ab915 Mon Sep 17 00:00:00 2001 From: Harvels X Date: Thu, 6 Jan 2022 03:17:56 +0300 Subject: [PATCH] Fixed ConcurrentModificationException in native sync advancements; Iterators are evil and should be banned! :) --- .../husksync/bukkit/util/PlayerSetter.java | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/bukkit/src/main/java/me/william278/husksync/bukkit/util/PlayerSetter.java b/bukkit/src/main/java/me/william278/husksync/bukkit/util/PlayerSetter.java index c9e18838..704bad2c 100644 --- a/bukkit/src/main/java/me/william278/husksync/bukkit/util/PlayerSetter.java +++ b/bukkit/src/main/java/me/william278/husksync/bukkit/util/PlayerSetter.java @@ -162,20 +162,18 @@ public class PlayerSetter { = DataSerializer.deserializeAdvancementData(data.getSerializedAdvancements()); if (Settings.useNativeImplementation) { - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - try { - nativeSyncPlayerAdvancements(player, advancementRecords); - } catch (Exception e) { - plugin.getLogger().log(Level.WARNING, - "Your server does not support a native implementation of achievements synchronization"); - plugin.getLogger().log(Level.WARNING, - "Your server version is {0}. Please disable using native implementation!", Bukkit.getVersion()); - - Settings.useNativeImplementation = false; - setPlayerAdvancements(player, advancementRecords, data); - plugin.getLogger().log(Level.SEVERE, e.getMessage(), e); - } - }); + try { + nativeSyncPlayerAdvancements(player, advancementRecords); + } catch (Exception e) { + plugin.getLogger().log(Level.WARNING, + "Your server does not support a native implementation of achievements synchronization"); + plugin.getLogger().log(Level.WARNING, + "Your server version is {0}. Please disable using native implementation!", Bukkit.getVersion()); + + Settings.useNativeImplementation = false; + setPlayerAdvancements(player, advancementRecords, data); + plugin.getLogger().log(Level.SEVERE, e.getMessage(), e); + } } else { setPlayerAdvancements(player, advancementRecords, data); } @@ -282,7 +280,7 @@ public class PlayerSetter { final Object playerAdvancements = AdvancementUtils.getPlayerAdvancements(player); // Clear - AdvancementUtils.clearPlayerAdvancements(playerAdvancements); + AdvancementUtils.clearPlayerAdvancements(playerAdvancements); AdvancementUtils.clearVisibleAdvancements(playerAdvancements); advancementRecords.forEach(advancementRecord -> { @@ -309,10 +307,8 @@ public class PlayerSetter { AdvancementUtils.startProgress(playerAdvancements, advancement, nativeAdvancementProgress); } }); - synchronized (playerAdvancements) { - AdvancementUtils.ensureAllVisible(playerAdvancements); // Set all completed advancement is visible - AdvancementUtils.markPlayerAdvancementsFirst(playerAdvancements); // Mark the sending of visible advancement as the first - } + AdvancementUtils.ensureAllVisible(playerAdvancements); // Set all completed advancement is visible + AdvancementUtils.markPlayerAdvancementsFirst(playerAdvancements); // Mark the sending of visible advancement as the first } /**