Merge pull request #175 from Mqzn/2.X

Added skin descriptor fetching by UUID
This commit is contained in:
Pyr 2025-03-27 19:53:28 +01:00 committed by GitHub
commit ffe3d3dc35
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 70 additions and 10 deletions

View file

@ -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);

View file

@ -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")) {

View file

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

View file

@ -3,14 +3,16 @@ 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 lol.pyr.znpcsplus.skin.descriptor.UUIDFetchingDescriptor;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
public interface BaseSkinDescriptor extends SkinDescriptor {
@ -22,7 +24,14 @@ 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-uuid")) {
String value = String.join(";", Arrays.copyOfRange(arr, 1, arr.length));
return new UUIDFetchingDescriptor(skinCache, UUID.fromString(value));
}
else if(arr[0].equalsIgnoreCase("fetching")) {
String value = String.join(";", Arrays.copyOfRange(arr, 1, arr.length));
return new NameFetchingDescriptor(skinCache, value);
}
else if (arr[0].equalsIgnoreCase("prefetched")) {
List<TextureProperty> properties = new ArrayList<>();
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.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

View file

@ -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;
}

View file

@ -0,0 +1,42 @@
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;" + uuid.toString();
}
}