From f7b5bd6246e364d42b4aa65433a81b6b24a4394c Mon Sep 17 00:00:00 2001
From: Tofaa <82680183+Tofaa2@users.noreply.github.com>
Date: Wed, 1 May 2024 16:34:31 +0400
Subject: [PATCH] Add optional api getter to avoid NullPointer on metadata
---
.idea/misc.xml | 2 +-
.idea/workspace.xml | 58 ++++----
.../java/me/tofaa/entitylib/EntityLib.java | 8 +-
.../entitylib/extras/MojangApiError.java | 23 +++
.../tofaa/entitylib/extras/skin/CSFBImpl.java | 37 +++++
.../extras/skin/CachedSkinFetcherBuilder.java | 14 ++
.../extras/skin/CachedSkinFetcherImpl.java | 136 ++++++++++++++++++
.../extras/skin/ErroredTextureProperties.java | 35 +++++
.../tofaa/entitylib/extras/skin/SFBImpl.java | 28 ++++
.../tofaa/entitylib/extras/skin/SFUtils.java | 71 +++++++++
.../entitylib/extras/skin/SkinFetcher.java | 28 ++++
.../extras/skin/SkinFetcherBuilder.java | 15 ++
.../extras/skin/SkinFetcherImpl.java | 59 ++++++++
.../me/tofaa/entitylib/meta/Metadata.java | 5 +-
.../testentitylib/TestPlayerCommand.java | 22 ++-
15 files changed, 502 insertions(+), 39 deletions(-)
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/MojangApiError.java
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/skin/CSFBImpl.java
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/skin/CachedSkinFetcherBuilder.java
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/skin/CachedSkinFetcherImpl.java
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/skin/ErroredTextureProperties.java
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/skin/SFBImpl.java
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/skin/SFUtils.java
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcher.java
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcherBuilder.java
create mode 100644 api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcherImpl.java
diff --git a/.idea/misc.xml b/.idea/misc.xml
index e3506b9..35a6479 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -4,5 +4,5 @@
-
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 1e6af11..29f2b72 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,7 +4,22 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -34,17 +49,6 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -64,16 +68,9 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
@@ -98,7 +95,7 @@
"Gradle.EntityLib [publish].executor": "Run",
"Gradle.EntityLib:code-gen [:code-gen:Main.main()].executor": "Run",
"Gradle.EntityLib:test-plugin [publish].executor": "Run",
- "Gradle.EntityLib:test-plugin [runServer].executor": "Debug",
+ "Gradle.EntityLib:test-plugin [runServer].executor": "Run",
"Gradle.EntityLib:test-plugin [shadowJar].executor": "Run",
"Repository.Attach.Annotations": "false",
"Repository.Attach.JavaDocs": "false",
@@ -110,7 +107,7 @@
"ignore.virus.scanning.warn.message": "true",
"jdk.selected.JAVA_MODULE": "corretto-17",
"kotlin-language-version-configured": "true",
- "last_opened_file_path": "D:/Github/EntityLib/api/src/main/java/me/tofaa/entitylib/extras",
+ "last_opened_file_path": "/mnt/sda2/Github/EntityLib",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
@@ -121,6 +118,11 @@
"project.structure.side.proportion": "0.2",
"settings.editor.selected.configurable": "preferences.pluginManager",
"vue.rearranger.settings.migration": "true"
+ },
+ "keyToStringList": {
+ "kotlin-gradle-user-dirs": [
+ "/home/tofaa/.gradle"
+ ]
}
}
@@ -245,9 +247,8 @@
-
-
-
+
+
@@ -322,6 +323,7 @@
+
@@ -347,7 +349,7 @@
file://$PROJECT_DIR$/test-plugin/src/main/java/me/tofaa/testentitylib/TestPlayerCommand.java
- 69
+ 77
diff --git a/api/src/main/java/me/tofaa/entitylib/EntityLib.java b/api/src/main/java/me/tofaa/entitylib/EntityLib.java
index 1870081..92ab436 100644
--- a/api/src/main/java/me/tofaa/entitylib/EntityLib.java
+++ b/api/src/main/java/me/tofaa/entitylib/EntityLib.java
@@ -1,6 +1,7 @@
package me.tofaa.entitylib;
import java.io.IOException;
+import java.util.Optional;
import java.util.logging.Level;
public final class EntityLib {
@@ -23,13 +24,16 @@ public final class EntityLib {
platform.getLogger().log(Level.WARNING, "You are using an outdated version of EntityLib. Please take a look at the Github releases page.");
}
- }
- catch (IOException e) {
+ } catch (IOException e) {
platform.getLogger().log(Level.WARNING, e, () -> "EntityLib failed to check for updates.");
}
}
}
+ public static Optional> getOptionalApi() {
+ return Optional.ofNullable(api);
+ }
+
public static EntityLibAPI getApi() {
return api;
}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/MojangApiError.java b/api/src/main/java/me/tofaa/entitylib/extras/MojangApiError.java
new file mode 100644
index 0000000..507abc1
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/MojangApiError.java
@@ -0,0 +1,23 @@
+package me.tofaa.entitylib.extras;
+
+public class MojangApiError extends RuntimeException {
+
+ public MojangApiError() {
+ }
+
+ public MojangApiError(String message) {
+ super(message);
+ }
+
+ public MojangApiError(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public MojangApiError(Throwable cause) {
+ super(cause);
+ }
+
+ public MojangApiError(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/skin/CSFBImpl.java b/api/src/main/java/me/tofaa/entitylib/extras/skin/CSFBImpl.java
new file mode 100644
index 0000000..e5b0394
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/skin/CSFBImpl.java
@@ -0,0 +1,37 @@
+package me.tofaa.entitylib.extras.skin;
+
+import me.tofaa.entitylib.extras.MojangApiError;
+
+import java.util.function.Consumer;
+
+final class CSFBImpl implements CachedSkinFetcherBuilder{
+
+ private Consumer onErr;
+ private long cacheDuration = -1;
+
+ CSFBImpl(Consumer onErr) {
+ this.onErr = onErr;
+ }
+
+ @Override
+ public CachedSkinFetcherBuilder cacheDuration(long duration) {
+ this.cacheDuration = duration;
+ return this;
+ }
+
+ @Override
+ public CachedSkinFetcherBuilder cached() {
+ return this;
+ }
+
+ @Override
+ public CachedSkinFetcherBuilder onErr(Consumer onErr) {
+ this.onErr = onErr;
+ return this;
+ }
+
+ @Override
+ public SkinFetcher build() {
+ return new CachedSkinFetcherImpl(onErr, cacheDuration);
+ }
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/skin/CachedSkinFetcherBuilder.java b/api/src/main/java/me/tofaa/entitylib/extras/skin/CachedSkinFetcherBuilder.java
new file mode 100644
index 0000000..cb56ba4
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/skin/CachedSkinFetcherBuilder.java
@@ -0,0 +1,14 @@
+package me.tofaa.entitylib.extras.skin;
+
+import me.tofaa.entitylib.extras.MojangApiError;
+
+import java.util.function.Consumer;
+
+public interface CachedSkinFetcherBuilder extends SkinFetcherBuilder {
+
+ CachedSkinFetcherBuilder cacheDuration(long duration);
+
+ @Override
+ CachedSkinFetcherBuilder onErr(Consumer onErr);
+
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/skin/CachedSkinFetcherImpl.java b/api/src/main/java/me/tofaa/entitylib/extras/skin/CachedSkinFetcherImpl.java
new file mode 100644
index 0000000..904bf14
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/skin/CachedSkinFetcherImpl.java
@@ -0,0 +1,136 @@
+package me.tofaa.entitylib.extras.skin;
+
+import com.github.retrooper.packetevents.protocol.player.TextureProperty;
+import me.tofaa.entitylib.extras.MojangApiError;
+
+import java.util.*;
+import java.util.function.Consumer;
+
+final class CachedSkinFetcherImpl implements SkinFetcher {
+
+ private final long cacheDuration;
+ private final Consumer onErr;
+ private final Map cache = new HashMap<>();
+ private final Map cacheUUID = new HashMap<>();
+
+ CachedSkinFetcherImpl(Consumer onErr, long cacheDuration) {
+ this.onErr = onErr;
+ this.cacheDuration = cacheDuration;
+ }
+
+
+ @Override
+ public List getSkin(String playerName) {
+ if (cache.containsKey(playerName)) {
+ CachedData data = cache.get(playerName);
+ if (data.expiration > System.currentTimeMillis()) {
+ return data.skin;
+ }
+ else {
+ cache.remove(playerName);
+ }
+ }
+ return putAndReturn(playerName);
+ }
+
+ @Override
+ public List getSkin(UUID uuid) {
+ if (cacheUUID.containsKey(uuid)) {
+ CachedData data = cacheUUID.get(uuid);
+ if (data.expiration > System.currentTimeMillis()) {
+ return data.skin;
+ }
+ else {
+ cacheUUID.remove(uuid);
+ }
+ }
+ return putAndReturn(uuid);
+ }
+
+ @Override
+ public List getSkinOrDefault(String playerName, List defaults) {
+ if (cache.containsKey(playerName)) {
+ CachedData data = cache.get(playerName);
+ if (data.expiration > System.currentTimeMillis()) {
+ return data.skin;
+ }
+ else {
+ cache.remove(playerName);
+ }
+ }
+ List skin = putAndReturn(playerName);
+ if (skin.isEmpty()) {
+ cache.remove(playerName);
+ return defaults;
+ }
+ return skin;
+ }
+
+ @Override
+ public List getSkinOrDefault(UUID uuid, List defaults) {
+ if (cacheUUID.containsKey(uuid)) {
+ CachedData data = cacheUUID.get(uuid);
+ if (data.expiration > System.currentTimeMillis()) {
+ return data.skin;
+ }
+ else {
+ cacheUUID.remove(uuid);
+ }
+ }
+ List skin = putAndReturn(uuid);
+ if (skin.isEmpty()) {
+ cacheUUID.remove(uuid);
+ return defaults;
+ }
+ return skin;
+ }
+
+ private List putAndReturn(String playerName) {
+ ErroredTextureProperties p = SFUtils.getTextures(playerName);
+ if (p.didError()) {
+ if (onErr != null) {
+ onErr.accept(new MojangApiError(p.getError()));
+ }
+ return Collections.emptyList();
+ }
+ List skin = p.getTextureProperties();
+ CachedData data;
+ if (cacheDuration == -1) {
+ data = new CachedData(skin, Long.MAX_VALUE);
+ }
+ else {
+ data = new CachedData(skin, System.currentTimeMillis() + cacheDuration);
+ }
+ cache.put(playerName, data);
+ if (p.uuid != null) {
+ cacheUUID.put(p.uuid, data);
+ }
+ return skin;
+ }
+
+ private List putAndReturn(UUID uuid) {
+ ErroredTextureProperties p = SFUtils.getTextures(uuid);
+ if (p.didError()) {
+ if (onErr != null) {
+ onErr.accept(new MojangApiError(p.getError()));
+ }
+ return Collections.emptyList();
+ }
+ List skin = p.getTextureProperties();
+ if (cacheDuration != -1) {
+ cacheUUID.put(uuid, new CachedData(skin, System.currentTimeMillis() + cacheDuration));
+ }
+ else {
+ cacheUUID.put(uuid, new CachedData(skin, Long.MAX_VALUE));
+ }
+ return skin;
+ }
+ static class CachedData {
+ private final List skin;
+ private final long expiration;
+ CachedData(List skin, long expiration) {
+ this.skin = skin;
+ this.expiration = expiration;
+ }
+ }
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/skin/ErroredTextureProperties.java b/api/src/main/java/me/tofaa/entitylib/extras/skin/ErroredTextureProperties.java
new file mode 100644
index 0000000..ccd8820
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/skin/ErroredTextureProperties.java
@@ -0,0 +1,35 @@
+package me.tofaa.entitylib.extras.skin;
+
+import com.github.retrooper.packetevents.protocol.player.TextureProperty;
+import me.tofaa.entitylib.extras.MojangApiError;
+
+import java.util.List;
+import java.util.UUID;
+
+final class ErroredTextureProperties {
+
+ UUID uuid;
+ private MojangApiError error;
+ private List textureProperties;
+
+ ErroredTextureProperties(MojangApiError error) {
+ this.error = error;
+ }
+
+ ErroredTextureProperties(List textureProperties) {
+ this.textureProperties = textureProperties;
+ }
+
+ boolean didError() {
+ return error != null;
+ }
+
+ MojangApiError getError() {
+ return error;
+ }
+
+ List getTextureProperties() {
+ return textureProperties;
+ }
+
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/skin/SFBImpl.java b/api/src/main/java/me/tofaa/entitylib/extras/skin/SFBImpl.java
new file mode 100644
index 0000000..2278970
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/skin/SFBImpl.java
@@ -0,0 +1,28 @@
+package me.tofaa.entitylib.extras.skin;
+
+import me.tofaa.entitylib.extras.MojangApiError;
+
+import java.util.function.Consumer;
+
+class SFBImpl implements SkinFetcherBuilder {
+
+ private Consumer rateLimitErrorConsumer;
+
+ @Override
+ public CachedSkinFetcherBuilder cached() {
+ return new CSFBImpl(rateLimitErrorConsumer);
+ }
+
+ @Override
+ public SkinFetcherBuilder onErr(Consumer onErr) {
+ this.rateLimitErrorConsumer = onErr;
+ return this;
+ }
+
+ @Override
+ public SkinFetcher build() {
+ return new SkinFetcherImpl(rateLimitErrorConsumer);
+ }
+
+
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/skin/SFUtils.java b/api/src/main/java/me/tofaa/entitylib/extras/skin/SFUtils.java
new file mode 100644
index 0000000..838f969
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/skin/SFUtils.java
@@ -0,0 +1,71 @@
+package me.tofaa.entitylib.extras.skin;
+
+import com.github.retrooper.packetevents.protocol.player.TextureProperty;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import me.tofaa.entitylib.extras.MojangApiError;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+final class SFUtils {
+
+ public static ErroredTextureProperties getTextures(String username) {
+ try {
+ URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + username);
+ InputStream stream = url.openStream();
+ InputStreamReader isr = new InputStreamReader(stream);
+ JsonObject root = parse(isr);
+ UUID uuid = UUID.fromString(root.get("id").getAsString());
+ isr.close();
+ stream.close();
+ return getTextures(uuid);
+ }
+ catch (IOException e) {
+ return new ErroredTextureProperties(new MojangApiError(e));
+ }
+ }
+
+ public static ErroredTextureProperties getTextures(UUID uuid) {
+ try {
+ URL url = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid.toString().replace("-", "") + "?unsigned=false");
+ InputStream stream = url.openStream();
+ InputStreamReader isr = new InputStreamReader(stream);
+ JsonObject root = parse(isr);
+ JsonArray textures = getTexturesObject(root);
+ List properties = new ArrayList<>(textures.size());
+ for (int i = 0; i < textures.size(); i++) {
+ JsonObject texture = textures.get(i).getAsJsonObject();
+ String name = texture.get("name").getAsString();
+ String value = texture.get("value").getAsString();
+ String signature = texture.has("signature") ? texture.get("signature").getAsString() : null;
+ properties.add(new TextureProperty(name, value, signature));
+ }
+ isr.close();
+ stream.close();
+ ErroredTextureProperties prop = new ErroredTextureProperties(properties);
+ prop.uuid = uuid;
+ return prop;
+ }
+ catch (IOException e) {
+ return new ErroredTextureProperties(new MojangApiError(e));
+ }
+ }
+
+ private SFUtils() {}
+
+ static JsonArray getTexturesObject(JsonObject root) {
+ return root.getAsJsonArray("properties");
+ }
+
+ static JsonObject parse(InputStreamReader isr) {
+ return new JsonParser().parse(isr).getAsJsonObject();
+ }
+
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcher.java b/api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcher.java
new file mode 100644
index 0000000..1f32edb
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcher.java
@@ -0,0 +1,28 @@
+package me.tofaa.entitylib.extras.skin;
+
+import com.github.retrooper.packetevents.protocol.player.TextureProperty;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Represents a interface that fetches the skin of a player.
+ * This class is non static, you should create and store an instance of it.
+ * Creating one should be done using the builder. SkinFetcher is synchronous. You must handle that yourself.
+ */
+public interface SkinFetcher {
+
+ static SkinFetcherBuilder builder() {
+ return new SFBImpl();
+ }
+
+
+ List getSkin(String playerName);
+
+ List getSkin(UUID uuid);
+
+ List getSkinOrDefault(String playerName, List defaults);
+
+ List getSkinOrDefault(UUID uuid, List defaults);
+
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcherBuilder.java b/api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcherBuilder.java
new file mode 100644
index 0000000..ad3d2b5
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcherBuilder.java
@@ -0,0 +1,15 @@
+package me.tofaa.entitylib.extras.skin;
+
+import me.tofaa.entitylib.extras.MojangApiError;
+
+import java.util.function.Consumer;
+
+public interface SkinFetcherBuilder {
+
+ CachedSkinFetcherBuilder cached();
+
+ SkinFetcherBuilder onErr(Consumer onErr);
+
+ SkinFetcher build();
+
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcherImpl.java b/api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcherImpl.java
new file mode 100644
index 0000000..0e510d1
--- /dev/null
+++ b/api/src/main/java/me/tofaa/entitylib/extras/skin/SkinFetcherImpl.java
@@ -0,0 +1,59 @@
+package me.tofaa.entitylib.extras.skin;
+
+import com.github.retrooper.packetevents.protocol.player.TextureProperty;
+import me.tofaa.entitylib.extras.MojangApiError;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.function.Consumer;
+
+final class SkinFetcherImpl implements SkinFetcher {
+
+ private final Consumer rateLimitErrorConsumer;
+
+ public SkinFetcherImpl(Consumer rateLimitErrorConsumer) {
+ this.rateLimitErrorConsumer = rateLimitErrorConsumer;
+ }
+
+ @Override
+ public List getSkin(String playerName) {
+ ErroredTextureProperties p = SFUtils.getTextures(playerName);
+ if (p.didError()) {
+ rateLimitErrorConsumer.accept(p.getError());
+ return Collections.emptyList();
+ }
+ return p.getTextureProperties();
+ }
+
+ @Override
+ public List getSkin(UUID uuid) {
+ ErroredTextureProperties p = SFUtils.getTextures(uuid);
+ if (p.didError()) {
+ rateLimitErrorConsumer.accept(p.getError());
+ return Collections.emptyList();
+ }
+ return p.getTextureProperties();
+ }
+
+ @Override
+ public List getSkinOrDefault(String playerName, List defaults) {
+ ErroredTextureProperties p = SFUtils.getTextures(playerName);
+ if (p.didError()) {
+ rateLimitErrorConsumer.accept(p.getError());
+ return defaults;
+ }
+ return p.getTextureProperties();
+ }
+
+ @Override
+ public List getSkinOrDefault(UUID uuid, List defaults) {
+ ErroredTextureProperties p = SFUtils.getTextures(uuid);
+ if (p.didError()) {
+ rateLimitErrorConsumer.accept(p.getError());
+ return defaults;
+ }
+ return p.getTextureProperties();
+ }
+
+}
diff --git a/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java b/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java
index 18d8c06..79dffc4 100644
--- a/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java
+++ b/api/src/main/java/me/tofaa/entitylib/meta/Metadata.java
@@ -4,6 +4,7 @@ import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType;
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata;
import me.tofaa.entitylib.EntityLib;
+import me.tofaa.entitylib.EntityLibAPI;
import me.tofaa.entitylib.wrapper.WrapperEntity;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -34,7 +35,9 @@ public class Metadata {
final EntityData entry = new EntityData(index, dataType, value);
this.metadataMap.put(index, entry);
- final WrapperEntity entity = EntityLib.getApi().getEntity(entityId);
+ final Optional> optionalApi = EntityLib.getOptionalApi();
+ if (!optionalApi.isPresent()) return;
+ final WrapperEntity entity = optionalApi.get().getEntity(entityId);
if (entity == null || !entity.isSpawned()) return; // Not EntityLib entity then, the user must send the packet manually. OR not spawned.
if (!this.notifyAboutChanges) {
synchronized (this.notNotifiedChanges) {
diff --git a/test-plugin/src/main/java/me/tofaa/testentitylib/TestPlayerCommand.java b/test-plugin/src/main/java/me/tofaa/testentitylib/TestPlayerCommand.java
index a3adc94..79ffc4e 100644
--- a/test-plugin/src/main/java/me/tofaa/testentitylib/TestPlayerCommand.java
+++ b/test-plugin/src/main/java/me/tofaa/testentitylib/TestPlayerCommand.java
@@ -1,21 +1,16 @@
package me.tofaa.testentitylib;
-import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.item.ItemStack;
import com.github.retrooper.packetevents.protocol.item.type.ItemTypes;
import com.github.retrooper.packetevents.protocol.player.GameMode;
-import com.github.retrooper.packetevents.protocol.player.TextureProperty;
import com.github.retrooper.packetevents.protocol.player.UserProfile;
-import com.github.retrooper.packetevents.wrapper.PacketWrapper;
-import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPlayerInfo;
-import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPlayerInfoUpdate;
import io.github.retrooper.packetevents.util.SpigotConversionUtil;
import me.tofaa.entitylib.EntityLib;
+import me.tofaa.entitylib.extras.skin.SkinFetcher;
import me.tofaa.entitylib.spigot.ExtraConversionUtil;
import me.tofaa.entitylib.wrapper.WrapperPlayer;
import net.kyori.adventure.text.Component;
-import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.command.defaults.BukkitCommand;
import org.bukkit.entity.Player;
@@ -26,6 +21,7 @@ import java.util.*;
public class TestPlayerCommand extends BukkitCommand {
private WrapperPlayer p;
+ private SkinFetcher sf;
public TestPlayerCommand() {
super("testplayer");
}
@@ -33,12 +29,24 @@ public class TestPlayerCommand extends BukkitCommand {
@Override
public boolean execute(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] strings) {
Player player = (Player) commandSender;
- if (strings.length != 1) {
+ if (strings.length < 1) {
player.sendMessage("Usage: /testplayer ");
return false;
}
String arg = strings[0].toLowerCase();
switch (arg) {
+ case "skin":
+ String input = strings[1];
+ if (p == null) {
+ player.sendMessage("Spawn an entity first");
+ return false;
+ }
+ if (sf == null) {
+ sf = SkinFetcher.builder()
+ .cached()
+ .build();
+ }
+ p.setTextureProperties(sf.getSkin(input));
case "spawn":
UserProfile profile = new UserProfile(UUID.randomUUID(), "randomname", new ArrayList<>());
p = new WrapperPlayer(profile, EntityLib.getPlatform().getEntityIdProvider().provide(profile.getUUID(), EntityTypes.PLAYER));