3
0
Mirror von https://github.com/GeyserMC/Geyser.git synchronisiert 2024-10-02 08:00:07 +02:00

Use skin hash instead of URL

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>
Dieser Commit ist enthalten in:
Joshua Castle 2023-01-23 21:41:17 -08:00
Ursprung 04565f95d7
Commit a25ee6c96d
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: F674F38216C35D5D
6 geänderte Dateien mit 47 neuen und 40 gelöschten Zeilen

Datei anzeigen

@ -16,12 +16,12 @@ public abstract class GeyserDefineCustomSkullsEvent implements Event {
USERNAME, USERNAME,
UUID, UUID,
PROFILE, PROFILE,
SKIN_URL SKIN_HASH
} }
/** /**
* Registers the given username, UUID, or base64 encoded profile as a custom skull blocks * Registers the given username, UUID, base64 encoded profile, or skin hash as a custom skull blocks
* @param texture the username, UUID, or base64 encoded profile * @param texture the username, UUID, base64 encoded profile, or skin hash
* @param type the type of texture provided * @param type the type of texture provided
*/ */
public abstract void registerCustomSkull(@NonNull String texture, @NonNull SkullTextureType type); public abstract void registerCustomSkull(@NonNull String texture, @NonNull SkullTextureType type);

Datei anzeigen

@ -43,6 +43,8 @@ public final class Constants {
public static final String GEYSER_NAMESPACE = "geyser_custom"; public static final String GEYSER_NAMESPACE = "geyser_custom";
public static final String MINECRAFT_SKIN_SERVER_URL = "http://textures.minecraft.net/texture/";
static { static {
URI wsUri = null; URI wsUri = null;
try { try {

Datei anzeigen

@ -44,8 +44,8 @@ public class GeyserCustomSkullConfiguration {
@JsonProperty("player-profiles") @JsonProperty("player-profiles")
private List<String> playerProfiles; private List<String> playerProfiles;
@JsonProperty("skin-urls") @JsonProperty("skin-hashes")
private List<String> skinUrls; private List<String> skinHashes;
public List<String> getPlayerUsernames() { public List<String> getPlayerUsernames() {
return Objects.requireNonNullElse(playerUsernames, Collections.emptyList()); return Objects.requireNonNullElse(playerUsernames, Collections.emptyList());
@ -59,7 +59,7 @@ public class GeyserCustomSkullConfiguration {
return Objects.requireNonNullElse(playerProfiles, Collections.emptyList()); return Objects.requireNonNullElse(playerProfiles, Collections.emptyList());
} }
public List<String> getPlayerSkinUrls() { public List<String> getPlayerSkinHashes() {
return Objects.requireNonNullElse(skinUrls, Collections.emptyList()); return Objects.requireNonNullElse(skinHashes, Collections.emptyList());
} }
} }

Datei anzeigen

@ -27,6 +27,7 @@ package org.geysermc.geyser.pack;
import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.Pair;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import org.geysermc.geyser.Constants;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.registry.type.CustomSkull; import org.geysermc.geyser.registry.type.CustomSkull;
@ -99,7 +100,8 @@ public class SkullResourcePackManager {
return null; return null;
} }
public static void cacheSkullSkin(String skinUrl, String skinHash) throws IOException { public static void cacheSkullSkin(String skinHash) throws IOException {
String skinUrl = Constants.MINECRAFT_SKIN_SERVER_URL + skinHash;
Path skinPath = SKULL_SKINS.get(skinHash); Path skinPath = SKULL_SKINS.get(skinHash);
if (skinPath != null) { if (skinPath != null) {
return; return;

Datei anzeigen

@ -72,12 +72,9 @@ public class CustomSkullRegistryPopulator {
BlockRegistries.CUSTOM_SKULLS.set(new Object2ObjectOpenHashMap<>()); BlockRegistries.CUSTOM_SKULLS.set(new Object2ObjectOpenHashMap<>());
List<String> profiles = new ArrayList<>(skullConfig.getPlayerProfiles()); List<String> profiles = new ArrayList<>(skullConfig.getPlayerProfiles());
List<String> usernames = new ArrayList<>(skullConfig.getPlayerUsernames()); List<String> usernames = new ArrayList<>(skullConfig.getPlayerUsernames());
List<String> uuids = new ArrayList<>(skullConfig.getPlayerUUIDs()); List<String> uuids = new ArrayList<>(skullConfig.getPlayerUUIDs());
List<String> skinHashes = new ArrayList<>(skullConfig.getPlayerSkinHashes());
List<String> skinUrls = new ArrayList<>(skullConfig.getPlayerSkinUrls());
GeyserImpl.getInstance().getEventBus().fire(new GeyserDefineCustomSkullsEvent() { GeyserImpl.getInstance().getEventBus().fire(new GeyserDefineCustomSkullsEvent() {
@Override @Override
@ -86,63 +83,69 @@ public class CustomSkullRegistryPopulator {
case USERNAME -> usernames.add(texture); case USERNAME -> usernames.add(texture);
case UUID -> uuids.add(texture); case UUID -> uuids.add(texture);
case PROFILE -> profiles.add(texture); case PROFILE -> profiles.add(texture);
case SKIN_URL -> skinUrls.add(texture); case SKIN_HASH -> skinHashes.add(texture);
} }
} }
}); });
for (String username : usernames) { usernames.forEach((username) -> {
String profile = getProfileFromUsername(username); String profile = getProfileFromUsername(username);
if (profile != null) { if (profile != null) {
String skinUrl = getSkinUrl(profile); String skinHash = getSkinHash(profile);
if (skinUrl != null) { if (skinHash != null) {
skinUrls.add(skinUrl); skinHashes.add(skinHash);
} }
} }
} });
for (String uuid : uuids) {
uuids.forEach((uuid) -> {
String profile = getProfileFromUuid(uuid); String profile = getProfileFromUuid(uuid);
if (profile != null) { if (profile != null) {
String skinUrl = getSkinUrl(profile); String skinHash = getSkinHash(profile);
if (skinUrl != null) { if (skinHash != null) {
skinUrls.add(skinUrl); skinHashes.add(skinHash);
} }
} }
} });
for (String profile : profiles) { profiles.forEach((profile) -> {
String skinUrl = getSkinUrl(profile); String skinHash = getSkinHash(profile);
if (skinUrl != null) { if (skinHash != null) {
skinUrls.add(skinUrl); skinHashes.add(skinHash);
}
});
skinHashes.forEach((skinHash) -> {
if (!skinHash.matches("^[a-fA-F0-9]{64}$")) {
GeyserImpl.getInstance().getLogger().error("Skin hash " + skinHash + " does not match required format ^[a-fA-F0-9]{64}$ and will not be added as a custom block.");
return;
} }
}
for (String skinUrl : skinUrls) {
try { try {
String skinHash = skinUrl.substring(skinUrl.lastIndexOf("/") + 1); SkullResourcePackManager.cacheSkullSkin(skinHash);
SkullResourcePackManager.cacheSkullSkin(skinUrl, skinHash);
BlockRegistries.CUSTOM_SKULLS.register(skinHash, new CustomSkull(skinHash)); BlockRegistries.CUSTOM_SKULLS.register(skinHash, new CustomSkull(skinHash));
} catch (IOException e) { } catch (IOException e) {
GeyserImpl.getInstance().getLogger().error("Failed to cache skin for skull texture " + skinUrl + " This skull will not be added as a custom block.", e); GeyserImpl.getInstance().getLogger().error("Failed to cache skin for skull texture " + skinHash + " This skull will not be added as a custom block.", e);
} }
} });
GeyserImpl.getInstance().getLogger().info("Registered " + BlockRegistries.CUSTOM_SKULLS.get().size() + " custom skulls as custom blocks."); GeyserImpl.getInstance().getLogger().info("Registered " + BlockRegistries.CUSTOM_SKULLS.get().size() + " custom skulls as custom blocks.");
} }
/** /**
* Gets the skin URL from a base64 encoded profile * Gets the skin hash from a base64 encoded profile
* @param profile the base64 encoded profile * @param profile the base64 encoded profile
* @return the skin URL or null if the profile is invalid * @return the skin hash or null if the profile is invalid
*/ */
private static String getSkinUrl(String profile) { private static String getSkinHash(String profile) {
try { try {
SkinManager.GameProfileData profileData = SkinManager.GameProfileData.loadFromJson(profile); SkinManager.GameProfileData profileData = SkinManager.GameProfileData.loadFromJson(profile);
if (profileData == null) { if (profileData == null) {
GeyserImpl.getInstance().getLogger().warning("Skull texture " + profile + " contained no skins and will not be added as a custom block."); GeyserImpl.getInstance().getLogger().warning("Skull texture " + profile + " contained no skins and will not be added as a custom block.");
return null; return null;
} }
return profileData.skinUrl(); String skinUrl = profileData.skinUrl();
return skinUrl.substring(skinUrl.lastIndexOf("/") + 1);
} catch (IOException e) { } catch (IOException e) {
GeyserImpl.getInstance().getLogger().error("Skull texture " + profile + " is invalid and will not be added as a custom block.", e); GeyserImpl.getInstance().getLogger().error("Skull texture " + profile + " is invalid and will not be added as a custom block.", e);
return null; return null;

Datei anzeigen

@ -24,6 +24,6 @@ player-uuids:
player-profiles: player-profiles:
# - ewogICJ0aW1lc3RhbXAiIDogMTY1NzMyMjIzOTgzMywKICAicHJvZmlsZUlkIiA6ICJjZGRiZTUyMGQwNDM0YThiYTFjYzlmYzkyZmRlMmJjZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJBbWJlcmljaHUiLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTkwNzkwYzU3ZTE4MWVkMTNhZGVkMTRjNDdlZTJmN2M4ZGUzNTMzZTAxN2JhOTU3YWY3YmRmOWRmMWJkZTk0ZiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9 # - ewogICJ0aW1lc3RhbXAiIDogMTY1NzMyMjIzOTgzMywKICAicHJvZmlsZUlkIiA6ICJjZGRiZTUyMGQwNDM0YThiYTFjYzlmYzkyZmRlMmJjZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJBbWJlcmljaHUiLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTkwNzkwYzU3ZTE4MWVkMTNhZGVkMTRjNDdlZTJmN2M4ZGUzNTMzZTAxN2JhOTU3YWY3YmRmOWRmMWJkZTk0ZiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9
# The URL of the skin on Minecraft's skin server # The hash of the skin on Minecraft's skin server (http://textures.minecraft.net/texture/HASH)
skin-urls: skin-hashes:
# - http://textures.minecraft.net/texture/a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f # - a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f