From fa082ed17903f7280e8d3bb4251e448d9bbab399 Mon Sep 17 00:00:00 2001 From: kirillsaint Date: Mon, 28 Aug 2023 16:19:15 +0600 Subject: [PATCH] Custom Multiplayer Screen 100% --- .../gui/multiplayer/SilentMultiplayerGui.java | 53 +++++++++++++++++- .../components/ServerComponent.java | 27 ++++++++- .../minecraft/silentclient/icons/hazard.png | Bin 0 -> 5070 bytes .../silentclient/icons/page-down.png | Bin 0 -> 439 bytes .../silentclient/icons/page-left.png | Bin 0 -> 495 bytes .../silentclient/icons/page-right.png | Bin 0 -> 484 bytes .../minecraft/silentclient/icons/page-up.png | Bin 0 -> 440 bytes 7 files changed, 78 insertions(+), 2 deletions(-) create mode 100755 src/main/resources/assets/minecraft/silentclient/icons/hazard.png create mode 100755 src/main/resources/assets/minecraft/silentclient/icons/page-down.png create mode 100755 src/main/resources/assets/minecraft/silentclient/icons/page-left.png create mode 100755 src/main/resources/assets/minecraft/silentclient/icons/page-right.png create mode 100755 src/main/resources/assets/minecraft/silentclient/icons/page-up.png diff --git a/src/main/java/net/silentclient/client/gui/multiplayer/SilentMultiplayerGui.java b/src/main/java/net/silentclient/client/gui/multiplayer/SilentMultiplayerGui.java index a02baa6..fd2eb0c 100644 --- a/src/main/java/net/silentclient/client/gui/multiplayer/SilentMultiplayerGui.java +++ b/src/main/java/net/silentclient/client/gui/multiplayer/SilentMultiplayerGui.java @@ -141,7 +141,7 @@ public class SilentMultiplayerGui extends SilentScreen { continue; } if(MouseUtils.isInside(blockX + 5, (int) serverY, blockX + 5, blockY + 43, blockWidth - 10, blockHeight - 43 - 39) || MouseUtils.isInside(blockX + 5, (int) serverY + 38, blockX + 5, blockY + 43, blockWidth - 10, blockHeight - 43 - 39)) { - MouseCursorHandler.CursorType cursor = serverComponent.draw(mouseX, mouseY, blockX + 5, serverY, serverIndex == selectedServer); + MouseCursorHandler.CursorType cursor = serverComponent.draw(serverIndex, mouseX, mouseY, blockX + 5, serverY, serverIndex == selectedServer); if(cursor != null) { cursorType = cursor; } @@ -164,6 +164,54 @@ public class SilentMultiplayerGui extends SilentScreen { } } + public boolean canUpSwap(int index) + { + return index > 0; + } + + public boolean canDownSwap(int index) + { + return index < this.savedServerList.countServers() - 1; + } + + public void swapUp(int index, boolean fullSwap) + { + int i = fullSwap ? 0 : index - 1; + this.savedServerList.swapServers(index, i); + + if (this.selectedServer == index) + { + this.selectServer(i); + } + + servers.clear(); + for (int i1 = 0; i1 < savedServerList.countServers(); ++i1) + { + ServerData serverData = savedServerList.getServerData(i1); + + servers.add(new ServerComponent(this, serverData)); + } + } + + public void swapDown(int index, boolean fullSwap) + { + int i = fullSwap ? this.savedServerList.countServers() - 1 : index + 1; + this.savedServerList.swapServers(index, i); + + if (this.selectedServer == index) + { + this.selectServer(i); + } + + servers.clear(); + for (int i1 = 0; i1 < savedServerList.countServers(); ++i1) + { + ServerData serverData = savedServerList.getServerData(i1); + + servers.add(new ServerComponent(this, serverData)); + } + } + @Override protected void actionPerformed(GuiButton button) throws IOException { super.actionPerformed(button); @@ -247,6 +295,9 @@ public class SilentMultiplayerGui extends SilentScreen { } if((MouseUtils.isInside(blockX + 5, (int) serverY, blockX + 5, blockY + 43, blockWidth - 10, blockHeight - 43 - 39) || MouseUtils.isInside(blockX + 5, (int) serverY + 38, blockX + 5, blockY + 43, blockWidth - 10, blockHeight - 43 - 39)) && isReset) { isReset = !serverComponent.mouseClicked(serverIndex, mouseX, mouseY, blockX + 5, serverY, serverIndex == selectedServer); + if(!isReset) { + break; + } } serverY += 38; } diff --git a/src/main/java/net/silentclient/client/gui/multiplayer/components/ServerComponent.java b/src/main/java/net/silentclient/client/gui/multiplayer/components/ServerComponent.java index 45ac645..a6df2cd 100644 --- a/src/main/java/net/silentclient/client/gui/multiplayer/components/ServerComponent.java +++ b/src/main/java/net/silentclient/client/gui/multiplayer/components/ServerComponent.java @@ -8,6 +8,7 @@ import io.netty.buffer.Unpooled; import io.netty.handler.codec.base64.Base64; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.texture.DynamicTexture; @@ -52,7 +53,7 @@ public class ServerComponent { this.field_148305_h = (DynamicTexture)this.mc.getTextureManager().getTexture(this.serverIcon); } - public MouseCursorHandler.CursorType draw(int mouseX, int mouseY, float x, float y, boolean isSelected) { + public MouseCursorHandler.CursorType draw(int serverIndex, int mouseX, int mouseY, float x, float y, boolean isSelected) { MouseCursorHandler.CursorType cursorType = null; if (!this.server.field_78841_f) { @@ -96,6 +97,17 @@ public class ServerComponent { } RenderUtil.drawImage(this.field_148305_h != null ? serverIcon : UNKNOWN_SERVER, x + 2, y + 2, 31, 31, false); + + if(MouseUtils.isInside(mouseX, mouseY, x + 2, y + 2, 31, 31)) { + if(this.owner.canUpSwap(serverIndex)) { + RenderUtil.drawImage(new ResourceLocation("silentclient/icons/page-up.png"), x + 2 + (31 / 2) - (15 / 2), y + 2, 15, 15, true, MouseUtils.isInside(mouseX, mouseY, x + 2 + (31 / 2) - (15 / 2), y + 2, 15, 15) ? new Color(255, 255, 255).getRGB() : Theme.borderColor().getRGB()); + } + + if(this.owner.canDownSwap(serverIndex)) { + RenderUtil.drawImage(new ResourceLocation("silentclient/icons/page-down.png"), x + 2 + (31 / 2) - (15 / 2), y + 2 + 31 - 16, 15, 15, true, MouseUtils.isInside(mouseX, mouseY, x + 2 + (31 / 2) - (15 / 2), y + 2 + 31 - 16, 15, 15) ? new Color(255, 255, 255).getRGB() : Theme.borderColor().getRGB()); + } + } + mc.fontRendererObj.drawString(server.serverName, x + 2 + 31 + 3, (int) y + 3, -1, true); List list = this.mc.fontRendererObj.listFormattedStringToWidth(this.server.serverMOTD, 240 - 36); @@ -187,6 +199,19 @@ public class ServerComponent { public boolean mouseClicked(int serverIndex, int mouseX, int mouseY, float x, float y, boolean isSelected) { boolean isHovered = MouseUtils.isInside(mouseX, mouseY, x, y, 240, 35); if(isHovered) { + if(MouseUtils.isInside(mouseX, mouseY, x + 2, y + 2, 31, 31)) { + if(this.owner.canUpSwap(serverIndex) && MouseUtils.isInside(mouseX, mouseY, x + 2 + (31 / 2) - (15 / 2), y + 2, 15, 15)) { + Client.logger.info("Swapping server " + serverIndex + " to up"); + this.owner.swapUp(serverIndex, GuiScreen.isShiftKeyDown()); + return isHovered; + } + + if(this.owner.canDownSwap(serverIndex) && MouseUtils.isInside(mouseX, mouseY, x + 2 + (31 / 2) - (15 / 2), y + 2 + 31 - 16, 15, 15)) { + Client.logger.info("Swapping server " + serverIndex + " to down"); + this.owner.swapDown(serverIndex, GuiScreen.isShiftKeyDown()); + return isHovered; + } + } if(!isSelected) { this.owner.selectServer(serverIndex); } else { diff --git a/src/main/resources/assets/minecraft/silentclient/icons/hazard.png b/src/main/resources/assets/minecraft/silentclient/icons/hazard.png new file mode 100755 index 0000000000000000000000000000000000000000..3c4f66bde282d75727d6c41f5b8ef2854700a007 GIT binary patch literal 5070 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 k%LDgg&Q$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/silentclient/icons/page-down.png b/src/main/resources/assets/minecraft/silentclient/icons/page-down.png new file mode 100755 index 0000000000000000000000000000000000000000..2b2d70abda5d66d6a64823b4849e12dcd509e4dc GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSK$uZf!>a+P!N=3ZF(kwJ?KS%>CPxX@53$^D-}HuR=?gf0 z;Cd!;P40l%k}o`p4+NXqJ9auKOfcG(lseJpUd?ZXCbql(jX%_VFnss!jCsEJ6<-$+ zP%+ay9y6!dT;kp4#a?@tWd1sK{_El1HG!oO#oc$TWIo?2ToV;r>wkFiZr9q|#%s>; zzv_!NVV`Yx^V`+RwAX2gj~TPF1y9{x$d(i9aq+!JQ~Y#&p8lJGnf!0A^VuBLdv(|T zlF*-DdePh171hL+@8FEy%AXh(x$I6@jvyP0)WUCKZ;R^wb?6>y4B+lA-^n_?jrHKK z6}_%D=g+?`&a4o~%Q8GayU25fz=r0ktt-jq%8xW@l`C0+LR&#rt>d~+#D zKDx+DMxdhO(|iB+KOZLqKWe;C-2FfOoOhw)2f0^=^A7Ix59y!&sQE+q3dvWqmV-UM dWQod8)__-wGpBmqi2w#RgQu&X%Q~loCIAE;ygvW{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/silentclient/icons/page-left.png b/src/main/resources/assets/minecraft/silentclient/icons/page-left.png new file mode 100755 index 0000000000000000000000000000000000000000..22df32fe574f2b908dff5223dc707da189c358fe GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!h89m3$B+!?w=;aTT>>Q<-p@UHBV*g4pv1#m zzMt4@blyfpd|=n;>g9F)$gZJU*SLP})Fo-|T+(J@+cp^<{kkXp-B0H4^Z0|`2m3#N zJGb?-$=SDRfg-LTG^O5mT557dFR#qW>u;H-zdNS<$MJO9zd}W=pOP$k(MLm%smC~^ z*V{*MFkY77-_dM(bLWw24o2pRlNEh`(_S*>E5__=tM2)3kvUDSQ0~xE?Hwn6G@Xu^ zx;KALn}ET&!glr>s=EU$I29L&`%B~(T+v|;)@nIj{=jOnjo)*FskJ;@?E)7Lf9#09 zp}Bj;l%H;C8`qm2Tkdm0a^KctKScOEFMpYuEMWe@yUbAYYqI(?>FtuLFGP%Q9$ygB z(K@4iPWqe!ZINupJb|3(J}bS4?QfhOnz$%D6X%zF%33Htd(-#c&jQ?r^LHGw=m}4I zDVVP)mNc)htB~!f>m}}c&N@e83V0q$S=Gm|a|?E4KGIwKr>@WN*5g~6d)8mwSo^zopr0JK8Q8UO$Q literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/silentclient/icons/page-right.png b/src/main/resources/assets/minecraft/silentclient/icons/page-right.png new file mode 100755 index 0000000000000000000000000000000000000000..50f891c99eb0fc10c39d3314c810bc42aab66598 GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSK$uZf!>a+Pq0-aEF(kwJ?Tp=C%#IRn<+@u0qXngN7b$EE z;(WwiQO%?}bzehMlbIP8*Dt0hjg0h{OE(J%UOMW=JdJBx(qh+Z#>UnOnP$eDrGN0t z2<;P@DZI(sLxrPB0fY|KdrV4U%C2aiTJp}u;tyZctco_~m!}r~#WUpF_M zyKf%Su~feQhJMK_=(zXrm>m^SbA6b-lefNr{ zwy%>Km0BX&3NG5@&Q)sN^Jr=1Eh|@!pNDc~x*z|D)t5YBta6ZBMm2$d|JPX)_c&!) z9DX?c<5{1#f>uwM!#6q|XpWN+)Oy0+zrp1Ir`gw669g2uTbz4%{o`eycONA$9bo0N zZ`V)z)ZQ=fb!C3i%!cf}EC*6Me%+hDXxCi11-taDnCqnf{uNKvn#<}azyd@IJ6ta6 YzkS#tRVTCs7%>bCp00i_>zopr0Nd8W)&Kwi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/silentclient/icons/page-up.png b/src/main/resources/assets/minecraft/silentclient/icons/page-up.png new file mode 100755 index 0000000000000000000000000000000000000000..6ac7706dea9553bf685c9bfe36b1d85d03e92612 GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSK$uZf!>a+P!PnEpF(kwJ?KMZgLk<$G52mr^Ot9Tl#4K)b ztbo;qE&K5-W(o5(v&Iy8r*Xs)|snpL$8wz3F?lEH%FDu6V)6 z1q6~byB_iEbo2We^m{=Kf2HFY<4ccMmN|ZG-QT*F)qg9ySO0|a_4`wgEAwTti^Nra zjn(G!lt1M+QGfm3({b~QGIj-QYPN}ZY=7e?-|{7#tk2_0_ggMs!v2))#OmvJ&L88o zFxA!A_NA*mx+u#kAgigSV(;ObKRBm*FmtWl8&#UEchP3b%&Bvm&h7{)4p`J}Q#rT5 zZ2xK1<|99J_d6bYnrARO|FsEod11$&nt5Db+jw@Cq?X!Gv|bYb?poS^&FxR$2|j!m ztF+(Nzx9`kUPb5Q1FYtCFMpWraZxSZ7o~pZnAn!QbGfNIil5(znd%;R_j%>N6SaaM e@N@m9H_}(H`tdinn3e%Uo59o7&t;ucLK6ULkhPou literal 0 HcmV?d00001