From 95dc94d1082f84db745f675e30cf2a7a1818ff3d Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:41:35 -0400 Subject: [PATCH 1/3] fix gui rendering, fix sounds being null, reimplement crosshair rendering --- README.md | 11 ++-- libs/mcef-2.x.jar | Bin 194678 -> 197581 bytes src/main/java/net/montoyo/wd/WebDisplays.java | 15 ++--- .../net/montoyo/wd/client/ClientProxy.java | 34 +++++----- .../net/montoyo/wd/client/gui/GuiServer.java | 20 +++--- .../montoyo/wd/client/gui/RenderRecipe.java | 8 +-- .../net/montoyo/wd/client/gui/WDScreen.java | 3 + .../wd/client/gui/controls/CheckBox.java | 8 +-- .../wd/client/gui/controls/Control.java | 58 ++++++++++++------ .../wd/client/gui/controls/ControlGroup.java | 5 ++ .../montoyo/wd/client/gui/controls/List.java | 46 ++++++++------ .../wd/client/gui/controls/UpgradeGroup.java | 7 ++- .../montoyo/wd/entity/TileEntityScreen.java | 3 +- 13 files changed, 129 insertions(+), 89 deletions(-) diff --git a/README.md b/README.md index fd03953..e270dc5 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,16 @@ # WebDisplays for Minecraft 1.19.2 -This is a fork of the Web Displays mod from 1.12, updated to work on 1.19, and with some bug fixes and reworking. +This is a fork of the Web Displays mod from 1.12, updated to work in newer versions, and with some bug fixes and reworking. ### Wiki * The Wiki that details all blocks/items can be found on my website https://montoyo.net/wdwiki/ ### Delayed things * Plugin API -* The Shop -* CC Interface, if CC gets updated... +* The Shop (what) * Center camera to screen when using keyboard * minePad management: check GuiContainer.draggedStack for minePad * In-game command to add/remove blacklisted domains -* Config: RPMP (Real pixels per Minecraft pixels) -* Disable miniserv in solo +* Config: RPMP (Real pixels per Minecraft pixels) (what) +* CC Interface (for when it's actually possible, since the screens are client only currently, but a config option is planned to change that) +* Redstone controls (same reason as CC interface) +* Redo minisrv logic? diff --git a/libs/mcef-2.x.jar b/libs/mcef-2.x.jar index 6e2a0fe0c8292d0b2c24821b8ef9e22e61312e93..ba5160d3f85b2580fa09e4443d1052a51a1cf38b 100644 GIT binary patch delta 39208 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

W_?$s43yc*hgyG|D^BAHd5M99ccu(EBJD7@-Qv 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 delta 36610 zcmZ6yQ*)GZv_b~?7*v2EM7ohMGmwr$(CZQFJ_IsKlC|3BYXqsFK`>Y^@c?lI?F zbL}-92KRCY8z%!g;Kd#5{`}co}yC z%bivHl@CU}F+X)S&6!JSWP9LWtR#ogq~iO^vo8@ZwreJPRh~T`h}**5=A7g}%g2r- zN5-Oy)$$ccWZcv2B~e%6|1$aneSru+z2uR{h+>w`XCFxG*3&M${?IE+&Zu>H60{tnTBz6BLoPgG zD4$r(P~LssrcjWEgyN0qY99jv0tyBO0#c9$1w#XZf`S6-_hMK7_wxU{Q2woCMO6gp zB;~{yY!iKfVF0r7AWTT1x1Tf_UIM6F=mq_0SAxg|5Nlxbu=@%dhOG^@9EYuI%*JbnL^WA!zWl2f}((T;+!{n-F_}+HBeP2fw*)B30=+0;O-A6gXEsuvsLY zJp{DardKvvg)zFlRiA_h;@}B>GRYcY#aiQY8RjL7C_vipWGv{+BH4Q$r49AsHT{(3 zxnsL3X^{Da^|l7C*qSsEh2L*Uj}lAy4ifUmgan>VIyj|YR_OE3HA;SE4cxA)k)Q64 zw=IObquu@3X5?_#GGT>GojEA}BK6QV8hI=o>^3GVd1#dEVlZE>ZNaPF?y zgM|M9G}m)8X7Uf5NRa;*AfVKoRA9tJ6wp4sfWl%PNpggJ|mM>w`c0(100umCe z8bV)xJl0&GmnCaPQU=t^UU9lyDWi!y`+D{Y!KWaHX>LC745C|?? zF0=J9;}QX&A~+ANcWM@T@~8DxfkGvUErzkZ{++}>)>7zN7r~dZ&d(pxuP(fE-h;s)vV%;!-*Pf4~*qdx=E;1J3P#0QVnSeVC*GVN)|z7fTy@V;e(fXIB+# zbyRh+CC@|6}b1(~9v&|hHn{VnGvPVmMQEayBE2c=ED{fKn5 z!K!MXpkK1OwzJvce@JI0CVa1*&2D{XvN?Xf-#Pp>&)_g!JF^$zBU_tWwx^n1zlqiN z7;?NqsREb)Q9Vn3^G+pZ%}$fisXDKuB3McEN1>diX>Se*<=D`|aH%$>$(MHO?Wfpk zliAd3CD&E9?rp(XgC2x`z|x8Qf{p*+r0g@*!G|seXWzO=rCeI3$e9-&8)Ki5&N7Ns z23k5ydPCy!Bfug;bGgWy_N;xN>&$$Ce%+Bw^m4LIW$`L`Fu_h@X9tP)bbUVCzw}LzkOc zWo|kEu3_4;^fQ-RC?**&3!L~A2BA^#32&r5n;0q;mm;+^MMm1_yR6tH%EyWDN%F6D zRBZuSaOfQ2!WCPks1Iab0~0>vBr)1YZo-QIE3OuMw#yC+ zuuw3Di9`WfqOGicO^suztwx6V+6uL%^mW69wjdYQ3?9jsTPidC-X*80j*5d+k~Pq7 zoSK)d>*U>&?2VhcF4s_1tyE}Q=ehS19EL8!Al>}6!W|f<$wZqF{2YmxP_kG2?^a_# zr%u1JW6(++{ZjQJ8F{O4FBVEU0pfTq(%nj}MZaCbNIdg)Tg0xNgE^f_HsxlAS&elJ z(aQF;vTCfCq2#5@s?>Nxn=&KYDth2?#WnYDea4}6hY%f|1LERHY$eoUdqc2>x=6Ez zGDAisK?^)$Fkkq-JN#<9`7sN;sVfq|JESbcoi7kU-p^!`6$<~H474C;*dyx*<#UK# zAV(9*+R2{&TN#F=PQ^+=`1r-)6mZSo(EhPXVYt_Nc3 zJz?wXohiAuzjtTaX8)Eo&z5LBc~~6f%RGV9{02QiFHG<1L}iY7*gsB`HeblgNP~~rj7b45i@Wcl z7Atn{(p|wP+8nsoUbylCm?#BKgLItGAP3G*!Ux90EB*z8@-mU6mApf77@AsbBeJ8v^J7 z8Xuz>Hsq5dyh@#kNwWvqfB5gp9)Nu)o6W<;sZzez(%(D0KQ7N}UmsHubAfmUghMrH z?%Iyu7Etx(_HxKFyYPZrs%%mwlJgAxnWCCR)E(5{*mo;ii;Cf%Sfajh0Ie0mSQs+; z)HjNJG-$HROUPa4?O7IGeWz%eCRk@Mtt8ke88HT?_SWW+hEreT%BuN?o5Q3Da6u#aULb7;*tPSjmbf-yHa!jM zEXb@%ZQxUn7Sp4Z-M6Te8Zk$mJ^-Y$hT*G<>Z6uv8?dDE5jn6!*+Kc02GpB(Xl)_j zH$p3!?sh9?N&z_l7D5fzuUyiGm9EqH~^DMkgP4?v5>I_BRIq<%U? zg{+SG3@tRG>Ue*Ie*M)bWP^P{Uo?Q&2Dw?_2nW`}40jH1&@W}0R1^Syl`C{LYdEox zC;ka?Wq$!0;l68aD~8s{vSW0cQvUdKEC=-v@D8ooFcy&@^aK4*kSsqEs@90r@Ng++{Bi|lR5dHT+)?{4_@>n!bL4J|owC(BRQ zqxY`&4?mCN_r5r=4v8cReK?jQKt$fckO$dV%Tl&v)T}nX!LO{dnYMS({ruC})6nUUJ!DNA`l#MmMEvh05f@l!`mTc^Ra&X#B~ZsHRH;QBB&mN{lW#va+)B z2KgdZu`0Cs+XE-ERQhktdV4h%O|}h9KSyY6b?LQB?-+-Owi!XrGb|K^7fZ;+jAR(B z@Fakn2h4&SxUB|*VGbD(BW*Pa28$RtCoUMLZClD5*SOp0p_a<2=+z%c{Fz1BBkPT* zcqNvgI7SZB3TT@04E7onOFBe3BDJ5by($_AEBDt&|K_PB+Rk(--z4*bO=PtF7Y9?7 z*b*@;S&m^bR$q_ceAP2G0w&V7>UbAwt0(|D&lxH{JLF%2V3CQ)y3B5Nd^P>w@e7Aq zr~7|WWX{EeM)aVqK}kxGR~PR;X5R8JqOImX=#`_b3qw8g{8XARP&bICt8#BXEGlt7 zMVzN()~FUE(Sz?%W)vS>a79JTvF_Vu)-dC0MC)o>R$T^nw=*&EAg{YD_XVP4iAVs% z`3oofw}GKJ=*Q($bs4XJx+@GN1knbcwinlT=NGyQCwCX?3p*=WmUcH5k3(lvBB&=h z`^L^HC&$}LJX^t(o5EQ6H+> zOdH0JRC4W9J^j)q!(ZIu6x-3JVoPq>YD=_?w22M|PYeS!-dE&hGW>yDIz=I#MB0OhDSfRu6?m*K)YMR?vJZ&6~54jJ|@9TH?A!@BR$ zj;eIy5~6dG8W*fH(2SH3H$NEQp$-grJFwc#aG+x;PRFeg zqQnOt%JzFHUhsvEhUCgKiXnWU$^Tv!Juoysdsm>Rg&~y}8rQ*WEb0dsZOfKVm;f7d z#+jR=D$hur$^pRf8aQChPv{UZP8B+_NNJN;I)(xkxM1y6QRlJLFMTk%Y1!=_1^RUy z4c@Je&>zylg$dCdK3z4NYyXB=}U$^=|EK!8Ii*;|ZR*u9Rsj(f@VV@ybNlZ-r zYN;{&oL0}`KgJBbsZi{K0{{W--U!R`h05}x=rsnsBA8SdyrqXus{#Lk@6q~@D0g|ys8%j_nR z6pbxKqy^gDye3IBdp^OmMmR=?2k@h#PE|uT=mQu%f6%gVSCWmX;~2=Wlm|7#D0*8% zS>TUQ2u*oi49um2s+wRaAYP0PoqQgnL`k`tHOAU&#RO0n-y6VY%%zhRw^?475p4czK!G$!;| z+(Eo;=rcoM?bz3rQs<(Z295r)hmSRe}+dPeBfPjgLFhhYzk!44xeUn`zXD$JYdCi-)G?*eYPS<;ftJQYWW4= zi>3H;0#q}Cc_%7nxv%5{txpcH8)5bdi2~3J|CAjUeEk}oRljexK^Jc)w_5aqkVm<) zClF6|e%>CvcY)ylz5Ima#}}|`hgRu|`eqCP*j9F*ptoxoio7=Ieo5*Kk=&UG?TjAZ zwxg&UBX^_u4(;8n)(8je<+|LA^g5|%nN9*ZQ{1Cne&05FJh<5LaGDUH1AH37RS7=; z|9P|wvXV~+Xds}fe<|Mo^k{vUzX6sDMbY)uE3khsU6NHC2>M_p>e~KvD0JkKFS3)R zCY11{1`@a3{i_`AO>lH5nH^5P9s%#OM7jF6gg`U(({-pO(1-;pw*XqH!h^v4 z%P;nA;GmN>P+WKo440}kMgw-mLFynqnF6lCnxCIgv|YT(gN}@zn>N7dr5;AY>I>Dr zTRfcU_pi{1mqvjh(0K9U8iMLin|R0u!eNxKrZBmm@Hr>C3#%oLxuOlSWeVNG&5Q2- z8~oma=c+XL3OWmw*RxOG14+a>Nh@o~!f1rN4(8-}%|hr&nHpAw+wQ#QCsgyYQ4(}x zh5+hNMH|WGUf}=!CetdoCCk59XZe2wrvEu!0c;Kcq=(9CGM{(`F+3t0(l63eztYePPxr(hV`du z@^#M4D>IHu6Jzds^7mO^`yDt7(qmX37Ux~M(y!7T$lJf?OWGnX$bk6sthjYlxR64z z*d1el8<@9{n0Z~X;dRGH+BzYJk)BbB70U{GQiz*1^O}Ln#%1QgTEeVKf~(oLUbnn? z1|5I@AA)O`&_dr6K9V&f(vImE=_d>Ep+B=$?9;yEdJLYwhR(FRRr-$VUs%wGqAbFY zS&U>@GQ{J0mUkKwER86!BQxtm?G!jN2JeFb$jODv(-G#($T48tiSr7?Hex~WW~@0^ zilZ3OEq;d1VtXSN17`#As+=lV^M~Or4&nuw;kfBO4?f|@Hy3h@o|~xi7`#2PmOA1x zw;ndxsl z+;6pa)(oLV-=hL-nZ*$YNQUgmqleojx#^dA+Kj?^&IK5%*e{%9h4Ls6oMg>Ht!Q$M z!gm>#(U!zi494S6x{pYorZ^01*7ylP$N)HwY{59Q7EEj`PPhT0MTn7?IWd+J7MS+G z%32FS{C2(3XFt$X`qiI}5&th3ke(#whXwdRh7?OrXSr`Jved8Oi?j$MAO<`Z_Kf-H zafx8d7=Bn+>(hyhePtY7nP)yNS$MK0C_OrQ%oUP-&`_~Uk!j7Qo;BH2ff++Uz*g03 zllvKzdABkm+0>eUY6cQ8Z#r~It!X5aRL$5v2?_qz?>Xx)+enPb`PmgXecL&bc)I;y z;JS?RVR2jwH-W%K;7 ze!SzkB-i1U`eL0v4wu_^0h7`em<8|z9KN(0NJB8FCZS9XBv(mMM8yAi5vz+0d9meYsCcfh>Ili zY%1Z3tuXVs?oC8Z6n6(eQoZGwUYxX(3)Mp0lb4xjSYXJa!5_zXk(iymwy{Q8A@>~H zRyGg+q*?zZD{~s2#CxLGU%^{I$cW(%b_mKSD$irVwTSV2RII%hdcAKEcBo9>Ti}Yj zeN(7?j!<&H|F#m9YVCrlOQ&-)A}DN{`T<30<)ZNLx7vllr-=j5wfo0L5C)RBbr`_3;a`R}@v8aOcjSoHJHq-u`EUDvBr!-U@d~ zT>yyF%{Wxid?N7}vKNdBBr8r+86T+NXEE>MSsB|S*U=xl9Z@E2ckhsi?sc!vYV zHwa?`7S2DU-y`J5S$kMat~P%Y+Jp#v*C%ATWgAP^&sc~7)THtG-#OocDZ7tVIg%H# z#Od9$$ND4*K0!THxIgocF^%<%MdGWO&t4X}V!J5vQ-$_H&Z)f5_>qt9f{L~}<|7}^ zSRx-i&99IP@n&WK6Wbs4l87eoU;Zj$g{Uw!*UGk6y_#pNtXkWf^1e@~AJ`Rkc(g)h zkiSmIqy6Lnx0puznAko`jxH|gXpB*96$!mX`r&9l(CnX40T7~!$gQCv60G|(b;yY` z1hdJ7al#7?>8&`(!m+s6mPP#MaUM1bBL_%)@OKEBc1-bP+EaY_d{J#$P5EzsEJ0*C z;A7I3Na(QpNo`rJo*+L8pIUMStd8ZQ+06hC^P^7ybL|c|K~)SfL&`fwXM(+bpL2%8 z1oO_gYc{t?QA}p~a8WrATlRRDZk=DWgm;capZ-)w$(zX|87dW2TO*=Z(+PV3En=$i3mg;ShC0>j!C7WvJ0E zUEGC$OBHl)opjl{>diO>N#2Kh#>n5UsKUU9EQsc7>%8A5sUt+=jz zk4S=zCeg!n0YYczg|o_rtpbXU?yImwS1}nDv*CN3Xi%QjQ8t~(@Hpfc3!dE!C@(e4 zB2aHHyI;vEDUbI?!6ALEBTm#keWRz3C>}?E^t81cHgD3|2^*!G=BQNI7Mdci5Y1!C z+WrvJt3?zZXxi{yKpXKvHT|U5RUb_R7|)6 zTnmh=(Is8r&q}~@`K#R2XqGNekOE&Xy(!tDKRZxShw5R5k;-anvwkO`|8Qz2j2oU0 zUsF3X8Fh?BnYGp#!-BS?*6X-X8@n=XrO)?5ogl($oE za*{{<4DGK=%3*C$QFMf+H?Gfp!bJ}PDhBTL%0ZzUITDqKFX+HXpx=t3u#q)|jzWn` zihkKcwNqwXEx$>*#+nN((J+YVL;+C=1S+li)J+Hftk?+<2Y#tFLxVVj9u#W;M2D{E{-&>Z)+p`#@QWrM}NTg zY5lulHlJYX&CC%V-?7HtbY#XaM|kAzh=2Ndl`2zs`}zPHG1&k+qu=EdYt@>;>i386 z+69UU;0pFliT!xP7JKF0Ng=gmXzeYREb_>S z4M$@TP!{QDcf^m@7qS@S*9&dRW@;?07xrLViLy&S{Hj1qdG8u&eXvCVkWs|R3!lqI zQ-Yv6aguadNVm~cY_5`3iqqIZAmAqQUW?gOiuiXiFe0CCK51y=T#rkd%L&1G8}iW8 z<@?fk)&9NG?$qB&>}#KAv4~dG$;T!3;<4MCZylBy5gO^Jv!N~Lm=@tdUi7YRRdCD* zD09v)@+z0nGcZb`u$TA)cz0!^A1Mu%T5g;A&d&3jJPIlD$`MJt*A8#s388j)K+EZo zv-={mf}N6`Z`!zkS(VJd=9F!8GjP~}u7Ezu&1-*PlkW-C&}us*%?1Rffay?JtRq#! zbcwNXhg!&PQf){j6`Yo6}8p4!2;_mPBRugpg*yl$CP+cU>kd!{-(TbT5 zX-ZO4W?5cjx7y>Vd-Rc}y(q9-mTpo^dl7QMzAl7XidRHbnNTmJOb7Z?o?6qS3VR^= z(ka@fjwi@t<`ChU= zWy^wKa0BGKLEeB3U@0i2U|bzx)>phQU#H{jR8`C{xpu01SgW}&85A{(z&CG)an8-J zblz*avf9mS{M#nd@+p zasu79z(0|@!VPOTK6diCL0*{P#hUUCED49F(K)_xl8>+hAS87T7f$jzoEN%8+wKk? z{kB64JCn0^nI(FFoA)i=fIPk-^0L^0u@8BzCIf$$hM9z&gv}`kg|YYCFF@~6x^_qJ zSv|Wa^6F6etcJ@So-?YzSW5EYrO;<6Iy=UNeLu_Ht)r#>VON*RX^`42;#W*hMPLGm zTqd2+7>ES|5>xxTOZ)rH2fI%PrBjsyaVVi7&r7fG+G+MV)%zXoLNDPC-aR|C@|R(D zyAm)KXUmd?O6I?k>5ow#atR>UOIjQAjno-E|W-P(+>u$NOc|#{r*?LUmz6Xm-781Y{WwV=|Li!*cvh7YYAN&c`DOSu4615+ z+H*Mpj(Tey)Z0pP^M0UI+LWL4u@gVa3?@`Eqz+4xsPKNrJ40hUEYLxXXvb&UgWmjW zQtb$y&Slpv=t_9G51zcvk^hF;+=(>tAk-CmU8MIy%6~$t`eCF6K&9}*%>uxd2*8^u z>L1W}#pDlf4b&d+T<-9T^f%uS766N%6B|K*C;l|&{VR_T_`eKtjJ|Orc&}ctk98rQ zg#$hr16!v1*A02Dnv@@OK;{}iF^xbj>wD3Sea=*S52GM8{yeC>1hYfL;F~Ca#2pYB zd=Uyy6{d2;p}9jh?m?F4BFC^9=Bd5Xwf1H@_a?3#4(y~%`;puXptu=>@v#Qj;W`@t z25)qKXF~T!fdmH(TEPcDD&`eAZ#|avAp<)b8eouY;HJ2>pP?0e1B*Y1RZsQ9E=n1H z!^e7pem{|W1+5>(C-z$ zJcE>o<}aE&7uWP_8=bd{E!-y1=Ej!orzAY>l9GR7)`?$9oUMQ6`PYA$@K<`g5RMsH zrFm8xGqZN|GIQ)`)}T8rEgN12Xvh>gbVm#MA)w)P#zHO%jX&xn3!3qG`s7ShM95p% zZ5%wR3Vu`Fy<@w4a^b!BS{3N$aeR?I&(|t6_{nk*q1Xp$?+6o`7`o2&U*rWX3qn=~ zv8(xxfmv2n1jL6dqZu3z*MO=`)lj>4=I{~0vkNLG^Tlmb*9IKAGa*Yv3>=<3@DA|f7CVH z2bSr4>We)+s2<>)EHd3{65Z-Wqa`PnR?2fL&%%bRD!z(`nkb0mELwX_n{$Xd;?5H& z_qX*GVOB1rxR=H2oND*o0Yh?5=qH5-Q-yU{>{c&bDCyYmQu_rM&z`bw4A$A$6I(_9@w&f(T*~1G-UMGUYvsJyCMRF9OAih_ z^|R&<$mZ6|=C;bOL^aim;~Rm9SIr1~O37LYj`OWcq*~=_{DhE; zIxYf-?4u*iZej*91_qMoRC8opdsOG~NQzIdB^&AA&r#Bpgmn!06z>&{RQg~xYKq{r zS@}H6J^tNvOGGDrKJoO{lvNlw)#7d+h`7>;l?Z%E70yj|T`pa{wX!L21mw6$?e~ zND&K*`=4Cg156eoU?)|U2A?A6Gdq7k)11%SG4)QCEAJ$IU+bOj5SiygFR#tK+NL`% z9V5qZEu8wjHIG-sMUBE`vtd`Y~ zxEQx0Yi-?$hyThq_cr;= ze?k8)Bri9AFf?>z+<3F$NWP4vWG^!mdYjMin&VWF$-T@i@xO-q|Mhk#CNZ6+dZCPh@l? z;w@1uwxsZCZHUd$*6|9M&9&(Km2?+rjp(ru$zu_Cs#8p3Zno5~5;ZUd-=v3@&g=A< zTiA|lan>W?so_^#g1u>B5^sbFwO(6UdrBe@1n3y}`rbonfooaMLb*)ep0<$07;^`? zrCi)1S=_gR;2$UQFjaKc7#_oHF1XpL^yYDga^v@F1+W1NAy=XPQI&)VmR_OCt@*7$ zY$Wi@P7MhitG)?FbDnL=WP?&7e7jNaT7LF+wGWs;D={6F)=HkOz{)Nyc_eu~BTZ>@ z8xU<#ISp1!)wNp(_v+u*Q3E8^ArHgq>Y5v64BH}#JmBV~%;YlX*kox*7sy?BHt@p9 z7X(kI5t_rvo~*`wxTd3Z9Z`sXd3-@1z&mF_t#vS3e zMKULr>}-j)Mp(w>e`f&d9iIU4GLMc^1~64Ku+MwY{DP#}iTx}x3MD|opM_TJ(EQj;4wiOd)95TtPRkHVTW5GQmh&`kXHTFQtMgNmU z$5QV}qzqzhE8Sx-9n+CfiKxUV{-jM!NrCril<)GSV9CYE$44(n&!MwDud^AC4cO9E z1smM)X8wTUqcFtB)Zl&f1~Z1S+s7KLX~>Sr8Y;(<+fy9rQ>tA}aaHfc8|CCNz?qq9*^)00j+>`8KS9#Gi>!}BO< zIb%`6)jyGD`idNF6k@>i?i)Om7O`V~uLC!E&y$|+&GD#|rIb;@o4rdKNz9NuX~x^@ zx_n)M2DkCvMc(Lh@FP8OS9fL2uqS%{%3mz98q1-!Ly6`h zRh$C#FV|wOk?LFpb7OU30x*xau>Tqr9BV-^YmCvOOtOy-OPMe>!1u$f9YGp?UE^zL zta&Rbpv^+J(G0czNLAbYIsuLDiXoID;Wxr)S4y=47`NDVj4YwBGSBc2&lZj3PGSqO z0X?W#`H~b#O`bb;DKdYMN9)Z^5l7c3#WSpx+(1L0MaOHJGuxMK0?NC-*!)QPzfufj z2*_)*VX05IGZ+rxFs}*{_lZrMWQ^+0q~@vWFue@dd1^^u2D#q~hwkVvi3(>@ZmLrh zNzCK9#H|>b_meGgxYVZP&t}rti4L28+ctj5S;Y{&?o6Va@HqR4WInvy8%{1{3o0A) z*3T6b!aO2*Gydj61BA^D#q{DiP3h55n0~kF(4AUBZ5?=Fvpe;cTkZD$J*n`ec*V=C zOP=MwpJubtA^*vL*&2w+d7XFt!050iR@8h^OBv4@l6@lc+8OLFJ#rS{z2$#yQQ{pu zMQFNfPrU1>L)ivf3%Wi#cE-FBLV3MwC-iNTEq5gw^Z~F8R4*`7}(`2cZ4X!iw_fB7MjtO9%yrf0LU3*#iAVEB`{*_QAgo5@I>8~ zO@MyTU}2jg9-968uGj|2Q9Uo|;{G_J<2MV^X-vggEYc>^m08ZVS{cb!D|Hp~=7(?9 zU%nMTLTmmKM@h@`QDu(|nTh4pHmi~&Js++-9Is22K}Qh0YHj%0GOIluGzIwX=Ssu& z3W)JB09?<423uCaPizB@+^Wi;dU&26Thja4;Od=gEe`!*L8Ht&{ITLZ?*ek|~gP(135Ih&#v|dqhfM zm6C$gl4>_R=~iUIo%onLet;uAf~ffeL!G${fS1hUu2&G%lzz9(wQ|YT*t7Z?(wwx$ z6{Maa@!e}4PpEq2t`cAS2$F6xIzzR^+teMdt9y__iNbdi9Lv4Gk8yRqiy+ZzlI_AR z4t082vgxkU;n)FVfinIfOMJo6aLchmYQr90oeok{C>uDK9(FJF@359D z-~gF!^l%h*xG;Fu6fT0TKJM*e^ngNy%(x$TR`|IitiqnYB8IEXZ(c?21<{yCA=@^pcoLI#G?z|vn!s4MSS*|92W6tCNL|pa*M6l z`#727XspP4$ozN%<2?d9)lYMU&9L$WfP-%Hn|;IgyM2!0FY`&NZ0(Bt71G+B(?9Pz zzg}ku!GW0!&ycuVdGwCcxKG`Lcg$3tUOp3A`+)bH5=A7-OU5?);|0r3PgPZ-mZk3n(4H*e`z$gEW=b+ zS2w>HR@zqkuB&}0RnGm)T-mt|LTG(`_?n!~WIyu#aJ_EDf`+~F0_UkkVWgoketrcQ zteq_aKBwdW`h8~)4CVTBYX&v2VKUu|f2ff_NLJ6RT>%n^?w{J+D_FqNf;oL>HWSp6 zq>Qd{>{xo%FF4<1q07c@^b3R8L?rCR>#W{~$lxI$rFfYt0or+U`IwZtJb>Y^<)yZc zd{rJCR+jn72B?Pr66yy_*}{!xuG9Et^TqXsDp=8;g7vJ^b0wl!BLy&LKBT4J}>~ zcn%`9Wbg$VDj-}!^~~$lG~GsO7Yqs*$=ZK$#?gv_K{qW!yE8NBhwtqxA03YgWPwKR zSS1EUgRx`$t^LF&JP0SFq6L=(S$NhTIn31s!F+r zyj&xpO*2s4CAV@Xl%gD=lcW7fbv&Hk+FAc9X;wyI(D}FKg zti(c)FhiXcLMErU+KDwM99IlLMFR1~vqBl21$MAHtd=Tm|H6Tgk4TR!{r>peh?Hzb z)|4oMs@z-38(># zc=>V8plis0Hu#W$LY-M=qqJ#Hn(~U1tQ9-*Uy&!7Gze0>v!(-V^Yjoi_YDLP$MLK* zC@woOF3w9D)J>8EjSQqr8Gz4w}$l>}E}kaL#BxfnkCocEJNUHF3TtiEYfw z2LqwUrvb%#R_K{?5`XH=L(cuy>PUzf>0Q^zBq4hhUrQaLk2Z-J$vL6}FB23Q2Qj2e z*P+~{Nl|lTacV~4sap;fK@OEmR);$~qRQsi(PD-c>9;8Jq&l+z?gMUqI*Y{T#{LKj+qhHYk~zbq)j8$aM`VmU}1Ty``yCB^jqo7TpV_2TXcI`s-=5+ zGk9oY70M;m71mY>b^wgr#1DQ3g*y6)m(*{u_fE&&q#u8Qd!#d}H)813i~P3v4YIJf zk#q5U<-ycDQ*=bY0Zni!L7ezT91F#ARQUxF&($#R8}&3)@Dvu!xgr<0t+{R)cswVTOUQE(dg89Gf9KPz>SK?gbZai4_=(dimRdsE(Pd?#lbx`o{VOP>WLU+ zIvWd#vxv>3gJ!a^Ss0zrht0@fRE)S;Y0WOP2VYB$L+5Y6OR%9m!)18J7uBy zA3Goar(MIdDf%2DI8H1XX)_~LiMKH0f&N(T$CFt~6=D51^I^jC{V28GNH(?J00KJ0 z1PV=xGod^HT&v}mjp!%1m1Z}^LHxAbpC7zhiS=HjG~WRuv@U8z3~MMccyFhLJDT)A zt9RBI>8$Gn3i_$jA8cPK8Y!UJ1g319288MJfi^A{|D=oo^#yXp>_Xa2`W;nqRLEVc zFSi&Gpmbu1KPU+?)@H_YDXpU!qnT}V59G;GZMYpF{+>TJGm65SK)RH%_Ehjpl)X+? zzF{`9Zj=~T!6HjDa!+*-wZbHGaF;mC#YuR$7Xs052)u>c|9TMhs@Qe;&@$;7{_k^!*Ig+Z%69Irmlr+oVuu+f|khKg^^32A@k$a`g8GUjVGgFlZl1A0r`JKlr{UqkALc^`aK~yh8`O4UpuX zNS%B1P@dFc9{5hFDog@ecuN^y@)$&)T$%sU7M7|$SY5qmj=85CZ5SQQEBd z*_#{1*jrV|9jc$`0&JJTKkK`*aa$1#%w_leuB;dc`*hhR%6xckY8+2hD|>`;xnpag zw^sG89k-*MatE@NUX-=9TPhD^~kIHPTVB8ziQd_ctU;SZnf)o zV+wS5XU<@~kB>&gC#-y;+qsfGy+P!e4@&R(UeS7Hx@PivO7Gzh8UPs8Z{$6qJgf%D zIsM%Z#$1=znhTy5>mWXvG;Acb+KHa{THuOiX|JM?{WW1!iZ_HtZn^s7A76sm=H#gF zMxTCNL%pe{831PgT!cMywg{O%hE40OS%c2m>^^(90*BXl4ziue<4;_aGXlcKcX29N z;=a>(Bn9#4B&0j$O~4M=_l90I)2k}q^650qGKz<_j9__-WUeM-iNRzM-F|}bzNRR; zaU{edps$qtu66rPF}QKTiZyptdUKg$34_k}}Sz|j8nlPhNTwhZBIQEDgW+I9ek1INw)FMCXJimfCbrs9DOuDhOEFySq- zEe@Nmh)R!qBnGNF$|ixzgON*`>1m0tcgR;SR7e7Bu=LUT_Ep>%1^$()U;_>US*75y z&07+s2^-qJYrcbOT)>&IX7&ZwOIf^5c^nRw>)Q||{ik#QWxYHyCjDOPuG~|ZS$+9dGycM>FO?!&0$QR z*0$a0rP`OdG+8Cy;K$-f%E(#F+X&m@NOh{}y&_9;Qq=8*+eYEE2+x>U8qx3uY? zEN#F5)J3e(4=2Q2E(B4sgeL!$~yxt`8P?hZjno0b~*g~f-yRijv+{>w1Q-eJG_9ug?i)M`}R zT{d*UEz--j+3*LOuMn0GpE=D&@v&uT)|@iv=TY51uQSf^u$nPQoXIk&Rp3Vxy!q4C z+{>lb&ptladH~z*7bi8#%=J>GmS26WGfiabz?M>MqhDM#Cs@HvjH8=d*DU|1t?z)R z>i_?DkL&530OjA}_fAW=bu&bZzp&t|$7`5Y@jKe)bger?plsvRmLX3YN zO*acx64A_j#k9obwRFX~le9lG^oqJWsnZ21_ZBK5u$3u;-gHJUu@zycX$4=VQka;U(e6pTj zdApHO>ikhF;|lt8+)9xu7r3)baK-sMT1Fu6_(H9t`nRYt-_UC;Vf~HeH`s5dHC01is1thh;){u5;W4?WLf$1kR?z@qKJjwnBLU23z|L2a-*Dj3sA83__Q(|#2&%44R;cn`DzMYqG z@5<|Eu>q=sE~9TunZDAq)IG-ZiKNXh$vNm?X%e%%?|fFcVx(Y1*`E~7cK~f8Ym-7t zPWf=~8>Q=bV(&*;V+dj~>uYeWo9mZ&7~=dy`d% zM%Cx>YT)(5EYR9OupsqJka8#kCQ-_i*0uzMc8YF2*;%(MqKs3fcq-tuGilSI`cdb= z4@njD!#QCQaYY9=ZpDn;Wqfx3yGF9WGNrtELe?4Cz$CrXdi=uObZ1JyHQ%Ic-=E&J z$S0ByVRei<+4y$oq1f3(+e{nAl5qn^#t_*rhr1rt3-?n#oF2(}Xf|~CKn6xKQ0DM! zGx-zlqvl+tR!kdDitC-8+D)~sx)ELFWjWjWwI*~pER61it(?leFk4Exk*PBeC2w1> z+>Wo~PkgD$bRZ&{zspj-vo&2faHE1hwRoanohGlK+&`?KT%+@iljx!%&&?XstBsbF zE~&O1@nh#|ymg{NQ#h~>h8gRYG4AbO_vQ4qs)nw4(=i7$?_N#qS{N@f@wYe~ym0>4g?mpPP1_j0Tby+eoxlAy?73BIS(pv_nB*-<8*@QDk#u7_Z`DSPBU(mA zs@l&ZAFW@!>l~*0aWtvE$HUTcCc8Prx)9dsq zr!T#@)VIN-y4dhjw5>4ZkhsUwk$0G9%|85DLf>RUQc0}xzBjRA!nREFm4t7FEgi&4 zUpq_NsM8lPbv=fAe{?7=%}%j$Q@?_VVCh9%WsFZo0a99}sJN6}`?fD4%(4GcTAV`yfj z!%wN{(dJd~Xr$e%J62_0FQ`ff*pEfHB(Gk4xTIXZjWDH5)sG9?J$6th*1it<-$&05826OjE+C)d6#|2q}gigOxOk=9-CFz9D z$8P;j$!pA_~AVCF*|jgW(K9XtarH}2;-Sp zsDJu(MVGHqA)jKf{wLi_X3**TiDdMIHrX+fSEP6}FLwm>^@W|2%eg+HE-;&^2(Gel z{Kb?Zq~$+f_JeZXXv(*nNvy1vIqqfm68Vil!;B`T${53pE~d(OBc3gYCN*QKCGm@Z z4NrI56{dIY@4cAcOlaL-;ysjj6w;IX$u%aHRS}sguik50Lg4GtMC*Hd$=B=Yevdo1v~fl^m5)nAF@)8x$rMFPj@t5#bbPIt0CaAs3}*Y_$Z zpHFpNHs0#0!eGcIFZQ8dmY$lhdxQF6uVk0x8_JbPBa6LLIj54OcCx3MMIdqsvtr*{ zOxQGP%lY+6p32SU$T`ta#=uZ#Gm^0gjx}xzlSp)r2t z$2EnLP->d5Rr^t^J`73rr(oeyBW56OOb-^+%~^{cF;95$Cvw=G*yz$7`!1hWbarjC z#Jj^y5te}*oZUs&Z(Qql3g(&jsKA{3pj+>rMcGy@pD^Hz<_{!N`S`G@)~&ZVZM~#) zNMWgQbS06@NOjy=Fm@@M?RBp~Z34f@yU-UWERMFBoTuR&ieCDfpw{OfV%`$wX~=*c z6sntA+bPhK!&WE_tJACH_Ze_v1B@S1*RPe9sr7e$V|z|s+NS^H^-&MA3g`+Zx9?*M zk%QHMj;Zk%4$cd)2jr~h{KqytI(Vgs&%OVH_Ex4^EIT}ETc1%7lh3DlwNQW)^PE5_ z`Ta*VHLLGIK2V5{UeMhM9%@TYnU&+=Q_f5;cY?4sR%;~Xxq@r?8_zaOm#cP|_uVxOh++J8d z(%Rge_-ZE*oBNsTC&jrduih$8y*Ypp^MBHP(#VqRHdSmHb?9v|er3ir8E#&c(`PY9 ziFid4i%ohiPm=BI~lqx!AZM79|CxnO~E>k&S)=*Cjb z34W28Y{r{>A1~5T${tO*@ajC#+Bq#24Cf^}wyMUKchZjh zipJQRCC3XRS@*ZmA@ikb}9N$g+)rXqtw(NsE-TWCiYdQiHhD}Txj{A(OYiKa9F!{EL+OHcdVS(`be|Y z@Kf#B#B$M$m)W&xDUuQQ68b?cR!jDdClL1&#peN+C!LKUHFNa zN&E-V^RN9dZFIk%i=7u=doo9-Aj8QL{%Me{Bcoc6_a?dtBI&#O>T%HLE8qOklHRN2 z$=DObTrNZ|d~me@8B>sYgwx`4IqL(&l(w~$M!8L==yroobnbb6DToioSsjaW~<#?Dl#y?&BHP{T-xOWli1IONR+rHJwVi1hC*5(c+M?-}eE;gc zzP@p^j$mK1q6Y8Vvl=mpbl%FW$6e&&~CW0p?_=AAw+Q@M10X(2i1rj*UE z<1{6Y5{|}9eX-=Xc@BRrcT()v4noBmwL)#d|xi) zEPZuw^#4iM%)z!`XKQcG9{upGog`(u!}(V-ueF%nk9HRI{w#R&N{3TIo)81)H0~dOkl@gZd46lU8 zQ5jj`H+>^M_>Yf@jTQNh7L;EMe){-RYPxLrj#CfVa4E{J>tincdYb3NcQihPD8B%0 zT3H{H^E{+pB24SIz=44dB7+<4l8sqs=;xkuYM{NE5{@17Dfz7xB*=U3Iah2D*&|ET zSAV9K7bF2^ldn8#?@E4`sTP)QBtfq}H*+GYmLV)bL$yxtF&&9SR!zahtuhV78Fp$wIcjUS9IJia8ajdp|&<{Poq=DpXgrq=T8QzQ9gQ)504o$)i^Fr_SC|SJ+xT z>0f*PcuwTmFiv5m!U=T))>QElIsc>sA+|O!>%}1EqEXQo2B$P+>HUrF_OZBedY7F^ z{i<&2by4jiA(d@<-{PVw!wF`e!lzkH_lRkxuZ+$$X}q<{XT~yPre)?n#5lZvrKYBO z!YfcQn?zK~dGsM%kbZhz=76HoAG;#yr}kR5y_#X$kxk*2-+KbvJFi!4*kd_^DIbU~ z#KBV^ecv*^O22B{!dh!~O+q5@!rJi^k$|859@=y-no>?adU|u{r3F=fORE6yqPxet zuuxgjO|p`S;}%);fw>qXAJ*~v6=p}P9@E7|e~z;9c#+3+*a@rrtyStkfVg$Rxx}yp ztbBiAap7as#bR$N<65%^sU6pvu8+Ss+LyJgizN3C~xttkpkGctTz zKXQA6lFTsbfmh4((_~!LBwr`%9yY&`G>w$Ves*Y}wq?Qia*4cwJciYL>%}#GF&?FR zk#kdZ>f&j?+pc}C3rmT&w_nQrVEo45_(*&IX93=M-;X#3TYP+2OaG`g^>ugk7ZRXY{pQ63&o5pN`%auPj zUC-X)Y_fcs&^7!Wic6JFnmL^ktpH$^G3s< znb)76cCRjK*ul2cow}rX8Z3iZwPdD|=#kiv)3f@;=U{{Ktf{2UcrM-Pk;nAoAJi49 zYzJpn3fH}>f&!XT9+%mF9N`+O*)&Djt1H=DTIy{I&*f+_{M8q}G=h=ay7Vf$aBG!< zXt?ivcY5P^gb0oYQC8cfX!fROi~T zsfFpqRlR+lSDyHOT;lHB1q|;=MHNBOW|D&+r<|G-qg1PYAKxD47*xIeR2JJ-zF;2m zy`QtE`{~&;(V0^hyc$L(6ZtB>`LXN%aF#x&`C0MUSg>Jq(-rPtVPvKEjHMDZTi1R^ zc|Qw=wj9C*3~M_)&oByCh_r>tHH*4@7HcQvnsr`Cjz3)}T5_7fawz!=W=ZZ{*1O9B z!4Jy^T;fHWov0JkTCTioyi};dU_N~5sPd^IRMk&TY)+AZOI5b4yd#S$&-Q6npU_S|ETa`XucdLezK3ISZVp_hr57W> zZ)Cxq<~r@bpRFgYA<>aY8iXMh%8px%ZCrD3f7SVMlB*c@WFM+CU3{;hR+(5haQv3k z@`y!S#d(J7_MXfm4bMy7obi0+d(^)*g zJd-@Z@gDt0<8g_wtXJK-(M{OeKx3S7=KIq}^>QM>?)9tX(_sZT9l(LM8P)ur8? zZsKcar!2g-aBI0@b1DBt+Svt#m@6A!U)@+Do>U27nfz>*L~j0wqC~ifIKG12bL+O* z7^&=R6^HPbY`x1r=#sZtG(#}C+pc1{FD8x#lt)gFmP?C8u{ac}?L2sX-XxBl&hH?( z?HNV!=eFHCALU60G}cBQL6`Y%1eAO@m1T9DyxZ?=)}^e>M_K~UGBw4`H7atTWGUvHrB%D4T03zn9_ary`YS)<3j?z9=0g z`RKj@(PJvH5_0D=akECfDy*{@HjS(>4c^66e^0IpVjsGiSh@$hc$kGAys^A*jH$Wt*<=?F=TEbV(wv=x%XOv>iED0iKNP(?>!MdfA&j}PyExLVU028|WKsxZYu{;wZh7 zI!$fPZd|ZMV%h8Jv6iIN;iYP*+wA$}_6x@CFNOjW4?2Fyhn&1Za*a9U8iUL&%6<`# zZwV$x$X$PsF4yyMo;je)(;6%*c7Xm6jfNg+sA<2R-UA`M@R=txgP~uX0z9ZvF}xP5 zhHC^mL1{BvFK>;`mLCvz3ZFSR*yh~xjn={aH#PQ6n^Q#v{hczlRq`J?qYIojkCoBg zsc@_v8I}F|S^S0O=u7tEW8p8VrdEo2oIdtRzg$cdxcaAB=~`OuSmq}4PDhc^N+tQ9 z8q5?^t-I8Y+KII1F5y$wFI~=**gkrK8Q{@9$*rhXF;MuGLN5A5-1}QEzz@V2#BFt0 zPvyMOrnnJ&Sakj46&-`T{1Lk%F8Zhb+ma@tXr5XnmGh3f8*AJk%5J00B;Fao6%pSu*_3~r!!-*`4W9p&g(>kG; z@KCP{iS*e+XbZ^z3Qwu$S?InCB$u0mM{3A>|M>bc3&v``%X-s0JruhAJwS7{p;eR! zU4#60C1-b?%}w+QQMH>EhW*&vqzV*|1zZ-9F6^7p3B8+pL373U=(9it4#jqFPqS3Z zBa*q7%r50LKfl0J>cp?mCNb`xGK(pm6@d#rvN^m|4~=hs9ACT;TH2uYlcjgcne&U~ z916DdYdcfHez!lj&U*9XlU|2Sm+>3u%_k44VG-h;L;h8#C&iTrO~#qnC%;%&&aMyE z%_y4JJ!|Onob0_dn6s4`duP0RjVg7LA^BdKnTL<7vBzZ##vDeth?1=2^QDlpWevs+ zE7N52HC6AzvUGHM%x|Sh({Vb>Eefq(e&jA?944RKPvg{tzZ6d9q(Uq$6#)Uv@xPst zVT*GZBGVG0>qMu?tR5eDs+@6IJ>U>oH?ehLp!R5f=g`O^L>{- zJAVHBMvCr$#_6hA#krF|e8J=G%f*QL^8nAC{oNQH%#O%pBu6DOOO+ClV1~J|`pJm-U9#hL7@JG0@HP_Us z>Q+T|xrv;ATA^syeEbSk-tvi4Do5&87vdOSOC(1pQf9`lUXJbQHZ+c|Wjn<*QoG)N z+31DEM+a`xPp{dNncR+UR2k{kTnp?pZKWKfiSEv~uh4WN!}N+x%wHLz9aruwec_*( z9y+CIiqRt?3mi~S&G^mD8aO^0y?RNM@>EAvd4k0!{q~p4UyF|%q0sul@>A!EK4XRF z^6~N#71n&I@~rI}lG2AC4orVKt4nF=^q9vJI(Uhyx0G6;v+X)j+WF+6lEoey=jEIJ zQx-2d!?LO`zR7$+!DHj#`>;RKEkq8w(Od)YcBCCrw;6x5s@s}#jmUPrX~gh?9P8)7_29+ zJW})WnV{GA-->6&*uGG|+d5W9m6^VMulo-puf*uR;h_-5n)YMb$NOw(V%}WTy?2!p zx*^-AX<}W8(NQ?$iB72H=gMT!>h^o1J@c_IJY!PoR4UviH}>@bzoE?^GgYOc#@K|< z)dv)xsZ2V4PPJ?3eMZ;xaPxVJ!Tn~ZZ=&^jPH;wth)$M3)8P;vPtFF3hvz7ZH-#fY z%lJe)7)ID!uhjTRUJ}yDx)>`YDeWd{E(;lblfFvYb`b;a8J|+Dz9oM!iua{Vb5Z=w zr&%V!Q-({qvgNjQcw`I00V6Lvo zpd9bXuQ5E-A{P$6@c7^l4G8`)G7M51ZHFGuncdjqr&5&WK zm~Qb>eXYHl%9G;NgpH+iJmvWCp6K0(7q{-5o~is$U}WUMo4sspf0SiF_xZTIm%;H2 z!rGtuG2}855~lEi#&WyffR_I?`sG|ZRN(2(fwICzBO^?zEo@1lIG9^sG%QzXLboMF z{NtpGcLdX7b$|U^u`2hDq0*Htu{%$k=QARY-w8ac&2X2G$a+vzL)%s=!F%M>59Sl* z8u#Acz3IWlwUU9^Iy!d$a7MXS)x0{HdQ1%u-%-j)oi%kTsf{~iub-)9Sx9of z5fG|+DBl(R8$;#e1-i9cRfWIg#d>yhMP41Q^!0cAvGz&M_bxs0N3{&9Kx*-f2fk{8 z;3mx=Ys&5uK_eM6TG4BXrf-f+Te^%9`$qL2FsO5cZz!LPqqZDmVDoyOYAMSwr?>cG!HLiZ#M|m0S#&LY1tBO+`+}Zqw2AX1XGf~ zkY9Rc-VwR}2>bx10y)0-Gi0lZ^nSSPz)d^gYF%;4w>KpcwzqxT9G3N{!S?iafq_cYYt`tY!5DOJMjf#v+m6)Rp#l`Ez0 z!GC-lS%@Y5XTKhqko_^{wfx3XX+E`0RhP?$pxT0tRzKxv@B8}>R@TSt1u_@z4{&K? zzVMdcR7)z^kx{)f?UJQTdTIIU!+tBxW5iE5e6~yOXQp3D&!rVVq<7#-{W)818_RR1 z%54cG(pp+)FUv3KMU*FKL*{ih!Y|0|g3yU|3aVQAHdPGTPu)74p2S-uT|1JYN6*}y zBM?|_MB4Q-F&=!C)xjgmI+&~?_2%NS7$HoDF&fHgOksWQ^UG7NE;%|z zrKFDnzudj2f4>2>d0uGJmDv3{H@p0?0KIzQ>#n!ieyXu->2kDv z|3!m~Mv>L%i&3Q!@zM9=o!w%;8=p11!~5k^&L^FI&cy+%RVl*f(bIhuUc|cJVs$RL zvtzVY+D;g}?tT4@PNU*taZkB@MSUkdsoO>=)@|vF%}}XoI?rv^rlfnvN#?Ii+9e+@ za550Mn)>neqr`LMA|2LOXgRgry#n<8<0zaIuaJqX@_kye8R@65XN@#V;8XBu>lf{) z_}FRS_{^AF-|7evm0P6g?cC1v>LRBx5e~j&%#*W)ihiUr=Z20|iCcFMF_T{El{mBU z^o}?gGcRjWhHI||%Z;E==)?Va$xD3tChyN(l^U0tJtKDAg8uEs>*T@*_YZc(1m$SN z6+KQEx6B!MZpnk;qhD(Kob!|m?r_nSMY9lU8~ZuN&JFAI+VGYyeQ=oVb(HTuBx|rB zJ2sBVxW4hsI-Iz$Hvp?gj^3scf}eGYe4Ej<*vTVMLJyYl^@tVR*DzDlP4Cn2>`~Pi zD+>6ue*AWCCcSt}Q>fYV=Uf#zJAQN0F9NMUksbS(Q)MQsOzuhYKJ*2Dp@LNIwI9!y ztgML!&tF5c#cSxwWkSr%g$8utArf~LUs6qaVm=%`UwA`vsik$;!#EnEcXY5`I+vqU zWvv%>pdtO#MFQ)-@>}N5RvG1NKGARoqYhH1IvhT)y)bCoa{E|5QHEAS><8V3k5eBW z(JdG>hOh}P_Z|L{Rz0wq%x@@bc29~kQ`#dpGEQzdIq5a}clPzcL(kMRI#MKpv@S^+ zdxbp1l(sNb8jTF!lDsr}Ps}Oe>bp>j!mtX_qGZ@4p(ZIKE!p8Av{KY}fJ*w%k6e{k zSJUbT$Q@QsEsTRY{SZFy6QNIVh!$bnDDLqe*jy+=~(>*M}~ z76fPi%D%LgpFT_HwfE&V$0&~Ws@z9C#DZQtJNRd zTqtJ5gpnCu%5!Un>y7PCGFGd+4ewN+Q`c!2NsnhKDqi3o=h2#0dHa=b&_S1fdHP-A zgUc;;)x5e~CT?FdC9Cq?fSQyXR$%8UhWg=@zbeX zk%8xhT|GN;jD{SZ_!yN!6QsAu;#(Ovl=!`QhBRdMVAL7yJKIUzzWhe+ zyuRA=vNQ%323^^<*L!>nBy;#}zb@K7i!9*Z$*=xtA(f;#z?yxr;Icdkk&>@C_v_lE zvdNal+ZeNG#*x_aejn&khgHej#@9Bi!IkT)@#pGJ*4>>n@0}E4^I)qvtun)1uyyU5 z%^NkN%8Z*_&bMm2XIp*|9p>8nI(~1RDEXCNu=g2SuOSDE_57uE&y~|dFRZ;c*r*%Y zo=U3?f4iR)_RggEao_An(Cgu1x73n0FV}~+1em}Po?`X{iQ%VGU*}`7*Ts{9>nRRl z>6+yew9ji_9dO!sJ&-wa;tm!~$$1RRY$rw8VWX2%n(vHW-MKuq^(Algjf`nob4%+| z_QHp}RP@T-qQd0xEW#+chKK($1uOg?r)OV#~_zuvc#0?9tc$ z&NjreeVQyM**|8+FkUc7(0hX7f&9y(^L1T?sWT_Y-&e!l_tj)qR|TdW>xs&`ncUEP zkG0DVg#Xf96tD}V&649k*_@S3WHzB=ms8JsNjvq60w%CIwR?a}y6JP|zo%{4PGHG z7vIf1Z_YuhWP~Ic)pXXIpB@SP<}Gm}=*mkmHJaPy!UH|yM>e(I2)}Gf92M~cKS@N! zld{PB-bUCQQ@!y>#51{oXtrNEm~dvbX^^Al+abl^q#45!StoZcggjwUCk zt`owN{#Yz*JUjC}g(PG1lg!ITIxCSELNn1>l@j;aBBnFfyX&Rj)~Ma`5?E^)&)m!# z-9BXP=|vNM^MP$mDtNvIN>y#`7+QV8PUMwPT0OSO854Q{<4Bq5d6KoF(D0>AtE-x? zV5FP0u#}(Dn%@q(I?by(1YLdOZnbjwsfc5~a+jKUs&CR)q3aF_)BfZTm53m6`AMQf zQ?YfiweNZ3sY?=6xoF#w_q8jRKeWwzx_7=0*Kdc7N>+}i804z!PCS|9cTnC=traFB zX}D4t@M0aKBX>z5*quB^cQRYEfhw?qZjR;fD;*bG%X+tNPovrLB=1)O^PJfx;x^6h zOkOZmS$qtiP#Zzkdls?ZL2I7AOo2f+&lfR%mpB>IY{DYrpd3Fx=!yr@qn`rKB7E;@sSs z`)$SKLwu9WOb%w7Yjom_r5DCjM}VOsK9VXHvII^JV^>U=A~xr9}iYR|JyC3C&@YDU0qDt3Xf|Pppb31BQ)q2Ge*gA!ChxUf`-jY`ns`*Jq#Bbju81DlUtw)oz!d z++i(tO1f#b{k!~S(9u~cy@6rOi-1gN7mJl^B1fP4aI&a)^~gQ>U3^IO)wJe{MkINW zXyDFwtJZ0K=>_w&#wGQ@l0ODg_UY+HxlTFfda&1xwGVi`Js2ut+nTeEQD&|Bdc1&5 z&*s542gdGM)*+ihVO0$p&n&lkZH1nw;r{$;x--^(3>+pJ9Dj%#DCsx8CEbA9f1y7a z@^obZUVm#3JIwm&f$+nhPdK$#6R0 zscaM))}}*I0QowEQh5nPRJkz9gxE;=Gfay6fW1qKazT_}LCCy_qgW;y6g%DnoEj`p za|Q7iUeN}BRxzS95O1)+n^_bc(DHXa;-2Uw6st0L5Ee(HsIh!(C`-KK>CPZ6=LSjP z^Zn2PIISN-W81k<;rQqgXY+(ml<=tmh#rpRL6ssd19SXv`~buVpR-1hV#5!iqVaC= z@T1lcL|6%MNK60~hNpuV`Qh9_h#FoMM5QALTxPLA_cc5MH$3p73h+%_1a%*89)y9$ zc8Q`oh!Kf2Y1A<81J?T(N&=C>7RaKE@bah*kXInj0UsTPXt7sLplI-^`OCnjDxli& z8MRkJnc~H8;bVbVFp^;0Frr~#ks3}@L$xAS_i~`5g`&i!sG|b$-gQTTm;j9tzM+XK zL$Dxxek>s6KQ&8|M^7;F9e|Qg^kNC zUXpeid|JAXszSu40{@{iz`EwZk<|yNnEwd`=AMCQ;qo9<79s^kpC3nJ!KMYHxbfJ( zj=)_r5EZ-;ih75`Vqb@$i1DMpXG>rfVuOE2qPh_T$SOD9ae(EACuSigSTqJzgqQ;5 zfskmh2V+r6|7$ApBg6nl#i23~?BBSt*Wyv3h{{;7DwQUnjv#_qu|!k~UIj8|=aW(6 z$e+katV%!>a7qS>9Q!>D<@Zk}!v;|lSin%hPkbP{fUF@&oO6@H5{!81V8(C|Ap;4)xP!^&TPs`huNM7%288U#~y1F?uNAe&FBQD2Y@Aw!V* z9#5x%%ig1a12w2dL?`xf9f}^2$AbBA6i=IKM77{`f~w?$(QROkjJ2Sc@LqsIKx3)f zP^)+_h-$Zlkwp+V;Eu=P>|%jk{F;qD+lLay*Mu$&P^z#B(ZHU4U};NVfrznXgQy%l z7t!J~f;zRQ1xCCF66{!LY}avQ$;F4e3RGct#!*!ND*+hnSe;4KGM=%QKJ7J#4eL9N zVmXXt2t>|@eMbiEE_+}Q`C#xT1wL1P6i_5S8_0x02Ikc|7#K}z2tqVtK}6#CB!Yy2 z11p#VFfL6nND~EClmX({oekMQbLCfv0ek--6oAM5Rf-j3fn4!8oTpeY(A0PcQaBNO z5DDD90UT%KfadXbcQ~QLc!|B50XS-`!69h3BL54T9$xtde9qy6cJ}g&&mWgC$lsVC z#D=%_w_dP-aUCD|Um6T(r0}2bK-D`Ds0=RwYKZSIgBnie19e#?1~DOqaPtfc=2`l# zCR_@tj)B#pUK;8{GKF8Kq`}J4ehlKk=W$UM3c@SLt$)}kIp_xo4vd@IFy&>44363Y zah9tE0coe*0ZOdwp=0=i z8pzuyB98^~#>g=m3zkEEWXXyz1S)|PE%u}zGId&BbeMX!?JVi(p6;Kd9AxN%Yy@RF?;5Mo7qgtqn z3Oob$>ffiP!X|alF>b)S`tNf(agR&gd!0kYI)mLoOC2OkvI=&=rjGV-;U*Y*+Iol+ zB?^nzL#H7(!q`F`rr3N!GPq(BqT~kIxtjUU6C@Aq=>wmt@#rl=8jf8X(6ZoKkEN|m<0HS_McY`B@jZxEe#Mo zqW<3pC2;?PBOvfTh#(moAtnU*@6W#R?L+=%#vx;^&{VKv<8D^|{jC(%Sezy8lK|ND)%*gqx- z2t;*p@RLZA_P%5yAQ0b&dTfX&h09wYMJVJZFv%3VYD)`qweCjs?`gWoKG87*4V$z= z{D_f%Pt>IMA^+In^x}}@u@iTg;Sr!5nG>H|AvU%HP6Pzjrj8C`P7ap;79?)caJNBh zP?$5U&<33(@p2&`aCEW!TmQ6hb{j-ZQHCdro0?l7EX0{5zAD8D@RSWfa9Q=iea>vT zz~9;+K4jHqZwKnx-DAfvEZ{=yeRBae!SM=j!#?d0AEL6~r`e|$OhFZJD+c#Im5iQn zO*f4-F_!!x6@0VF> z9}A~;?51@#wnfw$m~{b4_m^ybNvuOPe_Svje#Wcj<))!PxHG`N{ZrDi3;++tD%R1# z*E@F&+jIgu6&11Gjcl;N_AapyM_jLlJ3AqMV_Z3^eHi>X0gUqkowWO+nW{qu1DADi z-HZ4~(f&^gucl~q)Z7Mx;0848&&5t7tk(sJ;v?Ue%@^6PxY$zt&DL0(jy}Qn2 z9`p3@1RfFs3;SnyfA=07oR8yIy?S)kkuLx~2H>amr6aTFFFe+7OmHs-s?EmYa!?B) zO#eH4JAHd1BNJqBIao-LgtWW|2_YN*kIMj4_v~^wdI0Auo&)QGKM=exG06UK@^gk9d#Ag^;=W0C|IKk4yy{_d$$2xFWkro=+SD zysY^@gK&*{R{%5|7~zV(-88h~lqu8h@u*?)en^rqk`V>#aiKV2qyAl_T|YpM;>k?7 z&V(vtauA;FhXfI?Xa+#$au33O1JEH@2ec=UOt_T}n&F;HnGLeBe<4p~#zAEeS@0ll zHbO^M6fD7yl7P7;AW9?{zuP7Z>OdF`geCW--INW%9)V2;Ax6Yd=15gbAiz8U??d~r z6r6DS5X20>7~HMA)i880FHnnHTKM)sr*@&+gTNo$l7jvKg1W+kQ@{d)MhFdT^x?mB z;8+KE|FX#7+z${VB2|N9EeYXS-#_fGMr=cX+A55r3c@Bs5I5p?nNp$U4=`XoV8G<} zIkO{zgK8ie7jd%2;y8jReC`B_99ACQ^+R_Uuu3KIYSR>ei(^B(Wk|Wy@qr2i>I?!s zvQKw~G!B0l{yq$WN0);@DMr9{p9fCE`KCLvo714;HKsHm*9PAEXLRF9oIDGzD?A(2N3}o6;VS0oSG>Mg|-4z!nFvQr-iw!MOvw zid%3z1=T$s1#e@0Q^xy0Ftode`H@AnNkxWbHH!Lc75r@k*jrf$!XVs zCQndvh#TDFfOq~HQeI5>){p$`uH0Q5&%$7rmp={(AZ5xVT%{WYQuG?Ug~5C8d~(;Q;v@hZvD^cY!FMNj1B=A*&e{CS0}Us9R*(=sMr>s#fw+3Xn|m)l z@X6rzt`yT0#DYY3bP6a_y|YUO9VrG_`^)Z(UKX0(j0IAa;JrUOde2<}(60I?Rbx11 zzyITbz7;>>kH!5aDne0j}I~YCt+171?U(A@BLGP)_)g^w7&l8NuB|EpnH2f9%R}xwtrJB1v<#V z)ZZTf#RHgj7E(Y`c^>r0AkILT`y<2-Z%2W3J7sovIP-8Um4`SMKfDYolnb}~6Y^6K zaDcpIgVkjJj6Vt&PJ=}dG}dU~Gaq*sD#MRJNp=WM2{Rn^5#mIw76K~az0h5kK^yHL z{PQCuOt>6|f(u|23#>G^>x9l6kUtg<+s^IoKav1}&^rtGyQxByyMxW*i8wZ403iC5}B zMhj+14A`FRucfB=zj)^O#s4PVC*Z4iGLCZ)CVmE5x(@5R>!bv^L(wuYM+q$N&l+1c z4$q8h>(L^Xkpzw4RNZ>^mxVuC%P#C4*Kk>)(o#2TfhVb=qCle|=tR#973A9(R~|2Z*c*WNZIw z!A}1_Quv1UPn^bcjC(w4_$U|Hz70c!_?6=3HvqWJ{4ap&2Skrp+eGIbm<5(7D8L%9 zFPCNLJps1Axj%JK`0h5qmHeM#+2q*8<2uZH;b@;ID&z;*tolC-j0V@90Q+A9Dbd<; zsX+M&uvqRtcDC{C;gPO1HxhwDbb9+XFt7xU6f*lFXypAL0erXmuPK87^%u54QVF=m zyHAq;@UG;x1UNJ_|JW_OZ@*{Par;1G;NSiwdP-EFurV%V)q5?Qdhl1dyS0McC&j zbQ00`7DuR6#SysSt)CD(vcw6cmez8EvZ(@dWPj?q&*Gq5FleO{@2R!k23k}!@vN-v z-5ttX9F^%JJhTlRLDV{GP|c}=e zza8L0hxPvfY<%3EsW(lQY`cLU4q&G4-w}y9{f`v>^j7Q-(0IjtkH?M}!r;g|o(P#8 z9=#7%ip~GpT9Y`QxHrN(8YhNdKjIV!!TFgVLga)wLLpk*Q45)SzVUhSfuIbUKp7m} zmmA#&5KI>ZNg%orEQh?=`ZM4^ANl`IY^h)bD*&@Sg2?|K5%p1todh7~g5Xgl-1~IP zM!-%eLVUSrpn!7^;t}WA;9>CX1rp>Mj(jW~A%ou*eF0j-xc&{oQ-%OfCwrGCPzb(U z{d1qq|HZojL26PF!<_%YHuxFzyXdF{0rbGB*Y(HPY?p$Y|$Q%6Y1TC12X?K m79w!EX=*EGZ)$JucJsUz5l9&UK`r>VqeMV(s|*wj!T$qR)Dsy1 diff --git a/src/main/java/net/montoyo/wd/WebDisplays.java b/src/main/java/net/montoyo/wd/WebDisplays.java index d4bb46c..e3d1edb 100644 --- a/src/main/java/net/montoyo/wd/WebDisplays.java +++ b/src/main/java/net/montoyo/wd/WebDisplays.java @@ -169,12 +169,12 @@ public class WebDisplays { } public void onRegisterSounds() { - registerSound("keyboard_type"); - registerSound( "upgrade_add"); - registerSound( "upgrade_del"); - registerSound("screencfg_open"); - registerSound("server"); - registerSound("ironic"); + soundTyping = registerSound("keyboard_type"); + soundUpgradeAdd = registerSound( "upgrade_add"); + soundUpgradeDel = registerSound( "upgrade_del"); + soundScreenCfg = registerSound("screencfg_open"); + soundServer = registerSound("server"); + soundIronic = registerSound("ironic"); } ArrayList> serverStartedDimensions = new ArrayList<>(); @@ -377,11 +377,12 @@ public class WebDisplays { public static DeferredRegister SOUNDS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, "webdisplays"); - private static void registerSound(String resName) { + private static SoundEvent registerSound(String resName) { ResourceLocation resLoc = new ResourceLocation("webdisplays", resName); SoundEvent ret = SoundEvent.createVariableRangeEvent(resLoc); SOUNDS.register(resName, () -> ret); + return ret; } private static void registerTrigger(Criterion ... criteria) { diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index b4f3705..06fab8f 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -138,12 +138,11 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS return; if (!LaserPointerRenderer.isOn()) { - RenderSystem.setShaderTexture(0, new ResourceLocation( - "webdisplays:textures/gui/cursors.png" - )); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); - -// blit(poseStack, (screenWidth - 15) / 2, (screenHeight - 15) / 2, 240, 240, 15, 15, offset); + + poseStack.blit(new ResourceLocation( + "webdisplays:textures/gui/cursors.png" + ), (screenWidth - 15) / 2, (screenHeight - 15) / 2, offset, 240, 240, 15, 15, 256, 256); ci.cancel(); return; } @@ -154,9 +153,16 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS BlockPos bpos = result.getBlockPos(); - if (result.getType() != HitResult.Type.BLOCK || mc.level.getBlockState(bpos).getBlock() != BlockInit.blockScreen.get()) + if (result.getType() != HitResult.Type.BLOCK || mc.level.getBlockState(bpos).getBlock() != BlockInit.blockScreen.get()) { + RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + + poseStack.blit(new ResourceLocation( + "webdisplays:textures/gui/cursors.png" + ), (screenWidth - 15) / 2, (screenHeight - 15) / 2, offset, 240, 240, 15, 15, 256, 256); + ci.cancel(); return; - + } + Vector3i pos = new Vector3i(result.getBlockPos()); BlockSide side = BlockSide.values()[result.getDirection().ordinal()]; @@ -166,19 +172,17 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS TileEntityScreen.Screen sc = te.getScreen(side); if (sc == null) return; -// if (sc.mouseType == 1) return; - + int coordX = sc.mouseType * 15; int coordY = coordX / 256; coordX -= coordY * 256; - RenderSystem.setShaderTexture(0, new ResourceLocation( - "webdisplays:textures/gui/cursors.png" - )); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.ONE_MINUS_DST_COLOR, GlStateManager.DestFactor.ONE_MINUS_SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); - -// blit(poseStack, (screenWidth - 15) / 2, (screenHeight - 15) / 2, coordX, coordY, 15, 15, offset); - + + poseStack.blit(new ResourceLocation( + "webdisplays:textures/gui/cursors.png" + ), (screenWidth - 15) / 2, (screenHeight - 15) / 2, offset, coordX, coordY, 15, 15, 256, 256); + ci.cancel(); } diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java index 6f6c23d..4a2e71c 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java @@ -96,8 +96,8 @@ public class GuiServer extends WDScreen { } @Override - public void render(GuiGraphics poseStack, int mouseX, int mouseY, float ptt) { - super.render(poseStack, mouseX, mouseY, ptt); + public void render(GuiGraphics graphics, int mouseX, int mouseY, float ptt) { + super.render(graphics, mouseX, mouseY, ptt); int x = (width - 256) / 2; int y = (height - 176) / 2; @@ -105,27 +105,27 @@ public class GuiServer extends WDScreen { // RenderSystem.enableTexture(); RenderSystem.setShaderTexture(0, BG_IMAGE); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); -// blit(poseStack, x, y, 0, 0, 256, 176); - + graphics.blit(BG_IMAGE, x, y, 0, 0, 256, 256); + x += 18; y += 18; for (int i = 0; i < lines.size(); i++) { if (selectedLine == i) { drawWhiteQuad(x - 1, y - 2, font.width(lines.get(i)) + 1, 12); - poseStack.drawString(Minecraft.getInstance().font, lines.get(i), x, y, 0xFF129700, false); + graphics.drawString(Minecraft.getInstance().font, lines.get(i), x, y, 0xFF129700, false); } else - poseStack.drawString(Minecraft.getInstance().font, lines.get(i), x, y, 0xFFFFFFFF, false); + graphics.drawString(Minecraft.getInstance().font, lines.get(i), x, y, 0xFFFFFFFF, false); y += 12; } if (!promptLocked) { if (queue.isEmpty()) { - x = poseStack.drawString(Minecraft.getInstance().font, userPrompt, x, y, 0xFFFFFFFF, false); - x = poseStack.drawString(Minecraft.getInstance().font, prompt, x, y, 0xFFFFFFFF, false); + x = graphics.drawString(Minecraft.getInstance().font, userPrompt, x, y, 0xFFFFFFFF, false); + x = graphics.drawString(Minecraft.getInstance().font, prompt, x, y, 0xFFFFFFFF, false); } else { - x = poseStack.drawString(Minecraft.getInstance().font, tr("press_for_more"), x, y, 0xFFFFFFFF, false); + x = graphics.drawString(Minecraft.getInstance().font, tr("press_for_more"), x, y, 0xFFFFFFFF, false); } } @@ -137,7 +137,7 @@ public class GuiServer extends WDScreen { RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); RenderSystem.setShaderTexture(0, FG_IMAGE); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); -// blit(poseStack,(width - 256) / 2, (height - 176) / 2, 0, 0, 256, 176); +// blit(graphics,(width - 256) / 2, (height - 176) / 2, 0, 0, 256, 176); } private void drawWhiteQuad(int x, int y, int w, int h) { diff --git a/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java b/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java index f06fc89..8ff2535 100644 --- a/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java +++ b/src/main/java/net/montoyo/wd/client/gui/RenderRecipe.java @@ -100,15 +100,15 @@ public class RenderRecipe extends Screen { int x = this.x + 30 + sx * 18; int y = this.y + 17 + sy * 18; -// renderItem.renderAndDecorateItem(minecraft.player, is, x, y, 0); -// renderItem.renderGuiItemDecorations(font, is, x, y, null); + context.renderItem(is, x, y); + context.renderItemDecorations(font, is, x, y); } } } if(recipeResult != null) { -// renderItem.renderAndDecorateItem(minecraft.player, recipeResult, x + 124, y + 35, 0); -// renderItem.renderGuiItemDecorations(font, recipeResult, x + 124, y + 35, null); + context.renderItem(recipeResult, x, y); + context.renderItemDecorations(font, recipeResult, x, y); } // GlStateManager.enableLighting(); diff --git a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java index 7c6842a..e2e4cf3 100644 --- a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java +++ b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java @@ -7,6 +7,7 @@ package net.montoyo.wd.client.gui; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -116,6 +117,8 @@ public abstract class WDScreen extends Screen { if(defaultBackground) renderBackground(poseStack); + RenderSystem.setShaderColor(1.f, 1.f, 1.f, 1.f); + for(Control ctrl: controls) ctrl.draw(poseStack, mouseX, mouseY, ptt); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/CheckBox.java b/src/main/java/net/montoyo/wd/client/gui/controls/CheckBox.java index 98aefc1..0d14ca1 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/CheckBox.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/CheckBox.java @@ -9,6 +9,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; @@ -81,12 +82,11 @@ public class CheckBox extends BasicControl { if(visible) { // GlStateManager.disableAlpha(); poseStack.pose().pushPose(); - RenderSystem.setShaderTexture(2, checked ? texChecked : texUnchecked); - RenderSystem.bindTexture(2); RenderSystem.enableBlend(); - fillTexturedRect(poseStack.pose(), x, y, WIDTH, HEIGHT, 0.0, 0.0, 1.0, 1.0); + poseStack.blit( + checked ? texChecked : texUnchecked, x, y, 0, 0, 0, WIDTH, HEIGHT, WIDTH, HEIGHT + ); RenderSystem.disableBlend(); - RenderSystem.bindTexture(-1); poseStack.pose().popPose(); boolean inside = (!disabled && mouseX >= x && mouseX <= x + WIDTH + 2 + labelW && mouseY >= y && mouseY < y + HEIGHT); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/Control.java b/src/main/java/net/montoyo/wd/client/gui/controls/Control.java index 589a415..d8da990 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/Control.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/Control.java @@ -11,6 +11,10 @@ import com.mojang.blaze3d.vertex.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.client.resources.language.I18n; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -20,6 +24,9 @@ import net.montoyo.wd.client.gui.loading.JsonOWrapper; import net.montoyo.wd.utilities.Bounds; import org.joml.Matrix4f; +import java.util.Arrays; + +import static com.mojang.math.Axis.XP; import static org.lwjgl.opengl.GL11.*; @OnlyIn(Dist.CLIENT) @@ -109,7 +116,7 @@ public abstract class Control { public abstract int getHeight(); public abstract void setPos(int x, int y); - public void fillRect(int x, double y, int w, int h, int color) { + public void fillRect(MultiBufferSource.BufferSource source, int x, double y, int w, int h, int color) { double x1 = (double) x; double y1 = (double) y; double x2 = (double) (x + w); @@ -119,34 +126,38 @@ public abstract class Control { int g = (color >> 8 ) & 0xFF; int b = color & 0xFF; - RenderSystem.setShaderColor(((float) r) / 255.f, ((float) g) / 255.f, ((float) b) / 255.f, ((float) a) / 255.f); + float[] sdrCol = Arrays.copyOf(RenderSystem.getShaderColor(), 4); + RenderSystem.setShaderColor(1, 1, 1, 1f); // RenderSystem.disableTexture(); RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - vBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); - vBuffer.vertex(x1, y2, 0.0).endVertex(); - vBuffer.vertex(x2, y2, 0.0).endVertex(); - vBuffer.vertex(x2, y1, 0.0).endVertex(); - vBuffer.vertex(x1, y1, 0.0).endVertex(); - tessellator.end(); + VertexConsumer consumer = source.getBuffer(RenderType.gui()); + consumer.vertex(x1, y2, 0.0).color(r, g, b, a).endVertex(); + consumer.vertex(x2, y2, 0.0).color(r, g, b, a).endVertex(); + consumer.vertex(x2, y1, 0.0).color(r, g, b, a).endVertex(); + consumer.vertex(x1, y1, 0.0).color(r, g, b, a).endVertex(); + + RenderSystem.setShaderColor(sdrCol[0], sdrCol[1], sdrCol[2], sdrCol[3]); RenderSystem.disableBlend(); // RenderSystem.enableTexture(); } public void fillTexturedRect(PoseStack poseStack, int x, int y, int w, int h, double u1, double v1, double u2, double v2) { - double x1 = (double) x; - double y1 = (double) y; - double x2 = (double) (x + w); - double y2 = (double) (y + h); + float x1 = x; + float y1 = y; + float x2 = (x + w); + float y2 = (y + h); - vBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); - vBuffer.vertex(x1, y2, 0.0).uv((float) u1, (float) v2).color(255, 255, 255, 255).endVertex(); - vBuffer.vertex(x2, y2, 0.0).uv((float) u2, (float) v2).color(255, 255, 255, 255).endVertex(); - vBuffer.vertex(x2, y1, 0.0).uv((float) u2, (float) v1).color(255, 255, 255, 255).endVertex(); - vBuffer.vertex(x1, y1, 0.0).uv((float) u1, (float) v1).color(255, 255, 255, 255).endVertex(); - tessellator.end(); + RenderSystem.setShader(GameRenderer::getPositionColorTexShader); + Matrix4f p = poseStack.last().pose(); + vBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX); + vBuffer.vertex(p, x1, y2, 0.0f).color(255, 255, 255, 255).uv((float) u1, (float) v2).endVertex(); + vBuffer.vertex(p, x2, y2, 0.0f).color(255, 255, 255, 255).uv((float) u2, (float) v2).endVertex(); + vBuffer.vertex(p, x2, y1, 0.0f).color(255, 255, 255, 255).uv((float) u2, (float) v1).endVertex(); + vBuffer.vertex(p, x1, y1, 0.0f).color(255, 255, 255, 255).uv((float) u1, (float) v1).endVertex(); + BufferUploader.drawWithShader(vBuffer.end()); } public static void blend(boolean enable) { @@ -178,6 +189,7 @@ public abstract class Control { int g = (color >> 8 ) & 0xFF; int b = color & 0xFF; + float[] sdrCol = Arrays.copyOf(RenderSystem.getShaderColor(), 4); RenderSystem.setShaderColor(((float) r) / 255.f, ((float) g) / 255.f, ((float) b) / 255.f, ((float) a) / 255.f); // RenderSystem.enableTexture(); RenderSystem.enableBlend(); @@ -209,13 +221,15 @@ public abstract class Control { vBuffer.vertex(x2 - sz, y1, 0.0).endVertex(); tessellator.end(); + RenderSystem.setShaderColor(sdrCol[0], sdrCol[1], sdrCol[2], sdrCol[3]); + RenderSystem.disableBlend(); // RenderSystem.enableTexture(); } public GuiGraphics beginFramebuffer(RenderTarget fbo, float vpW, float vpH) { GuiGraphics tmpGraphics = new GuiGraphics(Minecraft.getInstance(), Minecraft.getInstance().renderBuffers().bufferSource()); - + fbo.bindWrite(true); RenderSystem.backupProjectionMatrix(); @@ -226,7 +240,10 @@ public abstract class Control { PoseStack poseStack = tmpGraphics.pose(); poseStack.pushPose(); poseStack.setIdentity(); -// poseStack.mulPose(Vector3f.XP.rotationDegrees(180.0f)); + poseStack.mulPose(XP.rotationDegrees(180.0f)); + RenderSystem.getModelViewStack().pushPose(); + RenderSystem.getModelViewStack().last().pose().set(poseStack.last().pose()); + RenderSystem.getModelViewStack().last().normal().set(poseStack.last().normal()); RenderSystem.applyModelViewMatrix(); if(!fbo.useDepth) @@ -243,6 +260,7 @@ public abstract class Control { RenderSystem.colorMask(true, true, true, true); RenderSystem.restoreProjectionMatrix(); poseStack.pose().popPose(); + RenderSystem.getModelViewStack().popPose(); RenderSystem.applyModelViewMatrix(); fbo.unbindWrite(); mc.getMainRenderTarget().bindWrite(true); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java index e8425f2..bc73c4c 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java @@ -15,6 +15,8 @@ import net.montoyo.wd.client.gui.loading.JsonOWrapper; import net.montoyo.wd.utilities.Bounds; import org.lwjgl.opengl.GL11; +import java.util.Arrays; + import static org.lwjgl.opengl.GL11.*; public class ControlGroup extends Container { @@ -102,6 +104,7 @@ public class ControlGroup extends Container { if(visible) { poseStack.pose().pushPose(); + float[] sdrCol = Arrays.copyOf(RenderSystem.getShaderColor(), 4); RenderSystem.setShaderColor(0.5f, 0.5f, 0.5f, 1.f); // RenderSystem.disableTexture(); RenderSystem.enableBlend(); @@ -161,6 +164,8 @@ public class ControlGroup extends Container { vBuffer.vertex(x2 - 1.0, y1, 0.0).endVertex(); tessellator.end(); + RenderSystem.setShaderColor(sdrCol[0], sdrCol[1], sdrCol[2], sdrCol[3]); + RenderSystem.disableBlend(); // RenderSystem.enableTexture(); poseStack.pose().popPose(); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/List.java b/src/main/java/net/montoyo/wd/client/gui/controls/List.java index b707751..b2e6764 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/List.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/List.java @@ -10,12 +10,16 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.MultiBufferSource; import net.montoyo.wd.client.gui.loading.JsonOWrapper; +import org.lwjgl.opengl.GL; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; import java.util.ArrayList; -import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; -import static org.lwjgl.opengl.GL11.GL_NEAREST; +import static org.lwjgl.opengl.GL11.*; public class List extends BasicControl { @@ -97,19 +101,20 @@ public class List extends BasicControl { if(fbo != null) fbo.destroyBuffers(); - fbo = new TextureTarget(parent.screen2DisplayX(width), parent.screen2DisplayY(height), false, Minecraft.ON_OSX); + fbo = new TextureTarget(parent.screen2DisplayX(width), parent.screen2DisplayY(height), true, Minecraft.ON_OSX); fbo.setFilterMode(GL_NEAREST); - fbo.bindWrite(false); + fbo.bindWrite(true); RenderSystem.clearColor(0.0f, 0.0f, 0.0f, 1.f); //Set alpha to 1 RenderSystem.clearDepth(GL_COLOR_BUFFER_BIT); fbo.unbindWrite(); update = true; } - private void renderToFBO() { - GuiGraphics poseStack = beginFramebuffer(fbo, width, height); - poseStack.pose().pushPose(); - fillRect(0, 0, width, height, COLOR_BLACK); + private void renderToFBO(MultiBufferSource.BufferSource source) { + GuiGraphics graphics = beginFramebuffer(fbo, width, height); + GL11.glColorMask(true, true, true, true); + RenderSystem.applyModelViewMatrix(); + graphics.fill(0, 0, width, height, COLOR_BLACK); RenderSystem.setShaderColor(1.f, 1.f, 1.f, 1.f); int offset = 4 - getYOffset(); @@ -121,13 +126,15 @@ public class List extends BasicControl { break; int color = (i == selected) ? selColor : COLOR_WHITE; - poseStack.drawString(font, content.get(i).text, 4, i * 12 + offset, color); + graphics.drawString(font, content.get(i).text, 4, i * 12 + offset, color); } } - drawBorder(poseStack, 0, 0, width, height, 0xFF808080); - endFramebuffer(poseStack, fbo); - poseStack.pose().popPose(); + graphics.renderOutline(0, 0, width, height, 0xFF808080); + RenderSystem.clearColor(0.0f, 0.0f, 0.0f, 1.f); //Set alpha to 1 + RenderSystem.clearDepth(GL_COLOR_BUFFER_BIT); + graphics.flush(); + endFramebuffer(graphics, fbo); } @Override @@ -312,19 +319,18 @@ public class List extends BasicControl { } @Override - public void draw(GuiGraphics poseStack, int mouseX, int mouseY, float ptt) { + public void draw(GuiGraphics graphics, int mouseX, int mouseY, float ptt) { if(visible) { - if(update) { - renderToFBO(); +// if(update) { + renderToFBO(graphics.bufferSource()); update = false; - } +// } - fbo.bindRead(); //TODO: Make sure is right + RenderSystem.setShaderTexture(0, fbo.getColorTextureId()); RenderSystem.setShaderColor(1.f, 1.f, 1.f, 1.f); - fillTexturedRect(poseStack.pose(), x, y, width, height, 0.0, 1.0, 1.0, 0.0); - fbo.unbindRead(); + fillTexturedRect(graphics.pose(), x, y, width, height, 0.0, 1.0, 1.0, 0.0); - fillRect(x + width - 5, y + 1 + scrollPos, 4, scrollSize, (scrolling || isInScrollbar(mouseX, mouseY)) ? 0xFF202020 : 0xFF404040); + fillRect(graphics.bufferSource(), x + width - 5, y + 1 + scrollPos, 4, scrollSize, (scrolling || isInScrollbar(mouseX, mouseY)) ? 0xFF202020 : 0xFF404040); } } diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/UpgradeGroup.java b/src/main/java/net/montoyo/wd/client/gui/controls/UpgradeGroup.java index 8f54a08..6780e13 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/UpgradeGroup.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/UpgradeGroup.java @@ -7,6 +7,7 @@ package net.montoyo.wd.client.gui.controls; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.world.item.ItemStack; import net.montoyo.wd.client.gui.loading.JsonOWrapper; @@ -33,10 +34,10 @@ public class UpgradeGroup extends BasicControl { for(ItemStack is: upgrades) { if(is == overStack && !disabled) - fillRect(x, y, 16, 16, 0x80FF0000); + fillRect(poseStack.bufferSource(), x, y, 16, 16, 0x80FF0000); -// renderItem.renderAndDecorateItem(mc.player, is, x, y, 0); -// renderItem.renderAndDecorateItem(is, font.lineHeight, x, y); //TODO is lineHeight right? + poseStack.renderItem(is, x, y); + poseStack.renderItemDecorations(font, is, x, y); x += 18; } } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index 368a467..24ce5d4 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -6,6 +6,7 @@ package net.montoyo.wd.entity; import com.cinemamod.mcef.MCEF; import com.cinemamod.mcef.MCEFBrowser; +import com.cinemamod.mcef.MCEFCursorChangeListener; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -233,7 +234,7 @@ public class TileEntityScreen extends BlockEntity { else mcefBrowser.resize(resolution.x, resolution.y); - mcefBrowser.setCursorChangeListener((type) -> mouseType = type); + mcefBrowser.setCursorChangeListener((MCEFCursorChangeListener) (type) -> mouseType = type); } doTurnOnAnim = doAnim; From 3548b5806c669b128198dc252fbc81d05b2f3607 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Wed, 27 Sep 2023 15:04:52 -0400 Subject: [PATCH 2/3] fix some bugs with text fields --- .../net/montoyo/wd/client/gui/WDScreen.java | 13 +++++++++++- .../wd/client/gui/controls/Container.java | 6 ++++++ .../wd/client/gui/controls/Control.java | 3 +++ .../wd/client/gui/controls/ControlGroup.java | 7 +++++++ .../montoyo/wd/client/gui/controls/List.java | 7 +++---- .../wd/client/gui/controls/TextField.java | 20 ++++++++++++++----- 6 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java index e2e4cf3..1a1740e 100644 --- a/src/main/java/net/montoyo/wd/client/gui/WDScreen.java +++ b/src/main/java/net/montoyo/wd/client/gui/WDScreen.java @@ -140,9 +140,20 @@ public abstract class WDScreen extends Screen { public boolean mouseClicked(double mouseX, double mouseY, int button) { boolean clicked = false; + Control clickedEl = null; for(Control ctrl: controls) { clicked = ctrl.mouseClicked(mouseX, mouseY, button); - if (clicked) break; // don't assume the compiler will optimize stuff + if (clicked) { + clickedEl = ctrl; + break; // don't assume the compiler will optimize stuff + } + } + + if (clicked) { + for (Control control : controls) { + if (control != clickedEl) + control.unfocus(); + } } return clicked; diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/Container.java b/src/main/java/net/montoyo/wd/client/gui/controls/Container.java index 488f284..e6b33c7 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/Container.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/Container.java @@ -189,4 +189,10 @@ public abstract class Container extends BasicControl { return null; } + @Override + public void unfocus() { + for (Control control : childs) { + control.unfocus(); + } + } } diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/Control.java b/src/main/java/net/montoyo/wd/client/gui/controls/Control.java index d8da990..1d973a1 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/Control.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/Control.java @@ -81,6 +81,9 @@ public abstract class Control { return false; } + public void unfocus() { + } + public boolean mouseReleased(double mouseX, double mouseY, int state) { return false; } diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java index bc73c4c..ea162f3 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java @@ -184,6 +184,13 @@ public class ControlGroup extends Container { height = bounds.getHeight() + paddingY * 2; } + @Override + public void unfocus() { + for (Control control : childs) { + control.unfocus(); + } + } + @Override public void load(JsonOWrapper json) { super.load(json); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/List.java b/src/main/java/net/montoyo/wd/client/gui/controls/List.java index b2e6764..4d7a62f 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/List.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/List.java @@ -107,6 +107,7 @@ public class List extends BasicControl { RenderSystem.clearColor(0.0f, 0.0f, 0.0f, 1.f); //Set alpha to 1 RenderSystem.clearDepth(GL_COLOR_BUFFER_BIT); fbo.unbindWrite(); + mc.getMainRenderTarget().bindWrite(true); update = true; } @@ -131,8 +132,6 @@ public class List extends BasicControl { } graphics.renderOutline(0, 0, width, height, 0xFF808080); - RenderSystem.clearColor(0.0f, 0.0f, 0.0f, 1.f); //Set alpha to 1 - RenderSystem.clearDepth(GL_COLOR_BUFFER_BIT); graphics.flush(); endFramebuffer(graphics, fbo); } @@ -321,10 +320,10 @@ public class List extends BasicControl { @Override public void draw(GuiGraphics graphics, int mouseX, int mouseY, float ptt) { if(visible) { -// if(update) { + if(update) { renderToFBO(graphics.bufferSource()); update = false; -// } + } RenderSystem.setShaderTexture(0, fbo.getColorTextureId()); RenderSystem.setShaderColor(1.f, 1.f, 1.f, 1.f); diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/TextField.java b/src/main/java/net/montoyo/wd/client/gui/controls/TextField.java index dc7d79a..7b90155 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/TextField.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/TextField.java @@ -99,15 +99,18 @@ public class TextField extends Control { public TextField() { field = new EditBox(font, 1, 1, 198, 20, Component.nullToEmpty("")); + setFocused(false); } public TextField(int x, int y, int width, int height) { field = new EditBox(font, x + 1, y + 1, width - 2, height - 2, Component.nullToEmpty("")); + setFocused(false); } public TextField(int x, int y, int width, int height, String text) { field = new EditBox(font, x + 1, y + 1, width - 2, height - 2, Component.nullToEmpty("")); field.setValue(text); + setFocused(false); } // TODO: make this public static in CefBrowserOSR @@ -166,11 +169,18 @@ public class TextField extends Control { @Override public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { - if (field.mouseClicked(mouseX, mouseY, mouseButton)) + if (field.mouseClicked(mouseX, mouseY, mouseButton)) { setFocused(true); + return true; + } return false; } - + + @Override + public void unfocus() { + setFocused(false); + } + @Override public boolean mouseReleased(double mouseX, double mouseY, int state) { return field.mouseReleased(mouseX, mouseY, state); @@ -262,7 +272,8 @@ public class TextField extends Control { public void setDisabled(boolean en) { enabled = !en; - field.setFocused(enabled); + if (!en) + field.setFocused(false); } public boolean isDisabled() { @@ -270,7 +281,6 @@ public class TextField extends Control { } public void enable() { - field.setFocused(true); enabled = true; } @@ -357,7 +367,7 @@ public class TextField extends Control { field.setTextColor(textColor); field.setTextColorUneditable(disabledColor); -// field.setFocus(enabled); + setFocused(false); } } From a4f8b630efbaf8ac5a7367b5a827cfbc16452427 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Wed, 27 Sep 2023 21:36:35 -0400 Subject: [PATCH 3/3] Packet for turning off a screen, start working on schema stuff --- libs/mcef-2.x.jar | Bin 197581 -> 200767 bytes .../net/montoyo/wd/client/ClientProxy.java | 16 +- .../java/net/montoyo/wd/client/WDScheme.java | 327 ++++++++++-------- .../wd/client/gui/controls/ControlGroup.java | 10 +- .../wd/controls/ScreenControlRegistry.java | 1 + .../wd/controls/builtin/TurnOffControl.java | 49 +++ .../montoyo/wd/entity/TileEntityScreen.java | 24 +- .../client_bound/S2CMessageScreenUpdate.java | 8 +- 8 files changed, 282 insertions(+), 153 deletions(-) create mode 100644 src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java diff --git a/libs/mcef-2.x.jar b/libs/mcef-2.x.jar index ba5160d3f85b2580fa09e4443d1052a51a1cf38b..f4316ec7d38f6c72d24a70947eabf1a591628581 100644 GIT binary patch delta 19476 zcmZWw2RxPk_jezAX75o}Sy`#9BB^8+AtGB=B0{AbO394!*jpuJyY?O_dzKv`$tJV> zKhHz;_515}bD#4*=X~DheD-l~%M*&q1d0$fNaV$HjU(6`jao5!<+TeN#KB^poUc*W zvpq8~5j)8DeXgNx*5{OLu2J=rIT5o#gnrhXyi7?0(MkyUh{6YEAFJ392gzo!#KxxZ zs70EOm}8Q^Y+H^}5JiNpK3?6TCk?LC%_p3y%5lvlm=`ZMisL>`eN8QD)m6RsY~!4^ zTPH89KO-wEJPBpmY z@v*1nlgR3s=@~v)FW1<10bhyBr_rc4fPcZeB1zczHibji@pvs&Vv;Y%8qRg#;o${f z@bI)$@d@bhNJvQVgkI#CVw@mI@I_uXejf(>4y$D1!zx)?U2(CoKWc7odi(Zc-GSR| zJuEvMhCe^#vdglK;fbppxygN1_mK*@13j_#?P|XtMbFK-mBj6)&l>P#*3AhPdO6P$ z-XKp+%_m)Xka$fdnLn(qOU>h(%PUFG@7i1ar&dmXGq>52wYEI`=|lGTs$0eFie;k* zBl9sm*MDzqVT17k#&8gBD*dI-@Ewc#w>so$7mef81Do<*dzRWOkgSO4Pi5$Qc7B!? zwoEQD&vt|9>2dX+Z?AZHMa#0Vi?<8hI^QGmDyr-1^j4wv3Q^PeuiqBACii;pU*%_-xZfGJQDV3C(e#H& zN4#)H)lrPkOKkCj@`l))^Aa=K7aFaT*D23K4d88oCk zo%QqV=sW!~2G$REdya6_Q`6GaiL)!>YMe|u?vVA==dP4V>&XzNooQ1!-*fdT_hWUV zV`b6uT^l`qc41By)$$o-ejOG)ks0tusMI`ibx^JGgoZM9QTqNVZ_grFx=upmLOACX z-LYTfG%jEK?Z1}2#3p^yozXBon)T^$c3w~K482v%F{(GT=WMnFzA+cYTR)A6<0qwJ zXj1SpG+PXe^&6w+3>d`(Jby~{k!qZz_#$tH1Y6E)LIM$mLztj1haOiKDV(KoY$fxK z$~+UNaIQz3CLjB2v-x?d@k(3uj~B%0}rDtolCEvz}hO zbidf2lgmHpe8)S=;5=R5mZSX-DtP_uKN*^D#m0YFot!M-z#1BQC&h$+Kh^fIma%{M zPm0NhE=GZEJProVm?6!V@iEQ{Ac>5x=X4>zefO~C6 zy0SuQj`2N?AAePboqD|JtuO#hsK&gJt{1Cls6G?u-}e4BVcbFCzBIINjP-V``xGFHME*wI0P z@^D>6tL`ehZ)RE<*mhaj)gSaC@sCP7oJ(?Aouk4zt&SVCzQf7Y2FC~A&8x>+f3VNV z_LXo*{_$an_-^v>Fy%^sb_LO5Qd0FYb=HpGQX947@37Dd<(Xf%sF}uJ%q!g2N!Vtq zi{?2=J^}0cGsDDh97MhW#0Lze2#dy53l*4JNNyrmbHT;O7{;e%lF<7UXE>#g>omO zDVH;SH)?%75=|?*#IV>wF>JpWc32GinL1F4b6#PmaddueHtGE7=yjLZ1G-#8Z_CN< zH~ZIyj4@vvJ9(OxZktoBn&E19J;nT2_Bh7iv8&=wnBK*kn|{%I|4sibb=d5cc#i_B zW2&19%lY`v><>xpV3A!BU!p+nBM}~+AjN-oMPwUH)Zoi&B1=QI#xNI3F|0o6eR{A7 zR$7Ez_4TT9zHqXZFBXHp)%I zc=GVg)H6B=l~{iTu*71R6Jb9dfmhtrllh z6C1x8HLgM`mPD%B={(wjRTpj>3;3+?jMmZQ1YMKg>nUX0PyuK8!_#&rgCgfz$b)jA>p>qFE4lK$1bimwP zfV0$CNyzPHiyNhJvor0fpL#pe*?7W-*g`LBTOH>lW0U_96I<}(9S=(~-{qP^W~uiK zkE?VYkFx3deD=I|;5{j|Mhb>g&GZY>p8Vo(xIUUKY5b6ixj~azU)_*bWfx`VWAnJ* z&9PkOrUiS~MWKjvQ|^4yH#PUYu`3dn>5sk9|JEOozw*epzVq8-eQqr{rzM}xb!9#A zs9`W0YwOE<%h_rQ%#b8ELwA?p6>pR8D$A_3%4U^SKge{cTjdE1t1o^J7iK-9pP0mw zE+|QVMxol4NVFsAp)QLk#!TwI*06!U?{bdrvyz7g3EKu&Tdm5UNfl|;@~UCO^*a_k z#v8(F)O;qVDVfgPYPitzxT@=x_;J!nhSO{5g)>JwxQ%=P3C|2&l55|XFFe$sp)eZ;4Usr3xd+irF4FzWlKHs%H z8*-lGoRXv8afg$?!aXl^-eJ|72*3&t3Euo!O!Rr!s`tZZr`o)Zn~_kYw~BmEY&-md z+p0KpR{r+lC?!|Y3)$Ud$ z@xNZZcD_H{&{1kC9~lr8RDHXGUGL4OU?I{bA&>r!|K*(NNmk?GW!IO~c8;gXn{6F!s6yXwI;39acZlb-&v@i%WFrz|VIp+0;l*w92uGUXtR?#I z=fz+LaqST=x3@)1^GVNwGL15Y2HXlBV`U873UCgAcck3%Hx@Y!u06k6y``_0W>+*? zXk`N@z9wK5D%LM4>xzsSf8P16ymFQQ`v&Ek6Ydz zQhR)@b75S(!L_#|_F8YSW|zZs=1VHdd-ILp;D2jF|M^c3hS!S(rT(T$1I;OkqvS98 z2ieE4r{i=NUr;oVl6D;@ds&?3LJ(?7fTiI1b%_0X4V)UDCB|lxW^}{&oOsBR-FivN zHjz3fVOYm@2MxcgEAEl!qL-YXnojSQni?`up1Pk;2H%1=ZpOu?O`M-J^|I zM_#JP6tzjqm)vh_uG*|~JP=jh_TmoTT09)CJMfL+*hNffO7~eQDnjwu{Uc|Y3l*XgyVi4A9SZAVuG)CWhJkTgm_L!RTL(052EJ3+T zk?J(h1h;eTb+k8GCd`V;0*pH!3G#0BT)#CNjCbd%D_@CdKVor4aXs@Fezrx_k ztx(i(T#u&9QZN3;w4>$?Gya>A2d$po{#IUP9!~i>HeX< zOqQKi%~VLc{WdK1hF;LGr$ec3syp~J{*+6`L&qoXnL35anoGKq&)eqYnTFfUPUoAJ zGL<)*Nqsk-%N?d06$ziP_`G0Q=Ed#5{OS0{r|(+{AGk2zb0dv=08h#9;_oe zrDuv|U3;{h=q)62jdU?kiN`jI=vFJK3it7)yk4Vgyhq1gPtuq$e&3Myf~M#rg0&J< z-Dt_<>S7KF2T+=H2ndhf<5ZpZ!CGr`DpqhD9-?nfdF1hiG5URSg5WEYxV9@N;C`_4q+{jrE&c;K`6D#cgW}tN8EwI$zm7EqEuNXG5AD7tchSLwQ4i zyzz%_hH^xdv_I1^(K|!0C4DZ$)isRYr+}SvO@&K zR%q63u{Ja;z9x{siA;O7-#N6vYCFp|rcKYEukj=qdF z%ZV}~uy0IeO-tumFxwj=TTdg!namfwmLl>>Gep7OYkjFE16P4eLo%`G}mm zvc=*8cO?ih3+b8BSYNfN+lXsVqERJ3_x^RXlRuWc`f}NG&7QCEbF7oersw_7a|n*U z?npYEus-LL^<&#sEA=L$C1y~4($GJL^Qagxk<);<8fTp$fsZ$qP4mT*s%{Cfdq>{D zXEq~r_#I@<7Ev)0-n^wq`0Da#dBm|t1Lj_`M7P$=dA_PUO{m|o>3U&JvqE86!Lb(d z)cH|2HmYJXP6=-~;pQHNVte1)mL<^x@R!TzBU@9IWWdwbVF$r;%Et@x}Rt zTNyG7H;zq`%W($w5S*e5>>)bE#8DN-A>_NDBfL5Irpj@7ecZQyv;RA`$Lln)%<}q{)1f>!)^PC&-#j-O zTjR4@)d}8PII+M*+J5>N-Gwr5>+4nAga=BE9nEMU_V8Eid@GXdSq*1;0}q;;NWYsX zHf~I)j9YZZr@Hm9dF)(6ox0p&w9|>8l1q89pV%!ockp+3HRzn!em}vrUY>r)5b!Mt%iNSn>Bk_)45z64V~CD-)pr>kEY7bptk zbhzVBlcjv_&9l25-;LR%%v2KzxDq}cErX19h>;6{=Ty_(7IHkiAm;yG2tawPlIa0b z9?Lt;l242LUKQdXMeYXlQs2R^(BpF0`#R^#e_Q1>eU_IdRXLbQF7oJj{@3FCc0AHV zUUGqUg=|t21y#-Chns4w+)D3->nS@pq!;uU7;<&n&d{Y77`%LZrr?=zW~TAXjPb~P zpXax7y>|!RGFC?3zLUpxJgx9FHY88-_V4BRo$)QKLn_l)tQ>6=TQx zU8S2md!P3tP2oA8Xr-BZef4XNNlv%xF4|He|9pXWw8%ZVQ@PavfoC&yl&;HFoQQ4L;?Fj*xxK)*LO!3|+_PX_EIKOevI{s|c?Y$%#<>iI3o%OU!;aM_%4W=A;diL9dB zp(lcvtZp7Hk=KtiIzpoItJMO@*K?O6(kpC23wjt5M=aBMa-No-GpP+-uDxvWb>rA^ z>`kU4S38S_6gZBye^IVdprkl07vX49*j4hrioN?o@0m@r;PaOuSnc&)TG3;AYrs^dG+p@xOA$RheazXfN;%9{X|e9ESWjTX@Ovq3gcu8DUbBhX8d0md=6`YK-n@^u zk*$^>cR=~nHG%8}kIvVogqM`BWk3_iyJq`6Ex?o6N^&jV0|H!-%D> z35mJY4BAQ8%5wiKqVRTTu-B~}Sk{a8V(`bl{C13v_yB(f_gLwYFZ3^g&G5ZfOHKYs>T`?o^VFDy+0ZZdSR~=cAuky9Wkq)A1!EWu zh~CxSj0~A!(SIdrUvE!q&TacyS69ts`t-9?y}tv<^Ne{%H*?(wE*6pMFh*(kzoJ(Q zSH{vC&RHn>or!YfIYoEstnERITh@MQr3(4J@2FUAIBPM-dw;SQ#OZw@>b2~SVdfNP zdnKM^n)bD8IR+M2uMYp-)%>$UFvLyt)B!fnizgJVf~;~pLtLfAr4KGlU{A&E{DxaY zCEH?)iEh>jxvC2DD@0@*7;UTN9WC7?L#^^z03T;^O}8#H zhEp?$u;md8C(b*xL0ZH=!9nN!c#9pOV9jEL`i-p0Lk{P(om-ZC;@ze$-5M6AT)Sni`rhkC za~0N*_r$P2uCtUzwKvuaCp*k>NQFO>c`a0tyWnoqhHeG^nrgKht+c?i$Lykn1pdi) zG(QcQePubX!D8Y1ez~pNDawW;JM59smxlZsO|4Tyk>PE^l0&@~MdVabP3Z?nGvdU# z+CG|cRb9I3$dzJjDELFew~=S-TVIv`SmSg6HfwB-Ny2l`% z&zY#ZUuw@2>i#xrtWBDFp(tli>oeMz7wy`d>m&EXW<4dyeAFW&wA3*myg}G9zpBih zqc|yS{>|J;jrShGq}>c~$E^>p&DC1*3~XUBYDq&kMzz=TgBlkfRc+g^-0e(G*6n2d z%#2k{xn1=;wr zb3^BOr`GMtjB%U$e0I)@^mglSA6n}L`(`a_sXu;HUTC4$))3e^>o^+i{L7K_#hhkn zo%8&gosmU{v>jRDZGj^l3-V-hlF2sdSe-c zpa$)Xo%klhDx2+VM;C4%6|*$A@?55voQmx9@~0>v^V4pANhmgY+(5DEe#$j54vqIG zl6AzZc!c{#J>JPlL_QykGnU(kv9DXERZ{q=4j=P)%&IGx(zckNB3w!FpiOarTYjz5 zLJOVh{J{pQEV*56*Lm-b43W-qm^ z&YP(tcta*8OpQ=QQE@3s^~}cVA@`>FSQV8*n%7Y|O3%+O*q%C5Tn!oV31@8=(U%GL zD6>=~k&DK4KR&P9F6^OrXr?oFRoswMv_wA!D_X}RRo+Eia^&?*Q<99k)wahj30w*{ zU{W#o-fjL=kpE0GZBJ|Ym7$b6`%a<8N$QVFlcvskF4e{_8^y>teBaRBjudmksETgA zdMI8emlWihA$aZD5znFvOv{TL^Zg&W*P0mZ-qoxrN+pk)=&mY8{G{8m*Pu;9$%faeH+Xl*#uAcQ7<~A=3G#W#oJ#8$GXPzM6;EVv6rOPx4<5<-oPvXiHh{nd%WxiYx!%0C%g% zP}QGLX*gwEj!QZ0oB1^%pm>{+VXC1t_5|@~H!SfC8L-BHa+D*d0z256L=Xa@8 zywQ^Gx97j6XwKs&#_}wx`K0oymwQzHOijjNPMo$}E^o~EO)`J?(S;>iy=NXro?s5? zW=|>dZRIU(_PlvM;{55|^Xtyt^X%PAxES0Enda257k?(btB_W26wgZAU_NSZEA30D zp4q5{-Fef^tGjr$arI&9i!$~H*Q$HMFU>f2RCn-OpAso$))Fax2VS}73%>UAv6mB2 z&V5k)nWAIUb=c`kqqFMEv}%Tn1<9|vuZVmV8IHX#-SffCKwI6CC{X*g+oXD*b64~; z^{k^3zut0p$uE(I$$CC|cLDc3+Rh+lmF3!{ycldCVQxq3IZvWkd(H2z5OY$Y>zkUp z1nvHhE&QogHKsohW^<gKD$^Ec4`iGTIar4eqbuP|FCR}wB(wg|2aL!KBxS<0Jn=`$uUHzo)_^y#at&ZjKu?C%t z@UAQ)f(3kcEk(~twgQ&&;8JD&B(Z)F^cfaI{5y|b6 z;d{a{{7|ptSNk^48!GoJ?AuFg6&w-;#uGwz8(I3XQ&SK(1%)Fa`4;Wn&bl{+9np7q zpT5;;#c~;heDq`zeQ@BdnwtQ<`^kH0OBs)3Cch}zdn_-sr!I^-U0QhXZOJ^yN82gt zw@Pkt*i~EG*3su->jYKyu{Ak|E~{CQce!5P46nBCSJnKoLQPz8i~aidBeIWQKZyz+ zzb>0^E6Ta%x_+^LRpDxtUd>ISo#WkeYjO`KA2vKUz+#C;GJEWP_2Fg;HXRC5arL_4 zxMq>lUR}A>T$RliDo*VJbP@04@$`oqxl#p}&2XC~Jw z7un8jU;ePoxKmqpbo}m){|-;EYa&-=Eld4LwuPN_*888%x%`fEUh1m8yX_?+FPi06 z;t^{w#bxE|(c?<}V}n3S*Lj;FZwuy7XYu0PdDf|2gOzl-=)R%XaEyGmXn}+2H&q}h zHG>jIh3IJ9Ls1^vpoAaaibvj*z`qPgU9eU0G?+AX?t`N+b$fa`FTsb%*`)w|vF@8< zYt;`qkBFv8Ntl@$*X5AuhAXPx?+mZUjL@A=la62@YB1L; z_`qVr`k^yFc?kM>$ll{_y(~34sHbKA1TvN;y^(f`nJZgt|awq>fQsvx`R9h zXN52&%-CSR<21Z=4}34@=v;gE?MFb7x3gBJ@ zqRLyjkWPr)9uqZ4{s4L1m!FX!O5ON;SanAWZSxzJ4wkzgy$IBscGI!ucre`T9M(h_ zT7`#yh?GW*yvZeu?~%cUt3>=M{1^kR4=u4LA`eNfY0M8E8r6kuhv0tO0`mMTImi1u zYhEO|p8mcVHnrX%`e12=edn?6{oyqYeqog$l~&KSk`TF&ZaIs}uII)iaK8@Fel!v?;ZvKSe}AXy#6w${Nxm;Uwe!vW3}MxZs=0UAm22x9 z(``k=F4Pao%hC(23^%qPS!%6k~1nF!}T!o|=a~DNkIb)xMmTH?s9wwi=Djklyc(v)<&8tVQko$dlT+O_k zYbelaFwA*c?C$%z^NSB@D;m#|>%JYNyrlj?+HT@@WKeSQG}WbGPbhlsq20lI?_KRb zjyQg&)j)V`HFinEayIn zVAGwy#C`AL=G_-}G6Pl!XpK&=Id#!eo(y_oe$w~6{!B&m9qW`67BBT@(n}bdr&R7= zvz(>N7gG`M6y;Nvm|>(i(p)=L-hpjAMXZX$u8jjZkmYgab* zDLi(lzG;~+)BUE38FwGOku8J3&l@6@9(|K1&mX5UyK0g6-ske;2(~9orqw0`a+HkD ze9_NSA2to}`>dyXC=buTAy%XQE>8}!T2<*NN3PS3iOYG33TeDhi<*E{F_sHt>tq$6 zsMDZo{q>f7g<{Pc2Ud9MKHUge5H?x?d$mdneDzjQhj>@HAq4-%fq^_sXQ&Uw)9(1UM|tM z-*TDT?#=~BJ-6-_9lmc?agw5}SxYG0z43_M%EXfSHm|SVg7&7x)DZ3M6-igRO02hD zq;J?g%Cd8;f}J8SN$%Yp%(I`{c-(&*Q)y8qucAio@sY=LSZx*W*2hzUCW8E}Te-*P zf^6wnSB`w^JJ7%JUC6ZjZH4!}a~m%XOG(5%84z5J^$e`>2zQ^^Ym-7TC8XDlC$l#*lVwh*bATa@KmvPUk125H_>%162!8C!>C^x&X>iV4$f3+*4ai-hheR%NM3iq+? zijN(&gL;j3uCxv45AeJ*i`~rsxnit5U@4+3FR#Z_;~3K!-JUR!`6@$dJ=3^rsw0RB zo9Xb<*xLBU73&1$vX5azeZw=w-i6`n3@bYA*pw`RtJU%YHH!<&HwHJU3MEtX@jm>&HDM8uGtT=108s&YVE4 z-krnN%<#M5$wc0m%Z-{wPbhUlv@47iXRc!>TPGY(zdjTC^mqrPcXgA!f85kTfp=L# z_a|@C74od=DGknO)9=>Pb|jTu;{Nv^YTz5z5xYO6+!-6#a@EolbEzVFl^#1F6OjU4ReRw|U`Ow#&oXrdME}U*(Yz70TZXGbLFL#e6z_JWX*HiJE9sV7J*(Uc{ z$DYu9TgOgu##pua-pTVUXVy;nY1$-gYabRm`)jA_^&-nF0hOK8AB#y+%X}L@`#T@z zGQ3jNe2d;}fTn+_|D%`~NqMH=&nEvH?nxTgN*1}K=CH|(5WeetvPMRS22P7G`^lM~ zv;s;lcjJ#2@=zN{7AmFlA4s5#Pd0V^f#tl8eZ#t#(jeR3G?=+1$$IaKVRcw}%eo!m z^?8R4E5eb_7ca=&F19*HV)ppBDTh2n)$y)Y__?Xo7ZL-~h(PxX(VcWp-$i!%&5sky z+>8Z()a$-AUl$xf{H$)-J&|nbo#1<7hJ?FH6g8<1&)vTg9!vKldocW(f~@6dy*V z89x~pRYQTp5-lnPOQG!*j^?di$zmH~c9Y}|BAkaHO|3qGq`6DqW!3Ahc1I@ms@R5| zy;A6Vm=636x{Kz^yO(E2qNA9J>~dJ^49^C(W6OnP9NxOUyhJ`7R};%E_}gDgeZnc$ zqAH{QP)tPz-@;CPRG-Tkvd)#S;|HB?HC6C>=_R}I~@ zyttp9*AeA?GqGlG&Mu`D(-e97#**a1d3BpZV`oh&f5-KXOz&Wj;P@Vh z1=q}l2}FZM8Db2vfM{n;#DEh3H{58w?39kQ?(HWpI!WvxMOO1)%Mt z{Fne#3ZmkN-}XUN@WK&H0)m4a^23{b5H;?-07f2FLiz#zp@^Zvi3(#Lp^bwi^270; zAUfQf2<9CTVu-N-qPk<40`P#lCxwwfY;jp9FviH6@D`9y;DZAe>j%DdWiSVjRQwg= z;^Z;SsB4g0eweEtqQNDf#)zN2NR&*dB!wyFK z5Xeb!?2GiYBmVE18o3^=@9OuxP`}<(0u_?zz4@6YPjSnCKbtvso!o_B5f`pPQWl_ z#kB-r(8&l_|8>d#6=H*b1!LL~r9T}(0grrzh~TXd%<3Oo7}%m>23RB%lZ&(gI^SiN z1JcRC6M$RDOH3kS@i#Wy)o_eI5-zfk6h>f#5Cfb@6lQnTK&RSN3}zVhgJyU^93qEf z6G8v{jK@6um#Kh03^@+S717BG48J3P+CyhI{4gIw2_KjSV--IKLxtLasdE?+ap3fF zF_fr#WFf!-RZ>I&2NY-!F&Nc+u-|ux64#Eyl%k5jIVz&V)t6udQSHT2OeE?TO;I@; z;5hUh%tVD5VAx!ai9!vLwF0JW$B@H8GY|uuRE3#AID%~RA(8`dQ3nRJQ;lgrokrAR z=ukUkErgK(;qqGWU-l1>{PB9s7Q%D10rLS>0^^JiX88yv&QKGE0VM+lG%JqkBW3}4 zDr~_l{$+s!EL>3?wDGbzh#gnofq8%^;FP;DLg4;Ul8?XP z;>t;(-8Bm78>AaS21r3}(L6mQhk{YQU|z_gBmiGAR049byL2EKfI$YxaUygO2g)1m zy^3Y9+&yB1d{8350Uz!tGjtnOKxpAW7or0N?fxKMh!}2P0UYT$peeMeU!2epR2%d> z=saGC3TMC#?GB_ranZu_s}MadjTid;H)Ff0;SvO?89D;7q0J**fCC~!G=XS`fF}}o z=O?f(7lw*ZEifAR;6HLIIEELDtjePh1L_)?8aOaD5>OXth?Pgg_#Q zrf22^a;gAgwPKhF{z{3p(Nb2ui45OZR!5xSg*X0DEpA^Ochu6_v5Uf&sd)7Okzu4|U z-%)FH9r|NUjgxx_IiWjF)+0z1r3AW=75*Ith8X1&Xao%%bO0;b;!8(-R-A}G)Pa~3 zhCpK|j9B1+#W%D8q+9+d6XWP3p@Zl-25fDtIITqJ1-h~!@fD^+ztF7zrG(?nfua%i zIKZ9-_5BB9z>$|iPf>zsM`V>lV+7#v2Zz-_RU{%WWc85m7r}3WDADxnC=(O?K`BBK@7QpG^@c)Qh@&JnR7T$bp(it;1|Z|+KxAPzSSVq~28aUD^+e>KL{T}XFa=z- zCvQdMYbQ~;yc8?U)d*1>L|E(=_jYT0hyTL?4{ux=)fPBT4cm0=Y3pS~mNeqy;oTv| z!#lE1o8bbY4Hq{;90-q3ji5aVHB<&FgRF>5=sl1zUIwzm@U8c|d>jVZ|nhBP`I66fRxgV;jZ$F0F|S4^Iw! z*yZRxKOazaIfNCq2{4#FO#SJvV5Vl}P4Rd|ir77|OC>?W0PLtdiIlAwcpvu<8^SVE{kLHNT}L4IK-jYx;zb?yc)s`S03{uCl&%H}?*v%@wmwx!W!&52aZ9E19H4b?2?NdD31{4{?PSw)DhON8J+O&dZ zygS40H?YA5Tf4GsL{{7fx3)rj#>jv_|EX_t1T@V9JW}uT_@*CCIFeaWP3_$Z_5M7` z>cy(IRNn!Kb^#u^_F2~t!I#<~5j5O3(B{(-hIb3S1d zQD=ck+rd7)GX~4HLx<6x5WXR&M+DMTLHfTvabXj&~+E@O7bTC!tF2LRifRa@dfHgZIHbmPV2=Q~tF>psaxZQ!9 zC+{Jo-!{J(3=06J`T$0fAIF{y|)bl(QR1OAr2&Qo_dF5IsuClq{1d6ws;uf4K&Cpk4alu1gP> zcJGGUg!m#p{12jn$$B6Od|e?7e2ELg2^;n7D%$k`#pGQn19Bf$f)0zoUwfb<2qmgs zkToX}_+c-^4Qqf)G1`+Zg?$!SFtlEQv9f<@Ha&`{9!E@zfGPfQaSSZZhY^RlMj#3_ zkcW3n=q>oyHE9v)UN7Q-)^5Xe*z(KoJ54oFt~jmfQ>%wr2;`dO8-Sj;kTb4dL))A z1j$#}MSgzTU1?Z91L1Q;M0f-?`3xOIITxMIv0eim)d@OEb{~;?B}7#P@i&8*@|{DT zMPM}<3>mD@zso_RA0VD8yH4Zf0lT5kyGRa#c&j4FVfbhN?tV=+0EFMvcZHe*dwF}B zx5y9=+WrV$`zL0gHloT5$Dha0z!?L(o=boed@mggTzwhC2rH<9k-a&v>z`^6K(f03 zAUgQ^MGO(zok$?I2rjDk4`+kl_U?Lpk3a+l{~&VspaupU0f%;R&LMy|7^AoZ?6@cO zM5J9NsFVXP9@?eRf=HiO?n&dX0yiFDKp_mch5^KM3mrNPFsLZd!m?j?tvnD&#Ay%8 z9ESMO5y&7|sTl$?lMh~k;PvlE&Sg&*R38}s#waoZ-0-^ogQ(%k;k{}3^uiFyGcfFm zzzV4kc0~G+8@K`;5`FS z`uLZRLBv;G$Q}fW9eik7-G^BtJU}Y4zzh`qms9Yr?)g7mx_`OT9$`BB7{H1DuidB@ zdj@E+gk@wm@*iWMUALG2pxwoKCt~4rEO5~WUi$}oAH1jAHV)R_KW?JOft#j?f6yUx z-qJU(o+<<`$iUp)Prox7rv3`aBWcw93Z~mc4190`Vn^yO^l-Xn9U-T;#a$jkk|eI>CPQB^=YWao;0SpW!62hf(<7h--b zO!FO5;zIWSuaZr5)WBCf(B$8zl?;FR0qBE56uM)-{SK%Qzeg;Y;F0gUUAKb>lbZet zDUk9LdLl5K0my@91Yv}OXP|>fj5&xfwdJpn3N5Sr$r{xUfWB+nMJsASmy-1DT{*(n zsCK>pc2@w?{aapb$6tLiq)fFt7<-SusB!=iZGa4k?~CeZC#*ON9fI*^Ax<<+q72R# zR)IBUfkqn`-NO5{$oh62A_by9k+jc(NEkoEm*yZ|_*e^u z?(f0d=v4EdEbx;7$n8H)kPag1=yAdi)W)DFaPURUKhEuK`&Xa5)T;(&#Ndm^r}j}W z97TE^>Evj=Tz7lYrp%4~TaR5WM&bELWgxNAq{yy$4?KuQL6Eb}M>+ zI_%IAfDg0o!C6b-g#0JG`v_#g_76huBEyI@oCAD`i3Z~T+lu%ykaBXN(u44=<=v^^ zk4Vk9_dI|)AUdB$5Gfb$o)nY!ASzgl3!IGlA$;^)VX_Kv`J?~EDc2xcw5@fP41%wq9dhvPmi?D~ ztk^#Twm;lyegapO$Mz7U==hJex=d~k9~e`WU{dbicBqg4Ghjztp-sm=SC@_hVak97 zY`=c!$$$E2(Gp!<4y}Q<17-dP+O1pub!y;qA>9s;I1Nbf?3+bDGJjbiUo*TRSUj}%_r_+RBDkVq){dG<3vo)03$Q+9OL3d9xG90a{x3D%hX z*@2A^RW3OD68KBNAE!6AfD;naT_kmD_X1Ih2nTK8&s&fX>eNw%a#9IoPY|S?-sQNZw?d<@;o~957k^w=8#St#pLx&O6%n>Bj7fem0HVZTT+FgExenIS* z53u5Iu+IPhom*HS!)JH-r;b)?cW;+#7fdVJK<7t;yY``dY*an=4E~gFcW1z`b~MW) zK%EK(31)lp1KuH(2`VBE5iz4JQ5h%9 z;SW(GI|Vw~9)xFv`+}Zt1U)adFG|K32&M^v#8JgIBXs{;Yx$i5-@@RdRj&jL;HH*|a$|%0G5F|hbODiW7ot)|m@*xr z_*;oM4FQOud=KK!0e}1Yb5ROGpuSoZqKEDA@yXx?95@&MS@6Cg_)^1vaXx%}bT^a6 z2T*#`KZp~lFa`iAUs@}Kcgxh=?x=&ggQbh9mMS606&_wa_=l&6hbPbm1_|E(0r)_b AwCqtCA=#N34OCoGvPa58$}FYG?n=rEkr~-DS!F9D z%Ktpi?bYl3dq1~(&-b^-InO!g-nTNHs^vCSoF1fP5pN)blQyiCqPw-GwL!c8gUtsT zEyiJ^E+_;eZ0xJ3-syJjio@$0X|b#}&bD9u3>VY`uGW)$kE0wp)Wj0vr1SnIt5Z_@ zxPxxXde{Wn{p7$>C&~~^wnKpJFNtF{`wAI7s+GOmABt6<(7T;-@g2#HNbTacfeG>* zg$)dbD~@vwnI7(`F6z)>Av3K9(t%44<1~HvRfHM1toILxKIvJC{i*Sh+4ZzwiJV!% z?1fhqQ$s$db)G*q{ZWx{`D92M%TE@yx93}&A<1dgCc89y=aiQlkdZDanfrx4;tnDr zq9_azk&!Nzn1P6ljEqR$qSzMW4M8#%31im$#T(cn4D$H}J3sD-qm#)c7k3GJciW2> zZ<)+o={(NzW}j+&UKl^k&BqzRcW!XHH-FTOJmZ#5{NPX_xl##rgqjj`M#e&`bM;u0 z>|z$bVB9H#O`?G83%+84hwNxn)c3bEKlFTitx`3s^7pS_hD1|~302k~+!)0N?ui#q z$VZ6ls*5E~)T(C8IpgS{0j^}jmQ4Hdmd`C4Cq7ch^ASf$e0h4GktF~Zw=~X1LcHo9 zSlr9`qDiV`$Vtk2m7^_Ry!3JC-6}8IFp{$e-o)(F>VLsW5q2gx@13ndKyvInv=8PY3znI2P@jC()nL`7wPJBIHH&ZohvnntT|IWXpN z>$5)Jch5rA$(?&erHqA=jHgREFXptbatv6gOkKSt6c?Bw93r*sSPdKU48YM0$M+nk zxE0Eov=SpG*0iB{An!fC_A!IHz>Kf3Yp-N_d@|Q@j~C6u`R;ldcT?mS$!WeS1$h@O z1h;!>*_hD=o|+IflgByiAxV+3dLCX??fwF0qj*Ci!kSdIms9!6WhxQQ6U-j?F>w_c zvdQZ+3Xl4)8k9$zuRXNavXgkfeT&M*v98i@O68-($-eUUR|jX_dlS<*in6~s)8w&V zW|39B$D961(vg=RYaJeIt9y4;w#V1QVqYp;4qo_a{Y7C?Y(hP_5NEABVxF{l*UQvc z>BKB)SBF>d`LO%L8RQc3GlzmX`vxbQSjukZU$Q!yeEgEO>MhalBKM>?nLc~bl3xwe z#9ohf(+SbWoMrWFjZ$p+-oH#D647wlYE_YRN>9@F2ZJ1biI1%;+_EWngrzrh&gFZC z&K|LI_cNl}(yLnCUo>>!kGy~S_%i4HqAv3fB^ONHK6>`OVC_%6mQu5L zbSP#pCQsSW`r~;%(ib@T5blp+24a%m zl7{&F-3xx0e>d!NGrHr!D3csxvGOs$j>l0X)lo$@+w*y#ua~a;m%T|c14D16XUacH zsyfjL1$=+TypdSp`utV3ON2VV$$O%PMuEnBU8wvd>{%}2|HScEFAZJwCL_dsO|XyR z<*$ADQp@b;e$rj83fSVZ$36Y!*QCfxV#|D`SYP^ksuEG9vG4_wt-)r{P-7B-<~T4C`#Yl{yZZ3;7s)fucWu~ z#mkI6X|_`NDxyiL@AE&e%D74zT?@bVA!*`+n{$*eZqLQWpEAu;oHdbKI4;eRk>0$q zMUArbvCR6AN7E1NYN~8S;v2{)_`IpIl!CpN+m=Gh_1=j;s6Y6i8avFVP}ypz{Osw% z`Du^b-)c04icS8M)OWZ9Ek1MK(#d%BVyZO8sOp7@+Rr_;1_7$jZqxFbmYME)0Fh-d~Q%Mb)h>Evxj$) zsy4~0j}uH*ViMVH8rhHCdkz0`wLS5OVouHpNsqaJktd~3-Yl59RBop=I$_yw#?3Zs zENl(04OayG?Bb2Zm_Khe@(NT-ps33$NtQX8d{l^0ar4N~7%s+uG2+I|>*zPfgkIBLOonyoMQhJS+gOUGh{XEB1} zvJX!cc*(pfU`U_V8=n0-*H_B@@s+)q-$1u>TepxQugv`QR-I4gR`Gc}w2$#uG9#!QGd6O5{!ZoAT^=sz!GK*)HD)nBX@oTv&ZJumoX4vqt|$*A>I>w&No6{hg>7u#`94@omNN8I&pdn$*y z;mDWwEBmP3lN&!}jOkiEh%JxBy}cC?^SDgw$iDj@MEw|y3Lo(CTFA8vtkWMbwZG-l zW^wtZSE1Bp^1~FVzq|5UbmdA$PjUu!k>y%Hv-y2y{Tk%@Hoyf$%K$5LejLTGcgjTT+XQm3{^!N59 zO)I%qId*A!(F57>vIBF?ba^6WV&*mT&M|T<&O^#MtcKB7m>!(fJa)8S{hHE*m2SmL z=jr3L{xe~-GBJILdQPE7CncGaeeFfPy=7-~9yi~ti~OR_`DVTo=fP(`Y;Z^N{8gLH z33uK(2Wrb3*>T0LBP<-$lBpX_K4F(HKg2qHdO7pnAcx{)YWQ3F*GJ2GmL1;fd?8`g zXRagBce9Dh&@X*(=UL=l)uc9lnIkTo+0JPcRMXSU!iv>)ywSHy<Jz;fq4{3oa}&4?;^`^^~yJTdH(?KA|JE-F$OM#!-&% zFpZ%gxuWsWcJ&0EGf}_Pd=}g|N13c1S0$nB*#|afD53H_Wyi?gv|=5U zUlplI#IKD1aBx;jXk|6+?{lA5rN*tz4fL0sYVasK%i^E4sky|HzI7`>@YK~u<1~Z9 zRD&izudvddu1iU-Eo0-vz0+@SX|vQOpR^Qo-}Azl(YN>q$x*g7F9qcd^_QCJE1at%fyTxpC-4hfmbk|GUH zWlBFTF{lgbT~8Ib|7-mQgnN6j@*T!4rH^loVvpI~`xLZnSGp=BJhR95z04(_a?IIe zyl%3-!Dj#EK$~~;{WAjluY{UVOym|F@`-L_8i4tu@4C6^d~y<$3dQ>RC`daRmY3Z$ z7>&EmT2_0(;E~#Gi@MZ$%~!Izv!(Mo9)!Y*@u|I9jLpg05Wh?>BQI+4JJN!?}F*YVA-HxGoYAN-v@ro0vJ zrN940ghu2&p+1eSI^V5xd-JQ$Eh;)moW679HR&DhB`H25qb1rK0vBq1Fr(e~4Op(! zlpb%takgfma?z7|`yI|a{0$E-H8rqqb+ON`dw^V7jN`mpQk)ezm+7Q z;;);UfAMwC^uCB-ErAPsc=nh4^KWW%e2UM1dUGwWj3qAB;`Cdpy6f-wA4SIE&XENS zp5CatVRqmA{)C{fSztG%X`|fXJ_~R0w_A%x)u@+Z4#qxvTua8m%oEXC`DwYpIJv2^ zTr?vShRGN^Yj>6v!_3sRJ#vGz+mny?h)oVjH|amI=B&&( zEmGQLY`piBbc5iKcw9W`%*$}Q76zPq#6QLLUZr#c58eJMHM}h2SPqhX|e^9iixt8}5@NxtS{;lE+=; z(ix-8b(w9g#$K6=tvGb?_Ig30u}df8o9v!o`y*#X3*BE?@exy5DqV?YML9vzU0(&g3L_uThXnuRjnj8E79KI=MF?a z!fc-$Jy-jwEOhu*kC~sf=M#Qgw?-Fhv(2y9zl;8M&tGXtITvI+#ZH@^YJ)K@|5``& zS%ZB*8kS)9zDM=>WRJ6S7{4{$=Vv%tZ}Mt-K0g!fUn>qa>LgA~Zfwhoova-RMgeQJ zW+z{ZoOb?pk3QS_$i#1+oZ3_$8{&`?#;P}lD4w^C+-uPNppiw~?B?=5JzjnF!~^N% zo6obHy-FJjSmpdAvtxKzDIeYT9va^_s}HZbKAt@=ccyDZKShCqq9f+x!jI{L!MF%$ zbq@`LSLdWLheOXGhl|tm!F~?EBbeJUnhDIFD)l9=Pk1Y3t4Ht_HdS>vH#7TL%9%3y zoscu-^fSA}vM^_@5V2_&OiMNX8&WR{Ila-FXv`5C{n^3YAH&5}KP|QYBIVD<-mlLD zrSUJG1+@{UijB^E`gHlzJyGZ!)%91npnR@VM^joIsP9L5^oKoTraQgF#7H{Om#=io zfbq78TJGod73b65N1fip$nMd)_}RgEOogJ~{9Q$e)pp9OUy|bmVKy3Pyog?xMX8nr zU)zYb3iqrTDmzo;#9R0(I^Z|;^#mpTYVPZlBa<6?gEtmNUq^}8q%DkXerc0X_(qFc zJYqK&r>#*F+n9z;icO32HffSm-n;Q}Ol(UyaMHv(?0lwzxZomH_3sJeX0QCfP2yD1 zQA1jZ05Tj`HLfSJ^A_*=xx+bwg^P!c2Mg)j;u}f6ygzt!#kXK&-oeMWk=RMs4lkts zSm%me-pRbDRJHl*k*6)h9D{_j{1g;&CA%KHlWmBst>$0Jt4NV}a{1FX2H8If54?^b zq97t#*tdKCSp0%L5IH9oOK_IZBkx}%ImwZ8GgkR4^0uI?hO@Hl3HTjDXEozfcvwNn zhn`fmcTAk!-K$DT8geJI>9JAmbsLN<3v%af{CF?z;=p6={*tq1`EIB1GxmM80gujf z%GZ<*JQ}FT{cy)oAMa?n7I>*G_sq)+`rW;ot*`FTna3$?%&mnyzu2~sw!NY8cH6i0 zRh!kD?|eZL(n19|1%?#zn>EI6^$)`JiJdgN9c+Yp2YU9Y?u~xeOfH&nnCvc>bZkm+ z80$ld+5H-Jx7?|ZL86no3cB3EKQ0!HO)vEti%L24bry!7b-Ki3$L~gBUzn9s7D^v1 zuN&#QNOo6g8M=p6U0qOWW~5!4RhLpLyLO^&Ea2MA4NotF54f<0WG9}e>?wC`)oZx3 z+84y(mT9Ixp5x`f!}?S?;akQxS=)%N2jM65uE``ODG#`(giq#l?!VhnHh8uA?3?P> z$5*Mv&C905^Ew_pP_TSi;%_7|ns}91o$I4HPKM%c*2~eWzuHi64S+% z#6 zb6Y~?iT;^Y3C5gzrI&9NS!)Ml1Vj76H|h6c^1s)Wm~<;Jkm=ztjwG(ePdeXU4NjTr zB6*V6-r?ZtlzLShOH6xz@?J!i&XFJ<^2l(iGe`A*|EzYAmA2#5J<}2Q>6JO|@Hd5w zV-3ek=(l@nTSCO4$Notx>1Rh16}4W54ul{6sUnueNS^jmAhd<`!y!S1>FFv3O>X{Q zXO-iZ)c4)JKz=RwYZUIhuqp?+UUnw8Dn}&AjY6UEx-D&?QVHQA@wN{2uXt7b^E0BS zeU+G|M~1G+IMhw>Q4c}KucS+I6v}-!I(_vM2YIYu^U+=%g$Dg={UL8RT$JyXh+lmj zDV>SGMqgNVufUL%C60BW;Vkhqq_TqBj3Pd{xI(k^Nfn)o*_{n> zE^Eo$s)8atK$miRW4$n-IRnA8Z%J@05IE-SxN zr}bcEJSf8ZJNR$S%LFD#x}x&*FE8}*SC{DXlm(D z4!#nyY%wbnDxs>tX6xbJD`7ue3eA10&lY_`Y@jKE+ z=nOvXz36nkCil#{u=~+>4D&Bq*UQ}+KlzK?Y12VDhBEgx4SR@=;$fVVfm2~X=w*4? z9`422ZH-ji*5UJwkEbNgV$UxbaB4*RN{cK^#<+#@@yA;iU;D^oF6|{bJbq;F{5an? z2PGFlYPBHVBA($7GllO?S4E{{xQHHbdC*xz)_>xb8r4A|Bc_OB9-6P$%$uV4Chp&Q z#{Z6_*_T18>6{u8)k-X@_%cs669D=*S@1?ZamMQC2guV_ro-hA}#So z8n@3K21*rc3Noe>6Y)k)k@12&%8qwGaU1GVZn|V&{%AmVWkoT&w3HM#;&r~iqNLf* zG9mtqSC`(bns|Xn9!UrQg?aE7;ET37nT=C8X|mb5f6`0Iv~9252J z=CDT+*jR1NnYw)G@XT_TYo&{$-obeq-L^%e%8nX=Lk;%hX2mI&yNa-Cw_UWpCDlna z-g)hLH}SZ*V@cIlcTUHnQ@Hx4^KNB)Q)ii;iil;6v9mUCP*GcS2sbwJ^#@`N$5K>M z-+7V^CPiEOy83+7G2i#A!%u{Cc7(qD@!3{Yay7REwVTc4AJa$bJHbDD%Q9Z3hZQgU zdJ!Y)7pl3TJ@Bw-rThBJLoQEWRpyT?tEI`m@`{kZZdrBtsb#IN-_vZIX3g8ORU`bR zpRtP#K0lcIF7h0vuff0B8-2L@{`(-xvf*OksQxnNu!6|z8DRPdGe3+~b8}MS~ zUx~j`Yp29}PXA;bS!|V6R$4AY>Idg}JtG#i2k!5d>2(j$N+e$Lw`DgIdDK>T_mNt@ zp7omW0MDC+z|KoW-;FIU#~KLQ2|6UoRlmO8*xV8B#p4oYSJ!s~zjEij6>g4-rG~e{ z=MZyQR+VYph+mD405-e!Ot?c31JeOXCoQqcw>P=l@ptdI^B$K!^`v&G%0T_bt5*N= z#6q=|aT(77D`rMNYvvD2Q4&oKdn90Hjv@u|Z_)kBejn>T2g>fxnRyucl)RD4Gy56O1hL(I6+ljP?%MzI!E6-Z`8*6=@tX}m0(u_G7&sp4}wf10zvFDTEk<>TP zJp4$PjkaFkQT<`-zT2l{$4%`{*INZHMR?Z^x3S;8-ge2fW#Nmof^7Pf9)FhKiJDW! zod*0$M%g}c4)wA(j%$!h?Tt!m#wi{95pN!GDJ9sNs(vqw5{ixEC`=TVkC}xRbnLm zs!X@^%kr_=v$534b=d0(C+mKktJ6Q%DsGagGH}oJgueIj(l{<6nFK}SJdVz<0Utg( zn=8GM^(;?J88&ymdMtRxmmz8X4%ZWzPQmGjOV7)zd&Ke#?ThoHqh0%Yo9fHu%6n5g zzY$Amc^nj)vTci1AFTN~YizG$CV>n3)cc}aU}oHaA%}5cVvC1$_QN#i%3MWQ^_kiI z&kV;sin64OzwmD{_(`b@dhO*-uHY$Mm65+lTas$z z^5$EP9f~>gy&~2_@!Ac$ClL)aFKd-F`!2AajnU@H+F+t-fzB8;~5mFUpa*d|5b@EWDd15ds2G3@*acH!kd?6Fu8Nnc^f zIukwD>C3RvJ*jCswv9THW`J?ofDGdiafb!~dY_9~YqabiTP)72t4 z?$)m33`B`6NQrX>->bNdB zGw#1W)Hx>X+WCt=(2xx$(>-}PfP^!!WkLAa_w1#qdsiQ?ae7>R{QHpO61F4narAQ? z$#+62v7 zM(Q?~^&>N17}5%p`^P(th>SYYC`VJ5>?3MM4jQf$HV%)L%Pmy zZganlb-1R%zrQNPPg4E;lyXIy*&6Lr;)hOT_EcM<>xNEA)$edQ=}q0V45JPowC~}# z7WfWtDW2jt`^B{tN8TG`@5h)g-I90r=ee!0qus~SD`TEV_#B_^^&PDq_;UVClfTQ* z{;Ml&-z(%a?rN{pXl~Q*YjrEaI`?#Tl|^}b$v?VvC0$)y=k=SpI`~*$uVdkZZN}#E z#g+)hVmrs%^?YIM^(tzH<9jDf2CwhuXU4sF^N8ipTQl9kYrlp|p2qj{9oVuCCwr4= z#gloLNJu|&puV4~#`g8OHJHhS&BfT##L8vR^Chzxqej_k^)!Vs^N>Y%*)uWHaG&@0 zzHw^ZwJy8TnE&Kh?Vk0Vk1nj7p_N^RXEC^$Q_L@-wKt+qRwcNw$~E)qQ?4I0-1|L7 z7MB-&{7QTS>%uj^07FVe?QiVs0=S-W|KXp56qlfNZo=B+G$gV18z#BFujP$b zc~86A{V?g$ei}}Fw8yQt^whq2x8|7Ci9+VPVtZsyb_uO7ZqdEy8EuMiqpXuXnO{>k z;8JkZRv|cLeT&ZHx73P%Ok%*z?!ddZwx!*1j`OP86xemX!e!yBKU{dminZ=QZFfZG z1^XWIwj9*6+vLfalfHB4zE2xHbK5>v$&)?09RA63W{Z0=mvxW!*i#Iwc|X3$>JA&b zRo2)EF9qK2)gxxJ5|8MqW3rI1x*G4dmPsBPrqE%~{GtK>&eU7gc#R_B*zM`NHwCTi z*l`o-7H17^k(p&{Uh01L+)h>W5tRm=Z-I&0Z6E%7ys~2=JrjaG&Gp0St>jy2sy~$k zZ@gYHAcpe8R6o7#Yz*9J{`m~|bU`%5_NLd# z67<6965`GuMVPzK^HL)3n?6Snq2fb+ap?GC2o?(|SQPh!hGLNSb75}iH^mE)+*xzs z$QLQa3y}%`K#6@2X>o3}GJ?Z&Oc*vevJavtri|M}zjEmqLILJt**@niUlTc(~M62(_$&Y+q)zL6uxczEF{@Ys_R zLkW8fL;DgKeiR_+hz*9Vc=X30BN*V{Qep21_0T3HpJ_b?YKZ#

J4#G@|cUBw8%*5eQd{QD4w z8jhF7WFhQ%)xa|&8B7$)1OgL)Ile$NFugn`9ibyB#J9?0(6qpy0s?qLB@C!MpaEam zV5u1327oAGjtLM5oeJg!2|}zogc$(u_=krvGKg+`#}SM*`a$~mpFDsMN-)V3M2m0N z##EqD$LL}lP*0Gk@iYdQa3qocvQ&8r(~KZ!3TCZAB%U)6CBE|XAD@;UfC%VjK={F? zm@ zdN}YBh6J|t!gM1rVh#`BDb#7qZBVMJyC5MKE@7$w9WQkmll&i&_$=GZDWH?%#RD;mC>>;+iVCrW&K;EDR5YdG;GubFAHi?hcuXZiD{KJ~qS^qB9l!SuCSjMGr~x$Q=DQd={HuEyA(Z~N*8ZzEX%S+FxgKEJ5jsc{H|ix|6o6GyF%5_lpxEeu7O#|s(fE)4 zvL=113jX{?PJZOt`1VPiuQ4G4WG7m$6 zXUW9`{ml}B;{kpc?XCQJ3_o757*mH#c>H_?<`~KeCWav1>MceD^$Wm)aDEjASxWGL zv=>D|1GB-XmCaQ!lOL}_jCj&_7<8e*1HE>rCbUlC?=d)Z1X95Uj|f7Pu;Ch*XMVpS zYW#d7=02(rSs7r-K@4T$I>ZRSYsP#-?17|`B4m7d8)hH+0W_#Ists*mj!sMgDvm6W zFc>l8w?APRQ3g;$&?G&WMRbHXj92T!^z2x}18bL28nD6-OKgI9GBtz=M9rKZ#fYM1 z^E0^cyCe^~)U zOGtp%EM^|X|7NH17wF6Mc?^pnh#Xml`0*o*&`p#JRD&M|BT9mFCNmU^281pe`fL!| zYk1(a)J|IP6`YVeDvV?V1{tBm8*)LMXc$Nf+>^rY!)Nn=A9o@4(76LNQR0pGpo=II z;u;au&92QH0zaaskg+!JOv>sToN>CZf588tt2K*?I9Y3Z5 zF(R()%mqBBI&=?Jg9Hq>5o4+0$wN@ru7DAk4ZnF9qC?}MJ_?1S%8~U4UvvywBSlq$ zDY&r*%Zwk?hYlljJm|z>RASp0^4UokoNoa!!L+1UI()GSG>S%wCKBMw2s`2&{>@p) z1QkIV7%yQ9l_3w*gxpa!*n|wrh-Y?%z9B{uVm`9r_q#(EP>V4h&@hT3>j6gs=!SN3 zkmO`fNEHndedsQFLkj39JqWZgV4%iZT!J=HN5HD_N6;V&Ji2cBL#hal2gM&kLjf}9 zkcSx_EJ6b4V!{0e;>QE-V3e^V4w6KbgR-!}2hyQ^c*z6^-B%$U#1Bh82ECyMLtjvP zV66wU?*a54jTMo>1DR=*hA!_Q2zvN8H3&lOF~o-C0NrXJ!O_EdG*~ixR33B{-I)C2 zJ2hSs4=tj*4d7c9`sfAT^25WlSPEE!7R1Z-jt~xvIFI6Z@dhXib)2wbAh`ql^k5-^ z>WCqE3%Ilusv=XeP&Gq-EC>g*K`H>nziNZXkc`8%?T`VD3?TpgT@B3D0UbhUwjB@$ zlthsrt;Lw|jf!5(NEZV!5D|W4h=~0As}xS~GsM4t&eTANHKCH0gl4x8yp8BAW=6=c z!bb?%cftA}0Vd0eikNXy!@?sF`k+ih@EK7QrRs zX2HMSfKT5MZngwg723btX1U4b4Ok+gE2Kn3Lc6%{9tGSYusGPNA^!dBgg7vTaCIld zmT+E=2G-~z;QC#_k9!8FAG#-LcKl99@U)W%j%>);;J7h}j*gv({9i^+Tf(-VAQ{x{ z`+P5Q8o^gmYAi%V693{MB6^B)al-ANATGp{rB6U}ixVQs35#_@>QJQ{FvAE3cLM@o zNJHM~-BC=e2ck&u^rMBpbrbyEK!}fg{~?NlJwI&O197nBTqPoMvG=?n;dSBszv~6) z@qi9VUx)L1AT{Vf06fW?bk9>fB-d$YaWE|Jb4{uUo(f$bQ2l}aM0mhVI)3z6G=_iCgfZ#Uu0B3}0 z1|WJ=s}_f8>NBAAJFU$PXh}+%~`%;c-d~%ioZHj#&%~1GmP(3mnS- z_2)qbXN-V3?m6-&f>D8{q+Sqf0@Z(G{Y;LqN+6axMt~(UT4c;fI6OLo6DBM%N^n|j z6p#h??vT;RABTX+3_Bot;ABAaYfF(watF9p{eM~e%|hV6Fb1|R=lH>a=bu$gbquJR zVA~-dg5}2(*VAK0F0Z3of4tD|gUmz-EYoOgkr7 zLZ4rH+2eo%O_B{#v3qsZ;6aq2{09(QBH$PSB6so(F zWGNE(l_v>G&Q1a)SQP^3d>li!v!GNV6w8AIN|iRCxRPNB>Z#^hdZ|HLy+K+c{zlz;~T1svZGAq4>hw0gO{&k`}&nSP#t; z5@s+Dlw{r{Q2yRG{F90tlzeN4OjzJgjW8d*1@ve9pAEk-0xP(EV1kYQ6vcW0*f0s- zq5REf8A2(IBv8Q31iJE3F9PsM)DB1u8!Y~5YKGMwy&3NYm)!TaC8f>;7SxV}IS zp4Etw+BgEp{19yOX_p8Qb1nhOWITZat~40o>A63%8Ou*e#EGn8U^efbZlCV#@YBNh zB|>kvAewaV5h&o^V;{VK`j4iWjIZSkz)3QoZFdy}6AAp_R)h)J2DVJ}0q0&!ru?_*$_Yzz;qze0$>5<#mUU=nk{<%TfWexO@U_~9T#gY`+n zz=h92xNhx#TzN;v>}La9Q39^;{!JM8^g0dR`vW|YkgFD0>BpZZTB61$c{;EWxdWcw zyIptB*x_e}E7u6lqAVu+HWm&D?bs;Q9>gp~1Q+vnwWC=?*^~th4%O zQf!-;S406XPJ_7Qck$oB!-v;_=Ub~Fjo>1P8!5y4RbV-|e20Rrh#YGGoOn$Djn)Xg z>WzRwZ+1XxL6JsN&ldPe$F27zH?ffgQk3Il2|@R(XIVYyjKRyM(&xk)$!g zsy*P+@$v?=A6-c#8GW>V0KP_Ggnt)*dgH(N!Ic%k2;%zm25^14i9lxm`Dbq()ZQ8s z2P~WZU;4i{6Ij9h6)kMq2c{6R%|^|iRc{_t1*UU>;O;HORNKFVkiJDMZ~g?2B|jLm z0g4HI=nBDq}=I`!-pqJr0#|CG>ha_AZv z@Jsps{4yK(m(V|cT?hASQ0d?f1$C?s0pAW2KyaOgcAexe0AfaWK=h6c?WHJ$BJ-I* z0T*oO3O9{_QRHypZ%{dKskRrbG?EIH-+-b>xkEv(+x|Qqs^67-29ZXC0K|7iyoUzi zS4HIK5qV8oWGoElu!9@Yf2O3-HlSSE3s-ML+;HsnpN!DliCq2)ve85G-<{MJJ;JJj zDE)-$JD$2B^wV~{Cdm98SgRFwmD5cEVLgf} zv{0`+Pl&lCd z?m=q?tM0*aU`G@oc>hs|{r^@hZqA{>Ixx)?X#cyTaaD#h_FxI;B%lHcI1DfB!JkOYg9g7J9+WPAX2 zLk0j0N8T?RBOn+2h6IbQ9Q_D5d71z+lVQ<)t2h||%g@5PWLWfwZvx5c62~;C;Ks{s+!G%HK8!hB|6AmXQSbK<&o;v;|5w3a= z^ym4%C^d}ip)@IJF9ay^nT7LKAzw_!J4dIl89HmhL4V$<> zKJ@=V7ZEh;CIoZC$d{IJ;G}_^XAqOdRDjeKijwxjF;rOe!TJJ0KS!Xb#LlURoEo6t zWB;fzd;k_XL=EaAr>ev96W}8s#eZi=Z^B;z3ix0;M1d+qrOYw+TZuppg}`sY5A4e0 zU=k|Dj@;oACRWjHy+9iQapTs7ORBFThIde_Hty*1;gOB z7XhCmVE7vXI86)c0WN=k1CalA4MgN+YwsrEVejF1$<|1B4_K9nh~9z!3Jwtwks|hp F{s)XMt@{7~ diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 06fab8f..56ee004 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -85,6 +85,7 @@ import org.cef.CefSettings; import org.cef.browser.CefBrowser; import org.cef.browser.CefFrame; import org.cef.handler.CefDisplayHandler; +import org.cef.network.CefRequest; import org.joml.Vector3d; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -262,16 +263,21 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS @Override public void onCefInit(/*CefInitEvent event*/) { MinecraftForge.EVENT_BUS.register(this); -// if (mcef != null) -// mcef.registerScheme("wd", WDScheme.class, true, false, false, true, true, false, false); + + if (!MCEF.isInitialized()) return; + + MCEF.getApp().getHandle().registerSchemeHandlerFactory( + "webdisplays", "", + (browser, frame, url, request) -> { + // TODO: check if it's a webdisplays browser? + return new WDScheme(request.getURL()); + } + ); // jsDispatcher = new JSQueryDispatcher(this); minePadRenderer = new MinePadRenderer(); laserPointerRenderer = new LaserPointerRenderer(); -// if (mcef == null) -// throw new RuntimeException("MCEF is missing"); - MCEF.getClient().addDisplayHandler(this); // mcef.registerJSQueryHandler(this); findAdvancementToProgressField(); diff --git a/src/main/java/net/montoyo/wd/client/WDScheme.java b/src/main/java/net/montoyo/wd/client/WDScheme.java index 7e21582..40caf0f 100644 --- a/src/main/java/net/montoyo/wd/client/WDScheme.java +++ b/src/main/java/net/montoyo/wd/client/WDScheme.java @@ -1,149 +1,196 @@ -///* -// * Copyright (C) 2018 BARBOTIN Nicolas -// */ -// -//package net.montoyo.wd.client; -// -//import net.montoyo.mcef.api.IScheme; -//import net.montoyo.mcef.api.ISchemeResponseData; -//import net.montoyo.mcef.api.ISchemeResponseHeaders; -//import net.montoyo.mcef.api.SchemePreResponse; -//import net.montoyo.wd.WebDisplays; -//import net.montoyo.wd.miniserv.Constants; -//import net.montoyo.wd.miniserv.client.Client; -//import net.montoyo.wd.miniserv.client.ClientTaskGetFile; -//import net.montoyo.wd.utilities.Log; -//import net.montoyo.wd.utilities.Util; -// -//import java.io.UnsupportedEncodingException; -//import java.net.URLDecoder; -//import java.util.UUID; -// -//public class WDScheme implements IScheme { -// -// private static final String ERROR_PAGE = "

%d %s


Miniserv powered by WebDisplays"; -// private ClientTaskGetFile task; -// private boolean isErrorPage; -// -// @Override -// public SchemePreResponse processRequest(String url) { -// url = url.substring("wd://".length()); -// -// int pos = url.indexOf('/'); -// if(pos < 0) -// return SchemePreResponse.NOT_HANDLED; -// -// String uuidStr = url.substring(0, pos); -// String fileStr = url.substring(pos + 1); -// -// try { -// fileStr = URLDecoder.decode(fileStr, "UTF-8"); -// } catch(UnsupportedEncodingException ex) { -// Log.warningEx("UTF-8 isn't supported... yeah... and I'm a billionaire...", ex); -// } -// -// if(uuidStr.isEmpty() || Util.isFileNameInvalid(fileStr)) -// return SchemePreResponse.NOT_HANDLED; -// -// UUID uuid; -// try { -// uuid = UUID.fromString(uuidStr); -// } catch(IllegalArgumentException ex) { -// return SchemePreResponse.NOT_HANDLED; //Invalid UUID -// } -// -// task = new ClientTaskGetFile(uuid, fileStr); -// return Client.getInstance().addTask(task) ? SchemePreResponse.HANDLED_CONTINUE : SchemePreResponse.NOT_HANDLED; -// } -// -// @Override -// public void getResponseHeaders(ISchemeResponseHeaders resp) { -// Log.info("Waiting for response..."); -// int status = task.waitForResponse(); -// Log.info("Got response %d", status); -// -// if(status == 0) { -// //OK -// int extPos = task.getFileName().lastIndexOf('.'); -// if(extPos >= 0) { -// String mime = ((ClientProxy) WebDisplays.PROXY).getMCEF().mimeTypeFromExtension(task.getFileName().substring(extPos + 1)); -// -// if(mime != null) -// resp.setMimeType(mime); -// } -// -// resp.setStatus(200); -// resp.setStatusText("OK"); -// resp.setResponseLength(-1); -// return; -// } -// -// int errCode; -// String errStr; -// -// if(status == Constants.GETF_STATUS_NOT_FOUND) { -// errCode = 404; -// errStr = "Not Found"; -// } else { -// errCode = 500; -// errStr = "Internal Server Error"; -// } -// -// resp.setStatus(errCode); -// resp.setStatusText(errStr); -// -// try { -// dataToWrite = String.format(ERROR_PAGE, errCode, errStr).getBytes("UTF-8"); -// dataOffset = 0; -// amountToWrite = dataToWrite.length; -// isErrorPage = true; -// resp.setResponseLength(amountToWrite); -// } catch(UnsupportedEncodingException ex) { -// resp.setResponseLength(0); -// } -// } -// -// private byte[] dataToWrite; -// private int dataOffset; -// private int amountToWrite; -// -// @Override -// public boolean readResponse(ISchemeResponseData data) { -// if(dataToWrite == null) { -// if(isErrorPage) { +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client; + +import net.montoyo.wd.miniserv.Constants; +import net.montoyo.wd.miniserv.client.Client; +import net.montoyo.wd.miniserv.client.ClientTaskGetFile; +import net.montoyo.wd.utilities.Log; +import net.montoyo.wd.utilities.Util; +import org.cef.callback.CefCallback; +import org.cef.handler.CefResourceHandler; +import org.cef.misc.IntRef; +import org.cef.misc.StringRef; +import org.cef.network.CefRequest; +import org.cef.network.CefResponse; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.UUID; + +public class WDScheme implements CefResourceHandler { + + private static final String ERROR_PAGE = "

%d %s


Miniserv powered by WebDisplays"; + private ClientTaskGetFile task; + private boolean isErrorPage; + + String url; + + public WDScheme(String url) { + this.url = url; + } + + @Override + public boolean processRequest(CefRequest cefRequest, CefCallback cefCallback) { + url = cefRequest.getURL(); + + int pos = url.indexOf('/'); + if(pos < 0) + return false; + + String uuidStr = url.substring(0, pos); + String fileStr = url.substring(pos + 1); + + try { + fileStr = URLDecoder.decode(fileStr, "UTF-8"); + } catch(UnsupportedEncodingException ex) { + Log.warningEx("UTF-8 isn't supported... yeah... and I'm a billionaire...", ex); + } + + if(uuidStr.isEmpty() || Util.isFileNameInvalid(fileStr)) + return false; + + UUID uuid; + try { + uuid = UUID.fromString(uuidStr); + } catch(IllegalArgumentException ex) { + return false; //Invalid UUID + } + + task = new ClientTaskGetFile(uuid, fileStr); + return Client.getInstance().addTask(task) ? true : false; + } + + @Override + public void getResponseHeaders(CefResponse cefResponse, IntRef intRef, StringRef stringRef) { + Log.info("Waiting for response..."); + int status = task.waitForResponse(); + Log.info("Got response %d", status); + + if(status == 0) { + //OK + int extPos = task.getFileName().lastIndexOf('.'); + if(extPos >= 0) { + String mime = mapMime(task.getFileName().substring(extPos + 1)); + + if(mime != null) + cefResponse.setMimeType(mime); + } + + cefResponse.setStatus(200); + cefResponse.setStatusText("OK"); + cefResponse.setHeaderByName("content-length", "" + -1, true); + return; + } + + int errCode; + String errStr; + + if(status == Constants.GETF_STATUS_NOT_FOUND) { + errCode = 404; + errStr = "Not Found"; + } else { + errCode = 500; + errStr = "Internal Server Error"; + } + + cefResponse.setStatus(errCode); + cefResponse.setStatusText(errStr); + + try { + dataToWrite = String.format(ERROR_PAGE, errCode, errStr).getBytes("UTF-8"); + dataOffset = 0; + amountToWrite = dataToWrite.length; + isErrorPage = true; + cefResponse.setHeaderByName("content-length", "" + amountToWrite, true); + } catch(UnsupportedEncodingException ex) { + cefResponse.setHeaderByName("content-length", "" + 0, true); +// cefResponse.setResponseLength(0); + } + } + + private byte[] dataToWrite; + private int dataOffset; + private int amountToWrite; + + @Override + public boolean readResponse(byte[] bytes, int i, IntRef intRef, CefCallback cefCallback) { + if(dataToWrite == null) { + if(isErrorPage) { // data.setAmountRead(0); -// return false; -// } -// -// dataToWrite = task.waitForData(); -// dataOffset = 3; //packet ID + size -// amountToWrite = task.getDataLength(); -// -// if(amountToWrite <= 0) { -// dataToWrite = null; + return false; + } + + dataToWrite = task.waitForData(); + dataOffset = 3; //packet ID + size + amountToWrite = task.getDataLength(); + + if(amountToWrite <= 0) { + dataToWrite = null; // data.setAmountRead(0); -// return false; -// } -// } -// + return false; + } + } + // int toWrite = data.getBytesToRead(); // if(toWrite > amountToWrite) // toWrite = amountToWrite; -// + // System.arraycopy(dataToWrite, dataOffset, data.getDataArray(), 0, toWrite); // data.setAmountRead(toWrite); -// + // dataOffset += toWrite; // amountToWrite -= toWrite; -// -// if(amountToWrite <= 0) { -// if(!isErrorPage) -// task.nextData(); -// -// dataToWrite = null; -// } -// -// return true; -// } -// -//} + + if(amountToWrite <= 0) { + if(!isErrorPage) + task.nextData(); + + dataToWrite = null; + } + + return true; + } + + @Override + public void cancel() { + } + + public static String mapMime(String ext) { + switch (ext) { + case "htm": + case "html": + return "text/html"; + + case "css": + return "text/css"; + + case "js": + return "text/javascript"; + + case "png": + return "image/png"; + + case "jpg": + case "jpeg": + return "image/jpeg"; + + case "gif": + return "image/gif"; + + case "svg": + return "image/svg+xml"; + + case "xml": + return "text/xml"; + + case "txt": + return "text/plain"; + + default: + return null; + } + } +} diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java index ea162f3..ce32abf 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java @@ -110,12 +110,12 @@ public class ControlGroup extends Container { RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - double x1 = (double) x; - double y1 = (double) y; - double x2 = (double) (x + width); - double y2 = (double) (y + height); + double x1 = x; + double y1 = y; + double x2 = (x + width); + double y2 = (y + height); double bp = 4.0; - double lw = (double) labelW; + double lw = labelW; x1 += bp; y1 += bp; diff --git a/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java b/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java index 477baf3..3d85d8e 100644 --- a/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java +++ b/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java @@ -63,6 +63,7 @@ public class ScreenControlRegistry { register(ManageRightsAndUpdgradesControl.id, new ScreenControlType<>(ManageRightsAndUpdgradesControl.class, ManageRightsAndUpdgradesControl::new)); register(ClickControl.id, new ScreenControlType<>(ClickControl.class, ClickControl::new)); register(OwnerControl.id, new ScreenControlType<>(OwnerControl.class, OwnerControl::new)); + register(TurnOffControl.id, new ScreenControlType<>(TurnOffControl.class, (buf) -> TurnOffControl.INSTANCE)); } public static ScreenControl parse(FriendlyByteBuf buf) { diff --git a/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java b/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java new file mode 100644 index 0000000..13a5d13 --- /dev/null +++ b/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java @@ -0,0 +1,49 @@ +package net.montoyo.wd.controls.builtin; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.network.NetworkEvent; +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.controls.ScreenControl; +import net.montoyo.wd.core.MissingPermissionException; +import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.NameUUIDPair; + +import java.util.function.Function; + +public class TurnOffControl extends ScreenControl { + public static final ResourceLocation id = new ResourceLocation("webdisplays:deactivate"); + + public static final TurnOffControl INSTANCE = new TurnOffControl(); + + public TurnOffControl() { + super(id); + } + + @Override + public void write(FriendlyByteBuf buf) { + } + + @Override + public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function permissionChecker) throws MissingPermissionException { + throw new RuntimeException("Cannot handle deactivation packet from server"); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) { + if (side != null) { + WebDisplays.PROXY.closeGui(pos, side); + tes.disableScreen(side); + } else { + for (BlockSide value : BlockSide.values()) { + WebDisplays.PROXY.closeGui(pos, value); + tes.disableScreen(value); + } + } + } +} diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index 24ce5d4..d155b33 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -64,7 +64,7 @@ public class TileEntityScreen extends BlockEntity { public TileEntityScreen(BlockPos arg2, BlockState arg3) { super(TileInit.SCREEN_BLOCK_ENTITY.get(), arg2, arg3); } - + public static class Screen { public BlockSide side; @@ -1140,7 +1140,27 @@ public class TileEntityScreen extends BlockEntity { scr.upgrades.clear(); } - WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), new S2CMessageCloseGui(getBlockPos())); + WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.turnOff(getBlockPos(), null)); + } + + public void disableScreen(BlockSide side) { + Screen remove = null; + for (Screen screen : screens) { + if (screen.side == side) { + remove = screen; + break; + } + } + + if (remove == null) return; + + if (level != null && !level.isClientSide) { + final Screen scrn = remove; + remove.upgrades.forEach(is -> dropUpgrade(is, scrn.side, null)); + } + + remove.upgrades.clear(); + screens.remove(remove); } public void setOwner(BlockSide side, Player newOwner) { diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java index 94cc668..05c7bf5 100644 --- a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java @@ -86,7 +86,13 @@ public class S2CMessageScreenUpdate extends Packet { screenUpdate.control = new OwnerControl(owner); return screenUpdate; } - + + public static S2CMessageScreenUpdate turnOff(BlockPos blockPos, BlockSide side) { + S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(blockPos, side); + screenUpdate.control = TurnOffControl.INSTANCE; + return screenUpdate; + } + @Override public void write(FriendlyByteBuf buf) { buf.writeBlockPos(pos);