From 96fd9645390c2f49bc17e57d73664e27d9aec585 Mon Sep 17 00:00:00 2001 From: alterdekim Date: Sun, 28 Jul 2024 04:59:36 +0300 Subject: [PATCH] Update --- .../alterwain/offlineskin/GuiSkinChanger.java | 10 ++++++++ .../alterwain/offlineskin/OfflineSkinMod.java | 9 ++++--- .../java/alterwain/offlineskin/SendSet.java | 23 +++++++++++------- .../mixin/NetClientHandlerMixin.java | 12 +++++++-- .../packet/Packet244SkinRequest.java | 12 +++++++++ src/main/resources/char.png | Bin 0 -> 1378 bytes .../resources/lang/offlineskin/en_US.lang | 4 +++ 7 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/char.png diff --git a/src/main/java/alterwain/offlineskin/GuiSkinChanger.java b/src/main/java/alterwain/offlineskin/GuiSkinChanger.java index 75e7128..548d8a8 100644 --- a/src/main/java/alterwain/offlineskin/GuiSkinChanger.java +++ b/src/main/java/alterwain/offlineskin/GuiSkinChanger.java @@ -2,6 +2,8 @@ package alterwain.offlineskin; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.options.components.BooleanOptionComponent; +import net.minecraft.client.option.BooleanOption; import net.minecraft.core.lang.I18n; import javax.imageio.ImageIO; @@ -17,6 +19,8 @@ public class GuiSkinChanger extends GuiScreen { private GuiButton buttonLoadSkin; private GuiButton buttonLoadCape; private GuiButton buttonClose; + private GuiButton modelType; + private GuiButton hasCape; public GuiSkinChanger(GuiScreen parent) { @@ -27,6 +31,8 @@ public class GuiSkinChanger extends GuiScreen { public void init() { I18n stringtranslate = I18n.getInstance(); this.controlList.clear(); + this.controlList.add(this.modelType = new GuiButton(3, this.width / 2 - 100, this.height / 4 + 2, 200, 20, stringtranslate.translateKey("gui.options.page.edit_skin.button.model_slim"))); + this.controlList.add(this.hasCape = new GuiButton(4, this.width / 2 - 100, this.height / 4 - 10 + 30 + 4, 200, 20, stringtranslate.translateKey("gui.options.page.edit_skin.button.has_cape_yes"))); this.controlList.add(this.buttonLoadSkin = new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + 12, stringtranslate.translateKey("gui.options.page.edit_skin.button.load_skin"))); this.controlList.add(this.buttonLoadCape = new GuiButton(1, this.width / 2 - 100, this.height / 4 - 10 + 50 + 18 + 20 + 4, 200, 20, stringtranslate.translateKey("gui.options.page.edit_skin.button.load_cape"))); this.controlList.add(this.buttonClose = new GuiButton(2, this.width / 2 - 100, this.height / 4 + 120 + 12, stringtranslate.translateKey("gui.options.page.edit_skin.button.close"))); @@ -50,6 +56,10 @@ public class GuiSkinChanger extends GuiScreen { OfflineSkinMod.capeImage = ImageIO.read(cape); Files.copy(cape.toPath(), new File(configPath, "cape.png").toPath(), StandardCopyOption.REPLACE_EXISTING); } + } else if(button.id == 3) { // model type + + } else if(button.id == 4) { // hasCape + } } } catch (IOException e) { diff --git a/src/main/java/alterwain/offlineskin/OfflineSkinMod.java b/src/main/java/alterwain/offlineskin/OfflineSkinMod.java index 0216f97..aca27e0 100644 --- a/src/main/java/alterwain/offlineskin/OfflineSkinMod.java +++ b/src/main/java/alterwain/offlineskin/OfflineSkinMod.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.nio.file.Path; import java.util.HashMap; import java.util.Map; +import java.util.Objects; public class OfflineSkinMod implements ModInitializer, GameStartEntrypoint, RecipeEntrypoint { @@ -39,9 +40,11 @@ public class OfflineSkinMod implements ModInitializer, GameStartEntrypoint, Reci public void beforeGameStart() { configPath.mkdirs(); try { - if (new File(configPath, "skin.png").exists()) { - skinImage = ImageIO.read(new File(configPath, "skin.png")); + if(!new File(configPath, "skin.png").exists()) { + BufferedImage i = ImageIO.read(Objects.requireNonNull(OfflineSkinMod.class.getClassLoader().getResourceAsStream("char.png"))); + ImageIO.write(i, "png", new File(configPath, "skin.png")); } + skinImage = ImageIO.read(new File(configPath, "skin.png")); if (new File(configPath, "cape.png").exists()) { capeImage = ImageIO.read(new File(configPath, "cape.png")); } @@ -81,7 +84,7 @@ public class OfflineSkinMod implements ModInitializer, GameStartEntrypoint, Reci ByteArrayInputStream is = new ByteArrayInputStream(b); return ImageIO.read(is); } catch (IOException e) { - return null; // TODO: read default skin from resources. + return null; } } diff --git a/src/main/java/alterwain/offlineskin/SendSet.java b/src/main/java/alterwain/offlineskin/SendSet.java index b214e7b..870e3c3 100644 --- a/src/main/java/alterwain/offlineskin/SendSet.java +++ b/src/main/java/alterwain/offlineskin/SendSet.java @@ -15,15 +15,20 @@ public class SendSet extends Thread { @Override public void run() { - try { - Thread.sleep(2500); - if( isCape ) { - ((ForceDownloadHandler) EntityRenderDispatcher.instance.renderEngine).offlineSkinChanger$forceLoadDownloadableTexture("offlineCapeLocal:" + this.username, null, null); - return; + int i = 0; + while(i < 10) { + try { + Thread.sleep(2500); + if (isCape) { + ((ForceDownloadHandler) EntityRenderDispatcher.instance.renderEngine).offlineSkinChanger$forceLoadDownloadableTexture("offlineCapeLocal:" + this.username, null, null); + return; + } + ((ForceDownloadHandler) EntityRenderDispatcher.instance.renderEngine).offlineSkinChanger$forceLoadDownloadableTexture("offlineSkinLocal:" + this.username, null, PlayerSkinParser.instance); + return; + } catch (Exception e) { + e.printStackTrace(); + i++; + } } - ((ForceDownloadHandler) EntityRenderDispatcher.instance.renderEngine).offlineSkinChanger$forceLoadDownloadableTexture("offlineSkinLocal:"+this.username, null, PlayerSkinParser.instance); - } catch (Exception e) { - e.printStackTrace(); - } } } diff --git a/src/main/java/alterwain/offlineskin/mixin/NetClientHandlerMixin.java b/src/main/java/alterwain/offlineskin/mixin/NetClientHandlerMixin.java index 617f5ac..6a9bcb8 100644 --- a/src/main/java/alterwain/offlineskin/mixin/NetClientHandlerMixin.java +++ b/src/main/java/alterwain/offlineskin/mixin/NetClientHandlerMixin.java @@ -20,9 +20,17 @@ public abstract class NetClientHandlerMixin extends NetHandler implements SkinRe @Override public void offlineSkinChanger$handleSkinRequest(Packet244SkinRequest request) { + byte[] skin = new byte[0]; + byte[] cape = new byte[0]; + if( request.isRequestSkin() && OfflineSkinMod.skinImage != null ) { + skin = OfflineSkinMod.imageToBytes(OfflineSkinMod.skinImage); + } + if( request.isRequestCape() && OfflineSkinMod.capeImage != null ) { + cape = OfflineSkinMod.imageToBytes(OfflineSkinMod.capeImage); + } this.netManager.addToSendQueue(new Packet245SkinResponse(mc.thePlayer.username, - OfflineSkinMod.imageToBytes(OfflineSkinMod.skinImage), - OfflineSkinMod.imageToBytes(OfflineSkinMod.capeImage), + skin, + cape, false)); } } diff --git a/src/main/java/alterwain/offlineskin/packet/Packet244SkinRequest.java b/src/main/java/alterwain/offlineskin/packet/Packet244SkinRequest.java index 7137859..fd2b7ff 100644 --- a/src/main/java/alterwain/offlineskin/packet/Packet244SkinRequest.java +++ b/src/main/java/alterwain/offlineskin/packet/Packet244SkinRequest.java @@ -45,4 +45,16 @@ public class Packet244SkinRequest extends Packet { public int getPacketSize() { return 3; } + + public boolean isRequestSkin() { + return requestSkin; + } + + public boolean isRequestCape() { + return requestCape; + } + + public boolean isRequestModelType() { + return requestModelType; + } } diff --git a/src/main/resources/char.png b/src/main/resources/char.png new file mode 100644 index 0000000000000000000000000000000000000000..da6b3c33d670d3de53535338d38b5365fe49e895 GIT binary patch literal 1378 zcmcIjk2@2182|1EW-~VD{22LhV~t3DbcD4{W^;u#6Pd$}*r6~hbI7K|x@=Ytoep`* zYS#&=VM+Dm2^FQqDXnYQamn)I!qri^)&Fqs^L*aV^LgIqec#XXKF=#*M$yqo91;M4 zj$nkb3{3e11k8{dy2P&y1j%R7LqY3(hgSvx&!9$90k|YXz5mY0P$MvRuxTFa(5|)! zCk$#o-P_yAB9pS|NQ^%Lhs5LYEF!_(!Hj5+TyKx^#bdmjG2YJT4UTA{1Ip9U+|Lyo z>S0Ot_>y3Y+TdtTv`4wxB0DA7y;6REt*G}$ey>!}av;Iq&60>id#y9~{tA1cB>l?a zy%$A$>-mX25`O*nI|w*4yp3r^d{BKVEr@8fwzkG1NmNA{o{reVET7tBYGuNf`qc2t zMcl43{`Jc2GnsTzj6ZjqcSC0MsnoFQq;0jyl!DOBvZSrzm@V}gjHA1Q1q|;Tn&;ka z9zR6+9f}P;&5Jmd_RX${AtI3ohK4{&3Q#I{`nYW(@(C`S@E}Eyj|7yK0uBe%)q%!F z(AEZcyo%W1+8hpjF8r&IZin*B_5^xKvRBh}bO0o$?zF|}GM`8{CK zSWd&P>Hl^#pLZMjuqWMC_<(oG3@?u3dfs{QbbJO{%}@Y_>!b7ue>$X@RSVS~(gc{e zE)@4M?C>z1%Cm(l5G`fh{D1|!?soPgoHs*nb~^Xza`J?tKjZC+LVhl(-X7`NQZFBt zKDE1-x1`qP!D!%~D*uE!ao?Li@C97oj2>&qyTpZVv9I>pp6JL2kJSUwja!R8zEF_- zNP9Siai>v^0n8&Y#H&&L4PL`FNxhB9@jvbNlX5%*S3dRKvaG+Yn5r35tCj;6^;wFs znkfZMJNmM00Br@z-}k2%>Suf2zFMl7m2swqtBS>6?`-%yQg2mo;O)@l`3K2OZ8gp6 zuAUe{V#!9KmST5KoiTUP!u&=_8(S)s$;>SdzFyNl@3T05pQf42gSnkvK&_zf1T$kB z6f;iN&-Y0(W1FKj>xv+(|xuD%-(ipxK>hIe0a2ik=K*CvL=K(?|WGM|g zsA#_dyD1MaZLI|SKE{GOm^WJGgkSyzGW=Kapsa+9;6ah1#C@=0{wzo_RT!_D8r*W- zGvFYak05t1#YeoW_rw3`V zSwygG)CEm3CRLUHHnQCoH}b?=SUGB;BPacXWIGAtIdOp9Jb^jGPN1 UOCkv;+wgZFf)*9l8k$n}9|q}jkN^Mx literal 0 HcmV?d00001 diff --git a/src/main/resources/lang/offlineskin/en_US.lang b/src/main/resources/lang/offlineskin/en_US.lang index fb70890..6dd728d 100644 --- a/src/main/resources/lang/offlineskin/en_US.lang +++ b/src/main/resources/lang/offlineskin/en_US.lang @@ -3,3 +3,7 @@ gui.options.page.edit_skin.button.load_skin=Load skin gui.options.page.edit_skin.button.load_cape=Load cape gui.options.page.edit_skin.button.close=Close gui.options.page.edit_skin.label.title=Change skin/cape +gui.options.page.edit_skin.button.model_fat=Model type: Steve +gui.options.page.edit_skin.button.model_slim=Model type: Alex +gui.options.page.edit_skin.button.has_cape_yes=Has cape (yes) +gui.options.page.edit_skin.button.has_cape_no=Has cape (no)