From ba4e0ec9b80726cec9527353392d8aeeb408d106 Mon Sep 17 00:00:00 2001 From: HarvelsX Date: Thu, 16 Dec 2021 16:44:22 +0300 Subject: [PATCH] Fix async execution native sync advancements; --- .../husksync/bukkit/util/PlayerSetter.java | 31 ++++++++++--------- .../bukkit/util/nms/AdvancementUtils.java | 12 +++++++ 2 files changed, 28 insertions(+), 15 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 765f5274..22007767 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 @@ -163,21 +163,21 @@ public class PlayerSetter { ArrayList advancementRecords = DataSerializer.deserializeAdvancementData(data.getSerializedAdvancements()); - if (Settings.useNativeImplementation) { - 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 {0}. Please disable using native implementation!", Bukkit.getVersion()); - - Settings.useNativeImplementation = false; - setPlayerAdvancements(player, advancementRecords, data); - plugin.getLogger().fine(e.toString()); - e.printStackTrace(); - } - } + 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 {0}. Please disable using native implementation!", Bukkit.getVersion()); + + Settings.useNativeImplementation = false; + setPlayerAdvancements(player, advancementRecords, data); + plugin.getLogger().fine(e.toString()); + } + }); else setPlayerAdvancements(player, advancementRecords, data); } if (Settings.syncInventories) { @@ -316,6 +316,7 @@ public class PlayerSetter { AdvancementUtils.startProgress(playerAdvancements, advancement, nativeAdvancementProgress); }); + AdvancementUtils.markPlayerAdvancementsFirst(playerAdvancements); AdvancementUtils.ensureAllVisible(playerAdvancements); } diff --git a/bukkit/src/main/java/me/william278/husksync/bukkit/util/nms/AdvancementUtils.java b/bukkit/src/main/java/me/william278/husksync/bukkit/util/nms/AdvancementUtils.java index b7be6122..c64ada2d 100644 --- a/bukkit/src/main/java/me/william278/husksync/bukkit/util/nms/AdvancementUtils.java +++ b/bukkit/src/main/java/me/william278/husksync/bukkit/util/nms/AdvancementUtils.java @@ -16,6 +16,7 @@ public class AdvancementUtils { private final static Field PLAYER_ADVANCEMENTS; private final static Field CRITERIA_MAP; private final static Field CRITERIA_DATE; + private final static Field IS_FIRST_PACKET; private final static Method GET_HANDLE; private final static Method START_PROGRESS; @@ -51,6 +52,17 @@ public class AdvancementUtils { ENSURE_ALL_VISIBLE = ThrowSupplier.get(() -> PLAYER_ADVANCEMENTS.getDeclaredMethod("c")); ENSURE_ALL_VISIBLE.setAccessible(true); + + IS_FIRST_PACKET = ThrowSupplier.get(() -> PLAYER_ADVANCEMENTS.getDeclaredField("n")); + IS_FIRST_PACKET.setAccessible(true); + } + + public static void markPlayerAdvancementsFirst(Object playerAdvancements) { + try { + IS_FIRST_PACKET.set(playerAdvancements, true); + } catch (IllegalAccessException e) { + throw new RuntimeException(e.getMessage(), e); + } } public static Object getPlayerAdvancements (Player player) {