From 3301a77ea977c89cf52f8d2d6573d98e39996557 Mon Sep 17 00:00:00 2001 From: J3fftw <44972470+J3fftw1@users.noreply.github.com> Date: Sat, 17 Feb 2024 19:32:00 +0100 Subject: [PATCH] fix dupe glitch with backpacks (#4134) --- .../slimefun4/api/player/PlayerProfile.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerProfile.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerProfile.java index 00cacd4cd9..8dfc7414f8 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerProfile.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/player/PlayerProfile.java @@ -394,12 +394,18 @@ public static boolean get(@Nonnull OfflinePlayer p, @Nonnull Consumer { PlayerData data = Slimefun.getPlayerStorage().loadPlayerData(p.getUniqueId()); - loading.remove(uuid); AsyncProfileLoadEvent event = new AsyncProfileLoadEvent(new PlayerProfile(p, data)); Bukkit.getPluginManager().callEvent(event); Slimefun.getRegistry().getPlayerProfiles().put(uuid, event.getProfile()); + + // Make sure we call this after we put the PlayerProfile into the registry. + // Otherwise, we end up with a race condition where the profile is not in the map just _yet_ + // but the loading flag is gone and we can end up loading it a second time (and thus can dupe items) + // Fixes https://github.com/Slimefun/Slimefun4/issues/4130 + loading.remove(uuid); + callback.accept(event.getProfile()); }); @@ -434,10 +440,15 @@ public static boolean request(@Nonnull OfflinePlayer p) { // Should probably prevent multiple requests for the same profile in the future Slimefun.getThreadService().newThread(Slimefun.instance(), "PlayerProfile#request(" + uuid + ")", () -> { PlayerData data = Slimefun.getPlayerStorage().loadPlayerData(uuid); - loading.remove(uuid); PlayerProfile pp = new PlayerProfile(p, data); Slimefun.getRegistry().getPlayerProfiles().put(uuid, pp); + + // Make sure we call this after we put the PlayerProfile into the registry. + // Otherwise, we end up with a race condition where the profile is not in the map just _yet_ + // but the loading flag is gone and we can end up loading it a second time (and thus can dupe items) + // Fixes https://github.com/Slimefun/Slimefun4/issues/4130 + loading.remove(uuid); }); return false;