From 59aee1b42f8d06b9a7d1813cb89afe08112c7fcc Mon Sep 17 00:00:00 2001 From: lax1dude Date: Fri, 8 Nov 2024 19:37:23 -0800 Subject: [PATCH] {1.1} Fixed crash and other issues with the shared world relay --- README.md | 2 +- .../SharedWorldRelay-Latest.jar | Bin 257785 -> 258080 bytes .../v1_8/sp/relay/server/Constants.java | 2 +- .../v1_8/sp/relay/server/EaglerSPClient.java | 22 ++++---- .../v1_8/sp/relay/server/EaglerSPRelay.java | 52 +++++++++--------- .../v1_8/sp/relay/server/EaglerSPServer.java | 24 ++++---- 6 files changed, 51 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index b917c8a..9ddcd5b 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ If you would like to invite other players to join your singleplayer world and pl Once you press "Start Shared World", EaglercraftX 1.8 will give you a "join code" (usually 5 letters) to share with your friends. On a different device, go the "Multiplayer" screen and press "Direct Connect" and press "Join Shared World", enter the join code given to you when you started the shared world and press "Join World". Given a few seconds, the client should successfully be able to join your shared world from any other device on the internet that also has unrestricted internet access. If it does not work, check the "Network Settings" screen and make sure you and your friends all have the same set of shared world relay URLs configured or your clients will not be able to find each other. -If you would like to host your own relay, the JAR file and instructions can be downloaded from the "Network Settings" screen in the client. EaglercraftX 1.8 uses the same "LAN world" relay server that is used by Eaglercraft 1.5.2, if you would like the relay source code find a random copy of the Eaglercraft 1.5.2 source code and it should be located in the "sp-relay" folder. The relay has not been updated since then, it has only been renamed from "LAN world relay" to "Shared world relay". +If you would like to host your own relay, the JAR file and instructions can be downloaded from the "Network Settings" screen in the client. EaglercraftX 1.8 uses the same "LAN world" relay server that is used by Eaglercraft 1.5.2, however there have been several bug fixes. The current version is available in the `sp-relay/SharedWorldRelay` folder. ## PBR Shaders diff --git a/sp-relay/SharedWorldRelay/SharedWorldRelay-Latest.jar b/sp-relay/SharedWorldRelay/SharedWorldRelay-Latest.jar index 615b4ef002d5fe74e6b8c12107ba3bd2aa61b306..136357390e95875575f0612b57eb4c4ef581ac3a 100644 GIT binary patch delta 24117 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 X3$V!LRsUvllXE!}Lc~+!_w}n`E#( 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 delta 23971 zcmYJaV{qWX67C(_wr$(CZQJ%gwr$(Ct&O$O#@UUHO*VPYx%a$vKTOqAPgl=}nX0Mz zb#)gXAiwV+BdN%PLtub_z`%fv2A}A(Ac2FW$%CS_k%HNRqSAPu==|)y?=waO0r?~X z0TD=ZMdJmS%pFYK-5YdZeKgi_1-&!-P1!`)P)I07K;UK&SV=yxC_&{o7|>v(9PTa8 zC~y^=bZ}&U6BOSnib=7ZE*rT0xo3A#U>5=71~kHGWyRenH^Fj zOv&8T7_bxe5LcKPir@#MAc#)L4~MAPSgc0`1FmW;s2sJ31B?#iV5|e2MthvLKjJSI z5-+k*H@G#u>*KVUv%Ke?hWWyzqM#BsRK{U)7d=e}+E#yK;OrJ}D36ODUQGB+IdDUn zHb(+r$Z&_4G*_b9#4-4eQVJrMD`T+cwsphJv43YHg~+YW&1qse5FSlJZ!udDC&|T4rb||!uTTOtuP>C@gw5`r`Tg#i;IM(0%aK@E8s8^>Gs160`hkg|o+beDS)c5C0^PsSYuE zqxP3gC13{W2rF%wz^x|X+A3mbSH?9$Rum5ZBIVzVAk1U9Oq89;^QlPwq9xD|`MCn5 zoul}2@hCdQizh%=9dU$wMz@p*t>A8wgO+uP#;J3!H)LF_%cdj#`(1UFX&M3zUoj8P zLx-`UKN<-i2O%)$S55DI=mBc&+edWb2yR#@U{$~AJ51(y%9wWq1*uP_Qg}0gW+G57 zzr3=hpUF!{z_tB!*Do^s`${3f&9ny?hV@*Q;L#z9nVb_pv$CC&x$qs4eAfxdz{?fT ziD-kU1Y*$*n-V?5+Z72Vs!-!3e`;Bf26~giP%khoRcWb=epDXHrhoQT})|V+~wgkq`hVOYlLr zPAe39mHCw^0$XJxi#mwv)36LnWcpsDhs=tGSk$FE>{cn(J8UIrqFmm#8=uuL zYav=c{mxW8%P^u&nwTImAVUUzinQ+H=>0U zW4Dr___a=5dCwV*K_ z;q2oA-FbgED+O2oMNJR!Vg+NJ|5BYFc~$*ev6SsSeiWzwknY!JhWFJ5E*{$)W&u;po|>_ zURU&4H3X6uFW1hgjTu2Q|#oZsM$6%3pKa+ zsufe5)Ha7e;bUW^vcnZiw%;f{zrr#SEW_-NwNc1N@q!Q=ictJ;Dt4!=nm z^UNsa5Ha5mW^~G@=*K`&)Sx8YFF4M@MXrql)`{ZYV&dWnHTw5m!89V!43qwSzC)Ks z_mcZl7#CG%gIf&N3>0pY1O&r4D5RCu{>pdQR<; zzPVzClPgH%nY#9FrR*50#yYwu9yg-t$N!eGDh+!86+My0kMO?%ak&@u z*Qb@wb}|_f)f9Ty9{G;m%#Dk4B8v#jn=5fM1- zW60pFlFHBwN%@DJ`aqLfURqC?7_L%vD9BbT(+)=l2%p+_GBd{FW>WKBLO5{@vNDA! z6yiQS<;TAhEiLfRn05pPX23O?Qk%SJ@|u5X7*OymJa0iBYAb${1ji3x|tC97D8w-Ul*r& znUj8$#p|Fi3)=!S-%70bgPw73S_vwUbPIlQ1KB?fX)MRc;BTaK_zenmfcd!uLE=QQ zB=B>qs-Pt%8E3VPO8gsl}S(N}5&D2FDu%ftbm4{?oHXVGOP}HPZOd6Up7h46@@d zVvxO^-; z63>9KgM$}UAJnX`sI&|8u9fx@hHD$)#Dd`fWV^!4@1lomJcP4n1dL)(aauc8$=c#- z_2zi8{Fv32{7tF)!zvF1dRN}uw+x^g?DdF&sH!c)gY%>cNB^FG#rb?5@lEhcglh5R zgZqxEg4F-5j4$$G0izxSnr5qLx;6crs5`M#Y>Z^2X?2*DY^F?RP0Fi9dQ9J?c8U@2 zYyNvp*#b8$i&ZM@8t31^TjfKdyO&SceW8M;G(jNva&Eg0X+0o9aa;Zv zi(roGLAaK2Mg<=9y;P>*ZNx?-h^PXbssn_QKot98#%Lg&X_ zb6QgFutqw0OmIl29DAMIPOU#R+9N5_(7QPp_WWe>BJd9s?&MJ33bXgF=(k5G<3}ND z?ufs+REcKcZYC;2u_Q2rCk7VOSt?y>#1K@W_e6uKYs(mr|625id9O=R(|?;4EN*>6 z?YDhaiV)e;J#)K4j7>xtQ2xXCCj4&hbf<0LwXkbmeD*fCSG4`<KVat&`sA@3h&C^QkEulb;rQgqzGNf7daKVPAM;oQXHEMR0RZm*HZ@jS2qUPX z?PZ`Ek?%?(=!do7_zc|mt0)q5jc1H@2kWrQ;WY>dg5zX1DQ&-4c1vewT$|`}jo34U zLd8;Ao}_8zI`z{v-jT_FSyLnOvuLHVZ%XSqm7Gid+r$TfwCXUvF&p)*UX1q0HZ%ql(PWreeyd9~2MM$fzWZjyBZFD-B(s!NS7CEQg zfHzVKo#pXsYd$v%#hydVV=L`e#j-FzPRi^q>Ro_p9F1U{wOD9d!PkTdSB!P1Bb6mp zg`tdEf$rP#$^eSagtdWRVYYa0$W)Tq`WMz(j3yG<`SH-V&o(TH9w13B71F+&iij_6 z#vk1m=GoJ3wtPE1JlPKv#5DoyW&>0cehJO)z|6D>vp^{75&1*PAas#2H0Vx?F8*AcJ-f|+SK%!^}Xu*yEcvWrD<2af*L*c_xY^%Bi~;<2#wl{7Ix`# z<$5)^m;>fsmZnmB7_AIEyLEw z*6Dy2&D(Y5PW+I_R7rC|`UR1*6+WG%tK;(pkMsYC?Z13RRVl#s0R{p>0hP8WF3?ts zh6N7sU%zb}a|!JKs%)HJ|5N_>xlsSt!zC;FpVv>3_rDB%nvDOcC;F=YMT?mJeD_ zo(BQ(U)F51kXZwV`LEKNp`=U`QIH4bl*U+4B%AVt#AJ!nx$Cz;<8tL>f<+jr!^1T) zBvm`76%}POwlj`3?sV&ub?!g|Fw9bgOnz9Mun!jI@PGaNdV_F@{m16!A~)?%Q#`Fg z98+_Uq9Pvji+E<34Wmg6bK4&3{BD|g#F9sSCH1U=QwAzko;AK4Hr}T-VA~H6IKL0a z$Boe@l4s9|?COYZP~o!Dp-dES=rv=&#Vh#bBxo6$Ja55N;_NP=VLH`Fjl=Iii zBn+pEs7p2%tpaf*T=BsMc1dcD*1Y(S6@loW^p4Gt=m68v^z)hi zKqT9xxCLRs)G#+?YO3TeQ@tjM-hSIkE7xE&M*^4TILvfWe$v?y^2V=2yn8%6d7~C`+G7k;6B_E5qTPA{96g zkS*N*b3HPwX~EerX(ATLfKJ*bZV)o;C+Qc>r2K&5aXS_mo{B2OgcuqH4j7t5iY{Ji z5eg#g=X)8O+-65()?Swvwn3NEo?hP%$937IZN9zTABKG&8;*M&eZOuy+CCO!VGh-Z z6#~!3(oR0l9|~{%hvwcF7ANME^C6pwnDJ5|3m^vK9ZpzIZXb#606p=2m*MTL9_4#m z1m3)`!(y$8VtN{f9}%EEXz^@TB34@jS{%87)oa9$^jZ`6FtoMG&tA40;1z_Y8#Yav znqvDw_8O|lG_~ubR6e;5CBO z-avyC5tggvemv7ZK!KArym$n?dbC{QqXF(?H_1=c{Rw}kSX&a@%kQ)jXHM9u;Qe8k4Q2@MNBrG?w1EZhw@ zPh~_U2bcOse_FD5ib$}#zHi3vcE*CvFeMhcZC;C{SVnw9caG^8M~dI8y%wod8h6QA ze3+ezx>S)F0J(~33%1m*d3c#`W~!Dl`hw?_jfcy%MT=7^m%U5TS3FSJtSQDgMsSEc z621QOH_wT>Uxx{Wg9zamSX8Z)2D`C{lf{caXOnJRHZ&Bk(LnsQ3+o9aMuXmJ|KJS~ z>XJJ=oFO{9Oa;WN&k%Z|tpvK4j7{bt=)`$te1hZ!@b-=_E;?fI>RiO2Y)b#DFT=S% z?n%LTZKXj9$&X)LjLJ6W-*TtdS zW}E&P%Yy~yUyUciBYb`uCY{46)ZOgwlXt$IDfUWGi?v$A^&d`E{`wI;k`)%S2@?rf zR=n&pfMTBAUMz19H0}-q%BMYr2kREQdY47P>RGezjQS@T|AItUJjr5~dmbTIRoS}f zZ8N_>rs zcxq&8FC7Z9*o>$7$c^ga7LD?fc_E~2VwPg0BKe53R~jkI8JTdJS8MO!C4Jq=XZ_DhJFKt8R=Taq()zM-&(S~L zX87DP0Mz*8xf2b^X0J5W+by3Nn0aFx6e|tS5YJ81j_^a9nAr?aoZP(UXt?+EU%xns zPDlz!OM7Kh&Dn<2mlZ2I7?w)!OMUb0l*x87Hf_kLt1i2=7aFT?@#PvV7x2&?$+$IT zzMbU!nW(OtiO~jYopTBoiRoQmrLL;)qdVhlgIdJBcA**e$@{Zrv-iCMpkLiFVLS8n zRpv{jETzMw@e5)tb5Z+^QFNYLI$s6JJ1|ox>stvb;Z^c?rfXkUQYph7xFZ)pDbeurlQZd!bCu@1qc}PU7qF)a zIv=6mba7AX}m19N4m4Kfy)mE9H zNiKeW)@EI8aGLv>Y=Iis>qJ083#K28+=8x|G&W!)UC$hmE6plKtEe8)<7q+qu{MN` z{~Jw*35I1=k3HcZf-v^%OGWkXG3Gn@?PFd${Nl^x0~&n^U~y=)$(E{SfhqZ-J@N-5 zAF?Hk{56mvc-I zB;*mLxf?8y)3sh^!~+)s=Mxa;0=(f;_JM+IY#w9-*z*vc{TbK9eu%{Vr{dvdLh=nX zEm(8bKy9&6z$!M15kpk-Bw7DYQ|_0YiuA%70{`}OBAnfyR_!SM8Lih6qE~bN#Ni0( znou5OZcGZr?r1`vTrB}`WZecxU|cCPPAfBMZ$4abwDu9*3%7%^W72^aJ+h%b)-Y5& z;12)dnCZHB(fPiwTz^yD#06l{T@bNlA87hbu`e77AWyh@Ff7HJNkQ9sUT!sFyp|DJ zjNZ};(4eNo1G!*b!XY0ir~wXe2E>PdjnQ5g!Csl)?9sBOK#DS~Nyn2`&mn%Al34_c zmGL98F+=7^L;O<|*%yPOBq^eN-FVcrZthE981Qhthl$)7I{IZyK#hjea@l9vzLYjLVK4DZ{6Xhtu%F>=vw(vlSxaJy zzB>*rFR1e!sk@x(_jhHhJ`ep&jDkR%xY$e}n@L9j`{>Pp0Q>muVqr}8>UZ2?fvC9t zGR)w;kKB{wI4+9_>@nAoNAmbkfdp}Rxra2}-h65QUuHD6xFL(Fp?l&H0JLzbqC9Rv zY{T;FSIQ%rk;$SullfZ{%jxMi=>KDs|9(W_34gWCfr5aX{)ZLRK|ny-dYov$5dRyQ z;-2FAqyho?op$4*0BEeQpYL+BJ6k;jCnpa#BehaekY34$I*`h+gv)G!(IMqXv$5sC zvZG@$Iu);L*=y=S?!Y;<+(^j6sJc#6Xw~blcWxN!={LZ)x1I{04|1pFu#m)Ezi#rq z4)o=_-~3!0U>@|aI7bIz(aUjy4k00i_tx#vI&;RIm~~+I1gwq zZVIjk32IONJ3dc-_U+ zVuv%L44LS3v*&Kqp+B5g^nEVUF}F*&VfA0S|4kb0O}-4wFAw59fpgEu+O4pznS~H8 zh~Vg;-iMR*3xz0gn<9LKg1$~%Mk3-@jt)a0=C@sm0RwcUqbA|5)Lk*9CL{#+5M-wO z7Nj)fk%-oQQFh7TJuq0tCcY@7^sqhha{Q&-kn9R!0XRwl4RBDIA2w~0)H9pmf!MMn z5p?kqOB7PZEI{O9(~c>JSeD91zUg4_A}qN{J=AgbW@pSAYR*YGtV*$12^9LFLTmDB zWkmN8fb7=~W2o4e4YB-!yJ>+~Ijn)!!fc=vkb4>PyJAq!xLn5$yoHC}zXeW`+EI^H z#4mao!=43v`iQ;mSq7}oP4EQXkFpT0P^WZ+p)h;dwe<54w*qhe40j+Y7qwmwwcfdi zM>@={aO)Nay=pT`0Ch!`S|O~5Ap-89P?z!v5Ef@Yvu_5$N?p4+!Y+#aGr`DYF-ym( zGq14t6oCyT9^?$&_?Yg_$&(awt29o%z{)e}o@wVInqCv*ZYH2pDT=B5$NecCX?KNF zXMufhDi_xhyRA|RoVbn3({ofo&>{*GMycohu6Y_S)Bqk7GZb&Fg>RA1(K9otV$dZV zSZX$!^L~J$$k=DqZdWnZ5|y|_^^Sm$V2a+82;U3WkI;k>te|D#q zFooU)AJRNDLc9t4KyRz-IE*%mBME44i(jEYiGKAS3F}XZihk9Vtzy~p9_A`si%#Ab znh|kM6s{fd(o*Mt>{!EI;{9U}Y?wfM>qUcicx}llAIdZ@ASIy=JqK?hDWi;Faz3Nl z((fN!1h*$C_^5>yxTK|ZzO+LvHe2aDaSlck7Lxa*vRypA3G|ec4c(aD^a=(I<>iOo zSRW&|5eKSIn9Ng5JI5topFcuq#MEqL)o2Ztnb^GWK@GA8q`1?$? ze<8OA?f(a|1;cHLj}jsF6yTJ74a2w(6ydT9d-=AJ#Ee?6PO6#EVQtrmX9&-FqoxsM zr#1VFx)Zhz2_Z}jfR%&A)RB~8&p!4px%08vzld9ataqFeXN~VPe-Qovxjw|mfb`0WVWYP^IAHU@{S8{o360Dy zdh-x(5l(Pu`gRpOC1=??Tdj-wJ7mgO`8G^B+I?jzuw*2wHIW2`@-Tu^$O`Lv zIuFcvWRotSY^2NKdmv2(;~2U|HA5I@LwDlE{?7Rgxq?#jxda7BnPIZ-TvQgRc+8%V zLAG&8KDOXC-inSd|M!*Jo3jGtGir*M*c`A@_mh5Er-xPRtY$q%^P~|a=R%3I(B)%t zMowjUX_Q`_Y-HuYPH_Ag*%8taua+TA0k(w;XPF-&%FiQtYiXu(N7O+zgjaP;iOy@I z8NTdyrUROo^(YIF7SQlh)QG6hE<5s%Mr^Yg`uR?QTQ;Z6Xid`F=X;x=X9R6_NDiIX zW;1lJO&n}lIZK^S-60R#sgCN>Ew>0-u+f(Ogb?1#M35>Qzrs1O2f_5H9KRo2gcO=c&LGvOJG4Cy1g(D;M0FWpuEXi>ju}NZFO&en-P}(O zUyz;9gLihw5=&QDOLz1>d^kq?*u?h}@75oMlA9DBY10Kl&CrDX;s(i5vzE1OzMH548?Wbf-}?x+`xq+9{r=o>^2 zDd1fg`REGj$UrdEVm|E+dU;3&=dLq@#Yt~#nIKQ2falLI#}sXR@hA-F+oQcsl33pt&0vl9W$qLj=1P~1bIiYYFt*5#JPn< zhTR9qc^|<&)#=okg46^N``e{vMMO>E2ljLd+Fmrbp)>u$5sguG#W|uCq8uT8RrEKZXUt&~j|&mJeH7=D$}Ln1bgWNMc~DE&UAZ zxfT(cVxqZ3ELe4TGGDMRM6_9OJ>KDy5{nJkzmXeA`|PY&Q=lxL>Za3${m4J9U#7f| zwOT0tXY4ooQN&utg8>&A8)~$dn5C{IR3&uu%#slq`08!lfOm-WhdyRS-bK)U8%kDY z#VuIlnhp_&*H*tWCM-R`TF?56js#8^;eT<_Zh`laRMgy5;;@t3VS$JL?U{}?`CLNF8-ksM&7wkL-vs=kA+)E)kk0xl`hL>jWiXB*#8GM#V{<&}M zwXobY+~5Y_lb zyhI73cr%Y8=68xwU3J1F!t=(j&dCLKIQzqDWLbN4e%Txv!i1H7VRlpc??PnMYLTZk zC3T0*(SoeZe-TXMar8?QeTfd2C)+%x~z+&FKI&L;h=wy^rYBQZsXQ4T!ZPB1B`!T7Z*xhkyjg6o~OY zntS7O|3-9+*PS_U-rPxaZpkXy?z&6=M=%#ccPu-VF%}JW0qe8ZPP^KUdfdN4!hgk;Bo(~be%58!6-H{!~+A#m*=LK0vdu~LQ4EZ|dJx1oj zot6>3Da`w9|Nw^52vFNv(Fvs|gV(Ddd^B z(2fo?N4!u$xHZ|lTd4;u+yLq<3PSmd3rX*Ahcveb)0p(MzmdD5e#kkbMX;{6rBwpH z(M0H)YY^I5P(WSvw3g&8IIW zupZXpeD)rm44Yd%AIrA>3nD#)eLQ_QVk0I&BF5_0K9i{+yqIBTebZ9e&JPPb znbFXPlu0NgNpqBpzUoN1H+((Gm{aGJpno%)61+Q{j)2Y)pH|G2vKWID>B9Bqj8!&a>khdUjO?Fox;R_XOC z&hZ~2YXF_1^5M(0I9MuSo8XEurg~YA)Keivckc5RQ!Gj(4vV!1*@i4mH zr4dnS0uBTQIYJ^^y3JEJ`QO}V))Mo6v;gYt;Q(Kj%O8%)`7#HTx!DspGisFV3t+0V zo*y!DA$Oi%e|`wn8=#*@_mpE!o=tle6yA2m`2wt&%1PAQ7Nx4SfBPYwCI>~(;U~x@ zoeEiA1%nI@Ipa86!n-H~jQV(*23S~5@GZlY_jQ{0nb*f53CP(H7w{jqW!vH`XO!$? zDG2)RCR+=RI5qtWOy?O6gGo8*avd=z+_5nhJ!A3S(&z$UXHoPeoEXg%jm8 zumPdO((!igIHu|tz81CpO;&B|zx@{bFx@(s7EqSL!O{dSEF~l*R8j|k`D;;b#{(`4=UM5#POQcMgSv5y)iUy<`MNhWc zYS|WymhQ9D7;yj#T+`aPrb1yyyM@<`006y!rfq+OCq#a|acJV6ThyMP^{Iir`H5UU95jmA+NtB)>M`?Ih&WCDR&(gAB|W8C@8C7ZC{RW|IW84yR+ z8N0KSbSZu3`fr!`vpXmg^W^(Zzw*RMk%NVjt27+$0^^D~NZtwA$!ycLi0TF#*=2!X z<=w{$X-C83U$REumXzgIzljSZ??th~x}}m8$>k#HDXOBt?78}aSJXV;ukskHLE*Ob z&HJ7t!*&vjX>yQQPN%Z81IWv_d_c6_&L`xgF~~QK+q<=mTeWi zk<`;Q_SXo}sDY^EAhjBCDaJ|axPD8_cSh}zPA+>5%E)R;aM|9jZ3b$58SnzM%}< z6yA3j=f?km7a%1b$}32J2$?{yJ+mfHC~51J}w+b7b|O0*?+w25RlB@Do{8& z=i-3o6>KUV_km=UE7h7X24H*`KugVT+H61$7cI}mr8MrjQgf`Du|%thvv6QSt+ zW0zA6;iaTF#aMzB#AtKcn9@!yr*Nl>L?~*~kW7$yapTJy*~8d5z$@HbcLF{Su~+K0 zvBoSoGpW3eka%7*2iSm9??ZyO$r=l+wk)t;o;<`rQr=6*+#K;&iiYrAm%yxEPaCZBYmOeqbD zRKe3JqUZCC_ZK)-fsFfa{8%xW~&<7jQ+swIz-BgC_ia=IjeZ zPw*C+W16RVoHl2vu)2mKb13yEuB^01g>uxAMbNL|BIj_e6k~m_T04(W$mZQ&wdg#M zpG_oE4|ui0e_eYce#(}t-PRcXr`hO4!{or_>nRPBhMbj{6}V^;dxXc;bzR7+kWy_H zA}Mi{={x|6ES;5VQ@@dA%#W_nXF}hTxTiDeL!V3N3ciO!)k?xo$FgZ+PgX-mWO&dX z)_!b|bBa25$0^Qu(~V`I*0QOoOVO60F4%068=Gh*A9>ecP&M2!ylO1(Z<3X-O%4qZ zGzFZIfsZKo0yYzJ=mx6B-k)_T;SmI-%8pASzMmaGrIWCHKfmDAjz%@QW4hTEU~^`D z6mh3LTeQR!kZ05lzN(k)z9@A!%Php$Y`BqQmt3LQwQ5Lf*&t1qU|HogD=AMhW-8UF zEEOWZl3{OEc^gB*gg2_FvA=Cm@2bY(O-dXBTRrcIfl$?*G~rhWjHabF6#w7J%FQHSPEu=*DHTjhrJ6K}={S?a)UzP;97xZLFw- z4cdppr}rLZ23_Ie9&3_ww>jy|r|KTSydjbC22jf*t$d1ci3$sLAd)mPuOk&9+G`k? z8zOMpaohXbwPtFF6vmDv!ovIHe}XD=whyFcz0?yB&X@I_{_fv9DE>v|Q-WIS-L)q@ z^t8L=#jor;V`5)8vL3JH)6`)0h~Wl+pVF8h);43QADCT%U%Idugz~!37Q$wkvKk~> zk74p)Zycj-1#7xcLLJieLo`knjc~r<00z|ir@|_b^e{LSU*XTe^-?m*IbXl>xqQNQ?J8O2KMnmrgZ>(PhOv~sQSVxe_7<_A;G3|`eFutviRT@R zrD=qCy?aAN1Of7`Ls>8b%4nsyGzel8%u~TDP-DU6Ik=1EV0O=qHjW$N9 z0r?0ciTIr2M>(Vr`Vz$VF2X`Sfc1tw+DX{#oG+<&=$&Vx(ip(E2IdIHC2Dn*p`hYS!R5)a6akSqXKA$ktyVy~8Y@$u`Wfow1*cfUGs> zn8XdX3l8~ba6Ev`#{nM_De=bIQ-X`s1GD#Gjzcn9dGa^E8_n6;2ll0LVCU<&?WS(%O}{w8I}O!o3zT5y#9E?`v|1^sMyvLDpH&kA!>waJ%HBZ z!Zo|JsRFV0u4u%%_AUd?Up9mGh%khx{1>>!6#xQ-QD+7xDgY6-wl!DHl@0e2u32ry zrARWC%s!2g7|k^Xknr77rg(y@*z4Vg&T1KGWJue!f-^HT_cHV~-1gKfo95ltkYa>2+M>RDbEM`d8~nnE|$ zRJZGOlR~m@>>>ra>D{Nw$@3X)#B0k?Xm=iPg5ecgdz@?o@wvo_WyhIQamG5O`hPaJ=AAxC$mcn1=Wx{i&?hw>eSdz%$J9OUMB13Acb0E$ zMeSj+caNR=5czc--OO4AlnkR1dh;rfAVIyBMu%LEAMjnf)ik`h zS&|Q~#5Zvs=B2K6rQP+2wx?*#^UKliD^_BvrPS*KcZ;c-mExc7Xi(Lupmykk)VNi)Op0+wxqT`GTAv#w|h}h9%v|plPJY%A4un36$IBHPSqH zWOWHsDGO>mJ@-#rg^~YJs`>MM(brUP9BpPm(w2K}BkfMjf91Y2bez;_?JDbuu_$U0 znlP3Et{dd)k_6H*;36s%Sn#Ol&} zf`8{T^>W2Mm7RjW%JN)bDZRidS+Rjz!w7N#Be)RF+NUaEHKodJzl#pGd*@6Qt`bXg zm`acpN`vF~J&M$hIz3or6txFaNNt7zh-vMS?(a7C!6Wy zjW7MUOOW7XfbHQB>X(gAH0`L2gOzO=6<71UQu9@)|A5z6eOdkavO4pETQ{o$&ppNm z#CRUrnii0lD)4corTXteO*1vmR;;F$WD)JK2*`Q#iesIq6fc&5k&>vUcM4E(l3Cce8599^BDoy(oBYl&@&>DN>{1D(*- zfx{cqjO#XwwdxZXa(!QnJKqPqyJ-LXEk0^jV)QH89wHouG^l5M+1An94x~cwiONSm z#$%98P$=!n4$N!sgi7X5)oDT&t2cJwGw!(MX1?SE|g88bRiU5g|07irDSd?@sbs? zNgNS~DYzrO`p>KbrtxIs8=cx`@%TUV`Qfl^+N&)?j}f9$k`7A1po&olPk;>2S}8q{(NRxPtqbe#4{i zC+>Y#f}nAJ6m_khznd)hP%#TsL zwiDtkjtRiSC<(x@V_>+`!Wtv%x)qA24>L*?JwR-oq#3>=&7J^yio9U%Z(;l{I)B9m z$*O}r^cuN0?I_Z|CgJ7+x+n6bl_v#K?}%cwBit?*G2_f2^Blut#;oj%sSB&NJI6TB z(Err2!l7%HY*j~h)Jn3bw9q5bEz!y+WfDJG{AaZz&sFEkXkybUQAW%rsb1iO;kT~2 zgqgWWE>{mHe*l%#Q9W^E#jeYw`_Oa*Zo^hsNERbLpb~MBTq@=f(F7%-UCn>X^lWzxr`j(vRoU zhdvOw2$4%!Z*@NTYBC&IAl6RUAXmEEki=wr|A8o=9`6)evn^9OFws(&4U1;a&84vg ze7w>xdd*;hJrLutCr}|B)oTASBQjy6hCfE9?n3yvnkMPbt|y%|a{`O$1d8nx5#-Y+ zz~X|>Vg^WC-c&2DtO~XIgI1T*86xIuwFZQOl_t$sI#_XOI$Ee}WhtI<(seL-X3h2D z_sMTtQOHvhVX~WNlqqI{?NWv?a)AECP2Q{SaA@6Vo!r!;vsMb@akoRYex%df=*cUw z|5)R(L5e(MS@C_gRhs*wTIj?X_Y;zEq1d34N)?#InFnubdzU5hxjwJ`tI9fMIe;%U zd##DHbG-k4uV4NuSJr+4nq%7GXdj%U02iO%ygdzD_FEk%Fm_(T*;$ys41%|@FC+2Hl{N1{^3ht`i+%?wQXG(V@6lN}OuE%o>t`=1#gW$0tYZ0nQw)EoJ~Kn5s9 zlv{z(Gz|$#^&3gKwK$CU9k;vSEa41@B8Ra%6wDKmZ?3r)S|4>gAH@*2QEmYs z3scY|Nywr&#F6x__@5B?rsP6kLnG3MK@LD2RMFw_9j1_I%odYe zcj34}0Nm6OI}d0PW#TOrT~Ss0E2Kdzb1Akl866OHNdwvk1|)4B(Whr#kMQ4fI*f1r zDdLX4;C5vmjQF@u5*zWBaQb-^jkX?Mf@)^wiQL^&_uP;jywRFr5GHswCKXqPdXhyL(<#S?j!PHEL=v2j)_#}U_!yWI{lY1~n_V=A8@ zQU_5iNW!u1=f~zZ0Ri&`N!TChM(vJ51qBH0{=P#bVTsj;^E4S@s zxafZIf$%t6BkPPnLqI)(b{;ih+fU=HmOdxp==N@gzC(ko2@j2$NfQ2SD4I$q)i{y+ zF+0DVluwF*YcF3Ida%3_ZKpaI%?J5#z=|twee#d2_>R2qNqIh`9Z^)lZj@{d|5(z2 zTInA(9cKM8!T9t|s-jfa04SiqmHBCMNEG2Zb z+skJx_jxOsxAPx+mosK#g}>#U{9Sk2!iz@Dlm2l#@7tqy9HX>^F2LIZI(G zHhBcEL~r=NsbnjqtZj34rvywh_U|bO1Vk~4;Lo4$srh@&G}KM92ID}#BSzLPqSoBM z&-O#7-xg-+%g$dF)eWssaP@-P$-El7q+~e@1bN} zU{qZoxhW066Pcwu`F#$w>`X0~P`1~0w@W86L4&9le2RvSAgMC;z`01!?t*?)-uVJK z{q1Pnr0vmpvULpgo@#Ye_vrQ+TLvcAQ@UeK@%Rj`dHagHE%)39M+<#h5JPMW#j@Cg6OqI#C??OF<&YTkQt3o}NcerwSUOd=gi2v*5nT~QJ3kQUn5l#NDm_~ZT_ zhb;hO=pyxj$gOq^EojC3&wvJj;81W}G4sDd@qtH~vUBk7EH3{P45$$@9MB9GEQZQL zN*AJk?*CsGR{{>z_lC{Awy_Sf6S9w83E3q|5k*PaDal$<{Af}lOUTkeXd{J+qGZXw zSN7~>3t3Z8v=s`gU66VZ^a`P`ulxtt@XQ#6G zK*xr^UHu|Td+TT1_wi2?=jZyE=9Yz{Tkw|*c9#+;4?7&RF}Oon^ZR8@YHEbWjWCV= zx2s#z%YtvtQ7}-6JE^1yMJ*FF-G1z3?c(t3p<}zAxvc;_S!tajQd6XDdN%E6o%y$j zGtN$2^EXUuT1(l|r1Ds@&C+ed!W#w-q~jK&s{JI{%7tXFoo+}xe8PVFNr_ljCa33$ z=8{O~|Nr)GNh^$Efs2A7R2i-hl8GH~-}2%{0s}W`1x`wCD&5*rkqWBrbQ^jK3T?Q{ z16;{NS}Fnr@=yjsHQeZdx0-#`Ag1JbvCzw55fKrcKFw_-$&^w`b3)>DFZrZvYZS_} z)ALJ0x2f)$3c?u{GBp2v)038EH`BSJQJox>F$sSvIjK5FW2eX(c0mh#)t zGeR;)gl%P|JmfC3Q?a@#(h1RLGd))5DRI~*xYZ;jvz60Kc=dWK?>Q#fFV>$Um{f#a zOuD~BWZu+K8ahA8>(A@|JI=zOa`g$m-lBa=>M9J18O@onun7EjbwzCS+Ka8H}_r$$XHLFLKSqf4*%oAgO3v zeHwXgx4KIPXR;fyXZxXm|>)Ch|bk4zO^cARHqgt^L5+w$If2k|Z~ zw=f@)%|t3sSjfQT*e;%_m!*`Mot?Jv3d~G89Q0J;=f6XpFaEJJO~9wyBzzZkUXf>j z!$Q@_7(MP_Y;}V%j9_VSc|mheKl6B!Ib~y<%+E)_F)PL zoOJD@!RH+wxcg{`QcCSK74g$mP+~oF#YecjYu<@>mnTcct9O2UPS_7V`X$F}M3XV! zm&-ll7UyZ(&$qwy)A*R*vGDTxLuxKleHBJ)wJ&?m+OK5x3ou=)b1!5mdN1VplCrQQ zxbHxg<>=!Jol@shL?Q@Cca$}E0AJlNG?QnJlJ1^ec+eBYD_#17DL3mR4lQ+sG)Xs} zl{>tTwL&%Ho1X^YuvOc}dSB80I(_!8UDhLZmUW!MyCt73^?iKluK1?t&4=EB(~sO9 zL_gJRn36A#j;ZuvsPDow?0n9e&ZzKnp@21Qs`N|`OKQjH1EXW74GCTx{gGCRvJQDC zUlmSj%=lc`-RjyufdqNJj`;a4vRFdk1&dQugp?P1^iy=F>aWF~9=P)$ zCufMqFvF_I$79BjGVVdmQ-OiNz>1Sg!QXqQ%+)e)nfGqD+8KmIW=%R3Gb=}j#29?2 zu@5UH@ba@s$TUubDr4UgQuyw9d&zK_NJe`Eb%!07WOiq8W4soki{+n64R%p`HWTl~ z>z=`7N=^Nv?@Qg0+ZoZU%T{lPt}4!yrI-yk3_3n(YTwb}I>q^@iDmpVqf5I$%a3KN z%K_s~7Z!6OqP{wDeqm`ISm=1=2fv24EG}MD;1(FGZjF1E=4M-4aGX#hJ|~ID^((Yi z(PlSx%e8iN^bc(fWN$kk{<&izuZ?v^bkEth3p3O*Np;Wbv$sby)h$YA?8$0r_eB_L z#vJ{(+T493hDPkmph`No$1xMXOPWR^+?e^6zH)hty{S=r(4X#9xwE(bi%!y;pfXSp z8;p+dQjc?W_2wK=%m9vr(pE)DjXEIo{HJm zHdz;|m|6iIIWtsY zv)|Dx(`enAV_S}U!@bPrUDj@X>OneZ;-@A_1;;bJ6N`(Q%ZF;7Enc*<-Dc*dM=-7M zpzKq%{z5mb8Q@iVM^n|6a1q;NxM(%Ae1vD2hh2s%%0$VZyD6qx^NCzq)pfzUj+fp) zNp<;}%f8G5v|&g>=E<9?jE1WDb+`OhDt%7IavUm|bJK81yYZjnYCGdnyloL{%f(bd zOZyd`d3hyOOUHuO;aZA&J-+RBIk0>jn@9OyY~j`Amy(S?gTs$ER}qw3Gfy}~UF3TF zD*;KcT&)>yn~W}BwViPmTfTZ?sUXfGaK84LylMQn@kb!z9lksq;)Omg-v4@ui`RZ( z$X|H7;WjP!=<=)HAiW{_Omd=$az`5veWJ#+_n(X-D=E8%%n0$#nkA)$3s$XOhc4*n zWMn1Oy+Jxl_fI$-!B`Q>^J_ypMGmuF8|>e%^g^5e_T$)#rc=Kw=C0egwW|c5bQ+y| zq1x<8m%m4h;+Mpz&8gF7Z?zI9W>pjD1GSpFg0xzT@j5oQF5U@i8@JN_iQfXD^Q=%yIf18K(40)qj3aJmCG^?!<%;#nv3YQ}+-l z)6nlZT#TM&G~%*Vhg{(=P%R=$zj^cozhC5CWg34#z;WmbDDa2{R4v?|XA!n7*E+2( zFe+T7dGLyP1sztLn@~nT=uw+A+=>vribh2WWVd1}uFu5?umH_(^{(4MJjalWtb zet5gl{v_$Bvi8#tKa0LGy%?(ZC~t12a(sLTz{OZ`*GgMoovywjb}r#sO#Ki=qM!rD zxW*4@4Ds>fZGKY4;Fr2PYpm5zWBO4rzpSE{(hV1951DD}t4!^K1XjzRl{a*F5ERO81dA$?b*%) z7x=33hYO6GLu0wF*h%jrY_rg7;>A|o-tW#`y_Bd_qCXdSz(VF{Eb9`3=z?f`!I|f* z0)~=vEkUezY(+H#ei-)6-!f$2HDnNvFOWNojq%lL^cN&#zBQ(wCVa)|`=|Ks*tKkI z*axhz-&Y=66eXXaJb!`py?Dmy3f&!tIpz)p<(rtf2_7w^;B5)csv|f(y|=dro6;3- zRKROhK*KqR2`g4O5fRdIgR@yU+eGrrk1+cmp{nDYr*zojyS8QKm|tYslJa9le{WyJ z^w1GK@7goz*`f~Os@;ToFOK^He<~-_K3S(MP`At&w_X=-i!9Sij$NuNk9mq;IFul6 zmCr}@%;5oLX;AdA`Ss2gf|#AnZ$}jcmSjGas`}V#`x0)*i`U(dw`o%D=w22n#WN4J zGC>c_XQ=sV2FpbaslLg3HfBWWl5wqbF^ofN&#%bT$Xb=Nl8zGIfvcSp9>d#4 zW2J3rp3J0~1xTisSjCOVUZpAWjvgIXc&*7EJ9+I|gffE$%R}L+hU&8RCC?v)6ana8)+#B~+q*0S->Cg?D-7>6IV0@}}&=${Nw0Od9mn?b5U3;9iPR zyrd9pbLyrSeSLv9kK)H>r#gFmU41DlnpwGR+;XCPUtS$s{G@L_xv*n(kL23l#XZS) zzu%Dzd;XQ6TK?xJRO>9yCR4-hGYHr_94|gn{#`$__Mm>1rY?l04)cnp4x#N^Lte3^ zq1*^iPe*Y;{UMsi^zUA6VD%w-Vr{)Wu+Bhv5LFi7^$1ms&0@uY=r)u=kVq$V9vroY zTL+j^QBat{WjPz4w7|qIM7m)t9|r@Ff-eDUbQO2MUFRVEC8QtP;KE~Cpc^NVZo9^s z5Nf@y0`~)0fP2R6{fA}31Lhu~M@U)ie+;vl5nRg(+D~Sd{dYNvuC0LYd*6s z`jsidwL@EIC@A**<5OOoM7@!TZY6nmmI*!7EO40C^~mPg62$x(vGbgZ=+xFp6aUdNN7b z(2az0teuJ;_zk^~oYOslXw)uGj;aBqOTsrm8c_BW#UmkP zIri&bUNGIW;exmwgC1P2wG96?$S#Nj&9Z;PMXcWe=C!U}iyGT&gk#uXrUm94Aku(I zF3Jk9IjADSevk~rhMF*dpd1)~;?Q5v+6?zM0YIM%TUT*pLoGsT*+1JEYy^YHw7@2N zA{Dlb8SZYt0NhG9TJrx3&o->m0ts&GCeq+{)dros8qJb|LT7`!7NN*voxUYj-isR4 zJ>M|-`+7}5VepR$2Oyik7jB^OV%-E7y@0Lr${}mVbJ;=BhL-Q2H}QWQvK0|c04@&| zU+WN{mIocR)~unI^H3c`?(Mo$8sL(TvIE+DR31@k+6)>ZfvuZm`q)2h)BryQlS5yk zTaoOp4Q;GI4;`?22?y$UF9>~!?nL(Yf%2EA8sgU%Yw}S9YTi2s#EX7r;!!$AE%7h8@%vK!PPnh%K370o9q( z2Fg%M5c(Rn@z=tJ3L9&=$O%$QVAY!-YKnf7T=Ev8y2!T`vVa5d_YWK(sSt9`Faefg z*c*+7u#3EfNy0l33@^|uf{8qlAR=1<6COiN42(zorASD>G=>qpAAzaN6~V5VktM?B z7zE&oQ2`KKjP5|>ElJd#VpIi5IzbYatT1eV@NuIF<|Qx*yfyGDL60KdHbf3P@N~q` zfYA~d?b&8T_6@3r$ptKLP=0{3$H1n(ffOzWvXKJ7l|n@1G#TLlr%GYxW`vRv8bBS6 zVFk?%C?6;+L75QyFp|#p4h+g%2JMsA5tA}h9idGns}(?PDeT*q_b{8U=fJyU0t*l; zhtYaIkP#Z7+O-j_t`A0w?s_f*6D$EL|TF%oPx_fMh% zU&#bk5ITq9BC)b-pt0>YvW^~%*P!~y*pGE&0V7Hx`qe^W>@^lr2Fp|?494W zC>^4|xQX!i*G3fMI%v%Oo1`Pup$16by5QM}!jN^aPk5F{>NO-_8N&l|>S61w>!B&b z>L#7X9}EXkher+~prwU4rHM|K>rp)%kd2m1U;w2Ju%>+Y ziwFSuMpP0J$C5eD$X+gzfNMgrV3DZ4x{loCMreWdTj*kto5Wc|lHQ`b5PH!~$QdyN z)>-0I<9Y`hb5?AVu2mdiCF#x)byE_XblLAvRpbJG6LR7`OkzL^p(b4{zoe1P7fY4Y zzf^5RSN30o3FOE@WBE3i%cu7+UYH7r09&Vn46Bj_EbwZAbtO-Ygp?80e43k_2{yxt z-MNMcfPiK=7+bW6Y5`E!jA|h`ZIU3-0wi?QjGi9o%5>ld6|-Gpr|POi1V_r2`cN{D%=Ha0~*-i6eh4-W-KP`?nPG9|eP5ur96=c}Ld;{Z8~CVtAaS z>9|+{X=|cE4s7R6mYp0r2>&XFzN4q5o*xU1Mhny z>0}Ny*wKqBA*F?6L=W*PAq!MspcmCf=4v(}#&rl6P%nma(XkJvEYq+_m(+)Yp*Bq* zi+D6^20uT-e7Al8YM;=3h~_uqksI9k1j%FHLFXq_2YvDb0dw<+5Kte0{u38~^8lR5 z)GOfe0IG}5t|DM&0Nsm}VSvgYoK#;iz-JIOM+9hrz!1s_e6i^IbLrP1`1n9ek8Zv; z+pt8|5tNY`1*SMu7~CF$L6})U?GUVnzU%-uj2a_Ou%r*87Kkq&V3|O-fcL|Yl(jA} zji8!HrWi?M^BLaaN=INhz)7IAAbbk;V(19$MLEfT395*I92ubp+@Iml>+U2Yy2vM0 zlJM#?93Q+INnjj>O^?tZ3B#Hw5AYv_sRV10kbZ5H3v`Xcm?NVwrtBUPd`%xd`M@VS zJYsf;gk&9todQi^a$}IFev}MjL9zwP2%3oOCJPeGJPz-2XOEMF`V*)Sv0C6j>^L+% zU`>K6$6;otY)Qf!JD3^qH4Ciux$YN8GkBLq?|g`e z6%ye~auzfJYt>=^Nf?-bGo$$uS)c;amtj7>V=$l2z<-AJ{$(L$@$ z=#dZx1Xkt7H`fouS^=a5M z^S1zQ22KS3Y1rynKot0ZaU#6kt@ZwoY1p#D1R{JGtx7@xZ8EHj@WBxW;%A`BC>i7u vRR$?22v3Dq{#qQ}S*Y4|4_MElW{A&ykT(k_)}#C2$1EyF-FF|p?o#{@LlAzY diff --git a/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/Constants.java b/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/Constants.java index ec52aab..d443fcb 100644 --- a/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/Constants.java +++ b/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/Constants.java @@ -17,7 +17,7 @@ package net.lax1dude.eaglercraft.v1_8.sp.relay.server; */ public class Constants { - public static final String versionName = "1.0"; + public static final String versionName = "1.1"; public static final String versionBrand = "lax1dude"; public static final int protocolVersion = 1; diff --git a/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPClient.java b/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPClient.java index 51aa590..bc758d6 100644 --- a/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPClient.java +++ b/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPClient.java @@ -41,17 +41,17 @@ public class EaglerSPClient { } public void send(RelayPacket packet) { - if(this.socket.isOpen()) { + if(socket.isOpen()) { try { - this.socket.send(RelayPacket.writePacket(packet, EaglerSPRelay.logger)); + socket.send(RelayPacket.writePacket(packet, EaglerSPRelay.logger)); }catch(IOException ex) { - EaglerSPRelay.logger.debug("Error sending data to {}", (String) this.socket.getAttachment()); + EaglerSPRelay.logger.debug("Error sending data to {}", socket.getAttachment()); EaglerSPRelay.logger.debug(ex); disconnect(RelayPacketFEDisconnectClient.TYPE_INTERNAL_ERROR, "Internal Server Error"); - this.socket.close(); + socket.close(); } }else { - EaglerSPRelay.logger.debug("WARNING: Tried to send data to {} after the connection closed.", (String) this.socket.getAttachment()); + EaglerSPRelay.logger.debug("WARNING: Tried to send data to {} after the connection closed.", socket.getAttachment()); } } @@ -60,21 +60,21 @@ public class EaglerSPClient { if(LoginState.assertEquals(this, LoginState.RECIEVED_DESCRIPTION)) { state = LoginState.SENT_ICE_CANDIDATE; server.handleClientICECandidate(this, (RelayPacket03ICECandidate)packet); - EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x03: ICECandidate", (String) socket.getAttachment()); + EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x03: ICECandidate", socket.getAttachment()); } return true; }else if(packet instanceof RelayPacket04Description) { if(LoginState.assertEquals(this, LoginState.INIT)) { state = LoginState.SENT_DESCRIPTION; server.handleClientDescription(this, (RelayPacket04Description)packet); - EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x04: Description", (String) socket.getAttachment()); + EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x04: Description", socket.getAttachment()); } return true; }else if(packet instanceof RelayPacket05ClientSuccess) { if(LoginState.assertEquals(this, LoginState.RECIEVED_ICE_CANIDATE)) { state = LoginState.FINISHED; server.handleClientSuccess(this, (RelayPacket05ClientSuccess)packet); - EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x05: ClientSuccess", (String) socket.getAttachment()); + EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x05: ClientSuccess", socket.getAttachment()); disconnect(RelayPacketFEDisconnectClient.TYPE_FINISHED_SUCCESS, "Successful connection"); } return true; @@ -82,7 +82,7 @@ public class EaglerSPClient { if(LoginState.assertEquals(this, LoginState.RECIEVED_ICE_CANIDATE)) { state = LoginState.FINISHED; server.handleClientFailure(this, (RelayPacket06ClientFailure)packet); - EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x05: ClientFailure", (String) socket.getAttachment()); + EaglerSPRelay.logger.debug("[{}][Client -> Relay -> Server] PKT 0x05: ClientFailure", socket.getAttachment()); disconnect(RelayPacketFEDisconnectClient.TYPE_FINISHED_FAILED, "Failed connection"); } return true; @@ -109,11 +109,11 @@ public class EaglerSPClient { if (code != RelayPacketFEDisconnectClient.TYPE_FINISHED_SUCCESS) server.send(pkt); serverNotifiedOfClose = true; } - if(this.socket.isOpen()) { + if(socket.isOpen()) { send(pkt); socket.close(); } - EaglerSPRelay.logger.debug("[{}][Relay -> Client] PKT 0xFE: #{} {}", (String) socket.getAttachment(), code, reason); + EaglerSPRelay.logger.debug("[{}][Relay -> Client] PKT 0xFE: #{} {}", socket.getAttachment(), code, reason); } public static final int clientCodeLength = 16; diff --git a/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPRelay.java b/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPRelay.java index 42fdc5b..fc4a7b7 100644 --- a/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPRelay.java +++ b/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPRelay.java @@ -202,7 +202,7 @@ public class EaglerSPRelay extends WebSocketServer { } if(totalCons >= config.getConnectionsPerIP()) { - logger.debug("[{}]: Too many connections are open on this address", (String) arg0.getAttachment()); + logger.debug("[{}]: Too many connections are open on this address", arg0.getAttachment()); arg0.send(RelayPacketFEDisconnectClient.ratelimitPacketTooMany); arg0.close(); return; @@ -231,7 +231,7 @@ public class EaglerSPRelay extends WebSocketServer { RelayPacket00Handshake ipkt = (RelayPacket00Handshake)pkt; if(ipkt.connectionVersion != Constants.protocolVersion) { logger.debug("[{}]: Connected with unsupported protocol version: {} (supported " - + "version: {})", (String) arg0.getAttachment(), ipkt.connectionVersion, Constants.protocolVersion); + + "version: {})", arg0.getAttachment(), ipkt.connectionVersion, Constants.protocolVersion); if(ipkt.connectionVersion < Constants.protocolVersion) { arg0.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_PROTOCOL_VERSION, "Outdated Client! (v" + Constants.protocolVersion + " req)"), EaglerSPRelay.logger)); @@ -244,21 +244,21 @@ public class EaglerSPRelay extends WebSocketServer { } if(ipkt.connectionType == 0x01) { if(!rateLimit(worldRateLimiter, arg0, waiting.address)) { - logger.debug("[{}]: Got world ratelimited", (String) arg0.getAttachment()); + logger.debug("[{}]: Got world ratelimited", arg0.getAttachment()); return; } synchronized(serverAddressSets) { List lst = serverAddressSets.get(waiting.address); if(lst != null) { if(lst.size() >= config.getWorldsPerIP()) { - logger.debug("[{}]: Too many worlds are open on this address", (String) arg0.getAttachment()); + logger.debug("[{}]: Too many worlds are open on this address", arg0.getAttachment()); arg0.send(RelayPacketFEDisconnectClient.ratelimitPacketTooMany); arg0.close(); return; } } } - logger.debug("[{}]: Connected as a server", (String) arg0.getAttachment()); + logger.debug("[{}]: Connected as a server", arg0.getAttachment()); EaglerSPServer srv; synchronized(serverCodes) { int j = 0; @@ -266,7 +266,7 @@ public class EaglerSPRelay extends WebSocketServer { do { if(++j > 100) { logger.error("Error: relay is running out of codes!"); - logger.error("Closing connection to {}", (String) arg0.getAttachment()); + logger.error("Closing connection to {}", arg0.getAttachment()); arg0.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_INTERNAL_ERROR, "Internal Server Error"), EaglerSPRelay.logger)); arg0.close(); @@ -278,7 +278,7 @@ public class EaglerSPRelay extends WebSocketServer { serverCodes.put(code, srv); ipkt.connectionCode = code; arg0.send(RelayPacket.writePacket(ipkt, EaglerSPRelay.logger)); - logger.debug("[{}][Relay -> Server] PKT 0x00: Assign join code: {}", (String) arg0.getAttachment(), code); + logger.debug("[{}][Relay -> Server] PKT 0x00: Assign join code: {}", arg0.getAttachment(), code); } synchronized(serverConnections) { serverConnections.put(arg0, srv); @@ -292,15 +292,15 @@ public class EaglerSPRelay extends WebSocketServer { lst.add(srv); } srv.send(new RelayPacket01ICEServers(EaglerSPRelayConfigRelayList.relayServers)); - logger.debug("[{}][Relay -> Server] PKT 0x01: Send ICE server list to server", (String) arg0.getAttachment()); + logger.debug("[{}][Relay -> Server] PKT 0x01: Send ICE server list to server", arg0.getAttachment()); }else { if(!rateLimit(pingRateLimiter, arg0, waiting.address)) { - logger.debug("[{}]: Got ping ratelimited", (String) arg0.getAttachment()); + logger.debug("[{}]: Got ping ratelimited", arg0.getAttachment()); return; } if(ipkt.connectionType == 0x02) { String code = ipkt.connectionCode; - logger.debug("[{}]: Connected as a client, requested server code: {}", (String) arg0.getAttachment(), code); + logger.debug("[{}]: Connected as a client, requested server code: {}", arg0.getAttachment(), code); if(code.length() != config.getCodeLength()) { logger.debug("The code '{}' is invalid because it's the wrong length, disconnecting", code); arg0.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_CODE_LENGTH, @@ -345,14 +345,14 @@ public class EaglerSPRelay extends WebSocketServer { lst.add(cl); } cl.send(new RelayPacket01ICEServers(EaglerSPRelayConfigRelayList.relayServers)); - logger.debug("[{}][Relay -> Client] PKT 0x01: Send ICE server list to client", (String) arg0.getAttachment()); + logger.debug("[{}][Relay -> Client] PKT 0x01: Send ICE server list to client", arg0.getAttachment()); } }else if(ipkt.connectionType == 0x03) { - logger.debug("[{}]: Pinging the server", (String) arg0.getAttachment()); + logger.debug("[{}]: Pinging the server", arg0.getAttachment()); arg0.send(RelayPacket.writePacket(new RelayPacket69Pong(Constants.protocolVersion, config.getComment(), Constants.versionBrand), EaglerSPRelay.logger)); arg0.close(); }else if(ipkt.connectionType == 0x04) { - logger.debug("[{}]: Polling the server for other worlds", (String) arg0.getAttachment()); + logger.debug("[{}]: Polling the server for other worlds", arg0.getAttachment()); if(config.isEnableShowLocals()) { arg0.send(RelayPacket.writePacket(new RelayPacket07LocalWorlds(getLocalWorlds(waiting.address)), EaglerSPRelay.logger)); }else { @@ -360,7 +360,7 @@ public class EaglerSPRelay extends WebSocketServer { } arg0.close(); }else { - logger.debug("[{}]: Unknown connection type: {}", (String) arg0.getAttachment(), ipkt.connectionType); + logger.debug("[{}]: Unknown connection type: {}", arg0.getAttachment(), ipkt.connectionType); arg0.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_ILLEGAL_OPERATION, "Unexpected Init Packet"), EaglerSPRelay.logger)); arg0.close(); @@ -368,7 +368,7 @@ public class EaglerSPRelay extends WebSocketServer { } }else { logger.debug("[{}]: Pending connection did not send a 0x00 packet to identify " - + "as a client or server", (String) arg0.getAttachment()); + + "as a client or server", arg0.getAttachment()); arg0.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_ILLEGAL_OPERATION, "Unexpected Init Packet"), EaglerSPRelay.logger)); arg0.close(); @@ -380,7 +380,7 @@ public class EaglerSPRelay extends WebSocketServer { } if(srv != null) { if(!srv.handle(pkt)) { - logger.debug("[{}]: Server sent invalid packet: {}", (String) arg0.getAttachment(), pkt.getClass().getSimpleName()); + logger.debug("[{}]: Server sent invalid packet: {}", arg0.getAttachment(), pkt.getClass().getSimpleName()); arg0.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_INVALID_PACKET, "Invalid Packet Recieved"), EaglerSPRelay.logger)); arg0.close(); @@ -392,13 +392,13 @@ public class EaglerSPRelay extends WebSocketServer { } if(cl != null) { if(!cl.handle(pkt)) { - logger.debug("[{}]: Client sent invalid packet: {}", (String) arg0.getAttachment(), pkt.getClass().getSimpleName()); + logger.debug("[{}]: Client sent invalid packet: {}", arg0.getAttachment(), pkt.getClass().getSimpleName()); arg0.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_INVALID_PACKET, "Invalid Packet Recieved"), EaglerSPRelay.logger)); arg0.close(); } }else { - logger.debug("[{}]: Connection has no client/server attached to it!", (String) arg0.getAttachment()); + logger.debug("[{}]: Connection has no client/server attached to it!", arg0.getAttachment()); arg0.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_ILLEGAL_OPERATION, "Internal Server Error"), EaglerSPRelay.logger)); arg0.close(); @@ -406,14 +406,14 @@ public class EaglerSPRelay extends WebSocketServer { } } }catch(Throwable t) { - logger.error("[{}]: Failed to handle binary frame: {}", (String) arg0.getAttachment(), t); + logger.error("[{}]: Failed to handle binary frame: {}", arg0.getAttachment(), t); arg0.close(); } } @Override public void onMessage(WebSocket arg0, String arg1) { - logger.debug("[{}]: Sent a text frame, disconnecting", (String) arg0.getAttachment()); + logger.debug("[{}]: Sent a text frame, disconnecting", arg0.getAttachment()); arg0.close(); } @@ -424,7 +424,7 @@ public class EaglerSPRelay extends WebSocketServer { srv = serverConnections.remove(arg0); } if(srv != null) { - logger.debug("[{}]: Server closed, code: {}", (String) arg0.getAttachment(), srv.code); + logger.debug("[{}]: Server closed, code: {}", arg0.getAttachment(), srv.code); synchronized(serverCodes) { serverCodes.remove(srv.code); } @@ -445,7 +445,7 @@ public class EaglerSPRelay extends WebSocketServer { while(itr.hasNext()) { EaglerSPClient cl = itr.next(); if(cl.server == srv) { - logger.debug("[{}]: Disconnecting client: {} (id: ", (String) cl.socket.getAttachment(), cl.id); + logger.debug("[{}]: Disconnecting client: {} (id: {})", cl.socket.getAttachment(), cl.id); cl.socket.close(); } } @@ -464,22 +464,22 @@ public class EaglerSPRelay extends WebSocketServer { } } } - logger.debug("[{}]: Client closed, id: {}", (String) arg0.getAttachment(), cl.id); + logger.debug("[{}]: Client closed, id: {}", arg0.getAttachment(), cl.id); synchronized(clientIds) { clientIds.remove(cl.id); } cl.server.handleClientDisconnect(cl); }else { - logger.debug("[{}]: Connection Closed", (String) arg0.getAttachment()); + logger.debug("[{}]: Connection Closed", arg0.getAttachment()); } } } @Override public void onError(WebSocket arg0, Exception arg1) { - logger.error("[{}]: Exception thrown: {}", (arg0 == null ? "SERVER" : (String) arg0.getAttachment()), arg1.toString()); + logger.error("[{}]: Exception thrown: {}", (arg0 == null ? "SERVER" : arg0.getAttachment()), arg1.toString()); logger.debug(arg1); - arg0.close(); + if(arg0 != null) arg0.close(); } private List getLocalWorlds(String addr) { diff --git a/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPServer.java b/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPServer.java index 7e7686c..c019b21 100644 --- a/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPServer.java +++ b/sp-relay/SharedWorldRelay/src/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/server/EaglerSPServer.java @@ -52,21 +52,21 @@ public class EaglerSPServer { } public void send(RelayPacket packet) { - if(this.socket.isOpen()) { + if(socket.isOpen()) { try { - this.socket.send(RelayPacket.writePacket(packet, EaglerSPRelay.logger)); + socket.send(RelayPacket.writePacket(packet, EaglerSPRelay.logger)); }catch(IOException ex) { - EaglerSPRelay.logger.debug("Error sending data to {}", this.serverAddress); + EaglerSPRelay.logger.debug("Error sending data to {}", serverAddress); EaglerSPRelay.logger.debug(ex); try { - this.socket.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_INTERNAL_ERROR, + socket.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_INTERNAL_ERROR, "Internal Server Error"), EaglerSPRelay.logger)); }catch(IOException ex2) { } - this.socket.close(); + socket.close(); } }else { - EaglerSPRelay.logger.debug("WARNING: Tried to send data to {} after the connection closed.", this.serverAddress); + EaglerSPRelay.logger.debug("WARNING: Tried to send data to {} after the connection closed.", serverAddress); } } @@ -78,10 +78,10 @@ public class EaglerSPServer { if(LoginState.assertEquals(cl, LoginState.SENT_ICE_CANDIDATE)) { cl.state = LoginState.RECIEVED_ICE_CANIDATE; cl.handleServerICECandidate(packet); - EaglerSPRelay.logger.debug("[{}][Server -> Relay -> Client] PKT 0x03: ICECandidate", (String) cl.socket.getAttachment()); + EaglerSPRelay.logger.debug("[{}][Server -> Relay -> Client] PKT 0x03: ICECandidate", cl.socket.getAttachment()); } }else { - this.socket.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_UNKNOWN_CLIENT, + socket.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_UNKNOWN_CLIENT, "Unknown Client ID: " + packet.peerId), EaglerSPRelay.logger)); } return true; @@ -92,10 +92,10 @@ public class EaglerSPServer { if(LoginState.assertEquals(cl, LoginState.SENT_DESCRIPTION)) { cl.state = LoginState.RECIEVED_DESCRIPTION; cl.handleServerDescription(packet); - EaglerSPRelay.logger.debug("[{}][Server -> Relay -> Client] PKT 0x04: Description", (String) cl.socket.getAttachment()); + EaglerSPRelay.logger.debug("[{}][Server -> Relay -> Client] PKT 0x04: Description", cl.socket.getAttachment()); } }else { - this.socket.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_UNKNOWN_CLIENT, + socket.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_UNKNOWN_CLIENT, "Unknown Client ID: " + packet.peerId), EaglerSPRelay.logger)); } return true; @@ -104,10 +104,10 @@ public class EaglerSPServer { EaglerSPClient cl = clients.get(packet.clientId); if(cl != null) { cl.handleServerDisconnectClient(packet); - EaglerSPRelay.logger.debug("[{}][Server -> Relay -> Client] PKT 0xFE: Disconnect: {}: {}", (String) cl.socket.getAttachment(), + EaglerSPRelay.logger.debug("[{}][Server -> Relay -> Client] PKT 0xFE: Disconnect: {}: {}", cl.socket.getAttachment(), packet.code, packet.reason); }else { - this.socket.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_UNKNOWN_CLIENT, + socket.send(RelayPacket.writePacket(new RelayPacketFFErrorCode(RelayPacketFFErrorCode.TYPE_UNKNOWN_CLIENT, "Unknown Client ID: " + packet.clientId), EaglerSPRelay.logger)); } return true;