Added skin descriptor fetching by UUID

This commit is contained in:
Mqzn 2025-03-20 15:05:58 +02:00
parent ca8a1d6499
commit 0258450383
7 changed files with 60 additions and 10 deletions

View file

@ -1,6 +1,7 @@
package lol.pyr.znpcsplus.api.skin; package lol.pyr.znpcsplus.api.skin;
import java.net.URL; import java.net.URL;
import java.util.UUID;
/** /**
* Factory for creating skin descriptors. * Factory for creating skin descriptors.
@ -8,6 +9,7 @@ import java.net.URL;
public interface SkinDescriptorFactory { public interface SkinDescriptorFactory {
SkinDescriptor createMirrorDescriptor(); SkinDescriptor createMirrorDescriptor();
SkinDescriptor createRefreshingDescriptor(String playerName); SkinDescriptor createRefreshingDescriptor(String playerName);
SkinDescriptor createRefreshingDescriptor(UUID playerUUID);
SkinDescriptor createStaticDescriptor(String playerName); SkinDescriptor createStaticDescriptor(String playerName);
SkinDescriptor createStaticDescriptor(String texture, String signature); SkinDescriptor createStaticDescriptor(String texture, String signature);
SkinDescriptor createUrlDescriptor(String url, String variant); SkinDescriptor createUrlDescriptor(String url, String variant);

View file

@ -11,7 +11,7 @@ import lol.pyr.znpcsplus.npc.NpcImpl;
import lol.pyr.znpcsplus.npc.NpcRegistryImpl; import lol.pyr.znpcsplus.npc.NpcRegistryImpl;
import lol.pyr.znpcsplus.npc.NpcTypeRegistryImpl; import lol.pyr.znpcsplus.npc.NpcTypeRegistryImpl;
import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; 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.MirrorDescriptor;
import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor; import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -67,7 +67,7 @@ public class SkinCommand implements CommandHandler {
} else if (type.equalsIgnoreCase("dynamic")) { } else if (type.equalsIgnoreCase("dynamic")) {
context.ensureArgsNotEmpty(); context.ensureArgsNotEmpty();
String name = context.dumpAllArgs(); 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(); npc.respawn();
context.halt(Component.text("The NPC's skin will now be resolved per-player from \"" + name + "\"")); context.halt(Component.text("The NPC's skin will now be resolved per-player from \"" + name + "\""));
} else if (type.equalsIgnoreCase("url")) { } else if (type.equalsIgnoreCase("url")) {

View file

@ -25,7 +25,7 @@ import lol.pyr.znpcsplus.packets.PacketFactory;
import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.scheduling.TaskScheduler;
import lol.pyr.znpcsplus.skin.SkinImpl; import lol.pyr.znpcsplus.skin.SkinImpl;
import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; 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.MirrorDescriptor;
import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor; import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor;
import lol.pyr.znpcsplus.util.BungeeConnector; import lol.pyr.znpcsplus.util.BungeeConnector;
@ -175,7 +175,7 @@ public class ZNpcImporter implements DataImporter {
} }
if (model.getSkinName() != null) { 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) { else if (model.getSkin() != null && model.getSignature() != null) {
npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new PrefetchedDescriptor(new SkinImpl(model.getSkin(), model.getSignature()))); npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new PrefetchedDescriptor(new SkinImpl(model.getSkin(), model.getSignature())));

View file

@ -3,7 +3,7 @@ package lol.pyr.znpcsplus.skin;
import com.github.retrooper.packetevents.protocol.player.TextureProperty; import com.github.retrooper.packetevents.protocol.player.TextureProperty;
import lol.pyr.znpcsplus.api.skin.SkinDescriptor; import lol.pyr.znpcsplus.api.skin.SkinDescriptor;
import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; 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.MirrorDescriptor;
import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor; import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -22,7 +22,7 @@ public interface BaseSkinDescriptor extends SkinDescriptor {
static BaseSkinDescriptor deserialize(MojangSkinCache skinCache, String str) { static BaseSkinDescriptor deserialize(MojangSkinCache skinCache, String str) {
String[] arr = str.split(";"); String[] arr = str.split(";");
if (arr[0].equalsIgnoreCase("mirror")) return new MirrorDescriptor(skinCache); 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")) { else if (arr[0].equalsIgnoreCase("prefetched")) {
List<TextureProperty> properties = new ArrayList<>(); List<TextureProperty> properties = new ArrayList<>();
for (int i = 0; i < (arr.length - 1) / 3; i++) { for (int i = 0; i < (arr.length - 1) / 3; i++) {

View file

@ -3,12 +3,14 @@ package lol.pyr.znpcsplus.skin;
import lol.pyr.znpcsplus.api.skin.SkinDescriptor; import lol.pyr.znpcsplus.api.skin.SkinDescriptor;
import lol.pyr.znpcsplus.api.skin.SkinDescriptorFactory; import lol.pyr.znpcsplus.api.skin.SkinDescriptorFactory;
import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; 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.MirrorDescriptor;
import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor; import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor;
import lol.pyr.znpcsplus.skin.descriptor.UUIDFetchingDescriptor;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.UUID;
public class SkinDescriptorFactoryImpl implements SkinDescriptorFactory { public class SkinDescriptorFactoryImpl implements SkinDescriptorFactory {
private final MojangSkinCache skinCache; private final MojangSkinCache skinCache;
@ -26,7 +28,12 @@ public class SkinDescriptorFactoryImpl implements SkinDescriptorFactory {
@Override @Override
public SkinDescriptor createRefreshingDescriptor(String playerName) { 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 @Override

View file

@ -9,11 +9,11 @@ import org.bukkit.entity.Player;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
public class FetchingDescriptor implements BaseSkinDescriptor, SkinDescriptor { public class NameFetchingDescriptor implements BaseSkinDescriptor, SkinDescriptor {
private final MojangSkinCache skinCache; private final MojangSkinCache skinCache;
private final String name; private final String name;
public FetchingDescriptor(MojangSkinCache skinCache, String name) { public NameFetchingDescriptor(MojangSkinCache skinCache, String name) {
this.skinCache = skinCache; this.skinCache = skinCache;
this.name = name; this.name = name;
} }

View file

@ -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<SkinImpl> 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();
}
}