diff options
author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-01-10 17:24:53 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-10 17:24:53 -0500 |
commit | de96684315a10bd224069c253bbefa408659dc3c (patch) | |
tree | fd52f7b7e6c97709441a64b786ef612f11b9b36a /src/main/java/de/hysky/skyblocker/skyblock/item | |
parent | ffab9576c0f7534195f276b677bd5bdeac5e8a3a (diff) | |
download | Skyblocker-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.java | 64 |
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); + } +} |