From 14f0b0453949f65a81cbd415c83b6a213e9777ee Mon Sep 17 00:00:00 2001 From: samolego <34912839+samolego@users.noreply.github.com> Date: Wed, 8 May 2024 20:51:28 +0200 Subject: [PATCH] Fix hd skins --- build.gradle | 2 +- gradlew | 0 jitpack.yml | 4 +-- .../client/screen/SkinChangeScreen.java | 18 ++++++---- .../client/screen/tabs/UrlSkinTab.java | 2 +- .../fabrictailor/command/SkinCommand.java | 2 +- .../fabrictailor/util/SkinFetcher.java | 35 ++++++++++--------- .../fabrictailor/testmod/TailorTest.java | 16 +++++++-- src/test/resources/fabric.mod.json | 3 ++ 9 files changed, 51 insertions(+), 31 deletions(-) mode change 100644 => 100755 gradlew diff --git a/build.gradle b/build.gradle index b892ae7..27dbf13 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ dependencies { // Carpet modCompileOnly("com.github.gnembon:fabric-carpet:${project.carpet_core_version}") - modCompileOnly('com.github.samolego.Taterzens:taterzens-fabric:1.11.4-beta3') + modCompileOnly('com.github.samolego.Taterzens:taterzens-fabric:1.11.6') } processResources { diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/jitpack.yml b/jitpack.yml index b6d1d5d..c4cf174 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,5 +1,5 @@ jdk: - openjdk17 before_install: - - sdk install java 17.0.1-open - - sdk use java 17.0.1-open + - sdk install java 21.0.1-open + - sdk use java 21.0.1-open diff --git a/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java b/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java index 691bc43..dcff53f 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/screen/SkinChangeScreen.java @@ -15,6 +15,7 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.advancements.AdvancementsScreen; import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import org.samo_lego.fabrictailor.casts.TailoredPlayer; @@ -24,6 +25,7 @@ import org.samo_lego.fabrictailor.client.screen.tabs.SkinTabType; import org.samo_lego.fabrictailor.client.screen.tabs.UrlSkinTab; import org.samo_lego.fabrictailor.mixin.client.AAbstractClientPlayer; +import org.samo_lego.fabrictailor.network.payload.DefaultSkinPayload; import org.samo_lego.fabrictailor.util.TextTranslations; import java.io.File; @@ -139,7 +141,9 @@ protected void init() { this.addRenderableWidget( Button.builder(TextTranslations.create("button.fabrictailor.set_default_skin"), onClick -> { - minecraft.player.connection.sendUnsignedCommand("skin default"); + var profile = ((AAbstractClientPlayer) this.minecraft.player).ft_getPlayerInfo().getProfile(); + var payload = new DefaultSkinPayload(profile.getProperties().get(TailoredPlayer.PROPERTY_TEXTURES).iterator().next()); + ClientPlayNetworking.send(payload); this.onClose(); }) .pos(width / 2 - BUTTON_WIDTH / 2 - 1, buttonY) @@ -236,16 +240,16 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) float yHeadRotO = player.yHeadRotO; float yHeadRot = player.yHeadRot; - player.yBodyRot = f * 20.0f; - player.setYRot(f * 40.0f); - player.setXRot(-g * 20.0f); - player.yHeadRot = player.getYRot(); - player.yHeadRotO = player.getYRot(); + player.yBodyRot += 180.0f; + player.setYRot(yRot + 180f); + player.setXRot(xRot + 180.0f); + player.yHeadRot += 180.0f; + player.yHeadRotO += 180.0f; int x = this.startX + 24; int y = this.startY - 76; - InventoryScreen.renderEntityInInventoryFollowsMouse(guiGraphics, x, y, x + 75, y + 208, 48, 1.0f, mouseX + 2, mouseY - 16, this.minecraft.player); + InventoryScreen.renderEntityInInventoryFollowsMouse(guiGraphics, x, y, x + 75, y + 208, 48, 1.0f, -mouseX - 2, mouseY - 16, this.minecraft.player); player.yBodyRot = yBodyRot; player.setYRot(yRot); diff --git a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/UrlSkinTab.java b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/UrlSkinTab.java index f287417..135eadf 100644 --- a/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/UrlSkinTab.java +++ b/src/main/java/org/samo_lego/fabrictailor/client/screen/tabs/UrlSkinTab.java @@ -75,7 +75,7 @@ public Optional getSkinChangePacket(LocalPlayer player, Str } // Check if tld is allowed - String tld = InternetDomainName.from(skinUrl.getHost()).topPrivateDomain().toString(); + String tld = InternetDomainName.from(skinUrl.getHost()).topDomainUnderRegistrySuffix().toString(); if (!config.allowedTextureDomains.contains(tld)) { // Redirect to duckduckgo // e.g. convert https://image.com/image.png to https://external-content.duckduckgo.com/iu/?u=https://image.com/image.png diff --git a/src/main/java/org/samo_lego/fabrictailor/command/SkinCommand.java b/src/main/java/org/samo_lego/fabrictailor/command/SkinCommand.java index 5e23eaa..58c361e 100644 --- a/src/main/java/org/samo_lego/fabrictailor/command/SkinCommand.java +++ b/src/main/java/org/samo_lego/fabrictailor/command/SkinCommand.java @@ -194,7 +194,7 @@ public static void setSkin(ServerPlayer player, Supplier skinProvider) THREADPOOL.submit(() -> { Property skinData = skinProvider.get(); - if(skinData == null) { + if (skinData == null) { player.displayClientMessage(SKIN_SET_ERROR, false); } else { if (!TATERZENS_LOADED || !TaterzenSkins.setTaterzenSkin(player, skinData)) { diff --git a/src/main/java/org/samo_lego/fabrictailor/util/SkinFetcher.java b/src/main/java/org/samo_lego/fabrictailor/util/SkinFetcher.java index a286f78..5657cef 100644 --- a/src/main/java/org/samo_lego/fabrictailor/util/SkinFetcher.java +++ b/src/main/java/org/samo_lego/fabrictailor/util/SkinFetcher.java @@ -8,6 +8,7 @@ import javax.net.ssl.HttpsURLConnection; import java.io.*; import java.net.HttpURLConnection; +import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; @@ -31,9 +32,9 @@ public class SkinFetcher { public static Property setSkinFromFile(String skinFilePath, boolean useSlim) { File skinFile = new File(skinFilePath); try (FileInputStream input = new FileInputStream(skinFile)) { - if(input.read() == 137) { + if (input.read() == 137) { try { - String reply = urlRequest(new URL("https://api.mineskin.org/generate/upload?model=" + (useSlim ? "slim" : "steve")), false, skinFile); + String reply = urlRequest(URI.create("https://api.mineskin.org/generate/upload?model=" + (useSlim ? "slim" : "steve")).toURL(), false, skinFile); return getSkinFromReply(reply); } catch (IOException e) { // Error uploading @@ -56,7 +57,7 @@ public static Property setSkinFromFile(String skinFilePath, boolean useSlim) { @Nullable public static Property fetchSkinByUrl(String skinUrl, boolean useSlim) { try { - URL url = new URL(String.format("https://api.mineskin.org/generate/url?url=%s&model=%s", URLEncoder.encode(skinUrl, StandardCharsets.UTF_8), useSlim ? "slim" : "steve")); + URL url = URI.create(String.format("https://api.mineskin.org/generate/url?url=%s&model=%s", URLEncoder.encode(skinUrl, StandardCharsets.UTF_8), useSlim ? "slim" : "steve")).toURL(); String reply = urlRequest(url, false, null); return getSkinFromReply(reply); } catch (IOException e) { @@ -74,13 +75,13 @@ public static Property fetchSkinByUrl(String skinUrl, boolean useSlim) { @Nullable public static Property fetchSkinByName(String playername) { try { - String reply = urlRequest(new URL("https://api.mojang.com/users/profiles/minecraft/" + playername), true, null); + String reply = urlRequest(URI.create("https://api.mojang.com/users/profiles/minecraft/" + playername).toURL(), true, null); - if(reply == null || !reply.contains("id")) { - reply = urlRequest(new URL(String.format("http://skinsystem.ely.by/textures/signed/%s.png?proxy=true", playername)), false, null); + if (reply == null || !reply.contains("id")) { + reply = urlRequest(URI.create(String.format("http://skinsystem.ely.by/textures/signed/%s.png?proxy=true", playername)).toURL(), false, null); } else { String uuid = JsonParser.parseString(reply).getAsJsonObject().get("id").getAsString(); - reply = urlRequest(new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid + "?unsigned=false"), true, null); + reply = urlRequest(URI.create("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid + "?unsigned=false").toURL(), true, null); } return getSkinFromReply(reply); } catch (IOException e) { @@ -123,12 +124,13 @@ private static String urlRequest(URL url, boolean useGetMethod, @Nullable File i String reply = null; - if(connection instanceof HttpsURLConnection httpsConnection) { + if (connection instanceof HttpsURLConnection httpsConnection) { httpsConnection.setUseCaches(false); httpsConnection.setDoOutput(true); httpsConnection.setDoInput(true); httpsConnection.setRequestMethod(useGetMethod ? "GET" : "POST"); - if(image != null) { + if (image != null) { + // Do a POST request with image String boundary = UUID.randomUUID().toString(); httpsConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); httpsConnection.setRequestProperty("User-Agent", "User-Agent"); @@ -151,8 +153,8 @@ private static String urlRequest(URL url, boolean useGetMethod, @Nullable File i writer.append(LINE); writer.flush(); - byte[] fileBytes = Files.readAllBytes(image.toPath()); - outputStream.write(fileBytes, 0, fileBytes.length); + byte[] fileBytes = Files.readAllBytes(image.toPath()); + outputStream.write(fileBytes, 0, fileBytes.length); outputStream.flush(); writer.append(LINE); @@ -161,11 +163,12 @@ private static String urlRequest(URL url, boolean useGetMethod, @Nullable File i writer.append("--").append(boundary).append("--").append(LINE); writer.close(); } - if(httpsConnection.getResponseCode() == HttpURLConnection.HTTP_OK) + + if (httpsConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { reply = getContent(connection); + } httpsConnection.disconnect(); - } - else { + } else { reply = getContent(connection); } return reply; @@ -186,9 +189,9 @@ private static String getContent(URLConnection connection) throws IOException { Scanner scanner = new Scanner(isr) ) { StringBuilder reply = new StringBuilder(); - while(scanner.hasNextLine()) { + while (scanner.hasNextLine()) { String line = scanner.next(); - if(line.trim().isEmpty()) + if (line.trim().isEmpty()) continue; reply.append(line); } diff --git a/src/test/java/org/samo_lego/fabrictailor/testmod/TailorTest.java b/src/test/java/org/samo_lego/fabrictailor/testmod/TailorTest.java index d7d0471..90c6548 100644 --- a/src/test/java/org/samo_lego/fabrictailor/testmod/TailorTest.java +++ b/src/test/java/org/samo_lego/fabrictailor/testmod/TailorTest.java @@ -2,26 +2,34 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.context.CommandContext; +import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.minecraft.client.gui.components.tabs.Tab; import net.minecraft.client.player.LocalPlayer; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import org.samo_lego.fabrictailor.client.screen.tabs.CapeTab; +import org.samo_lego.fabrictailor.client.screen.tabs.UrlSkinTab; import org.samo_lego.fabrictailor.command.SkinCommand; import org.samo_lego.fabrictailor.util.SkinFetcher; -public class TailorTest implements ModInitializer { +public class TailorTest implements ModInitializer, ClientModInitializer { @Override public void onInitialize() { CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { this.serversideSkinCmd(dispatcher); }); + } + + + @Override + public void onInitializeClient() { ClientCommandRegistrationCallback.EVENT.register((dispatcher, environment) -> { this.hdSkinCmd(dispatcher); this.capeCmd(dispatcher); @@ -33,6 +41,8 @@ private void hdSkinCmd(CommandDispatcher dispatcher) } private int hdSkinCmd(CommandContext context) { + new UrlSkinTab().getSkinChangePacket(context.getSource().getPlayer(), "https://raw.githubusercontent.com/ClassicFaithful/32x-Jappa/1.20.4/assets/minecraft/textures/entity/player/wide/steve.png", false) + .ifPresent(ClientPlayNetworking::send); return 0; } @@ -44,7 +54,7 @@ private int capeCmd(CommandContext context) { LocalPlayer player = context.getSource().getPlayer(); new CapeTab().getSkinChangePacket(player, "https://static.wikia.nocookie.net/minecraft_gamepedia/images/6/65/Millionth_Customer_Cape_%28texture%29.png", false) - .ifPresent(packet -> ClientPlayNetworking.send(packet.getFirst(), packet.getSecond())); + .ifPresent(ClientPlayNetworking::send); return 0; } @@ -55,7 +65,7 @@ private void serversideSkinCmd(CommandDispatcher dispatcher) return 1; })) .then(Commands.literal("url").executes(ctx -> { - SkinCommand.setSkin(ctx.getSource().getPlayer(), () -> SkinFetcher.fetchSkinByUrl("https://skinmc.net/en/api/v1/skins/uuid/853c80ef-3c37-49fd-aa49-938b674adae6", false)); + SkinCommand.setSkin(ctx.getSource().getPlayer(), () -> SkinFetcher.fetchSkinByUrl("https://textures.minecraft.net/texture/2736a21f4f7ccbc791ca44527445b2bea3d5bedd11cff16bf1d4d08044d51fc6", false)); return 1; }))); diff --git a/src/test/resources/fabric.mod.json b/src/test/resources/fabric.mod.json index 581aaab..573a69b 100644 --- a/src/test/resources/fabric.mod.json +++ b/src/test/resources/fabric.mod.json @@ -21,6 +21,9 @@ "entrypoints": { "main": [ "org.samo_lego.fabrictailor.testmod.TailorTest" + ], + "client": [ + "org.samo_lego.fabrictailor.testmod.TailorTest" ] }, "mixins": [ ],