From abec1abcff320bab690d90855baf5dd7ab335a58 Mon Sep 17 00:00:00 2001 From: Glavo Date: Fri, 22 Mar 2024 16:09:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=BB=98=E8=AE=A4=E7=9A=AE?= =?UTF-8?q?=E8=82=A4=20(#2943)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 更新默认皮肤 * update * update * update * update * update * update --- .../mickey/minecraft/skin/fx/SkinCanvas.java | 8 ---- .../java/org/jackhuang/hmcl/Launcher.java | 26 ----------- .../jackhuang/hmcl/game/TexturesLoader.java | 34 +++++++++----- .../ui/account/AccountAdvancedListItem.java | 3 +- .../ui/account/OfflineAccountSkinPane.java | 33 ++++++-------- .../main/resources/assets/img/skin/alex.png | Bin 999 -> 0 bytes .../main/resources/assets/img/skin/ari.png | Bin 912 -> 0 bytes .../main/resources/assets/img/skin/efe.png | Bin 1001 -> 0 bytes .../main/resources/assets/img/skin/kai.png | Bin 1279 -> 0 bytes .../main/resources/assets/img/skin/makena.png | Bin 1110 -> 0 bytes .../main/resources/assets/img/skin/noor.png | Bin 861 -> 0 bytes .../main/resources/assets/img/skin/steve.png | Bin 958 -> 0 bytes .../main/resources/assets/img/skin/sunny.png | Bin 988 -> 0 bytes .../main/resources/assets/img/skin/zuri.png | Bin 947 -> 0 bytes .../resources/assets/lang/I18N.properties | 4 +- .../resources/assets/lang/I18N_es.properties | 4 +- .../resources/assets/lang/I18N_ja.properties | 4 +- .../resources/assets/lang/I18N_ru.properties | 4 +- .../resources/assets/lang/I18N_zh.properties | 4 +- .../assets/lang/I18N_zh_CN.properties | 4 +- .../mickey/minecraft/skin/fx/test/Test.java | 3 +- .../org/jackhuang/hmcl/auth/offline/Skin.java | 42 +++++++----------- .../hmcl/auth/offline/YggdrasilServer.java | 2 +- .../hmcl/auth/yggdrasil/TextureModel.java | 17 +------ .../resources/assets/img/skin/slim/alex.png | Bin 0 -> 1257 bytes .../resources/assets/img/skin/slim/ari.png | Bin 0 -> 1141 bytes .../resources/assets/img/skin/slim/efe.png | Bin 0 -> 1282 bytes .../resources/assets/img/skin/slim/kai.png | Bin 0 -> 1574 bytes .../resources/assets/img/skin/slim/makena.png | Bin 0 -> 1412 bytes .../resources/assets/img/skin/slim/noor.png | Bin 0 -> 1083 bytes .../resources/assets/img/skin/slim/steve.png | Bin 0 -> 1173 bytes .../resources/assets/img/skin/slim/sunny.png | Bin 0 -> 1194 bytes .../resources/assets/img/skin/slim/zuri.png | Bin 0 -> 1150 bytes .../resources/assets/img/skin/wide/alex.png | Bin 0 -> 1272 bytes .../resources/assets/img/skin/wide/ari.png | Bin 0 -> 1158 bytes .../resources/assets/img/skin/wide/efe.png | Bin 0 -> 1289 bytes .../resources/assets/img/skin/wide/kai.png | Bin 0 -> 1585 bytes .../resources/assets/img/skin/wide/makena.png | Bin 0 -> 1394 bytes .../resources/assets/img/skin/wide/noor.png | Bin 0 -> 1087 bytes .../resources/assets/img/skin/wide/steve.png | Bin 0 -> 1196 bytes .../resources/assets/img/skin/wide/sunny.png | Bin 0 -> 1201 bytes .../resources/assets/img/skin/wide/zuri.png | Bin 0 -> 1176 bytes .../hmcl/util/skin/NormalizedSkinTest.java | 19 ++++---- 43 files changed, 76 insertions(+), 135 deletions(-) delete mode 100644 HMCL/src/main/resources/assets/img/skin/alex.png delete mode 100644 HMCL/src/main/resources/assets/img/skin/ari.png delete mode 100644 HMCL/src/main/resources/assets/img/skin/efe.png delete mode 100644 HMCL/src/main/resources/assets/img/skin/kai.png delete mode 100644 HMCL/src/main/resources/assets/img/skin/makena.png delete mode 100644 HMCL/src/main/resources/assets/img/skin/noor.png delete mode 100644 HMCL/src/main/resources/assets/img/skin/steve.png delete mode 100644 HMCL/src/main/resources/assets/img/skin/sunny.png delete mode 100644 HMCL/src/main/resources/assets/img/skin/zuri.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/slim/alex.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/slim/ari.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/slim/efe.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/slim/kai.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/slim/makena.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/slim/noor.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/slim/steve.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/slim/sunny.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/slim/zuri.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/wide/alex.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/wide/ari.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/wide/efe.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/wide/kai.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/wide/makena.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/wide/noor.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/wide/steve.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/wide/sunny.png create mode 100644 HMCLCore/src/main/resources/assets/img/skin/wide/zuri.png diff --git a/HMCL/src/main/java/moe/mickey/minecraft/skin/fx/SkinCanvas.java b/HMCL/src/main/java/moe/mickey/minecraft/skin/fx/SkinCanvas.java index a52763570..8faf860b2 100644 --- a/HMCL/src/main/java/moe/mickey/minecraft/skin/fx/SkinCanvas.java +++ b/HMCL/src/main/java/moe/mickey/minecraft/skin/fx/SkinCanvas.java @@ -12,14 +12,10 @@ import javafx.scene.transform.Rotate; import javafx.scene.transform.Scale; import javafx.scene.transform.Translate; -import org.jackhuang.hmcl.ui.FXUtils; import org.jetbrains.annotations.Nullable; public class SkinCanvas extends Group { - public static final Image ALEX = FXUtils.newBuiltinImage("/assets/img/skin/alex.png"); - public static final Image STEVE = FXUtils.newBuiltinImage("/assets/img/skin/steve.png"); - public static final SkinCube ALEX_LARM = new SkinCube(3, 12, 4, 14F / 64F, 16F / 64F, 32F / 64F, 48F / 64F, 0F, true); public static final SkinCube ALEX_RARM = new SkinCube(3, 12, 4, 14F / 64F, 16F / 64F, 40F / 64F, 16F / 64F, 0F, true); @@ -152,10 +148,6 @@ public class SkinCanvas extends Group { capeGroup.setVisible(hasCape); } - public SkinCanvas(double preW, double preH) { - this(STEVE, preW, preH, true); - } - public SkinCanvas(Image skin, double preW, double preH, boolean msaa) { this.skin = skin; this.preW = preW; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index 772a436e1..4bb84658a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -25,7 +25,6 @@ import javafx.scene.control.ButtonType; import javafx.scene.input.Clipboard; import javafx.scene.input.DataFormat; import javafx.stage.Stage; -import org.jackhuang.hmcl.auth.offline.Skin; import org.jackhuang.hmcl.mod.RemoteMod; import org.jackhuang.hmcl.mod.RemoteModRepository; import org.jackhuang.hmcl.setting.ConfigHolder; @@ -129,31 +128,6 @@ public final class Launcher extends Application { } private static void register() { - Skin.registerDefaultSkinLoader((type) -> { - switch (type) { - case ALEX: - return Skin.class.getResourceAsStream("/assets/img/skin/alex.png"); - case ARI: - return Skin.class.getResourceAsStream("/assets/img/skin/ari.png"); - case EFE: - return Skin.class.getResourceAsStream("/assets/img/skin/efe.png"); - case KAI: - return Skin.class.getResourceAsStream("/assets/img/skin/kai.png"); - case MAKENA: - return Skin.class.getResourceAsStream("/assets/img/skin/makena.png"); - case NOOR: - return Skin.class.getResourceAsStream("/assets/img/skin/noor.png"); - case STEVE: - return Skin.class.getResourceAsStream("/assets/img/skin/steve.png"); - case SUNNY: - return Skin.class.getResourceAsStream("/assets/img/skin/sunny.png"); - case ZURI: - return Skin.class.getResourceAsStream("/assets/img/skin/zuri.png"); - default: - return null; - } - }); - RemoteMod.registerEmptyRemoteMod(new RemoteMod("", "", i18n("mods.broken_dependency.title"), i18n("mods.broken_dependency.desc"), new ArrayList<>(), "", "/assets/img/icon@8x.png", new RemoteMod.IMod() { @Override public List loadDependencies(RemoteModRepository modRepository) throws IOException { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/TexturesLoader.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/TexturesLoader.java index 3e40976cb..764396e35 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/TexturesLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/TexturesLoader.java @@ -140,23 +140,35 @@ public final class TexturesLoader { // ==== // ==== Skins ==== - private final static Map DEFAULT_SKINS = new EnumMap<>(TextureModel.class); + private static final String[] DEFAULT_SKINS = {"alex", "ari", "efe", "kai", "makena", "noor", "steve", "sunny", "zuri"}; - static { - loadDefaultSkin("/assets/img/skin/steve.png", TextureModel.STEVE); - loadDefaultSkin("/assets/img/skin/alex.png", TextureModel.ALEX); + public static Image getDefaultSkinImage() { + return FXUtils.newBuiltinImage("/assets/img/skin/wide/steve.png"); } - private static void loadDefaultSkin(String path, TextureModel model) { - DEFAULT_SKINS.put(model, new LoadedTexture(FXUtils.newBuiltinImage(path), singletonMap("model", model.modelName))); + public static LoadedTexture getDefaultSkin(UUID uuid) { + int idx = Math.floorMod(uuid.hashCode(), DEFAULT_SKINS.length * 2); + TextureModel model; + Image skin; + if (idx < DEFAULT_SKINS.length) { + model = TextureModel.SLIM; + skin = FXUtils.newBuiltinImage("/assets/img/skin/slim/" + DEFAULT_SKINS[idx] + ".png"); + } else { + model = TextureModel.WIDE; + skin = FXUtils.newBuiltinImage("/assets/img/skin/wide/" + DEFAULT_SKINS[idx - DEFAULT_SKINS.length] + ".png"); + } + + return new LoadedTexture(skin, singletonMap("model", model.modelName)); } - public static LoadedTexture getDefaultSkin(TextureModel model) { - return DEFAULT_SKINS.get(model); + public static TextureModel getDefaultModel(UUID uuid) { + return TextureModel.WIDE.modelName.equals(getDefaultSkin(uuid).getMetadata().get("model")) + ? TextureModel.WIDE + : TextureModel.SLIM; } public static ObjectBinding skinBinding(YggdrasilService service, UUID uuid) { - LoadedTexture uuidFallback = getDefaultSkin(TextureModel.detectUUID(uuid)); + LoadedTexture uuidFallback = getDefaultSkin(uuid); return BindingMapping.of(service.getProfileRepository().binding(uuid)) .map(profile -> profile .flatMap(it -> { @@ -187,7 +199,7 @@ public final class TexturesLoader { } public static ObservableValue skinBinding(Account account) { - LoadedTexture uuidFallback = getDefaultSkin(TextureModel.detectUUID(account.getUUID())); + LoadedTexture uuidFallback = getDefaultSkin(account.getUUID()); if (account instanceof OfflineAccount) { OfflineAccount offlineAccount = (OfflineAccount) account; @@ -348,7 +360,7 @@ public final class TexturesLoader { fxAvatarBinding(canvas, skinBinding(account)); else { unbindAvatar(canvas); - drawAvatar(canvas, getDefaultSkin(TextureModel.detectUUID(account.getUUID())).image); + drawAvatar(canvas, getDefaultSkin(account.getUUID()).image); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java index ab0bfa0f9..8ea02ad83 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/AccountAdvancedListItem.java @@ -27,7 +27,6 @@ import javafx.scene.control.Tooltip; import org.jackhuang.hmcl.auth.Account; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorAccount; import org.jackhuang.hmcl.auth.authlibinjector.AuthlibInjectorServer; -import org.jackhuang.hmcl.auth.yggdrasil.TextureModel; import org.jackhuang.hmcl.auth.yggdrasil.YggdrasilAccount; import org.jackhuang.hmcl.game.TexturesLoader; import org.jackhuang.hmcl.setting.Accounts; @@ -58,7 +57,7 @@ public class AccountAdvancedListItem extends AdvancedListItem { tooltip.setText(i18n("account.create")); TexturesLoader.unbindAvatar(canvas); - TexturesLoader.drawAvatar(canvas, TexturesLoader.getDefaultSkin(TextureModel.STEVE).getImage()); + TexturesLoader.drawAvatar(canvas, TexturesLoader.getDefaultSkinImage()); } else { titleProperty().bind(BindingMapping.of(account, Account::getCharacter)); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OfflineAccountSkinPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OfflineAccountSkinPane.java index 74e614756..a85f0f384 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OfflineAccountSkinPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/account/OfflineAccountSkinPane.java @@ -25,7 +25,6 @@ import javafx.application.Platform; import javafx.beans.InvalidationListener; import javafx.geometry.Insets; import javafx.scene.control.Label; -import javafx.scene.image.Image; import javafx.scene.input.DragEvent; import javafx.scene.input.TransferMode; import javafx.scene.layout.*; @@ -35,6 +34,7 @@ import moe.mickey.minecraft.skin.fx.animation.SkinAniWavingArms; import org.jackhuang.hmcl.auth.offline.OfflineAccount; import org.jackhuang.hmcl.auth.offline.Skin; import org.jackhuang.hmcl.auth.yggdrasil.TextureModel; +import org.jackhuang.hmcl.game.TexturesLoader; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; @@ -42,6 +42,7 @@ import org.jackhuang.hmcl.ui.construct.*; import java.io.File; import java.util.Arrays; +import java.util.UUID; import java.util.logging.Level; import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; @@ -71,7 +72,7 @@ public class OfflineAccountSkinPane extends StackPane { BorderPane pane = new BorderPane(); - SkinCanvas canvas = new SkinCanvas(SkinCanvas.STEVE, 300, 300, true); + SkinCanvas canvas = new SkinCanvas(TexturesLoader.getDefaultSkinImage(), 300, 300, true); StackPane canvasPane = new StackPane(canvas); canvasPane.setPrefWidth(300); canvasPane.setPrefHeight(300); @@ -116,11 +117,11 @@ public class OfflineAccountSkinPane extends StackPane { )); modelCombobox.setConverter(stringConverter(model -> i18n("account.skin.model." + model.modelName))); - modelCombobox.getItems().setAll(TextureModel.STEVE, TextureModel.ALEX); + modelCombobox.getItems().setAll(TextureModel.WIDE, TextureModel.SLIM); if (account.getSkin() == null) { skinItem.setSelectedData(Skin.Type.DEFAULT); - modelCombobox.setValue(TextureModel.STEVE); + modelCombobox.setValue(TextureModel.WIDE); } else { skinItem.setSelectedData(account.getSkin().getType()); cslApiField.setText(account.getSkin().getCslApi()); @@ -136,13 +137,18 @@ public class OfflineAccountSkinPane extends StackPane { LOG.log(Level.WARNING, "Failed to load skin", exception); Controllers.showToast(i18n("message.failed")); } else { + UUID uuid = this.account.getUUID(); if (result == null || result.getSkin() == null && result.getCape() == null) { - canvas.updateSkin(getDefaultTexture(), isDefaultSlim(), null); + canvas.updateSkin( + TexturesLoader.getDefaultSkin(uuid).getImage(), + TexturesLoader.getDefaultModel(uuid) == TextureModel.SLIM, + null + ); return; } canvas.updateSkin( - result.getSkin() != null ? result.getSkin().getImage() : getDefaultTexture(), - result.getModel() == TextureModel.ALEX, + result.getSkin() != null ? result.getSkin().getImage() : TexturesLoader.getDefaultSkin(uuid).getImage(), + result.getModel() == TextureModel.SLIM, result.getCape() != null ? result.getCape().getImage() : null); } }).start(); @@ -198,17 +204,4 @@ public class OfflineAccountSkinPane extends StackPane { private Skin getSkin() { return new Skin(skinItem.getSelectedData(), cslApiField.getText(), modelCombobox.getValue(), skinSelector.getValue(), capeSelector.getValue()); } - - private boolean isDefaultSlim() { - return TextureModel.detectUUID(account.getUUID()) == TextureModel.ALEX; - } - - private Image getDefaultTexture() { - if (isDefaultSlim()) { - return SkinCanvas.ALEX; - } else { - return SkinCanvas.STEVE; - } - } - } diff --git a/HMCL/src/main/resources/assets/img/skin/alex.png b/HMCL/src/main/resources/assets/img/skin/alex.png deleted file mode 100644 index 984d92b72053fac384174c36c7232037b00646ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 999 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 Xo!5N&J`Y)900000NkvXXu0mjfvWKpr diff --git a/HMCL/src/main/resources/assets/img/skin/kai.png b/HMCL/src/main/resources/assets/img/skin/kai.png deleted file mode 100644 index 435c5c9c2542fa5a1dae93a73c52b0817e86bdcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1279 zcmVGf6DueaD?%I`LuXS+94Sa6BTFeMOf5)HEiGp) zLu?f;ZbWN$Lm+`JE{8&3jyE@vV34J9fU0LOvYW27ay-t6PT!VT=(=s|zs~NZX7bM3 z^3RC&(~bAlcKhOr`|XkZ^s4{={}653BLDyZ0d!JMQvg8b*k%9#1T0BJK~z}7rI(9( zn=lN83mEKq%f?c+jwQg_kN|uC2i!RlP7^|)U6p*qQ1tsqzNrrnqji0M>bq07+tsk$ z?%}=G_izVeH`==aUDuzwzU%%QAOZB<2Naw>s-R;EKcD~rM$pS3U>N>m6yOc3M|;ok zjjnny{tgUWB3p&tf$bnN@b$G$(V1KRfGWdH%*Ftmo3 zm$n7raTp$t>wvaxn+n|yf4?-%m%l_+4IZ{fs2Yy#8vs?^bWkn=nttfJrmjd}Q0+RP z+ErCuBU?@L;|BnJSJxFEwoGDMtpdi0cOrrQr!W;ICvTikSrkRzVc|XwmZWkG&yzGs z0KJ`LnTgET&!4}Z0d=+8RrNezZnKF@HVa4+y2t4m0K%+-DB5nWLSP>2n!Ts|TmhyE z*n5<1H_QVf$y9d*qkAF%K1x*$k@ChFV6qI~?IwzVFvidc($N{kqn$Dj>>CJtaLd1? z7XX9r7S0(NhW&{@`%S?TSK@f(b46doPd8DYMG(WcG;|d%GQ|y?hy^Oc#e>hl=vk8UJC%K^?6?-`@u? zabpN@w=xdsdE#F#03cJ7=$S2M&dS$G^5o(drZf}hIS*XUw>j?O_vWIjpiU}q{4Lfc z-va0&fa1cxcr$?EN{B8*ZSCU3nVK2*XKpUsru9%wlKNs7!l2wwB99mzR6Op{&cdn8 zlI1ng3(MMwX}!R6VphS@#-ai;!w`7r1i+O7yRe*jQu3gaGZ(D!q|?#>=M@){t_Uj& zd#2op^q|w@UI5`xXTvH$mL%4un=QEHkklhn>IE${5;IH_fw%?+rT17N;H8X}lK9pq(nn_2RN=Kq{7_L)Lw0aD+pP0UY4atZN$+4-^krva-#@m$< z;GZYp#k}XLIro&nMgRZ+0d!JMQvg8b*k%9#1CL2WK~z}7?N`y3qA(2AU7)x#6}Jj# z#V{R^|Nq3jNr8iiGu3_AmyIK}J>=#lZIjGu)r*dm(y`V`#qzg$Rqs$7 z3{mmZ0HO;I;`k>dejdQ9M>0wGPamtvr>2N@8cpS|RQVg|hgD@N?N z!Un{$3;je#f`;*X%d7=8yc`>&8AV|DNHI)6@PP1x^)nTl3}%0be#9UA2-ts>v8Bw2 zWNa1>^@Iz0m*8#l`DV=9r-5Fw)9gYNg}I>gZinC>JcC1~d9L(8BEW?xS@ZT8^ZpJO zzpvxUi#D6CZCyL6d35zXK#}KT z5SavjWDiF$Dv4?$9_#5g=B&vf>_=FjCKn-iV4Vjef7|z*Z!t~)e$50HJQ8DK(vbg% zy69*7{S@GG`Q6Lq!pE6S50}Uj@mN0F;MSvN9Hs!Q^l`oR!}U6z%;9wQ_aQTxAeht~ zZd_Q*QohRFtv3`{_2s}XBqP`9P=MuiYX1_TYg8Eh8}?H6m428Hmi^b$>dOJu5A(qi zz->A3DgI$TSj5n?xr$Z~^TC6r;cn?+J_wbvs+aS@zn4>SIw2>XPx!&(>c5B_XT`Rq z<|d6%(>({!bPf&7&eR>FpLEjMg_Mi@F zd;3OV+y&nd^zA`FKA86lQqRpG0SxB-!q5@;{vZHg-Y=jZKvQt&{~HManD-0l2SnfZ c2lwy)0nNmhhc&|m<^TWy07*qoM6N<$f+NlMDgXcg diff --git a/HMCL/src/main/resources/assets/img/skin/noor.png b/HMCL/src/main/resources/assets/img/skin/noor.png deleted file mode 100644 index d1f8a24e528b77586f367958ace5299d9bad2d81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861 zcmV-j1ETziP)8+b2}$^76yVkB#}okmLd?RDHW$&L#b9exiK8MXG+a^TmS$68L`J=00001bW%=J z06^y0W&i*Jt4TybR9M69meFGBAPk19wXF`pZC!<8aqs_@CxM{AsHOJy{7kE^`3Qj~ zsVWlVOmM+CXKqw$MRuD2!dkK`h`k9ATL8kwKx_c;FBpPJ1jzRRS^_~z{T2Y1p-Jnu z&;5PT4$=ie0xK%rzK&~ygLjYpbk{`y&IEr_o4WyNiN|rxi3H>OT}WeYH}{g_e&^PQ zt`MNXMw{F3r!k+uH=}{31)Ae1i2-=e%~P7=IyyfV0Ud`;M;Y_;1Li0R00sl!3jkMp z^uP}rLwgXf4!}wPsHSb3^T+w)xvY-k`rD&b>wi~D!5ldN2<*=RfH4GELK^|}bp{Z5 zfR7}+wWRePU>vpn0~m82w4uP?9%c7M_Mt}9KpIm3E|diS?)zaUWsO(-QUGwF0yPZ* z>iVz(K%0g3O#^}Idj?C zeY@{{#Oy1)$(R6eL4AK;y!^pB28Rn}=xNtDLckeyxtzToC({Gyl#mB#9(%B|09TvD z#AX2B2B^3wm<2?)3H;2%oZ(pnc?Ytg$n*;_AV>(=%#!IBW&zcV2T{Ke z0@P5D75?-KuDns9&rF;?&S|xtt;+8LC?PnFnS8JW2v?NN3;LxB9;CEipoV~cD*&YZ n0v2@XnX&+o_6x3|nD^ix!7p)xB>!Tv00000NkvXXu0mjfr+#jj diff --git a/HMCL/src/main/resources/assets/img/skin/steve.png b/HMCL/src/main/resources/assets/img/skin/steve.png deleted file mode 100644 index c5426101d179bc9b912bf7058a4417727991560c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmV;v13~(gKPi)|4J^I1^@s60d!JMQvg8b*k%9#0{2NoK~z}7?UwCYqc9MKYe7lbk_C!Y zSA}fS_5Lq$&zVV-cB>8jyADVvJkHB}1ZGyNC{1H=+GdQhS}Kk0aT4$Xxds4Z9_~fN zUEu)&z~A+NMuTt~!g7FR4x7Fo9aHG0<$zvdu+yl=6*;iXV>3<uPK;6{NPvdVlJ-oi& zLm4OUaFc*02QWI=lQ7;t+@t;u3-7oce?T(d$_~=D+ihCk1|WR6?V_anWmy&oHJk-( zw{80lfISFj0Z5a(?7?S%4FNeGd=f$-A)I(H4BfEb?>qbqP`V0&=b)@bsd|AcOkrH$ zXAR-v1JHc{@Vl>!smihnfmhLCS-#ts>zkW3)Hy&5hXgQpccy>|FVsmOs}%F15&#zG z0XXj<$%s1RhF+|r+(7ty1Yj5>Fkv*p(+MyUP)YKfsxD=c&te}mtqBk0C3LAcno0X4c%t>pbMagfFJ;OI~wj<(b~ABQ5It~FJR%y0%#7MAXeY`?@Hhd}riavgU<( zvt>`>=V%dN-tGx-{!ClX_h3_=oeLItP`KRhpw0_J>ehqK1KQe;=7O&PVySb(UfX#j z%;$oy0A1|&2~b62Lh?Nz09u*{lBDlJ`ab*%IGGo89?*8ezIfRK?XfztKxZ$Cqd~|j zM$B(XhbY@)OiG!~coxz7Zg&I`#tCE+6AbY4jFKuW`9z{$Lz g6=eE!J~;jVzvEwb%VPFUu>b%707*qoM6N<$f^?XsIRF3v diff --git a/HMCL/src/main/resources/assets/img/skin/sunny.png b/HMCL/src/main/resources/assets/img/skin/sunny.png deleted file mode 100644 index aa0e6f2e976039f250d289543c991973ef42b722..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 988 zcmV<210(#2P)p#uf0S{MymC%8cAF-5Lm+pDoqC%x zepx+#Q8R**tA&Myg{e1;TRNX+Kcl0guw^&8y1Kz~KiGsz*x1u_v~dv9ddCpjgrFvOCj<}k0tm1Kyfk#bUNA*E z_79jSgoTE{^T0WUV6j+SU0v~X&`^WAG`RT4Sd0>Ex7)flThBb78*~0_ysfG0?F&W; zilU%HE6UoT{6Ys=0AC43F-pK`gM+K<`+L%YBjm9kjPc{NnUCDT{>Y-TgGsp{qe!mj z^L5kD1ca!}cWB17(h4G9C72VMz7lXkEB^yyPmt+M*X9*feFd5cl3GAgvCgQ06Y6cAeT$4Kx&1_Qx*6Pfgl?Lk8!M=0&v8!j4ylW5-gXE3zDNoEuzq| z0}YD<1j5DuL8O-LlP`i~fa^h$z(`W??Yqj^J%Qf?$7G2m0v#bA1b1q~xsFrh#$kep z6hslbC4CW*2H8BVB%w=S?2~8>eVBknlV6Anhgh}<%z)tKKLpN;h$KWVH+%^`QMYHc z3Gfij*Xwy>;e?OlurcraK=-cj%${}etE zz7raIG{K6X@9uPCf1R`qaC^IH>|nyf2*EY5*<3evFyY&&5>F=h{8uK;;I^g(5V-WQP8g!-n^CHCg|1+Z`K8e2-@|+dlc;J1>8veYkl;+00M#A zea83GfME2!(61M`TulgRir;edebB$|Q)AMEa=;=@M&Ad00_>dTJG*|Dr=vma*9!?F zwJy+S3PGn{NRm9?dyr31(61L#-u*xf`smjSd6HxOZfD~#Q1BCG!K^_81F(FY=QC~hOY(6J#NHBFgD1K8ne#Rle6*zc9Zf4&&=@~JflijzP#^8mVD)7P4_ z7&sGvN};uqLeAffg6^A^4Bp<50W74G7|sHQnO87F^OKm)ET2%0bRZ3%%Lc(s>D&*J zbHn-2_rX+E{SfzAsB_8{Hmco7T zo=QORxWJDAQ5+BfFHcv)DqZhs%tKNSL|_B3VEqli@rghJpl7q>Abm4J%ZbJS#Ji3y zL>CZ*5J0@;a2j}>W+saUcPSuP;v=UZ;i#B}d&CDV^Bo90E#|%kFPrSx*Zv|qqBv&zA= zUqA|r9iUCP-1iGMZIsw!{gV8#&t3Zk-p(zy_khDL08s3xUyz0(q<+CK07M2{`-N#= zfb}3P4OkZ1X8@VgX-69R0llh2NIy#;6VBT*`2HT8ch2Iv;*h|hW=m{Fzpwp9VpNbNCNePgP-*t VegO>y4BG$z002ovPDHLkV1hD6q{jdN diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 63affe4fe..47c34ea2d 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -143,8 +143,8 @@ account.portable=Portable Account account.skin=Skin account.skin.file=Skin File account.skin.model=Model -account.skin.model.default=Classic (Steve) -account.skin.model.slim=Slim (Alex) +account.skin.model.default=Classic +account.skin.model.slim=Slim account.skin.type.csl_api=Blessing Skin account.skin.type.csl_api.location=Address account.skin.type.csl_api.location.hint=CustomSkinAPI URL diff --git a/HMCL/src/main/resources/assets/lang/I18N_es.properties b/HMCL/src/main/resources/assets/lang/I18N_es.properties index 28b6cdcf0..f2290ece7 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_es.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_es.properties @@ -125,8 +125,8 @@ account.password=Contraseña account.skin=Skin account.skin.file=Archivo de skin account.skin.model=Modelo -account.skin.model.default=Clásico (Steve) -account.skin.model.slim=Delgado (Alex) +account.skin.model.default=Clásico +account.skin.model.slim=Delgado account.skin.type.csl_api=Blessing skin account.skin.type.csl_api.location=URL account.skin.type.csl_api.location.hint=CustomSkinAPI URL diff --git a/HMCL/src/main/resources/assets/lang/I18N_ja.properties b/HMCL/src/main/resources/assets/lang/I18N_ja.properties index a437dc17a..35fd7b612 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ja.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ja.properties @@ -112,8 +112,8 @@ account.password=パスワード account.skin=スキン account.skin.file=スキンイメージファイル account.skin.model=モデル -account.skin.model.default=Classic (Steve) -account.skin.model.slim=Slim (Alex) +account.skin.model.default=Classic +account.skin.model.slim=Slim account.skin.type.csl_api=Blessing Skin account.skin.type.csl_api.location=アドレス account.skin.type.csl_api.location.hint=CustomSkinAPI diff --git a/HMCL/src/main/resources/assets/lang/I18N_ru.properties b/HMCL/src/main/resources/assets/lang/I18N_ru.properties index 45578d6bc..dfc550f5a 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ru.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ru.properties @@ -120,8 +120,8 @@ account.password=Пароль account.skin=Скин account.skin.file=Файл скина account.skin.model=Модель -account.skin.model.default=Классическая (Стив) -account.skin.model.slim=Стройная (Алекс) +account.skin.model.default=Классическая +account.skin.model.slim=Стройная account.skin.type.csl_api=Blessing Skin account.skin.type.csl_api.location=Адрес account.skin.type.csl_api.location.hint=URL-адрес CustomSkinAPI diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 2136a1584..004f46767 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -152,8 +152,8 @@ account.portable=便攜帳戶 account.skin=皮膚 account.skin.file=皮膚圖片檔案 account.skin.model=模型 -account.skin.model.default=經典(Steve) -account.skin.model.slim=苗條(Alex) +account.skin.model.default=經典 +account.skin.model.slim=苗條 account.skin.type.csl_api=Blessing Skin 伺服器 account.skin.type.csl_api.location=伺服器位址 account.skin.type.csl_api.location.hint=CustomSkinAPI 位址 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 04bac31b6..aec5cd986 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -153,8 +153,8 @@ account.portable=便携账户 account.skin=皮肤 account.skin.file=皮肤图片文件 account.skin.model=模型 -account.skin.model.default=经典(Steve) -account.skin.model.slim=苗条(Alex) +account.skin.model.default=经典 +account.skin.model.slim=苗条 account.skin.type.csl_api=Blessing Skin 服务器 account.skin.type.csl_api.location=服务器地址 account.skin.type.csl_api.location.hint=CustomSkinAPI 地址 diff --git a/HMCL/src/test/java/moe/mickey/minecraft/skin/fx/test/Test.java b/HMCL/src/test/java/moe/mickey/minecraft/skin/fx/test/Test.java index 6487b6b82..f89d5b6ae 100644 --- a/HMCL/src/test/java/moe/mickey/minecraft/skin/fx/test/Test.java +++ b/HMCL/src/test/java/moe/mickey/minecraft/skin/fx/test/Test.java @@ -8,6 +8,7 @@ import moe.mickey.minecraft.skin.fx.SkinCanvas; import moe.mickey.minecraft.skin.fx.SkinCanvasSupport; import moe.mickey.minecraft.skin.fx.animation.SkinAniRunning; import moe.mickey.minecraft.skin.fx.animation.SkinAniWavingArms; +import org.jackhuang.hmcl.game.TexturesLoader; import java.util.function.Consumer; @@ -16,7 +17,7 @@ public class Test extends Application { public static final String TITLE = "FX - Minecraft skin preview"; public static SkinCanvas createSkinCanvas() { - SkinCanvas canvas = new SkinCanvas(SkinCanvas.STEVE, 400, 400, true); + SkinCanvas canvas = new SkinCanvas(TexturesLoader.getDefaultSkinImage(), 400, 400, true); canvas.getAnimationPlayer().addSkinAnimation(new SkinAniWavingArms(100, 2000, 7.5, canvas), new SkinAniRunning(100, 100, 30, canvas)); FunctionHelper.alwaysB(Consumer::accept, canvas, new SkinCanvasSupport.Mouse(.5), new SkinCanvasSupport.Drag(TITLE)); return canvas; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/Skin.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/Skin.java index fcd570eea..6eca03ef0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/Skin.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/Skin.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.auth.offline; import com.google.gson.annotations.SerializedName; +import javafx.scene.image.Image; import org.jackhuang.hmcl.auth.yggdrasil.TextureModel; import org.jackhuang.hmcl.task.FetchTask; import org.jackhuang.hmcl.task.GetTask; @@ -39,7 +40,6 @@ import java.util.Collections; import java.util.Locale; import java.util.Map; import java.util.Optional; -import java.util.function.Function; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Lang.tryCast; @@ -99,12 +99,6 @@ public class Skin { } } - private static Function defaultSkinLoader = null; - - public static void registerDefaultSkinLoader(Function defaultSkinLoader0) { - defaultSkinLoader = defaultSkinLoader0; - } - private final Type type; private final String cslApi; private final TextureModel textureModel; @@ -128,7 +122,7 @@ public class Skin { } public TextureModel getTextureModel() { - return textureModel == null ? TextureModel.STEVE : textureModel; + return textureModel == null ? TextureModel.WIDE : textureModel; } public String getLocalSkinPath() { @@ -152,11 +146,14 @@ public class Skin { case STEVE: case SUNNY: case ZURI: - if (defaultSkinLoader == null) { - return Task.supplyAsync(() -> null); - } - TextureModel model = type == Type.ALEX ? TextureModel.ALEX : TextureModel.STEVE; - return Task.supplyAsync(() -> new LoadedSkin(model, Texture.loadTexture(defaultSkinLoader.apply(type)), null)); + TextureModel model = this.textureModel != null ? this.textureModel : type == Type.ALEX ? TextureModel.SLIM : TextureModel.WIDE; + String resource = (model == TextureModel.SLIM ? "/assets/img/skin/slim/" : "/assets/img/skin/wide/") + type.name().toLowerCase(Locale.ROOT) + ".png"; + + return Task.supplyAsync(() -> new LoadedSkin( + model, + Texture.loadTexture(new Image(resource)), + null + )); case LOCAL_FILE: return Task.supplyAsync(() -> { Texture skin = null, cape = null; @@ -227,16 +224,7 @@ public class Skin { String localSkinPath = tryCast(storage.get("localSkinPath"), String.class).orElse(null); String localCapePath = tryCast(storage.get("localCapePath"), String.class).orElse(null); - TextureModel model; - if ("default".equals(textureModel)) { - model = TextureModel.STEVE; - } else if ("slim".equals(textureModel)) { - model = TextureModel.ALEX; - } else { - model = TextureModel.STEVE; - } - - return new Skin(type, cslApi, model, localSkinPath, localCapePath); + return new Skin(type, cslApi, "slim".equals(textureModel) ? TextureModel.SLIM : TextureModel.WIDE, localSkinPath, localCapePath); } private static class FetchBytesTask extends FetchTask { @@ -327,9 +315,9 @@ public class Skin { @Nullable public TextureModel getModel() { if (textures != null && textures.slim != null) { - return TextureModel.ALEX; + return TextureModel.SLIM; } else if (textures != null && textures.defaultSkin != null) { - return TextureModel.STEVE; + return TextureModel.WIDE; } else { return null; } @@ -351,9 +339,9 @@ public class Skin { public String getHash() { TextureModel model = getModel(); - if (model == TextureModel.ALEX) + if (model == TextureModel.SLIM) return getAlexModelHash(); - else if (model == TextureModel.STEVE) + else if (model == TextureModel.WIDE) return getSteveModelHash(); else return null; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/YggdrasilServer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/YggdrasilServer.java index fb546af3c..f3deed3d4 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/YggdrasilServer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/YggdrasilServer.java @@ -178,7 +178,7 @@ public class YggdrasilServer extends HttpServer { public Object toCompleteResponse(String rootUrl) { Map realTextures = new HashMap<>(); if (skin != null && skin.getSkin() != null) { - if (skin.getModel() == TextureModel.ALEX) { + if (skin.getModel() == TextureModel.SLIM) { realTextures.put("SKIN", mapOf( pair("url", rootUrl + "/textures/" + skin.getSkin().getHash()), pair("metadata", mapOf( diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/TextureModel.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/TextureModel.java index b620d3501..eb9545a90 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/TextureModel.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/TextureModel.java @@ -17,27 +17,12 @@ */ package org.jackhuang.hmcl.auth.yggdrasil; -import java.util.Map; -import java.util.UUID; - public enum TextureModel { - STEVE("default"), ALEX("slim"); + WIDE("default"), SLIM("slim"); public final String modelName; TextureModel(String modelName) { this.modelName = modelName; } - - public static TextureModel detectModelName(Map metadata) { - if (metadata != null && "slim".equals(metadata.get("model"))) { - return ALEX; - } else { - return STEVE; - } - } - - public static TextureModel detectUUID(UUID uuid) { - return (uuid.hashCode() & 1) == 1 ? ALEX : STEVE; - } } diff --git a/HMCLCore/src/main/resources/assets/img/skin/slim/alex.png b/HMCLCore/src/main/resources/assets/img/skin/slim/alex.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1dafe80e94b37d29c7d64b37ed5a3cb76dc8f7 GIT binary patch literal 1257 zcmV=P)jkT|2U}5@#Lr z+8p?tj}GcZ{(H$-I3np}ot&1tXZUwr0KS`4FJEUhZSzh%>MNq=qrxO1fLqP2To7Ta zZU6fAal4&IBDjmYz$!`-ous$p9ai2Vige)o!JIsRJQ78StQ_?roFh<-Bm{6PYmZLC zRiIE!`VbISk&^L%!j!g({QK8`@$X)TJd)(>kl&1~ufLas2hbXv#Q3-#iJ@b?PlJ6? z*@iw?wl>G2`EBDUPVa41N2XI@c@w5#gR6L-4sA80id;bPvHRmp(jr-7KTaWBLVPE9dQ?$c`bK?;M!OKSQ|tETAt)_ zMVSiV_X^SDw3C$FUaJ(7I#`SJFZdA*Oy{N2U^kcbjh@)RQyi2^7YT7V)rdDiK@ z680F1oj~pdTUTwHE=u&gey3~=;zIbWwXpysLqa4N5ssjQ+?q~E1t7GZ_gY@H z5TgLml)aS)IH`?|jgTy!old9O+S*zU@ag3py*&w&7@pC0R1CkOu1)}L3Y|Sb2~`p1GkUKh0P-N{Bqh=QgOmZGD_Jm^^)0oCIrZEjaX_%`^a20a~Zie)7gJa$U7F;Vp00dQA zZ*l$a6t2Z#}>TXzKwGfK8wm9^m0~fN{mL@Orcn%5z292b3YHRb`m~8eH`t zt9pp;6srKy8G%mm|3wPGz^X@?BQPA_<{Ut$`2Sv~vaG=ZGl?6BJkdy~FsW#^edM`i} zPH%I*pvl4PGi4)XnVfE5uN<15+S)!pz3@9d-|&L1yP)Tksj~|19qjE Tg>XPm00000NkvXXu0mjf$m3F! literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/slim/ari.png b/HMCLCore/src/main/resources/assets/img/skin/slim/ari.png new file mode 100644 index 0000000000000000000000000000000000000000..688b2c45dbe275321708de67a20700f2a6400dc1 GIT binary patch literal 1141 zcmV-*1d98KP)_fILQ=uUP~ozBU5ri06>s2n&eFuZ;zGlOW0)BLGBTcVG+n z@n&xhYb5}`3DgZd@+`v2OmZOh_WJ3$QMPLcU@&6(8sxTY9emGn0QW5~#>6#OF^u@p z!F~-ZYdx-00-#)+0O%l(5=I<#M*8>H_j9m&+{S(bQjs(H!|LrB{5n+9>>kCv1u%Mezk3rPljlWG6ZFfm zh&e#hsqv$VapUH#8dtCF)Mz`WSpM_lxW@6f$1`j{n1pD0{;yB>>*pN4-kGz&r3nDy z5TdP1@%!Ga1Y#IT{STmx01(myFyg&0xw~3`PIPdkJ_Y#meXnc_uufurz&x@H7wE+T znmXi-5|^zb9#jAuHH;j?$QUUDti;NwM;!#jwbh|Lfae)n3vlMivnqlT)@yW#J7zGl zFi(&N0Vc{5Bb_Ox_b9MNrG$HAbBUK$}hi zTzvj&P5_W)tH5gWl$VMFrq_ zLCHo!q~?@d{4)Vkqmm+&8hy1EwAF77@7senYqHk`Af~zAOMzAQNH_Vdiohb_b*kSV z`XQ#@ELj5ZyFFS9q*idY;`_3D`9yA*PNy|+&27B)3jQoleT;cuu2}+Lg$Imx?^Tn@ zq|Oamuiz2Y$p|8){IqFuv)mhbkGzV|S^!?=vIuR++iz6>be!GCM2LinkTQMtea*84 z=mKwKy){E*2@#t1A~;{j0+zACvQGaq2vBOrir7#c1d!Mw@B8-^u*vz~A~sq340uF@ ziri7=SmS6@6JiS+E5P0J+m&IkfSyunHz>8gn7t*ota)HGq#+GyNJHAd)HS%u8>Gc- za&!?OH@wd8dqjS-x4Bl?0ucY-SPNhmSP2X8&JVObb718tJQf8>ixEHx<(@at7=N44 zxRr|$K+g|&=L@_zBcP$O=sW;hLs0^7@YFkB5CvPK82`#xfJToa@?LZ~H(Hbx|NkEX zOVo7EAQjt7m5W;x>G^@&^950i-wTKqCqUQp1yPJY zbvU9Z7w|}>$m@3j1mG|?$M{oLU~P&KpzHa9)B%SGeOka@?is?4Nj(O;00000NkvXX Hu0mjfrhF0r literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/slim/efe.png b/HMCLCore/src/main/resources/assets/img/skin/slim/efe.png new file mode 100644 index 0000000000000000000000000000000000000000..f26824177e3a73c8d3aa43ec7bee04918c1ad9c1 GIT binary patch literal 1282 zcmV+d1^xPoP)4h;5Kb=|K~n@3BACV?gb;!dP*E%dK~M_?5mb-_!9oSCL>oZ`8@17BAtD4Nq}Rqy zv9PrB2lxk4o_q)2<9p-G-R-@XynD}E7;fI~-e$jVXXfs9He+KY<>7_L*^{d;a(Q&= zSw}}be!sf1SSVw|UKF&Fz$<~?Jb9=~Muq?duhu~Ez$*zOMSvv%`p6St{hs>0Gxz@w z0tgy_37P?ru^=Ji000aheGqT;*$;yIS8lK7b&UR~L!98)i~~wU zBM8vR;QDUqcn*ec0e~NtPUYb4o|wu7I_l6*UFgs6a~*&H57)t!Zlv!HY#%rQTun>{ zf)!+xr@uxPpicyXq ziv@u7**ynKC#Irtg1&8if7|%3Z0GLDT%g-nVDBM8s(a(I58JgLEd$r26`z@y?gExV zLPP+@RIvnD0Gzz)+GYvR{&~(cz1NYLuRWzF0Rn$nWE34%2K5y)* zQkeh+Oa0fI`D|ljJ@eYC%J%Vz{No7YKriZNNh2X>D@(ogoRaeFTR z_PfA-A4K3a|Deg(WCCFB@cA;J=!3rWYY24v)JXYF_lQ1@&{kvt5dkBSl50y_+R~P` zw52U=`R@zA@A;V<{jR+q(DV{*sFX=-I-^qT$Cv8-kb``>Gu!pS)-u zrq;Z3176NgGfIsjpzI7m(HVrIB&P?Q@u9IMuORKJN9PNobh&qeB>4o$Rud2si8iZGV0Vb!v2W0_8R^gp5@Q%uOE1!GIF~G|b^_u_p_6NLuf@uGsuTKH* ze1ScGq*-Is^_u^$yI;_^eFK68usY`pHa-2l*(Cy2^^8H3-Y%2I6Hrww0ab_?3JXXf sK-1jR%hKYF+Oq29e1Vte-%1Pk3&&}gDOBW%*Z=?k07*qoM6N<$g0NR)E&u=k literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/slim/kai.png b/HMCLCore/src/main/resources/assets/img/skin/slim/kai.png new file mode 100644 index 0000000000000000000000000000000000000000..80b836f0ef41246f6d9e6124b95762bea1a15486 GIT binary patch literal 1574 zcmV+>2HE+EP))VqC^6MqBM>`SV35kExI(RVhT$jC}=2C;ewAM1!eLPAg=1VxY*pTXzpyu-cw@!r0D>v*NBnKyH1z30riGqXG6wY7%p+0S29 z&wjg8?C&2w|1W=7R`Q4GgZ;OP9o&9z##p{~+%JNk0WM?^XlBQs04U%{1?+W_p$d3@ z35cXm0#1qoW@LX76`-J}B%Bxp2mvmC65um{&IHfTEFhrOGVrwHHO>%ac!wrGC-9lKjdE`0M+xE4P3Cd{8Wt{7-j3EJh#tNB4rU?I-7Vit#t< zMnS+IPj46d{r*SA2#5d`w3_VpVL{>YA_l@M!QgY`SitV{e>5& z_Wt(vj5W2N9JXn))2Gf=XV));6uLPW#oG;*!?rm;X*ETkaA>W1oh5{A9 z&{_roy(@{pNkrcS;K5-I94UacA%G+-MFEul{`PLQx3M)>2>5`=-`?X?fu>yvSXcqx z)Q4Im1q7e_xgD|rv3MTgC8r{H&?FI8vWdK?9hb~!E2fOa2lQ1 zVr(LVa7H}eFcq}cwGqu;}&XE0-(S=1Xss^xf^f>a({$ zuI^m_wixm-l*1PNd#|2-efqaX@c~5%z{Ayn?2`bbqaXkeLK21`0N_VQ040h1rK2#2 zz+dV?w)|U2M?(M&4@CkrMmaXe+99ARFK1T$4%Z9Dk*pzMC zQR+k~Nh=|MA&?QEpdA2b3(Opk?me6#!&T;hot#0(2cHFy2M8wsWln$sB5Cw>HAKBn zupSnJ5)erkJ?I3W%%!WpIc{jUxKdQ&4%!JDoB(~WCIVcpB!G)35`a2gOl6BJZwsG6 z3GhL!E(8>~5)c{c<^d0~2PZ%!nGJ#}eOE&?E_j`{&B_L!1zZKb4nQ5(0q*Mqor4?w zAuCExW$6l_DqOC05{3;L%Zn1=Kq3Mnvg*L2Z1e}X99y^Z#&0FVFZj6rtB$PZF9oh$U$@rVHbP7o2&>ogdJgZ6rK94Fh} zZoB!ZugTHUTFuLQd2MbwKj4!0*`N;s<^|si0gIk5$oBW!5|G7v(>H|P2Ej$o7c71M zf7#cf=L;fmZHOBU0nzyaoGtKk1ljol-{#hT+^AE{Xb5OJKk&}hRA; YU%LO|g}lp>(EtDd07*qoM6N<$f_&}l)&Kwi literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/slim/makena.png b/HMCLCore/src/main/resources/assets/img/skin/slim/makena.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6af0ca8b0a965a627b63d887e7b076f5bbc18b GIT binary patch literal 1412 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 B?FIk< literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/slim/steve.png b/HMCLCore/src/main/resources/assets/img/skin/slim/steve.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c8361f2539dbb37ea7a15beff510926faf2f73 GIT binary patch literal 1173 zcmV;G1Zw+4e-7(Gxy0)h&H2wEi)v{7OR2Fz&+A!nzgND~B`pq+(cnjkhwrG=@|#>OUvg-w1! z{?nRoy|=u5_s#6x-d(bHnSsa5&VIYO_vZU%Ci_jRRZ$+^yOtRiW^ZKN#`V`XPoro} zdI90~gIgK5Re(>g7D|{Z0hqAXKQ`Ju=kH6FmO&({}10FHeP1tS>>fvFIHN1VOE z$QwXZCqL`^zPU0T0_YsTFp@?%R8P$uz$4Ed0kUgz*GoYE#Kbt0oV|UuXU&Jp11thR zqamYv2)47jQL{XLpaDd<&E&PlbD@nBCQp99^))WWz0J;Vjr@+MXG2);gd0q{et#>it0|M_;M z*wEP0_IY(N$Liggk`0zTcmlsu1<>nr7XZ69Ca)q`ZKO>E)F2Ik_*uMUvP3#ga-?2eRfaZuc&>3jq-qT3ovthTnNxe4;X6*oD$~{7}^6~EFNSA`{P!>T>e!6eW(Gxe|dku1a;4X zeD{Zk>L0(3f^%uuyMgPlS*HY$cr zay=U%AvQCn+=RtWYS2mxYh!{Ng==82vF>=i1& zz;gih_#meQLEN*mc5JK6D+xw4G^emw+#e&(@vlO(Qb{G1R8mPLm5DF*0W<{tSW>!| zN-C+Ol1eJ6q;l3}=;SJWLgNo16Dz>L>2(sIlv%z=9)NA`Sn~f9;{m62tyI@pm(ckF zFR$n&UxPV*%?K-+Du72abpF8Lrnp1r0qW%c&sqR{&kv>8s{{yUi?lsS9-soST{OoZ z1J4=aEwOJ1#dm~J3NXz1f>@4U6CNWu6g3VH2qjKKr%c#h$;QqDG;&$269SA-p5IG^ z*2?`gWfBaXFYxkvF##Iq0bVxP+Yf}o#EbLT$Tv=aVb2%D$j9b^#t1O%`GQ!EKXfvr naRLl;z95w6uR0Vls^9+)B`civV`l?200000NkvXXu0mjfP}d$2 literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/slim/sunny.png b/HMCLCore/src/main/resources/assets/img/skin/slim/sunny.png new file mode 100644 index 0000000000000000000000000000000000000000..cc09b34ee276b32d37ee74242d01888793d1abe7 GIT binary patch literal 1194 zcmV;b1XcTqP)FmnR6T7=g*~Vh7Dd{Fg<32~m%WGx_Ew}qFNz0y zu3qZVPq3fEFA#kLZ+QJR^KWPD%x)*}NG88bCcl@LWM-1Fv4k)_KJFTghMSz63@|e@ z6U4}aZTD$27GuL6=(IYn*CS5=9Hs);>r4Z+0%`>`-Tv~8Lyj}=SSSF_DhYZ$5(=;@ z06_)xH|~Z`6UZA00(2P!0d_dhSs!2v;_H_ z@HrYqfW5C$61P3CP{-9dB}?mI9_zBtsSE+FTN93$yVDHeYq%vw%jmsYC-C6fWiMbW zoq#v<*B$X^yBz=%7_Q+M(g^>GhLao82uPz0$|BACwaz4zPQbf`DM#q?g=@rgDhepG zJbU%Pa;S9@>kqFS0P{;H!1n@UmoqxMa{FumRf=8qeD!TF`ca8xGU^@PzSP*Bw=X|Q z-vmSRt#EVshnrp74}f&L-FDN{(*cl9x_@{Ez-dL6 zA)s>zdoJ$~C|m((EFO$F4lH8{LQmX(aUzVV05p=lgS7UXme+iZQ3ukGR?oP5&rXK1 zmW#7xCSYpmSLiGp19%OalB9Oqc!0#Pr=px>%yJsD?oRJg;2>iy7iSxo0NcZ~sRHJE zzXL=m0Qq##I#+20AWk9xP&=Hk*xTC+(^N&20xTK4k9EVbL6D08_Hfb=AVC&dPKkii zKEf1QH|jVt0(8Q&bAX)$wOrKwI!utKs<33O^ge~pq`Iguo#}mlouX{12}oL&lHi*| z;J9^!<@6qw2LU>?^d4R7eXrw6fZ9qW01l`E=#+0raTt*RRRZF;FHu#&zy$bY74@}8 zo2GpP_@u1E%FZdi$(Kk&fKMR<5s>yl3g3GK9ia+T(s2Y>@;C&tv?((I_G5?d{Q3QLFR*gNMG-LK6Makh~m0DpTF_^0q{>p~F6*=p&e4No?9oyF3Jp8YHoX1#?RZP}*c0$_eY2jl>M$yyh}~uGA#^$&*X?!# z3@rg!&ll)cTC3FxNZ8rgakT=5nSiY43x-ModCwQv9bQ#HoUL*M40^u6?(wSv;%t>A zAnW;pky1dK^96S2C-3%m>HiBX0l2nX!0HAq=o(s(T zKOpb+I-KLS79G{~--2Z-^FJUj0k)UvJl1~eJo8YdGLvB5^93qxD}5h1v{#aVLCzP@ zA(eQP{IyJF2*`WBz}LG+ItSzpdCwQXDJsA^&oOW3gCZ617iCt&xkPC3?EnA(07*qo IM6N<$g3%u=tN;K2 literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/slim/zuri.png b/HMCLCore/src/main/resources/assets/img/skin/slim/zuri.png new file mode 100644 index 0000000000000000000000000000000000000000..64bdfe6a474259e4af15c09fd6ba78eb28b0a1cf GIT binary patch literal 1150 zcmV-^1cCdBP)#19kVXVi@bE{(LWKjHGon?HG>4r{$~2}-CyGTZEmQ=-Mhhz~g^2%v*w_mG zEpg>rc*nb!Z)SIH_wII+8F=jM>|}4=+i!k;UshHs(wS2yiow~{;{59A!t%Hx|M2#u z5?kxnr-1U6z9%N`2?3%k0+;n(03~l%whAWe;Ye5jNPFGj$P2*z-GtC?a4ZC1@+!iS z7l8ZzjSJ@vjRnVI7Qk1B0BQkBo<-=*G^c%=2fEN0pa`uMLeC7H>f@Tn)xPG=#;xMn zqdO%mZ)Hl%6Gx{_F0=d2jPeSQX5tDwhZrFNLzZFBJ0SoX`g(h_BvyyKCxYGEJD9kV zS5Z1K24Fr9k+*dJ;>pRqP6)t_2Wb`nR^h>(u>d?ipiITkMby#- zz;uPFO9?S{M{6b2{M8C#@6@_W7och-r!#=g1iJf+y{8uorTzE21!FK6Orh%UpI;dk z-(S5uMA*vg8Q%MHYhwy1uX_LAo12B<*VPBb-s5{E-t3Hvxd|{F4kzR-pCSN%eH9>t zIszE^Piv#e7}KgHeSErIFxnR2&;Hv9K$^>zZULSEjJg8w7-9K&2+)cJSObixU4MVw zD}lz~-m3$cDH<^Y8u#<_mqR1I34rIQZ+~mBXCCa?kIQ#U7-1%lZouzCJ;O|WUdgcl zp*r?s+z2$(L@Q=IzJ0(cYJ0GF;!Q z%dm14!u$Ga1$Ipmz#|_MfuREM*JNUB0kJQvM3rP+%p`!4#{lJ70q*fN^eZzF6$B!9 z#JP?kwu)-_ew66AdCGPD)bpzK(0EUhHRRVyFBGm6=@apU4 z%sZIz4s2$g_fz4G3)+=*-cNx?+Oq=PuPjV}C+pXOc=6#|iCCQ~C~3e}fZ9E*Y~cdb zu?R-$`#jt@@hc2?g{}W6FoOz!%?}^J;R^Ce7LZd;Ipvg7PC0cp*{RaMg98_Ogoe6y z&C2DJQ@s@0yVphU1<>QK*bdFBlPw^poO0sSG`@h3$Z@#Qs{@Xv@dfNMgXcHtn0wi& zX?#KNEud+90SnLz3((jBJp@gOFJO0B$W@l?{$6CCS9e;S_yW(xt&USKKA>{~Fxiy& zf>4ly7h5os|9=qzDAAPof~Nj|Jrf9>9Ux+*_49&Qe1SI>sI|m={GE<44Rrw~93u~S zK7Nf^_R2deK$TyxN&t3)dBl^wzw_P=HuWaQeEhNhSD4#*Kxn`Uod>iffal{63DD}w zuqzhe`S?B0Fk%BbGX^w`FHrwJ`}kwA0i6+`X?y|u_nACf0GmEUXsiAI0Y?9Mh9aCq QKmY&$07*qoM6N<$f*^e-=Kufz literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/wide/alex.png b/HMCLCore/src/main/resources/assets/img/skin/wide/alex.png new file mode 100644 index 0000000000000000000000000000000000000000..9d86b3ceb9a0cb4822cc14578c7369965070c06d GIT binary patch literal 1272 zcmVzYAvlPYxRv6fAP8Ehh=nMEEMjdX*r<(&ppAv4g_VU? zR$Ey31LB_OSx(O0S0Ebom4=s2L}4nP0`LJ$jLoIPL1-ZR?|N3#G|ny>OLw=Cj{_T^Hwg1 zu+_JJfB&@I&m$4s#9d$&r4xgs_v0O{yhRk@(8a?!c>r+)iV(GOG=^}EKruQYfVZ-a z=pr*+CBNv;n0&8YSD_c~z#Yz;1Ad|r>l(7E21 z!M-W-{e!M9JGU;l_UdY;7>~y}Mx#-V)ccPi@ z5}>sOptbn1TW@b>mrfqbuAd%fx6hr(;{+{(=1uq?V(aT5i9d$CRR34tzeL}UP*pD} z0LbCTNdC&H<(xc#xQYOzQUJ6zhyrYR zlE)KyDuCBh0r=FKrIA-`DOnmCCg zPwN0{Yil_WS2K13xfN_ZwNJVzQGNYR)jq_9h*qvi0Z4{~NH8KCK?!+lIw2K+&~m0V zKeZX70A*4NiVvZyHU|H`(aDPGMnCT^P z^*{EOV4c=)dt(e|3K3H00Ib&;3m8ViAq-&%Lm0vk`XAKI)yBDsHG>|AEZhOdtQRb} zSD*lJtTsC0ns;!QcT)@Co?&4vzy)Y(0T4jDK<6#M-RA)Pie>Kg=pdB$ihK;HLML{Y zWdf*k)t#(rA$n5m0+ihoXypIjPXXvybuV)Sy5p<-`&IVQ)x?jMN izUqEKCXYN@S#{V_YUPVeqC6x}mDJKI(LUUyHw9*q*|!|k)x(VYv`=kcXFw`(gKtnA_V z<--|9>z+WI1%N0i@*5!l$fL*knnh6J8zX@BcoXtlVF5An8)E_9Ac*qT2mle-9oPbX zyg8V|MhU<(fx3Z5o<&%jK@P;;UOzq8%XSR`3`R_+L4KC4gYQ`m;J)R>n7HODh7mtG zI;>%3t;cmp0F;Xp01f0`LXV@)NdNx&ehzkzpRwP7RLq+AelY^T&p{5pjs`1vfXVRh zJ)&w|cz+QtfL^!8!@ObgR&VLb&d!XWl`UBvyM*NsAmj!rLJ-gGQrSiQZ2r$Z&p?or$U!U&J-gW$XZ^05f7XZW| zM6OHmd~a3)F^r`C2aqEGiwOaYcxOxRwiciR9bBnP0sekJDBA+8aTp&kj;zuJT3JA< zL0&I$*&5+N1+ZQ-=yOKINEu)yRz^MQ*z|GF>hT)@@5FOS0nR*mR>h!%^%{-gMj4DO z%o60$C?=}Jc+i9Z9(k_Ee|qn1EWo*^FXmwPKp28BLOlo4Ox_c~Bj}ZtJb+$j0r;7v z1i1M8)tmqz%T|HwkO16Bua|QL(0cD(Aq!aA1(>`i03%lbeolc#GvV0tp5J@pfuZ#n zu&e+)E-2ZU5TP+;S*%=uP>+NNg?iufb*tBJ4G%oqD6*zOkmOwNg}`ciq*FfY`7H|> z+KkZ!kbbwIoVD=5)D~L{gjR62;`_3Hc_BAUr_&m^=4ZU;75rHq`ylhaUb6+j3J)0X z->W8*Nu3+CUco)80}(_D`Dbciv)t?T5P9ztJ}Ce%b6JEO^7dO501apNF%e=y#Sjue zeP8oN0t{|LI4h)dglvb!PZ!OKSa7X3()9s zjJy|JZW=9W6#wr-fF@`g|4;1)r1lef7a$eiPoXFa@XivY&KZQ_dR{Qpiw_nv4aUwG z#LgF_;`_0~5k&~l_IyDqz8||T!Ua51A@cfN00B6}9Xjd~3XS(JK-=>LvBM21bYTJi Y0FU#4x!MaCA^-pY07*qoM6N<$f><;cd;kCd literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/wide/efe.png b/HMCLCore/src/main/resources/assets/img/skin/wide/efe.png new file mode 100644 index 0000000000000000000000000000000000000000..25642a698b316d12eb9ae8ca27f31f0a58136723 GIT binary patch literal 1289 zcmV+k1@`)hP)oZ`8@17BAtD4Nq}Rqy zv9PrB2lxk4uAGJQIPW;KJMSx*_uPTY-ZwKlZ_b%}@9ylKv9X%+@WSKb$<-I7Ji7F( zrK29dUtL+Ol(Ati3R+3vl|XNvJk%y5Lx6%;YoLU{D+wb-fRg}y3`F*Yh5a8iDxYCXE-GS{}P5@UElYw9b z8RhA(F$>Tq0zpzj{k5HavU@K$ynn8s9GPAyE>F%CXD4P#fnIn2`p+K)WcB;E;`Nu$ zr9fvr#$7xx-x?pHbt&WP*d(`a+iwLA0q|@47D|DhIza@)iwjewKqm|gCD`~}NCZ^kfbwWan z0F0^P1ULYiwd&fYz|;*wV`-lx0(3=T4V@4XT2ZbPR-UWx6OK( z(v+q&r72BmN~VS16}Y|SKHs;!{v9BBJDhuoeNai2#)O8w_~whhsbiD&>CS8^&~?)W zX&7uuQ#QAFrm36kvVJM{j~qimfRfP7`2r;X8D9i5k}xy`kc4h5Kr=o=YXRM!FYrte z^ZwadfS)OfNhkxw)LQ7=Kq%+u8R#tD^s0a>&{+PlD#;l-Kj5kG>`Y!k`l`py7sS%# zp%WyY8qbb^Sb~HZA8ij25X<#D0la2w0aaEJI$sbvD&xsgCn8%Hh{b?VmZ;bKf9M-Q z=$pa7z8838_wxmQ{z$XNsOvTVzvbTx2o}J)IbSgF^!K1k3|Q(JgR0baieyVbs?_E8 z>$1ZmL4c;XJ-=U<8qeaBRWIiYstz}7h6Vfuzn)t8+4KSh00000NkvXXu0mjf`cPe* literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/wide/kai.png b/HMCLCore/src/main/resources/assets/img/skin/wide/kai.png new file mode 100644 index 0000000000000000000000000000000000000000..55efd15b5563668e838a470c8b27477b4b83eb83 GIT binary patch literal 1585 zcmV-12G043P)DncFVNAH60*>^AP72!4R zO#*;FzQ0xE_d9PFp+PiIjaE@T2%qQs6a*MfJ=EF0b^zE}2#osX=Bo>%3c+vx@Xfj5 zsN?5A;aS|*cM=F?6xo7%lK}vo=SagxmEO_l7rm4F^lP-?9e9_6;I72>wF7|8V!lR6 z5Fi?;Xz+*o&lOPsXgr_ed-RSe0ibkK)S#32K#gNG^l%BlsY_s{u z<8ygqcXvT*&(DsZsmX;$pK2~{J`=Xr-p^-ILKM(J7G410vDu|!Jj#RZ?dIy%RuR;@ z06h6aEgcf(P_ur2^72!k_#)IZ$aZw|J0mU00Ph`ja@CkwP( z27q1+@Dax~>IA@Jg1QIpWwfU86gOP;z4Ut-V;sn+A5{Qo2mxT70MKv+0(ulTNGYzP z%)c{gN34hpQXo|)8hL%Da}3C6?ykXh>Z<{nKX;|I1JLH{ncKK-=Xqbn zM_FCK@4H_{v~7z4k^idkwH>EuwmH>~RA!j7!Rx#q1+|Fo(MZ+683lkYf6yjfmcDIE z;+js^ek=_@_Nm)dFjYb@YpC40`BC%9)f@k7&-B^u_xlb|eLvvnrv~!*l`E}6Jr|7~ zx-g>g+U7c(MrXDdn@JFE13xobb*cc||L&+5h*AyvcyDiBR~^+uU5#RiHUPktq^=iK z^jYfonxxHm^?ffp1K?}@(~28Dv!yiKH4y6Tp+Q%#S+6m`4L>yl`u<*e`sD_){ltr< zytaGLy#Lxe&Fvds6hR$=c1Yj901jgN(V|oV%w+y&;>F8ymMOTY=N2M>#y!DfZ;52gB={z8+{f)9Y#0+XmbFx zqXdn*&W338X{@`2>aHAsh{6~_2LNqOUA<=9P~qO1t1dK>tj6XqXD3l%z~g&-`Nnw1-};sxu{J+93==k z3w#}bdt3*&t_M0dZt{n$NIj*cGk~mcx=w<^LjmB1L;yr!wHc4L$phg28u_35aYT0y zjAzCLq8($c`v!{dEN972if?k9W@S1`5cC9!XO%p?uKH~NaC_WOnRE@xqkS%WQpEv@ z0MNX`Di|>8hDkR1Y;zazL`)5UWf-9GXypKSPSI0pQQ}p>YD=qSX8|UiC@apL;~ z5g>z3gONMvs7J?fYU%Bo=x1`Yv{v!6|>Uo@Za_3FJhd8jkB0RZrs z{W!*%=e?HNr!(JqIy9FM>L_(51%YF*;M&j`6CeXvJQ<)gAKY9@Y5>}(H9kJlf=C-WV*-#0B)E5S`Wz#SBs0O?OnWdCeue~fiCkC@i7bN>a;u3sybZ{ODO47RA{J-B_Dt^71F1|dS>iMX1 zizf~jFCXsgn;Y-)_vPkaT{%(wd@)l12xyUOW1|4zzDWS60q^hMD~a#X=iL01K7b$q zt!Y400DyVbfI0wB`T&9^P)h^AB9Iu4_ zkU0CR577S${m)P>sSJQi!~sxyO#wg<$T;q?a5BO^c+LR;rawN})dNC(fHO~0Eg1@c z$Wc`V0EES2ANVIa1SOF0M`m7)T{Jq zLTUyPpxRy;0JU*#b3Z}iOG&EMx)4aj`;sWFNHbLWkr_Au-aZrn>YXD1`o0p+r+P1@ zgQH}0A*fTWh@6`CXPs*V$3`X<^=aJ)kSVIRFVIW$Nl7yTfkAvj|X%XfVSrMc)))LfX4$mr}D$7dz5~s?`S<9(3Z_tQBO~sX*9X@ctFzt z3>))Lh0$A&2ebjku+GUrL|yCgfHuz@G%;7}@qn&h+&=4utI>GC`1;?k!lVeEgOJfD6Zu44Cm#DpkjC zH~@9i>s&acSXBdj{FVbi)fdcE)c_yAAq-bJU!XxxkS9~zhCLqO?RCdD4nWoO1)5sJ z0^NpvBjoLM$F~ANmE0m0rNA)+L$IE&z@YrTw^h#nw;d0td%hr--_M;7*mMo3d%hr--_M;7*mMBu zo-gp+zUTLI=L0q!fV$@kG`F8(J~|^n5bCb~4-!G@MhqUPtpET307*qoM6N<$f*J0O A>;M1& literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/wide/noor.png b/HMCLCore/src/main/resources/assets/img/skin/wide/noor.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd91164e32dd3e4df03e8fca663a88fcebf5eaa GIT binary patch literal 1087 zcmV-F1i<@=P)e2&hTO1Vs%|lc*r#fQrP03k4-RH{xrj;0NeJxBh_}e<9=({0P5ka(){^IIlkym$M8@$1QS|HJbVC_fx;Oz&=wsyuc`QCL0Z z@w-Rg-#CG`(C?q!8&Ch-+Nz+fF^d2al05P{0&sJr1#pSL>rDgzaavw>0h(BV{z8=3 zNYuhoSb&}oSoWCHv|&a_^~(gg8do^pvR>T@=y8D zD33NaD+}1#y*k&f@9B*I*5o9?;o%biq=E6Zo5K;nw>)X`gq)E0&?rmtum;^u_(YII zBzT_%{&tiAmmeR_k+R65uLcQ7B2oZA3*fp(3&FY+OCuxz5G6ngEDHc>4gs^0`Lt`01g9-V6~i0u2+3n9-IIY(gHXHEPyaT@mOy~fRIx&1k055a;nE>tN^Lc zS4#lj_r3*}>M(O!2*@MX%b#n~a@9kA2;b*B5ES6_cz3Gt`N=^ESDQv?BNf_Hgy17D zx7s?776AKu4U%)UX~gU#Ljw5rA0Z3S#A{o?&;z!`Dkd3USZM)Z1;wf+#vXd{HY9ux zCC?McSYi{WDgWzu@8S&jo1L0wNB}D|S0{GJJ|N9&D0ezJHW5IRrfG*JIZJ>}C&nfM zxQ0>e@tWREf}sb`eQqerZ&|yrSac~smXuq7+;5Fvh7xdfF?T`sS%_P_jvqfY`TPhm zDAsA6)@hyEOggSmH@GS%uyR&cPLAID3R1)CS^!3UDMIgk1*zfnR14_*6lyLD;HIXo z1+?xcNj+Z>itdJ@!`dGZ`}VWV6FJWpG!>wUKOmdqBxC{m}V<9(*#!vs1490UWPd={0yG^y+582m@%x3x{}-K7 z&liN^`=RJ?=K`djFVG=w>v+Bu8t+_y)bjCIT002ovPDHLk FV1m2G_`?7I literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/wide/steve.png b/HMCLCore/src/main/resources/assets/img/skin/wide/steve.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8b5bfb4cad84bdc254c7872df3be9a86fa730d GIT binary patch literal 1196 zcmV;d1XKHoP)K|2e@G(l{VN(-&h#>OUvg-w1! z{?nSfzO$S?duQi;CcDoWILz+s-F@$zx%bZO&U8AFa{tbi%&;(fE#qUHe}4727M->i z5boZ)k@2w#@ZrTm2~#Bi6W03MX178fuxnG}0qpvG{$B{dv9F<^YC~G{T{JYH|SgJbMJluFYL70qw1caV9x?^Kxa(hsy&j0^g${ zqjLzhv$|1P9)HjPB7Dr`wZ?s+i4&41Ki}FK7vtV!=itp+_WRRT_UFsHy#DomGjDq| zcRlm&$GPSW78z}g@BnpR?nxtRgpD}J19r_L6$%M2G#WS2!R*e+83`k5<>iz8g0vl5 zv2(MrHoM1r7Keul)Cd8zhd_vd9)J7vK@Ro+21t2Hl|6#b&s_lg5v$Sj7{kB6UMVIt zHne?QUCgn1d!}TAArGFw&r|{Q{M-e=tc}U52v!?u69F|yLm<8v&*Pcl-CHvyH1=(A z`Qd)XSXx@jF+V?_Bl>`olOjA=SZlLu`g}$7`A0`tfy2X6h~~dBZUI0XLi8g5lV=eo zApqy2vAleZ!viKQz|8S+MSwXXKW_E&<(~!6h8p1O7k~UH zfqRCBQT*|cy`j|3M2T<#wC(Peq4)G70MzeC0KRUpKYM9!FGoSBM-*631Wj5>sMO;k0QbHpKqdBjNe)0l<=O+^Gn5DDu?oWH z>e7V(l=N7Dx)AWZN8diV=IpQUEqxD*u^8_s2QbuyxmVTJv)6k)QY?fgKxy>pcNiR2 z0L|*T2dGQSFvs?;0A%k8pl_ob5(9gHy0<34y1ZZjAtndno;P@Q-cSb{&+S96<3kCs zzP_FrVly<@DRg3^VrY`9OoW6qlQ*c_$3z%d0Gr-+yWJA0jg5^8QL|B7I}VKy>^Tqu z#MFkvhi%LgLjq{LYYrGl0Kf<-K@j)s?6_{K%p(bUG?Y_VEN<6~A4-5a{K2M^N-C+O zl1eJ6w6@p>&=4wLih8rol1(b9q>@T1sicz1S(T9&S7ilAzXG*RfPt6SMF3u19?SA~ zTRZ?$-LbF#x5@)fkJ$qn83LjG1>U-%xA+=d-w!Q^54!$;)&h7WL;DX5!R75b5e8ZR zKWhQ-JwLR>9uvUb9m0fFkT!UL3cz;J_5Bzk-vgrG6UHIHDEkXS>-(Vv4_ymvga?Ec zPD8s)*j`t7>h=P7Xk`d6>el#U`vMv%Kqv`@_7`}rUbi2haUS5U27B{?P?&fzUf1)D z6JXT+1u^omJaFy;jJm%dw!RG&vAy1QCXn(+{|Nk$0D?HN`_Ps9v0000< KMNUMnLSTZz%_|oG literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/wide/sunny.png b/HMCLCore/src/main/resources/assets/img/skin/wide/sunny.png new file mode 100644 index 0000000000000000000000000000000000000000..7f73988039ed406c280beff2288a4d3f4f40f4d2 GIT binary patch literal 1201 zcmV;i1Wx;jP)Flsse0O$3VTp1EQ+)T3$<8~E_)FX?5#+JUK9`Z zT)otzzhHlde<1n>-thW0v)S31?(A+S@JMF9B$MyuC7GFIY%CDQ$H!fzQgM@$lM!ZS zW}+DPVB33E?TE2q4|G}`*Xxld01i_D>~*GrQURp`s_tOr))B{f??fm7&MFCdJrWAA zD*!ER#v^@b;y~_Pl-h z34Id`&9}nsm7i{I{U8F;^?Kb+PftfcI#hmbd%{(o{5YbH#W!ahY?tT1bVR8B7auN0 zbuqST%$)!_PlU>&Q6Rt$1vVH?o}JzDq8kE0BI;sH=W|n3Rt2C@J_6WlSqbR70^qbF z%@EKzguRw^2;{B+G!_p=+zHHM2|_PCczG(0sQ@&Py@Is%n&#L08lw)RAFrKr_n)7R zW1H97Z9QERFtz+Ub{38SyoOClQoC&sKw{WSNlr4hy-F1!-Dq8joMUYBTDz?$H37DV zX;TF(wEjd$QULDLLEGSgRsiA<0f5@!gvI{;ew?N%k`!RcU^&(er?Q|Y0@%Z$AwYsG zG@lXyr+tJev~JYVHv)9RvvYu*1T|k$c^xLWr>d}It+qbL&!oDjFrDF({ycTE2MGu* zOCk8?5IAlfVLmOx{2)MwmX^^q-uE$P39$A;2!I2s06OIxQXEDkK$UtCG(9rf9)J&!iL`}F-}OZCJP@M>eLoUF<)Dj|>EW!*Sw zHk+=|XhbnEbOfY5UtqV=YPDJfkg&VE>q-R-BLQj87YvmGvYszE_TArp5zy=Tf@9zR z?>7Ny&lil80=hY0V0V79Zhsg4zrYfJYr8dW3CMH*zwrMBS^M$a=m&rLR5Qw>cnd$a=m2&QJl?d5m?Aci)_lhXVcq7n*KFBZF%e P00000NkvXXu0mjfdyXhi literal 0 HcmV?d00001 diff --git a/HMCLCore/src/main/resources/assets/img/skin/wide/zuri.png b/HMCLCore/src/main/resources/assets/img/skin/wide/zuri.png new file mode 100644 index 0000000000000000000000000000000000000000..3b356c040d037685e8df6c4316623cd803043f11 GIT binary patch literal 1176 zcmV;J1ZVq+P)#19kVXVi@bE{(LWKjHGon?HG>4r{$~2}-CyGTZEmQ=-Mhhz~1;u|rY-|Pp zmbmg3-tqGC&CafS$?aWs;4!nabDMc@zi(!CzRA*3CY?HQtQeeLF3v8WEKp|7^8K3^ zN^GoN-2>Jy&3jVfkq{)RB52**3*h9Dt5qo32n%5WBptcI!V94O4k6qPj)VY8-bGk= z0o3=eojbE{EI1Og0N*+Va0_tqD#F}MbMD(Z(51!zM{2E*x(9U1$GyxPZ*yzyM)Bmq ztr94s&WT0h__V2YxbDm-?;vR_`o_B!xvFA7l6|h zr!FU?*dDEvaPxO7sCuTiow)$Hm7LE2J`?!YU)6KwVxjc)?RKFU3q4)^%n=NoH#!1~TCagwJS==0c?Xyo%w zP6bG{!5`5Mu%i$GAQ^TV9drSd80$!!gjiPpSMuHm{;swFO3E!jMes8IkapTlR69?w zebiQgdKW^G5`cdLc`X4V@>L=zTmXHWN=z-F>J2+lC)gB?1aR^kpdu^aHQ$84WhLT* zP=tuMwgFPBNF8Jy+NQA!IN=m|!Yv?0+y^cS;BA#W%1%1%>Qc)ATaXh1Rxnl z%I~WXwfB!RCFe`>s7>Q}zbT?|!ClGc{U&h2kpTWRt2l509<5$U;@P_|C92xw5D7qF z_2({vx zSLyHWZW6wY#+@kKL*6Ucr#@Au)VF(G%)J1<{Z;ja7PaXupih13lcu)k3w(>5n;Ubp z!O`}7frrc(^{u_lJ?qr=e1Qj4=FS4zo-c40=)48^*#X}KZF0Uq!(~xC(F3QoqQ8gf z^BzvCbG{%7Z|gYV5oFELt}_BC*(T=;QU@ITO?%vsc_##LqD{^hw2lA!en8dUf$tSe zWxt^6d_go8xV7Zs`?>Q0opS*tTt%LU;`>qbH;Vn&IskFl0_5U?IRR4P@6`E#nSTwo zjV9;f`?>#FnEHM|YQReE2TV(VRD8cm0JL2g3rNNHQ_*3b519EF(Dr