Fixed ConcurrentModificationException in native sync advancements;

Iterators are evil and should be banned! :)
feat/data-edit-commands
Harvels X 3 years ago
parent 748458af78
commit af4729ac87
No known key found for this signature in database
GPG Key ID: 9637BCFE856BB8F3

@ -162,20 +162,18 @@ public class PlayerSetter {
= DataSerializer.deserializeAdvancementData(data.getSerializedAdvancements()); = DataSerializer.deserializeAdvancementData(data.getSerializedAdvancements());
if (Settings.useNativeImplementation) { if (Settings.useNativeImplementation) {
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { try {
try { nativeSyncPlayerAdvancements(player, advancementRecords);
nativeSyncPlayerAdvancements(player, advancementRecords); } catch (Exception e) {
} catch (Exception e) { plugin.getLogger().log(Level.WARNING,
plugin.getLogger().log(Level.WARNING, "Your server does not support a native implementation of achievements synchronization");
"Your server does not support a native implementation of achievements synchronization"); plugin.getLogger().log(Level.WARNING,
plugin.getLogger().log(Level.WARNING, "Your server version is {0}. Please disable using native implementation!", Bukkit.getVersion());
"Your server version is {0}. Please disable using native implementation!", Bukkit.getVersion());
Settings.useNativeImplementation = false;
Settings.useNativeImplementation = false; setPlayerAdvancements(player, advancementRecords, data);
setPlayerAdvancements(player, advancementRecords, data); plugin.getLogger().log(Level.SEVERE, e.getMessage(), e);
plugin.getLogger().log(Level.SEVERE, e.getMessage(), e); }
}
});
} else { } else {
setPlayerAdvancements(player, advancementRecords, data); setPlayerAdvancements(player, advancementRecords, data);
} }
@ -282,7 +280,7 @@ public class PlayerSetter {
final Object playerAdvancements = AdvancementUtils.getPlayerAdvancements(player); final Object playerAdvancements = AdvancementUtils.getPlayerAdvancements(player);
// Clear // Clear
AdvancementUtils.clearPlayerAdvancements(playerAdvancements); AdvancementUtils.clearPlayerAdvancements(playerAdvancements);
AdvancementUtils.clearVisibleAdvancements(playerAdvancements); AdvancementUtils.clearVisibleAdvancements(playerAdvancements);
advancementRecords.forEach(advancementRecord -> { advancementRecords.forEach(advancementRecord -> {
@ -309,10 +307,8 @@ public class PlayerSetter {
AdvancementUtils.startProgress(playerAdvancements, advancement, nativeAdvancementProgress); AdvancementUtils.startProgress(playerAdvancements, advancement, nativeAdvancementProgress);
} }
}); });
synchronized (playerAdvancements) { AdvancementUtils.ensureAllVisible(playerAdvancements); // Set all completed advancement is visible
AdvancementUtils.ensureAllVisible(playerAdvancements); // Set all completed advancement is visible AdvancementUtils.markPlayerAdvancementsFirst(playerAdvancements); // Mark the sending of visible advancement as the first
AdvancementUtils.markPlayerAdvancementsFirst(playerAdvancements); // Mark the sending of visible advancement as the first
}
} }
/** /**

Loading…
Cancel
Save