Skip to content
This repository was archived by the owner on Nov 28, 2025. It is now read-only.

Commit ea2d30a

Browse files
committed
add local metadata file
1 parent 3c518f4 commit ea2d30a

File tree

19 files changed

+363
-243
lines changed

19 files changed

+363
-243
lines changed

1.16_combat-6/src/main/java/io/github/axolotlclient/modules/auth/skin/SkinManagementScreen.java

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
import net.minecraft.client.gui.widget.ElementListWidget;
5959
import net.minecraft.client.render.Tessellator;
6060
import net.minecraft.client.render.VertexFormats;
61-
import net.minecraft.client.resource.language.I18n;
6261
import net.minecraft.client.util.math.MatrixStack;
6362
import net.minecraft.text.LiteralText;
6463
import net.minecraft.text.MutableText;
@@ -90,7 +89,7 @@ public SkinManagementScreen(Screen parent, Account account) {
9089
super(new TranslatableText("skins.manage"));
9190
this.parent = parent;
9291
this.account = account;
93-
skinDirWatcher = Watcher.createSelfTicking(SKINS_DIR, () -> {
92+
skinDirWatcher = Watcher.createSelfTicking(SKINS_DIR, s -> !s.endsWith(Skin.Local.METADATA_SUFFIX), () -> {
9493
AxolotlClientCommon.getInstance().getLogger().info("Reloading screen as local files changed!");
9594
loadSkinsList();
9695
});
@@ -167,23 +166,18 @@ protected MutableText getNarrationMessage() {
167166
this.capesTab = true;
168167
});
169168
navBar.add(capesTab);
170-
var importButton = new ButtonWidget(capesTab.x+capesTab.getWidth()-11, capesTab.y-13, 11, 11, new TranslatableText("skins.manage.import"), btn -> {
169+
var importButton = new SpriteButton(new TranslatableText("skins.manage.import.local"), btn -> {
171170
btn.active = false;
172171
SkinImportUtil.openImportSkinDialog().thenAccept(this::filesDragged).thenRun(() -> btn.active = true);
173-
}) {
174-
private final Identifier sprite = new Identifier("axolotlclient", "textures/gui/sprites/download.png");
175-
176-
@Override
177-
public void renderButton(MatrixStack graphics, int mouseX, int mouseY, float delta) {
178-
Identifier tex = ButtonWidgetTextures.get(getYImage(hovered));
179-
DrawUtil.blitSprite(tex, x, y, width, height, new DrawUtil.NineSlice(200, 20, 3));
180-
client.getTextureManager().bindTexture(sprite);
181-
drawTexture(graphics, x + 2, y + 2, 0, 0, 7, 7, 7, 7);
182-
if (this.isHovered()) {
183-
tooltip = getMessage();
184-
}
185-
}
186-
};
172+
}, new Identifier("axolotlclient", "textures/gui/sprites/folder.png"));
173+
importButton.x = capesTab.x + capesTab.getWidth() - 11;
174+
importButton.y = capesTab.y - 13;
175+
var downloadButton = new SpriteButton(new TranslatableText("skins.manage.import.online"), btn -> {
176+
btn.active = false;
177+
// TODO
178+
}, new Identifier("axolotlclient", "textures/gui/sprites/download.png"));
179+
downloadButton.x = importButton.x - 2 - 11;
180+
downloadButton.y = capesTab.y - 13;
187181
skinsTab.active = this.capesTab;
188182
capesTab.active = !this.capesTab;
189183
Runnable addWidgets = () -> {
@@ -193,6 +187,7 @@ public void renderButton(MatrixStack graphics, int mouseX, int mouseY, float del
193187
addDrawableChild(capesList);
194188
addDrawableChild(skinsTab);
195189
addDrawableChild(capesTab);
190+
addDrawableChild(downloadButton);
196191
addDrawableChild(importButton);
197192
addDrawableChild(back);
198193
};
@@ -252,7 +247,7 @@ public void render(MatrixStack graphics, int mouseX, int mouseY, float delta) {
252247
drawables.forEach(d -> d.render(graphics, mouseX, mouseY, delta));
253248
drawCenteredText(graphics, textRenderer, getTitle(), width / 2, 33 / 2 - textRenderer.fontHeight / 2, -1);
254249
if (tooltip != null) {
255-
renderTooltip(graphics, tooltip, mouseX, mouseY+20);
250+
renderTooltip(graphics, tooltip, mouseX, mouseY + 20);
256251
}
257252
}
258253

@@ -384,7 +379,7 @@ public void filesDragged(List<Path> packs) {
384379
int counter = 0;
385380
do {
386381
counter++;
387-
target = target.resolveSibling(target.getFileName().toString()+"_"+counter);
382+
target = target.resolveSibling(target.getFileName().toString() + "_" + counter);
388383
} while (Files.exists(target));
389384
}
390385
var skin = Auth.getInstance().getSkinManager().read(p, false);
@@ -563,25 +558,6 @@ public Entry(int height, SkinWidget widget, @Nullable Text label) {
563558
super(0, 0, widget.getWidth(), height, LiteralText.EMPTY);
564559
widget.setWidth(getWidth() - 4);
565560
var asset = widget.getFocusedAsset();
566-
class SpriteButton extends ButtonWidget {
567-
private Identifier sprite;
568-
569-
public SpriteButton(Text message, PressAction onPress, Identifier sprite) {
570-
super(0, 0, 11, 11, message, onPress);
571-
this.sprite = sprite;
572-
}
573-
574-
@Override
575-
public void renderButton(MatrixStack graphics, int mouseX, int mouseY, float delta) {
576-
Identifier tex = ButtonWidgetTextures.get(getYImage(hovered));
577-
DrawUtil.blitSprite(tex, x, y, width, height, new DrawUtil.NineSlice(200, 20, 3));
578-
client.getTextureManager().bindTexture(sprite);
579-
drawTexture(graphics, x + 2, y + 2, 0, 0, 7, 7, 7, 7);
580-
if (this.isHovered()) {
581-
tooltip = getMessage();
582-
}
583-
}
584-
}
585561
if (asset instanceof Skin skin) {
586562
var wideSprite = new Identifier("axolotlclient", "textures/gui/sprites/wide.png");
587563
var slimSprite = new Identifier("axolotlclient", "textures/gui/sprites/slim.png");
@@ -623,6 +599,9 @@ public void renderButton(MatrixStack graphics, int mouseX, int mouseY, float del
623599
var out = SKINS_DIR.resolve(asset.textureKey());
624600
Files.createDirectories(out.getParent());
625601
Files.write(out, b);
602+
if (asset instanceof Skin skin) {
603+
Skin.Local.writeMetadata(out, Map.of(Skin.Local.CLASSIC_METADATA_KEY, skin.classicVariant()));
604+
}
626605
} catch (IOException e) {
627606
AxolotlClientCommon.getInstance().getLogger().warn("Failed to download: ", e);
628607
}
@@ -812,4 +791,24 @@ public static void render(MatrixStack graphics, int x0, int y0, int x1, int y1,
812791
}
813792
}
814793
}
794+
795+
private class SpriteButton extends ButtonWidget {
796+
private Identifier sprite;
797+
798+
public SpriteButton(Text message, PressAction onPress, Identifier sprite) {
799+
super(0, 0, 11, 11, message, onPress);
800+
this.sprite = sprite;
801+
}
802+
803+
@Override
804+
public void renderButton(MatrixStack graphics, int mouseX, int mouseY, float delta) {
805+
Identifier tex = ButtonWidgetTextures.get(getYImage(hovered));
806+
DrawUtil.blitSprite(tex, x, y, width, height, new DrawUtil.NineSlice(200, 20, 3));
807+
client.getTextureManager().bindTexture(sprite);
808+
drawTexture(graphics, x + 2, y + 2, 0, 0, 7, 7, 7, 7);
809+
if (this.isHovered()) {
810+
tooltip = getMessage();
811+
}
812+
}
813+
}
815814
}

1.16_combat-6/src/main/java/io/github/axolotlclient/modules/auth/skin/SkinManager.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public Skin read(Path p) {
5757

5858
@SuppressWarnings("UnstableApiUsage")
5959
public Skin read(Path p, boolean fix) {
60+
if (p.getFileName().toString().endsWith(Skin.Local.METADATA_SUFFIX)) return null;
6061
boolean slim;
6162
String sha256;
6263
try {
@@ -80,7 +81,11 @@ public Skin read(Path p, boolean fix) {
8081
} else if (height != 64) {
8182
return null;
8283
} else {
83-
slim = ClientColors.ARGB.alpha(img.getPixelColor(63, 63)) == 0;
84+
slim = ClientColors.ARGB.alpha(img.getPixelColor(50, 16)) == 0;
85+
}
86+
var metadata = Skin.Local.readMetadata(p);
87+
if (metadata != null && metadata.containsKey(Skin.Local.CLASSIC_METADATA_KEY)) {
88+
slim = !(boolean) metadata.get(Skin.Local.CLASSIC_METADATA_KEY);
8489
}
8590
}
8691
}

1.16_combat-6/src/main/java/io/github/axolotlclient/modules/auth/skin/SkinRenderer.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@
2222

2323
package io.github.axolotlclient.modules.auth.skin;
2424

25+
import java.util.function.Consumer;
26+
2527
import com.mojang.blaze3d.systems.RenderSystem;
2628
import net.minecraft.client.MinecraftClient;
29+
import net.minecraft.client.model.ModelPart;
2730
import net.minecraft.client.render.*;
2831
import net.minecraft.client.render.entity.model.PlayerEntityModel;
2932
import net.minecraft.client.util.math.MatrixStack;
@@ -85,7 +88,22 @@ public static void render(MatrixStack graphics, boolean classicVariant,
8588
graphics.pop();
8689
}
8790
MinecraftClient.getInstance().getTextureManager().bindTexture(skinTexture);
88-
model.render(graphics, VertexConsumerProvider.immediate(tessellator.getBuffer()).getBuffer(model.getLayer(skinTexture)), 15728880, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1);
91+
var consumer = VertexConsumerProvider.immediate(tessellator.getBuffer()).getBuffer(model.getLayer(skinTexture));
92+
Consumer<ModelPart> renderModelPart = m -> m.render(graphics, consumer, 15728880, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1);
93+
renderModelPart.accept(model.head);
94+
renderModelPart.accept(model.torso);
95+
renderModelPart.accept(model.rightArm);
96+
renderModelPart.accept(model.leftArm);
97+
renderModelPart.accept(model.rightLeg);
98+
renderModelPart.accept(model.leftLeg);
99+
renderModelPart.accept(model.helmet);
100+
renderModelPart.accept(model.leftPantLeg);
101+
renderModelPart.accept(model.rightPantLeg);
102+
renderModelPart.accept(model.leftSleeve);
103+
graphics.translate(0, 0, -0.62f);
104+
renderModelPart.accept(model.rightSleeve);
105+
graphics.translate(0, 0, 0.62f);
106+
renderModelPart.accept(model.jacket);
89107
tessellator.draw();
90108
graphics.pop();
91109

1.20/src/main/java/io/github/axolotlclient/mixin/skins/PlayerSkinTextureAccessor.java

Lines changed: 0 additions & 37 deletions
This file was deleted.

1.20/src/main/java/io/github/axolotlclient/modules/auth/skin/SkinManagementScreen.java

Lines changed: 42 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import java.util.concurrent.CancellationException;
3030
import java.util.concurrent.CompletableFuture;
3131
import java.util.function.Function;
32-
import java.util.function.Supplier;
3332
import java.util.stream.Collectors;
3433
import java.util.stream.Stream;
3534

@@ -80,7 +79,7 @@ public SkinManagementScreen(Screen parent, Account account) {
8079
super(Text.translatable("skins.manage"));
8180
this.parent = parent;
8281
this.account = account;
83-
skinDirWatcher = Watcher.createSelfTicking(SKINS_DIR, () -> {
82+
skinDirWatcher = Watcher.createSelfTicking(SKINS_DIR, s -> !s.endsWith(Skin.Local.METADATA_SUFFIX), () -> {
8483
AxolotlClientCommon.getInstance().getLogger().info("Reloading screen as local files changed!");
8584
loadSkinsList();
8685
});
@@ -157,24 +156,16 @@ protected void updateNarration(NarrationMessageBuilder builder) {
157156
this.capesTab = true;
158157
}).position(width * 3 / 4 + 2, headerHeight).width(100).build();
159158
navBar.add(capesTab);
160-
var importButton = new ButtonWidget(capesTab.getX()+capesTab.getWidth()-11, capesTab.getY()-13, 11, 11, Text.translatable("skins.manage.import"), btn -> {
159+
var importButton = new SpriteButton(Text.translatable("skins.manage.import.local"), btn -> {
161160
btn.active = false;
162161
SkinImportUtil.openImportSkinDialog().thenAccept(this::filesDragged).thenRun(() -> btn.active = true);
163-
}, Supplier::get) {
164-
private final Identifier SPRITE = new Identifier("axolotlclient", "textures/gui/sprites/download.png");
165-
166-
@Override
167-
protected void drawWidget(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
168-
super.drawWidget(graphics, mouseX, mouseY, delta);
169-
graphics.drawTexture(SPRITE, getX() + 2, getY() + 2, 0, 0, 7, 7, 7, 7);
170-
}
171-
172-
@Override
173-
public void drawScrollableText(GuiGraphics graphics, TextRenderer renderer, int color) {
174-
175-
}
176-
};
177-
importButton.setTooltip(Tooltip.create(importButton.getMessage()));
162+
}, new Identifier("axolotlclient", "textures/gui/sprites/folder.png"));
163+
importButton.setPosition(capesTab.getX() + capesTab.getWidth() - 11, capesTab.getY() - 13);
164+
var downloadButton = new SpriteButton(Text.translatable("skins.manage.import.online"), btn -> {
165+
btn.active = false;
166+
// TODO
167+
}, new Identifier("axolotlclient", "textures/gui/sprites/download.png"));
168+
downloadButton.setPosition(importButton.getX() - 2 - 11, capesTab.getY() - 13);
178169
skinsTab.active = this.capesTab;
179170
capesTab.active = !this.capesTab;
180171
Runnable addWidgets = () -> {
@@ -185,6 +176,7 @@ public void drawScrollableText(GuiGraphics graphics, TextRenderer renderer, int
185176
addDrawableChild(capesList);
186177
addDrawableChild(skinsTab);
187178
addDrawableChild(capesTab);
179+
addDrawableChild(downloadButton);
188180
addDrawableChild(importButton);
189181
addDrawableChild(back);
190182
};
@@ -349,7 +341,7 @@ public void filesDragged(List<Path> packs) {
349341
int counter = 0;
350342
do {
351343
counter++;
352-
target = target.resolveSibling(target.getFileName().toString()+"_"+counter);
344+
target = target.resolveSibling(target.getFileName().toString() + "_" + counter);
353345
} while (Files.exists(target));
354346
}
355347
var skin = Auth.getInstance().getSkinManager().read(p, false);
@@ -535,32 +527,6 @@ public Entry(int height, SkinWidget widget, @Nullable Text label) {
535527
widget.setWidth(getWidth() - 4);
536528
var asset = widget.getFocusedAsset();
537529
if (asset != null) {
538-
class SpriteButton extends ButtonWidget {
539-
private Identifier sprite;
540-
541-
public SpriteButton(Text message, PressAction onPress, Identifier sprite) {
542-
super(0, 0, 11, 11, message, onPress, DEFAULT_NARRATION);
543-
this.sprite = sprite;
544-
setTooltip(Tooltip.create(message, Text.empty()));
545-
}
546-
547-
@Override
548-
public void setMessage(Text message) {
549-
super.setMessage(message);
550-
setTooltip(Tooltip.create(message, Text.empty()));
551-
}
552-
553-
@Override
554-
protected void drawWidget(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
555-
super.drawWidget(graphics, mouseX, mouseY, delta);
556-
graphics.drawTexture(sprite, getX() + 2, getY() + 2, 0, 0, 7, 7, 7, 7);
557-
}
558-
559-
@Override
560-
public void drawScrollableText(GuiGraphics graphics, TextRenderer renderer, int color) {
561-
562-
}
563-
}
564530
if (asset instanceof Skin skin) {
565531
var wideSprite = new Identifier("axolotlclient", "textures/gui/sprites/wide.png");
566532
var slimSprite = new Identifier("axolotlclient", "textures/gui/sprites/slim.png");
@@ -601,6 +567,9 @@ public void drawScrollableText(GuiGraphics graphics, TextRenderer renderer, int
601567
var out = SKINS_DIR.resolve(asset.textureKey());
602568
Files.createDirectories(out.getParent());
603569
Files.write(out, b);
570+
if (asset instanceof Skin skin) {
571+
Skin.Local.writeMetadata(out, Map.of(Skin.Local.CLASSIC_METADATA_KEY, skin.classicVariant()));
572+
}
604573
} catch (IOException e) {
605574
AxolotlClientCommon.getInstance().getLogger().warn("Failed to download: ", e);
606575
}
@@ -797,5 +766,33 @@ public static void render(GuiGraphics graphics, int x0, int y0, int x1, int y1,
797766
vertexConsumer.vertex(pose, x1, y1, z).color(col1).next();
798767
}
799768
}
769+
770+
}
771+
772+
private static class SpriteButton extends ButtonWidget {
773+
private Identifier sprite;
774+
775+
public SpriteButton(Text message, PressAction onPress, Identifier sprite) {
776+
super(0, 0, 11, 11, message, onPress, DEFAULT_NARRATION);
777+
this.sprite = sprite;
778+
setTooltip(Tooltip.create(message, Text.empty()));
779+
}
780+
781+
@Override
782+
public void setMessage(Text message) {
783+
super.setMessage(message);
784+
setTooltip(Tooltip.create(message, Text.empty()));
785+
}
786+
787+
@Override
788+
protected void drawWidget(GuiGraphics graphics, int mouseX, int mouseY, float delta) {
789+
super.drawWidget(graphics, mouseX, mouseY, delta);
790+
graphics.drawTexture(sprite, getX() + 2, getY() + 2, 0, 0, 7, 7, 7, 7);
791+
}
792+
793+
@Override
794+
public void drawScrollableText(GuiGraphics graphics, TextRenderer renderer, int color) {
795+
796+
}
800797
}
801798
}

0 commit comments

Comments
 (0)