forked from MinecraftUtilities/Backend
fix legacy skins
This commit is contained in:
parent
c8b6f2aad8
commit
bfbaf34b24
@ -84,7 +84,7 @@ public class Skin {
|
|||||||
}
|
}
|
||||||
String url = json.get("url").getAsString();
|
String url = json.get("url").getAsString();
|
||||||
JsonObject metadata = json.getAsJsonObject("metadata");
|
JsonObject metadata = json.getAsJsonObject("metadata");
|
||||||
Model model = Model.fromName(metadata == null ? "slim" : // Fall back to slim if the model is not found
|
Model model = Model.fromName(metadata == null ? "default" : // Fall back to slim if the model is not found
|
||||||
metadata.get("model").getAsString());
|
metadata.get("model").getAsString());
|
||||||
return new Skin(url, model);
|
return new Skin(url, model);
|
||||||
}
|
}
|
||||||
@ -148,37 +148,37 @@ public class Skin {
|
|||||||
/**
|
/**
|
||||||
* Skin postions
|
* Skin postions
|
||||||
*/
|
*/
|
||||||
HEAD(8, 8, 8, 8, false),
|
HEAD(8, 8, 8, 8, null),
|
||||||
HEAD_TOP(8, 0, 8, 8, false),
|
HEAD_TOP(8, 0, 8, 8, null),
|
||||||
HEAD_FRONT(8, 8, 8, 8, false),
|
HEAD_FRONT(8, 8, 8, 8, null),
|
||||||
HEAD_RIGHT(0, 8, 8, 8, false),
|
HEAD_RIGHT(0, 8, 8, 8, null),
|
||||||
|
|
||||||
BODY(20, 20, 8, 12, false),
|
BODY(20, 20, 8, 12, null),
|
||||||
BODY_BACK(20, 36, 8, 12, false),
|
BODY_BACK(20, 36, 8, 12, null),
|
||||||
BODY_LEFT(32, 52, 8, 12, false),
|
BODY_LEFT(32, 52, 8, 12, null),
|
||||||
BODY_RIGHT(44, 20, 8, 12, false),
|
BODY_RIGHT(44, 20, 8, 12, null),
|
||||||
|
|
||||||
RIGHT_ARM(44, 20, 4, 12, false),
|
RIGHT_ARM(44, 20, 4, 12, null),
|
||||||
LEFT_ARM(36, 52, 4, 12, true),
|
LEFT_ARM(36, 52, 4, 12, new LegacySkinPosition(44, 20, true)),
|
||||||
|
|
||||||
RIGHT_LEG(4, 20, 4, 12, false),
|
RIGHT_LEG(4, 20, 4, 12, null),
|
||||||
LEFT_LEG(20, 52, 4, 12, true),
|
LEFT_LEG(20, 52, 4, 12, new LegacySkinPosition(4, 20, true)),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Skin overlay (layer) positions
|
* Skin overlay (layer) positions
|
||||||
*/
|
*/
|
||||||
HEAD_OVERLAY_TOP(40, 0, 8, 8, false),
|
HEAD_OVERLAY_TOP(40, 0, 8, 8, null),
|
||||||
HEAD_OVERLAY_FRONT(40, 8, 8, 8, false),
|
HEAD_OVERLAY_FRONT(40, 8, 8, 8, null),
|
||||||
HEAD_OVERLAY_RIGHT(32, 8, 8, 8, false),
|
HEAD_OVERLAY_RIGHT(32, 8, 8, 8, null),
|
||||||
HEAD_OVERLAY_LEFT(48, 8, 8, 8, false),
|
HEAD_OVERLAY_LEFT(48, 8, 8, 8, null),
|
||||||
|
|
||||||
BODY_OVERLAY_FRONT(20, 36, 8, 12, false),
|
BODY_OVERLAY_FRONT(20, 36, 8, 12, null),
|
||||||
|
|
||||||
RIGHT_ARM_OVERLAY(44, 36, 8, 12, false),
|
RIGHT_ARM_OVERLAY(44, 36, 8, 12, null),
|
||||||
LEFT_ARM_OVERLAY(52, 52, 8, 12, false),
|
LEFT_ARM_OVERLAY(52, 52, 8, 12, null),
|
||||||
|
|
||||||
RIGHT_LEG_OVERLAY(4, 36, 4, 12, false),
|
RIGHT_LEG_OVERLAY(4, 36, 4, 12, null),
|
||||||
LEFT_LEG_OVERLAY(4, 52, 20, 12, false);
|
LEFT_LEG_OVERLAY(4, 52, 20, 12, null);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The x, and y position of the part.
|
* The x, and y position of the part.
|
||||||
@ -190,6 +190,20 @@ public class Skin {
|
|||||||
*/
|
*/
|
||||||
private final int width, height;
|
private final int width, height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The legacy skin position of the part.
|
||||||
|
*/
|
||||||
|
private final LegacySkinPosition legacySkinPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
@AllArgsConstructor @Getter
|
||||||
|
public static class LegacySkinPosition {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The x, and y position of the part.
|
||||||
|
*/
|
||||||
|
private final int x, y;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Should the part be flipped horizontally?
|
* Should the part be flipped horizontally?
|
||||||
*/
|
*/
|
||||||
|
@ -45,13 +45,16 @@ public abstract class SkinRenderer {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
int width = skin.getModel() == Skin.Model.SLIM && position.name().contains("ARM") ? position.getWidth() - 1 : position.getWidth();
|
int width = skin.getModel() == Skin.Model.SLIM && position.name().contains("ARM") ? position.getWidth() - 1 : position.getWidth();
|
||||||
BufferedImage part = skinImage.getSubimage(position.getX(), position.getY(), width, position.getHeight());
|
BufferedImage part;
|
||||||
if (part == null) {
|
Skin.LegacySkinPosition legacySkinPosition = position.getLegacySkinPosition();
|
||||||
return null;
|
if (legacySkinPosition != null) {
|
||||||
}
|
part = skinImage.getSubimage(legacySkinPosition.getX(), legacySkinPosition.getY(), width, position.getHeight());
|
||||||
if (position.isFlipped()) { // Flip the part horizontally
|
if (legacySkinPosition.isFlipped()) {
|
||||||
part = ImageUtils.flip(part);
|
part = ImageUtils.flip(part);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
part = skinImage.getSubimage(position.getX(), position.getY(), width, position.getHeight());
|
||||||
|
}
|
||||||
return ImageUtils.resize(part, scale);
|
return ImageUtils.resize(part, scale);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
return null;
|
return null;
|
||||||
@ -81,15 +84,18 @@ public abstract class SkinRenderer {
|
|||||||
/**
|
/**
|
||||||
* Applies an overlay (skin layer) to the head part.
|
* Applies an overlay (skin layer) to the head part.
|
||||||
*
|
*
|
||||||
* @param graphics the graphics
|
* @param originalImage the original image
|
||||||
* @param part the part
|
* @param part the part
|
||||||
*/
|
*/
|
||||||
public void applyOverlay(Graphics2D graphics, BufferedImage part) {
|
public void applyOverlay(BufferedImage originalImage, BufferedImage part) {
|
||||||
if (part == null) {
|
if (part == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
Graphics2D graphics = originalImage.createGraphics();
|
||||||
graphics.drawImage(part, 0, 0, null);
|
graphics.drawImage(part, 0, 0, null);
|
||||||
graphics.dispose();
|
graphics.dispose();
|
||||||
|
} catch (Exception ignored) {} // We can safely ignore this
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,12 +32,12 @@ public class BodyRenderer extends SkinRenderer {
|
|||||||
BufferedImage leftLeg = this.getSkinPart(skin, Skin.PartPosition.LEFT_LEG, 1);
|
BufferedImage leftLeg = this.getSkinPart(skin, Skin.PartPosition.LEFT_LEG, 1);
|
||||||
|
|
||||||
if (renderOverlay) { // Render the skin layers
|
if (renderOverlay) { // Render the skin layers
|
||||||
applyOverlay(head.createGraphics(), this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_FRONT, 1));
|
applyOverlay(head, this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_FRONT, 1));
|
||||||
applyOverlay(body.createGraphics(), this.getSkinPart(skin, Skin.PartPosition.BODY_OVERLAY_FRONT, 1));
|
applyOverlay(body, this.getSkinPart(skin, Skin.PartPosition.BODY_OVERLAY_FRONT, 1));
|
||||||
applyOverlay(rightArm.createGraphics(), this.getSkinPart(skin, Skin.PartPosition.RIGHT_ARM_OVERLAY, 1));
|
applyOverlay(rightArm, this.getSkinPart(skin, Skin.PartPosition.RIGHT_ARM_OVERLAY, 1));
|
||||||
applyOverlay(leftArm.createGraphics(), this.getSkinPart(skin, Skin.PartPosition.LEFT_ARM_OVERLAY, 1));
|
applyOverlay(leftArm, this.getSkinPart(skin, Skin.PartPosition.LEFT_ARM_OVERLAY, 1));
|
||||||
applyOverlay(rightLeg.createGraphics(), this.getSkinPart(skin, Skin.PartPosition.RIGHT_LEG_OVERLAY, 1));
|
applyOverlay(rightLeg, this.getSkinPart(skin, Skin.PartPosition.RIGHT_LEG_OVERLAY, 1));
|
||||||
applyOverlay(leftLeg.createGraphics(), this.getSkinPart(skin, Skin.PartPosition.LEFT_LEG_OVERLAY, 1));
|
applyOverlay(leftLeg, this.getSkinPart(skin, Skin.PartPosition.LEFT_LEG_OVERLAY, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the body
|
// Draw the body
|
||||||
|
@ -25,7 +25,7 @@ public class HeadRenderer extends SkinRenderer {
|
|||||||
graphics.drawImage(this.getSkinPart(skin, Skin.PartPosition.HEAD, 1), 0, 0, null);
|
graphics.drawImage(this.getSkinPart(skin, Skin.PartPosition.HEAD, 1), 0, 0, null);
|
||||||
|
|
||||||
if (renderOverlay) { // Render the skin layers
|
if (renderOverlay) { // Render the skin layers
|
||||||
applyOverlay(outputImage.createGraphics(), this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_FRONT, 1));
|
applyOverlay(outputImage, this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_FRONT, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.getBytes(outputImage, skin, partName);
|
return super.getBytes(outputImage, skin, partName);
|
||||||
|
@ -41,14 +41,9 @@ public class IsometricHeadRenderer extends SkinRenderer {
|
|||||||
BufferedImage headRight = ImageUtils.resize(this.getSkinPart(skin, Skin.PartPosition.HEAD_RIGHT, 1), scale);
|
BufferedImage headRight = ImageUtils.resize(this.getSkinPart(skin, Skin.PartPosition.HEAD_RIGHT, 1), scale);
|
||||||
|
|
||||||
if (renderOverlay) { // Render the skin layers
|
if (renderOverlay) { // Render the skin layers
|
||||||
Graphics2D headGraphics = headTop.createGraphics();
|
applyOverlay(headTop, this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_TOP, 1));
|
||||||
applyOverlay(headGraphics, this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_TOP, 1));
|
applyOverlay(headFront, this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_FRONT, 1));
|
||||||
|
applyOverlay(headRight, this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_RIGHT, 1));
|
||||||
headGraphics = headFront.createGraphics();
|
|
||||||
applyOverlay(headGraphics, this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_FRONT, 1));
|
|
||||||
|
|
||||||
headGraphics = headRight.createGraphics();
|
|
||||||
applyOverlay(headGraphics, this.getSkinPart(skin, Skin.PartPosition.HEAD_OVERLAY_RIGHT, 1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw the head
|
// Draw the head
|
||||||
|
Loading…
Reference in New Issue
Block a user