aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/item
diff options
context:
space:
mode:
authorAaron <51387595+AzureAaron@users.noreply.github.com>2024-01-10 17:24:53 -0500
committerGitHub <noreply@github.com>2024-01-10 17:24:53 -0500
commitde96684315a10bd224069c253bbefa408659dc3c (patch)
treefd52f7b7e6c97709441a64b786ef612f11b9b36a /src/main/java/de/hysky/skyblocker/skyblock/item
parentffab9576c0f7534195f276b677bd5bdeac5e8a3a (diff)
downloadSkyblocker-de96684315a10bd224069c253bbefa408659dc3c.tar.gz
Skyblocker-de96684315a10bd224069c253bbefa408659dc3c.tar.bz2
Skyblocker-de96684315a10bd224069c253bbefa408659dc3c.zip
Fix Skin Transparency applying to player skins (#477)
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/item')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java b/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java
new file mode 100644
index 00000000..2a1688fc
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/PlayerHeadHashCache.java
@@ -0,0 +1,64 @@
+package de.hysky.skyblocker.skyblock.item;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Base64;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.commons.io.FilenameUtils;
+import org.slf4j.Logger;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import com.mojang.logging.LogUtils;
+
+import de.hysky.skyblocker.utils.Http;
+import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
+
+public class PlayerHeadHashCache {
+ private static final Logger LOGGER = LogUtils.getLogger();
+ private static final IntOpenHashSet CACHE = new IntOpenHashSet();
+
+ public static void init() {
+ CompletableFuture.runAsync(PlayerHeadHashCache::loadSkins);
+ }
+
+ private static void loadSkins() {
+ try {
+ String response = Http.sendGetRequest("https://api.hypixel.net/v2/resources/skyblock/items");
+ JsonArray items = JsonParser.parseString(response).getAsJsonObject().getAsJsonArray("items");
+
+ items.asList().stream()
+ .map(JsonElement::getAsJsonObject)
+ .filter(item -> item.get("material").getAsString().equals("SKULL_ITEM"))
+ .filter(item -> item.has("skin"))
+ .map(item -> Base64.getDecoder().decode(item.get("skin").getAsString()))
+ .map(String::new)
+ .map(profile -> JsonParser.parseString(profile).getAsJsonObject())
+ .map(profile -> profile.getAsJsonObject("textures").getAsJsonObject("SKIN").get("url").getAsString())
+ .map(PlayerHeadHashCache::getSkinHash)
+ .mapToInt(String::hashCode)
+ .forEach(CACHE::add);
+
+ LOGGER.info("[Skyblocker Player Head Hash Cache] Successfully cached the hashes of all player head items!");
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker Player Head Hash Cache] Failed to cache skin hashes!", e);
+ }
+ }
+
+ //From MinecraftProfileTexture#getHash
+ public static String getSkinHash(String url) {
+ try {
+ return FilenameUtils.getBaseName(new URL(url).getPath());
+ } catch (MalformedURLException e) {
+ LOGGER.error("[Skyblocker Player Head Hash Cache] Malformed Skin URL! URL: {}", url, e);
+ }
+
+ return "";
+ }
+
+ public static boolean contains(int hash) {
+ return CACHE.contains(hash);
+ }
+}