From 9e6b5c79448bcc8b581a209d200e69c6aa45a771 Mon Sep 17 00:00:00 2001 From: Ceikry Date: Tue, 3 Aug 2021 03:19:59 -0500 Subject: [PATCH] Fixed windows support --- .../main/java/org/runite/client/Signlink.java | 111 ++++++------------ Client/src/main/resources/lib/jogl_awt_32.dll | Bin 11713 -> 20480 bytes Client/src/main/resources/lib/jogl_awt_64.dll | Bin 11713 -> 9216 bytes 3 files changed, 33 insertions(+), 78 deletions(-) diff --git a/Client/src/main/java/org/runite/client/Signlink.java b/Client/src/main/java/org/runite/client/Signlink.java index acbfc48cd..5b195d2e6 100644 --- a/Client/src/main/java/org/runite/client/Signlink.java +++ b/Client/src/main/java/org/runite/client/Signlink.java @@ -419,8 +419,10 @@ public class Signlink implements Runnable { } String[] libs = createLibs(is64Bit ? 1 : 0); //Windows has to load them this way because temporary files are illegal. - var7.invoke(runtime, var1.anObject977, method1448(this.gameName, this.anInt1215, libs[0]).toString()); - var7.invoke(runtime, var1.anObject977, method1448(this.gameName, this.anInt1215, libs[1]).toString()); + String jogl = method1448(this.gameName, this.anInt1215, libs[0]).toString(); + String awt = method1448(this.gameName, this.anInt1215, libs[1]).toString(); + var7.invoke(runtime, var1.anObject977, jogl); + var7.invoke(runtime, var1.anObject977, awt); } var7.setAccessible(false); @@ -500,6 +502,12 @@ public class Signlink implements Runnable { } } + /** + * Extracts the libs from the client resources + * @param archive deprecated - used to point to the cache archive for the lib, now indicates OS|Architecture "hash" + * @return an array of the created filenames to load. + * @author Ceikry + */ public String[] createLibs(int archive) throws Throwable { ArrayList filenames = new ArrayList<>(); String jogl; @@ -507,6 +515,7 @@ public class Signlink implements Runnable { String glueGen = ""; boolean isGluegenRequired = false; boolean is64Bit = osArchitecture.contains("64"); + boolean isWindowsOrMac = archive < 4; jogl = (archive < 2 ? "jogl" : "libjogl") + (is64Bit ? "_64" : "_32") + @@ -516,89 +525,35 @@ public class Signlink implements Runnable { (is64Bit ? "_64" : "_32") + (archive < 2 ? ".dll" : archive < 4 ? ".jnilib" : ".so"); - if(archive > 3) isGluegenRequired = true; - + if(!isWindowsOrMac) isGluegenRequired = true; if(isGluegenRequired) glueGen = "libgluegen-rt_" + (is64Bit ? "64" : "32") + ".so"; - if(archive >= 4) { //good, proper, correct Linux loading to allow multiple HD sessions - File joglLib = File.createTempFile("jogl", "." + jogl.split("\\.")[1]); - try (InputStream in = getClass().getResourceAsStream("/lib/" + jogl); OutputStream out = openOutputStream(joglLib)) { - if (in == null) throw new FileNotFoundException("Needed library does not exist: " + jogl); + File joglLib = isWindowsOrMac ? method1448(this.gameName, this.anInt1215, "jogl.dll") : File.createTempFile("jogl", "." + jogl.split("\\.")[1]); + File awtLib = isWindowsOrMac ? method1448(this.gameName, this.anInt1215, "jogl_awt.dll") : File.createTempFile("jogl_awt", "." + awt.split("\\.")[1]); + + try (InputStream in = getClass().getResourceAsStream("/lib/" + jogl); OutputStream out = openOutputStream(joglLib)) { + if (in == null) throw new FileNotFoundException("Needed library does not exist: " + jogl); + copyFile(in, out); + filenames.add(isWindowsOrMac ? joglLib.getName() : joglLib.getAbsolutePath()); + } + + try (InputStream in = getClass().getResourceAsStream("/lib/" + awt); OutputStream out = openOutputStream(awtLib)) { + if (in == null) throw new FileNotFoundException("Needed library does not exist: " + awt); + copyFile(in, out); + filenames.add(isWindowsOrMac ? awtLib.getName() : awtLib.getAbsolutePath()); + } + + if (isGluegenRequired) { + File glueLib = File.createTempFile("libgluegen", ".so"); + try (InputStream in = getClass().getResourceAsStream("/lib/" + glueGen); OutputStream out = openOutputStream(glueLib)) { + if (in == null) throw new FileNotFoundException("Needed library does not exist: " + glueGen); copyFile(in, out); - joglLib.deleteOnExit(); - filenames.add(joglLib.getAbsolutePath()); - } - - File awtLib = File.createTempFile("jogl_awt", "." + awt.split("\\.")[1]); - try (InputStream in = getClass().getResourceAsStream("/lib/" + awt); OutputStream out = openOutputStream(awtLib)) { - if (in == null) throw new FileNotFoundException("Needed library does not exist: " + awt); - copyFile(in, out); - awtLib.deleteOnExit(); - filenames.add(awtLib.getAbsolutePath()); - } - - if (isGluegenRequired) { - File glueLib = File.createTempFile("libgluegen", ".so"); - try (InputStream in = getClass().getResourceAsStream("/lib/" + glueGen); OutputStream out = openOutputStream(glueLib)) { - if (in == null) throw new FileNotFoundException("Needed library does not exist: " + glueGen); - copyFile(in, out); - glueLib.deleteOnExit(); - filenames.add(glueLib.getAbsolutePath()); - } - } - } else { //Shitty, fucking headass windows-specific loading that is backwards as fuck - File jogLib = method1448(this.gameName, this.anInt1215, jogl); - if(!jogLib.exists()){ - try (InputStream in = getClass().getResourceAsStream("/lib/" + jogl); OutputStream out = openOutputStream(jogLib)) { - if (in == null) throw new FileNotFoundException("Needed library does not exist: " + jogl); - copyFile(in, out); - filenames.add(jogLib.getName()); - } - } - - File awtLib = method1448(this.gameName, this.anInt1215, awt); - if(!awtLib.exists()){ - try (InputStream in = getClass().getResourceAsStream("/lib/" + awt); OutputStream out = openOutputStream(awtLib)) { - if (in == null) throw new FileNotFoundException("Needed library does not exist: " + awt); - copyFile(in, out); - filenames.add(awtLib.getName()); - } + filenames.add(glueLib.getAbsolutePath()); } } + return filenames.toArray(new String[]{}); - - /*String jogl = archive < 2 ? "jogl.dll" : archive < 4 ? "libjogl.jnilib" : "libjogl.so"; - String joglAwt = archive < 2 ? "jogl_awt.dll" : archive < 4 ? "libjogl_awt.jnilib" : "libjogl_awt.so"; - byte[] bs = CacheIndex.libIndex.getFile(archive, 0); - if (bs == null || bs.length < 1) { - System.err.println("Could not create native lib " + joglAwt + ", archive=" + archive + "!"); - return new String[]{}; - } - FileOutputStream fos = new FileOutputStream(method1448(this.gameName, this.anInt1215, joglAwt)); - fos.write(bs); - fos.flush(); - fos.close(); - bs = CacheIndex.libIndex.getFile(archive, 1); - if (bs == null || bs.length < 1) { - System.err.println("Could not create native lib " + jogl + ", archive=" + archive + "!"); - return; - } - fos = new FileOutputStream(method1448(this.gameName, this.anInt1215, jogl)); - fos.write(bs); - fos.flush(); - fos.close(); - if (archive > 3) { - bs = CacheIndex.libIndex.getFile(archive, 2); - if (bs == null || bs.length < 1) { - System.err.println("Could not create native lib libgluegen-rt.so, archive=" + archive + "!"); - return; - } - fos = new FileOutputStream(method1448(this.gameName, this.anInt1215, "libgluegen-rt.so")); - fos.write(bs); - fos.flush(); - fos.close(); - }*/ } public final Class64 method1444(int var1, Class var2) { diff --git a/Client/src/main/resources/lib/jogl_awt_32.dll b/Client/src/main/resources/lib/jogl_awt_32.dll index ad1bc140878a346be577e95883d5f1b127588bd0..2b47eee6efda3c2286eed9cd544c1e903a42eccf 100644 GIT binary patch literal 20480 zcmeI3U2GIp6oAhzTiL?4F3<`Z5~sDr=tJ2u6(LGopo@qtEZaY;fnmBk+nr^1rcP)0 zG1ic58o|-DBpQ9;0eJAmL`)P3;h`}^ViW_3CVe7Jj0v%*U?Q$$!+7q@4sLDB(vrx_ zx#^iZ=iGD8J@-3zH`$$S`>Ug{004X_mIZJId)C7C_3oE(9Ik%+Y&Cpdd9m({r|n{0 zXG$LA1~j!_6SG`gR1{U``Xo*>6i!yS)*T&OR!vAvRaJ``ilHyxI6MBq=ntkVw??j* zqp05+xnzE5+kZ5VVgJ|21zSIP`iglJ_4KJrb{~`DDK_`NnMNZ3Z5|)oT=&dYcWeTx z>lS++0tlidq}Y~U{i@ow?u#l5CI}U1c(3;AOb{y2oM1x z@IMmhGOy*X`7cBYY|Y$I5cEgPNHA))`*)gMe$#7>euST9k39{w+~-Mag!f>kvaDRx7vOLGmaf37B04(_7*-It5Be0jKb} z%Xz^1xkwOzZ+Z=i$E8TjUCx0t+j`}}-CI5U^QZ?q?^ut(4D~3V7S^*k-#!WfFk2h^ z!(&GE`ifu(f^RihRjfCwYOrv*yvM9OQdNTnR_?1iW^4A?zY#c zKhB{A7pd&&?yxT5O#pAM)>@W@DX@gMGrbd&!#PJH0V9C+XM3U@S8v=#pPMYq0%H|( znqY=8V?kXckQ)kszQm2~w`1dEGZGMXzh=L;Sd9Ue@|z8QkFhMbfn@>4B1>=ZS+)4R zRnXZ3E=!FF5CI}U1c(3;AOb{y2oQm?1lHC$E(H#sb>n>y<*}k|0&T3N#eL%HjHvXl zjv0zBXQjx2xHO>4ssgZ4>o>BJqI30W9UuOO>bd>mAjh8ji(Eq1q&WTnz(^(~4daY+ zESl5)-~jN81UQf4wx@Aj{D1=IP}~+{xp1yFwZE6#0fcQEdpd;|B^|r)I<}krdQ&2k z0od(LYLW!-ut$&;S=S{k3rD?KF=Ic;J_drANE?H?kW9$?@JV?`_vToqGjkWT%7bEG zM(Rvyl9*_d`!rEIxEW^-!po7^_DCDQ#_?nsyT3uWhI{d#zNjdNQ9p$;j>4Xok1heY z&U%z66Vwka#UYdl6mA*7-{`xw9^hRR-xB~5$`>dL@karBQNBf4+=%gTB`^N6!v_`c z5G({gR6<(q&j{}Bg>6_>A+BbHK|>ML0ZG9@IXjTCd2JEnx~d&?*fl%wLW0o7j)I`b zs<7#xE^V?4E364OuR+Rp3nw(UYT|xb>F+SKq!^c8Qj)4LkP-Eys%4oHntKdk3l?vB z*jcljE%&u^%$*&jIV?MmjkT%qy|Zp(9`U*qJka+QaXRW*^P4y3X;{lF!QPOB9erth zi(yBwY#HyD>OD|oFFR^PfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3; zAOb|-K@z~{%|c%Uhmm r8E!ez@@dPtmIs+MtxW`o01+SpM1Tko0U|&IhyW2F0z`la%!R-|?oRGE literal 11713 zcmeHNdu$v>8K1kWlS|qp&XbU&?Imi!70TJp3-^(7j&t$ZagsK%)gU4*d*`)%;U4C0 zFL6Q)DOOQjH^`-xKz%@q5Gs{WizqaTK#FA4I4Tm?QbGR!$r2Q~O@UMbVcL}A_s!0C z-W%Wf(HK>g7<>1d?>XOo^WDts?0hZUw%6d>&qO14v#81h9pbnKIl<s&ln!Glz|FXnOJW7; zYjLf^MdcO;T=#v6vT&1TNrg~+0`ygiw+3(}uGI>k4)}y$j4zrh;S-CC`QzsL#Eqhl zAJ)b2iJQdPvh*dz{&I;6pI9pD+<{a~A0o;5Qz~CAo>qBMN?$HsC`(^0&aa%>fKRLu zqZ+*t3AqB#`>+b~BdUR;$U~ynsGuKI^c_-u(u=67Qfn(*@nk!nlk~;n*XsA!q2z}Y zedCP|VNlU8_$bHTE$DuJp!|G-k`9Iap`6?#Db8(F)hQ2FxcZCzc}_i7pL(tfO8ySC zOV9hZX8$SG?#+t+RVDw^3Vyz<=y@&96DSR&5Ugr!icBhwlKN?z>4*mR5cUvQb)*vW7aj_R(VH;su5>0TBQt$? z_nI*~ojIwx4Y5V{O%qJ&Tt{envm{g+$BIUs7$(eAw{b9f%!=7FX2jG^n!)%SGwyn_ zb*9ct#G}n^!E8EMFHk*FUr+U&vfkI#u=9Ab$UA19uz?UO<_H;9r)it`bw;yU=XWa% zE7d8Q+gf%v8C!!}gFDX#7lO!r~>*AR4yy6wmsPH_& z^FHGj)%eBqXVpB@r|7h%;5nD`laP5L82}RC&QgciWE)yyG9I z$z=RFx`nZ3iwykAKT_E7twq(Mu=z3EhfxZf3GX3WZ;cgDHa|o-1>>zeP_h#ls@e}? ze+&~>mP7_F`Xhr?Ay5jh z!P;k0i40Xo9(*nL=a;MMfO#&Dbaf5mzXLWFE`$vjwAVrQ6~EK+(#W}8e_v27S_Vfh zHx~YMd1M%}gKxsWy2xPvcw{g)78&e#BXTKxl^!NC(Eo<8H$;ZQgd1QW!u62x}nF)9@A##i1Se_iavT@R<8po#z z^63I)j&v*!fqVr=2KVQSPk1RjK?Y~@qyzo=a=}1LDj0A<1|tBTN|kXPx+yjI?;64qAm*(P^WQ8AYNud|_VlEQc2Q z$H#}S6$)p=g=Iev7sxES`H-90?(9L7&Hm!~#l>|815Jo1bwC!hBtO1WzIJ&!53 z)(Jy}hnaH*(+>hsmHkBn9t{ta$B1}U$cv$AV4{F=>fFuSfMEPW2Mjf#1FraqgO10b zOG!j3222_l~LeNsMmS+9hL%Eb4Pg>!=nAK~?(}S9|K$kSt_1WhlHoE+Oz(qh5ljCY0jeS zG}@DE?Z&0m-|#jq;df`^-Hq!f;LCTFGW?_9uY-SbZC{3e8vH)+<-1E6{*&N83%-0O zVSac(&eR*g`vtB&c-~6>{Q>;b;LCR%)(4FW>0iV3SMV$Ow*hh3hxk?U?{4r#F#@vaep-sxG~`m@Jfrmu722bqa$fB>Fg>Jjnk}jHIY20K zu|1@5npgqFK#(QQal5MUF=goA3TMBR+5b7lG}rI!EHrJiLvC4|4Ys?o+Vw?2F%GBCz15u z5C6V6KY5>(^Si_tkh`Tl8j&1(4=i&e`1kj|GQ_yUoxGnzRrw=Ry*8SQCpw*bXKgpV zO>Nm4+!oyFkha)(nX#*#V1|4uL z1}1Ep$#@J6reOxRptSAS!R`T+(n(rfLDY)ox(zdfl^C}56dK1a64%XWG-DlSED=vx z=!EMp^nHM`kLMenXBm#FCYZ0LDZ%sdM(}BlWqv?a7>+BP=3ScWS)aZ)P{C*~=VaFB zd7UB8<5CzmnInt<*5jf%mGyZZWq6O0WxfuHPjfWWd7dsprBD7-+w8w0i~XojELcCJ z#zls_E?_?E^Yh=Y>GL{+A+JkFpG@oeCTQdruY>qU%#hoGh%DT1j2}hCtzTR~srjDU zXL;7Afs{%&F1J1p7z`uY1i^Yz8MmaS&*Kt9_Z}1JaQjrJlEp>sbA0)G4#QRwautpr zlfHtATffrxIhNPkAJp{u`w&C=9^)>0`;RL9;<{Ar*YWpBJzl#05vmuo*%Nr7tYL z2ba<-eUC?U)I3ru|8f6LzXIn#^pSz$yi)M^Rr4q(^k&e#NFH8C zu%5GCnrbHs0Z*B87`>7{^&AH6rFk%V@O;Piha`RSyaoSWoq2Y(;O}cJ{|qYR=e=5< zzoh6-YxGL~(>y}{e@Dx!yrfr);(iNoDu2Y~!56r*YMz!v+^$Ia)aUva=;UWey~neB zrG8lgM!9~8RG>#I&`(#OKUIPLd=r*k>Ro)WCJsmQ`Rd~d?Ctj%&8;nt7T%WWmHyotZ53wIan`^Y^BF_nx9uYBG547O<%W&u* z3v+O0qEt;Dd6`r#o@kjg<}i&tpFhyJzom&Hlua8wW~wuR!%fX?2X{BN83*_7JsfT~ z+8cMbg^iE!aEtbE#!LrFWVF#LN#+2O?y`E`cE_Qxga_VG^ZyurnXHFKiAV#b3Pwf{E5o5f-@aD(+(>B7b6O{ AHvj+t diff --git a/Client/src/main/resources/lib/jogl_awt_64.dll b/Client/src/main/resources/lib/jogl_awt_64.dll index ad1bc140878a346be577e95883d5f1b127588bd0..d247b4a0b33ba8f7d434324a5d4215b6bd21a351 100644 GIT binary patch literal 9216 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 Yd%KBTh%w`gzp3XRMi4Kyubl_}2fh?CXaE2J literal 11713 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 AHvj+t