From 02584503837709e6e0d904ea4662c3d4e97fa07c Mon Sep 17 00:00:00 2001 From: Mqzn Date: Thu, 20 Mar 2025 15:05:58 +0200 Subject: [PATCH] Added skin descriptor fetching by UUID --- .../api/skin/SkinDescriptorFactory.java | 2 + .../pyr/znpcsplus/commands/SkinCommand.java | 4 +- .../conversion/znpcs/ZNpcImporter.java | 4 +- .../znpcsplus/skin/BaseSkinDescriptor.java | 4 +- .../skin/SkinDescriptorFactoryImpl.java | 11 ++++- ...iptor.java => NameFetchingDescriptor.java} | 4 +- .../descriptor/UUIDFetchingDescriptor.java | 41 +++++++++++++++++++ 7 files changed, 60 insertions(+), 10 deletions(-) rename plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/{FetchingDescriptor.java => NameFetchingDescriptor.java} (87%) create mode 100644 plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/UUIDFetchingDescriptor.java diff --git a/api/src/main/java/lol/pyr/znpcsplus/api/skin/SkinDescriptorFactory.java b/api/src/main/java/lol/pyr/znpcsplus/api/skin/SkinDescriptorFactory.java index c5573e7..46d979a 100644 --- a/api/src/main/java/lol/pyr/znpcsplus/api/skin/SkinDescriptorFactory.java +++ b/api/src/main/java/lol/pyr/znpcsplus/api/skin/SkinDescriptorFactory.java @@ -1,6 +1,7 @@ package lol.pyr.znpcsplus.api.skin; import java.net.URL; +import java.util.UUID; /** * Factory for creating skin descriptors. @@ -8,6 +9,7 @@ import java.net.URL; public interface SkinDescriptorFactory { SkinDescriptor createMirrorDescriptor(); SkinDescriptor createRefreshingDescriptor(String playerName); + SkinDescriptor createRefreshingDescriptor(UUID playerUUID); SkinDescriptor createStaticDescriptor(String playerName); SkinDescriptor createStaticDescriptor(String texture, String signature); SkinDescriptor createUrlDescriptor(String url, String variant); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java index 485b866..48fa332 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/SkinCommand.java @@ -11,7 +11,7 @@ import lol.pyr.znpcsplus.npc.NpcImpl; import lol.pyr.znpcsplus.npc.NpcRegistryImpl; import lol.pyr.znpcsplus.npc.NpcTypeRegistryImpl; import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; -import lol.pyr.znpcsplus.skin.descriptor.FetchingDescriptor; +import lol.pyr.znpcsplus.skin.descriptor.NameFetchingDescriptor; import lol.pyr.znpcsplus.skin.descriptor.MirrorDescriptor; import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor; import net.kyori.adventure.text.Component; @@ -67,7 +67,7 @@ public class SkinCommand implements CommandHandler { } else if (type.equalsIgnoreCase("dynamic")) { context.ensureArgsNotEmpty(); String name = context.dumpAllArgs(); - npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new FetchingDescriptor(skinCache, name)); + npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new NameFetchingDescriptor(skinCache, name)); npc.respawn(); context.halt(Component.text("The NPC's skin will now be resolved per-player from \"" + name + "\"")); } else if (type.equalsIgnoreCase("url")) { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java index 604347f..024c66c 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java @@ -25,7 +25,7 @@ import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.skin.SkinImpl; import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; -import lol.pyr.znpcsplus.skin.descriptor.FetchingDescriptor; +import lol.pyr.znpcsplus.skin.descriptor.NameFetchingDescriptor; import lol.pyr.znpcsplus.skin.descriptor.MirrorDescriptor; import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor; import lol.pyr.znpcsplus.util.BungeeConnector; @@ -175,7 +175,7 @@ public class ZNpcImporter implements DataImporter { } if (model.getSkinName() != null) { - npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new FetchingDescriptor(skinCache, model.getSkinName())); + npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new NameFetchingDescriptor(skinCache, model.getSkinName())); } else if (model.getSkin() != null && model.getSignature() != null) { npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new PrefetchedDescriptor(new SkinImpl(model.getSkin(), model.getSignature()))); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/skin/BaseSkinDescriptor.java b/plugin/src/main/java/lol/pyr/znpcsplus/skin/BaseSkinDescriptor.java index 65e6e7d..6d55f62 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/skin/BaseSkinDescriptor.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/skin/BaseSkinDescriptor.java @@ -3,7 +3,7 @@ package lol.pyr.znpcsplus.skin; import com.github.retrooper.packetevents.protocol.player.TextureProperty; import lol.pyr.znpcsplus.api.skin.SkinDescriptor; import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; -import lol.pyr.znpcsplus.skin.descriptor.FetchingDescriptor; +import lol.pyr.znpcsplus.skin.descriptor.NameFetchingDescriptor; import lol.pyr.znpcsplus.skin.descriptor.MirrorDescriptor; import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor; import org.bukkit.entity.Player; @@ -22,7 +22,7 @@ public interface BaseSkinDescriptor extends SkinDescriptor { static BaseSkinDescriptor deserialize(MojangSkinCache skinCache, String str) { String[] arr = str.split(";"); if (arr[0].equalsIgnoreCase("mirror")) return new MirrorDescriptor(skinCache); - else if (arr[0].equalsIgnoreCase("fetching")) return new FetchingDescriptor(skinCache, String.join(";", Arrays.copyOfRange(arr, 1, arr.length))); + else if (arr[0].equalsIgnoreCase("fetching")) return new NameFetchingDescriptor(skinCache, String.join(";", Arrays.copyOfRange(arr, 1, arr.length))); else if (arr[0].equalsIgnoreCase("prefetched")) { List properties = new ArrayList<>(); for (int i = 0; i < (arr.length - 1) / 3; i++) { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/skin/SkinDescriptorFactoryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/skin/SkinDescriptorFactoryImpl.java index b4557e6..10a8cea 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/skin/SkinDescriptorFactoryImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/skin/SkinDescriptorFactoryImpl.java @@ -3,12 +3,14 @@ package lol.pyr.znpcsplus.skin; import lol.pyr.znpcsplus.api.skin.SkinDescriptor; import lol.pyr.znpcsplus.api.skin.SkinDescriptorFactory; import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; -import lol.pyr.znpcsplus.skin.descriptor.FetchingDescriptor; +import lol.pyr.znpcsplus.skin.descriptor.NameFetchingDescriptor; import lol.pyr.znpcsplus.skin.descriptor.MirrorDescriptor; import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor; +import lol.pyr.znpcsplus.skin.descriptor.UUIDFetchingDescriptor; import java.net.MalformedURLException; import java.net.URL; +import java.util.UUID; public class SkinDescriptorFactoryImpl implements SkinDescriptorFactory { private final MojangSkinCache skinCache; @@ -26,7 +28,12 @@ public class SkinDescriptorFactoryImpl implements SkinDescriptorFactory { @Override public SkinDescriptor createRefreshingDescriptor(String playerName) { - return new FetchingDescriptor(skinCache, playerName); + return new NameFetchingDescriptor(skinCache, playerName); + } + + @Override + public SkinDescriptor createRefreshingDescriptor(UUID playerUUID) { + return new UUIDFetchingDescriptor(skinCache, playerUUID); } @Override diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/FetchingDescriptor.java b/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/NameFetchingDescriptor.java similarity index 87% rename from plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/FetchingDescriptor.java rename to plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/NameFetchingDescriptor.java index d99ad2c..00d4521 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/FetchingDescriptor.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/NameFetchingDescriptor.java @@ -9,11 +9,11 @@ import org.bukkit.entity.Player; import java.util.concurrent.CompletableFuture; -public class FetchingDescriptor implements BaseSkinDescriptor, SkinDescriptor { +public class NameFetchingDescriptor implements BaseSkinDescriptor, SkinDescriptor { private final MojangSkinCache skinCache; private final String name; - public FetchingDescriptor(MojangSkinCache skinCache, String name) { + public NameFetchingDescriptor(MojangSkinCache skinCache, String name) { this.skinCache = skinCache; this.name = name; } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/UUIDFetchingDescriptor.java b/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/UUIDFetchingDescriptor.java new file mode 100644 index 0000000..4406bbd --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/skin/descriptor/UUIDFetchingDescriptor.java @@ -0,0 +1,41 @@ +package lol.pyr.znpcsplus.skin.descriptor; + +import lol.pyr.znpcsplus.api.skin.SkinDescriptor; +import lol.pyr.znpcsplus.skin.BaseSkinDescriptor; +import lol.pyr.znpcsplus.skin.SkinImpl; +import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; +import org.bukkit.entity.Player; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +public class UUIDFetchingDescriptor implements BaseSkinDescriptor, SkinDescriptor { + + private final MojangSkinCache skinCache; + private final UUID uuid; + + public UUIDFetchingDescriptor(MojangSkinCache skinCache, UUID uuid) { + this.skinCache = skinCache; + this.uuid = uuid; + } + + @Override + public CompletableFuture fetch(Player player) { + return skinCache.fetchByUUID(uuid.toString()); + } + + @Override + public SkinImpl fetchInstant(Player player) { + return fetch(player).join(); + } + + @Override + public boolean supportsInstant(Player player) { + return false; + } + + @Override + public String serialize() { + return "fetching;" + uuid.toString(); + } +}