From 66b6f929ec1ebc172632ecc165ab03b8d010a951 Mon Sep 17 00:00:00 2001 From: Ranzu <66495944+Ranzuu@users.noreply.github.com> Date: Sun, 5 Apr 2026 14:07:16 +0200 Subject: [PATCH 1/2] Refactor the textures/Scrollbar atlas --- .../client/GuiRecipeBook.java | 68 ++++++++++++++---- .../cookingforblockheads/textures/gui/gui.png | Bin 5491 -> 4295 bytes 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/blay09/mods/cookingforblockheads/client/GuiRecipeBook.java b/src/main/java/net/blay09/mods/cookingforblockheads/client/GuiRecipeBook.java index 15c02c8c0..40dd71ec9 100644 --- a/src/main/java/net/blay09/mods/cookingforblockheads/client/GuiRecipeBook.java +++ b/src/main/java/net/blay09/mods/cookingforblockheads/client/GuiRecipeBook.java @@ -29,10 +29,16 @@ @Optional.Interface(modid = "MouseTweaks", iface = "yalter.mousetweaks.api.IMTModGuiContainer") public class GuiRecipeBook extends GuiContainer implements IMTModGuiContainer { - private static final int SCROLLBAR_COLOR = 0xFFAAAAAA; private static final int SCROLLBAR_Y = 8; - private static final int SCROLLBAR_WIDTH = 7; - private static final int SCROLLBAR_HEIGHT = 77; + private static final int SCROLLBAR_WIDTH = 9; + private static final int SCROLLBAR_HEIGHT = 76; + private static final int SCROLLBAR_RAIL_U = 159; + private static final int SCROLLBAR_RAIL_V = 8; + private static final int SCROLLBAR_THUMB_U = 176; + private static final int SCROLLBAR_THUMB_TOP_V = 120; + private static final int SCROLLBAR_THUMB_MIDDLE_V = 123; + private static final int SCROLLBAR_THUMB_BOTTOM_V = 126; + private static final int SCROLLBAR_THUMB_SLICE_HEIGHT = 3; private static final ResourceLocation guiTexture = new ResourceLocation( "cookingforblockheads", @@ -180,15 +186,51 @@ protected void actionPerformed(GuiButton button) { } public void recalculateScrollBar() { - int scrollBarTotalHeight = SCROLLBAR_HEIGHT - 1; - this.scrollBarScaledHeight = (int) (scrollBarTotalHeight - * Math.min(1f, ((float) VISIBLE_ROWS / (Math.ceil(container.getAvailableRecipeCount() / 3f))))); - this.scrollBarXPos = guiLeft + xSize - SCROLLBAR_WIDTH - 9; + int scrollBarTotalHeight = SCROLLBAR_HEIGHT; + int minThumbHeight = SCROLLBAR_THUMB_SLICE_HEIGHT * 2; + this.scrollBarScaledHeight = Math.max( + minThumbHeight, + (int) (scrollBarTotalHeight * Math + .min(1f, ((float) VISIBLE_ROWS / (Math.ceil(container.getAvailableRecipeCount() / 3f)))))); + this.scrollBarXPos = guiLeft + xSize - SCROLLBAR_WIDTH - 8; this.scrollBarYPos = guiTop + SCROLLBAR_Y + ((scrollBarTotalHeight - scrollBarScaledHeight) * currentOffset / Math.max(1, (int) Math.ceil((container.getAvailableRecipeCount() / 3f)) - VISIBLE_ROWS)); } + private void drawScrollbarThumb(int x, int y, int height) { + drawTexturedModalRect( + x, + y, + SCROLLBAR_THUMB_U, + SCROLLBAR_THUMB_TOP_V, + SCROLLBAR_WIDTH, + SCROLLBAR_THUMB_SLICE_HEIGHT); + + int middleHeight = Math.max(0, height - (SCROLLBAR_THUMB_SLICE_HEIGHT * 2)); + int middleY = y + SCROLLBAR_THUMB_SLICE_HEIGHT; + while (middleHeight > 0) { + int segmentHeight = Math.min(SCROLLBAR_THUMB_SLICE_HEIGHT, middleHeight); + drawTexturedModalRect( + x, + middleY, + SCROLLBAR_THUMB_U, + SCROLLBAR_THUMB_MIDDLE_V, + SCROLLBAR_WIDTH, + segmentHeight); + middleY += segmentHeight; + middleHeight -= segmentHeight; + } + + drawTexturedModalRect( + x, + y + height - SCROLLBAR_THUMB_SLICE_HEIGHT, + SCROLLBAR_THUMB_U, + SCROLLBAR_THUMB_BOTTOM_V, + SCROLLBAR_WIDTH, + SCROLLBAR_THUMB_SLICE_HEIGHT); + } + @Override public void handleMouseInput() { super.handleMouseInput(); @@ -288,12 +330,14 @@ protected void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) drawTexturedModalRect(guiLeft + 23, guiTop + 19, 0, 174, 54, 54); } - GuiContainer.drawRect( + drawTexturedModalRect( scrollBarXPos, - scrollBarYPos, - scrollBarXPos + SCROLLBAR_WIDTH, - scrollBarYPos + scrollBarScaledHeight, - SCROLLBAR_COLOR); + guiTop + SCROLLBAR_Y, + SCROLLBAR_RAIL_U, + SCROLLBAR_RAIL_V, + SCROLLBAR_WIDTH, + SCROLLBAR_HEIGHT); + drawScrollbarThumb(scrollBarXPos, scrollBarYPos, scrollBarScaledHeight); if (container.getAvailableRecipeCount() == 0) { GuiContainer.drawRect(guiLeft + 97, guiTop + 7, guiLeft + 168, guiTop + 85, 0xAA222222); diff --git a/src/main/resources/assets/cookingforblockheads/textures/gui/gui.png b/src/main/resources/assets/cookingforblockheads/textures/gui/gui.png index ac372e87c161b12af3a69a13055c6b7386850722..db1a4c00d39e30ce3b3bed0c9cf2262b314e1b9d 100644 GIT binary patch literal 4295 zcmds4c{r5syMJcE3}Y9OeK*NoB5G2E>`O+r8DdNbVXQNal)dh+SS8+rw~BE)U|8GQ z_U+r{<>hzo+=+~g?Ck73cI;SqczASlw40lor>AFFSXe|vL{wB%Y-}ur?fXiQ9ux3@PxKR*(Q6c7-YdL>s@R(9ynAv-%eO-)T(Tig4aHxFU4rlzJj zIXQ80af*tHE-o(a?(XvP@{CjX@tQmWfgmU-h(@CW0s@L7_BlH{>+9>AnVBWKZX;T3 ziI0z`P$=u0B#e|d0l=P;PxveL%nosAo#hqyM3BJsH%uPDQOiW`&r!Wp5`P*ctbA0Nfv@@*% zi7eZ?b*qk! zj;^lmwr$(6Sgf|TwuFQP3N=hm!DjFIZ>gwuRT3RwPGKPkRe0+Rr zYHG5wvO+>aC=^OgPOjh8Bs7>9lT@`0t2yjo&8>q9ObIG8&r0kxH1x*0Ik`h6_y6Ys zp8QwCp~%otw%#!Sh_vxu*d}dzI%JfMwZ_M~M~1}46ORW27b5vste%s#hw^qkLp?*o zY?O2_1Y!i^?LzGAumA-u_<$UYZ=;v(q1Bc@bEv(6HVm<0heLBi7#xU0<6-C}XCOE1 zJSTY1A_WGfp5G4Gef+eP@Vk=;_;!0Kll(?ceK>;6GEG6~D!6Q|FaYhv4_NN5oGWZPLsd+; zmW9)g1IJE%*?!da-<^v=i^^PilxE(L1u{xa=1ktc%y%I>m#q{LQdh#H>eQD2VC_Pv z(C^wr>yn;ePS?B}uB(|z^^&+IwX(LHlkgSf%02!Wf^tpp7dc+=?eP@H|2?1S=#mwq zgDA>D*Ss=z91jv;hddKj+0i528T)v}UtLqPBj>u}lH@K*HiI-fOg?u2P=u|{FIIjM z+T`dabZ+k7qlnJjlm=hj*&T$PY09UjMpeH%WU*ZD`ATspO-R&!3rWk(2qHL-$TzK% zU@kwYiVj$0snctGi9%(%g+x^Z0+T*=ccRW}_U1$|QJ<7a<*dxSQ&BC^u^jw13>!wi ziLp*--C|a!uN8TrXh$x2A-mekq~q6meY4wsOG(S~%&VZ3_-?TAa#$|icj0Wx56`GI zKD7W{nZ<VMQ@&-vz5cT_hMeUh)n0FZ8A_9!yXDYiI_yHrzroScCKVf?% zNl?HtQuN5bk{n;8ogOP@?_ZNGODrc}O6`)sHQ`TrJ}a~$j)a{VHOTG%JO9((_+=)u zNPK~o7}JSK{s~&l%c^Aqm>Q0-49XaTlb@iFRG-}*&rw`T+m5SMN~q>XCH@2j@jXBC zy8r4K`*4@ZS)P!7u}f8V{LAaeGhH!)Pml&e$_HmFmd2FFrV}G2R#yF+X<-%=P$zd9 zo>DThga6>0HvF&WiTGa4g<+Vs7j|UD1M5CgUN&arxmN=cOWOk*NgZkJUL9JcWX9AU z7u!9k1tD$yOrR6V4vh>Yzs73uw;liV`%LbQ+GK%&xwF znsVywb1#x}V7JX+iKY9UZo)M6aLVL^D;(yk)$pCSwOX4OLY@1*4Lha^s3bpx>C@Rc z!?Y}>e$Kt&?_Q5zxB0h!|Bk#~QmOVQgZT1 zUYW4^t4Yo!m+y{p5F86k&=O61FpW0!?Q@__2j}H;S>vw@2=JxojpRIhr8-6|R65-- zVGj-e6Un-gopE9^xli;J=%=w;<&-}zAo?ssznzeFQaTp;ylf>Qtc2UJdU|Tz?PoXC z%sw9$F2jvr&)`qosQZ(erJEO+V%()yn-C)wxmlG9xEeIdda>&`a_3p03*yE*dnW>o@;;!VMw|rH7{`*| z`W+Tz=2-dWCaNA{18!HPP`nJQ`GVg<9-@ktBjZ%x(3(%ZXjP8%t z%WlrFe5P+|t)>`}out^V)7LPdp_Dzl(; zOA4^pU@o@`%Ma=KeTroprL8zGoSIrc_;uNGwfoWMtF-w|Rj?$*5gkw;BcpW0r2fj| zhP<)n#}8Ul<_4jgM2!BWZK|Q%uiWG0buu&C4pOO#CE)?x4~$8Bm;N9D<+um{?w~tF z>AIXVueff~8iq&$eo=I6-*R(-wOuf)25kqL*i0invQ_EFh}U zifMk8oSBVf&1HCe?DdE3&@mWTf||1L23!)ShOK!q-^ymIx_81Bw-gNAdqVYUY1NJ+ExR{|LV_@{drAV9TL1 zuXu|50MoBsEp>jG=e#X(i%9_tvClSP8IaI$P`iYxt$Mj;P;5Xqe+KjBass?Jf)=9( zzj>g=wi~{~b21QBN+zyH)(c@OHWd0K)k4B~&Y}bVL_F`UeEWbgKcOnPnELGKHoVY$ zKu_C-vNW(Z#7j4Hxg3BpAP05<>aQ`L%1WTCWC1867@D}+Mg?SV2k zir+Y)N2l*`n+yXnq1>{;nhpqp7`9GzRe-1K$e@9O68#G#&P#z{S2qLrgdBTJ#$HDN9QkvVMJQkl;Z=(`7!j24NU1bC&%63E%~d?!%^R($!@Xy z!t|0Isr;)r_n7}8!6A6K4Te8Np&)JKxnqy40Z<$OCiHN`W+f!uGj*=V1_7$E(=0RX z<)0`}2HTRTRa}N#AG=x}w_bRXmV~ga*w!;$Zc2y9=|+6eUSN*80l60|W{W7jG6r~- zZYf(RhH2$|$m71frDu@1nR==O1#hL;=8im$Uen(wWk{#eG@Kk* zkF}Kp)UEmaxN%1BO&)VoDi0_Ej|d0k8C3M>_JI>>1+S#ow>@CKH+Q7OvbK7Ho+6)L zJ|V_-1I6&3U(H({pxK`VKl-Pt(78q0qdIgDg{ov5u&;W+D%srcV2Ycm-fBgLGa65> z>`w8XG!_^@R$Cm8JHCwdr;73k-9+Ph0b_N(n-B-#6%b&Bimpw#>|-S9rZu|?|*&Qw_VrwT-VIJ&-2{({oK#J{Ovbzv$ill9@;aRK7QMQ9`?>)?S?>uf^!LnYyWyU z4h)|LkMGNIk<>|^bb;c&tWr0;W@xx7<*VY_Kgt&+-n~=zKkMKh=&!gX7^mi7WA<7i z&>&_&ouOUgfIXh`NnfC}AkS$4!~Hmf{{x8Q?8 zen+RT31677zQXEHpI}fJs>L5h-MqZKtfP(YFk%$k^~`TFKbQMwp|P9i23b8NxxH+~?z#sC2D%(!o|(_(usa7N!SzKvNS3!j=C0G-`~YPVGIdC)VUQXnR&aBSdwY+FFIiNzE8V_3;|U z&HmS(_Rf?PcS3icdsS#5I-N4te$a@=rDX?D2>h90_q5bwQa2lH<9!JdQ5z`{U_Wo7 zxZYH%hWTOW<0Hd0w-KK+Qxwfh(hroRpZ4&e_Oa7G5*DSCnVjMKwiUebuKa^tWOr5z zvn3s0Ofn^Xh`3tRtT9d$jJ;Kq`ZSmwBPZY|;~YS%5IiN+a`tcR>+4&CP#focKtdX& zvH`KyFYE217X_y=5~reL39hcLQ~jS_+V>gtg^xao>n&+%X~_}fJ=PFv3iO{@=ceN6 zUNgnRa)Kb!_i_M0`q-8XQ~VxqkznH8qw}@+In~=@e--7*WY1B-+>Q!*d;2{%`kMk% zPH&(C&pE8msYpAqrgT^Lf)jDDpmQwS0+!^Xj0HRUfgSldJCrR=iMv_~c1W+rm_0U* zms8z$e0DIm^!2vl5-IPo9l7y7gnca!4c_*_L2*zpu`Y-v(XBnhCfRb5UJz!Tco8+E zdwrY^<}L#8*pJNIBut+f3Dig2ap=I47`{u|h^yh@2Y+cCO;t3Z*+wo09K1x&bG9!e zQF2%m;pBmMTV2`(Bgz57m4X*k(fv*%sF(I%gXZtA+2?f8tcpyg_0ho-M*V7mcRlg- ziB}%x4TP&^DIr20$+P|TH|}uu*%XpSgGu+RHC6rY>t7LN#hdUp7x zHuE!x%V8mh?V&INd!#w=oFm!IwTs+ObCSfu=Oxg^|FS_+Oa?S>O!@Rz?d@O{zTXr` zcMJQLbdsXt9?_Qc$jHmlnQ|5DuF8k$uWtaQ#{El`%j7}t$x4cHR~KTGKiZZxHL73Y zvr{B-Py%ubGV)xrboa*Zlas}c6W>!46P(;5J5?uZFtTHk0N{GTD|6k3WL^Bd#KhHm zn*WWaosDWe8vj)@F|~G|le3VsAUpDdPVHT(##&hDk0GxK3L@{SJNar(y(nL;S&SQ-JCRi?G zyg4@e6k`&s8^)~M^Se4VEt{;#B7}CN>sU+lS3UNgR%3j{|b z91^n7!9DjC8uLSWAN>w!nHNp*nn%eT!m%#jNS;9m#Bf8nN6)+=v1l9Sty)`% z$aIeD(g2(19IVeIoHEYg$Yl6xATtyl8Jwd>Ci2RxXmFy>V@?lO#82SOO5M&OQ)ndcHcG^0Qp0s|#ofdl^mp#23H@c_r zH_A6%cU?5paF_@~MFx$b)TvoASIooMbtFYjvU|c; zvVYNGmuLIgkVx9sS_OhYOz3yPmfHB+IihP9jc7*fr*tvd0)CiKdnFq&V2qJ-p3UQ5 zZDV&eeR=KNzdMav{rWjEl+LiE4KJCNOw&$2qD1=m{xgNO+*H(br1?`2X-5U;)+DxR zE=^G1G1c>DzVElC{O-`+q_BvVx+20np=KZKGGKR;fjmK^y9G2Su}o%Z-;MAxUgJYa zzhagJDpQ|J*xvt0lDT`i*14^>Pa20rJ|8P`b@1;vNO}k%+5WruI>Nc9!+C)xqvmT`I zlhrGp69sgk3bf(l3PP8F9dkvzlG6`YT`8d0|KMrxL}*FpHRihPJcQ~i+vT`b&$Z%{ zr3T@)+0w=TSn@wBXicd`@m1W6GCOZNZsoN#2+cKuCyJ(%i=B3n8J?dCe1- z1Y?2-BlzA|Pzm8yYT-}b_Rua_5Y=|%F1&Urdd#Q_WA_T;Foa(p?G1cxLNW=t+)Vh& zj+HiZ#Pa;@M4f>OEm{@p6x~i7kHsn^zwRW#G0zZ=3etnUzB&R6yno| z#m;LG`>&UuZoH?V_d7cchWdTe7wA4XzlDiz2VQI=sbu>_T|$Ze%%Adc#*NV?#iKs zK)xl87szl#Yj3Z6GrJ$VVFsgn{^P@=a9Zj6+PAu7*b>6hqJN|$Tw1nO3!`)2p~52?}7>c@L>DarNt+V$9n@$u1m^)MsuSvbFZyjA3*ay0`~^b<^BTa=I<%?TVjm7 zuW{itquSsW;IIc!5_D@6)&}6C3xCu;s)j|DG`s<~reEt~75t}q_o_H^cIdfPJG=%58$570SPn&E$JrqJ5Ox<)sLEV^hRcNwd#saTY-e6WQQIE1~`+! z%JOx?WiyCt4bKm!iFQF@Dd6ititZ(q2TCeMZK_6vk?^-4)qaZvr1%A7npf{^6h|Ox zF_P1#R(P%}gH#$P8zGL+i0FDiY6dYJdVwpP05GCfqx}}APf3E#g}BwK+SWmxd}Ct| zU1XZ}GjVtuXZ{P4s|&q)NseJnPU<=+G8H@WQ#bII(w;3=k9z~M(}von?P4Qg-~rmZ^M?& z?sE~5gDogXc5r*CclW)ZprCS3(@4j?8dZtW*OEHkqzd5f=tq#~)~*n*e8KQ?-YV0} zUA?jMOT3A8fl$xdtTIVG#W%@KZivlbm=cEs<1pn-4A@=Av9kqQQARJavoP-&mB||; zIhSU;BuSNLLfxN)`;diFVEQx?($^8S=uSYZ?KiOT?+%IocZYa7^4(c<(-$i?{4>Nz-)pJJ6*}?p5VP%usqx*DFJyx+x!^s$+1|5Va^n9 zeLh+ZMDWseriwe4ZKmJ)5|g8A2kSYP%XeK;2%1_H2U3)a(Q9ujAP3r;D_sGCs>q)- zd<*3N5li%NECN)Ww73cE&{P&uYsR5c=Xj;g5y8M7y|&H?TC~Uo7WKf6(*MtBdWS$E zgJttJingAC@|n1HPn4Xdt8%346GO2O2?vph;6OIj3XZ}k0y&jmw24G7J)@s zFi2IkdvP;gAyfR0p{YYX@u>`{JR-+cN*#Pw&Q$DWamLwYiS7Y({>$3L8j=_kZh$r2 zM1MA}Gj=K%@Mfxbi*~)as4g_rp|qsUUZ;m>^hHGX*hf1xTJw?Pq7B1PE-} zra3(Lxq%aeA*d|2PN86u!simxww+xs4+iY1dbqBqq&!o^WdEL0p{QO)oJK)HJmiw) z#dL+YQ|G@+L)_%4TrcF>+=5ifrWehm`=k`%&k;#24D__E2R zbM4h3t%t|I7ZXNuW9UcyUIpxPDt2dTH;KA0(jSPOQKING6S08^Sc(5tU505P+ZgZ) z)s>l%j@Rl=8jg-8O-P8l;ze(`@a}Ycxwt$M*Em^*gn=Tk1f>iw4k&q|sSNr0)Ww|n zxAiK@%Gzgip?^D=QUUJ)(qEMT3EdJuG3jf4*<;#^a4iZ6FGp-)A*Dd_Ko@daa=ESx zx}~56uTnLSfkjtv9x;Z3wg{CR7VC%XR|Cgu8$eMi?^Ft|ksKgGzv=i0t4zQ3tt^QL zX$ZR=&PDa&AQKJQ4!c4QxsH3mi&A>nXJ%O;0YSvqaS zH0F>4H=tYhqN8BP+!dn=W8M4Zh$p1sY(8~xXDLby=351%zAA=pbYxOz^8S{s^h3e#(=!q^*@lEzgY_2t1n`2*u?^^!7+nn z+7=X$KLEhyfBk_a$%`(y`G0swaQ<7KF5EU&a2RsF>z|_KPpLq9(km8HgC+bl*8k!0 zKcD+VC|9_(HH9she*VP&3(~_%EoKziDvpza9o066Aro|8Uf3H0a2DW?WzPeO+d{f7 zBxUJD1013f*h~eGd>J*ea4cz^R#CGaNl`B|yyB@_R6pGLD)vF+=za>`N&=po`x z8=vFFYj;HS!7(8t0h!E7@~2+QOi(7>#o!oGzPu`PccCF(Jft8t9|>zZR}8GJ>+nV6 z51k}71G`Lf>fNo&2<57Ps#7ra3-JMANKW;iFlI8TQnxULTjdW(ZI1bW_$v7>1XxQ< UL*x9w%Ik`? Date: Sun, 5 Apr 2026 14:09:15 +0200 Subject: [PATCH 2/2] Optimising images contained in Ranzu/Texture for #63 (#64) Co-authored-by: Ranzu <66495944+Ranzuu@users.noreply.github.com> --- .../cookingforblockheads/textures/gui/gui.png | Bin 4295 -> 3814 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/cookingforblockheads/textures/gui/gui.png b/src/main/resources/assets/cookingforblockheads/textures/gui/gui.png index db1a4c00d39e30ce3b3bed0c9cf2262b314e1b9d..32a9e3d406d876b0022a01a26f8a7abf60bbdccd 100644 GIT binary patch delta 2676 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 d8zd^~7Afh9eng}`#{@vnL2LW{