From 8fa4cc4cb5845113302d6e25cd6b8e8892e379a1 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:43:13 +0400 Subject: [PATCH 01/15] Convert all stereo sounds to mono (#1966) --- .../assets/gtceu/sounds/computation.ogg | Bin 71556 -> 49498 bytes .../assets/gtceu/sounds/jet_engine.ogg.sfk | Bin 144 -> 0 bytes .../assets/gtceu/sounds/metal_pipe.ogg | Bin 28452 -> 17119 bytes .../assets/gtceu/sounds/portal_closing.ogg | Bin 14673 -> 10223 bytes .../assets/gtceu/sounds/portal_opening.ogg | Bin 18248 -> 11897 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/sounds/jet_engine.ogg.sfk diff --git a/src/main/resources/assets/gtceu/sounds/computation.ogg b/src/main/resources/assets/gtceu/sounds/computation.ogg index b80c204601f000e66bf40464c0ea2e6a3a198367..f4a2ca0f0258985affbbbf88b6a565088c2e4da7 100644 GIT binary patch literal 49498 zcmagF2|QI__dmYx;F{+#87`4o2qD8Y6&D#YXNt^2<~go0WJ*Yqu30i?O5{c)ndc0- zB~vJ6Duv(C=Xt)*^ZNe(uix*y&fRyPv(DM$d#%0J+Uw{$J6{EG@UP=HQj+H+OIox0 z2*w2qyyUVMj27+KG|KJ!pPX1e9`X_Jx&vEkR$rHaP9<9+`J9+9q$6Lfd1xZ76 zb60N{aeZHBw1=y`>EGhf+Gr^WDG7-S64GcvBgY#74z6C#Xicv`SKpgno{nDrLMP=i zLO)d_W9_TPN>^R32Y8{cIC}Wq^n#K6Q?!tpx+x5hK@UmlqPua!=_UZs0bs``M03wc zTc{+nKrkdHQ|lzxEs>a$nb^(dkSy8r?*uJ9S!_pT_cl^3Ndd=YFIR-+Va7{%&JPMA7Wx1+4X{RZV%^8S^O|Lq4F zYKt1`)D1c{vXkNygi3RKp`!lj78>B7Zi35qnY8Pe-qmpojPU9I5H)0!89A?c)mYC2 zIs&ZC0v)FU1EvCRS>(iBYq@375_fGn&U!!YI$Qj|&Y!my_D{~gT}Q(J{)~L~qEI0( zd*LVfLPTtQB^=y184@&k2Cq;?k#?z*Tea)MCYPs8p6}{K-_=w7eFOpq@}xBY@0wfs z|2ds3vK{~5C&r~$7+|2WeB;CM#)nVSi0_TBDCyr3?gh}CVvIz)eWfq^Nx$(^gwD(U z8gDao2X=I6|2+vO(+&VelB3&)<1I8AMq*>WGG=~CQ+|3=&`_L=$p8I_`imE+BRr3s zvfXfG=hLtM9Tpr^EL#DYI@LclK@TJpd`9OE=WY+k)8sDUpD;ZfdzEPXP~iEKoQHpB z&|~n_A~csmeGj_v4~BF72DPbjOa94)Fgzr!dNK;#JGGKW({t)N^qlKxF6oo^=Fqzq z!@0}l&zYcHV&+4E#^=WWl=m-KJh90ed?o)8dLwb>q5E@kYbf{YM&8!}@{@c28$K9l z-mXux^*oA3-%3T=i2JN=dzheG+3}bV{JaKl*Ra(E!BK{YCM= zlfO{@2gSu1Ny2@C&-$g_iJl~tU4shiwOw@TRFV*iMP(oqr!+3-`&G+pxtBCfT8flp z8exS>{^2NSQqeckRZ*w@GD&=nZ=X;Z#1;QNaa(*t^qeFAbq;;!Fl69|&JiiGtLK$W zj7`h}JuU7B%r?haPX{ba-CCGRv1N__-@y7G&H)h9#Qx>UO#5WXH+eBv)X4vt;D2+D z57V2w9B=RP>D2S-jfxKZkk;Rp9%0lpl-9e-Y(2spFvj9|Rn~e;#&OKVaU#(1eUsz0 z=35p`|6-Vb*k)lW;J-NMghhDeQx~-|kpJNvykP1lxzsb-8GIHQXG5}`6LX(D$X|O> zNb$co$0eyOC#ftUX(b_5FfrRTF}LD*p+{f!dh7r5{2$J_?8^t85a($6^8FX*5F|O& zA#SP{)!Y83k4huZfck5){`Uj`KuD+3`71{Zjl?F5WG0NnOpKNO?;HbBC#3bpq@jV$ z0^k$?XP`-rrAzWnSMyRbCzD*}BPoza6})DPEu%Y6B~Q)kpROvP)RH0JMYT;d5@goU zjY;9Zkcy`6EVa^Jk|Tq}9ugP=fRpT%e9h)NsQnhNF(^s?D6>~ypyb}Dwvbph+j$}W zQU-^`yrNOS(Xl(M1(PYBdWR^wGq={dTQBQBj*o0BjgxO>)ThFA? zb4c3py|KwWi^)Wj<19;rS$4p}c|8m0auT8jOl9A)o%FQM`BzbTOn-}#HJNIXG4wYv zG;y>rHn9kFwAeQ>o4ln1QLpN~XErfuGI_u2X_9^GqrZu@ndAF?6APAzYg2I__ilY; zJ1Kc;A^@UZpLD$59Iznhn(OLTSYDAUSW)q$qRF$Oy6RftYDHm1U%hihb!A_D&C_a+ zb%NjQm;*=6jpp`6@K>;sz`FK=O)Js2@dO7S%~nczKZgeL+?KM zko#$w?0Ajbest+Cn`{S3Sjga?kXjp`zZNRQ|V)rJPKts0T3_SZq~RhEads zy_2G1QnA`XO&M5Ss8v{OU7V4nhva0Qk%tV_DyXOotcO^SL06I&`zpbijGVYcfFJaTc)-|%Ydr2;{V_mCGDu2?=axE3A{HnW5>7?5U;hLw?WUe2!YI58t1tK_j zwol}SefxLM?cKzBChe_D=ZX8ht=jUffQg04oIK# z7|t~3fEx6V9I>Oar;?0E`x{FM)5q#!1)fAfBU%*zL7}9(-_otBVH!hL6*noR!w*5h zsp@r(r3e5UP=hx9$`O8$P6{w=MNqx+&UE(u@~a%ukYwbDr4jDQi=j~?V}_amtyTT< zP(r5$5g>i9AO=cGGDlAcM%XnpbWf45O8s6}WzKe%sCLDyE$V{v} zX+h>Cp&oQ*h7nX9)TJlBRM6OUo1PFdEjQ2*G(2Pi=^$A3SgK>Iy3O6Ic}gbjD`lo2 z5H~L8x?>@N`@nMm=153EE#kDMtN6Y9=^bevMQ z6V(G+WKZ;uWQYJ=_CN&r6^@f6&oA{qiphU+>sWC62sq1 z2akU#={f&g{+G`FAMO4Bmb>O&1wrn=6M*TUAO**yr%f-*39(a(p7fE922%98a-bHY zIAi05R*Pey=_ydh$_w&CC=n8Z-~(}VrX}`)pOKL;e@XU<=oq)eia}+Q@|R2+xk0rk zkd-uypHwxiswGr1X?aHsVmT~yX`d_;Zv;KkJ#AkpSv+b4@h6)@CB#6M?oiX+#e^Cs z?UNg!@rNYDr2QS4NlQvV^zsHcty-V>tm0>#BgDUR4H;NSwZEf%Vi*`fbAdlW3y%gC zLe&XIcw(Vx_~%}1`v2UcQ&{;2S`eUC{&_CbK^>5rWV1D9Sbz)=C0DFpDfgkec5 zB=R$Z6a^K)g?0QLYR4FM9cPLk-2qe~X0q9sX zk|&`X#*~hWVe|_AM6KWQid;dngyye-j01oRfDCFhFK@1VDoq+~I^A9R42FA*nGk#d zAOajM!10kJBqTVc7IiHm_%v?B7QgE&g99-do%t`437$=tlWv2jsxx5Fc1aABeG(XqIQTM1Foks-H|LOGagUewyENM{;I zsh{g7u58**R_@Ady~)ddiJrEU5d|Aew!b?IBl*w1;2Y>E?W0QFrt+H(QJ`yEh;HZ{ zwb%vhrTw}WzYSM^pPixjK~`gUXx|b6fUX2Luz@{x@vx)CT?7>Q6G(%X11NMMrX2uE zu+>aYX9UJK9UzN~9Hupo&O)Z!DCh)qwmMgu#~K>jW0r^R7LbKHr)DRJ+c$m&Vrris z+|ng6Mr`q7qT>^Wi!GOu-xcr!u56Ag=h90=lw0Eke&Vw>Jn-vSt46%ga%J(6A z&OGdZp-)B49ZH_PMDSJ2TcskVqf!E}HLwB~U}H-4{FL5eT$F62JliQHqYu({fX#|p z6qt`KHEmwX>$@+Wc z#4If@%CNi&%T4m^`EF!rY%>GHD5(tFpI13W0cvyF3@NJC&$#FjBflE{emt`;NJ7NL zM%daJuvXq)Fh5-u_i>%{vp6P=&R;dcbPl74J}o}-=SAez?iniobISbY!wl>gGoYAu zn?~@W@am0 zi(_ARxPH43{4`P3R5*>&*Y|0u0waKg7I>M>A-+JIbyu`sVQiOA?>eXlcm_twq-z zX;}dwba!X!7wgdX&(GYe=-b&13L}DEXjt)QYj`cY+*z6dxW{8Lv1*t{LGpkOeN~)8 za8YVJ;G5$;=Fm%+=^wlXGpKa0POH}G z+FIxpaF>{aoKN8h{5!-&Z|W%VDHVbkFlTdz(UmpU@&n3*J!_L!6a2j^suaOwJXAv; zRzknE2bmLoul00aPq}m^i7$CD)IQ(V?3r0(Bo*K19~V1&9oB=y%ttdj+EaxFeo(FcED*~24`}w}B|6 z|L_?VMZuq&asnu#?&;qB7dzkIVdN*8+XHm>j5TTM{|wHuqEXyEiRbHPC_uhxKY`MF zlj4tJPw@zpBHvdNuS#Uqz_Iim&#{39ZyQEJVj1=Z(nOKfNoaQkOan2;lH z4gcu#>f^z_JlHQv*XR*-sp}*xzy4!`~;(jpTQu% zOBDqx?>ji2#qkn1%CIBnvwPVEaW~3TC;=~edFJN}a&6SdKOs54AXOP!41LmvW=ej1~`>Eb^y;MS7yTlu^_mN%R94HLML!h=&< zIMQLZ%U`7jt?)`Dx>OJHq(&UL3e$0skga6Fe!sX2`P6#7>lDDxiH0}B(WK$%j|a1# z3cta7`J+4aOxoIyw>|gK^ifL8;KL*b)45jHDW833WSn}%$6pf0D1g6L((;%bASxM! z)}o%m32;Fd+IFcFa^|s3dg>*c=rVQe>Z^tK29|qIR8ZM!Sl8<%-#FPQn%P!46+p$~ z)i6peK!-~pZq2LyD(`2ywF^LdO;NdqS`Z5xXGeINj&C|O?uOwe*?oST!35Yqf}_&8 zoTIZw)?FJf9wd>wwVczWzEMqa!-|A2!#sv#&}-oEp;Vu@32T$i-D`s$Q*~|j-A0B_ z4BqRB+$0lIL-h6T2jNR8a4*Vu@7lc!)4r{a3>4=ZcMGfUo66r^-AKLfj)tb zljYAJ+UpiU0MGIH{_U>5(7WJ+2?w~Q;Z#lV=r|o$8KoQo7bPPA>WfT-Z#7_=Citm~ zr=8|i@tCv1HNJcW=SSMJI;*ri9_xO0j!s^Y^0=Cm83qWvc@F`R zBqhz*{g=V>m(}A=eJ=o-S!7H=t;@sLw|9pePIr8nKrzN?%mcwI3Ifn z+EeemEL=tA(CFIH|BfPstQVBr&}fAFnUA^oj(MSuBQFaKiWv9Uyh zyQLeSiZrBkGm)VNFHPpi+7O?NI{p55^&_3p`YP!FX49+=gC<54d<$zZotH(b8grG* zJ~oc7Hnr!Q>mEZ+udCf2kiyAXNRrDJR81UmE9;%a!Uu&o7Uz z`L86)7CzC9K-~`Vu>F#W5F`ctKCgpR%Kb!^%C^5r!t#6O$POXpCsZYd=d{8p8yys^ zV0#9jMKxXUlprMbkaXzr3irM1V@JB1+9i2T+*)pl#WX_vEEMFXW{`1azMy(G#Wc|B z-JIoK<>k$+H}fJ%?>gTRKertph-{+eD3b5T@xvGe;$LAJIyOTgYcBTin3?9@cD!c9 z-kd>OkOJ7@dX--PahLcF?p>=MdXx$>6JZIjEolJ(+ej3IT-)Sw@L^@(@h!nJMAz%`jbBXd_l*c?SN!3dtgE{( zt`BF{wJ{$XO>sGwI7#RonaufrVy!srlL%k=c14rk1OK~$0pi>G*D?q^`7#SGelWjh zoJ_`TV~;fj9=-G>>sTs|t-U!u%>PPWzH_EgEloxt;oHlIkCYf8%@%|-V&hq4E9EHf zz{F^7?l--kZPa&V+W#1NM&|*Rn`6v0_f1wYyyPHMDBk5IRV7p3%|ta$2>bmR7jLXF zY#hEYOknRdBAMr0#i(}RQ2@-s+Wq`PXS2R$1*T8UPHLp2X=MG-9U;~*ghri0x6;Ce z@eBnII61(MGGLpEhhP@s?D{-v;|owy(`Ng9k82aU`Ic^^W_ra5T?Q z7r*$@PJze?n8FDNu&@v85dK3W6MRbJ2PK@1zs~*~zHi8u{5u5}RZ3OW;v|$$Gjovv zNht1ijWJb6Ct+TDLb@E-Sn%6E;k^761i)FAz>UEuzZ+w4z%hDUQE z?B#z*OiqNblMUU9g3j8pJ(OoTME z#-E?hOtSd8sKHZXii1@Qwk_gz8|oRrhvm8PpR`F*Ah7TE>L)Ks*Wk^?OX@(xVC>5x zgFzI{M?-5BA%uQhQ7GM%u_hkd9?I<{qb6jh+@=XBtbfKjEMOp>rd+bF;PaqQ` zLJl7@xpW4q>8ZL0iU*fCPL9knto*9e`RuhOfOYu;?KFp)HQt zoCE`Z_}jGCHcZ$FMq~GWLR>bYX-@EWVf~82yR{CdmjmqhkH3gQ0O+$QlE{G5Oj_{t z*ZjHa*cI+c-2v@WuSvD+Ex4BzdCGOdwJdMX4Gr2vy2FA$iMr4QjGwx(Icl(JX_Mn( zM_o+PdtM-h1pl(FVpsUWv;a#(-0f)f&2Y@clrGrP!+CzN1@CIhF=?4rUgk*U*4VQu zdwkeKJTIXbl&cN7i!HzeNRPTLoleINw#Hd5Z>Xrq^)Ga6b<4TfzUman?7x_9gsem^ zzLxvQ{=fjd#=5c6S2YXjDP*c$En^BbZMBbv%h*Gjxl?A?xsqcwtv{D21HPj_iqi(H z+0h(E_ynMq-hq~GQ;`7_SM!|4wpn@7RO8WuAA=izsD^gcZX-~2i0eP51whl<$Qyxg z_nVU^_O{&Q-0!aCO25|BRR7v%MIB6iE`o|=CQlGtT0RRcT9Cwa*r=Q$==XDMNDRCepFgjRt~@s%Y4G|l{Vn=q;JII zvTS(v?;JaQ@bkPBxN(fef(#1Wo@aKCXwkVh?J6Y?$be81FX(V`YWuixvFuu}9GL+~ zzsCmEzSY*S2&L80{_$Z?owBW*q_uPPp7UhToiUQT-!_%7+wRmNT;hX!rXKqK^mZp3 zh-jWGKB84a+LXPx+Me6!6TkAKC?;8&-TI@n#!{~fTlX>KdCG`J zhw-SGz{Jz^fEst}kaXL`ygS{%=>-4fA(YOY>%n`cW84I~wqqV60344KopxgcH0(e@ z4KZ~J$lDdluB?BrDt(nIIvY+Y38${pV3Mh$k^L?*!*&f?H_lwY+C5J-`q-jC<1RCA ziIFa5R+19u=fVI3bl(P=tr2M+U#Z_x0FBG8F2&ikITzVBxjUawkl2Bp3%0T*Zu8~< z;sCazg8m@u*1%)r%Fx@bxp3+muwOHv_!T-mRv4v?z2d~F|5jNpuUMcpZACmJ*ozdP z#mWQ3@o_EOm$j|nJ{`aNk++HG7UE4LC$5EGZnCbGR?C?zgPqbFYGT~t^IEuaB{3JP z=1JuYV5PV!_0v~pKW)LlKOPDK>|_J}9}fir`Y#--h!YM?yb}|i7~f0nC6%;eHJ;2*N_uI;mzjn(%ZqzFJm#ZF~{}MW+CKk zXCvGx_*9?`{#U=eiv~M5W66A`9yyOkeb%^hJ#=-rff4rU z+40AjYithVTFH`Lg9@AgmqB(V)^|W$9&N?;(&pzkl$EKW$;6veuq@4InhpKVOo;`i z9a~pYj{HnXKcLVb@BBm&2t+FgL&q=>5pTRDT8^1vK1`sCoEoJaM1@wvSMht0Eb(S2 zeN4BS(UKi>!|lj*_yHoG&3dh^`VMm91ErQ@mR7iyrXe4s%9;Rl-7l5SLu<}W)0POn z%=*TmZbtGo)(d^Hdp}cD#*v11m%X(441n9#w*_}V5iBIr-7mt40?L8L2I}W_;e`VW z)}7hZTloA27*HJM2RJ3%O>mk^RxrJn_xvuq$7yBL%rdDf7GEDUYA9uA(z?*Xv5ry` zH$K87_-~aVpL}49bJwOM)07FAc7c%t!OVkDS2`h5!JNn)vJWl2pJk`3U&d&I!!|@4 zX|c;h`WeAG8`#gNyO1bCcR+qVNV|$*ZqH$rqW@!ac;%EmB4q3P9)u{3&UljRU8-ZM zn};7S2R_x8r01<-cka^E#46Eqi{p6Q+hyM9C=II<)C1c6!mtXe6rRMq$rv>?is{@n zkERyNVbJ;D6&Mamoj!-;Z$&i1LHhB9jDR_E(#Rmxmz{&vJYOi<;_#r+l>n4`sAg5I zH>S!9I_wyCqGw)h{UPj!A&4;CCj@!+K34s^)Pe{(z-_vYEgiwS!naeeGHj1Y4y&h z3TN*4ofmeN80#^7s-e(>_`FU-Ob1KHH)I-;(kH4Aq{fql#U@rWE8qaQ+U!fw?&it{fu_5WXHVq1$ z@P#)o`^+)Cx#HOa&lhu2eQzqHqn~|(C;P8Wkl&0HDx9RgBq%7rSq5Y5_ly59LGR#EaW7`@2YGP%-VigWgBtdRlW(45$WGb77Lu%!YdE@ynDG8LJ#bYxOJ>J2%6V^AUa{ymXY zU4#LEw=q>;;G0Ds|Dlapw74FIV6g_urVR;(2Cy%1G1;~I7qYBHPup>~TmqG3=Bu{1 z)A@krEk&iss~kn@BUrE5c#QeCmtL5nPqn{(9WTD1}dlIiM>7sT!n~fy42BNrJiABUH&m!=InppNi9q_!yMvZ*^D) zyJ9JTo02H+M#a|kIhwC!v3u8PacrB)klj6!bk#WSMI$%Jx()yc#JtPI7&1n$E z-HImRlEv8pg}cpWFHTF+RE&{gZwr+-e_J32gd`*|=&zoHmMhEml&1j(cJ(Uej~dv* zf$)iYd=qMGo*cJTIRH|({Rat<&8K(wjrbQ^;GqC772)x z`AFm(*cOR9i-S?UF+$Mj;vL?If$1`LL>)LrV^6HwIZ;;KCn;P~?I%9Ze_&VPb z=WbflCnOSgUuB_EoC&mideLJ9srwZ!R*z7r3K_q%awhN{gI(O%&xkV*nyJ9jNG0v} zF^~QsCiX%VT=PC_=dpzZWZpwQs6|RE?&__8KjOD_P_i7qnUnyIxmL;m5sUgvhC2^3 zkAE?u-kxnvQehJ`kW8d&EXReKFCGrXOeIVx%D#fd+3kADRN;wa#jsS|XmGh^l<2@Y z$5&3xmWEa=`Z+p!dc*z)NSyx*Cc_kX%OI>b1$Hm0gPJh~M3{2yn0;>aTZ=vZ&~do@ z`w!Jlyc!@SZ2=qrlT9#%rN4xw=RCULCmRxBHxu}S(~tb-%hGo@WK@jRADT%#^Eq`# zur5<$&Pzq~lQ26vlTqRm!|zJ|%_O%Zn1gD>0tAsp_wqV!t56Ti-sd?gXdq6*rWDdQ(oH`kto?`w-rnZl#5c{>{IoG-2=9K{4~;h(l!9QA5pagO+HDS)AoMk*>3mcQ}mk6Cc3B8<=(2-+RqIvu@_C zYpH_ckGLJO^5Uq2RnVoMh!$A2Bbg>q^l#&L~6gQ?i`C=ou^? zT70oF9?>ux=o6a7)+P6=i0hsutoE@jX|C~{xflQFGJHh4Lw+^+wFe=B7T{-jU|7ge zWqvgt4upd@PN4v>v$Zfa0tQKHMI(?cAXom~W45#IE9<;wL`ZSn6O9oApa_o1)Yu2c zhZfjx;m|kf39+=qik@BWC0)tQrTPqN$5)as-98Bgv}30rq|VWOc%ldef-LOlJpU|# z@ObKCREDy}@lnC=?R0d|+Dh(ilxBpokKYa0uMPU}0;M2s9cBM#*4u60W9duXAk*qK+aYB^LBNRd8syF?v?$+MQ6ZDmef&!vg_gFj$Vg+-XmnZF>D zwev9yI|w=)J^uKUzxx8==~)02J#dFwE(B(%1JM!h#GA9j&=;A%+Q}#jW0rn=l*}%7 zuNwBfTW)ed0?dDf>Oz(YEUDbxZ^kk88QiOCoVoriNBLT$>sQTXwaD>)P~IANO%Q*b z79n3wb^1si!FC4Nm~oU}*a@}rRyppn<>H*mk|G4cKGQM+z5>jZXq%QFb-%tG8;{Ut z&w0P4M9+6gu5tC1h#;f3r}O|jZv5RH80dAvEhIksrJL!sYdj>?Wj6Dm;POGsbvW*@ z1B$T4T=2ZS_fUd+1WubaG%X0Y%s9r+ZMAA>BRj5DB{-qiNooP3t3lM7fCwgo#^Aod z_(4R-t+12}WLN!L2`**n2o7^u9OPV*5d#K#^ZkstOX;QcRU0#no@Ms#48{ssNoXUT zFQE<%=Cbx|e@ZnZBr&jJx6^k>PIk-=NQ(m#x4Hj(ZIk^GGJ}~sgI5~Hp(gYvPwL7@ zbNJM6DQ=4uuV$JZjJ*Z z0rb33Qo1?mCVJ0C&82d4Kw~MA)r{O6s|kPMM+<=S@eMe@P09E~O>#o2916E;?z&|B zwJ}T%=*fme@>zVK00zsA9P zSyo*CNd0`~@k;IbY_?>+rwx5Wh_V z&^t*c0XW)AG4id@RIcwccRkZq(`!(x|NGTFFYXw1l0=lVznzFLd1 zf%j((T)JJVq%c}bk(nF}8{L1*YhBc%e5dq@N5~(V2b}ET+(#4`6p@VSy&8T|NtIlA zgb6@3&x%l)nVDz3`DTfMje1v#)>frS2Z_VBToFIFv!{-pJ#=qAGN!VnowmWws43WR&Rx^zB7|ZZ+|0xONpEfw8Db(k(;=XvdXQ=VwHzUvDYaE z9Fe4WCdd`xru3Xq>d9B`iP_aA!#hXnF&Pgu3mba9&Z_QXkKL7~^qLie=OLR+ZW3+) z0}G&oqx@N{J}r(My@x=7s(2=x4ZY^wK(FaD~GC^9!-j_ug4G=il4qIZ3~O4lyriA233 z8CC(;)Et-`!*2tO41P`woT~g&57!tYlq3-3S>;ydMzrVfnI3*Jk@JsZR(@()A1qQA zlAc)}01vc}I%C$W=ypsnKyT)~?bj#)AE5nefKsBrq`tJ{E2i=c4BFaT6#L{G2HV@d zfMCQTEUIAIB*Xf(JpG9D?4FBC$_qL9yIBjF$-F}^C?@U`<8FTu_K)7-QdZWJj;sB1 zsGHZD>Y&Ae`(The$lJhEO-Y93?WCn zHyp(>wNTQl0t6dq7n9B?HL%cYN$O1fx{4h>O6?xuVw|RM3&R;+Lo*&(ZX{Axo_G=h zF?WhJ?)s~s%=h^U_0DB) z&wGa?-u`|taGOq!y|<$ITC}tmm!0N<%Jr{r`rDoNI<^};lP>KRESV1)0^;>);i+Hd zLo~bJ@8?iSai}{lEh)t=3C^oT+&2GQGd2I1lEUdJ)Rgp_Pjzx+0pS7XX58WPPnQ9g zN&n0ls~jCmdE(7aXJeu^9DOukay02ge8iq4NslHGSdbJQy2bk&v$1{ zGe86LohDoK`tbVe0S5esfZJ`{g zr{_8}H8cF4d{rDF7{C3K>0oE)V;jFx-C$7*4Gk~|$lch`j(Feo)Kx?{v(mhr`MZFh zTBFtdvc>Ij`0&BRShwF~V>zcF0u%h@6XtD`pV4|cBJcgw@t&Ig9d|)0aDzGM@$(G7 z4qtVma1y%vxi(VZrq`(8sYE$%#P`$DCxU5Ng9p*!9HDK$$aD_h5-4TGV()Mqs9~)v zSj?<*ll-pI(RIyDz8L&je9M-x70Z*AD-|==EELJi@0v8cawS!XtU}rzIc1>S^8=$c z)-rVgYhC-Q8J5RVoYI$d$|C#*9-8ggRLIw9ITS8t0bx zI%N~uj|Tz8okYKjKO~#<8GiJay%5!+SIt>qUQzPjyi9P9oqK^lNPXaVMAt3RVenWhAA2t;4AWraWOSl zIZ0uFWe94z!65USo%*WtUE9r&SjujkZSw=jt#3dUZqsf2Blp>;CJ7~5N63XKUjnM0 zJ)YA7PGrRtJ_g(D7#GM{rZdxZZrQ4%k!z^53+-;8ttbd^jAImdk@hww&o@wrAjGe9 zBD4%A3@e8@hKJpIo;~vU$I>=qtyL&Z=^e^uk1g<#?(XaSujf zXYeiajt>5It&}!NHaqKv&JqN0FNT%R*&&HXjR@zaZrR4(sEyTnu)#KR}v<)8+kPII0y2uuTJS~(B$3ta5=Jn&+EhFNb2eVxfLLZfWlP) z8w}G4jtpQdP;kqm%xSClv@`obcLp&Fk6(y~vEV3)a6w!?2_Q0R6RrUcZ(vYm?N)YS z;aRR{ojGc3eK9i(O_tikohO>OYE3m~f{n}>@aNx=BokZ9e}-pb0(Bq0MjpU`cRB6h z96z+h-#UwsfYZ$|K4gP@58(u$3;G+H8CW(K{Y;ZMLoXPp-?=24%p9Z(n|t;xDpg;h zAq#Z(dpu?FTaD4e*bZi~3x)sCA+J}yi9VVV1Qh%(%PsFdk-zSTvWPLmn=5(#*cW2*_ zRKuBegZHYWAWx{~MObcj#8A+O?K$aCZ{DD1^`63OYZpzlzo?iT6)6gH&U7QA=m`7% zs>k#{50~2ixDR9YG?vndg0<%n05656wxeO%D+EAW7-Za@*WHwloKGLnvp}V?oooIT zB3STirvaN~#AICB^Lr7sVi#0J(dW?iSk!0EN{07ndzT^I^U*i>N*)=xK|>{XiXk&V z-#hRSfu%1_R}Pgn-==%BF{pc_^}mQn78OW~(MapcqwOriT-#g#oZ5Z%28Pk{f{22~Xd8J?* z43KJ3&Y04IDSOu;FYaW3P;QbUpzP=m>d3usS=iHpYHdO^ja4lVymoWO`z3z4Yi2nF z-rqyx(B>kLbT4;ng#p-!J@~3)0Xeil?;jT$4RAC#`RbaWVQ{~freW+QdGCcIA>ltu zx@?AW!aqZ)^>l52U*4<}AioH`!6LlbSN8{ofNQr26Fb`0MObk}7U(75^2lGjsXvBQN z=~OQSN-2*OfWQ&C(C_bTUDMKzMUM{){YIDyemp;bS3d4%y23d6@e(z}tll=6_wQd2 zTZqVxeZBOK)8N$5ua@!PI==43-O7%IA}KAq`I|Hnh+cnc0D><^(A&|IZ2jc4ir9b6 zTrdK$D#$nK7p5FsW|&(Hf^fOv>0z>B1ZSE?fK0`3D4ajV4x~kt9i}h)ylZg^EE}KN zi*u$g4KMJ{JKxu#%NTxt6n*(Rc?o_Lwss1X?>!eMue=8^jgvU$t~O@zX;%b+6SR$9 zT`vmzaf_+p?D3>-V`6R=+An4#klMMRYOL*i!}FFUMK&l@sQ-t+XI8V`(Zd&RjI~ku zn|ho;9S-5b9T_H>3`5^7%7X;%GfD@g=8+BIXYRukKB?L6+GDkwIq*gym!go%7KS8! zjO~G2eGG0T0{gIcf;y^-ICJZx3Cu|G$E@OD+HPo%D0FB$K85vmY{u?3F!cZ#}<`2QVqDVyoEAkLBa?oB&G`J?etCU4`Nev z1*MrH@~V0%6r7=!KgaXA#@MJk#ZPr1$r0n%#58viWmV`6e7a^XLmxcrGG?_IvMn z(I)sXPo5I6^+kY3iaUz;IetofI9^d3u2|E4;}>7YnUF`7Kq4G$_4d`~8-ORi=`pv7 z_HIwR*Sn9umHDfu!QK0=pR0;pzI|oG8|T-<7~eaDfIOH6JFMm!I}CKFk*e4~hJ)yS zxmLCSNYib|A{W14mdsb(@glUgHtK7)lnQu*11w=kX1 zWo!GvYFB1{%h6f!n{Fxb(^16np|!7u1>|}PkU&Dqh_BHnP(qs}5~__C|Lm_4CGI`2 zExy}hSjyz)wxWL3fzNRe4RE#qRO#$%DfL!3m7`!EOd6_4K6f*-6dhgRDTrTeeX+v9sd?0NlP-@ktU+qKB}ern~9s1^L7kuE(=>65GyQY_X|B!F(Z zSqy)v-+h$>W|BS#1H{$$D#wn(FVb1{J|;}QF<6|5a8&`qN0GQ%T92)t?K!SI-4K@EFNZZoZ5* z!nbdR1PHdsQowu^16#jf-#y%*7X3zp`8J`CGy-h1O%0c-XUTzbKtGBxy?VIWW2>{; z0imQkHB1O4-2?dywdmUItuk#GsPLyHLfD?OR_aSrAG&wc|5>_3?Zmd=K`psJKrNnWi~Cw* z49n|P$%>}yB0o_eYDVn}gBG0z8&GcQ9}`n6b?Nie_)EggDgIyTRa|{YJXAA{qx(pdLr7GbdD2H z%RwJMk`t3e;NuMV-l|*p0@&~_&%+022eUWdKdyf%8wz*Toy^|02jx8Px{S8axaw!P z^`{V{e4;__8L2CDgg8O*UAIPbS@E-k8@J&oPu%#SN%#Fm@~$V4qw#tB`->W=5EO+iwR0N4X}Z@bNL=oJ>c8?n zv+-bGq`uSgjF^s!iUiKkb*KGq+N*Fekwte~IxQj(%EpAF|0}wmpKL8iz0@7`BN!Gy z4V*LhtC0jX+}e`RYQ@04O`eVwA2FV_!coDRo7BAL2CkIu#=L{Rqyu#CYpcAH0O2QH zS;6;e>Tk9)iFXYOvKJC-+S)yKX_?m=PI6rEhz=5rGk^rRM8RpfS{zcML~>A1{Nm#&4|+c4#sD^6 z{n+EXH!5v1ym|OhAFRCvaJOUmK~&{sRr*p=^~*32yY;9hG^nKbtgxU;;oOUmRXG*G zgy{PY!wf(zP`HBv*u<|EgaiLY-TrfGD&-l74<;PdbE=cf4eqNkPMEH`G>v9=_;5AO zGZX=r-Pt6q%ALH@*_`&t_?{ClgYdhD@}j#*qvXw`L6c9ES6f8{nTSsGSGgs)lSz^` zKaZ2e>=t2e#gk-Q*?#O?X20i=G59i9s-5YrO8_nJ!bs#Dn89!VeI)R@*$Y_*1zm&s zT8wb!fBP|h{l|}SVuV{%Q)hDDiN=Me#NLTbOSye3G9~R!%I)aLs9SN-x1&QMlH;Rn zCL6~3q*mD7r}8AmYaZ5rJc>%&hZA(*wM#VpU|JX&@K$QRc`ncaOAioqin1ao#ARCA zlZH$(U>HbSBWggVk)#-pnh-|xD|d*25!`Mvu&AzO%<43Gm0V~n-Hr4_0ItOIlJG^j z2z4{_q$3ICcNvNh+Fa*VX{0(tVqW#$1R~tO($9hqadYV{F?3Tc_S9Qp@DnFJ?6CSY~%mMwkn5LSQt6G=sIo!ePz+1@N6itu&^3#jHh{-`&|B7 z)o=(U>%%dpnfm}S=sX7yln(#V`J8$VihCsg zBFM1f87IppkV&ojwRmH#cF#wv`Z%ttJ{t}>dHYcUb~QPcptLC7;n%B9d&DC|rZhYy z_VVHK^Ru6DcQbCu#(7VFzoIFlxqUjsD5+5A4sa5yu@K*w9XiEC2^7N9{i4q`yq)Mz zA1D9uuI_S&c<+Kr6b$@OxH%)4h|z2k?-$Un=EO8A+{K{bs_=yWSXtJ0+`wh&XdvlNN6OTUfM=OfYNQ zZFkb@{AK8ql~5`q;j573XLoI((>CW;kHs0%r*&Dv`vDPOcZC20HlcWZz!59|RqUD9 zgITsO9@CgFPpJ7F7`gm3$=vN5m=pJn__z#`O}`0`(-2f_<)h&w#8hK{Rg?#8hW+hmP{e;~^r zGq`rq$6uJoFf@*e&*=^^WZnj627Rk#v7mV2_c-3}G@Mt)Q%C02J;{op?}uI5RU2O> z;)@1nIY>D03}MhlQ)cTpY#ryV$VE8Dn`qFRni$5~k69pPZw9!Y^);dn@A)iA1qfiu zEN>sB2&5Ekr5LFIS5JS#qqnU+XD-w(kGY#(Gp63B{qxfov;gk`ZtxOLJcZy=1TI7m z^eMtN_zG452Jh{2LDxb==l>A()lpG)(cWi*p+mYEkZzRD0YPbLkQM<+>8>F}KoKMr z5J$SC6bXqTM5INK5MeL?MFHvNdwlP`>+_G%wOlh#oOAZs`xpC=!VjHG0GT|7(;o&U z0fY0iLMTmmy1l(045|z+abisvkrQcWJDz(Ng%#MF-%9LBX#O*JaL-OB#S8(Px+Pvcnk0+}u8VtPMsQud0-X=gqdX ze5ejNH@3U5^hXgt4ziDUAPlx!TVQ!MVxt5lW%v~v=v#$*?Bez|M?g~1W>ZGjShn5XDNhvRbXU~d9Mr2{k#s}_ z1PyTaztL|kvt$dZFq6i;$F`9h|bkprZ!%F~6P)j;KRJ!qk82EUXd zh=5!De%?u?jQ+3dO&QE2ueNMp*BA2);gVENkTQYo++0u*6n>gF>b%R`_VDAU{OgF` zZ7YBk_*jhxEs5h;DXansj=y)8V0kw7#Y8GI!s4B_i01QYo4l*&_BNT=qgZ0v3RH!Z zE}jB#5BT8M{&dbmBLgjn{Y^{Mb$wmG&$p6wH1SqD7emgvXaMl{TA^oilP10(68SYa zCg(Vl=xmC8RX|F4+Uk~GkLw3Z>ckb|&P6sr4d}Tb)8!7mFLIR-1T7RUKvsUMOd^>Z zbw>xCTpi7WW+dUQS(`-gJa@cFDkFnPS4ERGdV4^Gv+Zt?iY5^@h#tZ+W+9|J!@d)x zOY#D>y%5mES6#}&WbLjiGsD0m%qK#hC1hChxUa6P*_$5a;_*jzG1b~g3 z5duVjr1>|{23dF-I6%XI)h9VJj7C2Tz-6tlt3yc}EV>Aeh7`F?^DUuFDeU&&=DxsA z|EBkS@KurDiiR=AQU*JIl_#`uIK7jC*4b+!0bygWL~=owBiU`NBd#_p`Siv=oYD80!I`XpcN4l|<6GfPhl^ZCWV^ z;6xC(#?lf_zJcbaoc0<C z{6h)VhI|2mM14^dcx@FODP1F&EVrX&$iHAII!{v1$qE>&F3v+zY-*y%FP8HWGGtaH8j3@#?&sXXIA$nh6LU!_1tYJfh_R z51`3zGFPZqDXOgs`9!dA{bdN`bWCAId!HAtQEJ*`Q1}m1MzmR-`Sh}QT!K)99 z*Di19R@hsszIrKrg#@iNT42P>`)(w@6lCp*!>NdLqN@;pL@kZrngBQ4O{Jy}_U|)6 zW0WWq9i{mfu~bVjY^obu0qCQb=a~=a_i$@&V#7ak87ao@okAp>KBE^YpyH<*Cn~1O zpaODoa*~4$*~~S%U753_)GWI9TNLSb!L)(2A=GJp1%x5P?rTX0>0QCyD&9 z+x2iVD}HR8VvJY~K8}^SQGW~CIMgxWjsjqH+|XnBBrmbna^%ASuqq{=u=^16T(huU z4{Qcc2+Htum-=!!(H4nJAbvd*=%EGp*xL#}TlU|$o&{cD+|ducU!-a9oBe7!2d-y# zWTxk$mm>h}UFI&=zbgp=VMuE|&l@e`HOkZ{n!VU=$VJg2@SEM&-f0B@Tl9Oxwxhoy z_>a_x2>4t}X+Js{msrVf1%YaAq@fQ!4845CDDT8E{{eGPqkCtC7Nhur0SLB)ZO`O? z&8CMX=_VuzAD@mfkQWlwf4eRQO-tZ*jasnjU@dpz=wR+c&mWX86U&Y%Jo>F!m;i`A zjoaK3IbHVSdGCSw$pswM)*~*hxuMwgKaY4zlp$t zATk4}U%%F^HP=c>WCUhBPV=Ft2}q*LyxnTH$ovSAGB((asXc+PAIyj92ij<7fk+B= zrb$QPv5ZqTBI!|T?thcfTnk%psAbw6>fXiI<$2@hB#6*J?sUPA|3Xj^Kxa`6$M*k( zRtE#18G7wrQ$EoVecw^t_|8}?gi=^NMB)WtNvW~_r1tcx3S?x<)Wm<#P(Hsf%!z0)zKEttyl$`euRj3|pWwVc3)0GU zWs??Qj4wlP8%x5ucx`%*h2#R(xFAGb0zaGkPwa`?B_i9mwq3v;c7Q?`Uaxm;vbN}c z-)NRqO5a4wS)x5h)K&NEjZhCBN5G-ufl=d@YJchdx#@FGxPRNGs0j!44bFN1l@n^q< z0x4K4LNe1OK5*ST`+a_27Ik$mC6#i)e3(e2p|xexHgRla!@{5n)~v!by!-%iDx;-{ z$FGyHhp(D%?|L^oaD4AfIXiBe-@G3DXQHFhGRx$sK5IQNcdYIK_ysn1AQ*7?A)tw4 zx^P2r>q)qR`M|I>!?ca*>JZmd`<(zQOSdcT4W?cY2X-wbM-mBof8Sr3j8MtHyHNE{ z;k|j8=d-Q6_Qs;_bq`di9UPm2gmQusVxZ6eVHn2oG_UamaVnQb3$lUOK-xrf#4%rT8zB_9Kh+Tm9*~s=y}N{|N8nV#O*^4 zoiZ{bIJlWyQGFSvUzCy(O<@d;@uiAnMP z!9IapoRD?H-z&&J3eC;M!|CsR$0yj^+uO@4FkIDQct*h7(lTWz>|DI~;S^?Cihqp- z55aa34FZ4yY=fQ3OUJWoJ!wqIs&7YL<O&W;l9CBc63${6c((w=A(IQ%|stny9vxl}Lq zM5!U?v%kdiTZfSO8`Am^{az*`KMuKT%la@s&)fjy0_n%ZZTD_F0c>Ik)xbvqQ_uY7 zVvp7)KIx!Oirg!)NoysWA+k>;K{rNYy6hlt02iq)nu#cV{?3V``W{yM5-NQ{&R6{( z_Tqa_BmHWG{505*FP(xjiq#v-|F&HLX)T0QSfPp#Z>ZX^>v89ZyH7@CZ(s zzPq|v?Lz)X``2)7CJIV0>*fzGlikar*P>7=6)R8I3EZzrk3&F=N40>Wm-v^A#b;f| ziu$&QFmj}07Pf&4;GSg-j=>@(vag?+Rr}|E5f)4SW%sI@=H?Wy$HxYeq&P$qa^g|1 z?F%ddd+k}a^)sxgf={151B#a5KC5I?Peq!+t2_v39~Qi9BF9w7Ref+eGArYZjk1SfZ|dP(NI_%{%utS)eR3=AEc;}% zd4|>l*KD;u17^tUX(_nOijR_FJ; z&Aqc~6V|uD?9kHcNt=kZ`!PUcF95;@8|e*S#U)dk?}P$GwE6IlU~Wo6%G!s&2vk`n z#XJ8Z0x-JQ0mkc;ZOOqn3Cap6O+I!gUw=BbHl|mb{brK~p?)XAEtCZ4Xn5{Vu3UW~LBJD`;hk=G#aLRFp9Vl0M@)E%YP% zya3aA{&wPTAV;^IZCVd@Ar%fP0$iW#tZfUw&O3fp|H}1 z{md9J$Y5sru?MfNk`FZT-HUWcWTo7{Phhx^i?nrLS|VT+a)5=kzZ`wD{QAF5NIr{E z_>vQv>+)(~BiI?ShGF^})F+@^ZKty3Th|2*9MTJioEs%CC9&Yo>ni$A29+SuLEkUm zweRKI{WurBZ@rqxgQyLVKAfZmC;qVtj<+RhC5W+x8S3C;zyhUpOzA9_58LupDwqLZ zO;LSq$a@-j5`bz{bpx-|9wx#t&Hz7_%1a`xEG+MRyX*Et#IoSSZJ1&3?P8i+@64c` z2(x2});t>#BBiL%nRrXHtRy`g_rV;_SvLIr>ZdoYk~OvGT@gKIlr7O;XCO8Hb##FZ zGl_N@F(9nu%CgBe%Z(1t|GI9!(2rtU^!$7wR`_K#-Gv1kpt66j=Yb%tx2q`)edH^2 zK+aVbCm0RD9^g-l>Rk#Q-Ghlvh1pY&GR$m2c#0>78gdVOEKBeM*)- zt*k)QY0hqDvH82FU9q!k2NA7^_`PiFDGAZ$ zD{d&)FQA>8t|1k0+=+I&S7e#Rdp5B`7kASXK(|n~PRM0i@brm{F+U5P>65{8QYRC& z-vQlNMhe1m>_aC!gY8QZrJ#!#<;Jc)nX$d-~sC<@k7af1=+WRu+7={7NM|Lt5@ z2D)oND0|{DrM1I=LzAyO69wdL{t1hs0cTzRXgW=R(NSUX7!u(##RAB+!QLpa{Dwm% z=2Se|q0^$+z|R}&jvA*Rb{v+P=)7+5n(u>nXC8amJ(I!GdlTaVLM(UrS2#2&-jm!q z_JaD#roW;RQXfeYJOA?~`QdPs&ZCD1)&Xn$*g_E&Q0Q>_h!_Ud%)-LOU5mm{9NBA1 zcuo(F-)g<3={*xW+24AHN6nZT-e>gf2Ep1cew>&LIId&6t0O;QEF>1k=S1>CZxhX_ z%zI|L-qFit1Kt1dzOg1d3>&Fs{3KbXA-Yhlk59Mk*UuOVj#6x}JQo6>p_G9O)K_^f z(v?okD)F^T)zujGs1?#;zoXE827dgL)^h6n;gak>qhYq^#O+c;A;naq^CIK)+PW9* zulZ^$lUO|P62X-d>D&h;QgwHf8GNF3!T4WoKM#IW??@EN!)w_={c-(M;#XpIo#^JY zd!4+OmC0zjlXIBk{k3wRX@n#yNfNcbfW%%y7GsTnL!Z$bm;7cUdFW6#xWg;Q?|EF6 zZdv-m_r@hfNFE7&N)*4x9_S*jg>i5Jb<%bW3RM+v$uWc6!?@3tDq(yjm zkRjrrox1xTOcsaxP(DE~1|=x8B1N_0^Ie>UD{|BY-dhy)&2&PrX+9%xSq~7@=M)Hz z{pA{8`YtapD;oT0P0iEfd6aa|$DvA4=t4Js^&W)WLO6{#xnKo&6;S>_s*Lo4lqEJN z{e6VIVJAyU2;0NuRboKmUV4I$kpAoy z94b58LaI%xy>JTFh=^$>)zn(X%lhWTc7p2uNympj-#22%l8=o!oOO0732Uhdp#`~K`o01M0?3~&O;WDv17B89?+~#{=Kt6_${oNP3E;j#$5TLFN+|GxX;D!ZfQ^+Q@@9)98PV&0i4;ps8 zuy23$_tLrI1l+M1Lpqm82&*GQ-Jiuff`dHoT%1ajvWp{DCt3QmpKZI*(e^=!2-KDR zxxTITn1nkCVD9ube7x9E<>e6L{(?j75#P?aKH#&}FahBTTots2gfv#@_Lj9BxSrNJ zL`(crb+(u#1m&VRva}|4{eq41w>ZljYX??EsFlCl0OjM4pl4lXNZFiX>Q zCl6EpC2G9DGXoHRyxOH4!p47|Eh}WW@&*Ou!;OZLcV%H3Cx#Y{+(E zp(o;esWCYiU!H;sJFI?Jbgs=ef1_JkbR~*p2-#5KR^Ax<`)JEH*6@5PseU2K`HR$? zYp#ect+hD?v1^X~8=e#X!!N{okjA;y$)TRq?2be&3vj+t{%6Bwj`hKvmy`Ferc?!< zK9sX0XRkqEMJn&>B)yX(mE&VIc>JhsONQ-A14@B4R41h46jpDWLkVc+i)$S5W0_P3 z<`kFl3cMtoEaV619Ta488GaZ>@)sOPl~m6${DG)woIFz8kkUie!{leyi!H& zO-I!h@fAv8FKtrGUF`T_K2jo&$JmH`)nEmQTUzzxaBX)wBWIM$>`*|2GQVx<21dJq|;%~k7yNf9HOlI9PhfVAI|5-$?)jpv2~?99Jw=2U71+jbZB__+oe z$pVut2=|HcRxGMBXQsJ%*j1vcAngcWfEJXEa6Xg1>dC~4soBD?<8?*ie&+}dm)$+x z1;wPFw;d?`-Q5It*BiU-U@1f=Q!s6TZQl4Bl*!f*QW+WLUuK^q9n6TFd8SG^P#oal zb~6igaHF#egc&V!UVW>YW!SewjTz_u0>|9?kQ|CJ))B?odGe=>8@jUz0y6Ra za%f4<9bB_^$-G%fHp!Yje-iHgW$+i7>z4=5Am`ZIK^ij9bQ_;XTo}YYY`D|Xj`!f` zQl64T)FdaeSlwb&jm>sO66~FBg$i7j_|ZMd7qI-*>V}pU;(6C+F8a1&{~ZmZ6k4D> zG6f|#=sP~M_r~e8Jh#Mj-IHJC-SUCjt?S6yG0wHh6A|Nwuq!Y}AtOB1FQ`O{XF2&r zD-m$A-dp8{`#dlibRT@*`|1v~t&Va!bpw>1Ess7-;(pm}fn>vLYOa!HeS^w5N0_|H zT_=(IJ$-I9gE1!`Q!;wi&FP_}E+4x1!b4Wj!q{~Tc{F-nJP7H0-ZE|EEkX&k3uEu2 z-f;@J`}1k^^lfK|KDS0zIlyMei?2=unq4gt09lQ0=5o283 z=pj3lM5$i(W#I{7wVc#@_nZUoEIYqZ;W&F4P=xYc1fqE)B=QV}&L)|+tC>oD8mjUk zkLqx&nBUU0Q8?mCqC;;JQzjWnx;yp^HlsVUiruN0lYXC|F&K%GFbmw=bdC*?>7xemue-~o;q7y0Y}{XNUl{u@jK;pfSGMY1r+ z<;9|FKn$$n;t&7f{=Pr-hz|T_w9@^d&>fP_3ANyZS#;6j0)h5xQZM7kYwJ&4r6i2I zA?CJ;f|%#@K`co^1o>$|&M={hc*+W5w(H+!i#=Gy5S^SQdXmRK`K!MDu0 zyIm@n4g_$%6ZIC0;xwNh*ksUgoxd_@s%(?U>qE@{})@G^=2lY9P`Ea*`F~VK-M^^u7ATKf_>L;I>X~H`~twi*tWu zzQ|$Td|03+9Z%S z@bdQc_YZ?0h=7nFKUc4yJE8vGLBYPh-oAc5-hQg)>^VyK61`wgP-M z`;D*Org|9IzOsa3(fjSAjyULe1sAkufJ2s42tX(%JMgM{$gishrIf=~#G|2=RT1NBKKE~KK8OnBAmViJBLZlRZ2H-$ysyF~xKhFq6TmzW zpnc4mJo5ggkk5<1P+^Db_}1675R~tld0Xt4)426$asvr(szb0T>AwXvoX(LQY-V

!JQeIJKQKqxuQ-#s`SOpnod!rd^0Ku~vhc$E&EPN2L$J)fccy8*1$Ds}ZbL2!CFpD|{#qM( zV(rqD+bSv0T@0_mYpz&T%3&B_X}44%>F3Oc>6MeKKk{z0Ii5$E{~A$AMFIs2Wa5X-8T4^oDNMuTGM$>gKlr?o0xEo{C%h}!q~S1|zdQ|Bul4z2}l zcZls>GJWHk)RzhBANIiMvDRR-3C7W_?kBilq48Yf=k?lNH0OM`m-co~M~ayeLh_zO zK-YUa@yowcaF%XIZb*KrQW`fo!UxflkC~_ibM}Ek^mo47Za+f~Nga>1-eab(F?i=* z3|I|u5D2*Cc(%g82X6>9@vR$xo$E2R;HF@pnZ==YGK{}v)a3;N&! zzT`$Rtd};goX7fE{3h|+6BySDNlJl)Q}!0~p$DnsZ4+%zoQN!+d+^AN|529rWf-r& zg0PhUj}i6yA(sA6TGL9BXY-ZcUMo*nf4G`f9RQ7)jSi?l`9h-yHm3i568>eS&$N1I zY*DHjSooRR5IuH`duQR>w*j7)Q&jOtpi2A&AH~oByk2gwMuv9LmL;x)e^Bp& zv16@+>Lj4nmD1LFMprDO>PlR{Anl9pC)boou=Hd=wR}GG{Nm0F+ehbZ_NyH(A`&yc zUJk{M^OLYfx>p+=`_6CoK4;zZuVR~f_&aFYpMk*)b5qIKc!^9ndq_^Vk@u|FO7_?5 zi6@+OXUbJnX3ylT^&YGFwk%!(c$}TXO(a0Dw$_SeTRHY zNp>mMyxI*v!ay{oMh((4kc#uyv6ZL9wVivLPvg7FHY78wjP^9+;bw7g@bKG@1^z=l z7#Yz7)B@bYO#Vx&THIJSR=DekRe6qR?*SI+D?pYmy#$VV8}jnm-PZn`?|Z67_m-!U zrjmyAUx(Gu(g^aijF${%)EW1g(BNE0|IHqU+**26LRnjDbsq{^@RVj zCj4@&{&ldq&=mLhY0%l*dEPbg0%|+#htr%_dN`D=%gt+QU=zXH_&BqKitwrCJi4%4 zr&#ZIv%{1)wwWHZ4~~YVrI;SlK=At0u&H&M+OM(sIaQ=Do=`m;m3e6iKO3eI400BN z3y#zro%>)92TGv4Rv)9l1335RHTNi2x)Nu*9+;I;PPY+@#@;OX%}x!^5{obYHgwg| zf9H;gd6LxYo?Gmn*@5l!&qr{<<*Cy48|_Y%idEURYN2T`TQBm#D+YMq*Ssh!V2b7SN6t}|gW z@TR3@(?8PIQN?HMcB;Sw;htyVYEX}BkX%^_IjbMP6T$l4CVNamR(O}Ox0Y z23#5p@~};RkH4K8LQUn|uAuo@%SuW=^1`n;CcW{E&gO|K38+fEgaZ_K!{;zApFb~R zq1#Y}TvCaPze>NS=4;i3}hLkuyyf9@n2KPr6N_nJbHIAc` zI1A7-cn0)JrPH&1FTK#{{`t^No#}nnt9r6s$$^lhq6HBM*N>C%4YZ)e@|t67X95Xw zJREx8_W_CEOTm5oAv?JK9R|)k6aoHC43xZwaO=Rpj~l=<9t%U7Dn zuK2@ohl?_?@lV{5)_l6Qr_H%XYK0IMujE&0Ga-k1RxB{0DSQX@<}QvAD7-#Ri1XXO z^ylZA!G;ba1?zN~A8(8Iwk!x?3#6<{EMJtR*IT5!%|P z+^(1h9TUAwsxnrrWqD%0Iz3dh9{gMSK5TwBHor5T?nkfG7ryY(r}w{r{6HzVwIw%< zb8jAbqW*n9==Z4jzy~|ZG2)n9BA`8H4iRp=^p^4LwQcTsH#oB86m+w=ulTZsr_m4P zzquE>^}N9>B}dnajGEAIe1Qgt6!yr`J(|BS*b|ddnfE!_4J=yZH8idde1en1G~wS= z63z`M7hLAe{t7w5(7Ao*(YswXVqBRpIkNP2YoxLcn7^*Q`or7*@GNR*RwZDsG3Tzl zbyb+xSNk})xBq!dj+rL(O7FpdbnYJalVEvX>O=jTTU*VdT!SjI;{JxAIrHDXRj?15 z-g1eAbw*MXV<_nHd9)BVo=q_zY=t`}>Xgb_{B0?TLfq+h2`IAY#bW=>R^&p*sp6i~ z!OEu?A$OGc#Kk4I=v{)L(DN6t-Bm|vB`A$4=76@4)BDJpG9`jW;4Q^e0p8h?w}}`0 z@)VD|C#f7~lu8e_zCqyz(PyOTf@0yHc}x^-&OSJr{+-CRZ)@nDoEGADtK(Z1v>LTl zLq@3M&-l?d&4JsuRqOnzuWW@e$(>T$4TPF9W%5K3x9$6$}pQ(B&`k|`<@xx4@>N1ZGz@+FEmc!f>WFuKt zJ@J=eV09TB&tnt9w8!i6e%iDw1|=>hk&zfbP9==CUjlP7!jK@q6#UXotX8UOAR{AT ztO7h@hM?+M&n%eo-DIs3K8N^N&%>0dv^)gkL zLR4PY%cVK;y-gDYF{ic{82yX`ma&~T*!LM0Z;KUV(hqXrqPV8`slaXk4x5DFg=iL%CU&xJ^-VwW z78m8`m+yVOB4;^K%JdQBZn!rJ$!8~1hx4Zwr)9LE^T8%Zu4rt80?;1_wYRe5ep0l* zu-`|z`lTYPxn;j_4uum)dUM|FLrOYsr?;nss;>Ew2D?RpmwWIj4z)=HdpQQ8UFO|F zd2A)*V-NL$9nq+H(<`A@F>gQtOdtm6ye)>q!R=&A_bh{b&- zkqiIW6jtj5983f!3#_9o!qvc_G>&k(G~b`w4Cwlm*}Oc z2La`@D9G6hn5ki#Pm9oKBg2|*nA&v;zc>o1+s86wP!gVH`mKM4DWC^$+otw~5>Wpv z8`#5GOjxekTMYXt@zjc+D2snPt~OJ1Mbw%`)YO0skUA`eCG}~ORa2ckaveyQBwmBw7%XZOs`_;&x-!Tbvjp9TP?H5}?U^}QCCo4Y=y6?VQnWOHX0GyM~VaRG0AE!x@2956(Z?+i_*h-eI+# zgFE%y!9aU&+{(o(bDcZ~y=?ynLKOdh5CYP@fUFn|KK@X@0MEdH2%d|+e!ig|{yv^A zegR(o;eNi5AR@xo+tuxkx2M0G>RWbt@=Md6wtC0dV!3mP#5KgU5(owLoIn*!k3YfN zLuY|_r5drUtR!J*1qKfrZ;5GsWdOD>V1N&3D;f$p3xPGrCQgI3N};uq7&H0Nxlt>DV% zYwZOEEd`JB&e}EKLh*}mzLRSFcunD$5e$>#k)v=N?NJDj{Kw<6lNb&(dKP>z88@$| z=t}gIVC=kx2a?30Y{T(HR3&dd9m@It>ZIjM7WtY?unzU|p6V2!ho%<3YhprsSTy|? zAX+$ir_<-Rq$uMTPv(%GIx8f0rAza75F%WStxGz&$Wa%6PK0A{XuJ4_q5VGwk9nr2 zH8{DVV6kKV)iVU*2JweSoB&r8N`WVb8oqK`eN@*sI!Vz&CG6e!2J%`;;>6WQVRRiY&sbt=)D~KsDAirqd372!S;hGx z-qTz#Bbuu6-D~23_MB-}c|kPpoJ8dBpGc;q7TDq|hijDKH=sH7UM)ZNsnm6&*)LVl z(Q0e8wDg>=Pbu(ckaiIzD#|T_=m;Dd>Ce<>Z zDEmjtA zl>>J0_XBpnu%|a1s}Zqr;fNP0^bQsp9A#(MBuM+d^8U zuT8!=7dPuXwbNccGUUkweGGMH-*lpynPk2=^Tv;a$IeA=kMx(97mo=i__@`7VYvyc zUFKVciRt{FUXD=A^lOYNpxiHiGaRc*4pv7H3l|YdG39|O?|9$TnkT=^apeDE?j#hi zY2k#?ggHI%b0}5FbYHApr!)^>5Duv-XDfWxbZn1TdpqlnOH1r^X4fFz_JF4!21XA< zvvwhw7qZb>u#bvK7Eo?iW>eer#=KX#;rtGXVa2m!Gy7m=oe1d=xH+N#v)^v+-Go`G+}KqUFC@Hbzap7C(B!s~U4wxFHCKNnD0w z&%-YCmK$c7dLtO=V@e?3E_;zuv@w(8t4009A#nZp3nL8h!gi?frZA3`mlZK-)M+al zsdw1;0=1~z2q%o7anMc)SWMaK6(wPLK~2QK4=|obExj%M0C^B8g1lqsO$uNj;uP=SzYW%j(<>_aAdz+CRm=Xd$$x$L+%1R5mqW6_1YZ$Yj9Lg7ik_XBMNcOUu6g zAuSAMy5@u8cUFY2iKD*656^~aT@dm|u*c@R@!mC38$>}4hxx}R&aN9l!)I%8_nc~- zLsbvxAa?s25fIc8>?C7U@CaO93;)wuIN@>KtVvxr0PO{X@9_}V1JOr)y4c!saX1hQ z)w=)TeOBS_zLG~WBDHnxvW>5h3|?#cq_x>OY-RBf{hCl|^yoGC_0{L0o#umF3?=`b5)mx*LU#`xrSf`Sa5MkQG`2Ctlb#4aY z0@G3CTMG7wvp+UeBZ}SiB+WpCxR!4^?30HfuxxRBKN2V7+}cH-g9KLZ|A>oM8SQb# ztH2=QrC7wfdKxECJiDjv*s}Mv84EJ_9jQT~uA4lu-?syIzSjaLn}?N6ff>~JZ#Hy_ zDWrH>u*qu5h-FRevICLv8L|U3n2$z_4lryiAc-_~y#9kRK>q@XB>wPHMEl%hY6vc^ z4{1v!*D&h!Vci=hX4za4z#>_->tH)iA@XtfmK8_>W@EuqxSI@S2VXRnl;Q0!ftkka zKZP#4v@18{3xYNS$O78vvq6};NK>qiz#YqAwKpSv6h1X-@3Cx8vHh&x(6gm{d(h?L zJFw71(RjD1kvuZ=sl&oe1E^b3kkxZYX3CcIT!ARPgv{~Q-bu_x;nB9UM%V2X4V_OB z0Q`;j@QL*%vUl`OvaE5OG)W;U0U&- zp{xRu`gj914kR0qD#TrQ67nhk=B}Ul`orG_@e?hzFiq0~(O3gh_gX4twd!|6@1IQ0 zz9`6iYnN&=skj2XcI@}v+b_%goz8q6*HPD%G<>7j<2+P5CP57^th5cY6V z3<|I;Bsj;qvkehG=+-*T&3bi`K(IMS+unxi{Yl>!`gHG=@vVx0GFe&W(#tl1*&$9J zx}Mimgy;61g=-Znn>2~doP)ayO^T2VdXtKbUoGszi!YINi=m`ETDq+Fv%0h`#XKsn zX-vZ&mbAkVm^PT6C4t`EvFbpGff)mj4mMN2ww%kf(=m3OTR3?25sdRUB;wCToFXLn zFtS42>WDFSIr}SyL@?&L%Rd)*gnu1P`xWJQ+K?7i#U3nMUVP-?a zy&UYK8b!za{Omk&kL2e2gQ_})eM3EJW3AFP62iaS%?+HYL4Pl}49{{}AzJ(SqFUbA z3iS^cI_7~K_Q&s-mwg>|G$4X-w~jF;C8>@=GF^x!vAh;k{Qw6!u3xz^X`I;TrYkVu z&kj*`qqW4_bn!RcaD2TxyXrX7qxbl{%EM91q3EI@8+f_v5Gnt{%X0b)!2a#`fQ+fP zTBXd>hq;!L$uP?|GRO50K4i}=Nvufud=h4~?a*b{(B;eh*}fsu1HYo5LH1)H(jqHG z*oycGgC~;AH|@o^TZ(KE>k}w}Fq$vdG7zv%D5HvD0cffLxUm21yLR}2gf8@u6a=Eq z>|qLNi#P4*C+iI{dON12x7aFR7N{_kuh1yWN(YWt3G+B#+y3>#C9^{TJ~35kSn*8u z&?()B>Ad3(>SyR0{-~T9nzd*#hI5|@YAIdNWx!bAaxJXtiFEmIRn;2nm}#4)(AP~` z2vHh9NON6Sgu0w9{HL~^;u8-#U%yC7g$mbd{tA25y3GJsGk|itB%@OEpR?a-JHDn* zYs4vVzn3{tt=5O}<1Ihk8}TFZ2K3S-$3%DWwEbpT3=D$6*bo)O|pA#pqV z^1n)-d3C-vG?$hp8(2?+prV^XrI*TWX*O;e6^Og9yG&+0+cqPKV&Hfho=FDcAJKUo zobrt8i|pMEha0UA`o&j5FkT`BKE-uUw_zj{Wl-Y9Yi8t9WA1MI687*cY zE@k4%VtG3aZ=p-@KVN{}A6Y;{CbU^x))%ksi+r>-Y}fSeYg>bqy2GU+g~8+m(m-&@ zz~C3Qw5o0SR1FEHtKtW0#xLM*D#rjd&gF8h`Q84&BD6c_$)kR?6JehpU4sf&{wX+PwWuowAl&7VS zSbSYRrLYbuY~;J*w79|RTU2;)C1>g(7)ns2VrMm5;EdVj>I^7!9sWq}RHKLdxn zbO(K#8c6Um{OKc z&weDaol(@2;XmU^(gL&I_PruLcx<8}!8f~$M_KV2F-jVM4A zLJwAS{tO0i?~#%c7>B3lPu}CdympUiqpS(~A*#!wpxY|zWC80mr#M86)j1T4b5Key zv8+cZz_189!5J8a6x)A;{k{%Ei!{nVN;B3I47Ad&kgF#(2yuhJ`QmSpkkkwN)0Pn$ zPRXMC?OF&2paT8-0BRUR1gKd*wJy6oy)t*{t<8Nac3Ij5bEpP(nz84J7+qu^eo+yt zJPMs$Xz@Z(k!wlr!=SC8mmk9u#8Z!iNaP8Nj6lFF7P4o6n*Ul8 z;^iQPY7`cU{4IeY$@t)0s||j_T0aoVI%B4+RZlptiqwnpMnh*4BF4nUWeT<-mf0LJ zJBcM)WhbM-z09#MR6W}AU)S?EjqK`Wp$)TuKgx!sAwp+mHTR9e37|q^l9?S7I^Y~iazo?QV0)jM*!J_2`&*~CU0lwOM`9rez*K2XSmTmTg);o{=cVV$U$WT z^ylCCo&S`CQ};7x_yX?S_73*F6XG2Z>hBg9c*n~n)Zf?J!^gwh*UQVt*WJ(GH8cu> zbO_h8szoSopW92*Z&AK0rlm}#^rZ^KIo?AVkz$F!J#=N_{m`@q+Fn(wHy#qds@FTb zum$n?_|fMX7#K4_0IS{05c&_hKyhW~Py`|Z?Ne$gXi7sy;^H6W zx=lfg-#S>#u1G0mfdi?m9UHH>*_ReUaF&li&_!B z^o-a5bv%(g3kD{P_kn_Br#VDJHv{mH@sA3rBqVQWTtoV6M;=P8=J&_NMoBz5;hylE zlj2lh{z6L)2`8YFbCTw5h4i*eqvf3CA?3ui^3Ts<~BAVW2#sI=l z!F{=Z_LL;7K4C%q9rrq8Rs9jm7cq5sBq!qWT~_RpoMg(=xo~a-QI&$t)3!NIYhIy> zd1mN|&z9${PO@cTMkXr6OpC9(l$$H52R%m`!1?R40SK3y^jE0?M>Q?kFA1*IpXP`A%p&q}D@JrX^8 znv?hihPm45Ck0L(Pqb?P8gR|$SA|T5;ij)0R{Ec zF4wR%MYV7H%6_tQ-=P=thc9p>GN^x9A;MLxLm{vC=Wd;5?1V8jHIx3>$i2u6jmgdj z2vr_f_e_z50@I1&R`KH3ne8npyudBJjtwPnmOW46S3Vp3_F^+^@r=nqmOa1o689fo z-epG`Y4KdtkLcSJ4`psNNQr#wFZX6())Cx1YJUPlV54;(|Gj=s1-Y?PcnP!0zD(s7pv36 zquP(pChbSKtMKuxg`WlL1wgyT;OJj0(t)q7eLtcD8 zE@@wE`^(l*335bg=!<~zFcs(ELR6@?p_nPUi*rNFoywz`fBCdLTG(B{cfP$VSBQUO zQ`$NJob}Js|Gmb1cY1hQDTs0Bx%8;7ST3a;cP|pgO)058(N(9qiNDp^;khE=+&mgi zpO(GFiq@oombqIeXFHiAEM7n0^OZ%!OT5XkC&lD6$4Vcs@uenIgVpK7SG3HB)wL|2 z+WF|nsuw3ck%AWwtt4G~DA25+^T#~CjrNKCwEb9T<{=@UjdIK&Af0HH7HdYU%?nFG zMvfc3E-18Pq-;*UsjdFwQJVIL@JCi~-BPku7O4p+*{bUOIVk0eAQ>ddD4E`@^!1$> zE(qv$e3Yk6q6z1t1+UcO+1Oq*1U`KSJAf$H|IDXflbcrZ{*rl*=Qdx3YE+mV4Ckri zACJnSbj_$oB){;8H50A|lixiafP}~X9CVI1pg997%9L7c*ML~`Kh&*ky3e@<%EDRy0QjY7}fv8x2GWA|rtI=#F2jTng6*??i+ z#1_X=*NiV?0L{T6q}c%Ir%v{4gy! zz*myobX7y0mxOz-3hUIAW8=V&C#3wHLFSNG!84%y?5v=jrE^Rvx!UV4f# zDB4pFLm%2+^yBH|%t(yk|10Xe4IfjCR!kuha^nE z|6&my+c*_tgugVQ_*(^^0Z((BjAf<#8NB8NnRQU*r7T zx8OSSTbUf+hudLne8AS;42d%a{bun@#dKsaczu#53P})l8s$7uw z2Vv5VopA0w3;_e}f_2bhqm073(?S@jXZd}W-SiH30i@mI){<+pQrAJi#z*L-xE0$1Vo%O3hs|{uEObx=T8%5w1_3bI6zbJ z;;Z4oJN2)QUhi49f45*M?K7AWEZmoKkS{?BU8{PPy7GBDm4U&WB`EZ7)RRm!Txd7xu=S3$L1}~_VeQQGheTdk3|AQf+k7P|3Un=Fp z{jsDVjb5$j?hhKyG%~)m@A&{xLdS)`p`0fXpUT~Riy~8g_uX(ju~1{1I%b8%JVFpy zOwd{mtCv=J5;;5SO^esS;k%z#ZM%e--ww+86-`&{I@d@c9_@Dh>hKq_n>|;p67Kv7 zPQAPH&@cdeY+1db^nwJG-wdg?Hen&rk-)cx+oh#^O&XO3#20X+2@O>k7T&zy`-F)M zaKX*XU9cP>|788+u5rhU@YQgB%iA{KgFN99b5~@oE@Rc#Vcn>GsoZc0xt(P_fISID<;6)J!Rb`ReE1Uu+O9~naiX^8R>`X&kv#%@ejy}dHx?^7UbVtz`@vqDLdJ<*1J6U$p51B@3o@X>w&GKH7 zUY)VF#1GP?38>eS;x>WoAh&2TIh)XXQH5~uJHzOAte`Ry(?ANepKV2i)8TW*AHBWm z7BcWE&4mB5FgEGS0sR-_`(JsdQ;H^ZU>j!kFB>=`eA*9a5zskE zR1adeZqW#pN2Bi1IU+8A^_TSUwz?ka1qEiaj^lxU&#+bWmI|bh^d^T;uM@=Y3#hoM zvg`XQ7ew#XSBP?rXFjeS)-H6Go)IdAekVtF*BTBHq>q~lFI5F)!?&-b!OjYSm#LsC z3{;l*{mU()#tuZb&bwcNXzdRmG?w5o{eDvJRJfemip+7vT{zq8Hmdw+Rre49F()qx zW|(QkAolmdnN9Mt)%)j7nT#3LRKygcN6)_$N-&5HA{*dJ=+}Nt3g>;$#@!Rc0E_wu zaipBpbxEE%ER1`yip$oq{mnHms585m9T;G*4@9EGJk_v`S!s+J$a_K^+tWPcVIABO zk1a_t^d{pO_)vN+R7~WRgREtB9g&UE{Mk$(plz*%?MT{j;Fy*%CT9yg)vFc4;yC|C)0K>s%|8>`5SpGu(N*0jp*25 z5}=pAQ2dUqb@RDltD7p;ZY}&t^|@OR{e$K)v_X3dBY@hjpuO&0&d66{ah&QH93gOSt^Ga_TeWkz4gbf;!W@5T=6+*n%>+{-@o<)~%r z+oh9s4VBB3G8h%BxXg-^eJ?Md6-k~Rvb5@qdRTV7+W=jJr)}Pex$Es!pm^n9>W3IxB8gXe%1Ge2QXX!o6r% zqAmC|(& zHfy1PRb8RH5U?7jwA^SuasKqde?#&bKWa7l=6dSr9TdorqH`skXJX^gLf)yJmw3OY z%dGZpunxvuP=Wv$sYMRpff!g_x{4Qt3W&lI5kx2`rx5;$0N%el^^&hM)C)*;cp%Sm z;a%ERQSV4(hYX`iVOsB|I|iOnc5t{2CvP49r!K(HI9Q2VTY1G6xXIag`r3qK|}y-2l5#7k2pzLm}6*L&vP(&G)l-bIaiA9FeFDj z%0D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 literal 71556 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 diff --git a/src/main/resources/assets/gtceu/sounds/metal_pipe.ogg b/src/main/resources/assets/gtceu/sounds/metal_pipe.ogg index e218c149fa23bb8f4b58c8b8d570b5278b2206a2..58d4ce35975841b0ffb310a6a0587d485cba7ab5 100644 GIT binary patch delta 15763 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 Q`O&`U&-haMC+@KS1%HV@1^@s6 literal 28452 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 BqvZeq diff --git a/src/main/resources/assets/gtceu/sounds/portal_opening.ogg b/src/main/resources/assets/gtceu/sounds/portal_opening.ogg index 1df6eb2e074c47209e1c659e64112e5ac9285469..77858b5fabd607e00048cafc95d97f37d9297c19 100644 GIT binary patch delta 10278 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 PVA(l2Hqy{?Y~cR@K#8!Z literal 18248 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 KxKOz|rvC Date: Mon, 16 Sep 2024 12:49:53 -0600 Subject: [PATCH 02/15] Update EnergyNetWalker.java (#1967) --- .../gtceu/common/pipelike/cable/EnergyNetWalker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetWalker.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetWalker.java index 6f1b5fd9cf..a81994d1f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetWalker.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/cable/EnergyNetWalker.java @@ -12,7 +12,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.block.entity.BlockEntity; -import com.llamalad7.mixinextras.lib.apache.commons.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; From 57400d0c042616a111b0204b088822f505040a5b Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Tue, 17 Sep 2024 21:20:49 +0400 Subject: [PATCH 03/15] Sculk fixes + datagen (#1968) --- src/generated/resources/assets/gtceu/lang/en_ud.json | 6 +----- src/generated/resources/assets/gtceu/lang/en_us.json | 6 +----- .../assets/gtceu/models/item/crafting_table_cover.json | 6 ------ .../assets/gtceu/models/item/digital_interface_cover.json | 6 ------ .../models/item/wireless_digital_interface_cover.json | 6 ------ .../com/gregtechceu/gtceu/common/data/GTMaterials.java | 8 ++++---- .../common/data/materials/SecondDegreeMaterials.java | 2 +- .../gtceu/data/recipe/configurable/RecipeAddition.java | 4 ++-- 8 files changed, 9 insertions(+), 35 deletions(-) delete mode 100644 src/generated/resources/assets/gtceu/models/item/crafting_table_cover.json delete mode 100644 src/generated/resources/assets/gtceu/models/item/digital_interface_cover.json delete mode 100644 src/generated/resources/assets/gtceu/models/item/wireless_digital_interface_cover.json diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 6ac271a75a..add14c8f1b 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -1815,7 +1815,6 @@ "compass.node.gtceu.covers/computer_monitor_cover": "ɹǝʌoƆ ɹoʇıuoW ɹǝʇndɯoƆ", "compass.node.gtceu.covers/conveyor": "ɹoʎǝʌuoƆ", "compass.node.gtceu.covers/cover": "¿ɹǝʌoƆ sı ʇɐɥM", - "compass.node.gtceu.covers/crafting_table_cover": "ɹǝʌoƆ ǝןqɐ⟘ buıʇɟɐɹƆ", "compass.node.gtceu.covers/ender_fluid_link_cover": "ɹǝʌoƆ ʞuıꞀ pınןℲ ɹǝpuƎ", "compass.node.gtceu.covers/energy_detector_cover": "ɹǝʌoƆ ɹoʇɔǝʇǝᗡ ʎbɹǝuƎ", "compass.node.gtceu.covers/facade_cover": "ɹǝʌoƆ ǝpɐɔɐℲ", @@ -4173,7 +4172,6 @@ "item.gtceu.cpu_chip.tooltip": "ʇıu∩ buıssǝɔoɹԀ ןɐɹʇuǝƆㄥ§", "item.gtceu.cpu_wafer": "ɹǝɟɐM ∩ԀƆ", "item.gtceu.cpu_wafer.tooltip": "ʇıu∩ buıssǝɔoɹԀ ʍɐᴚㄥ§", - "item.gtceu.crafting_table_cover": "ɹǝʌoƆ ǝןqɐ⟘ buıʇɟɐɹƆ", "item.gtceu.crafting_table_cover.tooltip": "˙ㄥ§ɹǝʌoƆɟ§ sɐ ǝuıɥɔɐW ɐ uo ㄥ§ɥɔuǝqʞɹoM pǝɔuɐʌpⱯɟ§", "item.gtceu.credit_casting_mold": ")ǝbɐuıoƆ( pןoW buıʇsɐƆ", "item.gtceu.credit_casting_mold.tooltip": ")¡ʇı ǝsoן ʇ,uoᗡ( suıoƆ buıʞɐɯ ɹoɟ pןoW ǝɹnɔǝSㄥ§", @@ -4210,7 +4208,6 @@ "item.gtceu.data_stick": "ʞɔıʇS ɐʇɐᗡ", "item.gtceu.data_stick.tooltip": "ǝbɐɹoʇS ɐʇɐᗡ ʎʇıɔɐdɐƆ ʍoꞀ Ɐㄥ§", "item.gtceu.diamond_grinding_head": "pɐǝH buıpuıɹ⅁ puoɯɐıᗡ", - "item.gtceu.digital_interface_cover": "ǝɔɐɟɹǝʇuI ןɐʇıbıᗡ", "item.gtceu.diode": "ǝpoıᗡ", "item.gtceu.diode.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", "item.gtceu.doge_coin": "uıoƆ ǝboᗡ", @@ -5031,7 +5028,6 @@ "item.gtceu.white_dye_spray_can": ")ǝʇıɥM( uɐƆ ʎɐɹdS", "item.gtceu.wire_extruder_mold": ")ǝɹıM( pןoW ɹǝpnɹʇxƎ", "item.gtceu.wire_extruder_mold.tooltip": "sǝɹıM buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", - "item.gtceu.wireless_digital_interface_cover": "ǝɔɐɟɹǝʇuI ןɐʇıbıᗡ ssǝןǝɹıM", "item.gtceu.wood_bolt": "ʞɔıʇS pooM ʇɹoɥS", "item.gtceu.wood_dust": "dןnԀ pooM", "item.gtceu.wood_plate": "ʞuɐןԀ pooM", @@ -5238,7 +5234,7 @@ "material.gtceu.dubnium": "ɯnıuqnᗡ", "material.gtceu.duranium": "ɯnıuɐɹnᗡ", "material.gtceu.dysprosium": "ɯnısoɹdsʎᗡ", - "material.gtceu.echo": "oɥɔƎ", + "material.gtceu.echo_shard": "pɹɐɥS oɥɔƎ", "material.gtceu.einsteinium": "ɯnıuıǝʇsuıƎ", "material.gtceu.electrotine": "ǝuıʇoɹʇɔǝןƎ", "material.gtceu.electrum": "ɯnɹʇɔǝןƎ", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index fe52f32cfc..7c1eb46ed9 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -1815,7 +1815,6 @@ "compass.node.gtceu.covers/computer_monitor_cover": "Computer Monitor Cover", "compass.node.gtceu.covers/conveyor": "Conveyor", "compass.node.gtceu.covers/cover": "What is Cover?", - "compass.node.gtceu.covers/crafting_table_cover": "Crafting Table Cover", "compass.node.gtceu.covers/ender_fluid_link_cover": "Ender Fluid Link Cover", "compass.node.gtceu.covers/energy_detector_cover": "Energy Detector Cover", "compass.node.gtceu.covers/facade_cover": "Facade Cover", @@ -4173,7 +4172,6 @@ "item.gtceu.cpu_chip.tooltip": "§7Central Processing Unit", "item.gtceu.cpu_wafer": "CPU Wafer", "item.gtceu.cpu_wafer.tooltip": "§7Raw Processing Unit", - "item.gtceu.crafting_table_cover": "Crafting Table Cover", "item.gtceu.crafting_table_cover.tooltip": "§fAdvanced Workbench§7 on a Machine as §fCover§7.", "item.gtceu.credit_casting_mold": "Casting Mold (Coinage)", "item.gtceu.credit_casting_mold.tooltip": "§7Secure Mold for making Coins (Don't lose it!)", @@ -4210,7 +4208,6 @@ "item.gtceu.data_stick": "Data Stick", "item.gtceu.data_stick.tooltip": "§7A Low Capacity Data Storage", "item.gtceu.diamond_grinding_head": "Diamond Grinding Head", - "item.gtceu.digital_interface_cover": "Digital Interface", "item.gtceu.diode": "Diode", "item.gtceu.diode.tooltip": "§7Basic Electronic Component", "item.gtceu.doge_coin": "Doge Coin", @@ -5031,7 +5028,6 @@ "item.gtceu.white_dye_spray_can": "Spray Can (White)", "item.gtceu.wire_extruder_mold": "Extruder Mold (Wire)", "item.gtceu.wire_extruder_mold.tooltip": "§7Extruder Shape for making Wires", - "item.gtceu.wireless_digital_interface_cover": "Wireless Digital Interface", "item.gtceu.wood_bolt": "Short Wood Stick", "item.gtceu.wood_dust": "Wood Pulp", "item.gtceu.wood_plate": "Wood Plank", @@ -5238,7 +5234,7 @@ "material.gtceu.dubnium": "Dubnium", "material.gtceu.duranium": "Duranium", "material.gtceu.dysprosium": "Dysprosium", - "material.gtceu.echo": "Echo", + "material.gtceu.echo_shard": "Echo Shard", "material.gtceu.einsteinium": "Einsteinium", "material.gtceu.electrotine": "Electrotine", "material.gtceu.electrum": "Electrum", diff --git a/src/generated/resources/assets/gtceu/models/item/crafting_table_cover.json b/src/generated/resources/assets/gtceu/models/item/crafting_table_cover.json deleted file mode 100644 index 5b36968e69..0000000000 --- a/src/generated/resources/assets/gtceu/models/item/crafting_table_cover.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "gtceu:item/crafting_table_cover" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/digital_interface_cover.json b/src/generated/resources/assets/gtceu/models/item/digital_interface_cover.json deleted file mode 100644 index d27ed8fa80..0000000000 --- a/src/generated/resources/assets/gtceu/models/item/digital_interface_cover.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "gtceu:item/digital_interface_cover" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/wireless_digital_interface_cover.json b/src/generated/resources/assets/gtceu/models/item/wireless_digital_interface_cover.json deleted file mode 100644 index 92a8329526..0000000000 --- a/src/generated/resources/assets/gtceu/models/item/wireless_digital_interface_cover.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "gtceu:item/wireless_digital_interface_cover" - } -} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java index a81c3a9756..224eaf27af 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java @@ -100,7 +100,7 @@ public static void init() { gem.setIgnored(NetherQuartz, Items.QUARTZ); gem.setIgnored(Coal, Items.COAL); gem.setIgnored(Amethyst, Items.AMETHYST_SHARD); - gem.setIgnored(Echo, Items.ECHO_SHARD); + gem.setIgnored(EchoShard, Items.ECHO_SHARD); excludeAllGems(Charcoal, Items.CHARCOAL); excludeAllGems(Flint, Items.FLINT); excludeAllGems(EnderPearl, Items.ENDER_PEARL); @@ -174,7 +174,7 @@ public static void init() { rock.setIgnored(Endstone, Blocks.END_STONE); rock.setIgnored(Deepslate, Blocks.DEEPSLATE); rock.setIgnored(Basalt, Blocks.BASALT); - rock.setIgnored(Sculk, Blocks.SCULK); + block.setIgnored(Sculk, Blocks.SCULK); block.setIgnored(Concrete, SupplierMemoizer.memoizeBlockSupplier(() -> GTBlocks.LIGHT_CONCRETE.get())); block.setIgnored(Concrete, SupplierMemoizer.memoizeBlockSupplier(() -> GTBlocks.DARK_CONCRETE.get())); @@ -251,7 +251,7 @@ public static void init() { rawOreBlock.setIgnored(Copper, Blocks.RAW_COPPER_BLOCK); block.modifyMaterialAmount(Amethyst, 4); - block.modifyMaterialAmount(Echo, 4); + block.modifyMaterialAmount(EchoShard, 4); block.modifyMaterialAmount(Glowstone, 4); block.modifyMaterialAmount(NetherQuartz, 4); block.modifyMaterialAmount(CertusQuartz, 4); @@ -893,7 +893,7 @@ private static void excludeAllGemsButNormal(Material material) { public static Material Olivine; public static Material Opal; public static Material Amethyst; - public static Material Echo; + public static Material EchoShard; public static Material Lapis; public static Material Blaze; public static Material Apatite; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java index 88c7a52eba..e273ceb8e7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/materials/SecondDegreeMaterials.java @@ -78,7 +78,7 @@ public static void register() { .components(SiliconDioxide, 4, Iron, 1) .buildAndRegister(); - Echo = new Material.Builder(GTCEu.id("echo")) + EchoShard = new Material.Builder(GTCEu.id("echo_shard")) .gem(3) .color(0x002b2d).iconSet(RUBY) .appendFlags(EXT_METAL, NO_SMASHING, NO_SMELTING, GENERATE_ROD) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java index 6eac08e629..717efc1239 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/configurable/RecipeAddition.java @@ -1307,8 +1307,8 @@ private static void hardMiscRecipes(Consumer provider) { ASSEMBLER_RECIPES.recipeBuilder("recovery_compass") .inputItems(new ItemStack(Items.COMPASS)) - .inputItems(plate, Echo, 8) - .inputItems(rod, Echo) + .inputItems(plate, EchoShard, 8) + .inputItems(rod, EchoShard) .outputItems(new ItemStack(Items.RECOVERY_COMPASS)) .duration(400).EUt(30).save(provider); From bbe7590992ebf0a8e25e69ef14fae03ef2f77eca Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Tue, 17 Sep 2024 21:20:59 +0400 Subject: [PATCH 04/15] Remove border lines from Laminated Glass CTM (#1972) --- .../casings/transparent/laminated_glass_ctm.png | Bin 483 -> 870 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/gtceu/textures/block/casings/transparent/laminated_glass_ctm.png b/src/main/resources/assets/gtceu/textures/block/casings/transparent/laminated_glass_ctm.png index 53e745d49847ca20f26564d09b27eeff2994ef8e..b3096f552e44ba1ea85d1c4b6072e4dfefd12ff1 100644 GIT binary patch delta 848 zcmV-W1F!t!1Lg*hBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmP!xqvQ>7{u5j%)D zWT-A$5Eao)t5Adrp;lE=X9p)m7b)?+ zq|hSP2bcG8-aCi;?gNBsk!e=j7@+C4nTSQjRC-kmyrL7mRDUCwk(p)8Nm3jw*VjFK ze7}qEtk(DbT-|EMVt`L1o@It<6K@btZQ2Isec}+y%PR3X@u*1+5HHa7%u>=Vs z6qHdw5jG;U>wlzJNYHt-g@3^HOXO0>RRAN$0!q*zyMFLL_&r-IJ2CDh1*1Uwi{pF@ z0fAkhR&ku~W5=nT0RCs-N^kf}Rbcv)^h!eu9|1kvz{Pb#Q}%$%9iacokWJZ@{8U0V z3%sAvH>H8TTcB&rn_K-Hrw>4qW);5y4i16g9A&S!cz<_C^W6TuQ=i`t#ZGd_f9-Vo z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=m`-D z4H*w4GM@kd02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00BKoL_t(o z!|hiw4u8Th40NKde1Iin0`UR%E_nzNk3!-hEbRRNYnp`*@PII-1dBFt;}(SQl&W@o zK09_Ipiqpdef)hsUqr6HYb^jL01PIjzgcT9vBK?s^Dv<(rJw7S28o?77fS&%N(Z31 zHlv)sL=>%am{claV7J||MNVN-a?6r|((|RrpX!cN7j4))<<5 z3wWjJ=y4<^_W@&SKYJ&{I#rA+MSb{>(_l>PDQ)<0*!yHEOK(O+_8)cLT$>{2rS^aM zZb|vclOf{P7&jW~JP7*7<4L5N(90g2vmk7q17MO_kTWTS2IB*eBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!~g&e!~vBn4jTXf0eDG7K~z{r#g@Hs!!QhmCG}arjiM^PEZ{zk2g#j>@|_3r0&X2O zULXTFdOAY~L;L{9n!!f)V~hRlLJ_M^Rj6lKmUY|JUU;_=Eb3X+7TOTA_@B? z0=xHJwVhicxyk_#$Z%^Ut2zL3k(6cZazIYTb3g<1)gzEYI_Y*mMj=J0GTaVm!yc=Q z&awkSQ{xg^+<%>fawmMklFgVMu+(@C+=eY~B>cd|z>#MwcQ;?96H;ekc7U!&EJ%x_ z5-S(xTvD#|nmarOv|O*5OWId$M4FP6Hp>x!TEZA>ueZ!We@Ha7 z4y{KYJ%U)*(qhrC94L7iaoq0#@5{)lcU3{ICupczhC?No9MEKTijZFIz;9JXuo3a5 z6QXJ(;tp7Wmg{3piNkH8ji?k&RY;qEeh*xmAIhidPxEvePXGV_07*qoM6N<$f|HEL A8~^|S From c6be9dc9e27000420ede940ddbeaa5eab454393d Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Wed, 18 Sep 2024 02:52:22 -0400 Subject: [PATCH 05/15] Quantum Storage Fixes (#1976) --- .../gtceu/common/machine/storage/QuantumChestMachine.java | 2 +- .../gtceu/common/machine/storage/QuantumTankMachine.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 34d104c590..fd28c3939c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -304,7 +304,7 @@ public boolean onLeftClick(Player player, Level world, InteractionHand hand, Blo var drained = cache.extractItem(0, player.isShiftKeyDown() ? stored.getItem().getMaxStackSize() : 1, false); if (!drained.isEmpty()) { - if (player.addItem(drained)) { + if (!player.addItem(drained)) { Block.popResource(world, getPos().relative(getFrontFacing()), drained); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index e2a8178699..05d319b7fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -132,7 +132,9 @@ public long fill(FluidStack resource, boolean simulate) { private long handleVoiding(long filled, FluidStack resource) { if (filled < resource.getAmount() && isVoiding && isFluidValid(0, resource)) { - return resource.getAmount(); + if (stored.isEmpty() || stored.isFluidEqual(resource)) { + return resource.getAmount(); + } } return filled; From 569eb616a745ed83c843b61d072e0ee8819f3f20 Mon Sep 17 00:00:00 2001 From: Karthi Suresh <75553966+JuiceyBeans@users.noreply.github.com> Date: Wed, 18 Sep 2024 21:58:46 +0400 Subject: [PATCH 06/15] Misc texture fixes (#1974) --- .../models/block/empty_tier_i_battery.json | 4 +- .../models/block/empty_tier_ii_battery.json | 4 +- .../models/block/empty_tier_iii_battery.json | 4 +- .../models/block/ev_lapotronic_battery.json | 4 +- .../gtceu/models/block/industrial_tnt.json | 2 +- .../models/block/iv_lapotronic_battery.json | 4 +- .../models/block/luv_lapotronic_battery.json | 4 +- .../models/block/uhv_ultimate_battery.json | 4 +- .../models/block/uv_lapotronic_battery.json | 4 +- .../models/block/zpm_lapotronic_battery.json | 4 +- .../gtceu/api/gui/GuiTextures.java | 8 ++-- .../gtceu/common/data/GTBlocks.java | 2 +- .../gtceu/common/data/GTModels.java | 4 +- .../block/machine/electric_gear_box_16a.json | 4 +- .../block/machine/electric_gear_box_2a.json | 4 +- .../block/machine/electric_gear_box_32a.json | 4 +- .../block/machine/electric_gear_box_8a.json | 4 +- .../machine/kinetic_electric_machine.json | 4 +- .../block/machine/part/kinetic_input_box.json | 4 +- .../machine/part/kinetic_output_box.json | 4 +- .../gtceu/textures/block/black_lamp.png | Bin 336 -> 0 bytes .../assets/gtceu/textures/block/blue_lamp.png | Bin 368 -> 0 bytes .../gtceu/textures/block/brown_lamp.png | Bin 364 -> 0 bytes ...{OVERLAY_SCREEN.png => overlay_screen.png} | Bin .../assets/gtceu/textures/block/cyan_lamp.png | Bin 380 -> 0 bytes .../assets/gtceu/textures/block/gray_lamp.png | Bin 339 -> 0 bytes .../gtceu/textures/block/green_lamp.png | Bin 331 -> 0 bytes .../block/lamps/light_gray.png.mcmeta | 2 +- .../lamps/light_gray_emissive.png.mcmeta | 2 +- .../block/lamps/light_gray_off.png.mcmeta | 2 +- .../gtceu/textures/block/light_blue_lamp.png | Bin 348 -> 0 bytes .../gtceu/textures/block/light_gray_lamp.png | Bin 382 -> 0 bytes .../assets/gtceu/textures/block/lime_lamp.png | Bin 328 -> 0 bytes .../fermenter/overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../textures/block/{ => machines}/gearbox.png | Bin .../gtceu/textures/block/magenta_lamp.png | Bin 373 -> 0 bytes .../block/{ => misc}/industrial_tnt_side.png | Bin .../molybdenum_disilicide_coil_block.png | Bin 769 -> 0 bytes ...olybdenum_disilicide_coil_block.png.mcmeta | 5 --- .../molybdenum_disilicide_coil_block_ctm.png | Bin 2821 -> 0 bytes .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../overlay_front_active.png.mcmeta | 10 ----- .../overlay_front_active_emissive.png.mcmeta | 10 ----- .../gtceu/textures/block/orange_lamp.png | Bin 335 -> 0 bytes .../assets/gtceu/textures/block/pink_lamp.png | Bin 367 -> 0 bytes .../gtceu/textures/block/purple_lamp.png | Bin 364 -> 0 bytes .../assets/gtceu/textures/block/red_lamp.png | Bin 369 -> 0 bytes .../textures/block/rubber_hanging_sign.png | Bin 1362 -> 0 bytes .../gtceu/textures/block/rubber_sign.png | Bin 1111 -> 0 bytes .../block/rubber_wall_hanging_sign.png | Bin 1362 -> 0 bytes .../gtceu/textures/block/rubber_wall_sign.png | Bin 1111 -> 0 bytes .../textures/block/storage/tank/metal_0.png | Bin 161 -> 0 bytes .../textures/block/storage/tank/metal_1.png | Bin 194 -> 0 bytes .../textures/block/storage/tank/metal_10.png | Bin 210 -> 0 bytes .../textures/block/storage/tank/metal_11.png | Bin 233 -> 0 bytes .../textures/block/storage/tank/metal_12.png | Bin 218 -> 0 bytes .../textures/block/storage/tank/metal_13.png | Bin 242 -> 0 bytes .../textures/block/storage/tank/metal_14.png | Bin 238 -> 0 bytes .../textures/block/storage/tank/metal_15.png | Bin 255 -> 0 bytes .../textures/block/storage/tank/metal_2.png | Bin 191 -> 0 bytes .../textures/block/storage/tank/metal_3.png | Bin 220 -> 0 bytes .../textures/block/storage/tank/metal_4.png | Bin 191 -> 0 bytes .../textures/block/storage/tank/metal_5.png | Bin 218 -> 0 bytes .../textures/block/storage/tank/metal_6.png | Bin 218 -> 0 bytes .../textures/block/storage/tank/metal_7.png | Bin 239 -> 0 bytes .../textures/block/storage/tank/metal_8.png | Bin 188 -> 0 bytes .../textures/block/storage/tank/metal_9.png | Bin 216 -> 0 bytes .../block/storage/tank/metal_background.png | Bin 221 -> 0 bytes .../block/storage/tank/metal_border.png | Bin 285 -> 0 bytes .../textures/block/storage/tank/wooden_0.png | Bin 161 -> 0 bytes .../textures/block/storage/tank/wooden_1.png | Bin 183 -> 0 bytes .../textures/block/storage/tank/wooden_10.png | Bin 203 -> 0 bytes .../textures/block/storage/tank/wooden_11.png | Bin 217 -> 0 bytes .../textures/block/storage/tank/wooden_12.png | Bin 203 -> 0 bytes .../textures/block/storage/tank/wooden_13.png | Bin 210 -> 0 bytes .../textures/block/storage/tank/wooden_14.png | Bin 220 -> 0 bytes .../textures/block/storage/tank/wooden_15.png | Bin 226 -> 0 bytes .../textures/block/storage/tank/wooden_2.png | Bin 187 -> 0 bytes .../textures/block/storage/tank/wooden_3.png | Bin 207 -> 0 bytes .../textures/block/storage/tank/wooden_4.png | Bin 189 -> 0 bytes .../textures/block/storage/tank/wooden_5.png | Bin 203 -> 0 bytes .../textures/block/storage/tank/wooden_6.png | Bin 208 -> 0 bytes .../textures/block/storage/tank/wooden_7.png | Bin 221 -> 0 bytes .../textures/block/storage/tank/wooden_8.png | Bin 182 -> 0 bytes .../textures/block/storage/tank/wooden_9.png | Bin 196 -> 0 bytes .../block/storage/tank/wooden_background.png | Bin 221 -> 0 bytes .../block/storage/tank/wooden_border.png | Bin 296 -> 0 bytes .../textures/block/stripped_rubber_wood.png | Bin 612 -> 565 bytes .../block/treated_wood_hanging_sign.png | Bin 623 -> 0 bytes .../entity/signs/hanging/treated_wood.png | Bin 936 -> 7069 bytes .../textures/entity/signs/treated_wood.png | Bin 826 -> 1254 bytes .../textures/gui/hanging_signs/rubber.png | Bin 0 -> 895 bytes .../gui/hanging_signs/treated_wood.png | Bin 0 -> 873 bytes .../assets/gtceu/textures/gui/rubber.png | Bin 567 -> 0 bytes .../gtceu/textures/hanging_signs/rubber.png | Bin 567 -> 0 bytes .../item/bioware.mainframe.png.mcmeta | 9 ---- .../gtceu/textures/item/data_stick.png.mcmeta | 5 ++- .../item/wetware_processor_mainframe.png | Bin 1042 -> 1461 bytes .../wetware_processor_mainframe.png.mcmeta | 40 +++++++++--------- 109 files changed, 66 insertions(+), 219 deletions(-) delete mode 100644 src/main/resources/assets/gtceu/textures/block/black_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/blue_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/brown_lamp.png rename src/main/resources/assets/gtceu/textures/block/cover/{OVERLAY_SCREEN.png => overlay_screen.png} (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/cyan_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/gray_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/green_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/light_blue_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/light_gray_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/lime_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active_emissive.png.mcmeta rename src/main/resources/assets/gtceu/textures/block/{ => machines}/gearbox.png (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/magenta_lamp.png rename src/main/resources/assets/gtceu/textures/block/{ => misc}/industrial_tnt_side.png (100%) delete mode 100644 src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block_ctm.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active_emissive.png.mcmeta delete mode 100644 src/main/resources/assets/gtceu/textures/block/orange_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/pink_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/purple_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/red_lamp.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/rubber_hanging_sign.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/rubber_sign.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/rubber_wall_hanging_sign.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/rubber_wall_sign.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_0.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_1.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_10.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_11.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_12.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_13.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_14.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_15.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_2.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_3.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_4.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_5.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_6.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_7.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_8.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_9.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_background.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/metal_border.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_0.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_1.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_10.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_11.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_12.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_13.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_14.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_15.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_2.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_3.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_4.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_5.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_6.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_7.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_8.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_9.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_background.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_border.png delete mode 100644 src/main/resources/assets/gtceu/textures/block/treated_wood_hanging_sign.png create mode 100644 src/main/resources/assets/gtceu/textures/gui/hanging_signs/rubber.png create mode 100644 src/main/resources/assets/gtceu/textures/gui/hanging_signs/treated_wood.png delete mode 100644 src/main/resources/assets/gtceu/textures/gui/rubber.png delete mode 100644 src/main/resources/assets/gtceu/textures/hanging_signs/rubber.png delete mode 100644 src/main/resources/assets/gtceu/textures/item/bioware.mainframe.png.mcmeta diff --git a/src/generated/resources/assets/gtceu/models/block/empty_tier_i_battery.json b/src/generated/resources/assets/gtceu/models/block/empty_tier_i_battery.json index 8d725b683a..97b55dd87d 100644 --- a/src/generated/resources/assets/gtceu/models/block/empty_tier_i_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/empty_tier_i_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/empty_tier_i/top", - "side": "gtceu:block/casings/battery/empty_tier_i/top", - "top": "gtceu:block/casings/battery/empty_tier_i/side" + "side": "gtceu:block/casings/battery/empty_tier_i/side", + "top": "gtceu:block/casings/battery/empty_tier_i/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/empty_tier_ii_battery.json b/src/generated/resources/assets/gtceu/models/block/empty_tier_ii_battery.json index cb5bae8d09..496b354670 100644 --- a/src/generated/resources/assets/gtceu/models/block/empty_tier_ii_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/empty_tier_ii_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/empty_tier_ii/top", - "side": "gtceu:block/casings/battery/empty_tier_ii/top", - "top": "gtceu:block/casings/battery/empty_tier_ii/side" + "side": "gtceu:block/casings/battery/empty_tier_ii/side", + "top": "gtceu:block/casings/battery/empty_tier_ii/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/empty_tier_iii_battery.json b/src/generated/resources/assets/gtceu/models/block/empty_tier_iii_battery.json index b300ceaac7..21d890afc3 100644 --- a/src/generated/resources/assets/gtceu/models/block/empty_tier_iii_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/empty_tier_iii_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/empty_tier_iii/top", - "side": "gtceu:block/casings/battery/empty_tier_iii/top", - "top": "gtceu:block/casings/battery/empty_tier_iii/side" + "side": "gtceu:block/casings/battery/empty_tier_iii/side", + "top": "gtceu:block/casings/battery/empty_tier_iii/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/ev_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/ev_lapotronic_battery.json index 4849880502..af181216b9 100644 --- a/src/generated/resources/assets/gtceu/models/block/ev_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/ev_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/ev_lapotronic/top", - "side": "gtceu:block/casings/battery/ev_lapotronic/top", - "top": "gtceu:block/casings/battery/ev_lapotronic/side" + "side": "gtceu:block/casings/battery/ev_lapotronic/side", + "top": "gtceu:block/casings/battery/ev_lapotronic/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/industrial_tnt.json b/src/generated/resources/assets/gtceu/models/block/industrial_tnt.json index 21734bfa6a..3711dcc37e 100644 --- a/src/generated/resources/assets/gtceu/models/block/industrial_tnt.json +++ b/src/generated/resources/assets/gtceu/models/block/industrial_tnt.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "minecraft:block/tnt_bottom", - "side": "gtceu:block/industrial_tnt_side", + "side": "gtceu:block/misc/industrial_tnt_side", "top": "minecraft:block/tnt_top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/iv_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/iv_lapotronic_battery.json index 37e72e0f79..eeccabf47d 100644 --- a/src/generated/resources/assets/gtceu/models/block/iv_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/iv_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/iv_lapotronic/top", - "side": "gtceu:block/casings/battery/iv_lapotronic/top", - "top": "gtceu:block/casings/battery/iv_lapotronic/side" + "side": "gtceu:block/casings/battery/iv_lapotronic/side", + "top": "gtceu:block/casings/battery/iv_lapotronic/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/luv_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/luv_lapotronic_battery.json index 41e5dbcee4..5d01dec145 100644 --- a/src/generated/resources/assets/gtceu/models/block/luv_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/luv_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/luv_lapotronic/top", - "side": "gtceu:block/casings/battery/luv_lapotronic/top", - "top": "gtceu:block/casings/battery/luv_lapotronic/side" + "side": "gtceu:block/casings/battery/luv_lapotronic/side", + "top": "gtceu:block/casings/battery/luv_lapotronic/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/uhv_ultimate_battery.json b/src/generated/resources/assets/gtceu/models/block/uhv_ultimate_battery.json index c92f74c787..0abbfc3ec7 100644 --- a/src/generated/resources/assets/gtceu/models/block/uhv_ultimate_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/uhv_ultimate_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/uhv_ultimate/top", - "side": "gtceu:block/casings/battery/uhv_ultimate/top", - "top": "gtceu:block/casings/battery/uhv_ultimate/side" + "side": "gtceu:block/casings/battery/uhv_ultimate/side", + "top": "gtceu:block/casings/battery/uhv_ultimate/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/uv_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/uv_lapotronic_battery.json index 5bf09d6c21..399f927a2c 100644 --- a/src/generated/resources/assets/gtceu/models/block/uv_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/uv_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/uv_lapotronic/top", - "side": "gtceu:block/casings/battery/uv_lapotronic/top", - "top": "gtceu:block/casings/battery/uv_lapotronic/side" + "side": "gtceu:block/casings/battery/uv_lapotronic/side", + "top": "gtceu:block/casings/battery/uv_lapotronic/top" } } \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/block/zpm_lapotronic_battery.json b/src/generated/resources/assets/gtceu/models/block/zpm_lapotronic_battery.json index f7203c0069..46c8402bcc 100644 --- a/src/generated/resources/assets/gtceu/models/block/zpm_lapotronic_battery.json +++ b/src/generated/resources/assets/gtceu/models/block/zpm_lapotronic_battery.json @@ -2,7 +2,7 @@ "parent": "minecraft:block/cube_bottom_top", "textures": { "bottom": "gtceu:block/casings/battery/zpm_lapotronic/top", - "side": "gtceu:block/casings/battery/zpm_lapotronic/top", - "top": "gtceu:block/casings/battery/zpm_lapotronic/side" + "side": "gtceu:block/casings/battery/zpm_lapotronic/side", + "top": "gtceu:block/casings/battery/zpm_lapotronic/top" } } \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java b/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java index 6f6402b627..6e8e97cec2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/GuiTextures.java @@ -49,11 +49,11 @@ public class GuiTextures { public static final ResourceTexture TOOL_DISABLE_AUTO_OUTPUT = new ResourceTexture( "gtceu:textures/gui/overlay/tool_disable_auto_output.png"); public static final ResourceTexture TOOL_SWITCH_CONVERTER_NATIVE = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_wire_block.png"); // switch to tool_switch_converter_native once that gets - // made + "gtceu:textures/gui/overlay/tool_wire_block.png"); // todo switch to tool_switch_converter_native once that + // gets made public static final ResourceTexture TOOL_SWITCH_CONVERTER_EU = new ResourceTexture( - "gtceu:textures/gui/overlay/tool_wire_connect.png"); // switch to tool_switch_converter_eu once that gets - // made + "gtceu:textures/gui/overlay/tool_wire_connect.png"); // todo switch to tool_switch_converter_eu once that + // gets made // BASE TEXTURES public static final ResourceBorderTexture BACKGROUND = new ResourceBorderTexture( diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index f6e82919bc..efdfa08f54 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -980,7 +980,7 @@ private static BlockEntry createFireboxCasing(BoilerFireboxType typ .properties(p -> p.mapColor(MapColor.FIRE).instabreak().sound(SoundType.GRASS).ignitedByLava()) .tag(BlockTags.MINEABLE_WITH_AXE) .blockstate((ctx, prov) -> prov.simpleBlock(ctx.get(), prov.models().cubeBottomTop(ctx.getName(), - prov.blockTexture(ctx.get()).withSuffix("_side"), + GTCEu.id("block/misc/industrial_tnt_side"), new ResourceLocation("minecraft", "block/tnt_bottom"), new ResourceLocation("minecraft", "block/tnt_top")))) .simpleItem() diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java index e4b2e48589..49cd489948 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTModels.java @@ -256,9 +256,9 @@ public static NonNullBiConsumer, RegistrateB IBatteryData batteryData) { return (ctx, prov) -> { prov.simpleBlock(ctx.getEntry(), prov.models().cubeBottomTop(name, + GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/side"), GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/top"), - GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/top"), - GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/side"))); + GTCEu.id("block/casings/battery/" + batteryData.getBatteryName() + "/top"))); }; } diff --git a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_16a.json b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_16a.json index 61f3a15388..376c5d7004 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_16a.json +++ b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_16a.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -141,4 +141,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_2a.json b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_2a.json index 61f3a15388..376c5d7004 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_2a.json +++ b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_2a.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -141,4 +141,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_32a.json b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_32a.json index 61f3a15388..376c5d7004 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_32a.json +++ b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_32a.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -141,4 +141,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_8a.json b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_8a.json index 61f3a15388..376c5d7004 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_8a.json +++ b/src/main/resources/assets/gtceu/models/block/machine/electric_gear_box_8a.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -141,4 +141,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/kinetic_electric_machine.json b/src/main/resources/assets/gtceu/models/block/machine/kinetic_electric_machine.json index 3cc33c85d4..6c10dcaa71 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/kinetic_electric_machine.json +++ b/src/main/resources/assets/gtceu/models/block/machine/kinetic_electric_machine.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -135,4 +135,4 @@ "children": [10, 11, 12, 13] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_input_box.json b/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_input_box.json index 5f5e596559..0fb707de57 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_input_box.json +++ b/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_input_box.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "overlay": "gtceu:block/overlay/machine/overlay_pipe_in", - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -152,4 +152,4 @@ "children": [11, 12, 13, 14] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_output_box.json b/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_output_box.json index 1a2d2843bb..ca0aafa82f 100644 --- a/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_output_box.json +++ b/src/main/resources/assets/gtceu/models/block/machine/part/kinetic_output_box.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "overlay": "gtceu:block/overlay/machine/overlay_pipe_out", - "gearbox": "gtceu:block/gearbox", + "gearbox": "gtceu:block/machines/gearbox", "bottom": "gtceu:block/casings/voltage/lv/bottom", "top": "gtceu:block/casings/voltage/lv/top", "particle": "gtceu:block/casings/voltage/lv/side", @@ -152,4 +152,4 @@ "children": [11, 12, 13, 14] } ] -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/block/black_lamp.png b/src/main/resources/assets/gtceu/textures/block/black_lamp.png deleted file mode 100644 index 77f2d80c66251a967e0df8450669daa243b8759d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Ka=sjv*HQQztv}H5mvng!9X-VK<%b*bXIJLn;IFZ)0s4LiP-itn{?k~?2olyn)ocH`0Dw)zn^)foH?&`ddVIS zTQ#dc%DK-AYOdYm%V1?m(-VCD?9sALJ)KEY&t2ELF4^(%zP*;^bal_^rL0qAwQrxP zwb-$XwPWJ`g`5>uM^0=@>r?yi&&-4GWr#sY+c%!J6MI+}`z9PYl_PD%nUs3(#(8Ix zUnws_9JU4g&~8t6Nd6Eh};mjH$hQZl_EVKWg3R fmff~}^9k-fjVqoXIv(^0=wSv=S3j3^P6>XYR+{Yfhy zR^EKGb&EcKu*CZRg5N2Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0Rc%wK~y+Tm6P2H zf~qqJ+rPTl&uG3*V*}wv%8M9-K^hK z$#tA+)-6#K)r^P@!ugz5c|?9N=Aa*Vl%+Y3P3c&4I@8fxQk*2pVCTFT#-bmnDqK&Q ziTutZgc#nlv|y7%F(eyho5FfT9vHATN2N^QZ(;+zR})yTX@(7OIDO!zS{3w#q52H^ zz_%gq&Y%1!2<2LIz1(E%!7!Rh2%(yZv!wdBGtmc*-?1L;T4xvl0000< KMNUMnLSTY2#+VNP diff --git a/src/main/resources/assets/gtceu/textures/block/cover/OVERLAY_SCREEN.png b/src/main/resources/assets/gtceu/textures/block/cover/overlay_screen.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/cover/OVERLAY_SCREEN.png rename to src/main/resources/assets/gtceu/textures/block/cover/overlay_screen.png diff --git a/src/main/resources/assets/gtceu/textures/block/cyan_lamp.png b/src/main/resources/assets/gtceu/textures/block/cyan_lamp.png deleted file mode 100644 index 2f48f3b2777fea43d3749996a27482bf2298886b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380 zcmV-?0fYXDP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0TD?=K~y+Tm6I`U z!axv3f1m-3P?{)EQ$#e8%mvct3OPnDzy)#)u0YQTD5$6?Vv;%Y2S+%ygTT#h%UJ7XfEe_;T})m+&}iodjaGo<*UDIw#^Tiq?~5_M zqbN6+y?qMI#h~*j$xR3EGDyW3-|Z$AlW_Wl8n^8W>&QGZWNQ-5mTPpm7e!Rvf~nFD=vD;o!KE6oG5A|D zNYDr7*Arude_hZ00008OaIMyuwW_2n?>v| z)L!sbhrU!=s4#Vp0QYBU*_*1Hzc!q)di^sdJZx@X`z))lefN8hRf@TqD?Mt66}i|w zO{7iHeCxF-sgmKsFOL@baIbnXOC|S!*{#hzo}8Rb4cYUa$1qmy@V`98Iqzg^TEw>1 zI-=(vHd#N;YwosTVL!2b*9jwaKK6v-Whd0GaV>TTi?4%118{5$zf?u>bM?YeuWmGj)aG__7|nw=#%>0{ZIFNObWXZR>AP(R(4 iBdhk#%*Xzmi~MY{nayW}f6D;<%;4$j=d#Wzp$P!X1cx{P diff --git a/src/main/resources/assets/gtceu/textures/block/green_lamp.png b/src/main/resources/assets/gtceu/textures/block/green_lamp.png deleted file mode 100644 index 5c5ab75869f55fd15f3a8d713d717a4ce369cf5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!3Ul$jv*HQOD7-XYH|>0Q+I6cIakJMRmEvl z_U5GZHxAimjxRA%OWHr(zAM>pa>4lq|R@GCZDl&@VI$-(+|eu@`!RPY}GwYg9J`Yk(~uye-#6IpAf%q@Mr zaO+&bjR$o+J=T90X;=31Q+Gb~PW1RTmGWH~LG8SEFI|yvxvhLSq9;eNFe52$7KdW{ z^F?|LYDe>28Bcv{RZWtY*wE-XTjdICy^!>Y$l8QR;Wpk2bLA?xXjCXDw(7*ALQIGBav{Io3{5{*BKb@>E8s5;&IQjF| qM~%Kl3Jf!neG?2W%)dVK1#j%E$^74@9ykc}JcFmJpUXO@geCwkKZOYZ diff --git a/src/main/resources/assets/gtceu/textures/block/light_gray_lamp.png b/src/main/resources/assets/gtceu/textures/block/light_gray_lamp.png deleted file mode 100644 index 79288252899e5871400a381b149b84a8f44ff601..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmV-^0fGLBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0TW3?K~y+Tm6OeC z0x=YYk12>cGx!7A5%dANDRkq)ZK2yffG^`K`4U|ex-MP0D$S}R8jHG7&+Xh{22_#* z;U*{f?%WBvwWr62BXY%2l+SLt?f#C>i1F^8+D diff --git a/src/main/resources/assets/gtceu/textures/block/lime_lamp.png b/src/main/resources/assets/gtceu/textures/block/lime_lamp.png deleted file mode 100644 index c3b986bb08b4994290c7eb07bbacc2b115e7f09a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!MmO=jv*HQOD8+>H5mxFx=(ZJvHr-B<73m* z{!wC`O&gHRyW6?0hjE%#{w+llDV>k%XQybsH=cXxWL4;%Bii1<_R?XY*Xz_4v7NS= z{`{N9%{!{gb93J5eM{YWJ5t3m=Sk4Ca|s)*HP0la8x?P?+|hC3W6V~!88P2mRi?;t zM?bNZ)t$YgMCOlgRzh`eWA0fA(+kgf8h&$WNpLS-$DW+vckqhjjHJYEy-dv!H~M62 zO)i?SEMCBL=hp#!ix-UI&G#p%B=DTM-nk))QJh&=de;kfqXyI2hZoqd-+V&)FVdQ&MBb@0J)NY5C8xG diff --git a/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/machines/fermenter/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/gearbox.png b/src/main/resources/assets/gtceu/textures/block/machines/gearbox.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/gearbox.png rename to src/main/resources/assets/gtceu/textures/block/machines/gearbox.png diff --git a/src/main/resources/assets/gtceu/textures/block/magenta_lamp.png b/src/main/resources/assets/gtceu/textures/block/magenta_lamp.png deleted file mode 100644 index da6872b464531db448d33a30c52bb7ee6d481ee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4P2fsjv*HQQzu(<9dZz8bJxA@=GrsQ!IdTd zf$W~P-l=QXPVK$^fp4C}1_751LZ%#c2V#RGUi?dT6Z)|6r{bBkvVHcyPb`T#d#l+g zbt;$p{-wQ~?k+h2-)vs_{C=`hMqOLW-@5pb#MCEg?WVrBoNxX9cY48Y8N(h=f6*Ng zXKIR{aVWNz-U3GF>LNbDoLQU0^ggI>YcgI+-*tP4bdV$*pHuM=xw|&W*!_1I(FMOwFHT?OSaaT3WrCk=BF=GZ=AQ`o`aB( RJ}{^lJYD@<);T3K0RWaUlji^c diff --git a/src/main/resources/assets/gtceu/textures/block/industrial_tnt_side.png b/src/main/resources/assets/gtceu/textures/block/misc/industrial_tnt_side.png similarity index 100% rename from src/main/resources/assets/gtceu/textures/block/industrial_tnt_side.png rename to src/main/resources/assets/gtceu/textures/block/misc/industrial_tnt_side.png diff --git a/src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block.png b/src/main/resources/assets/gtceu/textures/block/molybdenum_disilicide_coil_block.png deleted file mode 100644 index db354b252f21acb6775cd11220e96d49c1d76da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 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 diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/fluid_drilling_rig/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_steel_boiler/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/generator/large_titanium_boiler/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/implosion_compressor/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/multi_furnace/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active_emissive.png.mcmeta deleted file mode 100644 index cfcef74876..0000000000 --- a/src/main/resources/assets/gtceu/textures/block/multiblock/pyrolyse_oven/overlay_front_active_emissive.png.mcmeta +++ /dev/null @@ -1,10 +0,0 @@ -{ - "animation": { - "frametime": 16, - "frames": [ - 0, - 1, - 2 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/orange_lamp.png b/src/main/resources/assets/gtceu/textures/block/orange_lamp.png deleted file mode 100644 index 9ccca32548fcbd43ff46e47b286212ab1e23bacb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!6%+Bjv*HQQzviaYcddM^H)>magZn|D^e`{ zwlb!MLwx?J@`A)^5==Z-c4YojGGKx<=+`DEw zd(M4pu7GXYI)bkcH1Jxie#-P;Ncu!vY{E?8Hr@gYyA7JFnc^j8ojbsOOt(Xgd7^et zuJg1;?H=jbwk{Wicp^m)oMriU@S5ZT!w=C)oEKP+U620TFgI5%m|?=?O^nfJk3{PJ dFH`%)G<)Wvn@svibAkS4@O1TaS?83{1OVVrff)b* diff --git a/src/main/resources/assets/gtceu/textures/block/pink_lamp.png b/src/main/resources/assets/gtceu/textures/block/pink_lamp.png deleted file mode 100644 index a89851610672483dd85b26ede7c8b9c1f0dda5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4J@86jv*HQQzzSU9dZz8Rga3uNMsU9*3VF` zVD?YRPfvf}xu>DGwWDM1Pe%_f^A!;p_f&+<6n0e#q#5tNfBH?{u~~k{^0lsHZtuRB zztTk4%_Zl-*WV`feJ2WS{jAar`K%Lk z=dj#!Jn(>8cZxIblw2 diff --git a/src/main/resources/assets/gtceu/textures/block/purple_lamp.png b/src/main/resources/assets/gtceu/textures/block/purple_lamp.png deleted file mode 100644 index 9ffa35898f45b09a62dd49bba1708845e6948acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4UC>Hjv*HQQzxJ2JLn*AY`M&JR>!@JN|W|A zh8Go;mVWZO=is8EcgMvvkS~^x?~S?DCEq_c|4vHVw)yk#UG-LuCNJzX!d+L^e2JcU z?Po^^@2y0Shc!OFp-)r1ufA9j+~?|P486b1RBn;E zCtRB}*)`ooRp++ov<@qm4XWp)b{?32gl$u}c*L`oL}r;j{+KCSnc^j?<~Q>9L<{WY zby;VyjW?2Qok8B4*NRZgXhmQ52ljFkEK@{b+Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0R~A#K~y+Tm6Oj7 z!9Wnkrxh;hLPT90#KooJB|MCGkVw3Phw&8RB;qL4p)R&a#h?AAou&<8`z4#*ozCy; zbhl#-z5a_5In`>i`YjcP$%=>#+OA9E#g-biG6yjS=X<&rNo=#f(0tURgYU-%vz6ip zJe&$A*PR$XsXNaQV%P^NVv~vIkd3lUVVRMKe6Ti0wM^h|VgtBACa^pch7E8yMc}M* z6%>V`^bCr?xCK#aATovV*-*~F6qaj*J`Pdz3x;wPz%2{>g|laX#=vihAV3osZ^r;z zYPXux^`JxD<&mz@Lnmkhi+GK}5X#lDU2xN}C-2crN~yS+I7_Q|I}^PDotCja0TZh- P00000NkvXXu0mjfHnx{i diff --git a/src/main/resources/assets/gtceu/textures/block/rubber_hanging_sign.png b/src/main/resources/assets/gtceu/textures/block/rubber_hanging_sign.png deleted file mode 100644 index 02e77aabd0c7ae7461e172e1feec0acc07b83400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1362 zcmV-Y1+DstP)r683lD54ZWX%I>fN)a0q9Q%B?cl%@JQS9yd{3CH} zu-6j#N~_h*zVGgv_ukCB_mqe*iqAiNPXO*LpQ6>C;-$uICdWdSA9exov;v?R1%wU5 zt@|(1YESWM^b7GIXROr#;K$pBlP9KmfOUd(g6An#*WyYpNiEILRD6J?<&{18rChre68JmRIdquq z1MwiI85-7sUU!wr>5wF~^amM%uW7eJ0G^wOX!ssWL%FPFX+}ZCFEKg(WPXVx$*|TQ z?re9#4wEaT=qHxdhkvrPyh4&%oO6f>%_yMT8<1s|^-dq4k}Ew}@=ui2Er?YSCIVG1kC09_!r%fCuT@^t!9O zHu1+6zUL|O+~IkOxS#SMJ70Zol;3U!Xa$|_fMyhMw^RK0-P0?qZ49{j-OWR_iq3O~ zQpG2wN6a0yUNn?3UNQhImq&2UB~^DEVosdmvYkYZZWRzgjr@cs>C1(((#t z&RvkvwFt$8W@hJQW_Dg4!>uqgJ1^I-T~(#`7H<>=Jv6QVL#XX}K#4LU_KJ*|*?DQT zr?`9fS4z1{b62D^#=nWGqrhVi-t7^w8)jzbW${K4>Z23Ae(h>C_B0VxCrs%rfO0Y= zc3T=HF3nw$Qf4PkUYb@baF#Ql|XJalEQM;Ip~& zGS+JF_gaylw3`O!Kx=qms?B<*Pp_X<>1w+b(v4F(8w1AM0cqyg5C6;WZyk$>sB%`V zA#27GpGF!!StlVP;pzC@ogGHe2P_Za9JbV-r1_sabs`6E9&E!~!bw&85X-+!y zdb=6mq%dA1@b=9QMykQOprg9EMDUUW1a%(Y0lO)*|etCD!(diDh z@U3-pdMShS7(~EmKfsQh@kx?nhstNUtNH=Ovqe!nJGYtYTU&T~trMe_s`>#U;2eku zaX-a6M>8~4@32nj@v#uCigVfXbai}{N0dnM&Nm7X!P?Db;1N485LZw#pmogf2TWBE=3}ZcHMD@>*?9$~qwmeR^@>RnOByPdoBla8iW6QVJ(R zJjhUritijmp^tNgAo=<>QgA$mChkH9biSE6tA^^+U3IGNz2}ys zlmPhXgWJhki*pVD#9)ok_nr_F+gmlx1@7MaiyPN30pMItMPt!W8G9%BGzV`r3>H_BjnOd68QDm03^N1P#nX3WdB>7)_^~>`K@Zo#6 zlJkMORQ6{blPWtNRBP}d0-mX5<<&DsY?Z5wrF`_ zyC%<-w)4k3P?f`^n$}U*Ib9#fR48)Gy79+C)f(zjaUpRqYq_vl0Zu%*8c)3&l1`o(@?4oz z7Hfwe7nwyw2qCezKR;Gmtyw$%C;@){?J>p}Lf+qHkcA0=zCA+0wO}&_T2k* z7at-aBsv$!tgID(v;ePPyG%^5ShhU)W5&(vm&r0q*A2;KcYj4)D%M)^%&=JXSR-Va z#rcF0)`~w`0BeQ$tVOM1)%47l9eHMOKGF4q!RY#c^F7l^iT4o?I3I`+rjvZF_@f0_ zwVs{r$xwPiWN&}Tq%IB}R>FtDc>(m!voS3Y5sVD(Y~A={A#c2PB^{NJqrM=7;b<9a zh#{hCh>7FlmQo^wgtbH2S||RuKRg;$3y+(j_usvl{ylK#v+tg(xj1dmqle|H17Lfr zKC#K11mvAJUrGR*6J_Uu;ymm=aV*WR!4a^&V+*gYM(+B#)rsFI_AN;u@B(MUl zz@$_{gj_Ata=f)XZP3;yE^ZYZRzo_U@IKIYf!TOxdFr57E|ypkwx>h9|2_AJSX_iE zKLO z!+SOnFe?1`aB-6J`rn{C7jkkdEZZ=&njtY?Mm8rIA)fsZP&F{`0-XyiR)h7c3(GlJ zI{>=-q{l^Qnql!}smzw1%nHt*={5iWwMKYxyWn8uIaql%DrK`C9AVp?{bu0!KH$9K d?AN(x;2%-~Rm$>ir3nB4002ovPDHLkV1gY!55@oh diff --git a/src/main/resources/assets/gtceu/textures/block/rubber_wall_hanging_sign.png b/src/main/resources/assets/gtceu/textures/block/rubber_wall_hanging_sign.png deleted file mode 100644 index 02e77aabd0c7ae7461e172e1feec0acc07b83400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1362 zcmV-Y1+DstP)r683lD54ZWX%I>fN)a0q9Q%B?cl%@JQS9yd{3CH} zu-6j#N~_h*zVGgv_ukCB_mqe*iqAiNPXO*LpQ6>C;-$uICdWdSA9exov;v?R1%wU5 zt@|(1YESWM^b7GIXROr#;K$pBlP9KmfOUd(g6An#*WyYpNiEILRD6J?<&{18rChre68JmRIdquq z1MwiI85-7sUU!wr>5wF~^amM%uW7eJ0G^wOX!ssWL%FPFX+}ZCFEKg(WPXVx$*|TQ z?re9#4wEaT=qHxdhkvrPyh4&%oO6f>%_yMT8<1s|^-dq4k}Ew}@=ui2Er?YSCIVG1kC09_!r%fCuT@^t!9O zHu1+6zUL|O+~IkOxS#SMJ70Zol;3U!Xa$|_fMyhMw^RK0-P0?qZ49{j-OWR_iq3O~ zQpG2wN6a0yUNn?3UNQhImq&2UB~^DEVosdmvYkYZZWRzgjr@cs>C1(((#t z&RvkvwFt$8W@hJQW_Dg4!>uqgJ1^I-T~(#`7H<>=Jv6QVL#XX}K#4LU_KJ*|*?DQT zr?`9fS4z1{b62D^#=nWGqrhVi-t7^w8)jzbW${K4>Z23Ae(h>C_B0VxCrs%rfO0Y= zc3T=HF3nw$Qf4PkUYb@baF#Ql|XJalEQM;Ip~& zGS+JF_gaylw3`O!Kx=qms?B<*Pp_X<>1w+b(v4F(8w1AM0cqyg5C6;WZyk$>sB%`V zA#27GpGF!!StlVP;pzC@ogGHe2P_Za9JbV-r1_sabs`6E9&E!~!bw&85X-+!y zdb=6mq%dA1@b=9QMykQOprg9EMDUUW1a%(Y0lO)*|etCD!(diDh z@U3-pdMShS7(~EmKfsQh@kx?nhstNUtNH=Ovqe!nJGYtYTU&T~trMe_s`>#U;2eku zaX-a6M>8~4@32nj@v#uCigVfXbai}{N0dnM&Nm7X!P?Db;1N485LZw#pmogf2TWBE=3}ZcHMD@>*?9$~qwmeR^@>RnOByPdoBla8iW6QVJ(R zJjhUritijmp^tNgAo=<>QgA$mChkH9biSE6tA^^+U3IGNz2}ys zlmPhXgWJhki*pVD#9)ok_nr_F+gmlx1@7MaiyPN30pMItMPt!W8G9%BGzV`r3>H_BjnOd68QDm03^N1P#nX3WdB>7)_^~>`K@Zo#6 zlJkMORQ6{blPWtNRBP}d0-mX5<<&DsY?Z5wrF`_ zyC%<-w)4k3P?f`^n$}U*Ib9#fR48)Gy79+C)f(zjaUpRqYq_vl0Zu%*8c)3&l1`o(@?4oz z7Hfwe7nwyw2qCezKR;Gmtyw$%C;@){?J>p}Lf+qHkcA0=zCA+0wO}&_T2k* z7at-aBsv$!tgID(v;ePPyG%^5ShhU)W5&(vm&r0q*A2;KcYj4)D%M)^%&=JXSR-Va z#rcF0)`~w`0BeQ$tVOM1)%47l9eHMOKGF4q!RY#c^F7l^iT4o?I3I`+rjvZF_@f0_ zwVs{r$xwPiWN&}Tq%IB}R>FtDc>(m!voS3Y5sVD(Y~A={A#c2PB^{NJqrM=7;b<9a zh#{hCh>7FlmQo^wgtbH2S||RuKRg;$3y+(j_usvl{ylK#v+tg(xj1dmqle|H17Lfr zKC#K11mvAJUrGR*6J_Uu;ymm=aV*WR!4a^&V+*gYM(+B#)rsFI_AN;u@B(MUl zz@$_{gj_Ata=f)XZP3;yE^ZYZRzo_U@IKIYf!TOxdFr57E|ypkwx>h9|2_AJSX_iE zKLO z!+SOnFe?1`aB-6J`rn{C7jkkdEZZ=&njtY?Mm8rIA)fsZP&F{`0-XyiR)h7c3(GlJ zI{>=-q{l^Qnql!}smzw1%nHt*={5iWwMKYxyWn8uIaql%DrK`C9AVp?{bu0!KH$9K d?AN(x;2%-~Rm$>ir3nB4002ovPDHLkV1gY!55@oh diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_0.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_0.png deleted file mode 100644 index f4c8b519fcdaf5c53a7b913b097904173dab1348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr-flP7LHbpupk0^Z&{+ z&H6;cwzCNhW|JPYUtkY2G~Ri#ROKVj*={9uhp*x#kC-=fPn^MQ=b+wKdVk&51wzgY zr;gn4nb~3De7~c@fzfE={pk&FBCV%{G-CiPCGOvu|xy+I&0bU2AxZm44ada3?+nRPSdu?J*=FHcu3>&*% z`@KGG-nET=$rnz)N1PYBH7CkvG)%78v;MBHa={T5hSNtj&PY{SI^#>P2!BMw)E)Ek t8CP$t(zxBcQF#*k?!JhIwVm~!7^Tg*8PjdgWdR+<;OXk;vd$@?2>=PbOF;kt diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_10.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_10.png deleted file mode 100644 index 5e63bfb09d283891c9cbba6a2ddf0d373bdb74f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Ln>~~4UXnJqQLRx-*&@` zKd!~C+P}$LYWLl3B048sn9p$}hcGO-r*v#b?uv+Oe&YKBy?%u#f8NO`Y8iwZ`JP-8~llB1}$>8bg K=d#Wzp$P!4hE^^B diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_11.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_11.png deleted file mode 100644 index 139df6448d70605b1d1a257b1a0098faa9177b50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmVlT4~$1*V+@` z)>?AT?TLCpL}C`Vdz&9VBc=3B(Ao#Ufqw`_@JiqUDdn4h10T!Z7(-E$K`+kgZPB0s5Bn=^4)8N<NCEqT2{~F7)-}cu jgu-)SMZ)?$@e6nWCK3=t$W3Xd00000NkvXXu0mjf`R8D= diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_12.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_12.png deleted file mode 100644 index 64951eb2db07aa6a2e3708001c01e07c65c21de9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmV<0044v4P)?c5c9v2KA*F;c!0n!gwE|-d zg7>~P<@_Sd$ZdcS0(&wAzBHc--m@2avLC}+zzo>_|;4fF@%7W=IJd^ zGx)Ml6s(f3eXTV@j1gA?d>?uo$7z9@L9eJ<7%8AAs-Nj!1~b$*M_%tu+`;&I{Z2BGkxbz&MULl3PFz7=~e2P$M7rvpUM} z!$J?a44^cxhFC28YHkkEdykgp>RV{d;L8Fj=q2a%Wm&*N2=hD0Jy?EyUaKfSu`V4$rnWp$GY3GA#hgNSLG=vm?lthFT8btTcL+kI=E zp+X2GVvMzE+g^koxege|k&a|e;R902T|tk0JTK~y--m@Wo@Xq}0&8tp zWAa&R4P#77)(h`FL?#~3Eqlfo#}R^^M^Zpm}7tV$&6cLcSYW8IY)B$K>2_kIsOw^J`$ qS1Q?{rNQvnE-}reyS7~W!H`wOW&PyDyT3peF?hQAxvX diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_3.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_3.png deleted file mode 100644 index c3340157af9eddeef8035fb66c38b8b81fd97d74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmV<203-j2P)3GB$@{iDF{ShJ|ugLNX72Tv1;1hytpd?}WMIjR(0Yb|1oNGbJ|K+zwdE8qlP WW)03Kjy{3_0000cGMJs;NnCw>-CYUOQJX;mxfz3)gH7Sg=oTYLM1%iQDt!vqgOmRQLN@&S&ZCVT#IL zkiz+j^+kj7<*M>>>BP1kreiZq6)&X~b||t;Fxk9b;cUW-glTuq&vxh$Ok>*9^@!sV q&x*z2>_YB2Y>UDR&i(y$jy>3)d!PH_quYTlV(@hJb6Mw<&;$U%sY^Tn diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_5.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_5.png deleted file mode 100644 index 4b1fbcf33331b07752ce18a3a6cc473447f84da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3q4&NLn>~q4ffjX-7d))bn$>+wo_ zYgkA34%xSx+!$?69l2v3Rm~Lkz;VIWV?57TWDP{t94Owqx_b8^z6yZ}v+E5D^U`L| zC}vw;`I9S#-%jfW>-WEt7fflAWsdheF1kbROxHfG2O3dT2dY?q?KAml`abj#zi9l& S_v}E&GI+ZBxvX~q4f5nWtibc+|9i%b z9jfdP4%Am2<@DGg>f60CE7O5%-pPuF%J&bozG+8jK8v%0o6#y_;`7fB-{rQ*8gXT;{V)9Jjt`&VQkE&tp6Uh|?w4y=9X|LoP?@>W^~Iy!l`j5tRS{002ovPDHLkV1gDAY9{~y diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_8.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_8.png deleted file mode 100644 index 01d77b072cadb005c2ee81a71b53b67497eb3929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-gg21oNXDDZs#xBX!= z|GbYu|BO^wTuVweq;Mu?M|y7)ytr-FwOd6GlI(@z_b9b|Q1f`nsPLhE0jsx?{emf4 zEF5>Pzb-L6wvkHKo*WM9)FS+Mu}z0WLj)=ax%Y5v^NUT{i- nTGQ#4LlT?!owD3|t%PaOJ}%S6|C0X!ox|Yi>gTe~DWM4frqfGo diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_9.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_9.png deleted file mode 100644 index 1202099cb3f858c47c7287c65befa20c0ef82ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^F3W0Ln>~~4T!mKkhdR#)i7?XJ-vK3nxwuWV_b$nkNz5MY#OZI!e?;6H4 zHY|EmCSUR))AG50li@uEzCW%7EZ#i&7ozraSbVUwTkZT;&vXYycLl>kOWqlOUkY*n Poyy?p>gTe~DWM4fd}mT& diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_background.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_background.png deleted file mode 100644 index b3781b10417bf8a44be91e5368240e57f11885bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enu*lQJF~q`u>11!d0}33hFaPRa^)BV+^BXVC`mM&iMw<*Sb8TyT!C#)} z#xnV^;4()y(+6P_TCZ1Wo|w0EsnU#d2h6pkD;9ZgV-cKV`{x{kexLQ)-BQ`X(m>l8 NJYD@<);T3K0RYkuNL&B_ diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_border.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/metal_border.png deleted file mode 100644 index 23d6c10087b471ed45e3770deb8071ceccd36e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enaFeHtV~BI(Gn=^|zy5FUcK5fr zoq?P9+?~FLn{|sPwN)<^IMuu?bJAxUX2I4~t4xx5Ub(8IJm`OX!EA9=cwm+Y#A*Gtp>Cg{!9YYX;L`@5hfZ`QFj^S9+P|G$^bxhHqFr+pQ7 z?fuzbn?L>6Vq8D*da3Da_WF+YM1$AM*S$V)!%cIB_h*~apKbEp*`ylZ_ZFW@zFwNi d-Jwy#aLA@~+o{K|jDfCa@O1TaS?83{1OUHgaV`J= diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_0.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_0.png deleted file mode 100644 index f4c8b519fcdaf5c53a7b913b097904173dab1348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8J;eVAr-flP7LHbpupk0^Z&{+ z&H6;cwzCNhW|JPYUtkY2G~Ri#ROKVj*={9uhp*x#kC-=fPn^MQ=b+wKdVk&51wzgY zr;gn4nb~3De7~c@fzfE={pk&FBCV%-9TS8yVJ!-)yM=FCfK{dCY(z(%6t8h4Bu9)2xe6 z6W1O7z@#~=)2LyIgG;zikb=mdKI;Vst0JzgW=>Px# diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_10.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_10.png deleted file mode 100644 index d849cb2941377eaf893f239f9fe07f1bd804e1b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA}1|M>sko_S|QUAKNq zBe%?tU;Nuu1QH}Zyq9-kRy-@grjV`1)}W)&x4A{a!NYi$&6(2bG?j<^%r&z%wlS`3 z?0Cdfa`Xs`k_}HspihX2kT9EyWP`V{kIZ_;9eY}HG)^Wqyi;0qiP26xccy^r9!87H zj3?v`VkW12w>Lf_(UX{yQYmo%co^?GHWfAoyC?7YoE!^ufUaZkboFyt=akR{0J>^K AbN~PV diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_11.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_11.png deleted file mode 100644 index db74d322dab13714b0725a3eb525edd604c927cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3p`yMLn>}1-!N8w`Tvhtyanb<@p64-SOO}w1lsoc$V`%eg#!g0tm78BCJapo4 Q0=kvK)78&qol`;+0PUbpk^lez diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_12.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_12.png deleted file mode 100644 index 0ad5616dd2ee42ec2c78e1b0d8b5eceeed1bba08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA}1-!N8wX)j}1-!N8w`Tvhtya3AR7K+b=kH7~g3)Bk=hDi&>qF3fx_fbrkg! zmPp3RJ+s>I`rtVQXX9%I3Z?=Fs}BA+<(Oe+%`%w+{uORDjiF^I7p zVN=+&P^F!5SNDN+?5Pq-!E(DKBJ}qeD6l+u$-p6T;-JD_hCS~;+_c-iI2h}1-!N8wX)j}1-!N8w`Tvhtya3AR7K+b=kH7~g3)Bk=hDi&>qF3fx_fbrkg! zmPp3RJ+s>I`rtVQXX9%I3Z?=Fs}BA+<(Oe+%`%w+{uORDjiF^I7p zVN=+&P^F!5SNDN+?5Pq-!E(DKBJ}qeD6l+u$CM09Pi!2AZ=Cp~u&;luR1B{N a55paeN9(@*c#sElG=rzBpUXO@geCyiCsqIe diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_2.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_2.png deleted file mode 100644 index 2c95591fa1941791fcc994fe9b7ad1e68f8326d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhfBgS%&#Wrp^nihV z-@n7UCl54a9@t;c!P{bzEYYxLrUb(#hCBwvvoAgwTo>eFu9?+o)Ud?CCEO=SL1^)e z6&WgOJRU|2)6-^H#4#6Ca^DP?beQ3;t4k}Ro%qBQhI0-&eVhOAA2#(Y`)};rb5P=# k+cfr%wK-QGWH}@;u!wy3sXl+S8t57ZPgg&ebxsLQ06+yohyVZp diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_3.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_3.png deleted file mode 100644 index ad4f3ed29fe665a909487b2491fde06062a23fb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>z@qLn>}1-!N8w`TvhtyaLNtKhKJ#s-T%T_-=@6)x`)Bj)z4*}Q$iB}8s$Zj diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_5.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_5.png deleted file mode 100644 index 8aabbb4ed0f91cbdc049facf9adcd6e1c59e3770..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA}1-!N8w`Tvhtya>zd^ z*1^Mgm(7{d1m**bj%{gc5*@-6#EwV)JHBkj3kQ~+4H8E!coj@}J}hHSGCh1G@KD1I z1{bp_PYfK&1#d6}v?-cBohZZRa+FDf$APEFkRh$|XYGZ@=b3@7WAJqKb6Mw<&;$Tz C5lOB9 diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_6.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_6.png deleted file mode 100644 index 9435521e5448a2e7b9b2231f2de6f27f3eef691d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(>+}rLn>}1-!N8wX)je5vkyTt#b$N^oyg$n>gTe~ HDWM4fy7)~g diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_7.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_7.png deleted file mode 100644 index 9946a5dbbb81537ef14ebeb247365d4bd0e78f61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFUg1Ln>}1-!N8w`Tvhtya>zd^ z*1^Mgm(7{d1m**bj%{gc5*@-6#EwV)JHBkj3kQ~+4H8E!coj@}J}hHSGCh1G@KD1I z1{bp_PYfK&1#d6}v?-cBohZZRa+FDfCt-)$$#?b|`3(j=y*m7le&1Mi@M^;mhDM=R VaaWqI6#?DL;OXk;vd$@?2>@bJRCoXY diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_8.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_8.png deleted file mode 100644 index 3a1909badc973d54419d4419d0a8195ecd05bb77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-fhfBgS%&%Cpuu3NvQ zkz3}+FaGT+0tpfy-pe~NE1s2LQ^;0hYtYf?+uS1I;9+Zb0i zc06J#IeLUe$%dyR&?m%1NSIAUvccQfM`k_ajy-9TS8yOBa)c+Td;>bK^zz}I{$dKY#I7jsegVU^w zPZQTMw=&-|IIvtYTVjG#hlZX*xQ~y*p~DRlM_pW%4HF$EG43!qeB`54!|CV~ZIfi! uUg#-l$v!9+)YvST%W$v6L65DKk>P~bkNQ%9PgOu?F?hQAxvX11!d0}33hFaPRa^)BV+^BXVC`mM&iMw<*Sb8TyT!C#)} z#xnV^;4()y(+6P_TCZ1Wo|w0EsnU#d2h6pkD;9ZgV-cKV`{x{kexLQ)-BQ`X(m>l8 NJYD@<);T3K0RYkuNL&B_ diff --git a/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_border.png b/src/main/resources/assets/gtceu/textures/block/storage/tank/wooden_border.png deleted file mode 100644 index e8a8cae131041cfc425f1f4b925c32b0b5d91629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enaIdF}V~B-+@*QL4m;WD|ua}(AxTZs6#=nn` z*$=LC0XfiCB&Kb@j%4GD%7yg65&9J<91^az8etDnm{r-UW|nQv)w diff --git a/src/main/resources/assets/gtceu/textures/block/stripped_rubber_wood.png b/src/main/resources/assets/gtceu/textures/block/stripped_rubber_wood.png index a4c0d2afb73c36497ae180476c1dc368309cbaf1..814313935a1e2d68c9e25b64cd4d9b813c7baaf5 100644 GIT binary patch delta 540 zcmV+%0^|MU1hoW^B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000tl z000tl0bXTW;{X5w%1J~)R5(v%liPCIFc5}U!a@dYa4~777tI6Y9r_A=|Jz=5GD#@d z*p?4i)xTm>CjD+!E7;Y)2dkeyo_&!U`daP?*mOS+&wE@Td)rLxKGdN?Nzo60+$8ne4W!hmu4wA7z*G2nhNRba@9-e*5(oKQAkDiI_RpTLoY^ zlqphcXFg=Q4eo2l%=oP1JfYnNPp663w>!fj1lf)XwRUVcbAO4bKRF%`5NhuNkdAaPAe*AXikG~cGa*l{N?#}-! zgs|Nz)Yj4CJdu-bo!XZ^d}Ec9Ql?y8GU7 zd{2byt&)Nee}Dh;ohb)ech@Fet(_Q@pj$$pKBx^R24%{DzhADD90?(CCn<@upt!|67tweMi3Iio*3%{-n8 zYc=K)IZOd}M+H(8LmoNZs50jBPZo_ zEC76aIxwYxZt-+Z$3jkuh;UntF(3wIt;QGwcV|9imdl;ijPu(KfLL4SP!jLUy3ct| zkr0I5oiWC~ALsX#r-z9Y1LtMkJnDTQ^5troBCl^(Vo+K)uD8k<(7NyWx4!uWppOp) z6;OqgwnTXl`HE_ckGCke`yOv=_OTlRms{JrESEa~-3H6GqRPi|DYXrr9}BG+Hk=d# Z{{aAeH5r!j&!_+Z002ovPDHLkV1na43(Wuk diff --git a/src/main/resources/assets/gtceu/textures/block/treated_wood_hanging_sign.png b/src/main/resources/assets/gtceu/textures/block/treated_wood_hanging_sign.png deleted file mode 100644 index f8085eba5386cf64b05a9e7ebf8fa27dfadba540..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 623 zcmV-#0+9WQP)4y+2@WeRO}6>?9avPcl_@CN6tUyPfmY7E?l_$uk2qrJ^b1DzWHC0!`!}L zG#va__)ks%o<6?kITv2OU*o~8bAV$m4E9=%F7{AhnvGJ7-EjdN5#ibMHxdC}yjugH zv%;%)-^f@sazkOFT%ewhh0LXd#YGJv8Hy4IMhB8bq7N(m5xvUDU8L=HAkoObG1?kFy#7@6xS z^K~Ky!8=GP5{u(jSl@04S`GxCHnvfn*_&}kT~{Q8mO?klwAm1#$sMcf1F{*G4|Q_6a$masC$X6oe6anNI|HQvNz6z09908zh9jRc1K2)gmE)vXWWru zA)C>(Mx6ppSJ)dDmKG9Ib1-O{LmQkr(I@9ZmkXQQ6Bc?s<|?H%qf_VDkqY|IPK~9y zLPYr0;p~vEoLzBI!5wgLHxNZcvErntcqyO?I9{A$#>cgF`3YJS7cz`cAkF{)002ov JPDHLkV1g7858wa* diff --git a/src/main/resources/assets/gtceu/textures/entity/signs/hanging/treated_wood.png b/src/main/resources/assets/gtceu/textures/entity/signs/hanging/treated_wood.png index d1b019d3a52db3b44183c09ce2a3b7e5fff3db99..3549aa963acf87ddfb099f863d83bfd4ba2399fe 100644 GIT binary patch literal 7069 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 diff --git a/src/main/resources/assets/gtceu/textures/entity/signs/treated_wood.png b/src/main/resources/assets/gtceu/textures/entity/signs/treated_wood.png index e178b70d4cfbd7bc89aa13a9c6e4bd7bf6608c28..0d2ae602047c38964ac974bb08b38fc5a6629f0d 100644 GIT binary patch delta 1235 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 V$0q|5{MG;f002ovPDHLkV1hiAlAr(p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/gui/hanging_signs/treated_wood.png b/src/main/resources/assets/gtceu/textures/gui/hanging_signs/treated_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..0f248931231cac8e4a0350e275b3c0a1363c8502 GIT binary patch literal 873 zcmV-v1D5=WP)EX>4Tx04R}tkv&MmKpe$iQ>A`XMC>5ykfAzR5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|?BJy6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+yU4&<~KKJM7Q8N|;d?N8IGfbO!gLrz= zHaPDShge=#iO-40Ou8WPBi9v=-#F)77I*{h@IUz7t(Bde@REX2p#8;hK1P7RE>NpD&iAq7)J_2ZGjOFh{G}=|^GSN8 zp@olt-fiIGx}hn1z~v4w@MOrQ>`H!`LN*J$pV2p^f&N>dYt8GezK_!fAW2=tZ-9eC zU^GYB>n+~h(cIg=XX^d^0Aw|Cp`Oi^6#xJL24YJ`L;(K)0000pCw%h&000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j~eA3nCx&nZ@t`000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0003%NklbS|kP@0T?R8 z3$QWsc)SQ3ufWu*LtCUIq;}#kxMv)zh~AX^{_ns4&gbmqZaM&L&gazCnydDMzrxs# z`tm98bgn1>s>V=PYZl8DXQct4)GA4K0D*Tg=`c1TT;JXg50B3S|3u0QWoEM*j){~v z^0`>9juMG^L7=YIM9U22VSLobfdxh;Cr==&^-q+E&ALO>~0C;=<%oMY12uy8C z|1l;J#%UecodY^Hl^6SJ{c|g_fo{ms{R7|!bRxTMFvV!!00000NkvXXu0mjfsB4VT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/gui/rubber.png b/src/main/resources/assets/gtceu/textures/gui/rubber.png deleted file mode 100644 index 7cc979de2a81a296649e70365a6b7d0fe1a09c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 zcmV-70?7S|P)$#eY(54J&cD1kRT%w5P(R5hy_?8CSeKe zh83_D_JBl&ErZ6Mp}+Ne1U>FCmXQ3U7d+LiQ}@+XpFh2kT|4p9zocuoJYD|)APcz4 z;(es4OJd55Q{lyt-Ewhxg)wSwt?)jQvd}n-RuE!ZbV?~w zN+2SL2+v-;m3Qwy$nE^UzOU09>g?<}52^b)eRsIHym}Diu5JNz?e;;J@9UI^@bUbW zXsv0S1t25=$%H7l%CcEIZuTR?7%0nGW3=MS*KbM#q%0V%XzG%Xgu*C%$N;32xZVwT zAF)Pb^qkN?D_EncO2hB#9#>k7G1RV@1zNLt4~y>BmUpEK^8ifz5h`4`ZM#G^-N_z~j^U=)i}_>cmkN z8l@D&l*oBrZSsknGa^D$m$cnT2#MW(I09-{FinBB_xKR!Up`pOInxgwfZd;orY>=n zW#9QDKq<9E<0{L|zQ-C(h>3piOt*az30{g@`Qi zhLDbcZV1aOZ8riCQ>N`bT7wT6tu;PmHfu)+iIitYe*s9-En}OP=xYD~002ovPDHLk FV1fXq`$GT# diff --git a/src/main/resources/assets/gtceu/textures/hanging_signs/rubber.png b/src/main/resources/assets/gtceu/textures/hanging_signs/rubber.png deleted file mode 100644 index 7cc979de2a81a296649e70365a6b7d0fe1a09c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 zcmV-70?7S|P)$#eY(54J&cD1kRT%w5P(R5hy_?8CSeKe zh83_D_JBl&ErZ6Mp}+Ne1U>FCmXQ3U7d+LiQ}@+XpFh2kT|4p9zocuoJYD|)APcz4 z;(es4OJd55Q{lyt-Ewhxg)wSwt?)jQvd}n-RuE!ZbV?~w zN+2SL2+v-;m3Qwy$nE^UzOU09>g?<}52^b)eRsIHym}Diu5JNz?e;;J@9UI^@bUbW zXsv0S1t25=$%H7l%CcEIZuTR?7%0nGW3=MS*KbM#q%0V%XzG%Xgu*C%$N;32xZVwT zAF)Pb^qkN?D_EncO2hB#9#>k7G1RV@1zNLt4~y>BmUpEK^8ifz5h`4`ZM#G^-N_z~j^U=)i}_>cmkN z8l@D&l*oBrZSsknGa^D$m$cnT2#MW(I09-{FinBB_xKR!Up`pOInxgwfZd;orY>=n zW#9QDKq<9E<0{L|zQ-C(h>3piOt*az30{g@`Qi zhLDbcZV1aOZ8riCQ>N`bT7wT6tu;PmHfu)+iIitYe*s9-En}OP=xYD~002ovPDHLk FV1fXq`$GT# diff --git a/src/main/resources/assets/gtceu/textures/item/bioware.mainframe.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/bioware.mainframe.png.mcmeta deleted file mode 100644 index 8a6e059cfa..0000000000 --- a/src/main/resources/assets/gtceu/textures/item/bioware.mainframe.png.mcmeta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "animation": { - "interpolate": false, - "frametime": 2, - "frames": [ - 0, 1, 2, 3, 4, 3, 2, 1 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/data_stick.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/data_stick.png.mcmeta index 5f132698f8..592ac6b260 100644 --- a/src/main/resources/assets/gtceu/textures/item/data_stick.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/data_stick.png.mcmeta @@ -10,7 +10,8 @@ { "index": 5, "time": 2 }, { "index": 6, "time": 2 }, { "index": 7, "time": 2 }, - { "index": 8, "time": 2 } + { "index": 8, "time": 2 }, + { "index": 9, "time": 2 } ] } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png b/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png index fc00c0938802c57cbbc8aa20021c7534f1d7fe7d..463ad2c6b8b5d4696f0263eae17ccc546c8e179e 100644 GIT binary patch delta 1456 zcmV;h1yA~t2(=547k_{V1^@s60+s0^0004nX+uL$Nkc;*aB^>EX>4Tx04R}tkv&Mm zKpe$iQ^gM|qIM8*$WWbH5EbdDRVYG*QY*CTU~=gfG-*guTpR`0f`cE6RRvrIQE;tk@NO-tvzPaI@LNg+Nb4jXhq z;zzE_F28XuI4tnYppj0^69+u3r_4s2lA00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6 z000McNliru=m`-LF)yK5EHMB802y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2! zfese{0Dl9FNklZP?*7fPGh_Oh|dChU@s64pbUb!M`=*^LMm_nk7s zzBe;3?|t?=E1-uhPEYFeIA8oM(BnWar@OarA%8v`0{}=>84Ieaf86_K1QB{U@g`Me z>>qpu2@)XA&!0R+MLx4VPBNB2GL}GmIEGrYq3?(l!8k%iK0`8==n9gIB|twTRb@z3 z**pg%2tRjlcm!3`000A#2uzbGRb{;T@C94BSz{+;wdKMI03eDGUQe?@d~~#-jGsvs zaes~?geXE7%J{KXRABoz(&t+(oC649F?ET-@HK2gXBM%ngRUK2T%y)&K-mj+#*e`s zK~+@%fKqBR0mwKn29XzosH27V*)b!bOb+O+6WhwoLMgRTM+arxBx2z9i& zl8D@_F(%Gr$4n_Nq(}9eBO?HS_;8Hbk$(QPM?4^1+BXl(Sa8L7@G>P}DIMsK2SXXZ(b7Yia34GXuze#8rPPLk zwtF5ZrMA)59uGVoc>17YZ>Qt^>w_plSSd>Gc(9lfFc=PCGonK&wGl;#dEV!Q2Y+;B z(hXa=!gemrHnV}>qZ;%`oL$FWwMKoKEN+s;J0pPJ05JqZ~E$Ytq;iR8`%j@A9y_Q z^ueF%0|4&zfpK2|fKtdk59TkL7=P3{0;6vp)S3;WtzGjVF9xwL>K+d~9(X+9?hCHI zAJ8k4;C#pWdKD7+k~x3T#0yR60*WmUc&jxV*vL*;i!9y>xj6v9_fiAvqK=u#aYnJZ z<^gf`cyOh8002{|hyC*a0CvTF_dK8-_=>f?FYJo@I5<2qy{S0j0sVWmaDR^F!ioKb zgTF5jN3l}IQaWJz0m7CCG*C!&nzpkQ4+^Px#1ZP1_K>z@;j|==^ z1poj532;bRa{vGi!Tc(e3bacv{D!8c~EV!pd zpGVK9+>>WB^?z0~g5jY-x#5dIf>5bc&zz zXC*AJd~;t)t5OysP%f9{!f({;o5gOauM0oijUBrq^M4RdV)cD}j2;{k5s1{SLj!L1 z_1k)D4Ut!%lLA3L0Yt`59Ep&1#2{G8$M)@6D;A4#-q+h584*K<#5^ci0~`YZpdu;& z@qKB&-WrlD8g3vG_oO5=Z3G)A53Eb+mpTvBop&GHkK{pQA*qNh?m-%#m~2>uAY96S zIu9=Xtbd55Gv$G`bmly`ePEkdI#V8SR9okHkmmu&^I+ZOfkmb~PWy>r&8qs1a)PmJbzH~Z|x6w($%iDz{aWf2Y`j8;<0v4 z0wnBA`BqnmK(jos$2<@6JW%)|@~53V0P0lw{jd82ka~Xr5n;;T8-NA@3rPGJd2S{& zj}H-Ol?NvVbneu?jlm`r3 zq3a`69sr1TaVa88+0O$7M84{=chf)t5OowvWVrl>fVEq0Ff44K=<1BMb5b6RRb7Zf z`HIKN{Fcb5V(lC^LA(wkSekae-kZ*WpMM8ZRS`;wj5bvsSYn3hrwgJG7>A5SIr4l2)cXP{O~M2hRNh0!lSo(L|eV00000NkvXXt^-0~ Ef(J~*`Tzg` diff --git a/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png.mcmeta index e945b0c407..fb20356f73 100644 --- a/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png.mcmeta +++ b/src/main/resources/assets/gtceu/textures/item/wetware_processor_mainframe.png.mcmeta @@ -5,33 +5,33 @@ "frames": [ { "index": 1, "time": 40 }, 0, - 3, - { "index": 5, "time": 60 }, - 7, - 8, + 2, + { "index": 4, "time": 60 }, + 6, 7, - 3, - { "index": 4, "time": 50 }, + 6, + 2, + { "index": 3, "time": 50 }, 0, - { "index": 6, "time": 30 }, - 7, - 8, + { "index": 5, "time": 30 }, + 6, 7, + 6, { "index": 1, "time": 40 }, 0, - 3, - { "index": 5, "time": 60 }, - 7, - 8, + 2, + { "index": 4, "time": 60 }, + 6, 7, - 3, - { "index": 4, "time": 50 }, + 6, + 2, + { "index": 3, "time": 50 }, 0, - { "index": 6, "time": 30 }, + { "index": 5, "time": 30 }, { "index": 0, "time": 120 }, - 7, - 8, - 7 + 6, + 7, + 6 ] } -} \ No newline at end of file +} From 14e321a497ca0330f3a5d1102e1e6c80f7da614d Mon Sep 17 00:00:00 2001 From: EasterFG <31056634+EasterFG@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:37:51 +0800 Subject: [PATCH 07/15] Fix jei drag (#1973) Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- .../gtceu/api/gui/misc/IGhostFluidTarget.java | 4 ++++ .../gtceu/api/gui/misc/IGhostItemTarget.java | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java index 28087d91e0..e4b16e1181 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostFluidTarget.java @@ -70,6 +70,10 @@ default Object convertIngredient(Object ingredient) { ingredient = fluid == null ? FluidStack.empty() : FluidStack.create(fluid, fluidEmiStack.getAmount(), fluidEmiStack.getNbt()); } + + if (LDLib.isJeiLoaded() && ingredient instanceof net.minecraftforge.fluids.FluidStack fluidStack) { + ingredient = FluidStack.create(fluidStack.getFluid(), fluidStack.getAmount(), fluidStack.getTag()); + } return ingredient; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java index d9f99b71ad..28593addd8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/misc/IGhostItemTarget.java @@ -12,6 +12,7 @@ import com.google.common.collect.Lists; import dev.emi.emi.api.stack.EmiStack; +import mezz.jei.api.ingredients.ITypedIngredient; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -53,10 +54,15 @@ public void accept(@NotNull Object ingredient) { default Object convertIngredient(Object ingredient) { if (LDLib.isEmiLoaded() && ingredient instanceof EmiStack itemEmiStack) { Item item = itemEmiStack.getKeyOfType(Item.class); - ingredient = item == null ? null : new ItemStack(item, (int) itemEmiStack.getAmount()); - if (ingredient instanceof ItemStack itemStack) { + ItemStack itemStack = item == null ? ItemStack.EMPTY : new ItemStack(item, (int) itemEmiStack.getAmount()); + if (!itemStack.isEmpty()) { itemStack.setTag(itemEmiStack.getNbt()); } + ingredient = itemStack; + } + + if (LDLib.isJeiLoaded() && ingredient instanceof ITypedIngredient itemJeiStack) { + return itemJeiStack.getItemStack().orElse(ItemStack.EMPTY); } return ingredient; } From 95ca694d0689c54d5744001c39c7ae0c015b45c8 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Wed, 18 Sep 2024 20:45:44 -0600 Subject: [PATCH 08/15] Wood Recipes and Boats (#1980) --- .../resources/assets/gtceu/lang/en_ud.json | 6 + .../resources/assets/gtceu/lang/en_us.json | 6 + .../assets/gtceu/models/item/rubber_boat.json | 6 + .../gtceu/models/item/rubber_chest_boat.json | 6 + .../gtceu/models/item/treated_wood_boat.json | 6 + .../models/item/treated_wood_chest_boat.json | 6 + .../gregtechceu/gtceu/client/ClientProxy.java | 14 ++ .../renderer/entity/GTBoatRenderer.java | 60 +++++++ .../gtceu/common/data/GTBlocks.java | 1 + .../gtceu/common/data/GTEntityTypes.java | 16 +- .../gtceu/common/data/GTItems.java | 22 +++ .../gtceu/common/data/GTMaterials.java | 1 + .../gtceu/common/entity/GTBoat.java | 123 +++++++++++++ .../gtceu/common/entity/GTChestBoat.java | 71 ++++++++ .../gtceu/common/item/GTBoatItem.java | 91 ++++++++++ .../item/GTBoatItemDispenseBehaviour.java | 72 ++++++++ .../gtceu/data/recipe/WoodTypeEntry.java | 45 +++++ .../data/recipe/misc/WoodMachineRecipes.java | 163 +++++++++++++++--- .../resources/META-INF/accesstransformer.cfg | 2 + .../textures/entity/boat/rubber_boat.png | Bin 0 -> 2872 bytes .../entity/boat/rubber_chest_boat.png | Bin 0 -> 4731 bytes .../textures/entity/boat/treated_boat.png | Bin 0 -> 2845 bytes .../entity/boat/treated_chest_boat.png | Bin 0 -> 4714 bytes .../gtceu/textures/item/rubber_boat.png | Bin 0 -> 614 bytes .../gtceu/textures/item/rubber_chest_boat.png | Bin 0 -> 635 bytes .../gtceu/textures/item/treated_wood_boat.png | Bin 0 -> 556 bytes .../textures/item/treated_wood_chest_boat.png | Bin 0 -> 621 bytes 27 files changed, 692 insertions(+), 25 deletions(-) create mode 100644 src/generated/resources/assets/gtceu/models/item/rubber_boat.json create mode 100644 src/generated/resources/assets/gtceu/models/item/rubber_chest_boat.json create mode 100644 src/generated/resources/assets/gtceu/models/item/treated_wood_boat.json create mode 100644 src/generated/resources/assets/gtceu/models/item/treated_wood_chest_boat.json create mode 100644 src/main/java/com/gregtechceu/gtceu/client/renderer/entity/GTBoatRenderer.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/entity/GTBoat.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/entity/GTChestBoat.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItem.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItemDispenseBehaviour.java create mode 100644 src/main/resources/assets/gtceu/textures/entity/boat/rubber_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/entity/boat/rubber_chest_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/entity/boat/treated_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/entity/boat/treated_chest_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/item/rubber_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/item/rubber_chest_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/item/treated_wood_boat.png create mode 100644 src/main/resources/assets/gtceu/textures/item/treated_wood_chest_boat.png diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index add14c8f1b..f0ccff0fc4 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -2586,6 +2586,8 @@ "enchantment.gtceu.disjunction.desc": "˙sqoɯ pǝʇɐןǝɹ-ɹǝpuƎ oʇ ssǝuʍoןS puɐ ssǝuʞɐǝM sǝıןddⱯ", "enchantment.gtceu.hard_hammer.desc": "˙ɹǝɯɯɐH ɥɔǝ⟘bǝɹ⅁ ɐ ɥʇıʍ pǝuıɯ ǝɹǝʍ ʎǝɥʇ ɟı sɐ sʞɔoןq sʞɐǝɹᗺ", "enchantment.hard_hammer": "buıɹǝɯɯɐH", + "entity.gtceu.boat": "ʇɐoᗺ", + "entity.gtceu.chest_boat": "ʇɐoᗺ ʇsǝɥƆ", "entity.gtceu.dynamite": "ǝʇıɯɐuʎᗡ", "entity.gtceu.industrial_tnt": "⟘N⟘ ןɐıɹʇsnpuI", "entity.gtceu.powderbarrel": "ןǝɹɹɐqɹǝpʍoԀ", @@ -4716,6 +4718,8 @@ "item.gtceu.rotor_casting_mold.tooltip": "sɹoʇoᴚ buıʞɐɯ ɹoɟ pןoWㄥ§", "item.gtceu.rotor_extruder_mold": ")ɹoʇoᴚ( pןoW ɹǝpnɹʇxƎ", "item.gtceu.rotor_extruder_mold.tooltip": "sɹoʇoᴚ buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", + "item.gtceu.rubber_boat": "ʇɐoᗺ ɹǝqqnᴚ", + "item.gtceu.rubber_chest_boat": "ʇsǝɥƆ ɥʇıʍ ʇɐoᗺ ɹǝqqnᴚ", "item.gtceu.rubber_gloves": "sǝʌoן⅁ ɹǝqqnᴚ", "item.gtceu.salt_dust": "ʇןɐS", "item.gtceu.saw_extruder_mold.tooltip": "sʍɐS buıʞɐɯ ɹoɟ ǝdɐɥS ɹǝpnɹʇxƎㄥ§", @@ -4928,7 +4932,9 @@ "item.gtceu.tool.wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", "item.gtceu.transistor": "ɹoʇsısuɐɹ⟘", "item.gtceu.transistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", + "item.gtceu.treated_wood_boat": "ʇɐoᗺ pooM pǝʇɐǝɹ⟘", "item.gtceu.treated_wood_bolt": "ʞɔıʇS pooM pǝʇɐǝɹ⟘ ʇɹoɥS", + "item.gtceu.treated_wood_chest_boat": "ʇsǝɥƆ ɥʇıʍ ʇɐoᗺ pooM pǝʇɐǝɹ⟘", "item.gtceu.treated_wood_dust": "dןnԀ pooM pǝʇɐǝɹ⟘", "item.gtceu.treated_wood_plate": "ʞuɐןԀ pooM pǝʇɐǝɹ⟘", "item.gtceu.treated_wood_rod": "ʞɔıʇS pooM pǝʇɐǝɹ⟘", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 7c1eb46ed9..08b1471817 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -2586,6 +2586,8 @@ "enchantment.gtceu.disjunction.desc": "Applies Weakness and Slowness to Ender-related mobs.", "enchantment.gtceu.hard_hammer.desc": "Breaks blocks as if they were mined with a GregTech Hammer.", "enchantment.hard_hammer": "Hammering", + "entity.gtceu.boat": "Boat", + "entity.gtceu.chest_boat": "Chest Boat", "entity.gtceu.dynamite": "Dynamite", "entity.gtceu.industrial_tnt": "Industrial TNT", "entity.gtceu.powderbarrel": "Powderbarrel", @@ -4716,6 +4718,8 @@ "item.gtceu.rotor_casting_mold.tooltip": "§7Mold for making Rotors", "item.gtceu.rotor_extruder_mold": "Extruder Mold (Rotor)", "item.gtceu.rotor_extruder_mold.tooltip": "§7Extruder Shape for making Rotors", + "item.gtceu.rubber_boat": "Rubber Boat", + "item.gtceu.rubber_chest_boat": "Rubber Boat with Chest", "item.gtceu.rubber_gloves": "Rubber Gloves", "item.gtceu.salt_dust": "Salt", "item.gtceu.saw_extruder_mold.tooltip": "§7Extruder Shape for making Saws", @@ -4928,7 +4932,9 @@ "item.gtceu.tool.wrench.tooltip": "§8Hold left click to dismantle Machines", "item.gtceu.transistor": "Transistor", "item.gtceu.transistor.tooltip": "§7Basic Electronic Component", + "item.gtceu.treated_wood_boat": "Treated Wood Boat", "item.gtceu.treated_wood_bolt": "Short Treated Wood Stick", + "item.gtceu.treated_wood_chest_boat": "Treated Wood Boat with Chest", "item.gtceu.treated_wood_dust": "Treated Wood Pulp", "item.gtceu.treated_wood_plate": "Treated Wood Plank", "item.gtceu.treated_wood_rod": "Treated Wood Stick", diff --git a/src/generated/resources/assets/gtceu/models/item/rubber_boat.json b/src/generated/resources/assets/gtceu/models/item/rubber_boat.json new file mode 100644 index 0000000000..1298fccf6d --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/rubber_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/rubber_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/rubber_chest_boat.json b/src/generated/resources/assets/gtceu/models/item/rubber_chest_boat.json new file mode 100644 index 0000000000..69a0964968 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/rubber_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/rubber_chest_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/treated_wood_boat.json b/src/generated/resources/assets/gtceu/models/item/treated_wood_boat.json new file mode 100644 index 0000000000..2ad82d61dc --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/treated_wood_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/treated_wood_boat" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/treated_wood_chest_boat.json b/src/generated/resources/assets/gtceu/models/item/treated_wood_chest_boat.json new file mode 100644 index 0000000000..c24d335945 --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/treated_wood_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/treated_wood_chest_boat" + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java index c1f7f35e7e..336acbcfc7 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/client/ClientProxy.java @@ -8,22 +8,27 @@ import com.gregtechceu.gtceu.api.gui.compass.GTRecipeViewCreator; import com.gregtechceu.gtceu.api.gui.compass.MultiblockAction; import com.gregtechceu.gtceu.client.particle.HazardParticle; +import com.gregtechceu.gtceu.client.renderer.entity.GTBoatRenderer; import com.gregtechceu.gtceu.client.renderer.entity.GTExplosiveRenderer; import com.gregtechceu.gtceu.common.CommonProxy; import com.gregtechceu.gtceu.common.data.GTBlockEntities; import com.gregtechceu.gtceu.common.data.GTEntityTypes; import com.gregtechceu.gtceu.common.data.GTParticleTypes; +import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.utils.input.KeyBind; import com.lowdragmc.lowdraglib.gui.compass.CompassManager; import com.lowdragmc.lowdraglib.gui.compass.component.RecipeComponent; +import net.minecraft.client.model.BoatModel; +import net.minecraft.client.model.ChestBoatModel; import net.minecraft.client.renderer.blockentity.HangingSignRenderer; import net.minecraft.client.renderer.blockentity.SignRenderer; import net.minecraft.client.renderer.entity.ThrownItemRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; @@ -64,6 +69,15 @@ public void onRegisterEntityRenderers(EntityRenderersEvent.RegisterRenderers eve event.registerBlockEntityRenderer(GTBlockEntities.GT_SIGN.get(), SignRenderer::new); event.registerBlockEntityRenderer(GTBlockEntities.GT_HANGING_SIGN.get(), HangingSignRenderer::new); + + event.registerEntityRenderer(GTEntityTypes.BOAT.get(), c -> new GTBoatRenderer(c, false)); + event.registerEntityRenderer(GTEntityTypes.CHEST_BOAT.get(), c -> new GTBoatRenderer(c, true)); + + for (var type : GTBoat.BoatType.values()) { + ForgeHooksClient.registerLayerDefinition(GTBoatRenderer.getBoatModelName(type), BoatModel::createBodyModel); + ForgeHooksClient.registerLayerDefinition(GTBoatRenderer.getChestBoatModelName(type), + ChestBoatModel::createBodyModel); + } } @SubscribeEvent diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/entity/GTBoatRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/entity/GTBoatRenderer.java new file mode 100644 index 0000000000..f5b3d71d55 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/entity/GTBoatRenderer.java @@ -0,0 +1,60 @@ +package com.gregtechceu.gtceu.client.renderer.entity; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.common.entity.GTBoat; +import com.gregtechceu.gtceu.common.entity.GTChestBoat; + +import net.minecraft.client.model.BoatModel; +import net.minecraft.client.model.ChestBoatModel; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.entity.BoatRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.vehicle.Boat; + +import com.google.common.collect.ImmutableMap; +import com.mojang.datafixers.util.Pair; + +import java.util.Map; +import java.util.stream.Stream; + +public class GTBoatRenderer extends BoatRenderer { + + private final Map>> boats; + + public GTBoatRenderer(EntityRendererProvider.Context context, boolean chestBoat) { + super(context, chestBoat); + boats = Stream.of(GTBoat.BoatType.values()).collect(ImmutableMap.toImmutableMap(k -> k, + (m) -> Pair.of(new ResourceLocation(GTCEu.MOD_ID, + getTextureLocation(m, chestBoat)), createBoatModel(context, m, chestBoat)))); + } + + @Override + public Pair> getModelWithLocation(Boat boat) { + if (boat instanceof GTChestBoat gtcb) { + return this.boats.get(gtcb.getBoatType()); + } else + return this.boats.get(((GTBoat) boat).getBoatType()); + } + + private static String getTextureLocation(GTBoat.BoatType type, boolean chest) { + return chest ? "textures/entity/boat/" + type.getName() + "_chest_boat.png" : + "textures/entity/boat/" + type.getName() + "_boat.png"; + } + + private BoatModel createBoatModel(EntityRendererProvider.Context context, GTBoat.BoatType type, boolean chest) { + ModelLayerLocation modelLoc = chest ? getChestBoatModelName(type) : getBoatModelName(type); + ModelPart part = context.bakeLayer(modelLoc); + return chest ? new ChestBoatModel(part) : new BoatModel(part); + } + + public static ModelLayerLocation getChestBoatModelName(GTBoat.BoatType type) { + return new ModelLayerLocation(new ResourceLocation(GTCEu.MOD_ID, "chest_boat/" + type.getName()), "main"); + } + + public static ModelLayerLocation getBoatModelName(GTBoat.BoatType type) { + return new ModelLayerLocation(new ResourceLocation(GTCEu.MOD_ID, "boat/" + type.getName()), "main"); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index efdfa08f54..3d1c611ff9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -1298,6 +1298,7 @@ public static ItemColor leavesItemColor() { .tag(ItemTags.WOODEN_FENCES) .build() .register(); + public static final BlockEntry TREATED_WOOD_SIGN = REGISTRATE .block("treated_wood_sign", (p) -> new GTStandingSignBlock(p, TREATED_WOOD_TYPE)) .initialProperties(() -> Blocks.SPRUCE_SIGN) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTEntityTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTEntityTypes.java index 13a09ffdcf..5a7d473cce 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTEntityTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTEntityTypes.java @@ -1,8 +1,6 @@ package com.gregtechceu.gtceu.common.data; -import com.gregtechceu.gtceu.common.entity.DynamiteEntity; -import com.gregtechceu.gtceu.common.entity.IndustrialTNTEntity; -import com.gregtechceu.gtceu.common.entity.PowderbarrelEntity; +import com.gregtechceu.gtceu.common.entity.*; import net.minecraft.tags.EntityTypeTags; import net.minecraft.world.entity.MobCategory; @@ -32,5 +30,17 @@ public class GTEntityTypes { .properties(builder -> builder.sized(0.98F, 0.98F).fireImmune().clientTrackingRange(10).updateInterval(10)) .register(); + public static final EntityEntry BOAT = REGISTRATE + .entity("boat", GTBoat::new, MobCategory.MISC) + .lang("Boat") + .properties(builder -> builder.sized(1.375f, 0.5625f).clientTrackingRange(10)) + .register(); + + public static final EntityEntry CHEST_BOAT = REGISTRATE + .entity("chest_boat", GTChestBoat::new, MobCategory.MISC) + .lang("Chest Boat") + .properties(builder -> builder.sized(1.375f, 0.5625f).clientTrackingRange(10)) + .register(); + public static void init() {} } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 92ed72be06..167fa50dd5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -31,6 +31,7 @@ import com.gregtechceu.gtceu.api.registry.registrate.CompassSection; import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; import com.gregtechceu.gtceu.common.data.materials.GTFoods; +import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.common.item.*; import com.gregtechceu.gtceu.common.item.armor.*; import com.gregtechceu.gtceu.common.item.tool.behavior.LighterBehavior; @@ -2698,6 +2699,27 @@ public Component getItemName(ItemStack stack) { public static ItemEntry BLACKLIGHT = REGISTRATE.item("blacklight", Item::new) .onRegister(compassNode(GTCompassSections.MISC)).register(); + public static ItemEntry RUBBER_BOAT = REGISTRATE + .item("rubber_boat", p -> new GTBoatItem(false, GTBoat.BoatType.RUBBER, new Item.Properties())) + .lang("Rubber Boat") + .register(); + + public static ItemEntry TREATED_WOOD_BOAT = REGISTRATE + .item("treated_wood_boat", p -> new GTBoatItem(false, GTBoat.BoatType.TREATED_WOOD, new Item.Properties())) + .lang("Treated Wood Boat") + .register(); + + public static ItemEntry RUBBER_CHEST_BOAT = REGISTRATE + .item("rubber_chest_boat", p -> new GTBoatItem(true, GTBoat.BoatType.RUBBER, new Item.Properties())) + .lang("Rubber Boat with Chest") + .register(); + + public static ItemEntry TREATED_WOOD_CHEST_BOAT = REGISTRATE + .item("treated_wood_chest_boat", + p -> new GTBoatItem(true, GTBoat.BoatType.TREATED_WOOD, new Item.Properties())) + .lang("Treated Wood Boat with Chest") + .register(); + public static void init() { generateMaterialItems(); generateTools(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java index 224eaf27af..1119778619 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMaterials.java @@ -123,6 +123,7 @@ public static void init() { ingot.setIgnored(Iron, Items.IRON_INGOT); ingot.setIgnored(Gold, Items.GOLD_INGOT); ingot.setIgnored(Copper, Items.COPPER_INGOT); + ingot.setIgnored(Brick, Items.BRICK); ingot.setIgnored(Wax, Items.HONEYCOMB); nugget.setIgnored(Gold, Items.GOLD_NUGGET); diff --git a/src/main/java/com/gregtechceu/gtceu/common/entity/GTBoat.java b/src/main/java/com/gregtechceu/gtceu/common/entity/GTBoat.java new file mode 100644 index 0000000000..6986a26b67 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/entity/GTBoat.java @@ -0,0 +1,123 @@ +package com.gregtechceu.gtceu.common.entity; + +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTEntityTypes; +import com.gregtechceu.gtceu.common.data.GTItems; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; + +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; + +public class GTBoat extends Boat { + + public GTBoat(EntityType entityType, Level level) { + super(entityType, level); + this.blocksBuilding = true; + } + + public GTBoat(Level level, double x, double y, double z) { + super(GTEntityTypes.BOAT.get(), level); + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; + } + + @Nullable + @Override + public Component getCustomName() { + return super.getCustomName(); + } + + @Override + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this); + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + compound.putString("Type", getBoatType().getName()); + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + if (compound.contains("Type")) { + entityData.set(DATA_ID_TYPE, BoatType.byName(compound.getString("Type")).ordinal()); + } + } + + @Override + public Item getDropItem() { + return switch (BoatType.byId(this.entityData.get(DATA_ID_TYPE))) { + case RUBBER -> GTItems.RUBBER_BOAT.get(); + case TREATED_WOOD -> GTItems.TREATED_WOOD_BOAT.get(); + }; + } + + public void setBoatType(BoatType type) { + this.entityData.set(DATA_ID_TYPE, type.ordinal()); + } + + public BoatType getBoatType() { + return BoatType.byId(entityData.get(DATA_ID_TYPE)); + } + + @Override + public void setVariant(Type variant) {} + + @Override + public Type getVariant() { + return Type.OAK; + } + + public enum BoatType { + + RUBBER("rubber", GTBlocks.RUBBER_PLANK.get()), + TREATED_WOOD("treated", GTBlocks.TREATED_WOOD_PLANK.get()); + + private final String name; + private final Block planks; + + private static final BoatType[] VALUES = values(); + + private BoatType(String name, Block planks) { + this.name = name; + this.planks = planks; + } + + public String getName() { + return this.name; + } + + public Block getPlanks() { + return this.planks; + } + + public String toString() { + return this.name; + } + + /** + * Get a boat type by its enum ordinal + */ + public static BoatType byId(int id) { + if (id < 0 || id >= VALUES.length) id = 0; + return VALUES[id]; + } + + public static BoatType byName(String name) { + return Arrays.stream(VALUES).filter(type -> type.getName().equals(name)).findFirst().orElse(VALUES[0]); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/entity/GTChestBoat.java b/src/main/java/com/gregtechceu/gtceu/common/entity/GTChestBoat.java new file mode 100644 index 0000000000..81825a0b61 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/entity/GTChestBoat.java @@ -0,0 +1,71 @@ +package com.gregtechceu.gtceu.common.entity; + +import com.gregtechceu.gtceu.common.data.GTEntityTypes; +import com.gregtechceu.gtceu.common.data.GTItems; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.entity.vehicle.ChestBoat; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; + +public class GTChestBoat extends ChestBoat { + + public GTChestBoat(EntityType entityType, Level level) { + super(entityType, level); + this.blocksBuilding = true; + } + + public GTChestBoat(Level level, double x, double y, double z) { + super(GTEntityTypes.CHEST_BOAT.get(), level); + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; + } + + @Override + public Packet getAddEntityPacket() { + return new ClientboundAddEntityPacket(this); + } + + @Override + protected void addAdditionalSaveData(CompoundTag compound) { + compound.putString("Type", getBoatType().getName()); + } + + @Override + protected void readAdditionalSaveData(CompoundTag compound) { + if (compound.contains("Type")) { + entityData.set(DATA_ID_TYPE, GTBoat.BoatType.byName(compound.getString("Type")).ordinal()); + } + } + + @Override + public Item getDropItem() { + return switch (GTBoat.BoatType.byId(this.entityData.get(DATA_ID_TYPE))) { + case RUBBER -> GTItems.RUBBER_CHEST_BOAT.get(); + case TREATED_WOOD -> GTItems.TREATED_WOOD_CHEST_BOAT.get(); + }; + } + + public void setBoatType(GTBoat.BoatType type) { + this.entityData.set(DATA_ID_TYPE, type.ordinal()); + } + + public GTBoat.BoatType getBoatType() { + return GTBoat.BoatType.byId(entityData.get(DATA_ID_TYPE)); + } + + @Override + public void setVariant(Type variant) {} + + @Override + public Type getVariant() { + return Type.OAK; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItem.java b/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItem.java new file mode 100644 index 0000000000..945cc8a009 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItem.java @@ -0,0 +1,91 @@ +package com.gregtechceu.gtceu.common.item; + +import com.gregtechceu.gtceu.common.entity.GTBoat; +import com.gregtechceu.gtceu.common.entity.GTChestBoat; + +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; + +import java.util.List; +import java.util.function.Predicate; + +public class GTBoatItem extends Item { + + private static final Predicate ENTITY_PREDICATE = EntitySelector.NO_SPECTATORS.and(Entity::isPickable); + private final GTBoat.BoatType type; + private final boolean hasChest; + + public GTBoatItem(boolean hasChest, GTBoat.BoatType type, Item.Properties properties) { + super(properties); + this.hasChest = hasChest; + this.type = type; + DispenserBlock.registerBehavior(this, new GTBoatItemDispenseBehaviour(type, hasChest)); + } + + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack itemstack = player.getItemInHand(hand); + HitResult hitresult = getPlayerPOVHitResult(level, player, ClipContext.Fluid.ANY); + if (hitresult.getType() == HitResult.Type.MISS) { + return InteractionResultHolder.pass(itemstack); + } else { + Vec3 vec3 = player.getViewVector(1.0F); + double d0 = 5.0; + List list = level.getEntities(player, + player.getBoundingBox().expandTowards(vec3.scale(5.0)).inflate(1.0), ENTITY_PREDICATE); + if (!list.isEmpty()) { + Vec3 vec31 = player.getEyePosition(); + for (Entity e : list) { + AABB aabb = e.getBoundingBox().inflate((double) e.getPickRadius()); + if (aabb.contains(vec31)) { + return InteractionResultHolder.pass(itemstack); + } + } + } + + if (hitresult.getType() == HitResult.Type.BLOCK) { + Boat boat; + if (hasChest) { + boat = new GTChestBoat(level, hitresult.getLocation().x, hitresult.getLocation().y, + hitresult.getLocation().z); + ((GTChestBoat) boat).setBoatType(type); + } else { + boat = new GTBoat(level, hitresult.getLocation().x, hitresult.getLocation().y, + hitresult.getLocation().z); + ((GTBoat) boat).setBoatType(type); + } + + boat.setYRot(player.getYRot()); + if (!level.noCollision(boat, boat.getBoundingBox())) { + return InteractionResultHolder.fail(itemstack); + } else { + if (!level.isClientSide) { + level.addFreshEntity(boat); + level.gameEvent(player, GameEvent.ENTITY_PLACE, hitresult.getLocation()); + if (!player.getAbilities().instabuild) { + itemstack.shrink(1); + } + } + + player.awardStat(Stats.ITEM_USED.get(this)); + return InteractionResultHolder.sidedSuccess(itemstack, level.isClientSide()); + } + } else { + return InteractionResultHolder.pass(itemstack); + } + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItemDispenseBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItemDispenseBehaviour.java new file mode 100644 index 0000000000..edad373466 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/item/GTBoatItemDispenseBehaviour.java @@ -0,0 +1,72 @@ +package com.gregtechceu.gtceu.common.item; + +import com.gregtechceu.gtceu.common.entity.GTBoat; +import com.gregtechceu.gtceu.common.entity.GTChestBoat; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; + +public class GTBoatItemDispenseBehaviour extends DefaultDispenseItemBehavior { + + private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior(); + private final GTBoat.BoatType type; + private final boolean isChestBoat; + + public GTBoatItemDispenseBehaviour(GTBoat.BoatType type) { + this(type, false); + } + + public GTBoatItemDispenseBehaviour(GTBoat.BoatType type, boolean isChestBoat) { + this.type = type; + this.isChestBoat = isChestBoat; + } + + public ItemStack execute(BlockSource source, ItemStack stack) { + Direction direction = (Direction) source.getBlockState().getValue(DispenserBlock.FACING); + Level level = source.getLevel(); + double d0 = 0.5625 + (double) EntityType.BOAT.getWidth() / 2.0; + double d1 = source.x() + (double) direction.getStepX() * d0; + double d2 = source.y() + (double) ((float) direction.getStepY() * 1.125F); + double d3 = source.z() + (double) direction.getStepZ() * d0; + BlockPos blockpos = source.getPos().relative(direction); + + Boat boat; + if (isChestBoat) { + boat = new GTChestBoat(level, d0, d1, d2); + ((GTChestBoat) boat).setBoatType(type); + } else { + boat = new GTBoat(level, d0, d1, d2); + ((GTBoat) boat).setBoatType(type); + } + + boat.setYRot(direction.toYRot()); + double d4; + if (((Boat) boat).canBoatInFluid(level.getFluidState(blockpos))) { + d4 = 1.0; + } else { + if (!level.getBlockState(blockpos).isAir() || + !((Boat) boat).canBoatInFluid(level.getFluidState(blockpos.below()))) { + return this.defaultDispenseItemBehavior.dispense(source, stack); + } + + d4 = 0.0; + } + + ((Boat) boat).setPos(d1, d2 + d4, d3); + level.addFreshEntity((Entity) boat); + stack.shrink(1); + return stack; + } + + protected void playSound(BlockSource source) { + source.getLevel().levelEvent(1000, source.getPos(), 0); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java index 82e4334adf..ddab441154 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/WoodTypeEntry.java @@ -80,6 +80,14 @@ public final class WoodTypeEntry { public final Item chestBoat; @Nullable public final String chestBoatRecipeName; + @Nullable + public final Item sign; + @Nullable + public final String signRecipeName; + @Nullable + public final Item hangingSign; + @Nullable + public final String hangingSignRecipeName; public final Material material; public final boolean addLogOreDict; @@ -115,6 +123,8 @@ private WoodTypeEntry(@NotNull String modid, @NotNull String woodName, @NotNull @Nullable Item stairs, @Nullable String stairsRecipeName, boolean addStairsCraftingRecipe, @Nullable Item boat, @Nullable String boatRecipeName, @Nullable Item chestBoat, @Nullable String chestBoatRecipeName, + @Nullable Item sign, @Nullable String signRecipeName, + @Nullable Item hangingSign, @Nullable String hangingSignRecipeName, @Nullable Material material, boolean addLogOreDict, boolean addPlanksOreDict, boolean addDoorsOreDict, boolean addSlabsOreDict, @@ -153,6 +163,10 @@ private WoodTypeEntry(@NotNull String modid, @NotNull String woodName, @NotNull this.boatRecipeName = boatRecipeName; this.chestBoat = chestBoat; this.chestBoatRecipeName = chestBoatRecipeName; + this.sign = sign; + this.signRecipeName = signRecipeName; + this.hangingSign = hangingSign; + this.hangingSignRecipeName = hangingSignRecipeName; this.material = material != null ? material : GTMaterials.Wood; this.addLogOreDict = addLogOreDict; @@ -219,6 +233,10 @@ public static class Builder { private String boatRecipeName; private Item chestBoat = null; private String chestBoatRecipeName; + private Item sign = null; + private String signRecipeName; + private Item hangingSign = null; + private String hangingSignRecipeName; @Nullable private Material material = null; @@ -462,6 +480,32 @@ public Builder chestBoat(@NotNull Item chestBoat, @Nullable String chestBoatReci return this; } + /** + * Add an entry for a sign + * + * @param sign the sign to add + * @param signRecipeName the recipe name for crafting the sign + * @return this + */ + public Builder sign(@NotNull Item sign, @Nullable String signRecipeName) { + this.sign = sign; + this.signRecipeName = signRecipeName; + return this; + } + + /** + * Add an entry for a sign + * + * @param hangingSign the hanging sign to add + * @param hangingSignRecipeName the recipe name for crafting the hanging sign + * @return this + */ + public Builder hangingSign(@NotNull Item hangingSign, @Nullable String hangingSignRecipeName) { + this.hangingSign = hangingSign; + this.hangingSignRecipeName = hangingSignRecipeName; + return this; + } + /** * Specify material for wood entry. If not provided, {@link GTMaterials#Wood} will be used * @@ -573,6 +617,7 @@ public WoodTypeEntry build() { fence, fenceRecipeName, fenceGate, fenceGateRecipeName, stairs, stairsRecipeName, addStairsCraftingRecipe, boat, boatRecipeName, chestBoat, chestBoatRecipeName, + sign, signRecipeName, hangingSign, hangingSignRecipeName, material, addLogOreDict, addPlanksOreDict, addDoorsOreDict, addSlabsOreDict, addFencesOreDict, addFenceGatesOreDict, addStairsOreDict, addPlanksUnificationInfo, diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/WoodMachineRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/WoodMachineRecipes.java index d5421a05ea..6674b5b159 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/WoodMachineRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/WoodMachineRecipes.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.stack.UnificationEntry; import com.gregtechceu.gtceu.api.data.tag.TagUtil; import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; @@ -65,6 +66,8 @@ private static List getDefaultEntries() { .stairs(Items.OAK_STAIRS, "oak_stairs") .boat(Items.OAK_BOAT, "oak_boat") .chestBoat(Items.OAK_CHEST_BOAT, "oak_chest_boat") + .sign(Items.OAK_SIGN, "oak_sign") + .hangingSign(Items.OAK_HANGING_SIGN, "oak_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "spruce") @@ -81,6 +84,8 @@ private static List getDefaultEntries() { .stairs(Items.SPRUCE_STAIRS, "spruce_stairs") .boat(Items.SPRUCE_BOAT, "spruce_boat") .chestBoat(Items.SPRUCE_CHEST_BOAT, "spruce_chest_boat") + .sign(Items.SPRUCE_SIGN, "spruce_sign") + .hangingSign(Items.SPRUCE_HANGING_SIGN, "spruce_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "birch") @@ -97,6 +102,8 @@ private static List getDefaultEntries() { .stairs(Items.BIRCH_STAIRS, "birch_stairs") .boat(Items.BIRCH_BOAT, "birch_boat") .chestBoat(Items.BIRCH_CHEST_BOAT, "birch_chest_boat") + .sign(Items.BIRCH_SIGN, "birch_sign") + .hangingSign(Items.BIRCH_HANGING_SIGN, "birch_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "jungle") @@ -113,6 +120,8 @@ private static List getDefaultEntries() { .stairs(Items.JUNGLE_STAIRS, "jungle_stairs") .boat(Items.JUNGLE_BOAT, "jungle_boat") .chestBoat(Items.JUNGLE_CHEST_BOAT, "jungle_chest_boat") + .sign(Items.JUNGLE_SIGN, "jungle_sign") + .hangingSign(Items.JUNGLE_HANGING_SIGN, "jungle_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "acacia") @@ -129,6 +138,8 @@ private static List getDefaultEntries() { .stairs(Items.ACACIA_STAIRS, "acacia_stairs") .boat(Items.ACACIA_BOAT, "acacia_boat") .chestBoat(Items.ACACIA_CHEST_BOAT, "acacia_chest_boat") + .sign(Items.ACACIA_SIGN, "acacia_sign") + .hangingSign(Items.ACACIA_HANGING_SIGN, "acacia_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "dark_oak") @@ -145,6 +156,8 @@ private static List getDefaultEntries() { .stairs(Items.DARK_OAK_STAIRS, "dark_oak_stairs") .boat(Items.DARK_OAK_BOAT, "dark_oak_boat") .chestBoat(Items.DARK_OAK_CHEST_BOAT, "dark_oak_chest_boat") + .sign(Items.DARK_OAK_SIGN, "dark_oak_sign") + .hangingSign(Items.DARK_OAK_HANGING_SIGN, "dark_oak_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "bamboo") @@ -160,6 +173,8 @@ private static List getDefaultEntries() { .stairs(Items.BAMBOO_STAIRS, "bamboo_stairs") .boat(Items.BAMBOO_RAFT, "bamboo_raft") .chestBoat(Items.BAMBOO_CHEST_RAFT, "bamboo_chest_raft") + .sign(Items.BAMBOO_SIGN, "bamboo_sign") + .hangingSign(Items.BAMBOO_HANGING_SIGN, "bamboo_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "cherry") @@ -176,6 +191,8 @@ private static List getDefaultEntries() { .stairs(Items.CHERRY_STAIRS, "cherry_stairs") .boat(Items.CHERRY_BOAT, "cherry_boat") .chestBoat(Items.CHERRY_CHEST_BOAT, "cherry_chest_boat") + .sign(Items.CHERRY_SIGN, "cherry_sign") + .hangingSign(Items.CHERRY_HANGING_SIGN, "cherry_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "mangrove") @@ -192,6 +209,8 @@ private static List getDefaultEntries() { .stairs(Items.MANGROVE_STAIRS, "mangrove_stairs") .boat(Items.MANGROVE_BOAT, "mangrove_boat") .chestBoat(Items.MANGROVE_CHEST_BOAT, "mangrove_chest_boat") + .sign(Items.MANGROVE_SIGN, "mangrove_sign") + .hangingSign(Items.MANGROVE_HANGING_SIGN, "mangrove_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "crimson") @@ -207,6 +226,8 @@ private static List getDefaultEntries() { .fence(Items.CRIMSON_FENCE, "crimson_fence") .fenceGate(Items.CRIMSON_FENCE_GATE, "crimson_fence_gate") .stairs(Items.CRIMSON_STAIRS, "crimson_stairs") + .sign(Items.CRIMSON_SIGN, "crimson_sign") + .hangingSign(Items.CRIMSON_HANGING_SIGN, "crimson_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(mcModId, "warped") @@ -222,6 +243,8 @@ private static List getDefaultEntries() { .fence(Items.WARPED_FENCE, "warped_fence") .fenceGate(Items.WARPED_FENCE_GATE, "warped_fence_gate") .stairs(Items.WARPED_STAIRS, "warped_stairs") + .sign(Items.WARPED_SIGN, "warped_sign") + .hangingSign(Items.WARPED_HANGING_SIGN, "warped_hanging_sign") .registerAllUnificationInfo() .build(), new WoodTypeEntry.Builder(GTCEu.MOD_ID, "rubber") @@ -231,12 +254,15 @@ private static List getDefaultEntries() { .wood(GTBlocks.RUBBER_WOOD.asItem()) .strippedWood(GTBlocks.STRIPPED_RUBBER_WOOD.asItem()) .door(GTBlocks.RUBBER_DOOR.asItem(), null) - .trapdoor(GTBlocks.RUBBER_TRAPDOOR.asItem(), null) + .trapdoor(GTBlocks.RUBBER_TRAPDOOR.asItem(), "rubber_trapdoor") .slab(GTBlocks.RUBBER_SLAB.asItem(), null).addSlabRecipe() .fence(GTBlocks.RUBBER_FENCE.asItem(), null) .fenceGate(GTBlocks.RUBBER_FENCE_GATE.asItem(), null) .stairs(GTBlocks.RUBBER_STAIRS.asItem(), null).addStairsRecipe() - // .boat(GTItems.RUBBER_BOAT.asItem(), null) // TODO someone forgot boat textures. + .boat(GTItems.RUBBER_BOAT.asItem(), null) + .chestBoat(GTItems.RUBBER_CHEST_BOAT.asItem(), null) + .sign(GTBlocks.RUBBER_SIGN.asItem(), null) + .hangingSign(GTBlocks.RUBBER_HANGING_SIGN.asItem(), null) .generateLogToPlankRecipe(false) // rubber log does not have a tag .registerAllTags() .registerAllUnificationInfo() @@ -249,10 +275,12 @@ private static List getDefaultEntries() { .fence(GTBlocks.TREATED_WOOD_FENCE.asItem(), null) .fenceGate(GTBlocks.TREATED_WOOD_FENCE_GATE.asItem(), null) .stairs(GTBlocks.TREATED_WOOD_STAIRS.asItem(), null).addStairsRecipe() - // .boat(GTItems.TREATED_WOOD_BOAT.asItem(), null) // TODO someone forgot boat textures. + .boat(GTItems.TREATED_WOOD_BOAT.asItem(), null) + .chestBoat(GTItems.TREATED_WOOD_CHEST_BOAT.asItem(), null) + .sign(GTBlocks.TREATED_WOOD_SIGN.asItem(), null) + .hangingSign(GTBlocks.TREATED_WOOD_HANGING_SIGN.asItem(), null) .material(TreatedWood) - .generateLogToPlankRecipe(false) - .registerAllUnificationInfo() + .registerUnificationInfo(false, true, true, true, true, true, true, true) .build()); } return DEFAULT_ENTRIES; @@ -458,6 +486,102 @@ public static void registerWoodTypeRecipe(Consumer provider, @No } } + // sign + if (entry.sign != null && entry.slab != null) { + final boolean hasSignRecipe = entry.signRecipeName != null; + String recipeName = hasSignRecipe ? entry.signRecipeName : name + "_sign"; + if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_iron", new ItemStack(entry.sign), + "LLL", "rPr", "sSd", + 'P', entry.planks, + 'r', new UnificationEntry(screw, Iron), + 'L', entry.slab, + 'S', entry.getStick()); + + // plank -> sign assembling + ASSEMBLER_RECIPES.recipeBuilder(recipeName + "_iron") + .circuitMeta(4) + .inputItems(new ItemStack(entry.slab, 1)) + .inputItems(entry.getStick(), 1) + .inputFluids(Iron.getFluid(GTValues.L / 9)) + .outputItems(entry.sign, 3) + .duration(200).EUt(4).save(provider); + + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_steel", new ItemStack(entry.sign, 2), + "LLL", "rPr", "sSd", + 'P', entry.planks, + 'r', new UnificationEntry(screw, Steel), + 'L', entry.slab, + 'S', entry.getStick()); + + // plank -> sign assembling + ASSEMBLER_RECIPES.recipeBuilder(recipeName + "_steel") + .circuitMeta(4) + .inputItems(new ItemStack(entry.slab, 1)) + .inputItems(entry.getStick(), 1) + .inputFluids(Steel.getFluid(GTValues.L / 9)) + .outputItems(entry.sign, 5) + .duration(200).EUt(4).save(provider); + } else { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName, new ItemStack(entry.sign, 3), + "PPP", "PPP", " s ", + 'P', entry.planks, + 's', entry.getStick()); + } + + if (entry.hangingSign != null) { + final boolean hasHangingSignRecipe = entry.hangingSignRecipeName != null; + String recipeNameHanging = hasHangingSignRecipe ? entry.hangingSignRecipeName : name + "_hanging_sign"; + ASSEMBLER_RECIPES.recipeBuilder(recipeNameHanging) + .inputItems(entry.sign) + .inputItems(ring, Iron, 2) + .inputItems(Items.CHAIN, 2) + .circuitMeta(5) + .duration(150) + .EUt(4) + .save(provider); + } + } + + // trapdoor + if (entry.trapdoor != null) { + final boolean hasTrapdoorRecipe = entry.trapdoorRecipeName != null; + String recipeName = hasTrapdoorRecipe ? entry.trapdoorRecipeName : name + "_trapdoor"; + if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_iron", new ItemStack(entry.trapdoor), + "bPS", "PdP", "SPb", + 'P', entry.planks, + 'b', new UnificationEntry(bolt, Iron), + 'S', entry.getStick()); + + // plank -> trapdoor assembling + ASSEMBLER_RECIPES.recipeBuilder(recipeName + "_iron") + .circuitMeta(3) + .inputItems(new ItemStack(entry.planks, 2)) + .inputFluids(Iron.getFluid(GTValues.L / 9)) + .outputItems(entry.trapdoor) + .duration(200).EUt(4).save(provider); + + VanillaRecipeHelper.addShapedRecipe(provider, recipeName + "_steel", new ItemStack(entry.trapdoor, 2), + "bPS", "PdP", "SPb", + 'P', entry.planks, + 'b', new UnificationEntry(bolt, Steel), + 'S', entry.getStick()); + + // plank -> trapdoor assembling + ASSEMBLER_RECIPES.recipeBuilder(recipeName + "_steel") + .circuitMeta(3) + .inputItems(new ItemStack(entry.planks, 2)) + .inputFluids(Steel.getFluid(GTValues.L / 9)) + .outputItems(entry.trapdoor, 2) + .duration(200).EUt(4).save(provider); + } else { + VanillaRecipeHelper.addShapedRecipe(provider, recipeName, new ItemStack(entry.trapdoor, 2), + "PPP", "PPP", + 'P', entry.planks); + } + } + // stairs if (entry.stairs != null) { final boolean hasStairRecipe = entry.stairsRecipeName != null; @@ -592,29 +716,24 @@ public static void registerWoodTypeRecipe(Consumer provider, @No // chest boat if (entry.chestBoat != null) { final boolean hasChestBoatRecipe = entry.chestBoatRecipeName != null; + String recipeName = hasChestBoatRecipe ? entry.chestBoatRecipeName : name + "_chest_boat"; if (ConfigHolder.INSTANCE.recipes.hardWoodRecipes) { - if (entry.boat != null) { - - VanillaRecipeHelper.addShapedRecipe(provider, - hasChestBoatRecipe ? entry.chestBoatRecipeName : name + "_chest_boat", - new ItemStack(entry.chestBoat), - " B ", "SCS", " w ", - 'B', entry.boat, - 'S', new UnificationEntry(bolt, Wood), - 'C', Tags.Items.CHESTS_WOODEN); - } + VanillaRecipeHelper.addShapedRecipe(provider, recipeName, + new ItemStack(entry.chestBoat), + " B ", "SCS", " w ", + 'B', entry.boat, + 'S', new UnificationEntry(bolt, Wood), + 'C', Tags.Items.CHESTS_WOODEN); } else { - if (!hasChestBoatRecipe) { - VanillaRecipeHelper.addShapelessRecipe(provider, name + "_chest_boat", - new ItemStack(entry.chestBoat), - entry.boat, Tags.Items.CHESTS); - } + VanillaRecipeHelper.addShapelessRecipe(provider, recipeName, + new ItemStack(entry.chestBoat), + entry.boat, Tags.Items.CHESTS_WOODEN); } - // plank -> boat assembling + // boat -> chest boat assembling ASSEMBLER_RECIPES.recipeBuilder(name + "_chest_boat") .inputItems(new ItemStack(entry.boat)) - .inputItems(Tags.Items.CHESTS) + .inputItems(Tags.Items.CHESTS_WOODEN) .outputItems(entry.chestBoat) .circuitMeta(16) .duration(100).EUt(4).save(provider); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 6131827e9f..e416b85be7 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -20,6 +20,8 @@ public net.minecraft.world.entity.item.ItemEntity f_31986_ # pickupDelay public net.minecraft.server.network.ServerGamePacketListenerImpl f_9737_ # aboveGroundTickCount public net.minecraft.world.entity.Entity m_20115_(IZ)V # setSharedFlag +public net.minecraft.world.entity.vehicle.Boat f_38285_ # DATA_ID_TYPE + # for AE2 to be able to load (idk why but it needs these?) public net.minecraft.world.level.block.Blocks m_50774_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # always public net.minecraft.world.level.block.Blocks m_50805_(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z # never diff --git a/src/main/resources/assets/gtceu/textures/entity/boat/rubber_boat.png b/src/main/resources/assets/gtceu/textures/entity/boat/rubber_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..97e9a65ef9b698e1e31ddb87af050cd72e5a666e GIT binary patch literal 2872 zcmV-83&-?{P)PbXFRCt{2TuqPL#um{ zIkf08K$C0Fximkc{RKU@J@?Q<(H@#pKMn`NP$NS@7{@2>1pU*#e zF9U#I{N`_K>wo&uqii(jB2Jc=U!?f;AO5w`7&irNd2xT(cPh*;Qp75s+%W7S3W3gH zP~7AHo3>fk4uI1ZfKy-g;Tz9x!@jqTLDU0Kx^Heg3<2Pza=zR&cglIJ|L^tth!qg4@||Sg zv)gcI%0--Cq&WL#YP37(1UTpfmE-x!%YLI$3Gh6@2k+h~w(6h%c~+{b)61)A@t~an z2zI7rc8NA%?)*X2!$PGv3ImMVu4+p!TdN0l%O~*+qd|A0`sb4bKrRFaouIJaVVJi+ z9=f}VzspyC9;Z$lUB8Eu@eEi!i zwaUp)FI!lwb{WeSDlI01eOA>6Ox4WAA4Rz!PU0EH&lAUoSg6!%N}>=r8P5Q~Tc2g; z@%l+&KbvAS=w4ZC+!V9{y~u#xHC(7sqy=IU=MxhvJ;|~@gu`*!`lBeo={VWi1m@3@iT~?`_Hv$LInN!aUcZk)6d-74IG-dK4Y~;02LQ6w zUm)rpV6(y8yIv_R96$cxQ3hypBuyDZ#Dz)`v=2(n(@jTPs^0TB#nb;j1CTEWRj|)) z%6OY~&c2xz)A9vo!oi^^$uTH-$>OGxKi@JpEEXw}An!07a`amw|fN7ed zP=}uq!&}{=4iGs0%uyI1z0Ci=s_D21XagwhZWIEe`?n3dKEFuOiTZ|zOBHQOe9z+- zXmbE)?|*Rbc3~c*O1|?(--+#qx4MXx9;GTTAj|ELmVHpr<>Hrl@5_0LF#tTze_x&_ zafKjgXILox+v)@(3drqdT3mA>rL!g%eG<=%Nd{1uf%LM4sH@EfO$ws|s%_bpA)I#N z(!zfL%tfc)B87uyV4>0?HkT$vt7&t=*@smBgwzP9<0-y-@3wJ27ouRNxrSZBi2}48 zN1@te8ITo=$dE7U9vJq0q0Ak56z29_*U>+qa~KpmOxkhoPFcqCqcFhnFfSXxwC~g$ zfEJ`EbbSEE?i|Or_%?>Oy3X#OU!*HRuc;F#FSyg#unVc)VnwE;bRsR5Kq3Ui@UQlz!n&X+i%5F8H!oQ&5`mYw5}VE&|TFv7rC z0cXMqWKza<=6H`8HbYG+-R{e0-+J54rc?C#ePb~J7)~IaN!ux#K|6W2%XKCWgJfT_ zPdcER9Q14gYBpeZ=MB4r69zthc-PqN0MLp0hHBQ1-D>yW>S7S}oJ?SP*>hB8dfCE+ z!e)8t@4R)-*zG{BcD;_Ba1QC%$xNUxEMvxS6Lr5Sj>5puT6IGa21*Z>2OP9*wE62C zJN_?)q|8)AArOf$kT{R?WX&LQ1+L1mJ01pxiIT}6+f-~5eC{||)=~(JFc5(8Ak6Or z(jIHSz;^7U-(c^+A_R|27YU=ty!->W0=2 zpWM%AXKg1&#@O3{FHzDt3>=3|W)rso?s&QIbV3>8{^#oi$3xd=0jf_xX&M1-uCCh0 z$#{mh-^@42m(TLK*p$8WvS^VK_UT8DieGnCf`cSQ@Bv;HoPbtqH}mkbpL{Q~GoFBc zcHilx)P$o*n>$+w0RJhfuU~0mkHX;E1)wki^xn@WiC0qBfo-;_UU!LK{q7&76a4un z?`1*z;7Xi83Pb^n}))6KJZgoQ5@6-DE~k9-IJXb`Z#Yg+WnAt5p(8WK_U@7&XWULaNVEgrcvT zjM{So<%M1x*Z$epw#O^4%kKI5)k5H!j#uSX?-eIdI&DnvYTA^3AfDO#z&5@*W`AzK zRsGcgwdVxB`(OwF#X}s0ZaOtj%D6;LNxICPAfMOkp750sJ7tRbRVG&UiW3+oO8_X2 zP;E8FYo!uQJiF39&#&sE?Alje7j;^DP9Vdf&pv*V0p(7Ougn+!k6$u*wCnhvXgGm6 z3MWuL+*R@b+m8Qtz3>t?Cva>XZS#=qwdMqtUc@8(G@aNN_eK9VjIVxDo(KY6VS zJU!&8-*v0d)A6)Yb19V|Mjq944*hlN&I$aEuh93_k1r7>LUl0Jd&pl5!O7G<^c0gOC=k}@ zJU|^M%tqZgfdwCcc>o(Pdf2h9-L`lGo8nJ@JvDZ`{4~zXfKe1TQq?i@O@xyNuvsqh z9`Bcx+2v(nWzf!Q!y8zK+H(T!Jb>f?*k}E`&uakQG70;(72YT4*MZiLe(*2@%Fp}P@c>?gxw}cbU5pC=zyIRjwQ$n5<)p4d`|USL1~sKs ztL(tLQ^^q^ci;ZJ8~{&W4FB9+Pv{-u<|8y^4A$%3`u@7>1|}-`0KWKrll*`$&fkPL zV2|bd4IG!;gcs!=G{~{Hd4QXaYcm1-M}~dA<4&MD2jHWSSLGI7mpnk-(favMzh5b8 ze6R1Sc+qx*e4k*O?Y5l<*cGl#14urA{7NVQC!QzDGGDTs`2%^6u+PqIXAv;t`6@E0 z-M`H(XdJ(4ID7!AABF8@Qux~1}-+@1C(7e53mW(UtV7&58&&^9(NNCLIXcq*X3@q7(sxq9t zdLQNQ=?Ex){%duZQmArv~jnTl=EYP_AtGGK?W+&q|%OGyx3^+hhtxuJd;L+Q+iO|YR zv6cJL>!^bINQ~5nlba@JWg;5RP-+30g!dj?Zy+BWC@4J;- zHkl{3D7Deml`wM6mtv4lL^pSA9XCu@UlWb|cZc2y>2zm1lp4Y}MfK3osM*90&86BQ zCMDAAmz^si1692Te_-rZDmSw;lFR%eeWgd*oatu8nzmK zo~E_mJjw#Wf26UvZ3p3B2O&Lt>|sfek*I2=d`~5x8IPDUKRC8d%4d>};|7&3x%z2` z*Zmi>iuilUb3v`evZTj4B-Po|x&(e+LZ2DC%KZD2s2qOY_`<8rBa=#3=w=?wFyrZs zUmGdpdUR}vecr=5wsL`nLi!)Na|^R+!JEC-{mcm(sE8k00pVdMs{_CcZk$tQUWFW* z?^YBM#@9mlsUmRlS}8x2%o8~0nWG(gXe{%4dCyw`ZYMt?3`IYr@!+iF(SpNIA^P|hP-N*#iyO`CbC!})CGPnoQz5&R ze)3x?P!1_P`-`aR$qRcN!IytvYto3SgcJnr;t^4fP=Vl-Jv`*@t&KeB?1NFITCO}v z!Px<*tZx`E$EPRPg&fPgUmgE`nOl_Z9=Ah!hT6X%C8km2e5P&Il=-mixY2dhBme#T zG~%MyI>4##t!e|uxjbr1@!2(e_ozB=76BvQ(qFWcNJEt5eLo)XienmzFwP+cPY&?` zRW>`1pB;#5hqdMSOpRCTwUH_Bc+%ns^+3^dY6~-AYrxC*r-UhAI`o^*eCSLbwV|I6 z!aiK=!)xhWvIR0%lSs>uFI6zwknGF3C*D!Mm?{t{yfdw#jjWqRv5MoexUP?tZ)P2( zsbWg;M_JO~y|&Q8HQY7JO&f-Hji9X>6tJ)?_^V zU{_@{G+4U!y^h~paB6G86ZX6 zx+-W3j_?|X`g()nc*M!it@P)63>nzmJF?_#bbY$dqf#iaFIA0_?fR6%k6i_GJOr(E zz=KaMO$#AEn}*ke3r`NP)QnTyBIP(&c>Z0^3PXl}Z35SaE6>C3$P59ESV8=E*64cd zL5}$b@k0l@L-9PkvXrs2KGa@a;IVe+Y2C+(cjv7UCAI`cl&pPH?AI4X zq^><(Vfcc(c_V)xSi$q1b>I591I0`$f!^ml=lxx0?1LTQR;!Ptu62@}727?YIJr>_2by2dL7- z4Gb(b^64DEGEJa<8eW#)qq=`Or;T>?O7b^gPwSIS=fqS1ojV4YC<~u4zT3rFzDhkL zZ)53n)QKDJKfYCzs7A50VgQPVW_@bU#k>%@qfw3GT*%C4h`0;w$z23=45oM79b!2q zGTx0!XRPgke-T^X=6sn$oG(q>vkaDHkl+~1x$pkUR=s#yym{kkcJpOl)`w04G@vEF zgF@MG)?1YaK`c6RpY>~hXA-9!v<6|&NEC)4@0ShO_>6vHlg2MNsJr-lw5vWyY$n94 zWC&rcjp;iDyVMm6e(A*g!fk;rMVaf2!8=T@?X!fQCv7~e?Bvo7Gc_JT3`RVUCTIXM zqaS(9oZ6B_8f9u%<<+A0rX~D%a3>J>>l?@}@ykVnJzD^$L~3qX^S_A_YVB(27#RoK zcJQKk`Rha$4@#ka3j*0^e0tS|p^ulJz*s&~f|wXP!b{obS}eQAb~1W)9ptx&2zC(> zsSvcl_g}*2Q~vhAN!)J=R{CeN#kAI6sFJxw$gDNrKpn%!GJGo+UdLdwCx^EH zM9@*Sd!$b5)c+fDVTlZ!)yL2c_8-KwkNmx8My99m>DCq|jtQrwY}`*bHar(@(NT+N zN?)emCAOU?{G*ezD!V0}x$OGLhIi5EGjvcvm2y`5Xm>w|n_t{K7BzjyrHm$$HbRMe zBcTNm!7}sp>~S@M!@-Hug-0oR_ssX36iOrB^Telp2ld|zcL=+o8HJe#MHc*~=rljn zF2?P%H^NKP?DOZi8?EEn(;lHPIKxoN*`7QG$P?IWOGI;Uugx%}eu$sB%`GVQREiri z3^1{|0~g}tanbshb$VX1lq}r@-$XwLc6%UjgWsgZfjZk3G?fzGel%sl8|d3r-2fUKksqYm)wS4A1xb(P6t!}wr@tu@HA$u+=f56?F~wGdl;7yn zR8#9&9Z2;L2%rP12=be4U===n-lo~Mu8+(>Xh1;p`GP&|3}{JT;pg}vzyql8^}PsC zw1a!jY|8?-6?G<~#?d7|denbeID=6@=<&AAx9-RsXU>MGF3UFnph<{RsB6a*!CMfU zDRPV~Z{SWmLmS=!Oy@XXk#^ekojMQ3G)&d(D_)k_%hKD=CmDv-f^U)!3{gN^yu=6^P1xy%r3`KU2=lAbS*Sb*!AmY&$aErmY zXlJ;q-;jBhkRN;Ov-aNa4evmnZER(B$ks8<55`n(c&h$3X`9Yz9_L3F`&}?TR*qGi zofT%Fn7_=_wUx8dQX6*Byh?V&aIsAinUuYNRgkp>t?eH90w1@sm0%O0$>CCI**s4 z`k@63GH@U%w-fX-=DJxc?p^goUf86J=C^vIjYB@5<69<(^n zXTtk*prC6}<<6UTmA3YK3M(#z zBwG^+CI9`^N%@c8(p|?>Om%vOnop|v{z2q^i^#i>t&=|4n8_q~rq*_n)BIn4c30`0 z(xYq^(uZk*MeV(xoMN5hbNu?`GoA}@9Xm-(cCB{DxT8uQ=)huOMQke{sJoloh%g@D zKj8VFzhVNoHj7QxbH5_Y9hP0>g6#*)A44S>R{7tBbSSeDgcS>=6zkX>I_>Lwl4Ak8 ze_5B#D?xtq(1XnZGh~F#dE%h79m{vsi@T{*XMpEMB~;^JSh8Hn!X?)@6 zSxu${Z-4) zL_C5arzx!SH0H~X&HXBkKx5u(Sm#qd3J-{rFHlIbUwA#RPQktErvx>Z!j<+8LHQLLM9lV6LHdD=X+s{ ztv(Gj0{f*4W7=-7r77!|txtJ6Cc!Vz#ZtyJ{(z{Wx=Nj1a4b>w5q%xBF@S z4oX}IrNG!{W@L5a&p)4pOX1nWH+A19Sh9U z#Ga&H;BKLi;MwYGE`BINlaclC3{)y08+}~@l)}!tAhaGO>)}* z($2drDkQV6G^;wCHq40p4|1i)vEbf|<3aSYN+Z@*(yVVIwcZvB`pxhocOO{@%Cr_VlH4I-55;sik$RSk*cU+52-H3L zzigX%?EpA!0XX$}AHMPIHq`gB(P>2ha`(;J!w>+PRGO@)5zHnr!3b~`k}m+i&TC`W zvjsu_?;p?CN6~opd#wW9;dmwl)kOWHvsQX`*j5wEcgodJ|KHqeqc4HJ%->1&J-ZF< zOumTYX@X}jZj5$87$69P!ts3NdCxeNF))hp`1sputA6#(|8iBeyj@I-i=7mJSecet zCF+2=^E<5wv6Kjfz{!rQ+T?9*_QGy?cR0q$!EUMg&tFaeWI_;xfwJEX5dr|t58Yiw z&*dw>8YWH~T|dG_Z;XZrF_kfrczFvIH3B?;Ia!&8SvBf_t1?3&5KDvf|G+?h@AjHI{ORk z?FKlRHKv_SyR6fSX6k-^{k{Z718w_*Fi^sC(HrCZFj5m53IQl*D^v3{CPe_Jt)O&$ zK!Jn^ck@xp>;FkI71DT)$rfJ$2 zI{f4~YKE!~ARK=t6aw-#`+rf>u@0yMP!K-hqTlO2|8c=Jnub;6I=tpD0{vvPvQ!J z*hvvf{cKf&5d~y+Gf~&Hklb10i{2fMjY$Te%z(VDVQ*KP4>Bnf6_DEIZ7GD)PF$k= z2f$o(@>{rYkQs=jRIxcXDOydN3r>A-^-tg$;j(vw9~^g#`)6|}u1N$(ELWDWphSNElMp6tn| zv3$FRvWz>CHghCivt7=eTAopPDfP-us+5CBq9sSRRB+pdr z3t*pxfrP7JmaOTtT!AZc?9LB`VWN04$Tk(r1iklQQeh{Md*l2?D8CPId#wEe+p*(* zgS`V)2-u1Mqt67_v&FgSjg5??UO;_NMbBY7cHD2!*S-*NxkA7NzKT#zAm5>UQpvd~ zXpGY>!i(Mif3Tf;;_?`As(!OtG( zzAXfR{}k2NFE_EF5O*#B$^?-2{`}>{E2;B9ZI-ECSBc;J@hW$MKmX*tRO|!`aRNy= zDi;RwQ!$+Z%-(?{n+pU#_vVsM_ntgD2Jde$NsMTMx3$Nm>sU&B_VL4XR=(B~T6s>O zsk#LEGE1)lIwQyrP5?7I2xPuON7d14l?Wv~DxiKSYTywBSD&XXsJ_-2mFEQV3%xk5 z{j;xakC$KP-ShRUg~0VV-;`IqQJg^Tv{8Cj)28$bQM%R#YU8V8_UHCn)L#`)c~0OD zzw-_NsFw(Zn@-J=GA>b*lP)tS$mjLCCwzItPM%_>I$z+$GT*lpHi{ECnDA^_;;1pY zp2`?q&#tu3^Nae(yY`h=MV(fj6G-9EXCFUIfqbXNSLTcVuV2$_uR8uGY&n4$loQBb zZjn5|vg7|%FFc3M3A`SeX<|Agd#gEtd3gX|PJmw%s4g8NQ$0>9@#PVCf3cK`RrHsC zf4!PFwLs%u_Vkf-o)FU+2ZgzB6(^7ugwC`n4`6@H!55y&`x1y|N516zQ9X*~^V;&$ zLpt@lYZZFgyD8LMQyHU=EUJkb{yJ6X1b)j`==tE+i}{@i*|{$Q05J1LHu z^ADT2PvAS~8BY^cR!JYg$OA|ogZpv-?njpt|Jx^ri^TtLD(*iy*v0iIpBrF*r zRh1Ly%>&pT?M2T#{n9YwfAhZkod96Q`@AmQyDOAA=qUpt#Q@a_T{&{|0Q_a9GRAlc zr<_1-^X}*60jfA*Hmc4ERD1x+1K4=g!;X3Fmc<(=i$DKkWbAnU(>SjKilS&E6&*9L zBb+>d&2r)Q=zdwIE)@`n2c_E|r{rhRknKwkop#U~)= zk3J>0c?P`yjOQd6&ZpG|L!~rF0)}k`t&*0CCd*s2_Zw zG9Ue#>Tn_l?*q_I9#b^!Q0ssb(_J=zd0OCGX5U-TkHsi3mxYK zQf5%z)?VqCRl38B3hxv2yFl$H-@BIr`RD!fcmS`$+%3~?72^WH7f)YQ!bw|}lR6Le z_m7ASYD%kC*@1Vb5=Vfz`}WVv0r2!i-{ZTxo}hP#n~%_xF<75_>-+Prw=hx22k^!3 zW%2{QIKK>Uz#hx@3^Xor6JC{jutkQA%>%4E?#u+xKRoR79d`o7IRGDpyePNuw&Ve- zj@mDO_T55Jqwo3_#jCa>@b3wh*>2f+fK}nnGyvxV@Lvf9;KcKUyv!Fbr~CoGN3hS% zZD$cMosolTLE!aAK#c=ol+*`MQCI)ah{=T-pIy`pwmGL${jzFHk@%u&J;N|tP z>DcB0))a3v4`83w=f&5=6PRZX_;ud*18&=VJ^|$)d_P3t8=K0ua8Zg6kataafHFLP ze!WN@z}JsGZW#{37Jk(3O4V$!p74@Fx7ZwP1z^Lm6@U%LRsc2}TLIW`Yz1J$u@!&~ v$5sF~99sd{aBKx&!?6{B4aZghHXQ#4T$l*>l?l7A00000NkvXXu0mjfwl#9M literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/entity/boat/treated_chest_boat.png b/src/main/resources/assets/gtceu/textures/entity/boat/treated_chest_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a00cba8f4ee1cb9de440006eee3b68de0d6d3f GIT binary patch literal 4714 zcmc&&cQhMrxQCZ}u znOLRv3PG;lz4zR6|G59(Kc4qF-+ABXJ>Pl0bZco7Exz|5_uscs%tv{gKsiCu^EgIVsGI=|K~xn&1x z+)59P+u{re#kQ~W+q>Y)w9-H!5kGvmSaf|=WYl6nX%5#Yf0L8VfcfMcXUM6>018y@ zX>9khf=$IdpN;t}7XNM#u3byg9@EX$Y@*rVcf9=7Sn#Ir!Rgm@!al??HL~<1Dmtp> zpAs-MW6|qmVV@(`p(DxWp-!=Co9Y2-9(;Z<+Tzi7x-B<<0O-8<3N5}%LNIPauvV4| z?nmw+5$8Wopo){ScbVa7bu$I? z{ll(1Q0H7>e}7)5Pu0)cLbQ7z_+U)nJz(E><++9a>MsAWeByV_T3{I{a|4*4CaOVD zxCr-fPVaCy?_7=jsvT5KIYfv5cc$ADQ*ktP4Y{M7OKUB!gO7cFx9K!i5I%?T+7xUE zKI~8dfx+pA(nEJ%OmjzkMIM_heDZ2rYX3>obrJs2yo;36FVN=M0me%BvZ{2$u@cfo z98C77c9Yk9u$A66-t0Mcg>#rhxgzfcFPZ7iCPmo!b{gBFXspdc3Zi|}AYc|DWCe?C zL>`ZFe$^~B?)+9Bo|A1+>DBh9Wz_Gzh)~WPJL2<}CNR>(&l=6JikE zM&$It-f-!G{@#~#84lQInuELU`&mV4&3ef|LS_vKOg>mcS)oEUj4DR3*`R;&*N)kf|Sr!nJS02k$wFN0kesZ)w;|GGb zjPGg2YHBw~8D54=x>U`pw$ZFFq*X;aNN{`&$#lSmmQ6jJny$6A*2cVd0g z&2^dZ+9GG`xtq;&(_m{YY$*h66TOg#kNb68=qhboqH}a7)C;y4n*=Skau)=^lV`owf=@TW6MqLGsD`O zv~*-UvvKV4s{oB1=;oB=Gth+i>Cxt9%J0iQ+kz-1)L=U*W(LIQ;Yx4vGI(DHvU6pQ z8=(L4;L+v1$!o2TO55GyAZ!H&X^0qP8uQec0i3mwsKd!YLCeMUUEAW|DJQ4jvq5D??qgQw??^_Q8)^$y9F|bDI6{{VoSKoP@Z*eh(X6psiP0c;$8w>}Ux9L%&W5j?bO|>~j zz%FS0H-i<)wgBNN^o9;egniHRIFUWpoOW_J%ioTaXqxF+2r=VP>Q!LrH~dLinc$i& zRrI2xl+AT0^{?$vA|JiEiuFDJWFKH5_{XQ5(c0|v2dsr`-XhP-7Ml}G>!)k)u=*A` zhqk@YGRTF~rxvCj#Lu3nd!-bsO>$ZJY3>utX7Io6Co6^2E-*R9s?%B{)Le!^qlq~O z)${2tf@nJW>lXVexQyZrx%hq${>4*~*xKEpVnpUlwxdP)hl(#99b zQG@Dts}*x|xRqoh4Y2n>lZ8FU(2`!h0Kt_4F)n22g6+Zgk-p-$7eSq+NKL&DE_b*e z$`*!!vRE4pQS$GYahHcSX&o&UqvUweGAB-c8LQ@uz3Tbpc?M{#a%2-tch{B-o2mU+ zJoE9@O-!}mYxycpKQ)U>UNpWl_~Ps+=+^xVzi0?H%}tpfb%NaZ@C7*EkoXDul#cIf zD*R!Cr_)egi$4{uK}^_A$9>xxxFX%ynsOTkf@{3o25YM>?nL8NMn&M#0pwZ=BWb|) zyBwYtV#9#56FxXXB;NMKQr2-~4oYO(2%|wb2*QnteT}01KG;0h>rnpwVBH9duyOE=;8(7(%5PlR@F>m-Be=m!)N(t%&yHG5 zMR+%KzMYzBR&!dv((IzbAiKIITOvyM?$6C9mIUpaN|P+j1Lw(Wbkh(4v!d>}Jh=F# zP^*-}_KeT5siiBb1niq`((kb~)Kn~?B5eHa-A?3%C@4L|b8Kb|M{;wM!5(Cgs1$^M z=`2##%E>(jEu!!wh!HAPUU=809x1NXWCaJxi!f&80gW@MZi~9QyfM=g@_fe_tU+kRDde8^X6^C1AgFbvW#b-&Lz;Kj<@w!j!_5pkO3KJ>$$5C7&=tRA5~2*} zVuBh46!{^MMcqhcwb}A0^GwSw4NW|0{d75koayz6g^fbn-DGysmUKq*VNtgU1aS1? zOGx31e9aEEvkXPB2;;|eMzM?!Ym|KlfPlZU@RWRhoUW2mjqZa~x!r9$ub_K~3*uG*k~opcjdggHH=vOaZDuqF`Dab{C}xMX!sm9^A7^)D_U!kF+|td`*WvH zHBu&=e+X2(Rx#vHfHGNqA^Jstx*bWo<3V$DS5CNBGg>~GukKVwP2Eo(@3h$N?qq;* zl&TehAu#0;Y2*GA$ff175*^O(Uhe^;2iV}(sk z>3lH``Qe{NEp4H|YG<|e<(j}THprd}rJuxza)zT)G((GH(R+}aWZe!o2pM@oxLQ}qZkrM`}dcJKq?gzq95&jV#&42H^ z2}yfbaO=dE_LfX7Vkyt3vcY_bmNpc8c@U^JXuYo*9XNUY8*BEkPJFJEQ)5KZnlR5= zvXdAupLlfX9dH)gnh}~S*->;$X&^YE(BF1j{RVGO1Q~uGP{prO@{m#T{;=p(5F4f( zpppIiSTyt-fm@9;A@Zs3lEn`SF(o9JgqG{Cg`+TXqJ~(bvQ8ual8X_geGjwyL$DG@k*=7h+%2OFJqpWHR-2LE+cZS054_3v@cTw{vQ|Nixv6``Up}jt zbbVCpZ=G7Ng4aK zT>VvR1&io4Xvy;D6sm7wyNl{s0Zc+y94n_!XE`J^PjX6;MI_V_|4cpVsMD1PupC_@ z5k958V-F*x30c05uATj2f%~;hy|2J_-8nQg->%K~Q%A>jrqd#7%u)MtaQhcU05#xg z+E>N7Q2LB7;x7?Q1Ele;3e-uXV8`Y9P^k_kFb(O>p`)Xt4B3w_FBgazSd(G7#>vo@ zIdx*S`Ew|rEG+!x_bY~kzob0;b$HFTN1cMxw-lEJURYP3JS34n9a9sHsk3vZas!>b zb*86}VZZM{$*{2|L(dJxH8wmY?{1B-&bt+vcWiXhLC9gr7zk)hy&8%nZs$Mqg2A5c_mukYT0uY2TJU(nCe>8? zanB6cQoaS*7a4M4;xbfdXWCNVU2H2+8@9b(JM%HDdg3^}kM5zJDK@-Y>KyRah774e z7Uh}%OWo;VnCbs}WbfNxPaP?3EUAVO<8F+5N8ES!$EgReU#DjY@>?%!%nd+|6!_ik z_r8)+XFUEo{eF$m^*ZEW-?d>z#k+(3Eg+^mN41P*zxQ@74-|(TTy`7-@NE3dBk}iZ zNHvplgvSQg4ZvVdixkyB#?H8E1;t;C%lwLaOp324`bTNhpsQR10S|}k0RV*h8}x<5 zuPRHM-U&>NoZW^Kwd?a;utk9QegcH@C^o?2NvXFKy8zOEIJ+&wNV@;lm9uqt*_Lk*HveIo4 z{JUq@Z$awr2E{eb_J+r61i@rtXesYOv)hedJ%5l8A3XCjHKP3gXwx;`b>FuIF~6$0 zVT))|q#sqDLOg&^X~P;VEIq<_%G9-zGD{U^WmOi+ckJj+ZTd^KRr{x(9r7gcURK?J zi&aU$E2aEj9%``Dv2eE;ZB{&92q5%~zC3(I{Zir2Va!Kv!jLmX{}K9g#d$s6C~x%2 zeN@V7d{*zXB`}kec%a5WT|xn?8Z8KV{M9iXM#TC>t7_1Gwrny>5qQ>YGC@wRm(lCA zD!dKUpa!l)zS7~(k{k5mSdl$G^W6o;8JG|7#gPIXOA}n zYTQw$1=U7!27D*u?#REYrM+r$zEX-J6AU`q|15h~o0k8mGGCwjriQLp)>WQdfqz-3 z_Zuz0W7LTpDr8gh9<`KMXS=>SH8%#|+au-Y?H4esOgB>e(t9ElC4tEGe@c>n@}KLz zqk1tZS|fSAj*2C?xN%-wnxmaVn1vbmHgGsP%d(n(7) z8}RepWHIQ{E*l(GyhQFRj8LP4cp7Yq30)MpK7IF0ng+wV&{u1p!y3@9VQdtblixHi z*ex$6{1Kjk2pm8d8D8X) z$|l-+wg*M`tI+y2Z9uUtbARc!P12&Ui}p;Qs|A a8a`wi?vi0G@9Ogipr>W1*`V?4)qeo+sTg$t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gtceu/textures/item/rubber_boat.png b/src/main/resources/assets/gtceu/textures/item/rubber_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..d2998da345c49c0abc68e24c460d8f962e29e16c GIT binary patch literal 614 zcmV-s0-61ZP)Llg(=rQ5400FEcfhnY1%bhz+Ln!w+mD7|?*$MafR; zvf$FSf0JvMf;$Cwv$8Hqp^GLIv9ZNMLYZkM&15n(ljma0q@l|`c-(g%@0@cv_gx{S zthUT>ze~Y5>@J68Bmm{V+mNG9r%0>>svJUsfLxU5&`jsj?qNIE^R; zItT7d={uWc_FB*nBRLUQC%~&wd;@5k1_1e7Ho0$fsaGtVMwF7O{qUxuZ5nufz`IwA zeE!+N%uk*tM4lgD6r(HN|`+Ruw zAT76C%(7gvSuWXp**!~13WmUGbO|ncs7lg6vAT3m)~f|Z z*(_i4pv!_5i?PtB{{Y~;7xDU`mFC-3i`rT)t)yJc;tht>D;B+>BJbv7#EZ%brzaix z{_REzEG{Hw9ku<`+?~xb-e8CuND79))-{|)myD2trA1SG`qrH3`2>92kpve#zU-c1 z>ly_^;0DwA$&BJLe>;9k;tdja-9YlyY0+%{LDw~5WQJlw^0=7e*Lj$jxUo{AdD5n6 zXcTM%*PGJM&uilHa+s0)+jEP)LG#9%OS*Te2WSjJb4Do(o%Kq#aL*YyI3@Wm_HI;lQ|aCDF}yGqIN7>&n+{M84INJvm?w0a=Q!oAx7 ztZ$j!zM_MHyPvOQ>$F_SKz{_+^@7UBIJ2u1D-}wP$J%C%wapqO z$76lV#4?IxZua*KQK>ar0PL3|0R-U1n-)*9!$EbqIXw`WmW}7uI{?$NdA2lz)BG7g z{C3vg?U75z(PBe<{2uCYuG`HH0AROdv6ShBsEW<BKt1~w-!B{H6#`X~-$p~h> z1F1Gc^2&gVc#t0F$6;AMeKZ|_l7pQJc1soj`OgNAAC6$wn;5o4j|vi+N`9w;BBWq+ z__BEUw$L*qU%XeA*e6vswvR|?Dtc64*xeOT&RmaT*$NLlRa<_M8H8yXe~CO_>hDBcT(Ir|IBnVhn5Ln&K)nqkft%YwMI`|5{a0AtTFqxt0L+3l?S>sW6rL|JXTkcP!m%$oJFfEn%MHbBm zO}D^Be?d8C=vM*WeY&RIu=#NtI^2O^v5d8F<=yf2Wlh^XtfZ(r7Inwsyf@JhH!J84 zrfdK+@kfo*yTCVWs3O6fotTf%hl!Q=%s)_i}o9uNS ziNAV^4RGF@;8*tSYx&=Odn{qi^MnQ=@FbCDyI_-~w uu$^3NoVK~?|31n7I!J*DD!#=-$N4vqoX0pCw-fsS0000`p#+r~IOw>VTWT}p_ zl4zV5{R14_9Y_pu=;}y9NQ{evOW6nsxHOW6QjgNYwe)A&>+5j6YtICIk~jCf?|aYZ zd7kgx1Gm`fN>Z+_B;{@QwyC3=hfzOMbMq2leW^P*P0D;OCr01XZ%oH`F6?aUOIJP2yt;Y9K_fQA6+cxvOc8|0V0^`uvPqtK)(w ziK%e_cJ{A^eFZ{JcH7@bHJO^5Cp6*3H2aP=if>Gn)k=Z2)Z z>QR_(yXZjdc0PP7l3vs>uG{Q>KX+wrGzS#`9O_k`#@vtxi2$!(B*!o6uP zrKSZj+8%i)Xd-5Ug5Py1-=u~j&4#QB4)rPk`$r8nQxQtdHhNtW4+^4wAA83Jijabs ziujzZxJ0spf9jGRkjYkv`hCQM0=+&Q5i#w9%QnPRxac8YE(KVQhxwW_IQZ4Hg%Tm4 z4svr)=~1ag{;~s;BV!V@9@1XpxNXJ@D#+0#r2Oy1{?q;dq4e|MoILkd00000NkvXX Hu0mjfpphNC literal 0 HcmV?d00001 From 228ebabaa92250ee9597654ec30dc56893f688fc Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Thu, 19 Sep 2024 03:21:33 -0400 Subject: [PATCH 09/15] Fixed filtering on auto-transfer (#1982) --- .../java/com/gregtechceu/gtceu/api/machine/MetaMachine.java | 4 ++-- .../gtceu/api/machine/trait/NotifiableFluidTank.java | 6 ++++-- .../gtceu/api/machine/trait/NotifiableItemStackHandler.java | 6 ++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 85af6710fe..abdf3fbd3e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -645,7 +645,7 @@ public boolean canConnectRedstone(Direction side) { // ****** Capability ********// ////////////////////////////////////// - protected Predicate getItemCapFilter(@Nullable Direction side) { + public Predicate getItemCapFilter(@Nullable Direction side) { if (side != null) { var cover = getCoverContainer().getCoverAtSide(side); if (cover instanceof ItemFilterCover filterCover) { @@ -655,7 +655,7 @@ protected Predicate getItemCapFilter(@Nullable Direction side) { return item -> true; } - protected Predicate getFluidCapFilter(@Nullable Direction side) { + public Predicate getFluidCapFilter(@Nullable Direction side) { if (side != null) { var cover = getCoverContainer().getCoverAtSide(side); if (cover instanceof FluidFilterCover filterCover) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 9a0886a267..d94952c8d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -267,7 +267,8 @@ public void exportToNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); var pos = getMachine().getPos(); for (Direction facing : facings) { - FluidTransferHelper.exportToTarget(this, Integer.MAX_VALUE, f -> true, level, pos.relative(facing), + FluidTransferHelper.exportToTarget(this, Integer.MAX_VALUE, getMachine().getFluidCapFilter(facing), level, + pos.relative(facing), facing.getOpposite()); } } @@ -276,7 +277,8 @@ public void importFromNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); var pos = getMachine().getPos(); for (Direction facing : facings) { - FluidTransferHelper.importToTarget(this, Integer.MAX_VALUE, f -> true, level, pos.relative(facing), + FluidTransferHelper.importToTarget(this, Integer.MAX_VALUE, getMachine().getFluidCapFilter(facing), level, + pos.relative(facing), facing.getOpposite()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index 739d0ecabe..d48bfa1c87 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -225,7 +225,8 @@ public void exportToNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); var pos = getMachine().getPos(); for (Direction facing : facings) { - ItemTransferHelper.exportToTarget(this, Integer.MAX_VALUE, f -> true, level, pos.relative(facing), + ItemTransferHelper.exportToTarget(this, Integer.MAX_VALUE, getMachine().getItemCapFilter(facing), level, + pos.relative(facing), facing.getOpposite()); } } @@ -234,7 +235,8 @@ public void importFromNearby(@NotNull Direction... facings) { var level = getMachine().getLevel(); var pos = getMachine().getPos(); for (Direction facing : facings) { - ItemTransferHelper.importToTarget(this, Integer.MAX_VALUE, f -> true, level, pos.relative(facing), + ItemTransferHelper.importToTarget(this, Integer.MAX_VALUE, getMachine().getItemCapFilter(facing), level, + pos.relative(facing), facing.getOpposite()); } } From 730daaf87f300b734f5be5d001a1416d995bc7b2 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:08:02 -0600 Subject: [PATCH 10/15] Steam Turbine Fix (#1983) --- .../gtceu/api/recipe/modifier/ParallelLogic.java | 6 +++--- .../multiblock/generator/LargeTurbineMachine.java | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java index ca54364215..017778e95c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java @@ -124,14 +124,14 @@ public static int limitByOutputMerging(@NotNull GTRecipe recipe, @NotNull IRecip // If we are voiding items, reset the item limit to the maximum number of parallels if (voiding) { if (modifiedParallelAmounts.containsKey(cap)) { - modifiedParallelAmounts.put(cap, modifiedParallelAmounts.getInt(cap) + parallelAmount); + modifiedParallelAmounts.put(cap, Math.min(modifiedParallelAmounts.getInt(cap), parallelAmount)); } else { modifiedParallelAmounts.put(cap, parallelAmount); } } else { if (modifiedParallelAmounts.containsKey(cap)) { - modifiedParallelAmounts.put(cap, modifiedParallelAmounts.getInt(cap) + - cap.limitParallel(recipe, holder, parallelAmount)); + modifiedParallelAmounts.put(cap, Math.min(modifiedParallelAmounts.getInt(cap), + cap.limitParallel(recipe, holder, parallelAmount))); } else { modifiedParallelAmounts.put(cap, cap.limitParallel(recipe, holder, parallelAmount)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java index 612f4772ce..3aa735944d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java @@ -11,6 +11,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.logic.OCParams; import com.gregtechceu.gtceu.api.recipe.logic.OCResult; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; @@ -114,6 +115,14 @@ public static GTRecipe recipeModifier(MetaMachine machine, @NotNull GTRecipe rec long eut = turbineMachine.boostProduction((long) (EUt * holderEfficiency * parallelResult.getSecond())); + recipe = new GTRecipe(recipe.recipeType, recipe.id, + recipe.copyContents(recipe.inputs, ContentModifier.multiplier(parallelResult.getSecond())), + recipe.copyContents(recipe.outputs, ContentModifier.multiplier(parallelResult.getSecond())), + recipe.tickInputs, recipe.tickOutputs, recipe.inputChanceLogics, recipe.outputChanceLogics, + recipe.tickInputChanceLogics, recipe.tickOutputChanceLogics, recipe.conditions, + recipe.ingredientActions, + recipe.data, recipe.duration, recipe.isFuel); + result.init(-eut, recipe.duration, parallelResult.getSecond(), params.getOcAmount()); return recipe; From bd63f0c773ff1aee564a864102161bdc8f57704a Mon Sep 17 00:00:00 2001 From: Austin <31421419+Vextin@users.noreply.github.com> Date: Thu, 19 Sep 2024 20:59:37 -0400 Subject: [PATCH 11/15] Add Compressor recipe for snow balls -> snow (#1969) --- .../gtceu/data/recipe/misc/VanillaStandardRecipes.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java index ca7f209f1d..b3e856005a 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/VanillaStandardRecipes.java @@ -82,6 +82,11 @@ private static void compressingRecipes(Consumer provider) { .outputItems(new ItemStack(Blocks.CLAY)) .save(provider); + COMPRESSOR_RECIPES.recipeBuilder("snowballs_to_snow").duration(200).EUt(2) + .inputItems(new ItemStack(Items.SNOWBALL, 4)) + .outputItems(new ItemStack(Items.SNOW_BLOCK)) + .save(provider); + COMPRESSOR_RECIPES.recipeBuilder("glowstone").duration(300).EUt(2) .inputItems(new ItemStack(Items.GLOWSTONE_DUST, 4)) .outputItems(new ItemStack(Blocks.GLOWSTONE)) From a9d278ff217abc590c07f69ee2021403aadcae47 Mon Sep 17 00:00:00 2001 From: a-a-GiTHuB-a-a <64599476+a-a-GiTHuB-a-a@users.noreply.github.com> Date: Thu, 19 Sep 2024 21:25:58 -0400 Subject: [PATCH 12/15] Added rubber log variants to #minecraft:logs_that_burn (#1914) --- .../minecraft/tags/blocks/logs_that_burn.json | 7 +++++-- .../gtceu/common/data/GTBlocks.java | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json b/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json index 0e9a2d0809..39f4a40dc7 100644 --- a/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json +++ b/src/generated/resources/data/minecraft/tags/blocks/logs_that_burn.json @@ -1,5 +1,8 @@ { "values": [ - "gtceu:rubber_log" + "gtceu:rubber_log", + "gtceu:stripped_rubber_log", + "gtceu:rubber_wood", + "gtceu:stripped_rubber_wood" ] -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java index 3d1c611ff9..c123384a66 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTBlocks.java @@ -1073,8 +1073,10 @@ public static ItemColor leavesItemColor() { .initialProperties(() -> Blocks.STRIPPED_SPRUCE_LOG) .lang("Stripped Rubber Log") .blockstate((ctx, provider) -> provider.logBlock(ctx.get())) - .tag(BlockTags.MINEABLE_WITH_AXE) - .simpleItem() + .tag(BlockTags.LOGS_THAT_BURN, BlockTags.MINEABLE_WITH_AXE) + .item() + .tag(ItemTags.LOGS_THAT_BURN) + .build() .register(); public static final BlockEntry RUBBER_WOOD = REGISTRATE .block("rubber_wood", RotatedPillarBlock::new) @@ -1082,8 +1084,10 @@ public static ItemColor leavesItemColor() { .lang("Rubber Wood") .blockstate((ctx, provider) -> provider.axisBlock(ctx.get(), provider.blockTexture(GTBlocks.RUBBER_LOG.get()), provider.blockTexture(GTBlocks.RUBBER_LOG.get()))) - .tag(BlockTags.MINEABLE_WITH_AXE) - .simpleItem() + .tag(BlockTags.LOGS_THAT_BURN, BlockTags.MINEABLE_WITH_AXE) + .item() + .tag(ItemTags.LOGS_THAT_BURN) + .build() .register(); public static final BlockEntry STRIPPED_RUBBER_WOOD = REGISTRATE .block("stripped_rubber_wood", RotatedPillarBlock::new) @@ -1091,8 +1095,10 @@ public static ItemColor leavesItemColor() { .lang("Stripped Rubber Wood") .blockstate((ctx, provider) -> provider.axisBlock(ctx.get(), provider.blockTexture(ctx.get()), provider.blockTexture(ctx.get()))) - .tag(BlockTags.MINEABLE_WITH_AXE) - .simpleItem() + .tag(BlockTags.LOGS_THAT_BURN, BlockTags.MINEABLE_WITH_AXE) + .item() + .tag(ItemTags.LOGS_THAT_BURN) + .build() .register(); public static final BlockEntry RUBBER_PLANK = REGISTRATE From 05f5dd120c959e192a92ba73210b994c15ad4102 Mon Sep 17 00:00:00 2001 From: screret <68943070+screret@users.noreply.github.com> Date: Fri, 20 Sep 2024 04:27:27 +0300 Subject: [PATCH 13/15] Fix recipe format changes breaking all machines (#1955) --- .github/actions/build_setup/action.yml | 1 - .../gregtechceu/gtceu/api/addon/IGTAddon.java | 5 - .../recipe/ItemRecipeCapability.java | 2 +- .../capability/recipe/RecipeCapability.java | 11 ++ .../gtceu/api/codec/DispatchedMapCodec.java | 79 +++++++++++ .../medicalcondition/MedicalCondition.java | 4 + .../api/machine/multiblock/CleanroomType.java | 3 + .../api/machine/steam/SimpleSteamMachine.java | 2 +- .../gtceu/api/recipe/GTRecipe.java | 28 +++- .../gtceu/api/recipe/GTRecipeSerializer.java | 134 ++++++++++-------- .../gtceu/api/recipe/RecipeCondition.java | 47 +++--- .../gtceu/api/recipe/ResearchData.java | 13 +- .../recipe/condition/RecipeConditionType.java | 21 +++ .../gtceu/api/recipe/content/Content.java | 21 ++- .../recipe/content/IContentSerializer.java | 24 +++- .../recipe/content/SerializerBigInteger.java | 16 +++ .../recipe/content/SerializerBlockState.java | 6 + .../api/recipe/content/SerializerDouble.java | 6 + .../api/recipe/content/SerializerFloat.java | 6 + .../content/SerializerFluidIngredient.java | 6 + .../recipe/content/SerializerIngredient.java | 12 ++ .../api/recipe/content/SerializerInteger.java | 6 + .../api/recipe/content/SerializerLong.java | 6 + .../recipe/ingredient/FluidIngredient.java | 7 + .../gtceu/api/registry/GTRegistries.java | 4 +- .../gtceu/api/registry/GTRegistry.java | 13 +- .../gtceu/common/data/GTRecipeConditions.java | 64 ++++++--- .../gtceu/common/data/GTRecipeTypes.java | 4 +- .../common/data/GTSyncedFieldAccessors.java | 6 +- .../part/DataAccessHatchMachine.java | 2 +- .../AdjacentBlockCondition.java | 19 ++- .../{ => condition}/BiomeCondition.java | 20 ++- .../{ => condition}/CleanroomCondition.java | 19 ++- .../{ => condition}/DimensionCondition.java | 20 ++- .../{ => condition}/EUToStartCondition.java | 19 ++- .../EnvironmentalHazardCondition.java | 21 ++- .../{ => condition}/PositionYCondition.java | 23 ++- .../recipe/{ => condition}/RPMCondition.java | 20 ++- .../{ => condition}/RainingCondition.java | 20 ++- .../{ => condition}/ResearchCondition.java | 21 ++- .../{ => condition}/RockBreakerCondition.java | 18 ++- .../{ => condition}/ThunderCondition.java | 20 ++- .../recipe/{ => condition}/VentCondition.java | 17 ++- .../material/MaterialRegistryImpl.java | 5 +- .../data/recipe/builder/GTRecipeBuilder.java | 4 +- .../gtceu/integration/GTRecipeWidget.java | 2 +- .../kjs/recipe/GTRecipeSchema.java | 2 +- .../recipe/components/GTRecipeComponents.java | 20 +-- .../gtceu/syncdata/GTRecipeAccessor.java | 43 ------ .../gtceu/syncdata/GTRecipePayload.java | 61 ++++++++ 50 files changed, 720 insertions(+), 233 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/AdjacentBlockCondition.java (70%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/BiomeCondition.java (76%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/CleanroomCondition.java (78%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/DimensionCondition.java (81%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/EUToStartCondition.java (72%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/EnvironmentalHazardCondition.java (76%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/PositionYCondition.java (71%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/RPMCondition.java (77%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/RainingCondition.java (72%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/ResearchCondition.java (66%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/RockBreakerCondition.java (73%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/ThunderCondition.java (72%) rename src/main/java/com/gregtechceu/gtceu/common/recipe/{ => condition}/VentCondition.java (64%) delete mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeAccessor.java create mode 100644 src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java diff --git a/.github/actions/build_setup/action.yml b/.github/actions/build_setup/action.yml index 00d312ece4..40e38cd7df 100644 --- a/.github/actions/build_setup/action.yml +++ b/.github/actions/build_setup/action.yml @@ -31,7 +31,6 @@ runs: - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 with: - gradle-home-cache-cleanup: true cache-write-only: ${{ inputs.update-cache }} generate-job-summary: false gradle-home-cache-includes: | diff --git a/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java b/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java index fa95834d05..7aa4eb4571 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java +++ b/src/main/java/com/gregtechceu/gtceu/api/addon/IGTAddon.java @@ -66,11 +66,6 @@ default void registerCovers() {} */ default void registerRecipeCapabilities() {} - /** - * Call init on your custom Recipe Conditions here - */ - default void registerRecipeConditions() {} - /** * Call init on your custom IWorldGenLayer class(es) here */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java index d4765d7750..556a62d972 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java @@ -16,7 +16,7 @@ import com.gregtechceu.gtceu.api.recipe.lookup.*; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; -import com.gregtechceu.gtceu.common.recipe.ResearchCondition; +import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; import com.gregtechceu.gtceu.common.valueprovider.AddedFloat; import com.gregtechceu.gtceu.common.valueprovider.CastedFloat; import com.gregtechceu.gtceu.common.valueprovider.FlooredInt; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java index 27b38b8fdc..5d585562d2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.capability.recipe; +import com.gregtechceu.gtceu.api.codec.DispatchedMapCodec; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.content.Content; @@ -8,6 +9,7 @@ import com.gregtechceu.gtceu.api.recipe.lookup.AbstractMapIngredient; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; @@ -15,6 +17,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import com.mojang.serialization.Codec; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; @@ -29,6 +32,10 @@ */ public abstract class RecipeCapability { + public static final Codec> DIRECT_CODEC = GTRegistries.RECIPE_CAPABILITIES.codec(); + public static final Codec, List>> CODEC = new DispatchedMapCodec<>( + RecipeCapability.DIRECT_CODEC, + RecipeCapability::contentCodec); public static final Comparator> COMPARATOR = Comparator.comparingInt(o -> o.sortIndex); public final String name; @@ -46,6 +53,10 @@ protected RecipeCapability(String name, int color, boolean doRenderSlot, int sor this.serializer = serializer; } + public static Codec> contentCodec(RecipeCapability capability) { + return Content.codec(capability).listOf(); + } + /** * deep copy of this content. recipe need it for searching and such things */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java b/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java new file mode 100644 index 0000000000..f5e2b7b968 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/codec/DispatchedMapCodec.java @@ -0,0 +1,79 @@ +package com.gregtechceu.gtceu.api.codec; + +import com.gregtechceu.gtceu.GTCEu; + +import com.google.common.collect.ImmutableMap; +import com.mojang.datafixers.util.Pair; +import com.mojang.datafixers.util.Unit; +import com.mojang.serialization.*; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Stream; + +public record DispatchedMapCodec( + Codec keyCodec, + Function> valueCodecFunction) + implements Codec> { + + @Override + public DataResult encode(final Map input, final DynamicOps ops, final T prefix) { + final RecordBuilder mapBuilder = ops.mapBuilder(); + for (final Map.Entry entry : input.entrySet()) { + mapBuilder.add(keyCodec.encodeStart(ops, entry.getKey()), + encodeValue(valueCodecFunction.apply(entry.getKey()), entry.getValue(), ops)); + } + return mapBuilder.build(prefix); + } + + @SuppressWarnings("unchecked") + private DataResult encodeValue(final Codec codec, final V input, final DynamicOps ops) { + return codec.encodeStart(ops, (V2) input); + } + + @Override + public DataResult, T>> decode(final DynamicOps ops, final T input) { + return ops.getMap(input).flatMap(map -> { + final Map entries = new Object2ObjectArrayMap<>(); + final Stream.Builder> failed = Stream.builder(); + + final DataResult finalResult = map.entries().reduce( + DataResult.success(Unit.INSTANCE, Lifecycle.stable()), + (result, entry) -> parseEntry(result, ops, entry, entries, failed), + (r1, r2) -> r1.apply2stable((u1, u2) -> u1, r2)); + + final Pair, T> pair = Pair.of(ImmutableMap.copyOf(entries), input); + final T errors = ops.createMap(failed.build()); + + return finalResult.map(ignored -> pair).setPartial(pair) + .mapError(error -> error + " missed input: " + errors); + }); + } + + private DataResult parseEntry(final DataResult result, final DynamicOps ops, + final Pair input, final Map entries, + final Stream.Builder> failed) { + final DataResult keyResult = keyCodec.parse(ops, input.getFirst()); + final DataResult valueResult = keyResult.map(valueCodecFunction) + .flatMap(valueCodec -> valueCodec.parse(ops, input.getSecond()).map(Function.identity())); + final DataResult> entryResult = keyResult.apply2stable(Pair::of, valueResult); + + final Optional> entry = entryResult.resultOrPartial(GTCEu.LOGGER::error); + if (entry.isPresent()) { + final K key = entry.get().getFirst(); + final V value = entry.get().getSecond(); + if (entries.putIfAbsent(key, value) != null) { + failed.add(input); + return result.apply2stable((u, p) -> u, + DataResult.error(() -> "Duplicate entry for key: '" + key + "'")); + } + } + if (entryResult.error().isPresent()) { + failed.add(input); + } + + return result.apply2stable((u, p) -> u, entryResult); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java index e4e2d34289..0bd126827a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/medicalcondition/MedicalCondition.java @@ -10,6 +10,7 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.level.Level; +import com.mojang.serialization.Codec; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -22,7 +23,10 @@ public class MedicalCondition { public static final Map CONDITIONS = new HashMap<>(); + public static final Codec CODEC = Codec.STRING.xmap(MedicalCondition.CONDITIONS::get, + MedicalCondition::getName); + @Getter public final String name; public final int color; public final float maxProgression; // amount of seconds until maximum progression is reached diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java index 831398f019..0768944289 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/CleanroomType.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.machine.multiblock; +import com.mojang.serialization.Codec; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,6 +17,8 @@ public class CleanroomType { public static final CleanroomType STERILE_CLEANROOM = new CleanroomType("sterile_cleanroom", "gtceu.recipe.cleanroom_sterile.display_name"); + public static final Codec CODEC = Codec.STRING.xmap(CLEANROOM_TYPES::get, CleanroomType::getName); + private final String name; private final String translationKey; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index ac4923b3a5..457c05d430 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java @@ -18,7 +18,7 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.logic.OCParams; import com.gregtechceu.gtceu.api.recipe.logic.OCResult; -import com.gregtechceu.gtceu.common.recipe.VentCondition; +import com.gregtechceu.gtceu.common.recipe.condition.VentCondition; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java index bddbcd3714..e9f18c0ab2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipe.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; @@ -20,6 +21,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import lombok.Getter; +import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,7 +41,8 @@ public class GTRecipe implements net.minecraft.world.item.crafting.Recipe, List> inputs; public final Map, List> outputs; public final Map, List> tickInputs; @@ -63,7 +66,26 @@ public class GTRecipe implements net.minecraft.world.item.crafting.Recipe, List> inputs, + Map, List> outputs, + Map, List> tickInputs, + Map, List> tickOutputs, + Map, ChanceLogic> inputChanceLogics, + Map, ChanceLogic> outputChanceLogics, + Map, ChanceLogic> tickInputChanceLogics, + Map, ChanceLogic> tickOutputChanceLogics, + List conditions, + List ingredientActions, + @NotNull CompoundTag data, + int duration, + boolean isFuel) { + this(recipeType, null, inputs, outputs, tickInputs, tickOutputs, + inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, + conditions, ingredientActions, data, duration, isFuel); + } + + public GTRecipe(GTRecipeType recipeType, + @Nullable ResourceLocation id, Map, List> inputs, Map, List> outputs, Map, List> tickInputs, @@ -308,7 +330,7 @@ public void handlePost(Map, List> contents, IRecipe public ActionResult checkConditions(@NotNull RecipeLogic recipeLogic) { if (conditions.isEmpty()) return ActionResult.SUCCESS; - Map> or = new HashMap<>(); + Map, List> or = new HashMap<>(); for (RecipeCondition condition : conditions) { if (condition.isOr()) { or.computeIfAbsent(condition.getType(), type -> new ArrayList<>()).add(condition); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java index 3db8b37185..1450800669 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/GTRecipeSerializer.java @@ -5,20 +5,24 @@ import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.common.recipe.ResearchCondition; +import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; +import net.minecraft.util.ExtraCodecs; import net.minecraft.util.Tuple; import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraftforge.common.crafting.CraftingHelper; import com.google.gson.JsonArray; import com.google.gson.JsonElement; +import com.google.gson.JsonNull; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.latvian.mods.kubejs.recipe.ingredientaction.IngredientAction; import org.jetbrains.annotations.NotNull; @@ -31,6 +35,8 @@ */ public class GTRecipeSerializer implements RecipeSerializer { + public static final Codec CODEC = makeCodec(GTCEu.isKubeJSLoaded()); + public static final GTRecipeSerializer SERIALIZER = new GTRecipeSerializer(); public Map, List> capabilitiesFromJson(JsonObject json) { @@ -60,61 +66,9 @@ public Map, ChanceLogic> chanceLogicsFromJson(JsonObject jso @Override public @NotNull GTRecipe fromJson(@NotNull ResourceLocation id, @NotNull JsonObject json) { - String recipeType = GsonHelper.getAsString(json, "type"); - int duration = json.has("duration") ? GsonHelper.getAsInt(json, "duration") : 100; - CompoundTag data = new CompoundTag(); - if (json.has("data")) - data = CraftingHelper.getNBT(json.get("data")); - Map, List> inputs = capabilitiesFromJson( - json.has("inputs") ? json.getAsJsonObject("inputs") : new JsonObject()); - Map, List> tickInputs = capabilitiesFromJson( - json.has("tickInputs") ? json.getAsJsonObject("tickInputs") : new JsonObject()); - Map, List> outputs = capabilitiesFromJson( - json.has("outputs") ? json.getAsJsonObject("outputs") : new JsonObject()); - Map, List> tickOutputs = capabilitiesFromJson( - json.has("tickOutputs") ? json.getAsJsonObject("tickOutputs") : new JsonObject()); - - Map, ChanceLogic> inputChanceLogics = chanceLogicsFromJson( - json.has("inputChanceLogics") ? - json.getAsJsonObject("inputChanceLogics") : - new JsonObject()); - Map, ChanceLogic> tickInputChanceLogics = chanceLogicsFromJson( - json.has("tickInputChanceLogics") ? - json.getAsJsonObject("tickInputChanceLogics") : - new JsonObject()); - Map, ChanceLogic> outputChanceLogics = chanceLogicsFromJson( - json.has("outputChanceLogics") ? - json.getAsJsonObject("outputChanceLogics") : - new JsonObject()); - Map, ChanceLogic> tickOutputChanceLogics = chanceLogicsFromJson( - json.has("tickOutputChanceLogics") ? - json.getAsJsonObject("tickOutputChanceLogics") : - new JsonObject()); - List conditions = new ArrayList<>(); - JsonArray conditionsJson = json.has("recipeConditions") ? json.getAsJsonArray("recipeConditions") : - new JsonArray(); - for (JsonElement jsonElement : conditionsJson) { - if (jsonElement instanceof JsonObject jsonObject) { - var conditionKey = GsonHelper.getAsString(jsonObject, "type", ""); - var clazz = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); - if (clazz != null) { - RecipeCondition condition = RecipeCondition.create(clazz); - if (condition != null) { - conditions.add(condition - .deserialize(GsonHelper.getAsJsonObject(jsonObject, "data", new JsonObject()))); - } - } - } - } - List ingredientActions = new ArrayList<>(); - if (GTCEu.isKubeJSLoaded()) { - ingredientActions = KJSCallWrapper.getIngredientActions(json); - } - boolean isFuel = GsonHelper.getAsBoolean(json, "isFuel", false); - return new GTRecipe((GTRecipeType) BuiltInRegistries.RECIPE_TYPE.get(new ResourceLocation(recipeType)), id, - inputs, outputs, tickInputs, tickOutputs, - inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, - conditions, ingredientActions, data, duration, isFuel); + GTRecipe recipe = CODEC.parse(JsonOps.INSTANCE, json).getOrThrow(false, GTCEu.LOGGER::error); + recipe.setId(id); + return recipe; } public static Tuple, List> entryReader(FriendlyByteBuf buf) { @@ -131,12 +85,12 @@ public static void entryWriter(FriendlyByteBuf buf, Map.Entry makeCodec(boolean isKubeLoaded) { + // @formatter:off + if (!isKubeLoaded) { + return RecordCodecBuilder.create(instance -> instance.group( + GTRegistries.RECIPE_TYPES.codec().fieldOf("type").forGetter(val -> val.recipeType), + RecipeCapability.CODEC.optionalFieldOf("inputs", Map.of()).forGetter(val -> val.inputs), + RecipeCapability.CODEC.optionalFieldOf("outputs", Map.of()).forGetter(val -> val.outputs), + RecipeCapability.CODEC.optionalFieldOf("tickInputs", Map.of()).forGetter(val -> val.tickInputs), + RecipeCapability.CODEC.optionalFieldOf("tickOutputs", Map.of()).forGetter(val -> val.tickOutputs), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("inputChanceLogics", Map.of()).forGetter(val -> val.inputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("outputChanceLogics", Map.of()).forGetter(val -> val.outputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("tickInputChanceLogics", Map.of()).forGetter(val -> val.tickInputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("tickOutputChanceLogics", Map.of()).forGetter(val -> val.tickOutputChanceLogics), + RecipeCondition.CODEC.listOf().optionalFieldOf("recipeConditions", List.of()).forGetter(val -> val.conditions), + CompoundTag.CODEC.optionalFieldOf("data", new CompoundTag()).forGetter(val -> val.data), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("duration").forGetter(val -> val.duration), + Codec.BOOL.optionalFieldOf("isFuel", false).forGetter(val -> val.isFuel)) + .apply(instance, (type, + inputs, outputs, tickInputs, tickOutputs, + inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, + conditions, data, duration, isFuel) -> + new GTRecipe(type, inputs, outputs, tickInputs, tickOutputs, + inputChanceLogics, outputChanceLogics, tickInputChanceLogics, tickOutputChanceLogics, + conditions, List.of(), data, duration, isFuel))); + } else { + return RecordCodecBuilder.create(instance -> instance.group( + GTRegistries.RECIPE_TYPES.codec().fieldOf("type").forGetter(val -> val.recipeType), + RecipeCapability.CODEC.optionalFieldOf("inputs", Map.of()).forGetter(val -> val.inputs), + RecipeCapability.CODEC.optionalFieldOf("outputs", Map.of()).forGetter(val -> val.outputs), + RecipeCapability.CODEC.optionalFieldOf("tickInputs", Map.of()).forGetter(val -> val.tickInputs), + RecipeCapability.CODEC.optionalFieldOf("tickOutputs", Map.of()).forGetter(val -> val.tickOutputs), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("inputChanceLogics", Map.of()).forGetter(val -> val.inputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("outputChanceLogics", Map.of()).forGetter(val -> val.outputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("tickInputChanceLogics", Map.of()).forGetter(val -> val.tickInputChanceLogics), + Codec.unboundedMap(RecipeCapability.DIRECT_CODEC, GTRegistries.CHANCE_LOGICS.codec()) + .optionalFieldOf("tickOutputChanceLogics", Map.of()).forGetter(val -> val.tickOutputChanceLogics), + RecipeCondition.CODEC.listOf().optionalFieldOf("recipeConditions", List.of()).forGetter(val -> val.conditions), + KJSCallWrapper.INGREDIENT_ACTION_CODEC.optionalFieldOf("kubejs:actions", List.of()).forGetter(val -> (List) val.ingredientActions), + CompoundTag.CODEC.optionalFieldOf("data", new CompoundTag()).forGetter(val -> val.data), + ExtraCodecs.NON_NEGATIVE_INT.fieldOf("duration").forGetter(val -> val.duration), + Codec.BOOL.optionalFieldOf("isFuel", false).forGetter(val -> val.isFuel)) + .apply(instance, GTRecipe::new)); + } + // @formatter:on + } + public static class KJSCallWrapper { + public static final Codec> INGREDIENT_ACTION_CODEC = Codec.PASSTHROUGH.xmap( + dynamic -> { + JsonElement json = dynamic.convert(JsonOps.INSTANCE).getValue(); + return IngredientAction.parseList(json); + }, + list -> new Dynamic<>(JsonOps.INSTANCE, JsonNull.INSTANCE)); + public static List getIngredientActions(JsonObject json) { return IngredientAction.parseList(json.get("kubejs:actions")); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java index ca9a5a8285..5a0b7c052b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java @@ -1,7 +1,8 @@ package com.gregtechceu.gtceu.api.recipe; -import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -11,30 +12,43 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.datafixers.Products; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author KilaBash * @date 2022/05/27 * @implNote RecipeCondition, global conditions */ +@Accessors(chain = true) public abstract class RecipeCondition { - @Nullable - public static RecipeCondition create(Class clazz) { - if (clazz == null) return null; - try { - return clazz.newInstance(); - } catch (Exception ignored) { - GTCEu.LOGGER.error("condition {} has no NonArgsConstructor", clazz); - return null; - } + public static final Codec CODEC = GTRegistries.RECIPE_CONDITIONS.codec() + .dispatch(RecipeCondition::getType, RecipeConditionType::getCodec); + + public static < + RC extends RecipeCondition> Products.P1, Boolean> isReverse(RecordCodecBuilder.Instance instance) { + return instance.group(Codec.BOOL.fieldOf("reverse").forGetter(val -> val.isReverse)); } + @Getter + @Setter protected boolean isReverse; - public abstract String getType(); + public RecipeCondition() { + this(false); + } + + public RecipeCondition(boolean isReverse) { + this.isReverse = isReverse; + } + + public abstract RecipeConditionType getType(); public String getTranslationKey() { return "gtceu.recipe.condition." + getType(); @@ -49,19 +63,10 @@ public IGuiTexture getValidTexture() { 0.5f); } - public boolean isReverse() { - return isReverse; - } - public boolean isOr() { return false; } - public RecipeCondition setReverse(boolean reverse) { - isReverse = reverse; - return this; - } - public abstract Component getTooltips(); public abstract boolean test(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ResearchData.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ResearchData.java index 1515e446ee..9bc4045050 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/ResearchData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ResearchData.java @@ -7,20 +7,24 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.Collection; import java.util.Iterator; import java.util.List; @AllArgsConstructor public final class ResearchData implements Iterable { - private final Collection entries; + public static final Codec CODEC = ResearchEntry.CODEC.listOf().xmap(ResearchData::new, + data -> data.entries); + + private final List entries; public ResearchData() { entries = new ArrayList<>(); @@ -74,6 +78,11 @@ public void toNetwork(FriendlyByteBuf buf) { */ public static final class ResearchEntry { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.STRING.fieldOf("researchId").forGetter(val -> val.researchId), + ItemStack.CODEC.fieldOf("dataItem").forGetter(val -> val.dataItem)) + .apply(instance, ResearchEntry::new)); + @NotNull @Getter private final String researchId; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java new file mode 100644 index 0000000000..b73f764b78 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/condition/RecipeConditionType.java @@ -0,0 +1,21 @@ +package com.gregtechceu.gtceu.api.recipe.condition; + +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; + +import com.mojang.serialization.Codec; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +public class RecipeConditionType { + + public final ConditionFactory factory; + @Getter + public final Codec codec; + + @FunctionalInterface + public interface ConditionFactory { + + T createDefault(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/Content.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/Content.java index 4ae0183f9f..59ddbd82ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/Content.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/Content.java @@ -12,10 +12,13 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.ExtraCodecs; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -37,8 +40,22 @@ public Content(Object content, int chance, int maxChance, int tierChanceBoost, @ this.chance = chance; this.maxChance = maxChance; this.tierChanceBoost = fixBoost(tierChanceBoost); - this.slotName = slotName; - this.uiName = uiName; + this.slotName = slotName == null || slotName.isEmpty() ? null : slotName; + this.uiName = uiName == null || uiName.isEmpty() ? null : uiName; + } + + public static Codec codec(RecipeCapability capability) { + return RecordCodecBuilder.create(instance -> instance.group( + capability.serializer.codec().fieldOf("content").forGetter(val -> capability.of(val.content)), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("chance", ChanceLogic.getMaxChancedValue()) + .forGetter(val -> val.chance), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("maxChance", ChanceLogic.getMaxChancedValue()) + .forGetter(val -> val.maxChance), + ExtraCodecs.NON_NEGATIVE_INT.optionalFieldOf("tierChanceBoost", 0) + .forGetter(val -> val.tierChanceBoost), + Codec.STRING.optionalFieldOf("slotName", "").forGetter(val -> val.slotName != null ? val.slotName : ""), + Codec.STRING.optionalFieldOf("uiName", "").forGetter(val -> val.uiName != null ? val.uiName : "")) + .apply(instance, Content::new)); } public Content copy(RecipeCapability capability, @Nullable ContentModifier modifier) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/IContentSerializer.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/IContentSerializer.java index 0fd6c8770b..5a145a06f4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/IContentSerializer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/IContentSerializer.java @@ -1,25 +1,33 @@ package com.gregtechceu.gtceu.api.recipe.content; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.lowdragmc.lowdraglib.LDLib; +import com.lowdragmc.lowdraglib.Platform; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.RegistryOps; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; public interface IContentSerializer { default void toNetwork(FriendlyByteBuf buf, T content) { - buf.writeUtf(LDLib.GSON.toJson(toJson(content))); + RegistryOps ops = RegistryOps.create(JsonOps.INSTANCE, Platform.getFrozenRegistry()); + buf.writeUtf(codec().encodeStart(ops, content).getOrThrow(false, GTCEu.LOGGER::error).toString()); } default T fromNetwork(FriendlyByteBuf buf) { - return fromJson(LDLib.GSON.fromJson(buf.readUtf(), JsonElement.class)); + RegistryOps ops = RegistryOps.create(JsonOps.INSTANCE, Platform.getFrozenRegistry()); + return codec().parse(ops, LDLib.GSON.fromJson(buf.readUtf(), JsonElement.class)).getOrThrow(false, + GTCEu.LOGGER::error); } T fromJson(JsonElement json); @@ -63,6 +71,18 @@ default Content fromNetworkContent(FriendlyByteBuf buf) { return new Content(inner, chance, maxChance, tierChanceBoost, slotName, uiName); } + Codec codec(); + + default T fromJson(JsonElement json, HolderLookup.Provider provider) { + RegistryOps ops = RegistryOps.create(JsonOps.INSTANCE, provider); + return codec().parse(ops, json).getOrThrow(false, GTCEu.LOGGER::error); + } + + default JsonElement toJson(T content, HolderLookup.Provider provider) { + RegistryOps ops = RegistryOps.create(JsonOps.INSTANCE, provider); + return codec().encodeStart(ops, content).getOrThrow(false, GTCEu.LOGGER::error); + } + @SuppressWarnings("unchecked") default JsonElement toJsonContent(Content content) { JsonObject json = new JsonObject(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBigInteger.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBigInteger.java index 2367a59fd5..acda029381 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBigInteger.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBigInteger.java @@ -4,6 +4,9 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.Lifecycle; import java.math.BigInteger; @@ -14,6 +17,14 @@ */ public class SerializerBigInteger implements IContentSerializer { + public static final Codec CODEC = Codec.STRING.comapFlatMap(str -> { + try { + return DataResult.success(new BigInteger(str), Lifecycle.stable()); + } catch (Exception e) { + return DataResult.error(e::getMessage, Lifecycle.stable()); + } + }, BigInteger::toString); + public static SerializerBigInteger INSTANCE = new SerializerBigInteger(); private SerializerBigInteger() {} @@ -54,4 +65,9 @@ public BigInteger of(Object o) { public BigInteger defaultValue() { return BigInteger.ZERO; } + + @Override + public Codec codec() { + return CODEC; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBlockState.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBlockState.java index c6dcada1e5..6ca7efee8f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBlockState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerBlockState.java @@ -14,6 +14,7 @@ import com.google.common.collect.ImmutableMap; import com.google.gson.JsonElement; import com.google.gson.JsonNull; +import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; import java.util.Map; @@ -86,4 +87,9 @@ public BlockState of(Object o) { public BlockState defaultValue() { return Blocks.AIR.defaultBlockState(); } + + @Override + public Codec codec() { + return BlockState.CODEC; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerDouble.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerDouble.java index 92c1a85b5c..9b71b5c440 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerDouble.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerDouble.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; import org.apache.commons.lang3.math.NumberUtils; public class SerializerDouble implements IContentSerializer { @@ -48,4 +49,9 @@ public Double of(Object o) { public Double defaultValue() { return 0d; } + + @Override + public Codec codec() { + return Codec.DOUBLE; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFloat.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFloat.java index ad1aebc444..2399ad1014 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFloat.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFloat.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; import org.apache.commons.lang3.math.NumberUtils; public class SerializerFloat implements IContentSerializer { @@ -48,4 +49,9 @@ public Float of(Object o) { public Float defaultValue() { return 0f; } + + @Override + public Codec codec() { + return Codec.FLOAT; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFluidIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFluidIngredient.java index 84791ba351..a81680796c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFluidIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerFluidIngredient.java @@ -7,6 +7,7 @@ import net.minecraft.network.FriendlyByteBuf; import com.google.gson.JsonElement; +import com.mojang.serialization.Codec; public class SerializerFluidIngredient implements IContentSerializer { @@ -49,4 +50,9 @@ public FluidIngredient of(Object o) { public FluidIngredient defaultValue() { return FluidIngredient.EMPTY; } + + @Override + public Codec codec() { + return FluidIngredient.CODEC; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerIngredient.java index 62a4bdbc74..5a876ed9f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerIngredient.java @@ -9,9 +9,16 @@ import net.minecraft.world.level.ItemLike; import com.google.gson.JsonElement; +import com.mojang.serialization.Codec; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.JsonOps; public class SerializerIngredient implements IContentSerializer { + public static final Codec CODEC = Codec.PASSTHROUGH.xmap( + dynamic -> Ingredient.fromJson(dynamic.convert(JsonOps.INSTANCE).getValue()), + ingredient -> new Dynamic<>(JsonOps.INSTANCE, ingredient.toJson())); + public static SerializerIngredient INSTANCE = new SerializerIngredient(); private SerializerIngredient() {} @@ -55,4 +62,9 @@ public Ingredient of(Object o) { public Ingredient defaultValue() { return Ingredient.EMPTY; } + + @Override + public Codec codec() { + return CODEC; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerInteger.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerInteger.java index fcee352cf1..ebab0c336b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerInteger.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerInteger.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; import org.apache.commons.lang3.math.NumberUtils; public class SerializerInteger implements IContentSerializer { @@ -48,4 +49,9 @@ public Integer of(Object o) { public Integer defaultValue() { return 0; } + + @Override + public Codec codec() { + return Codec.INT; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerLong.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerLong.java index 561b7d4ec8..3336e22a7e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerLong.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/content/SerializerLong.java @@ -4,6 +4,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; import org.apache.commons.lang3.math.NumberUtils; /** @@ -53,4 +54,9 @@ public Long of(Object o) { public Long defaultValue() { return 0L; } + + @Override + public Codec codec() { + return Codec.LONG; + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java index 6eb582b828..619eaade6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/FluidIngredient.java @@ -17,6 +17,9 @@ import com.google.common.collect.Lists; import com.google.gson.*; +import com.mojang.serialization.Codec; +import com.mojang.serialization.Dynamic; +import com.mojang.serialization.JsonOps; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -28,6 +31,10 @@ public class FluidIngredient implements Predicate { + public static final Codec CODEC = Codec.PASSTHROUGH.xmap( + dynamic -> FluidIngredient.fromJson(dynamic.convert(JsonOps.INSTANCE).getValue()), + ingredient -> new Dynamic<>(JsonOps.INSTANCE, ingredient.toJson())); + public static final FluidIngredient EMPTY = new FluidIngredient(Stream.empty(), 0, null); public FluidIngredient.Value[] values; @Nullable diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistries.java b/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistries.java index ebd9e80b9d..570ed47518 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistries.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistries.java @@ -10,8 +10,8 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreDefinition; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; -import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.registry.registrate.CompassNode; import com.gregtechceu.gtceu.api.registry.registrate.CompassSection; import com.gregtechceu.gtceu.api.sound.SoundEntry; @@ -52,7 +52,7 @@ public final class GTRegistries { public static final GTRegistry.RL MACHINES = new GTRegistry.RL<>(GTCEu.id("machine")); public static final GTRegistry.String> RECIPE_CAPABILITIES = new GTRegistry.String<>( GTCEu.id("recipe_capability")); - public static final GTRegistry.String> RECIPE_CONDITIONS = new GTRegistry.String<>( + public static final GTRegistry.String> RECIPE_CONDITIONS = new GTRegistry.String<>( GTCEu.id("recipe_condition")); public static final GTRegistry.String CHANCE_LOGICS = new GTRegistry.String<>( GTCEu.id("chance_logic")); diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistry.java b/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistry.java index 3e042c3118..2b00d1fe95 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/GTRegistry.java @@ -86,7 +86,7 @@ private boolean checkActiveModContainerIsGregtech() { container.getModId().equals("minecraft")); // check for minecraft modid in case of datagen or a mishap } - public void register(K key, V value) { + public T register(K key, T value) { if (frozen) { throw new IllegalStateException("[register] registry %s has been frozen".formatted(registryName)); } @@ -95,24 +95,27 @@ public void register(K key, V value) { "[register] registry %s contains key %s already".formatted(registryName, key)); } registry.put(key, value); + return value; } @Nullable - public V replace(K key, V value) { + public T replace(K key, T value) { if (frozen) { throw new IllegalStateException("[replace] registry %s has been frozen".formatted(registryName)); } if (!containKey(key)) { GTCEu.LOGGER.warn("[replace] couldn't find key %s in registry %s".formatted(registryName, key)); } - return registry.put(key, value); + registry.put(key, value); + return value; } - public V registerOrOverride(K key, V value) { + public T registerOrOverride(K key, T value) { if (frozen) { throw new IllegalStateException("[register] registry %s has been frozen".formatted(registryName)); } - return registry.put(key, value); + registry.put(key, value); + return value; } @NotNull diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java index b417b96201..0851426579 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeConditions.java @@ -2,11 +2,9 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.addon.AddonFinder; -import com.gregtechceu.gtceu.api.addon.IGTAddon; -import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.common.recipe.*; +import com.gregtechceu.gtceu.common.recipe.condition.*; import net.minecraftforge.fml.ModLoader; @@ -17,31 +15,53 @@ */ public final class GTRecipeConditions { + static { + GTRegistries.RECIPE_CONDITIONS.unfreeze(); + } + private GTRecipeConditions() {} - public static void init() { - GTRegistries.RECIPE_CONDITIONS.unfreeze(); + public static final RecipeConditionType BIOME = GTRegistries.RECIPE_CONDITIONS.register("biome", + new RecipeConditionType<>(BiomeCondition::new, BiomeCondition.CODEC)); + public static final RecipeConditionType DIMENSION = GTRegistries.RECIPE_CONDITIONS + .register("dimension", new RecipeConditionType<>(DimensionCondition::new, DimensionCondition.CODEC)); + public static final RecipeConditionType POSITION_Y = GTRegistries.RECIPE_CONDITIONS + .register("pos_y", new RecipeConditionType<>(PositionYCondition::new, PositionYCondition.CODEC)); + public static final RecipeConditionType RAINING = GTRegistries.RECIPE_CONDITIONS.register("rain", + new RecipeConditionType<>(RainingCondition::new, RainingCondition.CODEC)); + public static final RecipeConditionType ROCK_BREAKER = GTRegistries.RECIPE_CONDITIONS + .register("rock_breaker", new RecipeConditionType<>(RockBreakerCondition::new, RockBreakerCondition.CODEC)); + public static final RecipeConditionType ADJACENT_BLOCK = GTRegistries.RECIPE_CONDITIONS + .register("adjacent_block", + new RecipeConditionType<>(AdjacentBlockCondition::new, AdjacentBlockCondition.CODEC)); + public static final RecipeConditionType THUNDER = GTRegistries.RECIPE_CONDITIONS + .register("thunder", new RecipeConditionType<>(ThunderCondition::new, ThunderCondition.CODEC)); + public static final RecipeConditionType VENT = GTRegistries.RECIPE_CONDITIONS.register("steam_vent", + new RecipeConditionType<>(VentCondition::new, VentCondition.CODEC)); + public static final RecipeConditionType CLEANROOM = GTRegistries.RECIPE_CONDITIONS + .register("cleanroom", new RecipeConditionType<>(CleanroomCondition::new, CleanroomCondition.CODEC)); + public static final RecipeConditionType EU_TO_START = GTRegistries.RECIPE_CONDITIONS + .register("eu_to_start", new RecipeConditionType<>(EUToStartCondition::new, EUToStartCondition.CODEC)); + public static final RecipeConditionType RESEARCH = GTRegistries.RECIPE_CONDITIONS + .register("research", new RecipeConditionType<>(ResearchCondition::new, ResearchCondition.CODEC)); + public static final RecipeConditionType ENVIRONMENTAL_HAZARD = GTRegistries.RECIPE_CONDITIONS + .register("environmental_hazard", + new RecipeConditionType<>(EnvironmentalHazardCondition::new, EnvironmentalHazardCondition.CODEC)); + public static final RecipeConditionType RPM; - GTRegistries.RECIPE_CONDITIONS.register(BiomeCondition.INSTANCE.getType(), BiomeCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(DimensionCondition.INSTANCE.getType(), DimensionCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(PositionYCondition.INSTANCE.getType(), PositionYCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(RainingCondition.INSTANCE.getType(), RainingCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(RockBreakerCondition.INSTANCE.getType(), RockBreakerCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(AdjacentBlockCondition.INSTANCE.getType(), - AdjacentBlockCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(ThunderCondition.INSTANCE.getType(), ThunderCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(VentCondition.INSTANCE.getType(), VentCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(CleanroomCondition.INSTANCE.getType(), CleanroomCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(ResearchCondition.INSTANCE.getType(), ResearchCondition.class); - GTRegistries.RECIPE_CONDITIONS.register(EnvironmentalHazardCondition.INSTANCE.getType(), - EnvironmentalHazardCondition.class); + static { if (GTCEu.isCreateLoaded()) { - GTRegistries.RECIPE_CONDITIONS.register(RPMCondition.INSTANCE.getType(), RPMCondition.class); + RPM = GTRegistries.RECIPE_CONDITIONS.register("rpm", + new RecipeConditionType<>(RPMCondition::new, RPMCondition.CODEC)); + } else { + RPM = null; } + } - AddonFinder.getAddons().forEach(IGTAddon::registerRecipeConditions); + public static void init() { + // noinspection unchecked ModLoader.get().postEvent(new GTCEuAPI.RegisterEvent<>(GTRegistries.RECIPE_CONDITIONS, - (Class>) RecipeCondition.class.getClass())); + (Class>) (Class) RecipeConditionType.class)); GTRegistries.RECIPE_CONDITIONS.freeze(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java index b2b6b72ff3..84f8f6eae1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTRecipeTypes.java @@ -16,8 +16,8 @@ import com.gregtechceu.gtceu.api.sound.ExistingSoundEntry; import com.gregtechceu.gtceu.common.machine.trait.customlogic.CannerLogic; import com.gregtechceu.gtceu.common.machine.trait.customlogic.FormingPressLogic; -import com.gregtechceu.gtceu.common.recipe.RPMCondition; -import com.gregtechceu.gtceu.common.recipe.RockBreakerCondition; +import com.gregtechceu.gtceu.common.recipe.condition.RPMCondition; +import com.gregtechceu.gtceu.common.recipe.condition.RockBreakerCondition; import com.gregtechceu.gtceu.data.recipe.RecipeHelper; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.integration.kjs.GTRegistryInfo; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java index cd29691f99..0deb4a965f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTSyncedFieldAccessors.java @@ -1,7 +1,8 @@ package com.gregtechceu.gtceu.common.data; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.syncdata.GTRecipeAccessor; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.syncdata.GTRecipePayload; import com.gregtechceu.gtceu.syncdata.GTRecipeTypeAccessor; import com.gregtechceu.gtceu.syncdata.MaterialPayload; @@ -17,13 +18,12 @@ */ public class GTSyncedFieldAccessors { - public static final IAccessor GT_RECIPE_ACCESSOR = new GTRecipeAccessor(); public static final IAccessor GT_RECIPE_TYPE_ACCESSOR = new GTRecipeTypeAccessor(); public static void init() { - register(FriendlyBufPayload.class, FriendlyBufPayload::new, GT_RECIPE_ACCESSOR, 1000); register(FriendlyBufPayload.class, FriendlyBufPayload::new, GT_RECIPE_TYPE_ACCESSOR, 1000); registerSimple(MaterialPayload.class, MaterialPayload::new, Material.class, 1); + registerSimple(GTRecipePayload.class, GTRecipePayload::new, GTRecipe.class, 100); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java index 2b6ad191b0..1fea9651b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java @@ -16,7 +16,7 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.DataBankMachine; -import com.gregtechceu.gtceu.common.recipe.ResearchCondition; +import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; import com.gregtechceu.gtceu.utils.ResearchManager; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/AdjacentBlockCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java similarity index 70% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/AdjacentBlockCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java index 6ae076a69b..5774deb674 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/AdjacentBlockCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.Direction; @@ -10,15 +12,26 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; +@NoArgsConstructor public class AdjacentBlockCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .apply(instance, AdjacentBlockCondition::new)); public final static AdjacentBlockCondition INSTANCE = new AdjacentBlockCondition(); + public AdjacentBlockCondition(boolean isReverse) { + super(isReverse); + } + @Override - public String getType() { - return "adjacent_block"; + public RecipeConditionType getType() { + return GTRecipeConditions.ADJACENT_BLOCK; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/BiomeCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java similarity index 76% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/BiomeCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java index 6293fee73d..2f2755d17c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/BiomeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; @@ -15,6 +17,8 @@ import net.minecraft.world.level.biome.Biome; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -26,16 +30,26 @@ @NoArgsConstructor public class BiomeCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("biome").forGetter(val -> val.biome)) + .apply(instance, BiomeCondition::new)); + public final static BiomeCondition INSTANCE = new BiomeCondition(); private ResourceLocation biome = new ResourceLocation("dummy"); + public BiomeCondition(boolean isReverse, ResourceLocation biome) { + super(isReverse); + this.biome = biome; + } + public BiomeCondition(ResourceLocation biome) { this.biome = biome; } @Override - public String getType() { - return "biome"; + public RecipeConditionType getType() { + return GTRecipeConditions.BIOME; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/CleanroomCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java similarity index 78% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/CleanroomCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java index 2040782aea..9105335357 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/CleanroomCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.capability.ICleanroomReceiver; import com.gregtechceu.gtceu.api.machine.MetaMachine; @@ -8,6 +8,8 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.network.FriendlyByteBuf; @@ -15,6 +17,8 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -24,14 +28,23 @@ @NoArgsConstructor public class CleanroomCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(CleanroomType.CODEC.fieldOf("cleanroom").forGetter(val -> val.cleanroom)) + .apply(instance, CleanroomCondition::new)); public final static CleanroomCondition INSTANCE = new CleanroomCondition(); @Getter private CleanroomType cleanroom = CleanroomType.CLEANROOM; + public CleanroomCondition(boolean isReverse, CleanroomType cleanroom) { + super(isReverse); + this.cleanroom = cleanroom; + } + @Override - public String getType() { - return "cleanroom"; + public RecipeConditionType getType() { + return GTRecipeConditions.CLEANROOM; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/DimensionCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java similarity index 81% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/DimensionCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java index c7b648faba..931b4854d4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/DimensionCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java @@ -1,10 +1,12 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.data.DimensionMarker; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.config.ConfigHolder; import com.lowdragmc.lowdraglib.gui.texture.TextTexture; @@ -21,6 +23,8 @@ import net.minecraft.world.level.block.Blocks; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -32,6 +36,11 @@ @NoArgsConstructor public class DimensionCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("dimension").forGetter(val -> val.dimension)) + .apply(instance, DimensionCondition::new)); + public final static DimensionCondition INSTANCE = new DimensionCondition(); private ResourceLocation dimension = new ResourceLocation("dummy"); @@ -39,9 +48,14 @@ public DimensionCondition(ResourceLocation dimension) { this.dimension = dimension; } + public DimensionCondition(boolean isReverse, ResourceLocation dimension) { + super(isReverse); + this.dimension = dimension; + } + @Override - public String getType() { - return "dimension"; + public RecipeConditionType getType() { + return GTRecipeConditions.DIMENSION; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/EUToStartCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java similarity index 72% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/EUToStartCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java index 063324e118..54f3c4efc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/EUToStartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java @@ -1,15 +1,19 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -21,6 +25,10 @@ @NoArgsConstructor public class EUToStartCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.LONG.fieldOf("eu_to_start").forGetter(val -> val.euToStart)) + .apply(instance, EUToStartCondition::new)); public static final EUToStartCondition INSTANCE = new EUToStartCondition(); private long euToStart; @@ -29,9 +37,14 @@ public EUToStartCondition(long euToStart) { this.euToStart = euToStart; } + public EUToStartCondition(boolean isReverse, long euToStart) { + super(isReverse); + this.euToStart = euToStart; + } + @Override - public String getType() { - return "eu_to_start"; + public RecipeConditionType getType() { + return GTRecipeConditions.EU_TO_START; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/EnvironmentalHazardCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java similarity index 76% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/EnvironmentalHazardCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java index c97e925669..881b212113 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/EnvironmentalHazardCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java @@ -1,11 +1,13 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.data.GTMedicalConditions; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.network.FriendlyByteBuf; @@ -14,6 +16,8 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -23,14 +27,23 @@ @AllArgsConstructor public class EnvironmentalHazardCondition extends RecipeCondition { - public final static EnvironmentalHazardCondition INSTANCE = new EnvironmentalHazardCondition(); + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and( + MedicalCondition.CODEC.fieldOf("condition").forGetter(val -> val.condition)) + .apply(instance, EnvironmentalHazardCondition::new)); @Getter private MedicalCondition condition = GTMedicalConditions.CARBON_MONOXIDE_POISONING; + public EnvironmentalHazardCondition(boolean isReverse, MedicalCondition condition) { + super(isReverse); + this.condition = condition; + } + @Override - public String getType() { - return "environmental_hazard"; + public RecipeConditionType getType() { + return GTRecipeConditions.ENVIRONMENTAL_HAZARD; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/PositionYCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java similarity index 71% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/PositionYCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java index 5b5dfd7e15..433c7944c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/PositionYCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java @@ -1,14 +1,18 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -20,6 +24,13 @@ @NoArgsConstructor public class PositionYCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> RecipeCondition + .isReverse(instance) + .and(instance.group( + Codec.INT.fieldOf("min").forGetter(val -> val.min), + Codec.INT.fieldOf("max").forGetter(val -> val.max))) + .apply(instance, PositionYCondition::new)); + public final static PositionYCondition INSTANCE = new PositionYCondition(); private int min; private int max; @@ -29,9 +40,15 @@ public PositionYCondition(int min, int max) { this.max = max; } + public PositionYCondition(boolean isReverse, int min, int max) { + super(isReverse); + this.min = min; + this.max = max; + } + @Override - public String getType() { - return "pos_y"; + public RecipeConditionType getType() { + return GTRecipeConditions.POSITION_Y; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/RPMCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RPMCondition.java similarity index 77% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/RPMCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RPMCondition.java index 71883ca34e..e6ae5c6cd1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/RPMCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RPMCondition.java @@ -1,10 +1,12 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.common.machine.kinetic.IKineticMachine; import net.minecraft.network.FriendlyByteBuf; @@ -12,6 +14,8 @@ import net.minecraft.util.GsonHelper; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -23,16 +27,26 @@ @NoArgsConstructor public class RPMCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.FLOAT.fieldOf("rpm").forGetter(val -> val.rpm)) + .apply(instance, RPMCondition::new)); + public final static RPMCondition INSTANCE = new RPMCondition(); private float rpm; + public RPMCondition(boolean isReverse, float rpm) { + super(isReverse); + this.rpm = rpm; + } + public RPMCondition(float rpm) { this.rpm = rpm; } @Override - public String getType() { - return "rpm"; + public RecipeConditionType getType() { + return GTRecipeConditions.RPM; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/RainingCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java similarity index 72% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/RainingCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java index 789e747cec..2df96806fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/RainingCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -10,6 +12,8 @@ import net.minecraft.world.level.Level; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -21,16 +25,26 @@ @NoArgsConstructor public class RainingCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.FLOAT.fieldOf("level").forGetter(val -> val.level)) + .apply(instance, RainingCondition::new)); + public final static RainingCondition INSTANCE = new RainingCondition(); private float level; + public RainingCondition(boolean isReverse, float level) { + super(isReverse); + this.level = level; + } + public RainingCondition(float level) { this.level = level; } @Override - public String getType() { - return "rain"; + public RecipeConditionType getType() { + return GTRecipeConditions.RAINING; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/ResearchCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java similarity index 66% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/ResearchCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java index f3ea02cb8a..d7327efff2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/ResearchCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java @@ -1,30 +1,43 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.ResearchData; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.AllArgsConstructor; import org.jetbrains.annotations.NotNull; @AllArgsConstructor public class ResearchCondition extends RecipeCondition { - public final static ResearchCondition INSTANCE = new ResearchCondition(); + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(ResearchData.CODEC.fieldOf("research").forGetter(val -> val.data)) + .apply(instance, ResearchCondition::new)); + public static final ResearchCondition INSTANCE = new ResearchCondition(); public ResearchData data; public ResearchCondition() { this.data = new ResearchData(); } + public ResearchCondition(boolean isReverse, ResearchData data) { + super(isReverse); + this.data = data; + } + @Override - public String getType() { - return "reseach"; + public RecipeConditionType getType() { + return GTRecipeConditions.RESEARCH; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/RockBreakerCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RockBreakerCondition.java similarity index 73% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/RockBreakerCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RockBreakerCondition.java index c12afa914c..a81e10a3f0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/RockBreakerCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RockBreakerCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.Direction; @@ -10,6 +12,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -21,11 +25,19 @@ @NoArgsConstructor public class RockBreakerCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .apply(instance, RockBreakerCondition::new)); + public final static RockBreakerCondition INSTANCE = new RockBreakerCondition(); + public RockBreakerCondition(boolean isReverse) { + super(isReverse); + } + @Override - public String getType() { - return "rock_breaker"; + public RecipeConditionType getType() { + return GTRecipeConditions.ROCK_BREAKER; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/ThunderCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java similarity index 72% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/ThunderCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java index 743616338b..be8cec0e5c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/ThunderCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; @@ -10,6 +12,8 @@ import net.minecraft.world.level.Level; import com.google.gson.JsonObject; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -21,16 +25,26 @@ @NoArgsConstructor public class ThunderCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .and(Codec.FLOAT.fieldOf("level").forGetter(val -> val.level)) + .apply(instance, ThunderCondition::new)); + public final static ThunderCondition INSTANCE = new ThunderCondition(); private float level; + public ThunderCondition(boolean isReverse, float level) { + super(isReverse); + this.level = level; + } + public ThunderCondition(float level) { this.level = level; } @Override - public String getType() { - return "thunder"; + public RecipeConditionType getType() { + return GTRecipeConditions.THUNDER; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/VentCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java similarity index 64% rename from src/main/java/com/gregtechceu/gtceu/common/recipe/VentCondition.java rename to src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java index f15a83e872..45792aa7a7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/VentCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java @@ -1,12 +1,16 @@ -package com.gregtechceu.gtceu.common.recipe; +package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.machine.feature.IExhaustVentMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.common.data.GTRecipeConditions; import net.minecraft.network.chat.Component; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; @@ -18,11 +22,18 @@ @NoArgsConstructor public class VentCondition extends RecipeCondition { + public static final Codec CODEC = RecordCodecBuilder + .create(instance -> RecipeCondition.isReverse(instance) + .apply(instance, VentCondition::new)); public final static VentCondition INSTANCE = new VentCondition(); + public VentCondition(boolean isReverse) { + super(isReverse); + } + @Override - public String getType() { - return "steam_vent"; + public RecipeConditionType getType() { + return GTRecipeConditions.VENT; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryImpl.java b/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryImpl.java index d8bafbe58b..03e4081f63 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryImpl.java +++ b/src/main/java/com/gregtechceu/gtceu/common/unification/material/MaterialRegistryImpl.java @@ -30,14 +30,15 @@ public void register(Material material) { } @Override - public void register(@NotNull java.lang.String key, @NotNull Material value) { + public T register(@NotNull java.lang.String key, @NotNull T value) { if (isRegistryClosed) { GTCEu.LOGGER.error( "Materials cannot be registered in the PostMaterialEvent (or after)! Must be added in the MaterialEvent. Skipping material {}...", key); - return; + return null; } super.register(key, value); + return value; } @NotNull diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java index 5c1cc6e9a4..f20bc5bc6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/builder/GTRecipeBuilder.java @@ -20,7 +20,7 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.common.recipe.*; +import com.gregtechceu.gtceu.common.recipe.condition.*; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ResearchManager; @@ -1085,7 +1085,7 @@ public void toJson(JsonObject json) { JsonArray array = new JsonArray(); for (RecipeCondition condition : conditions) { JsonObject cond = new JsonObject(); - cond.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(condition.getClass())); + cond.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(condition.getType())); cond.add("data", condition.serialize()); array.add(cond); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/GTRecipeWidget.java b/src/main/java/com/gregtechceu/gtceu/integration/GTRecipeWidget.java index ae1cae8529..8a34fcfd0c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/GTRecipeWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/GTRecipeWidget.java @@ -15,7 +15,7 @@ import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.logic.OCParams; import com.gregtechceu.gtceu.api.recipe.logic.OCResult; -import com.gregtechceu.gtceu.common.recipe.DimensionCondition; +import com.gregtechceu.gtceu.common.recipe.condition.DimensionCondition; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.LDLib; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java index 519f2d2e22..3c705384e6 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/GTRecipeSchema.java @@ -16,7 +16,7 @@ import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.ingredient.*; -import com.gregtechceu.gtceu.common.recipe.*; +import com.gregtechceu.gtceu.common.recipe.condition.*; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; import com.gregtechceu.gtceu.integration.kjs.recipe.components.CapabilityMap; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java index cb6a3d66bd..fc2524b1a2 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/recipe/components/GTRecipeComponents.java @@ -181,7 +181,7 @@ public Class componentClass() { @Override public JsonElement write(RecipeJS recipe, RecipeCondition value) { JsonObject object = new JsonObject(); - object.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(value.getClass())); + object.addProperty("type", GTRegistries.RECIPE_CONDITIONS.getKey(value.getType())); object.add("data", value.serialize()); return object; } @@ -190,22 +190,22 @@ public JsonElement write(RecipeJS recipe, RecipeCondition value) { public RecipeCondition read(RecipeJS recipe, Object from) { if (from instanceof CharSequence) { var conditionKey = from.toString(); - var clazz = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); - if (clazz != null) { - return RecipeCondition.create(clazz); + var type = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); + if (type != null) { + return type.factory.createDefault(); } } if (from instanceof JsonPrimitive primitive) { var conditionKey = primitive.getAsString(); - var clazz = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); - if (clazz != null) { - return RecipeCondition.create(clazz); + var type = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); + if (type != null) { + return type.factory.createDefault(); } } else if (from instanceof JsonObject jsonObject) { var conditionKey = GsonHelper.getAsString(jsonObject, "type", ""); - var clazz = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); - if (clazz != null) { - RecipeCondition condition = RecipeCondition.create(clazz); + var type = GTRegistries.RECIPE_CONDITIONS.get(conditionKey); + if (type != null) { + RecipeCondition condition = type.factory.createDefault(); if (condition != null) { return condition.deserialize(GsonHelper.getAsJsonObject(jsonObject, "data", new JsonObject())); } diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeAccessor.java b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeAccessor.java deleted file mode 100644 index 7f16e440fc..0000000000 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipeAccessor.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gregtechceu.gtceu.syncdata; - -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.GTRecipeSerializer; - -import com.lowdragmc.lowdraglib.syncdata.AccessorOp; -import com.lowdragmc.lowdraglib.syncdata.accessor.CustomObjectAccessor; -import com.lowdragmc.lowdraglib.syncdata.payload.FriendlyBufPayload; -import com.lowdragmc.lowdraglib.syncdata.payload.ITypedPayload; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; - -import io.netty.buffer.Unpooled; - -/** - * @author KilaBash - * @date 2023/2/18 - * @implNote GTRecipeAccessor - */ -public class GTRecipeAccessor extends CustomObjectAccessor { - - public GTRecipeAccessor() { - super(GTRecipe.class, true); - } - - @Override - public ITypedPayload serialize(AccessorOp accessorOp, GTRecipe gtRecipe) { - FriendlyByteBuf serializedHolder = new FriendlyByteBuf(Unpooled.buffer()); - serializedHolder.writeUtf(gtRecipe.id.toString()); - GTRecipeSerializer.SERIALIZER.toNetwork(serializedHolder, gtRecipe); - return FriendlyBufPayload.of(serializedHolder); - } - - @Override - public GTRecipe deserialize(AccessorOp accessorOp, ITypedPayload payload) { - if (payload instanceof FriendlyBufPayload buffer) { - var id = new ResourceLocation(buffer.getPayload().readUtf()); - return GTRecipeSerializer.SERIALIZER.fromNetwork(id, buffer.getPayload()); - } - return null; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java new file mode 100644 index 0000000000..7cb4dd877d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/syncdata/GTRecipePayload.java @@ -0,0 +1,61 @@ +package com.gregtechceu.gtceu.syncdata; + +import com.gregtechceu.gtceu.api.recipe.GTRecipe; + +import com.lowdragmc.lowdraglib.Platform; +import com.lowdragmc.lowdraglib.syncdata.payload.ObjectTypedPayload; + +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.ByteArrayTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.RecipeManager; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.jetbrains.annotations.Nullable; + +/** + * @author KilaBash + * @date 2023/2/18 + * @implNote GTRecipePayload + */ +public class GTRecipePayload extends ObjectTypedPayload { + + @Nullable + @Override + public Tag serializeNBT() { + return StringTag.valueOf(payload.id.toString()); + } + + @Override + public void deserializeNBT(Tag tag) { + RecipeManager recipeManager = Platform.getMinecraftServer().getRecipeManager(); + if (tag instanceof StringTag stringTag) { + payload = (GTRecipe) recipeManager.byKey(new ResourceLocation(stringTag.getAsString())).orElse(null); + } else if (tag instanceof ByteArrayTag byteArray) { + ByteBuf copiedDataBuffer = Unpooled.copiedBuffer(byteArray.getAsByteArray()); + FriendlyByteBuf buf = new FriendlyByteBuf(copiedDataBuffer); + payload = (GTRecipe) recipeManager.byKey(buf.readResourceLocation()).orElse(null); + buf.release(); + } + } + + @Override + public void writePayload(FriendlyByteBuf buf) { + buf.writeResourceLocation(this.payload.id); + } + + @Override + public void readPayload(FriendlyByteBuf buf) { + RecipeManager recipeManager; + if (!Platform.isClient()) { + recipeManager = Platform.getMinecraftServer().getRecipeManager(); + } else { + recipeManager = Minecraft.getInstance().getConnection().getRecipeManager(); + } + this.payload = (GTRecipe) recipeManager.byKey(buf.readResourceLocation()).orElse(null); + } +} From f4a01cb930dfbd34e8847bd6279931cf5aa02b9c Mon Sep 17 00:00:00 2001 From: KilaBash Date: Fri, 20 Sep 2024 14:51:39 +0900 Subject: [PATCH 14/15] Bump up the LDLib to fix XEI compat + fix pattern preview widget (#1987) --- settings.gradle | 2 +- .../gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/settings.gradle b/settings.gradle index bb51069f6e..f708b7a5ba 100644 --- a/settings.gradle +++ b/settings.gradle @@ -54,7 +54,7 @@ dependencyResolutionManagement { def vineFlowerVersion = "1.+" def macheteVersion = "1.+" def configurationVersion = "2.2.0" - def ldLibVersion = "1.0.27.b" + def ldLibVersion = "1.0.28.a" def mixinextrasVersion = "0.2.0" def shimmerVersion = "0.2.4" def lombokPluginVersion = "8.7.1" diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java index 6d0c1b4937..b241dc872b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/PatternPreviewWidget.java @@ -87,6 +87,7 @@ protected PatternPreviewWidget(MultiblockMachineDefinition controllerDefinition) .setXBarStyle(GuiTextures.SLIDER_BACKGROUND, GuiTextures.BUTTON) .setScrollable(true) .setDraggable(true); + scrollableWidgetGroup.setScrollWheelDirection(DraggableScrollableWidgetGroup.ScrollWheelDirection.HORIZONTAL); scrollableWidgetGroup.setScrollYOffset(0); addWidget(scrollableWidgetGroup); @@ -181,7 +182,7 @@ public void setPage(int index) { setupScene(pattern); if (slotWidgets != null) { for (SlotWidget slotWidget : slotWidgets) { - removeWidget(slotWidget); + scrollableWidgetGroup.removeWidget(slotWidget); } } slotWidgets = new SlotWidget[Math.min(pattern.parts.size(), 18)]; From f315e99181528c920d28d2855a8697c9a00d4ccf Mon Sep 17 00:00:00 2001 From: kross <135918757+krossgg@users.noreply.github.com> Date: Fri, 20 Sep 2024 13:12:30 -0400 Subject: [PATCH 15/15] Added gradle task for versioning and edited workflows (#1986) --- .github/workflows/auto-build.yml | 8 ++++---- .github/workflows/auto-publish.yml | 4 +--- gradle/scripts/publishing.gradle | 2 +- gradle/scripts/resources.gradle | 6 ++++++ 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/auto-build.yml b/.github/workflows/auto-build.yml index afbfb56082..e96540aea7 100644 --- a/.github/workflows/auto-build.yml +++ b/.github/workflows/auto-build.yml @@ -35,10 +35,10 @@ jobs: - name: Get Version id: var run: | - MESSAGE=$(ls build/libs/* | grep dev.jar -v | grep sources.jar -v | grep slim.jar -v | awk -F 'gtceu-|-SNAPSHOT.jar' '{print $2}') - mv "build/libs/gtceu-$MESSAGE-SNAPSHOT.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT.jar" - mv "build/libs/gtceu-$MESSAGE-SNAPSHOT-slim.jar" "build/libs/gtceu-$MESSAGE-build_${{ github.run_number }}-SNAPSHOT-slim.jar" - echo "version=$MESSAGE-build_${{ github.run_number }}" >> $GITHUB_OUTPUT + VER=$(./gradlew -q printVersion) + BUILD_VER=$VER-build_${{ github.run_number }} + for jar in ./build/libs/*; do mv "$jar" "${jar/${VER}-SNAPSHOT/${BUILD_VER}-SNAPSHOT}";done 2>/dev/null + echo "version=$BUILD_VER" >> $GITHUB_OUTPUT - name: Release id: release diff --git a/.github/workflows/auto-publish.yml b/.github/workflows/auto-publish.yml index dee32fe55e..8e24226eba 100644 --- a/.github/workflows/auto-publish.yml +++ b/.github/workflows/auto-publish.yml @@ -49,9 +49,7 @@ jobs: - if: ${{ inputs.publishCurseForgeAndModrinth }} name: Get Version id: var - run: | - MESSAGE=$(ls build/libs/* | grep dev.jar -v | grep sources.jar -v | grep shadow.jar -v | grep slim.jar -v | awk -F 'gtceu-|.jar' '{print $2}') - echo version=$MESSAGE >> $GITHUB_OUTPUT + run: echo "version=$(./gradlew -q printVersion)" >> $GITHUB_OUTPUT - if: ${{ inputs.publishCurseForgeAndModrinth }} name: mc-publish-forge diff --git a/gradle/scripts/publishing.gradle b/gradle/scripts/publishing.gradle index fe29446cc9..5579fc7767 100644 --- a/gradle/scripts/publishing.gradle +++ b/gradle/scripts/publishing.gradle @@ -9,7 +9,7 @@ publishing { mavenJava(MavenPublication) { groupId = project.maven_group artifactId = project.archivesBaseName - version = project.mod_version + version = project.version from components.java diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle index a2e47c2257..77b7d60455 100644 --- a/gradle/scripts/resources.gradle +++ b/gradle/scripts/resources.gradle @@ -10,6 +10,12 @@ def mod_description = getConfig("mod_description") def mod_url = getConfig("mod_url") def mod_issue_tracker = getConfig("mod_issue_tracker") +task printVersion { + doLast { + println libs.versions.minecraft.get() + "-" + mod_version + } +} + // This block of code expands all declared replace properties in the specified resource targets. // A missing property will result in an error. Properties are expanded using ${} Groovy notation. var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) {