diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 69d2848a0..d70c984b7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -36,6 +36,7 @@ import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -47,6 +48,7 @@ public class BukkitServerPlayer extends Player { private UUID uuid; private ConnectionState decoderState; private ConnectionState encoderState; + private UUID resourcePackUUID; // some references private Reference playerRef; private Reference serverPlayerRef; @@ -742,9 +744,31 @@ public class BukkitServerPlayer extends Player { this.hasClientMod = enable; } + @Override + public void setCurrentResourcePackUUID(UUID uuid) { + this.resourcePackUUID = uuid; + } + + @Override + public @Nullable UUID currentResourcePackUUID() { + return this.resourcePackUUID; + } + @Override public void clearView() { this.entityTypeView.clear(); this.furnitureView.clear(); } + + @Override + public void unloadCurrentResourcePack() { + if (decoderState() == ConnectionState.PLAY && this.resourcePackUUID != null && VersionHelper.isVersionNewerThan1_20_3()) { + try { + sendPacket(Reflections.constructor$ClientboundResourcePackPopPacket.newInstance(Optional.of(this.resourcePackUUID)), true); + this.resourcePackUUID = null; + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to unload resource pack for player " + name()); + } + } + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index c0814beaf..0af8d0e34 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -82,4 +82,6 @@ public abstract class Player extends Entity implements NetWorkUser { public abstract void closeInventory(); public abstract void clearView(); + + public abstract void unloadCurrentResourcePack(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index 2bf8b725c..2c1ea4b94 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -4,6 +4,7 @@ import io.netty.channel.Channel; import net.momirealms.craftengine.core.plugin.Plugin; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; @@ -50,5 +51,8 @@ public interface NetWorkUser { void setClientModState(boolean enable); - + void setCurrentResourcePackUUID(UUID uuid); + + @Nullable + UUID currentResourcePackUUID(); }